orchid-orm-test-factory 0.5.20 → 0.6.1
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/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -116,12 +116,12 @@ const processCreateData = (factory, data, uniqueFields, arg) => {
|
|
|
116
116
|
for (const key in factory.table.shape) {
|
|
117
117
|
pick2[key] = true;
|
|
118
118
|
}
|
|
119
|
-
factory.table
|
|
119
|
+
for (const key of pqb.getPrimaryKeys(factory.table)) {
|
|
120
120
|
const item = factory.table.shape[key];
|
|
121
121
|
if ("identity" in item.data || item.dataType.includes("serial")) {
|
|
122
122
|
delete pick2[key];
|
|
123
123
|
}
|
|
124
|
-
}
|
|
124
|
+
}
|
|
125
125
|
const shared = {};
|
|
126
126
|
const fns = {};
|
|
127
127
|
const allData = arg ? __spreadValues(__spreadValues({}, data), arg) : data;
|
|
@@ -304,7 +304,7 @@ const tableFactory = (table, options) => {
|
|
|
304
304
|
schema.shape[key] = item instanceof zod.ZodNullable ? num.max(maxPostgresInt).nullable() : num.max(maxPostgresInt);
|
|
305
305
|
}
|
|
306
306
|
}
|
|
307
|
-
if ((_c = column.data.indexes) == null ? void 0 : _c.some((index) => index.unique)) {
|
|
307
|
+
if ((_c = column.data.indexes) == null ? void 0 : _c.some((index) => index.options.unique)) {
|
|
308
308
|
if (column instanceof pqb.TextBaseColumn) {
|
|
309
309
|
uniqueFields.push({
|
|
310
310
|
key,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/factory.ts"],"sourcesContent":["import {\n AnyZodObject,\n z,\n ZodNullable,\n ZodObject,\n ZodRawShape,\n ZodString,\n ZodTypeAny,\n} from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n RelationConfigDataForCreate,\n RelationsBase,\n TextBaseColumn,\n} from 'pqb';\nimport {\n ColumnShapeOutput,\n ColumnTypeBase,\n EmptyObject,\n RecordUnknown,\n} from 'orchid-core';\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\ninterface 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} & RecordUnknown;\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\nexport type CreateArg<T extends TestFactory> = CreateData<{\n [K in keyof T['table']]: K extends 'inputType'\n ? {\n [K in keyof T['table']['inputType']]?:\n | T['table']['inputType'][K]\n | ((sequence: number) => T['table']['inputType'][K]);\n }\n : /**\n * Allow defining async functions that create relation records and returns id\n */\n K extends 'relations'\n ? MapRelations<T['table']['relations']>\n : T['table'][K];\n}>;\n\ntype MapRelations<T extends RelationsBase> = {\n [P in keyof T]: {\n [K in keyof T[P]]: K extends 'relationConfig'\n ? {\n [L in keyof T[P]['relationConfig']]: L extends 'dataForCreate'\n ? MapDataForCreate<T[P]['relationConfig']['dataForCreate']>\n : T[P]['relationConfig'][L];\n }\n : T[P][K];\n };\n};\n\ntype MapDataForCreate<T extends RelationConfigDataForCreate | undefined> =\n T extends RelationConfigDataForCreate\n ? {\n [K in keyof T]: K extends 'columns'\n ? {\n [K in keyof T['columns']]:\n | T['columns'][K]\n | ((\n sequence: number,\n ) => T['columns'][K] | Promise<T['columns'][K]>);\n }\n : T[K];\n }\n : undefined;\n\ntype CreateResult<T extends TestFactory> = Result<\n T,\n ColumnShapeOutput<T['table']['shape']>\n>;\n\nconst omit = <T, Keys extends RecordUnknown>(\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 RecordUnknown)[key];\n });\n return res;\n};\n\nconst pick = <T, Keys extends RecordUnknown>(\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 RecordUnknown)[key];\n if (value !== undefined) {\n (res as unknown as RecordUnknown)[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: RecordUnknown,\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: RecordUnknown, 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: RecordUnknown,\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 (arg?: BuildArg<T>) => {\n const data = arg ? { ...allData, ...arg } : allData;\n\n const result = generateMock(schema) as RecordUnknown;\n for (const key in data) {\n const value = (data as RecordUnknown)[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: RecordUnknown,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n const pick: Record<string, true> = {};\n for (const key in factory.table.shape) {\n pick[key] = true;\n }\n\n factory.table.primaryKeys.forEach((key) => {\n const item = factory.table.shape[key] as ColumnTypeBase;\n\n if ('identity' in item.data || item.dataType.includes('serial')) {\n delete pick[key];\n }\n });\n\n const shared: RecordUnknown = {};\n\n const fns: Record<string, (sequence: number) => unknown> = {};\n\n const allData = (arg ? { ...data, ...arg } : data) as RecordUnknown;\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 shared[key] = value;\n }\n }\n\n const pickedSchema = factory.schema.pick(pick);\n const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);\n\n return async (arg?: CreateArg<T>) => {\n const result = Object.assign({ ...shared }, generateMock(pickedSchema));\n\n const { sequence } = factory;\n factory.sequence++;\n\n if (arg) {\n for (const key in arg) {\n if (typeof arg[key] === 'function') {\n result[key] = (arg[key] as (sequence: number) => unknown)(sequence);\n } else {\n result[key] = arg[key];\n }\n }\n } else {\n const promises: Promise<void>[] = [];\n\n for (const key in fns) {\n promises.push(\n new Promise(async (resolve, reject) => {\n try {\n result[key] = await fns[key](sequence);\n resolve();\n } catch (err) {\n reject(err);\n }\n }),\n );\n }\n\n await Promise.all(promises);\n }\n\n setUniqueValues(result, sequence);\n\n return result as CreateData<T['table']>;\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 table: Q,\n public schema: Schema,\n private uniqueFields: UniqueField[],\n private readonly data: RecordUnknown = {},\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 } & RecordUnknown,\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 buildMany<T extends this, Args extends BuildArg<T>[]>(\n this: T,\n ...arr: Args\n ): { [I in keyof Args]: BuildResult<T, Args[I]> } {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n );\n\n return arr.map(build) as { [I in keyof Args]: BuildResult<T, Args[I]> };\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.table.create(await 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 = await Promise.all([...Array(qty)].map(() => getData()));\n return (await this.table.createMany(\n arr as CreateData<T['table']>[],\n )) as CreateResult<T>[];\n }\n\n async createMany<T extends this, Args extends CreateArg<T>[]>(\n this: T,\n ...arr: Args\n ): Promise<{ [K in keyof Args]: CreateResult<T> }> {\n const getData = processCreateData(this, this.data, this.uniqueFields);\n const data = await Promise.all(arr.map(getData));\n return (await this.table.createMany(\n data as CreateData<T['table']>[],\n )) as Promise<{\n [K in keyof Args]: CreateResult<T>;\n }>;\n }\n\n extend<T extends this>(this: T): new () => TestFactory<Q, Schema, Type> {\n const { table, schema, uniqueFields } = this;\n\n return class extends TestFactory<Q, Schema, Type> {\n constructor() {\n super(table, schema, uniqueFields);\n }\n };\n }\n}\n\nconst nowString = new Date().toISOString();\n\nconst maxPostgresInt = 2147483647;\n\ntype TableFactory<T extends Query> = T['shape'] extends Record<\n string,\n { inputSchema: ZodTypeAny }\n>\n ? TestFactory<\n T,\n ZodObject<\n { [K in keyof T['shape']]: T['shape'][K]['inputSchema'] },\n 'strip'\n >,\n ColumnShapeOutput<T['shape']>\n >\n : never;\n\nexport const tableFactory = <T extends Query>(\n table: T,\n options?: FactoryOptions,\n): TableFactory<T> => {\n const shape: ZodRawShape = {};\n const columns = table.shape;\n\n for (const key in columns) {\n const { inputSchema } = columns[key] as ColumnTypeBase;\n if (inputSchema) shape[key] = inputSchema as ZodTypeAny;\n }\n\n const schema = z.object(shape);\n\n const data: RecordUnknown = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in table.shape) {\n const column = table.shape[key] as ColumnTypeBase;\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 } else if (column instanceof IntegerBaseColumn) {\n const item = schema.shape[key];\n const num = (\n item instanceof ZodNullable ? item.unwrap() : item\n ) as ZodString;\n\n const maxCheck = num._def.checks.find((check) => check.kind === 'max') as\n | { value: number }\n | undefined;\n\n if (!maxCheck) {\n (schema.shape as Record<string, ZodTypeAny>)[key] =\n item instanceof ZodNullable\n ? num.max(maxPostgresInt).nullable()\n : num.max(maxPostgresInt);\n }\n }\n\n if (column.data.indexes?.some((index) => 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(\n table,\n schema,\n uniqueFields,\n data,\n options,\n ) as TableFactory<T>;\n};\n\ntype ORMFactory<T> = {\n [K in keyof T]: T[K] extends Query & { definedAs: string }\n ? TableFactory<T[K]>\n : never;\n};\n\nexport const ormFactory = <T>(\n orm: T,\n options?: FactoryOptions,\n): ORMFactory<T> => {\n const factory = {} as ORMFactory<T>;\n const defined: RecordUnknown = {};\n\n for (const key in orm) {\n const table = orm[key];\n if (table && typeof table === 'object' && 'definedAs' in table) {\n Object.defineProperty(factory, key, {\n get() {\n return (defined[key] ??= tableFactory(\n table as unknown as Query,\n options,\n ));\n },\n });\n }\n }\n\n return factory;\n};\n"],"names":["arg","data","generateMock","pick","z","DateBaseColumn","IntegerBaseColumn","TextBaseColumn","ZodNullable","NumberBaseColumn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/factory.ts"],"sourcesContent":["import {\n AnyZodObject,\n z,\n ZodNullable,\n ZodObject,\n ZodRawShape,\n ZodString,\n ZodTypeAny,\n} from 'zod';\nimport {\n ColumnType,\n CreateData,\n DateBaseColumn,\n getPrimaryKeys,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n RelationConfigDataForCreate,\n RelationsBase,\n TextBaseColumn,\n} from 'pqb';\nimport {\n ColumnShapeOutput,\n ColumnTypeBase,\n EmptyObject,\n RecordUnknown,\n} from 'orchid-core';\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\ninterface 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} & RecordUnknown;\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\nexport type CreateArg<T extends TestFactory> = CreateData<{\n [K in keyof T['table']]: K extends 'inputType'\n ? {\n [K in keyof T['table']['inputType']]?:\n | T['table']['inputType'][K]\n | ((sequence: number) => T['table']['inputType'][K]);\n }\n : /**\n * Allow defining async functions that create relation records and returns id\n */\n K extends 'relations'\n ? MapRelations<T['table']['relations']>\n : T['table'][K];\n}>;\n\ntype MapRelations<T extends RelationsBase> = {\n [P in keyof T]: {\n [K in keyof T[P]]: K extends 'relationConfig'\n ? {\n [L in keyof T[P]['relationConfig']]: L extends 'dataForCreate'\n ? MapDataForCreate<T[P]['relationConfig']['dataForCreate']>\n : T[P]['relationConfig'][L];\n }\n : T[P][K];\n };\n};\n\ntype MapDataForCreate<T extends RelationConfigDataForCreate | undefined> =\n T extends RelationConfigDataForCreate\n ? {\n [K in keyof T]: K extends 'columns'\n ? {\n [K in keyof T['columns']]:\n | T['columns'][K]\n | ((\n sequence: number,\n ) => T['columns'][K] | Promise<T['columns'][K]>);\n }\n : T[K];\n }\n : undefined;\n\ntype CreateResult<T extends TestFactory> = Result<\n T,\n ColumnShapeOutput<T['table']['shape']>\n>;\n\nconst omit = <T, Keys extends RecordUnknown>(\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 RecordUnknown)[key];\n });\n return res;\n};\n\nconst pick = <T, Keys extends RecordUnknown>(\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 RecordUnknown)[key];\n if (value !== undefined) {\n (res as unknown as RecordUnknown)[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: RecordUnknown,\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: RecordUnknown, 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: RecordUnknown,\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 (arg?: BuildArg<T>) => {\n const data = arg ? { ...allData, ...arg } : allData;\n\n const result = generateMock(schema) as RecordUnknown;\n for (const key in data) {\n const value = (data as RecordUnknown)[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: RecordUnknown,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n const pick: Record<string, true> = {};\n for (const key in factory.table.shape) {\n pick[key] = true;\n }\n\n for (const key of getPrimaryKeys(factory.table)) {\n const item = factory.table.shape[key] as ColumnTypeBase;\n\n if ('identity' in item.data || item.dataType.includes('serial')) {\n delete pick[key];\n }\n }\n\n const shared: RecordUnknown = {};\n\n const fns: Record<string, (sequence: number) => unknown> = {};\n\n const allData = (arg ? { ...data, ...arg } : data) as RecordUnknown;\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 shared[key] = value;\n }\n }\n\n const pickedSchema = factory.schema.pick(pick);\n const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);\n\n return async (arg?: CreateArg<T>) => {\n const result = Object.assign({ ...shared }, generateMock(pickedSchema));\n\n const { sequence } = factory;\n factory.sequence++;\n\n if (arg) {\n for (const key in arg) {\n if (typeof arg[key] === 'function') {\n result[key] = (arg[key] as (sequence: number) => unknown)(sequence);\n } else {\n result[key] = arg[key];\n }\n }\n } else {\n const promises: Promise<void>[] = [];\n\n for (const key in fns) {\n promises.push(\n new Promise(async (resolve, reject) => {\n try {\n result[key] = await fns[key](sequence);\n resolve();\n } catch (err) {\n reject(err);\n }\n }),\n );\n }\n\n await Promise.all(promises);\n }\n\n setUniqueValues(result, sequence);\n\n return result as CreateData<T['table']>;\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 table: Q,\n public schema: Schema,\n private uniqueFields: UniqueField[],\n private readonly data: RecordUnknown = {},\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 } & RecordUnknown,\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 buildMany<T extends this, Args extends BuildArg<T>[]>(\n this: T,\n ...arr: Args\n ): { [I in keyof Args]: BuildResult<T, Args[I]> } {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n );\n\n return arr.map(build) as { [I in keyof Args]: BuildResult<T, Args[I]> };\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.table.create(await 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 = await Promise.all([...Array(qty)].map(() => getData()));\n return (await this.table.createMany(\n arr as CreateData<T['table']>[],\n )) as CreateResult<T>[];\n }\n\n async createMany<T extends this, Args extends CreateArg<T>[]>(\n this: T,\n ...arr: Args\n ): Promise<{ [K in keyof Args]: CreateResult<T> }> {\n const getData = processCreateData(this, this.data, this.uniqueFields);\n const data = await Promise.all(arr.map(getData));\n return (await this.table.createMany(\n data as CreateData<T['table']>[],\n )) as Promise<{\n [K in keyof Args]: CreateResult<T>;\n }>;\n }\n\n extend<T extends this>(this: T): new () => TestFactory<Q, Schema, Type> {\n const { table, schema, uniqueFields } = this;\n\n return class extends TestFactory<Q, Schema, Type> {\n constructor() {\n super(table, schema, uniqueFields);\n }\n };\n }\n}\n\nconst nowString = new Date().toISOString();\n\nconst maxPostgresInt = 2147483647;\n\ntype TableFactory<T extends Query> = T['shape'] extends Record<\n string,\n { inputSchema: ZodTypeAny }\n>\n ? TestFactory<\n T,\n ZodObject<\n { [K in keyof T['shape']]: T['shape'][K]['inputSchema'] },\n 'strip'\n >,\n ColumnShapeOutput<T['shape']>\n >\n : never;\n\nexport const tableFactory = <T extends Query>(\n table: T,\n options?: FactoryOptions,\n): TableFactory<T> => {\n const shape: ZodRawShape = {};\n const columns = table.shape;\n\n for (const key in columns) {\n const { inputSchema } = columns[key] as ColumnTypeBase;\n if (inputSchema) shape[key] = inputSchema as ZodTypeAny;\n }\n\n const schema = z.object(shape);\n\n const data: RecordUnknown = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in table.shape) {\n const column = table.shape[key] as ColumnType;\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 } else if (column instanceof IntegerBaseColumn) {\n const item = schema.shape[key];\n const num = (\n item instanceof ZodNullable ? item.unwrap() : item\n ) as ZodString;\n\n const maxCheck = num._def.checks.find((check) => check.kind === 'max') as\n | { value: number }\n | undefined;\n\n if (!maxCheck) {\n (schema.shape as Record<string, ZodTypeAny>)[key] =\n item instanceof ZodNullable\n ? num.max(maxPostgresInt).nullable()\n : num.max(maxPostgresInt);\n }\n }\n\n if (\n (column as ColumnType).data.indexes?.some((index) => index.options.unique)\n ) {\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(\n table,\n schema,\n uniqueFields,\n data,\n options,\n ) as TableFactory<T>;\n};\n\ntype ORMFactory<T> = {\n [K in keyof T]: T[K] extends Query & { definedAs: string }\n ? TableFactory<T[K]>\n : never;\n};\n\nexport const ormFactory = <T>(\n orm: T,\n options?: FactoryOptions,\n): ORMFactory<T> => {\n const factory = {} as ORMFactory<T>;\n const defined: RecordUnknown = {};\n\n for (const key in orm) {\n const table = orm[key];\n if (table && typeof table === 'object' && 'definedAs' in table) {\n Object.defineProperty(factory, key, {\n get() {\n return (defined[key] ??= tableFactory(\n table as unknown as Query,\n options,\n ));\n },\n });\n }\n }\n\n return factory;\n};\n"],"names":["arg","data","generateMock","pick","getPrimaryKeys","z","DateBaseColumn","IntegerBaseColumn","TextBaseColumn","ZodNullable","NumberBaseColumn"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z, ZodNullable } from 'zod';
|
|
2
|
-
import { DateBaseColumn, IntegerBaseColumn, TextBaseColumn, NumberBaseColumn } from 'pqb';
|
|
2
|
+
import { DateBaseColumn, IntegerBaseColumn, TextBaseColumn, NumberBaseColumn, getPrimaryKeys } from 'pqb';
|
|
3
3
|
import { generateMock } from '@anatine/zod-mock';
|
|
4
4
|
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
@@ -114,12 +114,12 @@ const processCreateData = (factory, data, uniqueFields, arg) => {
|
|
|
114
114
|
for (const key in factory.table.shape) {
|
|
115
115
|
pick2[key] = true;
|
|
116
116
|
}
|
|
117
|
-
factory.table
|
|
117
|
+
for (const key of getPrimaryKeys(factory.table)) {
|
|
118
118
|
const item = factory.table.shape[key];
|
|
119
119
|
if ("identity" in item.data || item.dataType.includes("serial")) {
|
|
120
120
|
delete pick2[key];
|
|
121
121
|
}
|
|
122
|
-
}
|
|
122
|
+
}
|
|
123
123
|
const shared = {};
|
|
124
124
|
const fns = {};
|
|
125
125
|
const allData = arg ? __spreadValues(__spreadValues({}, data), arg) : data;
|
|
@@ -302,7 +302,7 @@ const tableFactory = (table, options) => {
|
|
|
302
302
|
schema.shape[key] = item instanceof ZodNullable ? num.max(maxPostgresInt).nullable() : num.max(maxPostgresInt);
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
|
-
if ((_c = column.data.indexes) == null ? void 0 : _c.some((index) => index.unique)) {
|
|
305
|
+
if ((_c = column.data.indexes) == null ? void 0 : _c.some((index) => index.options.unique)) {
|
|
306
306
|
if (column instanceof TextBaseColumn) {
|
|
307
307
|
uniqueFields.push({
|
|
308
308
|
key,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/factory.ts"],"sourcesContent":["import {\n AnyZodObject,\n z,\n ZodNullable,\n ZodObject,\n ZodRawShape,\n ZodString,\n ZodTypeAny,\n} from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n RelationConfigDataForCreate,\n RelationsBase,\n TextBaseColumn,\n} from 'pqb';\nimport {\n ColumnShapeOutput,\n ColumnTypeBase,\n EmptyObject,\n RecordUnknown,\n} from 'orchid-core';\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\ninterface 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} & RecordUnknown;\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\nexport type CreateArg<T extends TestFactory> = CreateData<{\n [K in keyof T['table']]: K extends 'inputType'\n ? {\n [K in keyof T['table']['inputType']]?:\n | T['table']['inputType'][K]\n | ((sequence: number) => T['table']['inputType'][K]);\n }\n : /**\n * Allow defining async functions that create relation records and returns id\n */\n K extends 'relations'\n ? MapRelations<T['table']['relations']>\n : T['table'][K];\n}>;\n\ntype MapRelations<T extends RelationsBase> = {\n [P in keyof T]: {\n [K in keyof T[P]]: K extends 'relationConfig'\n ? {\n [L in keyof T[P]['relationConfig']]: L extends 'dataForCreate'\n ? MapDataForCreate<T[P]['relationConfig']['dataForCreate']>\n : T[P]['relationConfig'][L];\n }\n : T[P][K];\n };\n};\n\ntype MapDataForCreate<T extends RelationConfigDataForCreate | undefined> =\n T extends RelationConfigDataForCreate\n ? {\n [K in keyof T]: K extends 'columns'\n ? {\n [K in keyof T['columns']]:\n | T['columns'][K]\n | ((\n sequence: number,\n ) => T['columns'][K] | Promise<T['columns'][K]>);\n }\n : T[K];\n }\n : undefined;\n\ntype CreateResult<T extends TestFactory> = Result<\n T,\n ColumnShapeOutput<T['table']['shape']>\n>;\n\nconst omit = <T, Keys extends RecordUnknown>(\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 RecordUnknown)[key];\n });\n return res;\n};\n\nconst pick = <T, Keys extends RecordUnknown>(\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 RecordUnknown)[key];\n if (value !== undefined) {\n (res as unknown as RecordUnknown)[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: RecordUnknown,\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: RecordUnknown, 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: RecordUnknown,\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 (arg?: BuildArg<T>) => {\n const data = arg ? { ...allData, ...arg } : allData;\n\n const result = generateMock(schema) as RecordUnknown;\n for (const key in data) {\n const value = (data as RecordUnknown)[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: RecordUnknown,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n const pick: Record<string, true> = {};\n for (const key in factory.table.shape) {\n pick[key] = true;\n }\n\n factory.table.primaryKeys.forEach((key) => {\n const item = factory.table.shape[key] as ColumnTypeBase;\n\n if ('identity' in item.data || item.dataType.includes('serial')) {\n delete pick[key];\n }\n });\n\n const shared: RecordUnknown = {};\n\n const fns: Record<string, (sequence: number) => unknown> = {};\n\n const allData = (arg ? { ...data, ...arg } : data) as RecordUnknown;\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 shared[key] = value;\n }\n }\n\n const pickedSchema = factory.schema.pick(pick);\n const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);\n\n return async (arg?: CreateArg<T>) => {\n const result = Object.assign({ ...shared }, generateMock(pickedSchema));\n\n const { sequence } = factory;\n factory.sequence++;\n\n if (arg) {\n for (const key in arg) {\n if (typeof arg[key] === 'function') {\n result[key] = (arg[key] as (sequence: number) => unknown)(sequence);\n } else {\n result[key] = arg[key];\n }\n }\n } else {\n const promises: Promise<void>[] = [];\n\n for (const key in fns) {\n promises.push(\n new Promise(async (resolve, reject) => {\n try {\n result[key] = await fns[key](sequence);\n resolve();\n } catch (err) {\n reject(err);\n }\n }),\n );\n }\n\n await Promise.all(promises);\n }\n\n setUniqueValues(result, sequence);\n\n return result as CreateData<T['table']>;\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 table: Q,\n public schema: Schema,\n private uniqueFields: UniqueField[],\n private readonly data: RecordUnknown = {},\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 } & RecordUnknown,\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 buildMany<T extends this, Args extends BuildArg<T>[]>(\n this: T,\n ...arr: Args\n ): { [I in keyof Args]: BuildResult<T, Args[I]> } {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n );\n\n return arr.map(build) as { [I in keyof Args]: BuildResult<T, Args[I]> };\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.table.create(await 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 = await Promise.all([...Array(qty)].map(() => getData()));\n return (await this.table.createMany(\n arr as CreateData<T['table']>[],\n )) as CreateResult<T>[];\n }\n\n async createMany<T extends this, Args extends CreateArg<T>[]>(\n this: T,\n ...arr: Args\n ): Promise<{ [K in keyof Args]: CreateResult<T> }> {\n const getData = processCreateData(this, this.data, this.uniqueFields);\n const data = await Promise.all(arr.map(getData));\n return (await this.table.createMany(\n data as CreateData<T['table']>[],\n )) as Promise<{\n [K in keyof Args]: CreateResult<T>;\n }>;\n }\n\n extend<T extends this>(this: T): new () => TestFactory<Q, Schema, Type> {\n const { table, schema, uniqueFields } = this;\n\n return class extends TestFactory<Q, Schema, Type> {\n constructor() {\n super(table, schema, uniqueFields);\n }\n };\n }\n}\n\nconst nowString = new Date().toISOString();\n\nconst maxPostgresInt = 2147483647;\n\ntype TableFactory<T extends Query> = T['shape'] extends Record<\n string,\n { inputSchema: ZodTypeAny }\n>\n ? TestFactory<\n T,\n ZodObject<\n { [K in keyof T['shape']]: T['shape'][K]['inputSchema'] },\n 'strip'\n >,\n ColumnShapeOutput<T['shape']>\n >\n : never;\n\nexport const tableFactory = <T extends Query>(\n table: T,\n options?: FactoryOptions,\n): TableFactory<T> => {\n const shape: ZodRawShape = {};\n const columns = table.shape;\n\n for (const key in columns) {\n const { inputSchema } = columns[key] as ColumnTypeBase;\n if (inputSchema) shape[key] = inputSchema as ZodTypeAny;\n }\n\n const schema = z.object(shape);\n\n const data: RecordUnknown = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in table.shape) {\n const column = table.shape[key] as ColumnTypeBase;\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 } else if (column instanceof IntegerBaseColumn) {\n const item = schema.shape[key];\n const num = (\n item instanceof ZodNullable ? item.unwrap() : item\n ) as ZodString;\n\n const maxCheck = num._def.checks.find((check) => check.kind === 'max') as\n | { value: number }\n | undefined;\n\n if (!maxCheck) {\n (schema.shape as Record<string, ZodTypeAny>)[key] =\n item instanceof ZodNullable\n ? num.max(maxPostgresInt).nullable()\n : num.max(maxPostgresInt);\n }\n }\n\n if (column.data.indexes?.some((index) => 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(\n table,\n schema,\n uniqueFields,\n data,\n options,\n ) as TableFactory<T>;\n};\n\ntype ORMFactory<T> = {\n [K in keyof T]: T[K] extends Query & { definedAs: string }\n ? TableFactory<T[K]>\n : never;\n};\n\nexport const ormFactory = <T>(\n orm: T,\n options?: FactoryOptions,\n): ORMFactory<T> => {\n const factory = {} as ORMFactory<T>;\n const defined: RecordUnknown = {};\n\n for (const key in orm) {\n const table = orm[key];\n if (table && typeof table === 'object' && 'definedAs' in table) {\n Object.defineProperty(factory, key, {\n get() {\n return (defined[key] ??= tableFactory(\n table as unknown as Query,\n options,\n ));\n },\n });\n }\n }\n\n return factory;\n};\n"],"names":["arg","data","pick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/factory.ts"],"sourcesContent":["import {\n AnyZodObject,\n z,\n ZodNullable,\n ZodObject,\n ZodRawShape,\n ZodString,\n ZodTypeAny,\n} from 'zod';\nimport {\n ColumnType,\n CreateData,\n DateBaseColumn,\n getPrimaryKeys,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n RelationConfigDataForCreate,\n RelationsBase,\n TextBaseColumn,\n} from 'pqb';\nimport {\n ColumnShapeOutput,\n ColumnTypeBase,\n EmptyObject,\n RecordUnknown,\n} from 'orchid-core';\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\ninterface 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} & RecordUnknown;\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\nexport type CreateArg<T extends TestFactory> = CreateData<{\n [K in keyof T['table']]: K extends 'inputType'\n ? {\n [K in keyof T['table']['inputType']]?:\n | T['table']['inputType'][K]\n | ((sequence: number) => T['table']['inputType'][K]);\n }\n : /**\n * Allow defining async functions that create relation records and returns id\n */\n K extends 'relations'\n ? MapRelations<T['table']['relations']>\n : T['table'][K];\n}>;\n\ntype MapRelations<T extends RelationsBase> = {\n [P in keyof T]: {\n [K in keyof T[P]]: K extends 'relationConfig'\n ? {\n [L in keyof T[P]['relationConfig']]: L extends 'dataForCreate'\n ? MapDataForCreate<T[P]['relationConfig']['dataForCreate']>\n : T[P]['relationConfig'][L];\n }\n : T[P][K];\n };\n};\n\ntype MapDataForCreate<T extends RelationConfigDataForCreate | undefined> =\n T extends RelationConfigDataForCreate\n ? {\n [K in keyof T]: K extends 'columns'\n ? {\n [K in keyof T['columns']]:\n | T['columns'][K]\n | ((\n sequence: number,\n ) => T['columns'][K] | Promise<T['columns'][K]>);\n }\n : T[K];\n }\n : undefined;\n\ntype CreateResult<T extends TestFactory> = Result<\n T,\n ColumnShapeOutput<T['table']['shape']>\n>;\n\nconst omit = <T, Keys extends RecordUnknown>(\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 RecordUnknown)[key];\n });\n return res;\n};\n\nconst pick = <T, Keys extends RecordUnknown>(\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 RecordUnknown)[key];\n if (value !== undefined) {\n (res as unknown as RecordUnknown)[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: RecordUnknown,\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: RecordUnknown, 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: RecordUnknown,\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 (arg?: BuildArg<T>) => {\n const data = arg ? { ...allData, ...arg } : allData;\n\n const result = generateMock(schema) as RecordUnknown;\n for (const key in data) {\n const value = (data as RecordUnknown)[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: RecordUnknown,\n uniqueFields: UniqueField[],\n arg?: Data,\n) => {\n const pick: Record<string, true> = {};\n for (const key in factory.table.shape) {\n pick[key] = true;\n }\n\n for (const key of getPrimaryKeys(factory.table)) {\n const item = factory.table.shape[key] as ColumnTypeBase;\n\n if ('identity' in item.data || item.dataType.includes('serial')) {\n delete pick[key];\n }\n }\n\n const shared: RecordUnknown = {};\n\n const fns: Record<string, (sequence: number) => unknown> = {};\n\n const allData = (arg ? { ...data, ...arg } : data) as RecordUnknown;\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 shared[key] = value;\n }\n }\n\n const pickedSchema = factory.schema.pick(pick);\n const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);\n\n return async (arg?: CreateArg<T>) => {\n const result = Object.assign({ ...shared }, generateMock(pickedSchema));\n\n const { sequence } = factory;\n factory.sequence++;\n\n if (arg) {\n for (const key in arg) {\n if (typeof arg[key] === 'function') {\n result[key] = (arg[key] as (sequence: number) => unknown)(sequence);\n } else {\n result[key] = arg[key];\n }\n }\n } else {\n const promises: Promise<void>[] = [];\n\n for (const key in fns) {\n promises.push(\n new Promise(async (resolve, reject) => {\n try {\n result[key] = await fns[key](sequence);\n resolve();\n } catch (err) {\n reject(err);\n }\n }),\n );\n }\n\n await Promise.all(promises);\n }\n\n setUniqueValues(result, sequence);\n\n return result as CreateData<T['table']>;\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 table: Q,\n public schema: Schema,\n private uniqueFields: UniqueField[],\n private readonly data: RecordUnknown = {},\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 } & RecordUnknown,\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 buildMany<T extends this, Args extends BuildArg<T>[]>(\n this: T,\n ...arr: Args\n ): { [I in keyof Args]: BuildResult<T, Args[I]> } {\n const build = makeBuild(\n this,\n this.data,\n this.omitValues,\n this.pickValues,\n this.uniqueFields,\n );\n\n return arr.map(build) as { [I in keyof Args]: BuildResult<T, Args[I]> };\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.table.create(await 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 = await Promise.all([...Array(qty)].map(() => getData()));\n return (await this.table.createMany(\n arr as CreateData<T['table']>[],\n )) as CreateResult<T>[];\n }\n\n async createMany<T extends this, Args extends CreateArg<T>[]>(\n this: T,\n ...arr: Args\n ): Promise<{ [K in keyof Args]: CreateResult<T> }> {\n const getData = processCreateData(this, this.data, this.uniqueFields);\n const data = await Promise.all(arr.map(getData));\n return (await this.table.createMany(\n data as CreateData<T['table']>[],\n )) as Promise<{\n [K in keyof Args]: CreateResult<T>;\n }>;\n }\n\n extend<T extends this>(this: T): new () => TestFactory<Q, Schema, Type> {\n const { table, schema, uniqueFields } = this;\n\n return class extends TestFactory<Q, Schema, Type> {\n constructor() {\n super(table, schema, uniqueFields);\n }\n };\n }\n}\n\nconst nowString = new Date().toISOString();\n\nconst maxPostgresInt = 2147483647;\n\ntype TableFactory<T extends Query> = T['shape'] extends Record<\n string,\n { inputSchema: ZodTypeAny }\n>\n ? TestFactory<\n T,\n ZodObject<\n { [K in keyof T['shape']]: T['shape'][K]['inputSchema'] },\n 'strip'\n >,\n ColumnShapeOutput<T['shape']>\n >\n : never;\n\nexport const tableFactory = <T extends Query>(\n table: T,\n options?: FactoryOptions,\n): TableFactory<T> => {\n const shape: ZodRawShape = {};\n const columns = table.shape;\n\n for (const key in columns) {\n const { inputSchema } = columns[key] as ColumnTypeBase;\n if (inputSchema) shape[key] = inputSchema as ZodTypeAny;\n }\n\n const schema = z.object(shape);\n\n const data: RecordUnknown = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in table.shape) {\n const column = table.shape[key] as ColumnType;\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 } else if (column instanceof IntegerBaseColumn) {\n const item = schema.shape[key];\n const num = (\n item instanceof ZodNullable ? item.unwrap() : item\n ) as ZodString;\n\n const maxCheck = num._def.checks.find((check) => check.kind === 'max') as\n | { value: number }\n | undefined;\n\n if (!maxCheck) {\n (schema.shape as Record<string, ZodTypeAny>)[key] =\n item instanceof ZodNullable\n ? num.max(maxPostgresInt).nullable()\n : num.max(maxPostgresInt);\n }\n }\n\n if (\n (column as ColumnType).data.indexes?.some((index) => index.options.unique)\n ) {\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(\n table,\n schema,\n uniqueFields,\n data,\n options,\n ) as TableFactory<T>;\n};\n\ntype ORMFactory<T> = {\n [K in keyof T]: T[K] extends Query & { definedAs: string }\n ? TableFactory<T[K]>\n : never;\n};\n\nexport const ormFactory = <T>(\n orm: T,\n options?: FactoryOptions,\n): ORMFactory<T> => {\n const factory = {} as ORMFactory<T>;\n const defined: RecordUnknown = {};\n\n for (const key in orm) {\n const table = orm[key];\n if (table && typeof table === 'object' && 'definedAs' in table) {\n Object.defineProperty(factory, key, {\n get() {\n return (defined[key] ??= tableFactory(\n table as unknown as Query,\n options,\n ));\n },\n });\n }\n }\n\n return factory;\n};\n"],"names":["arg","data","pick"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orchid-orm-test-factory",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Orchid ORM factories for tests",
|
|
5
5
|
"homepage": "https://orchid-orm.netlify.app/guide/orm-test-factories.html",
|
|
6
6
|
"repository": {
|
|
@@ -45,12 +45,12 @@
|
|
|
45
45
|
"@anatine/zod-mock": "^3.13.3",
|
|
46
46
|
"@faker-js/faker": "^8.3.1",
|
|
47
47
|
"zod": "^3.22.4",
|
|
48
|
-
"
|
|
49
|
-
"orchid-core": "0.
|
|
50
|
-
"
|
|
48
|
+
"orchid-orm-schema-to-zod": "0.7.1",
|
|
49
|
+
"orchid-core": "0.14.0",
|
|
50
|
+
"pqb": "0.29.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"orchid-orm": "1.
|
|
53
|
+
"orchid-orm": "1.26.1",
|
|
54
54
|
"test-utils": "0.2.3"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|