orchid-orm-test-factory 0.1.5 → 0.1.6
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 +6 -0
- package/dist/index.esm.js +6 -3
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/factory.test.ts +15 -6
- package/src/factory.ts +11 -3
package/CHANGELOG.md
CHANGED
package/dist/index.esm.js
CHANGED
|
@@ -40,10 +40,13 @@ const makeUniqueText = (sequence, value) => `${sequence} ${value}`;
|
|
|
40
40
|
const makeUniqueEmail = (sequence, value) => `${sequence}-${value}`;
|
|
41
41
|
const makeUniqueUrl = (sequence, value) => value.replace("://", `://${sequence}-`);
|
|
42
42
|
const makeUniqueNumber = (sequence) => sequence;
|
|
43
|
-
const makeSetUniqueValues = (uniqueFields) => {
|
|
43
|
+
const makeSetUniqueValues = (uniqueFields, data) => {
|
|
44
44
|
var _a;
|
|
45
|
+
const dataKeys = Object.keys(data);
|
|
45
46
|
const fns = {};
|
|
46
47
|
for (const field of uniqueFields) {
|
|
48
|
+
if (dataKeys.includes(field.key))
|
|
49
|
+
continue;
|
|
47
50
|
if (field.type === "text") {
|
|
48
51
|
const getValue = field.kind === "email" ? makeUniqueEmail : field.kind === "url" ? makeUniqueUrl : makeUniqueText;
|
|
49
52
|
let fn;
|
|
@@ -90,6 +93,7 @@ const makeBuild = (factory, data, omitValues, pickValues, uniqueFields, arg) =>
|
|
|
90
93
|
schema = schema.pick(pickValues);
|
|
91
94
|
allData = pick(allData, pickValues);
|
|
92
95
|
}
|
|
96
|
+
const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);
|
|
93
97
|
return () => {
|
|
94
98
|
const result = generateMock(schema);
|
|
95
99
|
for (const key in allData) {
|
|
@@ -100,7 +104,6 @@ const makeBuild = (factory, data, omitValues, pickValues, uniqueFields, arg) =>
|
|
|
100
104
|
result[key] = value;
|
|
101
105
|
}
|
|
102
106
|
}
|
|
103
|
-
const setUniqueValues = makeSetUniqueValues(uniqueFields);
|
|
104
107
|
setUniqueValues(result, factory.sequence);
|
|
105
108
|
factory.sequence++;
|
|
106
109
|
return result;
|
|
@@ -129,7 +132,7 @@ const processCreateData = (factory, data, uniqueFields, arg) => {
|
|
|
129
132
|
}
|
|
130
133
|
}
|
|
131
134
|
const pickedSchema = factory.schema.pick(pick2);
|
|
132
|
-
const setUniqueValues = makeSetUniqueValues(uniqueFields);
|
|
135
|
+
const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);
|
|
133
136
|
return () => {
|
|
134
137
|
Object.assign(result, generateMock(pickedSchema));
|
|
135
138
|
for (const key in fns) {
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/factory.ts"],"sourcesContent":["import { AnyZodObject, ZodNullable, ZodString, ZodTypeAny } from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n EmptyObject,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n TextBaseColumn,\n} from 'pqb';\nimport { instanceToZod, InstanceToZod } from 'orchid-orm-schema-to-zod';\nimport { generateMock } from '@anatine/zod-mock';\n\ntype UniqueField =\n | {\n key: string;\n type: 'text';\n kind?: 'email' | 'url';\n max?: number;\n length?: number;\n }\n | {\n key: string;\n type: 'number';\n gt?: number;\n gte?: number;\n };\n\ntype FactoryOptions = {\n sequence?: number;\n sequenceDistance?: number;\n maxTextLength?: number;\n};\n\ntype metaKey = typeof metaKey;\nconst metaKey = Symbol('meta');\n\ntype Result<\n T extends TestFactory,\n Data,\n Omitted = Omit<Data, keyof T[metaKey]['omit']>,\n> = EmptyObject extends T[metaKey]['pick']\n ? Omitted\n : Pick<\n Omitted,\n {\n [K in keyof Omitted]: K extends keyof T[metaKey]['pick'] ? K : never;\n }[keyof Omitted]\n >;\n\ntype BuildArg<T extends TestFactory> = {\n [K in keyof T[metaKey]['type']]?:\n | T[metaKey]['type'][K]\n | ((sequence: number) => T[metaKey]['type'][K]);\n} & Record<string, unknown>;\n\ntype BuildResult<T extends TestFactory, Data extends BuildArg<T>> = Result<\n T,\n BuildArg<T> extends Data\n ? T[metaKey]['type']\n : T[metaKey]['type'] & {\n [K in keyof Data]: Data[K] extends () => void\n ? ReturnType<Data[K]>\n : Data[K];\n }\n>;\n\ntype CreateArg<T extends TestFactory> = CreateData<\n Omit<T['model'], 'inputType'> & {\n inputType: {\n [K in keyof T['model']['type']]?:\n | T['model']['type'][K]\n | ((sequence: number) => T['model']['type'][K]);\n };\n }\n>;\n\ntype CreateResult<T extends TestFactory> = Result<T, T['model']['type']>;\n\nconst omit = <T, Keys extends Record<string, unknown>>(\n obj: T,\n keys: Keys,\n): Omit<T, keyof Keys> => {\n const res = { ...obj };\n Object.keys(keys).forEach((key) => {\n delete (res as unknown as Record<string, unknown>)[key];\n });\n return res;\n};\n\nconst pick = <T, Keys extends Record<string, unknown>>(\n obj: T,\n keys: Keys,\n): Pick<T, { [K in keyof T]: K extends keyof Keys ? K : never }[keyof T]> => {\n const res = {} as T;\n Object.keys(keys).forEach((key) => {\n const value = (obj as unknown as Record<string, unknown>)[key];\n if (value !== undefined) {\n (res as unknown as Record<string, unknown>)[key] = value;\n }\n });\n return res;\n};\n\nconst makeUniqueText = (sequence: number, value: string) =>\n `${sequence} ${value}`;\n\nconst makeUniqueEmail = (sequence: number, value: string) =>\n `${sequence}-${value}`;\n\nconst makeUniqueUrl = (sequence: number, value: string) =>\n value.replace('://', `://${sequence}-`);\n\nconst makeUniqueNumber = (sequence: number) => sequence;\n\nconst makeSetUniqueValues = (uniqueFields: UniqueField[]) => {\n type Fn = (sequence: number, value: unknown) => unknown;\n\n const fns: Record<string, Fn> = {};\n for (const field of uniqueFields) {\n if (field.type === 'text') {\n const getValue =\n field.kind === 'email'\n ? makeUniqueEmail\n : field.kind === 'url'\n ? makeUniqueUrl\n : makeUniqueText;\n\n let fn;\n const max = field.length ?? field.max;\n if (max !== undefined) {\n fn = (sequence: number, value: string) => {\n let result = getValue(sequence, value);\n if (result.length > max) {\n result = result.slice(0, -(result.length - max));\n }\n return result;\n };\n } else {\n fn = getValue;\n }\n fns[field.key] = fn as unknown as Fn;\n } else {\n let fn;\n const { gt, gte } = field;\n if (gt) {\n fn = (sequence: number) => sequence + gt;\n } else if (gte) {\n fn = (sequence: number) => sequence + gte - 1;\n } else {\n fn = makeUniqueNumber;\n }\n fns[field.key] = fn as unknown as Fn;\n }\n }\n\n return (record: Record<string, unknown>, sequence: number) => {\n for (const key in fns) {\n record[key] = fns[key](sequence, record[key]);\n }\n };\n};\n\nconst makeBuild = <T extends TestFactory, Data extends BuildArg<T>>(\n factory: T,\n data: Record<string, unknown>,\n omitValues: Record<PropertyKey, true>,\n pickValues: Record<PropertyKey, true>,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n let schema = factory.schema as AnyZodObject;\n let allData = arg ? { ...data, ...arg } : data;\n\n if (omitValues) {\n schema = schema.omit(omitValues);\n allData = omit(allData, omitValues);\n }\n\n if (pickValues && Object.keys(pickValues).length) {\n schema = schema.pick(pickValues);\n allData = pick(allData, pickValues);\n }\n\n return () => {\n const result = generateMock(schema) as Record<string, unknown>;\n for (const key in allData) {\n const value = (allData as Record<string, unknown>)[key];\n if (typeof value === 'function') {\n result[key] = value(factory.sequence);\n } else {\n result[key] = value;\n }\n }\n\n const setUniqueValues = makeSetUniqueValues(uniqueFields);\n setUniqueValues(result, factory.sequence);\n\n factory.sequence++;\n\n return result as BuildResult<T, Data>;\n };\n};\n\nconst processCreateData = <T extends TestFactory, Data extends CreateArg<T>>(\n factory: T,\n data: Record<string, unknown>,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n const pick: Record<string, true> = {};\n for (const key in factory.model.shape) {\n pick[key] = true;\n }\n\n factory.model.primaryKeys.forEach((key) => {\n if (factory.model.shape[key].dataType.includes('serial')) {\n delete pick[key];\n }\n });\n\n const result: Record<string, unknown> = {};\n\n const fns: Record<string, (sequence: number) => unknown> = {};\n\n const allData = (arg ? { ...data, ...arg } : data) as Record<string, unknown>;\n\n for (const key in allData) {\n delete pick[key];\n const value = allData[key];\n if (typeof value === 'function') {\n fns[key] = value as () => unknown;\n } else {\n result[key] = value;\n }\n }\n\n const pickedSchema = factory.schema.pick(pick);\n const setUniqueValues = makeSetUniqueValues(uniqueFields);\n\n return () => {\n Object.assign(result, generateMock(pickedSchema));\n\n for (const key in fns) {\n result[key] = fns[key](factory.sequence);\n }\n\n setUniqueValues(result, factory.sequence);\n\n factory.sequence++;\n\n return { ...result } as CreateData<T['model']>;\n };\n};\n\nexport class TestFactory<\n Q extends Query = Query,\n Schema extends AnyZodObject = AnyZodObject,\n Type extends EmptyObject = EmptyObject,\n> {\n sequence: number;\n private readonly omitValues: Record<PropertyKey, true> = {};\n private readonly pickValues: Record<PropertyKey, true> = {};\n\n [metaKey]!: {\n type: Type;\n omit: EmptyObject;\n pick: EmptyObject;\n };\n\n constructor(\n public model: Q,\n public schema: Schema,\n private uniqueFields: UniqueField[],\n private readonly data: Record<string, unknown> = {},\n options: FactoryOptions = {},\n ) {\n if (options.sequence !== undefined) {\n this.sequence = options.sequence;\n } else {\n let workerId = parseInt(process.env.JEST_WORKER_ID as string);\n if (isNaN(workerId)) workerId = 1;\n this.sequence = (workerId - 1) * (options.sequenceDistance ?? 1000) + 1;\n }\n }\n\n set<\n T extends this,\n Meta extends { type: EmptyObject },\n Data extends {\n [K in keyof Meta['type']]?: Meta['type'][K] | (() => Meta['type'][K]);\n } & Record<string, unknown>,\n >(\n this: T & { [metaKey]: Meta },\n data: Data,\n ): T & { [metaKey]: Meta & { type: Data } } {\n return Object.assign(Object.create(this), {\n data: { ...this.data, ...data },\n });\n }\n\n omit<T extends this, Keys extends { [K in keyof T[metaKey]['type']]?: true }>(\n this: T,\n keys: Keys,\n ): T & { [metaKey]: T[metaKey] & { omit: Keys } } {\n return Object.assign(Object.create(this), {\n omitValues: { ...this.omitValues, ...keys },\n });\n }\n\n pick<T extends this, Keys extends { [K in keyof T[metaKey]['type']]?: true }>(\n this: T,\n keys: Keys,\n ): T & { [metaKey]: T[metaKey] & { pick: Keys } } {\n return Object.assign(Object.create(this), {\n pickValues: { ...this.pickValues, ...keys },\n });\n }\n\n build<T extends this, Data extends BuildArg<T>>(\n this: T,\n data?: Data,\n ): BuildResult<T, Data> {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n data,\n );\n\n return build();\n }\n\n buildList<T extends this, Data extends BuildArg<T>>(\n this: T,\n qty: number,\n data?: Data,\n ): BuildResult<T, Data>[] {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n data,\n );\n\n return [...Array(qty)].map(build);\n }\n\n async create<T extends this, Data extends CreateArg<T>>(\n this: T,\n data?: Data,\n ): Promise<CreateResult<T>> {\n const getData = processCreateData(this, this.data, this.uniqueFields, data);\n return (await this.model.create(getData())) as CreateResult<T>;\n }\n\n async createList<T extends this, Data extends CreateArg<T>>(\n this: T,\n qty: number,\n data?: Data,\n ): Promise<CreateResult<T>[]> {\n const getData = processCreateData(this, this.data, this.uniqueFields, data);\n const arr = [...Array(qty)].map(getData);\n return (await this.model.createMany(arr)) as CreateResult<T>[];\n }\n\n extend<T extends this>(this: T): new () => TestFactory<Q, Schema, Type> {\n const { model, schema, uniqueFields } = this;\n\n return class extends TestFactory<Q, Schema, Type> {\n constructor() {\n super(model, schema, uniqueFields);\n }\n };\n }\n}\n\nconst nowString = new Date().toISOString();\n\nexport const createFactory = <T extends Query>(\n model: T,\n options?: FactoryOptions,\n) => {\n const schema = instanceToZod(model);\n\n const data: Record<string, unknown> = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in model.shape) {\n const column = model.shape[key];\n if (column instanceof DateBaseColumn) {\n if (column.data.as instanceof IntegerBaseColumn) {\n data[key] = (sequence: number) => now + sequence;\n } else if (column.parseFn?.(nowString) instanceof Date) {\n data[key] = (sequence: number) => new Date(now + sequence);\n } else {\n data[key] = (sequence: number) =>\n new Date(now + sequence).toISOString();\n }\n } else if (column instanceof TextBaseColumn) {\n const max = options?.maxTextLength ?? 1000;\n const item = schema.shape[key];\n const string = (\n item instanceof ZodNullable ? item.unwrap() : item\n ) as ZodString;\n\n const maxCheck = string._def.checks.find(\n (check) => check.kind === 'max',\n ) as { value: number } | undefined;\n\n if (!maxCheck || maxCheck.value > max) {\n (schema.shape as Record<string, ZodTypeAny>)[key] =\n item instanceof ZodNullable\n ? string.max(max).nullable()\n : string.max(max);\n }\n }\n\n if (column.data.index?.unique) {\n if (column instanceof TextBaseColumn) {\n uniqueFields.push({\n key,\n type: 'text',\n kind: column.data.email\n ? 'email'\n : column.data.url\n ? 'url'\n : undefined,\n max: column.data.max,\n length: column.data.length,\n });\n } else if (column instanceof NumberBaseColumn) {\n uniqueFields.push({\n key,\n type: 'number',\n gt: column.data.gt,\n gte: column.data.gte,\n });\n }\n }\n }\n\n return new TestFactory<T, InstanceToZod<T>, T['type']>(\n model,\n schema,\n uniqueFields,\n data,\n options,\n );\n};\n"],"names":["pick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/factory.ts"],"sourcesContent":["import { AnyZodObject, ZodNullable, ZodString, ZodTypeAny } from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n EmptyObject,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n TextBaseColumn,\n} from 'pqb';\nimport { instanceToZod, InstanceToZod } from 'orchid-orm-schema-to-zod';\nimport { generateMock } from '@anatine/zod-mock';\n\ntype UniqueField =\n | {\n key: string;\n type: 'text';\n kind?: 'email' | 'url';\n max?: number;\n length?: number;\n }\n | {\n key: string;\n type: 'number';\n gt?: number;\n gte?: number;\n };\n\ntype FactoryOptions = {\n sequence?: number;\n sequenceDistance?: number;\n maxTextLength?: number;\n};\n\ntype metaKey = typeof metaKey;\nconst metaKey = Symbol('meta');\n\ntype Result<\n T extends TestFactory,\n Data,\n Omitted = Omit<Data, keyof T[metaKey]['omit']>,\n> = EmptyObject extends T[metaKey]['pick']\n ? Omitted\n : Pick<\n Omitted,\n {\n [K in keyof Omitted]: K extends keyof T[metaKey]['pick'] ? K : never;\n }[keyof Omitted]\n >;\n\ntype BuildArg<T extends TestFactory> = {\n [K in keyof T[metaKey]['type']]?:\n | T[metaKey]['type'][K]\n | ((sequence: number) => T[metaKey]['type'][K]);\n} & Record<string, unknown>;\n\ntype BuildResult<T extends TestFactory, Data extends BuildArg<T>> = Result<\n T,\n BuildArg<T> extends Data\n ? T[metaKey]['type']\n : T[metaKey]['type'] & {\n [K in keyof Data]: Data[K] extends () => void\n ? ReturnType<Data[K]>\n : Data[K];\n }\n>;\n\ntype CreateArg<T extends TestFactory> = CreateData<\n Omit<T['model'], 'inputType'> & {\n inputType: {\n [K in keyof T['model']['type']]?:\n | T['model']['type'][K]\n | ((sequence: number) => T['model']['type'][K]);\n };\n }\n>;\n\ntype CreateResult<T extends TestFactory> = Result<T, T['model']['type']>;\n\nconst omit = <T, Keys extends Record<string, unknown>>(\n obj: T,\n keys: Keys,\n): Omit<T, keyof Keys> => {\n const res = { ...obj };\n Object.keys(keys).forEach((key) => {\n delete (res as unknown as Record<string, unknown>)[key];\n });\n return res;\n};\n\nconst pick = <T, Keys extends Record<string, unknown>>(\n obj: T,\n keys: Keys,\n): Pick<T, { [K in keyof T]: K extends keyof Keys ? K : never }[keyof T]> => {\n const res = {} as T;\n Object.keys(keys).forEach((key) => {\n const value = (obj as unknown as Record<string, unknown>)[key];\n if (value !== undefined) {\n (res as unknown as Record<string, unknown>)[key] = value;\n }\n });\n return res;\n};\n\nconst makeUniqueText = (sequence: number, value: string) =>\n `${sequence} ${value}`;\n\nconst makeUniqueEmail = (sequence: number, value: string) =>\n `${sequence}-${value}`;\n\nconst makeUniqueUrl = (sequence: number, value: string) =>\n value.replace('://', `://${sequence}-`);\n\nconst makeUniqueNumber = (sequence: number) => sequence;\n\nconst makeSetUniqueValues = (\n uniqueFields: UniqueField[],\n data: Record<string, unknown>,\n) => {\n type Fn = (sequence: number, value: unknown) => unknown;\n\n const dataKeys = Object.keys(data);\n\n const fns: Record<string, Fn> = {};\n for (const field of uniqueFields) {\n if (dataKeys.includes(field.key)) continue;\n\n if (field.type === 'text') {\n const getValue =\n field.kind === 'email'\n ? makeUniqueEmail\n : field.kind === 'url'\n ? makeUniqueUrl\n : makeUniqueText;\n\n let fn;\n const max = field.length ?? field.max;\n if (max !== undefined) {\n fn = (sequence: number, value: string) => {\n let result = getValue(sequence, value);\n if (result.length > max) {\n result = result.slice(0, -(result.length - max));\n }\n return result;\n };\n } else {\n fn = getValue;\n }\n fns[field.key] = fn as unknown as Fn;\n } else {\n let fn;\n const { gt, gte } = field;\n if (gt) {\n fn = (sequence: number) => sequence + gt;\n } else if (gte) {\n fn = (sequence: number) => sequence + gte - 1;\n } else {\n fn = makeUniqueNumber;\n }\n fns[field.key] = fn as unknown as Fn;\n }\n }\n\n return (record: Record<string, unknown>, sequence: number) => {\n for (const key in fns) {\n record[key] = fns[key](sequence, record[key]);\n }\n };\n};\n\nconst makeBuild = <T extends TestFactory, Data extends BuildArg<T>>(\n factory: T,\n data: Record<string, unknown>,\n omitValues: Record<PropertyKey, true>,\n pickValues: Record<PropertyKey, true>,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n let schema = factory.schema as AnyZodObject;\n let allData = arg ? { ...data, ...arg } : data;\n\n if (omitValues) {\n schema = schema.omit(omitValues);\n allData = omit(allData, omitValues);\n }\n\n if (pickValues && Object.keys(pickValues).length) {\n schema = schema.pick(pickValues);\n allData = pick(allData, pickValues);\n }\n\n const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);\n\n return () => {\n const result = generateMock(schema) as Record<string, unknown>;\n for (const key in allData) {\n const value = (allData as Record<string, unknown>)[key];\n if (typeof value === 'function') {\n result[key] = value(factory.sequence);\n } else {\n result[key] = value;\n }\n }\n\n setUniqueValues(result, factory.sequence);\n\n factory.sequence++;\n\n return result as BuildResult<T, Data>;\n };\n};\n\nconst processCreateData = <T extends TestFactory, Data extends CreateArg<T>>(\n factory: T,\n data: Record<string, unknown>,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n const pick: Record<string, true> = {};\n for (const key in factory.model.shape) {\n pick[key] = true;\n }\n\n factory.model.primaryKeys.forEach((key) => {\n if (factory.model.shape[key].dataType.includes('serial')) {\n delete pick[key];\n }\n });\n\n const result: Record<string, unknown> = {};\n\n const fns: Record<string, (sequence: number) => unknown> = {};\n\n const allData = (arg ? { ...data, ...arg } : data) as Record<string, unknown>;\n\n for (const key in allData) {\n delete pick[key];\n const value = allData[key];\n if (typeof value === 'function') {\n fns[key] = value as () => unknown;\n } else {\n result[key] = value;\n }\n }\n\n const pickedSchema = factory.schema.pick(pick);\n const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);\n\n return () => {\n Object.assign(result, generateMock(pickedSchema));\n\n for (const key in fns) {\n result[key] = fns[key](factory.sequence);\n }\n\n setUniqueValues(result, factory.sequence);\n\n factory.sequence++;\n\n return { ...result } as CreateData<T['model']>;\n };\n};\n\nexport class TestFactory<\n Q extends Query = Query,\n Schema extends AnyZodObject = AnyZodObject,\n Type extends EmptyObject = EmptyObject,\n> {\n sequence: number;\n private readonly omitValues: Record<PropertyKey, true> = {};\n private readonly pickValues: Record<PropertyKey, true> = {};\n\n [metaKey]!: {\n type: Type;\n omit: EmptyObject;\n pick: EmptyObject;\n };\n\n constructor(\n public model: Q,\n public schema: Schema,\n private uniqueFields: UniqueField[],\n private readonly data: Record<string, unknown> = {},\n options: FactoryOptions = {},\n ) {\n if (options.sequence !== undefined) {\n this.sequence = options.sequence;\n } else {\n let workerId = parseInt(process.env.JEST_WORKER_ID as string);\n if (isNaN(workerId)) workerId = 1;\n this.sequence = (workerId - 1) * (options.sequenceDistance ?? 1000) + 1;\n }\n }\n\n set<\n T extends this,\n Meta extends { type: EmptyObject },\n Data extends {\n [K in keyof Meta['type']]?: Meta['type'][K] | (() => Meta['type'][K]);\n } & Record<string, unknown>,\n >(\n this: T & { [metaKey]: Meta },\n data: Data,\n ): T & { [metaKey]: Meta & { type: Data } } {\n return Object.assign(Object.create(this), {\n data: { ...this.data, ...data },\n });\n }\n\n omit<T extends this, Keys extends { [K in keyof T[metaKey]['type']]?: true }>(\n this: T,\n keys: Keys,\n ): T & { [metaKey]: T[metaKey] & { omit: Keys } } {\n return Object.assign(Object.create(this), {\n omitValues: { ...this.omitValues, ...keys },\n });\n }\n\n pick<T extends this, Keys extends { [K in keyof T[metaKey]['type']]?: true }>(\n this: T,\n keys: Keys,\n ): T & { [metaKey]: T[metaKey] & { pick: Keys } } {\n return Object.assign(Object.create(this), {\n pickValues: { ...this.pickValues, ...keys },\n });\n }\n\n build<T extends this, Data extends BuildArg<T>>(\n this: T,\n data?: Data,\n ): BuildResult<T, Data> {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n data,\n );\n\n return build();\n }\n\n buildList<T extends this, Data extends BuildArg<T>>(\n this: T,\n qty: number,\n data?: Data,\n ): BuildResult<T, Data>[] {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n data,\n );\n\n return [...Array(qty)].map(build);\n }\n\n async create<T extends this, Data extends CreateArg<T>>(\n this: T,\n data?: Data,\n ): Promise<CreateResult<T>> {\n const getData = processCreateData(this, this.data, this.uniqueFields, data);\n return (await this.model.create(getData())) as CreateResult<T>;\n }\n\n async createList<T extends this, Data extends CreateArg<T>>(\n this: T,\n qty: number,\n data?: Data,\n ): Promise<CreateResult<T>[]> {\n const getData = processCreateData(this, this.data, this.uniqueFields, data);\n const arr = [...Array(qty)].map(getData);\n return (await this.model.createMany(arr)) as CreateResult<T>[];\n }\n\n extend<T extends this>(this: T): new () => TestFactory<Q, Schema, Type> {\n const { model, schema, uniqueFields } = this;\n\n return class extends TestFactory<Q, Schema, Type> {\n constructor() {\n super(model, schema, uniqueFields);\n }\n };\n }\n}\n\nconst nowString = new Date().toISOString();\n\nexport const createFactory = <T extends Query>(\n model: T,\n options?: FactoryOptions,\n) => {\n const schema = instanceToZod(model);\n\n const data: Record<string, unknown> = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in model.shape) {\n const column = model.shape[key];\n if (column instanceof DateBaseColumn) {\n if (column.data.as instanceof IntegerBaseColumn) {\n data[key] = (sequence: number) => now + sequence;\n } else if (column.parseFn?.(nowString) instanceof Date) {\n data[key] = (sequence: number) => new Date(now + sequence);\n } else {\n data[key] = (sequence: number) =>\n new Date(now + sequence).toISOString();\n }\n } else if (column instanceof TextBaseColumn) {\n const max = options?.maxTextLength ?? 1000;\n const item = schema.shape[key];\n const string = (\n item instanceof ZodNullable ? item.unwrap() : item\n ) as ZodString;\n\n const maxCheck = string._def.checks.find(\n (check) => check.kind === 'max',\n ) as { value: number } | undefined;\n\n if (!maxCheck || maxCheck.value > max) {\n (schema.shape as Record<string, ZodTypeAny>)[key] =\n item instanceof ZodNullable\n ? string.max(max).nullable()\n : string.max(max);\n }\n }\n\n if (column.data.index?.unique) {\n if (column instanceof TextBaseColumn) {\n uniqueFields.push({\n key,\n type: 'text',\n kind: column.data.email\n ? 'email'\n : column.data.url\n ? 'url'\n : undefined,\n max: column.data.max,\n length: column.data.length,\n });\n } else if (column instanceof NumberBaseColumn) {\n uniqueFields.push({\n key,\n type: 'number',\n gt: column.data.gt,\n gte: column.data.gte,\n });\n }\n }\n }\n\n return new TestFactory<T, InstanceToZod<T>, T['type']>(\n model,\n schema,\n uniqueFields,\n data,\n options,\n );\n};\n"],"names":["pick"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -44,10 +44,13 @@ const makeUniqueText = (sequence, value) => `${sequence} ${value}`;
|
|
|
44
44
|
const makeUniqueEmail = (sequence, value) => `${sequence}-${value}`;
|
|
45
45
|
const makeUniqueUrl = (sequence, value) => value.replace("://", `://${sequence}-`);
|
|
46
46
|
const makeUniqueNumber = (sequence) => sequence;
|
|
47
|
-
const makeSetUniqueValues = (uniqueFields) => {
|
|
47
|
+
const makeSetUniqueValues = (uniqueFields, data) => {
|
|
48
48
|
var _a;
|
|
49
|
+
const dataKeys = Object.keys(data);
|
|
49
50
|
const fns = {};
|
|
50
51
|
for (const field of uniqueFields) {
|
|
52
|
+
if (dataKeys.includes(field.key))
|
|
53
|
+
continue;
|
|
51
54
|
if (field.type === "text") {
|
|
52
55
|
const getValue = field.kind === "email" ? makeUniqueEmail : field.kind === "url" ? makeUniqueUrl : makeUniqueText;
|
|
53
56
|
let fn;
|
|
@@ -94,6 +97,7 @@ const makeBuild = (factory, data, omitValues, pickValues, uniqueFields, arg) =>
|
|
|
94
97
|
schema = schema.pick(pickValues);
|
|
95
98
|
allData = pick(allData, pickValues);
|
|
96
99
|
}
|
|
100
|
+
const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);
|
|
97
101
|
return () => {
|
|
98
102
|
const result = zodMock.generateMock(schema);
|
|
99
103
|
for (const key in allData) {
|
|
@@ -104,7 +108,6 @@ const makeBuild = (factory, data, omitValues, pickValues, uniqueFields, arg) =>
|
|
|
104
108
|
result[key] = value;
|
|
105
109
|
}
|
|
106
110
|
}
|
|
107
|
-
const setUniqueValues = makeSetUniqueValues(uniqueFields);
|
|
108
111
|
setUniqueValues(result, factory.sequence);
|
|
109
112
|
factory.sequence++;
|
|
110
113
|
return result;
|
|
@@ -133,7 +136,7 @@ const processCreateData = (factory, data, uniqueFields, arg) => {
|
|
|
133
136
|
}
|
|
134
137
|
}
|
|
135
138
|
const pickedSchema = factory.schema.pick(pick2);
|
|
136
|
-
const setUniqueValues = makeSetUniqueValues(uniqueFields);
|
|
139
|
+
const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);
|
|
137
140
|
return () => {
|
|
138
141
|
Object.assign(result, zodMock.generateMock(pickedSchema));
|
|
139
142
|
for (const key in fns) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/factory.ts"],"sourcesContent":["import { AnyZodObject, ZodNullable, ZodString, ZodTypeAny } from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n EmptyObject,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n TextBaseColumn,\n} from 'pqb';\nimport { instanceToZod, InstanceToZod } from 'orchid-orm-schema-to-zod';\nimport { generateMock } from '@anatine/zod-mock';\n\ntype UniqueField =\n | {\n key: string;\n type: 'text';\n kind?: 'email' | 'url';\n max?: number;\n length?: number;\n }\n | {\n key: string;\n type: 'number';\n gt?: number;\n gte?: number;\n };\n\ntype FactoryOptions = {\n sequence?: number;\n sequenceDistance?: number;\n maxTextLength?: number;\n};\n\ntype metaKey = typeof metaKey;\nconst metaKey = Symbol('meta');\n\ntype Result<\n T extends TestFactory,\n Data,\n Omitted = Omit<Data, keyof T[metaKey]['omit']>,\n> = EmptyObject extends T[metaKey]['pick']\n ? Omitted\n : Pick<\n Omitted,\n {\n [K in keyof Omitted]: K extends keyof T[metaKey]['pick'] ? K : never;\n }[keyof Omitted]\n >;\n\ntype BuildArg<T extends TestFactory> = {\n [K in keyof T[metaKey]['type']]?:\n | T[metaKey]['type'][K]\n | ((sequence: number) => T[metaKey]['type'][K]);\n} & Record<string, unknown>;\n\ntype BuildResult<T extends TestFactory, Data extends BuildArg<T>> = Result<\n T,\n BuildArg<T> extends Data\n ? T[metaKey]['type']\n : T[metaKey]['type'] & {\n [K in keyof Data]: Data[K] extends () => void\n ? ReturnType<Data[K]>\n : Data[K];\n }\n>;\n\ntype CreateArg<T extends TestFactory> = CreateData<\n Omit<T['model'], 'inputType'> & {\n inputType: {\n [K in keyof T['model']['type']]?:\n | T['model']['type'][K]\n | ((sequence: number) => T['model']['type'][K]);\n };\n }\n>;\n\ntype CreateResult<T extends TestFactory> = Result<T, T['model']['type']>;\n\nconst omit = <T, Keys extends Record<string, unknown>>(\n obj: T,\n keys: Keys,\n): Omit<T, keyof Keys> => {\n const res = { ...obj };\n Object.keys(keys).forEach((key) => {\n delete (res as unknown as Record<string, unknown>)[key];\n });\n return res;\n};\n\nconst pick = <T, Keys extends Record<string, unknown>>(\n obj: T,\n keys: Keys,\n): Pick<T, { [K in keyof T]: K extends keyof Keys ? K : never }[keyof T]> => {\n const res = {} as T;\n Object.keys(keys).forEach((key) => {\n const value = (obj as unknown as Record<string, unknown>)[key];\n if (value !== undefined) {\n (res as unknown as Record<string, unknown>)[key] = value;\n }\n });\n return res;\n};\n\nconst makeUniqueText = (sequence: number, value: string) =>\n `${sequence} ${value}`;\n\nconst makeUniqueEmail = (sequence: number, value: string) =>\n `${sequence}-${value}`;\n\nconst makeUniqueUrl = (sequence: number, value: string) =>\n value.replace('://', `://${sequence}-`);\n\nconst makeUniqueNumber = (sequence: number) => sequence;\n\nconst makeSetUniqueValues = (uniqueFields: UniqueField[]) => {\n type Fn = (sequence: number, value: unknown) => unknown;\n\n const fns: Record<string, Fn> = {};\n for (const field of uniqueFields) {\n if (field.type === 'text') {\n const getValue =\n field.kind === 'email'\n ? makeUniqueEmail\n : field.kind === 'url'\n ? makeUniqueUrl\n : makeUniqueText;\n\n let fn;\n const max = field.length ?? field.max;\n if (max !== undefined) {\n fn = (sequence: number, value: string) => {\n let result = getValue(sequence, value);\n if (result.length > max) {\n result = result.slice(0, -(result.length - max));\n }\n return result;\n };\n } else {\n fn = getValue;\n }\n fns[field.key] = fn as unknown as Fn;\n } else {\n let fn;\n const { gt, gte } = field;\n if (gt) {\n fn = (sequence: number) => sequence + gt;\n } else if (gte) {\n fn = (sequence: number) => sequence + gte - 1;\n } else {\n fn = makeUniqueNumber;\n }\n fns[field.key] = fn as unknown as Fn;\n }\n }\n\n return (record: Record<string, unknown>, sequence: number) => {\n for (const key in fns) {\n record[key] = fns[key](sequence, record[key]);\n }\n };\n};\n\nconst makeBuild = <T extends TestFactory, Data extends BuildArg<T>>(\n factory: T,\n data: Record<string, unknown>,\n omitValues: Record<PropertyKey, true>,\n pickValues: Record<PropertyKey, true>,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n let schema = factory.schema as AnyZodObject;\n let allData = arg ? { ...data, ...arg } : data;\n\n if (omitValues) {\n schema = schema.omit(omitValues);\n allData = omit(allData, omitValues);\n }\n\n if (pickValues && Object.keys(pickValues).length) {\n schema = schema.pick(pickValues);\n allData = pick(allData, pickValues);\n }\n\n return () => {\n const result = generateMock(schema) as Record<string, unknown>;\n for (const key in allData) {\n const value = (allData as Record<string, unknown>)[key];\n if (typeof value === 'function') {\n result[key] = value(factory.sequence);\n } else {\n result[key] = value;\n }\n }\n\n const setUniqueValues = makeSetUniqueValues(uniqueFields);\n setUniqueValues(result, factory.sequence);\n\n factory.sequence++;\n\n return result as BuildResult<T, Data>;\n };\n};\n\nconst processCreateData = <T extends TestFactory, Data extends CreateArg<T>>(\n factory: T,\n data: Record<string, unknown>,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n const pick: Record<string, true> = {};\n for (const key in factory.model.shape) {\n pick[key] = true;\n }\n\n factory.model.primaryKeys.forEach((key) => {\n if (factory.model.shape[key].dataType.includes('serial')) {\n delete pick[key];\n }\n });\n\n const result: Record<string, unknown> = {};\n\n const fns: Record<string, (sequence: number) => unknown> = {};\n\n const allData = (arg ? { ...data, ...arg } : data) as Record<string, unknown>;\n\n for (const key in allData) {\n delete pick[key];\n const value = allData[key];\n if (typeof value === 'function') {\n fns[key] = value as () => unknown;\n } else {\n result[key] = value;\n }\n }\n\n const pickedSchema = factory.schema.pick(pick);\n const setUniqueValues = makeSetUniqueValues(uniqueFields);\n\n return () => {\n Object.assign(result, generateMock(pickedSchema));\n\n for (const key in fns) {\n result[key] = fns[key](factory.sequence);\n }\n\n setUniqueValues(result, factory.sequence);\n\n factory.sequence++;\n\n return { ...result } as CreateData<T['model']>;\n };\n};\n\nexport class TestFactory<\n Q extends Query = Query,\n Schema extends AnyZodObject = AnyZodObject,\n Type extends EmptyObject = EmptyObject,\n> {\n sequence: number;\n private readonly omitValues: Record<PropertyKey, true> = {};\n private readonly pickValues: Record<PropertyKey, true> = {};\n\n [metaKey]!: {\n type: Type;\n omit: EmptyObject;\n pick: EmptyObject;\n };\n\n constructor(\n public model: Q,\n public schema: Schema,\n private uniqueFields: UniqueField[],\n private readonly data: Record<string, unknown> = {},\n options: FactoryOptions = {},\n ) {\n if (options.sequence !== undefined) {\n this.sequence = options.sequence;\n } else {\n let workerId = parseInt(process.env.JEST_WORKER_ID as string);\n if (isNaN(workerId)) workerId = 1;\n this.sequence = (workerId - 1) * (options.sequenceDistance ?? 1000) + 1;\n }\n }\n\n set<\n T extends this,\n Meta extends { type: EmptyObject },\n Data extends {\n [K in keyof Meta['type']]?: Meta['type'][K] | (() => Meta['type'][K]);\n } & Record<string, unknown>,\n >(\n this: T & { [metaKey]: Meta },\n data: Data,\n ): T & { [metaKey]: Meta & { type: Data } } {\n return Object.assign(Object.create(this), {\n data: { ...this.data, ...data },\n });\n }\n\n omit<T extends this, Keys extends { [K in keyof T[metaKey]['type']]?: true }>(\n this: T,\n keys: Keys,\n ): T & { [metaKey]: T[metaKey] & { omit: Keys } } {\n return Object.assign(Object.create(this), {\n omitValues: { ...this.omitValues, ...keys },\n });\n }\n\n pick<T extends this, Keys extends { [K in keyof T[metaKey]['type']]?: true }>(\n this: T,\n keys: Keys,\n ): T & { [metaKey]: T[metaKey] & { pick: Keys } } {\n return Object.assign(Object.create(this), {\n pickValues: { ...this.pickValues, ...keys },\n });\n }\n\n build<T extends this, Data extends BuildArg<T>>(\n this: T,\n data?: Data,\n ): BuildResult<T, Data> {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n data,\n );\n\n return build();\n }\n\n buildList<T extends this, Data extends BuildArg<T>>(\n this: T,\n qty: number,\n data?: Data,\n ): BuildResult<T, Data>[] {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n data,\n );\n\n return [...Array(qty)].map(build);\n }\n\n async create<T extends this, Data extends CreateArg<T>>(\n this: T,\n data?: Data,\n ): Promise<CreateResult<T>> {\n const getData = processCreateData(this, this.data, this.uniqueFields, data);\n return (await this.model.create(getData())) as CreateResult<T>;\n }\n\n async createList<T extends this, Data extends CreateArg<T>>(\n this: T,\n qty: number,\n data?: Data,\n ): Promise<CreateResult<T>[]> {\n const getData = processCreateData(this, this.data, this.uniqueFields, data);\n const arr = [...Array(qty)].map(getData);\n return (await this.model.createMany(arr)) as CreateResult<T>[];\n }\n\n extend<T extends this>(this: T): new () => TestFactory<Q, Schema, Type> {\n const { model, schema, uniqueFields } = this;\n\n return class extends TestFactory<Q, Schema, Type> {\n constructor() {\n super(model, schema, uniqueFields);\n }\n };\n }\n}\n\nconst nowString = new Date().toISOString();\n\nexport const createFactory = <T extends Query>(\n model: T,\n options?: FactoryOptions,\n) => {\n const schema = instanceToZod(model);\n\n const data: Record<string, unknown> = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in model.shape) {\n const column = model.shape[key];\n if (column instanceof DateBaseColumn) {\n if (column.data.as instanceof IntegerBaseColumn) {\n data[key] = (sequence: number) => now + sequence;\n } else if (column.parseFn?.(nowString) instanceof Date) {\n data[key] = (sequence: number) => new Date(now + sequence);\n } else {\n data[key] = (sequence: number) =>\n new Date(now + sequence).toISOString();\n }\n } else if (column instanceof TextBaseColumn) {\n const max = options?.maxTextLength ?? 1000;\n const item = schema.shape[key];\n const string = (\n item instanceof ZodNullable ? item.unwrap() : item\n ) as ZodString;\n\n const maxCheck = string._def.checks.find(\n (check) => check.kind === 'max',\n ) as { value: number } | undefined;\n\n if (!maxCheck || maxCheck.value > max) {\n (schema.shape as Record<string, ZodTypeAny>)[key] =\n item instanceof ZodNullable\n ? string.max(max).nullable()\n : string.max(max);\n }\n }\n\n if (column.data.index?.unique) {\n if (column instanceof TextBaseColumn) {\n uniqueFields.push({\n key,\n type: 'text',\n kind: column.data.email\n ? 'email'\n : column.data.url\n ? 'url'\n : undefined,\n max: column.data.max,\n length: column.data.length,\n });\n } else if (column instanceof NumberBaseColumn) {\n uniqueFields.push({\n key,\n type: 'number',\n gt: column.data.gt,\n gte: column.data.gte,\n });\n }\n }\n }\n\n return new TestFactory<T, InstanceToZod<T>, T['type']>(\n model,\n schema,\n uniqueFields,\n data,\n options,\n );\n};\n"],"names":["generateMock","pick","instanceToZod","DateBaseColumn","IntegerBaseColumn","TextBaseColumn","ZodNullable","NumberBaseColumn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA+EA,MAAM,IAAA,GAAO,CACX,GAAA,EACA,IACwB,KAAA;AACxB,EAAA,MAAM,MAAM,cAAK,CAAA,EAAA,EAAA,GAAA,CAAA,CAAA;AACjB,EAAA,MAAA,CAAO,IAAK,CAAA,IAAI,CAAE,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACjC,IAAA,OAAQ,GAA2C,CAAA,GAAA,CAAA,CAAA;AAAA,GACpD,CAAA,CAAA;AACD,EAAO,OAAA,GAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,IAAA,GAAO,CACX,GAAA,EACA,IAC2E,KAAA;AAC3E,EAAA,MAAM,MAAM,EAAC,CAAA;AACb,EAAA,MAAA,CAAO,IAAK,CAAA,IAAI,CAAE,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACjC,IAAA,MAAM,QAAS,GAA2C,CAAA,GAAA,CAAA,CAAA;AAC1D,IAAA,IAAI,UAAU,KAAW,CAAA,EAAA;AACvB,MAAC,IAA2C,GAAO,CAAA,GAAA,KAAA,CAAA;AAAA,KACrD;AAAA,GACD,CAAA,CAAA;AACD,EAAO,OAAA,GAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,cAAiB,GAAA,CAAC,QAAkB,EAAA,KAAA,KACxC,GAAG,QAAY,CAAA,CAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAEjB,MAAM,eAAkB,GAAA,CAAC,QAAkB,EAAA,KAAA,KACzC,GAAG,QAAY,CAAA,CAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAEjB,MAAM,aAAA,GAAgB,CAAC,QAAkB,EAAA,KAAA,KACvC,MAAM,OAAQ,CAAA,KAAA,EAAO,MAAM,QAAW,CAAA,CAAA,CAAA,CAAA,CAAA;AAExC,MAAM,gBAAA,GAAmB,CAAC,QAAqB,KAAA,QAAA,CAAA;AAE/C,MAAM,mBAAA,GAAsB,CAAC,YAAgC,KAAA;AAnH7D,EAAA,IAAA,EAAA,CAAA;AAsHE,EAAA,MAAM,MAA0B,EAAC,CAAA;AACjC,EAAA,KAAA,MAAW,SAAS,YAAc,EAAA;AAChC,IAAI,IAAA,KAAA,CAAM,SAAS,MAAQ,EAAA;AACzB,MAAM,MAAA,QAAA,GACJ,MAAM,IAAS,KAAA,OAAA,GACX,kBACA,KAAM,CAAA,IAAA,KAAS,QACf,aACA,GAAA,cAAA,CAAA;AAEN,MAAI,IAAA,EAAA,CAAA;AACJ,MAAA,MAAM,GAAM,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,MAAN,KAAA,IAAA,GAAA,EAAA,GAAgB,KAAM,CAAA,GAAA,CAAA;AAClC,MAAA,IAAI,QAAQ,KAAW,CAAA,EAAA;AACrB,QAAK,EAAA,GAAA,CAAC,UAAkB,KAAkB,KAAA;AACxC,UAAI,IAAA,MAAA,GAAS,QAAS,CAAA,QAAA,EAAU,KAAK,CAAA,CAAA;AACrC,UAAI,IAAA,MAAA,CAAO,SAAS,GAAK,EAAA;AACvB,YAAA,MAAA,GAAS,OAAO,KAAM,CAAA,CAAA,EAAG,EAAE,MAAA,CAAO,SAAS,GAAI,CAAA,CAAA,CAAA;AAAA,WACjD;AACA,UAAO,OAAA,MAAA,CAAA;AAAA,SACT,CAAA;AAAA,OACK,MAAA;AACL,QAAK,EAAA,GAAA,QAAA,CAAA;AAAA,OACP;AACA,MAAA,GAAA,CAAI,MAAM,GAAO,CAAA,GAAA,EAAA,CAAA;AAAA,KACZ,MAAA;AACL,MAAI,IAAA,EAAA,CAAA;AACJ,MAAM,MAAA,EAAE,EAAI,EAAA,GAAA,EAAQ,GAAA,KAAA,CAAA;AACpB,MAAA,IAAI,EAAI,EAAA;AACN,QAAK,EAAA,GAAA,CAAC,aAAqB,QAAW,GAAA,EAAA,CAAA;AAAA,iBAC7B,GAAK,EAAA;AACd,QAAK,EAAA,GAAA,CAAC,QAAqB,KAAA,QAAA,GAAW,GAAM,GAAA,CAAA,CAAA;AAAA,OACvC,MAAA;AACL,QAAK,EAAA,GAAA,gBAAA,CAAA;AAAA,OACP;AACA,MAAA,GAAA,CAAI,MAAM,GAAO,CAAA,GAAA,EAAA,CAAA;AAAA,KACnB;AAAA,GACF;AAEA,EAAO,OAAA,CAAC,QAAiC,QAAqB,KAAA;AAC5D,IAAA,KAAA,MAAW,OAAO,GAAK,EAAA;AACrB,MAAA,MAAA,CAAO,GAAO,CAAA,GAAA,GAAA,CAAI,GAAK,CAAA,CAAA,QAAA,EAAU,OAAO,GAAI,CAAA,CAAA,CAAA;AAAA,KAC9C;AAAA,GACF,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,YAAY,CAChB,OAAA,EACA,MACA,UACA,EAAA,UAAA,EACA,cACA,GACG,KAAA;AACH,EAAA,IAAI,SAAS,OAAQ,CAAA,MAAA,CAAA;AACrB,EAAA,IAAI,OAAU,GAAA,GAAA,GAAM,cAAK,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAA,EAAS,GAAQ,CAAA,GAAA,IAAA,CAAA;AAE1C,EAAA,IAAI,UAAY,EAAA;AACd,IAAS,MAAA,GAAA,MAAA,CAAO,KAAK,UAAU,CAAA,CAAA;AAC/B,IAAU,OAAA,GAAA,IAAA,CAAK,SAAS,UAAU,CAAA,CAAA;AAAA,GACpC;AAEA,EAAA,IAAI,UAAc,IAAA,MAAA,CAAO,IAAK,CAAA,UAAU,EAAE,MAAQ,EAAA;AAChD,IAAS,MAAA,GAAA,MAAA,CAAO,KAAK,UAAU,CAAA,CAAA;AAC/B,IAAU,OAAA,GAAA,IAAA,CAAK,SAAS,UAAU,CAAA,CAAA;AAAA,GACpC;AAEA,EAAA,OAAO,MAAM;AACX,IAAM,MAAA,MAAA,GAASA,qBAAa,MAAM,CAAA,CAAA;AAClC,IAAA,KAAA,MAAW,OAAO,OAAS,EAAA;AACzB,MAAA,MAAM,QAAS,OAAoC,CAAA,GAAA,CAAA,CAAA;AACnD,MAAI,IAAA,OAAO,UAAU,UAAY,EAAA;AAC/B,QAAO,MAAA,CAAA,GAAA,CAAA,GAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,OAC/B,MAAA;AACL,QAAA,MAAA,CAAO,GAAO,CAAA,GAAA,KAAA,CAAA;AAAA,OAChB;AAAA,KACF;AAEA,IAAM,MAAA,eAAA,GAAkB,oBAAoB,YAAY,CAAA,CAAA;AACxD,IAAgB,eAAA,CAAA,MAAA,EAAQ,QAAQ,QAAQ,CAAA,CAAA;AAExC,IAAQ,OAAA,CAAA,QAAA,EAAA,CAAA;AAER,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,iBAAoB,GAAA,CACxB,OACA,EAAA,IAAA,EACA,cACA,GACG,KAAA;AACH,EAAA,MAAMC,QAA6B,EAAC,CAAA;AACpC,EAAW,KAAA,MAAA,GAAA,IAAO,OAAQ,CAAA,KAAA,CAAM,KAAO,EAAA;AACrC,IAAAA,MAAK,GAAO,CAAA,GAAA,IAAA,CAAA;AAAA,GACd;AAEA,EAAA,OAAA,CAAQ,KAAM,CAAA,WAAA,CAAY,OAAQ,CAAA,CAAC,GAAQ,KAAA;AACzC,IAAA,IAAI,QAAQ,KAAM,CAAA,KAAA,CAAM,KAAK,QAAS,CAAA,QAAA,CAAS,QAAQ,CAAG,EAAA;AACxD,MAAA,OAAOA,KAAK,CAAA,GAAA,CAAA,CAAA;AAAA,KACd;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,SAAkC,EAAC,CAAA;AAEzC,EAAA,MAAM,MAAqD,EAAC,CAAA;AAE5D,EAAA,MAAM,OAAW,GAAA,GAAA,GAAM,cAAK,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAA,EAAS,GAAQ,CAAA,GAAA,IAAA,CAAA;AAE7C,EAAA,KAAA,MAAW,OAAO,OAAS,EAAA;AACzB,IAAA,OAAOA,KAAK,CAAA,GAAA,CAAA,CAAA;AACZ,IAAA,MAAM,QAAQ,OAAQ,CAAA,GAAA,CAAA,CAAA;AACtB,IAAI,IAAA,OAAO,UAAU,UAAY,EAAA;AAC/B,MAAA,GAAA,CAAI,GAAO,CAAA,GAAA,KAAA,CAAA;AAAA,KACN,MAAA;AACL,MAAA,MAAA,CAAO,GAAO,CAAA,GAAA,KAAA,CAAA;AAAA,KAChB;AAAA,GACF;AAEA,EAAA,MAAM,YAAe,GAAA,OAAA,CAAQ,MAAO,CAAA,IAAA,CAAKA,KAAI,CAAA,CAAA;AAC7C,EAAM,MAAA,eAAA,GAAkB,oBAAoB,YAAY,CAAA,CAAA;AAExD,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,MAAO,CAAA,MAAA,EAAQD,oBAAa,CAAA,YAAY,CAAC,CAAA,CAAA;AAEhD,IAAA,KAAA,MAAW,OAAO,GAAK,EAAA;AACrB,MAAA,MAAA,CAAO,GAAO,CAAA,GAAA,GAAA,CAAI,GAAK,CAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,KACzC;AAEA,IAAgB,eAAA,CAAA,MAAA,EAAQ,QAAQ,QAAQ,CAAA,CAAA;AAExC,IAAQ,OAAA,CAAA,QAAA,EAAA,CAAA;AAER,IAAA,OAAO,cAAK,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA;AAAA,GACd,CAAA;AACF,CAAA,CAAA;AAEO,MAAM,eAAN,MAIL;AAAA,EAWA,WAAA,CACS,OACA,MACC,EAAA,YAAA,EACS,OAAgC,EAAC,EAClD,OAA0B,GAAA,EAC1B,EAAA;AALO,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACC,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA,CAAA;AACS,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA,CAAA;AAbnB,IAAA,IAAA,CAAiB,aAAwC,EAAC,CAAA;AAC1D,IAAA,IAAA,CAAiB,aAAwC,EAAC,CAAA;AAtQ5D,IAAA,IAAA,EAAA,CAAA;AAqRI,IAAI,IAAA,OAAA,CAAQ,aAAa,KAAW,CAAA,EAAA;AAClC,MAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,QAAA,CAAA;AAAA,KACnB,MAAA;AACL,MAAA,IAAI,QAAW,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,cAAwB,CAAA,CAAA;AAC5D,MAAA,IAAI,MAAM,QAAQ,CAAA;AAAG,QAAW,QAAA,GAAA,CAAA,CAAA;AAChC,MAAA,IAAA,CAAK,YAAY,QAAW,GAAA,CAAA,KAAA,CAAM,EAAQ,GAAA,OAAA,CAAA,gBAAA,KAAR,YAA4B,GAAQ,CAAA,GAAA,CAAA,CAAA;AAAA,KACxE;AAAA,GACF;AAAA,EAEA,IAQE,IAC0C,EAAA;AAC1C,IAAA,OAAO,MAAO,CAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA;AAAA,MACxC,IAAA,EAAM,cAAK,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAK,IAAS,CAAA,EAAA,IAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,KAEE,IACgD,EAAA;AAChD,IAAA,OAAO,MAAO,CAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA;AAAA,MACxC,UAAA,EAAY,cAAK,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAK,UAAe,CAAA,EAAA,IAAA,CAAA;AAAA,KACtC,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,KAEE,IACgD,EAAA;AAChD,IAAA,OAAO,MAAO,CAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA;AAAA,MACxC,UAAA,EAAY,cAAK,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAK,UAAe,CAAA,EAAA,IAAA,CAAA;AAAA,KACtC,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAEE,IACsB,EAAA;AACtB,IAAA,MAAM,KAAQ,GAAA,SAAA;AAAA,MACZ,IAAA;AAAA,MACA,IAAK,CAAA,IAAA;AAAA,MACL,IAAK,CAAA,UAAA;AAAA,MACL,IAAK,CAAA,UAAA;AAAA,MACL,IAAK,CAAA,YAAA;AAAA,MACL,IAAA;AAAA,KACF,CAAA;AAEA,IAAA,OAAO,KAAM,EAAA,CAAA;AAAA,GACf;AAAA,EAEA,SAAA,CAEE,KACA,IACwB,EAAA;AACxB,IAAA,MAAM,KAAQ,GAAA,SAAA;AAAA,MACZ,IAAA;AAAA,MACA,IAAK,CAAA,IAAA;AAAA,MACL,IAAK,CAAA,UAAA;AAAA,MACL,IAAK,CAAA,UAAA;AAAA,MACL,IAAK,CAAA,YAAA;AAAA,MACL,IAAA;AAAA,KACF,CAAA;AAEA,IAAA,OAAO,CAAC,GAAG,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAI,KAAK,CAAA,CAAA;AAAA,GAClC;AAAA,EAEA,MAAM,OAEJ,IAC0B,EAAA;AAC1B,IAAA,MAAM,UAAU,iBAAkB,CAAA,IAAA,EAAM,KAAK,IAAM,EAAA,IAAA,CAAK,cAAc,IAAI,CAAA,CAAA;AAC1E,IAAA,OAAQ,MAAM,IAAA,CAAK,KAAM,CAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,GAC3C;AAAA,EAEA,MAAM,UAEJ,CAAA,GAAA,EACA,IAC4B,EAAA;AAC5B,IAAA,MAAM,UAAU,iBAAkB,CAAA,IAAA,EAAM,KAAK,IAAM,EAAA,IAAA,CAAK,cAAc,IAAI,CAAA,CAAA;AAC1E,IAAM,MAAA,GAAA,GAAM,CAAC,GAAG,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAI,OAAO,CAAA,CAAA;AACvC,IAAA,OAAQ,MAAM,IAAA,CAAK,KAAM,CAAA,UAAA,CAAW,GAAG,CAAA,CAAA;AAAA,GACzC;AAAA,EAEA,MAAwE,GAAA;AACtE,IAAA,MAAM,EAAE,KAAA,EAAO,MAAQ,EAAA,YAAA,EAAiB,GAAA,IAAA,CAAA;AAExC,IAAA,OAAO,cAAc,YAA6B,CAAA;AAAA,MAChD,WAAc,GAAA;AACZ,QAAM,KAAA,CAAA,KAAA,EAAO,QAAQ,YAAY,CAAA,CAAA;AAAA,OACnC;AAAA,KACF,CAAA;AAAA,GACF;AACF,CAAA,CAAA;AA5HO,IAAM,WAAN,GAAA,aAAA;AA8HP,MAAM,SAAY,GAAA,IAAI,IAAK,EAAA,CAAE,WAAY,EAAA,CAAA;AAE5B,MAAA,aAAA,GAAgB,CAC3B,KAAA,EACA,OACG,KAAA;AAlYL,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAmYE,EAAM,MAAA,MAAA,GAASE,mCAAc,KAAK,CAAA,CAAA;AAElC,EAAA,MAAM,OAAgC,EAAC,CAAA;AACvC,EAAM,MAAA,GAAA,GAAM,KAAK,GAAI,EAAA,CAAA;AAErB,EAAA,MAAM,eAA8B,EAAC,CAAA;AAErC,EAAW,KAAA,MAAA,GAAA,IAAO,MAAM,KAAO,EAAA;AAC7B,IAAM,MAAA,MAAA,GAAS,MAAM,KAAM,CAAA,GAAA,CAAA,CAAA;AAC3B,IAAA,IAAI,kBAAkBC,kBAAgB,EAAA;AACpC,MAAI,IAAA,MAAA,CAAO,IAAK,CAAA,EAAA,YAAcC,qBAAmB,EAAA;AAC/C,QAAK,IAAA,CAAA,GAAA,CAAA,GAAO,CAAC,QAAA,KAAqB,GAAM,GAAA,QAAA,CAAA;AAAA,OAC/B,MAAA,IAAA,CAAA,CAAA,EAAA,GAAA,MAAA,CAAO,OAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,EAAiB,uBAAsB,IAAM,EAAA;AACtD,QAAA,IAAA,CAAK,OAAO,CAAC,QAAA,KAAqB,IAAI,IAAA,CAAK,MAAM,QAAQ,CAAA,CAAA;AAAA,OACpD,MAAA;AACL,QAAK,IAAA,CAAA,GAAA,CAAA,GAAO,CAAC,QACX,KAAA,IAAI,KAAK,GAAM,GAAA,QAAQ,EAAE,WAAY,EAAA,CAAA;AAAA,OACzC;AAAA,KACF,MAAA,IAAW,kBAAkBC,kBAAgB,EAAA;AAC3C,MAAM,MAAA,GAAA,GAAA,CAAM,EAAS,GAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,aAAA,KAAT,IAA0B,GAAA,EAAA,GAAA,GAAA,CAAA;AACtC,MAAM,MAAA,IAAA,GAAO,OAAO,KAAM,CAAA,GAAA,CAAA,CAAA;AAC1B,MAAA,MAAM,MACJ,GAAA,IAAA,YAAgBC,eAAc,GAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAGhD,MAAM,MAAA,QAAA,GAAW,MAAO,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA;AAAA,QAClC,CAAC,KAAU,KAAA,KAAA,CAAM,IAAS,KAAA,KAAA;AAAA,OAC5B,CAAA;AAEA,MAAA,IAAI,CAAC,QAAA,IAAY,QAAS,CAAA,KAAA,GAAQ,GAAK,EAAA;AACrC,QAAC,MAAO,CAAA,KAAA,CAAqC,GAC3C,CAAA,GAAA,IAAA,YAAgBA,eACZ,GAAA,MAAA,CAAO,GAAI,CAAA,GAAG,CAAE,CAAA,QAAA,EAChB,GAAA,MAAA,CAAO,IAAI,GAAG,CAAA,CAAA;AAAA,OACtB;AAAA,KACF;AAEA,IAAA,IAAA,CAAI,EAAO,GAAA,MAAA,CAAA,IAAA,CAAK,KAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAmB,MAAQ,EAAA;AAC7B,MAAA,IAAI,kBAAkBD,kBAAgB,EAAA;AACpC,QAAA,YAAA,CAAa,IAAK,CAAA;AAAA,UAChB,GAAA;AAAA,UACA,IAAM,EAAA,MAAA;AAAA,UACN,IAAA,EAAM,OAAO,IAAK,CAAA,KAAA,GACd,UACA,MAAO,CAAA,IAAA,CAAK,MACZ,KACA,GAAA,KAAA,CAAA;AAAA,UACJ,GAAA,EAAK,OAAO,IAAK,CAAA,GAAA;AAAA,UACjB,MAAA,EAAQ,OAAO,IAAK,CAAA,MAAA;AAAA,SACrB,CAAA,CAAA;AAAA,OACH,MAAA,IAAW,kBAAkBE,oBAAkB,EAAA;AAC7C,QAAA,YAAA,CAAa,IAAK,CAAA;AAAA,UAChB,GAAA;AAAA,UACA,IAAM,EAAA,QAAA;AAAA,UACN,EAAA,EAAI,OAAO,IAAK,CAAA,EAAA;AAAA,UAChB,GAAA,EAAK,OAAO,IAAK,CAAA,GAAA;AAAA,SAClB,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,IAAI,WAAA;AAAA,IACT,KAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,GACF,CAAA;AACF;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/factory.ts"],"sourcesContent":["import { AnyZodObject, ZodNullable, ZodString, ZodTypeAny } from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n EmptyObject,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n TextBaseColumn,\n} from 'pqb';\nimport { instanceToZod, InstanceToZod } from 'orchid-orm-schema-to-zod';\nimport { generateMock } from '@anatine/zod-mock';\n\ntype UniqueField =\n | {\n key: string;\n type: 'text';\n kind?: 'email' | 'url';\n max?: number;\n length?: number;\n }\n | {\n key: string;\n type: 'number';\n gt?: number;\n gte?: number;\n };\n\ntype FactoryOptions = {\n sequence?: number;\n sequenceDistance?: number;\n maxTextLength?: number;\n};\n\ntype metaKey = typeof metaKey;\nconst metaKey = Symbol('meta');\n\ntype Result<\n T extends TestFactory,\n Data,\n Omitted = Omit<Data, keyof T[metaKey]['omit']>,\n> = EmptyObject extends T[metaKey]['pick']\n ? Omitted\n : Pick<\n Omitted,\n {\n [K in keyof Omitted]: K extends keyof T[metaKey]['pick'] ? K : never;\n }[keyof Omitted]\n >;\n\ntype BuildArg<T extends TestFactory> = {\n [K in keyof T[metaKey]['type']]?:\n | T[metaKey]['type'][K]\n | ((sequence: number) => T[metaKey]['type'][K]);\n} & Record<string, unknown>;\n\ntype BuildResult<T extends TestFactory, Data extends BuildArg<T>> = Result<\n T,\n BuildArg<T> extends Data\n ? T[metaKey]['type']\n : T[metaKey]['type'] & {\n [K in keyof Data]: Data[K] extends () => void\n ? ReturnType<Data[K]>\n : Data[K];\n }\n>;\n\ntype CreateArg<T extends TestFactory> = CreateData<\n Omit<T['model'], 'inputType'> & {\n inputType: {\n [K in keyof T['model']['type']]?:\n | T['model']['type'][K]\n | ((sequence: number) => T['model']['type'][K]);\n };\n }\n>;\n\ntype CreateResult<T extends TestFactory> = Result<T, T['model']['type']>;\n\nconst omit = <T, Keys extends Record<string, unknown>>(\n obj: T,\n keys: Keys,\n): Omit<T, keyof Keys> => {\n const res = { ...obj };\n Object.keys(keys).forEach((key) => {\n delete (res as unknown as Record<string, unknown>)[key];\n });\n return res;\n};\n\nconst pick = <T, Keys extends Record<string, unknown>>(\n obj: T,\n keys: Keys,\n): Pick<T, { [K in keyof T]: K extends keyof Keys ? K : never }[keyof T]> => {\n const res = {} as T;\n Object.keys(keys).forEach((key) => {\n const value = (obj as unknown as Record<string, unknown>)[key];\n if (value !== undefined) {\n (res as unknown as Record<string, unknown>)[key] = value;\n }\n });\n return res;\n};\n\nconst makeUniqueText = (sequence: number, value: string) =>\n `${sequence} ${value}`;\n\nconst makeUniqueEmail = (sequence: number, value: string) =>\n `${sequence}-${value}`;\n\nconst makeUniqueUrl = (sequence: number, value: string) =>\n value.replace('://', `://${sequence}-`);\n\nconst makeUniqueNumber = (sequence: number) => sequence;\n\nconst makeSetUniqueValues = (\n uniqueFields: UniqueField[],\n data: Record<string, unknown>,\n) => {\n type Fn = (sequence: number, value: unknown) => unknown;\n\n const dataKeys = Object.keys(data);\n\n const fns: Record<string, Fn> = {};\n for (const field of uniqueFields) {\n if (dataKeys.includes(field.key)) continue;\n\n if (field.type === 'text') {\n const getValue =\n field.kind === 'email'\n ? makeUniqueEmail\n : field.kind === 'url'\n ? makeUniqueUrl\n : makeUniqueText;\n\n let fn;\n const max = field.length ?? field.max;\n if (max !== undefined) {\n fn = (sequence: number, value: string) => {\n let result = getValue(sequence, value);\n if (result.length > max) {\n result = result.slice(0, -(result.length - max));\n }\n return result;\n };\n } else {\n fn = getValue;\n }\n fns[field.key] = fn as unknown as Fn;\n } else {\n let fn;\n const { gt, gte } = field;\n if (gt) {\n fn = (sequence: number) => sequence + gt;\n } else if (gte) {\n fn = (sequence: number) => sequence + gte - 1;\n } else {\n fn = makeUniqueNumber;\n }\n fns[field.key] = fn as unknown as Fn;\n }\n }\n\n return (record: Record<string, unknown>, sequence: number) => {\n for (const key in fns) {\n record[key] = fns[key](sequence, record[key]);\n }\n };\n};\n\nconst makeBuild = <T extends TestFactory, Data extends BuildArg<T>>(\n factory: T,\n data: Record<string, unknown>,\n omitValues: Record<PropertyKey, true>,\n pickValues: Record<PropertyKey, true>,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n let schema = factory.schema as AnyZodObject;\n let allData = arg ? { ...data, ...arg } : data;\n\n if (omitValues) {\n schema = schema.omit(omitValues);\n allData = omit(allData, omitValues);\n }\n\n if (pickValues && Object.keys(pickValues).length) {\n schema = schema.pick(pickValues);\n allData = pick(allData, pickValues);\n }\n\n const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);\n\n return () => {\n const result = generateMock(schema) as Record<string, unknown>;\n for (const key in allData) {\n const value = (allData as Record<string, unknown>)[key];\n if (typeof value === 'function') {\n result[key] = value(factory.sequence);\n } else {\n result[key] = value;\n }\n }\n\n setUniqueValues(result, factory.sequence);\n\n factory.sequence++;\n\n return result as BuildResult<T, Data>;\n };\n};\n\nconst processCreateData = <T extends TestFactory, Data extends CreateArg<T>>(\n factory: T,\n data: Record<string, unknown>,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n const pick: Record<string, true> = {};\n for (const key in factory.model.shape) {\n pick[key] = true;\n }\n\n factory.model.primaryKeys.forEach((key) => {\n if (factory.model.shape[key].dataType.includes('serial')) {\n delete pick[key];\n }\n });\n\n const result: Record<string, unknown> = {};\n\n const fns: Record<string, (sequence: number) => unknown> = {};\n\n const allData = (arg ? { ...data, ...arg } : data) as Record<string, unknown>;\n\n for (const key in allData) {\n delete pick[key];\n const value = allData[key];\n if (typeof value === 'function') {\n fns[key] = value as () => unknown;\n } else {\n result[key] = value;\n }\n }\n\n const pickedSchema = factory.schema.pick(pick);\n const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);\n\n return () => {\n Object.assign(result, generateMock(pickedSchema));\n\n for (const key in fns) {\n result[key] = fns[key](factory.sequence);\n }\n\n setUniqueValues(result, factory.sequence);\n\n factory.sequence++;\n\n return { ...result } as CreateData<T['model']>;\n };\n};\n\nexport class TestFactory<\n Q extends Query = Query,\n Schema extends AnyZodObject = AnyZodObject,\n Type extends EmptyObject = EmptyObject,\n> {\n sequence: number;\n private readonly omitValues: Record<PropertyKey, true> = {};\n private readonly pickValues: Record<PropertyKey, true> = {};\n\n [metaKey]!: {\n type: Type;\n omit: EmptyObject;\n pick: EmptyObject;\n };\n\n constructor(\n public model: Q,\n public schema: Schema,\n private uniqueFields: UniqueField[],\n private readonly data: Record<string, unknown> = {},\n options: FactoryOptions = {},\n ) {\n if (options.sequence !== undefined) {\n this.sequence = options.sequence;\n } else {\n let workerId = parseInt(process.env.JEST_WORKER_ID as string);\n if (isNaN(workerId)) workerId = 1;\n this.sequence = (workerId - 1) * (options.sequenceDistance ?? 1000) + 1;\n }\n }\n\n set<\n T extends this,\n Meta extends { type: EmptyObject },\n Data extends {\n [K in keyof Meta['type']]?: Meta['type'][K] | (() => Meta['type'][K]);\n } & Record<string, unknown>,\n >(\n this: T & { [metaKey]: Meta },\n data: Data,\n ): T & { [metaKey]: Meta & { type: Data } } {\n return Object.assign(Object.create(this), {\n data: { ...this.data, ...data },\n });\n }\n\n omit<T extends this, Keys extends { [K in keyof T[metaKey]['type']]?: true }>(\n this: T,\n keys: Keys,\n ): T & { [metaKey]: T[metaKey] & { omit: Keys } } {\n return Object.assign(Object.create(this), {\n omitValues: { ...this.omitValues, ...keys },\n });\n }\n\n pick<T extends this, Keys extends { [K in keyof T[metaKey]['type']]?: true }>(\n this: T,\n keys: Keys,\n ): T & { [metaKey]: T[metaKey] & { pick: Keys } } {\n return Object.assign(Object.create(this), {\n pickValues: { ...this.pickValues, ...keys },\n });\n }\n\n build<T extends this, Data extends BuildArg<T>>(\n this: T,\n data?: Data,\n ): BuildResult<T, Data> {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n data,\n );\n\n return build();\n }\n\n buildList<T extends this, Data extends BuildArg<T>>(\n this: T,\n qty: number,\n data?: Data,\n ): BuildResult<T, Data>[] {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n data,\n );\n\n return [...Array(qty)].map(build);\n }\n\n async create<T extends this, Data extends CreateArg<T>>(\n this: T,\n data?: Data,\n ): Promise<CreateResult<T>> {\n const getData = processCreateData(this, this.data, this.uniqueFields, data);\n return (await this.model.create(getData())) as CreateResult<T>;\n }\n\n async createList<T extends this, Data extends CreateArg<T>>(\n this: T,\n qty: number,\n data?: Data,\n ): Promise<CreateResult<T>[]> {\n const getData = processCreateData(this, this.data, this.uniqueFields, data);\n const arr = [...Array(qty)].map(getData);\n return (await this.model.createMany(arr)) as CreateResult<T>[];\n }\n\n extend<T extends this>(this: T): new () => TestFactory<Q, Schema, Type> {\n const { model, schema, uniqueFields } = this;\n\n return class extends TestFactory<Q, Schema, Type> {\n constructor() {\n super(model, schema, uniqueFields);\n }\n };\n }\n}\n\nconst nowString = new Date().toISOString();\n\nexport const createFactory = <T extends Query>(\n model: T,\n options?: FactoryOptions,\n) => {\n const schema = instanceToZod(model);\n\n const data: Record<string, unknown> = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in model.shape) {\n const column = model.shape[key];\n if (column instanceof DateBaseColumn) {\n if (column.data.as instanceof IntegerBaseColumn) {\n data[key] = (sequence: number) => now + sequence;\n } else if (column.parseFn?.(nowString) instanceof Date) {\n data[key] = (sequence: number) => new Date(now + sequence);\n } else {\n data[key] = (sequence: number) =>\n new Date(now + sequence).toISOString();\n }\n } else if (column instanceof TextBaseColumn) {\n const max = options?.maxTextLength ?? 1000;\n const item = schema.shape[key];\n const string = (\n item instanceof ZodNullable ? item.unwrap() : item\n ) as ZodString;\n\n const maxCheck = string._def.checks.find(\n (check) => check.kind === 'max',\n ) as { value: number } | undefined;\n\n if (!maxCheck || maxCheck.value > max) {\n (schema.shape as Record<string, ZodTypeAny>)[key] =\n item instanceof ZodNullable\n ? string.max(max).nullable()\n : string.max(max);\n }\n }\n\n if (column.data.index?.unique) {\n if (column instanceof TextBaseColumn) {\n uniqueFields.push({\n key,\n type: 'text',\n kind: column.data.email\n ? 'email'\n : column.data.url\n ? 'url'\n : undefined,\n max: column.data.max,\n length: column.data.length,\n });\n } else if (column instanceof NumberBaseColumn) {\n uniqueFields.push({\n key,\n type: 'number',\n gt: column.data.gt,\n gte: column.data.gte,\n });\n }\n }\n }\n\n return new TestFactory<T, InstanceToZod<T>, T['type']>(\n model,\n schema,\n uniqueFields,\n data,\n options,\n );\n};\n"],"names":["generateMock","pick","instanceToZod","DateBaseColumn","IntegerBaseColumn","TextBaseColumn","ZodNullable","NumberBaseColumn"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/factory.test.ts
CHANGED
|
@@ -144,7 +144,7 @@ describe('factory', () => {
|
|
|
144
144
|
|
|
145
145
|
expect(item.createdAt).toBe(item.updatedAt);
|
|
146
146
|
|
|
147
|
-
expect(Math.
|
|
147
|
+
expect(Math.round(item.createdAt / 1000)).toEqual(Math.round(now / 1000));
|
|
148
148
|
|
|
149
149
|
assertType<typeof item, User>();
|
|
150
150
|
|
|
@@ -303,11 +303,15 @@ describe('factory', () => {
|
|
|
303
303
|
log: false,
|
|
304
304
|
},
|
|
305
305
|
{
|
|
306
|
-
text: makeModel((t) => ({ name: t.text().unique() })),
|
|
307
|
-
email: makeModel((t) => ({ name: t.text().email().unique() })),
|
|
308
|
-
url: makeModel((t) => ({ name: t.text().url().unique() })),
|
|
309
|
-
max: makeModel((t) => ({
|
|
310
|
-
|
|
306
|
+
text: makeModel((t) => ({ name: t.text(3, 100).unique() })),
|
|
307
|
+
email: makeModel((t) => ({ name: t.text(3, 100).email().unique() })),
|
|
308
|
+
url: makeModel((t) => ({ name: t.text(3, 100).url().unique() })),
|
|
309
|
+
max: makeModel((t) => ({
|
|
310
|
+
name: t.text(3, 100).min(min).max(max).unique(),
|
|
311
|
+
})),
|
|
312
|
+
length: makeModel((t) => ({
|
|
313
|
+
name: t.text(3, 100).length(max).unique(),
|
|
314
|
+
})),
|
|
311
315
|
number: makeModel((t) => ({ age: t.integer().unique() })),
|
|
312
316
|
gt: makeModel((t) => ({ age: t.integer().gt(gt).unique() })),
|
|
313
317
|
gte: makeModel((t) => ({ age: t.integer().gte(gte).unique() })),
|
|
@@ -411,6 +415,11 @@ describe('factory', () => {
|
|
|
411
415
|
expect(third.age).toBe(12);
|
|
412
416
|
});
|
|
413
417
|
|
|
418
|
+
it('should leave explicitly set values as is', () => {
|
|
419
|
+
const data = textFactory.build({ name: 'name' });
|
|
420
|
+
expect(data.name).toBe('name');
|
|
421
|
+
});
|
|
422
|
+
|
|
414
423
|
it('should work in buildList', () => {
|
|
415
424
|
textFactory.sequence = 42;
|
|
416
425
|
|
package/src/factory.ts
CHANGED
|
@@ -113,11 +113,18 @@ const makeUniqueUrl = (sequence: number, value: string) =>
|
|
|
113
113
|
|
|
114
114
|
const makeUniqueNumber = (sequence: number) => sequence;
|
|
115
115
|
|
|
116
|
-
const makeSetUniqueValues = (
|
|
116
|
+
const makeSetUniqueValues = (
|
|
117
|
+
uniqueFields: UniqueField[],
|
|
118
|
+
data: Record<string, unknown>,
|
|
119
|
+
) => {
|
|
117
120
|
type Fn = (sequence: number, value: unknown) => unknown;
|
|
118
121
|
|
|
122
|
+
const dataKeys = Object.keys(data);
|
|
123
|
+
|
|
119
124
|
const fns: Record<string, Fn> = {};
|
|
120
125
|
for (const field of uniqueFields) {
|
|
126
|
+
if (dataKeys.includes(field.key)) continue;
|
|
127
|
+
|
|
121
128
|
if (field.type === 'text') {
|
|
122
129
|
const getValue =
|
|
123
130
|
field.kind === 'email'
|
|
@@ -182,6 +189,8 @@ const makeBuild = <T extends TestFactory, Data extends BuildArg<T>>(
|
|
|
182
189
|
allData = pick(allData, pickValues);
|
|
183
190
|
}
|
|
184
191
|
|
|
192
|
+
const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);
|
|
193
|
+
|
|
185
194
|
return () => {
|
|
186
195
|
const result = generateMock(schema) as Record<string, unknown>;
|
|
187
196
|
for (const key in allData) {
|
|
@@ -193,7 +202,6 @@ const makeBuild = <T extends TestFactory, Data extends BuildArg<T>>(
|
|
|
193
202
|
}
|
|
194
203
|
}
|
|
195
204
|
|
|
196
|
-
const setUniqueValues = makeSetUniqueValues(uniqueFields);
|
|
197
205
|
setUniqueValues(result, factory.sequence);
|
|
198
206
|
|
|
199
207
|
factory.sequence++;
|
|
@@ -236,7 +244,7 @@ const processCreateData = <T extends TestFactory, Data extends CreateArg<T>>(
|
|
|
236
244
|
}
|
|
237
245
|
|
|
238
246
|
const pickedSchema = factory.schema.pick(pick);
|
|
239
|
-
const setUniqueValues = makeSetUniqueValues(uniqueFields);
|
|
247
|
+
const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);
|
|
240
248
|
|
|
241
249
|
return () => {
|
|
242
250
|
Object.assign(result, generateMock(pickedSchema));
|