orchid-orm-test-factory 0.3.170 → 0.3.172
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.d.ts +19 -3
- package/dist/index.js +30 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +30 -16
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AnyZodObject } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { CreateData, RelationsBase, RelationConfigDataForCreate, Query } from 'pqb';
|
|
3
3
|
import { EmptyObject, ColumnShapeOutput } from 'orchid-core';
|
|
4
4
|
import { InstanceToZod } from 'orchid-orm-schema-to-zod';
|
|
5
5
|
|
|
@@ -31,11 +31,27 @@ type BuildArg<T extends TestFactory> = {
|
|
|
31
31
|
type BuildResult<T extends TestFactory, Data extends BuildArg<T>> = Result<T, BuildArg<T> extends Data ? T[metaKey]['type'] : T[metaKey]['type'] & {
|
|
32
32
|
[K in keyof Data]: Data[K] extends () => void ? ReturnType<Data[K]> : Data[K];
|
|
33
33
|
}>;
|
|
34
|
-
type CreateArg<T extends TestFactory> = CreateData<Omit<T['table'], 'inputType'> & {
|
|
34
|
+
type CreateArg<T extends TestFactory> = CreateData<Omit<T['table'], 'inputType' | 'relations'> & {
|
|
35
35
|
inputType: {
|
|
36
36
|
[K in keyof T['table']['inputType']]?: T['table']['inputType'][K] | ((sequence: number) => T['table']['inputType'][K]);
|
|
37
37
|
};
|
|
38
|
+
/**
|
|
39
|
+
* Allow defining async functions that create relation records and returns id
|
|
40
|
+
*/
|
|
41
|
+
relations: MapRelations<T['table']['relations']>;
|
|
38
42
|
}>;
|
|
43
|
+
type MapRelations<T extends RelationsBase> = {
|
|
44
|
+
[K in keyof T]: Omit<T[K], 'relationConfig'> & {
|
|
45
|
+
relationConfig: Omit<T[K]['relationConfig'], 'dataForCreate'> & {
|
|
46
|
+
dataForCreate: MapDataForCreate<T[K]['relationConfig']['dataForCreate']>;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
type MapDataForCreate<T extends RelationConfigDataForCreate | undefined> = T extends RelationConfigDataForCreate ? Omit<T, 'columns'> & {
|
|
51
|
+
columns: {
|
|
52
|
+
[K in keyof T['columns']]: T['columns'][K] | ((sequence: number) => T['columns'][K] | Promise<T['columns'][K]>);
|
|
53
|
+
};
|
|
54
|
+
} : undefined;
|
|
39
55
|
type CreateResult<T extends TestFactory> = Result<T, ColumnShapeOutput<T['table']['shape']>>;
|
|
40
56
|
declare class TestFactory<Q extends Query = Query, Schema extends AnyZodObject = AnyZodObject, Type extends EmptyObject = EmptyObject> {
|
|
41
57
|
table: Q;
|
|
@@ -96,4 +112,4 @@ type ORMFactory<T> = {
|
|
|
96
112
|
};
|
|
97
113
|
declare const ormFactory: <T>(orm: T, options?: FactoryOptions) => ORMFactory<T>;
|
|
98
114
|
|
|
99
|
-
export { TestFactory, ormFactory, tableFactory };
|
|
115
|
+
export { CreateArg, TestFactory, ormFactory, tableFactory };
|
package/dist/index.js
CHANGED
|
@@ -123,7 +123,7 @@ const processCreateData = (factory, data, uniqueFields, arg) => {
|
|
|
123
123
|
delete pick2[key];
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
|
-
const
|
|
126
|
+
const shared = {};
|
|
127
127
|
const fns = {};
|
|
128
128
|
const allData = arg ? __spreadValues(__spreadValues({}, data), arg) : data;
|
|
129
129
|
for (const key in allData) {
|
|
@@ -132,31 +132,41 @@ const processCreateData = (factory, data, uniqueFields, arg) => {
|
|
|
132
132
|
if (typeof value === "function") {
|
|
133
133
|
fns[key] = value;
|
|
134
134
|
} else {
|
|
135
|
-
|
|
135
|
+
shared[key] = value;
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
const pickedSchema = factory.schema.pick(pick2);
|
|
139
139
|
const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);
|
|
140
|
-
return (arg2) => {
|
|
141
|
-
Object.assign(
|
|
140
|
+
return async (arg2) => {
|
|
141
|
+
const result = Object.assign(__spreadValues({}, shared), zodMock.generateMock(pickedSchema));
|
|
142
|
+
const { sequence } = factory;
|
|
143
|
+
factory.sequence++;
|
|
142
144
|
if (arg2) {
|
|
143
145
|
for (const key in arg2) {
|
|
144
146
|
if (typeof arg2[key] === "function") {
|
|
145
|
-
result[key] = arg2[key](
|
|
146
|
-
factory.sequence
|
|
147
|
-
);
|
|
147
|
+
result[key] = arg2[key](sequence);
|
|
148
148
|
} else {
|
|
149
149
|
result[key] = arg2[key];
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
} else {
|
|
153
|
+
const promises = [];
|
|
153
154
|
for (const key in fns) {
|
|
154
|
-
|
|
155
|
+
promises.push(
|
|
156
|
+
new Promise(async (resolve, reject) => {
|
|
157
|
+
try {
|
|
158
|
+
result[key] = await fns[key](sequence);
|
|
159
|
+
resolve();
|
|
160
|
+
} catch (err) {
|
|
161
|
+
reject(err);
|
|
162
|
+
}
|
|
163
|
+
})
|
|
164
|
+
);
|
|
155
165
|
}
|
|
166
|
+
await Promise.all(promises);
|
|
156
167
|
}
|
|
157
|
-
setUniqueValues(result,
|
|
158
|
-
|
|
159
|
-
return __spreadValues({}, result);
|
|
168
|
+
setUniqueValues(result, sequence);
|
|
169
|
+
return result;
|
|
160
170
|
};
|
|
161
171
|
};
|
|
162
172
|
const _TestFactory = class {
|
|
@@ -226,17 +236,21 @@ const _TestFactory = class {
|
|
|
226
236
|
}
|
|
227
237
|
async create(data) {
|
|
228
238
|
const getData = processCreateData(this, this.data, this.uniqueFields, data);
|
|
229
|
-
return await this.table.create(getData());
|
|
239
|
+
return await this.table.create(await getData());
|
|
230
240
|
}
|
|
231
241
|
async createList(qty, data) {
|
|
232
242
|
const getData = processCreateData(this, this.data, this.uniqueFields, data);
|
|
233
|
-
const arr = [...Array(qty)].map(() => getData());
|
|
234
|
-
return await this.table.createMany(
|
|
243
|
+
const arr = await Promise.all([...Array(qty)].map(() => getData()));
|
|
244
|
+
return await this.table.createMany(
|
|
245
|
+
arr
|
|
246
|
+
);
|
|
235
247
|
}
|
|
236
248
|
async createMany(...arr) {
|
|
237
249
|
const getData = processCreateData(this, this.data, this.uniqueFields);
|
|
238
|
-
const data = arr.map(getData);
|
|
239
|
-
return await this.table.createMany(
|
|
250
|
+
const data = await Promise.all(arr.map(getData));
|
|
251
|
+
return await this.table.createMany(
|
|
252
|
+
data
|
|
253
|
+
);
|
|
240
254
|
}
|
|
241
255
|
extend() {
|
|
242
256
|
const { table, schema, uniqueFields } = this;
|
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 IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n TextBaseColumn,\n} from 'pqb';\nimport { ColumnShapeOutput, EmptyObject } from 'orchid-core';\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['table'], 'inputType'> & {\n inputType: {\n [K in keyof T['table']['inputType']]?:\n | T['table']['inputType'][K]\n | ((sequence: number) => T['table']['inputType'][K]);\n };\n }\n>;\n\ntype CreateResult<T extends TestFactory> = Result<\n T,\n ColumnShapeOutput<T['table']['shape']>\n>;\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 (arg?: BuildArg<T>) => {\n const data = arg ? { ...allData, ...arg } : allData;\n\n const result = generateMock(schema) as Record<string, unknown>;\n for (const key in data) {\n const value = (data 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.table.shape) {\n pick[key] = true;\n }\n\n factory.table.primaryKeys.forEach((key) => {\n const item = factory.table.shape[key];\n\n if ('identity' in item.data || item.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 (arg?: CreateArg<T>) => {\n Object.assign(result, generateMock(pickedSchema));\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)(\n factory.sequence,\n );\n } else {\n result[key] = arg[key];\n }\n }\n } else {\n for (const key in fns) {\n result[key] = fns[key](factory.sequence);\n }\n }\n\n setUniqueValues(result, factory.sequence);\n\n factory.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: 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 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(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.table.createMany(arr)) 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 = arr.map(getData);\n return (await this.table.createMany(data)) 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\nexport const tableFactory = <T extends Query>(\n table: T,\n options?: FactoryOptions,\n): TestFactory<T, InstanceToZod<T>, ColumnShapeOutput<T['shape']>> => {\n const schema = instanceToZod(table);\n\n const data: Record<string, unknown> = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in table.shape) {\n const column = table.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 } 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<T, InstanceToZod<T>, ColumnShapeOutput<T['shape']>>(\n table,\n schema,\n uniqueFields,\n data,\n options,\n );\n};\n\ntype ORMFactory<T> = {\n [K in keyof T]: T[K] extends Query & { definedAs: string }\n ? TestFactory<T[K], InstanceToZod<T[K]>, ColumnShapeOutput<T[K]['shape']>>\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: Record<string, unknown> = {};\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","instanceToZod","DateBaseColumn","IntegerBaseColumn","TextBaseColumn","ZodNullable","NumberBaseColumn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/factory.ts"],"sourcesContent":["import { AnyZodObject, ZodNullable, ZodString, ZodTypeAny } from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n RelationConfigDataForCreate,\n RelationsBase,\n TextBaseColumn,\n} from 'pqb';\nimport { ColumnShapeOutput, EmptyObject } from 'orchid-core';\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\nexport type CreateArg<T extends TestFactory> = CreateData<\n Omit<T['table'], 'inputType' | 'relations'> & {\n inputType: {\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 relations: MapRelations<T['table']['relations']>;\n }\n>;\n\ntype MapRelations<T extends RelationsBase> = {\n [K in keyof T]: Omit<T[K], 'relationConfig'> & {\n relationConfig: Omit<T[K]['relationConfig'], 'dataForCreate'> & {\n dataForCreate: MapDataForCreate<T[K]['relationConfig']['dataForCreate']>;\n };\n };\n};\n\ntype MapDataForCreate<T extends RelationConfigDataForCreate | undefined> =\n T extends RelationConfigDataForCreate\n ? Omit<T, 'columns'> & {\n columns: {\n [K in keyof T['columns']]:\n | T['columns'][K]\n | ((\n sequence: number,\n ) => T['columns'][K] | Promise<T['columns'][K]>);\n };\n }\n : undefined;\n\ntype CreateResult<T extends TestFactory> = Result<\n T,\n ColumnShapeOutput<T['table']['shape']>\n>;\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 (arg?: BuildArg<T>) => {\n const data = arg ? { ...allData, ...arg } : allData;\n\n const result = generateMock(schema) as Record<string, unknown>;\n for (const key in data) {\n const value = (data 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.table.shape) {\n pick[key] = true;\n }\n\n factory.table.primaryKeys.forEach((key) => {\n const item = factory.table.shape[key];\n\n if ('identity' in item.data || item.dataType.includes('serial')) {\n delete pick[key];\n }\n });\n\n const shared: 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 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: 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 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\nexport const tableFactory = <T extends Query>(\n table: T,\n options?: FactoryOptions,\n): TestFactory<T, InstanceToZod<T>, ColumnShapeOutput<T['shape']>> => {\n const schema = instanceToZod(table);\n\n const data: Record<string, unknown> = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in table.shape) {\n const column = table.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 } 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<T, InstanceToZod<T>, ColumnShapeOutput<T['shape']>>(\n table,\n schema,\n uniqueFields,\n data,\n options,\n );\n};\n\ntype ORMFactory<T> = {\n [K in keyof T]: T[K] extends Query & { definedAs: string }\n ? TestFactory<T[K], InstanceToZod<T[K]>, ColumnShapeOutput<T[K]['shape']>>\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: Record<string, unknown> = {};\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","instanceToZod","DateBaseColumn","IntegerBaseColumn","TextBaseColumn","ZodNullable","NumberBaseColumn"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -121,7 +121,7 @@ const processCreateData = (factory, data, uniqueFields, arg) => {
|
|
|
121
121
|
delete pick2[key];
|
|
122
122
|
}
|
|
123
123
|
});
|
|
124
|
-
const
|
|
124
|
+
const shared = {};
|
|
125
125
|
const fns = {};
|
|
126
126
|
const allData = arg ? __spreadValues(__spreadValues({}, data), arg) : data;
|
|
127
127
|
for (const key in allData) {
|
|
@@ -130,31 +130,41 @@ const processCreateData = (factory, data, uniqueFields, arg) => {
|
|
|
130
130
|
if (typeof value === "function") {
|
|
131
131
|
fns[key] = value;
|
|
132
132
|
} else {
|
|
133
|
-
|
|
133
|
+
shared[key] = value;
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
const pickedSchema = factory.schema.pick(pick2);
|
|
137
137
|
const setUniqueValues = makeSetUniqueValues(uniqueFields, allData);
|
|
138
|
-
return (arg2) => {
|
|
139
|
-
Object.assign(
|
|
138
|
+
return async (arg2) => {
|
|
139
|
+
const result = Object.assign(__spreadValues({}, shared), generateMock(pickedSchema));
|
|
140
|
+
const { sequence } = factory;
|
|
141
|
+
factory.sequence++;
|
|
140
142
|
if (arg2) {
|
|
141
143
|
for (const key in arg2) {
|
|
142
144
|
if (typeof arg2[key] === "function") {
|
|
143
|
-
result[key] = arg2[key](
|
|
144
|
-
factory.sequence
|
|
145
|
-
);
|
|
145
|
+
result[key] = arg2[key](sequence);
|
|
146
146
|
} else {
|
|
147
147
|
result[key] = arg2[key];
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
} else {
|
|
151
|
+
const promises = [];
|
|
151
152
|
for (const key in fns) {
|
|
152
|
-
|
|
153
|
+
promises.push(
|
|
154
|
+
new Promise(async (resolve, reject) => {
|
|
155
|
+
try {
|
|
156
|
+
result[key] = await fns[key](sequence);
|
|
157
|
+
resolve();
|
|
158
|
+
} catch (err) {
|
|
159
|
+
reject(err);
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
);
|
|
153
163
|
}
|
|
164
|
+
await Promise.all(promises);
|
|
154
165
|
}
|
|
155
|
-
setUniqueValues(result,
|
|
156
|
-
|
|
157
|
-
return __spreadValues({}, result);
|
|
166
|
+
setUniqueValues(result, sequence);
|
|
167
|
+
return result;
|
|
158
168
|
};
|
|
159
169
|
};
|
|
160
170
|
const _TestFactory = class {
|
|
@@ -224,17 +234,21 @@ const _TestFactory = class {
|
|
|
224
234
|
}
|
|
225
235
|
async create(data) {
|
|
226
236
|
const getData = processCreateData(this, this.data, this.uniqueFields, data);
|
|
227
|
-
return await this.table.create(getData());
|
|
237
|
+
return await this.table.create(await getData());
|
|
228
238
|
}
|
|
229
239
|
async createList(qty, data) {
|
|
230
240
|
const getData = processCreateData(this, this.data, this.uniqueFields, data);
|
|
231
|
-
const arr = [...Array(qty)].map(() => getData());
|
|
232
|
-
return await this.table.createMany(
|
|
241
|
+
const arr = await Promise.all([...Array(qty)].map(() => getData()));
|
|
242
|
+
return await this.table.createMany(
|
|
243
|
+
arr
|
|
244
|
+
);
|
|
233
245
|
}
|
|
234
246
|
async createMany(...arr) {
|
|
235
247
|
const getData = processCreateData(this, this.data, this.uniqueFields);
|
|
236
|
-
const data = arr.map(getData);
|
|
237
|
-
return await this.table.createMany(
|
|
248
|
+
const data = await Promise.all(arr.map(getData));
|
|
249
|
+
return await this.table.createMany(
|
|
250
|
+
data
|
|
251
|
+
);
|
|
238
252
|
}
|
|
239
253
|
extend() {
|
|
240
254
|
const { table, schema, uniqueFields } = this;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/factory.ts"],"sourcesContent":["import { AnyZodObject, ZodNullable, ZodString, ZodTypeAny } from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n TextBaseColumn,\n} from 'pqb';\nimport { ColumnShapeOutput, EmptyObject } from 'orchid-core';\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['table'], 'inputType'> & {\n inputType: {\n [K in keyof T['table']['inputType']]?:\n | T['table']['inputType'][K]\n | ((sequence: number) => T['table']['inputType'][K]);\n };\n }\n>;\n\ntype CreateResult<T extends TestFactory> = Result<\n T,\n ColumnShapeOutput<T['table']['shape']>\n>;\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 (arg?: BuildArg<T>) => {\n const data = arg ? { ...allData, ...arg } : allData;\n\n const result = generateMock(schema) as Record<string, unknown>;\n for (const key in data) {\n const value = (data 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.table.shape) {\n pick[key] = true;\n }\n\n factory.table.primaryKeys.forEach((key) => {\n const item = factory.table.shape[key];\n\n if ('identity' in item.data || item.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 (arg?: CreateArg<T>) => {\n Object.assign(result, generateMock(pickedSchema));\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)(\n factory.sequence,\n );\n } else {\n result[key] = arg[key];\n }\n }\n } else {\n for (const key in fns) {\n result[key] = fns[key](factory.sequence);\n }\n }\n\n setUniqueValues(result, factory.sequence);\n\n factory.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: 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 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(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.table.createMany(arr)) 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 = arr.map(getData);\n return (await this.table.createMany(data)) 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\nexport const tableFactory = <T extends Query>(\n table: T,\n options?: FactoryOptions,\n): TestFactory<T, InstanceToZod<T>, ColumnShapeOutput<T['shape']>> => {\n const schema = instanceToZod(table);\n\n const data: Record<string, unknown> = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in table.shape) {\n const column = table.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 } 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<T, InstanceToZod<T>, ColumnShapeOutput<T['shape']>>(\n table,\n schema,\n uniqueFields,\n data,\n options,\n );\n};\n\ntype ORMFactory<T> = {\n [K in keyof T]: T[K] extends Query & { definedAs: string }\n ? TestFactory<T[K], InstanceToZod<T[K]>, ColumnShapeOutput<T[K]['shape']>>\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: Record<string, unknown> = {};\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 { AnyZodObject, ZodNullable, ZodString, ZodTypeAny } from 'zod';\nimport {\n CreateData,\n DateBaseColumn,\n IntegerBaseColumn,\n NumberBaseColumn,\n Query,\n RelationConfigDataForCreate,\n RelationsBase,\n TextBaseColumn,\n} from 'pqb';\nimport { ColumnShapeOutput, EmptyObject } from 'orchid-core';\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\nexport type CreateArg<T extends TestFactory> = CreateData<\n Omit<T['table'], 'inputType' | 'relations'> & {\n inputType: {\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 relations: MapRelations<T['table']['relations']>;\n }\n>;\n\ntype MapRelations<T extends RelationsBase> = {\n [K in keyof T]: Omit<T[K], 'relationConfig'> & {\n relationConfig: Omit<T[K]['relationConfig'], 'dataForCreate'> & {\n dataForCreate: MapDataForCreate<T[K]['relationConfig']['dataForCreate']>;\n };\n };\n};\n\ntype MapDataForCreate<T extends RelationConfigDataForCreate | undefined> =\n T extends RelationConfigDataForCreate\n ? Omit<T, 'columns'> & {\n columns: {\n [K in keyof T['columns']]:\n | T['columns'][K]\n | ((\n sequence: number,\n ) => T['columns'][K] | Promise<T['columns'][K]>);\n };\n }\n : undefined;\n\ntype CreateResult<T extends TestFactory> = Result<\n T,\n ColumnShapeOutput<T['table']['shape']>\n>;\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 (arg?: BuildArg<T>) => {\n const data = arg ? { ...allData, ...arg } : allData;\n\n const result = generateMock(schema) as Record<string, unknown>;\n for (const key in data) {\n const value = (data 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.table.shape) {\n pick[key] = true;\n }\n\n factory.table.primaryKeys.forEach((key) => {\n const item = factory.table.shape[key];\n\n if ('identity' in item.data || item.dataType.includes('serial')) {\n delete pick[key];\n }\n });\n\n const shared: 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 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: 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 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\nexport const tableFactory = <T extends Query>(\n table: T,\n options?: FactoryOptions,\n): TestFactory<T, InstanceToZod<T>, ColumnShapeOutput<T['shape']>> => {\n const schema = instanceToZod(table);\n\n const data: Record<string, unknown> = {};\n const now = Date.now();\n\n const uniqueFields: UniqueField[] = [];\n\n for (const key in table.shape) {\n const column = table.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 } 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<T, InstanceToZod<T>, ColumnShapeOutput<T['shape']>>(\n table,\n schema,\n uniqueFields,\n data,\n options,\n );\n};\n\ntype ORMFactory<T> = {\n [K in keyof T]: T[K] extends Query & { definedAs: string }\n ? TestFactory<T[K], InstanceToZod<T[K]>, ColumnShapeOutput<T[K]['shape']>>\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: Record<string, unknown> = {};\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.
|
|
3
|
+
"version": "0.3.172",
|
|
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
|
-
"orchid-orm-schema-to-zod": "0.4.
|
|
49
|
-
"pqb": "0.20.
|
|
48
|
+
"orchid-orm-schema-to-zod": "0.4.43",
|
|
49
|
+
"pqb": "0.20.1",
|
|
50
50
|
"orchid-core": "0.10.17"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"orchid-orm": "1.18.
|
|
53
|
+
"orchid-orm": "1.18.3",
|
|
54
54
|
"test-utils": "0.0.3"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|