Skip to content

Commit

Permalink
feat: add examples for serializing and parsing URL search params
Browse files Browse the repository at this point in the history
  • Loading branch information
schpet committed Aug 11, 2024
1 parent de6c2b9 commit 1a70e55
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 8 deletions.
45 changes: 43 additions & 2 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,48 @@

A library for serializing and parsing URLSearchParams using Zod schemas.

## Example
## examples

For a usage example, see [docs/readme-example.ts](docs/readme-example.ts).
### serializing

```ts
import assert from "node:assert"
import { z } from "zod"
import { ZodURLSearchParamSerializer } from "../dist"

// setup your schema
const schema = z.object({ name: z.string(), age: z.number(), hobbies: z.array(z.string()) })

// setup the serializer
const serializer = new ZodURLSearchParamSerializer(schema)

const data = { name: "John Doe", age: 30, hobbies: ["reading", "cycling"] }

// serialize it to url params, see how it looks–
const params = serializer.serialize(data)
assert.strictEqual(params.toString(), "name=John+Doe&age=30&hobbies=reading&hobbies=cycling")
```

### parsing

```ts
// sometimes people will visit a url that doesn't conform
const invalidParams = new URLSearchParams("name=Jane+Doe&age=invalid&hobbies=reading&hobbies=gardening")

// so we provide defaults to fall back to
const defaultData: z.infer<typeof schema> = {
name: "Default Name",
age: 25,
hobbies: ["default hobby"],
}

// parse it :4)
const lenientResult = serializer.lenientParse(invalidParams, defaultData)

// it'll drop the invalid field and use the default value
assert.deepStrictEqual(lenientResult, {
name: "Jane Doe",
age: 25, // Uses default value because 'invalid' can't be parsed as a number
hobbies: ["reading", "gardening"],
})
```
15 changes: 9 additions & 6 deletions docs/readme-example.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ import assert from "node:assert"
import { z } from "zod"
import { ZodURLSearchParamSerializer } from "../dist"

Check failure on line 3 in docs/readme-example.ts

View workflow job for this annotation

GitHub Actions / types (ubuntu-latest, 18.x)

Cannot find module '../dist' or its corresponding type declarations.

// setup your schema
const schema = z.object({
name: z.string(),
age: z.number(),
hobbies: z.array(z.string()),
})

// setup the serializer
const serializer = new ZodURLSearchParamSerializer(schema)

const data = {
Expand All @@ -17,21 +19,22 @@ const data = {
}

const params = serializer.serialize(data)

assert.strictEqual(params.toString(), "name=John+Doe&age=30&hobbies=reading&hobbies=cycling")

// Example of lenientParse
const invalidParams = new URLSearchParams(
"name=Jane+Doe&age=invalid&hobbies=reading&hobbies=gardening",
)
const defaultData = {
// sometimes people will visit a url that doesn't conform
const invalidParams = new URLSearchParams("name=Jane+Doe&age=invalid&hobbies=reading&hobbies=gardening")

// so we provide defaults to fall back to
const defaultData: z.infer<typeof schema> = {
name: "Default Name",
age: 25,
hobbies: ["default hobby"],
}

// parse it :4)
const lenientResult = serializer.lenientParse(invalidParams, defaultData)

// it'll drop the invalid field and use the default value
assert.deepStrictEqual(lenientResult, {
name: "Jane Doe",
age: 25, // Uses default value because 'invalid' can't be parsed as a number
Expand Down

0 comments on commit 1a70e55

Please sign in to comment.