orchid-orm 1.3.15 → 1.4.16

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.
Files changed (38) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/index.d.ts +59 -54
  3. package/dist/index.esm.js +777 -547
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +776 -546
  6. package/dist/index.js.map +1 -1
  7. package/jest-setup.ts +4 -0
  8. package/package.json +8 -4
  9. package/src/appCodeUpdater/appCodeUpdater.ts +19 -0
  10. package/src/appCodeUpdater/fileChanges.ts +41 -0
  11. package/src/appCodeUpdater/testUtils.ts +31 -0
  12. package/src/appCodeUpdater/tsUtils.ts +137 -0
  13. package/src/appCodeUpdater/updateMainFile.test.ts +230 -0
  14. package/src/appCodeUpdater/updateMainFile.ts +163 -0
  15. package/src/appCodeUpdater/updateTableFile.ts +19 -0
  16. package/src/index.ts +5 -1
  17. package/src/orm.test.ts +13 -13
  18. package/src/orm.ts +21 -21
  19. package/src/relations/belongsTo.test.ts +1 -1
  20. package/src/relations/belongsTo.ts +291 -186
  21. package/src/relations/hasAndBelongsToMany.test.ts +1 -1
  22. package/src/relations/hasAndBelongsToMany.ts +292 -218
  23. package/src/relations/hasMany.test.ts +16 -10
  24. package/src/relations/hasMany.ts +243 -172
  25. package/src/relations/hasOne.test.ts +10 -10
  26. package/src/relations/hasOne.ts +211 -138
  27. package/src/relations/relations.ts +85 -77
  28. package/src/relations/utils.ts +154 -4
  29. package/src/repo.test.ts +29 -29
  30. package/src/repo.ts +6 -6
  31. package/src/{model.test.ts → table.test.ts} +15 -15
  32. package/src/{model.ts → table.ts} +17 -17
  33. package/src/test-utils/test-db.ts +15 -15
  34. package/src/test-utils/{test-models.ts → test-tables.ts} +42 -42
  35. package/src/transaction.test.ts +1 -1
  36. package/src/transaction.ts +4 -4
  37. package/src/utils.ts +9 -0
  38. package/tsconfig.json +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/model.ts","../src/relations/belongsTo.ts","../src/relations/utils.ts","../src/relations/hasOne.ts","../src/relations/hasMany.ts","../src/relations/hasAndBelongsToMany.ts","../src/relations/relations.ts","../src/transaction.ts","../src/orm.ts","../src/repo.ts"],"sourcesContent":["import {\n ColumnShapeOutput,\n ColumnsShape,\n ColumnTypesBase,\n Db,\n getColumnTypes,\n Query,\n} from 'pqb';\nimport { MapRelations, Relation, RelationThunks } from './relations/relations';\nimport { OrchidORM } from './orm';\n\nexport type ModelClass<T extends Model = Model> = new () => T;\n\nexport type ModelClasses = Record<string, ModelClass>;\n\nexport type ModelToDb<T extends Model> = Db<\n T['table'],\n T['columns']['shape'],\n 'relations' extends keyof T\n ? T['relations'] extends RelationThunks\n ? {\n [K in keyof T['relations']]: Relation<T, T['relations'], K>;\n }\n : Query['relations']\n : Query['relations'],\n T['columnTypes']\n> & { definedAs: string; db: OrchidORM<ModelClasses> };\n\nexport type DbModel<T extends ModelClass> = ModelToDb<InstanceType<T>> &\n Omit<MapRelations<InstanceType<T>>, keyof Query>;\n\ntype ModelConfig = {\n shape: ColumnsShape;\n type: unknown;\n};\n\ntype ScopeFn<Related extends ModelClass, Scope extends Query> = (\n q: DbModel<Related>,\n) => Scope;\n\nexport type Model = {\n table: string;\n columns: ModelConfig;\n schema?: string;\n columnTypes: ColumnTypesBase;\n noPrimaryKey?: boolean;\n};\n\nexport const createModel = <CT extends ColumnTypesBase>(options: {\n columnTypes: CT;\n}) => {\n return class Model {\n table!: string;\n columns!: ModelConfig;\n schema?: string;\n columnTypes: CT;\n noPrimaryKey?: boolean;\n\n constructor() {\n this.columnTypes = options.columnTypes;\n }\n\n setColumns = <T extends ColumnsShape>(\n fn: (t: CT) => T,\n ): { shape: T; type: ColumnShapeOutput<T> } => {\n const shape = getColumnTypes(options.columnTypes, fn);\n\n return {\n shape,\n type: undefined as unknown as ColumnShapeOutput<T>,\n };\n };\n\n belongsTo<\n Self extends this,\n Related extends ModelClass,\n Scope extends Query,\n Options extends {\n primaryKey: keyof InstanceType<Related>['columns']['shape'];\n foreignKey: keyof Self['columns']['shape'];\n scope?: ScopeFn<Related, Scope>;\n required?: boolean;\n },\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'belongsTo' as const,\n returns: 'one' as const,\n fn,\n options,\n };\n }\n\n hasOne<\n Self extends this,\n Related extends ModelClass,\n Scope extends Query,\n Through extends string,\n Source extends string,\n Options extends (\n | {\n primaryKey: keyof Self['columns']['shape'];\n foreignKey: keyof InstanceType<Related>['columns']['shape'];\n }\n | {\n through: Through;\n source: Source;\n }\n ) & {\n scope?: ScopeFn<Related, Scope>;\n required?: boolean;\n },\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasOne' as const,\n returns: 'one' as const,\n fn,\n options,\n };\n }\n\n hasMany<\n Self extends this,\n Related extends ModelClass,\n Scope extends Query,\n Through extends string,\n Source extends string,\n Options extends (\n | {\n primaryKey: keyof Self['columns']['shape'];\n foreignKey: keyof InstanceType<Related>['columns']['shape'];\n }\n | {\n through: Through;\n source: Source;\n }\n ) & {\n scope?: ScopeFn<Related, Scope>;\n required?: boolean;\n },\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasMany' as const,\n returns: 'many' as const,\n fn,\n options,\n };\n }\n\n hasAndBelongsToMany<\n Self extends this,\n Related extends ModelClass,\n Scope extends Query,\n Options extends {\n primaryKey: keyof Self['columns']['shape'];\n associationPrimaryKey: keyof InstanceType<Related>['columns']['shape'];\n foreignKey: string;\n associationForeignKey: string;\n joinTable: string;\n scope?: ScopeFn<Related, Scope>;\n required?: boolean;\n },\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasAndBelongsToMany' as const,\n returns: 'many' as const,\n fn,\n options,\n };\n }\n };\n};\n","import { Model } from '../model';\nimport {\n addQueryOn,\n BelongsToNestedInsert,\n BelongsToNestedUpdate,\n BelongsToRelation,\n isQueryReturnsAll,\n Query,\n QueryBase,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { RelationData, RelationThunkBase } from './relations';\n\nexport interface BelongsTo extends RelationThunkBase {\n type: 'belongsTo';\n returns: 'one';\n options: BelongsToRelation['options'];\n}\n\nexport type BelongsToInfo<\n T extends Model,\n Relation extends BelongsTo,\n FK extends string = Relation['options']['foreignKey'],\n> = {\n params: Record<FK, T['columns']['shape'][FK]['type']>;\n populate: never;\n chainedCreate: false;\n chainedDelete: false;\n};\n\nexport const makeBelongsToMethod = (\n relation: BelongsTo,\n query: Query,\n): RelationData => {\n const { primaryKey, foreignKey } = relation.options;\n\n return {\n returns: 'one',\n method: (params: Record<string, unknown>) => {\n return query.findBy({ [primaryKey]: params[foreignKey] });\n },\n nestedInsert: (async (q, data) => {\n const connectOrCreate = data.filter(\n (\n item,\n ): item is {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n } => Boolean(item.connectOrCreate),\n );\n\n const t = query.transacting(q);\n\n let connectOrCreated: unknown[];\n if (connectOrCreate.length) {\n connectOrCreated = await Promise.all(\n connectOrCreate.map((item) =>\n t.findBy(item.connectOrCreate.where)._takeOptional(),\n ),\n );\n } else {\n connectOrCreated = [];\n }\n\n let connectOrCreatedI = 0;\n const create = data.filter(\n (\n item,\n ): item is\n | {\n create: Record<string, unknown>;\n }\n | {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n } => {\n if (item.connectOrCreate) {\n return !connectOrCreated[connectOrCreatedI++];\n } else {\n return Boolean(item.create);\n }\n },\n );\n\n let created: unknown[];\n if (create.length) {\n created = (await t\n .select(primaryKey)\n ._createMany(\n create.map((item) =>\n 'create' in item ? item.create : item.connectOrCreate.create,\n ),\n )) as unknown[];\n } else {\n created = [];\n }\n\n const connect = data.filter(\n (\n item,\n ): item is {\n connect: WhereArg<QueryBase>;\n } => Boolean(item.connect),\n );\n\n let connected: unknown[];\n if (connect.length) {\n connected = await Promise.all(\n connect.map((item) => t.findBy(item.connect)._take()),\n );\n } else {\n connected = [];\n }\n\n let createdI = 0;\n let connectedI = 0;\n connectOrCreatedI = 0;\n return data.map((item) =>\n item.connectOrCreate\n ? connectOrCreated[connectOrCreatedI++] || created[createdI++]\n : item.connect\n ? connected[connectedI++]\n : created[createdI++],\n );\n }) as BelongsToNestedInsert,\n nestedUpdate: ((q, update, params, state) => {\n if (params.upsert && isQueryReturnsAll(q)) {\n throw new Error('`upsert` option is not allowed in a batch update');\n }\n\n let idForDelete: unknown;\n\n q._beforeUpdate(async (q) => {\n if (params.disconnect) {\n update[foreignKey] = null;\n } else if (params.set) {\n if (primaryKey in params.set) {\n update[foreignKey] =\n params.set[primaryKey as keyof typeof params.set];\n } else {\n update[foreignKey] = await query\n .transacting(q)\n ._findBy(params.set)\n ._get(primaryKey);\n }\n } else if (params.create) {\n update[foreignKey] = await query\n .transacting(q)\n ._get(primaryKey)\n ._create(params.create);\n } else if (params.delete) {\n const selectQuery = q.transacting(q);\n selectQuery.query.type = undefined;\n idForDelete = await selectQuery._getOptional(foreignKey);\n update[foreignKey] = null;\n }\n });\n\n const { upsert } = params;\n if (upsert || params.update || params.delete) {\n if (\n !q.query.select?.includes('*') &&\n !q.query.select?.includes(foreignKey)\n ) {\n q._select(foreignKey);\n }\n }\n\n if (upsert) {\n if (!state.updateLater) {\n state.updateLater = {};\n state.updateLaterPromises = [];\n }\n\n const { handleResult } = q.query;\n q.query.handleResult = async (q, queryResult) => {\n const data = (await handleResult(q, queryResult)) as Record<\n string,\n unknown\n >[];\n\n const id = data[0][foreignKey];\n if (id !== null) {\n await query\n .transacting(q)\n ._findBy({ [primaryKey]: id })\n ._update<WhereResult<Query>>(upsert.update);\n } else {\n (state.updateLaterPromises as Promise<void>[]).push(\n query\n .transacting(q)\n ._select(primaryKey)\n ._create(upsert.create)\n .then((result) => {\n (state.updateLater as Record<string, unknown>)[foreignKey] = (\n result as Record<string, unknown>\n )[primaryKey];\n }) as unknown as Promise<void>,\n );\n }\n\n return data;\n };\n } else if (params.delete || params.update) {\n q._afterQuery(async (q, data) => {\n const id = params.delete\n ? idForDelete\n : Array.isArray(data)\n ? data.length === 0\n ? null\n : {\n in: data\n .map((item) => item[foreignKey])\n .filter((id) => id !== null),\n }\n : (data as Record<string, unknown>)[foreignKey];\n\n if (id !== undefined && id !== null) {\n const t = query.transacting(q)._findBy({\n [primaryKey]: id,\n });\n\n if (params.delete) {\n await t._delete();\n } else if (params.update) {\n await t._update<WhereResult<Query>>(params.update);\n }\n }\n });\n }\n\n return !params.update && !params.upsert;\n }) as BelongsToNestedUpdate,\n joinQuery(fromQuery, toQuery) {\n return addQueryOn(toQuery, fromQuery, toQuery, primaryKey, foreignKey);\n },\n reverseJoin(fromQuery, toQuery) {\n return addQueryOn(fromQuery, toQuery, fromQuery, foreignKey, primaryKey);\n },\n primaryKey,\n };\n};\n","import { Query, Relation } from 'pqb';\n\nexport const getThroughRelation = (model: Query, through: string) => {\n return (model.relations as Record<string, Relation>)[through];\n};\n\nexport const getSourceRelation = (\n throughRelation: Relation,\n source: string,\n) => {\n return (throughRelation.model.relations as Record<string, Relation>)[source];\n};\n","import {\n addQueryOn,\n getQueryAs,\n HasOneNestedInsert,\n HasOneNestedUpdate,\n HasOneRelation,\n InsertQueryData,\n isQueryReturnsAll,\n JoinCallback,\n Query,\n QueryBase,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { Model } from '../model';\nimport {\n RelationData,\n RelationInfo,\n RelationThunkBase,\n RelationThunks,\n} from './relations';\nimport { getSourceRelation, getThroughRelation } from './utils';\n\nexport interface HasOne extends RelationThunkBase {\n type: 'hasOne';\n returns: 'one';\n options: HasOneRelation['options'];\n}\n\nexport type HasOneInfo<\n T extends Model,\n Relations extends RelationThunks,\n Relation extends HasOne,\n> = {\n params: Relation['options'] extends { primaryKey: string }\n ? Record<\n Relation['options']['primaryKey'],\n T['columns']['shape'][Relation['options']['primaryKey']]['type']\n >\n : Relation['options'] extends { through: string }\n ? RelationInfo<\n T,\n Relations,\n Relations[Relation['options']['through']]\n >['params']\n : never;\n populate: Relation['options'] extends { foreignKey: string }\n ? Relation['options']['foreignKey']\n : never;\n chainedCreate: Relation['options'] extends { primaryKey: string }\n ? true\n : false;\n chainedDelete: true;\n};\n\nexport const makeHasOneMethod = (\n model: Query,\n relation: HasOne,\n relationName: string,\n query: Query,\n): RelationData => {\n if (relation.options.required) {\n query._take();\n } else {\n query._takeOptional();\n }\n\n if ('through' in relation.options) {\n const { through, source } = relation.options;\n\n type ModelWithQueryMethod = Record<\n string,\n (params: Record<string, unknown>) => Query\n >;\n\n const throughRelation = getThroughRelation(model, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceQuery = sourceRelation\n .joinQuery(throughRelation.query, sourceRelation.query)\n .as(relationName);\n\n const whereExistsCallback = () => sourceQuery;\n\n return {\n returns: 'one',\n method: (params: Record<string, unknown>) => {\n const throughQuery = (model as unknown as ModelWithQueryMethod)[\n through\n ](params);\n\n return query.whereExists<Query, Query>(\n throughQuery,\n whereExistsCallback as unknown as JoinCallback<Query, Query>,\n );\n },\n nestedInsert: undefined,\n nestedUpdate: undefined,\n joinQuery(fromQuery, toQuery) {\n return toQuery.whereExists<Query, Query>(\n throughRelation.joinQuery(fromQuery, throughRelation.query),\n (() => {\n const as = getQueryAs(toQuery);\n return sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelation.query.as(as),\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return fromQuery.whereExists<Query, Query>(\n throughRelation.joinQuery(fromQuery, throughRelation.query),\n (() => {\n const as = getQueryAs(toQuery);\n return sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelation.query.as(as),\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n },\n primaryKey: sourceRelation.primaryKey,\n };\n }\n\n const { primaryKey, foreignKey } = relation.options;\n\n const fromQuerySelect = [{ selectAs: { [foreignKey]: primaryKey } }];\n\n return {\n returns: 'one',\n method: (params: Record<string, unknown>) => {\n const values = { [foreignKey]: params[primaryKey] };\n return query.where(values)._defaults(values);\n },\n nestedInsert: (async (q, data) => {\n const connect = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n (\n | {\n connect: WhereArg<QueryBase>;\n }\n | {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n }\n ),\n ] => Boolean(item[1].connect || item[1].connectOrCreate),\n );\n\n const t = query.transacting(q);\n\n let connected: number[];\n if (connect.length) {\n connected = await Promise.all(\n connect.map(([selfData, item]) => {\n const data = { [foreignKey]: selfData[primaryKey] };\n return 'connect' in item\n ? (\n t.where(item.connect) as WhereResult<Query> & {\n hasSelect: false;\n }\n )._updateOrThrow(data)\n : (\n t.where(item.connectOrCreate.where) as WhereResult<Query> & {\n hasSelect: false;\n }\n )._update(data);\n }),\n );\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n const create = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n (\n | { create: Record<string, unknown> }\n | {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n }\n ),\n ] => {\n if (item[1].connectOrCreate) {\n return !connected[connectedI++];\n }\n return Boolean(item[1].create);\n },\n );\n\n if (create.length) {\n await t._count()._createMany(\n create.map(([selfData, item]) => ({\n [foreignKey]: selfData[primaryKey],\n ...('create' in item ? item.create : item.connectOrCreate.create),\n })),\n );\n }\n }) as HasOneNestedInsert,\n nestedUpdate: (async (q, data, params) => {\n if (\n (params.set || params.create || params.upsert) &&\n isQueryReturnsAll(q)\n ) {\n const key = params.set ? 'set' : params.create ? 'create' : 'upsert';\n throw new Error(`\\`${key}\\` option is not allowed in a batch update`);\n }\n\n const t = query.transacting(q);\n const ids = data.map((item) => item[primaryKey]);\n const currentRelationsQuery = t.where({\n [foreignKey]: { in: ids },\n });\n\n if (params.create || params.disconnect || params.set) {\n await currentRelationsQuery._update({ [foreignKey]: null });\n\n if (params.create) {\n await t._count()._create({\n ...params.create,\n [foreignKey]: data[0][primaryKey],\n });\n }\n if (params.set) {\n await t\n ._where<Query>(params.set)\n ._update({ [foreignKey]: data[0][primaryKey] });\n }\n } else if (params.update) {\n await currentRelationsQuery._update<WhereResult<Query>>(params.update);\n } else if (params.delete) {\n await currentRelationsQuery._delete();\n } else if (params.upsert) {\n const { update, create } = params.upsert;\n const updatedIds: unknown[] = await currentRelationsQuery\n ._pluck(foreignKey)\n ._update<WhereResult<Query & { hasSelect: true }>>(update);\n\n if (updatedIds.length < ids.length) {\n await t.createMany(\n ids\n .filter((id) => !updatedIds.includes(id))\n .map((id) => ({\n ...create,\n [foreignKey]: id,\n })),\n );\n }\n }\n }) as HasOneNestedUpdate,\n joinQuery(fromQuery, toQuery) {\n return addQueryOn(toQuery, fromQuery, toQuery, foreignKey, primaryKey);\n },\n reverseJoin(fromQuery, toQuery) {\n return addQueryOn(fromQuery, toQuery, fromQuery, primaryKey, foreignKey);\n },\n primaryKey,\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const fromQuery = query.clone();\n fromQuery.query.select = fromQuerySelect;\n (relationQuery.query as InsertQueryData).fromQuery = fromQuery;\n };\n },\n };\n};\n","import {\n RelationData,\n RelationInfo,\n RelationThunkBase,\n RelationThunks,\n} from './relations';\nimport { Model } from '../model';\nimport {\n addQueryOn,\n getQueryAs,\n HasManyNestedInsert,\n HasManyNestedUpdate,\n HasManyRelation,\n CreateData,\n JoinCallback,\n MaybeArray,\n Query,\n QueryBase,\n toSqlCacheKey,\n WhereArg,\n WhereResult,\n InsertQueryData,\n isQueryReturnsAll,\n} from 'pqb';\nimport { getSourceRelation, getThroughRelation } from './utils';\n\nexport interface HasMany extends RelationThunkBase {\n type: 'hasMany';\n returns: 'many';\n options: HasManyRelation['options'];\n}\n\nexport type HasManyInfo<\n T extends Model,\n Relations extends RelationThunks,\n Relation extends HasMany,\n> = {\n params: Relation['options'] extends { primaryKey: string }\n ? Record<\n Relation['options']['primaryKey'],\n T['columns']['shape'][Relation['options']['primaryKey']]['type']\n >\n : Relation['options'] extends { through: string }\n ? RelationInfo<\n T,\n Relations,\n Relations[Relation['options']['through']]\n >['params']\n : never;\n populate: Relation['options'] extends { foreignKey: string }\n ? Relation['options']['foreignKey']\n : never;\n chainedCreate: Relation['options'] extends { primaryKey: string }\n ? true\n : false;\n chainedDelete: true;\n};\n\nexport const makeHasManyMethod = (\n model: Query,\n relation: HasMany,\n relationName: string,\n query: Query,\n): RelationData => {\n if ('through' in relation.options) {\n const { through, source } = relation.options;\n\n type ModelWithQueryMethod = Record<\n string,\n (params: Record<string, unknown>) => Query\n >;\n\n const throughRelation = getThroughRelation(model, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = sourceRelation.query.as(relationName);\n const sourceQuery = sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelationQuery,\n );\n\n const whereExistsCallback = () => sourceQuery;\n\n return {\n returns: 'many',\n method: (params: Record<string, unknown>) => {\n const throughQuery = (model as unknown as ModelWithQueryMethod)[\n through\n ](params);\n\n return query.whereExists<Query, Query>(\n throughQuery,\n whereExistsCallback as unknown as JoinCallback<Query, Query>,\n );\n },\n nestedInsert: undefined,\n nestedUpdate: undefined,\n joinQuery(fromQuery, toQuery) {\n return toQuery.whereExists<Query, Query>(\n throughRelation.joinQuery(fromQuery, throughRelation.query),\n (() => {\n const as = getQueryAs(toQuery);\n return sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelation.query.as(as),\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return fromQuery.whereExists<Query, Query>(\n throughRelation.joinQuery(fromQuery, throughRelation.query),\n (() => {\n const as = getQueryAs(toQuery);\n return sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelation.query.as(as),\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n },\n primaryKey: sourceRelation.primaryKey,\n };\n }\n\n const { primaryKey, foreignKey } = relation.options;\n\n const fromQuerySelect = [{ selectAs: { [foreignKey]: primaryKey } }];\n\n return {\n returns: 'many',\n method: (params: Record<string, unknown>) => {\n const values = { [foreignKey]: params[primaryKey] };\n return query.where(values)._defaults(values);\n },\n nestedInsert: (async (q, data) => {\n const connect = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n { connect: WhereArg<QueryBase>[] },\n ] => Boolean(item[1].connect),\n );\n\n const t = query.transacting(q);\n\n if (connect.length) {\n await Promise.all(\n connect.flatMap(([selfData, { connect }]) =>\n t\n .or<Query>(...connect)\n ._updateOrThrow({ [foreignKey]: selfData[primaryKey] }),\n ),\n );\n }\n\n const connectOrCreate = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n },\n ] => Boolean(item[1].connectOrCreate),\n );\n\n let connected: number[];\n if (connectOrCreate.length) {\n connected = await Promise.all(\n connectOrCreate.flatMap(([selfData, { connectOrCreate }]) =>\n connectOrCreate.map((item) =>\n (\n t.where(item.where) as WhereResult<Query & { hasSelect: false }>\n )._update({\n [foreignKey]: selfData[primaryKey],\n }),\n ),\n ),\n );\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n const create = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n {\n create?: Record<string, unknown>[];\n connectOrCreate?: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n },\n ] => {\n if (item[1].connectOrCreate) {\n const length = item[1].connectOrCreate.length;\n connectedI += length;\n for (let i = length; i > 0; i--) {\n if (connected[connectedI - i] === 0) return true;\n }\n }\n return Boolean(item[1].create);\n },\n );\n\n connectedI = 0;\n if (create.length) {\n await t._createMany(\n create.flatMap(\n ([selfData, { create = [], connectOrCreate = [] }]) => {\n return [\n ...create.map((item) => ({\n [foreignKey]: selfData[primaryKey],\n ...item,\n })),\n ...connectOrCreate\n .filter(() => connected[connectedI++] === 0)\n .map((item) => ({\n [foreignKey]: selfData[primaryKey],\n ...item.create,\n })),\n ];\n },\n ) as CreateData<Query>[],\n );\n }\n }) as HasManyNestedInsert,\n nestedUpdate: (async (q, data, params) => {\n if ((params.set || params.create) && isQueryReturnsAll(q)) {\n const key = params.set ? 'set' : 'create';\n throw new Error(`\\`${key}\\` option is not allowed in a batch update`);\n }\n\n const t = query.transacting(q);\n if (params.create) {\n await t._count()._createMany(\n params.create.map((create) => ({\n ...create,\n [foreignKey]: data[0][primaryKey],\n })),\n );\n delete t.query[toSqlCacheKey];\n }\n\n if (params.disconnect || params.set) {\n await t\n .where<Query>(\n getWhereForNestedUpdate(\n data,\n params.disconnect,\n primaryKey,\n foreignKey,\n ),\n )\n ._update({ [foreignKey]: null });\n\n if (params.set) {\n delete t.query[toSqlCacheKey];\n await t\n .where<Query>(\n Array.isArray(params.set)\n ? {\n OR: params.set,\n }\n : params.set,\n )\n ._update({ [foreignKey]: data[0][primaryKey] });\n }\n }\n\n if (params.delete || params.update) {\n delete t.query[toSqlCacheKey];\n const q = t._where(\n getWhereForNestedUpdate(\n data,\n params.delete || params.update?.where,\n primaryKey,\n foreignKey,\n ),\n );\n\n if (params.delete) {\n await q._delete();\n } else if (params.update) {\n await q._update<WhereResult<Query>>(params.update.data);\n }\n }\n }) as HasManyNestedUpdate,\n joinQuery(fromQuery, toQuery) {\n return addQueryOn(toQuery, fromQuery, toQuery, foreignKey, primaryKey);\n },\n reverseJoin(fromQuery, toQuery) {\n return addQueryOn(fromQuery, toQuery, fromQuery, primaryKey, foreignKey);\n },\n primaryKey,\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const fromQuery = query.clone();\n fromQuery.query.select = fromQuerySelect;\n (relationQuery.query as InsertQueryData).fromQuery = fromQuery;\n };\n },\n };\n};\n\nconst getWhereForNestedUpdate = (\n data: Record<string, unknown>[],\n params: MaybeArray<WhereArg<QueryBase>> | undefined,\n primaryKey: string,\n foreignKey: string,\n) => {\n const where: WhereArg<Query> = {\n [foreignKey]: { in: data.map((item) => item[primaryKey]) },\n };\n if (params) {\n if (Array.isArray(params)) {\n where.OR = params;\n } else {\n Object.assign(where, params);\n }\n }\n return where;\n};\n","import { RelationData, RelationThunkBase } from './relations';\nimport { Model } from '../model';\nimport {\n getQueryAs,\n HasAndBelongsToManyRelation,\n HasManyNestedInsert,\n HasManyNestedUpdate,\n MaybeArray,\n NotFoundError,\n pushQueryValue,\n Query,\n QueryBase,\n toSqlCacheKey,\n WhereArg,\n WhereResult,\n} from 'pqb';\n\nexport interface HasAndBelongsToMany extends RelationThunkBase {\n type: 'hasAndBelongsToMany';\n returns: 'many';\n options: HasAndBelongsToManyRelation['options'];\n}\n\nexport type HasAndBelongsToManyInfo<\n T extends Model,\n Relation extends HasAndBelongsToMany,\n> = {\n params: Record<\n Relation['options']['primaryKey'],\n T['columns']['shape'][Relation['options']['primaryKey']]['type']\n >;\n populate: never;\n chainedCreate: true;\n chainedDelete: true;\n};\n\ntype State = {\n relatedTableQuery: Query;\n joinTableQuery: Query;\n primaryKey: string;\n foreignKey: string;\n associationPrimaryKey: string;\n associationForeignKey: string;\n};\n\nexport const makeHasAndBelongsToManyMethod = (\n model: Query,\n qb: Query,\n relation: HasAndBelongsToMany,\n query: Query,\n): RelationData => {\n const {\n primaryKey: pk,\n foreignKey: fk,\n associationPrimaryKey: apk,\n associationForeignKey: afk,\n joinTable,\n } = relation.options;\n\n const foreignKeyFull = `${joinTable}.${fk}`;\n const associationForeignKeyFull = `${joinTable}.${afk}`;\n const associationPrimaryKeyFull = `${getQueryAs(query)}.${apk}`;\n\n const __model = Object.create(qb.__model);\n __model.__model = __model;\n __model.table = joinTable;\n __model.shape = {\n [fk]: model.shape[pk],\n [afk]: query.shape[apk],\n };\n const subQuery = Object.create(__model);\n subQuery.query = { ...subQuery.query };\n\n const state: State = {\n relatedTableQuery: query,\n joinTableQuery: subQuery,\n primaryKey: pk,\n foreignKey: fk,\n associationPrimaryKey: apk,\n associationForeignKey: afk,\n };\n\n return {\n returns: 'many',\n method(params: Record<string, unknown>) {\n return query.whereExists(subQuery, (q) =>\n q.on(associationForeignKeyFull, associationPrimaryKeyFull).where({\n [foreignKeyFull]: params[pk],\n }),\n );\n },\n nestedInsert: (async (q, data) => {\n const connect = data.filter(\n (\n item,\n ): item is [\n selfData: Record<string, unknown>,\n relationData: {\n connect: WhereArg<QueryBase>[];\n },\n ] => Boolean(item[1].connect),\n );\n\n const t = query.transacting(q);\n\n let connected: Record<string, unknown>[];\n if (connect.length) {\n connected = (await Promise.all(\n connect.flatMap(([, { connect }]) =>\n connect.map((item) => t.select(apk)._findBy(item)._take()),\n ),\n )) as Record<string, unknown[]>[];\n } else {\n connected = [];\n }\n\n const connectOrCreate = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n },\n ] => Boolean(item[1].connectOrCreate),\n );\n\n let connectOrCreated: (Record<string, unknown> | undefined)[];\n if (connectOrCreate.length) {\n connectOrCreated = await Promise.all(\n connectOrCreate.flatMap(([, { connectOrCreate }]) =>\n connectOrCreate.map((item) =>\n t.select(apk)._findBy(item.where)._takeOptional(),\n ),\n ),\n );\n } else {\n connectOrCreated = [];\n }\n\n let connectOrCreateI = 0;\n const create = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n {\n create?: Record<string, unknown>[];\n connectOrCreate?: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n },\n ] => {\n if (item[1].connectOrCreate) {\n const length = item[1].connectOrCreate.length;\n connectOrCreateI += length;\n for (let i = length; i > 0; i--) {\n if (!connectOrCreated[connectOrCreateI - i]) return true;\n }\n }\n return Boolean(item[1].create);\n },\n );\n\n connectOrCreateI = 0;\n let created: Record<string, unknown>[];\n if (create.length) {\n created = (await t\n .select(apk)\n ._createMany(\n create.flatMap(([, { create = [], connectOrCreate = [] }]) => [\n ...create,\n ...connectOrCreate\n .filter(() => !connectOrCreated[connectOrCreateI++])\n .map((item) => item.create),\n ]),\n )) as Record<string, unknown>[];\n } else {\n created = [];\n }\n\n const allKeys = data as unknown as [\n selfData: Record<string, unknown>,\n relationKeys: Record<string, unknown>[],\n ][];\n\n let createI = 0;\n let connectI = 0;\n connectOrCreateI = 0;\n data.forEach(([, data], index) => {\n if (data.create || data.connectOrCreate) {\n if (data.create) {\n const len = data.create.length;\n allKeys[index][1] = created.slice(createI, createI + len);\n createI += len;\n }\n if (data.connectOrCreate) {\n const arr: Record<string, unknown>[] = [];\n allKeys[index][1] = arr;\n\n const len = data.connectOrCreate.length;\n for (let i = 0; i < len; i++) {\n const item = connectOrCreated[connectOrCreateI++];\n if (item) {\n arr.push(item);\n } else {\n arr.push(created[createI++]);\n }\n }\n }\n }\n\n if (data.connect) {\n const len = data.connect.length;\n allKeys[index][1] = connected.slice(connectI, connectI + len);\n connectI += len;\n }\n });\n\n await subQuery\n .transacting(q)\n ._count()\n ._createMany(\n allKeys.flatMap(([selfData, relationKeys]) => {\n const selfKey = selfData[pk];\n return relationKeys.map((relationData) => ({\n [fk]: selfKey,\n [afk]: relationData[apk],\n }));\n }),\n );\n }) as HasManyNestedInsert,\n nestedUpdate: (async (q, data, params) => {\n if (params.create) {\n const ids = await query\n .transacting(q)\n ._pluck(apk)\n ._createMany(params.create);\n\n await subQuery.transacting(q)._createMany(\n data.flatMap((item) =>\n ids.map((id) => ({\n [fk]: item[pk],\n [afk]: id,\n })),\n ),\n );\n }\n\n if (params.update) {\n await (\n query\n .transacting(q)\n ._whereExists(subQuery, (q) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (q as any)\n ._on(associationForeignKeyFull, associationPrimaryKeyFull)\n ._where({\n IN: {\n columns: [foreignKeyFull],\n values: [data.map((item) => item[pk])],\n },\n }),\n )\n ._where(\n Array.isArray(params.update.where)\n ? { OR: params.update.where }\n : params.update.where,\n ) as WhereResult<Query>\n )._update<WhereResult<Query>>(params.update.data);\n }\n\n if (params.disconnect) {\n await queryJoinTable(state, q, data, params.disconnect)._delete();\n }\n\n if (params.delete) {\n const j = queryJoinTable(state, q, data, params.delete);\n\n const ids = await j._pluck(afk)._delete();\n\n await queryRelatedTable(query, q, { [apk]: { in: ids } })._delete();\n }\n\n if (params.set) {\n const j = queryJoinTable(state, q, data);\n await j._delete();\n delete j.query[toSqlCacheKey];\n\n const ids = await queryRelatedTable(query, q, params.set)._pluck(apk);\n\n await insertToJoinTable(state, j, data, ids);\n }\n }) as HasManyNestedUpdate,\n // joinQuery can be a property of RelationQuery and be used by whereExists and other stuff which needs it\n // and the chained query itself may be a query around this joinQuery\n joinQuery(fromQuery, toQuery) {\n return toQuery.whereExists(subQuery, (q) =>\n q\n ._on(associationForeignKeyFull, `${getQueryAs(toQuery)}.${pk}`)\n ._on(foreignKeyFull, `${getQueryAs(fromQuery)}.${pk}`),\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return fromQuery.whereExists(subQuery, (q) =>\n q\n ._on(associationForeignKeyFull, `${getQueryAs(toQuery)}.${pk}`)\n ._on(foreignKeyFull, `${getQueryAs(fromQuery)}.${pk}`),\n );\n },\n primaryKey: pk,\n modifyRelatedQuery(relationQuery) {\n const ref = {} as { query: Query };\n\n pushQueryValue(\n relationQuery,\n 'afterCreate',\n async (q: Query, result: Record<string, unknown>) => {\n const fromQuery = ref.query.clone();\n fromQuery.query.select = [{ selectAs: { [fk]: pk } }];\n\n const createdCount = await subQuery\n .transacting(q)\n .count()\n ._createFrom(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fromQuery as any,\n {\n [afk]: result[apk],\n } as never,\n );\n\n if (createdCount === 0) {\n throw new NotFoundError();\n }\n },\n );\n\n return (q) => {\n ref.query = q;\n };\n },\n };\n};\n\nconst queryJoinTable = (\n state: State,\n q: Query,\n data: Record<string, unknown>[],\n conditions?: MaybeArray<WhereArg<Query>>,\n) => {\n const t = state.joinTableQuery.transacting(q);\n const where: WhereArg<Query> = {\n [state.foreignKey]: { in: data.map((item) => item[state.primaryKey]) },\n };\n\n if (conditions) {\n where[state.associationForeignKey] = {\n in: state.relatedTableQuery\n .where<Query>(\n Array.isArray(conditions) ? { OR: conditions } : conditions,\n )\n ._select(state.associationPrimaryKey),\n };\n }\n\n return t._where(where);\n};\n\nconst queryRelatedTable = (\n query: Query,\n q: Query,\n conditions: MaybeArray<WhereArg<Query>>,\n) => {\n return query\n .transacting(q)\n ._where<Query>(Array.isArray(conditions) ? { OR: conditions } : conditions);\n};\n\nconst insertToJoinTable = (\n state: State,\n joinTableTransaction: Query,\n data: Record<string, unknown>[],\n ids: unknown[],\n) => {\n return joinTableTransaction._count()._createMany(\n data.flatMap((item) =>\n ids.map((id) => ({\n [state.foreignKey]: item[state.primaryKey],\n [state.associationForeignKey]: id,\n })),\n ),\n );\n};\n","import { BelongsTo, BelongsToInfo, makeBelongsToMethod } from './belongsTo';\nimport { HasOne, HasOneInfo, makeHasOneMethod } from './hasOne';\nimport { DbModel, Model, ModelClass, ModelClasses } from '../model';\nimport { OrchidORM } from '../orm';\nimport {\n Query,\n QueryWithTable,\n RelationQuery,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsOneOptional,\n BaseRelation,\n defaultsKey,\n relationQueryKey,\n EmptyObject,\n} from 'pqb';\nimport { HasMany, HasManyInfo, makeHasManyMethod } from './hasMany';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyInfo,\n makeHasAndBelongsToManyMethod,\n} from './hasAndBelongsToMany';\nimport { getSourceRelation, getThroughRelation } from './utils';\n\nexport interface RelationThunkBase {\n type: string;\n returns: 'one' | 'many';\n fn(): ModelClass;\n options: BaseRelation['options'];\n}\n\nexport type RelationThunk = BelongsTo | HasOne | HasMany | HasAndBelongsToMany;\n\nexport type RelationThunks = Record<string, RelationThunk>;\n\nexport type RelationData = {\n returns: 'one' | 'many';\n method(params: Record<string, unknown>): Query;\n nestedInsert: BaseRelation['nestedInsert'];\n nestedUpdate: BaseRelation['nestedUpdate'];\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n reverseJoin(fromQuery: Query, toQuery: Query): Query;\n primaryKey: string;\n modifyRelatedQuery?(relatedQuery: Query): (query: Query) => void;\n};\n\nexport type Relation<\n T extends Model,\n Relations extends RelationThunks,\n K extends keyof Relations,\n M extends Query = DbModel<ReturnType<Relations[K]['fn']>>,\n Info extends RelationInfo = RelationInfo<T, Relations, Relations[K]>,\n> = {\n type: Relations[K]['type'];\n returns: Relations[K]['returns'];\n key: K;\n model: M;\n query: M;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n defaults: Info['populate'];\n nestedCreateQuery: [Info['populate']] extends [never]\n ? M\n : M & {\n [defaultsKey]: Record<Info['populate'], true>;\n };\n nestedInsert: BaseRelation['nestedInsert'];\n nestedUpdate: BaseRelation['nestedUpdate'];\n primaryKey: string;\n options: Relations[K]['options'];\n};\n\nexport type RelationScopeOrModel<Relation extends RelationThunkBase> =\n Relation['options']['scope'] extends (q: Query) => Query\n ? ReturnType<Relation['options']['scope']>\n : DbModel<ReturnType<Relation['fn']>>;\n\nexport type RelationInfo<\n T extends Model = Model,\n Relations extends RelationThunks = RelationThunks,\n Relation extends RelationThunk = RelationThunk,\n> = Relation extends BelongsTo\n ? BelongsToInfo<T, Relation>\n : Relation extends HasOne\n ? HasOneInfo<T, Relations, Relation>\n : Relation extends HasMany\n ? HasManyInfo<T, Relations, Relation>\n : Relation extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<T, Relation>\n : never;\n\nexport type MapRelation<\n T extends Model,\n Relations extends RelationThunks,\n RelationName extends keyof Relations,\n Relation extends RelationThunk = Relations[RelationName],\n RelatedQuery extends Query = RelationScopeOrModel<Relation>,\n Info extends {\n params: Record<string, unknown>;\n populate: string;\n chainedCreate: boolean;\n chainedDelete: boolean;\n } = RelationInfo<T, Relations, Relation>,\n> = RelationQuery<\n RelationName,\n Info['params'],\n Info['populate'],\n Relation['returns'] extends 'one'\n ? Relation['options']['required'] extends true\n ? SetQueryReturnsOne<RelatedQuery>\n : SetQueryReturnsOneOptional<RelatedQuery>\n : SetQueryReturnsAll<RelatedQuery>,\n Relation['options']['required'] extends boolean\n ? Relation['options']['required']\n : false,\n Info['chainedCreate'],\n Info['chainedDelete']\n>;\n\nexport type MapRelations<T extends Model> = 'relations' extends keyof T\n ? T['relations'] extends RelationThunks\n ? {\n [K in keyof T['relations']]: MapRelation<T, T['relations'], K>;\n }\n : EmptyObject\n : EmptyObject;\n\ntype ApplyRelationData = {\n relationName: string;\n relation: RelationThunk;\n dbModel: DbModel<ModelClass>;\n otherDbModel: DbModel<ModelClass>;\n};\n\ntype DelayedRelations = Map<Query, Record<string, ApplyRelationData[]>>;\n\nexport const applyRelations = (\n qb: Query,\n models: Record<string, Model>,\n result: OrchidORM<ModelClasses>,\n) => {\n const modelsEntries = Object.entries(models);\n\n const delayedRelations: DelayedRelations = new Map();\n\n for (const modelName in models) {\n const model = models[modelName] as Model & {\n relations?: RelationThunks;\n };\n if (!('relations' in model) || typeof model.relations !== 'object')\n continue;\n\n const dbModel = result[modelName];\n for (const relationName in model.relations) {\n const relation = model.relations[relationName];\n const otherModelClass = relation.fn();\n const otherModel = modelsEntries.find(\n (pair) => pair[1] instanceof otherModelClass,\n );\n if (!otherModel) {\n throw new Error(`Cannot find model for class ${otherModelClass.name}`);\n }\n const otherModelName = otherModel[0];\n const otherDbModel = result[otherModelName];\n if (!otherDbModel)\n throw new Error(`Cannot find model by name ${otherModelName}`);\n\n const data: ApplyRelationData = {\n relationName,\n relation,\n dbModel,\n otherDbModel,\n };\n\n const options = relation.options as { through?: string; source?: string };\n if (\n typeof options.through === 'string' &&\n typeof options.source === 'string'\n ) {\n const throughRelation = getThroughRelation(dbModel, options.through);\n if (!throughRelation) {\n delayRelation(delayedRelations, dbModel, options.through, data);\n continue;\n }\n\n const sourceRelation = getSourceRelation(\n throughRelation,\n options.source,\n );\n if (!sourceRelation) {\n delayRelation(\n delayedRelations,\n throughRelation.model,\n options.source,\n data,\n );\n continue;\n }\n }\n\n applyRelation(qb, data, delayedRelations);\n }\n }\n\n if (delayedRelations.size) {\n const { value } = delayedRelations.values().next() as {\n value: Record<string, ApplyRelationData[]>;\n };\n for (const key in value) {\n for (const item of value[key]) {\n const { relation } = item;\n\n if (item.dbModel.relations[item.relationName as never]) continue;\n\n const as = item.dbModel.definedAs;\n let message = `Cannot define a \\`${item.relationName}\\` relation on \\`${as}\\``;\n const model = result[as];\n\n const { through, source } = relation.options as {\n through: string;\n source: string;\n };\n const throughRel = model.relations[\n through as never\n ] as unknown as BaseRelation;\n\n if (through && !throughRel) {\n message += `: cannot find \\`${through}\\` relation required by the \\`through\\` option`;\n } else if (\n source &&\n throughRel &&\n !throughRel.model.relations[source as never]\n ) {\n message += `: cannot find \\`${source}\\` relation in \\`${\n (throughRel.model as DbModel<ModelClass>).definedAs\n }\\` required by the \\`source\\` option`;\n }\n\n throw new Error(message);\n }\n }\n }\n};\n\nconst delayRelation = (\n delayedRelations: DelayedRelations,\n model: Query,\n relationName: string,\n data: ApplyRelationData,\n) => {\n let modelRelations = delayedRelations.get(model);\n if (!modelRelations) {\n modelRelations = {};\n delayedRelations.set(model, modelRelations);\n }\n if (modelRelations[relationName]) {\n modelRelations[relationName].push(data);\n } else {\n modelRelations[relationName] = [data];\n }\n};\n\nconst applyRelation = (\n qb: Query,\n { relationName, relation, dbModel, otherDbModel }: ApplyRelationData,\n delayedRelations: DelayedRelations,\n) => {\n const query = (\n relation.options.scope\n ? relation.options.scope(otherDbModel)\n : (otherDbModel as unknown as QueryWithTable)\n ).as(relationName);\n\n const definedAs = (query as unknown as { definedAs?: string }).definedAs;\n if (!definedAs) {\n throw new Error(\n `Model for table ${query.table} is not attached to db instance`,\n );\n }\n\n const { type } = relation;\n let data;\n if (type === 'belongsTo') {\n data = makeBelongsToMethod(relation, query);\n } else if (type === 'hasOne') {\n data = makeHasOneMethod(dbModel, relation, relationName, query);\n } else if (type === 'hasMany') {\n data = makeHasManyMethod(dbModel, relation, relationName, query);\n } else if (type === 'hasAndBelongsToMany') {\n data = makeHasAndBelongsToManyMethod(dbModel, qb, relation, query);\n } else {\n throw new Error(`Unknown relation type ${type}`);\n }\n\n if (data.returns === 'one') {\n query._take();\n }\n\n makeRelationQuery(dbModel, definedAs, relationName, data);\n\n (dbModel.relations as Record<string, unknown>)[relationName] = {\n type,\n key: relationName,\n model: otherDbModel,\n query,\n nestedInsert: data.nestedInsert,\n nestedUpdate: data.nestedUpdate,\n joinQuery: data.joinQuery,\n primaryKey: data.primaryKey,\n options: relation.options,\n };\n\n const modelRelations = delayedRelations.get(dbModel);\n if (!modelRelations) return;\n\n modelRelations[relationName]?.forEach((data) => {\n applyRelation(qb, data, delayedRelations);\n });\n};\n\nconst makeRelationQuery = (\n model: Query,\n definedAs: string,\n relationName: string,\n data: RelationData,\n) => {\n Object.defineProperty(model, relationName, {\n get() {\n const toModel = this.db[definedAs].as(relationName) as Query;\n\n if (data.returns === 'one') {\n toModel._take();\n }\n\n const query = this.isSubQuery\n ? toModel\n : toModel._whereExists(data.reverseJoin(this, toModel), (q) => q);\n\n query.query[relationQueryKey] = {\n relationName,\n sourceQuery: this,\n relationQuery: toModel,\n joinQuery: data.joinQuery,\n };\n\n const setQuery = data.modifyRelatedQuery?.(query);\n setQuery?.(this);\n\n return new Proxy(data.method, {\n get(_, prop) {\n return (query as unknown as Record<string, unknown>)[prop as string];\n },\n }) as unknown as RelationQuery;\n },\n });\n};\n","import { Db } from 'pqb';\n\nexport function transaction<T extends { $queryBuilder: Db }, Result>(\n this: T,\n fn: (db: T) => Promise<Result>,\n): Promise<Result> {\n if (fn.length === 0) {\n throw new Error('Argument of $transaction callback should be used');\n }\n\n return this.$queryBuilder.transaction((q) => {\n const orm = {} as T;\n for (const key in this) {\n const value = this[key];\n if (value instanceof Db) {\n const model = value.transacting(q);\n model.__model = model;\n (model as unknown as { db: unknown }).db = orm;\n orm[key] = model;\n } else {\n orm[key] = value;\n }\n }\n\n return fn(orm);\n });\n}\n","import {\n Adapter,\n Db,\n AdapterOptions,\n QueryLogOptions,\n columnTypes,\n NoPrimaryKeyOption,\n anyShape,\n DbTableOptions,\n} from 'pqb';\nimport { DbModel, Model, ModelClasses } from './model';\nimport { applyRelations } from './relations/relations';\nimport { transaction } from './transaction';\n\nexport type OrchidORM<T extends ModelClasses> = {\n [K in keyof T]: DbModel<T[K]>;\n} & {\n $transaction: typeof transaction;\n $adapter: Adapter;\n $queryBuilder: Db;\n $close(): Promise<void>;\n};\n\nexport const orchidORM = <T extends ModelClasses>(\n {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey = 'error',\n ...options\n }: ({ adapter: Adapter } | Omit<AdapterOptions, 'log'>) &\n QueryLogOptions & {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n },\n models: T,\n): OrchidORM<T> => {\n const adapter = 'adapter' in options ? options.adapter : new Adapter(options);\n const commonOptions = {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey,\n };\n const qb = new Db(\n adapter,\n undefined as unknown as Db,\n undefined,\n anyShape,\n columnTypes,\n commonOptions,\n );\n qb.queryBuilder = qb as unknown as Db;\n\n const result = {\n $transaction: transaction,\n $adapter: adapter,\n $queryBuilder: qb,\n $close: () => adapter.close(),\n } as unknown as OrchidORM<ModelClasses>;\n\n const modelInstances: Record<string, Model> = {};\n\n for (const key in models) {\n if (key[0] === '$') {\n throw new Error(`Model name must not start with $`);\n }\n\n const model = new models[key]();\n modelInstances[key] = model;\n\n const options: DbTableOptions = {\n ...commonOptions,\n schema: model.schema,\n };\n\n if (model.noPrimaryKey) options.noPrimaryKey = 'ignore';\n\n const dbModel = new Db(\n adapter,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n qb as any,\n model.table,\n model.columns.shape,\n model.columnTypes,\n options,\n );\n\n (dbModel as unknown as { definedAs: string }).definedAs = key;\n (dbModel as unknown as { db: unknown }).db = result;\n\n (result as Record<string, unknown>)[key] = dbModel;\n }\n\n applyRelations(qb, modelInstances, result);\n\n return result as unknown as OrchidORM<T>;\n};\n","import {\n EmptyObject,\n getClonedQueryData,\n MergeQuery,\n Query,\n QueryReturnType,\n SetQueryReturns,\n WhereResult,\n} from 'pqb';\n\nexport type QueryMethods<T extends Query> = Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (q: T, ...args: any[]) => any\n>;\n\ntype QueryOne<T extends Query> = SetQueryReturns<\n T,\n Exclude<QueryReturnType, 'all'>\n>;\n\nexport type MethodsBase<T extends Query> = {\n queryMethods?: QueryMethods<T>;\n queryOneMethods?: QueryMethods<QueryOne<T>>;\n queryWithWhereMethods?: QueryMethods<WhereResult<T>>;\n queryOneWithWhereMethods?: QueryMethods<QueryOne<WhereResult<T>>>;\n methods?: Record<string, unknown>;\n};\n\nexport type MapQueryMethods<\n T extends Query,\n BaseQuery extends Query,\n Methods,\n> = Methods extends QueryMethods<T>\n ? {\n [K in keyof Methods]: Methods[K] extends (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n q: any,\n ...args: infer Args\n ) => // eslint-disable-next-line @typescript-eslint/no-explicit-any\n infer Result\n ? <T extends BaseQuery>(\n this: T,\n ...args: Args\n ) => Result extends Query ? MergeQuery<T, Result> : Result\n : never;\n }\n : EmptyObject;\n\nexport type MapMethods<\n T extends Query,\n Methods extends MethodsBase<T>,\n> = MapQueryMethods<T, Query, Methods['queryMethods']> &\n MapQueryMethods<QueryOne<T>, QueryOne<Query>, Methods['queryOneMethods']> &\n MapQueryMethods<\n WhereResult<T>,\n WhereResult<Query>,\n Methods['queryWithWhereMethods']\n > &\n MapQueryMethods<\n QueryOne<WhereResult<T>>,\n QueryOne<WhereResult<Query>>,\n Methods['queryOneWithWhereMethods']\n > &\n (Methods['methods'] extends Record<string, unknown>\n ? Methods['methods']\n : EmptyObject);\n\nexport type Repo<\n T extends Query,\n Methods extends MethodsBase<T>,\n Mapped = MapMethods<T, Methods>,\n> = (<Q extends { table: T['table']; shape: T['shape'] }>(q: Q) => Q & Mapped) &\n T &\n Mapped;\n\nexport const createRepo = <T extends Query, Methods extends MethodsBase<T>>(\n model: T,\n methods: Methods,\n): Repo<T, Methods> => {\n const queryMethods = {\n ...methods.queryMethods,\n ...methods.queryOneMethods,\n ...methods.queryWithWhereMethods,\n ...methods.queryOneWithWhereMethods,\n };\n\n const plainMethods = methods.methods;\n\n const repo = (q: Query) => {\n const proto = Object.create(q.__model);\n proto.__model = proto;\n const result = Object.create(proto);\n result.query = getClonedQueryData(q.query);\n\n if (plainMethods) {\n Object.assign(proto.__model, plainMethods);\n }\n\n for (const key in queryMethods) {\n const method = queryMethods[key] as (...args: unknown[]) => unknown;\n (proto.__model as unknown as Record<string, unknown>)[key] = function (\n ...args: unknown[]\n ) {\n return method(this, ...args);\n };\n }\n\n return result;\n };\n\n const q = repo(model);\n\n return new Proxy(repo, {\n get(_, key) {\n return q[key];\n },\n }) as unknown as Repo<T, Methods>;\n};\n"],"names":["options","q","id","data","__spreadValues","__spreadProps","query","connect","connectOrCreate","create"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/table.ts","../src/relations/belongsTo.ts","../src/relations/utils.ts","../src/relations/hasOne.ts","../src/relations/hasMany.ts","../src/relations/hasAndBelongsToMany.ts","../src/relations/relations.ts","../src/transaction.ts","../src/orm.ts","../src/repo.ts"],"sourcesContent":["import {\n ColumnShapeOutput,\n ColumnsShape,\n ColumnTypesBase,\n Db,\n getColumnTypes,\n Query,\n} from 'pqb';\nimport { MapRelations, Relation, RelationThunks } from './relations/relations';\nimport { OrchidORM } from './orm';\n\nexport type TableClass<T extends Table = Table> = new () => T;\n\nexport type TableClasses = Record<string, TableClass>;\n\nexport type TableToDb<T extends Table> = Db<\n T['table'],\n T['columns']['shape'],\n 'relations' extends keyof T\n ? T['relations'] extends RelationThunks\n ? {\n [K in keyof T['relations']]: Relation<T, T['relations'], K>;\n }\n : Query['relations']\n : Query['relations'],\n T['columnTypes']\n> & { definedAs: string; db: OrchidORM<TableClasses> };\n\nexport type DbTable<T extends TableClass> = TableToDb<InstanceType<T>> &\n Omit<MapRelations<InstanceType<T>>, keyof Query>;\n\ntype TableConfig = {\n shape: ColumnsShape;\n type: unknown;\n};\n\ntype ScopeFn<Related extends TableClass, Scope extends Query> = (\n q: DbTable<Related>,\n) => Scope;\n\nexport type Table = {\n table: string;\n columns: TableConfig;\n schema?: string;\n columnTypes: ColumnTypesBase;\n noPrimaryKey?: boolean;\n};\n\nexport const createBaseTable = <CT extends ColumnTypesBase>(options: {\n columnTypes: CT;\n}) => {\n return class BaseTable {\n table!: string;\n columns!: TableConfig;\n schema?: string;\n columnTypes: CT;\n noPrimaryKey?: boolean;\n\n constructor() {\n this.columnTypes = options.columnTypes;\n }\n\n setColumns = <T extends ColumnsShape>(\n fn: (t: CT) => T,\n ): { shape: T; type: ColumnShapeOutput<T> } => {\n const shape = getColumnTypes(options.columnTypes, fn);\n\n return {\n shape,\n type: undefined as unknown as ColumnShapeOutput<T>,\n };\n };\n\n belongsTo<\n Self extends this,\n Related extends TableClass,\n Scope extends Query,\n Options extends {\n primaryKey: keyof InstanceType<Related>['columns']['shape'];\n foreignKey: keyof Self['columns']['shape'];\n scope?: ScopeFn<Related, Scope>;\n required?: boolean;\n },\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'belongsTo' as const,\n returns: 'one' as const,\n fn,\n options,\n };\n }\n\n hasOne<\n Self extends this,\n Related extends TableClass,\n Scope extends Query,\n Through extends string,\n Source extends string,\n Options extends (\n | {\n primaryKey: keyof Self['columns']['shape'];\n foreignKey: keyof InstanceType<Related>['columns']['shape'];\n }\n | {\n through: Through;\n source: Source;\n }\n ) & {\n scope?: ScopeFn<Related, Scope>;\n required?: boolean;\n },\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasOne' as const,\n returns: 'one' as const,\n fn,\n options,\n };\n }\n\n hasMany<\n Self extends this,\n Related extends TableClass,\n Scope extends Query,\n Through extends string,\n Source extends string,\n Options extends (\n | {\n primaryKey: keyof Self['columns']['shape'];\n foreignKey: keyof InstanceType<Related>['columns']['shape'];\n }\n | {\n through: Through;\n source: Source;\n }\n ) & {\n scope?: ScopeFn<Related, Scope>;\n required?: boolean;\n },\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasMany' as const,\n returns: 'many' as const,\n fn,\n options,\n };\n }\n\n hasAndBelongsToMany<\n Self extends this,\n Related extends TableClass,\n Scope extends Query,\n Options extends {\n primaryKey: keyof Self['columns']['shape'];\n associationPrimaryKey: keyof InstanceType<Related>['columns']['shape'];\n foreignKey: string;\n associationForeignKey: string;\n joinTable: string;\n scope?: ScopeFn<Related, Scope>;\n required?: boolean;\n },\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasAndBelongsToMany' as const,\n returns: 'many' as const,\n fn,\n options,\n };\n }\n };\n};\n","import { Table } from '../table';\nimport {\n addQueryOn,\n BelongsToRelation,\n CreateCtx,\n InsertQueryData,\n isQueryReturnsAll,\n pushQueryValue,\n Query,\n QueryBase,\n UpdateCtx,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { RelationData, RelationThunkBase } from './relations';\nimport { NestedInsertOneItem, NestedUpdateOneItem } from './utils';\n\nexport interface BelongsTo extends RelationThunkBase {\n type: 'belongsTo';\n returns: 'one';\n options: BelongsToRelation['options'];\n}\n\nexport type BelongsToInfo<\n T extends Table,\n Relation extends BelongsTo,\n FK extends string = Relation['options']['foreignKey'],\n> = {\n params: Record<FK, T['columns']['shape'][FK]['type']>;\n populate: never;\n chainedCreate: false;\n chainedDelete: false;\n};\n\ntype State = {\n query: Query;\n primaryKey: string;\n foreignKey: string;\n};\n\ntype BelongsToNestedInsert = (\n query: Query,\n relationData: NestedInsertOneItem[],\n) => Promise<Record<string, unknown>[]>;\n\ntype BelongsToNestedUpdate = (\n q: Query,\n update: Record<string, unknown>,\n params: NestedUpdateOneItem,\n state: {\n updateLater?: Record<string, unknown>;\n updateLaterPromises?: Promise<void>[];\n },\n) => boolean;\n\nclass BelongsToVirtualColumn extends VirtualColumn {\n private readonly nestedInsert: BelongsToNestedInsert;\n private readonly nestedUpdate: BelongsToNestedUpdate;\n\n constructor(private key: string, private state: State) {\n super();\n this.nestedInsert = nestedInsert(this.state);\n this.nestedUpdate = nestedUpdate(this.state);\n }\n\n create(\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n ) {\n const {\n key,\n state: { foreignKey, primaryKey },\n } = this;\n\n let columnIndex = ctx.columns.get(foreignKey);\n if (columnIndex === undefined) {\n ctx.columns.set(foreignKey, (columnIndex = ctx.columns.size));\n }\n\n const store = ctx as unknown as {\n belongsTo?: Record<string, [number, number, unknown][]>;\n };\n\n if (!store.belongsTo) store.belongsTo = {};\n\n const values = [rowIndex, columnIndex, item[key]] as [\n number,\n number,\n unknown,\n ];\n\n if (store.belongsTo[key]) {\n store.belongsTo[key].push(values);\n return;\n }\n\n const relationData = [values];\n store.belongsTo[key] = relationData;\n q.query.wrapInTransaction = true;\n\n pushQueryValue(q, 'beforeCreate', async (q: Query) => {\n const inserted = await this.nestedInsert(\n q,\n relationData.map(([, , data]) => data as NestedInsertOneItem),\n );\n\n const { values } = q.query as InsertQueryData;\n relationData.forEach(([rowIndex, columnIndex], index) => {\n (values as unknown[][])[rowIndex][columnIndex] =\n inserted[index][primaryKey];\n });\n });\n }\n\n update(q: Query, ctx: UpdateCtx, set: Record<string, unknown>) {\n q.query.wrapInTransaction = true;\n\n const data = set[this.key] as NestedUpdateOneItem;\n if (this.nestedUpdate(q, set, data, ctx)) {\n ctx.willSetKeys = true;\n }\n }\n}\n\nexport const makeBelongsToMethod = (\n relation: BelongsTo,\n relationName: string,\n query: Query,\n): RelationData => {\n const { primaryKey, foreignKey } = relation.options;\n const state: State = { query, primaryKey, foreignKey };\n\n return {\n returns: 'one',\n method: (params: Record<string, unknown>) => {\n return query.findBy({ [primaryKey]: params[foreignKey] });\n },\n virtualColumn: new BelongsToVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return addQueryOn(toQuery, fromQuery, toQuery, primaryKey, foreignKey);\n },\n reverseJoin(fromQuery, toQuery) {\n return addQueryOn(fromQuery, toQuery, fromQuery, foreignKey, primaryKey);\n },\n primaryKey,\n };\n};\n\nconst nestedInsert = ({ query, primaryKey }: State) => {\n return (async (q, data) => {\n const connectOrCreate = data.filter(\n (\n item,\n ): item is {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n } => Boolean(item.connectOrCreate),\n );\n\n const t = query.transacting(q);\n\n let connectOrCreated: unknown[];\n if (connectOrCreate.length) {\n connectOrCreated = await Promise.all(\n connectOrCreate.map((item) =>\n t.findBy(item.connectOrCreate.where)._takeOptional(),\n ),\n );\n } else {\n connectOrCreated = [];\n }\n\n let connectOrCreatedI = 0;\n const create = data.filter(\n (\n item,\n ): item is\n | {\n create: Record<string, unknown>;\n }\n | {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n } => {\n if (item.connectOrCreate) {\n return !connectOrCreated[connectOrCreatedI++];\n } else {\n return Boolean(item.create);\n }\n },\n );\n\n let created: unknown[];\n if (create.length) {\n created = (await t\n .select(primaryKey)\n ._createMany(\n create.map((item) =>\n 'create' in item ? item.create : item.connectOrCreate.create,\n ),\n )) as unknown[];\n } else {\n created = [];\n }\n\n const connect = data.filter(\n (\n item,\n ): item is {\n connect: WhereArg<QueryBase>;\n } => Boolean(item.connect),\n );\n\n let connected: unknown[];\n if (connect.length) {\n connected = await Promise.all(\n connect.map((item) => t.findBy(item.connect)._take()),\n );\n } else {\n connected = [];\n }\n\n let createdI = 0;\n let connectedI = 0;\n connectOrCreatedI = 0;\n return data.map((item) =>\n item.connectOrCreate\n ? connectOrCreated[connectOrCreatedI++] || created[createdI++]\n : item.connect\n ? connected[connectedI++]\n : created[createdI++],\n ) as Record<string, unknown>[];\n }) as BelongsToNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKey, foreignKey }: State) => {\n return ((q, update, params, state) => {\n if (params.upsert && isQueryReturnsAll(q)) {\n throw new Error('`upsert` option is not allowed in a batch update');\n }\n\n let idForDelete: unknown;\n\n q._beforeUpdate(async (q) => {\n if (params.disconnect) {\n update[foreignKey] = null;\n } else if (params.set) {\n if (primaryKey in params.set) {\n update[foreignKey] =\n params.set[primaryKey as keyof typeof params.set];\n } else {\n update[foreignKey] = await query\n .transacting(q)\n ._findBy(params.set)\n ._get(primaryKey);\n }\n } else if (params.create) {\n update[foreignKey] = await query\n .transacting(q)\n ._get(primaryKey)\n ._create(params.create);\n } else if (params.delete) {\n const selectQuery = q.transacting(q);\n selectQuery.query.type = undefined;\n idForDelete = await selectQuery._getOptional(foreignKey);\n update[foreignKey] = null;\n }\n });\n\n const { upsert } = params;\n if (upsert || params.update || params.delete) {\n if (\n !q.query.select?.includes('*') &&\n !q.query.select?.includes(foreignKey)\n ) {\n q._select(foreignKey);\n }\n }\n\n if (upsert) {\n if (!state.updateLater) {\n state.updateLater = {};\n state.updateLaterPromises = [];\n }\n\n const { handleResult } = q.query;\n q.query.handleResult = async (q, queryResult) => {\n const data = (await handleResult(q, queryResult)) as Record<\n string,\n unknown\n >[];\n\n const id = data[0][foreignKey];\n if (id !== null) {\n await query\n .transacting(q)\n ._findBy({ [primaryKey]: id })\n ._update<WhereResult<Query>>(upsert.update);\n } else {\n (state.updateLaterPromises as Promise<void>[]).push(\n query\n .transacting(q)\n ._select(primaryKey)\n ._create(upsert.create)\n .then((result) => {\n (state.updateLater as Record<string, unknown>)[foreignKey] = (\n result as Record<string, unknown>\n )[primaryKey];\n }) as unknown as Promise<void>,\n );\n }\n\n return data;\n };\n } else if (params.delete || params.update) {\n q._afterQuery(async (q, data) => {\n const id = params.delete\n ? idForDelete\n : Array.isArray(data)\n ? data.length === 0\n ? null\n : {\n in: data\n .map((item) => item[foreignKey])\n .filter((id) => id !== null),\n }\n : (data as Record<string, unknown>)[foreignKey];\n\n if (id !== undefined && id !== null) {\n const t = query.transacting(q)._findBy({\n [primaryKey]: id,\n });\n\n if (params.delete) {\n await t._delete();\n } else if (params.update) {\n await t._update<WhereResult<Query>>(params.update);\n }\n }\n });\n }\n\n return !params.update && !params.upsert;\n }) as BelongsToNestedUpdate;\n};\n","import {\n CreateCtx,\n MaybeArray,\n pushQueryValue,\n Query,\n QueryBase,\n Relation,\n UpdateCtx,\n UpdateData,\n WhereArg,\n} from 'pqb';\nimport { HasOneNestedInsert, HasOneNestedUpdate } from './hasOne';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from './hasMany';\n\nexport type NestedInsertOneItem = {\n create?: Record<string, unknown>;\n connect?: WhereArg<QueryBase>;\n connectOrCreate?: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n};\n\nexport type NestedInsertManyItems = {\n create?: Record<string, unknown>[];\n connect?: WhereArg<QueryBase>[];\n connectOrCreate?: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n};\n\nexport type NestedInsertItem = NestedInsertOneItem | NestedInsertManyItems;\n\nexport type NestedUpdateOneItem = {\n disconnect?: boolean;\n set?: WhereArg<QueryBase>;\n delete?: boolean;\n update?: UpdateData<Query>;\n upsert?: {\n update: UpdateData<Query>;\n create: Record<string, unknown>;\n };\n create: Record<string, unknown>;\n};\n\nexport type NestedUpdateManyItems = {\n disconnect?: MaybeArray<WhereArg<QueryBase>>;\n set?: MaybeArray<WhereArg<QueryBase>>;\n delete?: MaybeArray<WhereArg<QueryBase>>;\n update?: {\n where: MaybeArray<WhereArg<QueryBase>>;\n data: UpdateData<Query>;\n };\n create: Record<string, unknown>[];\n};\n\nexport type NestedUpdateItem = NestedUpdateOneItem | NestedUpdateManyItems;\n\nexport const getThroughRelation = (table: Query, through: string) => {\n return (table.relations as Record<string, Relation>)[through];\n};\n\nexport const getSourceRelation = (\n throughRelation: Relation,\n source: string,\n) => {\n return (throughRelation.table.relations as Record<string, Relation>)[source];\n};\n\nexport const hasRelationHandleCreate = (\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n key: string,\n primaryKey: string,\n nestedInsert: HasOneNestedInsert | HasManyNestedInsert,\n) => {\n const value = item[key] as NestedInsertItem;\n if (\n (!value.create ||\n (Array.isArray(value.create) && value.create.length === 0)) &&\n (!value.connect ||\n (Array.isArray(value.connect) && value.connect.length === 0)) &&\n (!value.connectOrCreate ||\n (Array.isArray(value.connectOrCreate) &&\n value.connectOrCreate.length === 0))\n )\n return;\n\n const store = ctx as unknown as {\n hasRelation?: Record<string, [number, NestedInsertItem][]>;\n };\n\n if (!store.hasRelation) store.hasRelation = {};\n\n const values = [rowIndex, value] as [number, NestedInsertItem];\n\n if (store.hasRelation[key]) {\n store.hasRelation[key].push(values);\n return;\n }\n\n q.query.wrapInTransaction = true;\n ctx.returnTypeAll = true;\n ctx.requiredReturning[primaryKey] = true;\n\n const relationData = [values];\n store.hasRelation[key] = relationData;\n\n pushQueryValue(q, 'afterCreate', async (q: Query) => {\n const { resultAll } = ctx;\n return (nestedInsert as HasOneNestedInsert)(\n q,\n relationData.map(([rowIndex, data]) => [\n resultAll[rowIndex],\n data as NestedInsertOneItem,\n ]),\n );\n });\n};\n\nexport const hasRelationHandleUpdate = (\n q: Query,\n ctx: UpdateCtx,\n set: Record<string, unknown>,\n key: string,\n primaryKey: string,\n nestedUpdate: HasOneNestedUpdate | HasManyNestedUpdate,\n) => {\n const value = set[key] as NestedUpdateItem;\n\n if (\n !value.set &&\n !('upsert' in value) &&\n (!value.disconnect ||\n (Array.isArray(value.disconnect) && value.disconnect.length === 0)) &&\n (!value.delete ||\n (Array.isArray(value.delete) && value.delete.length === 0)) &&\n (!value.update ||\n (Array.isArray(value.update.where) && value.update.where.length === 0)) &&\n (!value.create ||\n (Array.isArray(value.create) && value.create.length === 0))\n )\n return;\n\n if (!q.query.select?.includes('*') && !q.query.select?.includes(primaryKey)) {\n q._select(primaryKey);\n }\n\n q.query.wrapInTransaction = true;\n ctx.returnTypeAll = true;\n\n pushQueryValue(q, 'afterUpdate', (q: Query) => {\n return (nestedUpdate as HasOneNestedUpdate)(\n q,\n ctx.resultAll,\n value as NestedUpdateOneItem,\n );\n });\n};\n","import {\n addQueryOn,\n CreateCtx,\n getQueryAs,\n HasOneRelation,\n InsertQueryData,\n isQueryReturnsAll,\n JoinCallback,\n Query,\n QueryBase,\n UpdateCtx,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { Table } from '../table';\nimport {\n RelationData,\n RelationInfo,\n RelationThunkBase,\n RelationThunks,\n} from './relations';\nimport {\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n NestedInsertOneItem,\n NestedUpdateOneItem,\n} from './utils';\n\nexport interface HasOne extends RelationThunkBase {\n type: 'hasOne';\n returns: 'one';\n options: HasOneRelation['options'];\n}\n\nexport type HasOneInfo<\n T extends Table,\n Relations extends RelationThunks,\n Relation extends HasOne,\n> = {\n params: Relation['options'] extends { primaryKey: string }\n ? Record<\n Relation['options']['primaryKey'],\n T['columns']['shape'][Relation['options']['primaryKey']]['type']\n >\n : Relation['options'] extends { through: string }\n ? RelationInfo<\n T,\n Relations,\n Relations[Relation['options']['through']]\n >['params']\n : never;\n populate: Relation['options'] extends { foreignKey: string }\n ? Relation['options']['foreignKey']\n : never;\n chainedCreate: Relation['options'] extends { primaryKey: string }\n ? true\n : false;\n chainedDelete: true;\n};\n\ntype State = {\n query: Query;\n primaryKey: string;\n foreignKey: string;\n};\n\nexport type HasOneNestedInsert = (\n query: Query,\n data: [\n selfData: Record<string, unknown>,\n relationData: NestedInsertOneItem,\n ][],\n) => Promise<void>;\n\nexport type HasOneNestedUpdate = (\n query: Query,\n data: Record<string, unknown>[],\n relationData: NestedUpdateOneItem,\n) => Promise<void>;\n\nclass HasOneVirtualColumn extends VirtualColumn {\n private readonly nestedInsert: HasOneNestedInsert;\n private readonly nestedUpdate: HasOneNestedUpdate;\n\n constructor(private key: string, private state: State) {\n super();\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n ) {\n hasRelationHandleCreate(\n q,\n ctx,\n item,\n rowIndex,\n this.key,\n this.state.primaryKey,\n this.nestedInsert,\n );\n }\n\n update(q: Query, ctx: UpdateCtx, set: Record<string, unknown>) {\n hasRelationHandleUpdate(\n q,\n ctx,\n set,\n this.key,\n this.state.primaryKey,\n this.nestedUpdate,\n );\n }\n}\n\nexport const makeHasOneMethod = (\n table: Query,\n relation: HasOne,\n relationName: string,\n query: Query,\n): RelationData => {\n if (relation.options.required) {\n query._take();\n } else {\n query._takeOptional();\n }\n\n if ('through' in relation.options) {\n const { through, source } = relation.options;\n\n type TableWithQueryMethod = Record<\n string,\n (params: Record<string, unknown>) => Query\n >;\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceQuery = sourceRelation\n .joinQuery(throughRelation.query, sourceRelation.query)\n .as(relationName);\n\n const whereExistsCallback = () => sourceQuery;\n\n return {\n returns: 'one',\n method: (params: Record<string, unknown>) => {\n const throughQuery = (table as unknown as TableWithQueryMethod)[\n through\n ](params);\n\n return query.whereExists<Query, Query>(\n throughQuery,\n whereExistsCallback as unknown as JoinCallback<Query, Query>,\n );\n },\n joinQuery(fromQuery, toQuery) {\n return toQuery.whereExists<Query, Query>(\n throughRelation.joinQuery(fromQuery, throughRelation.query),\n (() => {\n const as = getQueryAs(toQuery);\n return sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelation.query.as(as),\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return fromQuery.whereExists<Query, Query>(\n throughRelation.joinQuery(fromQuery, throughRelation.query),\n (() => {\n const as = getQueryAs(toQuery);\n return sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelation.query.as(as),\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n },\n primaryKey: sourceRelation.primaryKey,\n };\n }\n\n const { primaryKey, foreignKey } = relation.options;\n const state: State = { query, primaryKey, foreignKey };\n\n const fromQuerySelect = [{ selectAs: { [foreignKey]: primaryKey } }];\n\n return {\n returns: 'one',\n method: (params: Record<string, unknown>) => {\n const values = { [foreignKey]: params[primaryKey] };\n return query.where(values)._defaults(values);\n },\n virtualColumn: new HasOneVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return addQueryOn(toQuery, fromQuery, toQuery, foreignKey, primaryKey);\n },\n reverseJoin(fromQuery, toQuery) {\n return addQueryOn(fromQuery, toQuery, fromQuery, primaryKey, foreignKey);\n },\n primaryKey,\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const fromQuery = query.clone();\n fromQuery.query.select = fromQuerySelect;\n (relationQuery.query as InsertQueryData).fromQuery = fromQuery;\n };\n },\n };\n};\n\nconst nestedInsert = ({ query, primaryKey, foreignKey }: State) => {\n return (async (q, data) => {\n const connect = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n (\n | {\n connect: WhereArg<QueryBase>;\n }\n | {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n }\n ),\n ] => Boolean(item[1].connect || item[1].connectOrCreate),\n );\n\n const t = query.transacting(q);\n\n let connected: number[];\n if (connect.length) {\n connected = await Promise.all(\n connect.map(([selfData, item]) => {\n const data = { [foreignKey]: selfData[primaryKey] };\n return 'connect' in item\n ? (\n t.where(item.connect) as WhereResult<Query> & {\n hasSelect: false;\n }\n )._updateOrThrow(data)\n : (\n t.where(item.connectOrCreate.where) as WhereResult<Query> & {\n hasSelect: false;\n }\n )._update(data);\n }),\n );\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n const create = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n (\n | { create: Record<string, unknown> }\n | {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n };\n }\n ),\n ] => {\n if (item[1].connectOrCreate) {\n return !connected[connectedI++];\n }\n return Boolean(item[1].create);\n },\n );\n\n if (create.length) {\n await t._count()._createMany(\n create.map(([selfData, item]) => ({\n [foreignKey]: selfData[primaryKey],\n ...('create' in item ? item.create : item.connectOrCreate.create),\n })),\n );\n }\n }) as HasOneNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKey, foreignKey }: State) => {\n return (async (q, data, params) => {\n if (\n (params.set || params.create || params.upsert) &&\n isQueryReturnsAll(q)\n ) {\n const key = params.set ? 'set' : params.create ? 'create' : 'upsert';\n throw new Error(`\\`${key}\\` option is not allowed in a batch update`);\n }\n\n const t = query.transacting(q);\n const ids = data.map((item) => item[primaryKey]);\n const currentRelationsQuery = t.where({\n [foreignKey]: { in: ids },\n });\n\n if (params.create || params.disconnect || params.set) {\n await currentRelationsQuery._update({ [foreignKey]: null });\n\n if (params.create) {\n await t._count()._create({\n ...params.create,\n [foreignKey]: data[0][primaryKey],\n });\n }\n if (params.set) {\n await t\n ._where<Query>(params.set)\n ._update({ [foreignKey]: data[0][primaryKey] });\n }\n } else if (params.update) {\n await currentRelationsQuery._update<WhereResult<Query>>(params.update);\n } else if (params.delete) {\n await currentRelationsQuery._delete();\n } else if (params.upsert) {\n const { update, create } = params.upsert;\n const updatedIds: unknown[] = await currentRelationsQuery\n ._pluck(foreignKey)\n ._update<WhereResult<Query & { hasSelect: true }>>(update);\n\n if (updatedIds.length < ids.length) {\n await t.createMany(\n ids\n .filter((id) => !updatedIds.includes(id))\n .map((id) => ({\n ...create,\n [foreignKey]: id,\n })),\n );\n }\n }\n }) as HasOneNestedUpdate;\n};\n","import {\n RelationData,\n RelationInfo,\n RelationThunkBase,\n RelationThunks,\n} from './relations';\nimport { Table } from '../table';\nimport {\n addQueryOn,\n getQueryAs,\n HasManyRelation,\n CreateData,\n JoinCallback,\n MaybeArray,\n Query,\n QueryBase,\n toSqlCacheKey,\n WhereArg,\n WhereResult,\n InsertQueryData,\n isQueryReturnsAll,\n VirtualColumn,\n CreateCtx,\n UpdateCtx,\n} from 'pqb';\nimport {\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n NestedInsertManyItems,\n NestedUpdateManyItems,\n} from './utils';\n\nexport interface HasMany extends RelationThunkBase {\n type: 'hasMany';\n returns: 'many';\n options: HasManyRelation['options'];\n}\n\nexport type HasManyInfo<\n T extends Table,\n Relations extends RelationThunks,\n Relation extends HasMany,\n> = {\n params: Relation['options'] extends { primaryKey: string }\n ? Record<\n Relation['options']['primaryKey'],\n T['columns']['shape'][Relation['options']['primaryKey']]['type']\n >\n : Relation['options'] extends { through: string }\n ? RelationInfo<\n T,\n Relations,\n Relations[Relation['options']['through']]\n >['params']\n : never;\n populate: Relation['options'] extends { foreignKey: string }\n ? Relation['options']['foreignKey']\n : never;\n chainedCreate: Relation['options'] extends { primaryKey: string }\n ? true\n : false;\n chainedDelete: true;\n};\n\ntype State = {\n query: Query;\n primaryKey: string;\n foreignKey: string;\n};\n\nexport type HasManyNestedUpdate = (\n query: Query,\n data: Record<string, unknown>[],\n relationData: NestedUpdateManyItems,\n) => Promise<void>;\n\nexport type HasManyNestedInsert = (\n query: Query,\n data: [\n selfData: Record<string, unknown>,\n relationData: NestedInsertManyItems,\n ][],\n) => Promise<void>;\n\nclass HasManyVirtualColumn extends VirtualColumn {\n private readonly nestedInsert: HasManyNestedInsert;\n private readonly nestedUpdate: HasManyNestedUpdate;\n\n constructor(private key: string, private state: State) {\n super();\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n ) {\n hasRelationHandleCreate(\n q,\n ctx,\n item,\n rowIndex,\n this.key,\n this.state.primaryKey,\n this.nestedInsert,\n );\n }\n\n update(q: Query, ctx: UpdateCtx, set: Record<string, unknown>) {\n hasRelationHandleUpdate(\n q,\n ctx,\n set,\n this.key,\n this.state.primaryKey,\n this.nestedUpdate,\n );\n }\n}\n\nexport const makeHasManyMethod = (\n table: Query,\n relation: HasMany,\n relationName: string,\n query: Query,\n): RelationData => {\n if ('through' in relation.options) {\n const { through, source } = relation.options;\n\n type TableWithQueryMethod = Record<\n string,\n (params: Record<string, unknown>) => Query\n >;\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = sourceRelation.query.as(relationName);\n const sourceQuery = sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelationQuery,\n );\n\n const whereExistsCallback = () => sourceQuery;\n\n return {\n returns: 'many',\n method: (params: Record<string, unknown>) => {\n const throughQuery = (table as unknown as TableWithQueryMethod)[\n through\n ](params);\n\n return query.whereExists<Query, Query>(\n throughQuery,\n whereExistsCallback as unknown as JoinCallback<Query, Query>,\n );\n },\n joinQuery(fromQuery, toQuery) {\n return toQuery.whereExists<Query, Query>(\n throughRelation.joinQuery(fromQuery, throughRelation.query),\n (() => {\n const as = getQueryAs(toQuery);\n return sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelation.query.as(as),\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return fromQuery.whereExists<Query, Query>(\n throughRelation.joinQuery(fromQuery, throughRelation.query),\n (() => {\n const as = getQueryAs(toQuery);\n return sourceRelation.joinQuery(\n throughRelation.query,\n sourceRelation.query.as(as),\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n },\n primaryKey: sourceRelation.primaryKey,\n };\n }\n\n const { primaryKey, foreignKey } = relation.options;\n const state: State = { query, primaryKey, foreignKey };\n\n const fromQuerySelect = [{ selectAs: { [foreignKey]: primaryKey } }];\n\n return {\n returns: 'many',\n method: (params: Record<string, unknown>) => {\n const values = { [foreignKey]: params[primaryKey] };\n return query.where(values)._defaults(values);\n },\n virtualColumn: new HasManyVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return addQueryOn(toQuery, fromQuery, toQuery, foreignKey, primaryKey);\n },\n reverseJoin(fromQuery, toQuery) {\n return addQueryOn(fromQuery, toQuery, fromQuery, primaryKey, foreignKey);\n },\n primaryKey,\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const fromQuery = query.clone();\n fromQuery.query.select = fromQuerySelect;\n (relationQuery.query as InsertQueryData).fromQuery = fromQuery;\n };\n },\n };\n};\n\nconst getWhereForNestedUpdate = (\n data: Record<string, unknown>[],\n params: MaybeArray<WhereArg<QueryBase>> | undefined,\n primaryKey: string,\n foreignKey: string,\n) => {\n const where: WhereArg<Query> = {\n [foreignKey]: { in: data.map((item) => item[primaryKey]) },\n };\n if (params) {\n if (Array.isArray(params)) {\n where.OR = params;\n } else {\n Object.assign(where, params);\n }\n }\n return where;\n};\n\nconst nestedInsert = ({ query, primaryKey, foreignKey }: State) => {\n return (async (q, data) => {\n const connect = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n { connect: WhereArg<QueryBase>[] },\n ] => Boolean(item[1].connect),\n );\n\n const t = query.transacting(q);\n\n if (connect.length) {\n await Promise.all(\n connect.flatMap(([selfData, { connect }]) =>\n t\n .or<Query>(...connect)\n ._updateOrThrow({ [foreignKey]: selfData[primaryKey] }),\n ),\n );\n }\n\n const connectOrCreate = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n },\n ] => Boolean(item[1].connectOrCreate),\n );\n\n let connected: number[];\n if (connectOrCreate.length) {\n connected = await Promise.all(\n connectOrCreate.flatMap(([selfData, { connectOrCreate }]) =>\n connectOrCreate.map((item) =>\n (\n t.where(item.where) as WhereResult<Query & { hasSelect: false }>\n )._update({\n [foreignKey]: selfData[primaryKey],\n }),\n ),\n ),\n );\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n const create = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n {\n create?: Record<string, unknown>[];\n connectOrCreate?: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n },\n ] => {\n if (item[1].connectOrCreate) {\n const length = item[1].connectOrCreate.length;\n connectedI += length;\n for (let i = length; i > 0; i--) {\n if (connected[connectedI - i] === 0) return true;\n }\n }\n return Boolean(item[1].create);\n },\n );\n\n connectedI = 0;\n if (create.length) {\n await t._createMany(\n create.flatMap(([selfData, { create = [], connectOrCreate = [] }]) => {\n return [\n ...create.map((item) => ({\n [foreignKey]: selfData[primaryKey],\n ...item,\n })),\n ...connectOrCreate\n .filter(() => connected[connectedI++] === 0)\n .map((item) => ({\n [foreignKey]: selfData[primaryKey],\n ...item.create,\n })),\n ];\n }) as CreateData<Query>[],\n );\n }\n }) as HasManyNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKey, foreignKey }: State) => {\n return (async (q, data, params) => {\n if ((params.set || params.create) && isQueryReturnsAll(q)) {\n const key = params.set ? 'set' : 'create';\n throw new Error(`\\`${key}\\` option is not allowed in a batch update`);\n }\n\n const t = query.transacting(q);\n if (params.create) {\n await t._count()._createMany(\n params.create.map((create) => ({\n ...create,\n [foreignKey]: data[0][primaryKey],\n })),\n );\n delete t.query[toSqlCacheKey];\n }\n\n if (params.disconnect || params.set) {\n await t\n .where<Query>(\n getWhereForNestedUpdate(\n data,\n params.disconnect,\n primaryKey,\n foreignKey,\n ),\n )\n ._update({ [foreignKey]: null });\n\n if (params.set) {\n delete t.query[toSqlCacheKey];\n await t\n .where<Query>(\n Array.isArray(params.set)\n ? {\n OR: params.set,\n }\n : params.set,\n )\n ._update({ [foreignKey]: data[0][primaryKey] });\n }\n }\n\n if (params.delete || params.update) {\n delete t.query[toSqlCacheKey];\n const q = t._where(\n getWhereForNestedUpdate(\n data,\n params.delete || params.update?.where,\n primaryKey,\n foreignKey,\n ),\n );\n\n if (params.delete) {\n await q._delete();\n } else if (params.update) {\n await q._update<WhereResult<Query>>(params.update.data);\n }\n }\n }) as HasManyNestedUpdate;\n};\n","import { RelationData, RelationThunkBase } from './relations';\nimport { Table } from '../table';\nimport {\n CreateCtx,\n getQueryAs,\n HasAndBelongsToManyRelation,\n MaybeArray,\n NotFoundError,\n pushQueryValue,\n Query,\n QueryBase,\n toSqlCacheKey,\n UpdateCtx,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { hasRelationHandleCreate, hasRelationHandleUpdate } from './utils';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from './hasMany';\n\nexport interface HasAndBelongsToMany extends RelationThunkBase {\n type: 'hasAndBelongsToMany';\n returns: 'many';\n options: HasAndBelongsToManyRelation['options'];\n}\n\nexport type HasAndBelongsToManyInfo<\n T extends Table,\n Relation extends HasAndBelongsToMany,\n> = {\n params: Record<\n Relation['options']['primaryKey'],\n T['columns']['shape'][Relation['options']['primaryKey']]['type']\n >;\n populate: never;\n chainedCreate: true;\n chainedDelete: true;\n};\n\ntype State = {\n relatedTableQuery: Query;\n joinTableQuery: Query;\n primaryKey: string;\n foreignKey: string;\n associationPrimaryKey: string;\n associationForeignKey: string;\n foreignKeyFull: string;\n associationPrimaryKeyFull: string;\n associationForeignKeyFull: string;\n};\n\nclass HasAndBelongsToManyVirtualColumn extends VirtualColumn {\n private readonly nestedInsert: HasManyNestedInsert;\n private readonly nestedUpdate: HasManyNestedUpdate;\n\n constructor(private key: string, private state: State) {\n super();\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n ) {\n hasRelationHandleCreate(\n q,\n ctx,\n item,\n rowIndex,\n this.key,\n this.state.primaryKey,\n this.nestedInsert,\n );\n }\n\n update(q: Query, ctx: UpdateCtx, set: Record<string, unknown>) {\n hasRelationHandleUpdate(\n q,\n ctx,\n set,\n this.key,\n this.state.primaryKey,\n this.nestedUpdate,\n );\n }\n}\n\nexport const makeHasAndBelongsToManyMethod = (\n table: Query,\n qb: Query,\n relation: HasAndBelongsToMany,\n relationName: string,\n query: Query,\n): RelationData => {\n const {\n primaryKey: pk,\n foreignKey: fk,\n associationPrimaryKey: apk,\n associationForeignKey: afk,\n joinTable,\n } = relation.options;\n\n const foreignKeyFull = `${joinTable}.${fk}`;\n const associationForeignKeyFull = `${joinTable}.${afk}`;\n const associationPrimaryKeyFull = `${getQueryAs(query)}.${apk}`;\n\n const __table = Object.create(qb.__table);\n __table.__table = __table;\n __table.table = joinTable;\n __table.shape = {\n [fk]: table.shape[pk],\n [afk]: query.shape[apk],\n };\n const subQuery = Object.create(__table);\n subQuery.query = { ...subQuery.query };\n\n const state: State = {\n relatedTableQuery: query,\n joinTableQuery: subQuery,\n primaryKey: pk,\n foreignKey: fk,\n associationPrimaryKey: apk,\n associationForeignKey: afk,\n foreignKeyFull,\n associationForeignKeyFull,\n associationPrimaryKeyFull,\n };\n\n return {\n returns: 'many',\n method(params: Record<string, unknown>) {\n return query.whereExists(subQuery, (q) =>\n q.on(associationForeignKeyFull, associationPrimaryKeyFull).where({\n [foreignKeyFull]: params[pk],\n }),\n );\n },\n virtualColumn: new HasAndBelongsToManyVirtualColumn(relationName, state),\n // joinQuery can be a property of RelationQuery and be used by whereExists and other stuff which needs it\n // and the chained query itself may be a query around this joinQuery\n joinQuery(fromQuery, toQuery) {\n return toQuery.whereExists(subQuery, (q) =>\n q\n ._on(associationForeignKeyFull, `${getQueryAs(toQuery)}.${pk}`)\n ._on(foreignKeyFull, `${getQueryAs(fromQuery)}.${pk}`),\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return fromQuery.whereExists(subQuery, (q) =>\n q\n ._on(associationForeignKeyFull, `${getQueryAs(toQuery)}.${pk}`)\n ._on(foreignKeyFull, `${getQueryAs(fromQuery)}.${pk}`),\n );\n },\n primaryKey: pk,\n modifyRelatedQuery(relationQuery) {\n const ref = {} as { query: Query };\n\n pushQueryValue(\n relationQuery,\n 'afterCreate',\n async (q: Query, result: Record<string, unknown>) => {\n const fromQuery = ref.query.clone();\n fromQuery.query.select = [{ selectAs: { [fk]: pk } }];\n\n const createdCount = await subQuery\n .transacting(q)\n .count()\n ._createFrom(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fromQuery as any,\n {\n [afk]: result[apk],\n } as never,\n );\n\n if (createdCount === 0) {\n throw new NotFoundError();\n }\n },\n );\n\n return (q) => {\n ref.query = q;\n };\n },\n };\n};\n\nconst queryJoinTable = (\n state: State,\n q: Query,\n data: Record<string, unknown>[],\n conditions?: MaybeArray<WhereArg<Query>>,\n) => {\n const t = state.joinTableQuery.transacting(q);\n const where: WhereArg<Query> = {\n [state.foreignKey]: { in: data.map((item) => item[state.primaryKey]) },\n };\n\n if (conditions) {\n where[state.associationForeignKey] = {\n in: state.relatedTableQuery\n .where<Query>(\n Array.isArray(conditions) ? { OR: conditions } : conditions,\n )\n ._select(state.associationPrimaryKey),\n };\n }\n\n return t._where(where);\n};\n\nconst queryRelatedTable = (\n query: Query,\n q: Query,\n conditions: MaybeArray<WhereArg<Query>>,\n) => {\n return query\n .transacting(q)\n ._where<Query>(Array.isArray(conditions) ? { OR: conditions } : conditions);\n};\n\nconst insertToJoinTable = (\n state: State,\n joinTableTransaction: Query,\n data: Record<string, unknown>[],\n ids: unknown[],\n) => {\n return joinTableTransaction._count()._createMany(\n data.flatMap((item) =>\n ids.map((id) => ({\n [state.foreignKey]: item[state.primaryKey],\n [state.associationForeignKey]: id,\n })),\n ),\n );\n};\n\nconst nestedInsert = ({\n relatedTableQuery,\n joinTableQuery,\n primaryKey,\n foreignKey,\n associationPrimaryKey,\n associationForeignKey,\n}: State) => {\n return (async (q, data) => {\n const connect = data.filter(\n (\n item,\n ): item is [\n selfData: Record<string, unknown>,\n relationData: {\n connect: WhereArg<QueryBase>[];\n },\n ] => Boolean(item[1].connect),\n );\n\n const t = relatedTableQuery.transacting(q);\n\n let connected: Record<string, unknown>[];\n if (connect.length) {\n connected = (await Promise.all(\n connect.flatMap(([, { connect }]) =>\n connect.map((item) =>\n t.select(associationPrimaryKey)._findBy(item)._take(),\n ),\n ),\n )) as Record<string, unknown[]>[];\n } else {\n connected = [];\n }\n\n const connectOrCreate = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n {\n connectOrCreate: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n },\n ] => Boolean(item[1].connectOrCreate),\n );\n\n let connectOrCreated: (Record<string, unknown> | undefined)[];\n if (connectOrCreate.length) {\n connectOrCreated = await Promise.all(\n connectOrCreate.flatMap(([, { connectOrCreate }]) =>\n connectOrCreate.map((item) =>\n t.select(associationPrimaryKey)._findBy(item.where)._takeOptional(),\n ),\n ),\n );\n } else {\n connectOrCreated = [];\n }\n\n let connectOrCreateI = 0;\n const create = data.filter(\n (\n item,\n ): item is [\n Record<string, unknown>,\n {\n create?: Record<string, unknown>[];\n connectOrCreate?: {\n where: WhereArg<QueryBase>;\n create: Record<string, unknown>;\n }[];\n },\n ] => {\n if (item[1].connectOrCreate) {\n const length = item[1].connectOrCreate.length;\n connectOrCreateI += length;\n for (let i = length; i > 0; i--) {\n if (!connectOrCreated[connectOrCreateI - i]) return true;\n }\n }\n return Boolean(item[1].create);\n },\n );\n\n connectOrCreateI = 0;\n let created: Record<string, unknown>[];\n if (create.length) {\n created = (await t\n .select(associationPrimaryKey)\n ._createMany(\n create.flatMap(([, { create = [], connectOrCreate = [] }]) => [\n ...create,\n ...connectOrCreate\n .filter(() => !connectOrCreated[connectOrCreateI++])\n .map((item) => item.create),\n ]),\n )) as Record<string, unknown>[];\n } else {\n created = [];\n }\n\n const allKeys = data as unknown as [\n selfData: Record<string, unknown>,\n relationKeys: Record<string, unknown>[],\n ][];\n\n let createI = 0;\n let connectI = 0;\n connectOrCreateI = 0;\n data.forEach(([, data], index) => {\n if (data.create || data.connectOrCreate) {\n if (data.create) {\n const len = data.create.length;\n allKeys[index][1] = created.slice(createI, createI + len);\n createI += len;\n }\n if (data.connectOrCreate) {\n const arr: Record<string, unknown>[] = [];\n allKeys[index][1] = arr;\n\n const len = data.connectOrCreate.length;\n for (let i = 0; i < len; i++) {\n const item = connectOrCreated[connectOrCreateI++];\n if (item) {\n arr.push(item);\n } else {\n arr.push(created[createI++]);\n }\n }\n }\n }\n\n if (data.connect) {\n const len = data.connect.length;\n allKeys[index][1] = connected.slice(connectI, connectI + len);\n connectI += len;\n }\n });\n\n await joinTableQuery\n .transacting(q)\n ._count()\n ._createMany(\n allKeys.flatMap(([selfData, relationKeys]) => {\n const selfKey = selfData[primaryKey];\n return relationKeys.map((relationData) => ({\n [foreignKey]: selfKey,\n [associationForeignKey]: relationData[associationPrimaryKey],\n }));\n }),\n );\n }) as HasManyNestedInsert;\n};\n\nconst nestedUpdate = (state: State) => {\n return (async (q, data, params) => {\n if (params.create) {\n const ids = await state.relatedTableQuery\n .transacting(q)\n ._pluck(state.associationPrimaryKey)\n ._createMany(params.create);\n\n await state.joinTableQuery.transacting(q)._createMany(\n data.flatMap((item) =>\n ids.map((id) => ({\n [state.foreignKey]: item[state.primaryKey],\n [state.associationForeignKey]: id,\n })),\n ),\n );\n }\n\n if (params.update) {\n await (\n state.relatedTableQuery\n .transacting(q)\n ._whereExists(state.joinTableQuery, (q) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (q as any)\n ._on(\n state.associationForeignKeyFull,\n state.associationPrimaryKeyFull,\n )\n ._where({\n IN: {\n columns: [state.foreignKeyFull],\n values: [data.map((item) => item[state.primaryKey])],\n },\n }),\n )\n ._where(\n Array.isArray(params.update.where)\n ? { OR: params.update.where }\n : params.update.where,\n ) as WhereResult<Query>\n )._update<WhereResult<Query>>(params.update.data);\n }\n\n if (params.disconnect) {\n await queryJoinTable(state, q, data, params.disconnect)._delete();\n }\n\n if (params.delete) {\n const j = queryJoinTable(state, q, data, params.delete);\n\n const ids = await j._pluck(state.associationForeignKey)._delete();\n\n await queryRelatedTable(state.relatedTableQuery, q, {\n [state.associationPrimaryKey]: { in: ids },\n })._delete();\n }\n\n if (params.set) {\n const j = queryJoinTable(state, q, data);\n await j._delete();\n delete j.query[toSqlCacheKey];\n\n const ids = await queryRelatedTable(\n state.relatedTableQuery,\n q,\n params.set,\n )._pluck(state.associationPrimaryKey);\n\n await insertToJoinTable(state, j, data, ids);\n }\n }) as HasManyNestedUpdate;\n};\n","import { BelongsTo, BelongsToInfo, makeBelongsToMethod } from './belongsTo';\nimport { HasOne, HasOneInfo, makeHasOneMethod } from './hasOne';\nimport { DbTable, Table, TableClass, TableClasses } from '../table';\nimport { OrchidORM } from '../orm';\nimport {\n Query,\n QueryWithTable,\n RelationQuery,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsOneOptional,\n BaseRelation,\n defaultsKey,\n relationQueryKey,\n EmptyObject,\n VirtualColumn,\n} from 'pqb';\nimport { HasMany, HasManyInfo, makeHasManyMethod } from './hasMany';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyInfo,\n makeHasAndBelongsToManyMethod,\n} from './hasAndBelongsToMany';\nimport { getSourceRelation, getThroughRelation } from './utils';\n\nexport interface RelationThunkBase {\n type: string;\n returns: 'one' | 'many';\n fn(): TableClass;\n options: BaseRelation['options'];\n}\n\nexport type RelationThunk = BelongsTo | HasOne | HasMany | HasAndBelongsToMany;\n\nexport type RelationThunks = Record<string, RelationThunk>;\n\nexport type RelationData = {\n returns: 'one' | 'many';\n method(params: Record<string, unknown>): Query;\n virtualColumn?: VirtualColumn;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n reverseJoin(fromQuery: Query, toQuery: Query): Query;\n primaryKey: string;\n modifyRelatedQuery?(relatedQuery: Query): (query: Query) => void;\n};\n\nexport type Relation<\n T extends Table,\n Relations extends RelationThunks,\n K extends keyof Relations,\n M extends Query = DbTable<ReturnType<Relations[K]['fn']>>,\n Info extends RelationInfo = RelationInfo<T, Relations, Relations[K]>,\n> = {\n type: Relations[K]['type'];\n returns: Relations[K]['returns'];\n key: K;\n table: M;\n query: M;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n defaults: Info['populate'];\n nestedCreateQuery: [Info['populate']] extends [never]\n ? M\n : M & {\n [defaultsKey]: Record<Info['populate'], true>;\n };\n primaryKey: string;\n options: Relations[K]['options'];\n};\n\nexport type RelationScopeOrTable<Relation extends RelationThunkBase> =\n Relation['options']['scope'] extends (q: Query) => Query\n ? ReturnType<Relation['options']['scope']>\n : DbTable<ReturnType<Relation['fn']>>;\n\nexport type RelationInfo<\n T extends Table = Table,\n Relations extends RelationThunks = RelationThunks,\n Relation extends RelationThunk = RelationThunk,\n> = Relation extends BelongsTo\n ? BelongsToInfo<T, Relation>\n : Relation extends HasOne\n ? HasOneInfo<T, Relations, Relation>\n : Relation extends HasMany\n ? HasManyInfo<T, Relations, Relation>\n : Relation extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<T, Relation>\n : never;\n\nexport type MapRelation<\n T extends Table,\n Relations extends RelationThunks,\n RelationName extends keyof Relations,\n Relation extends RelationThunk = Relations[RelationName],\n RelatedQuery extends Query = RelationScopeOrTable<Relation>,\n Info extends {\n params: Record<string, unknown>;\n populate: string;\n chainedCreate: boolean;\n chainedDelete: boolean;\n } = RelationInfo<T, Relations, Relation>,\n> = RelationQuery<\n RelationName,\n Info['params'],\n Info['populate'],\n Relation['returns'] extends 'one'\n ? Relation['options']['required'] extends true\n ? SetQueryReturnsOne<RelatedQuery>\n : SetQueryReturnsOneOptional<RelatedQuery>\n : SetQueryReturnsAll<RelatedQuery>,\n Relation['options']['required'] extends boolean\n ? Relation['options']['required']\n : false,\n Info['chainedCreate'],\n Info['chainedDelete']\n>;\n\nexport type MapRelations<T extends Table> = 'relations' extends keyof T\n ? T['relations'] extends RelationThunks\n ? {\n [K in keyof T['relations']]: MapRelation<T, T['relations'], K>;\n }\n : EmptyObject\n : EmptyObject;\n\ntype ApplyRelationData = {\n relationName: string;\n relation: RelationThunk;\n dbTable: DbTable<TableClass>;\n otherDbTable: DbTable<TableClass>;\n};\n\ntype DelayedRelations = Map<Query, Record<string, ApplyRelationData[]>>;\n\nexport const applyRelations = (\n qb: Query,\n tables: Record<string, Table>,\n result: OrchidORM<TableClasses>,\n) => {\n const tableEntries = Object.entries(tables);\n\n const delayedRelations: DelayedRelations = new Map();\n\n for (const name in tables) {\n const table = tables[name] as Table & {\n relations?: RelationThunks;\n };\n if (!('relations' in table) || typeof table.relations !== 'object')\n continue;\n\n const dbTable = result[name];\n for (const relationName in table.relations) {\n const relation = table.relations[relationName];\n const otherTableClass = relation.fn();\n const otherTable = tableEntries.find(\n (pair) => pair[1] instanceof otherTableClass,\n );\n if (!otherTable) {\n throw new Error(\n `Cannot find table class for class ${otherTableClass.name}`,\n );\n }\n const otherTableName = otherTable[0];\n const otherDbTable = result[otherTableName];\n if (!otherDbTable)\n throw new Error(`Cannot find table class by name ${otherTableName}`);\n\n const data: ApplyRelationData = {\n relationName,\n relation,\n dbTable,\n otherDbTable,\n };\n\n const options = relation.options as { through?: string; source?: string };\n if (\n typeof options.through === 'string' &&\n typeof options.source === 'string'\n ) {\n const throughRelation = getThroughRelation(dbTable, options.through);\n if (!throughRelation) {\n delayRelation(delayedRelations, dbTable, options.through, data);\n continue;\n }\n\n const sourceRelation = getSourceRelation(\n throughRelation,\n options.source,\n );\n if (!sourceRelation) {\n delayRelation(\n delayedRelations,\n throughRelation.table,\n options.source,\n data,\n );\n continue;\n }\n }\n\n applyRelation(qb, data, delayedRelations);\n }\n }\n\n if (delayedRelations.size) {\n const { value } = delayedRelations.values().next() as {\n value: Record<string, ApplyRelationData[]>;\n };\n for (const key in value) {\n for (const item of value[key]) {\n const { relation } = item;\n\n if (item.dbTable.relations[item.relationName as never]) continue;\n\n const as = item.dbTable.definedAs;\n let message = `Cannot define a \\`${item.relationName}\\` relation on \\`${as}\\``;\n const table = result[as];\n\n const { through, source } = relation.options as {\n through: string;\n source: string;\n };\n const throughRel = table.relations[\n through as never\n ] as unknown as BaseRelation;\n\n if (through && !throughRel) {\n message += `: cannot find \\`${through}\\` relation required by the \\`through\\` option`;\n } else if (\n source &&\n throughRel &&\n !throughRel.table.relations[source as never]\n ) {\n message += `: cannot find \\`${source}\\` relation in \\`${\n (throughRel.table as DbTable<TableClass>).definedAs\n }\\` required by the \\`source\\` option`;\n }\n\n throw new Error(message);\n }\n }\n }\n};\n\nconst delayRelation = (\n delayedRelations: DelayedRelations,\n table: Query,\n relationName: string,\n data: ApplyRelationData,\n) => {\n let tableRelations = delayedRelations.get(table);\n if (!tableRelations) {\n tableRelations = {};\n delayedRelations.set(table, tableRelations);\n }\n if (tableRelations[relationName]) {\n tableRelations[relationName].push(data);\n } else {\n tableRelations[relationName] = [data];\n }\n};\n\nconst applyRelation = (\n qb: Query,\n { relationName, relation, dbTable, otherDbTable }: ApplyRelationData,\n delayedRelations: DelayedRelations,\n) => {\n const query = (\n relation.options.scope\n ? relation.options.scope(otherDbTable)\n : (otherDbTable as unknown as QueryWithTable)\n ).as(relationName);\n\n const definedAs = (query as unknown as { definedAs?: string }).definedAs;\n if (!definedAs) {\n throw new Error(\n `Table class for table ${query.table} is not attached to db instance`,\n );\n }\n\n const { type } = relation;\n let data;\n if (type === 'belongsTo') {\n data = makeBelongsToMethod(relation, relationName, query);\n } else if (type === 'hasOne') {\n data = makeHasOneMethod(dbTable, relation, relationName, query);\n } else if (type === 'hasMany') {\n data = makeHasManyMethod(dbTable, relation, relationName, query);\n } else if (type === 'hasAndBelongsToMany') {\n data = makeHasAndBelongsToManyMethod(\n dbTable,\n qb,\n relation,\n relationName,\n query,\n );\n } else {\n throw new Error(`Unknown relation type ${type}`);\n }\n\n if (data.returns === 'one') {\n query._take();\n }\n\n if (data.virtualColumn) {\n dbTable.shape[relationName] = data.virtualColumn;\n }\n\n makeRelationQuery(dbTable, definedAs, relationName, data);\n\n (dbTable.relations as Record<string, unknown>)[relationName] = {\n type,\n key: relationName,\n table: otherDbTable,\n query,\n joinQuery: data.joinQuery,\n primaryKey: data.primaryKey,\n options: relation.options,\n };\n\n const tableRelations = delayedRelations.get(dbTable);\n if (!tableRelations) return;\n\n tableRelations[relationName]?.forEach((data) => {\n applyRelation(qb, data, delayedRelations);\n });\n};\n\nconst makeRelationQuery = (\n table: Query,\n definedAs: string,\n relationName: string,\n data: RelationData,\n) => {\n Object.defineProperty(table, relationName, {\n get() {\n const toTable = this.db[definedAs].as(relationName) as Query;\n\n if (data.returns === 'one') {\n toTable._take();\n }\n\n const query = this.isSubQuery\n ? toTable\n : toTable._whereExists(data.reverseJoin(this, toTable), (q) => q);\n\n query.query[relationQueryKey] = {\n relationName,\n sourceQuery: this,\n relationQuery: toTable,\n joinQuery: data.joinQuery,\n };\n\n const setQuery = data.modifyRelatedQuery?.(query);\n setQuery?.(this);\n\n return new Proxy(data.method, {\n get(_, prop) {\n return (query as unknown as Record<string, unknown>)[prop as string];\n },\n }) as unknown as RelationQuery;\n },\n });\n};\n","import { Db } from 'pqb';\n\nexport function transaction<T extends { $queryBuilder: Db }, Result>(\n this: T,\n fn: (db: T) => Promise<Result>,\n): Promise<Result> {\n if (fn.length === 0) {\n throw new Error('Argument of $transaction callback should be used');\n }\n\n return this.$queryBuilder.transaction((q) => {\n const orm = {} as T;\n for (const key in this) {\n const value = this[key];\n if (value instanceof Db) {\n const table = value.transacting(q);\n table.__table = table;\n (table as unknown as { db: unknown }).db = orm;\n orm[key] = table;\n } else {\n orm[key] = value;\n }\n }\n\n return fn(orm);\n });\n}\n","import {\n Adapter,\n Db,\n AdapterOptions,\n QueryLogOptions,\n columnTypes,\n NoPrimaryKeyOption,\n anyShape,\n DbTableOptions,\n} from 'pqb';\nimport { DbTable, Table, TableClasses } from './table';\nimport { applyRelations } from './relations/relations';\nimport { transaction } from './transaction';\n\nexport type OrchidORM<T extends TableClasses> = {\n [K in keyof T]: DbTable<T[K]>;\n} & {\n $transaction: typeof transaction;\n $adapter: Adapter;\n $queryBuilder: Db;\n $close(): Promise<void>;\n};\n\nexport const orchidORM = <T extends TableClasses>(\n {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey = 'error',\n ...options\n }: ({ adapter: Adapter } | Omit<AdapterOptions, 'log'>) &\n QueryLogOptions & {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n },\n tables: T,\n): OrchidORM<T> => {\n const adapter = 'adapter' in options ? options.adapter : new Adapter(options);\n const commonOptions = {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey,\n };\n const qb = new Db(\n adapter,\n undefined as unknown as Db,\n undefined,\n anyShape,\n columnTypes,\n commonOptions,\n );\n qb.queryBuilder = qb as unknown as Db;\n\n const result = {\n $transaction: transaction,\n $adapter: adapter,\n $queryBuilder: qb,\n $close: () => adapter.close(),\n } as unknown as OrchidORM<TableClasses>;\n\n const tableInstances: Record<string, Table> = {};\n\n for (const key in tables) {\n if (key[0] === '$') {\n throw new Error(`Table class name must not start with $`);\n }\n\n const table = new tables[key]();\n tableInstances[key] = table;\n\n const options: DbTableOptions = {\n ...commonOptions,\n schema: table.schema,\n };\n\n if (table.noPrimaryKey) options.noPrimaryKey = 'ignore';\n\n const dbTable = new Db(\n adapter,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n qb as any,\n table.table,\n table.columns.shape,\n table.columnTypes,\n options,\n );\n\n (dbTable as unknown as { definedAs: string }).definedAs = key;\n (dbTable as unknown as { db: unknown }).db = result;\n\n (result as Record<string, unknown>)[key] = dbTable;\n }\n\n applyRelations(qb, tableInstances, result);\n\n return result as unknown as OrchidORM<T>;\n};\n","import {\n EmptyObject,\n getClonedQueryData,\n MergeQuery,\n Query,\n QueryReturnType,\n SetQueryReturns,\n WhereResult,\n} from 'pqb';\n\nexport type QueryMethods<T extends Query> = Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (q: T, ...args: any[]) => any\n>;\n\ntype QueryOne<T extends Query> = SetQueryReturns<\n T,\n Exclude<QueryReturnType, 'all'>\n>;\n\nexport type MethodsBase<T extends Query> = {\n queryMethods?: QueryMethods<T>;\n queryOneMethods?: QueryMethods<QueryOne<T>>;\n queryWithWhereMethods?: QueryMethods<WhereResult<T>>;\n queryOneWithWhereMethods?: QueryMethods<QueryOne<WhereResult<T>>>;\n methods?: Record<string, unknown>;\n};\n\nexport type MapQueryMethods<\n T extends Query,\n BaseQuery extends Query,\n Methods,\n> = Methods extends QueryMethods<T>\n ? {\n [K in keyof Methods]: Methods[K] extends (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n q: any,\n ...args: infer Args\n ) => // eslint-disable-next-line @typescript-eslint/no-explicit-any\n infer Result\n ? <T extends BaseQuery>(\n this: T,\n ...args: Args\n ) => Result extends Query ? MergeQuery<T, Result> : Result\n : never;\n }\n : EmptyObject;\n\nexport type MapMethods<\n T extends Query,\n Methods extends MethodsBase<T>,\n> = MapQueryMethods<T, Query, Methods['queryMethods']> &\n MapQueryMethods<QueryOne<T>, QueryOne<Query>, Methods['queryOneMethods']> &\n MapQueryMethods<\n WhereResult<T>,\n WhereResult<Query>,\n Methods['queryWithWhereMethods']\n > &\n MapQueryMethods<\n QueryOne<WhereResult<T>>,\n QueryOne<WhereResult<Query>>,\n Methods['queryOneWithWhereMethods']\n > &\n (Methods['methods'] extends Record<string, unknown>\n ? Methods['methods']\n : EmptyObject);\n\nexport type Repo<\n T extends Query,\n Methods extends MethodsBase<T>,\n Mapped = MapMethods<T, Methods>,\n> = (<Q extends { table: T['table']; shape: T['shape'] }>(q: Q) => Q & Mapped) &\n T &\n Mapped;\n\nexport const createRepo = <T extends Query, Methods extends MethodsBase<T>>(\n table: T,\n methods: Methods,\n): Repo<T, Methods> => {\n const queryMethods = {\n ...methods.queryMethods,\n ...methods.queryOneMethods,\n ...methods.queryWithWhereMethods,\n ...methods.queryOneWithWhereMethods,\n };\n\n const plainMethods = methods.methods;\n\n const repo = (q: Query) => {\n const proto = Object.create(q.__table);\n proto.__table = proto;\n const result = Object.create(proto);\n result.query = getClonedQueryData(q.query);\n\n if (plainMethods) {\n Object.assign(proto.__table, plainMethods);\n }\n\n for (const key in queryMethods) {\n const method = queryMethods[key] as (...args: unknown[]) => unknown;\n (proto.__table as unknown as Record<string, unknown>)[key] = function (\n ...args: unknown[]\n ) {\n return method(this, ...args);\n };\n }\n\n return result;\n };\n\n const q = repo(table);\n\n return new Proxy(repo, {\n get(_, key) {\n return q[key];\n },\n }) as unknown as Repo<T, Methods>;\n};\n"],"names":["options","nestedInsert","nestedUpdate","q","values","rowIndex","columnIndex","id","query","data","__spreadValues","__spreadProps","connect","connectOrCreate","create"],"mappings":"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"}