orchid-orm 1.59.0 → 1.59.2

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/common/joinQueryChain.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 ComputedColumnsFromOptions,\n ComputedOptionsFactory,\n Db,\n DbTableOptionScopes,\n DefaultColumnTypes,\n defaultSchemaConfig,\n DefaultSchemaConfig,\n DynamicRawSQL,\n getColumnTypes,\n makeColumnTypes,\n MapTableScopesOption,\n parseTableData,\n Query,\n QueryAfterHook,\n QueryBeforeHookInternal,\n QueryData,\n QueryHooks,\n RawSQL,\n ShapeColumnPrimaryKeys,\n ShapeUniqueColumns,\n TableData,\n TableDataFn,\n TableDataItem,\n TableDataItemsUniqueColumns,\n TableDataItemsUniqueColumnTuples,\n TableDataItemsUniqueConstraints,\n UniqueConstraints,\n raw,\n ComputedOptionsConfig,\n applyMixins,\n ColumnSchemaConfig,\n CoreQueryScopes,\n DynamicSQLArg,\n emptyArray,\n EmptyObject,\n emptyObject,\n getCallerFilePath,\n getStackTrace,\n IsQuery,\n MaybeArray,\n QueryOrExpression,\n RecordUnknown,\n RelationsBase,\n ShallowSimplify,\n snakeCaseKey,\n StaticSQLArgs,\n toSnakeCase,\n ColumnsShape,\n Column,\n} from 'pqb';\nimport {\n RelationConfigSelf,\n RelationTableToQuery,\n} from './relations/relations';\nimport { OrchidORM } from './orm';\nimport {\n BelongsTo,\n BelongsToInfo,\n BelongsToOptions,\n BelongsToQuery,\n} from './relations/belongsTo';\nimport {\n HasOne,\n HasOneInfo,\n HasOneOptions,\n HasOneQuery,\n} from './relations/hasOne';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyInfo,\n HasAndBelongsToManyOptions,\n HasAndBelongsToManyQuery,\n} from './relations/hasAndBelongsToMany';\nimport { HasMany, HasManyInfo, HasManyQuery } from './relations/hasMany';\n\n// type of table class itself\nexport interface TableClass<T extends ORMTableInput = ORMTableInput> {\n new (): T;\n instance(): T;\n}\n\n// object with table classes, used on orchidORM() for setting tables\nexport interface TableClasses {\n [K: string]: TableClass;\n}\n\nexport interface TableInfo {\n definedAs: string;\n db: OrchidORM;\n getFilePath(): string;\n name: string;\n}\n\nexport interface Table extends Query, TableInfo {}\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 interface TableToDb<\n T extends ORMTableInput,\n Relations extends RelationsBase,\n> extends TableInfo,\n Db<\n T['table'],\n T['columns']['shape'],\n keyof ShapeColumnPrimaryKeys<T['columns']['shape']> extends never\n ? never\n : ShapeColumnPrimaryKeys<T['columns']['shape']>,\n | ShapeUniqueColumns<T['columns']['shape']>\n | TableDataItemsUniqueColumns<\n T['columns']['shape'],\n T['columns']['data']\n >,\n TableDataItemsUniqueColumnTuples<\n T['columns']['shape'],\n T['columns']['data']\n >,\n | UniqueConstraints<T['columns']['shape']>\n | TableDataItemsUniqueConstraints<T['columns']['data']>,\n T['types'],\n T['columns']['shape'] & ComputedColumnsFromOptions<T['computed']>,\n MapTableScopesOption<T>\n > {\n relations: Relations;\n}\n\n// convert a table class type into queryable interface\nexport type ORMTableInputToQueryBuilder<T extends ORMTableInput> =\n T extends RelationConfigSelf\n ? TableToDb<\n T,\n T extends RelationConfigSelf\n ? {\n [K in keyof T['relations'] &\n string]: T['relations'][K] extends BelongsTo\n ? BelongsToInfo<\n T,\n K,\n T['relations'][K],\n T['relations'][K]['options']['columns'][number] & string,\n T['relations'][K]['options']['required'],\n BelongsToQuery<RelationTableToQuery<T['relations'][K]>, K>\n >\n : T['relations'][K] extends HasOne\n ? HasOneInfo<\n T,\n K,\n T['relations'][K],\n HasOneQuery<T, K, RelationTableToQuery<T['relations'][K]>>\n >\n : T['relations'][K] extends HasMany\n ? HasManyInfo<\n T,\n K,\n T['relations'][K],\n HasManyQuery<T, K, RelationTableToQuery<T['relations'][K]>>\n >\n : T['relations'][K] extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<\n T,\n K,\n T['relations'][K],\n HasAndBelongsToManyQuery<\n K,\n RelationTableToQuery<T['relations'][K]>\n >\n >\n : never;\n }\n : EmptyObject\n >\n : TableToDb<T, EmptyObject>;\n\n// type of table instance created by a table class\n// is used only in `orchidORM` constructor to accept proper classes\nexport interface ORMTableInput {\n // table name\n table: string;\n // columns shape and the record type\n columns: {\n shape: Column.Shape.QueryInit;\n data: MaybeArray<TableDataItem>;\n };\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?: ComputedOptionsFactory<never, never>;\n // Available scopes for this table defined by user.\n scopes?: RecordUnknown;\n // enable soft delete, true for `deletedAt` column, string for column name\n readonly softDelete?: true | string;\n // database table comment\n comment?: string;\n // automatically create foreign keys for relations\n autoForeignKeys?: TableData.References.BaseOptions;\n}\n\n// Object type that's allowed in `where` and similar methods of the table.\nexport type Queryable<T extends ORMTableInput> = ShallowSimplify<{\n [K in keyof T['columns']['shape']]?: T['columns']['shape'][K]['queryType'];\n}>;\n\nexport type DefaultSelect<T extends ORMTableInput> = ShallowSimplify<\n ColumnsShape.DefaultOutput<T['columns']['shape']>\n>;\n\n// Object type of table's record that's returned from database and is parsed.\nexport type Selectable<T extends ORMTableInput> = T['computed'] extends ((\n t: never,\n) => infer R extends ComputedOptionsConfig)\n ? ShallowSimplify<\n ColumnsShape.Output<T['columns']['shape']> & {\n [K in keyof R]: R[K] extends QueryOrExpression<unknown>\n ? R[K]['result']['value']['outputType']\n : R[K] extends () => {\n result: { value: infer Value extends Column.Pick.QueryColumn };\n }\n ? Value['outputType']\n : never;\n }\n >\n : ShallowSimplify<ColumnsShape.Output<T['columns']['shape']>>;\n\n// Object type that conforms `create` method of the table.\nexport type Insertable<T extends ORMTableInput> = ShallowSimplify<\n ColumnsShape.Input<T['columns']['shape']>\n>;\n\n// Object type that conforms `update` method of the table.\nexport type Updatable<T extends ORMTableInput> = ShallowSimplify<\n ColumnsShape.InputPartial<T['columns']['shape']>\n>;\n\n// type of before hook function for the table\ntype BeforeHookMethod = (cb: QueryBeforeHookInternal) => void;\n\n// type of after hook function for the table\ntype AfterHookMethod = (cb: QueryAfterHook) => void;\n\n// type of after hook function that allows selecting columns for the table\ntype AfterSelectableHookMethod = <\n Shape extends Column.QueryColumns,\n S extends (keyof Shape)[],\n>(\n this: { columns: { shape: Shape } },\n select: S,\n cb: AfterHook<S, Shape>,\n) => void;\n\nexport interface SetColumnsResult<\n Shape extends Column.Shape.QueryInit,\n Data extends MaybeArray<MaybeArray<TableDataItem>>,\n> {\n shape: Shape;\n data: Data extends unknown[] ? Data : [Data];\n}\n\nexport interface BaseTableInstance<ColumnTypes> {\n table: string;\n columns: { shape: Column.Shape.QueryInit; data: MaybeArray<TableDataItem> };\n schema?: string;\n noPrimaryKey?: boolean;\n snakeCase?: boolean;\n types: ColumnTypes;\n q: QueryData;\n language?: string;\n filePath: string;\n result: Column.Shape.QueryInit;\n clone<T extends IsQuery>(this: T): T;\n getFilePath(): string;\n setColumns<\n Shape extends Column.Shape.QueryInit,\n Data extends MaybeArray<TableDataItem>,\n >(\n fn: (t: ColumnTypes) => Shape,\n tableData?: TableDataFn<Shape, Data>,\n ): SetColumnsResult<Shape, Data>;\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, sql } 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 * 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 * import { sql } from './baseTable';\n *\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: () =>\n * // `sql` accepts a callback to generate a new query on every run\n * 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 * }).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 Shape extends Column.Shape.QueryInit,\n Computed extends ComputedOptionsFactory<ColumnTypes, Shape>,\n >(\n this: { columns: { shape: Shape } },\n computed: Computed,\n ): Computed;\n\n /**\n * See {@link ScopeMethods}\n */\n setScopes<\n Table extends string,\n Shape extends Column.Shape.QueryInit,\n Keys extends string,\n >(\n this: { table: Table; columns: { shape: Shape } },\n scopes: DbTableOptionScopes<Table, Shape, Keys>,\n ): CoreQueryScopes<Keys>;\n\n belongsTo<\n Columns extends Column.Shape.QueryInit,\n Related extends TableClass,\n Options extends BelongsToOptions<Columns, Related>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => Related,\n options: Options,\n ): {\n type: 'belongsTo';\n fn: () => Related;\n options: Options;\n };\n\n hasOne<\n Columns extends Column.Shape.QueryInit,\n Related extends TableClass,\n Through extends string,\n Source extends string,\n Options extends HasOneOptions<Columns, Related, Through, Source>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => Related,\n options: Options,\n ): {\n type: 'hasOne';\n fn: () => Related;\n options: Options;\n };\n\n hasMany<\n Columns extends Column.Shape.QueryInit,\n Related extends TableClass,\n Through extends string,\n Source extends string,\n Options extends HasOneOptions<Columns, Related, Through, Source>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => Related,\n options: Options,\n ): {\n type: 'hasMany';\n fn: () => Related;\n options: Options;\n };\n\n hasAndBelongsToMany<\n Columns extends Column.Shape.QueryInit,\n Related extends TableClass,\n Options extends HasAndBelongsToManyOptions<Columns, Related>,\n >(\n this: { columns: { shape: Columns } },\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\nexport interface BaseTableClass<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n> {\n nowSQL: string | undefined;\n exportAs: string;\n columnTypes: ColumnTypes;\n getFilePath(): string;\n\n sql<T>(\n ...args: StaticSQLArgs\n ): RawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n sql<T>(\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n ): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n\n new (): BaseTableInstance<ColumnTypes>;\n instance(): BaseTableInstance<ColumnTypes>;\n\n /**\n * All column types for inserting.\n */\n inputSchema: SchemaConfig['inputSchema'];\n /**\n * All column types as returned from a database.\n */\n outputSchema: SchemaConfig['outputSchema'];\n /**\n * All column types for query methods such as `where`.\n */\n querySchema: SchemaConfig['querySchema'];\n /**\n * Primary key column(s) type for query methods such as `where`.\n */\n pkeySchema: SchemaConfig['pkeySchema'];\n /**\n * Column types for inserting, excluding primary keys.\n * Equals to {@link inputSchema} without primary keys.\n */\n createSchema: SchemaConfig['createSchema'];\n /**\n * Column types for updating, excluding primary keys.\n * Equals to partial {@link createSchema}.\n */\n updateSchema: SchemaConfig['updateSchema'];\n}\n\n// base table constructor\nexport function createBaseTable<\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n schemaConfig = defaultSchemaConfig as unknown as SchemaConfig,\n columnTypes: columnTypesArg,\n snakeCase,\n filePath: filePathArg,\n nowSQL,\n exportAs = 'BaseTable',\n language,\n autoForeignKeys,\n}: {\n schemaConfig?: SchemaConfig;\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?:\n | ColumnTypes\n | ((t: DefaultColumnTypes<SchemaConfig>) => 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 // automatically create foreign keys for relations\n autoForeignKeys?: boolean | TableData.References.BaseOptions;\n} = {}): BaseTableClass<SchemaConfig, ColumnTypes> {\n const columnTypes = (\n typeof columnTypesArg === 'function'\n ? (\n columnTypesArg as (t: DefaultColumnTypes<SchemaConfig>) => ColumnTypes\n )(makeColumnTypes(schemaConfig))\n : columnTypesArg || makeColumnTypes(schemaConfig)\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 const defaultColumns: {\n shape: Column.Shape.QueryInit;\n data: MaybeArray<TableDataItem>;\n } = {\n shape: emptyObject,\n data: emptyArray,\n };\n\n const base = class BaseTable {\n static nowSQL = nowSQL;\n static exportAs = exportAs;\n static columnTypes = columnTypes;\n\n static sql(...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sql = (raw as any)(...args);\n sql.columnTypes = columnTypes;\n return sql;\n }\n\n private static _inputSchema: unknown;\n static inputSchema() {\n this.instance();\n // Nullish coalescing assignment (??=), for some reason, compiles to != null and miss undefined\n return this._inputSchema === undefined\n ? (this._inputSchema = schemaConfig.inputSchema.call(this as never))\n : this._inputSchema;\n }\n\n private static _outputSchema: unknown;\n static outputSchema() {\n this.instance();\n return this._outputSchema === undefined\n ? (this._outputSchema = schemaConfig.outputSchema.call(this as never))\n : this._outputSchema;\n }\n\n private static _querySchema: unknown;\n static querySchema() {\n this.instance();\n return this._querySchema === undefined\n ? (this._querySchema = schemaConfig.querySchema.call(this as never))\n : this._querySchema;\n }\n\n private static _createSchema: unknown;\n static createSchema() {\n this.instance();\n return this._createSchema === undefined\n ? (this._createSchema = schemaConfig.createSchema.call(this as never))\n : this._createSchema;\n }\n\n private static _updateSchema: unknown;\n static updateSchema() {\n this.instance();\n return this._updateSchema === undefined\n ? (this._updateSchema = schemaConfig.updateSchema.call(this as never))\n : this._updateSchema;\n }\n\n private static _pkeySchema: unknown;\n static pkeySchema() {\n this.instance();\n return this._pkeySchema === undefined\n ? (this._pkeySchema = schemaConfig.pkeySchema.call(this as never))\n : this._pkeySchema;\n }\n\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 private static _instance?: BaseTable;\n static instance(): BaseTable {\n return (this._instance ??= new this());\n }\n\n table!: string;\n columns = defaultColumns;\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: Column.Shape.QueryInit;\n declare autoForeignKeys?: TableData.References.BaseOptions;\n\n clone<T extends IsQuery>(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<\n Shape extends Column.Shape.QueryInit,\n Data extends MaybeArray<TableDataItem>,\n >(\n fn: (t: ColumnTypes) => Shape,\n dataFn?: TableDataFn<Shape, Data>,\n ): SetColumnsResult<Shape, Data> {\n (columnTypes as { [snakeCaseKey]?: boolean })[snakeCaseKey] =\n this.snakeCase;\n\n const shape = getColumnTypes(columnTypes, fn, nowSQL, this.language);\n const tableData = parseTableData(dataFn);\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 // save columns to prototype to make them available in static methods (inputSchema, outputSchema)\n return (this.constructor.prototype.columns = {\n shape,\n data: tableData as never,\n });\n }\n\n setComputed(computed: unknown) {\n return computed;\n }\n\n setScopes(scopes: unknown) {\n return scopes;\n }\n\n belongsTo(fn: () => unknown, options: unknown) {\n return {\n type: 'belongsTo' as const,\n fn,\n options,\n };\n }\n\n hasOne(fn: () => unknown, options: unknown) {\n return {\n type: 'hasOne' as const,\n fn,\n options,\n };\n }\n\n hasMany(fn: () => unknown, options: unknown) {\n return {\n type: 'hasMany' as const,\n fn,\n options,\n };\n }\n\n hasAndBelongsToMany(fn: () => unknown, options: unknown) {\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 base.prototype.snakeCase = snakeCase;\n base.prototype.autoForeignKeys =\n autoForeignKeys === true ? {} : autoForeignKeys || undefined;\n\n return base as unknown as BaseTableClass<SchemaConfig, ColumnTypes>;\n}\n","import {\n _queryHookAfterCreate,\n _queryHookAfterUpdate,\n Column,\n CreateCtx,\n getQueryAs,\n JoinCallback,\n JoinQueryMethod,\n pushQueryOnForOuter,\n Query,\n setQueryObjectValueImmutable,\n UpdateData,\n WhereArg,\n emptyObject,\n MaybeArray,\n PickQueryMetaRelations,\n PickQueryRelations,\n RecordUnknown,\n RelationConfigBase,\n} from 'pqb';\nimport { HasOneNestedInsert, HasOneNestedUpdate } from '../hasOne';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from '../hasMany';\nimport { BaseTableClass, ORMTableInput } from '../../baseTable';\nimport { RelationRefsOptions } from './options';\n\n// INNER JOIN the current relation instead of the default OUTER behavior\nexport interface RelJoin extends JoinQueryMethod {\n <T extends Query>(this: T): T;\n}\n\nexport interface NestedInsertOneItem {\n create?: NestedInsertOneItemCreate;\n connect?: NestedInsertOneItemConnect;\n connectOrCreate?: NestedInsertOneItemConnectOrCreate;\n}\n\nexport type NestedInsertOneItemCreate = RecordUnknown;\nexport type NestedInsertOneItemConnect = RecordUnknown;\n\nexport interface NestedInsertOneItemConnectOrCreate {\n where: WhereArg<PickQueryMetaRelations>;\n create: RecordUnknown;\n}\n\nexport interface NestedInsertManyItems {\n create?: NestedInsertManyCreate;\n connect?: NestedInsertManyConnect;\n connectOrCreate?: NestedInsertManyConnectOrCreate;\n}\n\nexport type NestedInsertManyCreate = RecordUnknown[];\n\nexport type NestedInsertManyConnect = WhereArg<PickQueryMetaRelations>[];\n\nexport type NestedInsertManyConnectOrCreate =\n NestedInsertOneItemConnectOrCreate[];\n\nexport type NestedInsertItem = NestedInsertOneItem | NestedInsertManyItems;\n\nexport interface NestedUpdateOneItem {\n add?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n disconnect?: boolean;\n set?: WhereArg<PickQueryMetaRelations>;\n delete?: boolean;\n update?: UpdateData<Query>;\n upsert?: {\n update: UpdateData<Query>;\n create: RecordUnknown | (() => RecordUnknown);\n };\n create: RecordUnknown;\n}\n\nexport interface NestedUpdateManyItems {\n add?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n disconnect?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n set?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n delete?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n update?: {\n where: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n data: UpdateData<Query>;\n };\n create: RecordUnknown[];\n}\n\nexport type NestedUpdateItem = NestedUpdateOneItem | NestedUpdateManyItems;\n\nexport const getThroughRelation = (\n table: Query,\n through: string,\n): RelationConfigBase => {\n return table.relations[through];\n};\n\nexport const getSourceRelation = (\n throughRelation: RelationConfigBase,\n source: string,\n): RelationConfigBase => {\n return (throughRelation.query as unknown as PickQueryRelations).relations[\n source\n ];\n};\n\nexport const hasRelationHandleCreate = (\n q: Query,\n ctx: CreateCtx,\n item: RecordUnknown,\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 _queryHookAfterCreate(q, 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: RecordUnknown,\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.add || (Array.isArray(value.add) && value.add.length === 0)) &&\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 q.q.wrapInTransaction = true;\n\n _queryHookAfterUpdate(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 function joinHasThrough(\n q: Query,\n baseQuery: Query,\n joiningQuery: Query,\n throughRelation: RelationConfigBase,\n sourceRelation: RelationConfigBase,\n): Query {\n return q.whereExists(\n throughRelation.joinQuery(\n throughRelation.query as never,\n baseQuery as never,\n ) as never,\n (() => {\n const as = getQueryAs(joiningQuery);\n return sourceRelation.joinQuery(\n (sourceRelation.query as Query).as(as),\n throughRelation.query as never,\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n}\n\nexport function joinHasRelation(\n baseQuery: Query,\n joiningQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n len: number,\n) {\n const baseAs = getQueryAs(baseQuery);\n\n const q = joiningQuery.clone();\n setQueryObjectValueImmutable(q, 'joinedShapes', baseAs, baseQuery.q.shape);\n\n for (let i = 0; i < len; i++) {\n pushQueryOnForOuter(\n q,\n baseQuery,\n joiningQuery,\n foreignKeys[i],\n `${baseAs}.${primaryKeys[i]}`,\n );\n }\n\n return q;\n}\n\nexport const addAutoForeignKey = (\n tableConfig: ORMTableInput,\n from: Query,\n to: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n options: RelationRefsOptions<PropertyKey>,\n // non-snake-cased\n originalForeignKeys?: string[],\n) => {\n const toTable = to.table as string;\n\n let fkeyOptions =\n options.foreignKey !== undefined\n ? options.foreignKey\n : tableConfig.autoForeignKeys;\n if (!fkeyOptions) return;\n\n if (fkeyOptions === true) {\n fkeyOptions = tableConfig.autoForeignKeys || emptyObject;\n }\n\n if (foreignKeys.length === 1) {\n const column = from.shape[foreignKeys[0]] as Column;\n if (column.data.foreignKeys) {\n const pkey = primaryKeys[0];\n\n for (const fkey of column.data.foreignKeys) {\n let fkeyTable: string;\n let fkeyColumn = fkey.foreignColumns[0];\n if (typeof fkey.fnOrTable === 'string') {\n fkeyTable = fkey.fnOrTable;\n fkeyColumn = getColumnKeyFromDbName(to, fkeyColumn);\n } else {\n fkeyTable = (fkey.fnOrTable() as unknown as BaseTableClass<any, any>) // eslint-disable-line @typescript-eslint/no-explicit-any\n .instance().table;\n }\n\n if (toTable === fkeyTable && pkey === fkeyColumn) return;\n }\n }\n }\n\n const { constraints } = from.internal.tableData;\n if (constraints) {\n const sortedPkeys = [...primaryKeys].sort();\n const sortedFkeys = [...foreignKeys].sort();\n\n for (const { references: refs } of constraints) {\n if (!refs) continue;\n\n if (\n refs.columns.length === sortedFkeys.length &&\n refs.columns.every((column, i) => column === sortedFkeys[i]) &&\n refs.foreignColumns.length === sortedPkeys.length &&\n (typeof refs.fnOrTable === 'string'\n ? refs.fnOrTable === toTable &&\n refs.foreignColumns.every(\n (column, i) =>\n getColumnKeyFromDbName(to, column) === sortedPkeys[i],\n )\n : (refs.fnOrTable as unknown as () => BaseTableClass<any, any>)() // eslint-disable-line @typescript-eslint/no-explicit-any\n .instance().table === toTable &&\n refs.foreignColumns.every((column, i) => column === sortedPkeys[i]))\n )\n return;\n }\n }\n\n (from.internal.tableData.constraints ??= []).push({\n references: {\n columns: originalForeignKeys || foreignKeys,\n fnOrTable: toTable,\n foreignColumns: primaryKeys,\n options: fkeyOptions,\n },\n dropMode: fkeyOptions.dropMode,\n });\n};\n\nconst getColumnKeyFromDbName = (query: Query, name: string) => {\n for (const k in query.shape) {\n if ((query.shape[k] as Column).data.name === name) {\n return k;\n }\n }\n return name;\n};\n","import {\n cloneQueryBaseUnscoped,\n DynamicRawSQL,\n getQueryAs,\n getShapeFromSelect,\n Query,\n RawSQL,\n HookSelectValue,\n isExpression,\n RelationJoinQuery,\n Column,\n} from 'pqb';\n\nexport const joinQueryChainHOF =\n (\n relPKeys: string[],\n reverseJoin: RelationJoinQuery,\n joinQuery: RelationJoinQuery,\n ): RelationJoinQuery =>\n (joiningQuery, baseQuery) => {\n const jq = joiningQuery as Query;\n const chain = jq.q.relChain;\n if (!chain || chain.length === 1) {\n return joinQuery(jq, baseQuery);\n }\n\n const last = chain[chain.length - 1];\n const prev = chain[chain.length - 2];\n const query = prev.rel.joinQuery(last.query as never, baseQuery) as Query;\n\n let useWhereExist = true;\n\n // It does not make sense to return a single value not from the target table,\n // so in this case skip guessing by order and select contains.\n if (jq.q.returnType !== 'value' && jq.q.returnType !== 'valueOrThrow') {\n let tablePrefix: string | undefined;\n if (jq.q.order) {\n const prefix = (tablePrefix = getQueryAs(jq) + '.');\n useWhereExist = jq.q.order.every((o) => {\n if (typeof o === 'string') {\n return isOwnColumn(prefix, o);\n } else if (isExpression(o)) {\n return false;\n } else {\n for (const key in o) {\n if (!isOwnColumn(prefix, key)) {\n return false;\n }\n }\n return true;\n }\n });\n }\n\n if (useWhereExist && jq.q.select) {\n const prefix = tablePrefix || getQueryAs(jq) + '.';\n useWhereExist = jq.q.select.every((s) => {\n if (typeof s === 'string') {\n return isOwnColumn(prefix, s);\n } else if (isExpression(s)) {\n return false;\n } else if (!s) {\n return false;\n } else {\n for (const key in s.selectAs) {\n const value = s.selectAs[key];\n if (typeof value !== 'string' || !isOwnColumn(prefix, value)) {\n return false;\n }\n }\n return true;\n }\n });\n }\n }\n\n if (useWhereExist) {\n return jq.where({\n EXISTS: { q: reverseJoin(query, jq) },\n });\n }\n\n const result = jq.join(\n { _internalJoin: reverseJoin(query, jq) } as never,\n undefined,\n );\n\n if (!query.q.chainMultiple) {\n return result;\n }\n\n const item = selectRowNumber(result, relPKeys);\n combineOrdering(result, query);\n if (!result.q.select) result.q.select = ['*'];\n return wrapQuery(jq, result, item);\n };\n\nconst isOwnColumn = (prefix: string, column: string) =>\n !column.includes('.') || column.startsWith(prefix);\n\nconst selectRowNumber = (\n result: Query,\n relPKeys: string[],\n): HookSelectValue => {\n const hookSelect = (result.q.hookSelect = new Map(\n result.q.hookSelect && [...result.q.hookSelect],\n ));\n const as = `\"${getQueryAs(result)}\"`;\n const partitionColumns = relPKeys.map(\n (key) =>\n `${as}.\"${\n (result.shape as Column.Shape.QueryInit)[key]?.data.name || key\n }\"`,\n );\n const item = {\n select: {\n sql: `row_number() OVER (PARTITION BY ${partitionColumns.join(', ')})`,\n },\n };\n\n hookSelect.set('r', item);\n\n return item;\n};\n\nconst combineOrdering = (result: Query, joined: Query) => {\n const { order } = joined.q;\n if (order) {\n const as = getQueryAs(joined);\n\n const add = order.map((o) =>\n typeof o === 'string'\n ? `${as}.${o}`\n : isExpression(o)\n ? o\n : Object.fromEntries(\n Object.entries(o).map(([key, value]) => [`${as}.${key}`, value]),\n ),\n );\n\n const arr = result.q.order;\n result.q.order = arr ? [...add, ...arr] : add;\n }\n};\n\nconst wrapQuery = (\n joiningQuery: Query,\n result: Query,\n item: HookSelectValue,\n) => {\n const baseOuterQuery = cloneQueryBaseUnscoped(joiningQuery);\n const outer = baseOuterQuery.clone();\n\n outer.q.and = [new DynamicRawSQL(() => new RawSQL(`${item.as || 'r'} = 1`))];\n outer.q.useFromLimitOffset = true;\n outer.shape = getShapeFromSelect(result, true);\n outer.q.select = Object.keys(outer.shape);\n outer.q.returnType = result.q.returnType;\n\n result.q.returnsOne = true;\n return result.wrap(outer);\n};\n","import { ORMTableInput, TableClass } from '../baseTable';\nimport {\n _queryCreate,\n _queryDefaults,\n _queryDelete,\n _queryFindBy,\n _queryHookAfterUpdate,\n _queryHookBeforeUpdate,\n _queryRows,\n _queryUpdate,\n _queryWhere,\n CreateCtx,\n CreateData,\n CreateMethodsNames,\n DeleteMethodsNames,\n getQueryAs,\n isQueryReturnsAll,\n pushQueryOnForOuter,\n Query,\n SelectableFromShape,\n setQueryObjectValueImmutable,\n QueryTake,\n QueryTakeOptional,\n UpdateCtx,\n UpdateCtxCollect,\n UpdateData,\n VirtualColumn,\n WhereArg,\n TableData,\n defaultSchemaConfig,\n ColumnSchemaConfig,\n emptyArray,\n EmptyObject,\n getPrimaryKeys,\n QueryResult,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n ColumnsShape,\n Column,\n getFreeAlias,\n _with,\n RawSQL,\n RawSQLBase,\n _orCreate,\n} from 'pqb';\nimport {\n RelationConfigSelf,\n RelationData,\n RelationThunkBase,\n RelationToOneDataForCreateSameQuery,\n} from './relations';\nimport {\n addAutoForeignKey,\n NestedInsertOneItemCreate,\n NestedUpdateOneItem,\n RelJoin,\n selectIfNotSelected,\n} from './common/utils';\nimport { RelationRefsOptions } from './common/options';\nimport { joinQueryChainHOF } from './common/joinQueryChain';\n\nexport interface BelongsTo extends RelationThunkBase {\n type: 'belongsTo';\n options: BelongsToOptions;\n}\n\nexport interface BelongsToOptions<\n Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit,\n Related extends TableClass = TableClass,\n> {\n required?: boolean;\n columns: (keyof Columns)[];\n references: (keyof InstanceType<Related>['columns']['shape'])[];\n foreignKey?: boolean | TableData.References.Options;\n on?: ColumnsShape.InputPartial<InstanceType<Related>['columns']['shape']>;\n}\n\nexport type BelongsToFKey<Relation extends RelationThunkBase> =\n Relation['options'] extends RelationRefsOptions\n ? Relation['options']['columns'][number]\n : never;\n\nexport type BelongsToParams<\n T extends RelationConfigSelf,\n Relation extends BelongsTo,\n> = {\n [Name in BelongsToFKey<Relation>]: T['columns']['shape'][Name]['type'];\n};\n\nexport type BelongsToQuery<T extends Query, Name extends string> = {\n [P in keyof T]: P extends 'meta'\n ? // Omit is optimal\n Omit<T['meta'], 'selectable'> & {\n as: Name;\n hasWhere: true;\n selectable: SelectableFromShape<T['shape'], Name>;\n }\n : P extends 'join'\n ? RelJoin\n : P extends CreateMethodsNames | DeleteMethodsNames\n ? never\n : T[P];\n};\n\nexport interface BelongsToInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends BelongsTo,\n FK extends string,\n Required,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: true;\n query: Q;\n params: BelongsToParams<T, Rel>;\n maybeSingle: Required extends true ? QueryTake<Q> : QueryTakeOptional<Q>;\n omitForeignKeyInCreate: FK;\n dataForCreate: {\n columns: FK;\n nested: Required extends true\n ? {\n [Key in Name]: RelationToOneDataForCreateSameQuery<Q>;\n }\n : {\n [Key in Name]?: RelationToOneDataForCreateSameQuery<Q>;\n };\n };\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 update a single record:\n // - `upsert` to update or create the related record\n dataForUpdateOne:\n | { disconnect: boolean }\n | { set: WhereArg<Q> }\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | { create: CreateData<Q> }\n | {\n upsert: {\n update: UpdateData<Q>;\n create: CreateData<Q> | (() => CreateData<Q>);\n };\n };\n}\n\ninterface State {\n query: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n len: number;\n on?: RecordUnknown;\n}\n\ntype BelongsToNestedUpdate = (\n q: Query,\n update: RecordUnknown,\n params: NestedUpdateOneItem,\n state: {\n queries?: ((queryResult: QueryResult) => Promise<void>)[];\n collect?: UpdateCtxCollect;\n },\n) => void;\n\nclass BelongsToVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedUpdate: BelongsToNestedUpdate;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedUpdate = nestedUpdate(this.state);\n }\n\n create(q: Query, ctx: CreateCtx, item: RecordUnknown) {\n const {\n key,\n state: { query, primaryKeys, foreignKeys },\n } = this;\n\n for (const key of foreignKeys) {\n if (!ctx.columns.has(key)) {\n ctx.columns.set(key, ctx.columns.size);\n }\n }\n\n const value = item[key] as NestedInsertOneItemCreate;\n if ('create' in value || 'connectOrCreate' in value) {\n foreignKeys.forEach((foreignKey) => (item[foreignKey] = new RawSQL('')));\n\n const selectPKeys = query.select(...primaryKeys);\n\n _with(\n q,\n (as) => {\n foreignKeys.forEach((foreignKey, i) => {\n (\n item[foreignKey] as RawSQLBase\n )._sql = `(SELECT \"${as}\".\"${primaryKeys[i]}\" FROM \"${as}\")`;\n });\n },\n 'create' in value\n ? _queryCreate(selectPKeys, value.create as never)\n : _orCreate(\n _queryWhere(selectPKeys, [\n (value.connectOrCreate as { where: never }).where,\n ]),\n (value.connectOrCreate as { create: never }).create,\n ),\n );\n\n return;\n } else if ('connect' in value) {\n const as = getFreeAlias(q.q.withShapes, 'q');\n _with(q, as, query.select(...primaryKeys).findBy(value.connect));\n\n foreignKeys.map((foreignKey, i) => {\n const selectColumn = `(SELECT \"${as}\".\"${primaryKeys[i]}\" FROM \"${as}\")`;\n item[foreignKey] = new RawSQL(\n i === 0\n ? `CASE WHEN (SELECT count(*) FROM \"${as}\") = 0 AND (SELECT 'not-found')::int = 0 THEN NULL ELSE ${selectColumn} END`\n : selectColumn,\n );\n });\n\n return;\n }\n }\n\n update(q: Query, ctx: UpdateCtx, set: RecordUnknown) {\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 tableConfig: ORMTableInput,\n table: Query,\n relation: BelongsTo,\n relationName: string,\n query: Query,\n): RelationData => {\n const primaryKeys = relation.options.references as string[];\n const foreignKeys = relation.options.columns as string[];\n const { on } = relation.options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query, on);\n }\n\n const len = primaryKeys.length;\n const state: State = { query, primaryKeys, foreignKeys, len, on };\n\n addAutoForeignKey(\n tableConfig,\n table,\n query,\n primaryKeys,\n foreignKeys,\n relation.options,\n );\n\n const join = (\n baseQuery: Query,\n joiningQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n ) => {\n const baseAs = getQueryAs(baseQuery);\n\n const q = joiningQuery.clone();\n setQueryObjectValueImmutable(q, 'joinedShapes', baseAs, baseQuery.q.shape);\n\n for (let i = 0; i < len; i++) {\n pushQueryOnForOuter(\n q,\n baseQuery,\n joiningQuery,\n primaryKeys[i],\n `${baseAs}.${foreignKeys[i]}`,\n );\n }\n\n return q;\n };\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return join(\n joiningQuery as Query,\n baseQuery as Query,\n foreignKeys,\n primaryKeys,\n );\n };\n\n return {\n returns: 'one',\n queryRelated(params: RecordUnknown) {\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[primaryKeys[i]] = params[foreignKeys[i]];\n }\n return query.where(obj as never);\n },\n virtualColumn: new BelongsToVirtualColumn(\n defaultSchemaConfig,\n relationName,\n state,\n ),\n joinQuery: joinQueryChainHOF(\n getPrimaryKeys(query),\n reverseJoin,\n (joiningQuery, baseQuery) =>\n join(\n baseQuery as Query,\n joiningQuery as Query,\n primaryKeys,\n foreignKeys,\n ),\n ),\n reverseJoin,\n };\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 _queryHookBeforeUpdate(q, async ({ query: 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 _queryFindBy(\n query.select(...loadPrimaryKeys),\n params.set as never,\n )) as RecordUnknown;\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 _queryCreate(\n q,\n params.create,\n )) as unknown as RecordUnknown;\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 as Query).clone();\n selectQuery.q.type = undefined;\n selectQuery.q.distinct = emptyArray;\n selectIfNotSelected(selectQuery, foreignKeys);\n idsForDelete = (await _queryRows(selectQuery)) as [\n unknown,\n ...unknown[],\n ][];\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: RecordUnknown | 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 const count = obj\n ? await _queryUpdate(\n query.findBy(obj as never),\n upsert.update as UpdateData<Query>,\n )\n : 0;\n\n if (!count) {\n const data =\n typeof upsert.create === 'function'\n ? upsert.create()\n : upsert.create;\n\n const result = (await _queryCreate(\n query.select(...primaryKeys),\n data,\n )) as unknown as RecordUnknown;\n\n const collectData: RecordUnknown = {};\n state.collect = {\n data: collectData,\n };\n\n for (let i = 0; i < len; i++) {\n collectData[foreignKeys[i]] = result[primaryKeys[i]];\n }\n }\n });\n } else if (params.delete || params.update) {\n _queryHookAfterUpdate(\n q,\n params.update ? foreignKeys : emptyArray,\n 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 RecordUnknown)[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 _queryDelete(t);\n } else {\n await _queryUpdate(t, params.update as UpdateData<Query>);\n }\n },\n );\n }\n }) as BelongsToNestedUpdate;\n};\n","import {\n _queryDefaults,\n _queryDelete,\n _queryRows,\n _queryUpdate,\n _queryUpdateOrThrow,\n _queryWhere,\n AddQueryDefaults,\n CreateCtx,\n CreateData,\n CreateMethodsNames,\n isQueryReturnsAll,\n PickQueryQ,\n Query,\n SelectableFromShape,\n QueryTake,\n QueryTakeOptional,\n UpdateCtx,\n UpdateData,\n VirtualColumn,\n WhereArg,\n defaultSchemaConfig,\n CreateManyMethodsNames,\n ColumnSchemaConfig,\n EmptyObject,\n getPrimaryKeys,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n Column,\n} from 'pqb';\nimport { ORMTableInput, TableClass } from '../baseTable';\nimport {\n RelationData,\n RelationThunkBase,\n RelationToOneDataForCreate,\n RelationConfigParams,\n RelationConfigSelf,\n} from './relations';\nimport {\n addAutoForeignKey,\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n joinHasRelation,\n joinHasThrough,\n NestedInsertOneItem,\n NestedInsertOneItemConnectOrCreate,\n NestedInsertOneItemCreate,\n NestedUpdateOneItem,\n RelJoin,\n} from './common/utils';\nimport { RelationRefsOptions, RelationThroughOptions } from './common/options';\nimport { joinQueryChainHOF } from './common/joinQueryChain';\nimport { prepareSubQueryForSql } from 'pqb';\n\nexport interface HasOne extends RelationThunkBase {\n type: 'hasOne';\n options: HasOneOptions;\n}\n\ninterface RelationHasOneThroughOptions<\n Through extends string,\n Source extends string,\n> extends RelationThroughOptions<Through, Source> {\n required?: boolean;\n}\n\nexport type HasOneOptions<\n Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit,\n Related extends TableClass = TableClass,\n Through extends string = string,\n Source extends string = string,\n> =\n | RelationRefsOptions<\n keyof Columns,\n InstanceType<Related>['columns']['shape']\n >\n | RelationHasOneThroughOptions<Through, Source>;\n\nexport type HasOneParams<\n T extends RelationConfigSelf,\n Relation extends RelationThunkBase,\n> = Relation['options'] extends RelationRefsOptions\n ? {\n [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];\n }\n : Relation['options'] extends RelationThroughOptions\n ? RelationConfigParams<T, T['relations'][Relation['options']['through']]>\n : never;\n\nexport type HasOnePopulate<\n T extends RelationConfigSelf,\n Name extends string,\n> = T['relations'][Name]['options'] extends RelationRefsOptions\n ? Record<T['relations'][Name]['options']['references'][number], true>\n : never;\n\nexport type HasOneQueryThrough<\n T extends RelationConfigSelf,\n Name extends string,\n TableQuery extends Query,\n> = {\n [K in keyof TableQuery]: K extends 'meta'\n ? Omit<TableQuery['meta'], 'selectable'> & {\n as: Name;\n defaults: HasOnePopulate<T, Name>;\n hasWhere: true;\n selectable: SelectableFromShape<TableQuery['shape'], Name>;\n }\n : K extends 'join'\n ? RelJoin\n : K extends CreateMethodsNames\n ? never\n : TableQuery[K];\n};\n\nexport type HasOneQuery<\n T extends RelationConfigSelf,\n Name extends string,\n TableQuery extends Query,\n> = T['relations'][Name]['options'] extends RelationThroughOptions\n ? HasOneQueryThrough<T, Name, TableQuery>\n : {\n [K in keyof TableQuery]: K extends 'meta'\n ? Omit<TableQuery['meta'], 'selectable'> & {\n as: Name;\n defaults: HasOnePopulate<T, Name>;\n hasWhere: true;\n selectable: SelectableFromShape<TableQuery['shape'], Name>;\n }\n : K extends 'join'\n ? RelJoin\n : K extends CreateManyMethodsNames\n ? never\n : TableQuery[K];\n };\n\nexport interface HasOneInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends HasOne,\n Q extends Query,\n CD = T['relations'][Name]['options'] extends RelationThroughOptions\n ? CreateData<Q>\n : CreateData<AddQueryDefaults<Q, HasOnePopulate<T, Name>>>,\n> extends RelationConfigBase {\n returnsOne: true;\n query: Q;\n params: HasOneParams<T, Rel>;\n maybeSingle: T['relations'][Name]['options']['required'] extends true\n ? QueryTake<Q>\n : QueryTakeOptional<Q>;\n omitForeignKeyInCreate: never;\n optionalDataForCreate: T['relations'][Name]['options'] extends RelationThroughOptions\n ? EmptyObject\n : {\n [P in Name]?: RelationToOneDataForCreate<{\n nestedCreateQuery: CD;\n table: Q;\n }>;\n };\n dataForCreate: never;\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 update 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 | { disconnect: boolean }\n | { set: WhereArg<Q> }\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | {\n upsert: {\n update: UpdateData<Q>;\n create: CD | (() => CD);\n };\n }\n | {\n create: CD;\n };\n}\n\ninterface State {\n query: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport type HasOneNestedInsert = (\n query: Query,\n data: [selfData: RecordUnknown, relationData: NestedInsertOneItem][],\n) => Promise<void>;\n\nexport type HasOneNestedUpdate = (\n query: Query,\n data: RecordUnknown[],\n relationData: NestedUpdateOneItem,\n) => Promise<void>;\n\nclass HasOneVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasOneNestedInsert;\n private readonly nestedUpdate: HasOneNestedUpdate;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(q: Query, ctx: CreateCtx, item: RecordUnknown, rowIndex: number) {\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: RecordUnknown) {\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 tableConfig: ORMTableInput,\n table: Query,\n relation: HasOne,\n relationName: string,\n query: Query,\n): RelationData => {\n const relPKeys = getPrimaryKeys(query);\n\n if ('through' in relation.options) {\n const { through, source } = relation.options;\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = (sourceRelation.query as Query).as(\n relationName,\n );\n const sourceQuery = sourceRelation.joinQuery(\n sourceRelationQuery,\n throughRelation.query as never,\n ) as Query;\n\n const whereExistsCallback = () => sourceQuery;\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return joinHasThrough(\n baseQuery as Query,\n baseQuery as Query,\n joiningQuery as Query,\n throughRelation,\n sourceRelation,\n );\n };\n\n return {\n returns: 'one',\n queryRelated: (params: RecordUnknown) => {\n const throughQuery = table.queryRelated(through, params) as Query;\n\n return query.whereExists(throughQuery, whereExistsCallback);\n },\n joinQuery: joinQueryChainHOF(\n relPKeys,\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinHasThrough(\n joiningQuery as Query,\n baseQuery as Query,\n joiningQuery as Query,\n throughRelation,\n sourceRelation,\n ),\n ),\n reverseJoin,\n };\n }\n\n const primaryKeys = relation.options.columns as string[];\n const foreignKeys = relation.options.references as string[];\n const { on } = relation.options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query, on);\n }\n\n addAutoForeignKey(\n tableConfig,\n query,\n table,\n primaryKeys,\n foreignKeys,\n relation.options,\n );\n\n const state: State = { query, primaryKeys, foreignKeys, on };\n const len = primaryKeys.length;\n\n const reversedOn: RecordString = {};\n for (let i = 0; i < len; i++) {\n reversedOn[foreignKeys[i]] = primaryKeys[i];\n }\n\n const fromQuerySelect = [{ selectAs: reversedOn }];\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return joinHasRelation(\n joiningQuery as Query,\n baseQuery as Query,\n foreignKeys,\n primaryKeys,\n len,\n );\n };\n\n return {\n returns: 'one',\n queryRelated: (params: RecordUnknown) => {\n const values: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n values[foreignKeys[i]] = params[primaryKeys[i]];\n }\n\n return _queryDefaults(query.where(values as never), { ...on, ...values });\n },\n virtualColumn: new HasOneVirtualColumn(\n defaultSchemaConfig,\n relationName,\n state,\n ),\n joinQuery: joinQueryChainHOF(\n relPKeys,\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinHasRelation(\n baseQuery as Query,\n joiningQuery as Query,\n primaryKeys,\n foreignKeys,\n len,\n ),\n ),\n reverseJoin,\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const baseQuery = (query as Query).clone();\n baseQuery.q.select = fromQuerySelect;\n const q = (relationQuery as unknown as PickQueryQ).q;\n q.insertFrom = prepareSubQueryForSql(q as never, baseQuery);\n q.values = [];\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 [RecordUnknown, RecordUnknown];\n\n const data: RecordUnknown = {};\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 ? _queryUpdateOrThrow(\n t.where(item.connect as WhereArg<Query>) as never,\n data as never,\n )\n : _queryUpdate(\n t.where(\n (item.connectOrCreate as RecordUnknown)\n .where as WhereArg<Query>,\n ) as never,\n data as never,\n );\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 [RecordUnknown, RecordUnknown];\n const data: RecordUnknown = {\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 RecordUnknown[]);\n }\n }) as HasOneNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKeys, foreignKeys }: State) => {\n const len = primaryKeys.length;\n\n const setNulls: RecordUnknown = {};\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 let queryToDisconnect = currentRelationsQuery;\n // do not nullify the record that is going to be set, because the column may non-nullable.\n if (params.set) {\n queryToDisconnect = queryToDisconnect.whereNot(params.set) as never;\n }\n\n await _queryUpdate(queryToDisconnect, setNulls as never);\n\n const record = data[0];\n\n if (params.create) {\n const obj: RecordUnknown = { ...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: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = record[primaryKeys[i]];\n }\n\n await _queryUpdate(\n _queryWhere(t as Query, [params.set as never]) as never,\n obj as never,\n );\n }\n } else if (params.update) {\n await _queryUpdate(currentRelationsQuery, params.update as never);\n } else if (params.delete) {\n const q = _queryDelete(currentRelationsQuery);\n q.q.returnType = 'value'; // do not throw\n await q;\n } else if (params.upsert) {\n const { update, create } = params.upsert;\n currentRelationsQuery.q.select = foreignKeys;\n const updatedIds = (await _queryUpdate(\n _queryRows(currentRelationsQuery),\n update as never,\n )) 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: RecordUnknown[], ids) => {\n if (\n !updatedIds.some((updated) =>\n updated.every((value, i) => value === ids[i]),\n )\n ) {\n const obj: RecordUnknown = { ...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 RelationThunkBase,\n RelationConfigSelf,\n} from './relations';\nimport {\n CreateData,\n Query,\n WhereArg,\n WhereResult,\n isQueryReturnsAll,\n VirtualColumn,\n CreateCtx,\n UpdateCtx,\n UpdateData,\n AddQueryDefaults,\n _queryDefaults,\n _queryUpdateOrThrow,\n _queryUpdate,\n _queryCreateMany,\n _queryDelete,\n PickQueryQ,\n _queryWhere,\n SelectableFromShape,\n defaultSchemaConfig,\n ColumnSchemaConfig,\n EmptyObject,\n getPrimaryKeys,\n MaybeArray,\n objectHasValues,\n OrchidOrmInternalError,\n PickQueryMetaRelations,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n toArray,\n prepareSubQueryForSql,\n} from 'pqb';\nimport {\n addAutoForeignKey,\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n joinHasRelation,\n joinHasThrough,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n NestedUpdateManyItems,\n RelJoin,\n} from './common/utils';\nimport { RelationThroughOptions } from './common/options';\nimport {\n HasOneOptions,\n HasOneParams,\n HasOnePopulate,\n HasOneQueryThrough,\n} from './hasOne';\nimport { ORMTableInput } from '../baseTable';\nimport { joinQueryChainHOF } from './common/joinQueryChain';\n\nexport interface HasMany extends RelationThunkBase {\n type: 'hasMany';\n options: HasOneOptions;\n}\n\nexport type HasManyQuery<\n T extends RelationConfigSelf,\n Name extends string,\n TableQuery extends Query,\n> = T['relations'][Name]['options'] extends RelationThroughOptions\n ? HasOneQueryThrough<T, Name, TableQuery>\n : {\n [K in keyof TableQuery]: K extends 'meta'\n ? Omit<TableQuery['meta'], 'selectable'> & {\n as: Name;\n defaults: HasOnePopulate<T, Name>;\n hasWhere: true;\n selectable: SelectableFromShape<TableQuery['shape'], Name>;\n }\n : K extends 'join'\n ? RelJoin\n : TableQuery[K];\n };\n\nexport interface HasManyInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends HasMany,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: false;\n query: Q;\n params: HasOneParams<T, Rel>;\n maybeSingle: Q;\n omitForeignKeyInCreate: never;\n optionalDataForCreate: {\n [P in Name]?: T['relations'][Name]['options'] extends RelationThroughOptions\n ? EmptyObject\n : {\n // create related records\n create?: CreateData<\n T['relations'][Name]['options'] extends RelationThroughOptions\n ? Q\n : AddQueryDefaults<Q, HasOnePopulate<T, Name>>\n >[];\n // find existing records by `where` conditions and update their foreign keys with the new id\n connect?: WhereArg<Q>[];\n // try finding records by `where` conditions, and create them if not found\n connectOrCreate?: {\n where: WhereArg<Q>;\n create: CreateData<\n T['relations'][Name]['options'] extends RelationThroughOptions\n ? Q\n : AddQueryDefaults<Q, HasOnePopulate<T, Name>>\n >;\n }[];\n };\n };\n dataForCreate: never;\n // `hasMany` relation data available for update. It supports:\n // - `disconnect` nullifies foreign keys of the related records\n // - `delete` deletes related record found by conditions\n // - `update` updates 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 update a single record:\n // - `set` updates foreign keys of related records found by conditions, nullifies previously connected\n // - `add` updates foreign keys of related records found by conditions, doesn't nullify previously connected\n // - `create` creates related records\n dataForUpdateOne: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: {\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n };\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n create?: CreateData<\n T['relations'][Name]['options'] extends RelationThroughOptions\n ? Q\n : AddQueryDefaults<Q, HasOnePopulate<T, Name>>\n >[];\n };\n}\n\ninterface State {\n query: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport type HasManyNestedUpdate = (\n query: Query,\n data: RecordUnknown[],\n relationData: NestedUpdateManyItems,\n) => Promise<void>;\n\nexport type HasManyNestedInsert = (\n query: Query,\n data: [selfData: RecordUnknown, relationData: NestedInsertManyItems][],\n) => Promise<void>;\n\nclass HasManyVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasManyNestedInsert;\n private readonly nestedUpdate: HasManyNestedUpdate;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(q: Query, ctx: CreateCtx, item: RecordUnknown, rowIndex: number) {\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: RecordUnknown) {\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 tableConfig: ORMTableInput,\n table: Query,\n relation: HasMany,\n relationName: string,\n query: Query,\n): RelationData => {\n const relPKeys = getPrimaryKeys(query);\n\n if ('through' in relation.options) {\n const { through, source } = relation.options;\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = (sourceRelation.query as Query).as(\n relationName,\n );\n const sourceQuery = sourceRelation.joinQuery(\n sourceRelationQuery,\n throughRelation.query as never,\n );\n\n const whereExistsCallback = () => sourceQuery;\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return joinHasThrough(\n baseQuery as Query,\n baseQuery as Query,\n joiningQuery as Query,\n throughRelation,\n sourceRelation,\n );\n };\n\n return {\n returns: 'many',\n queryRelated: (params: RecordUnknown) => {\n const throughQuery = table.queryRelated(through, params) as Query;\n\n return query.whereExists(\n throughQuery,\n whereExistsCallback as never,\n ) as never;\n },\n joinQuery: joinQueryChainHOF(\n relPKeys,\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinHasThrough(\n joiningQuery as Query,\n baseQuery as Query,\n joiningQuery as Query,\n throughRelation,\n sourceRelation,\n ),\n ),\n reverseJoin,\n };\n }\n\n const primaryKeys = relation.options.columns as string[];\n const foreignKeys = relation.options.references as string[];\n const { on } = relation.options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query, on);\n }\n\n addAutoForeignKey(\n tableConfig,\n query,\n table,\n primaryKeys,\n foreignKeys,\n relation.options,\n );\n\n const state: State = { query, primaryKeys, foreignKeys, on };\n const len = primaryKeys.length;\n\n const reversedOn: RecordString = {};\n for (let i = 0; i < len; i++) {\n reversedOn[foreignKeys[i]] = primaryKeys[i];\n }\n\n const fromQuerySelect = [{ selectAs: reversedOn }];\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return joinHasRelation(\n joiningQuery as Query,\n baseQuery as Query,\n foreignKeys,\n primaryKeys,\n len,\n );\n };\n\n return {\n returns: 'many',\n queryRelated: (params: RecordUnknown) => {\n const values: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n values[foreignKeys[i]] = params[primaryKeys[i]];\n }\n\n return _queryDefaults(query.where(values as never), { ...on, ...values });\n },\n virtualColumn: new HasManyVirtualColumn(\n defaultSchemaConfig,\n relationName,\n state,\n ),\n joinQuery: joinQueryChainHOF(\n relPKeys,\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinHasRelation(\n baseQuery as Query,\n joiningQuery as Query,\n primaryKeys,\n foreignKeys,\n len,\n ),\n ),\n reverseJoin,\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const baseQuery = (query as Query).clone();\n baseQuery.q.select = fromQuerySelect;\n const q = (relationQuery as unknown as PickQueryQ).q;\n q.insertFrom = prepareSubQueryForSql(q as never, baseQuery);\n q.values = [];\n };\n },\n };\n};\n\nconst getWhereForNestedUpdate = (\n t: Query,\n data: RecordUnknown[],\n params: MaybeArray<WhereArg<PickQueryMetaRelations>> | 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 RecordUnknown,\n { connect: NestedInsertManyConnect },\n ];\n\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n items[i] = _queryUpdateOrThrow(\n t.where<Query>({ OR: connect as never[] }),\n obj as never,\n );\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 RecordUnknown,\n { connectOrCreate: NestedInsertManyConnectOrCreate },\n ];\n\n for (const item of connectOrCreate) {\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n queries.push(\n _queryUpdate(\n t.where(item.where as WhereArg<Query>) as never,\n obj as never,\n ),\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: RecordUnknown[] = [];\n\n for (const [selfData, { create, connectOrCreate }] of items as [\n RecordUnknown,\n NestedInsertManyItems,\n ][]) {\n const obj: RecordUnknown = {};\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 _queryCreateMany(t, 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: RecordUnknown = {};\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\n if (params.add) {\n if (data.length > 1) {\n throw new OrchidOrmInternalError(\n query,\n '`connect` is not available when updating multiple records, it is only applicable for a single record update',\n );\n }\n\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = data[0][primaryKeys[i]];\n }\n\n const relatedWheres = toArray(params.add);\n\n const count = await _queryUpdate(\n t.where({ OR: relatedWheres }) as Query,\n obj as never,\n );\n\n if (count < relatedWheres.length) {\n throw new OrchidOrmInternalError(\n query,\n `Expected to find at least ${relatedWheres.length} record(s) based on \\`add\\` conditions, but found ${count}`,\n );\n }\n }\n\n if (params.disconnect || params.set) {\n const obj: RecordUnknown = {};\n for (const foreignKey of foreignKeys) {\n obj[foreignKey] = null;\n }\n\n const setConditions =\n params.set &&\n (Array.isArray(params.set)\n ? params.set.length\n : objectHasValues(params.set)) &&\n (Array.isArray(params.set)\n ? {\n OR: params.set,\n }\n : params.set);\n\n let queryToDisconnect = getWhereForNestedUpdate(\n t,\n data,\n params.disconnect,\n primaryKeys,\n foreignKeys,\n );\n\n // do not nullify those records that are going to be set, because the column may non-nullable.\n if (setConditions) {\n queryToDisconnect = queryToDisconnect.whereNot(setConditions) as never;\n }\n\n await _queryUpdate(queryToDisconnect, obj as never);\n\n if (setConditions) {\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = data[0][primaryKeys[i]];\n }\n\n await _queryUpdate(\n t.where<Query>(setConditions as never),\n obj as never,\n );\n }\n }\n\n if (params.delete || params.update) {\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 _queryDelete(q);\n } else if (params.update) {\n await _queryUpdate(q, params.update.data as never);\n }\n }\n }) as HasManyNestedUpdate;\n};\n","import {\n RelationConfigSelf,\n RelationData,\n RelationThunkBase,\n} from './relations';\nimport { ORMTableInput, TableClass } from '../baseTable';\nimport {\n _queryCreateManyFrom,\n _queryCreateMany,\n _queryDefaults,\n _queryDelete,\n _queryFindBy,\n _queryFindByOptional,\n _queryHookAfterCreate,\n _queryJoinOn,\n _queryRows,\n _querySelect,\n _queryUpdate,\n _queryWhere,\n _queryWhereExists,\n CreateCtx,\n CreateData,\n getQueryAs,\n JoinedShapes,\n Query,\n SelectableFromShape,\n TableData,\n UpdateData,\n UpdateCtx,\n VirtualColumn,\n WhereArg,\n ColumnSchemaConfig,\n ColumnsShape,\n getPrimaryKeys,\n MaybeArray,\n NotFoundError,\n objectHasValues,\n OrchidOrmInternalError,\n pick,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n toArray,\n toSnakeCase,\n defaultSchemaConfig,\n Column,\n} from 'pqb';\nimport {\n addAutoForeignKey,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n RelJoin,\n} from './common/utils';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from './hasMany';\nimport { joinQueryChainHOF } from './common/joinQueryChain';\n\nexport interface HasAndBelongsToMany extends RelationThunkBase {\n type: 'hasAndBelongsToMany';\n options: HasAndBelongsToManyOptions;\n}\n\nexport interface HasAndBelongsToManyOptions<\n Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit,\n Related extends TableClass = TableClass,\n> {\n required?: boolean;\n columns: (keyof Columns)[];\n references: string[];\n foreignKey?: boolean | TableData.References.Options;\n through: {\n table: string;\n columns: string[];\n references: (keyof InstanceType<Related>['columns']['shape'])[];\n foreignKey?: boolean | TableData.References.Options;\n };\n on?: ColumnsShape.InputPartial<InstanceType<Related>['columns']['shape']>;\n}\n\nexport type HasAndBelongsToManyParams<\n T extends RelationConfigSelf,\n Relation extends HasAndBelongsToMany,\n> = {\n [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];\n};\n\nexport type HasAndBelongsToManyQuery<\n Name extends string,\n TableQuery extends Query,\n> = {\n [K in keyof TableQuery]: K extends 'meta'\n ? Omit<TableQuery['meta'], 'selectable'> & {\n as: Name;\n hasWhere: true;\n selectable: SelectableFromShape<TableQuery['shape'], Name>;\n }\n : K extends 'join'\n ? RelJoin\n : TableQuery[K];\n};\n\nexport interface HasAndBelongsToManyInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends HasAndBelongsToMany,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: false;\n query: Q;\n params: HasAndBelongsToManyParams<T, Rel>;\n maybeSingle: Q;\n omitForeignKeyInCreate: never;\n optionalDataForCreate: {\n [P in Name]?: {\n // create related records\n create?: CreateData<Q>[];\n // find existing records by `where` conditions and update their foreign keys with the new id\n connect?: WhereArg<Q>[];\n // try finding records by `where` conditions, and create them if not found\n connectOrCreate?: {\n where: WhereArg<Q>;\n create: CreateData<Q>;\n }[];\n };\n };\n dataForCreate: never;\n // `hasAndBelongsToMany` relation data available for update. It supports:\n // - `disconnect` deletes join table records for related records found by conditions\n // - `set` creates join table records for related records found by conditions, deletes previous connects\n // - `add` creates join table records for related records found by conditions, does not delete previous connects\n // - `delete` deletes join table records and related records found by conditions\n // - `update` updates related records found by conditions with a provided data\n // - `create` creates related records and a join table records\n dataForUpdate: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: 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: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: 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}\n\ninterface 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 primaryKeysShape: Column.Shape.Data;\n on?: RecordUnknown;\n}\n\nclass HasAndBelongsToManyVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasManyNestedInsert;\n private readonly nestedUpdate: HasManyNestedUpdate;\n\n constructor(\n // is used to generate a migration for join table\n public joinTable: Query,\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(q: Query, ctx: CreateCtx, item: RecordUnknown, rowIndex: number) {\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: RecordUnknown) {\n hasRelationHandleUpdate(\n q,\n set,\n this.key,\n this.state.primaryKeys,\n this.nestedUpdate,\n );\n }\n}\n\nconst removeColumnName = (column: Column.Pick.Data) => {\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 tableConfig: ORMTableInput,\n table: Query,\n qb: Query,\n relation: HasAndBelongsToMany,\n relationName: string,\n query: Query,\n): RelationData => {\n const { options } = relation;\n const { snakeCase } = table.internal;\n const primaryKeys = options.columns as string[];\n const foreignKeys = options.references;\n const originalForeignKeys = snakeCase ? [...foreignKeys] : foreignKeys;\n const joinTable = options.through.table;\n const throughForeignKeys = options.through.columns;\n const originalThroughForeignKeys = snakeCase\n ? [...throughForeignKeys]\n : throughForeignKeys;\n const throughPrimaryKeys = options.through.references as string[];\n const { on } = options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query, on);\n }\n\n const foreignKeysFull = foreignKeys.map((key, i) => {\n if (snakeCase) key = foreignKeys[i] = toSnakeCase(key);\n\n return `${joinTable}.${key}`;\n });\n\n const throughForeignKeysFull = throughForeignKeys.map((key, i) => {\n if (snakeCase) key = throughForeignKeys[i] = toSnakeCase(key);\n\n return `${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: Column.Shape.Data = {};\n const primaryKeysShape: Column.Shape.Data = {};\n\n for (let i = 0; i < len; i++) {\n const pk = primaryKeys[i];\n\n shape[foreignKeys[i]] = removeColumnName(\n table.shape[pk] as unknown as Column.Pick.Data,\n );\n\n primaryKeysShape[pk] = table.shape[pk] as unknown as Column.Pick.Data;\n }\n\n for (let i = 0; i < throughLen; i++) {\n shape[throughForeignKeys[i]] = removeColumnName(\n query.shape[throughPrimaryKeys[i]] as unknown as Column.Pick.Data,\n );\n }\n\n baseQuery.shape = shape;\n baseQuery.q = {\n ...baseQuery.q,\n shape: baseQuery.shape,\n };\n const subQuery = Object.create(baseQuery) as Query;\n\n addAutoForeignKey(\n tableConfig,\n subQuery,\n table,\n primaryKeys,\n foreignKeys,\n relation.options,\n originalForeignKeys,\n );\n\n addAutoForeignKey(\n tableConfig,\n subQuery,\n query,\n throughPrimaryKeys,\n throughForeignKeys,\n relation.options.through,\n originalThroughForeignKeys,\n );\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 primaryKeysShape,\n on,\n };\n\n const joinQuery = (\n joiningQuery: Query,\n tableAs: string,\n foreignAs: string,\n joinedShapes: JoinedShapes,\n ) => {\n const cloned = joiningQuery.clone();\n cloned.q.joinedShapes = joinedShapes;\n return _queryWhereExists(cloned, subQuery, [\n (q) => {\n for (let i = 0; i < throughLen; i++) {\n _queryJoinOn(q, [\n throughForeignKeysFull[i],\n `${foreignAs}.${throughPrimaryKeys[i]}`,\n ]);\n }\n\n for (let i = 0; i < len; i++) {\n _queryJoinOn(q, [foreignKeysFull[i], `${tableAs}.${primaryKeys[i]}`]);\n }\n\n return q;\n },\n ]);\n };\n\n const obj: RecordString = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = primaryKeys[i];\n }\n const selectPrimaryKeysAsForeignKeys = [{ selectAs: obj }];\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n const foreignAs = getQueryAs(joiningQuery as Query);\n return joinQuery(\n baseQuery as Query,\n getQueryAs(baseQuery as Query),\n foreignAs,\n {\n ...(baseQuery as Query).q.joinedShapes,\n [foreignAs]: (joiningQuery as Query).q.shape,\n },\n );\n };\n\n return {\n returns: 'many',\n queryRelated(params: RecordUnknown) {\n const q = query.whereExists(subQuery, (q) => {\n q = q.clone();\n\n const where: RecordUnknown = {};\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 _queryJoinOn(q, [\n throughForeignKeysFull[i],\n throughPrimaryKeysFull[i],\n ]);\n }\n\n return _queryWhere(q, [where as never]);\n });\n\n return on ? _queryDefaults(q, on) : q;\n },\n virtualColumn: new HasAndBelongsToManyVirtualColumn(\n subQuery,\n defaultSchemaConfig,\n relationName,\n state,\n ),\n joinQuery: joinQueryChainHOF(\n getPrimaryKeys(query),\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinQuery(\n joiningQuery as Query,\n getQueryAs(baseQuery as Query),\n getQueryAs(joiningQuery as Query),\n {\n ...(joiningQuery as Query).q.joinedShapes,\n [((baseQuery as Query).q.as ||\n (baseQuery as Query).table) as string]: (baseQuery as Query).q\n .shape,\n },\n ),\n ),\n reverseJoin,\n modifyRelatedQuery(relationQuery) {\n const ref = {} as { q: Query };\n\n _queryHookAfterCreate(\n relationQuery as Query,\n [],\n async (result: unknown[]) => {\n const baseQuery = ref.q.clone();\n baseQuery.q.select = selectPrimaryKeysAsForeignKeys;\n\n const data = result.map((resultRow) => {\n const dataRow: RecordUnknown = {};\n for (let i = 0; i < throughLen; i++) {\n dataRow[throughForeignKeys[i]] = (resultRow as RecordUnknown)[\n throughPrimaryKeys[i]\n ];\n }\n return dataRow;\n });\n\n const createdCount = await _queryCreateManyFrom(\n subQuery.count(),\n baseQuery as Query & { returnType: 'one' | 'oneOrThrow' },\n data as never,\n );\n\n if ((createdCount as unknown as number) === 0) {\n throw new NotFoundError(baseQuery);\n }\n },\n );\n\n return (q) => {\n ref.q = q as Query;\n };\n },\n };\n};\n\nconst queryJoinTable = (\n state: State,\n data: RecordUnknown[],\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 _queryWhere(t, [\n {\n IN: {\n columns: state.throughForeignKeys,\n values: _querySelect(\n state.relatedTableQuery.where(conditionsToWhereArg(conditions)),\n state.throughPrimaryKeys,\n ),\n },\n },\n ]);\n }\n\n if (state.on) {\n _queryWhereExists(t, state.relatedTableQuery, [\n (q) => {\n for (let i = 0; i < state.throughPrimaryKeys.length; i++) {\n _queryJoinOn(q, [\n state.throughPrimaryKeysFull[i],\n state.throughForeignKeysFull[i],\n ]);\n }\n return q;\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: RecordUnknown[],\n idsRows: unknown[][],\n) => {\n const len = state.primaryKeys.length;\n const throughLen = state.throughPrimaryKeys.length;\n\n const records: RecordUnknown[] = [];\n for (const item of data) {\n const obj: RecordUnknown = {};\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: RecordUnknown[];\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 _queryFindBy(\n t.select(...throughPrimaryKeys),\n item as never,\n ) as Query,\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: (RecordUnknown | 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 _queryFindByOptional(\n t.select(...throughPrimaryKeys),\n item.where as never,\n ) as Query,\n );\n }\n }\n\n connectOrCreated = (await Promise.all(queries)) as RecordUnknown[];\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: RecordUnknown[];\n if (items.length) {\n const records: RecordUnknown[] = [];\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 _queryCreateMany(\n t.select(...throughPrimaryKeys),\n records,\n )) as never;\n } else {\n created = [];\n }\n\n const allKeys = data as unknown as [\n selfData: RecordUnknown,\n relationKeys: RecordUnknown[],\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: RecordUnknown[] = [];\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: RecordUnknown[] = [];\n for (const [selfData, relationKeys] of allKeys) {\n const obj: RecordUnknown = {};\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 (query, data, params) => {\n if (params.create) {\n const idsRows: unknown[][] = await _queryCreateMany(\n _queryRows(state.relatedTableQuery.select(...state.throughPrimaryKeys)),\n params.create,\n );\n\n const records: RecordUnknown[] = [];\n for (const item of data) {\n const obj: RecordUnknown = {};\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 _queryUpdate(\n _queryWhere(\n state.relatedTableQuery.whereExists(state.joinTableQuery, (q) => {\n for (let i = 0; i < throughLen; i++) {\n _queryJoinOn(q, [\n state.throughForeignKeysFull[i],\n state.throughPrimaryKeysFull[i],\n ]);\n }\n\n return _queryWhere(q, [\n {\n IN: {\n columns: state.foreignKeysFull,\n values: data.map((item) =>\n state.primaryKeys.map((key) => item[key]),\n ),\n },\n },\n ]);\n }),\n [conditionsToWhereArg(params.update.where as WhereArg<Query>)],\n ),\n params.update.data as UpdateData<Query>,\n );\n }\n\n /**\n * Performs `insertForEachFrom` on the joining table,\n * based on a query to the related table with applied filters of `params.connect`,\n * joins the main table data using `joinData`.\n */\n if (params.add) {\n const as = query.table as string;\n const relatedWheres = toArray(params.add);\n const joinTableColumns = [\n ...state.foreignKeys,\n ...state.throughForeignKeys,\n ];\n\n try {\n const count = await state.joinTableQuery\n .insertForEachFrom(\n _querySelect(\n state.relatedTableQuery.whereOneOf(...relatedWheres) as Query,\n [\n Object.fromEntries([\n ...state.primaryKeys.map((key, i) => [\n state.foreignKeys[i],\n as + '.' + (state.primaryKeysShape[key].data.name || key),\n ]),\n ...state.throughForeignKeys.map((key, i) => [\n key,\n state.throughPrimaryKeys[i],\n ]),\n ]),\n ],\n ).joinData(\n as,\n () =>\n Object.fromEntries(\n state.primaryKeys.map((key) => [\n key,\n state.primaryKeysShape[key],\n ]),\n ) as never,\n data.map((x) => pick(x, state.primaryKeys)) as never,\n ),\n )\n // do update on conflict to increase the resulting counter\n .onConflict(joinTableColumns)\n .merge([state.foreignKeys[0]]);\n\n if (count < data.length * relatedWheres.length) {\n throw new OrchidOrmInternalError(\n query,\n `Expected to find at least ${\n relatedWheres.length\n } record(s) based on \\`add\\` conditions, but found ${\n count / data.length\n }`,\n );\n }\n } catch (err) {\n if ((err as RecordUnknown).code === '42P10') {\n throw new OrchidOrmInternalError(\n query,\n `\"${\n state.joinTableQuery.table\n }\" must have a primary key or a unique index on columns (${joinTableColumns.join(\n ', ',\n )}) for this kind of query.`,\n );\n }\n throw err;\n }\n }\n\n if (params.disconnect) {\n await _queryDelete(\n queryJoinTable(state, data, params.disconnect as WhereArg<Query>),\n );\n }\n\n if (params.delete) {\n const j = queryJoinTable(state, data, params.delete as WhereArg<Query>);\n\n const idsRows = await _queryDelete(\n _queryRows(_querySelect(j, state.throughForeignKeys)),\n );\n\n await _queryDelete(\n state.relatedTableQuery.where({\n IN: {\n columns: state.throughPrimaryKeys,\n values: idsRows,\n },\n }),\n );\n }\n\n if (params.set) {\n const j = queryJoinTable(state, data);\n await _queryDelete(j);\n\n if (\n Array.isArray(params.set)\n ? params.set.length\n : objectHasValues(params.set)\n ) {\n const idsRows = await _queryRows(\n _querySelect(\n state.relatedTableQuery.where(\n conditionsToWhereArg(params.set as WhereArg<Query>),\n ),\n state.throughPrimaryKeys,\n ),\n );\n\n await insertToJoinTable(state, j, data, idsRows);\n }\n }\n }) as HasManyNestedUpdate;\n};\n","import { BelongsTo, BelongsToParams, makeBelongsToMethod } from './belongsTo';\nimport { HasOne, HasOneParams, makeHasOneMethod } from './hasOne';\nimport {\n ORMTableInputToQueryBuilder,\n ORMTableInput,\n TableClass,\n TableInfo,\n} from '../baseTable';\nimport { OrchidORM } from '../orm';\nimport {\n _queryTake,\n _queryTakeOptional,\n CreateData,\n Query,\n VirtualColumn,\n WhereArg,\n ColumnSchemaConfig,\n IsQuery,\n RecordUnknown,\n RelationJoinQuery,\n RelationsBase,\n Column,\n} from 'pqb';\nimport { HasMany, makeHasManyMethod } from './hasMany';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyParams,\n makeHasAndBelongsToManyMethod,\n} from './hasAndBelongsToMany';\nimport { getSourceRelation, getThroughRelation } from './common/utils';\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: unknown; table: Query },\n> =\n | {\n create: 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: Rel['nestedCreateQuery'];\n };\n };\n\nexport type RelationToOneDataForCreateSameQuery<Q extends Query> =\n | {\n create: CreateData<Q>;\n connect?: never;\n connectOrCreate?: never;\n }\n | {\n create?: never;\n connect: WhereArg<Q>;\n connectOrCreate?: never;\n }\n | {\n create?: never;\n connect?: never;\n connectOrCreate: {\n where: WhereArg<Q>;\n create: CreateData<Q>;\n };\n };\n\nexport interface RelationThunkBase {\n type: string;\n fn(): TableClass;\n options: unknown;\n}\n\nexport type RelationThunk = BelongsTo | HasOne | HasMany | HasAndBelongsToMany;\n\nexport interface RelationThunks {\n [K: string]: RelationThunk;\n}\n\nexport interface RelationData {\n returns: 'one' | 'many';\n queryRelated(params: RecordUnknown): Query;\n virtualColumn?: VirtualColumn<ColumnSchemaConfig>;\n joinQuery: RelationJoinQuery;\n reverseJoin: RelationJoinQuery;\n modifyRelatedQuery?(relatedQuery: IsQuery): (query: IsQuery) => void;\n}\n\nexport type RelationTableToQuery<Relation extends RelationThunkBase> =\n ORMTableInputToQueryBuilder<InstanceType<ReturnType<Relation['fn']>>>;\n\nexport interface RelationConfigSelf {\n columns: { shape: Column.Shape.QueryInit };\n relations: RelationThunks;\n}\n\nexport type RelationConfigParams<\n T extends RelationConfigSelf,\n Relation extends RelationThunk,\n> = Relation extends BelongsTo\n ? BelongsToParams<T, Relation>\n : Relation extends HasOne | HasMany\n ? HasOneParams<T, Relation>\n : Relation extends HasAndBelongsToMany\n ? HasAndBelongsToManyParams<T, Relation>\n : never;\n\ninterface ApplyRelationData {\n relationName: string;\n relation: RelationThunk;\n dbTable: Query;\n otherDbTable: Query;\n}\n\ntype DelayedRelations = Map<Query, Record<string, ApplyRelationData[]>>;\n\nexport const applyRelations = (\n qb: Query,\n tables: Record<string, ORMTableInput>,\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 ORMTableInput & {\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 as unknown as { table: Query }).table,\n options.source,\n data,\n );\n continue;\n }\n }\n\n applyRelation(table, 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 as unknown as TableInfo).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)[\n through\n ] as unknown as { table: Query } | undefined;\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 unknown as TableInfo).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 table: ORMTableInput,\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 = baseQuery.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(table, dbTable, relation, relationName, query);\n } else if (type === 'hasOne') {\n data = makeHasOneMethod(table, dbTable, relation, relationName, query);\n } else if (type === 'hasMany') {\n data = makeHasManyMethod(table, dbTable, relation, relationName, query);\n } else if (type === 'hasAndBelongsToMany') {\n data = makeHasAndBelongsToManyMethod(\n table,\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 _queryTake(query);\n } else {\n _queryTakeOptional(query);\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 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 (dbTable.relations as RecordUnknown)[relationName] = {\n table: otherDbTable,\n query,\n queryRelated: data.queryRelated,\n joinQuery: data.joinQuery,\n reverseJoin: data.reverseJoin,\n modifyRelatedQuery: data.modifyRelatedQuery,\n };\n\n (dbTable.relationQueries ??= {})[relationName] = query;\n\n const tableRelations = delayedRelations.get(dbTable);\n if (!tableRelations) return;\n\n tableRelations[relationName]?.forEach((data) => {\n applyRelation(table, qb, data, delayedRelations);\n });\n};\n","import {\n Db,\n IsolationLevel,\n TransactionOptions,\n AfterCommitStandaloneHook,\n} from 'pqb';\n\nexport function transaction<Result>(\n this: { $qb: Db },\n fn: () => Promise<Result>,\n): Promise<Result>;\nexport function transaction<Result>(\n this: { $qb: Db },\n options: IsolationLevel | TransactionOptions,\n fn: () => Promise<Result>,\n): Promise<Result>;\nexport function transaction<Result>(\n this: { $qb: Db },\n fnOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n fn?: () => Promise<Result>,\n): Promise<Result> {\n return this.$qb.transaction(\n fnOrOptions as IsolationLevel,\n fn as () => Promise<Result>,\n );\n}\n\nexport function ensureTransaction<Result>(\n this: { $qb: Db },\n cb: () => Promise<Result>,\n): Promise<Result> {\n return this.$qb.ensureTransaction(cb);\n}\n\nexport function isInTransaction(this: { $qb: Db }): boolean {\n return this.$qb.isInTransaction();\n}\n\nexport function afterCommit(\n this: { $qb: Db },\n hook: AfterCommitStandaloneHook,\n): void {\n this.$qb.afterCommit(hook);\n}\n","import {\n makeColumnTypes,\n Db,\n DbTableOptions,\n DbTableOptionScopes,\n FromArg,\n FromResult,\n NoPrimaryKeyOption,\n Query,\n QueryData,\n defaultSchemaConfig,\n DbSharedOptions,\n _initQueryBuilder,\n AdapterBase,\n ColumnSchemaConfig,\n MaybeArray,\n QueryLogOptions,\n RecordUnknown,\n TransactionState,\n Column,\n} from 'pqb';\nimport {\n ORMTableInputToQueryBuilder,\n ORMTableInput,\n TableClasses,\n BaseTableClass,\n} from './baseTable';\nimport { applyRelations } from './relations/relations';\nimport {\n transaction,\n ensureTransaction,\n isInTransaction,\n afterCommit,\n} from './transaction';\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\ninterface FromQuery extends Query {\n returnType: 'all';\n}\n\nexport type OrchidORM<T extends TableClasses = TableClasses> = {\n [K in keyof T]: ORMTableInputToQueryBuilder<InstanceType<T[K]>>;\n} & {\n /**\n * @see import('pqb').Transaction.prototype.transaction\n */\n $transaction: typeof transaction;\n /**\n * @see import('pqb').Transaction.prototype.ensureTransaction\n */\n $ensureTransaction: typeof ensureTransaction;\n /**\n * @see import('pqb').Transaction.prototype.isInTransaction\n */\n $isInTransaction: typeof isInTransaction;\n /**\n * @see import('pqb').Transaction.prototype.afterCommit\n */\n $afterCommit: typeof afterCommit;\n $adapter: AdapterBase;\n $qb: Db;\n\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} 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 /**\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\n /**\n * See {@link FromMethods.from}\n */\n $from<Arg extends MaybeArray<FromArg<Query>>>(\n arg: Arg,\n ): FromResult<FromQuery, Arg>;\n\n $close(): Promise<void>;\n};\n\nexport type OrchidOrmParam<Options> = true | null extends true\n ? 'Set strict: true to tsconfig'\n : Options;\n\nexport const orchidORMWithAdapter = <T extends TableClasses>(\n {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey = 'error',\n ...options\n }: OrchidOrmParam<\n ({ db: Query } | { adapter: AdapterBase }) & DbSharedOptions\n >,\n tables: T,\n): OrchidORM<T> => {\n const commonOptions: QueryLogOptions & {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n } = {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey,\n };\n\n let adapter: AdapterBase;\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.qb as Db;\n } else {\n adapter = options.adapter;\n\n transactionStorage = new AsyncLocalStorage<TransactionState>();\n\n qb = _initQueryBuilder(\n adapter,\n makeColumnTypes(defaultSchemaConfig),\n transactionStorage,\n commonOptions,\n options,\n );\n }\n\n const result = {\n $transaction: transaction,\n $ensureTransaction: ensureTransaction,\n $isInTransaction: isInTransaction,\n $afterCommit: afterCommit,\n $adapter: adapter,\n $qb: qb,\n get $query() {\n return qb.query;\n },\n $queryArrays: ((...args) =>\n qb.queryArrays(...args)) as typeof qb.queryArrays,\n $with: qb.with.bind(qb),\n $withRecursive: qb.withRecursive.bind(qb),\n $withSql: qb.withSql.bind(qb),\n $from: qb.from.bind(qb),\n $close: adapter.close.bind(adapter),\n } as unknown as OrchidORM;\n\n const tableInstances: Record<string, ORMTableInput> = {};\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 tableClass = tables[key];\n const table = tableClass.instance();\n tableInstances[key] = table;\n\n const options: DbTableOptions<unknown, string, Column.Shape.QueryInit> = {\n ...commonOptions,\n schema: table.schema,\n language: table.language,\n scopes: table.scopes as DbTableOptionScopes<\n string,\n Column.Shape.QueryInit\n >,\n softDelete: table.softDelete,\n snakeCase: (table as { snakeCase?: boolean }).snakeCase,\n comment: table.comment,\n noPrimaryKey: table.noPrimaryKey ? 'ignore' : undefined,\n computed: table.computed as never,\n nowSQL: (\n tableClass as unknown as BaseTableClass<ColumnSchemaConfig, unknown>\n ).nowSQL,\n };\n\n const dbTable = new Db(\n adapter,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n qb as any,\n table.table,\n table.columns.shape,\n table.types,\n transactionStorage,\n options,\n table.constructor.prototype.columns?.data ?? {},\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 (result as RecordUnknown)[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 const db = result as unknown as OrchidORM<T>;\n db.$adapter;\n\n return result as unknown as OrchidORM<T>;\n};\n","import {\n getClonedQueryData,\n MergeQuery,\n Query,\n WhereResult,\n QueryReturnType,\n RecordUnknown,\n} from 'pqb';\n\ntype 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> = {\n [K in keyof T]: K extends 'returnType'\n ? Exclude<QueryReturnType, 'all' | undefined>\n : T[K];\n};\n\nexport interface 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?: RecordUnknown;\n}\n\nexport type MapQueryMethods<BaseQuery extends Query, Method> = Method 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\ninfer Result\n ? <T extends BaseQuery>(\n this: T,\n ...args: Args\n ) => Result extends Query ? MergeQuery<T, Result> : Result\n : never;\n\nexport type MapMethods<T extends Query, Methods extends MethodsBase<T>> = {\n [K in\n | keyof Methods['queryMethods']\n | keyof Methods['queryOneMethods']\n | keyof Methods['queryWithWhereMethods']\n | keyof Methods['queryOneWithWhereMethods']\n | keyof Methods['methods']]: K extends keyof Methods['methods']\n ? Methods['methods'][K]\n : K extends keyof Methods['queryOneWithWhereMethods']\n ? MapQueryMethods<\n QueryOne<WhereResult<Query>>,\n Methods['queryOneWithWhereMethods'][K]\n >\n : K extends keyof Methods['queryWithWhereMethods']\n ? MapQueryMethods<WhereResult<Query>, Methods['queryWithWhereMethods'][K]>\n : K extends keyof Methods['queryOneMethods']\n ? MapQueryMethods<QueryOne<Query>, Methods['queryOneMethods'][K]>\n : K extends keyof Methods['queryMethods']\n ? MapQueryMethods<Query, Methods['queryMethods'][K]>\n : never;\n};\n\nexport type Repo<T extends Query, Methods extends MethodsBase<T>> = T &\n MapMethods<T, Methods>;\n\nexport const createRepo = <T extends Query, Methods extends MethodsBase<T>>(\n table: T,\n methods: Methods,\n): Repo<\n (<Q extends { table: T['table']; shape: T['shape'] }>(\n q: Q,\n ) => Query & Q & MapMethods<T, Methods>) &\n T,\n Methods\n> => {\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 RecordUnknown)[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 never;\n};\n"],"names":["defaultSchemaConfig","makeColumnTypes","getStackTrace","emptyObject","emptyArray","raw","getCallerFilePath","filePath","snakeCaseKey","getColumnTypes","parseTableData","toSnakeCase","applyMixins","QueryHooks","_queryHookAfterCreate","q","rowIndex","_queryHookAfterUpdate","getQueryAs","setQueryObjectValueImmutable","pushQueryOnForOuter","isExpression","cloneQueryBaseUnscoped","DynamicRawSQL","RawSQL","getShapeFromSelect","VirtualColumn","nestedUpdate","key","_with","_queryCreate","_orCreate","_queryWhere","getFreeAlias","_queryDefaults","primaryKeys","foreignKeys","getPrimaryKeys","isQueryReturnsAll","_queryHookBeforeUpdate","_queryFindBy","len","_queryRows","_queryUpdate","_queryDelete","nestedInsert","reverseJoin","query","prepareSubQueryForSql","data","i","_queryUpdateOrThrow","ids","toArray","_queryCreateMany","OrchidOrmInternalError","objectHasValues","obj","_queryWhereExists","_queryJoinOn","baseQuery","_queryCreateManyFrom","NotFoundError","_querySelect","_queryFindByOptional","records","item","pick","_queryTake","_queryTakeOptional","AsyncLocalStorage","_initQueryBuilder","options","Db","getClonedQueryData"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/baseTable.ts","../src/relations/common/utils.ts","../src/relations/common/joinQueryChain.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 ComputedColumnsFromOptions,\n ComputedOptionsFactory,\n Db,\n DbTableOptionScopes,\n DefaultColumnTypes,\n defaultSchemaConfig,\n DefaultSchemaConfig,\n DynamicRawSQL,\n getColumnTypes,\n makeColumnTypes,\n MapTableScopesOption,\n parseTableData,\n Query,\n QueryAfterHook,\n QueryBeforeHookInternal,\n QueryData,\n QueryHooks,\n RawSQL,\n ShapeColumnPrimaryKeys,\n ShapeUniqueColumns,\n TableData,\n TableDataFn,\n TableDataItem,\n TableDataItemsUniqueColumns,\n TableDataItemsUniqueColumnTuples,\n TableDataItemsUniqueConstraints,\n UniqueConstraints,\n raw,\n ComputedOptionsConfig,\n applyMixins,\n ColumnSchemaConfig,\n QueryScopes,\n DynamicSQLArg,\n emptyArray,\n EmptyObject,\n emptyObject,\n getCallerFilePath,\n getStackTrace,\n IsQuery,\n MaybeArray,\n QueryOrExpression,\n RecordUnknown,\n RelationsBase,\n ShallowSimplify,\n snakeCaseKey,\n StaticSQLArgs,\n toSnakeCase,\n ColumnsShape,\n Column,\n} from 'pqb';\nimport {\n RelationConfigSelf,\n RelationTableToQuery,\n} from './relations/relations';\nimport { OrchidORM } from './orm';\nimport {\n BelongsTo,\n BelongsToInfo,\n BelongsToOptions,\n BelongsToQuery,\n} from './relations/belongsTo';\nimport {\n HasOne,\n HasOneInfo,\n HasOneOptions,\n HasOneQuery,\n} from './relations/hasOne';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyInfo,\n HasAndBelongsToManyOptions,\n HasAndBelongsToManyQuery,\n} from './relations/hasAndBelongsToMany';\nimport { HasMany, HasManyInfo, HasManyQuery } from './relations/hasMany';\n\n// type of table class itself\nexport interface TableClass<T extends ORMTableInput = ORMTableInput> {\n new (): T;\n instance(): T;\n}\n\n// object with table classes, used on orchidORM() for setting tables\nexport interface TableClasses {\n [K: string]: TableClass;\n}\n\nexport interface TableInfo {\n definedAs: string;\n db: OrchidORM;\n getFilePath(): string;\n name: string;\n}\n\nexport interface Table extends Query, TableInfo {}\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 interface TableToDb<\n T extends ORMTableInput,\n Relations extends RelationsBase,\n> extends TableInfo,\n Db<\n T['table'],\n T['columns']['shape'],\n keyof ShapeColumnPrimaryKeys<T['columns']['shape']> extends never\n ? never\n : ShapeColumnPrimaryKeys<T['columns']['shape']>,\n | ShapeUniqueColumns<T['columns']['shape']>\n | TableDataItemsUniqueColumns<\n T['columns']['shape'],\n T['columns']['data']\n >,\n TableDataItemsUniqueColumnTuples<\n T['columns']['shape'],\n T['columns']['data']\n >,\n | UniqueConstraints<T['columns']['shape']>\n | TableDataItemsUniqueConstraints<T['columns']['data']>,\n T['types'],\n T['columns']['shape'] & ComputedColumnsFromOptions<T['computed']>,\n MapTableScopesOption<T>\n > {\n relations: Relations;\n}\n\n// convert a table class type into queryable interface\nexport type ORMTableInputToQueryBuilder<T extends ORMTableInput> =\n T extends RelationConfigSelf\n ? TableToDb<\n T,\n T extends RelationConfigSelf\n ? {\n [K in keyof T['relations'] &\n string]: T['relations'][K] extends BelongsTo\n ? BelongsToInfo<\n T,\n K,\n T['relations'][K],\n T['relations'][K]['options']['columns'][number] & string,\n T['relations'][K]['options']['required'],\n BelongsToQuery<RelationTableToQuery<T['relations'][K]>, K>\n >\n : T['relations'][K] extends HasOne\n ? HasOneInfo<\n T,\n K,\n T['relations'][K],\n HasOneQuery<T, K, RelationTableToQuery<T['relations'][K]>>\n >\n : T['relations'][K] extends HasMany\n ? HasManyInfo<\n T,\n K,\n T['relations'][K],\n HasManyQuery<T, K, RelationTableToQuery<T['relations'][K]>>\n >\n : T['relations'][K] extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<\n T,\n K,\n T['relations'][K],\n HasAndBelongsToManyQuery<\n K,\n RelationTableToQuery<T['relations'][K]>\n >\n >\n : never;\n }\n : EmptyObject\n >\n : TableToDb<T, EmptyObject>;\n\n// type of table instance created by a table class\n// is used only in `orchidORM` constructor to accept proper classes\nexport interface ORMTableInput {\n // table name\n table: string;\n // columns shape and the record type\n columns: {\n shape: Column.Shape.QueryInit;\n data: MaybeArray<TableDataItem>;\n };\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?: ComputedOptionsFactory<never, never>;\n // Available scopes for this table defined by user.\n scopes?: RecordUnknown;\n // enable soft delete, true for `deletedAt` column, string for column name\n readonly softDelete?: true | string;\n // database table comment\n comment?: string;\n // automatically create foreign keys for relations\n autoForeignKeys?: TableData.References.BaseOptions;\n}\n\n// Object type that's allowed in `where` and similar methods of the table.\nexport type Queryable<T extends ORMTableInput> = ShallowSimplify<{\n [K in keyof T['columns']['shape']]?: T['columns']['shape'][K]['queryType'];\n}>;\n\nexport type DefaultSelect<T extends ORMTableInput> = ShallowSimplify<\n ColumnsShape.DefaultOutput<T['columns']['shape']>\n>;\n\n// Object type of table's record that's returned from database and is parsed.\nexport type Selectable<T extends ORMTableInput> = T['computed'] extends ((\n t: never,\n) => infer R extends ComputedOptionsConfig)\n ? ShallowSimplify<\n ColumnsShape.Output<T['columns']['shape']> & {\n [K in keyof R]: R[K] extends QueryOrExpression<unknown>\n ? R[K]['result']['value']['outputType']\n : R[K] extends () => {\n result: { value: infer Value extends Column.Pick.QueryColumn };\n }\n ? Value['outputType']\n : never;\n }\n >\n : ShallowSimplify<ColumnsShape.Output<T['columns']['shape']>>;\n\n// Object type that conforms `create` method of the table.\nexport type Insertable<T extends ORMTableInput> = ShallowSimplify<\n ColumnsShape.Input<T['columns']['shape']>\n>;\n\n// Object type that conforms `update` method of the table.\nexport type Updatable<T extends ORMTableInput> = ShallowSimplify<\n ColumnsShape.InputPartial<T['columns']['shape']>\n>;\n\n// type of before hook function for the table\ntype BeforeHookMethod = (cb: QueryBeforeHookInternal) => void;\n\n// type of after hook function for the table\ntype AfterHookMethod = (cb: QueryAfterHook) => void;\n\n// type of after hook function that allows selecting columns for the table\ntype AfterSelectableHookMethod = <\n Shape extends Column.QueryColumns,\n S extends (keyof Shape)[],\n>(\n this: { columns: { shape: Shape } },\n select: S,\n cb: AfterHook<S, Shape>,\n) => void;\n\nexport interface SetColumnsResult<\n Shape extends Column.Shape.QueryInit,\n Data extends MaybeArray<MaybeArray<TableDataItem>>,\n> {\n shape: Shape;\n data: Data extends unknown[] ? Data : [Data];\n}\n\nexport interface BaseTableInstance<ColumnTypes> {\n table: string;\n columns: { shape: Column.Shape.QueryInit; data: MaybeArray<TableDataItem> };\n schema?: string;\n noPrimaryKey?: boolean;\n snakeCase?: boolean;\n types: ColumnTypes;\n q: QueryData;\n language?: string;\n filePath: string;\n result: Column.Shape.QueryInit;\n clone<T extends IsQuery>(this: T): T;\n getFilePath(): string;\n setColumns<\n Shape extends Column.Shape.QueryInit,\n Data extends MaybeArray<TableDataItem>,\n >(\n fn: (t: ColumnTypes) => Shape,\n tableData?: TableDataFn<Shape, Data>,\n ): SetColumnsResult<Shape, Data>;\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, sql } 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 * 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 * import { sql } from './baseTable';\n *\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: () =>\n * // `sql` accepts a callback to generate a new query on every run\n * 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 * }).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 Shape extends Column.Shape.QueryInit,\n Computed extends ComputedOptionsFactory<ColumnTypes, Shape>,\n >(\n this: { columns: { shape: Shape } },\n computed: Computed,\n ): Computed;\n\n /**\n * See {@link ScopeMethods}\n */\n setScopes<\n Table extends string,\n Shape extends Column.Shape.QueryInit,\n Keys extends string,\n >(\n this: { table: Table; columns: { shape: Shape } },\n scopes: DbTableOptionScopes<Table, Shape, Keys>,\n ): QueryScopes<Keys>;\n\n belongsTo<\n Columns extends Column.Shape.QueryInit,\n Related extends TableClass,\n Options extends BelongsToOptions<Columns, Related>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => Related,\n options: Options,\n ): {\n type: 'belongsTo';\n fn: () => Related;\n options: Options;\n };\n\n hasOne<\n Columns extends Column.Shape.QueryInit,\n Related extends TableClass,\n Through extends string,\n Source extends string,\n Options extends HasOneOptions<Columns, Related, Through, Source>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => Related,\n options: Options,\n ): {\n type: 'hasOne';\n fn: () => Related;\n options: Options;\n };\n\n hasMany<\n Columns extends Column.Shape.QueryInit,\n Related extends TableClass,\n Through extends string,\n Source extends string,\n Options extends HasOneOptions<Columns, Related, Through, Source>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => Related,\n options: Options,\n ): {\n type: 'hasMany';\n fn: () => Related;\n options: Options;\n };\n\n hasAndBelongsToMany<\n Columns extends Column.Shape.QueryInit,\n Related extends TableClass,\n Options extends HasAndBelongsToManyOptions<Columns, Related>,\n >(\n this: { columns: { shape: Columns } },\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\nexport interface BaseTableClass<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n> {\n nowSQL: string | undefined;\n exportAs: string;\n columnTypes: ColumnTypes;\n getFilePath(): string;\n\n sql<T>(\n ...args: StaticSQLArgs\n ): RawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n sql<T>(\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n ): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n\n new (): BaseTableInstance<ColumnTypes>;\n instance(): BaseTableInstance<ColumnTypes>;\n\n /**\n * All column types for inserting.\n */\n inputSchema: SchemaConfig['inputSchema'];\n /**\n * All column types as returned from a database.\n */\n outputSchema: SchemaConfig['outputSchema'];\n /**\n * All column types for query methods such as `where`.\n */\n querySchema: SchemaConfig['querySchema'];\n /**\n * Primary key column(s) type for query methods such as `where`.\n */\n pkeySchema: SchemaConfig['pkeySchema'];\n /**\n * Column types for inserting, excluding primary keys.\n * Equals to {@link inputSchema} without primary keys.\n */\n createSchema: SchemaConfig['createSchema'];\n /**\n * Column types for updating, excluding primary keys.\n * Equals to partial {@link createSchema}.\n */\n updateSchema: SchemaConfig['updateSchema'];\n}\n\n// base table constructor\nexport function createBaseTable<\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n schemaConfig = defaultSchemaConfig as unknown as SchemaConfig,\n columnTypes: columnTypesArg,\n snakeCase,\n filePath: filePathArg,\n nowSQL,\n exportAs = 'BaseTable',\n language,\n autoForeignKeys,\n}: {\n schemaConfig?: SchemaConfig;\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?:\n | ColumnTypes\n | ((t: DefaultColumnTypes<SchemaConfig>) => 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 // automatically create foreign keys for relations\n autoForeignKeys?: boolean | TableData.References.BaseOptions;\n} = {}): BaseTableClass<SchemaConfig, ColumnTypes> {\n const columnTypes = (\n typeof columnTypesArg === 'function'\n ? (\n columnTypesArg as (t: DefaultColumnTypes<SchemaConfig>) => ColumnTypes\n )(makeColumnTypes(schemaConfig))\n : columnTypesArg || makeColumnTypes(schemaConfig)\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 const defaultColumns: {\n shape: Column.Shape.QueryInit;\n data: MaybeArray<TableDataItem>;\n } = {\n shape: emptyObject,\n data: emptyArray,\n };\n\n const base = class BaseTable {\n static nowSQL = nowSQL;\n static exportAs = exportAs;\n static columnTypes = columnTypes;\n\n static sql(...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sql = (raw as any)(...args);\n sql.columnTypes = columnTypes;\n return sql;\n }\n\n private static _inputSchema: unknown;\n static inputSchema() {\n this.instance();\n // Nullish coalescing assignment (??=), for some reason, compiles to != null and miss undefined\n return this._inputSchema === undefined\n ? (this._inputSchema = schemaConfig.inputSchema.call(this as never))\n : this._inputSchema;\n }\n\n private static _outputSchema: unknown;\n static outputSchema() {\n this.instance();\n return this._outputSchema === undefined\n ? (this._outputSchema = schemaConfig.outputSchema.call(this as never))\n : this._outputSchema;\n }\n\n private static _querySchema: unknown;\n static querySchema() {\n this.instance();\n return this._querySchema === undefined\n ? (this._querySchema = schemaConfig.querySchema.call(this as never))\n : this._querySchema;\n }\n\n private static _createSchema: unknown;\n static createSchema() {\n this.instance();\n return this._createSchema === undefined\n ? (this._createSchema = schemaConfig.createSchema.call(this as never))\n : this._createSchema;\n }\n\n private static _updateSchema: unknown;\n static updateSchema() {\n this.instance();\n return this._updateSchema === undefined\n ? (this._updateSchema = schemaConfig.updateSchema.call(this as never))\n : this._updateSchema;\n }\n\n private static _pkeySchema: unknown;\n static pkeySchema() {\n this.instance();\n return this._pkeySchema === undefined\n ? (this._pkeySchema = schemaConfig.pkeySchema.call(this as never))\n : this._pkeySchema;\n }\n\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 private static _instance?: BaseTable;\n static instance(): BaseTable {\n return (this._instance ??= new this());\n }\n\n table!: string;\n columns = defaultColumns;\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: Column.Shape.QueryInit;\n declare autoForeignKeys?: TableData.References.BaseOptions;\n\n clone<T extends IsQuery>(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<\n Shape extends Column.Shape.QueryInit,\n Data extends MaybeArray<TableDataItem>,\n >(\n fn: (t: ColumnTypes) => Shape,\n dataFn?: TableDataFn<Shape, Data>,\n ): SetColumnsResult<Shape, Data> {\n (columnTypes as { [snakeCaseKey]?: boolean })[snakeCaseKey] =\n this.snakeCase;\n\n const shape = getColumnTypes(columnTypes, fn, nowSQL, this.language);\n const tableData = parseTableData(dataFn);\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 // save columns to prototype to make them available in static methods (inputSchema, outputSchema)\n return (this.constructor.prototype.columns = {\n shape,\n data: tableData as never,\n });\n }\n\n setComputed(computed: unknown) {\n return computed;\n }\n\n setScopes(scopes: unknown) {\n return scopes;\n }\n\n belongsTo(fn: () => unknown, options: unknown) {\n return {\n type: 'belongsTo' as const,\n fn,\n options,\n };\n }\n\n hasOne(fn: () => unknown, options: unknown) {\n return {\n type: 'hasOne' as const,\n fn,\n options,\n };\n }\n\n hasMany(fn: () => unknown, options: unknown) {\n return {\n type: 'hasMany' as const,\n fn,\n options,\n };\n }\n\n hasAndBelongsToMany(fn: () => unknown, options: unknown) {\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 base.prototype.snakeCase = snakeCase;\n base.prototype.autoForeignKeys =\n autoForeignKeys === true ? {} : autoForeignKeys || undefined;\n\n return base as unknown as BaseTableClass<SchemaConfig, ColumnTypes>;\n}\n","import {\n _queryHookAfterCreate,\n _queryHookAfterUpdate,\n Column,\n CreateCtx,\n getQueryAs,\n JoinCallback,\n JoinQueryMethod,\n pushQueryOnForOuter,\n Query,\n setQueryObjectValueImmutable,\n UpdateData,\n WhereArg,\n emptyObject,\n MaybeArray,\n PickQueryMetaRelations,\n PickQueryRelations,\n RecordUnknown,\n RelationConfigBase,\n} from 'pqb';\nimport { HasOneNestedInsert, HasOneNestedUpdate } from '../hasOne';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from '../hasMany';\nimport { BaseTableClass, ORMTableInput } from '../../baseTable';\nimport { RelationRefsOptions } from './options';\n\n// INNER JOIN the current relation instead of the default OUTER behavior\nexport interface RelJoin extends JoinQueryMethod {\n <T extends Query>(this: T): T;\n}\n\nexport interface NestedInsertOneItem {\n create?: NestedInsertOneItemCreate;\n connect?: NestedInsertOneItemConnect;\n connectOrCreate?: NestedInsertOneItemConnectOrCreate;\n}\n\nexport type NestedInsertOneItemCreate = RecordUnknown;\nexport type NestedInsertOneItemConnect = RecordUnknown;\n\nexport interface NestedInsertOneItemConnectOrCreate {\n where: WhereArg<PickQueryMetaRelations>;\n create: RecordUnknown;\n}\n\nexport interface NestedInsertManyItems {\n create?: NestedInsertManyCreate;\n connect?: NestedInsertManyConnect;\n connectOrCreate?: NestedInsertManyConnectOrCreate;\n}\n\nexport type NestedInsertManyCreate = RecordUnknown[];\n\nexport type NestedInsertManyConnect = WhereArg<PickQueryMetaRelations>[];\n\nexport type NestedInsertManyConnectOrCreate =\n NestedInsertOneItemConnectOrCreate[];\n\nexport type NestedInsertItem = NestedInsertOneItem | NestedInsertManyItems;\n\nexport interface NestedUpdateOneItem {\n add?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n disconnect?: boolean;\n set?: WhereArg<PickQueryMetaRelations>;\n delete?: boolean;\n update?: UpdateData<Query>;\n upsert?: {\n update: UpdateData<Query>;\n create: RecordUnknown | (() => RecordUnknown);\n };\n create: RecordUnknown;\n}\n\nexport interface NestedUpdateManyItems {\n add?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n disconnect?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n set?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n delete?: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n update?: {\n where: MaybeArray<WhereArg<PickQueryMetaRelations>>;\n data: UpdateData<Query>;\n };\n create: RecordUnknown[];\n}\n\nexport type NestedUpdateItem = NestedUpdateOneItem | NestedUpdateManyItems;\n\nexport const getThroughRelation = (\n table: Query,\n through: string,\n): RelationConfigBase => {\n return table.relations[through];\n};\n\nexport const getSourceRelation = (\n throughRelation: RelationConfigBase,\n source: string,\n): RelationConfigBase => {\n return (throughRelation.query as unknown as PickQueryRelations).relations[\n source\n ];\n};\n\nexport const hasRelationHandleCreate = (\n q: Query,\n ctx: CreateCtx,\n item: RecordUnknown,\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 _queryHookAfterCreate(q, 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: RecordUnknown,\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.add || (Array.isArray(value.add) && value.add.length === 0)) &&\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 q.q.wrapInTransaction = true;\n\n _queryHookAfterUpdate(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 function joinHasThrough(\n q: Query,\n baseQuery: Query,\n joiningQuery: Query,\n throughRelation: RelationConfigBase,\n sourceRelation: RelationConfigBase,\n): Query {\n return q.whereExists(\n throughRelation.joinQuery(\n throughRelation.query as never,\n baseQuery as never,\n ) as never,\n (() => {\n const as = getQueryAs(joiningQuery);\n return sourceRelation.joinQuery(\n (sourceRelation.query as Query).as(as),\n throughRelation.query as never,\n );\n }) as unknown as JoinCallback<Query, Query>,\n );\n}\n\nexport function joinHasRelation(\n baseQuery: Query,\n joiningQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n len: number,\n) {\n const baseAs = getQueryAs(baseQuery);\n\n const q = joiningQuery.clone();\n setQueryObjectValueImmutable(q, 'joinedShapes', baseAs, baseQuery.q.shape);\n\n for (let i = 0; i < len; i++) {\n pushQueryOnForOuter(\n q,\n baseQuery,\n joiningQuery,\n foreignKeys[i],\n `${baseAs}.${primaryKeys[i]}`,\n );\n }\n\n return q;\n}\n\nexport const addAutoForeignKey = (\n tableConfig: ORMTableInput,\n from: Query,\n to: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n options: RelationRefsOptions<PropertyKey>,\n // non-snake-cased\n originalForeignKeys?: string[],\n) => {\n const toTable = to.table as string;\n\n let fkeyOptions =\n options.foreignKey !== undefined\n ? options.foreignKey\n : tableConfig.autoForeignKeys;\n if (!fkeyOptions) return;\n\n if (fkeyOptions === true) {\n fkeyOptions = tableConfig.autoForeignKeys || emptyObject;\n }\n\n if (foreignKeys.length === 1) {\n const column = from.shape[foreignKeys[0]] as Column;\n if (column.data.foreignKeys) {\n const pkey = primaryKeys[0];\n\n for (const fkey of column.data.foreignKeys) {\n let fkeyTable: string;\n let fkeyColumn = fkey.foreignColumns[0];\n if (typeof fkey.fnOrTable === 'string') {\n fkeyTable = fkey.fnOrTable;\n fkeyColumn = getColumnKeyFromDbName(to, fkeyColumn);\n } else {\n fkeyTable = (fkey.fnOrTable() as unknown as BaseTableClass<any, any>) // eslint-disable-line @typescript-eslint/no-explicit-any\n .instance().table;\n }\n\n if (toTable === fkeyTable && pkey === fkeyColumn) return;\n }\n }\n }\n\n const { constraints } = from.internal.tableData;\n if (constraints) {\n const sortedPkeys = [...primaryKeys].sort();\n const sortedFkeys = [...foreignKeys].sort();\n\n for (const { references: refs } of constraints) {\n if (!refs) continue;\n\n if (\n refs.columns.length === sortedFkeys.length &&\n refs.columns.every((column, i) => column === sortedFkeys[i]) &&\n refs.foreignColumns.length === sortedPkeys.length &&\n (typeof refs.fnOrTable === 'string'\n ? refs.fnOrTable === toTable &&\n refs.foreignColumns.every(\n (column, i) =>\n getColumnKeyFromDbName(to, column) === sortedPkeys[i],\n )\n : (refs.fnOrTable as unknown as () => BaseTableClass<any, any>)() // eslint-disable-line @typescript-eslint/no-explicit-any\n .instance().table === toTable &&\n refs.foreignColumns.every((column, i) => column === sortedPkeys[i]))\n )\n return;\n }\n }\n\n (from.internal.tableData.constraints ??= []).push({\n references: {\n columns: originalForeignKeys || foreignKeys,\n fnOrTable: toTable,\n foreignColumns: primaryKeys,\n options: fkeyOptions,\n },\n dropMode: fkeyOptions.dropMode,\n });\n};\n\nconst getColumnKeyFromDbName = (query: Query, name: string) => {\n for (const k in query.shape) {\n if ((query.shape[k] as Column).data.name === name) {\n return k;\n }\n }\n return name;\n};\n","import {\n cloneQueryBaseUnscoped,\n DynamicRawSQL,\n getQueryAs,\n getShapeFromSelect,\n Query,\n RawSQL,\n HookSelectValue,\n isExpression,\n RelationJoinQuery,\n Column,\n} from 'pqb';\n\nexport const joinQueryChainHOF =\n (\n relPKeys: string[],\n reverseJoin: RelationJoinQuery,\n joinQuery: RelationJoinQuery,\n ): RelationJoinQuery =>\n (joiningQuery, baseQuery) => {\n const jq = joiningQuery as Query;\n const chain = jq.q.relChain;\n if (!chain || chain.length === 1) {\n return joinQuery(jq, baseQuery);\n }\n\n const last = chain[chain.length - 1];\n const prev = chain[chain.length - 2];\n const query = prev.rel.joinQuery(last.query as never, baseQuery) as Query;\n\n let useWhereExist = true;\n\n // It does not make sense to return a single value not from the target table,\n // so in this case skip guessing by order and select contains.\n if (jq.q.returnType !== 'value' && jq.q.returnType !== 'valueOrThrow') {\n let tablePrefix: string | undefined;\n if (jq.q.order) {\n const prefix = (tablePrefix = getQueryAs(jq) + '.');\n useWhereExist = jq.q.order.every((o) => {\n if (typeof o === 'string') {\n return isOwnColumn(prefix, o);\n } else if (isExpression(o)) {\n return false;\n } else {\n for (const key in o) {\n if (!isOwnColumn(prefix, key)) {\n return false;\n }\n }\n return true;\n }\n });\n }\n\n if (useWhereExist && jq.q.select) {\n const prefix = tablePrefix || getQueryAs(jq) + '.';\n useWhereExist = jq.q.select.every((s) => {\n if (typeof s === 'string') {\n return isOwnColumn(prefix, s);\n } else if (isExpression(s)) {\n return false;\n } else if (!s) {\n return false;\n } else {\n for (const key in s.selectAs) {\n const value = s.selectAs[key];\n if (typeof value !== 'string' || !isOwnColumn(prefix, value)) {\n return false;\n }\n }\n return true;\n }\n });\n }\n }\n\n if (useWhereExist) {\n return jq.where({\n EXISTS: { q: reverseJoin(query, jq) },\n });\n }\n\n const result = jq.join(\n { _internalJoin: reverseJoin(query, jq) } as never,\n undefined,\n );\n\n if (!query.q.chainMultiple) {\n return result;\n }\n\n const item = selectRowNumber(result, relPKeys);\n combineOrdering(result, query);\n if (!result.q.select) result.q.select = ['*'];\n return wrapQuery(jq, result, item);\n };\n\nconst isOwnColumn = (prefix: string, column: string) =>\n !column.includes('.') || column.startsWith(prefix);\n\nconst selectRowNumber = (\n result: Query,\n relPKeys: string[],\n): HookSelectValue => {\n const hookSelect = (result.q.hookSelect = new Map(\n result.q.hookSelect && [...result.q.hookSelect],\n ));\n const as = `\"${getQueryAs(result)}\"`;\n const partitionColumns = relPKeys.map(\n (key) =>\n `${as}.\"${\n (result.shape as Column.Shape.QueryInit)[key]?.data.name || key\n }\"`,\n );\n const item = {\n select: {\n sql: `row_number() OVER (PARTITION BY ${partitionColumns.join(', ')})`,\n },\n };\n\n hookSelect.set('r', item);\n\n return item;\n};\n\nconst combineOrdering = (result: Query, joined: Query) => {\n const { order } = joined.q;\n if (order) {\n const as = getQueryAs(joined);\n\n const add = order.map((o) =>\n typeof o === 'string'\n ? `${as}.${o}`\n : isExpression(o)\n ? o\n : Object.fromEntries(\n Object.entries(o).map(([key, value]) => [`${as}.${key}`, value]),\n ),\n );\n\n const arr = result.q.order;\n result.q.order = arr ? [...add, ...arr] : add;\n }\n};\n\nconst wrapQuery = (\n joiningQuery: Query,\n result: Query,\n item: HookSelectValue,\n) => {\n const baseOuterQuery = cloneQueryBaseUnscoped(joiningQuery);\n const outer = baseOuterQuery.clone();\n\n outer.q.and = [new DynamicRawSQL(() => new RawSQL(`${item.as || 'r'} = 1`))];\n outer.q.useFromLimitOffset = true;\n outer.shape = getShapeFromSelect(result, true);\n outer.q.select = Object.keys(outer.shape);\n outer.q.returnType = result.q.returnType;\n\n result.q.returnsOne = true;\n return result.wrap(outer);\n};\n","import { ORMTableInput, TableClass } from '../baseTable';\nimport {\n _queryCreate,\n _queryDefaults,\n _queryDelete,\n _queryFindBy,\n _queryHookAfterUpdate,\n _queryHookBeforeUpdate,\n _queryRows,\n _queryUpdate,\n _queryWhere,\n CreateCtx,\n CreateData,\n CreateMethodsNames,\n DeleteMethodsNames,\n getQueryAs,\n isQueryReturnsAll,\n pushQueryOnForOuter,\n Query,\n SelectableFromShape,\n setQueryObjectValueImmutable,\n QueryTake,\n QueryTakeOptional,\n UpdateCtx,\n UpdateCtxCollect,\n UpdateData,\n VirtualColumn,\n WhereArg,\n TableData,\n defaultSchemaConfig,\n ColumnSchemaConfig,\n emptyArray,\n EmptyObject,\n getPrimaryKeys,\n QueryResult,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n ColumnsShape,\n Column,\n getFreeAlias,\n _with,\n RawSQL,\n RawSQLBase,\n _orCreate,\n} from 'pqb';\nimport {\n RelationConfigSelf,\n RelationData,\n RelationThunkBase,\n RelationToOneDataForCreateSameQuery,\n} from './relations';\nimport {\n addAutoForeignKey,\n NestedInsertOneItemCreate,\n NestedUpdateOneItem,\n RelJoin,\n selectIfNotSelected,\n} from './common/utils';\nimport { RelationRefsOptions } from './common/options';\nimport { joinQueryChainHOF } from './common/joinQueryChain';\n\nexport interface BelongsTo extends RelationThunkBase {\n type: 'belongsTo';\n options: BelongsToOptions;\n}\n\nexport interface BelongsToOptions<\n Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit,\n Related extends TableClass = TableClass,\n> {\n required?: boolean;\n columns: (keyof Columns)[];\n references: (keyof InstanceType<Related>['columns']['shape'])[];\n foreignKey?: boolean | TableData.References.Options;\n on?: ColumnsShape.InputPartial<InstanceType<Related>['columns']['shape']>;\n}\n\nexport type BelongsToFKey<Relation extends RelationThunkBase> =\n Relation['options'] extends RelationRefsOptions\n ? Relation['options']['columns'][number]\n : never;\n\nexport type BelongsToParams<\n T extends RelationConfigSelf,\n Relation extends BelongsTo,\n> = {\n [Name in BelongsToFKey<Relation>]: T['columns']['shape'][Name]['type'];\n};\n\nexport type BelongsToQuery<T extends Query, Name extends string> = {\n [P in keyof T]: P extends 'meta'\n ? // Omit is optimal\n Omit<T['meta'], 'selectable'> & {\n as: Name;\n hasWhere: true;\n selectable: SelectableFromShape<T['shape'], Name>;\n }\n : P extends 'join'\n ? RelJoin\n : P extends CreateMethodsNames | DeleteMethodsNames\n ? never\n : T[P];\n};\n\nexport interface BelongsToInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends BelongsTo,\n FK extends string,\n Required,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: true;\n query: Q;\n params: BelongsToParams<T, Rel>;\n maybeSingle: Required extends true ? QueryTake<Q> : QueryTakeOptional<Q>;\n omitForeignKeyInCreate: FK;\n dataForCreate: {\n columns: FK;\n nested: Required extends true\n ? {\n [Key in Name]: RelationToOneDataForCreateSameQuery<Q>;\n }\n : {\n [Key in Name]?: RelationToOneDataForCreateSameQuery<Q>;\n };\n };\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 update a single record:\n // - `upsert` to update or create the related record\n dataForUpdateOne:\n | { disconnect: boolean }\n | { set: WhereArg<Q> }\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | { create: CreateData<Q> }\n | {\n upsert: {\n update: UpdateData<Q>;\n create: CreateData<Q> | (() => CreateData<Q>);\n };\n };\n}\n\ninterface State {\n query: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n len: number;\n on?: RecordUnknown;\n}\n\ntype BelongsToNestedUpdate = (\n q: Query,\n update: RecordUnknown,\n params: NestedUpdateOneItem,\n state: {\n queries?: ((queryResult: QueryResult) => Promise<void>)[];\n collect?: UpdateCtxCollect;\n },\n) => void;\n\nclass BelongsToVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedUpdate: BelongsToNestedUpdate;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedUpdate = nestedUpdate(this.state);\n }\n\n create(q: Query, ctx: CreateCtx, item: RecordUnknown) {\n const {\n key,\n state: { query, primaryKeys, foreignKeys },\n } = this;\n\n for (const key of foreignKeys) {\n if (!ctx.columns.has(key)) {\n ctx.columns.set(key, ctx.columns.size);\n }\n }\n\n const value = item[key] as NestedInsertOneItemCreate;\n if ('create' in value || 'connectOrCreate' in value) {\n foreignKeys.forEach((foreignKey) => (item[foreignKey] = new RawSQL('')));\n\n const selectPKeys = query.select(...primaryKeys);\n\n _with(\n q,\n (as) => {\n foreignKeys.forEach((foreignKey, i) => {\n (\n item[foreignKey] as RawSQLBase\n )._sql = `(SELECT \"${as}\".\"${primaryKeys[i]}\" FROM \"${as}\")`;\n });\n },\n 'create' in value\n ? _queryCreate(selectPKeys, value.create as never)\n : _orCreate(\n _queryWhere(selectPKeys, [\n (value.connectOrCreate as { where: never }).where,\n ]),\n (value.connectOrCreate as { create: never }).create,\n ),\n );\n\n return;\n } else if ('connect' in value) {\n const as = getFreeAlias(q.q.withShapes, 'q');\n _with(q, as, query.select(...primaryKeys).findBy(value.connect));\n\n foreignKeys.map((foreignKey, i) => {\n const selectColumn = `(SELECT \"${as}\".\"${primaryKeys[i]}\" FROM \"${as}\")`;\n item[foreignKey] = new RawSQL(\n i === 0\n ? `CASE WHEN (SELECT count(*) FROM \"${as}\") = 0 AND (SELECT 'not-found')::int = 0 THEN NULL ELSE ${selectColumn} END`\n : selectColumn,\n );\n });\n\n return;\n }\n }\n\n update(q: Query, ctx: UpdateCtx, set: RecordUnknown) {\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 tableConfig: ORMTableInput,\n table: Query,\n relation: BelongsTo,\n relationName: string,\n query: Query,\n): RelationData => {\n const primaryKeys = relation.options.references as string[];\n const foreignKeys = relation.options.columns as string[];\n const { on } = relation.options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query, on);\n }\n\n const len = primaryKeys.length;\n const state: State = { query, primaryKeys, foreignKeys, len, on };\n\n addAutoForeignKey(\n tableConfig,\n table,\n query,\n primaryKeys,\n foreignKeys,\n relation.options,\n );\n\n const join = (\n baseQuery: Query,\n joiningQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n ) => {\n const baseAs = getQueryAs(baseQuery);\n\n const q = joiningQuery.clone();\n setQueryObjectValueImmutable(q, 'joinedShapes', baseAs, baseQuery.q.shape);\n\n for (let i = 0; i < len; i++) {\n pushQueryOnForOuter(\n q,\n baseQuery,\n joiningQuery,\n primaryKeys[i],\n `${baseAs}.${foreignKeys[i]}`,\n );\n }\n\n return q;\n };\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return join(\n joiningQuery as Query,\n baseQuery as Query,\n foreignKeys,\n primaryKeys,\n );\n };\n\n return {\n returns: 'one',\n queryRelated(params: RecordUnknown) {\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[primaryKeys[i]] = params[foreignKeys[i]];\n }\n return query.where(obj as never);\n },\n virtualColumn: new BelongsToVirtualColumn(\n defaultSchemaConfig,\n relationName,\n state,\n ),\n joinQuery: joinQueryChainHOF(\n getPrimaryKeys(query),\n reverseJoin,\n (joiningQuery, baseQuery) =>\n join(\n baseQuery as Query,\n joiningQuery as Query,\n primaryKeys,\n foreignKeys,\n ),\n ),\n reverseJoin,\n };\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 _queryHookBeforeUpdate(q, async ({ query: 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 _queryFindBy(\n query.select(...loadPrimaryKeys),\n params.set as never,\n )) as RecordUnknown;\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 _queryCreate(\n q,\n params.create,\n )) as unknown as RecordUnknown;\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 as Query).clone();\n selectQuery.q.type = undefined;\n selectQuery.q.distinct = emptyArray;\n selectIfNotSelected(selectQuery, foreignKeys);\n idsForDelete = (await _queryRows(selectQuery)) as [\n unknown,\n ...unknown[],\n ][];\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: RecordUnknown | 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 const count = obj\n ? await _queryUpdate(\n query.findBy(obj as never),\n upsert.update as UpdateData<Query>,\n )\n : 0;\n\n if (!count) {\n const data =\n typeof upsert.create === 'function'\n ? upsert.create()\n : upsert.create;\n\n const result = (await _queryCreate(\n query.select(...primaryKeys),\n data,\n )) as unknown as RecordUnknown;\n\n const collectData: RecordUnknown = {};\n state.collect = {\n data: collectData,\n };\n\n for (let i = 0; i < len; i++) {\n collectData[foreignKeys[i]] = result[primaryKeys[i]];\n }\n }\n });\n } else if (params.delete || params.update) {\n _queryHookAfterUpdate(\n q,\n params.update ? foreignKeys : emptyArray,\n 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 RecordUnknown)[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 _queryDelete(t);\n } else {\n await _queryUpdate(t, params.update as UpdateData<Query>);\n }\n },\n );\n }\n }) as BelongsToNestedUpdate;\n};\n","import {\n _queryDefaults,\n _queryDelete,\n _queryRows,\n _queryUpdate,\n _queryUpdateOrThrow,\n _queryWhere,\n AddQueryDefaults,\n CreateCtx,\n CreateData,\n CreateMethodsNames,\n isQueryReturnsAll,\n PickQueryQ,\n Query,\n SelectableFromShape,\n QueryTake,\n QueryTakeOptional,\n UpdateCtx,\n UpdateData,\n VirtualColumn,\n WhereArg,\n defaultSchemaConfig,\n CreateManyMethodsNames,\n ColumnSchemaConfig,\n EmptyObject,\n getPrimaryKeys,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n Column,\n} from 'pqb';\nimport { ORMTableInput, TableClass } from '../baseTable';\nimport {\n RelationData,\n RelationThunkBase,\n RelationToOneDataForCreate,\n RelationConfigParams,\n RelationConfigSelf,\n} from './relations';\nimport {\n addAutoForeignKey,\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n joinHasRelation,\n joinHasThrough,\n NestedInsertOneItem,\n NestedInsertOneItemConnectOrCreate,\n NestedInsertOneItemCreate,\n NestedUpdateOneItem,\n RelJoin,\n} from './common/utils';\nimport { RelationRefsOptions, RelationThroughOptions } from './common/options';\nimport { joinQueryChainHOF } from './common/joinQueryChain';\nimport { prepareSubQueryForSql } from 'pqb';\n\nexport interface HasOne extends RelationThunkBase {\n type: 'hasOne';\n options: HasOneOptions;\n}\n\ninterface RelationHasOneThroughOptions<\n Through extends string,\n Source extends string,\n> extends RelationThroughOptions<Through, Source> {\n required?: boolean;\n}\n\nexport type HasOneOptions<\n Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit,\n Related extends TableClass = TableClass,\n Through extends string = string,\n Source extends string = string,\n> =\n | RelationRefsOptions<\n keyof Columns,\n InstanceType<Related>['columns']['shape']\n >\n | RelationHasOneThroughOptions<Through, Source>;\n\nexport type HasOneParams<\n T extends RelationConfigSelf,\n Relation extends RelationThunkBase,\n> = Relation['options'] extends RelationRefsOptions\n ? {\n [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];\n }\n : Relation['options'] extends RelationThroughOptions\n ? RelationConfigParams<T, T['relations'][Relation['options']['through']]>\n : never;\n\nexport type HasOnePopulate<\n T extends RelationConfigSelf,\n Name extends string,\n> = T['relations'][Name]['options'] extends RelationRefsOptions\n ? Record<T['relations'][Name]['options']['references'][number], true>\n : never;\n\nexport type HasOneQueryThrough<\n T extends RelationConfigSelf,\n Name extends string,\n TableQuery extends Query,\n> = {\n [K in keyof TableQuery]: K extends 'meta'\n ? Omit<TableQuery['meta'], 'selectable'> & {\n as: Name;\n defaults: HasOnePopulate<T, Name>;\n hasWhere: true;\n selectable: SelectableFromShape<TableQuery['shape'], Name>;\n }\n : K extends 'join'\n ? RelJoin\n : K extends CreateMethodsNames\n ? never\n : TableQuery[K];\n};\n\nexport type HasOneQuery<\n T extends RelationConfigSelf,\n Name extends string,\n TableQuery extends Query,\n> = T['relations'][Name]['options'] extends RelationThroughOptions\n ? HasOneQueryThrough<T, Name, TableQuery>\n : {\n [K in keyof TableQuery]: K extends 'meta'\n ? Omit<TableQuery['meta'], 'selectable'> & {\n as: Name;\n defaults: HasOnePopulate<T, Name>;\n hasWhere: true;\n selectable: SelectableFromShape<TableQuery['shape'], Name>;\n }\n : K extends 'join'\n ? RelJoin\n : K extends CreateManyMethodsNames\n ? never\n : TableQuery[K];\n };\n\nexport interface HasOneInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends HasOne,\n Q extends Query,\n CD = T['relations'][Name]['options'] extends RelationThroughOptions\n ? CreateData<Q>\n : CreateData<AddQueryDefaults<Q, HasOnePopulate<T, Name>>>,\n> extends RelationConfigBase {\n returnsOne: true;\n query: Q;\n params: HasOneParams<T, Rel>;\n maybeSingle: T['relations'][Name]['options']['required'] extends true\n ? QueryTake<Q>\n : QueryTakeOptional<Q>;\n omitForeignKeyInCreate: never;\n optionalDataForCreate: T['relations'][Name]['options'] extends RelationThroughOptions\n ? EmptyObject\n : {\n [P in Name]?: RelationToOneDataForCreate<{\n nestedCreateQuery: CD;\n table: Q;\n }>;\n };\n dataForCreate: never;\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 update 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 | { disconnect: boolean }\n | { set: WhereArg<Q> }\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | {\n upsert: {\n update: UpdateData<Q>;\n create: CD | (() => CD);\n };\n }\n | {\n create: CD;\n };\n}\n\ninterface State {\n query: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport type HasOneNestedInsert = (\n query: Query,\n data: [selfData: RecordUnknown, relationData: NestedInsertOneItem][],\n) => Promise<void>;\n\nexport type HasOneNestedUpdate = (\n query: Query,\n data: RecordUnknown[],\n relationData: NestedUpdateOneItem,\n) => Promise<void>;\n\nclass HasOneVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasOneNestedInsert;\n private readonly nestedUpdate: HasOneNestedUpdate;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(q: Query, ctx: CreateCtx, item: RecordUnknown, rowIndex: number) {\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: RecordUnknown) {\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 tableConfig: ORMTableInput,\n table: Query,\n relation: HasOne,\n relationName: string,\n query: Query,\n): RelationData => {\n const relPKeys = getPrimaryKeys(query);\n\n if ('through' in relation.options) {\n const { through, source } = relation.options;\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = (sourceRelation.query as Query).as(\n relationName,\n );\n const sourceQuery = sourceRelation.joinQuery(\n sourceRelationQuery,\n throughRelation.query as never,\n ) as Query;\n\n const whereExistsCallback = () => sourceQuery;\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return joinHasThrough(\n baseQuery as Query,\n baseQuery as Query,\n joiningQuery as Query,\n throughRelation,\n sourceRelation,\n );\n };\n\n return {\n returns: 'one',\n queryRelated: (params: RecordUnknown) => {\n const throughQuery = table.queryRelated(through, params) as Query;\n\n return query.whereExists(throughQuery, whereExistsCallback);\n },\n joinQuery: joinQueryChainHOF(\n relPKeys,\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinHasThrough(\n joiningQuery as Query,\n baseQuery as Query,\n joiningQuery as Query,\n throughRelation,\n sourceRelation,\n ),\n ),\n reverseJoin,\n };\n }\n\n const primaryKeys = relation.options.columns as string[];\n const foreignKeys = relation.options.references as string[];\n const { on } = relation.options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query, on);\n }\n\n addAutoForeignKey(\n tableConfig,\n query,\n table,\n primaryKeys,\n foreignKeys,\n relation.options,\n );\n\n const state: State = { query, primaryKeys, foreignKeys, on };\n const len = primaryKeys.length;\n\n const reversedOn: RecordString = {};\n for (let i = 0; i < len; i++) {\n reversedOn[foreignKeys[i]] = primaryKeys[i];\n }\n\n const fromQuerySelect = [{ selectAs: reversedOn }];\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return joinHasRelation(\n joiningQuery as Query,\n baseQuery as Query,\n foreignKeys,\n primaryKeys,\n len,\n );\n };\n\n return {\n returns: 'one',\n queryRelated: (params: RecordUnknown) => {\n const values: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n values[foreignKeys[i]] = params[primaryKeys[i]];\n }\n\n return _queryDefaults(query.where(values as never), { ...on, ...values });\n },\n virtualColumn: new HasOneVirtualColumn(\n defaultSchemaConfig,\n relationName,\n state,\n ),\n joinQuery: joinQueryChainHOF(\n relPKeys,\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinHasRelation(\n baseQuery as Query,\n joiningQuery as Query,\n primaryKeys,\n foreignKeys,\n len,\n ),\n ),\n reverseJoin,\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const baseQuery = (query as Query).clone();\n baseQuery.q.select = fromQuerySelect;\n const q = (relationQuery as unknown as PickQueryQ).q;\n q.insertFrom = prepareSubQueryForSql(q as never, baseQuery);\n q.values = [];\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 [RecordUnknown, RecordUnknown];\n\n const data: RecordUnknown = {};\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 ? _queryUpdateOrThrow(\n t.where(item.connect as WhereArg<Query>) as never,\n data as never,\n )\n : _queryUpdate(\n t.where(\n (item.connectOrCreate as RecordUnknown)\n .where as WhereArg<Query>,\n ) as never,\n data as never,\n );\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 [RecordUnknown, RecordUnknown];\n const data: RecordUnknown = {\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 RecordUnknown[]);\n }\n }) as HasOneNestedInsert;\n};\n\nconst nestedUpdate = ({ query, primaryKeys, foreignKeys }: State) => {\n const len = primaryKeys.length;\n\n const setNulls: RecordUnknown = {};\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 let queryToDisconnect = currentRelationsQuery;\n // do not nullify the record that is going to be set, because the column may non-nullable.\n if (params.set) {\n queryToDisconnect = queryToDisconnect.whereNot(params.set) as never;\n }\n\n await _queryUpdate(queryToDisconnect, setNulls as never);\n\n const record = data[0];\n\n if (params.create) {\n const obj: RecordUnknown = { ...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: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = record[primaryKeys[i]];\n }\n\n await _queryUpdate(\n _queryWhere(t as Query, [params.set as never]) as never,\n obj as never,\n );\n }\n } else if (params.update) {\n await _queryUpdate(currentRelationsQuery, params.update as never);\n } else if (params.delete) {\n const q = _queryDelete(currentRelationsQuery);\n q.q.returnType = 'value'; // do not throw\n await q;\n } else if (params.upsert) {\n const { update, create } = params.upsert;\n currentRelationsQuery.q.select = foreignKeys;\n const updatedIds = (await _queryUpdate(\n _queryRows(currentRelationsQuery),\n update as never,\n )) 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: RecordUnknown[], ids) => {\n if (\n !updatedIds.some((updated) =>\n updated.every((value, i) => value === ids[i]),\n )\n ) {\n const obj: RecordUnknown = { ...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 RelationThunkBase,\n RelationConfigSelf,\n} from './relations';\nimport {\n CreateData,\n Query,\n WhereArg,\n WhereResult,\n isQueryReturnsAll,\n VirtualColumn,\n CreateCtx,\n UpdateCtx,\n UpdateData,\n AddQueryDefaults,\n _queryDefaults,\n _queryUpdateOrThrow,\n _queryUpdate,\n _queryCreateMany,\n _queryDelete,\n PickQueryQ,\n _queryWhere,\n SelectableFromShape,\n defaultSchemaConfig,\n ColumnSchemaConfig,\n EmptyObject,\n getPrimaryKeys,\n MaybeArray,\n objectHasValues,\n OrchidOrmInternalError,\n PickQueryMetaRelations,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n toArray,\n prepareSubQueryForSql,\n} from 'pqb';\nimport {\n addAutoForeignKey,\n getSourceRelation,\n getThroughRelation,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n joinHasRelation,\n joinHasThrough,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n NestedUpdateManyItems,\n RelJoin,\n} from './common/utils';\nimport { RelationThroughOptions } from './common/options';\nimport {\n HasOneOptions,\n HasOneParams,\n HasOnePopulate,\n HasOneQueryThrough,\n} from './hasOne';\nimport { ORMTableInput } from '../baseTable';\nimport { joinQueryChainHOF } from './common/joinQueryChain';\n\nexport interface HasMany extends RelationThunkBase {\n type: 'hasMany';\n options: HasOneOptions;\n}\n\nexport type HasManyQuery<\n T extends RelationConfigSelf,\n Name extends string,\n TableQuery extends Query,\n> = T['relations'][Name]['options'] extends RelationThroughOptions\n ? HasOneQueryThrough<T, Name, TableQuery>\n : {\n [K in keyof TableQuery]: K extends 'meta'\n ? Omit<TableQuery['meta'], 'selectable'> & {\n as: Name;\n defaults: HasOnePopulate<T, Name>;\n hasWhere: true;\n selectable: SelectableFromShape<TableQuery['shape'], Name>;\n }\n : K extends 'join'\n ? RelJoin\n : TableQuery[K];\n };\n\nexport interface HasManyInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends HasMany,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: false;\n query: Q;\n params: HasOneParams<T, Rel>;\n maybeSingle: Q;\n omitForeignKeyInCreate: never;\n optionalDataForCreate: {\n [P in Name]?: T['relations'][Name]['options'] extends RelationThroughOptions\n ? EmptyObject\n : {\n // create related records\n create?: CreateData<\n T['relations'][Name]['options'] extends RelationThroughOptions\n ? Q\n : AddQueryDefaults<Q, HasOnePopulate<T, Name>>\n >[];\n // find existing records by `where` conditions and update their foreign keys with the new id\n connect?: WhereArg<Q>[];\n // try finding records by `where` conditions, and create them if not found\n connectOrCreate?: {\n where: WhereArg<Q>;\n create: CreateData<\n T['relations'][Name]['options'] extends RelationThroughOptions\n ? Q\n : AddQueryDefaults<Q, HasOnePopulate<T, Name>>\n >;\n }[];\n };\n };\n dataForCreate: never;\n // `hasMany` relation data available for update. It supports:\n // - `disconnect` nullifies foreign keys of the related records\n // - `delete` deletes related record found by conditions\n // - `update` updates 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 update a single record:\n // - `set` updates foreign keys of related records found by conditions, nullifies previously connected\n // - `add` updates foreign keys of related records found by conditions, doesn't nullify previously connected\n // - `create` creates related records\n dataForUpdateOne: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: {\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n };\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n create?: CreateData<\n T['relations'][Name]['options'] extends RelationThroughOptions\n ? Q\n : AddQueryDefaults<Q, HasOnePopulate<T, Name>>\n >[];\n };\n}\n\ninterface State {\n query: Query;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport type HasManyNestedUpdate = (\n query: Query,\n data: RecordUnknown[],\n relationData: NestedUpdateManyItems,\n) => Promise<void>;\n\nexport type HasManyNestedInsert = (\n query: Query,\n data: [selfData: RecordUnknown, relationData: NestedInsertManyItems][],\n) => Promise<void>;\n\nclass HasManyVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasManyNestedInsert;\n private readonly nestedUpdate: HasManyNestedUpdate;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(q: Query, ctx: CreateCtx, item: RecordUnknown, rowIndex: number) {\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: RecordUnknown) {\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 tableConfig: ORMTableInput,\n table: Query,\n relation: HasMany,\n relationName: string,\n query: Query,\n): RelationData => {\n const relPKeys = getPrimaryKeys(query);\n\n if ('through' in relation.options) {\n const { through, source } = relation.options;\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = (sourceRelation.query as Query).as(\n relationName,\n );\n const sourceQuery = sourceRelation.joinQuery(\n sourceRelationQuery,\n throughRelation.query as never,\n );\n\n const whereExistsCallback = () => sourceQuery;\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return joinHasThrough(\n baseQuery as Query,\n baseQuery as Query,\n joiningQuery as Query,\n throughRelation,\n sourceRelation,\n );\n };\n\n return {\n returns: 'many',\n queryRelated: (params: RecordUnknown) => {\n const throughQuery = table.queryRelated(through, params) as Query;\n\n return query.whereExists(\n throughQuery,\n whereExistsCallback as never,\n ) as never;\n },\n joinQuery: joinQueryChainHOF(\n relPKeys,\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinHasThrough(\n joiningQuery as Query,\n baseQuery as Query,\n joiningQuery as Query,\n throughRelation,\n sourceRelation,\n ),\n ),\n reverseJoin,\n };\n }\n\n const primaryKeys = relation.options.columns as string[];\n const foreignKeys = relation.options.references as string[];\n const { on } = relation.options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query, on);\n }\n\n addAutoForeignKey(\n tableConfig,\n query,\n table,\n primaryKeys,\n foreignKeys,\n relation.options,\n );\n\n const state: State = { query, primaryKeys, foreignKeys, on };\n const len = primaryKeys.length;\n\n const reversedOn: RecordString = {};\n for (let i = 0; i < len; i++) {\n reversedOn[foreignKeys[i]] = primaryKeys[i];\n }\n\n const fromQuerySelect = [{ selectAs: reversedOn }];\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n return joinHasRelation(\n joiningQuery as Query,\n baseQuery as Query,\n foreignKeys,\n primaryKeys,\n len,\n );\n };\n\n return {\n returns: 'many',\n queryRelated: (params: RecordUnknown) => {\n const values: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n values[foreignKeys[i]] = params[primaryKeys[i]];\n }\n\n return _queryDefaults(query.where(values as never), { ...on, ...values });\n },\n virtualColumn: new HasManyVirtualColumn(\n defaultSchemaConfig,\n relationName,\n state,\n ),\n joinQuery: joinQueryChainHOF(\n relPKeys,\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinHasRelation(\n baseQuery as Query,\n joiningQuery as Query,\n primaryKeys,\n foreignKeys,\n len,\n ),\n ),\n reverseJoin,\n modifyRelatedQuery(relationQuery) {\n return (query) => {\n const baseQuery = (query as Query).clone();\n baseQuery.q.select = fromQuerySelect;\n const q = (relationQuery as unknown as PickQueryQ).q;\n q.insertFrom = prepareSubQueryForSql(q as never, baseQuery);\n q.values = [];\n };\n },\n };\n};\n\nconst getWhereForNestedUpdate = (\n t: Query,\n data: RecordUnknown[],\n params: MaybeArray<WhereArg<PickQueryMetaRelations>> | 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 RecordUnknown,\n { connect: NestedInsertManyConnect },\n ];\n\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n items[i] = _queryUpdateOrThrow(\n t.where<Query>({ OR: connect as never[] }),\n obj as never,\n );\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 RecordUnknown,\n { connectOrCreate: NestedInsertManyConnectOrCreate },\n ];\n\n for (const item of connectOrCreate) {\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n queries.push(\n _queryUpdate(\n t.where(item.where as WhereArg<Query>) as never,\n obj as never,\n ),\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: RecordUnknown[] = [];\n\n for (const [selfData, { create, connectOrCreate }] of items as [\n RecordUnknown,\n NestedInsertManyItems,\n ][]) {\n const obj: RecordUnknown = {};\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 _queryCreateMany(t, 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: RecordUnknown = {};\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\n if (params.add) {\n if (data.length > 1) {\n throw new OrchidOrmInternalError(\n query,\n '`connect` is not available when updating multiple records, it is only applicable for a single record update',\n );\n }\n\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = data[0][primaryKeys[i]];\n }\n\n const relatedWheres = toArray(params.add);\n\n const count = await _queryUpdate(\n t.where({ OR: relatedWheres }) as Query,\n obj as never,\n );\n\n if (count < relatedWheres.length) {\n throw new OrchidOrmInternalError(\n query,\n `Expected to find at least ${relatedWheres.length} record(s) based on \\`add\\` conditions, but found ${count}`,\n );\n }\n }\n\n if (params.disconnect || params.set) {\n const obj: RecordUnknown = {};\n for (const foreignKey of foreignKeys) {\n obj[foreignKey] = null;\n }\n\n const setConditions =\n params.set &&\n (Array.isArray(params.set)\n ? params.set.length\n : objectHasValues(params.set)) &&\n (Array.isArray(params.set)\n ? {\n OR: params.set,\n }\n : params.set);\n\n let queryToDisconnect = getWhereForNestedUpdate(\n t,\n data,\n params.disconnect,\n primaryKeys,\n foreignKeys,\n );\n\n // do not nullify those records that are going to be set, because the column may non-nullable.\n if (setConditions) {\n queryToDisconnect = queryToDisconnect.whereNot(setConditions) as never;\n }\n\n await _queryUpdate(queryToDisconnect, obj as never);\n\n if (setConditions) {\n const obj: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = data[0][primaryKeys[i]];\n }\n\n await _queryUpdate(\n t.where<Query>(setConditions as never),\n obj as never,\n );\n }\n }\n\n if (params.delete || params.update) {\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 _queryDelete(q);\n } else if (params.update) {\n await _queryUpdate(q, params.update.data as never);\n }\n }\n }) as HasManyNestedUpdate;\n};\n","import {\n RelationConfigSelf,\n RelationData,\n RelationThunkBase,\n} from './relations';\nimport { ORMTableInput, TableClass } from '../baseTable';\nimport {\n _queryCreateManyFrom,\n _queryCreateMany,\n _queryDefaults,\n _queryDelete,\n _queryFindBy,\n _queryFindByOptional,\n _queryHookAfterCreate,\n _queryJoinOn,\n _queryRows,\n _querySelect,\n _queryUpdate,\n _queryWhere,\n _queryWhereExists,\n CreateCtx,\n CreateData,\n getQueryAs,\n JoinedShapes,\n Query,\n SelectableFromShape,\n TableData,\n UpdateData,\n UpdateCtx,\n VirtualColumn,\n WhereArg,\n ColumnSchemaConfig,\n ColumnsShape,\n getPrimaryKeys,\n MaybeArray,\n NotFoundError,\n objectHasValues,\n OrchidOrmInternalError,\n pick,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n toArray,\n toSnakeCase,\n defaultSchemaConfig,\n Column,\n} from 'pqb';\nimport {\n addAutoForeignKey,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n RelJoin,\n} from './common/utils';\nimport { HasManyNestedInsert, HasManyNestedUpdate } from './hasMany';\nimport { joinQueryChainHOF } from './common/joinQueryChain';\n\nexport interface HasAndBelongsToMany extends RelationThunkBase {\n type: 'hasAndBelongsToMany';\n options: HasAndBelongsToManyOptions;\n}\n\nexport interface HasAndBelongsToManyOptions<\n Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit,\n Related extends TableClass = TableClass,\n> {\n required?: boolean;\n columns: (keyof Columns)[];\n references: string[];\n foreignKey?: boolean | TableData.References.Options;\n through: {\n table: string;\n columns: string[];\n references: (keyof InstanceType<Related>['columns']['shape'])[];\n foreignKey?: boolean | TableData.References.Options;\n };\n on?: ColumnsShape.InputPartial<InstanceType<Related>['columns']['shape']>;\n}\n\nexport type HasAndBelongsToManyParams<\n T extends RelationConfigSelf,\n Relation extends HasAndBelongsToMany,\n> = {\n [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];\n};\n\nexport type HasAndBelongsToManyQuery<\n Name extends string,\n TableQuery extends Query,\n> = {\n [K in keyof TableQuery]: K extends 'meta'\n ? Omit<TableQuery['meta'], 'selectable'> & {\n as: Name;\n hasWhere: true;\n selectable: SelectableFromShape<TableQuery['shape'], Name>;\n }\n : K extends 'join'\n ? RelJoin\n : TableQuery[K];\n};\n\nexport interface HasAndBelongsToManyInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends HasAndBelongsToMany,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: false;\n query: Q;\n params: HasAndBelongsToManyParams<T, Rel>;\n maybeSingle: Q;\n omitForeignKeyInCreate: never;\n optionalDataForCreate: {\n [P in Name]?: {\n // create related records\n create?: CreateData<Q>[];\n // find existing records by `where` conditions and update their foreign keys with the new id\n connect?: WhereArg<Q>[];\n // try finding records by `where` conditions, and create them if not found\n connectOrCreate?: {\n where: WhereArg<Q>;\n create: CreateData<Q>;\n }[];\n };\n };\n dataForCreate: never;\n // `hasAndBelongsToMany` relation data available for update. It supports:\n // - `disconnect` deletes join table records for related records found by conditions\n // - `set` creates join table records for related records found by conditions, deletes previous connects\n // - `add` creates join table records for related records found by conditions, does not delete previous connects\n // - `delete` deletes join table records and related records found by conditions\n // - `update` updates related records found by conditions with a provided data\n // - `create` creates related records and a join table records\n dataForUpdate: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: 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: {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: 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}\n\ninterface 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 primaryKeysShape: Column.Shape.Data;\n on?: RecordUnknown;\n}\n\nclass HasAndBelongsToManyVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasManyNestedInsert;\n private readonly nestedUpdate: HasManyNestedUpdate;\n\n constructor(\n // is used to generate a migration for join table\n public joinTable: Query,\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n this.nestedUpdate = nestedUpdate(state);\n }\n\n create(q: Query, ctx: CreateCtx, item: RecordUnknown, rowIndex: number) {\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: RecordUnknown) {\n hasRelationHandleUpdate(\n q,\n set,\n this.key,\n this.state.primaryKeys,\n this.nestedUpdate,\n );\n }\n}\n\nconst removeColumnName = (column: Column.Pick.Data) => {\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 tableConfig: ORMTableInput,\n table: Query,\n qb: Query,\n relation: HasAndBelongsToMany,\n relationName: string,\n query: Query,\n): RelationData => {\n const { options } = relation;\n const { snakeCase } = table.internal;\n const primaryKeys = options.columns as string[];\n const foreignKeys = options.references;\n const originalForeignKeys = snakeCase ? [...foreignKeys] : foreignKeys;\n const joinTable = options.through.table;\n const throughForeignKeys = options.through.columns;\n const originalThroughForeignKeys = snakeCase\n ? [...throughForeignKeys]\n : throughForeignKeys;\n const throughPrimaryKeys = options.through.references as string[];\n const { on } = options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query, on);\n }\n\n const foreignKeysFull = foreignKeys.map((key, i) => {\n if (snakeCase) key = foreignKeys[i] = toSnakeCase(key);\n\n return `${joinTable}.${key}`;\n });\n\n const throughForeignKeysFull = throughForeignKeys.map((key, i) => {\n if (snakeCase) key = throughForeignKeys[i] = toSnakeCase(key);\n\n return `${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: Column.Shape.Data = {};\n const primaryKeysShape: Column.Shape.Data = {};\n\n for (let i = 0; i < len; i++) {\n const pk = primaryKeys[i];\n\n shape[foreignKeys[i]] = removeColumnName(\n table.shape[pk] as unknown as Column.Pick.Data,\n );\n\n primaryKeysShape[pk] = table.shape[pk] as unknown as Column.Pick.Data;\n }\n\n for (let i = 0; i < throughLen; i++) {\n shape[throughForeignKeys[i]] = removeColumnName(\n query.shape[throughPrimaryKeys[i]] as unknown as Column.Pick.Data,\n );\n }\n\n baseQuery.shape = shape;\n baseQuery.q = {\n ...baseQuery.q,\n shape: baseQuery.shape,\n };\n const subQuery = Object.create(baseQuery) as Query;\n\n addAutoForeignKey(\n tableConfig,\n subQuery,\n table,\n primaryKeys,\n foreignKeys,\n relation.options,\n originalForeignKeys,\n );\n\n addAutoForeignKey(\n tableConfig,\n subQuery,\n query,\n throughPrimaryKeys,\n throughForeignKeys,\n relation.options.through,\n originalThroughForeignKeys,\n );\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 primaryKeysShape,\n on,\n };\n\n const joinQuery = (\n joiningQuery: Query,\n tableAs: string,\n foreignAs: string,\n joinedShapes: JoinedShapes,\n ) => {\n const cloned = joiningQuery.clone();\n cloned.q.joinedShapes = joinedShapes;\n return _queryWhereExists(cloned, subQuery, [\n (q) => {\n for (let i = 0; i < throughLen; i++) {\n _queryJoinOn(q, [\n throughForeignKeysFull[i],\n `${foreignAs}.${throughPrimaryKeys[i]}`,\n ]);\n }\n\n for (let i = 0; i < len; i++) {\n _queryJoinOn(q, [foreignKeysFull[i], `${tableAs}.${primaryKeys[i]}`]);\n }\n\n return q;\n },\n ]);\n };\n\n const obj: RecordString = {};\n for (let i = 0; i < len; i++) {\n obj[foreignKeys[i]] = primaryKeys[i];\n }\n const selectPrimaryKeysAsForeignKeys = [{ selectAs: obj }];\n\n const reverseJoin: RelationJoinQuery = (baseQuery, joiningQuery) => {\n const foreignAs = getQueryAs(joiningQuery as Query);\n return joinQuery(\n baseQuery as Query,\n getQueryAs(baseQuery as Query),\n foreignAs,\n {\n ...(baseQuery as Query).q.joinedShapes,\n [foreignAs]: (joiningQuery as Query).q.shape,\n },\n );\n };\n\n return {\n returns: 'many',\n queryRelated(params: RecordUnknown) {\n const q = query.whereExists(subQuery, (q) => {\n q = q.clone();\n\n const where: RecordUnknown = {};\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 _queryJoinOn(q, [\n throughForeignKeysFull[i],\n throughPrimaryKeysFull[i],\n ]);\n }\n\n return _queryWhere(q, [where as never]);\n });\n\n return on ? _queryDefaults(q, on) : q;\n },\n virtualColumn: new HasAndBelongsToManyVirtualColumn(\n subQuery,\n defaultSchemaConfig,\n relationName,\n state,\n ),\n joinQuery: joinQueryChainHOF(\n getPrimaryKeys(query),\n reverseJoin,\n (joiningQuery, baseQuery) =>\n joinQuery(\n joiningQuery as Query,\n getQueryAs(baseQuery as Query),\n getQueryAs(joiningQuery as Query),\n {\n ...(joiningQuery as Query).q.joinedShapes,\n [((baseQuery as Query).q.as ||\n (baseQuery as Query).table) as string]: (baseQuery as Query).q\n .shape,\n },\n ),\n ),\n reverseJoin,\n modifyRelatedQuery(relationQuery) {\n const ref = {} as { q: Query };\n\n _queryHookAfterCreate(\n relationQuery as Query,\n [],\n async (result: unknown[]) => {\n const baseQuery = ref.q.clone();\n baseQuery.q.select = selectPrimaryKeysAsForeignKeys;\n\n const data = result.map((resultRow) => {\n const dataRow: RecordUnknown = {};\n for (let i = 0; i < throughLen; i++) {\n dataRow[throughForeignKeys[i]] = (resultRow as RecordUnknown)[\n throughPrimaryKeys[i]\n ];\n }\n return dataRow;\n });\n\n const createdCount = await _queryCreateManyFrom(\n subQuery.count(),\n baseQuery as Query & { returnType: 'one' | 'oneOrThrow' },\n data as never,\n );\n\n if ((createdCount as unknown as number) === 0) {\n throw new NotFoundError(baseQuery);\n }\n },\n );\n\n return (q) => {\n ref.q = q as Query;\n };\n },\n };\n};\n\nconst queryJoinTable = (\n state: State,\n data: RecordUnknown[],\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 _queryWhere(t, [\n {\n IN: {\n columns: state.throughForeignKeys,\n values: _querySelect(\n state.relatedTableQuery.where(conditionsToWhereArg(conditions)),\n state.throughPrimaryKeys,\n ),\n },\n },\n ]);\n }\n\n if (state.on) {\n _queryWhereExists(t, state.relatedTableQuery, [\n (q) => {\n for (let i = 0; i < state.throughPrimaryKeys.length; i++) {\n _queryJoinOn(q, [\n state.throughPrimaryKeysFull[i],\n state.throughForeignKeysFull[i],\n ]);\n }\n return q;\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: RecordUnknown[],\n idsRows: unknown[][],\n) => {\n const len = state.primaryKeys.length;\n const throughLen = state.throughPrimaryKeys.length;\n\n const records: RecordUnknown[] = [];\n for (const item of data) {\n const obj: RecordUnknown = {};\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: RecordUnknown[];\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 _queryFindBy(\n t.select(...throughPrimaryKeys),\n item as never,\n ) as Query,\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: (RecordUnknown | 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 _queryFindByOptional(\n t.select(...throughPrimaryKeys),\n item.where as never,\n ) as Query,\n );\n }\n }\n\n connectOrCreated = (await Promise.all(queries)) as RecordUnknown[];\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: RecordUnknown[];\n if (items.length) {\n const records: RecordUnknown[] = [];\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 _queryCreateMany(\n t.select(...throughPrimaryKeys),\n records,\n )) as never;\n } else {\n created = [];\n }\n\n const allKeys = data as unknown as [\n selfData: RecordUnknown,\n relationKeys: RecordUnknown[],\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: RecordUnknown[] = [];\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: RecordUnknown[] = [];\n for (const [selfData, relationKeys] of allKeys) {\n const obj: RecordUnknown = {};\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 (query, data, params) => {\n if (params.create) {\n const idsRows: unknown[][] = await _queryCreateMany(\n _queryRows(state.relatedTableQuery.select(...state.throughPrimaryKeys)),\n params.create,\n );\n\n const records: RecordUnknown[] = [];\n for (const item of data) {\n const obj: RecordUnknown = {};\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 _queryUpdate(\n _queryWhere(\n state.relatedTableQuery.whereExists(state.joinTableQuery, (q) => {\n for (let i = 0; i < throughLen; i++) {\n _queryJoinOn(q, [\n state.throughForeignKeysFull[i],\n state.throughPrimaryKeysFull[i],\n ]);\n }\n\n return _queryWhere(q, [\n {\n IN: {\n columns: state.foreignKeysFull,\n values: data.map((item) =>\n state.primaryKeys.map((key) => item[key]),\n ),\n },\n },\n ]);\n }),\n [conditionsToWhereArg(params.update.where as WhereArg<Query>)],\n ),\n params.update.data as UpdateData<Query>,\n );\n }\n\n /**\n * Performs `insertForEachFrom` on the joining table,\n * based on a query to the related table with applied filters of `params.connect`,\n * joins the main table data using `joinData`.\n */\n if (params.add) {\n const as = query.table as string;\n const relatedWheres = toArray(params.add);\n const joinTableColumns = [\n ...state.foreignKeys,\n ...state.throughForeignKeys,\n ];\n\n try {\n const count = await state.joinTableQuery\n .insertForEachFrom(\n _querySelect(\n state.relatedTableQuery.whereOneOf(...relatedWheres) as Query,\n [\n Object.fromEntries([\n ...state.primaryKeys.map((key, i) => [\n state.foreignKeys[i],\n as + '.' + (state.primaryKeysShape[key].data.name || key),\n ]),\n ...state.throughForeignKeys.map((key, i) => [\n key,\n state.throughPrimaryKeys[i],\n ]),\n ]),\n ],\n ).joinData(\n as,\n () =>\n Object.fromEntries(\n state.primaryKeys.map((key) => [\n key,\n state.primaryKeysShape[key],\n ]),\n ) as never,\n data.map((x) => pick(x, state.primaryKeys)) as never,\n ),\n )\n // do update on conflict to increase the resulting counter\n .onConflict(joinTableColumns)\n .merge([state.foreignKeys[0]]);\n\n if (count < data.length * relatedWheres.length) {\n throw new OrchidOrmInternalError(\n query,\n `Expected to find at least ${\n relatedWheres.length\n } record(s) based on \\`add\\` conditions, but found ${\n count / data.length\n }`,\n );\n }\n } catch (err) {\n if ((err as RecordUnknown).code === '42P10') {\n throw new OrchidOrmInternalError(\n query,\n `\"${\n state.joinTableQuery.table\n }\" must have a primary key or a unique index on columns (${joinTableColumns.join(\n ', ',\n )}) for this kind of query.`,\n );\n }\n throw err;\n }\n }\n\n if (params.disconnect) {\n await _queryDelete(\n queryJoinTable(state, data, params.disconnect as WhereArg<Query>),\n );\n }\n\n if (params.delete) {\n const j = queryJoinTable(state, data, params.delete as WhereArg<Query>);\n\n const idsRows = await _queryDelete(\n _queryRows(_querySelect(j, state.throughForeignKeys)),\n );\n\n await _queryDelete(\n state.relatedTableQuery.where({\n IN: {\n columns: state.throughPrimaryKeys,\n values: idsRows,\n },\n }),\n );\n }\n\n if (params.set) {\n const j = queryJoinTable(state, data);\n await _queryDelete(j);\n\n if (\n Array.isArray(params.set)\n ? params.set.length\n : objectHasValues(params.set)\n ) {\n const idsRows = await _queryRows(\n _querySelect(\n state.relatedTableQuery.where(\n conditionsToWhereArg(params.set as WhereArg<Query>),\n ),\n state.throughPrimaryKeys,\n ),\n );\n\n await insertToJoinTable(state, j, data, idsRows);\n }\n }\n }) as HasManyNestedUpdate;\n};\n","import { BelongsTo, BelongsToParams, makeBelongsToMethod } from './belongsTo';\nimport { HasOne, HasOneParams, makeHasOneMethod } from './hasOne';\nimport {\n ORMTableInputToQueryBuilder,\n ORMTableInput,\n TableClass,\n TableInfo,\n} from '../baseTable';\nimport { OrchidORM } from '../orm';\nimport {\n _queryTake,\n _queryTakeOptional,\n CreateData,\n Query,\n VirtualColumn,\n WhereArg,\n ColumnSchemaConfig,\n IsQuery,\n RecordUnknown,\n RelationJoinQuery,\n RelationsBase,\n Column,\n} from 'pqb';\nimport { HasMany, makeHasManyMethod } from './hasMany';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyParams,\n makeHasAndBelongsToManyMethod,\n} from './hasAndBelongsToMany';\nimport { getSourceRelation, getThroughRelation } from './common/utils';\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: unknown; table: Query },\n> =\n | {\n create: 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: Rel['nestedCreateQuery'];\n };\n };\n\nexport type RelationToOneDataForCreateSameQuery<Q extends Query> =\n | {\n create: CreateData<Q>;\n connect?: never;\n connectOrCreate?: never;\n }\n | {\n create?: never;\n connect: WhereArg<Q>;\n connectOrCreate?: never;\n }\n | {\n create?: never;\n connect?: never;\n connectOrCreate: {\n where: WhereArg<Q>;\n create: CreateData<Q>;\n };\n };\n\nexport interface RelationThunkBase {\n type: string;\n fn(): TableClass;\n options: unknown;\n}\n\nexport type RelationThunk = BelongsTo | HasOne | HasMany | HasAndBelongsToMany;\n\nexport interface RelationThunks {\n [K: string]: RelationThunk;\n}\n\nexport interface RelationData {\n returns: 'one' | 'many';\n queryRelated(params: RecordUnknown): Query;\n virtualColumn?: VirtualColumn<ColumnSchemaConfig>;\n joinQuery: RelationJoinQuery;\n reverseJoin: RelationJoinQuery;\n modifyRelatedQuery?(relatedQuery: IsQuery): (query: IsQuery) => void;\n}\n\nexport type RelationTableToQuery<Relation extends RelationThunkBase> =\n ORMTableInputToQueryBuilder<InstanceType<ReturnType<Relation['fn']>>>;\n\nexport interface RelationConfigSelf {\n columns: { shape: Column.Shape.QueryInit };\n relations: RelationThunks;\n}\n\nexport type RelationConfigParams<\n T extends RelationConfigSelf,\n Relation extends RelationThunk,\n> = Relation extends BelongsTo\n ? BelongsToParams<T, Relation>\n : Relation extends HasOne | HasMany\n ? HasOneParams<T, Relation>\n : Relation extends HasAndBelongsToMany\n ? HasAndBelongsToManyParams<T, Relation>\n : never;\n\ninterface ApplyRelationData {\n relationName: string;\n relation: RelationThunk;\n dbTable: Query;\n otherDbTable: Query;\n}\n\ntype DelayedRelations = Map<Query, Record<string, ApplyRelationData[]>>;\n\nexport const applyRelations = (\n qb: Query,\n tables: Record<string, ORMTableInput>,\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 ORMTableInput & {\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 as unknown as { table: Query }).table,\n options.source,\n data,\n );\n continue;\n }\n }\n\n applyRelation(table, 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 as unknown as TableInfo).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)[\n through\n ] as unknown as { table: Query } | undefined;\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 unknown as TableInfo).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 table: ORMTableInput,\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 = baseQuery.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(table, dbTable, relation, relationName, query);\n } else if (type === 'hasOne') {\n data = makeHasOneMethod(table, dbTable, relation, relationName, query);\n } else if (type === 'hasMany') {\n data = makeHasManyMethod(table, dbTable, relation, relationName, query);\n } else if (type === 'hasAndBelongsToMany') {\n data = makeHasAndBelongsToManyMethod(\n table,\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 _queryTake(query);\n } else {\n _queryTakeOptional(query);\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 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 (dbTable.relations as RecordUnknown)[relationName] = {\n table: otherDbTable,\n query,\n queryRelated: data.queryRelated,\n joinQuery: data.joinQuery,\n reverseJoin: data.reverseJoin,\n modifyRelatedQuery: data.modifyRelatedQuery,\n };\n\n (dbTable.relationQueries ??= {})[relationName] = query;\n\n const tableRelations = delayedRelations.get(dbTable);\n if (!tableRelations) return;\n\n tableRelations[relationName]?.forEach((data) => {\n applyRelation(table, qb, data, delayedRelations);\n });\n};\n","import {\n Db,\n IsolationLevel,\n TransactionOptions,\n AfterCommitStandaloneHook,\n} from 'pqb';\n\nexport function transaction<Result>(\n this: { $qb: Db },\n fn: () => Promise<Result>,\n): Promise<Result>;\nexport function transaction<Result>(\n this: { $qb: Db },\n options: IsolationLevel | TransactionOptions,\n fn: () => Promise<Result>,\n): Promise<Result>;\nexport function transaction<Result>(\n this: { $qb: Db },\n fnOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n fn?: () => Promise<Result>,\n): Promise<Result> {\n return this.$qb.transaction(\n fnOrOptions as IsolationLevel,\n fn as () => Promise<Result>,\n );\n}\n\nexport function ensureTransaction<Result>(\n this: { $qb: Db },\n cb: () => Promise<Result>,\n): Promise<Result> {\n return this.$qb.ensureTransaction(cb);\n}\n\nexport function isInTransaction(this: { $qb: Db }): boolean {\n return this.$qb.isInTransaction();\n}\n\nexport function afterCommit(\n this: { $qb: Db },\n hook: AfterCommitStandaloneHook,\n): void {\n this.$qb.afterCommit(hook);\n}\n","import {\n makeColumnTypes,\n Db,\n DbTableOptions,\n DbTableOptionScopes,\n FromArg,\n FromResult,\n NoPrimaryKeyOption,\n Query,\n QueryData,\n defaultSchemaConfig,\n DbSharedOptions,\n _initQueryBuilder,\n AdapterBase,\n ColumnSchemaConfig,\n MaybeArray,\n QueryLogOptions,\n RecordUnknown,\n TransactionState,\n Column,\n} from 'pqb';\nimport {\n ORMTableInputToQueryBuilder,\n ORMTableInput,\n TableClasses,\n BaseTableClass,\n} from './baseTable';\nimport { applyRelations } from './relations/relations';\nimport {\n transaction,\n ensureTransaction,\n isInTransaction,\n afterCommit,\n} from './transaction';\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\ninterface FromQuery extends Query {\n returnType: 'all';\n}\n\nexport type OrchidORM<T extends TableClasses = TableClasses> = {\n [K in keyof T]: ORMTableInputToQueryBuilder<InstanceType<T[K]>>;\n} & {\n /**\n * @see import('pqb').Transaction.prototype.transaction\n */\n $transaction: typeof transaction;\n /**\n * @see import('pqb').Transaction.prototype.ensureTransaction\n */\n $ensureTransaction: typeof ensureTransaction;\n /**\n * @see import('pqb').Transaction.prototype.isInTransaction\n */\n $isInTransaction: typeof isInTransaction;\n /**\n * @see import('pqb').Transaction.prototype.afterCommit\n */\n $afterCommit: typeof afterCommit;\n $adapter: AdapterBase;\n $qb: Db;\n\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} 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 /**\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\n /**\n * See {@link FromMethods.from}\n */\n $from<Arg extends MaybeArray<FromArg<Query>>>(\n arg: Arg,\n ): FromResult<FromQuery, Arg>;\n\n $close(): Promise<void>;\n};\n\nexport type OrchidOrmParam<Options> = true | null extends true\n ? 'Set strict: true to tsconfig'\n : Options;\n\nexport const orchidORMWithAdapter = <T extends TableClasses>(\n {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey = 'error',\n ...options\n }: OrchidOrmParam<\n ({ db: Query } | { adapter: AdapterBase }) & DbSharedOptions\n >,\n tables: T,\n): OrchidORM<T> => {\n const commonOptions: QueryLogOptions & {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n } = {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey,\n };\n\n let adapter: AdapterBase;\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.qb as Db;\n } else {\n adapter = options.adapter;\n\n transactionStorage = new AsyncLocalStorage<TransactionState>();\n\n qb = _initQueryBuilder(\n adapter,\n makeColumnTypes(defaultSchemaConfig),\n transactionStorage,\n commonOptions,\n options,\n );\n }\n\n const result = {\n $transaction: transaction,\n $ensureTransaction: ensureTransaction,\n $isInTransaction: isInTransaction,\n $afterCommit: afterCommit,\n $adapter: adapter,\n $qb: qb,\n get $query() {\n return qb.query;\n },\n $queryArrays: ((...args) =>\n qb.queryArrays(...args)) as typeof qb.queryArrays,\n $with: qb.with.bind(qb),\n $withRecursive: qb.withRecursive.bind(qb),\n $withSql: qb.withSql.bind(qb),\n $from: qb.from.bind(qb),\n $close: adapter.close.bind(adapter),\n } as unknown as OrchidORM;\n\n const tableInstances: Record<string, ORMTableInput> = {};\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 tableClass = tables[key];\n const table = tableClass.instance();\n tableInstances[key] = table;\n\n const options: DbTableOptions<unknown, string, Column.Shape.QueryInit> = {\n ...commonOptions,\n schema: table.schema,\n language: table.language,\n scopes: table.scopes as DbTableOptionScopes<\n string,\n Column.Shape.QueryInit\n >,\n softDelete: table.softDelete,\n snakeCase: (table as { snakeCase?: boolean }).snakeCase,\n comment: table.comment,\n noPrimaryKey: table.noPrimaryKey ? 'ignore' : undefined,\n computed: table.computed as never,\n nowSQL: (\n tableClass as unknown as BaseTableClass<ColumnSchemaConfig, unknown>\n ).nowSQL,\n };\n\n const dbTable = new Db(\n adapter,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n qb as any,\n table.table,\n table.columns.shape,\n table.types,\n transactionStorage,\n options,\n table.constructor.prototype.columns?.data ?? {},\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 (result as RecordUnknown)[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 const db = result as unknown as OrchidORM<T>;\n db.$adapter;\n\n return result as unknown as OrchidORM<T>;\n};\n","import {\n getClonedQueryData,\n MergeQuery,\n Query,\n WhereResult,\n QueryReturnType,\n RecordUnknown,\n} from 'pqb';\n\ntype 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> = {\n [K in keyof T]: K extends 'returnType'\n ? Exclude<QueryReturnType, 'all' | undefined>\n : T[K];\n};\n\nexport interface 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?: RecordUnknown;\n}\n\nexport type MapQueryMethods<BaseQuery extends Query, Method> = Method 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\ninfer Result\n ? <T extends BaseQuery>(\n this: T,\n ...args: Args\n ) => Result extends Query ? MergeQuery<T, Result> : Result\n : never;\n\nexport type MapMethods<T extends Query, Methods extends MethodsBase<T>> = {\n [K in\n | keyof Methods['queryMethods']\n | keyof Methods['queryOneMethods']\n | keyof Methods['queryWithWhereMethods']\n | keyof Methods['queryOneWithWhereMethods']\n | keyof Methods['methods']]: K extends keyof Methods['methods']\n ? Methods['methods'][K]\n : K extends keyof Methods['queryOneWithWhereMethods']\n ? MapQueryMethods<\n QueryOne<WhereResult<Query>>,\n Methods['queryOneWithWhereMethods'][K]\n >\n : K extends keyof Methods['queryWithWhereMethods']\n ? MapQueryMethods<WhereResult<Query>, Methods['queryWithWhereMethods'][K]>\n : K extends keyof Methods['queryOneMethods']\n ? MapQueryMethods<QueryOne<Query>, Methods['queryOneMethods'][K]>\n : K extends keyof Methods['queryMethods']\n ? MapQueryMethods<Query, Methods['queryMethods'][K]>\n : never;\n};\n\nexport type Repo<T extends Query, Methods extends MethodsBase<T>> = T &\n MapMethods<T, Methods>;\n\nexport const createRepo = <T extends Query, Methods extends MethodsBase<T>>(\n table: T,\n methods: Methods,\n): Repo<\n (<Q extends { table: T['table']; shape: T['shape'] }>(\n q: Q,\n ) => Query & Q & MapMethods<T, Methods>) &\n T,\n Methods\n> => {\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 RecordUnknown)[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 never;\n};\n"],"names":["defaultSchemaConfig","makeColumnTypes","getStackTrace","emptyObject","emptyArray","raw","getCallerFilePath","filePath","snakeCaseKey","getColumnTypes","parseTableData","toSnakeCase","applyMixins","QueryHooks","_queryHookAfterCreate","q","rowIndex","_queryHookAfterUpdate","getQueryAs","setQueryObjectValueImmutable","pushQueryOnForOuter","isExpression","cloneQueryBaseUnscoped","DynamicRawSQL","RawSQL","getShapeFromSelect","VirtualColumn","nestedUpdate","key","_with","_queryCreate","_orCreate","_queryWhere","getFreeAlias","_queryDefaults","primaryKeys","foreignKeys","getPrimaryKeys","isQueryReturnsAll","_queryHookBeforeUpdate","_queryFindBy","len","_queryRows","_queryUpdate","_queryDelete","nestedInsert","reverseJoin","query","prepareSubQueryForSql","data","i","_queryUpdateOrThrow","ids","toArray","_queryCreateMany","OrchidOrmInternalError","objectHasValues","obj","_queryWhereExists","_queryJoinOn","baseQuery","_queryCreateManyFrom","NotFoundError","_querySelect","_queryFindByOptional","records","item","pick","_queryTake","_queryTakeOptional","AsyncLocalStorage","_initQueryBuilder","options","Db","getClonedQueryData"],"mappings":"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"}