UNPKG

zod-urlsearchparams

Version:

serializes and deserializes a zod schema to URLSearchParams

1 lines 14.9 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\ntype Schema = z.ZodObject<Record<string, z.ZodTypeAny>>\n\nfunction isScalar(value: unknown): boolean {\n\treturn (\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"number\" ||\n\t\ttypeof value === \"boolean\" ||\n\t\ttypeof value === \"bigint\" ||\n\t\tvalue instanceof Date\n\t)\n}\n\nfunction isEqual(value1: unknown, value2: unknown): boolean {\n\tif (isScalar(value1) && isScalar(value2)) {\n\t\treturn value1 === value2\n\t}\n\treturn JSON.stringify(value1) === JSON.stringify(value2)\n}\n\nconst booleanToString = z.boolean().transform((val) => (val ? \"t\" : \"f\"))\nconst numberToString = z.number().transform((val) => val.toString())\nconst dateToString = z.date().transform((val) => val.toISOString())\nconst bigIntToString = z.bigint().transform((val) => val.toString())\nconst utf8ToBase64 = (str: string): string => {\n\treturn btoa(\n\t\tencodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, p1) =>\n\t\t\tString.fromCharCode(Number.parseInt(p1, 16)),\n\t\t),\n\t).replace(/=+$/, \"\")\n}\n\nconst base64ToUtf8 = (str: string): string => {\n\t// Add padding if necessary\n\tconst paddedStr = str.padEnd(str.length + ((4 - (str.length % 4)) % 4), \"=\")\n\treturn decodeURIComponent(\n\t\tatob(paddedStr)\n\t\t\t.split(\"\")\n\t\t\t.map((c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)\n\t\t\t.join(\"\"),\n\t)\n}\n\nconst otherToString = z.unknown().transform((val) => utf8ToBase64(JSON.stringify(val)))\n\nconst stringToBoolean = z.string().transform((val) => val === \"t\" || val === \"true\")\nconst stringToNumber = z.string().transform((val) => {\n\tconst num = Number(val)\n\treturn Number.isNaN(num) ? undefined : num\n})\nconst stringToDate = z.string().transform((val) => new Date(val))\nconst stringToBigInt = z.string().transform((val) => BigInt(val))\nconst stringToOther = z.string().transform((val) => {\n\ttry {\n\t\treturn JSON.parse(base64ToUtf8(val))\n\t} catch (error) {\n\t\treturn undefined\n\t}\n})\n\nfunction parseValue(value: string, schemaType: z.ZodTypeAny): unknown {\n\tif (schemaType instanceof z.ZodNumber) {\n\t\treturn stringToNumber.parse(value)\n\t}\n\tif (schemaType instanceof z.ZodBoolean) {\n\t\treturn stringToBoolean.parse(value)\n\t}\n\tif (schemaType instanceof z.ZodString) {\n\t\treturn value\n\t}\n\tif (schemaType instanceof z.ZodDate) {\n\t\treturn stringToDate.parse(value)\n\t}\n\tif (schemaType instanceof z.ZodBigInt) {\n\t\treturn stringToBigInt.parse(value)\n\t}\n\tif (schemaType instanceof z.ZodEffects) {\n\t\treturn parseValue(value, schemaType._def.schema)\n\t}\n\tif (schemaType instanceof z.ZodDefault) {\n\t\treturn parseValue(value, schemaType._def.innerType)\n\t}\n\tif (schemaType instanceof z.ZodOptional) {\n\t\treturn parseValue(value, schemaType._def.innerType)\n\t}\n\tif (\n\t\tschemaType instanceof z.ZodEnum ||\n\t\tschemaType instanceof z.ZodNativeEnum ||\n\t\tschemaType instanceof z.ZodLiteral ||\n\t\t(schemaType instanceof z.ZodUnion &&\n\t\t\tschemaType._def.options.every(\n\t\t\t\t(option: z.ZodTypeAny) =>\n\t\t\t\t\toption instanceof z.ZodLiteral ||\n\t\t\t\t\toption instanceof z.ZodEnum ||\n\t\t\t\t\toption instanceof z.ZodNativeEnum,\n\t\t\t))\n\t) {\n\t\treturn value\n\t}\n\treturn stringToOther.parse(value)\n}\n\nfunction serializeValue(value: unknown, schemaType: z.ZodTypeAny): string | undefined {\n\tif (\n\t\tschemaType instanceof z.ZodString ||\n\t\tschemaType instanceof z.ZodEnum ||\n\t\tschemaType instanceof z.ZodNativeEnum ||\n\t\tschemaType instanceof z.ZodLiteral ||\n\t\t(schemaType instanceof z.ZodUnion &&\n\t\t\tschemaType._def.options.every(\n\t\t\t\t(option: z.ZodTypeAny) =>\n\t\t\t\t\toption instanceof z.ZodLiteral ||\n\t\t\t\t\toption instanceof z.ZodEnum ||\n\t\t\t\t\toption instanceof z.ZodNativeEnum,\n\t\t\t))\n\t) {\n\t\treturn value as string\n\t}\n\tif (schemaType instanceof z.ZodNumber) {\n\t\treturn numberToString.parse(value)\n\t}\n\tif (schemaType instanceof z.ZodBoolean) {\n\t\treturn booleanToString.parse(value)\n\t}\n\tif (schemaType instanceof z.ZodDate) {\n\t\treturn dateToString.parse(value)\n\t}\n\tif (schemaType instanceof z.ZodBigInt) {\n\t\treturn bigIntToString.parse(value)\n\t}\n\tif (schemaType instanceof z.ZodEffects) {\n\t\t// For effectors, we use the output type, effectively ignoring the effector logic\n\t\treturn serializeValue(value, schemaType._def.schema)\n\t}\n\tif (schemaType instanceof z.ZodDefault) {\n\t\t// Serialize the value according to the defaults value\n\t\t// If the serialized default is the same then we skip it\n\t\tlet serialized = serializeValue(value, schemaType._def.innerType)\n\t\tlet defaultValue = serializeValue(schemaType._def.defaultValue(), schemaType._def.innerType)\n\t\tif (serialized === defaultValue) return undefined\n\t\treturn serialized\n\t}\n\n\tif (schemaType instanceof z.ZodOptional) {\n\t\treturn serializeValue(value, schemaType._def.innerType)\n\t}\n\treturn otherToString.parse(value)\n}\n\ntype ParseArgs<T extends Schema> = {\n\tschema: T\n\tinput: URLSearchParams\n\t/**\n\t * Default data to use if the key is not present in the input, shallow merge\n\t */\n\tdefaultData?: Readonly<Partial<z.infer<T>>>\n}\n\nfunction shape<T extends Schema>({\n\tschema,\n\tinput,\n\tdefaultData,\n}: ParseArgs<T>): Record<string, unknown> {\n\tlet obj: Record<string, unknown> = defaultData ? { ...defaultData } : {}\n\tlet schemaShape = schema.shape\n\tfor (let key in schemaShape) {\n\t\tlet values = input.getAll(key)\n\t\tlet schemaType = schemaShape[key]\n\t\tif (schemaType instanceof z.ZodArray) {\n\t\t\tobj[key] = values.map((value) => parseValue(value, schemaType.element))\n\t\t} else if (values.length > 0) {\n\t\t\tlet value = values[values.length - 1]\n\t\t\tobj[key] = parseValue(value, schemaType)\n\t\t}\n\t}\n\treturn obj\n}\n\nfunction parse<T extends Schema>({ schema, input, defaultData }: ParseArgs<T>): z.infer<T> {\n\tconst shapedObject = shape({ schema, input, defaultData })\n\treturn schema.parse(shapedObject)\n}\n\nfunction safeParse<T extends Schema>({\n\tschema,\n\tinput,\n\tdefaultData,\n}: ParseArgs<T>): z.SafeParseReturnType<z.infer<T>, z.infer<T>> {\n\tconst shapedObject = shape({ schema, input, defaultData })\n\treturn schema.safeParse(shapedObject)\n}\n\nfunction lenientParse<T extends Schema>({\n\tschema,\n\tinput,\n\tdefaultData,\n}: Omit<ParseArgs<T>, \"defaultData\"> & { defaultData: z.infer<T> }): z.infer<T> {\n\tconst result = safeParse({ schema, input, defaultData })\n\tif (result.success) {\n\t\treturn result.data\n\t}\n\n\tconst validFields: z.infer<T> = { ...defaultData }\n\tconst shapedObject = shape({ schema, input, defaultData })\n\n\tfor (const key in schema.shape) {\n\t\ttry {\n\t\t\tconst fieldSchema = schema.shape[key]\n\t\t\tif (fieldSchema) {\n\t\t\t\tconst parsedValue = fieldSchema.parse(shapedObject[key])\n\t\t\t\tvalidFields[key as keyof z.infer<T>] = parsedValue\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// If parsing fails, use the defaultData value\n\t\t\tvalidFields[key as keyof z.infer<T>] = defaultData[key as keyof z.infer<T>]\n\t\t}\n\t}\n\n\t// Attempt to safeParse the validFields\n\tconst finalResult = schema.safeParse(validFields)\n\tif (finalResult.success) {\n\t\treturn finalResult.data\n\t}\n\n\t// If safeParse fails, return defaultData\n\treturn defaultData\n}\n\ntype SerializeArgs<T extends Schema> = {\n\tschema: T\n\tdata: Readonly<z.infer<T>>\n\t/**\n\t * Default data to use if the key is not present in the input, shallow merge\n\t */\n\tdefaultData?: Readonly<Partial<z.infer<T>>>\n}\nfunction serialize<T extends Schema>({\n\tschema,\n\tdata,\n\tdefaultData,\n}: SerializeArgs<T>): URLSearchParams {\n\tlet params = new URLSearchParams()\n\n\tlet schemaShape = schema.shape\n\tfor (let key in data) {\n\t\tif (Object.hasOwn(data, key)) {\n\t\t\tlet value = data[key]\n\t\t\tlet schemaType = schemaShape[key]\n\n\t\t\tif (defaultData == null || !isEqual(value, defaultData[key])) {\n\t\t\t\tif (schemaType instanceof z.ZodArray) {\n\t\t\t\t\tfor (let item of value as unknown[]) {\n\t\t\t\t\t\tlet serialized = serializeValue(item, schemaType.element)\n\t\t\t\t\t\tif (serialized !== undefined) params.append(key, serialized)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet serialized = serializeValue(value, schemaType)\n\t\t\t\t\tif (serialized !== undefined) params.append(key, serialized)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn params\n}\n\nclass ZodURLSearchParamSerializer<T extends Schema> {\n\tconstructor(\n\t\tprivate schema: T,\n\t\tprivate defaultData?: Readonly<Partial<z.infer<T>>>,\n\t) {}\n\n\tserialize(data: Readonly<z.infer<T>>) {\n\t\treturn serialize({\n\t\t\tdata,\n\t\t\tschema: this.schema,\n\t\t\tdefaultData: this.defaultData,\n\t\t})\n\t}\n\n\tparse(input: URLSearchParams) {\n\t\treturn parse({\n\t\t\tinput,\n\t\t\tschema: this.schema,\n\t\t\tdefaultData: this.defaultData,\n\t\t})\n\t}\n\n\tsafeParse(input: URLSearchParams) {\n\t\treturn safeParse({\n\t\t\tinput,\n\t\t\tschema: this.schema,\n\t\t\tdefaultData: this.defaultData,\n\t\t})\n\t}\n\n\tlenientParse(input: URLSearchParams, defaultData: z.infer<T>) {\n\t\treturn lenientParse({\n\t\t\tinput,\n\t\t\tschema: this.schema,\n\t\t\tdefaultData,\n\t\t})\n\t}\n}\n\nexport {\n\tlenientParse,\n\tparse,\n\tsafeParse,\n\tserialize,\n\tshape,\n\tZodURLSearchParamSerializer,\n\ttype ParseArgs,\n\ttype SerializeArgs,\n}\n"],"mappings":"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","names":[]}