orchid-orm 1.17.17 → 1.17.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/baseTable.ts","../src/relations/common/utils.ts","../src/relations/belongsTo.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 AfterHook,\n ColumnsShape,\n columnTypes as defaultColumnTypes,\n ComputedColumnsBase,\n Db,\n DefaultColumnTypes,\n getColumnTypes,\n Query,\n QueryAfterHook,\n QueryBase,\n QueryBeforeHook,\n QueryData,\n QueryHooks,\n QueryWithTable,\n RelationQueryBase,\n} from 'pqb';\nimport {\n applyMixins,\n ColumnShapeInput,\n ColumnShapeOutput,\n ColumnShapeQueryType,\n ColumnsShapeBase,\n ColumnTypesBase,\n EmptyObject,\n getCallerFilePath,\n getStackTrace,\n snakeCaseKey,\n toSnakeCase,\n} from 'orchid-core';\nimport { MapRelations } from './relations/relations';\nimport { OrchidORM } from './orm';\nimport { BelongsToOptions } from './relations/belongsTo';\nimport { HasOneOptions } from './relations/hasOne';\nimport { HasManyOptions } from './relations/hasMany';\nimport { HasAndBelongsToManyOptions } from './relations/hasAndBelongsToMany';\n\n// type of table class itself\nexport type TableClass<T extends Table = Table> = new () => T;\n\n// object with table classes, used on orchidORM() for setting tables\nexport type TableClasses = Record<string, TableClass>;\n\n// convert table instance type to queryable interface\n// processes relations to a type that's understandable by `pqb`\n// add ORM table specific metadata like `definedAt`, `db`, `getFilePath`\nexport type TableToDb<\n T extends Table,\n RelationQueries extends Record<string, RelationQueryBase>,\n> = Db<\n T['table'],\n T['columns'],\n RelationQueries,\n T['types'],\n T['computed'] extends ComputedColumnsBase<never>\n ? T['columns'] & {\n [K in keyof T['computed']]: ReturnType<T['computed'][K]>['_type'];\n }\n : T['columns']\n> & {\n definedAs: string;\n db: OrchidORM;\n getFilePath(): string;\n name: string;\n};\n\n// convert a table class type into queryable interface\n// add relation methods\nexport type DbTable<\n TC extends TableClass,\n T extends Table = InstanceType<TC>,\n RelationQueries extends Record<string, RelationQueryBase> = MapRelations<T>,\n Q extends QueryWithTable = TableToDb<T, RelationQueries>,\n Result extends QueryWithTable = Q & RelationQueries,\n> = Result;\n\n// `columns` property of table has a shape and an output type of the columns\n// callback with a query of relation, to use as a default scope\nexport type ScopeFn<Related extends TableClass, Scope extends Query> = (\n q: DbTable<Related>,\n) => Scope;\n\n// type of table instance created by a table class\nexport type Table = {\n // table name\n table: string;\n // columns shape and the record type\n columns: ColumnsShape;\n // database schema containing this table\n schema?: string;\n // column types defined in base table to use in `setColumns`\n types: ColumnTypesBase;\n // suppress no primary key warning\n noPrimaryKey?: boolean;\n // path to file where the table is defined\n filePath: string;\n // default language for the full text search\n language?: string;\n /**\n * collect computed columns returned by {@link BaseTable.setColumns}\n */\n computed?: ComputedColumnsBase<never>;\n};\n\n// Object type that's allowed in `where` and similar methods of the table.\nexport type Queryable<T extends Table> = Partial<\n ColumnShapeQueryType<T['columns']>\n>;\n\n// Object type of table's record that's returned from database and is parsed.\nexport type Selectable<T extends Table> = ColumnShapeOutput<T['columns']>;\n\n// Object type that conforms `create` method of the table.\nexport type Insertable<T extends Table> = ColumnShapeInput<T['columns']>;\n\n// Object type that conforms `update` method of the table.\nexport type Updateable<T extends Table> = Partial<Insertable<T>>;\n\n// type of before hook function for the table\ntype BeforeHookMethod = <T extends Table>(cb: QueryBeforeHook) => T;\n\n// type of after hook function for the table\ntype AfterHookMethod = <T extends Table>(cb: QueryAfterHook) => T;\n\n// type of after hook function that allows selecting columns for the table\ntype AfterSelectableHookMethod = <\n T extends Table,\n S extends (keyof T['columns'])[],\n>(\n this: T,\n select: S,\n cb: AfterHook<S, T['columns']>,\n) => T;\n\n// Couldn't manage it to work otherwise than specifying any\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SchemaProviderBase = any;\n\n// base table constructor\nexport const createBaseTable = <\n ColumnTypes extends ColumnTypesBase,\n SchemaProvider extends SchemaProviderBase,\n>({\n columnTypes: columnTypesArg,\n snakeCase,\n filePath: filePathArg,\n nowSQL,\n exportAs = 'BaseTable',\n language,\n schemaProvider: schemaProviderArg,\n}: {\n // concrete column types or a callback for overriding standard column types\n // this types will be used in tables to define their columns\n columnTypes?: ColumnTypes | ((t: DefaultColumnTypes) => ColumnTypes);\n // when set to true, all columns will be translated to `snake_case` when querying database\n snakeCase?: boolean;\n // if for some unknown reason you see error that file path for a table can't be guessed automatically,\n // provide it manually via `filePath`\n filePath?: string;\n // if `now()` for some reason doesn't suite your timestamps, provide a custom SQL for it\n nowSQL?: string;\n // export name of the base table, by default it is BaseTable\n exportAs?: string;\n // default language for the full text search\n language?: string;\n // a function to prepare a validation schema based on table's columns,\n // it will be available as `TableClass.schema()` method.\n schemaProvider?: SchemaProvider;\n} = {}) => {\n type CT = ColumnTypesBase extends ColumnTypes\n ? DefaultColumnTypes\n : ColumnTypes;\n\n const columnTypes = (\n typeof columnTypesArg === 'function'\n ? columnTypesArg(defaultColumnTypes)\n : columnTypesArg || defaultColumnTypes\n ) as CT;\n\n // stack is needed only if filePath wasn't given\n const filePathOrStack = filePathArg || getStackTrace();\n\n let filePath: string | undefined;\n\n function schemaProvider(this: Table) {\n const schema = (schemaProviderArg as () => unknown).call(this);\n (this as unknown as { schema: () => unknown }).schema = () => schema;\n return schema;\n }\n\n const base = class BaseTable {\n static nowSQL = nowSQL;\n static exportAs = exportAs;\n static getFilePath(): string {\n if (filePath) return filePath;\n if (typeof filePathOrStack === 'string') {\n return (filePath = filePathOrStack);\n }\n\n filePath = getCallerFilePath(filePathOrStack);\n if (filePath) return filePath;\n\n throw new Error(\n `Failed to determine file path of a base table. Please set the \\`filePath\\` option of \\`createBaseTable\\` manually.`,\n );\n }\n\n table!: string;\n columns!: ColumnsShape;\n schema?: string;\n noPrimaryKey?: boolean;\n snakeCase = snakeCase;\n types = columnTypes;\n q: QueryData = {} as QueryData;\n language = language;\n declare filePath: string;\n declare result: ColumnsShapeBase;\n\n static schema = schemaProvider as SchemaProvider;\n\n clone<T extends QueryBase>(this: T): T {\n return this;\n }\n\n getFilePath() {\n if (this.filePath) return this.filePath;\n if (typeof filePathOrStack === 'string')\n return (this.filePath = filePathOrStack);\n\n const filePath = getCallerFilePath(filePathOrStack);\n if (filePath) return (this.filePath = filePath);\n\n throw new Error(\n `Failed to determine file path for table ${this.constructor.name}. Please set \\`filePath\\` property manually`,\n );\n }\n\n setColumns<T extends ColumnsShape>(fn: (t: CT) => T): T {\n (columnTypes as { [snakeCaseKey]?: boolean })[snakeCaseKey] =\n this.snakeCase;\n\n const shape = getColumnTypes(columnTypes, fn, nowSQL, this.language);\n\n if (this.snakeCase) {\n for (const key in shape) {\n const column = shape[key];\n if (column.data.name) continue;\n\n const snakeName = toSnakeCase(key);\n if (snakeName !== key) {\n column.data.name = snakeName;\n }\n }\n }\n\n // Memoize columns in the prototype of class.\n // It is accessed in schema-to-tod.\n return (this.constructor.prototype.columns = shape);\n }\n\n /**\n * You can add a generated column in the migration (see [generated](/guide/migration-column-methods.html#generated-column)),\n * such column will persist in the database, it can be indexed.\n *\n * Or you can add a computed column on the ORM level, without adding it to the database, in such a way:\n *\n * ```ts\n * import { BaseTable } from './baseTable';\n *\n * export class UserTable extends BaseTable {\n * readonly table = 'user';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * firstName: t.string(),\n * lastName: t.string(),\n * }));\n *\n * computed = this.setComputed({\n * fullName: (q) =>\n * q.sql`${q.column('firstName')} || ' ' || ${q.column('lastName')}`.type(\n * (t) => t.string(),\n * ),\n * });\n * }\n * ```\n *\n * `setComputed` takes an object where keys are computed column names, and values are functions returning raw SQL.\n *\n * Use `q.column` as shown above to reference a table column, it will be prefixed with a correct table name even if the table is joined under a different name.\n *\n * Computed columns are not selected by default, only on demand:\n *\n * ```ts\n * const a = await db.user.take();\n * a.fullName; // not selected\n *\n * const b = await db.user.select('*', 'fullName');\n * b.fullName; // selected\n *\n * // Table post belongs to user as an author.\n * // it's possible to select joined computed column:\n * const posts = await db.post\n * .join('author')\n * .select('post.title', 'author.fullName');\n * ```\n *\n * SQL query can be generated dynamically based on the current request context.\n *\n * Imagine we are using [AsyncLocalStorage](https://nodejs.org/api/async_context.html#asynchronous-context-tracking)\n * to keep track of current user's language.\n *\n * And we have articles translated to different languages, each article has `title_en`, `title_uk`, `title_be` and so on.\n *\n * We can define a computed `title` by passing a function into `sql` method:\n *\n * ```ts\n * type Locale = 'en' | 'uk' | 'be';\n * const asyncLanguageStorage = new AsyncLocalStorage<Locale>();\n * const defaultLocale: Locale = 'en';\n *\n * export class ArticleTable extends BaseTable {\n * readonly table = 'article';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * title_en: t.text(),\n * title_uk: t.text().nullable(),\n * title_be: t.text().nullable(),\n * }));\n *\n * computed = this.setComputed({\n * title: (q) =>\n * q\n * // .sql can take a function that accepts `sql` argument and must return SQL\n * .sql((sql) => {\n * // get locale dynamically based on current storage value\n * const locale = asyncLanguageStorage.getStore() || defaultLocale;\n *\n * // use COALESCE in case when localized title is NULL, use title_en\n * return sql`COALESCE(\n * ${q.column(`title_${locale}`)},\n * ${q.column(`title_${defaultLocale}`)}\n * )`;\n * })\n * .type((t) => t.text()),\n * });\n * }\n * ```\n *\n * @param computed - object where keys are column names and values are functions returning raw SQL\n */\n setComputed<\n Table extends string,\n Shape extends ColumnsShape,\n Computed extends ComputedColumnsBase<Db<Table, Shape, EmptyObject, CT>>,\n >(computed: Computed): Computed {\n return computed;\n }\n\n belongsTo<\n Self extends this,\n Related extends TableClass,\n Scope extends Query,\n Options extends BelongsToOptions<Self, Related, Scope>,\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'belongsTo' 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 HasOneOptions<Self, Related, Scope, Through, Source>,\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasOne' 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 HasManyOptions<Self, Related, Scope, Through, Source>,\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasMany' 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 HasAndBelongsToManyOptions<Self, Related, Scope>,\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasAndBelongsToMany' as const,\n fn,\n options,\n };\n }\n\n declare beforeQuery: BeforeHookMethod;\n declare afterQuery: AfterHookMethod;\n declare beforeCreate: BeforeHookMethod;\n declare afterCreate: AfterSelectableHookMethod;\n declare afterCreateCommit: AfterSelectableHookMethod;\n declare beforeUpdate: BeforeHookMethod;\n declare afterUpdate: AfterSelectableHookMethod;\n declare afterUpdateCommit: AfterSelectableHookMethod;\n declare beforeSave: BeforeHookMethod;\n declare afterSave: AfterSelectableHookMethod;\n declare afterSaveCommit: AfterSelectableHookMethod;\n declare beforeDelete: BeforeHookMethod;\n declare afterDelete: AfterSelectableHookMethod;\n declare afterDeleteCommit: AfterSelectableHookMethod;\n };\n\n applyMixins(base, [QueryHooks]);\n\n base.prototype.types = columnTypes as typeof base.prototype.types;\n\n return base;\n};\n","import {\n CreateCtx,\n getQueryAs,\n JoinCallback,\n pushQueryOn,\n Query,\n RelationConfigBase,\n setQueryObjectValue,\n UpdateData,\n WhereArg,\n WhereQueryBase,\n} from 'pqb';\nimport { MaybeArray } from 'orchid-core';\nimport { HasOneNestedInsert, HasOneNestedUpdate } from '../hasOne';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from '../hasMany';\n\nexport type NestedInsertOneItem = {\n create?: NestedInsertOneItemCreate;\n connect?: NestedInsertOneItemConnect;\n connectOrCreate?: NestedInsertOneItemConnectOrCreate;\n};\n\nexport type NestedInsertOneItemCreate = Record<string, unknown>;\n\nexport type NestedInsertOneItemConnect = WhereArg<WhereQueryBase>;\n\nexport type NestedInsertOneItemConnectOrCreate = {\n where: WhereArg<WhereQueryBase>;\n create: Record<string, unknown>;\n};\n\nexport type NestedInsertManyItems = {\n create?: NestedInsertManyCreate;\n connect?: NestedInsertManyConnect;\n connectOrCreate?: NestedInsertManyConnectOrCreate;\n};\n\nexport type NestedInsertManyCreate = Record<string, unknown>[];\n\nexport type NestedInsertManyConnect = WhereArg<WhereQueryBase>[];\n\nexport type NestedInsertManyConnectOrCreate = {\n where: WhereArg<WhereQueryBase>;\n create: Record<string, unknown>;\n}[];\n\nexport type NestedInsertItem = NestedInsertOneItem | NestedInsertManyItems;\n\nexport type NestedUpdateOneItem = {\n disconnect?: boolean;\n set?: WhereArg<WhereQueryBase>;\n delete?: boolean;\n update?: UpdateData<Query>;\n upsert?: {\n update: UpdateData<Query>;\n create: Record<string, unknown> | (() => Record<string, unknown>);\n };\n create: Record<string, unknown>;\n};\n\nexport type NestedUpdateManyItems = {\n disconnect?: MaybeArray<WhereArg<WhereQueryBase>>;\n set?: MaybeArray<WhereArg<WhereQueryBase>>;\n delete?: MaybeArray<WhereArg<WhereQueryBase>>;\n update?: {\n where: MaybeArray<WhereArg<WhereQueryBase>>;\n data: UpdateData<Query>;\n };\n create: Record<string, unknown>[];\n};\n\nexport type NestedUpdateItem = NestedUpdateOneItem | NestedUpdateManyItems;\n\nexport const getThroughRelation = (\n table: Query,\n through: string,\n): RelationConfigBase => {\n return table.relations[through]?.relationConfig;\n};\n\nexport const getSourceRelation = (\n throughRelation: RelationConfigBase,\n source: string,\n): RelationConfigBase => {\n return throughRelation.table.relations[source]?.relationConfig;\n};\n\nexport const hasRelationHandleCreate = (\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n key: string,\n primaryKeys: 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.q.wrapInTransaction = true;\n\n const relationData = [values];\n store.hasRelation[key] = relationData;\n\n q._afterCreate(primaryKeys, (rows, q) =>\n (nestedInsert as HasOneNestedInsert)(\n q,\n relationData.map(([rowIndex, data]) => [\n rows[rowIndex],\n data as NestedInsertOneItem,\n ]),\n ),\n );\n};\n\nexport const hasRelationHandleUpdate = (\n q: Query,\n set: Record<string, unknown>,\n key: string,\n primaryKeys: 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 selectIfNotSelected(q, primaryKeys);\n\n q.q.wrapInTransaction = true;\n\n q._afterUpdate(q.primaryKeys, (rows, q) => {\n return (nestedUpdate as HasOneNestedUpdate)(\n q,\n rows,\n value as NestedUpdateOneItem,\n );\n });\n};\n\nexport const selectIfNotSelected = (q: Query, columns: string[]) => {\n const select = q.q.select || [];\n if (!select.includes('*')) {\n for (const column of columns) {\n if (!select.includes(column)) {\n select.push(column);\n }\n }\n q.q.select = select;\n }\n};\n\nexport const relationWhere =\n (len: number, keys: string[], valueKeys: string[]) =>\n (params: Record<string, unknown>) => {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[keys[i]] = params[valueKeys[i]];\n }\n return obj;\n };\n\nexport function joinHasThrough(\n q: Query,\n fromQuery: Query,\n toQuery: Query,\n throughRelation: RelationConfigBase,\n sourceRelation: RelationConfigBase,\n): Query {\n return q.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\nexport function joinHasRelation(\n fromQuery: Query,\n toQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n len: number,\n) {\n const q = toQuery.clone();\n\n setQueryObjectValue(\n q,\n 'joinedShapes',\n (fromQuery.q.as || fromQuery.table) as string,\n fromQuery.q.shape,\n );\n\n for (let i = 0; i < len; i++) {\n pushQueryOn(q, fromQuery, toQuery, foreignKeys[i], primaryKeys[i]);\n }\n\n return q;\n}\n","import { DbTable, Table, TableClass } from '../baseTable';\nimport {\n CreateCtx,\n CreateData,\n InsertQueryData,\n isQueryReturnsAll,\n pushQueryOn,\n pushQueryValue,\n Query,\n QueryResult,\n QueryWithTable,\n SelectQueryData,\n setQueryObjectValue,\n SetQueryTableAlias,\n UpdateCtx,\n UpdateData,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport {\n RelationData,\n RelationThunkBase,\n RelationToOneDataForCreate,\n} from './relations';\nimport {\n NestedInsertOneItem,\n NestedInsertOneItemConnect,\n NestedInsertOneItemConnectOrCreate,\n NestedInsertOneItemCreate,\n NestedUpdateOneItem,\n relationWhere,\n selectIfNotSelected,\n} from './common/utils';\nimport { emptyArray, EmptyObject } from 'orchid-core';\nimport {\n RelationCommonOptions,\n RelationKeysOptions,\n RelationRefsOptions,\n RelationRefsOrKeysOptions,\n} from './common/options';\n\nexport type BelongsTo = RelationThunkBase & {\n type: 'belongsTo';\n options: BelongsToOptions;\n};\n\nexport type BelongsToOptions<\n Self extends Table = Table,\n Related extends TableClass = TableClass,\n Scope extends Query = Query,\n> = RelationCommonOptions<Related, Scope> &\n RelationRefsOrKeysOptions<\n keyof Self['columns'],\n keyof InstanceType<Related>['columns'],\n keyof InstanceType<Related>['columns'],\n keyof Self['columns']\n >;\n\nexport type BelongsToInfo<\n T extends Table,\n Relation extends BelongsTo,\n K extends string,\n FK extends string = Relation['options'] extends RelationRefsOptions\n ? Relation['options']['columns'][number]\n : Relation['options'] extends RelationKeysOptions\n ? Relation['options']['foreignKey']\n : never,\n Q extends QueryWithTable = SetQueryTableAlias<\n DbTable<ReturnType<Relation['fn']>>,\n K\n >,\n DataForCreate = RelationToOneDataForCreate<{\n nestedCreateQuery: Q;\n table: Q;\n }>,\n Required = Relation['options']['required'] extends true ? true : false,\n> = {\n table: Q;\n query: Q;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n one: true;\n required: Required;\n omitForeignKeyInCreate: FK;\n requiredDataForCreate:\n | { [L in FK]: T['columns'][L]['inputType'] }\n | (Required extends true\n ? { [Key in K]: DataForCreate }\n : { [Key in K]?: DataForCreate });\n optionalDataForCreate: EmptyObject;\n // `belongsTo` relation data available for update. It supports:\n // - `disconnect` to nullify a foreign key for the relation\n // - `set` to update the foreign key with a relation primary key found by conditions\n // - `delete` to delete the related record, nullify the foreign key\n // - `update` to update the related record\n // - `create` to create the related record\n dataForUpdate:\n | { disconnect: boolean }\n | { set: WhereArg<Q> }\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | {\n create: CreateData<Q>;\n };\n // Only for records that updates a single record:\n // - `upsert` to update or create the related record\n dataForUpdateOne: {\n upsert: {\n update: UpdateData<Q>;\n create: CreateData<Q> | (() => CreateData<Q>);\n };\n };\n\n params: { [K in FK]: T['columns'][FK]['type'] };\n populate: never;\n chainedCreate: false;\n chainedDelete: false;\n};\n\ntype State = {\n query: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n len: number;\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 queries?: ((queryResult: QueryResult) => Promise<void>)[];\n updateData?: Record<string, unknown>;\n },\n) => void;\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: { primaryKeys, foreignKeys },\n } = this;\n\n const columnIndexes = foreignKeys.map((key) => {\n let index = ctx.columns.get(key);\n if (index === undefined) {\n ctx.columns.set(key, (index = ctx.columns.size));\n }\n return index;\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, columnIndexes, 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.q.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.q as InsertQueryData;\n for (let i = 0, len = relationData.length; i < len; i++) {\n const [rowIndex, columnIndexes] = relationData[i];\n const row = (values as unknown[][])[rowIndex];\n\n for (let c = 0, len = columnIndexes.length; c < len; c++) {\n row[columnIndexes[c]] = inserted[i][primaryKeys[c]];\n }\n }\n });\n }\n\n update(q: Query, ctx: UpdateCtx, set: Record<string, unknown>) {\n q.q.wrapInTransaction = true;\n\n const data = set[this.key] as NestedUpdateOneItem;\n this.nestedUpdate(q, set, data, ctx);\n }\n}\n\nexport const makeBelongsToMethod = (\n relation: BelongsTo,\n relationName: string,\n query: Query,\n): RelationData => {\n const primaryKeys =\n 'columns' in relation.options\n ? relation.options.references\n : [relation.options.primaryKey];\n\n const foreignKeys =\n 'columns' in relation.options\n ? relation.options.columns\n : [relation.options.foreignKey];\n\n const len = primaryKeys.length;\n const state: State = { query, primaryKeys, foreignKeys, len };\n const makeWhere = relationWhere(len, primaryKeys, foreignKeys);\n\n const join = (\n fromQuery: Query,\n toQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n ) => {\n const q = toQuery.clone();\n setQueryObjectValue(\n q,\n 'joinedShapes',\n (fromQuery.q.as || fromQuery.table) as string,\n fromQuery.q.shape,\n );\n\n for (let i = 0; i < len; i++) {\n pushQueryOn(q, fromQuery, toQuery, primaryKeys[i], foreignKeys[i]);\n }\n\n return q;\n };\n\n return {\n returns: 'one',\n method(params: Record<string, unknown>) {\n return query.where(makeWhere(params));\n },\n virtualColumn: new BelongsToVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return join(fromQuery, toQuery, primaryKeys, foreignKeys);\n },\n reverseJoin(fromQuery, toQuery) {\n return join(toQuery, fromQuery, foreignKeys, primaryKeys);\n },\n };\n};\n\nconst nestedInsert = ({ query, primaryKeys }: State) => {\n return (async (_, data) => {\n const t = query.clone();\n\n // array to store specific items will be reused\n const items: Record<string, unknown>[] = [];\n for (const item of data) {\n if (item.connectOrCreate) {\n items.push(item);\n }\n }\n\n let connectOrCreated: unknown[];\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n items[i] = t.findByOptional(\n (items[i].connectOrCreate as NestedInsertOneItemConnectOrCreate)\n .where,\n );\n }\n\n connectOrCreated = await Promise.all(items);\n } else {\n connectOrCreated = emptyArray;\n }\n\n let connectOrCreatedI = 0;\n items.length = 0;\n for (const item of data) {\n if (item.connectOrCreate) {\n if (!connectOrCreated[connectOrCreatedI++]) items.push(item);\n } else if (item.create) {\n items.push(item);\n }\n }\n\n let created: unknown[];\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n items[i] =\n 'create' in items[i]\n ? (items[i].create as NestedInsertOneItemCreate)\n : (items[i].connectOrCreate as NestedInsertOneItemConnectOrCreate)\n .create;\n }\n\n created = await t.select(...primaryKeys)._createMany(items);\n } else {\n created = emptyArray;\n }\n\n items.length = 0;\n for (const item of data) {\n if (item.connect) {\n items.push(item);\n }\n }\n\n let connected: unknown[];\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n items[i] = t.findBy(items[i].connect as NestedInsertOneItemConnect);\n }\n\n connected = await Promise.all(items);\n } else {\n connected = emptyArray;\n }\n\n let createdI = 0;\n let connectedI = 0;\n connectOrCreatedI = 0;\n return data.map((item) => {\n return 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, primaryKeys, foreignKeys, len }: 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 idsForDelete: [unknown, ...unknown[]][] | undefined;\n\n q._beforeUpdate(async (q) => {\n if (params.disconnect) {\n for (const key of foreignKeys) {\n update[key] = null;\n }\n } else if (params.set) {\n let loadPrimaryKeys: string[] | undefined;\n let loadForeignKeys: string[] | undefined;\n for (let i = 0; i < len; i++) {\n const primaryKey = primaryKeys[i];\n if (primaryKey in params.set) {\n update[foreignKeys[i]] =\n params.set[primaryKey as keyof typeof params.set];\n } else {\n (loadPrimaryKeys ??= []).push(primaryKey);\n (loadForeignKeys ??= []).push(foreignKeys[i]);\n }\n }\n if (loadPrimaryKeys) {\n const record = await query\n .select(...loadPrimaryKeys)\n ._findBy(params.set);\n\n for (let i = 0, len = loadPrimaryKeys.length; i < len; i++) {\n update[(loadForeignKeys as string[])[i]] =\n record[loadPrimaryKeys[i]];\n }\n }\n } else if (params.create) {\n const q = query.clone();\n q.q.select = primaryKeys;\n const record = await q._create(params.create);\n for (let i = 0; i < len; i++) {\n update[foreignKeys[i]] = record[primaryKeys[i]];\n }\n } else if (params.delete) {\n const selectQuery = q.clone();\n selectQuery.q.type = undefined;\n (selectQuery.q as SelectQueryData).distinct = emptyArray;\n idsForDelete = (await selectQuery._rows()) as [unknown, ...unknown[]][];\n for (const foreignKey of foreignKeys) {\n update[foreignKey] = null;\n }\n }\n });\n\n const { upsert } = params;\n if (upsert || params.update || params.delete) {\n selectIfNotSelected(q, foreignKeys);\n }\n\n if (upsert) {\n (state.queries ??= []).push(async (queryResult) => {\n const row = queryResult.rows[0];\n let obj: Record<string, unknown> | undefined = {};\n for (let i = 0; i < len; i++) {\n const id = row[foreignKeys[i]];\n if (id === null) {\n obj = undefined;\n break;\n }\n\n obj[primaryKeys[i]] = id;\n }\n\n if (obj) {\n await query.findBy(obj)._update<WhereResult<Query>>(upsert.update);\n } else {\n const data =\n typeof upsert.create === 'function'\n ? upsert.create()\n : upsert.create;\n const result = await query.select(...primaryKeys)._create(data);\n\n for (let i = 0; i < len; i++) {\n (state.updateData ??= {})[foreignKeys[i]] = result[primaryKeys[i]];\n }\n }\n });\n } else if (params.delete || params.update) {\n q._afterUpdate([], async (data) => {\n let ids: [unknown, ...unknown[]][] | undefined;\n\n if (params.delete) {\n ids = idsForDelete;\n } else {\n ids = [];\n for (const item of data) {\n let row: unknown[] | undefined;\n for (const foreignKey of foreignKeys) {\n const id = (item as Record<string, unknown>)[foreignKey];\n if (id === null) {\n row = undefined;\n break;\n } else {\n (row ??= []).push(id);\n }\n }\n if (row) ids.push(row as [unknown, ...unknown[]]);\n }\n }\n\n if (!ids?.length) return;\n\n const t = query.whereIn(\n primaryKeys as [string, ...string[]],\n ids as [unknown, ...unknown[]][],\n );\n\n if (params.delete) {\n await t._delete();\n } else {\n await t._update<WhereResult<Query>>(\n params.update as UpdateData<Query>,\n );\n }\n });\n }\n }) as BelongsToNestedUpdate;\n};\n","import {\n CreateCtx,\n CreateData,\n InsertQueryData,\n isQueryReturnsAll,\n JoinCallback,\n Query,\n QueryWithTable,\n SetQueryTableAlias,\n UpdateCtx,\n UpdateData,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { DbTable, Table, TableClass } from '../baseTable';\nimport {\n RelationData,\n RelationConfig,\n RelationThunkBase,\n RelationThunks,\n RelationToOneDataForCreate,\n} from './relations';\nimport {\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n joinHasRelation,\n joinHasThrough,\n NestedInsertOneItem,\n NestedInsertOneItemConnect,\n NestedInsertOneItemConnectOrCreate,\n NestedInsertOneItemCreate,\n NestedUpdateOneItem,\n} from './common/utils';\nimport { EmptyObject } from 'orchid-core';\nimport {\n RelationCommonOptions,\n RelationHasOptions,\n RelationKeysOptions,\n RelationRefsOptions,\n RelationThroughOptions,\n} from './common/options';\n\nexport type HasOne = RelationThunkBase & {\n type: 'hasOne';\n options: HasOneOptions;\n};\n\nexport type HasOneOptions<\n Self extends Table = Table,\n Related extends TableClass = TableClass,\n Scope extends Query = Query,\n Through extends string = string,\n Source extends string = string,\n> = RelationCommonOptions<Related, Scope> &\n (\n | RelationHasOptions<\n keyof Self['columns'],\n keyof InstanceType<Related>['columns']\n >\n | RelationThroughOptions<Through, Source>\n );\n\nexport type HasOneInfo<\n T extends Table,\n Relations extends RelationThunks,\n Relation extends HasOne,\n K extends string,\n Populate extends string = Relation['options'] extends RelationRefsOptions\n ? Relation['options']['references'][number]\n : Relation['options'] extends RelationKeysOptions\n ? Relation['options']['foreignKey']\n : never,\n TC extends TableClass = ReturnType<Relation['fn']>,\n Q extends QueryWithTable = SetQueryTableAlias<DbTable<TC>, K>,\n NestedCreateQuery extends Query = Relation['options'] extends RelationThroughOptions\n ? Q\n : Q & {\n meta: { defaults: Record<Populate, true> };\n },\n> = {\n table: Q;\n query: Q;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n one: true;\n required: Relation['options']['required'] extends true ? true : false;\n omitForeignKeyInCreate: never;\n requiredDataForCreate: EmptyObject;\n optionalDataForCreate: Relation['options'] extends RelationThroughOptions\n ? EmptyObject\n : {\n [P in K]?: RelationToOneDataForCreate<{\n nestedCreateQuery: NestedCreateQuery;\n table: Q;\n }>;\n };\n // `hasOne` relation data available for update. It supports:\n // - `disconnect` to nullify a foreign key of the related record\n // - `delete` to delete the related record\n // - `update` to update the related record\n dataForUpdate:\n | { disconnect: boolean }\n | { delete: boolean }\n | { update: UpdateData<Q> };\n // Only for records that updates a single record:\n // - `set` to update the foreign key of related record found by condition\n // - `upsert` to update or create the related record\n // - `create` to create a related record\n dataForUpdateOne:\n | { set: WhereArg<Q> }\n | {\n upsert: {\n update: UpdateData<Q>;\n create:\n | CreateData<NestedCreateQuery>\n | (() => CreateData<NestedCreateQuery>);\n };\n }\n | {\n create: CreateData<NestedCreateQuery>;\n };\n\n params: Relation['options'] extends RelationRefsOptions\n ? {\n [K in Relation['options']['columns'][number]]: T['columns'][K]['type'];\n }\n : Relation['options'] extends RelationKeysOptions\n ? Record<\n Relation['options']['primaryKey'],\n T['columns'][Relation['options']['primaryKey']]['type']\n >\n : Relation['options'] extends RelationThroughOptions\n ? RelationConfig<\n T,\n Relations,\n Relations[Relation['options']['through']],\n Relation['options']['through']\n >['params']\n : never;\n populate: Populate;\n chainedCreate: Relation['options'] extends RelationThroughOptions\n ? false\n : true;\n chainedDelete: true;\n};\n\ntype State = {\n query: Query;\n primaryKeys: string[];\n foreignKeys: 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.primaryKeys,\n this.nestedInsert,\n );\n }\n\n update(q: Query, _: UpdateCtx, set: Record<string, unknown>) {\n const params = set[this.key] as NestedUpdateOneItem;\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 hasRelationHandleUpdate(\n q,\n set,\n this.key,\n this.state.primaryKeys,\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 ('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 joinHasThrough(\n toQuery,\n fromQuery,\n toQuery,\n throughRelation,\n sourceRelation,\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return joinHasThrough(\n fromQuery,\n fromQuery,\n toQuery,\n throughRelation,\n sourceRelation,\n );\n },\n };\n }\n\n const primaryKeys =\n 'columns' in relation.options\n ? relation.options.columns\n : [relation.options.primaryKey];\n\n const foreignKeys =\n 'columns' in relation.options\n ? relation.options.references\n : [relation.options.foreignKey];\n\n const state: State = { query, primaryKeys, foreignKeys };\n const len = primaryKeys.length;\n\n const reversedOn: Record<string, string> = {};\n for (let i = 0; i < len; i++) {\n reversedOn[foreignKeys[i]] = primaryKeys[i];\n }\n\n const fromQuerySelect = [{ selectAs: reversedOn }];\n\n return {\n returns: 'one',\n method: (params: Record<string, unknown>) => {\n const values: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n values[foreignKeys[i]] = params[primaryKeys[i]];\n }\n return query.where(values)._defaults(values);\n },\n virtualColumn: new HasOneVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return joinHasRelation(fromQuery, toQuery, primaryKeys, foreignKeys, len);\n },\n reverseJoin(fromQuery, toQuery) {\n return joinHasRelation(toQuery, fromQuery, foreignKeys, primaryKeys, len);\n },\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const fromQuery = query.clone();\n fromQuery.q.select = fromQuerySelect;\n const q = relationQuery.q as InsertQueryData;\n q.kind = 'from';\n q.values = { from: fromQuery };\n };\n },\n };\n};\n\nconst nestedInsert = ({ query, primaryKeys, foreignKeys }: State) => {\n return (async (_, data) => {\n const t = query.clone();\n\n // array to store specific items will be reused\n const items: unknown[] = [];\n for (const item of data) {\n if (item[1].connect || item[1].connectOrCreate) {\n items.push(item);\n }\n }\n\n let connected: number[];\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, item] = items[i] as [\n Record<string, unknown>,\n Record<string, unknown>,\n ];\n\n const data: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n data[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n items[i] =\n 'connect' in item\n ? (\n t.where(item.connect as NestedInsertOneItemConnect) as Omit<\n Query,\n 'meta'\n > & {\n meta: Omit<Query['meta'], 'hasSelect' | 'hasWhere'> & {\n hasWhere: true;\n };\n }\n )._updateOrThrow(data as UpdateData<WhereResult<Query>>)\n : (\n t.where(\n (item.connectOrCreate as NestedInsertOneItemConnectOrCreate)\n .where,\n ) as Omit<Query, 'meta'> & {\n meta: Omit<Query['meta'], 'hasSelect' | 'hasWhere'> & {\n hasWhere: true;\n };\n }\n )._update(data as UpdateData<WhereResult<Query>>);\n }\n\n connected = (await Promise.all(items)) as number[];\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n if (!connected[connectedI++]) {\n items.push(item);\n }\n } else if (item[1].create) {\n items.push(item);\n }\n }\n\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, item] = items[i] as [\n Record<string, unknown>,\n Record<string, unknown>,\n ];\n const data: Record<string, unknown> = {\n ...('create' in item\n ? (item.create as NestedInsertOneItemCreate)\n : (item.connectOrCreate as NestedInsertOneItemConnectOrCreate)\n .create),\n };\n\n for (let i = 0; i < primaryKeys.length; i++) {\n data[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n items[i] = data;\n }\n\n await t.insertMany(items as Record<string, unknown>[]);\n }\n }) as HasOneNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKeys, foreignKeys }: State) => {\n const len = primaryKeys.length;\n\n const setNulls: Record<string, unknown> = {};\n for (const foreignKey of foreignKeys) {\n setNulls[foreignKey] = null;\n }\n\n return (async (_, data, params) => {\n const t = query.clone();\n const ids = data.map((item) =>\n primaryKeys.map((primaryKey) => item[primaryKey]),\n );\n\n const currentRelationsQuery = t.whereIn(\n foreignKeys as [string, ...string[]],\n ids as [unknown, ...unknown[]][],\n );\n\n if (params.create || params.disconnect || params.set) {\n await currentRelationsQuery._update(\n setNulls as UpdateData<WhereResult<Query>>,\n );\n\n const record = data[0];\n\n if (params.create) {\n const obj: Record<string, unknown> = { ...params.create };\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = record[primaryKeys[i]];\n }\n\n await t.insert(obj);\n }\n\n if (params.set) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = record[primaryKeys[i]];\n }\n\n await t\n ._where<Query>(params.set)\n ._update(obj as UpdateData<WhereResult<Query>>);\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 currentRelationsQuery.q.select = foreignKeys;\n const updatedIds = (await currentRelationsQuery\n ._rows()\n ._update(update as never)) as unknown as unknown[][];\n\n if (updatedIds.length < ids.length) {\n const data = typeof create === 'function' ? create() : create;\n\n await t.createMany(\n ids.reduce((rows: Record<string, unknown>[], ids) => {\n if (\n !updatedIds.some((updated) =>\n updated.every((value, i) => value === ids[i]),\n )\n ) {\n const obj: Record<string, unknown> = { ...data };\n\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = ids[i];\n }\n\n rows.push(obj);\n }\n\n return rows;\n }, []),\n );\n }\n }\n }) as HasOneNestedUpdate;\n};\n","import {\n RelationData,\n RelationConfig,\n RelationThunkBase,\n RelationThunks,\n RelationToManyDataForCreate,\n} from './relations';\nimport { DbTable, Table, TableClass } from '../baseTable';\nimport {\n CreateData,\n JoinCallback,\n Query,\n toSQLCacheKey,\n WhereArg,\n WhereResult,\n InsertQueryData,\n isQueryReturnsAll,\n VirtualColumn,\n CreateCtx,\n UpdateCtx,\n WhereQueryBase,\n SetQueryTableAlias,\n UpdateData,\n QueryWithTable,\n} from 'pqb';\nimport { EmptyObject, MaybeArray, toArray } from 'orchid-core';\nimport {\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n joinHasRelation,\n joinHasThrough,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n NestedUpdateManyItems,\n} from './common/utils';\nimport { HasOneOptions } from './hasOne';\nimport {\n RelationKeysOptions,\n RelationRefsOptions,\n RelationThroughOptions,\n} from './common/options';\n\nexport type HasMany = RelationThunkBase & {\n type: 'hasMany';\n options: HasManyOptions;\n};\n\nexport type HasManyOptions<\n Self extends Table = Table,\n Related extends TableClass = TableClass,\n Scope extends Query = Query,\n Through extends string = string,\n Source extends string = string,\n> = HasOneOptions<Self, Related, Scope, Through, Source>;\n\nexport type HasManyInfo<\n T extends Table,\n Relations extends RelationThunks,\n Relation extends HasMany,\n K extends string,\n Populate extends string = Relation['options'] extends RelationRefsOptions\n ? Relation['options']['references'][number]\n : Relation['options'] extends RelationKeysOptions\n ? Relation['options']['foreignKey']\n : never,\n TC extends TableClass = ReturnType<Relation['fn']>,\n Q extends QueryWithTable = SetQueryTableAlias<DbTable<TC>, K>,\n NestedCreateQuery extends Query = Relation['options'] extends RelationThroughOptions\n ? Q\n : Q & {\n meta: { defaults: Record<Populate, true> };\n },\n> = {\n table: Q;\n query: Q;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n one: false;\n required: Relation['options']['required'] extends true ? true : false;\n omitForeignKeyInCreate: never;\n requiredDataForCreate: EmptyObject;\n optionalDataForCreate: {\n [P in K]?: Relation['options'] extends RelationThroughOptions\n ? EmptyObject\n : RelationToManyDataForCreate<{\n nestedCreateQuery: NestedCreateQuery;\n table: Q;\n }>;\n };\n // `hasMany` relation data available for update. It supports:\n // - `disconnect` to nullify foreign keys of the related records\n // - `delete` to delete related record found by conditions\n // - `update` to update related records found by conditions with a provided data\n dataForUpdate: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: {\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n };\n };\n // Only for records that updates a single record:\n // - `set` to update foreign keys of related records found by conditions\n // - `create` to create related records\n dataForUpdateOne: {\n set?: MaybeArray<WhereArg<Q>>;\n create?: CreateData<NestedCreateQuery>[];\n };\n\n params: Relation['options'] extends RelationRefsOptions\n ? {\n [K in Relation['options']['columns'][number]]: T['columns'][K]['type'];\n }\n : Relation['options'] extends RelationKeysOptions\n ? Record<\n Relation['options']['primaryKey'],\n T['columns'][Relation['options']['primaryKey']]['type']\n >\n : Relation['options'] extends RelationThroughOptions\n ? RelationConfig<\n T,\n Relations,\n Relations[Relation['options']['through']],\n Relation['options']['through']\n >['params']\n : never;\n populate: Populate;\n chainedCreate: Relation['options'] extends RelationThroughOptions\n ? false\n : true;\n chainedDelete: true;\n};\n\ntype State = {\n query: Query;\n primaryKeys: string[];\n foreignKeys: 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.primaryKeys,\n this.nestedInsert,\n );\n }\n\n update(q: Query, _: UpdateCtx, set: Record<string, unknown>) {\n const params = set[this.key] as NestedUpdateManyItems;\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 hasRelationHandleUpdate(\n q,\n set,\n this.key,\n this.state.primaryKeys,\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 joinHasThrough(\n toQuery,\n fromQuery,\n toQuery,\n throughRelation,\n sourceRelation,\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return joinHasThrough(\n fromQuery,\n fromQuery,\n toQuery,\n throughRelation,\n sourceRelation,\n );\n },\n };\n }\n\n const primaryKeys =\n 'columns' in relation.options\n ? relation.options.columns\n : [relation.options.primaryKey];\n\n const foreignKeys =\n 'columns' in relation.options\n ? relation.options.references\n : [relation.options.foreignKey];\n\n const state: State = { query, primaryKeys, foreignKeys };\n const len = primaryKeys.length;\n\n const reversedOn: Record<string, string> = {};\n for (let i = 0; i < len; i++) {\n reversedOn[foreignKeys[i]] = primaryKeys[i];\n }\n\n const fromQuerySelect = [{ selectAs: reversedOn }];\n\n return {\n returns: 'many',\n method: (params: Record<string, unknown>) => {\n const values: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n values[foreignKeys[i]] = params[primaryKeys[i]];\n }\n return query.where(values)._defaults(values);\n },\n virtualColumn: new HasManyVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return joinHasRelation(fromQuery, toQuery, primaryKeys, foreignKeys, len);\n },\n reverseJoin(fromQuery, toQuery) {\n return joinHasRelation(toQuery, fromQuery, foreignKeys, primaryKeys, len);\n },\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const fromQuery = query.clone();\n fromQuery.q.select = fromQuerySelect;\n const q = relationQuery.q as InsertQueryData;\n q.kind = 'from';\n q.values = { from: fromQuery };\n };\n },\n };\n};\n\nconst getWhereForNestedUpdate = (\n t: Query,\n data: Record<string, unknown>[],\n params: MaybeArray<WhereArg<WhereQueryBase>> | undefined,\n primaryKeys: string[],\n foreignKeys: string[],\n): WhereResult<Query> => {\n return t.where({\n IN: {\n columns: foreignKeys,\n values: data.map((item) => primaryKeys.map((key) => item[key])),\n },\n OR: params ? toArray(params) : undefined,\n });\n};\n\nconst nestedInsert = ({ query, primaryKeys, foreignKeys }: State) => {\n const len = primaryKeys.length;\n\n return (async (_, data) => {\n const t = query.clone();\n\n // array to store specific items will be reused\n const items: unknown[] = [];\n for (const item of data) {\n if (item[1].connect) {\n items.push(item);\n }\n }\n\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, { connect }] = items[i] as [\n Record<string, unknown>,\n { connect: NestedInsertManyConnect },\n ];\n\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n items[i] = t\n .orWhere<Query>(...connect)\n ._updateOrThrow(obj as UpdateData<WhereResult<Query>>);\n }\n\n await Promise.all(items);\n }\n\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n items.push(item);\n }\n }\n\n let connected: number[];\n if (items.length) {\n const queries: Query[] = [];\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, { connectOrCreate }] = items[i] as [\n Record<string, unknown>,\n { connectOrCreate: NestedInsertManyConnectOrCreate },\n ];\n\n for (const item of connectOrCreate) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n queries.push(\n (\n t.where(item.where) as WhereResult<Query & { hasSelect: false }>\n )._update(obj as UpdateData<WhereResult<Query>>),\n );\n }\n }\n\n connected = (await Promise.all(queries)) as number[];\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n items.length = 0;\n for (const item of data) {\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) {\n items.push(item);\n break;\n }\n }\n } else if (item[1].create) {\n items.push(item);\n }\n }\n\n connectedI = 0;\n if (items.length) {\n const records: Record<string, unknown>[] = [];\n\n for (const [selfData, { create, connectOrCreate }] of items as [\n Record<string, unknown>,\n NestedInsertManyItems,\n ][]) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n if (create) {\n for (const item of create) {\n records.push({\n ...item,\n ...obj,\n });\n }\n }\n\n if (connectOrCreate) {\n for (const item of connectOrCreate) {\n if (connected[connectedI++] === 0) {\n records.push({\n ...item.create,\n ...obj,\n });\n }\n }\n }\n }\n\n await t._createMany(records);\n }\n }) as HasManyNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKeys, foreignKeys }: State) => {\n const len = primaryKeys.length;\n\n return (async (_, data, params) => {\n const t = query.clone();\n if (params.create) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = data[0][primaryKeys[i]];\n }\n\n await t.insertMany(\n params.create.map((create) => ({\n ...create,\n ...obj,\n })),\n );\n\n delete t.q[toSQLCacheKey];\n }\n\n if (params.disconnect || params.set) {\n const obj: Record<string, unknown> = {};\n for (const foreignKey of foreignKeys) {\n obj[foreignKey] = null;\n }\n\n await getWhereForNestedUpdate(\n t,\n data,\n params.disconnect,\n primaryKeys,\n foreignKeys,\n )._update(obj as UpdateData<WhereResult<Query>>);\n\n if (params.set) {\n delete t.q[toSQLCacheKey];\n\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = data[0][primaryKeys[i]];\n }\n\n await t\n .where<Query>(\n Array.isArray(params.set)\n ? {\n OR: params.set,\n }\n : params.set,\n )\n ._update(obj as UpdateData<WhereResult<Query>>);\n }\n }\n\n if (params.delete || params.update) {\n delete t.q[toSQLCacheKey];\n\n const q = getWhereForNestedUpdate(\n t,\n data,\n params.delete || params.update?.where,\n primaryKeys,\n foreignKeys,\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 {\n RelationData,\n RelationThunkBase,\n RelationToManyDataForCreate,\n} from './relations';\nimport { DbTable, Table, TableClass } from '../baseTable';\nimport {\n ColumnsShape,\n ColumnType,\n CreateCtx,\n CreateData,\n getQueryAs,\n NotFoundError,\n OrchidOrmInternalError,\n Query,\n QueryWithTable,\n SetQueryTableAlias,\n toSQLCacheKey,\n UpdateCtx,\n UpdateData,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { EmptyObject, MaybeArray } from 'orchid-core';\nimport {\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n} from './common/utils';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from './hasMany';\nimport { RelationCommonOptions } from './common/options';\n\nexport type HasAndBelongsToMany = RelationThunkBase & {\n type: 'hasAndBelongsToMany';\n options: HasAndBelongsToManyOptions;\n};\n\nexport type HasAndBelongsToManyOptions<\n Self extends Table = Table,\n Related extends TableClass = TableClass,\n Scope extends Query = Query,\n> = RelationCommonOptions<Related, Scope> &\n (\n | {\n columns: (keyof Self['columns'])[];\n references: string[];\n through: {\n table: string;\n columns: string[];\n references: (keyof InstanceType<Related>['columns'])[];\n };\n }\n | {\n primaryKey: keyof Self['columns'];\n foreignKey: string;\n joinTable: string;\n associationPrimaryKey: string;\n associationForeignKey: keyof InstanceType<Related>['columns'];\n }\n );\n\nexport type HasAndBelongsToManyInfo<\n T extends Table,\n Relation extends HasAndBelongsToMany,\n K extends string,\n TC extends TableClass = ReturnType<Relation['fn']>,\n Q extends QueryWithTable = SetQueryTableAlias<DbTable<TC>, K>,\n> = {\n table: Q;\n query: Q;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n one: false;\n required: Relation['options']['required'] extends true ? true : false;\n omitForeignKeyInCreate: never;\n requiredDataForCreate: EmptyObject;\n optionalDataForCreate: {\n [P in K]?: RelationToManyDataForCreate<{\n nestedCreateQuery: Q;\n table: Q;\n }>;\n };\n // `hasAndBelongsToMany` relation data available for update. It supports:\n // - `disconnect` to delete join table records for related records found by conditions\n // - `set` to create join table records for related records found by conditions\n // - `delete` to delete join table records and related records found by conditions\n // - `update` to update related records found by conditions with a provided data\n // - `create` to create related records and a join table records\n dataForUpdate: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: {\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n };\n create?: CreateData<Q>[];\n };\n dataForUpdateOne: EmptyObject;\n\n params: Relation['options'] extends { columns: string[] }\n ? {\n [K in Relation['options']['columns'][number]]: T['columns'][K]['type'];\n }\n : Relation['options'] extends { primaryKey: string }\n ? Record<\n Relation['options']['primaryKey'],\n T['columns'][Relation['options']['primaryKey']]['type']\n >\n : never;\n populate: never;\n chainedCreate: true;\n chainedDelete: true;\n};\n\ntype State = {\n relatedTableQuery: Query;\n joinTableQuery: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n throughForeignKeys: string[];\n throughPrimaryKeys: string[];\n foreignKeysFull: string[];\n throughForeignKeysFull: string[];\n throughPrimaryKeysFull: 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.primaryKeys,\n this.nestedInsert,\n );\n }\n\n update(q: Query, _: UpdateCtx, set: Record<string, unknown>) {\n hasRelationHandleUpdate(\n q,\n set,\n this.key,\n this.state.primaryKeys,\n this.nestedUpdate,\n );\n }\n}\n\nconst removeColumnName = (column: ColumnType) => {\n if (!column.data.name) return column;\n\n const cloned = Object.create(column);\n cloned.data = { ...column.data, name: undefined };\n return cloned;\n};\n\nexport const makeHasAndBelongsToManyMethod = (\n table: Query,\n qb: Query,\n relation: HasAndBelongsToMany,\n relationName: string,\n query: Query,\n): RelationData => {\n let primaryKeys: string[];\n let foreignKeys: string[];\n let joinTable: string;\n let throughForeignKeys: string[];\n let throughPrimaryKeys: string[];\n\n const { options } = relation;\n if ('columns' in options) {\n primaryKeys = options.columns;\n foreignKeys = options.references;\n joinTable = options.through.table;\n throughForeignKeys = options.through.columns;\n throughPrimaryKeys = options.through.references;\n } else {\n primaryKeys = [options.primaryKey];\n foreignKeys = [options.foreignKey];\n joinTable = options.joinTable;\n throughForeignKeys = [options.associationForeignKey];\n throughPrimaryKeys = [options.associationPrimaryKey];\n }\n\n const foreignKeysFull = foreignKeys.map((key) => `${joinTable}.${key}`);\n const throughForeignKeysFull = throughForeignKeys.map(\n (key) => `${joinTable}.${key}`,\n );\n\n const foreignTable = getQueryAs(query);\n const throughPrimaryKeysFull = throughPrimaryKeys.map(\n (key) => `${foreignTable}.${key}`,\n );\n\n const len = primaryKeys.length;\n const throughLen = throughPrimaryKeys.length;\n\n const baseQuery = Object.create(qb.baseQuery);\n baseQuery.baseQuery = baseQuery;\n baseQuery.table = joinTable;\n\n const shape: ColumnsShape = {};\n for (let i = 0; i < len; i++) {\n shape[foreignKeys[i]] = removeColumnName(table.shape[primaryKeys[i]]);\n }\n for (let i = 0; i < throughLen; i++) {\n shape[throughForeignKeys[i]] = removeColumnName(\n query.shape[throughPrimaryKeys[i]],\n );\n }\n\n baseQuery.shape = shape;\n baseQuery.q = {\n ...baseQuery.q,\n shape: baseQuery.shape,\n };\n const subQuery = Object.create(baseQuery);\n\n const state: State = {\n relatedTableQuery: query,\n joinTableQuery: subQuery,\n primaryKeys,\n foreignKeys,\n throughForeignKeys,\n throughPrimaryKeys,\n foreignKeysFull,\n throughForeignKeysFull,\n throughPrimaryKeysFull,\n };\n\n const joinQuery = (toQuery: Query, tableAs: string, foreignAs: string) => {\n return toQuery.whereExists(subQuery, (q) => {\n for (let i = 0; i < throughLen; i++) {\n q._on(\n throughForeignKeysFull[i],\n `${foreignAs}.${throughPrimaryKeys[i]}`,\n );\n }\n\n for (let i = 0; i < len; i++) {\n q._on(foreignKeysFull[i], `${tableAs}.${primaryKeys[i]}`);\n }\n\n return q;\n });\n };\n\n const obj: Record<string, string> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = primaryKeys[i];\n }\n const selectPrimaryKeysAsForeignKeys = [{ selectAs: obj }];\n\n return {\n returns: 'many',\n method(params: Record<string, unknown>) {\n return query.whereExists(subQuery, (q) => {\n q = q.clone();\n\n const where: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n where[foreignKeysFull[i]] = params[primaryKeys[i]];\n }\n\n for (let i = 0; i < throughLen; i++) {\n q._on(throughForeignKeysFull[i], throughPrimaryKeysFull[i]);\n }\n\n return q._where(where);\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 const join = joinQuery(\n toQuery,\n getQueryAs(fromQuery),\n getQueryAs(toQuery),\n );\n\n join.q.joinedShapes = {\n ...join.q.joinedShapes,\n [(fromQuery.q.as || fromQuery.table) as string]: fromQuery.q.shape,\n };\n\n return join;\n },\n reverseJoin(fromQuery, toQuery) {\n return joinQuery(fromQuery, getQueryAs(fromQuery), getQueryAs(toQuery));\n },\n modifyRelatedQuery(relationQuery) {\n const ref = {} as { q: Query };\n\n relationQuery._afterCreate([], async (result: unknown[]) => {\n if (result.length > 1) {\n // TODO: currently this relies on `INSERT ... SELECT` that works only for 1 record\n // consider using `WITH` to reuse id of main table for multiple related ids\n throw new OrchidOrmInternalError(\n relationQuery,\n 'Creating multiple `hasAndBelongsToMany` records is not yet supported',\n );\n }\n\n const fromQuery = ref.q.clone();\n fromQuery.q.select = selectPrimaryKeysAsForeignKeys;\n\n const data: Record<string, unknown> = {};\n for (let i = 0; i < throughLen; i++) {\n data[throughForeignKeys[i]] = (result[0] as Record<string, unknown>)[\n throughPrimaryKeys[i]\n ];\n }\n\n const createdCount = await subQuery\n .count()\n ._createFrom(fromQuery, data);\n\n if (createdCount === 0) {\n throw new NotFoundError(fromQuery);\n }\n });\n\n return (q) => {\n ref.q = q;\n };\n },\n };\n};\n\nconst queryJoinTable = (\n state: State,\n data: Record<string, unknown>[],\n conditions?: MaybeArray<WhereArg<Query>>,\n) => {\n const t = state.joinTableQuery.where({\n IN: {\n columns: state.foreignKeys,\n values: data.map((item) => state.primaryKeys.map((key) => item[key])),\n },\n });\n\n if (conditions) {\n t._where({\n IN: {\n columns: state.throughForeignKeys,\n values: state.relatedTableQuery\n .where(conditionsToWhereArg(conditions))\n ._select(...state.throughPrimaryKeys),\n },\n });\n }\n\n return t;\n};\n\nconst conditionsToWhereArg = (\n conditions: MaybeArray<WhereArg<Query>>,\n): WhereArg<Query> =>\n Array.isArray(conditions) ? { OR: conditions } : conditions;\n\nconst insertToJoinTable = (\n state: State,\n joinTableTransaction: Query,\n data: Record<string, unknown>[],\n idsRows: unknown[][],\n) => {\n const len = state.primaryKeys.length;\n const throughLen = state.throughPrimaryKeys.length;\n\n const records: Record<string, unknown>[] = [];\n for (const item of data) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[state.foreignKeys[i]] = item[state.primaryKeys[i]];\n }\n\n for (const ids of idsRows) {\n const record = { ...obj };\n for (let i = 0; i < throughLen; i++) {\n record[state.throughForeignKeys[i]] = ids[i];\n }\n records.push(record);\n }\n }\n\n return joinTableTransaction.insertMany(records);\n};\n\nconst nestedInsert = ({\n relatedTableQuery,\n joinTableQuery,\n primaryKeys,\n foreignKeys,\n throughPrimaryKeys,\n throughForeignKeys,\n}: State) => {\n const len = primaryKeys.length;\n const throughLen = primaryKeys.length;\n\n return (async (_, data) => {\n const t = relatedTableQuery.clone();\n\n // array to store specific items will be reused\n const items: unknown[] = [];\n for (const item of data) {\n if (item[1].connect) {\n items.push(item);\n }\n }\n\n let connected: Record<string, unknown>[];\n if (items.length) {\n const queries: Query[] = [];\n\n for (const [, { connect }] of items as [\n unknown,\n { connect: NestedInsertManyConnect },\n ][]) {\n for (const item of connect) {\n queries.push(\n t\n .select(...throughPrimaryKeys)\n ._findBy(item)\n ._take(),\n );\n }\n }\n\n connected = (await Promise.all(queries)) as Record<string, unknown[]>[];\n } else {\n connected = [];\n }\n\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n items.push(item);\n }\n }\n\n let connectOrCreated: (Record<string, unknown> | undefined)[];\n if (items.length) {\n const queries: Query[] = [];\n\n for (const [, { connectOrCreate }] of items as [\n unknown,\n { connectOrCreate: NestedInsertManyConnectOrCreate },\n ][]) {\n for (const item of connectOrCreate) {\n queries.push(\n t\n .select(...throughPrimaryKeys)\n ._findBy(item.where)\n ._takeOptional(),\n );\n }\n }\n\n connectOrCreated = (await Promise.all(queries)) as Record<\n string,\n unknown\n >[];\n } else {\n connectOrCreated = [];\n }\n\n let connectOrCreateI = 0;\n items.length = 0;\n for (const item of data) {\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]) {\n items.push(item);\n break;\n }\n }\n } else if (item[1].create) {\n items.push(item);\n }\n }\n\n connectOrCreateI = 0;\n let created: Record<string, unknown>[];\n if (items.length) {\n const records: Record<string, unknown>[] = [];\n\n for (const [, { create, connectOrCreate }] of items as [\n unknown,\n NestedInsertManyItems,\n ][]) {\n if (create) {\n records.push(...create);\n }\n\n if (connectOrCreate) {\n for (const item of connectOrCreate) {\n if (!connectOrCreated[connectOrCreateI++]) {\n records.push(item.create);\n }\n }\n }\n }\n\n created = (await t\n .select(...throughPrimaryKeys)\n ._createMany(records)) 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 for (let index = 0, len = data.length; index < len; index++) {\n const item = data[index][1] as NestedInsertManyItems;\n\n if (item.create || item.connectOrCreate) {\n if (item.create) {\n const len = item.create.length;\n allKeys[index][1] = created.slice(createI, createI + len);\n createI += len;\n }\n if (item.connectOrCreate) {\n const arr: Record<string, unknown>[] = [];\n allKeys[index][1] = arr;\n\n const len = item.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 (item.connect) {\n const len = item.connect.length;\n allKeys[index][1] = connected.slice(connectI, connectI + len);\n connectI += len;\n }\n }\n\n const records: Record<string, unknown>[] = [];\n for (const [selfData, relationKeys] of allKeys) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n for (const relationData of relationKeys) {\n const record = { ...obj };\n\n for (let i = 0; i < throughLen; i++) {\n record[throughForeignKeys[i]] = relationData[throughPrimaryKeys[i]];\n }\n\n records.push(record);\n }\n }\n\n await joinTableQuery.insertMany(records);\n }) as HasManyNestedInsert;\n};\n\nconst nestedUpdate = (state: State) => {\n const len = state.primaryKeys.length;\n const throughLen = state.throughPrimaryKeys.length;\n\n return (async (_, data, params) => {\n if (params.create) {\n const idsRows: unknown[][] = await state.relatedTableQuery\n .select(...state.throughPrimaryKeys)\n ._rows()\n ._createMany(params.create);\n\n const records: Record<string, unknown>[] = [];\n for (const item of data) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[state.foreignKeys[i]] = item[state.primaryKeys[i]];\n }\n\n for (const ids of idsRows) {\n const record = { ...obj };\n\n for (let i = 0; i < throughLen; i++) {\n record[state.throughForeignKeys[i]] = ids[i];\n }\n\n records.push(record);\n }\n }\n\n await state.joinTableQuery.createMany(records);\n }\n\n if (params.update) {\n await state.relatedTableQuery\n .whereExists(state.joinTableQuery, (q) => {\n for (let i = 0; i < throughLen; i++) {\n q._on(\n state.throughForeignKeysFull[i],\n state.throughPrimaryKeysFull[i],\n );\n }\n\n return q._where({\n IN: {\n columns: state.foreignKeysFull,\n values: data.map((item) =>\n state.primaryKeys.map((key) => item[key]),\n ),\n },\n });\n })\n ._where(conditionsToWhereArg(params.update.where))\n ._update<WhereResult<Query>>(params.update.data);\n }\n\n if (params.disconnect) {\n await queryJoinTable(state, data, params.disconnect)._delete();\n }\n\n if (params.delete) {\n const j = queryJoinTable(state, data, params.delete);\n\n const idsRows = await j\n ._select(...state.throughForeignKeys)\n ._rows()\n ._delete();\n\n await state.relatedTableQuery\n .where({\n IN: {\n columns: state.throughPrimaryKeys,\n values: idsRows,\n },\n })\n ._delete();\n }\n\n if (params.set) {\n const j = queryJoinTable(state, data);\n await j._delete();\n delete j.q[toSQLCacheKey];\n\n const idsRows = await state.relatedTableQuery\n .where(conditionsToWhereArg(params.set))\n ._select(...state.throughPrimaryKeys)\n ._rows();\n\n await insertToJoinTable(state, j, data, idsRows);\n }\n }) as HasManyNestedUpdate;\n};\n","import { BelongsTo, BelongsToInfo, makeBelongsToMethod } from './belongsTo';\nimport { HasOne, HasOneInfo, makeHasOneMethod } from './hasOne';\nimport { DbTable, Table, TableClass } from '../baseTable';\nimport { OrchidORM } from '../orm';\nimport {\n CreateData,\n getQueryAs,\n Query,\n RelationConfigBase,\n RelationQuery,\n RelationsBase,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsOneOptional,\n VirtualColumn,\n WhereArg,\n} from 'pqb';\nimport { EmptyObject, StringKey } from 'orchid-core';\nimport { HasMany, HasManyInfo, makeHasManyMethod } from './hasMany';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyInfo,\n makeHasAndBelongsToManyMethod,\n} from './hasAndBelongsToMany';\nimport { getSourceRelation, getThroughRelation } from './common/utils';\nimport { RelationCommonOptions } from './common/options';\n\n// `belongsTo` and `hasOne` relation data available for create. It supports:\n// - `create` to create a related record\n// - `connect` to find existing record and use its primary key\n// - `connectOrCreate` to first try connecting to an existing record, and create it if not found\nexport type RelationToOneDataForCreate<\n Rel extends { nestedCreateQuery: Query; table: Query },\n> =\n | {\n create: CreateData<Rel['nestedCreateQuery']>;\n connect?: never;\n connectOrCreate?: never;\n }\n | {\n create?: never;\n connect: WhereArg<Rel['table']>;\n connectOrCreate?: never;\n }\n | {\n create?: never;\n connect?: never;\n connectOrCreate: {\n where: WhereArg<Rel['table']>;\n create: CreateData<Rel['nestedCreateQuery']>;\n };\n };\n\n// `hasMany` and `hasAndBelongsToMany` relation data available for create. It supports:\n// - `create` to create related records\n// - `connect` to find existing records by `where` conditions and update their foreign keys with the new id\n// - `connectOrCreate` to first try finding records by `where` conditions, and create them if not found\nexport type RelationToManyDataForCreate<\n Rel extends { nestedCreateQuery: Query; table: Query },\n> = {\n create?: CreateData<Rel['nestedCreateQuery']>[];\n connect?: WhereArg<Rel['table']>[];\n connectOrCreate?: {\n where: WhereArg<Rel['table']>;\n create: CreateData<Rel['nestedCreateQuery']>;\n }[];\n};\n\nexport interface RelationThunkBase {\n type: string;\n fn(): TableClass;\n options: RelationCommonOptions;\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 modifyRelatedQuery?(relatedQuery: Query): (query: Query) => void;\n};\n\nexport type RelationScopeOrTable<Relation extends RelationThunkBase> =\n Relation['options']['scope'] extends (q: Query) => Query\n ? ReturnType<Relation['options']['scope']>\n : RelationQueryFromFn<Relation>;\n\ntype RelationQueryFromFn<\n Relation extends RelationThunkBase,\n TC extends TableClass = ReturnType<Relation['fn']>,\n Q extends Query = DbTable<TC>,\n> = Q;\n\nexport type RelationConfig<\n T extends Table = Table,\n Relations extends RelationThunks = RelationThunks,\n Relation extends RelationThunk = RelationThunk,\n K extends PropertyKey = PropertyKey,\n Result extends RelationConfigBase = Relation extends BelongsTo\n ? BelongsToInfo<T, Relation, StringKey<K>>\n : Relation extends HasOne\n ? HasOneInfo<T, Relations, Relation, StringKey<K>>\n : Relation extends HasMany\n ? HasManyInfo<T, Relations, Relation, StringKey<K>>\n : Relation extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<T, Relation, StringKey<K>>\n : never,\n> = Result;\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 Config extends RelationConfigBase = RelationConfig<\n T,\n Relations,\n Relation,\n RelationName\n >,\n> = RelationQuery<\n RelationName,\n Config,\n Config['one'] extends true\n ? Config['required'] extends true\n ? SetQueryReturnsOne<RelatedQuery>\n : SetQueryReturnsOneOptional<RelatedQuery>\n : SetQueryReturnsAll<RelatedQuery>\n>;\n\nexport type MapRelations<T extends Table> = T extends {\n relations: RelationThunks;\n}\n ? {\n [K in keyof T['relations']]: MapRelation<T, T['relations'], K>;\n }\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,\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 as RelationsBase)[through]\n ?.relationConfig;\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 baseQuery = Object.create(otherDbTable);\n baseQuery.baseQuery = baseQuery;\n\n const query = (\n relation.options.scope ? relation.options.scope(baseQuery) : baseQuery\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 if (relation.options.required) {\n query._take();\n } else {\n query._takeOptional();\n }\n\n query.q.returnsOne = true;\n }\n\n if (data.virtualColumn) {\n dbTable.shape[relationName] = dbTable.q.shape[relationName] =\n data.virtualColumn;\n }\n\n makeRelationQuery(dbTable, relationName, data, query);\n\n baseQuery.joinQuery = data.joinQuery;\n\n const { join: originalJoin } = baseQuery;\n baseQuery.join = function (...args: unknown[]) {\n if (args.length) {\n return originalJoin.apply(this, args);\n } else {\n const q = this.clone();\n q.q.innerJoinLateral = true;\n return q;\n }\n };\n\n baseQuery.relationConfig = {\n table: otherDbTable,\n query,\n joinQuery: data.joinQuery,\n };\n\n (dbTable.relations as Record<string, unknown>)[relationName] = query;\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 relationName: string,\n data: RelationData,\n q: Query,\n) => {\n Object.defineProperty(table, relationName, {\n configurable: true,\n get() {\n const toTable = q.clone();\n\n const query = this.q.isSubQuery\n ? toTable\n : toTable._whereExists(\n this.baseQuery,\n (q) => data.reverseJoin(this, toTable) as unknown as typeof q,\n );\n\n query.q.joinedShapes = {\n [getQueryAs(this)]: this.q.shape,\n ...this.q.joinedShapes,\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 set(value) {\n Object.defineProperty(this, relationName, {\n value,\n });\n },\n });\n};\n","import { Db, IsolationLevel, TransactionOptions } from 'pqb';\n\nexport function transaction<T extends { $queryBuilder: Db }, Result>(\n this: T,\n fn: () => Promise<Result>,\n): Promise<Result>;\nexport function transaction<T extends { $queryBuilder: Db }, Result>(\n this: T,\n options: IsolationLevel | TransactionOptions,\n fn: () => Promise<Result>,\n): Promise<Result>;\nexport function transaction<T extends { $queryBuilder: Db }, Result>(\n this: T,\n fnOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n fn?: () => Promise<Result>,\n): Promise<Result> {\n return this.$queryBuilder.transaction(\n fnOrOptions as IsolationLevel,\n fn as () => Promise<Result>,\n );\n}\n","import {\n Adapter,\n AdapterOptions,\n addComputedColumns,\n anyShape,\n columnTypes,\n ComputedColumnsBase,\n Db,\n DbTableOptions,\n FromArgs,\n FromResult,\n NoPrimaryKeyOption,\n Query,\n QueryData,\n QueryLogOptions,\n} from 'pqb';\nimport { DbTable, Table, TableClasses } from './baseTable';\nimport { applyRelations } from './relations/relations';\nimport { transaction } from './transaction';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { SQLQueryArgs, TransactionState } from 'orchid-core';\n\nexport type OrchidORM<T extends TableClasses = TableClasses> = {\n [K in keyof T]: DbTable<T[K]>;\n} & {\n $transaction: typeof transaction;\n $adapter: Adapter;\n $queryBuilder: Db;\n /**\n * Use `$query` to perform raw SQL queries.\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.$query<{ one: number }>`SELECT ${value} AS one`;\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * If the query is executing inside a transaction, it will use the transaction connection automatically.\n *\n * ```ts\n * await db.transaction(async () => {\n * // both queries will execute in the same transaction\n * await db.$query`SELECT 1`;\n * await db.$query`SELECT 2`;\n * });\n * ```\n *\n * Alternatively, support a simple SQL string, with optional `values`:\n *\n * Note that the values is a simple array, and the SQL is referring to the values with `$1`, `$2` and so on.\n *\n * ```ts\n * const value = 1;\n *\n * // it is NOT safe to interpolate inside a simple string, use `values` to pass the values.\n * const result = await db.$query<{ one: number }>({\n * raw: 'SELECT $1 AS one',\n * values: [value],\n * });\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * @param args - SQL template literal, or an object { raw: string, values?: unknown[] }\n */\n $query: Db['query'];\n /**\n * The same as the {@link $query}, but returns an array of arrays instead of objects:\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.$queryArrays<[number]>`SELECT ${value} AS one`;\n * // `rows` is an array of arrays:\n * const row = result.rows[0];\n * row[0]; // our value\n * ```\n *\n * @param args - SQL template literal, or an object { raw: string, values?: unknown[] }\n */\n $queryArrays: Db['queryArrays'];\n $from<Args extends FromArgs<Query>>(...args: Args): FromResult<Query, Args>;\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 }: ({ db: Query } | { adapter: Adapter } | Omit<AdapterOptions, 'log'>) &\n QueryLogOptions & {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n },\n tables: T,\n): OrchidORM<T> => {\n const commonOptions = {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey,\n };\n\n let adapter: Adapter;\n let transactionStorage;\n let qb: Db;\n if ('db' in options) {\n adapter = options.db.q.adapter;\n transactionStorage = options.db.internal.transactionStorage;\n qb = options.db.queryBuilder;\n } else {\n adapter = 'adapter' in options ? options.adapter : new Adapter(options);\n\n transactionStorage = new AsyncLocalStorage<TransactionState>();\n\n qb = new Db(\n adapter,\n undefined as unknown as Db,\n undefined,\n anyShape,\n columnTypes,\n transactionStorage,\n commonOptions,\n ) as unknown as Db;\n qb.queryBuilder = qb as unknown as Db;\n }\n\n const result = {\n $transaction: transaction,\n $adapter: adapter,\n $queryBuilder: qb,\n $query: (...args: SQLQueryArgs) => qb.query(...args),\n $queryArrays: (...args: SQLQueryArgs) => qb.queryArrays(...args),\n $from: (...args: FromArgs<Query>) => qb.from(...args),\n $close: () => adapter.close(),\n } as unknown as OrchidORM;\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 language: table.language,\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,\n table.types,\n transactionStorage,\n options,\n );\n\n (dbTable as unknown as { definedAs: string }).definedAs = key;\n (dbTable as unknown as { db: unknown }).db = result;\n (dbTable as unknown as { filePath: string }).filePath = table.filePath;\n (dbTable as unknown as { name: string }).name = table.constructor.name;\n\n if (table.computed) {\n addComputedColumns(\n dbTable,\n table.computed as ComputedColumnsBase<typeof dbTable>,\n );\n }\n\n (result as Record<string, unknown>)[key] = dbTable;\n }\n\n applyRelations(qb, tableInstances, result);\n\n for (const key in tables) {\n const table = tableInstances[key] as unknown as {\n init?(orm: unknown): void;\n q: QueryData;\n };\n\n if (table.init) {\n table.init(result);\n // assign before and after hooks from table.query to the table base query\n Object.assign(result[key].baseQuery.q, table.q);\n }\n }\n\n return result as unknown as OrchidORM<T>;\n};\n","import {\n getClonedQueryData,\n MergeQuery,\n Query,\n QueryReturnType,\n SetQueryReturns,\n WhereResult,\n} from 'pqb';\nimport { EmptyObject } from 'orchid-core';\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.baseQuery);\n proto.baseQuery = proto;\n const result = Object.create(proto);\n result.q = getClonedQueryData(q.q);\n\n if (plainMethods) {\n Object.assign(proto.baseQuery, plainMethods);\n }\n\n for (const key in queryMethods) {\n const method = queryMethods[key] as (...args: unknown[]) => unknown;\n (proto.baseQuery 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":["defaultColumnTypes","getStackTrace","getCallerFilePath","filePath","snakeCaseKey","getColumnTypes","toSnakeCase","applyMixins","QueryHooks","q","rowIndex","getQueryAs","setQueryObjectValue","pushQueryOn","VirtualColumn","nestedInsert","nestedUpdate","key","pushQueryValue","values","columnIndexes","len","primaryKeys","foreignKeys","emptyArray","isQueryReturnsAll","_a","query","data","i","__spreadValues","ids","toArray","toSQLCacheKey","obj","__spreadProps","OrchidOrmInternalError","NotFoundError","records","item","Adapter","AsyncLocalStorage","Db","anyShape","columnTypes","options","addComputedColumns","getClonedQueryData"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/baseTable.ts","../src/relations/common/utils.ts","../src/relations/belongsTo.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 AfterHook,\n ColumnsShape,\n columnTypes as defaultColumnTypes,\n ComputedColumnsBase,\n Db,\n DefaultColumnTypes,\n getColumnTypes,\n Query,\n QueryAfterHook,\n QueryBase,\n QueryBeforeHook,\n QueryData,\n QueryHooks,\n QueryWithTable,\n RelationQueryBase,\n} from 'pqb';\nimport {\n applyMixins,\n ColumnShapeInput,\n ColumnShapeOutput,\n ColumnShapeQueryType,\n ColumnsShapeBase,\n EmptyObject,\n getCallerFilePath,\n getStackTrace,\n snakeCaseKey,\n toSnakeCase,\n} from 'orchid-core';\nimport { MapRelations } from './relations/relations';\nimport { OrchidORM } from './orm';\nimport { BelongsToOptions } from './relations/belongsTo';\nimport { HasOneOptions } from './relations/hasOne';\nimport { HasManyOptions } from './relations/hasMany';\nimport { HasAndBelongsToManyOptions } from './relations/hasAndBelongsToMany';\n\n// type of table class itself\nexport type TableClass<T extends Table = Table> = new () => T;\n\n// object with table classes, used on orchidORM() for setting tables\nexport type TableClasses = Record<string, TableClass>;\n\n// convert table instance type to queryable interface\n// processes relations to a type that's understandable by `pqb`\n// add ORM table specific metadata like `definedAt`, `db`, `getFilePath`\nexport type TableToDb<\n T extends Table,\n RelationQueries extends Record<string, RelationQueryBase>,\n> = Db<\n T['table'],\n T['columns'],\n RelationQueries,\n T['types'],\n T['computed'] extends ComputedColumnsBase<never>\n ? T['columns'] & {\n [K in keyof T['computed']]: ReturnType<T['computed'][K]>['_type'];\n }\n : T['columns']\n> & {\n definedAs: string;\n db: OrchidORM;\n getFilePath(): string;\n name: string;\n};\n\n// convert a table class type into queryable interface\n// add relation methods\nexport type DbTable<\n TC extends TableClass,\n T extends Table = InstanceType<TC>,\n RelationQueries extends Record<string, RelationQueryBase> = MapRelations<T>,\n Q extends QueryWithTable = TableToDb<T, RelationQueries>,\n Result extends QueryWithTable = Q & RelationQueries,\n> = Result;\n\n// `columns` property of table has a shape and an output type of the columns\n// callback with a query of relation, to use as a default scope\nexport type ScopeFn<Related extends TableClass, Scope extends Query> = (\n q: DbTable<Related>,\n) => Scope;\n\n// type of table instance created by a table class\nexport type Table = {\n // table name\n table: string;\n // columns shape and the record type\n columns: ColumnsShape;\n // database schema containing this table\n schema?: string;\n // column types defined in base table to use in `setColumns`\n types: unknown;\n // suppress no primary key warning\n noPrimaryKey?: boolean;\n // path to file where the table is defined\n filePath: string;\n // default language for the full text search\n language?: string;\n /**\n * collect computed columns returned by {@link BaseTable.setColumns}\n */\n computed?: ComputedColumnsBase<never>;\n};\n\n// Object type that's allowed in `where` and similar methods of the table.\nexport type Queryable<T extends Table> = Partial<\n ColumnShapeQueryType<T['columns']>\n>;\n\n// Object type of table's record that's returned from database and is parsed.\nexport type Selectable<T extends Table> = ColumnShapeOutput<T['columns']>;\n\n// Object type that conforms `create` method of the table.\nexport type Insertable<T extends Table> = ColumnShapeInput<T['columns']>;\n\n// Object type that conforms `update` method of the table.\nexport type Updateable<T extends Table> = Partial<Insertable<T>>;\n\n// type of before hook function for the table\ntype BeforeHookMethod = <T extends Table>(cb: QueryBeforeHook) => T;\n\n// type of after hook function for the table\ntype AfterHookMethod = <T extends Table>(cb: QueryAfterHook) => T;\n\n// type of after hook function that allows selecting columns for the table\ntype AfterSelectableHookMethod = <\n T extends Table,\n S extends (keyof T['columns'])[],\n>(\n this: T,\n select: S,\n cb: AfterHook<S, T['columns']>,\n) => T;\n\n// Couldn't manage it to work otherwise than specifying any\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SchemaProviderBase = any;\n\nexport interface BaseTableClass<\n ColumnTypes,\n SchemaProvider extends SchemaProviderBase,\n> {\n nowSQL: string | undefined;\n exportAs: string;\n schema: SchemaProvider;\n getFilePath(): string;\n\n new (): {\n table: string;\n columns: ColumnsShape;\n schema?: string;\n noPrimaryKey?: boolean;\n snakeCase?: boolean;\n types: ColumnTypes;\n q: QueryData;\n language?: string;\n filePath: string;\n result: ColumnsShapeBase;\n clone<T extends QueryBase>(this: T): T;\n getFilePath(): string;\n setColumns<T extends ColumnsShape>(fn: (t: ColumnTypes) => T): T;\n\n /**\n * You can add a generated column in the migration (see [generated](/guide/migration-column-methods.html#generated-column)),\n * such column will persist in the database, it can be indexed.\n *\n * Or you can add a computed column on the ORM level, without adding it to the database, in such a way:\n *\n * ```ts\n * import { BaseTable } from './baseTable';\n *\n * export class UserTable extends BaseTable {\n * readonly table = 'user';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * firstName: t.string(),\n * lastName: t.string(),\n * }));\n *\n * computed = this.setComputed({\n * fullName: (q) =>\n * q.sql`${q.column('firstName')} || ' ' || ${q.column('lastName')}`.type(\n * (t) => t.string(),\n * ),\n * });\n * }\n * ```\n *\n * `setComputed` takes an object where keys are computed column names, and values are functions returning raw SQL.\n *\n * Use `q.column` as shown above to reference a table column, it will be prefixed with a correct table name even if the table is joined under a different name.\n *\n * Computed columns are not selected by default, only on demand:\n *\n * ```ts\n * const a = await db.user.take();\n * a.fullName; // not selected\n *\n * const b = await db.user.select('*', 'fullName');\n * b.fullName; // selected\n *\n * // Table post belongs to user as an author.\n * // it's possible to select joined computed column:\n * const posts = await db.post\n * .join('author')\n * .select('post.title', 'author.fullName');\n * ```\n *\n * SQL query can be generated dynamically based on the current request context.\n *\n * Imagine we are using [AsyncLocalStorage](https://nodejs.org/api/async_context.html#asynchronous-context-tracking)\n * to keep track of current user's language.\n *\n * And we have articles translated to different languages, each article has `title_en`, `title_uk`, `title_be` and so on.\n *\n * We can define a computed `title` by passing a function into `sql` method:\n *\n * ```ts\n * type Locale = 'en' | 'uk' | 'be';\n * const asyncLanguageStorage = new AsyncLocalStorage<Locale>();\n * const defaultLocale: Locale = 'en';\n *\n * export class ArticleTable extends BaseTable {\n * readonly table = 'article';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * title_en: t.text(),\n * title_uk: t.text().nullable(),\n * title_be: t.text().nullable(),\n * }));\n *\n * computed = this.setComputed({\n * title: (q) =>\n * q\n * // .sql can take a function that accepts `sql` argument and must return SQL\n * .sql((sql) => {\n * // get locale dynamically based on current storage value\n * const locale = asyncLanguageStorage.getStore() || defaultLocale;\n *\n * // use COALESCE in case when localized title is NULL, use title_en\n * return sql`COALESCE(\n * ${q.column(`title_${locale}`)},\n * ${q.column(`title_${defaultLocale}`)}\n * )`;\n * })\n * .type((t) => t.text()),\n * });\n * }\n * ```\n *\n * @param computed - object where keys are column names and values are functions returning raw SQL\n */\n setComputed<\n Table extends string,\n Shape extends ColumnsShape,\n Computed extends ComputedColumnsBase<\n Db<Table, Shape, EmptyObject, ColumnTypes>\n >,\n >(\n computed: Computed,\n ): Computed;\n\n belongsTo<\n Self extends Table,\n Related extends TableClass,\n Scope extends Query,\n Options extends BelongsToOptions<Self, Related, Scope>,\n >(\n this: Self,\n fn: () => Related,\n options: Options,\n ): {\n type: 'belongsTo';\n fn: () => Related;\n options: Options;\n };\n\n hasOne<\n Self extends Table,\n Related extends TableClass,\n Scope extends Query,\n Through extends string,\n Source extends string,\n Options extends HasOneOptions<Self, Related, Scope, Through, Source>,\n >(\n this: Self,\n fn: () => Related,\n options: Options,\n ): {\n type: 'hasOne';\n fn: () => Related;\n options: Options;\n };\n\n hasMany<\n Self extends Table,\n Related extends TableClass,\n Scope extends Query,\n Through extends string,\n Source extends string,\n Options extends HasManyOptions<Self, Related, Scope, Through, Source>,\n >(\n this: Self,\n fn: () => Related,\n options: Options,\n ): {\n type: 'hasMany';\n fn: () => Related;\n options: Options;\n };\n\n hasAndBelongsToMany<\n Self extends Table,\n Related extends TableClass,\n Scope extends Query,\n Options extends HasAndBelongsToManyOptions<Self, Related, Scope>,\n >(\n this: Self,\n fn: () => Related,\n options: Options,\n ): {\n type: 'hasAndBelongsToMany';\n fn: () => Related;\n options: Options;\n };\n\n beforeQuery: BeforeHookMethod;\n afterQuery: AfterHookMethod;\n beforeCreate: BeforeHookMethod;\n afterCreate: AfterSelectableHookMethod;\n afterCreateCommit: AfterSelectableHookMethod;\n beforeUpdate: BeforeHookMethod;\n afterUpdate: AfterSelectableHookMethod;\n afterUpdateCommit: AfterSelectableHookMethod;\n beforeSave: BeforeHookMethod;\n afterSave: AfterSelectableHookMethod;\n afterSaveCommit: AfterSelectableHookMethod;\n beforeDelete: BeforeHookMethod;\n afterDelete: AfterSelectableHookMethod;\n afterDeleteCommit: AfterSelectableHookMethod;\n };\n}\n\n// base table constructor\nexport const createBaseTable = <\n SchemaProvider extends SchemaProviderBase,\n ColumnTypes = DefaultColumnTypes,\n>({\n columnTypes: columnTypesArg,\n snakeCase,\n filePath: filePathArg,\n nowSQL,\n exportAs = 'BaseTable',\n language,\n schemaProvider: schemaProviderArg,\n}: {\n // concrete column types or a callback for overriding standard column types\n // this types will be used in tables to define their columns\n columnTypes?: ColumnTypes | ((t: DefaultColumnTypes) => ColumnTypes);\n // when set to true, all columns will be translated to `snake_case` when querying database\n snakeCase?: boolean;\n // if for some unknown reason you see error that file path for a table can't be guessed automatically,\n // provide it manually via `filePath`\n filePath?: string;\n // if `now()` for some reason doesn't suite your timestamps, provide a custom SQL for it\n nowSQL?: string;\n // export name of the base table, by default it is BaseTable\n exportAs?: string;\n // default language for the full text search\n language?: string;\n // a function to prepare a validation schema based on table's columns,\n // it will be available as `TableClass.schema()` method.\n schemaProvider?: SchemaProvider;\n} = {}): BaseTableClass<ColumnTypes, SchemaProvider> => {\n const columnTypes = (\n typeof columnTypesArg === 'function'\n ? (columnTypesArg as (t: DefaultColumnTypes) => ColumnTypes)(\n defaultColumnTypes,\n )\n : columnTypesArg || defaultColumnTypes\n ) as ColumnTypes;\n\n // stack is needed only if filePath wasn't given\n const filePathOrStack = filePathArg || getStackTrace();\n\n let filePath: string | undefined;\n\n function schemaProvider(this: Table) {\n const schema = (schemaProviderArg as () => unknown).call(this);\n (this as unknown as { schema: () => unknown }).schema = () => schema;\n return schema;\n }\n\n const base = class BaseTable {\n static nowSQL = nowSQL;\n static exportAs = exportAs;\n static schema = schemaProvider as SchemaProvider;\n static getFilePath(): string {\n if (filePath) return filePath;\n if (typeof filePathOrStack === 'string') {\n return (filePath = filePathOrStack);\n }\n\n filePath = getCallerFilePath(filePathOrStack);\n if (filePath) return filePath;\n\n throw new Error(\n `Failed to determine file path of a base table. Please set the \\`filePath\\` option of \\`createBaseTable\\` manually.`,\n );\n }\n\n table!: string;\n columns!: ColumnsShape;\n schema?: string;\n noPrimaryKey?: boolean;\n snakeCase = snakeCase;\n types = columnTypes;\n q: QueryData = {} as QueryData;\n language = language;\n declare filePath: string;\n declare result: ColumnsShapeBase;\n\n clone<T extends QueryBase>(this: T): T {\n return this;\n }\n\n getFilePath() {\n if (this.filePath) return this.filePath;\n if (typeof filePathOrStack === 'string')\n return (this.filePath = filePathOrStack);\n\n const filePath = getCallerFilePath(filePathOrStack);\n if (filePath) return (this.filePath = filePath);\n\n throw new Error(\n `Failed to determine file path for table ${this.constructor.name}. Please set \\`filePath\\` property manually`,\n );\n }\n\n setColumns<T extends ColumnsShape>(fn: (t: ColumnTypes) => T): T {\n (columnTypes as { [snakeCaseKey]?: boolean })[snakeCaseKey] =\n this.snakeCase;\n\n const shape = getColumnTypes(columnTypes, fn, nowSQL, this.language);\n\n if (this.snakeCase) {\n for (const key in shape) {\n const column = shape[key];\n if (column.data.name) continue;\n\n const snakeName = toSnakeCase(key);\n if (snakeName !== key) {\n column.data.name = snakeName;\n }\n }\n }\n\n // Memoize columns in the prototype of class.\n // It is accessed in schema-to-tod.\n return (this.constructor.prototype.columns = shape);\n }\n\n setComputed<\n Table extends string,\n Shape extends ColumnsShape,\n Computed extends ComputedColumnsBase<\n Db<Table, Shape, EmptyObject, ColumnTypes>\n >,\n >(computed: Computed): Computed {\n return computed;\n }\n\n belongsTo<\n Self extends this,\n Related extends TableClass,\n Scope extends Query,\n Options extends BelongsToOptions<Self, Related, Scope>,\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'belongsTo' 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 HasOneOptions<Self, Related, Scope, Through, Source>,\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasOne' 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 HasManyOptions<Self, Related, Scope, Through, Source>,\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasMany' 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 HasAndBelongsToManyOptions<Self, Related, Scope>,\n >(this: Self, fn: () => Related, options: Options) {\n return {\n type: 'hasAndBelongsToMany' as const,\n fn,\n options,\n };\n }\n };\n\n applyMixins(base, [QueryHooks]);\n\n base.prototype.types = columnTypes as typeof base.prototype.types;\n\n return base as unknown as BaseTableClass<ColumnTypes, SchemaProvider>;\n};\n","import {\n CreateCtx,\n getQueryAs,\n JoinCallback,\n pushQueryOn,\n Query,\n RelationConfigBase,\n setQueryObjectValue,\n UpdateData,\n WhereArg,\n WhereQueryBase,\n} from 'pqb';\nimport { MaybeArray } from 'orchid-core';\nimport { HasOneNestedInsert, HasOneNestedUpdate } from '../hasOne';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from '../hasMany';\n\nexport type NestedInsertOneItem = {\n create?: NestedInsertOneItemCreate;\n connect?: NestedInsertOneItemConnect;\n connectOrCreate?: NestedInsertOneItemConnectOrCreate;\n};\n\nexport type NestedInsertOneItemCreate = Record<string, unknown>;\n\nexport type NestedInsertOneItemConnect = WhereArg<WhereQueryBase>;\n\nexport type NestedInsertOneItemConnectOrCreate = {\n where: WhereArg<WhereQueryBase>;\n create: Record<string, unknown>;\n};\n\nexport type NestedInsertManyItems = {\n create?: NestedInsertManyCreate;\n connect?: NestedInsertManyConnect;\n connectOrCreate?: NestedInsertManyConnectOrCreate;\n};\n\nexport type NestedInsertManyCreate = Record<string, unknown>[];\n\nexport type NestedInsertManyConnect = WhereArg<WhereQueryBase>[];\n\nexport type NestedInsertManyConnectOrCreate = {\n where: WhereArg<WhereQueryBase>;\n create: Record<string, unknown>;\n}[];\n\nexport type NestedInsertItem = NestedInsertOneItem | NestedInsertManyItems;\n\nexport type NestedUpdateOneItem = {\n disconnect?: boolean;\n set?: WhereArg<WhereQueryBase>;\n delete?: boolean;\n update?: UpdateData<Query>;\n upsert?: {\n update: UpdateData<Query>;\n create: Record<string, unknown> | (() => Record<string, unknown>);\n };\n create: Record<string, unknown>;\n};\n\nexport type NestedUpdateManyItems = {\n disconnect?: MaybeArray<WhereArg<WhereQueryBase>>;\n set?: MaybeArray<WhereArg<WhereQueryBase>>;\n delete?: MaybeArray<WhereArg<WhereQueryBase>>;\n update?: {\n where: MaybeArray<WhereArg<WhereQueryBase>>;\n data: UpdateData<Query>;\n };\n create: Record<string, unknown>[];\n};\n\nexport type NestedUpdateItem = NestedUpdateOneItem | NestedUpdateManyItems;\n\nexport const getThroughRelation = (\n table: Query,\n through: string,\n): RelationConfigBase => {\n return table.relations[through]?.relationConfig;\n};\n\nexport const getSourceRelation = (\n throughRelation: RelationConfigBase,\n source: string,\n): RelationConfigBase => {\n return throughRelation.table.relations[source]?.relationConfig;\n};\n\nexport const hasRelationHandleCreate = (\n q: Query,\n ctx: CreateCtx,\n item: Record<string, unknown>,\n rowIndex: number,\n key: string,\n primaryKeys: 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.q.wrapInTransaction = true;\n\n const relationData = [values];\n store.hasRelation[key] = relationData;\n\n q._afterCreate(primaryKeys, (rows, q) =>\n (nestedInsert as HasOneNestedInsert)(\n q,\n relationData.map(([rowIndex, data]) => [\n rows[rowIndex],\n data as NestedInsertOneItem,\n ]),\n ),\n );\n};\n\nexport const hasRelationHandleUpdate = (\n q: Query,\n set: Record<string, unknown>,\n key: string,\n primaryKeys: 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 selectIfNotSelected(q, primaryKeys);\n\n q.q.wrapInTransaction = true;\n\n q._afterUpdate(q.primaryKeys, (rows, q) => {\n return (nestedUpdate as HasOneNestedUpdate)(\n q,\n rows,\n value as NestedUpdateOneItem,\n );\n });\n};\n\nexport const selectIfNotSelected = (q: Query, columns: string[]) => {\n const select = q.q.select || [];\n if (!select.includes('*')) {\n for (const column of columns) {\n if (!select.includes(column)) {\n select.push(column);\n }\n }\n q.q.select = select;\n }\n};\n\nexport const relationWhere =\n (len: number, keys: string[], valueKeys: string[]) =>\n (params: Record<string, unknown>) => {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[keys[i]] = params[valueKeys[i]];\n }\n return obj;\n };\n\nexport function joinHasThrough(\n q: Query,\n fromQuery: Query,\n toQuery: Query,\n throughRelation: RelationConfigBase,\n sourceRelation: RelationConfigBase,\n): Query {\n return q.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\nexport function joinHasRelation(\n fromQuery: Query,\n toQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n len: number,\n) {\n const q = toQuery.clone();\n\n setQueryObjectValue(\n q,\n 'joinedShapes',\n (fromQuery.q.as || fromQuery.table) as string,\n fromQuery.q.shape,\n );\n\n for (let i = 0; i < len; i++) {\n pushQueryOn(q, fromQuery, toQuery, foreignKeys[i], primaryKeys[i]);\n }\n\n return q;\n}\n","import { DbTable, Table, TableClass } from '../baseTable';\nimport {\n CreateCtx,\n CreateData,\n InsertQueryData,\n isQueryReturnsAll,\n pushQueryOn,\n pushQueryValue,\n Query,\n QueryResult,\n QueryWithTable,\n SelectQueryData,\n setQueryObjectValue,\n SetQueryTableAlias,\n UpdateCtx,\n UpdateData,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport {\n RelationData,\n RelationThunkBase,\n RelationToOneDataForCreate,\n} from './relations';\nimport {\n NestedInsertOneItem,\n NestedInsertOneItemConnect,\n NestedInsertOneItemConnectOrCreate,\n NestedInsertOneItemCreate,\n NestedUpdateOneItem,\n relationWhere,\n selectIfNotSelected,\n} from './common/utils';\nimport { emptyArray, EmptyObject } from 'orchid-core';\nimport {\n RelationCommonOptions,\n RelationKeysOptions,\n RelationRefsOptions,\n RelationRefsOrKeysOptions,\n} from './common/options';\n\nexport type BelongsTo = RelationThunkBase & {\n type: 'belongsTo';\n options: BelongsToOptions;\n};\n\nexport type BelongsToOptions<\n Self extends Table = Table,\n Related extends TableClass = TableClass,\n Scope extends Query = Query,\n> = RelationCommonOptions<Related, Scope> &\n RelationRefsOrKeysOptions<\n keyof Self['columns'],\n keyof InstanceType<Related>['columns'],\n keyof InstanceType<Related>['columns'],\n keyof Self['columns']\n >;\n\nexport type BelongsToInfo<\n T extends Table,\n Relation extends BelongsTo,\n K extends string,\n FK extends string = Relation['options'] extends RelationRefsOptions\n ? Relation['options']['columns'][number]\n : Relation['options'] extends RelationKeysOptions\n ? Relation['options']['foreignKey']\n : never,\n Q extends QueryWithTable = SetQueryTableAlias<\n DbTable<ReturnType<Relation['fn']>>,\n K\n >,\n DataForCreate = RelationToOneDataForCreate<{\n nestedCreateQuery: Q;\n table: Q;\n }>,\n Required = Relation['options']['required'] extends true ? true : false,\n> = {\n table: Q;\n query: Q;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n one: true;\n required: Required;\n omitForeignKeyInCreate: FK;\n requiredDataForCreate:\n | { [L in FK]: T['columns'][L]['inputType'] }\n | (Required extends true\n ? { [Key in K]: DataForCreate }\n : { [Key in K]?: DataForCreate });\n optionalDataForCreate: EmptyObject;\n // `belongsTo` relation data available for update. It supports:\n // - `disconnect` to nullify a foreign key for the relation\n // - `set` to update the foreign key with a relation primary key found by conditions\n // - `delete` to delete the related record, nullify the foreign key\n // - `update` to update the related record\n // - `create` to create the related record\n dataForUpdate:\n | { disconnect: boolean }\n | { set: WhereArg<Q> }\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | {\n create: CreateData<Q>;\n };\n // Only for records that updates a single record:\n // - `upsert` to update or create the related record\n dataForUpdateOne: {\n upsert: {\n update: UpdateData<Q>;\n create: CreateData<Q> | (() => CreateData<Q>);\n };\n };\n\n params: { [K in FK]: T['columns'][FK]['type'] };\n populate: never;\n chainedCreate: false;\n chainedDelete: false;\n};\n\ntype State = {\n query: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n len: number;\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 queries?: ((queryResult: QueryResult) => Promise<void>)[];\n updateData?: Record<string, unknown>;\n },\n) => void;\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: { primaryKeys, foreignKeys },\n } = this;\n\n const columnIndexes = foreignKeys.map((key) => {\n let index = ctx.columns.get(key);\n if (index === undefined) {\n ctx.columns.set(key, (index = ctx.columns.size));\n }\n return index;\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, columnIndexes, 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.q.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.q as InsertQueryData;\n for (let i = 0, len = relationData.length; i < len; i++) {\n const [rowIndex, columnIndexes] = relationData[i];\n const row = (values as unknown[][])[rowIndex];\n\n for (let c = 0, len = columnIndexes.length; c < len; c++) {\n row[columnIndexes[c]] = inserted[i][primaryKeys[c]];\n }\n }\n });\n }\n\n update(q: Query, ctx: UpdateCtx, set: Record<string, unknown>) {\n q.q.wrapInTransaction = true;\n\n const data = set[this.key] as NestedUpdateOneItem;\n this.nestedUpdate(q, set, data, ctx);\n }\n}\n\nexport const makeBelongsToMethod = (\n relation: BelongsTo,\n relationName: string,\n query: Query,\n): RelationData => {\n const primaryKeys =\n 'columns' in relation.options\n ? relation.options.references\n : [relation.options.primaryKey];\n\n const foreignKeys =\n 'columns' in relation.options\n ? relation.options.columns\n : [relation.options.foreignKey];\n\n const len = primaryKeys.length;\n const state: State = { query, primaryKeys, foreignKeys, len };\n const makeWhere = relationWhere(len, primaryKeys, foreignKeys);\n\n const join = (\n fromQuery: Query,\n toQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n ) => {\n const q = toQuery.clone();\n setQueryObjectValue(\n q,\n 'joinedShapes',\n (fromQuery.q.as || fromQuery.table) as string,\n fromQuery.q.shape,\n );\n\n for (let i = 0; i < len; i++) {\n pushQueryOn(q, fromQuery, toQuery, primaryKeys[i], foreignKeys[i]);\n }\n\n return q;\n };\n\n return {\n returns: 'one',\n method(params: Record<string, unknown>) {\n return query.where(makeWhere(params));\n },\n virtualColumn: new BelongsToVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return join(fromQuery, toQuery, primaryKeys, foreignKeys);\n },\n reverseJoin(fromQuery, toQuery) {\n return join(toQuery, fromQuery, foreignKeys, primaryKeys);\n },\n };\n};\n\nconst nestedInsert = ({ query, primaryKeys }: State) => {\n return (async (_, data) => {\n const t = query.clone();\n\n // array to store specific items will be reused\n const items: Record<string, unknown>[] = [];\n for (const item of data) {\n if (item.connectOrCreate) {\n items.push(item);\n }\n }\n\n let connectOrCreated: unknown[];\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n items[i] = t.findByOptional(\n (items[i].connectOrCreate as NestedInsertOneItemConnectOrCreate)\n .where,\n );\n }\n\n connectOrCreated = await Promise.all(items);\n } else {\n connectOrCreated = emptyArray;\n }\n\n let connectOrCreatedI = 0;\n items.length = 0;\n for (const item of data) {\n if (item.connectOrCreate) {\n if (!connectOrCreated[connectOrCreatedI++]) items.push(item);\n } else if (item.create) {\n items.push(item);\n }\n }\n\n let created: unknown[];\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n items[i] =\n 'create' in items[i]\n ? (items[i].create as NestedInsertOneItemCreate)\n : (items[i].connectOrCreate as NestedInsertOneItemConnectOrCreate)\n .create;\n }\n\n created = await t.select(...primaryKeys)._createMany(items);\n } else {\n created = emptyArray;\n }\n\n items.length = 0;\n for (const item of data) {\n if (item.connect) {\n items.push(item);\n }\n }\n\n let connected: unknown[];\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n items[i] = t.findBy(items[i].connect as NestedInsertOneItemConnect);\n }\n\n connected = await Promise.all(items);\n } else {\n connected = emptyArray;\n }\n\n let createdI = 0;\n let connectedI = 0;\n connectOrCreatedI = 0;\n return data.map((item) => {\n return 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, primaryKeys, foreignKeys, len }: 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 idsForDelete: [unknown, ...unknown[]][] | undefined;\n\n q._beforeUpdate(async (q) => {\n if (params.disconnect) {\n for (const key of foreignKeys) {\n update[key] = null;\n }\n } else if (params.set) {\n let loadPrimaryKeys: string[] | undefined;\n let loadForeignKeys: string[] | undefined;\n for (let i = 0; i < len; i++) {\n const primaryKey = primaryKeys[i];\n if (primaryKey in params.set) {\n update[foreignKeys[i]] =\n params.set[primaryKey as keyof typeof params.set];\n } else {\n (loadPrimaryKeys ??= []).push(primaryKey);\n (loadForeignKeys ??= []).push(foreignKeys[i]);\n }\n }\n if (loadPrimaryKeys) {\n const record = await query\n .select(...loadPrimaryKeys)\n ._findBy(params.set);\n\n for (let i = 0, len = loadPrimaryKeys.length; i < len; i++) {\n update[(loadForeignKeys as string[])[i]] =\n record[loadPrimaryKeys[i]];\n }\n }\n } else if (params.create) {\n const q = query.clone();\n q.q.select = primaryKeys;\n const record = await q._create(params.create);\n for (let i = 0; i < len; i++) {\n update[foreignKeys[i]] = record[primaryKeys[i]];\n }\n } else if (params.delete) {\n const selectQuery = q.clone();\n selectQuery.q.type = undefined;\n (selectQuery.q as SelectQueryData).distinct = emptyArray;\n idsForDelete = (await selectQuery._rows()) as [unknown, ...unknown[]][];\n for (const foreignKey of foreignKeys) {\n update[foreignKey] = null;\n }\n }\n });\n\n const { upsert } = params;\n if (upsert || params.update || params.delete) {\n selectIfNotSelected(q, foreignKeys);\n }\n\n if (upsert) {\n (state.queries ??= []).push(async (queryResult) => {\n const row = queryResult.rows[0];\n let obj: Record<string, unknown> | undefined = {};\n for (let i = 0; i < len; i++) {\n const id = row[foreignKeys[i]];\n if (id === null) {\n obj = undefined;\n break;\n }\n\n obj[primaryKeys[i]] = id;\n }\n\n if (obj) {\n await query.findBy(obj)._update<WhereResult<Query>>(upsert.update);\n } else {\n const data =\n typeof upsert.create === 'function'\n ? upsert.create()\n : upsert.create;\n const result = await query.select(...primaryKeys)._create(data);\n\n for (let i = 0; i < len; i++) {\n (state.updateData ??= {})[foreignKeys[i]] = result[primaryKeys[i]];\n }\n }\n });\n } else if (params.delete || params.update) {\n q._afterUpdate([], async (data) => {\n let ids: [unknown, ...unknown[]][] | undefined;\n\n if (params.delete) {\n ids = idsForDelete;\n } else {\n ids = [];\n for (const item of data) {\n let row: unknown[] | undefined;\n for (const foreignKey of foreignKeys) {\n const id = (item as Record<string, unknown>)[foreignKey];\n if (id === null) {\n row = undefined;\n break;\n } else {\n (row ??= []).push(id);\n }\n }\n if (row) ids.push(row as [unknown, ...unknown[]]);\n }\n }\n\n if (!ids?.length) return;\n\n const t = query.whereIn(\n primaryKeys as [string, ...string[]],\n ids as [unknown, ...unknown[]][],\n );\n\n if (params.delete) {\n await t._delete();\n } else {\n await t._update<WhereResult<Query>>(\n params.update as UpdateData<Query>,\n );\n }\n });\n }\n }) as BelongsToNestedUpdate;\n};\n","import {\n CreateCtx,\n CreateData,\n InsertQueryData,\n isQueryReturnsAll,\n JoinCallback,\n Query,\n QueryWithTable,\n SetQueryTableAlias,\n UpdateCtx,\n UpdateData,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { DbTable, Table, TableClass } from '../baseTable';\nimport {\n RelationData,\n RelationConfig,\n RelationThunkBase,\n RelationThunks,\n RelationToOneDataForCreate,\n} from './relations';\nimport {\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n joinHasRelation,\n joinHasThrough,\n NestedInsertOneItem,\n NestedInsertOneItemConnect,\n NestedInsertOneItemConnectOrCreate,\n NestedInsertOneItemCreate,\n NestedUpdateOneItem,\n} from './common/utils';\nimport { EmptyObject } from 'orchid-core';\nimport {\n RelationCommonOptions,\n RelationHasOptions,\n RelationKeysOptions,\n RelationRefsOptions,\n RelationThroughOptions,\n} from './common/options';\n\nexport type HasOne = RelationThunkBase & {\n type: 'hasOne';\n options: HasOneOptions;\n};\n\nexport type HasOneOptions<\n Self extends Table = Table,\n Related extends TableClass = TableClass,\n Scope extends Query = Query,\n Through extends string = string,\n Source extends string = string,\n> = RelationCommonOptions<Related, Scope> &\n (\n | RelationHasOptions<\n keyof Self['columns'],\n keyof InstanceType<Related>['columns']\n >\n | RelationThroughOptions<Through, Source>\n );\n\nexport type HasOneInfo<\n T extends Table,\n Relations extends RelationThunks,\n Relation extends HasOne,\n K extends string,\n Populate extends string = Relation['options'] extends RelationRefsOptions\n ? Relation['options']['references'][number]\n : Relation['options'] extends RelationKeysOptions\n ? Relation['options']['foreignKey']\n : never,\n TC extends TableClass = ReturnType<Relation['fn']>,\n Q extends QueryWithTable = SetQueryTableAlias<DbTable<TC>, K>,\n NestedCreateQuery extends Query = Relation['options'] extends RelationThroughOptions\n ? Q\n : Q & {\n meta: { defaults: Record<Populate, true> };\n },\n> = {\n table: Q;\n query: Q;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n one: true;\n required: Relation['options']['required'] extends true ? true : false;\n omitForeignKeyInCreate: never;\n requiredDataForCreate: EmptyObject;\n optionalDataForCreate: Relation['options'] extends RelationThroughOptions\n ? EmptyObject\n : {\n [P in K]?: RelationToOneDataForCreate<{\n nestedCreateQuery: NestedCreateQuery;\n table: Q;\n }>;\n };\n // `hasOne` relation data available for update. It supports:\n // - `disconnect` to nullify a foreign key of the related record\n // - `delete` to delete the related record\n // - `update` to update the related record\n dataForUpdate:\n | { disconnect: boolean }\n | { delete: boolean }\n | { update: UpdateData<Q> };\n // Only for records that updates a single record:\n // - `set` to update the foreign key of related record found by condition\n // - `upsert` to update or create the related record\n // - `create` to create a related record\n dataForUpdateOne:\n | { set: WhereArg<Q> }\n | {\n upsert: {\n update: UpdateData<Q>;\n create:\n | CreateData<NestedCreateQuery>\n | (() => CreateData<NestedCreateQuery>);\n };\n }\n | {\n create: CreateData<NestedCreateQuery>;\n };\n\n params: Relation['options'] extends RelationRefsOptions\n ? {\n [K in Relation['options']['columns'][number]]: T['columns'][K]['type'];\n }\n : Relation['options'] extends RelationKeysOptions\n ? Record<\n Relation['options']['primaryKey'],\n T['columns'][Relation['options']['primaryKey']]['type']\n >\n : Relation['options'] extends RelationThroughOptions\n ? RelationConfig<\n T,\n Relations,\n Relations[Relation['options']['through']],\n Relation['options']['through']\n >['params']\n : never;\n populate: Populate;\n chainedCreate: Relation['options'] extends RelationThroughOptions\n ? false\n : true;\n chainedDelete: true;\n};\n\ntype State = {\n query: Query;\n primaryKeys: string[];\n foreignKeys: 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.primaryKeys,\n this.nestedInsert,\n );\n }\n\n update(q: Query, _: UpdateCtx, set: Record<string, unknown>) {\n const params = set[this.key] as NestedUpdateOneItem;\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 hasRelationHandleUpdate(\n q,\n set,\n this.key,\n this.state.primaryKeys,\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 ('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 joinHasThrough(\n toQuery,\n fromQuery,\n toQuery,\n throughRelation,\n sourceRelation,\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return joinHasThrough(\n fromQuery,\n fromQuery,\n toQuery,\n throughRelation,\n sourceRelation,\n );\n },\n };\n }\n\n const primaryKeys =\n 'columns' in relation.options\n ? relation.options.columns\n : [relation.options.primaryKey];\n\n const foreignKeys =\n 'columns' in relation.options\n ? relation.options.references\n : [relation.options.foreignKey];\n\n const state: State = { query, primaryKeys, foreignKeys };\n const len = primaryKeys.length;\n\n const reversedOn: Record<string, string> = {};\n for (let i = 0; i < len; i++) {\n reversedOn[foreignKeys[i]] = primaryKeys[i];\n }\n\n const fromQuerySelect = [{ selectAs: reversedOn }];\n\n return {\n returns: 'one',\n method: (params: Record<string, unknown>) => {\n const values: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n values[foreignKeys[i]] = params[primaryKeys[i]];\n }\n return query.where(values)._defaults(values);\n },\n virtualColumn: new HasOneVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return joinHasRelation(fromQuery, toQuery, primaryKeys, foreignKeys, len);\n },\n reverseJoin(fromQuery, toQuery) {\n return joinHasRelation(toQuery, fromQuery, foreignKeys, primaryKeys, len);\n },\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const fromQuery = query.clone();\n fromQuery.q.select = fromQuerySelect;\n const q = relationQuery.q as InsertQueryData;\n q.kind = 'from';\n q.values = { from: fromQuery };\n };\n },\n };\n};\n\nconst nestedInsert = ({ query, primaryKeys, foreignKeys }: State) => {\n return (async (_, data) => {\n const t = query.clone();\n\n // array to store specific items will be reused\n const items: unknown[] = [];\n for (const item of data) {\n if (item[1].connect || item[1].connectOrCreate) {\n items.push(item);\n }\n }\n\n let connected: number[];\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, item] = items[i] as [\n Record<string, unknown>,\n Record<string, unknown>,\n ];\n\n const data: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n data[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n items[i] =\n 'connect' in item\n ? (\n t.where(item.connect as NestedInsertOneItemConnect) as Omit<\n Query,\n 'meta'\n > & {\n meta: Omit<Query['meta'], 'hasSelect' | 'hasWhere'> & {\n hasWhere: true;\n };\n }\n )._updateOrThrow(data as UpdateData<WhereResult<Query>>)\n : (\n t.where(\n (item.connectOrCreate as NestedInsertOneItemConnectOrCreate)\n .where,\n ) as Omit<Query, 'meta'> & {\n meta: Omit<Query['meta'], 'hasSelect' | 'hasWhere'> & {\n hasWhere: true;\n };\n }\n )._update(data as UpdateData<WhereResult<Query>>);\n }\n\n connected = (await Promise.all(items)) as number[];\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n if (!connected[connectedI++]) {\n items.push(item);\n }\n } else if (item[1].create) {\n items.push(item);\n }\n }\n\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, item] = items[i] as [\n Record<string, unknown>,\n Record<string, unknown>,\n ];\n const data: Record<string, unknown> = {\n ...('create' in item\n ? (item.create as NestedInsertOneItemCreate)\n : (item.connectOrCreate as NestedInsertOneItemConnectOrCreate)\n .create),\n };\n\n for (let i = 0; i < primaryKeys.length; i++) {\n data[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n items[i] = data;\n }\n\n await t.insertMany(items as Record<string, unknown>[]);\n }\n }) as HasOneNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKeys, foreignKeys }: State) => {\n const len = primaryKeys.length;\n\n const setNulls: Record<string, unknown> = {};\n for (const foreignKey of foreignKeys) {\n setNulls[foreignKey] = null;\n }\n\n return (async (_, data, params) => {\n const t = query.clone();\n const ids = data.map((item) =>\n primaryKeys.map((primaryKey) => item[primaryKey]),\n );\n\n const currentRelationsQuery = t.whereIn(\n foreignKeys as [string, ...string[]],\n ids as [unknown, ...unknown[]][],\n );\n\n if (params.create || params.disconnect || params.set) {\n await currentRelationsQuery._update(\n setNulls as UpdateData<WhereResult<Query>>,\n );\n\n const record = data[0];\n\n if (params.create) {\n const obj: Record<string, unknown> = { ...params.create };\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = record[primaryKeys[i]];\n }\n\n await t.insert(obj);\n }\n\n if (params.set) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = record[primaryKeys[i]];\n }\n\n await t\n ._where<Query>(params.set)\n ._update(obj as UpdateData<WhereResult<Query>>);\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 currentRelationsQuery.q.select = foreignKeys;\n const updatedIds = (await currentRelationsQuery\n ._rows()\n ._update(update as never)) as unknown as unknown[][];\n\n if (updatedIds.length < ids.length) {\n const data = typeof create === 'function' ? create() : create;\n\n await t.createMany(\n ids.reduce((rows: Record<string, unknown>[], ids) => {\n if (\n !updatedIds.some((updated) =>\n updated.every((value, i) => value === ids[i]),\n )\n ) {\n const obj: Record<string, unknown> = { ...data };\n\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = ids[i];\n }\n\n rows.push(obj);\n }\n\n return rows;\n }, []),\n );\n }\n }\n }) as HasOneNestedUpdate;\n};\n","import {\n RelationData,\n RelationConfig,\n RelationThunkBase,\n RelationThunks,\n RelationToManyDataForCreate,\n} from './relations';\nimport { DbTable, Table, TableClass } from '../baseTable';\nimport {\n CreateData,\n JoinCallback,\n Query,\n toSQLCacheKey,\n WhereArg,\n WhereResult,\n InsertQueryData,\n isQueryReturnsAll,\n VirtualColumn,\n CreateCtx,\n UpdateCtx,\n WhereQueryBase,\n SetQueryTableAlias,\n UpdateData,\n QueryWithTable,\n} from 'pqb';\nimport { EmptyObject, MaybeArray, toArray } from 'orchid-core';\nimport {\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n joinHasRelation,\n joinHasThrough,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n NestedUpdateManyItems,\n} from './common/utils';\nimport { HasOneOptions } from './hasOne';\nimport {\n RelationKeysOptions,\n RelationRefsOptions,\n RelationThroughOptions,\n} from './common/options';\n\nexport type HasMany = RelationThunkBase & {\n type: 'hasMany';\n options: HasManyOptions;\n};\n\nexport type HasManyOptions<\n Self extends Table = Table,\n Related extends TableClass = TableClass,\n Scope extends Query = Query,\n Through extends string = string,\n Source extends string = string,\n> = HasOneOptions<Self, Related, Scope, Through, Source>;\n\nexport type HasManyInfo<\n T extends Table,\n Relations extends RelationThunks,\n Relation extends HasMany,\n K extends string,\n Populate extends string = Relation['options'] extends RelationRefsOptions\n ? Relation['options']['references'][number]\n : Relation['options'] extends RelationKeysOptions\n ? Relation['options']['foreignKey']\n : never,\n TC extends TableClass = ReturnType<Relation['fn']>,\n Q extends QueryWithTable = SetQueryTableAlias<DbTable<TC>, K>,\n NestedCreateQuery extends Query = Relation['options'] extends RelationThroughOptions\n ? Q\n : Q & {\n meta: { defaults: Record<Populate, true> };\n },\n> = {\n table: Q;\n query: Q;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n one: false;\n required: Relation['options']['required'] extends true ? true : false;\n omitForeignKeyInCreate: never;\n requiredDataForCreate: EmptyObject;\n optionalDataForCreate: {\n [P in K]?: Relation['options'] extends RelationThroughOptions\n ? EmptyObject\n : RelationToManyDataForCreate<{\n nestedCreateQuery: NestedCreateQuery;\n table: Q;\n }>;\n };\n // `hasMany` relation data available for update. It supports:\n // - `disconnect` to nullify foreign keys of the related records\n // - `delete` to delete related record found by conditions\n // - `update` to update related records found by conditions with a provided data\n dataForUpdate: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: {\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n };\n };\n // Only for records that updates a single record:\n // - `set` to update foreign keys of related records found by conditions\n // - `create` to create related records\n dataForUpdateOne: {\n set?: MaybeArray<WhereArg<Q>>;\n create?: CreateData<NestedCreateQuery>[];\n };\n\n params: Relation['options'] extends RelationRefsOptions\n ? {\n [K in Relation['options']['columns'][number]]: T['columns'][K]['type'];\n }\n : Relation['options'] extends RelationKeysOptions\n ? Record<\n Relation['options']['primaryKey'],\n T['columns'][Relation['options']['primaryKey']]['type']\n >\n : Relation['options'] extends RelationThroughOptions\n ? RelationConfig<\n T,\n Relations,\n Relations[Relation['options']['through']],\n Relation['options']['through']\n >['params']\n : never;\n populate: Populate;\n chainedCreate: Relation['options'] extends RelationThroughOptions\n ? false\n : true;\n chainedDelete: true;\n};\n\ntype State = {\n query: Query;\n primaryKeys: string[];\n foreignKeys: 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.primaryKeys,\n this.nestedInsert,\n );\n }\n\n update(q: Query, _: UpdateCtx, set: Record<string, unknown>) {\n const params = set[this.key] as NestedUpdateManyItems;\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 hasRelationHandleUpdate(\n q,\n set,\n this.key,\n this.state.primaryKeys,\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 joinHasThrough(\n toQuery,\n fromQuery,\n toQuery,\n throughRelation,\n sourceRelation,\n );\n },\n reverseJoin(fromQuery, toQuery) {\n return joinHasThrough(\n fromQuery,\n fromQuery,\n toQuery,\n throughRelation,\n sourceRelation,\n );\n },\n };\n }\n\n const primaryKeys =\n 'columns' in relation.options\n ? relation.options.columns\n : [relation.options.primaryKey];\n\n const foreignKeys =\n 'columns' in relation.options\n ? relation.options.references\n : [relation.options.foreignKey];\n\n const state: State = { query, primaryKeys, foreignKeys };\n const len = primaryKeys.length;\n\n const reversedOn: Record<string, string> = {};\n for (let i = 0; i < len; i++) {\n reversedOn[foreignKeys[i]] = primaryKeys[i];\n }\n\n const fromQuerySelect = [{ selectAs: reversedOn }];\n\n return {\n returns: 'many',\n method: (params: Record<string, unknown>) => {\n const values: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n values[foreignKeys[i]] = params[primaryKeys[i]];\n }\n return query.where(values)._defaults(values);\n },\n virtualColumn: new HasManyVirtualColumn(relationName, state),\n joinQuery(fromQuery, toQuery) {\n return joinHasRelation(fromQuery, toQuery, primaryKeys, foreignKeys, len);\n },\n reverseJoin(fromQuery, toQuery) {\n return joinHasRelation(toQuery, fromQuery, foreignKeys, primaryKeys, len);\n },\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const fromQuery = query.clone();\n fromQuery.q.select = fromQuerySelect;\n const q = relationQuery.q as InsertQueryData;\n q.kind = 'from';\n q.values = { from: fromQuery };\n };\n },\n };\n};\n\nconst getWhereForNestedUpdate = (\n t: Query,\n data: Record<string, unknown>[],\n params: MaybeArray<WhereArg<WhereQueryBase>> | undefined,\n primaryKeys: string[],\n foreignKeys: string[],\n): WhereResult<Query> => {\n return t.where({\n IN: {\n columns: foreignKeys,\n values: data.map((item) => primaryKeys.map((key) => item[key])),\n },\n OR: params ? toArray(params) : undefined,\n });\n};\n\nconst nestedInsert = ({ query, primaryKeys, foreignKeys }: State) => {\n const len = primaryKeys.length;\n\n return (async (_, data) => {\n const t = query.clone();\n\n // array to store specific items will be reused\n const items: unknown[] = [];\n for (const item of data) {\n if (item[1].connect) {\n items.push(item);\n }\n }\n\n if (items.length) {\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, { connect }] = items[i] as [\n Record<string, unknown>,\n { connect: NestedInsertManyConnect },\n ];\n\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n items[i] = t\n .orWhere<Query>(...connect)\n ._updateOrThrow(obj as UpdateData<WhereResult<Query>>);\n }\n\n await Promise.all(items);\n }\n\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n items.push(item);\n }\n }\n\n let connected: number[];\n if (items.length) {\n const queries: Query[] = [];\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, { connectOrCreate }] = items[i] as [\n Record<string, unknown>,\n { connectOrCreate: NestedInsertManyConnectOrCreate },\n ];\n\n for (const item of connectOrCreate) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n queries.push(\n (\n t.where(item.where) as WhereResult<Query & { hasSelect: false }>\n )._update(obj as UpdateData<WhereResult<Query>>),\n );\n }\n }\n\n connected = (await Promise.all(queries)) as number[];\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n items.length = 0;\n for (const item of data) {\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) {\n items.push(item);\n break;\n }\n }\n } else if (item[1].create) {\n items.push(item);\n }\n }\n\n connectedI = 0;\n if (items.length) {\n const records: Record<string, unknown>[] = [];\n\n for (const [selfData, { create, connectOrCreate }] of items as [\n Record<string, unknown>,\n NestedInsertManyItems,\n ][]) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n if (create) {\n for (const item of create) {\n records.push({\n ...item,\n ...obj,\n });\n }\n }\n\n if (connectOrCreate) {\n for (const item of connectOrCreate) {\n if (connected[connectedI++] === 0) {\n records.push({\n ...item.create,\n ...obj,\n });\n }\n }\n }\n }\n\n await t._createMany(records);\n }\n }) as HasManyNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKeys, foreignKeys }: State) => {\n const len = primaryKeys.length;\n\n return (async (_, data, params) => {\n const t = query.clone();\n if (params.create) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = data[0][primaryKeys[i]];\n }\n\n await t.insertMany(\n params.create.map((create) => ({\n ...create,\n ...obj,\n })),\n );\n\n delete t.q[toSQLCacheKey];\n }\n\n if (params.disconnect || params.set) {\n const obj: Record<string, unknown> = {};\n for (const foreignKey of foreignKeys) {\n obj[foreignKey] = null;\n }\n\n await getWhereForNestedUpdate(\n t,\n data,\n params.disconnect,\n primaryKeys,\n foreignKeys,\n )._update(obj as UpdateData<WhereResult<Query>>);\n\n if (params.set) {\n delete t.q[toSQLCacheKey];\n\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = data[0][primaryKeys[i]];\n }\n\n await t\n .where<Query>(\n Array.isArray(params.set)\n ? {\n OR: params.set,\n }\n : params.set,\n )\n ._update(obj as UpdateData<WhereResult<Query>>);\n }\n }\n\n if (params.delete || params.update) {\n delete t.q[toSQLCacheKey];\n\n const q = getWhereForNestedUpdate(\n t,\n data,\n params.delete || params.update?.where,\n primaryKeys,\n foreignKeys,\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 {\n RelationData,\n RelationThunkBase,\n RelationToManyDataForCreate,\n} from './relations';\nimport { DbTable, Table, TableClass } from '../baseTable';\nimport {\n ColumnsShape,\n ColumnType,\n CreateCtx,\n CreateData,\n getQueryAs,\n NotFoundError,\n OrchidOrmInternalError,\n Query,\n QueryWithTable,\n SetQueryTableAlias,\n toSQLCacheKey,\n UpdateCtx,\n UpdateData,\n VirtualColumn,\n WhereArg,\n WhereResult,\n} from 'pqb';\nimport { EmptyObject, MaybeArray } from 'orchid-core';\nimport {\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n} from './common/utils';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from './hasMany';\nimport { RelationCommonOptions } from './common/options';\n\nexport type HasAndBelongsToMany = RelationThunkBase & {\n type: 'hasAndBelongsToMany';\n options: HasAndBelongsToManyOptions;\n};\n\nexport type HasAndBelongsToManyOptions<\n Self extends Table = Table,\n Related extends TableClass = TableClass,\n Scope extends Query = Query,\n> = RelationCommonOptions<Related, Scope> &\n (\n | {\n columns: (keyof Self['columns'])[];\n references: string[];\n through: {\n table: string;\n columns: string[];\n references: (keyof InstanceType<Related>['columns'])[];\n };\n }\n | {\n primaryKey: keyof Self['columns'];\n foreignKey: string;\n joinTable: string;\n associationPrimaryKey: string;\n associationForeignKey: keyof InstanceType<Related>['columns'];\n }\n );\n\nexport type HasAndBelongsToManyInfo<\n T extends Table,\n Relation extends HasAndBelongsToMany,\n K extends string,\n TC extends TableClass = ReturnType<Relation['fn']>,\n Q extends QueryWithTable = SetQueryTableAlias<DbTable<TC>, K>,\n> = {\n table: Q;\n query: Q;\n joinQuery(fromQuery: Query, toQuery: Query): Query;\n one: false;\n required: Relation['options']['required'] extends true ? true : false;\n omitForeignKeyInCreate: never;\n requiredDataForCreate: EmptyObject;\n optionalDataForCreate: {\n [P in K]?: RelationToManyDataForCreate<{\n nestedCreateQuery: Q;\n table: Q;\n }>;\n };\n // `hasAndBelongsToMany` relation data available for update. It supports:\n // - `disconnect` to delete join table records for related records found by conditions\n // - `set` to create join table records for related records found by conditions\n // - `delete` to delete join table records and related records found by conditions\n // - `update` to update related records found by conditions with a provided data\n // - `create` to create related records and a join table records\n dataForUpdate: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: {\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n };\n create?: CreateData<Q>[];\n };\n dataForUpdateOne: EmptyObject;\n\n params: Relation['options'] extends { columns: string[] }\n ? {\n [K in Relation['options']['columns'][number]]: T['columns'][K]['type'];\n }\n : Relation['options'] extends { primaryKey: string }\n ? Record<\n Relation['options']['primaryKey'],\n T['columns'][Relation['options']['primaryKey']]['type']\n >\n : never;\n populate: never;\n chainedCreate: true;\n chainedDelete: true;\n};\n\ntype State = {\n relatedTableQuery: Query;\n joinTableQuery: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n throughForeignKeys: string[];\n throughPrimaryKeys: string[];\n foreignKeysFull: string[];\n throughForeignKeysFull: string[];\n throughPrimaryKeysFull: 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.primaryKeys,\n this.nestedInsert,\n );\n }\n\n update(q: Query, _: UpdateCtx, set: Record<string, unknown>) {\n hasRelationHandleUpdate(\n q,\n set,\n this.key,\n this.state.primaryKeys,\n this.nestedUpdate,\n );\n }\n}\n\nconst removeColumnName = (column: ColumnType) => {\n if (!column.data.name) return column;\n\n const cloned = Object.create(column);\n cloned.data = { ...column.data, name: undefined };\n return cloned;\n};\n\nexport const makeHasAndBelongsToManyMethod = (\n table: Query,\n qb: Query,\n relation: HasAndBelongsToMany,\n relationName: string,\n query: Query,\n): RelationData => {\n let primaryKeys: string[];\n let foreignKeys: string[];\n let joinTable: string;\n let throughForeignKeys: string[];\n let throughPrimaryKeys: string[];\n\n const { options } = relation;\n if ('columns' in options) {\n primaryKeys = options.columns;\n foreignKeys = options.references;\n joinTable = options.through.table;\n throughForeignKeys = options.through.columns;\n throughPrimaryKeys = options.through.references;\n } else {\n primaryKeys = [options.primaryKey];\n foreignKeys = [options.foreignKey];\n joinTable = options.joinTable;\n throughForeignKeys = [options.associationForeignKey];\n throughPrimaryKeys = [options.associationPrimaryKey];\n }\n\n const foreignKeysFull = foreignKeys.map((key) => `${joinTable}.${key}`);\n const throughForeignKeysFull = throughForeignKeys.map(\n (key) => `${joinTable}.${key}`,\n );\n\n const foreignTable = getQueryAs(query);\n const throughPrimaryKeysFull = throughPrimaryKeys.map(\n (key) => `${foreignTable}.${key}`,\n );\n\n const len = primaryKeys.length;\n const throughLen = throughPrimaryKeys.length;\n\n const baseQuery = Object.create(qb.baseQuery);\n baseQuery.baseQuery = baseQuery;\n baseQuery.table = joinTable;\n\n const shape: ColumnsShape = {};\n for (let i = 0; i < len; i++) {\n shape[foreignKeys[i]] = removeColumnName(table.shape[primaryKeys[i]]);\n }\n for (let i = 0; i < throughLen; i++) {\n shape[throughForeignKeys[i]] = removeColumnName(\n query.shape[throughPrimaryKeys[i]],\n );\n }\n\n baseQuery.shape = shape;\n baseQuery.q = {\n ...baseQuery.q,\n shape: baseQuery.shape,\n };\n const subQuery = Object.create(baseQuery);\n\n const state: State = {\n relatedTableQuery: query,\n joinTableQuery: subQuery,\n primaryKeys,\n foreignKeys,\n throughForeignKeys,\n throughPrimaryKeys,\n foreignKeysFull,\n throughForeignKeysFull,\n throughPrimaryKeysFull,\n };\n\n const joinQuery = (toQuery: Query, tableAs: string, foreignAs: string) => {\n return toQuery.whereExists(subQuery, (q) => {\n for (let i = 0; i < throughLen; i++) {\n q._on(\n throughForeignKeysFull[i],\n `${foreignAs}.${throughPrimaryKeys[i]}`,\n );\n }\n\n for (let i = 0; i < len; i++) {\n q._on(foreignKeysFull[i], `${tableAs}.${primaryKeys[i]}`);\n }\n\n return q;\n });\n };\n\n const obj: Record<string, string> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = primaryKeys[i];\n }\n const selectPrimaryKeysAsForeignKeys = [{ selectAs: obj }];\n\n return {\n returns: 'many',\n method(params: Record<string, unknown>) {\n return query.whereExists(subQuery, (q) => {\n q = q.clone();\n\n const where: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n where[foreignKeysFull[i]] = params[primaryKeys[i]];\n }\n\n for (let i = 0; i < throughLen; i++) {\n q._on(throughForeignKeysFull[i], throughPrimaryKeysFull[i]);\n }\n\n return q._where(where);\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 const join = joinQuery(\n toQuery,\n getQueryAs(fromQuery),\n getQueryAs(toQuery),\n );\n\n join.q.joinedShapes = {\n ...join.q.joinedShapes,\n [(fromQuery.q.as || fromQuery.table) as string]: fromQuery.q.shape,\n };\n\n return join;\n },\n reverseJoin(fromQuery, toQuery) {\n return joinQuery(fromQuery, getQueryAs(fromQuery), getQueryAs(toQuery));\n },\n modifyRelatedQuery(relationQuery) {\n const ref = {} as { q: Query };\n\n relationQuery._afterCreate([], async (result: unknown[]) => {\n if (result.length > 1) {\n // TODO: currently this relies on `INSERT ... SELECT` that works only for 1 record\n // consider using `WITH` to reuse id of main table for multiple related ids\n throw new OrchidOrmInternalError(\n relationQuery,\n 'Creating multiple `hasAndBelongsToMany` records is not yet supported',\n );\n }\n\n const fromQuery = ref.q.clone();\n fromQuery.q.select = selectPrimaryKeysAsForeignKeys;\n\n const data: Record<string, unknown> = {};\n for (let i = 0; i < throughLen; i++) {\n data[throughForeignKeys[i]] = (result[0] as Record<string, unknown>)[\n throughPrimaryKeys[i]\n ];\n }\n\n const createdCount = await subQuery\n .count()\n ._createFrom(fromQuery, data);\n\n if (createdCount === 0) {\n throw new NotFoundError(fromQuery);\n }\n });\n\n return (q) => {\n ref.q = q;\n };\n },\n };\n};\n\nconst queryJoinTable = (\n state: State,\n data: Record<string, unknown>[],\n conditions?: MaybeArray<WhereArg<Query>>,\n) => {\n const t = state.joinTableQuery.where({\n IN: {\n columns: state.foreignKeys,\n values: data.map((item) => state.primaryKeys.map((key) => item[key])),\n },\n });\n\n if (conditions) {\n t._where({\n IN: {\n columns: state.throughForeignKeys,\n values: state.relatedTableQuery\n .where(conditionsToWhereArg(conditions))\n ._select(...state.throughPrimaryKeys),\n },\n });\n }\n\n return t;\n};\n\nconst conditionsToWhereArg = (\n conditions: MaybeArray<WhereArg<Query>>,\n): WhereArg<Query> =>\n Array.isArray(conditions) ? { OR: conditions } : conditions;\n\nconst insertToJoinTable = (\n state: State,\n joinTableTransaction: Query,\n data: Record<string, unknown>[],\n idsRows: unknown[][],\n) => {\n const len = state.primaryKeys.length;\n const throughLen = state.throughPrimaryKeys.length;\n\n const records: Record<string, unknown>[] = [];\n for (const item of data) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[state.foreignKeys[i]] = item[state.primaryKeys[i]];\n }\n\n for (const ids of idsRows) {\n const record = { ...obj };\n for (let i = 0; i < throughLen; i++) {\n record[state.throughForeignKeys[i]] = ids[i];\n }\n records.push(record);\n }\n }\n\n return joinTableTransaction.insertMany(records);\n};\n\nconst nestedInsert = ({\n relatedTableQuery,\n joinTableQuery,\n primaryKeys,\n foreignKeys,\n throughPrimaryKeys,\n throughForeignKeys,\n}: State) => {\n const len = primaryKeys.length;\n const throughLen = primaryKeys.length;\n\n return (async (_, data) => {\n const t = relatedTableQuery.clone();\n\n // array to store specific items will be reused\n const items: unknown[] = [];\n for (const item of data) {\n if (item[1].connect) {\n items.push(item);\n }\n }\n\n let connected: Record<string, unknown>[];\n if (items.length) {\n const queries: Query[] = [];\n\n for (const [, { connect }] of items as [\n unknown,\n { connect: NestedInsertManyConnect },\n ][]) {\n for (const item of connect) {\n queries.push(\n t\n .select(...throughPrimaryKeys)\n ._findBy(item)\n ._take(),\n );\n }\n }\n\n connected = (await Promise.all(queries)) as Record<string, unknown[]>[];\n } else {\n connected = [];\n }\n\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n items.push(item);\n }\n }\n\n let connectOrCreated: (Record<string, unknown> | undefined)[];\n if (items.length) {\n const queries: Query[] = [];\n\n for (const [, { connectOrCreate }] of items as [\n unknown,\n { connectOrCreate: NestedInsertManyConnectOrCreate },\n ][]) {\n for (const item of connectOrCreate) {\n queries.push(\n t\n .select(...throughPrimaryKeys)\n ._findBy(item.where)\n ._takeOptional(),\n );\n }\n }\n\n connectOrCreated = (await Promise.all(queries)) as Record<\n string,\n unknown\n >[];\n } else {\n connectOrCreated = [];\n }\n\n let connectOrCreateI = 0;\n items.length = 0;\n for (const item of data) {\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]) {\n items.push(item);\n break;\n }\n }\n } else if (item[1].create) {\n items.push(item);\n }\n }\n\n connectOrCreateI = 0;\n let created: Record<string, unknown>[];\n if (items.length) {\n const records: Record<string, unknown>[] = [];\n\n for (const [, { create, connectOrCreate }] of items as [\n unknown,\n NestedInsertManyItems,\n ][]) {\n if (create) {\n records.push(...create);\n }\n\n if (connectOrCreate) {\n for (const item of connectOrCreate) {\n if (!connectOrCreated[connectOrCreateI++]) {\n records.push(item.create);\n }\n }\n }\n }\n\n created = (await t\n .select(...throughPrimaryKeys)\n ._createMany(records)) 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 for (let index = 0, len = data.length; index < len; index++) {\n const item = data[index][1] as NestedInsertManyItems;\n\n if (item.create || item.connectOrCreate) {\n if (item.create) {\n const len = item.create.length;\n allKeys[index][1] = created.slice(createI, createI + len);\n createI += len;\n }\n if (item.connectOrCreate) {\n const arr: Record<string, unknown>[] = [];\n allKeys[index][1] = arr;\n\n const len = item.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 (item.connect) {\n const len = item.connect.length;\n allKeys[index][1] = connected.slice(connectI, connectI + len);\n connectI += len;\n }\n }\n\n const records: Record<string, unknown>[] = [];\n for (const [selfData, relationKeys] of allKeys) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n for (const relationData of relationKeys) {\n const record = { ...obj };\n\n for (let i = 0; i < throughLen; i++) {\n record[throughForeignKeys[i]] = relationData[throughPrimaryKeys[i]];\n }\n\n records.push(record);\n }\n }\n\n await joinTableQuery.insertMany(records);\n }) as HasManyNestedInsert;\n};\n\nconst nestedUpdate = (state: State) => {\n const len = state.primaryKeys.length;\n const throughLen = state.throughPrimaryKeys.length;\n\n return (async (_, data, params) => {\n if (params.create) {\n const idsRows: unknown[][] = await state.relatedTableQuery\n .select(...state.throughPrimaryKeys)\n ._rows()\n ._createMany(params.create);\n\n const records: Record<string, unknown>[] = [];\n for (const item of data) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n obj[state.foreignKeys[i]] = item[state.primaryKeys[i]];\n }\n\n for (const ids of idsRows) {\n const record = { ...obj };\n\n for (let i = 0; i < throughLen; i++) {\n record[state.throughForeignKeys[i]] = ids[i];\n }\n\n records.push(record);\n }\n }\n\n await state.joinTableQuery.createMany(records);\n }\n\n if (params.update) {\n await state.relatedTableQuery\n .whereExists(state.joinTableQuery, (q) => {\n for (let i = 0; i < throughLen; i++) {\n q._on(\n state.throughForeignKeysFull[i],\n state.throughPrimaryKeysFull[i],\n );\n }\n\n return q._where({\n IN: {\n columns: state.foreignKeysFull,\n values: data.map((item) =>\n state.primaryKeys.map((key) => item[key]),\n ),\n },\n });\n })\n ._where(conditionsToWhereArg(params.update.where))\n ._update<WhereResult<Query>>(params.update.data);\n }\n\n if (params.disconnect) {\n await queryJoinTable(state, data, params.disconnect)._delete();\n }\n\n if (params.delete) {\n const j = queryJoinTable(state, data, params.delete);\n\n const idsRows = await j\n ._select(...state.throughForeignKeys)\n ._rows()\n ._delete();\n\n await state.relatedTableQuery\n .where({\n IN: {\n columns: state.throughPrimaryKeys,\n values: idsRows,\n },\n })\n ._delete();\n }\n\n if (params.set) {\n const j = queryJoinTable(state, data);\n await j._delete();\n delete j.q[toSQLCacheKey];\n\n const idsRows = await state.relatedTableQuery\n .where(conditionsToWhereArg(params.set))\n ._select(...state.throughPrimaryKeys)\n ._rows();\n\n await insertToJoinTable(state, j, data, idsRows);\n }\n }) as HasManyNestedUpdate;\n};\n","import { BelongsTo, BelongsToInfo, makeBelongsToMethod } from './belongsTo';\nimport { HasOne, HasOneInfo, makeHasOneMethod } from './hasOne';\nimport { DbTable, Table, TableClass } from '../baseTable';\nimport { OrchidORM } from '../orm';\nimport {\n CreateData,\n getQueryAs,\n Query,\n RelationConfigBase,\n RelationQuery,\n RelationsBase,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsOneOptional,\n VirtualColumn,\n WhereArg,\n} from 'pqb';\nimport { EmptyObject, StringKey } from 'orchid-core';\nimport { HasMany, HasManyInfo, makeHasManyMethod } from './hasMany';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyInfo,\n makeHasAndBelongsToManyMethod,\n} from './hasAndBelongsToMany';\nimport { getSourceRelation, getThroughRelation } from './common/utils';\nimport { RelationCommonOptions } from './common/options';\n\n// `belongsTo` and `hasOne` relation data available for create. It supports:\n// - `create` to create a related record\n// - `connect` to find existing record and use its primary key\n// - `connectOrCreate` to first try connecting to an existing record, and create it if not found\nexport type RelationToOneDataForCreate<\n Rel extends { nestedCreateQuery: Query; table: Query },\n> =\n | {\n create: CreateData<Rel['nestedCreateQuery']>;\n connect?: never;\n connectOrCreate?: never;\n }\n | {\n create?: never;\n connect: WhereArg<Rel['table']>;\n connectOrCreate?: never;\n }\n | {\n create?: never;\n connect?: never;\n connectOrCreate: {\n where: WhereArg<Rel['table']>;\n create: CreateData<Rel['nestedCreateQuery']>;\n };\n };\n\n// `hasMany` and `hasAndBelongsToMany` relation data available for create. It supports:\n// - `create` to create related records\n// - `connect` to find existing records by `where` conditions and update their foreign keys with the new id\n// - `connectOrCreate` to first try finding records by `where` conditions, and create them if not found\nexport type RelationToManyDataForCreate<\n Rel extends { nestedCreateQuery: Query; table: Query },\n> = {\n create?: CreateData<Rel['nestedCreateQuery']>[];\n connect?: WhereArg<Rel['table']>[];\n connectOrCreate?: {\n where: WhereArg<Rel['table']>;\n create: CreateData<Rel['nestedCreateQuery']>;\n }[];\n};\n\nexport interface RelationThunkBase {\n type: string;\n fn(): TableClass;\n options: RelationCommonOptions;\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 modifyRelatedQuery?(relatedQuery: Query): (query: Query) => void;\n};\n\nexport type RelationScopeOrTable<Relation extends RelationThunkBase> =\n Relation['options']['scope'] extends (q: Query) => Query\n ? ReturnType<Relation['options']['scope']>\n : RelationQueryFromFn<Relation>;\n\ntype RelationQueryFromFn<\n Relation extends RelationThunkBase,\n TC extends TableClass = ReturnType<Relation['fn']>,\n Q extends Query = DbTable<TC>,\n> = Q;\n\nexport type RelationConfig<\n T extends Table = Table,\n Relations extends RelationThunks = RelationThunks,\n Relation extends RelationThunk = RelationThunk,\n K extends PropertyKey = PropertyKey,\n Result extends RelationConfigBase = Relation extends BelongsTo\n ? BelongsToInfo<T, Relation, StringKey<K>>\n : Relation extends HasOne\n ? HasOneInfo<T, Relations, Relation, StringKey<K>>\n : Relation extends HasMany\n ? HasManyInfo<T, Relations, Relation, StringKey<K>>\n : Relation extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<T, Relation, StringKey<K>>\n : never,\n> = Result;\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 Config extends RelationConfigBase = RelationConfig<\n T,\n Relations,\n Relation,\n RelationName\n >,\n> = RelationQuery<\n RelationName,\n Config,\n Config['one'] extends true\n ? Config['required'] extends true\n ? SetQueryReturnsOne<RelatedQuery>\n : SetQueryReturnsOneOptional<RelatedQuery>\n : SetQueryReturnsAll<RelatedQuery>\n>;\n\nexport type MapRelations<T extends Table> = T extends {\n relations: RelationThunks;\n}\n ? {\n [K in keyof T['relations']]: MapRelation<T, T['relations'], K>;\n }\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,\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 as RelationsBase)[through]\n ?.relationConfig;\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 baseQuery = Object.create(otherDbTable);\n baseQuery.baseQuery = baseQuery;\n\n const query = (\n relation.options.scope ? relation.options.scope(baseQuery) : baseQuery\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 if (relation.options.required) {\n query._take();\n } else {\n query._takeOptional();\n }\n\n query.q.returnsOne = true;\n }\n\n if (data.virtualColumn) {\n dbTable.shape[relationName] = dbTable.q.shape[relationName] =\n data.virtualColumn;\n }\n\n makeRelationQuery(dbTable, relationName, data, query);\n\n baseQuery.joinQuery = data.joinQuery;\n\n const { join: originalJoin } = baseQuery;\n baseQuery.join = function (...args: unknown[]) {\n if (args.length) {\n return originalJoin.apply(this, args);\n } else {\n const q = this.clone();\n q.q.innerJoinLateral = true;\n return q;\n }\n };\n\n baseQuery.relationConfig = {\n table: otherDbTable,\n query,\n joinQuery: data.joinQuery,\n };\n\n (dbTable.relations as Record<string, unknown>)[relationName] = query;\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 relationName: string,\n data: RelationData,\n q: Query,\n) => {\n Object.defineProperty(table, relationName, {\n configurable: true,\n get() {\n const toTable = q.clone();\n\n const query = this.q.isSubQuery\n ? toTable\n : toTable._whereExists(\n this.baseQuery,\n (q) => data.reverseJoin(this, toTable) as unknown as typeof q,\n );\n\n query.q.joinedShapes = {\n [getQueryAs(this)]: this.q.shape,\n ...this.q.joinedShapes,\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 set(value) {\n Object.defineProperty(this, relationName, {\n value,\n });\n },\n });\n};\n","import { Db, IsolationLevel, TransactionOptions } from 'pqb';\n\nexport function transaction<T extends { $queryBuilder: Db }, Result>(\n this: T,\n fn: () => Promise<Result>,\n): Promise<Result>;\nexport function transaction<T extends { $queryBuilder: Db }, Result>(\n this: T,\n options: IsolationLevel | TransactionOptions,\n fn: () => Promise<Result>,\n): Promise<Result>;\nexport function transaction<T extends { $queryBuilder: Db }, Result>(\n this: T,\n fnOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n fn?: () => Promise<Result>,\n): Promise<Result> {\n return this.$queryBuilder.transaction(\n fnOrOptions as IsolationLevel,\n fn as () => Promise<Result>,\n );\n}\n","import {\n Adapter,\n AdapterOptions,\n addComputedColumns,\n anyShape,\n columnTypes,\n ComputedColumnsBase,\n Db,\n DbTableOptions,\n FromArgs,\n FromResult,\n NoPrimaryKeyOption,\n Query,\n QueryData,\n QueryLogOptions,\n} from 'pqb';\nimport { DbTable, Table, TableClasses } from './baseTable';\nimport { applyRelations } from './relations/relations';\nimport { transaction } from './transaction';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { SQLQueryArgs, TransactionState } from 'orchid-core';\n\nexport type OrchidORM<T extends TableClasses = TableClasses> = {\n [K in keyof T]: DbTable<T[K]>;\n} & {\n $transaction: typeof transaction;\n $adapter: Adapter;\n $queryBuilder: Db;\n /**\n * Use `$query` to perform raw SQL queries.\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.$query<{ one: number }>`SELECT ${value} AS one`;\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * If the query is executing inside a transaction, it will use the transaction connection automatically.\n *\n * ```ts\n * await db.transaction(async () => {\n * // both queries will execute in the same transaction\n * await db.$query`SELECT 1`;\n * await db.$query`SELECT 2`;\n * });\n * ```\n *\n * Alternatively, support a simple SQL string, with optional `values`:\n *\n * Note that the values is a simple array, and the SQL is referring to the values with `$1`, `$2` and so on.\n *\n * ```ts\n * const value = 1;\n *\n * // it is NOT safe to interpolate inside a simple string, use `values` to pass the values.\n * const result = await db.$query<{ one: number }>({\n * raw: 'SELECT $1 AS one',\n * values: [value],\n * });\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * @param args - SQL template literal, or an object { raw: string, values?: unknown[] }\n */\n $query: Db['query'];\n /**\n * The same as the {@link $query}, but returns an array of arrays instead of objects:\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.$queryArrays<[number]>`SELECT ${value} AS one`;\n * // `rows` is an array of arrays:\n * const row = result.rows[0];\n * row[0]; // our value\n * ```\n *\n * @param args - SQL template literal, or an object { raw: string, values?: unknown[] }\n */\n $queryArrays: Db['queryArrays'];\n $from<Args extends FromArgs<Query>>(...args: Args): FromResult<Query, Args>;\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 }: ({ db: Query } | { adapter: Adapter } | Omit<AdapterOptions, 'log'>) &\n QueryLogOptions & {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n },\n tables: T,\n): OrchidORM<T> => {\n const commonOptions = {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey,\n };\n\n let adapter: Adapter;\n let transactionStorage;\n let qb: Db;\n if ('db' in options) {\n adapter = options.db.q.adapter;\n transactionStorage = options.db.internal.transactionStorage;\n qb = options.db.queryBuilder;\n } else {\n adapter = 'adapter' in options ? options.adapter : new Adapter(options);\n\n transactionStorage = new AsyncLocalStorage<TransactionState>();\n\n qb = new Db(\n adapter,\n undefined as unknown as Db,\n undefined,\n anyShape,\n columnTypes,\n transactionStorage,\n commonOptions,\n ) as unknown as Db;\n qb.queryBuilder = qb as unknown as Db;\n }\n\n const result = {\n $transaction: transaction,\n $adapter: adapter,\n $queryBuilder: qb,\n $query: (...args: SQLQueryArgs) => qb.query(...args),\n $queryArrays: (...args: SQLQueryArgs) => qb.queryArrays(...args),\n $from: (...args: FromArgs<Query>) => qb.from(...args),\n $close: () => adapter.close(),\n } as unknown as OrchidORM;\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 language: table.language,\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,\n table.types,\n transactionStorage,\n options,\n );\n\n (dbTable as unknown as { definedAs: string }).definedAs = key;\n (dbTable as unknown as { db: unknown }).db = result;\n (dbTable as unknown as { filePath: string }).filePath = table.filePath;\n (dbTable as unknown as { name: string }).name = table.constructor.name;\n\n if (table.computed) {\n addComputedColumns(\n dbTable,\n table.computed as ComputedColumnsBase<typeof dbTable>,\n );\n }\n\n (result as Record<string, unknown>)[key] = dbTable;\n }\n\n applyRelations(qb, tableInstances, result);\n\n for (const key in tables) {\n const table = tableInstances[key] as unknown as {\n init?(orm: unknown): void;\n q: QueryData;\n };\n\n if (table.init) {\n table.init(result);\n // assign before and after hooks from table.query to the table base query\n Object.assign(result[key].baseQuery.q, table.q);\n }\n }\n\n return result as unknown as OrchidORM<T>;\n};\n","import {\n getClonedQueryData,\n MergeQuery,\n Query,\n QueryReturnType,\n SetQueryReturns,\n WhereResult,\n} from 'pqb';\nimport { EmptyObject } from 'orchid-core';\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.baseQuery);\n proto.baseQuery = proto;\n const result = Object.create(proto);\n result.q = getClonedQueryData(q.q);\n\n if (plainMethods) {\n Object.assign(proto.baseQuery, plainMethods);\n }\n\n for (const key in queryMethods) {\n const method = queryMethods[key] as (...args: unknown[]) => unknown;\n (proto.baseQuery 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":["defaultColumnTypes","getStackTrace","getCallerFilePath","filePath","snakeCaseKey","getColumnTypes","toSnakeCase","applyMixins","QueryHooks","q","rowIndex","getQueryAs","setQueryObjectValue","pushQueryOn","VirtualColumn","nestedInsert","nestedUpdate","key","pushQueryValue","values","columnIndexes","len","primaryKeys","foreignKeys","emptyArray","isQueryReturnsAll","_a","query","data","i","__spreadValues","ids","toArray","toSQLCacheKey","obj","__spreadProps","OrchidOrmInternalError","NotFoundError","records","item","Adapter","AsyncLocalStorage","Db","anyShape","columnTypes","options","addComputedColumns","getClonedQueryData"],"mappings":"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"}