@zodyac/zod-mongoose 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## Unreleased
9
9
 
10
- ## 2.0.0 - 2024-08-21
10
+ ## 2.1.0 - 2024-09-07
11
+
12
+ ## 2.0.1 - 2024-08-30
11
13
  ### Added
12
14
  - Changelog
package/README.md CHANGED
@@ -21,10 +21,10 @@ bun add @zodyac/zod-mongoose
21
21
 
22
22
  ## Breaking changes
23
23
  > [!WARNING]
24
- > If you were using ```zId``` or ```zUUID``` before, please replace those with ```z.objectId()``` and ```z.mongoUUID()```.
24
+ > If you were using `zId`, `zUUID`, `z.objectId()`, `z.mongoUUID()` before, please replace those with ```zId()``` and ```zUUID()```.
25
25
 
26
- - ```zId``` is now ```z.objectId()```
27
- - ```zUUID``` is now ```z.mongoUUID()```
26
+ - ```zId``` is now ```zId(ref?)```
27
+ - ```zUUID``` is now ```zUUID()```
28
28
 
29
29
  ## Usage
30
30
 
@@ -41,8 +41,8 @@ const zUser = z.object({
41
41
  age: z.number().min(18).max(100),
42
42
  active: z.boolean().default(false),
43
43
  access: z.enum(["admin", "user"]).default("user"),
44
- companyId: z.objectId("Company"),
45
- wearable: z.mongoUUID(),
44
+ companyId: zId("Company"),
45
+ wearable: zUUID(),
46
46
  address: z.object({
47
47
  street: z.string(),
48
48
  city: z.string(),
@@ -126,7 +126,7 @@ const model = model("User", new Schema(schema, {
126
126
  ```
127
127
 
128
128
  ## ObjectID and UUID
129
- You can use ```z.objectId(ref?: string)``` and ```z.mongoUUID()``` to describe fields as ObjectID and UUID and add reference to another collection:
129
+ You can use ```zId(ref?: string)``` and ```zUUID()``` to describe fields as ObjectID and UUID and add reference to another collection:
130
130
 
131
131
  ```typescript
132
132
  import { extendZod } from "@zodyac/zod-mongoose";
@@ -135,10 +135,10 @@ import { z } from "zod"
135
135
  extendZod(z);
136
136
 
137
137
  const zUser = z.object({
138
- someId: z.objectId(),
139
- companyId: z.objectId("Company"),
140
- facilityId: z.objectId().ref("Facility"),
141
- wearable: z.mongoUUID(),
138
+ someId: zId(),
139
+ companyId: zId("Company"),
140
+ facilityId: zId().ref("Facility"),
141
+ wearable: zUUID(),
142
142
  });
143
143
  ```
144
144
 
package/dist/index.cjs CHANGED
@@ -23,6 +23,8 @@ var src_exports = {};
23
23
  __export(src_exports, {
24
24
  default: () => src_default,
25
25
  extendZod: () => extendZod,
26
+ zId: () => zId,
27
+ zUUID: () => zUUID,
26
28
  zodSchema: () => zodSchema,
27
29
  zodSchemaRaw: () => zodSchemaRaw
28
30
  });
@@ -33,9 +35,10 @@ var import_zod2 = require("zod");
33
35
  // src/extension.ts
34
36
  var import_mongoose = require("mongoose");
35
37
  var import_zod = require("zod");
38
+ var zod_extended = false;
36
39
  function extendZod(z_0) {
37
- if (z_0.__zm_extended) return;
38
- z_0.__zm_extended = true;
40
+ if (zod_extended) return;
41
+ zod_extended = true;
39
42
  const _refine = z_0.ZodType.prototype.refine;
40
43
  z_0.ZodType.prototype.refine = function(check, opts) {
41
44
  const zEffect = _refine.bind(this)(check, opts);
@@ -60,35 +63,41 @@ function extendZod(z_0) {
60
63
  this.__zm_unique = arg;
61
64
  return this;
62
65
  };
63
- z_0.objectId = (ref) => {
64
- const output = import_zod.z.string().refine((v) => (0, import_mongoose.isValidObjectId)(v), {
65
- message: "Invalid ObjectId"
66
- }).or(import_zod.z.instanceof(import_mongoose.Types.ObjectId));
67
- output.__zm_type = "ObjectId";
68
- output.__zm_ref = ref;
69
- output.ref = function(ref2) {
70
- this.__zm_ref = ref2;
71
- return this;
72
- };
73
- output.unique = function(val = true) {
74
- this.__zm_unique = val;
75
- return this;
76
- };
77
- return output;
78
- };
79
- z_0.mongoUUID = () => {
80
- const output = import_zod.z.string().uuid({
81
- message: "Invalid UUID"
82
- }).or(import_zod.z.instanceof(import_mongoose.Types.UUID).describe("UUID"));
83
- output.__zm_type = "UUID";
84
- output.unique = function(val = true) {
85
- this.__zm_unique = val;
86
- return this;
87
- };
88
- return output;
89
- };
90
66
  }
91
67
  __name(extendZod, "extendZod");
68
+ var createId = /* @__PURE__ */ __name(() => {
69
+ return import_zod.z.string().refine((v) => (0, import_mongoose.isValidObjectId)(v), {
70
+ message: "Invalid ObjectId"
71
+ }).or(import_zod.z.instanceof(import_mongoose.Types.ObjectId));
72
+ }, "createId");
73
+ var zId = /* @__PURE__ */ __name((ref) => {
74
+ const output = createId();
75
+ output.__zm_type = "ObjectId";
76
+ output.__zm_ref = ref;
77
+ output.ref = function(ref2) {
78
+ this.__zm_ref = ref2;
79
+ return this;
80
+ };
81
+ output.unique = function(val = true) {
82
+ this.__zm_unique = val;
83
+ return this;
84
+ };
85
+ return output;
86
+ }, "zId");
87
+ var createUUID = /* @__PURE__ */ __name(() => {
88
+ return import_zod.z.string().uuid({
89
+ message: "Invalid UUID"
90
+ }).or(import_zod.z.instanceof(import_mongoose.Types.UUID));
91
+ }, "createUUID");
92
+ var zUUID = /* @__PURE__ */ __name(() => {
93
+ const output = createUUID();
94
+ output.__zm_type = "UUID";
95
+ output.unique = function(val = true) {
96
+ this.__zm_unique = val;
97
+ return this;
98
+ };
99
+ return output;
100
+ }, "zUUID");
92
101
 
93
102
  // src/index.ts
94
103
  function zodSchema(schema, options) {
@@ -299,6 +308,8 @@ var src_default = zodSchema;
299
308
  // Annotate the CommonJS export names for ESM import in node:
300
309
  0 && (module.exports = {
301
310
  extendZod,
311
+ zId,
312
+ zUUID,
302
313
  zodSchema,
303
314
  zodSchemaRaw
304
315
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/extension.ts"],"sourcesContent":["import { Schema, type SchemaOptions, SchemaTypes } from \"mongoose\";\nimport {\n ZodArray,\n ZodDate,\n ZodDefault,\n ZodEffects,\n ZodEnum,\n ZodMap,\n ZodNullable,\n ZodNumber,\n ZodObject,\n ZodOptional,\n type ZodRawShape,\n ZodRecord,\n ZodString,\n type ZodType,\n ZodUnion,\n type z,\n} from \"zod\";\nimport type { zm } from \"./mongoose.types.js\";\nexport * from \"./extension.js\";\n\n/**\n * Converts a Zod schema to a Mongoose schema\n * @param schema zod schema to parse\n * @returns mongoose schema\n *\n * @example\n * import { extendZod, zodSchema } from '@zodyac/zod-mongoose';\n * import { model } from 'mongoose';\n * import { z } from 'zod';\n *\n * extendZod(z);\n *\n * const zUser = z.object({\n * name: z.string().min(3).max(255),\n * age: z.number().min(18).max(100),\n * active: z.boolean().default(false),\n * access: z.enum(['admin', 'user']).default('user'),\n * companyId: z.objectId('Company'),\n * address: z.object({\n * street: z.string(),\n * city: z.string(),\n * state: z.enum(['CA', 'NY', 'TX']),\n * }),\n * tags: z.array(z.string()),\n * createdAt: z.date(),\n * updatedAt: z.date(),\n * });\n *\n * const schema = zodSchema(zDoc);\n * const userModel = model('User', schema);\n */\nexport function zodSchema<T extends ZodRawShape>(\n schema: ZodObject<T>,\n options?: SchemaOptions<any>, // TODO: Fix any\n): Schema<z.infer<typeof schema>> {\n const definition = parseObject(schema);\n return new Schema<z.infer<typeof schema>>(definition, options);\n}\n\n/**\n * Converts a Zod schema to a raw Mongoose schema object\n * @param schema zod schema to parse\n * @returns mongoose schema\n *\n * @example\n * import { extendZod, zodSchemaRaw } from '@zodyac/zod-mongoose';\n * import { model, Schema } from 'mongoose';\n * import { z } from 'zod';\n *\n * extendZod(z);\n *\n * const zUser = z.object({\n * name: z.string().min(3).max(255),\n * age: z.number().min(18).max(100),\n * active: z.boolean().default(false),\n * access: z.enum(['admin', 'user']).default('user'),\n * companyId: z.objectId('Company'),\n * address: z.object({\n * street: z.string(),\n * city: z.string(),\n * state: z.enum(['CA', 'NY', 'TX']),\n * }),\n * tags: z.array(z.string()),\n * createdAt: z.date(),\n * updatedAt: z.date(),\n * });\n *\n * const rawSchema = zodSchemaRaw(zDoc);\n * const schema = new Schema(rawSchema);\n * const userModel = model('User', schema);\n */\nexport function zodSchemaRaw<T extends ZodRawShape>(schema: ZodObject<T>): zm._Schema<T> {\n return parseObject(schema);\n}\n\n// Helpers\nfunction parseObject<T extends ZodRawShape>(obj: ZodObject<T>): zm._Schema<T> {\n const object: any = {};\n for (const [key, field] of Object.entries(obj.shape)) {\n if (field instanceof ZodObject) {\n object[key] = parseObject(field);\n } else {\n const f = parseField(field);\n if (!f) throw new Error(`Unsupported field type: ${field.constructor}`);\n\n object[key] = f;\n }\n }\n\n return object;\n}\n\nfunction parseField<T>(\n field: ZodType<T>,\n required = true,\n def?: T,\n refinement?: zm.EffectValidator<T>,\n): zm.mField | null {\n const field_type = field.constructor.name;\n\n if (\"__zm_type\" in field && field.__zm_type === \"ObjectId\") {\n const ref = (<any>field).__zm_ref;\n const unique = (<any>field).__zm_unique;\n return parseObjectId(required, ref, unique);\n }\n\n if (\"__zm_type\" in field && field.__zm_type === \"UUID\") {\n const unique = (<any>field).__zm_unique;\n return parseUUID(required, unique);\n }\n\n if (field instanceof ZodObject) {\n return parseObject(field);\n }\n\n if (field instanceof ZodNumber) {\n const isUnique = field.__zm_unique ?? false;\n return parseNumber(\n field,\n required,\n def as number,\n isUnique,\n refinement as zm.EffectValidator<number>,\n );\n }\n\n if (field instanceof ZodString) {\n const isUnique = field.__zm_unique ?? false;\n return parseString(\n field,\n required,\n def as string,\n isUnique,\n refinement as zm.EffectValidator<string>,\n );\n }\n\n if (field instanceof ZodEnum) {\n return parseEnum(Object.keys(field.Values), required, def as string);\n }\n\n if (field_type === \"ZodBoolean\") {\n return parseBoolean(required, def as boolean);\n }\n\n if (field instanceof ZodDate) {\n const isUnique = field.__zm_unique ?? false;\n return parseDate(\n required,\n def as Date,\n refinement as zm.EffectValidator<Date>,\n isUnique,\n );\n }\n\n if (field instanceof ZodArray) {\n return parseArray(\n required,\n field.element,\n def as T extends Array<infer K> ? K[] : never,\n );\n }\n\n if (field instanceof ZodDefault) {\n return parseField(field._def.innerType, required, field._def.defaultValue());\n }\n\n if (field instanceof ZodOptional) {\n return parseField(field._def.innerType, false, undefined);\n }\n\n if (field instanceof ZodNullable) {\n return parseField(field._def.innerType, false, def || null);\n }\n\n if (field instanceof ZodUnion) {\n return parseField(field._def.options[0]);\n }\n\n if (field_type === \"ZodAny\") {\n return parseMixed(required, def);\n }\n\n if (field instanceof ZodMap || field instanceof ZodRecord) {\n return parseMap(\n required,\n field.keySchema,\n def as Map<\n zm.UnwrapZodType<typeof field.keySchema>,\n zm.UnwrapZodType<typeof field.valueSchema>\n >,\n );\n }\n\n if (field instanceof ZodEffects) {\n const effect = field._def.effect;\n\n if (effect.type === \"refinement\") {\n const validation = (<any>effect).__zm_validation as zm.EffectValidator<T>;\n return parseField(field._def.schema, required, def, validation);\n }\n }\n\n return null;\n}\n\nfunction parseNumber(\n field: ZodNumber,\n required = true,\n def?: number,\n unique = false,\n validate?: zm.EffectValidator<number>,\n): zm.mNumber {\n const output: zm.mNumber = {\n type: Number,\n default: def,\n min: field.minValue ?? undefined,\n max: field.maxValue ?? undefined,\n required,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseString(\n field: ZodString,\n required = true,\n def?: string,\n unique = false,\n validate?: zm.EffectValidator<string>,\n): zm.mString {\n const output: zm.mString = {\n type: String,\n default: def,\n required,\n minLength: field.minLength ?? undefined,\n maxLength: field.maxLength ?? undefined,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseEnum(values: string[], required = true, def?: string): zm.mString {\n return {\n type: String,\n unique: false,\n default: def,\n enum: values,\n required,\n };\n}\n\nfunction parseBoolean(required = true, def?: boolean): zm.mBoolean {\n return {\n type: Boolean,\n default: def,\n required,\n };\n}\n\nfunction parseDate(\n required = true,\n def?: Date,\n validate?: zm.EffectValidator<Date>,\n unique = false,\n): zm.mDate {\n const output: zm.mDate = {\n type: Date,\n default: def,\n required,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseObjectId(required = true, ref?: string, unique = false): zm.mObjectId {\n const output: zm.mObjectId = {\n type: SchemaTypes.ObjectId,\n required,\n unique,\n };\n\n if (ref) output.ref = ref;\n return output;\n}\n\n// biome-ignore lint/style/useDefaultParameterLast: Should be consistent with other functions\nfunction parseArray<T>(required = true, element: ZodType<T>, def?: T[]): zm.mArray<T> {\n const innerType = parseField(element);\n if (!innerType) throw new Error(\"Unsupported array type\");\n return {\n type: [innerType as zm._Field<T>],\n default: def,\n required,\n };\n}\n\nfunction parseMap<T, K>(\n // biome-ignore lint/style/useDefaultParameterLast: Consistency\n required = true,\n key: ZodType<T>,\n def?: Map<NoInfer<T>, K>,\n): zm.mMap<T, K> {\n const pointer = typeConstructor(key);\n return {\n type: Map,\n of: pointer,\n default: def,\n required,\n };\n}\n\nfunction typeConstructor<T>(t: ZodType<T>) {\n switch (true) {\n case t instanceof ZodString:\n return String;\n case t instanceof ZodEnum:\n return String;\n case t instanceof ZodNumber:\n return Number;\n case t instanceof ZodDate:\n return Date;\n default:\n return undefined;\n }\n}\n\nfunction parseUUID(required = true, unique = false): zm.mUUID {\n return {\n type: SchemaTypes.UUID,\n required,\n unique,\n };\n}\n\nfunction parseMixed(required = true, def?: unknown): zm.mMixed<unknown> {\n return {\n type: SchemaTypes.Mixed,\n default: def,\n required,\n };\n}\n\nexport default zodSchema;\n","import { Types, isValidObjectId } from \"mongoose\";\nimport type { zm } from \"mongoose.types\";\nimport { type CustomErrorParams, z } from \"zod\";\n\ndeclare module \"zod\" {\n interface ZodString {\n unique: (arg?: boolean) => ZodString;\n __zm_unique: boolean;\n }\n\n interface ZodNumber {\n unique: (arg?: boolean) => ZodNumber;\n __zm_unique: boolean;\n }\n\n interface ZodDate {\n unique: (arg?: boolean) => ZodDate;\n __zm_unique: boolean;\n }\n\n namespace z {\n function objectId(ref?: string): zm.zID;\n function mongoUUID(): zm.zUUID;\n }\n\n interface ZodType<\n Output = any,\n Def extends z.ZodTypeDef = z.ZodTypeDef,\n Input = Output,\n > {\n // For future use\n }\n}\n\nexport function extendZod(z_0: typeof z) {\n // Prevent zod from being extended multiple times\n if ((<any>z_0).__zm_extended) return;\n (<any>z_0).__zm_extended = true;\n\n const _refine = z_0.ZodType.prototype.refine;\n z_0.ZodType.prototype.refine = function <T>(\n check: (arg0: T) => boolean,\n opts: string | CustomErrorParams | ((arg: T) => CustomErrorParams),\n ) {\n const zEffect = _refine.bind(this)(check, opts);\n\n let message: string | undefined | ((v: T) => string | undefined) = undefined;\n if (typeof opts === \"string\") message = opts;\n else if (\"message\" in opts) message = opts.message;\n\n (<any>zEffect._def.effect).__zm_validation = {\n validator: check,\n message: message,\n };\n\n return zEffect;\n };\n\n z_0.ZodString.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n z_0.ZodNumber.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n z_0.ZodDate.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n (<any>z_0).objectId = (ref?: string) => {\n const output = z\n .string()\n .refine((v) => isValidObjectId(v), { message: \"Invalid ObjectId\" })\n .or(z.instanceof(Types.ObjectId));\n\n (<any>output).__zm_type = \"ObjectId\";\n (<any>output).__zm_ref = ref;\n\n (<any>output).ref = function (ref: string) {\n (<any>this).__zm_ref = ref;\n return this;\n };\n\n (<any>output).unique = function (val = true) {\n (<any>this).__zm_unique = val;\n return this;\n };\n\n return output;\n };\n\n (<any>z_0).mongoUUID = () => {\n const output = z\n .string()\n .uuid({ message: \"Invalid UUID\" })\n .or(z.instanceof(Types.UUID).describe(\"UUID\"));\n (<any>output).__zm_type = \"UUID\";\n\n (<any>output).unique = function (val = true) {\n (<any>this).__zm_unique = val;\n return this;\n };\n\n return output;\n };\n}\n"],"mappings":"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","names":["import_mongoose","import_zod","extendZod","z_0","__zm_extended","_refine","ZodType","prototype","refine","check","opts","zEffect","bind","message","undefined","_def","effect","__zm_validation","validator","ZodString","unique","arg","__zm_unique","ZodNumber","ZodDate","objectId","ref","output","z","string","v","isValidObjectId","or","instanceof","Types","ObjectId","__zm_type","__zm_ref","val","mongoUUID","uuid","UUID","describe","zodSchema","schema","options","definition","parseObject","Schema","zodSchemaRaw","obj","object","key","field","Object","entries","shape","ZodObject","f","parseField","Error","constructor","required","def","refinement","field_type","name","__zm_type","ref","__zm_ref","unique","__zm_unique","parseObjectId","parseUUID","ZodNumber","isUnique","parseNumber","ZodString","parseString","ZodEnum","parseEnum","keys","Values","parseBoolean","ZodDate","parseDate","ZodArray","parseArray","element","ZodDefault","_def","innerType","defaultValue","ZodOptional","undefined","ZodNullable","ZodUnion","parseMixed","ZodMap","ZodRecord","parseMap","keySchema","ZodEffects","effect","type","validation","__zm_validation","validate","output","Number","default","min","minValue","max","maxValue","String","minLength","maxLength","values","enum","Boolean","Date","SchemaTypes","ObjectId","pointer","typeConstructor","Map","of","t","UUID","Mixed"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/extension.ts"],"sourcesContent":["import { Schema, type SchemaOptions, SchemaTypes } from \"mongoose\";\nimport {\n ZodArray,\n ZodDate,\n ZodDefault,\n ZodEffects,\n ZodEnum,\n ZodMap,\n ZodNullable,\n ZodNumber,\n ZodObject,\n ZodOptional,\n type ZodRawShape,\n ZodRecord,\n ZodString,\n type ZodType,\n ZodUnion,\n type z,\n} from \"zod\";\nimport type { zm } from \"./mongoose.types.js\";\nexport * from \"./extension.js\";\n\n/**\n * Converts a Zod schema to a Mongoose schema\n * @param schema zod schema to parse\n * @returns mongoose schema\n *\n * @example\n * import { extendZod, zodSchema } from '@zodyac/zod-mongoose';\n * import { model } from 'mongoose';\n * import { z } from 'zod';\n *\n * extendZod(z);\n *\n * const zUser = z.object({\n * name: z.string().min(3).max(255),\n * age: z.number().min(18).max(100),\n * active: z.boolean().default(false),\n * access: z.enum(['admin', 'user']).default('user'),\n * companyId: zId('Company'),\n * address: z.object({\n * street: z.string(),\n * city: z.string(),\n * state: z.enum(['CA', 'NY', 'TX']),\n * }),\n * tags: z.array(z.string()),\n * createdAt: z.date(),\n * updatedAt: z.date(),\n * });\n *\n * const schema = zodSchema(zDoc);\n * const userModel = model('User', schema);\n */\nexport function zodSchema<T extends ZodRawShape>(\n schema: ZodObject<T>,\n options?: SchemaOptions<any>, // TODO: Fix any\n): Schema<z.infer<typeof schema>> {\n const definition = parseObject(schema);\n return new Schema<z.infer<typeof schema>>(definition, options);\n}\n\n/**\n * Converts a Zod schema to a raw Mongoose schema object\n * @param schema zod schema to parse\n * @returns mongoose schema\n *\n * @example\n * import { extendZod, zodSchemaRaw } from '@zodyac/zod-mongoose';\n * import { model, Schema } from 'mongoose';\n * import { z } from 'zod';\n *\n * extendZod(z);\n *\n * const zUser = z.object({\n * name: z.string().min(3).max(255),\n * age: z.number().min(18).max(100),\n * active: z.boolean().default(false),\n * access: z.enum(['admin', 'user']).default('user'),\n * companyId: zId('Company'),\n * address: z.object({\n * street: z.string(),\n * city: z.string(),\n * state: z.enum(['CA', 'NY', 'TX']),\n * }),\n * tags: z.array(z.string()),\n * createdAt: z.date(),\n * updatedAt: z.date(),\n * });\n *\n * const rawSchema = zodSchemaRaw(zDoc);\n * const schema = new Schema(rawSchema);\n * const userModel = model('User', schema);\n */\nexport function zodSchemaRaw<T extends ZodRawShape>(schema: ZodObject<T>): zm._Schema<T> {\n return parseObject(schema);\n}\n\n// Helpers\nfunction parseObject<T extends ZodRawShape>(obj: ZodObject<T>): zm._Schema<T> {\n const object: any = {};\n for (const [key, field] of Object.entries(obj.shape)) {\n if (field instanceof ZodObject) {\n object[key] = parseObject(field);\n } else {\n const f = parseField(field);\n if (!f) throw new Error(`Unsupported field type: ${field.constructor}`);\n\n object[key] = f;\n }\n }\n\n return object;\n}\n\nfunction parseField<T>(\n field: ZodType<T>,\n required = true,\n def?: T,\n refinement?: zm.EffectValidator<T>,\n): zm.mField | null {\n const field_type = field.constructor.name;\n\n if (\"__zm_type\" in field && field.__zm_type === \"ObjectId\") {\n const ref = (<any>field).__zm_ref;\n const unique = (<any>field).__zm_unique;\n return parseObjectId(required, ref, unique);\n }\n\n if (\"__zm_type\" in field && field.__zm_type === \"UUID\") {\n const unique = (<any>field).__zm_unique;\n return parseUUID(required, unique);\n }\n\n if (field instanceof ZodObject) {\n return parseObject(field);\n }\n\n if (field instanceof ZodNumber) {\n const isUnique = field.__zm_unique ?? false;\n return parseNumber(\n field,\n required,\n def as number,\n isUnique,\n refinement as zm.EffectValidator<number>,\n );\n }\n\n if (field instanceof ZodString) {\n const isUnique = field.__zm_unique ?? false;\n return parseString(\n field,\n required,\n def as string,\n isUnique,\n refinement as zm.EffectValidator<string>,\n );\n }\n\n if (field instanceof ZodEnum) {\n return parseEnum(Object.keys(field.Values), required, def as string);\n }\n\n if (field_type === \"ZodBoolean\") {\n return parseBoolean(required, def as boolean);\n }\n\n if (field instanceof ZodDate) {\n const isUnique = field.__zm_unique ?? false;\n return parseDate(\n required,\n def as Date,\n refinement as zm.EffectValidator<Date>,\n isUnique,\n );\n }\n\n if (field instanceof ZodArray) {\n return parseArray(\n required,\n field.element,\n def as T extends Array<infer K> ? K[] : never,\n );\n }\n\n if (field instanceof ZodDefault) {\n return parseField(field._def.innerType, required, field._def.defaultValue());\n }\n\n if (field instanceof ZodOptional) {\n return parseField(field._def.innerType, false, undefined);\n }\n\n if (field instanceof ZodNullable) {\n return parseField(field._def.innerType, false, def || null);\n }\n\n if (field instanceof ZodUnion) {\n return parseField(field._def.options[0]);\n }\n\n if (field_type === \"ZodAny\") {\n return parseMixed(required, def);\n }\n\n if (field instanceof ZodMap || field instanceof ZodRecord) {\n return parseMap(\n required,\n field.keySchema,\n def as Map<\n zm.UnwrapZodType<typeof field.keySchema>,\n zm.UnwrapZodType<typeof field.valueSchema>\n >,\n );\n }\n\n if (field instanceof ZodEffects) {\n const effect = field._def.effect;\n\n if (effect.type === \"refinement\") {\n const validation = (<any>effect).__zm_validation as zm.EffectValidator<T>;\n return parseField(field._def.schema, required, def, validation);\n }\n }\n\n return null;\n}\n\nfunction parseNumber(\n field: ZodNumber,\n required = true,\n def?: number,\n unique = false,\n validate?: zm.EffectValidator<number>,\n): zm.mNumber {\n const output: zm.mNumber = {\n type: Number,\n default: def,\n min: field.minValue ?? undefined,\n max: field.maxValue ?? undefined,\n required,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseString(\n field: ZodString,\n required = true,\n def?: string,\n unique = false,\n validate?: zm.EffectValidator<string>,\n): zm.mString {\n const output: zm.mString = {\n type: String,\n default: def,\n required,\n minLength: field.minLength ?? undefined,\n maxLength: field.maxLength ?? undefined,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseEnum(values: string[], required = true, def?: string): zm.mString {\n return {\n type: String,\n unique: false,\n default: def,\n enum: values,\n required,\n };\n}\n\nfunction parseBoolean(required = true, def?: boolean): zm.mBoolean {\n return {\n type: Boolean,\n default: def,\n required,\n };\n}\n\nfunction parseDate(\n required = true,\n def?: Date,\n validate?: zm.EffectValidator<Date>,\n unique = false,\n): zm.mDate {\n const output: zm.mDate = {\n type: Date,\n default: def,\n required,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseObjectId(required = true, ref?: string, unique = false): zm.mObjectId {\n const output: zm.mObjectId = {\n type: SchemaTypes.ObjectId,\n required,\n unique,\n };\n\n if (ref) output.ref = ref;\n return output;\n}\n\n// biome-ignore lint/style/useDefaultParameterLast: Should be consistent with other functions\nfunction parseArray<T>(required = true, element: ZodType<T>, def?: T[]): zm.mArray<T> {\n const innerType = parseField(element);\n if (!innerType) throw new Error(\"Unsupported array type\");\n return {\n type: [innerType as zm._Field<T>],\n default: def,\n required,\n };\n}\n\nfunction parseMap<T, K>(\n // biome-ignore lint/style/useDefaultParameterLast: Consistency\n required = true,\n key: ZodType<T>,\n def?: Map<NoInfer<T>, K>,\n): zm.mMap<T, K> {\n const pointer = typeConstructor(key);\n return {\n type: Map,\n of: pointer,\n default: def,\n required,\n };\n}\n\nfunction typeConstructor<T>(t: ZodType<T>) {\n switch (true) {\n case t instanceof ZodString:\n return String;\n case t instanceof ZodEnum:\n return String;\n case t instanceof ZodNumber:\n return Number;\n case t instanceof ZodDate:\n return Date;\n default:\n return undefined;\n }\n}\n\nfunction parseUUID(required = true, unique = false): zm.mUUID {\n return {\n type: SchemaTypes.UUID,\n required,\n unique,\n };\n}\n\nfunction parseMixed(required = true, def?: unknown): zm.mMixed<unknown> {\n return {\n type: SchemaTypes.Mixed,\n default: def,\n required,\n };\n}\n\nexport default zodSchema;\n","import { Types, isValidObjectId } from \"mongoose\";\nimport { type CustomErrorParams, z } from \"zod\";\n\ndeclare module \"zod\" {\n interface ZodString {\n unique: (arg?: boolean) => ZodString;\n __zm_unique: boolean;\n }\n\n interface ZodNumber {\n unique: (arg?: boolean) => ZodNumber;\n __zm_unique: boolean;\n }\n\n interface ZodDate {\n unique: (arg?: boolean) => ZodDate;\n __zm_unique: boolean;\n }\n\n interface ZodType<\n Output = any,\n Def extends z.ZodTypeDef = z.ZodTypeDef,\n Input = Output,\n > {\n // For future use\n }\n}\n\nlet zod_extended = false;\nexport function extendZod(z_0: typeof z) {\n // Prevent zod from being extended multiple times\n if (zod_extended) return;\n zod_extended = true;\n\n const _refine = z_0.ZodType.prototype.refine;\n z_0.ZodType.prototype.refine = function <T>(\n check: (arg0: T) => boolean,\n opts: string | CustomErrorParams | ((arg: T) => CustomErrorParams),\n ) {\n const zEffect = _refine.bind(this)(check, opts);\n\n let message: string | undefined | ((v: T) => string | undefined) = undefined;\n if (typeof opts === \"string\") message = opts;\n else if (\"message\" in opts) message = opts.message;\n\n (<any>zEffect._def.effect).__zm_validation = {\n validator: check,\n message: message,\n };\n\n return zEffect;\n };\n\n z_0.ZodString.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n z_0.ZodNumber.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n z_0.ZodDate.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n}\n\nexport type TzmId = ReturnType<typeof createId> & {\n unique: (arg?: boolean) => TzmId;\n ref: (arg: string) => TzmId;\n};\n\nconst createId = () => {\n return z\n .string()\n .refine((v) => isValidObjectId(v), { message: \"Invalid ObjectId\" })\n .or(z.instanceof(Types.ObjectId));\n};\n\nexport const zId = (ref?: string): TzmId => {\n const output = createId();\n\n (<any>output).__zm_type = \"ObjectId\";\n (<any>output).__zm_ref = ref;\n\n (<any>output).ref = function (ref: string) {\n (<any>this).__zm_ref = ref;\n return this;\n };\n\n (<any>output).unique = function (val = true) {\n (<any>this).__zm_unique = val;\n return this;\n };\n\n return output as TzmId;\n};\n\nexport type TzmUUID = ReturnType<typeof createUUID> & {\n unique: (arg?: boolean) => TzmUUID;\n};\n\nconst createUUID = () => {\n return z.string().uuid({ message: \"Invalid UUID\" }).or(z.instanceof(Types.UUID));\n};\n\nexport const zUUID = (): TzmUUID => {\n const output = createUUID();\n\n (<any>output).__zm_type = \"UUID\";\n\n (<any>output).unique = function (val = true) {\n (<any>this).__zm_unique = val;\n return this;\n };\n\n return output as TzmUUID;\n};\n"],"mappings":"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","names":["import_mongoose","import_zod","zod_extended","extendZod","z_0","_refine","ZodType","prototype","refine","check","opts","zEffect","bind","message","undefined","_def","effect","__zm_validation","validator","ZodString","unique","arg","__zm_unique","ZodNumber","ZodDate","createId","z","string","v","isValidObjectId","or","instanceof","Types","ObjectId","zId","ref","output","__zm_type","__zm_ref","val","createUUID","uuid","UUID","zUUID","zodSchema","schema","options","definition","parseObject","Schema","zodSchemaRaw","obj","object","key","field","Object","entries","shape","ZodObject","f","parseField","Error","constructor","required","def","refinement","field_type","name","__zm_type","ref","__zm_ref","unique","__zm_unique","parseObjectId","parseUUID","ZodNumber","isUnique","parseNumber","ZodString","parseString","ZodEnum","parseEnum","keys","Values","parseBoolean","ZodDate","parseDate","ZodArray","parseArray","element","ZodDefault","_def","innerType","defaultValue","ZodOptional","undefined","ZodNullable","ZodUnion","parseMixed","ZodMap","ZodRecord","parseMap","keySchema","ZodEffects","effect","type","validation","__zm_validation","validate","output","Number","default","min","minValue","max","maxValue","String","minLength","maxLength","values","enum","Boolean","Date","SchemaTypes","ObjectId","pointer","typeConstructor","Map","of","t","UUID","Mixed"]}
package/dist/index.d.cts CHANGED
@@ -89,16 +89,23 @@ declare module "zod" {
89
89
  unique: (arg?: boolean) => ZodDate;
90
90
  __zm_unique: boolean;
91
91
  }
92
- namespace z {
93
- function objectId(ref?: string): zm.zID;
94
- function mongoUUID(): zm.zUUID;
95
- }
96
92
  interface ZodType<Output = any, Def extends z.ZodTypeDef = z.ZodTypeDef, Input = Output> {
97
93
  }
98
94
  }
99
95
  declare function extendZod(z_0: typeof z): void;
96
+ type TzmId = ReturnType<typeof createId> & {
97
+ unique: (arg?: boolean) => TzmId;
98
+ ref: (arg: string) => TzmId;
99
+ };
100
+ declare const createId: () => z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodType<Types.ObjectId, z.ZodTypeDef, Types.ObjectId>]>;
101
+ declare const zId: (ref?: string) => TzmId;
102
+ type TzmUUID = ReturnType<typeof createUUID> & {
103
+ unique: (arg?: boolean) => TzmUUID;
104
+ };
105
+ declare const createUUID: () => z.ZodUnion<[z.ZodString, z.ZodType<Types.UUID, z.ZodTypeDef, Types.UUID>]>;
106
+ declare const zUUID: () => TzmUUID;
100
107
 
101
108
  declare function zodSchema<T extends ZodRawShape>(schema: ZodObject<T>, options?: SchemaOptions<any>): Schema<z.infer<typeof schema>>;
102
109
  declare function zodSchemaRaw<T extends ZodRawShape>(schema: ZodObject<T>): zm._Schema<T>;
103
110
 
104
- export { zodSchema as default, extendZod, zodSchema, zodSchemaRaw };
111
+ export { type TzmId, type TzmUUID, zodSchema as default, extendZod, zId, zUUID, zodSchema, zodSchemaRaw };
package/dist/index.d.ts CHANGED
@@ -89,16 +89,23 @@ declare module "zod" {
89
89
  unique: (arg?: boolean) => ZodDate;
90
90
  __zm_unique: boolean;
91
91
  }
92
- namespace z {
93
- function objectId(ref?: string): zm.zID;
94
- function mongoUUID(): zm.zUUID;
95
- }
96
92
  interface ZodType<Output = any, Def extends z.ZodTypeDef = z.ZodTypeDef, Input = Output> {
97
93
  }
98
94
  }
99
95
  declare function extendZod(z_0: typeof z): void;
96
+ type TzmId = ReturnType<typeof createId> & {
97
+ unique: (arg?: boolean) => TzmId;
98
+ ref: (arg: string) => TzmId;
99
+ };
100
+ declare const createId: () => z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodType<Types.ObjectId, z.ZodTypeDef, Types.ObjectId>]>;
101
+ declare const zId: (ref?: string) => TzmId;
102
+ type TzmUUID = ReturnType<typeof createUUID> & {
103
+ unique: (arg?: boolean) => TzmUUID;
104
+ };
105
+ declare const createUUID: () => z.ZodUnion<[z.ZodString, z.ZodType<Types.UUID, z.ZodTypeDef, Types.UUID>]>;
106
+ declare const zUUID: () => TzmUUID;
100
107
 
101
108
  declare function zodSchema<T extends ZodRawShape>(schema: ZodObject<T>, options?: SchemaOptions<any>): Schema<z.infer<typeof schema>>;
102
109
  declare function zodSchemaRaw<T extends ZodRawShape>(schema: ZodObject<T>): zm._Schema<T>;
103
110
 
104
- export { zodSchema as default, extendZod, zodSchema, zodSchemaRaw };
111
+ export { type TzmId, type TzmUUID, zodSchema as default, extendZod, zId, zUUID, zodSchema, zodSchemaRaw };
package/dist/index.js CHANGED
@@ -8,9 +8,10 @@ import { ZodArray, ZodDate, ZodDefault, ZodEffects, ZodEnum, ZodMap, ZodNullable
8
8
  // src/extension.ts
9
9
  import { Types, isValidObjectId } from "mongoose";
10
10
  import { z } from "zod";
11
+ var zod_extended = false;
11
12
  function extendZod(z_0) {
12
- if (z_0.__zm_extended) return;
13
- z_0.__zm_extended = true;
13
+ if (zod_extended) return;
14
+ zod_extended = true;
14
15
  const _refine = z_0.ZodType.prototype.refine;
15
16
  z_0.ZodType.prototype.refine = function(check, opts) {
16
17
  const zEffect = _refine.bind(this)(check, opts);
@@ -35,35 +36,41 @@ function extendZod(z_0) {
35
36
  this.__zm_unique = arg;
36
37
  return this;
37
38
  };
38
- z_0.objectId = (ref) => {
39
- const output = z.string().refine((v) => isValidObjectId(v), {
40
- message: "Invalid ObjectId"
41
- }).or(z.instanceof(Types.ObjectId));
42
- output.__zm_type = "ObjectId";
43
- output.__zm_ref = ref;
44
- output.ref = function(ref2) {
45
- this.__zm_ref = ref2;
46
- return this;
47
- };
48
- output.unique = function(val = true) {
49
- this.__zm_unique = val;
50
- return this;
51
- };
52
- return output;
53
- };
54
- z_0.mongoUUID = () => {
55
- const output = z.string().uuid({
56
- message: "Invalid UUID"
57
- }).or(z.instanceof(Types.UUID).describe("UUID"));
58
- output.__zm_type = "UUID";
59
- output.unique = function(val = true) {
60
- this.__zm_unique = val;
61
- return this;
62
- };
63
- return output;
64
- };
65
39
  }
66
40
  __name(extendZod, "extendZod");
41
+ var createId = /* @__PURE__ */ __name(() => {
42
+ return z.string().refine((v) => isValidObjectId(v), {
43
+ message: "Invalid ObjectId"
44
+ }).or(z.instanceof(Types.ObjectId));
45
+ }, "createId");
46
+ var zId = /* @__PURE__ */ __name((ref) => {
47
+ const output = createId();
48
+ output.__zm_type = "ObjectId";
49
+ output.__zm_ref = ref;
50
+ output.ref = function(ref2) {
51
+ this.__zm_ref = ref2;
52
+ return this;
53
+ };
54
+ output.unique = function(val = true) {
55
+ this.__zm_unique = val;
56
+ return this;
57
+ };
58
+ return output;
59
+ }, "zId");
60
+ var createUUID = /* @__PURE__ */ __name(() => {
61
+ return z.string().uuid({
62
+ message: "Invalid UUID"
63
+ }).or(z.instanceof(Types.UUID));
64
+ }, "createUUID");
65
+ var zUUID = /* @__PURE__ */ __name(() => {
66
+ const output = createUUID();
67
+ output.__zm_type = "UUID";
68
+ output.unique = function(val = true) {
69
+ this.__zm_unique = val;
70
+ return this;
71
+ };
72
+ return output;
73
+ }, "zUUID");
67
74
 
68
75
  // src/index.ts
69
76
  function zodSchema(schema, options) {
@@ -274,6 +281,8 @@ var src_default = zodSchema;
274
281
  export {
275
282
  src_default as default,
276
283
  extendZod,
284
+ zId,
285
+ zUUID,
277
286
  zodSchema,
278
287
  zodSchemaRaw
279
288
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/extension.ts"],"sourcesContent":["import { Schema, type SchemaOptions, SchemaTypes } from \"mongoose\";\nimport {\n ZodArray,\n ZodDate,\n ZodDefault,\n ZodEffects,\n ZodEnum,\n ZodMap,\n ZodNullable,\n ZodNumber,\n ZodObject,\n ZodOptional,\n type ZodRawShape,\n ZodRecord,\n ZodString,\n type ZodType,\n ZodUnion,\n type z,\n} from \"zod\";\nimport type { zm } from \"./mongoose.types.js\";\nexport * from \"./extension.js\";\n\n/**\n * Converts a Zod schema to a Mongoose schema\n * @param schema zod schema to parse\n * @returns mongoose schema\n *\n * @example\n * import { extendZod, zodSchema } from '@zodyac/zod-mongoose';\n * import { model } from 'mongoose';\n * import { z } from 'zod';\n *\n * extendZod(z);\n *\n * const zUser = z.object({\n * name: z.string().min(3).max(255),\n * age: z.number().min(18).max(100),\n * active: z.boolean().default(false),\n * access: z.enum(['admin', 'user']).default('user'),\n * companyId: z.objectId('Company'),\n * address: z.object({\n * street: z.string(),\n * city: z.string(),\n * state: z.enum(['CA', 'NY', 'TX']),\n * }),\n * tags: z.array(z.string()),\n * createdAt: z.date(),\n * updatedAt: z.date(),\n * });\n *\n * const schema = zodSchema(zDoc);\n * const userModel = model('User', schema);\n */\nexport function zodSchema<T extends ZodRawShape>(\n schema: ZodObject<T>,\n options?: SchemaOptions<any>, // TODO: Fix any\n): Schema<z.infer<typeof schema>> {\n const definition = parseObject(schema);\n return new Schema<z.infer<typeof schema>>(definition, options);\n}\n\n/**\n * Converts a Zod schema to a raw Mongoose schema object\n * @param schema zod schema to parse\n * @returns mongoose schema\n *\n * @example\n * import { extendZod, zodSchemaRaw } from '@zodyac/zod-mongoose';\n * import { model, Schema } from 'mongoose';\n * import { z } from 'zod';\n *\n * extendZod(z);\n *\n * const zUser = z.object({\n * name: z.string().min(3).max(255),\n * age: z.number().min(18).max(100),\n * active: z.boolean().default(false),\n * access: z.enum(['admin', 'user']).default('user'),\n * companyId: z.objectId('Company'),\n * address: z.object({\n * street: z.string(),\n * city: z.string(),\n * state: z.enum(['CA', 'NY', 'TX']),\n * }),\n * tags: z.array(z.string()),\n * createdAt: z.date(),\n * updatedAt: z.date(),\n * });\n *\n * const rawSchema = zodSchemaRaw(zDoc);\n * const schema = new Schema(rawSchema);\n * const userModel = model('User', schema);\n */\nexport function zodSchemaRaw<T extends ZodRawShape>(schema: ZodObject<T>): zm._Schema<T> {\n return parseObject(schema);\n}\n\n// Helpers\nfunction parseObject<T extends ZodRawShape>(obj: ZodObject<T>): zm._Schema<T> {\n const object: any = {};\n for (const [key, field] of Object.entries(obj.shape)) {\n if (field instanceof ZodObject) {\n object[key] = parseObject(field);\n } else {\n const f = parseField(field);\n if (!f) throw new Error(`Unsupported field type: ${field.constructor}`);\n\n object[key] = f;\n }\n }\n\n return object;\n}\n\nfunction parseField<T>(\n field: ZodType<T>,\n required = true,\n def?: T,\n refinement?: zm.EffectValidator<T>,\n): zm.mField | null {\n const field_type = field.constructor.name;\n\n if (\"__zm_type\" in field && field.__zm_type === \"ObjectId\") {\n const ref = (<any>field).__zm_ref;\n const unique = (<any>field).__zm_unique;\n return parseObjectId(required, ref, unique);\n }\n\n if (\"__zm_type\" in field && field.__zm_type === \"UUID\") {\n const unique = (<any>field).__zm_unique;\n return parseUUID(required, unique);\n }\n\n if (field instanceof ZodObject) {\n return parseObject(field);\n }\n\n if (field instanceof ZodNumber) {\n const isUnique = field.__zm_unique ?? false;\n return parseNumber(\n field,\n required,\n def as number,\n isUnique,\n refinement as zm.EffectValidator<number>,\n );\n }\n\n if (field instanceof ZodString) {\n const isUnique = field.__zm_unique ?? false;\n return parseString(\n field,\n required,\n def as string,\n isUnique,\n refinement as zm.EffectValidator<string>,\n );\n }\n\n if (field instanceof ZodEnum) {\n return parseEnum(Object.keys(field.Values), required, def as string);\n }\n\n if (field_type === \"ZodBoolean\") {\n return parseBoolean(required, def as boolean);\n }\n\n if (field instanceof ZodDate) {\n const isUnique = field.__zm_unique ?? false;\n return parseDate(\n required,\n def as Date,\n refinement as zm.EffectValidator<Date>,\n isUnique,\n );\n }\n\n if (field instanceof ZodArray) {\n return parseArray(\n required,\n field.element,\n def as T extends Array<infer K> ? K[] : never,\n );\n }\n\n if (field instanceof ZodDefault) {\n return parseField(field._def.innerType, required, field._def.defaultValue());\n }\n\n if (field instanceof ZodOptional) {\n return parseField(field._def.innerType, false, undefined);\n }\n\n if (field instanceof ZodNullable) {\n return parseField(field._def.innerType, false, def || null);\n }\n\n if (field instanceof ZodUnion) {\n return parseField(field._def.options[0]);\n }\n\n if (field_type === \"ZodAny\") {\n return parseMixed(required, def);\n }\n\n if (field instanceof ZodMap || field instanceof ZodRecord) {\n return parseMap(\n required,\n field.keySchema,\n def as Map<\n zm.UnwrapZodType<typeof field.keySchema>,\n zm.UnwrapZodType<typeof field.valueSchema>\n >,\n );\n }\n\n if (field instanceof ZodEffects) {\n const effect = field._def.effect;\n\n if (effect.type === \"refinement\") {\n const validation = (<any>effect).__zm_validation as zm.EffectValidator<T>;\n return parseField(field._def.schema, required, def, validation);\n }\n }\n\n return null;\n}\n\nfunction parseNumber(\n field: ZodNumber,\n required = true,\n def?: number,\n unique = false,\n validate?: zm.EffectValidator<number>,\n): zm.mNumber {\n const output: zm.mNumber = {\n type: Number,\n default: def,\n min: field.minValue ?? undefined,\n max: field.maxValue ?? undefined,\n required,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseString(\n field: ZodString,\n required = true,\n def?: string,\n unique = false,\n validate?: zm.EffectValidator<string>,\n): zm.mString {\n const output: zm.mString = {\n type: String,\n default: def,\n required,\n minLength: field.minLength ?? undefined,\n maxLength: field.maxLength ?? undefined,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseEnum(values: string[], required = true, def?: string): zm.mString {\n return {\n type: String,\n unique: false,\n default: def,\n enum: values,\n required,\n };\n}\n\nfunction parseBoolean(required = true, def?: boolean): zm.mBoolean {\n return {\n type: Boolean,\n default: def,\n required,\n };\n}\n\nfunction parseDate(\n required = true,\n def?: Date,\n validate?: zm.EffectValidator<Date>,\n unique = false,\n): zm.mDate {\n const output: zm.mDate = {\n type: Date,\n default: def,\n required,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseObjectId(required = true, ref?: string, unique = false): zm.mObjectId {\n const output: zm.mObjectId = {\n type: SchemaTypes.ObjectId,\n required,\n unique,\n };\n\n if (ref) output.ref = ref;\n return output;\n}\n\n// biome-ignore lint/style/useDefaultParameterLast: Should be consistent with other functions\nfunction parseArray<T>(required = true, element: ZodType<T>, def?: T[]): zm.mArray<T> {\n const innerType = parseField(element);\n if (!innerType) throw new Error(\"Unsupported array type\");\n return {\n type: [innerType as zm._Field<T>],\n default: def,\n required,\n };\n}\n\nfunction parseMap<T, K>(\n // biome-ignore lint/style/useDefaultParameterLast: Consistency\n required = true,\n key: ZodType<T>,\n def?: Map<NoInfer<T>, K>,\n): zm.mMap<T, K> {\n const pointer = typeConstructor(key);\n return {\n type: Map,\n of: pointer,\n default: def,\n required,\n };\n}\n\nfunction typeConstructor<T>(t: ZodType<T>) {\n switch (true) {\n case t instanceof ZodString:\n return String;\n case t instanceof ZodEnum:\n return String;\n case t instanceof ZodNumber:\n return Number;\n case t instanceof ZodDate:\n return Date;\n default:\n return undefined;\n }\n}\n\nfunction parseUUID(required = true, unique = false): zm.mUUID {\n return {\n type: SchemaTypes.UUID,\n required,\n unique,\n };\n}\n\nfunction parseMixed(required = true, def?: unknown): zm.mMixed<unknown> {\n return {\n type: SchemaTypes.Mixed,\n default: def,\n required,\n };\n}\n\nexport default zodSchema;\n","import { Types, isValidObjectId } from \"mongoose\";\nimport type { zm } from \"mongoose.types\";\nimport { type CustomErrorParams, z } from \"zod\";\n\ndeclare module \"zod\" {\n interface ZodString {\n unique: (arg?: boolean) => ZodString;\n __zm_unique: boolean;\n }\n\n interface ZodNumber {\n unique: (arg?: boolean) => ZodNumber;\n __zm_unique: boolean;\n }\n\n interface ZodDate {\n unique: (arg?: boolean) => ZodDate;\n __zm_unique: boolean;\n }\n\n namespace z {\n function objectId(ref?: string): zm.zID;\n function mongoUUID(): zm.zUUID;\n }\n\n interface ZodType<\n Output = any,\n Def extends z.ZodTypeDef = z.ZodTypeDef,\n Input = Output,\n > {\n // For future use\n }\n}\n\nexport function extendZod(z_0: typeof z) {\n // Prevent zod from being extended multiple times\n if ((<any>z_0).__zm_extended) return;\n (<any>z_0).__zm_extended = true;\n\n const _refine = z_0.ZodType.prototype.refine;\n z_0.ZodType.prototype.refine = function <T>(\n check: (arg0: T) => boolean,\n opts: string | CustomErrorParams | ((arg: T) => CustomErrorParams),\n ) {\n const zEffect = _refine.bind(this)(check, opts);\n\n let message: string | undefined | ((v: T) => string | undefined) = undefined;\n if (typeof opts === \"string\") message = opts;\n else if (\"message\" in opts) message = opts.message;\n\n (<any>zEffect._def.effect).__zm_validation = {\n validator: check,\n message: message,\n };\n\n return zEffect;\n };\n\n z_0.ZodString.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n z_0.ZodNumber.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n z_0.ZodDate.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n (<any>z_0).objectId = (ref?: string) => {\n const output = z\n .string()\n .refine((v) => isValidObjectId(v), { message: \"Invalid ObjectId\" })\n .or(z.instanceof(Types.ObjectId));\n\n (<any>output).__zm_type = \"ObjectId\";\n (<any>output).__zm_ref = ref;\n\n (<any>output).ref = function (ref: string) {\n (<any>this).__zm_ref = ref;\n return this;\n };\n\n (<any>output).unique = function (val = true) {\n (<any>this).__zm_unique = val;\n return this;\n };\n\n return output;\n };\n\n (<any>z_0).mongoUUID = () => {\n const output = z\n .string()\n .uuid({ message: \"Invalid UUID\" })\n .or(z.instanceof(Types.UUID).describe(\"UUID\"));\n (<any>output).__zm_type = \"UUID\";\n\n (<any>output).unique = function (val = true) {\n (<any>this).__zm_unique = val;\n return this;\n };\n\n return output;\n };\n}\n"],"mappings":"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","names":["Schema","SchemaTypes","ZodArray","ZodDate","ZodDefault","ZodEffects","ZodEnum","ZodMap","ZodNullable","ZodNumber","ZodObject","ZodOptional","ZodRecord","ZodString","ZodUnion","Types","isValidObjectId","z","extendZod","z_0","__zm_extended","_refine","ZodType","prototype","refine","check","opts","zEffect","bind","message","undefined","_def","effect","__zm_validation","validator","ZodString","unique","arg","__zm_unique","ZodNumber","ZodDate","objectId","ref","output","z","string","v","isValidObjectId","or","instanceof","Types","ObjectId","__zm_type","__zm_ref","val","mongoUUID","uuid","UUID","describe","zodSchema","schema","options","definition","parseObject","Schema","zodSchemaRaw","obj","object","key","field","Object","entries","shape","ZodObject","f","parseField","Error","constructor","required","def","refinement","field_type","name","__zm_type","ref","__zm_ref","unique","__zm_unique","parseObjectId","parseUUID","ZodNumber","isUnique","parseNumber","ZodString","parseString","ZodEnum","parseEnum","keys","Values","parseBoolean","ZodDate","parseDate","ZodArray","parseArray","element","ZodDefault","_def","innerType","defaultValue","ZodOptional","undefined","ZodNullable","ZodUnion","parseMixed","ZodMap","ZodRecord","parseMap","keySchema","ZodEffects","effect","type","validation","__zm_validation","validate","output","Number","default","min","minValue","max","maxValue","String","minLength","maxLength","values","enum","Boolean","Date","SchemaTypes","ObjectId","pointer","typeConstructor","Map","of","t","UUID","Mixed"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/extension.ts"],"sourcesContent":["import { Schema, type SchemaOptions, SchemaTypes } from \"mongoose\";\nimport {\n ZodArray,\n ZodDate,\n ZodDefault,\n ZodEffects,\n ZodEnum,\n ZodMap,\n ZodNullable,\n ZodNumber,\n ZodObject,\n ZodOptional,\n type ZodRawShape,\n ZodRecord,\n ZodString,\n type ZodType,\n ZodUnion,\n type z,\n} from \"zod\";\nimport type { zm } from \"./mongoose.types.js\";\nexport * from \"./extension.js\";\n\n/**\n * Converts a Zod schema to a Mongoose schema\n * @param schema zod schema to parse\n * @returns mongoose schema\n *\n * @example\n * import { extendZod, zodSchema } from '@zodyac/zod-mongoose';\n * import { model } from 'mongoose';\n * import { z } from 'zod';\n *\n * extendZod(z);\n *\n * const zUser = z.object({\n * name: z.string().min(3).max(255),\n * age: z.number().min(18).max(100),\n * active: z.boolean().default(false),\n * access: z.enum(['admin', 'user']).default('user'),\n * companyId: zId('Company'),\n * address: z.object({\n * street: z.string(),\n * city: z.string(),\n * state: z.enum(['CA', 'NY', 'TX']),\n * }),\n * tags: z.array(z.string()),\n * createdAt: z.date(),\n * updatedAt: z.date(),\n * });\n *\n * const schema = zodSchema(zDoc);\n * const userModel = model('User', schema);\n */\nexport function zodSchema<T extends ZodRawShape>(\n schema: ZodObject<T>,\n options?: SchemaOptions<any>, // TODO: Fix any\n): Schema<z.infer<typeof schema>> {\n const definition = parseObject(schema);\n return new Schema<z.infer<typeof schema>>(definition, options);\n}\n\n/**\n * Converts a Zod schema to a raw Mongoose schema object\n * @param schema zod schema to parse\n * @returns mongoose schema\n *\n * @example\n * import { extendZod, zodSchemaRaw } from '@zodyac/zod-mongoose';\n * import { model, Schema } from 'mongoose';\n * import { z } from 'zod';\n *\n * extendZod(z);\n *\n * const zUser = z.object({\n * name: z.string().min(3).max(255),\n * age: z.number().min(18).max(100),\n * active: z.boolean().default(false),\n * access: z.enum(['admin', 'user']).default('user'),\n * companyId: zId('Company'),\n * address: z.object({\n * street: z.string(),\n * city: z.string(),\n * state: z.enum(['CA', 'NY', 'TX']),\n * }),\n * tags: z.array(z.string()),\n * createdAt: z.date(),\n * updatedAt: z.date(),\n * });\n *\n * const rawSchema = zodSchemaRaw(zDoc);\n * const schema = new Schema(rawSchema);\n * const userModel = model('User', schema);\n */\nexport function zodSchemaRaw<T extends ZodRawShape>(schema: ZodObject<T>): zm._Schema<T> {\n return parseObject(schema);\n}\n\n// Helpers\nfunction parseObject<T extends ZodRawShape>(obj: ZodObject<T>): zm._Schema<T> {\n const object: any = {};\n for (const [key, field] of Object.entries(obj.shape)) {\n if (field instanceof ZodObject) {\n object[key] = parseObject(field);\n } else {\n const f = parseField(field);\n if (!f) throw new Error(`Unsupported field type: ${field.constructor}`);\n\n object[key] = f;\n }\n }\n\n return object;\n}\n\nfunction parseField<T>(\n field: ZodType<T>,\n required = true,\n def?: T,\n refinement?: zm.EffectValidator<T>,\n): zm.mField | null {\n const field_type = field.constructor.name;\n\n if (\"__zm_type\" in field && field.__zm_type === \"ObjectId\") {\n const ref = (<any>field).__zm_ref;\n const unique = (<any>field).__zm_unique;\n return parseObjectId(required, ref, unique);\n }\n\n if (\"__zm_type\" in field && field.__zm_type === \"UUID\") {\n const unique = (<any>field).__zm_unique;\n return parseUUID(required, unique);\n }\n\n if (field instanceof ZodObject) {\n return parseObject(field);\n }\n\n if (field instanceof ZodNumber) {\n const isUnique = field.__zm_unique ?? false;\n return parseNumber(\n field,\n required,\n def as number,\n isUnique,\n refinement as zm.EffectValidator<number>,\n );\n }\n\n if (field instanceof ZodString) {\n const isUnique = field.__zm_unique ?? false;\n return parseString(\n field,\n required,\n def as string,\n isUnique,\n refinement as zm.EffectValidator<string>,\n );\n }\n\n if (field instanceof ZodEnum) {\n return parseEnum(Object.keys(field.Values), required, def as string);\n }\n\n if (field_type === \"ZodBoolean\") {\n return parseBoolean(required, def as boolean);\n }\n\n if (field instanceof ZodDate) {\n const isUnique = field.__zm_unique ?? false;\n return parseDate(\n required,\n def as Date,\n refinement as zm.EffectValidator<Date>,\n isUnique,\n );\n }\n\n if (field instanceof ZodArray) {\n return parseArray(\n required,\n field.element,\n def as T extends Array<infer K> ? K[] : never,\n );\n }\n\n if (field instanceof ZodDefault) {\n return parseField(field._def.innerType, required, field._def.defaultValue());\n }\n\n if (field instanceof ZodOptional) {\n return parseField(field._def.innerType, false, undefined);\n }\n\n if (field instanceof ZodNullable) {\n return parseField(field._def.innerType, false, def || null);\n }\n\n if (field instanceof ZodUnion) {\n return parseField(field._def.options[0]);\n }\n\n if (field_type === \"ZodAny\") {\n return parseMixed(required, def);\n }\n\n if (field instanceof ZodMap || field instanceof ZodRecord) {\n return parseMap(\n required,\n field.keySchema,\n def as Map<\n zm.UnwrapZodType<typeof field.keySchema>,\n zm.UnwrapZodType<typeof field.valueSchema>\n >,\n );\n }\n\n if (field instanceof ZodEffects) {\n const effect = field._def.effect;\n\n if (effect.type === \"refinement\") {\n const validation = (<any>effect).__zm_validation as zm.EffectValidator<T>;\n return parseField(field._def.schema, required, def, validation);\n }\n }\n\n return null;\n}\n\nfunction parseNumber(\n field: ZodNumber,\n required = true,\n def?: number,\n unique = false,\n validate?: zm.EffectValidator<number>,\n): zm.mNumber {\n const output: zm.mNumber = {\n type: Number,\n default: def,\n min: field.minValue ?? undefined,\n max: field.maxValue ?? undefined,\n required,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseString(\n field: ZodString,\n required = true,\n def?: string,\n unique = false,\n validate?: zm.EffectValidator<string>,\n): zm.mString {\n const output: zm.mString = {\n type: String,\n default: def,\n required,\n minLength: field.minLength ?? undefined,\n maxLength: field.maxLength ?? undefined,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseEnum(values: string[], required = true, def?: string): zm.mString {\n return {\n type: String,\n unique: false,\n default: def,\n enum: values,\n required,\n };\n}\n\nfunction parseBoolean(required = true, def?: boolean): zm.mBoolean {\n return {\n type: Boolean,\n default: def,\n required,\n };\n}\n\nfunction parseDate(\n required = true,\n def?: Date,\n validate?: zm.EffectValidator<Date>,\n unique = false,\n): zm.mDate {\n const output: zm.mDate = {\n type: Date,\n default: def,\n required,\n unique,\n };\n\n if (validate) output.validate = validate;\n return output;\n}\n\nfunction parseObjectId(required = true, ref?: string, unique = false): zm.mObjectId {\n const output: zm.mObjectId = {\n type: SchemaTypes.ObjectId,\n required,\n unique,\n };\n\n if (ref) output.ref = ref;\n return output;\n}\n\n// biome-ignore lint/style/useDefaultParameterLast: Should be consistent with other functions\nfunction parseArray<T>(required = true, element: ZodType<T>, def?: T[]): zm.mArray<T> {\n const innerType = parseField(element);\n if (!innerType) throw new Error(\"Unsupported array type\");\n return {\n type: [innerType as zm._Field<T>],\n default: def,\n required,\n };\n}\n\nfunction parseMap<T, K>(\n // biome-ignore lint/style/useDefaultParameterLast: Consistency\n required = true,\n key: ZodType<T>,\n def?: Map<NoInfer<T>, K>,\n): zm.mMap<T, K> {\n const pointer = typeConstructor(key);\n return {\n type: Map,\n of: pointer,\n default: def,\n required,\n };\n}\n\nfunction typeConstructor<T>(t: ZodType<T>) {\n switch (true) {\n case t instanceof ZodString:\n return String;\n case t instanceof ZodEnum:\n return String;\n case t instanceof ZodNumber:\n return Number;\n case t instanceof ZodDate:\n return Date;\n default:\n return undefined;\n }\n}\n\nfunction parseUUID(required = true, unique = false): zm.mUUID {\n return {\n type: SchemaTypes.UUID,\n required,\n unique,\n };\n}\n\nfunction parseMixed(required = true, def?: unknown): zm.mMixed<unknown> {\n return {\n type: SchemaTypes.Mixed,\n default: def,\n required,\n };\n}\n\nexport default zodSchema;\n","import { Types, isValidObjectId } from \"mongoose\";\nimport { type CustomErrorParams, z } from \"zod\";\n\ndeclare module \"zod\" {\n interface ZodString {\n unique: (arg?: boolean) => ZodString;\n __zm_unique: boolean;\n }\n\n interface ZodNumber {\n unique: (arg?: boolean) => ZodNumber;\n __zm_unique: boolean;\n }\n\n interface ZodDate {\n unique: (arg?: boolean) => ZodDate;\n __zm_unique: boolean;\n }\n\n interface ZodType<\n Output = any,\n Def extends z.ZodTypeDef = z.ZodTypeDef,\n Input = Output,\n > {\n // For future use\n }\n}\n\nlet zod_extended = false;\nexport function extendZod(z_0: typeof z) {\n // Prevent zod from being extended multiple times\n if (zod_extended) return;\n zod_extended = true;\n\n const _refine = z_0.ZodType.prototype.refine;\n z_0.ZodType.prototype.refine = function <T>(\n check: (arg0: T) => boolean,\n opts: string | CustomErrorParams | ((arg: T) => CustomErrorParams),\n ) {\n const zEffect = _refine.bind(this)(check, opts);\n\n let message: string | undefined | ((v: T) => string | undefined) = undefined;\n if (typeof opts === \"string\") message = opts;\n else if (\"message\" in opts) message = opts.message;\n\n (<any>zEffect._def.effect).__zm_validation = {\n validator: check,\n message: message,\n };\n\n return zEffect;\n };\n\n z_0.ZodString.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n z_0.ZodNumber.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n\n z_0.ZodDate.prototype.unique = function (arg = true) {\n this.__zm_unique = arg;\n return this;\n };\n}\n\nexport type TzmId = ReturnType<typeof createId> & {\n unique: (arg?: boolean) => TzmId;\n ref: (arg: string) => TzmId;\n};\n\nconst createId = () => {\n return z\n .string()\n .refine((v) => isValidObjectId(v), { message: \"Invalid ObjectId\" })\n .or(z.instanceof(Types.ObjectId));\n};\n\nexport const zId = (ref?: string): TzmId => {\n const output = createId();\n\n (<any>output).__zm_type = \"ObjectId\";\n (<any>output).__zm_ref = ref;\n\n (<any>output).ref = function (ref: string) {\n (<any>this).__zm_ref = ref;\n return this;\n };\n\n (<any>output).unique = function (val = true) {\n (<any>this).__zm_unique = val;\n return this;\n };\n\n return output as TzmId;\n};\n\nexport type TzmUUID = ReturnType<typeof createUUID> & {\n unique: (arg?: boolean) => TzmUUID;\n};\n\nconst createUUID = () => {\n return z.string().uuid({ message: \"Invalid UUID\" }).or(z.instanceof(Types.UUID));\n};\n\nexport const zUUID = (): TzmUUID => {\n const output = createUUID();\n\n (<any>output).__zm_type = \"UUID\";\n\n (<any>output).unique = function (val = true) {\n (<any>this).__zm_unique = val;\n return this;\n };\n\n return output as TzmUUID;\n};\n"],"mappings":"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","names":["Schema","SchemaTypes","ZodArray","ZodDate","ZodDefault","ZodEffects","ZodEnum","ZodMap","ZodNullable","ZodNumber","ZodObject","ZodOptional","ZodRecord","ZodString","ZodUnion","Types","isValidObjectId","z","zod_extended","extendZod","z_0","_refine","ZodType","prototype","refine","check","opts","zEffect","bind","message","undefined","_def","effect","__zm_validation","validator","ZodString","unique","arg","__zm_unique","ZodNumber","ZodDate","createId","z","string","v","isValidObjectId","or","instanceof","Types","ObjectId","zId","ref","output","__zm_type","__zm_ref","val","createUUID","uuid","UUID","zUUID","zodSchema","schema","options","definition","parseObject","Schema","zodSchemaRaw","obj","object","key","field","Object","entries","shape","ZodObject","f","parseField","Error","constructor","required","def","refinement","field_type","name","__zm_type","ref","__zm_ref","unique","__zm_unique","parseObjectId","parseUUID","ZodNumber","isUnique","parseNumber","ZodString","parseString","ZodEnum","parseEnum","keys","Values","parseBoolean","ZodDate","parseDate","ZodArray","parseArray","element","ZodDefault","_def","innerType","defaultValue","ZodOptional","undefined","ZodNullable","ZodUnion","parseMixed","ZodMap","ZodRecord","parseMap","keySchema","ZodEffects","effect","type","validation","__zm_validation","validate","output","Number","default","min","minValue","max","maxValue","String","minLength","maxLength","values","enum","Boolean","Date","SchemaTypes","ObjectId","pointer","typeConstructor","Map","of","t","UUID","Mixed"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zodyac/zod-mongoose",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "A library that allows you to generate mongoose schemas from zod objects.",
5
5
  "scripts": {
6
6
  "test": "jest",