orchid-orm 1.77.2 → 1.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +60 -49
- package/dist/index.js +758 -230
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +759 -231
- package/dist/index.mjs.map +1 -1
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["selectCteColumnsSql","selectCteColumnSql","nestedUpdate","selectCteColumnsSql","nestedUpdate","nestedInsert","nestedInsert","nestedUpdate","nestedInsert","nestedInsert","nestedUpdate"],"sources":["../src/orm-table/legacy-table.ts","../src/orm-table/table.ts","../src/relations/common/utils.ts","../src/relations/common/joinQueryChain.ts","../src/relations/belongs-to/belongs-to.create.ts","../src/relations/belongs-to/belongs-to.update.ts","../src/relations/belongs-to/belongs-to.ts","../src/relations/has-one/has-one.create.ts","../src/relations/has-one/has-one.through.ts","../src/relations/has-one/has-one.update.ts","../src/relations/has-one/has-one.ts","../src/relations/has-many/has-many.update.ts","../src/relations/has-many/has-many.through.ts","../src/relations/has-many/has-many.create.ts","../src/relations/has-many/has-many.ts","../src/relations/has-and-belongs-to-many/has-and-belongs-to-many.create.ts","../src/relations/has-and-belongs-to-many/has-and-belongs-to-many.update.ts","../src/relations/has-and-belongs-to-many/has-and-belongs-to-many.ts","../src/relations/relations.ts","../src/transaction.ts","../src/orm.ts","../src/repo.ts"],"sourcesContent":["import {\n Column,\n AfterHook,\n ComputedOptionsConfig,\n ComputedOptionsFactory,\n _createDbSqlMethod,\n DbSqlMethod,\n DbTableOptionScopes,\n DefaultColumnTypes,\n defaultSchemaConfig,\n DefaultSchemaConfig,\n getColumnTypes,\n makeColumnTypes,\n parseTableData,\n QueryAfterHook,\n QueryBeforeActionHook,\n QueryBeforeHook,\n QueryData,\n QueryHooks,\n QueryScopes,\n TableData,\n TableDataFn,\n TableDataItem,\n applyMixins,\n ColumnSchemaConfig,\n emptyArray,\n EmptyObject,\n emptyObject,\n getCallerFilePath,\n getStackTrace,\n IsQuery,\n MaybeArray,\n RecordUnknown,\n toSnakeCase,\n ColumnsShape,\n QuerySchema,\n Rls,\n Grant,\n type RawSqlBase,\n type BrandColumnsShape,\n} from 'pqb/internal';\nimport {\n RelationConfigSelf,\n RelationToTableInput,\n RelationTableToQuery,\n} from '../relations/relations';\nimport { OrchidORM, OrmTableThunks } from '../orm';\nimport {\n BelongsTo,\n BelongsToDataForCreate,\n BelongsToDefaultRequired,\n BelongsToInfo,\n BelongsToOptions,\n BelongsToQuery,\n} from '../relations/belongs-to/belongs-to';\nimport {\n HasOne,\n HasOneInfo,\n HasOneOptions,\n HasOneQuery,\n} from '../relations/has-one/has-one';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyInfo,\n HasAndBelongsToManyOptions,\n HasAndBelongsToManyQuery,\n} from '../relations/has-and-belongs-to-many/has-and-belongs-to-many';\nimport {\n HasMany,\n HasManyInfo,\n HasManyQuery,\n} from '../relations/has-many/has-many';\nimport { Db, Query } from 'pqb';\nimport { TableFactoryOptions } from './table.common';\n\n// type of table class itself\nexport interface TableClass<T extends ORMTableInput = ORMTableInput> {\n new (): T;\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\ntype BelongsToRequired<\n T extends RelationConfigSelf,\n Rel extends BelongsTo,\n Related,\n> = Rel['options'] extends {\n required: infer Required extends boolean;\n}\n ? Required\n : Rel['options'] extends { on: unknown }\n ? false\n : BelongsToDefaultRequired<T, Rel, Related>;\n\ntype BelongsToRelationInfo<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends BelongsTo,\n> =\n RelationToTableInput<TC, VC, Rel> extends infer Related extends ORMTableInput\n ? BelongsToInfo<\n T,\n Rel['options']['columns'][number] & string,\n BelongsToRequired<T, Rel, Related>,\n BelongsToQuery<TableQueryBuilder<TC, VC, Related>, Name>\n >\n : never;\n\ntype BelongsToCreateData<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends BelongsTo,\n> =\n RelationToTableInput<TC, VC, Rel> extends infer Related extends ORMTableInput\n ? BelongsToDataForCreate<\n Name,\n Rel['options']['columns'][number] & string,\n BelongsToRequired<T, Rel, Related>,\n BelongsToQuery<TableQueryBuilder<TC, VC, Related>, Name>\n >\n : never;\n\ntype RelationDataForCreate<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends keyof T['relations'] & string,\n Rel,\n> = Rel extends HasOne\n ? HasOneInfo<\n T,\n Name,\n Rel,\n HasOneQuery<T, Name, RelationTableToQuery<TC, VC, Rel>>\n >['dataForCreate']\n : Rel extends HasMany\n ? HasManyInfo<\n T,\n Name,\n Rel,\n HasManyQuery<T, Name, RelationTableToQuery<TC, VC, Rel>>\n >['dataForCreate']\n : Rel extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<\n T,\n Name,\n Rel['options']['columns'][number] & string,\n HasAndBelongsToManyQuery<Name, RelationTableToQuery<TC, VC, Rel>>\n >['dataForCreate']\n : never;\n\ntype RelationInfoForName<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends keyof T['relations'] & string,\n Rel,\n> = Rel extends BelongsTo\n ? BelongsToRelationInfo<TC, VC, T, Name, Rel>\n : Rel extends HasOne\n ? HasOneInfo<\n T,\n Name,\n Rel,\n HasOneQuery<T, Name, RelationTableToQuery<TC, VC, Rel>>\n >\n : Rel extends HasMany\n ? HasManyInfo<\n T,\n Name,\n Rel,\n HasManyQuery<T, Name, RelationTableToQuery<TC, VC, Rel>>\n >\n : Rel extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<\n T,\n Name,\n Rel['options']['columns'][number] & string,\n HasAndBelongsToManyQuery<Name, RelationTableToQuery<TC, VC, Rel>>\n >\n : never;\n\ntype RelationDataForCreateOptionalNames<T extends RelationConfigSelf> = {\n [K in keyof T['relations'] & string]: T['relations'][K] extends BelongsTo\n ? never\n : K;\n}[keyof T['relations'] & string];\n\ntype RelationDataForCreateValue<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends keyof T['relations'] & string,\n> = RelationDataForCreate<TC, VC, T, Name, T['relations'][Name]>[Name];\n\ntype BelongsToRelationCreateData<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends keyof T['relations'],\n> = Name extends keyof T['relations'] & string\n ? T['relations'][Name] extends BelongsTo\n ? BelongsToCreateData<TC, VC, T, Name, T['relations'][Name]>\n : never\n : never;\n\ntype BelongsToRelationsDataForCreate<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n> = {\n [K in keyof T['relations'] as T['relations'][K] extends BelongsTo\n ? T['relations'][K]['options']['columns'][number] & string\n : never]: BelongsToRelationCreateData<TC, VC, T, K>;\n};\n\ntype RelationsDataForCreateOptional<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Names extends keyof T['relations'] & string =\n RelationDataForCreateOptionalNames<T>,\n> = [Names] extends [never]\n ? EmptyObject\n : {\n [K in Names]?: RelationDataForCreateValue<TC, VC, T, K>;\n };\n\n// converts table type to a queryable interface\nexport interface TableQueryBuilder<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends ORMTableInput,\n>\n extends\n TableInfo,\n Db<\n T['table'] extends string ? T['table'] : T['name'],\n BrandColumnsShape<\n T['columns']['shape'],\n T['table'] extends string ? T['table'] : T['name']\n >,\n T['columns']['data'],\n T['types'],\n T['table'] extends string\n ? T['readOnly'] extends true\n ? true\n : undefined\n : T['readOnly'] extends false\n ? undefined\n : true,\n T\n > {\n relations: T extends RelationConfigSelf\n ? {\n [K in keyof T['relations'] & string]: RelationInfoForName<\n TC,\n VC,\n T,\n K,\n T['relations'][K]\n >;\n }\n : EmptyObject;\n relationsDataForCreate: T extends RelationConfigSelf\n ? BelongsToRelationsDataForCreate<TC, VC, T>\n : EmptyObject;\n relationsDataForCreateOptional: T extends RelationConfigSelf\n ? RelationsDataForCreateOptional<TC, VC, T>\n : EmptyObject;\n}\n\nexport interface PickORMTableInputColumns {\n // columns shape and the record type\n columns: {\n shape: Column.Shape.QueryInit;\n data: MaybeArray<TableDataItem>;\n };\n}\n\nexport interface PickORMTableComputed {\n /**\n * collect computed columns returned by {@link BaseTable.setColumns}\n */\n computed?: ComputedOptionsFactory<never, never>;\n}\n\nexport interface PickORMTableInputColumnsAndComputed\n extends PickORMTableInputColumns, PickORMTableComputed {}\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 extends PickORMTableInputColumnsAndComputed {\n id?: string;\n autoForeignKeys?: TableData.References.BaseOptions | boolean;\n // database schema containing this table\n schema?: QuerySchema;\n // database relation name\n nameInDb?: string;\n // whether query-facing camelCase names are translated to snake_case in SQL\n snakeCase?: boolean;\n // column types defined in base table to use in `setColumns`\n types: unknown;\n // path to file where the table is defined\n filePath: string;\n // default language for the full text search\n language?: string;\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 // row-level security table flags\n rls?: Rls.TableConfig;\n /**\n * Table-local grants used by migration generation.\n */\n grants?: readonly Grant.TableClassGrant[];\n // table-level read-only capability; only literal `true` disables mutations\n readonly readOnly?: boolean;\n // materialized-view capability; only literal `true` marks materialized views\n readonly materialized?: true;\n /**\n * Keep this table-like definition available at runtime, but exclude it from\n * generated migration DDL reconciliation.\n */\n generatorIgnore?: true;\n\n /* Only for tables */\n\n // table name\n table?: string;\n // suppress no primary key warning\n noPrimaryKey?: boolean;\n // automatically create foreign keys for relations\n\n /* Only for views */\n\n // view name\n name?: string;\n // Query assigned in `init(db)` to define this view.\n query?: Query;\n // Raw SQL expression that defines this view.\n sql?: string | RawSqlBase;\n // CREATE VIEW RECURSIVE option used by migration generation.\n recursive?: boolean;\n // CREATE VIEW CHECK OPTION used by migration generation.\n checkOption?: 'LOCAL' | 'CASCADED';\n // CREATE VIEW security_barrier option used by migration generation.\n securityBarrier?: boolean;\n // CREATE VIEW security_invoker option used by migration generation.\n securityInvoker?: boolean;\n // CREATE MATERIALIZED VIEW WITH DATA / WITH NO DATA option.\n withData?: boolean;\n}\n\nexport interface OrmLegacyTableForTypeHelpers {\n columns: {\n shape: Column.Shape.QueryInit;\n };\n computed?: ComputedOptionsFactory<never, never>;\n}\n\nexport interface OrmTableForTypeHelpers {\n data: {\n columns: Column.Shape.QueryInit;\n computed?: ComputedOptionsFactory<never, never>;\n };\n}\n\ntype AnyTableForTypeHelpers =\n | OrmLegacyTableForTypeHelpers\n | OrmTableForTypeHelpers;\n\n// Object type that's allowed in `where` and similar methods of the table.\nexport type Queryable<T extends AnyTableForTypeHelpers> = T extends\n | { columns: { shape: infer Shape extends Column.Shape.QueryInit } }\n | { data: { columns: infer Shape extends Column.Shape.QueryInit } }\n ? {\n [K in keyof Shape]?: Shape[K]['__queryType'];\n }\n : never;\n\nexport type DefaultSelect<T extends AnyTableForTypeHelpers> =\n T extends OrmTableForTypeHelpers\n ? ColumnsShape.DefaultOutput<T['data']['columns']>\n : T extends OrmLegacyTableForTypeHelpers\n ? ColumnsShape.DefaultOutput<T['columns']['shape']>\n : never;\n\ntype SelectableFromShapeAndComputed<\n Shape extends Column.Shape.QueryInit,\n Computed,\n> = Computed extends undefined\n ? ColumnsShape.Output<Shape>\n : Computed extends ((t: never) => infer R extends ComputedOptionsConfig)\n ? ColumnsShape.Output<Shape> & {\n [K in keyof R]: R[K] extends {\n result: {\n value: infer Value extends Column.Pick.QueryColumn;\n };\n }\n ? Value['__outputType']\n : R[K] extends () => {\n result: {\n value: infer Value extends Column.Pick.QueryColumn;\n };\n }\n ? Value['__outputType']\n : never;\n }\n : ColumnsShape.Output<Shape>;\n\n// Object type of table's record that's returned from database and is parsed.\nexport type Selectable<T extends AnyTableForTypeHelpers> =\n T extends OrmTableForTypeHelpers\n ? SelectableFromShapeAndComputed<\n T['data']['columns'],\n T['data']['computed']\n >\n : T extends OrmLegacyTableForTypeHelpers\n ? SelectableFromShapeAndComputed<T['columns']['shape'], T['computed']>\n : never;\n\n// Object type that conforms `create` method of the table.\nexport type Insertable<T extends AnyTableForTypeHelpers> = T extends\n | { columns: { shape: infer Shape extends Column.Shape.QueryInit } }\n | { data: { columns: infer Shape extends Column.Shape.QueryInit } }\n ? ColumnsShape.Input<Shape>\n : never;\n\n// Object type that conforms `update` method of the table.\nexport type Updatable<T extends AnyTableForTypeHelpers> =\n T extends OrmTableForTypeHelpers\n ? ColumnsShape.InputPartial<T['data']['columns']>\n : T extends OrmLegacyTableForTypeHelpers\n ? ColumnsShape.InputPartial<T['columns']['shape']>\n : never;\n\n// type of before hook function for the table\ntype BeforeHookMethod = (cb: QueryBeforeHook) => void;\ntype BeforeActionHookMethod = (cb: QueryBeforeActionHook) => 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 /**\n * Database relation name used in SQL and migration generation.\n */\n nameInDb?: string;\n columns: { shape: Column.Shape.QueryInit; data: MaybeArray<TableDataItem> };\n schema?: QuerySchema;\n noPrimaryKey?: boolean;\n snakeCase?: boolean;\n types: ColumnTypes;\n q: QueryData;\n language?: string;\n filePath: string;\n materialized?: true;\n /**\n * Keep this table-like definition available at runtime, but exclude it from\n * generated migration DDL reconciliation.\n */\n generatorIgnore?: true;\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 } | { name: 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 ORMTableInput,\n Options extends BelongsToOptions<Columns, Related>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => { new (): Related },\n options: Options,\n ): {\n type: 'belongsTo';\n id: Related['id'] extends string\n ? Related['id']\n : Related['table'] extends string\n ? Related['table']\n : Related['name'];\n options: Options;\n };\n\n hasOne<\n Columns extends Column.Shape.QueryInit,\n Related extends ORMTableInput,\n Through extends string,\n Options extends HasOneOptions<Columns, Related, Through>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => { new (): Related },\n options: Options,\n ): {\n type: 'hasOne';\n id: Related['id'] extends string\n ? Related['id']\n : Related['table'] extends string\n ? Related['table']\n : Related['name'];\n options: Options;\n };\n\n hasMany<\n Columns extends Column.Shape.QueryInit,\n Related extends ORMTableInput,\n Through extends string,\n Options extends HasOneOptions<Columns, Related, Through>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => { new (): Related },\n options: Options,\n ): {\n type: 'hasMany';\n id: Related['id'] extends string\n ? Related['id']\n : Related['table'] extends string\n ? Related['table']\n : Related['name'];\n options: Options;\n };\n\n hasAndBelongsToMany<\n Columns extends Column.Shape.QueryInit,\n Related extends ORMTableInput,\n Options extends HasAndBelongsToManyOptions<Columns, Related>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => { new (): Related },\n options: Options,\n ): {\n type: 'hasAndBelongsToMany';\n id: Related['id'] extends string\n ? Related['id']\n : Related['table'] extends string\n ? Related['table']\n : Related['name'];\n options: Options;\n };\n\n beforeQuery: BeforeHookMethod;\n afterQuery: AfterHookMethod;\n beforeCreate: BeforeActionHookMethod;\n afterCreate: AfterSelectableHookMethod;\n afterCreateCommit: AfterSelectableHookMethod;\n beforeUpdate: BeforeActionHookMethod;\n afterUpdate: AfterSelectableHookMethod;\n afterUpdateCommit: AfterSelectableHookMethod;\n beforeSave: BeforeActionHookMethod;\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: DbSqlMethod<ColumnTypes>;\n View: TableClass<BaseViewInstance<ColumnTypes>>;\n MaterializedView: TableClass<BaseMaterializedViewInstance<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\nexport interface BaseViewInstance<\n ColumnTypes,\n> extends BaseTableInstance<ColumnTypes> {\n name: string;\n query?: Query;\n sql: string | RawSqlBase;\n readonly readOnly?: boolean;\n recursive?: boolean;\n checkOption?: 'LOCAL' | 'CASCADED';\n securityBarrier?: boolean;\n securityInvoker?: boolean;\n}\n\nexport interface BaseMaterializedViewInstance<\n ColumnTypes,\n> extends BaseTableInstance<ColumnTypes> {\n name: string;\n query?: Query;\n sql: string | RawSqlBase;\n readonly readOnly?: true;\n readonly materialized: true;\n withData?: boolean;\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}: TableFactoryOptions<SchemaConfig, ColumnTypes> = {}): BaseTableClass<\n SchemaConfig,\n ColumnTypes\n> {\n const schema = schemaConfig();\n\n const columnTypes = (\n typeof columnTypesArg === 'function'\n ? // oxlint-disable-next-line typescript/no-explicit-any\n (columnTypesArg as any)(makeColumnTypes(schema))\n : columnTypesArg || makeColumnTypes(schema)\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 instances = new WeakMap<typeof base, InstanceType<typeof base>>();\n\n const base = class BaseTable {\n static nowSQL = nowSQL;\n static exportAs = exportAs;\n static columnTypes = columnTypes;\n\n static sql = _createDbSqlMethod(columnTypes);\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 = schema.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 = schema.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 = schema.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 = schema.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 = schema.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 = schema.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 static instance(): BaseTable {\n let instance = instances.get(this);\n if (!instance) {\n instance = new this();\n const name = instance.table || instance.name;\n if (instance.nameInDb === undefined && name) {\n instance.nameInDb = instance.snakeCase ? toSnakeCase(name) : name;\n }\n instances.set(this, instance);\n }\n\n return instance;\n }\n\n table!: string;\n name!: string;\n nameInDb?: string;\n query?: Query;\n sql!: string | RawSqlBase;\n columns = defaultColumns;\n schema?: QuerySchema;\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 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 const baseWithView = base as typeof base & {\n View: typeof base;\n MaterializedView: typeof base;\n };\n\n baseWithView.View = class View extends base {\n readonly readOnly = true;\n };\n\n baseWithView.MaterializedView = class MaterializedView extends (\n baseWithView.View\n ) {\n readonly materialized = true;\n };\n\n base.prototype.types = columnTypes as typeof base.prototype.types;\n base.prototype.snakeCase = snakeCase;\n base.prototype.language = language;\n base.prototype.autoForeignKeys =\n autoForeignKeys === true ? {} : autoForeignKeys || undefined;\n\n return base as unknown as BaseTableClass<SchemaConfig, ColumnTypes>;\n}\n","import {\n AfterHook,\n ColumnSchemaConfig,\n _createDbSqlMethod,\n ColumnsShape,\n DbSqlMethod,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n ComputedOptionsFactory,\n defaultSchemaConfig,\n DbTableOptionScopes,\n getColumnTypes,\n getCallerFilePath,\n getStackTrace,\n Grant,\n makeColumnTypes,\n QueryAfterHook,\n QueryBeforeHook,\n QueryData,\n QueryHooks,\n QueryOrExpression,\n QuerySchema,\n MaybeArray,\n RecordUnknown,\n Rls,\n RlsPolicy,\n TableData,\n type TableDataItem,\n parseTableDataInput,\n tableDataMethods,\n type RawSqlBase,\n toSnakeCase,\n} from 'pqb/internal';\nimport type { Query } from 'pqb';\nimport { ORMTableInput } from './legacy-table';\nimport { TableFactoryOptions } from './table.common';\nimport type { OrchidORM } from '../orm';\n\nexport interface OrmTable<\n Id extends string,\n Table extends string,\n Columns extends ColumnsShape,\n Relations,\n ColumnTypes = unknown,\n Computed = undefined,\n Scopes extends RecordUnknown | undefined = undefined,\n SoftDelete extends true | string | undefined = undefined,\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n Data extends MaybeArray<TableDataItem> = never,\n ReadOnly extends boolean | undefined = boolean | undefined,\n> {\n data: {\n id: Id;\n name: undefined;\n table: Table;\n relations: Relations;\n columns: Columns;\n types: ColumnTypes;\n computed: Computed;\n scopes: Scopes;\n softDelete: SoftDelete;\n readOnly: ReadOnly;\n materialized: undefined;\n tableData: Data extends unknown[] ? Data : [Data];\n };\n prototype: {\n columns: {\n shape: Columns;\n };\n };\n inputSchema: SchemaConfig['inputSchema'];\n outputSchema: SchemaConfig['outputSchema'];\n querySchema: SchemaConfig['querySchema'];\n pkeySchema: SchemaConfig['pkeySchema'];\n createSchema: SchemaConfig['createSchema'];\n updateSchema: SchemaConfig['updateSchema'];\n instance(): ORMTableInput;\n exportAs: string;\n nowSQL?: string;\n\n <C extends (keyof Columns & string)[]>(\n ...columns: C\n ): OrmTable.Relations.Endpoint<Id, C, ColumnsShape.InputPartial<Columns>>;\n\n where<T>(this: T, conditions: ColumnsShape.InputPartial<Columns>): T;\n\n through<Through extends string>(\n through: Through,\n source: string,\n ): OrmTable.Relations.Through<\n Id,\n Through,\n ColumnsShape.InputPartial<Columns>\n >;\n\n primaryKey<\n Column extends keyof Columns & string,\n PrimaryKeyColumns extends [Column, ...Column[]],\n Name extends string,\n >(\n columns: PrimaryKeyColumns,\n name?: Name,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n Scopes,\n SoftDelete,\n SchemaConfig,\n Data | OrmTable.DataItemWithColumns<PrimaryKeyColumns, Name>,\n ReadOnly\n >;\n\n index(\n columns: OrmTable.IndexColumn<Columns>[],\n options?: TableData.Index.OptionsArg,\n ): this;\n\n searchIndex(\n columns: OrmTable.IndexColumn<Columns>[],\n options?: TableData.Index.TsVectorArg,\n ): this;\n\n unique<\n Items extends [\n OrmTable.IndexColumn<Columns>,\n ...OrmTable.IndexColumn<Columns>[],\n ],\n Name extends string,\n >(\n columns: Items,\n options?: TableData.Index.UniqueOptionsArg<Name>,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n Scopes,\n SoftDelete,\n SchemaConfig,\n Data | OrmTable.DataItemWithColumns<Items, Name>,\n ReadOnly\n >;\n\n exclude(\n columns: OrmTable.ExcludeColumn<Columns>[],\n options?: TableData.Exclude.Options,\n ): this;\n\n check(check: RawSqlBase, name?: string): this;\n\n softDelete(): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n Scopes,\n true,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n softDelete<Column extends keyof Columns & string>(\n column: Column,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n Scopes,\n Column,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n\n computed<Fn extends ComputedOptionsFactory<ColumnTypes, Columns>>(\n computed: Fn,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Fn,\n Scopes,\n SoftDelete,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n\n scopes<Keys extends string>(\n scopes: DbTableOptionScopes<Table, Columns, Keys>,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n DbTableOptionScopes<Table, Columns, Keys>,\n SoftDelete,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n\n grants(grants: readonly Grant.TableClassGrant[]): this;\n\n rls(rls: OrmTable.RlsConfig): this;\n\n init(fn: OrmTable.Init<Columns>): this;\n\n foreignKey<\n Column extends keyof Columns,\n ForeignTable extends { data: { columns: ColumnsShape } },\n ForeignColumn extends keyof ForeignTable['data']['columns'],\n >(\n columns: [Column, ...Column[]],\n fnOrTable: () => ForeignTable,\n foreignColumns: [ForeignColumn, ...ForeignColumn[]],\n options?: TableData.References.Options,\n ): this;\n foreignKey<Column extends keyof Columns>(\n columns: [Column, ...Column[]],\n fnOrTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ): this;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n relations<Fn extends (self: OrmTable.Relations.Arg<keyof Columns>) => any>(\n fn: Fn,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Fn,\n ColumnTypes,\n Computed,\n Scopes,\n SoftDelete,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n}\n\nexport namespace OrmTable {\n export interface RlsConfig extends Rls.TableConfigBase {\n // Permissive policies for the table.\n permit: RlsPolicy.Policy[];\n // Restrictive policies for the table.\n restrict?: RlsPolicy.Policy[];\n }\n\n type DataKey<Columns extends ColumnsShape> = keyof Columns & string;\n\n export type IndexColumn<Columns extends ColumnsShape> =\n | DataKey<Columns>\n | TableData.Index.ColumnOrExpressionOptions<DataKey<Columns>>;\n\n export type ExcludeColumn<Columns extends ColumnsShape> =\n TableData.Exclude.ColumnOrExpressionOptions<DataKey<Columns>>;\n\n export interface DataItemWithColumns<\n Columns extends unknown[],\n Name extends string,\n > {\n tableDataItem: true;\n columns: Columns;\n name: string extends Name ? never : Name;\n }\n\n export interface RelationEndpointData {\n id: string;\n data?: { id: string };\n columns: string[];\n on?: RecordUnknown;\n through?: string;\n source?: string;\n relationThrough?: string;\n relationSource?: string;\n }\n\n export interface Input<\n Id extends string,\n Table extends string | undefined,\n Name extends string | undefined,\n Columns extends ColumnsShape,\n ColumnTypes,\n Relations,\n Computed,\n Scopes extends RecordUnknown | undefined,\n SoftDelete extends true | string | undefined,\n ReadOnly extends boolean | undefined,\n Materialized extends true | undefined = true | undefined,\n TableDataItems extends MaybeArray<TableDataItem> =\n MaybeArray<TableDataItem>,\n > extends ORMTableInput {\n id: Id;\n table: Table;\n name: Name;\n types: ColumnTypes;\n readonly readOnly: ReadOnly;\n readonly materialized: Materialized;\n readonly softDelete: SoftDelete;\n columns: {\n shape: Columns;\n data: TableDataItems extends unknown[]\n ? TableDataItems\n : [TableDataItems];\n };\n relations: Relations;\n computed: Computed extends ComputedOptionsFactory<never, never>\n ? Computed\n : undefined;\n scopes: Scopes extends undefined ? undefined : Scopes;\n }\n\n export interface TableFactoryKit<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n > {\n defineTable: DefineTable<SchemaConfig, ColumnTypes>;\n defineView: DefineView<SchemaConfig, ColumnTypes>;\n sql: DbSqlMethod<ColumnTypes>;\n exportAs: string;\n }\n\n export interface BeforeActionHookUtils<Columns extends ColumnsShape> {\n /**\n * Sets column values before a create, update, or save action.\n */\n set(data: {\n [K in keyof ColumnsShape.InputPartial<Columns>]?:\n | ColumnsShape.InputPartial<Columns>[K]\n | (() => QueryOrExpression<ColumnsShape.InputPartial<Columns>[K]>);\n }): void;\n }\n\n export interface InitHooks<Columns extends ColumnsShape> {\n /**\n * Registers a hook to run before every query.\n */\n beforeQuery(cb: QueryBeforeHook): void;\n /**\n * Registers a hook to run after every query.\n */\n afterQuery(cb: QueryAfterHook): void;\n /**\n * Registers a hook to run before create actions.\n */\n beforeCreate(\n cb: (utils: BeforeActionHookUtils<Columns>) => void | Promise<void>,\n ): void;\n /**\n * Registers a hook to run after create actions.\n */\n afterCreate<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run after create commits.\n */\n afterCreateCommit<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run before update actions.\n */\n beforeUpdate(\n cb: (utils: BeforeActionHookUtils<Columns>) => void | Promise<void>,\n ): void;\n /**\n * Registers a hook to run after update actions.\n */\n afterUpdate<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run after update commits.\n */\n afterUpdateCommit<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run before create or update actions.\n */\n beforeSave(\n cb: (utils: BeforeActionHookUtils<Columns>) => void | Promise<void>,\n ): void;\n /**\n * Registers a hook to run after create or update actions.\n */\n afterSave<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run after create or update commits.\n */\n afterSaveCommit<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run before delete actions.\n */\n beforeDelete(cb: QueryBeforeHook): void;\n /**\n * Registers a hook to run after delete actions.\n */\n afterDelete<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run after delete commits.\n */\n afterDeleteCommit<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n }\n\n export type Init<Columns extends ColumnsShape> = (\n orm: unknown,\n hooks: InitHooks<Columns>,\n ) => void;\n\n export interface DefineTableOptions {\n /**\n * Stable table identity used when resolving relation targets.\n */\n id?: string;\n /**\n * Database table name used when it differs from the query-facing table name.\n */\n nameInDb?: string;\n /**\n * Database schema containing this table.\n */\n schema?: QuerySchema;\n /**\n * Suppress the no-primary-key error for this table.\n */\n noPrimaryKey?: boolean;\n /**\n * Override the table factory snake-case setting for this table.\n */\n snakeCase?: boolean;\n /**\n * Table comment.\n */\n comment?: string;\n /**\n * Exclude this table from generated migration DDL reconciliation.\n */\n generatorIgnore?: true;\n /**\n * Auto-create foreign keys for relations of this table.\n */\n autoForeignKeys?: TableData.References.BaseOptions | boolean;\n /**\n * Mark this table as read-only to prevent mutations.\n */\n readOnly?: boolean;\n }\n\n type DefineTableId<\n Table extends string,\n Options extends DefineTableOptions,\n > = Options extends { id: infer Id extends string } ? Id : Table;\n\n type DefineTableReadOnly<Options extends DefineTableOptions> =\n Options extends { readOnly: true } ? true : undefined;\n\n export interface DefineTable<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n > {\n <Table extends string, Columns extends ColumnsShape>(\n table: Table,\n t: (columnTypes: ColumnTypes) => Columns,\n ): OrmTable<\n Table,\n Table,\n Columns,\n undefined,\n ColumnTypes,\n undefined,\n undefined,\n undefined,\n SchemaConfig,\n never,\n undefined\n >;\n <\n Table extends string,\n const Options extends DefineTableOptions,\n Columns extends ColumnsShape,\n >(\n table: Table,\n options: Options,\n t: (columnTypes: ColumnTypes) => Columns,\n ): OrmTable<\n DefineTableId<Table, Options>,\n Table,\n Columns,\n undefined,\n ColumnTypes,\n undefined,\n undefined,\n undefined,\n SchemaConfig,\n never,\n DefineTableReadOnly<Options>\n >;\n\n /**\n * Returns the file path where the table factory was defined.\n * Uses stack trace analysis to determine the caller's file path.\n * @throws Error if file path cannot be determined and `filePath` option was not provided to `createTableFactory`\n */\n getFilePath(): string;\n /**\n * Column types configured for this table factory.\n */\n types: ColumnTypes;\n /**\n * Export name configured for this table factory.\n */\n exportAs: string;\n /**\n * Custom timestamp SQL configured for this table factory.\n */\n nowSQL?: string;\n /**\n * Whether this table factory maps columns and table names to snake case.\n */\n snakeCase?: boolean;\n /**\n * Default full text search language configured for this table factory.\n */\n language?: string;\n }\n\n export interface DefineViewOptions {\n /**\n * Stable view identity used when resolving relation targets.\n * Defaults to the view name when not provided.\n */\n id?: string;\n /**\n * Database schema containing this view.\n */\n schema?: QuerySchema;\n /**\n * Database view name used when it differs from the query-facing view name.\n */\n nameInDb?: string;\n /**\n * Override the table factory snake-case setting for this view.\n */\n snakeCase?: boolean;\n /**\n * Default language for full text search columns in this view.\n */\n language?: string;\n /**\n * Exclude this view from generated migration DDL reconciliation.\n */\n generatorIgnore?: true;\n /**\n * SQL expression that defines this view.\n */\n sql?: string | RawSqlBase;\n /**\n * Set to false to expose mutation methods on a regular view.\n */\n readOnly?: boolean;\n /**\n * Mark this definition as a materialized view.\n */\n materialized?: true;\n /**\n * CREATE MATERIALIZED VIEW WITH DATA / WITH NO DATA option.\n */\n withData?: boolean;\n /**\n * CREATE VIEW RECURSIVE option used by migration generation.\n */\n recursive?: boolean;\n /**\n * CREATE VIEW CHECK OPTION used by migration generation.\n */\n checkOption?: 'LOCAL' | 'CASCADED';\n /**\n * CREATE VIEW security_barrier option used by migration generation.\n */\n securityBarrier?: boolean;\n /**\n * CREATE VIEW security_invoker option used by migration generation.\n */\n securityInvoker?: boolean;\n }\n\n type DefineViewId<Options, Name extends string> = Options extends {\n id: infer Id extends string;\n }\n ? Id\n : Name;\n\n type DefineViewReadOnly<Options> = Options extends { readOnly: false }\n ? Options extends { materialized: true }\n ? true\n : false\n : true;\n\n type DefineViewMaterialized<Options> = Options extends { materialized: true }\n ? true\n : undefined;\n\n export interface View<\n Id extends string,\n Name extends string,\n Columns extends ColumnsShape,\n ColumnTypes,\n Relations,\n Computed = undefined,\n Scopes extends RecordUnknown | undefined = undefined,\n SoftDelete extends true | string | undefined = undefined,\n ReadOnly extends boolean | undefined = true,\n Materialized extends true | undefined = undefined,\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n > {\n data: {\n id: Id;\n table: undefined;\n name: Name;\n relations: Relations;\n columns: Columns;\n types: ColumnTypes;\n computed: Computed;\n scopes: Scopes;\n softDelete: SoftDelete;\n readOnly: ReadOnly;\n materialized: Materialized;\n tableData: TableDataItem[];\n };\n prototype: {\n columns: {\n shape: Columns;\n };\n };\n inputSchema: SchemaConfig['inputSchema'];\n outputSchema: SchemaConfig['outputSchema'];\n querySchema: SchemaConfig['querySchema'];\n pkeySchema: SchemaConfig['pkeySchema'];\n createSchema: SchemaConfig['createSchema'];\n updateSchema: SchemaConfig['updateSchema'];\n\n <C extends (keyof Columns & string)[]>(\n ...columns: C\n ): OrmTable.Relations.Endpoint<Id, C, ColumnsShape.InputPartial<Columns>>;\n\n instance(): ORMTableInput;\n nowSQL?: string;\n\n query(fn: (orm: OrchidORM) => Query): this;\n\n through<Through extends string>(\n through: Through,\n source: string,\n ): OrmTable.Relations.Through<\n Id,\n Through,\n ColumnsShape.InputPartial<Columns>\n >;\n\n softDelete(): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Relations,\n Computed,\n Scopes,\n true,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n softDelete<Column extends keyof Columns & string>(\n column: Column,\n ): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Relations,\n Computed,\n Scopes,\n Column,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n\n computed<Fn extends ComputedOptionsFactory<unknown, Columns>>(\n computed: Fn,\n ): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Relations,\n Fn,\n Scopes,\n SoftDelete,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n\n scopes<Keys extends string>(\n scopes: DbTableOptionScopes<Name, Columns, Keys>,\n ): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Relations,\n Computed,\n DbTableOptionScopes<Name, Columns, Keys>,\n SoftDelete,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n\n grants(grants: readonly Grant.TableClassGrant[]): this;\n\n init(fn: OrmTable.Init<Columns>): this;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n relations<Fn extends (self: OrmTable.Relations.Arg<keyof Columns>) => any>(\n fn: Fn,\n ): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Fn,\n Computed,\n Scopes,\n SoftDelete,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n }\n\n export interface DefineView<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n > {\n <Name extends string, Columns extends ColumnsShape>(\n name: Name,\n t: (columnTypes: ColumnTypes) => Columns,\n ): View<\n Name,\n Name,\n Columns,\n ColumnTypes,\n undefined,\n undefined,\n undefined,\n undefined,\n true,\n undefined,\n SchemaConfig\n >;\n <\n Name extends string,\n const Options extends DefineViewOptions,\n Columns extends ColumnsShape,\n >(\n name: Name,\n options: Options,\n t: (columnTypes: ColumnTypes) => Columns,\n ): View<\n DefineViewId<Options, Name>,\n Name,\n Columns,\n ColumnTypes,\n undefined,\n undefined,\n undefined,\n undefined,\n DefineViewReadOnly<Options>,\n DefineViewMaterialized<Options>,\n SchemaConfig\n >;\n }\n\n export namespace Relations {\n export type Resolve<Relations> = Relations extends (\n ...args: never[]\n ) => infer Result\n ? ResolveMany<Result>\n : Relations;\n\n export type ResolveMany<Relations> = {\n [K in keyof Relations]: ResolveOne<Relations[K]>;\n };\n\n export type ResolveOne<Relation> =\n Relation extends BelongsTo<infer C, infer Fn, infer Required>\n ? ResolvedBelongsTo<TargetId<Fn>, C, TargetReferences<Fn>, Required>\n : Relation extends HasOne<infer C, infer Fn, infer Required>\n ? ResolvedHasOne<TargetId<Fn>, C, TargetReferences<Fn>, Required>\n : Relation extends HasMany<infer C, infer Fn>\n ? ResolvedHasMany<TargetId<Fn>, C, TargetReferences<Fn>>\n : Relation extends HasAndBelongsToMany<\n infer C,\n infer Fn,\n infer Options\n >\n ? ResolveHasAndBelongsToMany<C, Fn, Options>\n : Relation extends HasOneThrough<infer Fn, infer Required>\n ? ResolvedHasOneThrough<\n TargetId<Fn>,\n ResolveHasOneThroughOptions<\n RelationThroughOptions<TargetThrough<Fn>>,\n Required\n >\n >\n : Relation extends HasManyThrough<infer Fn>\n ? ResolvedHasManyThrough<\n TargetId<Fn>,\n RelationThroughOptions<TargetThrough<Fn>>\n >\n : Relation;\n\n export type ResolveHasAndBelongsToMany<\n C extends string[],\n Fn extends Function,\n Options,\n References extends string[] = TargetReferences<Fn>,\n > = ResolvedHasAndBelongsToMany<\n TargetId<Fn>,\n C,\n References,\n ResolveHasAndBelongsToManyOptions<C, References, Options>\n >;\n\n export type TargetResult<Fn extends Function> =\n Fn extends () => infer Result ? Result : never;\n\n export type TargetId<Fn extends Function> =\n TargetResult<Fn> extends { id: infer Id extends string }\n ? Id\n : TargetResult<Fn> extends {\n data: { id: infer Id extends string };\n }\n ? Id\n : string;\n\n export type TargetReferences<Fn extends Function> =\n TargetResult<Fn> extends { columns: infer References extends string[] }\n ? References\n : string[];\n\n export type TargetThrough<Fn extends Function> =\n TargetResult<Fn> extends { through: infer Through extends string }\n ? Through\n : string;\n\n export interface Arg<ColumnKeys> {\n <C extends (ColumnKeys & string)[]>(...columns: C): Fns<C>;\n hasOne<Fn extends Function>(fn: Fn): HasOneThrough<Fn>;\n hasMany<Fn extends Function>(fn: Fn): HasManyThrough<Fn>;\n }\n\n export interface Through<\n Id extends string,\n Through extends string,\n Conditions,\n > {\n id: Id;\n through: Through;\n source: string;\n where<T>(this: T, conditions: Conditions): T;\n }\n\n export interface Endpoint<Id extends string, C, Conditions> {\n id: Id;\n columns: C;\n where<T>(this: T, conditions: Conditions): T;\n through<Through extends string>(\n through: Through,\n source: string,\n ): OrmTable.Relations.Through<Id, Through, Conditions>;\n }\n\n export interface Fns<C extends string[]> {\n belongsTo<Fn extends Function>(fn: Fn): BelongsTo<C, Fn>;\n hasOne<Fn extends Function>(fn: Fn): HasOne<C, Fn>;\n hasMany<Fn extends Function>(fn: Fn): HasMany<C, Fn>;\n hasAndBelongsToMany<Fn extends Function>(\n fn: Fn,\n ): HasAndBelongsToMany<C, Fn>;\n }\n\n export interface LazyRelationRefsOptions<C extends string[]> {\n columns: C;\n }\n\n export interface LazyRelationRefsOptionsWithRequired<\n C extends string[],\n Required extends boolean,\n > extends LazyRelationRefsOptions<C> {\n required: Required;\n }\n\n export type LazyRelationRefsOptionsForRequired<\n C extends string[],\n Required extends boolean | undefined,\n > = Required extends boolean\n ? LazyRelationRefsOptionsWithRequired<C, Required>\n : LazyRelationRefsOptions<C>;\n\n export interface RelationRefsOptions<\n C extends string[],\n References extends string[],\n > extends LazyRelationRefsOptions<C> {\n references: References;\n }\n\n export interface RelationRefsOptionsWithRequired<\n C extends string[],\n References extends string[],\n Required extends boolean,\n > extends RelationRefsOptions<C, References> {\n required: Required;\n }\n\n export type RelationRefsOptionsForRequired<\n C extends string[],\n References extends string[],\n Required extends boolean | undefined,\n > = Required extends boolean\n ? RelationRefsOptionsWithRequired<C, References, Required>\n : RelationRefsOptions<C, References>;\n\n export interface BelongsTo<\n C extends string[],\n Fn extends Function,\n Required extends boolean | undefined = undefined,\n > {\n type: 'belongsTo';\n fn: Fn;\n options: LazyRelationRefsOptionsForRequired<C, Required>;\n __required?: Required;\n required(): BelongsTo<C, Fn, true>;\n required(value: false): BelongsTo<C, Fn, false>;\n /**\n * Controls whether a foreign key constraint is auto-created on the\n * **owning table** (the table this relation is defined on).\n *\n * - `true` (default when autoForeignKeys is enabled) — create FK with DB defaults.\n * - `false` — skip FK creation entirely.\n * - `{ onUpdate: 'CASCADE', onDelete: 'SET NULL' }` — create FK with these options.\n *\n * Only needed when `autoForeignKeys` is enabled on the table config;\n * otherwise no FK is created by default.\n *\n * @example\n * // disable FK for this relation\n * user('Id').belongsTo(() => ProfileTable('UserId')).foreignKey(false)\n *\n * @example\n * // custom FK options\n * user('Id').belongsTo(() => ProfileTable('UserId')).foreignKey({ onDelete: 'CASCADE' })\n */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): BelongsTo<C, Fn, Required>;\n }\n\n export interface HasOne<\n C extends string[],\n Fn extends Function,\n Required extends boolean | undefined = undefined,\n > {\n type: 'hasOne';\n fn: Fn;\n options: LazyRelationRefsOptionsForRequired<C, Required>;\n __required?: Required;\n required(): HasOne<C, Fn, true>;\n required(value: false): HasOne<C, Fn, false>;\n /**\n * Controls whether a foreign key constraint is auto-created on the\n * **related table** (the table pointed to by this relation).\n *\n * - `true` (default when autoForeignKeys is enabled) — create FK with DB defaults.\n * - `false` — skip FK creation entirely.\n * - `{ onUpdate: 'CASCADE', onDelete: 'SET NULL' }` — create FK with these options.\n *\n * Only needed when `autoForeignKeys` is enabled on the table config;\n * otherwise no FK is created by default.\n *\n * @example\n * // disable FK for this relation\n * user('Id').hasOne(() => ProfileTable('UserId')).foreignKey(false)\n *\n * @example\n * // custom FK options\n * user('Id').hasOne(() => ProfileTable('UserId')).foreignKey({ onDelete: 'CASCADE' })\n */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): HasOne<C, Fn, Required>;\n }\n\n export interface HasMany<C extends string[], Fn extends Function> {\n type: 'hasMany';\n fn: Fn;\n options: LazyRelationRefsOptions<C>;\n /**\n * Controls whether a foreign key constraint is auto-created on the\n * **related table** (the table pointed to by this relation).\n *\n * - `true` (default when autoForeignKeys is enabled) — create FK with DB defaults.\n * - `false` — skip FK creation entirely.\n * - `{ onUpdate: 'CASCADE', onDelete: 'SET NULL' }` — create FK with these options.\n *\n * Only needed when `autoForeignKeys` is enabled on the table config;\n * otherwise no FK is created by default.\n *\n * @example\n * // disable FK for this relation\n * user('Id').hasMany(() => PostTable('UserId')).foreignKey(false)\n *\n * @example\n * // custom FK options\n * user('Id').hasMany(() => PostTable('UserId')).foreignKey({ onDelete: 'CASCADE' })\n */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): HasMany<C, Fn>;\n }\n\n export interface HasAndBelongsToManyOptions<C extends string[]> {\n columns: C;\n }\n\n export interface HasAndBelongsToManyForeignKeyOptions {\n forThisTable?: boolean | TableData.References.BaseOptions;\n forRelatedTable?: boolean | TableData.References.BaseOptions;\n forBothTables?: boolean | TableData.References.BaseOptions;\n }\n\n export interface LazyHasAndBelongsToManyThroughOptions<\n C extends string[],\n > extends HasAndBelongsToManyOptions<C> {\n references: string[];\n through: {\n // Schema parsed from a schema-qualified join table name.\n schema?: QuerySchema;\n table: string;\n snakeCase?: boolean;\n columns: string[];\n references: string[];\n };\n foreignKeys?: HasAndBelongsToManyForeignKeyOptions;\n }\n\n export interface HasAndBelongsToManyThroughOptions<\n C extends string[],\n References extends string[],\n > extends HasAndBelongsToManyOptions<C> {\n references: string[];\n through: {\n // Schema parsed from a schema-qualified join table name.\n schema?: QuerySchema;\n table: string;\n snakeCase?: boolean;\n columns: string[];\n references: References;\n };\n foreignKeys?: HasAndBelongsToManyForeignKeyOptions;\n }\n\n export interface HasAndBelongsToManyThroughConfig {\n /**\n * Database schema containing this join table.\n */\n schema?: QuerySchema;\n /**\n * Set to false to preserve the join table name when the owning table\n * uses snake-case mode.\n */\n joinTableSnakeCase?: boolean;\n }\n\n export type ResolveHasAndBelongsToManyOptions<\n C extends string[],\n References extends string[],\n Options = HasAndBelongsToManyOptions<C>,\n > =\n Options extends LazyHasAndBelongsToManyThroughOptions<C>\n ? HasAndBelongsToManyThroughOptions<C, References>\n : Options;\n\n export type ResolveHasOneThroughOptions<\n Options,\n Required extends boolean | undefined,\n > = Required extends boolean ? Options & { required: Required } : Options;\n\n export interface HasAndBelongsToMany<\n C extends string[],\n Fn extends Function,\n Options = HasAndBelongsToManyOptions<C>,\n > {\n type: 'hasAndBelongsToMany';\n fn: Fn;\n options: Options;\n through(\n joinTable: string,\n selfColumns: string | (string[] & { length: C['length'] }),\n relColumns: string | string[],\n options?: HasAndBelongsToManyThroughConfig,\n ): HasAndBelongsToMany<C, Fn, LazyHasAndBelongsToManyThroughOptions<C>>;\n /**\n * Controls foreign key constraints on the **join table**. Unlike other\n * relation kinds, hasAndBelongsToMany creates FKs on both sides of the\n * join, so this method accepts a richer options object.\n *\n * - `true` (default) — create all join-table FKs with DB defaults.\n * - `false` — skip all join-table FK creation.\n * - `{ forThisTable, forRelatedTable, forBothTables }` — fine-grained control:\n * - `forThisTable` — FK from join table → **owning table** (this table).\n * - `forRelatedTable` — FK from join table → **related table**.\n * - `forBothTables` — shorthand: applies to both FKs at once.\n *\n * Each sub-value can be `false` (skip), `true` (default), or\n * `{ onUpdate: 'CASCADE', onDelete: 'SET NULL' }` (custom options).\n *\n * Must be called **after** `.through()`.\n *\n * @example\n * // disable all join-table FKs\n * post('Id')\n * .hasAndBelongsToMany(() => TagTable('Id'))\n * .through('postTag', ['postId'], ['tagId'])\n * .foreignKey(false)\n *\n * @example\n * // custom FK on both sides\n * post('Id')\n * .hasAndBelongsToMany(() => TagTable('Id'))\n * .through('postTag', ['postId'], ['tagId'])\n * .foreignKey({\n * forThisTable: { onDelete: 'CASCADE' },\n * forRelatedTable: { onDelete: 'CASCADE' },\n * })\n *\n * @example\n * // same custom FK via shorthand\n * post('Id')\n * .hasAndBelongsToMany(() => TagTable('Id'))\n * .through('postTag', ['postId'], ['tagId'])\n * .foreignKey({ forBothTables: { onDelete: 'CASCADE' } })\n */\n foreignKey(\n value?: boolean | HasAndBelongsToManyForeignKeyOptions,\n ): HasAndBelongsToMany<C, Fn, Options>;\n }\n\n export interface ResolvedBelongsTo<\n Id extends string,\n C extends string[],\n References extends string[],\n Required extends boolean | undefined = undefined,\n > {\n type: 'belongsTo';\n id: Id;\n options: RelationRefsOptionsForRequired<C, References, Required>;\n __required?: Required;\n required(): ResolvedBelongsTo<Id, C, References, true>;\n required(value: false): ResolvedBelongsTo<Id, C, References, false>;\n /** @see BelongsTo.foreignKey */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): ResolvedBelongsTo<Id, C, References, Required>;\n }\n\n export interface ResolvedHasOne<\n Id extends string,\n C extends string[],\n References extends string[],\n Required extends boolean | undefined = undefined,\n > {\n type: 'hasOne';\n id: Id;\n options: RelationRefsOptionsForRequired<C, References, Required>;\n __required?: Required;\n required(): ResolvedHasOne<Id, C, References, true>;\n required(value: false): ResolvedHasOne<Id, C, References, false>;\n /** @see HasOne.foreignKey */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): ResolvedHasOne<Id, C, References, Required>;\n }\n\n export interface ResolvedHasMany<\n Id extends string,\n C extends string[],\n References extends string[],\n > {\n type: 'hasMany';\n id: Id;\n options: RelationRefsOptions<C, References>;\n /** @see HasMany.foreignKey */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): ResolvedHasMany<Id, C, References>;\n }\n\n export interface ResolvedHasAndBelongsToMany<\n Id extends string,\n C extends string[],\n References extends string[],\n Options = HasAndBelongsToManyOptions<C>,\n > {\n type: 'hasAndBelongsToMany';\n id: Id;\n options: Options;\n through(\n joinTable: string,\n selfColumns: string | (string[] & { length: C['length'] }),\n relColumns: string | string[],\n options?: HasAndBelongsToManyThroughConfig,\n ): ResolvedHasAndBelongsToMany<\n Id,\n C,\n References,\n HasAndBelongsToManyThroughOptions<C, References>\n >;\n }\n\n export interface RelationThroughOptions<Through extends string = string> {\n through: Through;\n source: string;\n on?: RecordUnknown;\n required?: boolean;\n }\n\n export interface HasOneThrough<\n Fn extends Function,\n Required extends boolean | undefined = undefined,\n > {\n type: 'hasOne';\n fn: Fn;\n options: ResolveHasOneThroughOptions<\n RelationThroughOptions<TargetThrough<Fn>>,\n Required\n >;\n __required?: Required;\n required(): HasOneThrough<Fn, true>;\n required(value: false): HasOneThrough<Fn, false>;\n }\n\n export interface HasManyThrough<Fn extends Function> {\n type: 'hasMany';\n fn: Fn;\n options: RelationThroughOptions<TargetThrough<Fn>>;\n }\n\n export interface ResolvedHasOneThrough<Id extends string, Options> {\n type: 'hasOne';\n id: Id;\n options: Options;\n __required?: Options extends { required?: infer Required }\n ? Required\n : undefined;\n required(): ResolvedHasOneThrough<Id, Options & { required: true }>;\n required(\n value: false,\n ): ResolvedHasOneThrough<Id, Options & { required: false }>;\n }\n\n export interface ResolvedHasManyThrough<Id extends string, Options> {\n type: 'hasMany';\n id: Id;\n options: Options;\n }\n }\n}\n\nconst makeRelationEndpoint = (\n id: string,\n columns: string[],\n on?: RecordUnknown,\n through?: string,\n source?: string,\n): OrmTable.RelationEndpointData => {\n const endpoint = {\n id,\n columns,\n on,\n relationThrough: through,\n relationSource: source,\n where(conditions: RecordUnknown) {\n return makeRelationEndpoint(\n id,\n columns,\n { ...on, ...conditions },\n through,\n source,\n );\n },\n } as RecordUnknown;\n\n if (through) {\n endpoint.through = through;\n endpoint.source = source;\n } else {\n endpoint.through = (through: string, source: string) =>\n makeRelationEndpoint(id, columns, on, through, source);\n }\n\n return endpoint as never;\n};\n\nconst getRelationTargetId = (target: unknown): string => {\n const item = target as { id?: string; data?: { id: string } };\n const id = item.id ?? item.data?.id;\n if (!id) {\n throw new Error('Cannot get relation target id');\n }\n\n return id;\n};\n\nconst getRelationEndpointOptions = (endpoint: OrmTable.RelationEndpointData) =>\n endpoint.on\n ? { references: endpoint.columns, on: endpoint.on }\n : { references: endpoint.columns };\n\nconst getRelationThroughOptions = (endpoint: OrmTable.RelationEndpointData) => {\n const options: RecordUnknown = {\n through: endpoint.relationThrough,\n source: endpoint.relationSource,\n };\n if (endpoint.on) options.on = endpoint.on;\n\n return options;\n};\n\nconst makeRelationBuilder = () => {\n const withRequired = (relation: unknown) => {\n const item = relation as {\n options: {\n required?: boolean;\n foreignKey?: boolean | TableData.References.BaseOptions;\n };\n required?: (value?: boolean) => unknown;\n foreignKey?: (\n value?: boolean | TableData.References.BaseOptions,\n ) => unknown;\n };\n item.required = (value = true) => {\n item.options.required = value;\n return item;\n };\n item.foreignKey = (\n value: boolean | TableData.References.BaseOptions = true,\n ) => {\n item.options.foreignKey = value;\n return item;\n };\n\n return item as never;\n };\n\n const builder = ((...columns: string[]) => ({\n belongsTo: (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n return withRequired({\n type: 'belongsTo',\n id: getRelationTargetId(endpoint),\n options: { columns, ...getRelationEndpointOptions(endpoint) },\n });\n },\n hasOne: (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n return withRequired({\n type: 'hasOne',\n id: getRelationTargetId(endpoint),\n options: { columns, ...getRelationEndpointOptions(endpoint) },\n } as never);\n },\n hasMany: (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n return withRequired({\n type: 'hasMany',\n id: getRelationTargetId(endpoint),\n options: { columns, ...getRelationEndpointOptions(endpoint) },\n } as never);\n },\n hasAndBelongsToMany: (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n const options = { columns } as {\n columns: string[];\n references?: string[];\n on?: RecordUnknown;\n foreignKey?: boolean | TableData.References.Options;\n through?: {\n // Schema parsed from a schema-qualified join table name.\n schema?: QuerySchema;\n table: string;\n snakeCase?: boolean;\n columns: string[];\n references: string[];\n foreignKey?: boolean | TableData.References.Options;\n };\n };\n const relation = {\n type: 'hasAndBelongsToMany',\n id: getRelationTargetId(endpoint),\n options,\n through(\n joinTable: string,\n selfColumns: string | string[],\n relColumns: string | string[],\n throughOptions?: OrmTable.Relations.HasAndBelongsToManyThroughConfig,\n ) {\n this.options.references = Array.isArray(selfColumns)\n ? selfColumns\n : [selfColumns];\n this.options.on = endpoint.on;\n const schemaIndex = joinTable.indexOf('.');\n const parsedSchema =\n schemaIndex === -1 ? undefined : joinTable.slice(0, schemaIndex);\n const table =\n schemaIndex === -1 ? joinTable : joinTable.slice(schemaIndex + 1);\n this.options.through = {\n schema: throughOptions?.schema ?? parsedSchema,\n table,\n snakeCase: throughOptions?.joinTableSnakeCase,\n columns: Array.isArray(relColumns) ? relColumns : [relColumns],\n references: endpoint.columns,\n };\n\n return this;\n },\n foreignKey(\n value?:\n | boolean\n | {\n forThisTable?: boolean | TableData.References.BaseOptions;\n forRelatedTable?: boolean | TableData.References.BaseOptions;\n forBothTables?: boolean | TableData.References.BaseOptions;\n },\n ) {\n if (value === false) {\n this.options.foreignKey = false;\n if (this.options.through) {\n this.options.through.foreignKey = false;\n }\n } else if (value === undefined || value === true) {\n this.options.foreignKey = true;\n if (this.options.through) {\n this.options.through.foreignKey = true;\n }\n } else if ('forBothTables' in value) {\n this.options.foreignKey = value.forBothTables ?? true;\n if (this.options.through) {\n this.options.through.foreignKey = value.forBothTables ?? true;\n }\n } else {\n this.options.foreignKey = value.forThisTable ?? true;\n if (this.options.through) {\n this.options.through.foreignKey = value.forRelatedTable ?? true;\n }\n }\n\n return this;\n },\n };\n\n return relation as never;\n },\n })) as unknown as {\n hasOne(fn: () => unknown): unknown;\n hasMany(fn: () => unknown): unknown;\n };\n\n builder.hasOne = (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n\n return withRequired({\n type: 'hasOne',\n id: getRelationTargetId(endpoint),\n options: getRelationThroughOptions(endpoint),\n } as never);\n };\n builder.hasMany = (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n\n return {\n type: 'hasMany',\n id: getRelationTargetId(endpoint),\n options: getRelationThroughOptions(endpoint),\n } as never;\n };\n\n return builder as never;\n};\n\nclass InitHookTarget extends QueryHooks {\n constructor(public q: QueryData) {\n super();\n }\n\n clone<T>(this: T): T {\n return this;\n }\n}\n\nconst setDefinitionSchemaMethods = (\n definition: {\n prototype: {\n columns?: {\n shape: ColumnsShape;\n };\n };\n inputSchema?: unknown;\n outputSchema?: unknown;\n querySchema?: unknown;\n pkeySchema?: unknown;\n createSchema?: unknown;\n updateSchema?: unknown;\n },\n schema: ColumnSchemaConfig,\n shape: ColumnsShape,\n) => {\n definition.prototype ??= {};\n definition.prototype.columns = { shape };\n definition.inputSchema = schema.inputSchema;\n definition.outputSchema = schema.outputSchema;\n definition.querySchema = schema.querySchema;\n definition.pkeySchema = schema.pkeySchema;\n definition.createSchema = schema.createSchema;\n definition.updateSchema = schema.updateSchema;\n};\n\nexport const createTableFactory = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>(\n options?: TableFactoryOptions<SchemaConfig, ColumnTypes>,\n): OrmTable.TableFactoryKit<SchemaConfig, ColumnTypes> => {\n const schema = (\n options?.schemaConfig ?? defaultSchemaConfig\n )() as SchemaConfig;\n const defaultColumnTypes = makeColumnTypes(schema);\n const columnTypesOption = options?.columnTypes;\n const columnTypes = (\n typeof columnTypesOption === 'function'\n ? // oxlint-disable-next-line typescript/no-explicit-any\n (columnTypesOption as any)(defaultColumnTypes)\n : columnTypesOption || defaultColumnTypes\n ) as ColumnTypes;\n\n const defineTableExportAs = options?.defineTableExportAs ?? 'defineTable';\n\n // stack is needed only if filePath wasn't given\n const filePathOrStack = options?.filePath || getStackTrace();\n\n let filePath: string | undefined;\n\n const defineTable = ((\n table: string,\n optionsOrT:\n | OrmTable.DefineTableOptions\n | ((columnTypes: ColumnTypes) => ColumnsShape),\n maybeT?: (columnTypes: ColumnTypes) => ColumnsShape,\n ) => {\n const tableOptions =\n typeof optionsOrT === 'function' ? undefined : optionsOrT;\n const t = typeof optionsOrT === 'function' ? optionsOrT : maybeT;\n if (!t) throw new Error('Column definitions are required');\n\n const id = tableOptions?.id ?? table;\n const shape = getColumnTypes(\n columnTypes,\n t,\n options?.nowSQL,\n options?.language,\n );\n const tableData: TableData = {};\n\n const snakeCase = tableOptions?.snakeCase ?? options?.snakeCase;\n\n if (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 const nameInDb =\n tableOptions?.nameInDb ?? (snakeCase ? toSnakeCase(table) : table);\n\n const autoForeignKeys =\n tableOptions?.autoForeignKeys !== undefined\n ? tableOptions.autoForeignKeys\n : options?.autoForeignKeys;\n\n const instance: ORMTableInput & {\n q: QueryData;\n relations?: unknown;\n init?(orm: unknown): void;\n } = {\n id,\n table,\n nameInDb,\n schema: tableOptions?.schema,\n noPrimaryKey: tableOptions?.noPrimaryKey,\n snakeCase,\n comment: tableOptions?.comment,\n generatorIgnore: tableOptions?.generatorIgnore,\n readOnly: tableOptions?.readOnly,\n columns: {\n shape,\n data: tableData as never,\n },\n types: columnTypes,\n filePath: options?.filePath ?? '',\n language: options?.language,\n autoForeignKeys:\n autoForeignKeys === true ? {} : autoForeignKeys || undefined,\n q: {} as QueryData,\n };\n\n const definition = ((...columns: string[]) =>\n makeRelationEndpoint(id, columns)) as unknown as OrmTable<\n typeof id,\n typeof table,\n ReturnType<typeof t>,\n undefined,\n typeof columnTypes,\n undefined,\n undefined,\n undefined,\n typeof schema,\n never,\n typeof tableOptions extends { readOnly: true } ? true : undefined\n >;\n\n definition.data = {\n id,\n table,\n name: undefined,\n relations: undefined,\n columns: shape as ReturnType<typeof t>,\n types: undefined,\n computed: undefined,\n scopes: undefined,\n readOnly: tableOptions?.readOnly,\n tableData: tableData as never,\n } as never;\n setDefinitionSchemaMethods(definition, schema, shape);\n\n definition.exportAs = defineTableExportAs;\n definition.nowSQL = options?.nowSQL;\n\n definition.instance = () => {\n const { computed, relations, scopes, softDelete, readOnly } =\n definition.data as RecordUnknown;\n instance.computed = computed as never;\n instance.scopes = scopes as never;\n (instance as { softDelete: unknown }).softDelete = softDelete;\n (instance as { readOnly: unknown }).readOnly = readOnly;\n instance.relations =\n typeof relations === 'function'\n ? (relations as (arg: never) => unknown)(makeRelationBuilder())\n : relations;\n\n return instance as never;\n };\n definition.where = function (conditions: RecordUnknown) {\n return makeRelationEndpoint(id, [], conditions);\n } as never;\n definition.through = (through, source) =>\n makeRelationEndpoint(id, [], undefined, through, source) as never;\n definition.primaryKey = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).primaryKey(...args) as never,\n );\n return definition as never;\n };\n definition.index = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).index(...args) as never,\n );\n return definition as never;\n };\n definition.searchIndex = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).searchIndex(...args) as never,\n );\n return definition as never;\n };\n definition.unique = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).unique(...args) as never,\n );\n return definition as never;\n };\n definition.exclude = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).exclude(...args) as never,\n );\n return definition as never;\n };\n definition.check = (...args) => {\n parseTableDataInput(tableData, tableDataMethods.check(...args) as never);\n return definition as never;\n };\n definition.softDelete = (column?: string) => {\n (definition.data as RecordUnknown).softDelete = column || true;\n return definition as never;\n };\n definition.computed = (computed) => {\n (definition.data as RecordUnknown).computed = computed;\n return definition as never;\n };\n definition.scopes = (scopes) => {\n (definition.data as RecordUnknown).scopes = scopes;\n return definition as never;\n };\n definition.grants = (grants) => {\n instance.grants = grants as never;\n return definition as never;\n };\n definition.rls = (rls) => {\n instance.rls = rls as never;\n return definition as never;\n };\n definition.init = (fn) => {\n instance.init = function (\n this: ORMTableInput & { q: QueryData },\n orm: unknown,\n ) {\n fn(orm, new InitHookTarget(this.q));\n };\n return definition as never;\n };\n definition.foreignKey = (\n columns: [string, ...string[]],\n fnOrTable: (() => unknown) | string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).foreignKey(\n columns,\n fnOrTable,\n foreignColumns,\n options,\n ) as never,\n );\n return definition as never;\n };\n definition.relations = (fn) => {\n (definition.data as RecordUnknown).relations = fn;\n return definition as never;\n };\n\n return definition;\n }) as OrmTable.DefineTable<SchemaConfig, ColumnTypes>;\n\n defineTable.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 table factory. Please set the `filePath` option of `createTableFactory` manually.',\n );\n };\n defineTable.types = columnTypes;\n defineTable.exportAs = defineTableExportAs;\n defineTable.nowSQL = options?.nowSQL;\n defineTable.snakeCase = options?.snakeCase;\n defineTable.language = options?.language;\n\n const defineView = ((\n name: string,\n optionsOrT:\n | OrmTable.DefineViewOptions\n | ((columnTypes: ColumnTypes) => ColumnsShape),\n maybeT?: (columnTypes: ColumnTypes) => ColumnsShape,\n ) => {\n const viewOptions =\n typeof optionsOrT === 'function' ? undefined : optionsOrT;\n const materialized = viewOptions?.materialized;\n const readOnly = (materialized || viewOptions?.readOnly !== false) as\n | false\n | true;\n const t = typeof optionsOrT === 'function' ? optionsOrT : maybeT;\n if (!t) throw new Error('Column definitions are required');\n\n const language = viewOptions?.language ?? options?.language;\n const snakeCase = viewOptions?.snakeCase ?? options?.snakeCase;\n const shape = getColumnTypes(columnTypes, t, options?.nowSQL, language);\n const tableData: TableData = {};\n const nameInDb =\n viewOptions?.nameInDb ?? (snakeCase ? toSnakeCase(name) : name);\n\n if (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 const instance: ORMTableInput & {\n name: string;\n q: QueryData;\n relations?: unknown;\n init?(orm: unknown): void;\n } = {\n id: viewOptions?.id ?? name,\n name,\n nameInDb,\n schema: viewOptions?.schema,\n snakeCase,\n columns: {\n shape,\n data: tableData as never,\n },\n types: columnTypes,\n filePath: options?.filePath ?? '',\n language,\n readOnly,\n materialized,\n generatorIgnore: viewOptions?.generatorIgnore,\n withData: viewOptions?.withData,\n sql: viewOptions?.sql,\n recursive: viewOptions?.recursive,\n checkOption: viewOptions?.checkOption,\n securityBarrier: viewOptions?.securityBarrier,\n securityInvoker: viewOptions?.securityInvoker,\n q: {} as QueryData,\n };\n\n const viewId = viewOptions?.id ?? name;\n const definition = ((...columns: string[]) =>\n makeRelationEndpoint(viewId, columns)) as unknown as OrmTable.View<\n typeof name,\n typeof name,\n ReturnType<typeof t>,\n unknown,\n undefined,\n undefined,\n undefined,\n undefined,\n typeof readOnly,\n typeof materialized\n >;\n\n definition.data = {\n id: viewOptions?.id ?? name,\n table: undefined,\n name,\n relations: undefined,\n columns: shape as ReturnType<typeof t>,\n types: undefined,\n computed: undefined,\n scopes: undefined,\n readOnly: readOnly as never,\n materialized: materialized as never,\n tableData: tableData as never,\n } as never;\n setDefinitionSchemaMethods(definition, schema, shape);\n definition.nowSQL = options?.nowSQL;\n\n // `instance` intentionally exposes the broad runtime input type while\n // static metadata keeps precise table data types.\n definition.instance = () => {\n const { computed, relations, scopes, softDelete } =\n definition.data as RecordUnknown;\n instance.computed = computed as never;\n instance.scopes = scopes as never;\n (instance as { softDelete?: unknown }).softDelete = softDelete;\n instance.relations =\n typeof relations === 'function'\n ? (relations as (arg: never) => unknown)(makeRelationBuilder())\n : relations;\n\n return instance as never;\n };\n definition.query = (fn) => {\n instance.init = (orm) => {\n instance.query = fn(orm as never) as never;\n };\n return definition;\n };\n definition.through = (through, source) =>\n makeRelationEndpoint(viewId, [], undefined, through, source) as never;\n definition.softDelete = (column?: string) => {\n (definition.data as RecordUnknown).softDelete = column || true;\n return definition as never;\n };\n definition.computed = (computed) => {\n (definition.data as RecordUnknown).computed = computed;\n return definition as never;\n };\n definition.scopes = (scopes) => {\n (definition.data as RecordUnknown).scopes = scopes;\n return definition as never;\n };\n definition.grants = (grants) => {\n instance.grants = grants as never;\n return definition as never;\n };\n definition.init = (fn) => {\n instance.init = function (\n this: ORMTableInput & { q: QueryData },\n orm: unknown,\n ) {\n fn(orm, new InitHookTarget(this.q));\n };\n return definition as never;\n };\n definition.relations = (fn) => {\n (definition.data as RecordUnknown).relations = fn;\n return definition as never;\n };\n\n return definition as never;\n }) as OrmTable.DefineView<SchemaConfig, ColumnTypes>;\n\n return {\n defineTable,\n defineView,\n sql: _createDbSqlMethod(columnTypes),\n exportAs: defineTableExportAs,\n };\n};\n","import {\n _clone,\n _queryHookAfterCreate,\n _queryHookAfterUpdate,\n _hookSelectColumns,\n _queryWhereIn,\n Column,\n CreateCtx,\n getForeignKeyTableInstance,\n getQueryAs,\n isQueryReturnsAll,\n pushQueryOnForOuter,\n RawSql,\n setQueryObjectValueImmutable,\n UpdateData,\n WhereArg,\n emptyObject,\n MaybeArray,\n PickQueryRelations,\n RecordUnknown,\n RelationConfigBase,\n PickQuerySelectableRelations,\n UpdateSelf,\n} from 'pqb/internal';\nimport { Query } from 'pqb';\nimport { HasOneNestedInsert, HasOneNestedUpdate } from '../has-one/has-one';\nimport { HasManyNestedUpdate } from '../has-many/has-many';\nimport { HasManyNestedInsert } from '../has-many/has-many.create';\nimport { ORMTableInput } from '../../orm-table/legacy-table';\nimport { RelationRefsOptions } from './options';\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<PickQuerySelectableRelations>;\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<PickQuerySelectableRelations>[];\n\nexport type NestedInsertManyConnectOrCreate =\n NestedInsertOneItemConnectOrCreate[];\n\nexport type NestedInsertItem = NestedInsertOneItem | NestedInsertManyItems;\n\nexport interface NestedUpdateOneItem {\n add?: MaybeArray<WhereArg<PickQuerySelectableRelations>>;\n disconnect?: boolean;\n set?: WhereArg<PickQuerySelectableRelations>;\n delete?: boolean;\n update?: UpdateData<UpdateSelf>;\n upsert?: {\n update: UpdateData<UpdateSelf>;\n create: RecordUnknown | (() => RecordUnknown);\n };\n create: RecordUnknown;\n}\n\nexport interface NestedUpdateManyItems {\n add?: MaybeArray<WhereArg<PickQuerySelectableRelations>>;\n disconnect?: MaybeArray<WhereArg<PickQuerySelectableRelations>>;\n set?: MaybeArray<WhereArg<PickQuerySelectableRelations>>;\n delete?: MaybeArray<WhereArg<PickQuerySelectableRelations>>;\n update?: {\n where: MaybeArray<WhereArg<PickQuerySelectableRelations>>;\n data: UpdateData<UpdateSelf>;\n };\n create: RecordUnknown[];\n upsert?: {\n findBy: PickQuerySelectableRelations;\n update: UpdateData<UpdateSelf>;\n create?: RecordUnknown | (() => RecordUnknown);\n };\n}\n\nexport type NestedUpdateItem = NestedUpdateOneItem | NestedUpdateManyItems;\n\ninterface NestedUpdateSingleRecordParams {\n set?: unknown;\n create?: unknown;\n upsert?: unknown;\n}\n\ninterface NestedUpdateUpsert {\n update: UpdateData<UpdateSelf>;\n create?: RecordUnknown | (() => RecordUnknown);\n}\n\nexport interface NestedUpdateRelationIds {\n existingRelQuery: Query;\n setIds: RecordUnknown;\n setAppendedAs: (as: string) => void;\n}\n\nexport const throwIfQueryReturnsAllForNestedUpdate = (\n q: Query,\n params: NestedUpdateSingleRecordParams,\n) => {\n if (!(params.set || params.create || params.upsert) || !isQueryReturnsAll(q))\n return;\n\n let key: 'set' | 'create' | 'upsert';\n if (params.set) {\n key = 'set';\n } else if (params.create) {\n key = 'create';\n } else {\n key = 'upsert';\n }\n\n throw new Error(`\\`${key}\\` option is not allowed in a batch update`);\n};\n\nconst getNestedUpdateUpsertCreate = (upsert: NestedUpdateUpsert) => {\n if (typeof upsert.create === 'function') {\n return upsert.create();\n }\n\n return upsert.create || emptyObject;\n};\n\nexport const makeNestedUpdateUpsertData = (\n upsert: NestedUpdateUpsert,\n setIds: RecordUnknown,\n) => ({\n update: upsert.update,\n create: {\n ...getNestedUpdateUpsertCreate(upsert),\n ...setIds,\n },\n});\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 items: RecordUnknown[],\n rowIndexes: number[],\n key: string,\n primaryKeys: string[],\n nestedInsert: HasOneNestedInsert | HasManyNestedInsert,\n) => {\n q.q.wrapInTransaction = true;\n\n items.forEach((item, i) => {\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 = [rowIndexes[i], value] as [number, NestedInsertItem];\n\n if (store.hasRelation[key]) {\n store.hasRelation[key].push(values);\n return;\n }\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};\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 never,\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(\n q,\n 'joinedShapes',\n baseAs,\n baseQuery.q.selectShape,\n );\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.q.nameInDb || (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 const instance = getForeignKeyTableInstance(fkey.fnOrTable());\n fkeyTable = instance.nameInDb || (instance.table as string);\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 let sameForeignTable = false;\n if (typeof refs.fnOrTable === 'string') {\n sameForeignTable =\n refs.fnOrTable === toTable &&\n refs.foreignColumns.every(\n (column, i) =>\n getColumnKeyFromDbName(to, column) === sortedPkeys[i],\n );\n } else {\n const instance = getForeignKeyTableInstance(refs.fnOrTable());\n sameForeignTable =\n (instance.nameInDb || instance.table) === toTable &&\n refs.foreignColumns.every((column, i) => column === sortedPkeys[i]);\n }\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 sameForeignTable\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\nexport const selectCteColumnsSql = (cteAs: string, columns: string[]) =>\n `(SELECT ${columns\n .map((c) => `\"${cteAs}\".\"${c}\"`)\n .join(', ')} FROM \"${cteAs}\")`;\n\nexport const selectCteColumnSql = (cteAs: string, column: string) =>\n `(SELECT \"${cteAs}\".\"${column}\" FROM \"${cteAs}\")`;\n\nexport const makeNestedUpdateRelationIds = (\n q: Query,\n relQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n): NestedUpdateRelationIds => {\n const selectIdsSql = new RawSql('');\n const setIds: RecordUnknown = {};\n\n for (const foreignKey of foreignKeys) {\n setIds[foreignKey] = new RawSql('');\n }\n\n let appendedAs: string | undefined;\n _hookSelectColumns(q, primaryKeys, (aliasedPrimaryKeys) => {\n selectIdsSql._sql = selectCteColumnsSql(\n appendedAs as string,\n aliasedPrimaryKeys,\n );\n\n foreignKeys.forEach((foreignKey, i) => {\n (setIds[foreignKey] as RawSql)._sql = selectCteColumnSql(\n appendedAs as string,\n aliasedPrimaryKeys[i],\n );\n });\n });\n\n return {\n existingRelQuery: _queryWhereIn(\n _clone(relQuery),\n true,\n foreignKeys,\n selectIdsSql,\n ),\n setIds,\n setAppendedAs(as) {\n appendedAs = as;\n },\n };\n};\n\nexport const selectCteColumnFromManySql = (\n cteAs: string,\n column: string,\n rowIndex: number,\n count: number,\n) => {\n let sql = `(SELECT \"${cteAs}\".\"${column}\" FROM \"${cteAs}\"`;\n if (count > 1) {\n sql += ` LIMIT 1`;\n if (rowIndex) sql += ` OFFSET ${rowIndex}`;\n }\n return sql + ')';\n};\n\nexport const selectCteColumnMustExistSql = (\n i: number,\n cteAs: string,\n column: string,\n) => {\n const selectColumn = selectCteColumnSql(cteAs, column);\n\n return i === 0\n ? `CASE WHEN (SELECT count(*) FROM \"${cteAs}\") = 0 AND (SELECT 'not-found')::int = 0 THEN NULL ELSE ${selectColumn} END`\n : selectColumn;\n};\n\nexport const setForeignKeysFromCte = (\n record: RecordUnknown,\n primaryKeys: string[],\n foreignKeys: string[],\n mustExist?: boolean,\n) => {\n for (const key of foreignKeys) {\n record[key] = new RawSql('');\n }\n\n return (as: string) => {\n foreignKeys.forEach(\n mustExist\n ? (foreignKey, i) => {\n (record[foreignKey] as RawSql)._sql = selectCteColumnMustExistSql(\n i,\n as,\n primaryKeys[i],\n );\n }\n : (foreignKey, i) => {\n (record[foreignKey] as RawSql)._sql = selectCteColumnSql(\n as,\n primaryKeys[i],\n );\n },\n );\n };\n};\n","import {\n cloneQueryBaseUnscoped,\n DynamicRawSQL,\n getQueryAs,\n getShapeFromSelect,\n RawSql,\n HookSelectValue,\n isExpression,\n RelationJoinQuery,\n Column,\n} from 'pqb/internal';\nimport { Query } 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 { Query } from 'pqb';\nimport {\n CreateCtx,\n CreateSelf,\n getFreeAlias,\n RawSql,\n RecordUnknown,\n _orCreate,\n _prependWith,\n _queryWhere,\n _querySelect,\n _queryTake,\n _queryInsertMany,\n _queryInsertManyFrom,\n _clone,\n _onUpsertUpdate,\n _prependWithOnUpsertCreate,\n} from 'pqb/internal';\nimport { RelationToOneDataForCreateSameQuery } from '../relations';\nimport {\n NestedInsertOneItemCreate,\n selectCteColumnFromManySql,\n selectCteColumnMustExistSql,\n setForeignKeysFromCte,\n} from '../common/utils';\n\nexport interface BelongsToDataForCreate<\n Name extends string,\n FK extends string,\n Required,\n Q extends Query,\n> {\n columns: FK;\n nested: Q extends Query.Pick.IsNotReadOnly\n ? Required extends true\n ? {\n [Key in Name]: RelationToOneDataForCreateSameQuery<Q>;\n }\n : {\n [Key in Name]?: RelationToOneDataForCreateSameQuery<Q>;\n }\n : {\n [Key in Name]?: never;\n };\n}\n\nexport interface BelongsToCreateState {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n}\n\nexport const belongsToCreate = (\n key: string,\n state: BelongsToCreateState,\n q: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n) => {\n const queryForCreate = q as unknown as Query;\n const { query, primaryKeys, foreignKeys } = state;\n\n interface NestedCreateItem {\n items: RecordUnknown[];\n values: RecordUnknown[];\n }\n\n interface NestedCreateItems {\n create?: NestedCreateItem;\n connect?: NestedCreateItem;\n connectOrCreate?: NestedCreateItem;\n }\n\n let nestedCreateItems: NestedCreateItems | undefined;\n\n items.forEach((item) => {\n const value = item[key] as NestedInsertOneItemCreate;\n const kind = value.create\n ? 'create'\n : value.connect\n ? 'connect'\n : 'connectOrCreate';\n\n if (kind) {\n const nestedCreateItem = ((nestedCreateItems ??= {})[kind] ??= {\n items: [],\n values: [],\n });\n nestedCreateItem.items.push(item);\n nestedCreateItem.values.push(value[kind] as RecordUnknown);\n\n if (kind !== 'connect') {\n for (const key of foreignKeys) {\n item[key] = new RawSql('');\n }\n }\n }\n });\n\n if (!nestedCreateItems) {\n return;\n }\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 { create, connect, connectOrCreate } = nestedCreateItems;\n if (create) {\n const selectPKeys = query.select(...primaryKeys);\n\n let createQuery: Query;\n if (queryForCreate.q.type === 'upsert') {\n const createWhereNotExists = new RawSql('');\n _onUpsertUpdate(queryForCreate, (as) => {\n createWhereNotExists._sql = `NOT EXISTS (SELECT 1 FROM \"${as}\")`;\n });\n\n const sourceQuery = _queryWhere(\n _queryTake(_querySelect(_clone(query.qb), [{}])),\n [createWhereNotExists] as never,\n );\n\n // Plain INSERT ... VALUES cannot render a WHERE guard, so upsert\n // nested create uses INSERT ... SELECT FROM a guarded one-row query.\n createQuery = _queryInsertManyFrom(\n selectPKeys as unknown as CreateSelf,\n sourceQuery as never,\n create.values,\n ) as unknown as Query;\n } else {\n createQuery = _queryInsertMany(\n selectPKeys as unknown as CreateSelf,\n create.values,\n ) as unknown as Query;\n }\n\n const setForeignKeys = (as: string) => {\n const count = create.items.length;\n foreignKeys.forEach((foreignKey, i) => {\n const primaryKey = primaryKeys[i];\n create.items.forEach((item, i) => {\n (item[foreignKey] as RawSql)._sql = selectCteColumnFromManySql(\n as,\n primaryKey,\n i,\n count,\n );\n });\n });\n };\n\n if (queryForCreate.q.type === 'upsert') {\n _prependWithOnUpsertCreate(queryForCreate, setForeignKeys, createQuery);\n } else {\n _prependWith(queryForCreate, setForeignKeys, createQuery);\n }\n }\n\n if (connect) {\n connect.values.forEach((value, itemI) => {\n const as = getFreeAlias(queryForCreate.q.withShapes, 'q');\n const prependWith =\n queryForCreate.q.type === 'upsert'\n ? _prependWithOnUpsertCreate\n : _prependWith;\n\n prependWith(\n queryForCreate,\n as,\n query.select(...primaryKeys).findBy(value),\n );\n\n foreignKeys.map((foreignKey, i) => {\n connect.items[itemI][foreignKey] = new RawSql(\n selectCteColumnMustExistSql(i, as, primaryKeys[i]),\n );\n });\n });\n }\n\n if (connectOrCreate) {\n connectOrCreate.values.forEach((value, itemI) => {\n const asFn = setForeignKeysFromCte(\n connectOrCreate.items[itemI],\n primaryKeys,\n foreignKeys,\n );\n\n const selectPKeys = query.select(...primaryKeys);\n\n const prependWith =\n queryForCreate.q.type === 'upsert'\n ? _prependWithOnUpsertCreate\n : _prependWith;\n\n prependWith(\n queryForCreate,\n asFn,\n _orCreate(\n _queryWhere(selectPKeys, [(value as { where: never }).where]),\n (value as { create: never }).create,\n ),\n );\n });\n }\n};\n","import { Query } from 'pqb';\nimport {\n _queryCreate,\n _queryDelete,\n _queryFindBy,\n _queryUpdate,\n _querySelect,\n _queryWhereIn,\n _queryUpsert,\n _appendQuery,\n _prependWith,\n _hookSelectColumns,\n noop,\n RawSql,\n RecordUnknown,\n CreateSelf,\n UpdateSelf,\n UpdateData,\n UpsertData,\n UpsertThis,\n isQueryReturnsAll,\n emptyArray,\n} from 'pqb/internal';\nimport {\n NestedUpdateOneItem,\n selectCteColumnsSql,\n setForeignKeysFromCte,\n} from '../common/utils';\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n len: number;\n on?: RecordUnknown;\n}\n\nexport type BelongsToNestedUpdate = (\n q: Query,\n update: RecordUnknown,\n params: NestedUpdateOneItem,\n) => void;\n\nexport const nestedUpdate = ({\n query,\n primaryKeys,\n foreignKeys,\n len,\n}: State) => {\n return ((self, update, params) => {\n if (params.create) {\n const createQuery = _querySelect(\n _queryCreate(\n query.clone() as unknown as CreateSelf,\n params.create,\n ) as unknown as Query,\n primaryKeys,\n );\n\n const asFn = setForeignKeysFromCte(update, primaryKeys, foreignKeys);\n\n _prependWith(self, asFn, createQuery);\n } else if (params.update) {\n let appendedAs: string | undefined;\n _hookSelectColumns(self, foreignKeys, (aliasedForeignKeys) => {\n selectIdsSql._sql = selectCteColumnsSql(\n appendedAs as string,\n aliasedForeignKeys,\n );\n });\n\n const selectIdsSql = new RawSql('');\n\n const updateQuery = _queryUpdate(\n _queryWhereIn(\n query.clone() as unknown as Query,\n true,\n primaryKeys,\n selectIdsSql,\n ) as unknown as UpdateSelf,\n params.update as never,\n ) as unknown as Query;\n\n // don't throw \"not found\" if it is not found for update\n updateQuery.q.returnType = 'value';\n\n _appendQuery(self, updateQuery, (as) => (appendedAs = as));\n } else if (params.upsert) {\n if (isQueryReturnsAll(self)) {\n throw new Error('`upsert` option is not allowed in a batch update');\n }\n\n const { relQuery } = relWithSelectIds(\n self,\n query,\n primaryKeys,\n foreignKeys,\n );\n\n const upsertQuery = _querySelect(\n _queryUpsert(\n relQuery,\n params.upsert as UpsertData<UpsertThis, UpdateData<UpdateSelf>>,\n ),\n primaryKeys,\n );\n\n const asFn = setForeignKeysFromCte(update, primaryKeys, foreignKeys);\n\n _prependWith(self, asFn, upsertQuery);\n } else if (params.delete) {\n _hookSelectColumns(self, foreignKeys, noop);\n\n disconnect(update, foreignKeys);\n\n const { selectIdsSql, relQuery } = relWithSelectIds(\n self,\n query,\n primaryKeys,\n foreignKeys,\n );\n\n self.q.and = self.q.or = undefined;\n\n _queryWhereIn(self, true, foreignKeys, selectIdsSql);\n\n const deleteQuery = _queryDelete(relQuery);\n // don't throw \"not found\" if it is not found for delete\n deleteQuery.q.returnType = 'value';\n\n _appendQuery(self, deleteQuery, noop);\n } else if (params.disconnect) {\n disconnect(update, foreignKeys);\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 asFn = setForeignKeysFromCte(\n update,\n loadPrimaryKeys,\n loadForeignKeys as string[],\n true,\n );\n\n _prependWith(\n self,\n asFn,\n _queryFindBy(query.select(...loadPrimaryKeys), params.set as never),\n );\n }\n }\n }) as BelongsToNestedUpdate;\n};\n\nconst disconnect = (update: RecordUnknown, foreignKeys: string[]) => {\n for (const foreignKey of foreignKeys) {\n update[foreignKey] = null;\n }\n};\n\nconst relWithSelectIds = (\n self: Query,\n rel: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n) => {\n const selectIdsQuery = makeSelectIdsQuery(self, foreignKeys);\n\n const selectIdsSql = new RawSql('');\n\n _prependWith(\n self,\n (as) => {\n selectIdsSql._sql = selectCteColumnsSql(as, foreignKeys);\n },\n selectIdsQuery,\n );\n\n return {\n selectIdsSql,\n relQuery: _queryWhereIn(rel.clone(), true, primaryKeys, selectIdsSql),\n };\n};\n\nconst makeSelectIdsQuery = (self: Query, foreignKeys: string[]) => {\n const selectIdsQuery = self.baseQuery.clone();\n selectIdsQuery.q.distinct = emptyArray;\n selectIdsQuery.q.select = foreignKeys;\n selectIdsQuery.q.and = self.q.and;\n selectIdsQuery.q.or = self.q.or;\n return selectIdsQuery;\n};\n","import { ORMTableInput } from '../../orm-table/legacy-table';\nimport { Query } from 'pqb';\nimport {\n _queryDefaults,\n _queryWhere,\n CreateData,\n CreateSelf,\n CreateMethodsNames,\n DeleteMethodsNames,\n getQueryAs,\n pushQueryOnForOuter,\n SelectableFromShape,\n setQueryObjectValueImmutable,\n UpdateData,\n UpdateSelf,\n VirtualColumn,\n WhereArg,\n TableData,\n ColumnSchemaConfig,\n getPrimaryKeys,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n ColumnsShape,\n Column,\n QueryHasWhere,\n internalSchemaConfig,\n CreateCtx,\n} from 'pqb/internal';\nimport {\n RelationConfigSelf,\n RelationData,\n RelationThunkBase,\n} from '../relations';\nimport { addAutoForeignKey, NestedUpdateOneItem } from '../common/utils';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport { BelongsToDataForCreate, belongsToCreate } from './belongs-to.create';\nimport { nestedUpdate, BelongsToNestedUpdate } from './belongs-to.update';\n\nexport { type BelongsToDataForCreate };\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 ORMTableInput = ORMTableInput,\n> {\n required?: boolean;\n columns: (keyof Columns)[];\n references: (keyof Related['columns']['shape'])[];\n foreignKey?: boolean | TableData.References.Options;\n on?: ColumnsShape.InputPartial<Related['columns']['shape']>;\n}\n\nexport type BelongsToParams<T extends RelationConfigSelf, FK extends string> = {\n [Name in FK]: T['columns']['shape'][Name]['__type'];\n};\n\nexport type BelongsToDefaultRequired<\n T extends RelationConfigSelf,\n Rel extends BelongsTo,\n Related,\n> = Related extends { softDelete: true }\n ? false\n : BelongsToDefaultRequiredFromColumns<T, Rel>;\n\ntype BelongsToDefaultRequiredFromColumns<\n T extends RelationConfigSelf,\n Rel extends BelongsTo,\n> =\n BelongsToColumnRequired<\n T['columns']['shape'][Rel['options']['columns'][number] & string]\n > extends true\n ? true\n : false;\n\ntype BelongsToColumnRequired<Column> = Column extends {\n data: { isNullable: true };\n}\n ? false\n : true;\n\nexport type BelongsToQuery<T extends Query, Name extends string> = {\n [P in keyof T]: P extends '__selectable'\n ? SelectableFromShape<T['shape'], Name>\n : P extends '__as'\n ? Name\n : P extends CreateMethodsNames | DeleteMethodsNames\n ? never\n : T[P];\n} & QueryHasWhere;\n\nexport interface BelongsToInfo<\n T extends RelationConfigSelf,\n FK extends string,\n Required,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: true;\n required: Required;\n query: Q;\n params: BelongsToParams<T, FK>;\n omitForeignKeyInCreate: FK;\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 | (Q extends Query.Pick.IsNotReadOnly\n ?\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | {\n create: CreateData<Q>;\n }\n : never);\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 | (Q extends Query.Pick.IsNotReadOnly\n ?\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 : never);\n}\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n len: number;\n on?: RecordUnknown;\n}\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: CreateSelf, ctx: CreateCtx, items: RecordUnknown[]) {\n belongsToCreate(this.key, this.state, q, ctx, items);\n }\n\n update(q: UpdateSelf, set: RecordUnknown) {\n const queryForUpdate = q as unknown as Query;\n queryForUpdate.q.wrapInTransaction = true;\n\n const data = set[this.key] as NestedUpdateOneItem;\n this.nestedUpdate(queryForUpdate, set, data);\n }\n}\n\nexport const getBelongsToRequired = (\n tableConfig: ORMTableInput,\n relatedTableConfig: ORMTableInput,\n relation: BelongsTo,\n) => {\n const { required } = relation.options;\n if (typeof required === 'boolean') return required;\n\n if (relatedTableConfig.softDelete) return false;\n\n return relation.options.columns.every((key) => {\n return !tableConfig.columns.shape[key as string].data.isNullable;\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 as unknown as CreateSelf, on);\n }\n\n const len = primaryKeys.length;\n const state: State = {\n query: query as Query.NotReadOnlyQuery,\n primaryKeys,\n foreignKeys,\n len,\n on,\n };\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(\n q,\n 'joinedShapes',\n baseAs,\n baseQuery.q.selectShape,\n );\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 internalSchemaConfig,\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","import { Query } from 'pqb';\nimport {\n _appendQuery,\n _appendQueryOnUpsertCreate,\n _clone,\n _hookSelectColumns,\n _queryInsertMany,\n _queryInsertManyFrom,\n _querySelect,\n _queryTake,\n _queryUpdate,\n _queryUpdateOrThrow,\n _queryUpsert,\n _queryWhere,\n CreateCtx,\n CreateSelf,\n prepareSubQueryForSql,\n RawSql,\n RecordUnknown,\n UpdateSelf,\n WhereArg,\n} from 'pqb/internal';\nimport {\n hasRelationHandleCreate,\n NestedInsertOneItem,\n NestedInsertOneItemConnectOrCreate,\n NestedInsertOneItemCreate,\n selectCteColumnFromManySql,\n} from '../common/utils';\n\nexport type HasOneNestedInsert = (\n query: Query,\n data: [selfData: RecordUnknown, relationData: NestedInsertOneItem][],\n) => Promise<void>;\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport const nestedInsert = ({\n query,\n primaryKeys,\n foreignKeys,\n}: State): HasOneNestedInsert => {\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 primaryKeys.forEach((primaryKey, i) => {\n data[foreignKeys[i]] = selfData[primaryKey];\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\nexport const hasOneCreate = (\n key: string,\n state: State,\n nestedInsertFn: HasOneNestedInsert,\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n) => {\n const querySelf = self as unknown as Query;\n if (count <= querySelf.qb.internal.nestedCreateBatchMax) {\n interface NestedCreateItem {\n indexes: number[];\n items: RecordUnknown[];\n values: RecordUnknown[];\n }\n\n interface NestedCreateItems {\n create?: NestedCreateItem;\n connect?: NestedCreateItem;\n connectOrCreate?: NestedCreateItem;\n }\n\n const { query: rel, primaryKeys, foreignKeys } = state;\n\n let nestedCreateItems: NestedCreateItems | undefined;\n\n items.forEach((item, i) => {\n const value = item[key] as NestedInsertOneItem;\n const kind = value.create\n ? 'create'\n : value.connect\n ? 'connect'\n : 'connectOrCreate';\n\n if (kind) {\n const nestedCreateItem = ((nestedCreateItems ??= {})[kind] ??= {\n indexes: [],\n items: [],\n values: [],\n });\n nestedCreateItem.indexes.push(rowIndexes[i]);\n nestedCreateItem.values.push(value[kind] as RecordUnknown);\n\n const data = value.create ? { ...value.create } : {};\n\n for (const key of foreignKeys) {\n data[key] = new RawSql('');\n }\n\n nestedCreateItem.items.push(data);\n }\n });\n\n if (!nestedCreateItems) {\n return;\n }\n\n let createAs: string | undefined;\n let createWhereExists: RawSql | undefined;\n let createSelectAs: RecordUnknown | undefined;\n let createAliasedPrimaryKeys: string[] | undefined;\n let upsertCreateAs: string | undefined;\n let connectAs: string | undefined;\n let connectOrCreateAs: string | undefined;\n\n // In upsert create, relation FKs point to the parent create CTE.\n // The CTE alias and selected parent PK aliases are provided by separate callbacks.\n const setUpsertCreatePlaceholders = () => {\n if (!upsertCreateAs || !createAliasedPrimaryKeys) return;\n\n const aliasedPrimaryKeys = createAliasedPrimaryKeys;\n\n if (createWhereExists) {\n createWhereExists._sql = `EXISTS (SELECT 1 FROM \"${upsertCreateAs}\")`;\n }\n\n if (createSelectAs) {\n foreignKeys.forEach((key, keyI) => {\n ((createSelectAs as RecordUnknown)[key] as RawSql)._sql =\n selectCteColumnFromManySql(\n upsertCreateAs as string,\n aliasedPrimaryKeys[keyI],\n 0,\n 1,\n );\n });\n }\n\n if (connect) {\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n for (let i = 0; i < connect.items.length; i++) {\n (connect.items[i][key] as RawSql)._sql = selectCteColumnFromManySql(\n upsertCreateAs as string,\n primaryKey,\n connect.indexes[i],\n count,\n );\n }\n });\n }\n\n if (connectOrCreate) {\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n for (let i = 0; i < connectOrCreate.items.length; i++) {\n (connectOrCreate.items[i][key] as RawSql)._sql =\n selectCteColumnFromManySql(\n upsertCreateAs as string,\n primaryKey,\n connectOrCreate.indexes[i],\n count,\n );\n }\n });\n }\n };\n\n _hookSelectColumns(querySelf, primaryKeys, (aliasedPrimaryKeys) => {\n createAliasedPrimaryKeys = aliasedPrimaryKeys;\n\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n\n if (create && createAs) {\n for (let i = 0; i < create.items.length; i++) {\n (create.items[i][key] as RawSql)._sql = selectCteColumnFromManySql(\n createAs,\n primaryKey,\n create.indexes[i],\n count,\n );\n }\n }\n\n if (connect && connectAs) {\n for (let i = 0; i < connect.items.length; i++) {\n (connect.items[i][key] as RawSql)._sql = selectCteColumnFromManySql(\n connectAs,\n primaryKey,\n connect.indexes[i],\n count,\n );\n }\n }\n\n if (connectOrCreate && connectOrCreateAs) {\n for (let i = 0; i < connectOrCreate.items.length; i++) {\n (connectOrCreate.items[i][key] as RawSql)._sql =\n selectCteColumnFromManySql(\n connectOrCreateAs,\n primaryKey,\n connectOrCreate.indexes[i],\n count,\n );\n }\n }\n });\n\n setUpsertCreatePlaceholders();\n });\n\n const { create, connect, connectOrCreate } = nestedCreateItems;\n\n if (create) {\n let query: Query;\n if (querySelf.q.type === 'upsert') {\n createWhereExists = new RawSql('');\n createSelectAs = {};\n for (const key of foreignKeys) {\n createSelectAs[key] = new RawSql('');\n }\n\n const sourceQuery = _queryWhere(\n _queryTake(_querySelect(_clone(rel.qb), [createSelectAs as never])),\n [createWhereExists] as never,\n );\n\n // Plain INSERT ... VALUES cannot render a WHERE guard, so upsert\n // nested create uses INSERT ... SELECT FROM a guarded one-row query.\n query = _queryInsertManyFrom(\n _clone(rel) as unknown as CreateSelf,\n sourceQuery as never,\n create.items as never,\n ) as unknown as Query;\n } else {\n query = _queryInsertMany(\n _clone(rel) as unknown as CreateSelf,\n create.items as never,\n ) as unknown as Query;\n }\n\n if (querySelf.q.type === 'upsert') {\n _appendQueryOnUpsertCreate(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n });\n } else {\n _appendQuery(querySelf, query, (as) => (createAs = as));\n }\n }\n\n if (connect) {\n connect.values.forEach((value, i) => {\n const connectWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n\n const query = _queryUpdateOrThrow(\n rel.where(value as never) as unknown as UpdateSelf,\n connect.items[i] as never,\n ) as unknown as Query;\n\n if (connectWhereExists) {\n // Only run nested connect when the parent upsert actually created a row.\n _queryWhere(query, [connectWhereExists] as never);\n }\n\n query.q.ensureCount = 1;\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n connectAs = as;\n if (connectWhereExists) {\n connectWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n });\n }\n\n if (connectOrCreate) {\n connectOrCreate.values.forEach((value, i) => {\n const foreignKeyValues = connectOrCreate.items[i];\n const connectOrCreateWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n const connectOrCreateSelectAs: RecordUnknown = {};\n if (connectOrCreateWhereExists) {\n for (const key of foreignKeys) {\n const value = foreignKeyValues[key] as RawSql;\n // These RawSql placeholders are selected by the insertFrom\n // source query, so select parsing needs the target column type.\n value.result = {\n value: rel.qb.shape[key],\n };\n connectOrCreateSelectAs[key] = value;\n }\n }\n\n const query = _queryUpsert(rel.where(value.where as never) as Query, {\n update: foreignKeyValues,\n create: {\n ...(value.create as RecordUnknown),\n ...foreignKeyValues,\n },\n });\n\n if (connectOrCreateWhereExists) {\n // Guard the update half of child upsert with the parent create CTE.\n _queryWhere(query, [connectOrCreateWhereExists] as never);\n\n // The insert half of child upsert ignores the update query WHERE.\n // Move relation FKs into an insertFrom source that becomes empty\n // when the parent create CTE is empty.\n const guardQuery = _queryWhere(\n _queryTake(\n _querySelect(_clone(rel.qb), [{ one: new RawSql('1') }]),\n ),\n [connectOrCreateWhereExists] as never,\n );\n\n const sourceQuery = _querySelect(\n (_clone(rel.qb) as Query).from(guardQuery as never),\n [connectOrCreateSelectAs as never],\n );\n\n const q = query.q;\n const columns = q.columns || [];\n const foreignKeysSet = new Set(foreignKeys);\n // FK columns now come from sourceQuery; keep user-provided insert\n // columns after them so INSERT column order matches SELECT output.\n q.columns = [\n ...foreignKeys,\n ...columns.filter((column) => !foreignKeysSet.has(column)),\n ];\n // Drop FK values from VALUES; their values are selected from\n // sourceQuery, while the remaining row data still comes from VALUES.\n q.values = q.values.map((row) =>\n row.filter((_, i) => !foreignKeysSet.has(columns[i])),\n );\n // Tells insert SQL how many leading columns are produced by\n // sourceQuery before appending the remaining VALUES columns.\n q.queryColumnsCount = foreignKeys.length;\n q.insertFrom = prepareSubQueryForSql(query, sourceQuery as never);\n }\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n connectOrCreateAs = as;\n if (connectOrCreateWhereExists) {\n connectOrCreateWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n });\n }\n } else {\n hasRelationHandleCreate(\n querySelf,\n ctx,\n items,\n rowIndexes,\n key,\n state.primaryKeys,\n nestedInsertFn,\n );\n }\n};\n","import { Query } from 'pqb';\nimport { _queryWhere, RecordUnknown, RelationJoinQuery } from 'pqb/internal';\nimport {\n getThroughRelation,\n getSourceRelation,\n joinHasThrough,\n} from '../common/utils';\nimport { RelationThroughOptions } from '../common/options';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport { RelationData } from '../relations';\n\nexport const hasOneThrough = (\n table: Query,\n options: RelationThroughOptions & { required?: boolean },\n relationName: string,\n query: Query,\n relPKeys: string[],\n): RelationData => {\n const { through, source, on } = options;\n if (on) _queryWhere(query, [on]);\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = (sourceRelation.query as Query).as(relationName);\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","import {\n _appendQuery,\n _clone,\n _queryDelete,\n _queryInsert,\n _queryUpdate,\n _queryUpsert,\n _queryWhere,\n CreateSelf,\n noop,\n RecordUnknown,\n UpdateSelf,\n} from 'pqb/internal';\nimport { Query } from 'pqb';\nimport {\n makeNestedUpdateRelationIds,\n makeNestedUpdateUpsertData,\n NestedUpdateOneItem,\n throwIfQueryReturnsAllForNestedUpdate,\n} from '../common/utils';\nimport { State } from './has-one';\n\nexport type HasOneNestedUpdate = (\n query: Query,\n data: RecordUnknown[],\n relationData: NestedUpdateOneItem,\n) => Promise<void>;\n\nexport const hasOneUpdate = (\n key: string,\n state: State,\n self: UpdateSelf,\n set: RecordUnknown,\n): void => {\n const querySelf = self as unknown as Query;\n const params = set[key] as NestedUpdateOneItem;\n throwIfQueryReturnsAllForNestedUpdate(querySelf, params);\n\n const { primaryKeys, foreignKeys, query: relQuery } = state;\n if (\n params.create ||\n params.update ||\n params.upsert ||\n params.disconnect ||\n params.set ||\n params.delete\n ) {\n const ids = makeNestedUpdateRelationIds(\n querySelf,\n relQuery,\n primaryKeys,\n foreignKeys,\n );\n\n const setNulls: RecordUnknown = {};\n for (const foreignKey of foreignKeys) {\n setNulls[foreignKey] = null;\n }\n\n const nullifyOrDeleteQuery = (params.update\n ? _queryUpdate(\n ids.existingRelQuery as unknown as UpdateSelf,\n params.update as never,\n )\n : params.upsert\n ? _queryUpsert(\n ids.existingRelQuery,\n makeNestedUpdateUpsertData(params.upsert, ids.setIds),\n )\n : params.delete\n ? _queryDelete(ids.existingRelQuery)\n : _queryUpdate(\n ids.existingRelQuery as unknown as UpdateSelf,\n setNulls as never,\n )) as unknown as Query;\n\n nullifyOrDeleteQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, nullifyOrDeleteQuery, ids.setAppendedAs);\n\n if (params.create) {\n const createQuery = _queryInsert(\n _clone(relQuery) as unknown as CreateSelf,\n {\n ...params.create,\n ...ids.setIds,\n },\n ) as unknown as Query;\n\n _appendQuery(querySelf, createQuery, noop);\n } else if (params.set) {\n const setQuery = _queryUpdate(\n _queryWhere(_clone(relQuery), [\n params.set as never,\n ]) as unknown as UpdateSelf,\n ids.setIds as never,\n ) as unknown as Query;\n setQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, setQuery, noop);\n }\n }\n};\n","import { Query } from 'pqb';\nimport { Column, internalSchemaConfig } from 'pqb/internal';\nimport {\n _queryDefaults,\n _queryWhere,\n ColumnSchemaConfig,\n CreateCtx,\n CreateData,\n CreateSelf,\n CreateManyMethodsNames,\n CreateMethodsNames,\n EmptyObject,\n getPrimaryKeys,\n PickQueryQ,\n prepareSubQueryForSql,\n QueryHasWhere,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n SelectableFromShape,\n UpdateSelf,\n UpdateData,\n VirtualColumn,\n WhereArg,\n} from 'pqb/internal';\nimport { ORMTableInput } from '../../orm-table/legacy-table';\nimport {\n RelationData,\n RelationThunkBase,\n RelationToOneDataForCreate,\n RelationConfigParams,\n RelationConfigSelf,\n} from '../relations';\nimport { addAutoForeignKey, joinHasRelation } from '../common/utils';\nimport { RelationRefsOptions, RelationThroughOptions } from '../common/options';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport {\n HasOneNestedInsert,\n hasOneCreate,\n nestedInsert,\n} from './has-one.create';\nimport { hasOneThrough } from './has-one.through';\nimport { hasOneUpdate } from './has-one.update';\n\nexport interface HasOne extends RelationThunkBase {\n type: 'hasOne';\n options: HasOneOptions;\n}\n\ninterface RelationHasOneThroughOptions<\n Through extends string,\n> extends RelationThroughOptions<Through> {\n required?: boolean;\n}\n\nexport type HasOneOptions<\n Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit,\n Related extends ORMTableInput = ORMTableInput,\n Through extends string = string,\n> =\n | RelationRefsOptions<keyof Columns, Related['columns']['shape']>\n | RelationHasOneThroughOptions<Through>;\n\nexport type HasOneParams<\n T extends RelationConfigSelf,\n Options,\n> = Options extends RelationRefsOptions\n ? {\n [Name in Options['columns'][number]]: T['columns']['shape'][Name]['__type'];\n }\n : Options extends RelationThroughOptions\n ? RelationConfigParams<T, T['relations'][Options['through']]>\n : never;\n\nexport type HasOneQueryThrough<\n Name extends string,\n TableQuery extends Query,\n> = {\n [K in keyof TableQuery]: K extends '__selectable'\n ? SelectableFromShape<TableQuery['shape'], Name>\n : K extends '__as'\n ? Name\n : K extends CreateMethodsNames\n ? never\n : TableQuery[K];\n} & QueryHasWhere;\n\nexport type HasOneQuery<\n T extends RelationConfigSelf,\n Name extends string,\n TableQuery extends Query,\n> = T['relations'][Name]['options'] extends RelationRefsOptions\n ? {\n [K in keyof TableQuery]: K extends '__defaults'\n ? {\n [K in\n | keyof TableQuery['__defaults']\n | T['relations'][Name]['options']['references'][number]]: true;\n }\n : K extends '__selectable'\n ? SelectableFromShape<TableQuery['shape'], Name>\n : K extends '__as'\n ? Name\n : K extends CreateManyMethodsNames\n ? never\n : TableQuery[K];\n } & QueryHasWhere\n : HasOneQueryThrough<Name, TableQuery>;\n\nexport interface HasOneInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends HasOne,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: true;\n required: Rel['options']['required'];\n query: Q;\n params: HasOneParams<T, Rel['options']>;\n omitForeignKeyInCreate: never;\n dataForCreate: {\n [K in Name]?: Q extends Query.Pick.IsNotReadOnly\n ? Rel['options'] extends RelationThroughOptions\n ? EmptyObject\n : RelationToOneDataForCreate<{\n nestedCreateQuery: CreateData<Q>;\n table: Q;\n }>\n : never;\n };\n // `hasOne` relation data available for update. It supports:\n // - `disconnect` to nullify a foreign key of the related record\n // - `delete` to delete the related record\n // - `update` to update the related record\n dataForUpdate: Q extends Query.Pick.IsNotReadOnly\n ? { disconnect: boolean } | { delete: boolean } | { update: UpdateData<Q> }\n : never;\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: Q extends Query.Pick.IsNotReadOnly\n ?\n | { disconnect: boolean }\n | { set: WhereArg<Q> }\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | {\n upsert: {\n update: UpdateData<Q>;\n create: CreateData<Q> | (() => CreateData<Q>);\n };\n }\n | {\n create: CreateData<Q>;\n }\n : never;\n}\n\nexport interface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport type { HasOneNestedInsert } from './has-one.create';\nexport type { HasOneNestedUpdate } from './has-one.update';\n\nclass HasOneVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasOneNestedInsert;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n }\n\n create(\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n ) {\n hasOneCreate(\n this.key,\n this.state,\n this.nestedInsert,\n self,\n ctx,\n items,\n rowIndexes,\n count,\n );\n }\n\n update(self: UpdateSelf, set: RecordUnknown) {\n hasOneUpdate(this.key, this.state, self, set);\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 return hasOneThrough(\n table,\n relation.options,\n relationName,\n query,\n relPKeys,\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 as unknown as CreateSelf, on);\n }\n\n addAutoForeignKey(\n tableConfig,\n query,\n table,\n primaryKeys,\n foreignKeys,\n relation.options,\n );\n\n const state: State = {\n query: query as Query.NotReadOnlyQuery,\n primaryKeys,\n foreignKeys,\n on,\n };\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(\n query.where(values as never) as unknown as CreateSelf,\n {\n ...on,\n ...values,\n },\n ) as unknown as Query;\n },\n virtualColumn: new HasOneVirtualColumn(\n internalSchemaConfig,\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","import { OrchidOrmInternalError, Query } from 'pqb';\nimport {\n MaybeArray,\n objectHasValues,\n PickQuerySelectableRelations,\n RecordUnknown,\n toArray,\n WhereArg,\n _appendQuery,\n _queryDelete,\n _queryUpdate,\n _queryUpsert,\n UpdateSelf,\n} from 'pqb/internal';\nimport {\n hasRelationHandleUpdate,\n makeNestedUpdateRelationIds,\n makeNestedUpdateUpsertData,\n NestedUpdateManyItems,\n throwIfQueryReturnsAllForNestedUpdate,\n} from '../common/utils';\n\nexport type HasManyNestedUpdate = (\n query: Query,\n data: RecordUnknown[],\n relationData: NestedUpdateManyItems,\n) => Promise<void>;\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nconst getWhereForNestedUpdate = (\n t: Query,\n data: RecordUnknown[],\n params: MaybeArray<WhereArg<PickQuerySelectableRelations>> | undefined,\n primaryKeys: string[],\n foreignKeys: string[],\n): 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\nexport const nestedUpdate = ({\n query: relQuery,\n primaryKeys,\n foreignKeys,\n}: State) => {\n const len = primaryKeys.length;\n\n return (async (_, data, params) => {\n const t = relQuery.clone();\n\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 as Query.NotReadOnlyQuery).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 relQuery,\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 unknown as UpdateSelf,\n obj as never,\n )) as unknown as number;\n\n if (count < relatedWheres.length) {\n throw new OrchidOrmInternalError(\n relQuery,\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(\n queryToDisconnect as unknown as UpdateSelf,\n obj as never,\n );\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) as unknown as UpdateSelf,\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(\n q as unknown as UpdateSelf,\n params.update.data as never,\n );\n }\n }\n }) as HasManyNestedUpdate;\n};\n\nexport const hasManyUpdate = (\n key: string,\n state: State,\n nestedUpdateFn: HasManyNestedUpdate,\n self: UpdateSelf,\n set: RecordUnknown,\n) => {\n const querySelf = self as unknown as Query;\n const params = set[key] as NestedUpdateManyItems;\n throwIfQueryReturnsAllForNestedUpdate(querySelf, params);\n\n hasRelationHandleUpdate(\n querySelf,\n set,\n key,\n state.primaryKeys,\n nestedUpdateFn,\n );\n\n if (params.upsert) {\n const { primaryKeys, foreignKeys, query: relQuery } = state;\n\n const ids = makeNestedUpdateRelationIds(\n querySelf,\n relQuery,\n primaryKeys,\n foreignKeys,\n );\n\n const appendedQuery = _queryUpsert(\n ids.existingRelQuery,\n makeNestedUpdateUpsertData(params.upsert, ids.setIds),\n ) as unknown as Query;\n\n appendedQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, appendedQuery, ids.setAppendedAs);\n }\n};\n","import { Query } from 'pqb';\nimport { RecordUnknown, RelationJoinQuery, _queryWhere } from 'pqb/internal';\nimport {\n getThroughRelation,\n getSourceRelation,\n joinHasThrough,\n} from '../common/utils';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport { RelationData } from '../relations';\nimport { HasMany } from './has-many';\n\ninterface ThroughRelationState {\n table: Query;\n query: Query;\n relation: HasMany;\n relationName: string;\n relPKeys: string[];\n}\n\nexport const makeHasManyThroughMethod = ({\n table,\n query,\n relation,\n relationName,\n relPKeys,\n}: ThroughRelationState): RelationData | undefined => {\n if (!('through' in relation.options)) {\n return undefined;\n }\n\n const { through, source, on } = relation.options;\n if (on) _queryWhere(query, [on]);\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = (sourceRelation.query as Query).as(relationName);\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","import { Query } from 'pqb';\nimport {\n _appendQuery,\n _appendQueryOnUpsertCreate,\n _clone,\n _hookSelectColumns,\n _queryCreateMany,\n _queryInsertMany,\n _queryInsertManyFrom,\n _querySelect,\n _queryTake,\n _queryUpdate,\n _queryUpdateOrThrow,\n _queryUpsert,\n _queryWhere,\n CreateCtx,\n CreateSelf,\n prepareSubQueryForSql,\n RawSql,\n RecordUnknown,\n UpdateSelf,\n WhereArg,\n} from 'pqb/internal';\nimport {\n hasRelationHandleCreate,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n NestedInsertOneItemConnectOrCreate,\n selectCteColumnFromManySql,\n} from '../common/utils';\n\nexport type HasManyNestedInsert = (\n query: Query,\n data: [selfData: RecordUnknown, relationData: NestedInsertManyItems][],\n) => Promise<void>;\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport const 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[] }) as unknown as UpdateSelf,\n obj as never,\n ) as unknown as Query;\n }\n\n await Promise.all(items);\n }\n\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n items.push(item);\n }\n }\n\n let connected: number[];\n if (items.length) {\n const queries: Query[] = [];\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, { connectOrCreate }] = items[i] as [\n 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 unknown as UpdateSelf,\n obj as never,\n ) as unknown as Query,\n );\n }\n }\n\n connected = (await Promise.all(queries)) as number[];\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n const length = item[1].connectOrCreate.length;\n connectedI += length;\n for (let i = length; i > 0; i--) {\n if (connected[connectedI - i] === 0) {\n items.push(item);\n break;\n }\n }\n } else if (item[1].create) {\n items.push(item);\n }\n }\n\n connectedI = 0;\n if (items.length) {\n const records: 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\nexport const hasManyCreate = (\n key: string,\n state: State,\n nestedInsertFn: HasManyNestedInsert,\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n) => {\n const querySelf = self as unknown as Query;\n if (count <= querySelf.qb.internal.nestedCreateBatchMax) {\n interface NestedCreateItem {\n indexes: number[];\n items: RecordUnknown[];\n values: unknown[][];\n }\n\n interface NestedCreateItems {\n create?: {\n indexes: number[];\n items: RecordUnknown[][];\n };\n connect?: NestedCreateItem;\n connectOrCreate?: NestedCreateItem;\n }\n\n const { query: rel, primaryKeys, foreignKeys } = state;\n\n let nestedCreateItems: NestedCreateItems | undefined;\n\n items.forEach((item, i) => {\n const value = item[key] as NestedInsertManyItems;\n\n if (value.create?.length) {\n const nestedCreateItem = ((nestedCreateItems ??= {}).create ??= {\n indexes: [],\n items: [],\n });\n nestedCreateItem.indexes.push(rowIndexes[i]);\n\n const data = value.create.map((obj) => {\n const data = { ...obj };\n for (const key of foreignKeys) {\n data[key] = new RawSql('');\n }\n return data;\n });\n\n nestedCreateItem.items.push(data);\n } else {\n const kind = value.connect?.length\n ? 'connect'\n : value.connectOrCreate?.length\n ? 'connectOrCreate'\n : undefined;\n\n if (kind) {\n const nestedCreateItem = ((nestedCreateItems ??= {})[kind] ??= {\n indexes: [],\n items: [],\n values: [],\n });\n nestedCreateItem.indexes.push(rowIndexes[i]);\n nestedCreateItem.values.push(value[kind] as unknown[]);\n\n const data: RecordUnknown = {};\n for (const key of foreignKeys) {\n data[key] = new RawSql('');\n }\n nestedCreateItem.items.push(data);\n }\n }\n });\n\n if (!nestedCreateItems) {\n return;\n }\n\n let createAs: string | undefined;\n let createWhereExists: RawSql | undefined;\n let createSelectAs: RecordUnknown | undefined;\n let createAliasedPrimaryKeys: string[] | undefined;\n let upsertCreateAs: string | undefined;\n let connectAs: string | undefined;\n let connectOrCreateAs: string | undefined;\n\n // In upsert create, relation FKs point to the parent create CTE.\n // The CTE alias and selected parent PK aliases are provided by separate callbacks.\n const setUpsertCreatePlaceholders = () => {\n if (!upsertCreateAs || !createAliasedPrimaryKeys) return;\n\n const aliasedPrimaryKeys = createAliasedPrimaryKeys;\n\n if (createWhereExists) {\n createWhereExists._sql = `EXISTS (SELECT 1 FROM \"${upsertCreateAs}\")`;\n }\n\n if (createSelectAs) {\n foreignKeys.forEach((key, keyI) => {\n ((createSelectAs as RecordUnknown)[key] as RawSql)._sql =\n selectCteColumnFromManySql(\n upsertCreateAs as string,\n aliasedPrimaryKeys[keyI],\n 0,\n 1,\n );\n });\n }\n\n if (connect) {\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n for (let i = 0; i < connect.items.length; i++) {\n (connect.items[i][key] as RawSql)._sql = selectCteColumnFromManySql(\n upsertCreateAs as string,\n primaryKey,\n connect.indexes[i],\n count,\n );\n }\n });\n }\n\n if (connectOrCreate) {\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n for (let i = 0; i < connectOrCreate.items.length; i++) {\n (connectOrCreate.items[i][key] as RawSql)._sql =\n selectCteColumnFromManySql(\n upsertCreateAs as string,\n primaryKey,\n connectOrCreate.indexes[i],\n count,\n );\n }\n });\n }\n };\n\n _hookSelectColumns(querySelf, primaryKeys, (aliasedPrimaryKeys) => {\n createAliasedPrimaryKeys = aliasedPrimaryKeys;\n\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n\n if (create && createAs) {\n for (let i = 0; i < create.items.length; i++) {\n const sql = selectCteColumnFromManySql(\n createAs,\n primaryKey,\n create.indexes[i],\n count,\n );\n\n for (const item of create.items[i]) {\n (item[key] as RawSql)._sql = sql;\n }\n }\n }\n\n if (connect && connectAs) {\n for (let i = 0; i < connect.items.length; i++) {\n (connect.items[i][key] as RawSql)._sql = selectCteColumnFromManySql(\n connectAs,\n primaryKey,\n connect.indexes[i],\n count,\n );\n }\n }\n\n if (connectOrCreate && connectOrCreateAs) {\n for (let i = 0; i < connectOrCreate.items.length; i++) {\n (connectOrCreate.items[i][key] as RawSql)._sql =\n selectCteColumnFromManySql(\n connectOrCreateAs,\n primaryKey,\n connectOrCreate.indexes[i],\n count,\n );\n }\n }\n });\n\n setUpsertCreatePlaceholders();\n });\n\n const { create, connect, connectOrCreate } = nestedCreateItems;\n\n if (create) {\n let query: Query;\n if (querySelf.q.type === 'upsert') {\n createWhereExists = new RawSql('');\n createSelectAs = {};\n for (const key of foreignKeys) {\n createSelectAs[key] = new RawSql('');\n }\n\n const sourceQuery = _queryWhere(\n _queryTake(_querySelect(_clone(rel.qb), [createSelectAs as never])),\n [createWhereExists] as never,\n );\n\n // Plain INSERT ... VALUES cannot render a WHERE guard, so upsert\n // nested create uses INSERT ... SELECT FROM a guarded one-row query.\n query = _queryInsertManyFrom(\n _clone(rel) as unknown as CreateSelf,\n sourceQuery as never,\n create.items.flat() as never,\n ) as unknown as Query;\n } else {\n query = _queryInsertMany(\n _clone(rel) as unknown as CreateSelf,\n create.items.flat() as never,\n ) as unknown as Query;\n }\n\n if (querySelf.q.type === 'upsert') {\n _appendQueryOnUpsertCreate(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n });\n } else {\n _appendQuery(querySelf, query, (as) => (createAs = as));\n }\n }\n\n if (connect) {\n connect.values.forEach((value, i) => {\n const connectWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n\n const query = _queryUpdateOrThrow(\n rel.whereOneOf(...(value as never[])) as never,\n connect.items[i] as never,\n ) as Query;\n\n if (connectWhereExists) {\n // Only run nested connect when the parent upsert actually created a row.\n _queryWhere(query, [connectWhereExists] as never);\n }\n\n query.q.ensureCount = value.length;\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n connectAs = as;\n if (connectWhereExists) {\n connectWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n });\n }\n\n if (connectOrCreate) {\n connectOrCreate.values.forEach((array, i) => {\n const foreignKeyValues = connectOrCreate.items[i];\n for (const value of array as NestedInsertOneItemConnectOrCreate[]) {\n const connectOrCreateWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n const connectOrCreateSelectAs: RecordUnknown = {};\n if (connectOrCreateWhereExists) {\n for (const key of foreignKeys) {\n const value = foreignKeyValues[key] as RawSql;\n // These RawSql placeholders are selected by the insertFrom\n // source query, so select parsing needs the target column type.\n value.result = {\n value: rel.qb.shape[key],\n };\n connectOrCreateSelectAs[key] = value;\n }\n }\n\n const query = _queryUpsert(rel.where(value.where) as never, {\n update: foreignKeyValues,\n create: {\n ...value.create,\n ...foreignKeyValues,\n },\n });\n\n if (connectOrCreateWhereExists) {\n // Guard the update half of child upsert with the parent create CTE.\n _queryWhere(query, [connectOrCreateWhereExists] as never);\n\n // The insert half of child upsert ignores the update query WHERE.\n // Move relation FKs into an insertFrom source that becomes empty\n // when the parent create CTE is empty.\n const guardQuery = _queryWhere(\n _queryTake(\n _querySelect(_clone(rel.qb), [{ one: new RawSql('1') }]),\n ),\n [connectOrCreateWhereExists] as never,\n );\n\n const sourceQuery = _querySelect(\n (_clone(rel.qb) as Query).from(guardQuery as never),\n [connectOrCreateSelectAs as never],\n );\n\n const q = query.q;\n const columns = q.columns || [];\n const foreignKeysSet = new Set(foreignKeys);\n // FK columns now come from sourceQuery; keep user-provided insert\n // columns after them so INSERT column order matches SELECT output.\n q.columns = [\n ...foreignKeys,\n ...columns.filter((column) => !foreignKeysSet.has(column)),\n ];\n // Drop FK values from VALUES; their values are selected from\n // sourceQuery, while the remaining row data still comes from VALUES.\n q.values = q.values.map((row) =>\n row.filter((_, i) => !foreignKeysSet.has(columns[i])),\n );\n // Tells insert SQL how many leading columns are produced by\n // sourceQuery before appending the remaining VALUES columns.\n q.queryColumnsCount = foreignKeys.length;\n q.insertFrom = prepareSubQueryForSql(query, sourceQuery as never);\n }\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n connectOrCreateAs = as;\n if (connectOrCreateWhereExists) {\n connectOrCreateWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n }\n });\n }\n } else {\n hasRelationHandleCreate(\n querySelf,\n ctx,\n items,\n rowIndexes,\n key,\n state.primaryKeys,\n nestedInsertFn,\n );\n }\n};\n","import {\n RelationData,\n RelationThunkBase,\n RelationConfigSelf,\n} from '../relations';\nimport { Query } from 'pqb';\nimport {\n CreateData,\n WhereArg,\n VirtualColumn,\n CreateCtx,\n CreateSelf,\n UpdateData,\n UpdateSelf,\n _queryDefaults,\n _queryUpdate,\n PickQueryQ,\n _queryWhere,\n SelectableFromShape,\n ColumnSchemaConfig,\n getPrimaryKeys,\n MaybeArray,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n prepareSubQueryForSql,\n QueryHasWhere,\n internalSchemaConfig,\n} from 'pqb/internal';\nimport { addAutoForeignKey, joinHasRelation } from '../common/utils';\nimport {\n HasManyNestedUpdate,\n hasManyUpdate,\n nestedUpdate,\n} from './has-many.update';\nimport { makeHasManyThroughMethod } from './has-many.through';\n\nexport type { HasManyNestedUpdate } from './has-many.update';\nimport { RelationRefsOptions, RelationThroughOptions } from '../common/options';\nimport {\n HasOneOptions,\n HasOneParams,\n HasOneQueryThrough,\n} from '../has-one/has-one';\nimport { ORMTableInput } from '../../orm-table/legacy-table';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport {\n HasManyNestedInsert,\n nestedInsert,\n hasManyCreate,\n} from './has-many.create';\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 RelationRefsOptions\n ? {\n [K in keyof TableQuery]: K extends '__defaults'\n ? {\n [K in\n | keyof TableQuery['__defaults']\n | T['relations'][Name]['options']['references'][number]]: true;\n }\n : K extends '__selectable'\n ? SelectableFromShape<TableQuery['shape'], Name>\n : K extends '__as'\n ? Name\n : TableQuery[K];\n } & QueryHasWhere\n : HasOneQueryThrough<Name, TableQuery>;\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['options']>;\n omitForeignKeyInCreate: never;\n dataForCreate: {\n [K in Name]?: Q extends Query.Pick.IsNotReadOnly\n ? Rel['options'] extends RelationThroughOptions\n ? never\n : {\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 : never;\n };\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: Q extends Query.Pick.IsNotReadOnly\n ? {\n disconnect?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: {\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n };\n }\n : never;\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: Q extends Query.Pick.IsNotReadOnly\n ? {\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<Q>[];\n upsert?: {\n findBy: Q['internal']['uniqueColumns'];\n update: UpdateData<Q>;\n create?: CreateData<Q> | (() => CreateData<Q>);\n };\n }\n : never;\n}\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nclass HasManyVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasManyNestedInsert;\n private readonly nestedUpdate: HasManyNestedUpdate;\n private readonly setNulls: RecordUnknown;\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 this.setNulls = {};\n for (const foreignKey of state.foreignKeys) {\n this.setNulls[foreignKey] = null;\n }\n }\n\n create(\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n ) {\n hasManyCreate(\n this.key,\n this.state,\n this.nestedInsert,\n self,\n ctx,\n items,\n rowIndexes,\n count,\n );\n }\n\n update(self: UpdateSelf, set: RecordUnknown) {\n hasManyUpdate(this.key, this.state, this.nestedUpdate, self, set);\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 const throughResult = makeHasManyThroughMethod({\n table,\n query,\n relation,\n relationName,\n relPKeys,\n });\n if (throughResult) return throughResult;\n\n // After through check, we know options has columns/references\n const opts = relation.options as RelationRefsOptions;\n const primaryKeys = opts.columns as string[];\n const foreignKeys = opts.references as string[];\n const { on } = opts;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query as unknown as CreateSelf, on);\n }\n\n addAutoForeignKey(tableConfig, query, table, primaryKeys, foreignKeys, opts);\n\n const state: State = {\n query: query as Query.NotReadOnlyQuery,\n primaryKeys,\n foreignKeys,\n on,\n };\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(\n query.where(values as never) as unknown as CreateSelf,\n {\n ...on,\n ...values,\n },\n ) as unknown as Query;\n },\n virtualColumn: new HasManyVirtualColumn(\n internalSchemaConfig,\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","import { Query } from 'pqb';\nimport {\n _queryFindBy,\n _queryFindByOptional,\n _queryCreateMany,\n RecordUnknown,\n} from 'pqb/internal';\nimport {\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n} from '../common/utils';\nimport { HasManyNestedInsert } from '../has-many/has-many.create';\nimport { State } from './has-and-belongs-to-many';\n\nexport const 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 as Query.NotReadOnlyQuery).insertMany(records);\n }) as HasManyNestedInsert;\n};\n","import { OrchidOrmInternalError, Query } from 'pqb';\nimport {\n _queryCreateMany,\n _queryDelete,\n _queryJoinOn,\n _queryRows,\n _querySelect,\n _queryUpdate,\n _queryUpsert,\n _queryWhere,\n _queryWhereExists,\n _queryWhereIn,\n _appendQuery,\n _appendQueryOnUpsertCreate,\n _clone,\n _hookSelectColumns,\n MaybeArray,\n objectHasValues,\n pick,\n RawSql,\n RecordUnknown,\n toArray,\n UpdateSelf,\n WhereArg,\n} from 'pqb/internal';\nimport { NestedUpdateManyItems } from '../common/utils';\nimport { HasManyNestedUpdate } from '../has-many/has-many';\nimport { State } from './has-and-belongs-to-many';\n\nconst selectCteColumnsSql = (cteAs: string, columns: string[]) =>\n `(SELECT ${columns.map((c) => `\"${cteAs}\".\"${c}\"`).join(', ')} FROM \"${cteAs}\")`;\n\nconst selectCteColumnSql = (cteAs: string, column: string) =>\n `(SELECT \"${cteAs}\".\"${column}\" FROM \"${cteAs}\")`;\n\nconst conditionsToWhereArg = (\n conditions: MaybeArray<WhereArg<Query>>,\n): WhereArg<Query> =>\n Array.isArray(conditions) ? { OR: conditions } : conditions;\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 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 as Query.NotReadOnlyQuery).insertMany(records);\n};\n\nexport const nestedUpdateUpsert = (\n querySelf: Query,\n state: State,\n upsert: NonNullable<NestedUpdateManyItems['upsert']>,\n) => {\n const parentIdsSql = new RawSql('');\n const parentValues: RawSql[] = state.foreignKeys.map(() => new RawSql(''));\n const relatedIdsSql = new RawSql('');\n const relatedValues = state.throughPrimaryKeys.map(() => new RawSql(''));\n\n let parentAs: string | undefined;\n _hookSelectColumns(querySelf, state.primaryKeys, (aliasedPrimaryKeys) => {\n parentIdsSql._sql = selectCteColumnsSql(\n parentAs as string,\n aliasedPrimaryKeys,\n );\n\n for (let i = 0; i < state.foreignKeys.length; i++) {\n parentValues[i]._sql = selectCteColumnSql(\n parentAs as string,\n aliasedPrimaryKeys[i],\n );\n }\n });\n\n const existingRelQuery = _queryWhereExists(\n _queryWhere(_clone(state.relatedTableQuery), [\n upsert.findBy as unknown as WhereArg<Query>,\n ]),\n state.joinTableQuery,\n [\n (q) => {\n for (let i = 0; i < state.throughPrimaryKeys.length; i++) {\n _queryJoinOn(q, [\n state.throughForeignKeysFull[i],\n state.throughPrimaryKeysFull[i],\n ]);\n }\n\n return _queryWhereIn(q, true, state.foreignKeysFull, parentIdsSql);\n },\n ],\n );\n\n const upsertQuery = _querySelect(\n _queryUpsert(existingRelQuery, {\n update: upsert.update,\n create: upsert.create || {},\n }),\n state.throughPrimaryKeys,\n ) as unknown as Query;\n\n const selectAs: RecordUnknown = {};\n for (let i = 0; i < state.foreignKeys.length; i++) {\n selectAs[state.foreignKeys[i]] = parentValues[i];\n }\n for (let i = 0; i < state.throughForeignKeys.length; i++) {\n selectAs[state.throughForeignKeys[i]] = relatedValues[i];\n }\n\n const joinRows = _querySelect(_clone(state.queryBuilder), [\n selectAs as never,\n ]) as Query;\n _queryWhere(joinRows, [relatedIdsSql] as never);\n\n const joinQuery = (\n state.joinTableQuery as Query.NotReadOnlyQuery\n ).insertForEachFrom(joinRows as never) as Query;\n\n joinQuery.q.returnType = 'void';\n\n _appendQuery(\n querySelf,\n _appendQueryOnUpsertCreate(upsertQuery, joinQuery, (as) => {\n relatedIdsSql._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n for (let i = 0; i < relatedValues.length; i++) {\n relatedValues[i]._sql = selectCteColumnSql(\n as,\n state.throughPrimaryKeys[i],\n );\n }\n }),\n (as) => {\n parentAs = as;\n },\n );\n};\n\nexport const nestedUpdate = (state: State) => {\n const len = state.primaryKeys.length;\n const throughLen = state.throughPrimaryKeys.length;\n\n return (async (\n query: Query,\n data: RecordUnknown[],\n params: NestedUpdateManyItems,\n ) => {\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 as RecordUnknown)[\n state.primaryKeys[i]\n ];\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 as Query.NotReadOnlyQuery).createMany(\n records,\n );\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 ) as unknown as UpdateSelf,\n params.update.data as never,\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 as Query.NotReadOnlyQuery)\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: RecordUnknown) =>\n pick(x, state.primaryKeys),\n ) 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 {\n RelationConfigSelf,\n RelationData,\n RelationThunkBase,\n} from '../relations';\nimport { NotFoundError, Query } from 'pqb';\nimport { ORMTableInput } from '../../orm-table/legacy-table';\nimport {\n _queryCreateManyFrom,\n _queryDefaults,\n _queryHookAfterCreate,\n _queryJoinOn,\n _queryWhere,\n _queryWhereExists,\n CreateCtx,\n CreateData,\n getQueryAs,\n JoinedShapes,\n SelectableFromShape,\n TableData,\n UpdateData,\n VirtualColumn,\n WhereArg,\n ColumnSchemaConfig,\n ColumnsShape,\n getPrimaryKeys,\n MaybeArray,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n toSnakeCase,\n Column,\n CreateSelf,\n QueryHasWhere,\n QuerySchema,\n internalSchemaConfig,\n UpdateSelf,\n} from 'pqb/internal';\nimport {\n addAutoForeignKey,\n hasRelationHandleCreate,\n hasRelationHandleUpdate,\n NestedUpdateManyItems,\n throwIfQueryReturnsAllForNestedUpdate,\n} from '../common/utils';\nimport { HasManyNestedUpdate } from '../has-many/has-many';\nimport { HasManyNestedInsert } from '../has-many/has-many.create';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport { nestedInsert } from './has-and-belongs-to-many.create';\nimport {\n nestedUpdate,\n nestedUpdateUpsert,\n} from './has-and-belongs-to-many.update';\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 ORMTableInput = ORMTableInput,\n> {\n required?: boolean;\n columns: (keyof Columns)[];\n references: string[];\n foreignKey?: boolean | TableData.References.Options;\n through: {\n schema?: QuerySchema;\n table: string;\n snakeCase?: boolean;\n columns: string[];\n references: (keyof Related['columns']['shape'])[];\n foreignKey?: boolean | TableData.References.Options;\n };\n on?: ColumnsShape.InputPartial<Related['columns']['shape']>;\n}\n\nexport type HasAndBelongsToManyParams<\n T extends RelationConfigSelf,\n FK extends string,\n> = {\n [Name in FK]: 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 '__selectable'\n ? SelectableFromShape<TableQuery['shape'], Name>\n : K extends '__as'\n ? Name\n : TableQuery[K];\n} & QueryHasWhere;\n\nexport interface HasAndBelongsToManyInfo<\n T extends RelationConfigSelf,\n Name extends string,\n FK extends string,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: false;\n query: Q;\n params: HasAndBelongsToManyParams<T, FK>;\n omitForeignKeyInCreate: never;\n dataForCreate: {\n [K in Name]?: Q extends Query.Pick.IsNotReadOnly\n ? {\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 // find existing records by `where` conditions and update their foreign keys with the new id\n connect?: WhereArg<Q>[];\n };\n };\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: Q extends Query.Pick.IsNotReadOnly\n ? {\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 disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n };\n dataForUpdateOne: Q extends Query.Pick.IsNotReadOnly\n ? {\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 upsert?: {\n findBy: Q['internal']['uniqueColumns'];\n update: UpdateData<Q>;\n create?: CreateData<Q> | (() => CreateData<Q>);\n };\n }\n : {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n };\n}\n\nexport interface State {\n queryBuilder: Query.NotReadOnlyQuery;\n relatedTableQuery: Query.NotReadOnlyQuery;\n joinTableQuery: Query.NotReadOnlyQuery;\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\ninterface QueryReturnsOne extends Query {\n returnType: 'one' | 'oneOrThrow';\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(\n q: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n ) {\n hasRelationHandleCreate(\n q as unknown as Query,\n ctx,\n items,\n rowIndexes,\n this.key,\n this.state.primaryKeys,\n this.nestedInsert,\n );\n }\n\n update(q: UpdateSelf, set: RecordUnknown) {\n const querySelf = q as unknown as Query;\n const params = set[this.key] as NestedUpdateManyItems;\n\n hasRelationHandleUpdate(\n querySelf,\n set,\n this.key,\n this.state.primaryKeys,\n this.nestedUpdate,\n );\n\n if (params.upsert) {\n throwIfQueryReturnsAllForNestedUpdate(querySelf, {\n upsert: params.upsert,\n });\n nestedUpdateUpsert(querySelf, this.state, params.upsert);\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 schema?: QuerySchema,\n): RelationData => {\n const { options } = relation;\n const { snakeCase } = table.internal;\n const primaryKeys = options.columns as string[];\n const originalForeignKeys = options.references;\n const foreignKeys = snakeCase\n ? [...originalForeignKeys]\n : originalForeignKeys;\n const joinTableSnakeCase = snakeCase && options.through.snakeCase !== false;\n const joinTable = joinTableSnakeCase\n ? toSnakeCase(options.through.table)\n : options.through.table;\n const originalThroughForeignKeys = options.through.columns;\n const throughForeignKeys = snakeCase\n ? [...originalThroughForeignKeys]\n : originalThroughForeignKeys;\n const throughPrimaryKeys = options.through.references as string[];\n const { on } = options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query as unknown as CreateSelf, 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 schema: options.through.schema || schema,\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 queryBuilder: qb as Query.NotReadOnlyQuery,\n relatedTableQuery: query as Query.NotReadOnlyQuery,\n joinTableQuery: subQuery as Query.NotReadOnlyQuery,\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.selectShape,\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\n ? (_queryDefaults(q as unknown as CreateSelf, on) as unknown as Query)\n : q;\n },\n virtualColumn: new HasAndBelongsToManyVirtualColumn(\n subQuery,\n internalSchemaConfig,\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 .selectShape,\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() as unknown as CreateSelf,\n baseQuery as QueryReturnsOne,\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","import {\n BelongsTo,\n BelongsToParams,\n getBelongsToRequired,\n makeBelongsToMethod,\n} from './belongs-to/belongs-to';\nimport { HasOne, HasOneParams, makeHasOneMethod } from './has-one/has-one';\nimport {\n TableQueryBuilder,\n ORMTableInput,\n TableClass,\n TableInfo,\n} from '../orm-table/legacy-table';\nimport {\n _queryTake,\n _queryTakeOptional,\n CreateData,\n VirtualColumn,\n WhereArg,\n ColumnSchemaConfig,\n RecordUnknown,\n RelationJoinQuery,\n RelationsBase,\n Column,\n QuerySchema,\n CreateSelf,\n PickQuerySelectableRelations,\n RelationConfigBase,\n} from 'pqb/internal';\nimport { HasMany, makeHasManyMethod } from './has-many/has-many';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyParams,\n makeHasAndBelongsToManyMethod,\n} from './has-and-belongs-to-many/has-and-belongs-to-many';\nimport { getSourceRelation, getThroughRelation } from './common/utils';\nimport { Query } from 'pqb';\nimport { OrmTableThunks, TableInstance } from '../orm';\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\ninterface RelationToOneDataForCreateSameQuerySelf\n extends CreateSelf, PickQuerySelectableRelations {}\n\nexport type RelationToOneDataForCreateSameQuery<\n Q extends RelationToOneDataForCreateSameQuerySelf,\n> =\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 id: string;\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?: RelationConfigBase['modifyRelatedQuery'];\n}\n\ntype TableInstances<T extends OrmTableThunks> = {\n [K in keyof T]: TableInstance<T[K]>;\n};\n\ntype TableClassInstances<T extends OrmTableThunks> = TableInstances<T>[keyof T];\n\ntype RelationToTableInputById<Tables, Id extends string> = Tables extends {\n id: Id;\n}\n ? Tables\n : never;\n\ntype RelationToTableInputByName<T extends OrmTableThunks, Id extends string> = {\n [K in keyof TableInstances<T>]: TableInstances<T>[K] extends\n | { table: Id }\n | { name: Id }\n ? TableInstances<T>[K]\n : never;\n}[keyof T];\n\ntype RelationToTableInputFromClasses<\n T extends OrmTableThunks,\n Id extends string,\n> =\n RelationToTableInputById<TableClassInstances<T>, Id> extends infer Result\n ? [Result] extends [never]\n ? RelationToTableInputByName<T, Id>\n : Result\n : never;\n\nexport type RelationToTableInput<\n TT extends OrmTableThunks,\n VT extends OrmTableThunks,\n Rel extends RelationThunkBase,\n> =\n RelationToTableInputFromClasses<TT, Rel['id']> extends infer Result\n ? [Result] extends [never]\n ? RelationToTableInputFromClasses<VT, Rel['id']> extends infer Result\n ? [Result] extends [never]\n ? false\n : Result\n : never\n : Result\n : never;\n\nexport type RelationTableToQuery<\n TT extends OrmTableThunks,\n VT extends OrmTableThunks,\n Rel extends RelationThunkBase,\n> =\n RelationToTableInput<TT, VT, Rel> extends infer Result extends ORMTableInput\n ? TableQueryBuilder<TT, VT, Result>\n : never;\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['options']['columns'][number] & string>\n : Relation extends HasOne | HasMany\n ? HasOneParams<T, Relation['options']>\n : Relation extends HasAndBelongsToMany\n ? HasAndBelongsToManyParams<\n T,\n Relation['options']['columns'][number] & string\n >\n : never;\n\ninterface ApplyRelationData {\n relationName: string;\n relation: RelationThunk;\n otherTable: ORMTableInput;\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: { [K: string]: Query },\n schema?: QuerySchema,\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 = (\n relation as unknown as { fn?: () => TableClass }\n ).fn?.();\n const otherTable = otherTableClass\n ? tableEntries.find((pair) => pair[1] instanceof otherTableClass)\n : // two-pass lookup: prefer id match over name match to avoid\n // ambiguity when multiple views share the same database name\n tableEntries.find(([, table]) => {\n const { id } = relation as never;\n return table.id === id || table.table === id;\n }) ||\n tableEntries.find(([, table]) => {\n const { id } = relation as never;\n return table.name === id;\n });\n if (!otherTable) {\n throw new Error(\n otherTableClass\n ? `Cannot find table class for class ${otherTableClass.name}`\n : `Cannot find table for relation target ${\n (relation as unknown as { id?: string }).id\n }`,\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 otherTable: otherTable[1],\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, schema);\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 {\n relationName,\n relation,\n otherTable,\n dbTable,\n otherDbTable,\n }: ApplyRelationData,\n delayedRelations: DelayedRelations,\n schema?: QuerySchema,\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 schema,\n );\n } else {\n throw new Error(`Unknown relation type ${type}`);\n }\n\n if (data.returns === 'one') {\n const required =\n type === 'belongsTo'\n ? getBelongsToRequired(table, otherTable, relation)\n : relation.options.required;\n\n if (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.selectShape[relationName] =\n data.virtualColumn;\n }\n\n baseQuery.joinQuery = data.joinQuery;\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, schema);\n });\n};\n","import {\n IsolationLevel,\n TransactionOptions,\n AfterCommitStandaloneHook,\n} from 'pqb/internal';\nimport { Db } 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 Column,\n FromArg,\n FromResult,\n QueryLogOptions,\n StorageOptions,\n Adapter,\n AsyncState,\n defaultSchemaConfig,\n DbSharedOptions,\n DbTableOptionScopes,\n DbTableOptions,\n _initQueryBuilder,\n makeColumnTypes,\n MaybeArray,\n MergeQuery,\n NoPrimaryKeyOption,\n QueryData,\n ColumnSchemaConfig,\n Rls,\n Grant,\n EmptyObject,\n ColumnsShape,\n RecordUnknown,\n type TableDataItem,\n type QueryInternal,\n} from 'pqb/internal';\nimport {\n ORMTableInput,\n BaseTableClass,\n TableClass,\n TableQueryBuilder,\n} from './orm-table/legacy-table';\nimport type { OrmTable } from './orm-table/table';\nimport { applyRelations } from './relations/relations';\nimport {\n transaction,\n ensureTransaction,\n isInTransaction,\n afterCommit,\n} from './transaction';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { Db, Query } from 'pqb';\n\nexport interface FromQuery extends Query {\n returnType: 'all';\n}\n\ninterface OrchidORMQueryHelper<\n Q extends Query,\n Args extends unknown[],\n Result,\n> {\n <T extends Query>(\n q: T & { table: Q['table'] },\n ...args: Args\n ): Result extends Query ? MergeQuery<T, Result> : Result;\n isQueryHelper: true;\n table: Q['table'];\n __args: Args;\n __result: Result;\n}\n\ninterface OrchidORMTableHelper<T extends Query> {\n /**\n * Static table name from the table class.\n */\n table: T['table'];\n\n /**\n * Create a helper that binds to the DB-aware table query when used.\n */\n makeHelper<Args extends unknown[], Result>(\n fn: (q: T, ...args: Args) => Result,\n ): OrchidORMQueryHelper<T, Args, Result>;\n}\n\n/**\n * Table definitions accepted by ORM setup.\n */\nexport interface OrmTableThunks {\n /**\n * ORM table or view definition keyed by the db instance property name.\n */\n [K: string]:\n | TableClass\n | {\n data: {\n id: string;\n name: string | undefined;\n table: string | undefined;\n relations: unknown;\n columns: ColumnsShape;\n types: unknown;\n computed: unknown;\n scopes: RecordUnknown | undefined;\n softDelete?: true | string | undefined;\n readOnly?: boolean | undefined;\n materialized?: true | undefined;\n tableData: unknown;\n };\n prototype: { columns: { shape: ColumnsShape } };\n instance(): ORMTableInput;\n };\n}\n\ntype OrmTableInstance<T> = T extends {\n data: {\n id: infer Id extends string;\n table: infer Table extends string | undefined;\n name: infer Name extends string | undefined;\n columns: infer Columns extends ColumnsShape;\n types: infer ColumnTypes;\n relations: infer Relations;\n computed: infer Computed;\n scopes: infer Scopes extends RecordUnknown | undefined;\n softDelete: infer SoftDelete extends true | string | undefined;\n readOnly: infer ReadOnly extends boolean | undefined;\n materialized: infer Materialized extends true | undefined;\n tableData: infer Data extends TableDataItem[];\n };\n}\n ? OrmTable.Input<\n Id,\n Table,\n Name,\n Columns,\n ColumnTypes,\n OrmTable.Relations.Resolve<Relations>,\n Computed,\n Scopes,\n SoftDelete,\n ReadOnly,\n Materialized,\n Data[number]\n >\n : never;\n\nexport type TableInstance<T> = T extends {\n new (): infer R extends ORMTableInput;\n}\n ? R\n : OrmTableInstance<T>;\n\nexport type OrchidORMTables<\n TT extends OrmTableThunks = OrmTableThunks,\n VT extends OrmTableThunks = OrmTableThunks,\n> = {\n [K in keyof TT]: OrchidORMTableHelper<\n TableQueryBuilder<TT, VT, TableInstance<TT[K]>>\n >;\n};\n\nexport type OrchidORMBundle<\n TT extends OrmTableThunks = OrmTableThunks,\n VT extends OrmTableThunks = OrmTableThunks,\n> = OrchidORMTables<TT, VT> & {\n $views: OrchidORMTables<VT, TT>;\n};\n\nexport type OrchidORMDbTables<\n TT extends OrmTableThunks = OrmTableThunks,\n VT extends OrmTableThunks = OrmTableThunks,\n> = {\n [K in keyof TT]: TableQueryBuilder<TT, VT, TableInstance<TT[K]>>;\n};\n\nexport type OrchidORM<\n TT extends OrmTableThunks = OrmTableThunks,\n VT extends OrmTableThunks = OrmTableThunks,\n> = OrchidORMDbTables<TT, VT> & {\n $views: OrchidORMDbTables<VT, TT>;\n} & OrchidORMMethods;\n\n/**\n * Identity helper for table row-level security configuration.\n */\nexport const defineRls = <T extends Rls.TableConfig>(rls: T): T => rls;\n\n/**\n * Identity helper for table-local grant configuration.\n */\nexport const setGrants = <const T extends readonly Grant.TableClassGrant[]>(\n grants: T,\n): T => grants;\n\ninterface OrchidORMMethods {\n /**\n * @see import('pqb').QueryTransaction.prototype.transaction\n */\n $transaction: typeof transaction;\n /**\n * @see import('pqb').QueryTransaction.prototype.ensureTransaction\n */\n $ensureTransaction: typeof ensureTransaction;\n /**\n * @see import('pqb').QueryTransaction.prototype.isInTransaction\n */\n $isInTransaction: typeof isInTransaction;\n /**\n * @see import('pqb').QueryTransaction.prototype.afterCommit\n */\n $afterCommit: typeof afterCommit;\n $qb: Db;\n $adapterNotInTransaction: Adapter;\n\n /**\n * Adapter is a wrapper on top of `postgres-js`, `node-postgres`, or other db driver.\n *\n * When in transaction, returns a db adapter object for the transaction,\n * returns a default adapter object otherwise.\n *\n * Treat the adapter as implementation detail and avoid accessing it directly.\n */\n $getAdapter(): Adapter;\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 /**\n * `$withOptions` supports overriding `log`, `schema`, `role`, and `setConfig`.\n *\n * - `log`: boolean, enables or disables logging in the scope of the callback.\n * - `schema`: set a **default** schema, note that it does not override\n * if you already have a schema set in the ORM config or for a specific table.\n * - `role`: string, switches the Postgres role for the duration of the callback.\n * Used for row-level security policies.\n * - `setConfig`: object with string, number, or boolean values, sets Postgres custom\n * settings for the duration of the callback. Use dotted names like `app.tenant_id`.\n * Values are normalized to strings internally.\n *\n * SQL session options (`role` and `setConfig`) cannot be nested.\n * If an outer scope already has `role` or `setConfig`, attempting to set them again\n * in a nested `$withOptions` call will throw an error.\n * For transaction-bound work that needs nested overrides, pass `role` and\n * `setConfig` to nested `$transaction` calls instead.\n * Nested scopes that only change `log` or `schema` will inherit the outer SQL session context.\n *\n * Explicit transactions inside the callback inherit the same SQL session context:\n *\n * ```ts\n * await db.$withOptions(\n * {\n * role: 'app_user',\n * setConfig: {\n * 'app.tenant_id': tenantId,\n * 'app.user_id': userId,\n * },\n * },\n * async () => {\n * const project = await db.project.find(projectId);\n *\n * await db.$transaction(async () => {\n * // This query runs in the transaction with the same role and config\n * await db.project.find(projectId).update({ lastViewedAt: new Date() });\n * });\n * },\n * );\n * ```\n *\n * When the request's DB work should run in one transaction, prefer passing\n * `role` and `setConfig` directly to `$transaction`.\n *\n * Basic usage with `log` and `schema`:\n *\n * ```ts\n * await db.$withOptions({ log: true, schema: 'custom' }, async () => {\n * // will log this query, and will use the custom schema for this table,\n * // unless this table already has a configured schema.\n * await db.table.find(123);\n * });\n * ```\n */\n $withOptions<Result>(\n options: StorageOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n\n $close(): Promise<void>;\n}\n\nexport type OrchidOrmParam<Options> = true | null extends true\n ? 'Set strict: true to tsconfig'\n : Options;\n\ninterface OrchidORMBundleMetadata {\n // Original table classes for later DB binding.\n tables: OrmTableThunks;\n // Original view classes for later DB binding.\n views: OrmTableThunks;\n // Set db-aware instance so that the minimal preliminary query objects can access it.\n setDbAwareInstance(orm: OrchidORM): void;\n}\n\nconst orchidORMBundleMetadataKey = Symbol('orchidORMBundleMetadataKey');\n\ntype CommonOrmOptions = QueryLogOptions & {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n};\n\nexport interface OrchidORMSetupOptions<\n V extends OrmTableThunks = OrmTableThunks,\n> extends DbSharedOptions {\n /**\n * First-class regular views exposed under db.$views.\n */\n views?: V;\n}\n\nconst assignTablesToOrm = <T extends OrmTableThunks>(\n isTable: boolean,\n tables: T,\n result: { [K: string]: Query },\n adapter: Adapter,\n qb: Db,\n asyncStorage: AsyncLocalStorage<AsyncState>,\n commonOptions: CommonOrmOptions,\n schema: DbSharedOptions['schema'],\n) => {\n const tableInstances: Record<string, ORMTableInput> = {};\n\n for (const key in tables) {\n if (key[0] === '$') {\n throw new Error(\n `${isTable ? 'Table' : 'View'} class name must not start with $`,\n );\n }\n\n const tableClass = tables[key];\n const tableImmutable = (\n tableClass as unknown as { instance(): ORMTableInput }\n ).instance();\n const table = Object.create(tableImmutable);\n table.q = { ...table.q };\n table.columns = {\n shape: { ...table.columns.shape },\n data: { ...table.columns.data },\n };\n tableInstances[key] = table;\n\n const options: DbTableOptions<unknown, string, Column.Shape.QueryInit> = {\n ...commonOptions,\n schema: table.schema || 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 nameInDb: table.nameInDb,\n comment: table.comment,\n readOnly: isTable\n ? table.readOnly\n ? true\n : undefined\n : table.materialized || table.readOnly !== false\n ? true\n : undefined,\n materialized: !isTable && table.materialized ? true : undefined,\n generatorIgnore: table.generatorIgnore,\n noPrimaryKey: table.noPrimaryKey || !isTable ? '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 qb,\n isTable ? table.table : table.name,\n table.columns.shape as never,\n table.types,\n asyncStorage,\n options,\n table.columns?.data ?? {},\n getViewData(isTable, table),\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 dbTable.internal.tableRls = table.rls;\n dbTable.internal.tableGrants = table.grants;\n\n result[key] = dbTable as never;\n }\n\n return tableInstances;\n};\n\nconst getViewData = (\n isTable: boolean,\n table: ORMTableInput,\n): QueryInternal['viewData'] | undefined => {\n if (isTable) return;\n\n return {\n query: table.query,\n sql: table.sql,\n recursive: table.recursive,\n checkOption: table.checkOption,\n securityBarrier: table.securityBarrier,\n securityInvoker: table.securityInvoker,\n withData: table.withData,\n };\n};\n\nexport const bundleOrchidORM = <\n T extends OrmTableThunks = EmptyObject,\n V extends OrmTableThunks = EmptyObject,\n>({\n tables = {} as T,\n views = {} as V,\n}: {\n tables?: T;\n views?: V;\n}): OrchidORMBundle<T, V> => {\n const result = {} as OrchidORMBundle<T, V>;\n const bundledViews = {} as OrchidORMTables<V, T>;\n const hasViews = Object.keys(views).length > 0;\n\n Object.defineProperty(result, '$views', {\n enumerable: hasViews,\n value: bundledViews,\n });\n\n let dbAwareInstance: OrchidORM;\n\n for (const key in tables) {\n const tableClass = tables[key];\n const table = (\n tableClass as unknown as { instance(): ORMTableInput }\n ).instance().table;\n\n result[key] = {\n table,\n makeHelper(arg: unknown) {\n // oxlint-disable-next-line typescript/no-explicit-any\n let fn: (...args: any[]) => unknown;\n return (...args: unknown[]) => {\n if (!fn) {\n fn = dbAwareInstance[key].makeHelper(arg as never);\n }\n return fn(...args);\n };\n },\n } as never;\n }\n\n for (const key in views) {\n const viewClass = views[key];\n const table = (\n viewClass as unknown as { instance(): ORMTableInput }\n ).instance().name;\n\n bundledViews[key] = {\n table,\n makeHelper(arg: unknown) {\n // oxlint-disable-next-line typescript/no-explicit-any\n let fn: (...args: any[]) => unknown;\n return (...args: unknown[]) => {\n if (!fn) {\n fn = dbAwareInstance.$views[key].makeHelper(arg as never);\n }\n return fn(...args);\n };\n },\n } as never;\n }\n\n const meta: OrchidORMBundleMetadata = {\n tables,\n views,\n setDbAwareInstance(orm) {\n dbAwareInstance = orm;\n },\n };\n\n Object.defineProperty(result, orchidORMBundleMetadataKey, {\n enumerable: false,\n value: meta,\n });\n\n return result;\n};\n\nexport const bundleOrchidORMTables = <T extends OrmTableThunks>(\n tables: T,\n): OrchidORMBundle<T, EmptyObject> => bundleOrchidORM({ tables });\n\nconst getOrchidORMBundleMetadata = <\n T extends OrmTableThunks,\n V extends OrmTableThunks,\n>(\n orm: OrchidORMBundle<T, V>,\n): OrchidORMBundleMetadata => {\n const meta = (\n orm as {\n [orchidORMBundleMetadataKey]?: OrchidORMBundleMetadata;\n }\n )[orchidORMBundleMetadataKey];\n\n if (!meta) {\n throw new Error(\n 'Failed to bind Orchid ORM tables: pass a bundle created by bundleOrchidORM.',\n );\n }\n\n return meta;\n};\n\nexport const makeOrchidOrmDbWithAdapter = <\n T extends OrmTableThunks,\n V extends OrmTableThunks,\n>(\n orm: OrchidORMBundle<T, V>,\n options: OrchidOrmParam<\n ({ db: Query } | { adapter: Adapter }) & DbSharedOptions\n >,\n): OrchidORM<T, V> => {\n const meta = getOrchidORMBundleMetadata(orm);\n return privateOrchidORMWithAdapter<T, V>(\n options,\n meta.tables as T,\n meta.views as V,\n meta.setDbAwareInstance,\n );\n};\n\nconst privateOrchidORMWithAdapter = <\n T extends OrmTableThunks,\n V extends OrmTableThunks,\n>(\n {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey = 'error',\n schema,\n views,\n ...options\n }: OrchidOrmParam<\n ({ db: Query } | { adapter: Adapter }) & OrchidORMSetupOptions<V>\n >,\n tables: T,\n bundledViews?: V,\n setDbAwareInstance?: OrchidORMBundleMetadata['setDbAwareInstance'],\n): OrchidORM<T, V> => {\n if (bundledViews) {\n views = bundledViews;\n }\n\n const commonOptions: CommonOrmOptions = {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey,\n };\n\n let adapter: Adapter;\n let asyncStorage;\n let qb: Db;\n if ('db' in options) {\n adapter = options.db.q.adapter;\n asyncStorage = options.db.internal.asyncStorage;\n qb = options.db.qb as Db;\n } else {\n adapter = options.adapter;\n\n asyncStorage = new AsyncLocalStorage<AsyncState>();\n\n qb = _initQueryBuilder(\n adapter,\n makeColumnTypes(defaultSchemaConfig(adapter.driverAdapter.schemaConfig)),\n asyncStorage,\n commonOptions,\n options,\n );\n }\n\n qb.internal.rls = options.rls;\n\n const result = {\n $transaction: transaction,\n $ensureTransaction: ensureTransaction,\n $isInTransaction: isInTransaction,\n $afterCommit: afterCommit,\n $adapterNotInTransaction: adapter,\n $getAdapter,\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 $withOptions: qb.withOptions.bind(qb),\n } as unknown as OrchidORM<T, V>;\n\n result.$views = {} as never;\n\n const tableInstances = assignTablesToOrm(\n true,\n tables,\n result as OrchidORMDbTables<T>,\n adapter,\n qb,\n asyncStorage,\n commonOptions,\n schema,\n );\n\n let viewInstances;\n if (views) {\n viewInstances = assignTablesToOrm(\n false,\n views,\n result.$views,\n adapter,\n qb,\n asyncStorage,\n commonOptions,\n schema,\n );\n\n const tableDbNames = Object.values(tableInstances).map((table) => {\n const s =\n typeof table.schema === 'function' ? table.schema() : table.schema;\n return `${s ? s + '.' : ''}${table.nameInDb}`;\n });\n\n for (const key in views) {\n const view = viewInstances[key];\n const s = typeof view.schema === 'function' ? view.schema() : view.schema;\n const name = `${s ? s + '.' : ''}${view.nameInDb}`;\n if (tableDbNames.includes(name)) {\n throw new Error(\n `Cannot configure both a table and a view for database relation ${name}`,\n );\n }\n }\n }\n\n applyRelations(\n qb,\n { ...tableInstances, ...viewInstances },\n { ...result, ...result.$views },\n schema,\n );\n\n setDbAwareInstance?.(result as never);\n\n const initItems = [\n [tableInstances, result, true],\n [viewInstances, result.$views, false],\n ] as const;\n\n for (const [items, queries, isTable] of initItems) {\n if (!items) continue;\n\n for (const key in items) {\n const table = items[key] as unknown as {\n init?(orm: unknown): void;\n q: QueryData;\n } & ORMTableInput;\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(queries[key].baseQuery.q, table.q);\n if (!isTable) {\n queries[key].internal.viewData = getViewData(false, table);\n }\n }\n }\n }\n\n return result as unknown as OrchidORM<T, V>;\n};\n\nexport const orchidORMWithAdapter = <\n T extends OrmTableThunks,\n V extends OrmTableThunks = EmptyObject,\n>(\n options: OrchidOrmParam<\n ({ db: Query } | { adapter: Adapter }) & OrchidORMSetupOptions<V>\n >,\n tables: T,\n): OrchidORM<T, V> => privateOrchidORMWithAdapter(options, tables);\n\nfunction $getAdapter(this: OrchidORM) {\n return this.$qb.$getAdapter();\n}\n","import {\n getClonedQueryData,\n MergeQuery,\n QueryReturnType,\n RecordUnknown,\n QueryHasWhere,\n} from 'pqb/internal';\nimport { Query } 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<T & QueryHasWhere>;\n queryOneWithWhereMethods?: QueryMethods<QueryOne<T & QueryHasWhere>>;\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<Query & QueryHasWhere>,\n Methods['queryOneWithWhereMethods'][K]\n >\n : K extends keyof Methods['queryWithWhereMethods']\n ? MapQueryMethods<\n Query & QueryHasWhere,\n Methods['queryWithWhereMethods'][K]\n >\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["nestedInsert","nestedInsert","nestedInsert","nestedInsert"],"sources":["../src/orm-table/legacy-table.ts","../src/orm-table/table.ts","../src/relations/common/utils.ts","../src/relations/common/joinQueryChain.ts","../src/relations/belongs-to/belongs-to.create.ts","../src/relations/belongs-to/belongs-to.update.ts","../src/relations/belongs-to/belongs-to.ts","../src/relations/has-one/has-one.create.ts","../src/relations/has-one/has-one.through.ts","../src/relations/has-one/has-one.update.ts","../src/relations/has-one/has-one.ts","../src/relations/has-many/has-many.update.ts","../src/relations/has-many/has-many.through.ts","../src/relations/has-many/has-many.create.ts","../src/relations/has-many/has-many.ts","../src/relations/has-and-belongs-to-many/has-and-belongs-to-many.create.ts","../src/relations/has-and-belongs-to-many/has-and-belongs-to-many.update.ts","../src/relations/has-and-belongs-to-many/has-and-belongs-to-many.ts","../src/relations/relations.ts","../src/transaction.ts","../src/orm.ts","../src/repo.ts"],"sourcesContent":["import {\n Column,\n AfterHook,\n ComputedOptionsConfig,\n ComputedOptionsFactory,\n _createDbSqlMethod,\n DbSqlMethod,\n DbTableOptionScopes,\n DefaultColumnTypes,\n defaultSchemaConfig,\n DefaultSchemaConfig,\n getColumnTypes,\n makeColumnTypes,\n parseTableData,\n QueryAfterHook,\n QueryBeforeActionHook,\n QueryBeforeHook,\n QueryData,\n QueryHooks,\n QueryScopes,\n TableData,\n TableDataFn,\n TableDataItem,\n applyMixins,\n ColumnSchemaConfig,\n emptyArray,\n EmptyObject,\n emptyObject,\n getCallerFilePath,\n getStackTrace,\n IsQuery,\n MaybeArray,\n RecordUnknown,\n toSnakeCase,\n ColumnsShape,\n QuerySchema,\n Rls,\n Grant,\n type RawSqlBase,\n type BrandColumnsShape,\n} from 'pqb/internal';\nimport {\n RelationConfigSelf,\n RelationToTableInput,\n RelationTableToQuery,\n} from '../relations/relations';\nimport { OrchidORM, OrmTableThunks } from '../orm';\nimport {\n BelongsTo,\n BelongsToDataForCreate,\n BelongsToDefaultRequired,\n BelongsToInfo,\n BelongsToOptions,\n BelongsToQuery,\n} from '../relations/belongs-to/belongs-to';\nimport {\n HasOne,\n HasOneInfo,\n HasOneOptions,\n HasOneQuery,\n} from '../relations/has-one/has-one';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyInfo,\n HasAndBelongsToManyOptions,\n HasAndBelongsToManyQuery,\n} from '../relations/has-and-belongs-to-many/has-and-belongs-to-many';\nimport {\n HasMany,\n HasManyInfo,\n HasManyQuery,\n} from '../relations/has-many/has-many';\nimport { Db, Query } from 'pqb';\nimport { TableFactoryOptions } from './table.common';\n\n// type of table class itself\nexport interface TableClass<T extends ORMTableInput = ORMTableInput> {\n new (): T;\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\ntype BelongsToRequired<\n T extends RelationConfigSelf,\n Rel extends BelongsTo,\n Related,\n> = Rel['options'] extends {\n required: infer Required extends boolean;\n}\n ? Required\n : Rel['options'] extends { on: unknown }\n ? false\n : BelongsToDefaultRequired<T, Rel, Related>;\n\ntype BelongsToRelationInfo<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends BelongsTo,\n> =\n RelationToTableInput<TC, VC, Rel> extends infer Related extends ORMTableInput\n ? BelongsToInfo<\n T,\n Rel['options']['columns'][number] & string,\n BelongsToRequired<T, Rel, Related>,\n BelongsToQuery<TableQueryBuilder<TC, VC, Related>, Name>\n >\n : never;\n\ntype BelongsToCreateData<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends BelongsTo,\n> =\n RelationToTableInput<TC, VC, Rel> extends infer Related extends ORMTableInput\n ? BelongsToDataForCreate<\n Name,\n Rel['options']['columns'][number] & string,\n BelongsToRequired<T, Rel, Related>,\n BelongsToQuery<TableQueryBuilder<TC, VC, Related>, Name>\n >\n : never;\n\ntype RelationDataForCreate<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends keyof T['relations'] & string,\n Rel,\n> = Rel extends HasOne\n ? HasOneInfo<\n T,\n Name,\n Rel,\n HasOneQuery<T, Name, RelationTableToQuery<TC, VC, Rel>>\n >['dataForCreate']\n : Rel extends HasMany\n ? HasManyInfo<\n T,\n Name,\n Rel,\n HasManyQuery<T, Name, RelationTableToQuery<TC, VC, Rel>>\n >['dataForCreate']\n : Rel extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<\n T,\n Name,\n Rel['options']['columns'][number] & string,\n HasAndBelongsToManyQuery<Name, RelationTableToQuery<TC, VC, Rel>>\n >['dataForCreate']\n : never;\n\ntype RelationInfoForName<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends keyof T['relations'] & string,\n Rel,\n> = Rel extends BelongsTo\n ? BelongsToRelationInfo<TC, VC, T, Name, Rel>\n : Rel extends HasOne\n ? HasOneInfo<\n T,\n Name,\n Rel,\n HasOneQuery<T, Name, RelationTableToQuery<TC, VC, Rel>>\n >\n : Rel extends HasMany\n ? HasManyInfo<\n T,\n Name,\n Rel,\n HasManyQuery<T, Name, RelationTableToQuery<TC, VC, Rel>>\n >\n : Rel extends HasAndBelongsToMany\n ? HasAndBelongsToManyInfo<\n T,\n Name,\n Rel['options']['columns'][number] & string,\n HasAndBelongsToManyQuery<Name, RelationTableToQuery<TC, VC, Rel>>\n >\n : never;\n\ntype RelationDataForCreateOptionalNames<T extends RelationConfigSelf> = {\n [K in keyof T['relations'] & string]: T['relations'][K] extends BelongsTo\n ? never\n : K;\n}[keyof T['relations'] & string];\n\ntype RelationDataForCreateValue<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends keyof T['relations'] & string,\n> = RelationDataForCreate<TC, VC, T, Name, T['relations'][Name]>[Name];\n\ntype BelongsToRelationCreateData<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Name extends keyof T['relations'],\n> = Name extends keyof T['relations'] & string\n ? T['relations'][Name] extends BelongsTo\n ? BelongsToCreateData<TC, VC, T, Name, T['relations'][Name]>\n : never\n : never;\n\ntype BelongsToRelationsDataForCreate<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n> = {\n [K in keyof T['relations'] as T['relations'][K] extends BelongsTo\n ? T['relations'][K]['options']['columns'][number] & string\n : never]: BelongsToRelationCreateData<TC, VC, T, K>;\n};\n\ntype RelationsDataForCreateOptional<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends RelationConfigSelf,\n Names extends keyof T['relations'] & string =\n RelationDataForCreateOptionalNames<T>,\n> = [Names] extends [never]\n ? EmptyObject\n : {\n [K in Names]?: RelationDataForCreateValue<TC, VC, T, K>;\n };\n\n// converts table type to a queryable interface\nexport interface TableQueryBuilder<\n TC extends OrmTableThunks,\n VC extends OrmTableThunks,\n T extends ORMTableInput,\n>\n extends\n TableInfo,\n Db<\n T['table'] extends string ? T['table'] : T['name'],\n BrandColumnsShape<\n T['columns']['shape'],\n T['table'] extends string ? T['table'] : T['name']\n >,\n T['columns']['data'],\n T['types'],\n T['table'] extends string\n ? T['readOnly'] extends true\n ? true\n : undefined\n : T['readOnly'] extends false\n ? undefined\n : true,\n T\n > {\n relations: T extends RelationConfigSelf\n ? {\n [K in keyof T['relations'] & string]: RelationInfoForName<\n TC,\n VC,\n T,\n K,\n T['relations'][K]\n >;\n }\n : EmptyObject;\n relationsDataForCreate: T extends RelationConfigSelf\n ? BelongsToRelationsDataForCreate<TC, VC, T>\n : EmptyObject;\n relationsDataForCreateOptional: T extends RelationConfigSelf\n ? RelationsDataForCreateOptional<TC, VC, T>\n : EmptyObject;\n}\n\nexport interface PickORMTableInputColumns {\n // columns shape and the record type\n columns: {\n shape: Column.Shape.QueryInit;\n data: MaybeArray<TableDataItem>;\n };\n}\n\nexport interface PickORMTableComputed {\n /**\n * collect computed columns returned by {@link BaseTable.setColumns}\n */\n computed?: ComputedOptionsFactory<never, never>;\n}\n\nexport interface PickORMTableInputColumnsAndComputed\n extends PickORMTableInputColumns, PickORMTableComputed {}\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 extends PickORMTableInputColumnsAndComputed {\n id?: string;\n autoForeignKeys?: TableData.References.BaseOptions | boolean;\n // database schema containing this table\n schema?: QuerySchema;\n // database relation name\n nameInDb?: string;\n // whether query-facing camelCase names are translated to snake_case in SQL\n snakeCase?: boolean;\n // column types defined in base table to use in `setColumns`\n types: unknown;\n // path to file where the table is defined\n filePath: string;\n // default language for the full text search\n language?: string;\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 // row-level security table flags\n rls?: Rls.TableConfig;\n /**\n * Table-local grants used by migration generation.\n */\n grants?: readonly Grant.TableClassGrant[];\n // table-level read-only capability; only literal `true` disables mutations\n readonly readOnly?: boolean;\n // materialized-view capability; only literal `true` marks materialized views\n readonly materialized?: true;\n /**\n * Keep this table-like definition available at runtime, but exclude it from\n * generated migration DDL reconciliation.\n */\n generatorIgnore?: true;\n\n /* Only for tables */\n\n // table name\n table?: string;\n // suppress no primary key warning\n noPrimaryKey?: boolean;\n // automatically create foreign keys for relations\n\n /* Only for views */\n\n // view name\n name?: string;\n // Query assigned in `init(db)` to define this view.\n query?: Query;\n // Raw SQL expression that defines this view.\n sql?: string | RawSqlBase;\n // CREATE VIEW RECURSIVE option used by migration generation.\n recursive?: boolean;\n // CREATE VIEW CHECK OPTION used by migration generation.\n checkOption?: 'LOCAL' | 'CASCADED';\n // CREATE VIEW security_barrier option used by migration generation.\n securityBarrier?: boolean;\n // CREATE VIEW security_invoker option used by migration generation.\n securityInvoker?: boolean;\n // CREATE MATERIALIZED VIEW WITH DATA / WITH NO DATA option.\n withData?: boolean;\n}\n\nexport interface OrmLegacyTableForTypeHelpers {\n columns: {\n shape: Column.Shape.QueryInit;\n };\n computed?: ComputedOptionsFactory<never, never>;\n}\n\nexport interface OrmTableForTypeHelpers {\n data: {\n columns: Column.Shape.QueryInit;\n computed?: ComputedOptionsFactory<never, never>;\n };\n}\n\ntype AnyTableForTypeHelpers =\n | OrmLegacyTableForTypeHelpers\n | OrmTableForTypeHelpers;\n\n// Object type that's allowed in `where` and similar methods of the table.\nexport type Queryable<T extends AnyTableForTypeHelpers> = T extends\n | { columns: { shape: infer Shape extends Column.Shape.QueryInit } }\n | { data: { columns: infer Shape extends Column.Shape.QueryInit } }\n ? {\n [K in keyof Shape]?: Shape[K]['__queryType'];\n }\n : never;\n\nexport type DefaultSelect<T extends AnyTableForTypeHelpers> =\n T extends OrmTableForTypeHelpers\n ? ColumnsShape.DefaultOutput<T['data']['columns']>\n : T extends OrmLegacyTableForTypeHelpers\n ? ColumnsShape.DefaultOutput<T['columns']['shape']>\n : never;\n\ntype SelectableFromShapeAndComputed<\n Shape extends Column.Shape.QueryInit,\n Computed,\n> = Computed extends undefined\n ? ColumnsShape.Output<Shape>\n : Computed extends ((t: never) => infer R extends ComputedOptionsConfig)\n ? ColumnsShape.Output<Shape> & {\n [K in keyof R]: R[K] extends {\n result: {\n value: infer Value extends Column.Pick.QueryColumn;\n };\n }\n ? Value['__outputType']\n : R[K] extends () => {\n result: {\n value: infer Value extends Column.Pick.QueryColumn;\n };\n }\n ? Value['__outputType']\n : never;\n }\n : ColumnsShape.Output<Shape>;\n\n// Object type of table's record that's returned from database and is parsed.\nexport type Selectable<T extends AnyTableForTypeHelpers> =\n T extends OrmTableForTypeHelpers\n ? SelectableFromShapeAndComputed<\n T['data']['columns'],\n T['data']['computed']\n >\n : T extends OrmLegacyTableForTypeHelpers\n ? SelectableFromShapeAndComputed<T['columns']['shape'], T['computed']>\n : never;\n\n// Object type that conforms `create` method of the table.\nexport type Insertable<T extends AnyTableForTypeHelpers> = T extends\n | { columns: { shape: infer Shape extends Column.Shape.QueryInit } }\n | { data: { columns: infer Shape extends Column.Shape.QueryInit } }\n ? ColumnsShape.Input<Shape>\n : never;\n\n// Object type that conforms `update` method of the table.\nexport type Updatable<T extends AnyTableForTypeHelpers> =\n T extends OrmTableForTypeHelpers\n ? ColumnsShape.InputPartial<T['data']['columns']>\n : T extends OrmLegacyTableForTypeHelpers\n ? ColumnsShape.InputPartial<T['columns']['shape']>\n : never;\n\n// type of before hook function for the table\ntype BeforeHookMethod = (cb: QueryBeforeHook) => void;\ntype BeforeActionHookMethod = (cb: QueryBeforeActionHook) => 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 /**\n * Database relation name used in SQL and migration generation.\n */\n nameInDb?: string;\n columns: { shape: Column.Shape.QueryInit; data: MaybeArray<TableDataItem> };\n schema?: QuerySchema;\n noPrimaryKey?: boolean;\n snakeCase?: boolean;\n types: ColumnTypes;\n q: QueryData;\n language?: string;\n filePath: string;\n materialized?: true;\n /**\n * Keep this table-like definition available at runtime, but exclude it from\n * generated migration DDL reconciliation.\n */\n generatorIgnore?: true;\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 } | { name: 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 ORMTableInput,\n Options extends BelongsToOptions<Columns, Related>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => { new (): Related },\n options: Options,\n ): {\n type: 'belongsTo';\n id: Related['id'] extends string\n ? Related['id']\n : Related['table'] extends string\n ? Related['table']\n : Related['name'];\n options: Options;\n };\n\n hasOne<\n Columns extends Column.Shape.QueryInit,\n Related extends ORMTableInput,\n Through extends string,\n Options extends HasOneOptions<Columns, Related, Through>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => { new (): Related },\n options: Options,\n ): {\n type: 'hasOne';\n id: Related['id'] extends string\n ? Related['id']\n : Related['table'] extends string\n ? Related['table']\n : Related['name'];\n options: Options;\n };\n\n hasMany<\n Columns extends Column.Shape.QueryInit,\n Related extends ORMTableInput,\n Through extends string,\n Options extends HasOneOptions<Columns, Related, Through>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => { new (): Related },\n options: Options,\n ): {\n type: 'hasMany';\n id: Related['id'] extends string\n ? Related['id']\n : Related['table'] extends string\n ? Related['table']\n : Related['name'];\n options: Options;\n };\n\n hasAndBelongsToMany<\n Columns extends Column.Shape.QueryInit,\n Related extends ORMTableInput,\n Options extends HasAndBelongsToManyOptions<Columns, Related>,\n >(\n this: { columns: { shape: Columns } },\n fn: () => { new (): Related },\n options: Options,\n ): {\n type: 'hasAndBelongsToMany';\n id: Related['id'] extends string\n ? Related['id']\n : Related['table'] extends string\n ? Related['table']\n : Related['name'];\n options: Options;\n };\n\n beforeQuery: BeforeHookMethod;\n afterQuery: AfterHookMethod;\n beforeCreate: BeforeActionHookMethod;\n afterCreate: AfterSelectableHookMethod;\n afterCreateCommit: AfterSelectableHookMethod;\n beforeUpdate: BeforeActionHookMethod;\n afterUpdate: AfterSelectableHookMethod;\n afterUpdateCommit: AfterSelectableHookMethod;\n beforeSave: BeforeActionHookMethod;\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: DbSqlMethod<ColumnTypes>;\n View: TableClass<BaseViewInstance<ColumnTypes>>;\n MaterializedView: TableClass<BaseMaterializedViewInstance<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\nexport interface BaseViewInstance<\n ColumnTypes,\n> extends BaseTableInstance<ColumnTypes> {\n name: string;\n query?: Query;\n sql: string | RawSqlBase;\n readonly readOnly?: boolean;\n recursive?: boolean;\n checkOption?: 'LOCAL' | 'CASCADED';\n securityBarrier?: boolean;\n securityInvoker?: boolean;\n}\n\nexport interface BaseMaterializedViewInstance<\n ColumnTypes,\n> extends BaseTableInstance<ColumnTypes> {\n name: string;\n query?: Query;\n sql: string | RawSqlBase;\n readonly readOnly?: true;\n readonly materialized: true;\n withData?: boolean;\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}: TableFactoryOptions<SchemaConfig, ColumnTypes> = {}): BaseTableClass<\n SchemaConfig,\n ColumnTypes\n> {\n const schema = schemaConfig();\n\n const columnTypes = (\n typeof columnTypesArg === 'function'\n ? // oxlint-disable-next-line typescript/no-explicit-any\n (columnTypesArg as any)(makeColumnTypes(schema))\n : columnTypesArg || makeColumnTypes(schema)\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 instances = new WeakMap<typeof base, InstanceType<typeof base>>();\n\n const base = class BaseTable {\n static nowSQL = nowSQL;\n static exportAs = exportAs;\n static columnTypes = columnTypes;\n\n static sql = _createDbSqlMethod(columnTypes);\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 = schema.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 = schema.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 = schema.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 = schema.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 = schema.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 = schema.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 static instance(): BaseTable {\n let instance = instances.get(this);\n if (!instance) {\n instance = new this();\n const name = instance.table || instance.name;\n if (instance.nameInDb === undefined && name) {\n instance.nameInDb = instance.snakeCase ? toSnakeCase(name) : name;\n }\n instances.set(this, instance);\n }\n\n return instance;\n }\n\n table!: string;\n name!: string;\n nameInDb?: string;\n query?: Query;\n sql!: string | RawSqlBase;\n columns = defaultColumns;\n schema?: QuerySchema;\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 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 const baseWithView = base as typeof base & {\n View: typeof base;\n MaterializedView: typeof base;\n };\n\n baseWithView.View = class View extends base {\n readonly readOnly = true;\n };\n\n baseWithView.MaterializedView = class MaterializedView extends (\n baseWithView.View\n ) {\n readonly materialized = true;\n };\n\n base.prototype.types = columnTypes as typeof base.prototype.types;\n base.prototype.snakeCase = snakeCase;\n base.prototype.language = language;\n base.prototype.autoForeignKeys =\n autoForeignKeys === true ? {} : autoForeignKeys || undefined;\n\n return base as unknown as BaseTableClass<SchemaConfig, ColumnTypes>;\n}\n","import {\n AfterHook,\n ColumnSchemaConfig,\n _createDbSqlMethod,\n ColumnsShape,\n DbSqlMethod,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n ComputedOptionsFactory,\n defaultSchemaConfig,\n DbTableOptionScopes,\n getColumnTypes,\n getCallerFilePath,\n getStackTrace,\n Grant,\n makeColumnTypes,\n QueryAfterHook,\n QueryBeforeHook,\n QueryData,\n QueryHooks,\n QueryOrExpression,\n QuerySchema,\n MaybeArray,\n RecordUnknown,\n Rls,\n RlsPolicy,\n TableData,\n type TableDataItem,\n parseTableDataInput,\n tableDataMethods,\n type RawSqlBase,\n toSnakeCase,\n} from 'pqb/internal';\nimport type { Query } from 'pqb';\nimport { ORMTableInput } from './legacy-table';\nimport { TableFactoryOptions } from './table.common';\nimport type { OrchidORM } from '../orm';\n\nexport interface OrmTable<\n Id extends string,\n Table extends string,\n Columns extends ColumnsShape,\n Relations,\n ColumnTypes = unknown,\n Computed = undefined,\n Scopes extends RecordUnknown | undefined = undefined,\n SoftDelete extends true | string | undefined = undefined,\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n Data extends MaybeArray<TableDataItem> = never,\n ReadOnly extends boolean | undefined = boolean | undefined,\n> {\n data: {\n id: Id;\n name: undefined;\n table: Table;\n relations: Relations;\n columns: Columns;\n types: ColumnTypes;\n computed: Computed;\n scopes: Scopes;\n softDelete: SoftDelete;\n readOnly: ReadOnly;\n materialized: undefined;\n tableData: Data extends unknown[] ? Data : [Data];\n };\n prototype: {\n columns: {\n shape: Columns;\n };\n };\n inputSchema: SchemaConfig['inputSchema'];\n outputSchema: SchemaConfig['outputSchema'];\n querySchema: SchemaConfig['querySchema'];\n pkeySchema: SchemaConfig['pkeySchema'];\n createSchema: SchemaConfig['createSchema'];\n updateSchema: SchemaConfig['updateSchema'];\n instance(): ORMTableInput;\n exportAs: string;\n nowSQL?: string;\n\n <C extends (keyof Columns & string)[]>(\n ...columns: C\n ): OrmTable.Relations.Endpoint<Id, C, ColumnsShape.InputPartial<Columns>>;\n\n where<T>(this: T, conditions: ColumnsShape.InputPartial<Columns>): T;\n\n through<Through extends string>(\n through: Through,\n source: string,\n ): OrmTable.Relations.Through<\n Id,\n Through,\n ColumnsShape.InputPartial<Columns>\n >;\n\n primaryKey<\n Column extends keyof Columns & string,\n PrimaryKeyColumns extends [Column, ...Column[]],\n Name extends string,\n >(\n columns: PrimaryKeyColumns,\n name?: Name,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n Scopes,\n SoftDelete,\n SchemaConfig,\n Data | OrmTable.DataItemWithColumns<PrimaryKeyColumns, Name>,\n ReadOnly\n >;\n\n index(\n columns: OrmTable.IndexColumn<Columns>[],\n options?: TableData.Index.OptionsArg,\n ): this;\n\n searchIndex(\n columns: OrmTable.IndexColumn<Columns>[],\n options?: TableData.Index.TsVectorArg,\n ): this;\n\n unique<\n Items extends [\n OrmTable.IndexColumn<Columns>,\n ...OrmTable.IndexColumn<Columns>[],\n ],\n Name extends string,\n >(\n columns: Items,\n options?: TableData.Index.UniqueOptionsArg<Name>,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n Scopes,\n SoftDelete,\n SchemaConfig,\n Data | OrmTable.DataItemWithColumns<Items, Name>,\n ReadOnly\n >;\n\n exclude(\n columns: OrmTable.ExcludeColumn<Columns>[],\n options?: TableData.Exclude.Options,\n ): this;\n\n check(check: RawSqlBase, name?: string): this;\n\n softDelete(): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n Scopes,\n true,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n softDelete<Column extends keyof Columns & string>(\n column: Column,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n Scopes,\n Column,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n\n computed<Fn extends ComputedOptionsFactory<ColumnTypes, Columns>>(\n computed: Fn,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Fn,\n Scopes,\n SoftDelete,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n\n scopes<Keys extends string>(\n scopes: DbTableOptionScopes<Table, Columns, Keys>,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Relations,\n ColumnTypes,\n Computed,\n DbTableOptionScopes<Table, Columns, Keys>,\n SoftDelete,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n\n grants(grants: readonly Grant.TableClassGrant[]): this;\n\n rls(rls: OrmTable.RlsConfig): this;\n\n init(fn: OrmTable.Init<Columns>): this;\n\n foreignKey<\n Column extends keyof Columns,\n ForeignTable extends { data: { columns: ColumnsShape } },\n ForeignColumn extends keyof ForeignTable['data']['columns'],\n >(\n columns: [Column, ...Column[]],\n fnOrTable: () => ForeignTable,\n foreignColumns: [ForeignColumn, ...ForeignColumn[]],\n options?: TableData.References.Options,\n ): this;\n foreignKey<Column extends keyof Columns>(\n columns: [Column, ...Column[]],\n fnOrTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ): this;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n relations<Fn extends (self: OrmTable.Relations.Arg<keyof Columns>) => any>(\n fn: Fn,\n ): OrmTable<\n Id,\n Table,\n Columns,\n Fn,\n ColumnTypes,\n Computed,\n Scopes,\n SoftDelete,\n SchemaConfig,\n Data,\n ReadOnly\n >;\n}\n\nexport namespace OrmTable {\n export interface RlsConfig extends Rls.TableConfigBase {\n // Permissive policies for the table.\n permit: RlsPolicy.Policy[];\n // Restrictive policies for the table.\n restrict?: RlsPolicy.Policy[];\n }\n\n type DataKey<Columns extends ColumnsShape> = keyof Columns & string;\n\n export type IndexColumn<Columns extends ColumnsShape> =\n | DataKey<Columns>\n | TableData.Index.ColumnOrExpressionOptions<DataKey<Columns>>;\n\n export type ExcludeColumn<Columns extends ColumnsShape> =\n TableData.Exclude.ColumnOrExpressionOptions<DataKey<Columns>>;\n\n export interface DataItemWithColumns<\n Columns extends unknown[],\n Name extends string,\n > {\n tableDataItem: true;\n columns: Columns;\n name: string extends Name ? never : Name;\n }\n\n export interface RelationEndpointData {\n id: string;\n data?: { id: string };\n columns: string[];\n on?: RecordUnknown;\n through?: string;\n source?: string;\n relationThrough?: string;\n relationSource?: string;\n }\n\n export interface Input<\n Id extends string,\n Table extends string | undefined,\n Name extends string | undefined,\n Columns extends ColumnsShape,\n ColumnTypes,\n Relations,\n Computed,\n Scopes extends RecordUnknown | undefined,\n SoftDelete extends true | string | undefined,\n ReadOnly extends boolean | undefined,\n Materialized extends true | undefined = true | undefined,\n TableDataItems extends MaybeArray<TableDataItem> =\n MaybeArray<TableDataItem>,\n > extends ORMTableInput {\n id: Id;\n table: Table;\n name: Name;\n types: ColumnTypes;\n readonly readOnly: ReadOnly;\n readonly materialized: Materialized;\n readonly softDelete: SoftDelete;\n columns: {\n shape: Columns;\n data: TableDataItems extends unknown[]\n ? TableDataItems\n : [TableDataItems];\n };\n relations: Relations;\n computed: Computed extends ComputedOptionsFactory<never, never>\n ? Computed\n : undefined;\n scopes: Scopes extends undefined ? undefined : Scopes;\n }\n\n export interface TableFactoryKit<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n > {\n defineTable: DefineTable<SchemaConfig, ColumnTypes>;\n defineView: DefineView<SchemaConfig, ColumnTypes>;\n sql: DbSqlMethod<ColumnTypes>;\n exportAs: string;\n }\n\n export interface BeforeActionHookUtils<Columns extends ColumnsShape> {\n /**\n * Sets column values before a create, update, or save action.\n */\n set(data: {\n [K in keyof ColumnsShape.InputPartial<Columns>]?:\n | ColumnsShape.InputPartial<Columns>[K]\n | (() => QueryOrExpression<ColumnsShape.InputPartial<Columns>[K]>);\n }): void;\n }\n\n export interface InitHooks<Columns extends ColumnsShape> {\n /**\n * Registers a hook to run before every query.\n */\n beforeQuery(cb: QueryBeforeHook): void;\n /**\n * Registers a hook to run after every query.\n */\n afterQuery(cb: QueryAfterHook): void;\n /**\n * Registers a hook to run before create actions.\n */\n beforeCreate(\n cb: (utils: BeforeActionHookUtils<Columns>) => void | Promise<void>,\n ): void;\n /**\n * Registers a hook to run after create actions.\n */\n afterCreate<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run after create commits.\n */\n afterCreateCommit<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run before update actions.\n */\n beforeUpdate(\n cb: (utils: BeforeActionHookUtils<Columns>) => void | Promise<void>,\n ): void;\n /**\n * Registers a hook to run after update actions.\n */\n afterUpdate<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run after update commits.\n */\n afterUpdateCommit<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run before create or update actions.\n */\n beforeSave(\n cb: (utils: BeforeActionHookUtils<Columns>) => void | Promise<void>,\n ): void;\n /**\n * Registers a hook to run after create or update actions.\n */\n afterSave<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run after create or update commits.\n */\n afterSaveCommit<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run before delete actions.\n */\n beforeDelete(cb: QueryBeforeHook): void;\n /**\n * Registers a hook to run after delete actions.\n */\n afterDelete<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n /**\n * Registers a hook to run after delete commits.\n */\n afterDeleteCommit<S extends (keyof Columns & string)[]>(\n select: S,\n cb: AfterHook<S, Columns>,\n ): void;\n }\n\n export type Init<Columns extends ColumnsShape> = (\n orm: unknown,\n hooks: InitHooks<Columns>,\n ) => void;\n\n export interface DefineTableOptions {\n /**\n * Stable table identity used when resolving relation targets.\n */\n id?: string;\n /**\n * Database table name used when it differs from the query-facing table name.\n */\n nameInDb?: string;\n /**\n * Database schema containing this table.\n */\n schema?: QuerySchema;\n /**\n * Suppress the no-primary-key error for this table.\n */\n noPrimaryKey?: boolean;\n /**\n * Override the table factory snake-case setting for this table.\n */\n snakeCase?: boolean;\n /**\n * Table comment.\n */\n comment?: string;\n /**\n * Exclude this table from generated migration DDL reconciliation.\n */\n generatorIgnore?: true;\n /**\n * Auto-create foreign keys for relations of this table.\n */\n autoForeignKeys?: TableData.References.BaseOptions | boolean;\n /**\n * Mark this table as read-only to prevent mutations.\n */\n readOnly?: boolean;\n }\n\n type DefineTableId<\n Table extends string,\n Options extends DefineTableOptions,\n > = Options extends { id: infer Id extends string } ? Id : Table;\n\n type DefineTableReadOnly<Options extends DefineTableOptions> =\n Options extends { readOnly: true } ? true : undefined;\n\n export interface DefineTable<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n > {\n <Table extends string, Columns extends ColumnsShape>(\n table: Table,\n t: (columnTypes: ColumnTypes) => Columns,\n ): OrmTable<\n Table,\n Table,\n Columns,\n undefined,\n ColumnTypes,\n undefined,\n undefined,\n undefined,\n SchemaConfig,\n never,\n undefined\n >;\n <\n Table extends string,\n const Options extends DefineTableOptions,\n Columns extends ColumnsShape,\n >(\n table: Table,\n options: Options,\n t: (columnTypes: ColumnTypes) => Columns,\n ): OrmTable<\n DefineTableId<Table, Options>,\n Table,\n Columns,\n undefined,\n ColumnTypes,\n undefined,\n undefined,\n undefined,\n SchemaConfig,\n never,\n DefineTableReadOnly<Options>\n >;\n\n /**\n * Returns the file path where the table factory was defined.\n * Uses stack trace analysis to determine the caller's file path.\n * @throws Error if file path cannot be determined and `filePath` option was not provided to `createTableFactory`\n */\n getFilePath(): string;\n /**\n * Column types configured for this table factory.\n */\n types: ColumnTypes;\n /**\n * Export name configured for this table factory.\n */\n exportAs: string;\n /**\n * Custom timestamp SQL configured for this table factory.\n */\n nowSQL?: string;\n /**\n * Whether this table factory maps columns and table names to snake case.\n */\n snakeCase?: boolean;\n /**\n * Default full text search language configured for this table factory.\n */\n language?: string;\n }\n\n export interface DefineViewOptions {\n /**\n * Stable view identity used when resolving relation targets.\n * Defaults to the view name when not provided.\n */\n id?: string;\n /**\n * Database schema containing this view.\n */\n schema?: QuerySchema;\n /**\n * Database view name used when it differs from the query-facing view name.\n */\n nameInDb?: string;\n /**\n * Override the table factory snake-case setting for this view.\n */\n snakeCase?: boolean;\n /**\n * Default language for full text search columns in this view.\n */\n language?: string;\n /**\n * Exclude this view from generated migration DDL reconciliation.\n */\n generatorIgnore?: true;\n /**\n * SQL expression that defines this view.\n */\n sql?: string | RawSqlBase;\n /**\n * Set to false to expose mutation methods on a regular view.\n */\n readOnly?: boolean;\n /**\n * Mark this definition as a materialized view.\n */\n materialized?: true;\n /**\n * CREATE MATERIALIZED VIEW WITH DATA / WITH NO DATA option.\n */\n withData?: boolean;\n /**\n * CREATE VIEW RECURSIVE option used by migration generation.\n */\n recursive?: boolean;\n /**\n * CREATE VIEW CHECK OPTION used by migration generation.\n */\n checkOption?: 'LOCAL' | 'CASCADED';\n /**\n * CREATE VIEW security_barrier option used by migration generation.\n */\n securityBarrier?: boolean;\n /**\n * CREATE VIEW security_invoker option used by migration generation.\n */\n securityInvoker?: boolean;\n }\n\n type DefineViewId<Options, Name extends string> = Options extends {\n id: infer Id extends string;\n }\n ? Id\n : Name;\n\n type DefineViewReadOnly<Options> = Options extends { readOnly: false }\n ? Options extends { materialized: true }\n ? true\n : false\n : true;\n\n type DefineViewMaterialized<Options> = Options extends { materialized: true }\n ? true\n : undefined;\n\n export interface View<\n Id extends string,\n Name extends string,\n Columns extends ColumnsShape,\n ColumnTypes,\n Relations,\n Computed = undefined,\n Scopes extends RecordUnknown | undefined = undefined,\n SoftDelete extends true | string | undefined = undefined,\n ReadOnly extends boolean | undefined = true,\n Materialized extends true | undefined = undefined,\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n > {\n data: {\n id: Id;\n table: undefined;\n name: Name;\n relations: Relations;\n columns: Columns;\n types: ColumnTypes;\n computed: Computed;\n scopes: Scopes;\n softDelete: SoftDelete;\n readOnly: ReadOnly;\n materialized: Materialized;\n tableData: TableDataItem[];\n };\n prototype: {\n columns: {\n shape: Columns;\n };\n };\n inputSchema: SchemaConfig['inputSchema'];\n outputSchema: SchemaConfig['outputSchema'];\n querySchema: SchemaConfig['querySchema'];\n pkeySchema: SchemaConfig['pkeySchema'];\n createSchema: SchemaConfig['createSchema'];\n updateSchema: SchemaConfig['updateSchema'];\n\n <C extends (keyof Columns & string)[]>(\n ...columns: C\n ): OrmTable.Relations.Endpoint<Id, C, ColumnsShape.InputPartial<Columns>>;\n\n instance(): ORMTableInput;\n nowSQL?: string;\n\n query(fn: (orm: OrchidORM) => Query): this;\n\n through<Through extends string>(\n through: Through,\n source: string,\n ): OrmTable.Relations.Through<\n Id,\n Through,\n ColumnsShape.InputPartial<Columns>\n >;\n\n softDelete(): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Relations,\n Computed,\n Scopes,\n true,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n softDelete<Column extends keyof Columns & string>(\n column: Column,\n ): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Relations,\n Computed,\n Scopes,\n Column,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n\n computed<Fn extends ComputedOptionsFactory<unknown, Columns>>(\n computed: Fn,\n ): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Relations,\n Fn,\n Scopes,\n SoftDelete,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n\n scopes<Keys extends string>(\n scopes: DbTableOptionScopes<Name, Columns, Keys>,\n ): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Relations,\n Computed,\n DbTableOptionScopes<Name, Columns, Keys>,\n SoftDelete,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n\n grants(grants: readonly Grant.TableClassGrant[]): this;\n\n init(fn: OrmTable.Init<Columns>): this;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n relations<Fn extends (self: OrmTable.Relations.Arg<keyof Columns>) => any>(\n fn: Fn,\n ): View<\n Id,\n Name,\n Columns,\n ColumnTypes,\n Fn,\n Computed,\n Scopes,\n SoftDelete,\n ReadOnly,\n Materialized,\n SchemaConfig\n >;\n }\n\n export interface DefineView<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n > {\n <Name extends string, Columns extends ColumnsShape>(\n name: Name,\n t: (columnTypes: ColumnTypes) => Columns,\n ): View<\n Name,\n Name,\n Columns,\n ColumnTypes,\n undefined,\n undefined,\n undefined,\n undefined,\n true,\n undefined,\n SchemaConfig\n >;\n <\n Name extends string,\n const Options extends DefineViewOptions,\n Columns extends ColumnsShape,\n >(\n name: Name,\n options: Options,\n t: (columnTypes: ColumnTypes) => Columns,\n ): View<\n DefineViewId<Options, Name>,\n Name,\n Columns,\n ColumnTypes,\n undefined,\n undefined,\n undefined,\n undefined,\n DefineViewReadOnly<Options>,\n DefineViewMaterialized<Options>,\n SchemaConfig\n >;\n }\n\n export namespace Relations {\n export type Resolve<Relations> = Relations extends (\n ...args: never[]\n ) => infer Result\n ? ResolveMany<Result>\n : Relations;\n\n export type ResolveMany<Relations> = {\n [K in keyof Relations]: ResolveOne<Relations[K]>;\n };\n\n export type ResolveOne<Relation> =\n Relation extends BelongsTo<infer C, infer Fn, infer Required>\n ? ResolvedBelongsTo<TargetId<Fn>, C, TargetReferences<Fn>, Required>\n : Relation extends HasOne<infer C, infer Fn, infer Required>\n ? ResolvedHasOne<TargetId<Fn>, C, TargetReferences<Fn>, Required>\n : Relation extends HasMany<infer C, infer Fn>\n ? ResolvedHasMany<TargetId<Fn>, C, TargetReferences<Fn>>\n : Relation extends HasAndBelongsToMany<\n infer C,\n infer Fn,\n infer Options\n >\n ? ResolveHasAndBelongsToMany<C, Fn, Options>\n : Relation extends HasOneThrough<infer Fn, infer Required>\n ? ResolvedHasOneThrough<\n TargetId<Fn>,\n ResolveHasOneThroughOptions<\n RelationThroughOptions<TargetThrough<Fn>>,\n Required\n >\n >\n : Relation extends HasManyThrough<infer Fn>\n ? ResolvedHasManyThrough<\n TargetId<Fn>,\n RelationThroughOptions<TargetThrough<Fn>>\n >\n : Relation;\n\n export type ResolveHasAndBelongsToMany<\n C extends string[],\n Fn extends Function,\n Options,\n References extends string[] = TargetReferences<Fn>,\n > = ResolvedHasAndBelongsToMany<\n TargetId<Fn>,\n C,\n References,\n ResolveHasAndBelongsToManyOptions<C, References, Options>\n >;\n\n export type TargetResult<Fn extends Function> =\n Fn extends () => infer Result ? Result : never;\n\n export type TargetId<Fn extends Function> =\n TargetResult<Fn> extends { id: infer Id extends string }\n ? Id\n : TargetResult<Fn> extends {\n data: { id: infer Id extends string };\n }\n ? Id\n : string;\n\n export type TargetReferences<Fn extends Function> =\n TargetResult<Fn> extends { columns: infer References extends string[] }\n ? References\n : string[];\n\n export type TargetThrough<Fn extends Function> =\n TargetResult<Fn> extends { through: infer Through extends string }\n ? Through\n : string;\n\n export interface Arg<ColumnKeys> {\n <C extends (ColumnKeys & string)[]>(...columns: C): Fns<C>;\n hasOne<Fn extends Function>(fn: Fn): HasOneThrough<Fn>;\n hasMany<Fn extends Function>(fn: Fn): HasManyThrough<Fn>;\n }\n\n export interface Through<\n Id extends string,\n Through extends string,\n Conditions,\n > {\n id: Id;\n through: Through;\n source: string;\n where<T>(this: T, conditions: Conditions): T;\n }\n\n export interface Endpoint<Id extends string, C, Conditions> {\n id: Id;\n columns: C;\n where<T>(this: T, conditions: Conditions): T;\n through<Through extends string>(\n through: Through,\n source: string,\n ): OrmTable.Relations.Through<Id, Through, Conditions>;\n }\n\n export interface Fns<C extends string[]> {\n belongsTo<Fn extends Function>(fn: Fn): BelongsTo<C, Fn>;\n hasOne<Fn extends Function>(fn: Fn): HasOne<C, Fn>;\n hasMany<Fn extends Function>(fn: Fn): HasMany<C, Fn>;\n hasAndBelongsToMany<Fn extends Function>(\n fn: Fn,\n ): HasAndBelongsToMany<C, Fn>;\n }\n\n export interface LazyRelationRefsOptions<C extends string[]> {\n columns: C;\n }\n\n export interface LazyRelationRefsOptionsWithRequired<\n C extends string[],\n Required extends boolean,\n > extends LazyRelationRefsOptions<C> {\n required: Required;\n }\n\n export type LazyRelationRefsOptionsForRequired<\n C extends string[],\n Required extends boolean | undefined,\n > = Required extends boolean\n ? LazyRelationRefsOptionsWithRequired<C, Required>\n : LazyRelationRefsOptions<C>;\n\n export interface RelationRefsOptions<\n C extends string[],\n References extends string[],\n > extends LazyRelationRefsOptions<C> {\n references: References;\n }\n\n export interface RelationRefsOptionsWithRequired<\n C extends string[],\n References extends string[],\n Required extends boolean,\n > extends RelationRefsOptions<C, References> {\n required: Required;\n }\n\n export type RelationRefsOptionsForRequired<\n C extends string[],\n References extends string[],\n Required extends boolean | undefined,\n > = Required extends boolean\n ? RelationRefsOptionsWithRequired<C, References, Required>\n : RelationRefsOptions<C, References>;\n\n export interface BelongsTo<\n C extends string[],\n Fn extends Function,\n Required extends boolean | undefined = undefined,\n > {\n type: 'belongsTo';\n fn: Fn;\n options: LazyRelationRefsOptionsForRequired<C, Required>;\n __required?: Required;\n required(): BelongsTo<C, Fn, true>;\n required(value: false): BelongsTo<C, Fn, false>;\n /**\n * Controls whether a foreign key constraint is auto-created on the\n * **owning table** (the table this relation is defined on).\n *\n * - `true` (default when autoForeignKeys is enabled) — create FK with DB defaults.\n * - `false` — skip FK creation entirely.\n * - `{ onUpdate: 'CASCADE', onDelete: 'SET NULL' }` — create FK with these options.\n *\n * Only needed when `autoForeignKeys` is enabled on the table config;\n * otherwise no FK is created by default.\n *\n * @example\n * // disable FK for this relation\n * user('Id').belongsTo(() => ProfileTable('UserId')).foreignKey(false)\n *\n * @example\n * // custom FK options\n * user('Id').belongsTo(() => ProfileTable('UserId')).foreignKey({ onDelete: 'CASCADE' })\n */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): BelongsTo<C, Fn, Required>;\n }\n\n export interface HasOne<\n C extends string[],\n Fn extends Function,\n Required extends boolean | undefined = undefined,\n > {\n type: 'hasOne';\n fn: Fn;\n options: LazyRelationRefsOptionsForRequired<C, Required>;\n __required?: Required;\n required(): HasOne<C, Fn, true>;\n required(value: false): HasOne<C, Fn, false>;\n /**\n * Controls whether a foreign key constraint is auto-created on the\n * **related table** (the table pointed to by this relation).\n *\n * - `true` (default when autoForeignKeys is enabled) — create FK with DB defaults.\n * - `false` — skip FK creation entirely.\n * - `{ onUpdate: 'CASCADE', onDelete: 'SET NULL' }` — create FK with these options.\n *\n * Only needed when `autoForeignKeys` is enabled on the table config;\n * otherwise no FK is created by default.\n *\n * @example\n * // disable FK for this relation\n * user('Id').hasOne(() => ProfileTable('UserId')).foreignKey(false)\n *\n * @example\n * // custom FK options\n * user('Id').hasOne(() => ProfileTable('UserId')).foreignKey({ onDelete: 'CASCADE' })\n */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): HasOne<C, Fn, Required>;\n }\n\n export interface HasMany<C extends string[], Fn extends Function> {\n type: 'hasMany';\n fn: Fn;\n options: LazyRelationRefsOptions<C>;\n /**\n * Controls whether a foreign key constraint is auto-created on the\n * **related table** (the table pointed to by this relation).\n *\n * - `true` (default when autoForeignKeys is enabled) — create FK with DB defaults.\n * - `false` — skip FK creation entirely.\n * - `{ onUpdate: 'CASCADE', onDelete: 'SET NULL' }` — create FK with these options.\n *\n * Only needed when `autoForeignKeys` is enabled on the table config;\n * otherwise no FK is created by default.\n *\n * @example\n * // disable FK for this relation\n * user('Id').hasMany(() => PostTable('UserId')).foreignKey(false)\n *\n * @example\n * // custom FK options\n * user('Id').hasMany(() => PostTable('UserId')).foreignKey({ onDelete: 'CASCADE' })\n */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): HasMany<C, Fn>;\n }\n\n export interface HasAndBelongsToManyOptions<C extends string[]> {\n columns: C;\n }\n\n export interface HasAndBelongsToManyForeignKeyOptions {\n forThisTable?: boolean | TableData.References.BaseOptions;\n forRelatedTable?: boolean | TableData.References.BaseOptions;\n forBothTables?: boolean | TableData.References.BaseOptions;\n }\n\n export interface LazyHasAndBelongsToManyThroughOptions<\n C extends string[],\n > extends HasAndBelongsToManyOptions<C> {\n references: string[];\n through: {\n // Schema parsed from a schema-qualified join table name.\n schema?: QuerySchema;\n table: string;\n snakeCase?: boolean;\n columns: string[];\n references: string[];\n };\n foreignKeys?: HasAndBelongsToManyForeignKeyOptions;\n }\n\n export interface HasAndBelongsToManyThroughOptions<\n C extends string[],\n References extends string[],\n > extends HasAndBelongsToManyOptions<C> {\n references: string[];\n through: {\n // Schema parsed from a schema-qualified join table name.\n schema?: QuerySchema;\n table: string;\n snakeCase?: boolean;\n columns: string[];\n references: References;\n };\n foreignKeys?: HasAndBelongsToManyForeignKeyOptions;\n }\n\n export interface HasAndBelongsToManyThroughConfig {\n /**\n * Database schema containing this join table.\n */\n schema?: QuerySchema;\n /**\n * Set to false to preserve the join table name when the owning table\n * uses snake-case mode.\n */\n joinTableSnakeCase?: boolean;\n }\n\n export type ResolveHasAndBelongsToManyOptions<\n C extends string[],\n References extends string[],\n Options = HasAndBelongsToManyOptions<C>,\n > =\n Options extends LazyHasAndBelongsToManyThroughOptions<C>\n ? HasAndBelongsToManyThroughOptions<C, References>\n : Options;\n\n export type ResolveHasOneThroughOptions<\n Options,\n Required extends boolean | undefined,\n > = Required extends boolean ? Options & { required: Required } : Options;\n\n export interface HasAndBelongsToMany<\n C extends string[],\n Fn extends Function,\n Options = HasAndBelongsToManyOptions<C>,\n > {\n type: 'hasAndBelongsToMany';\n fn: Fn;\n options: Options;\n through(\n joinTable: string,\n selfColumns: string | (string[] & { length: C['length'] }),\n relColumns: string | string[],\n options?: HasAndBelongsToManyThroughConfig,\n ): HasAndBelongsToMany<C, Fn, LazyHasAndBelongsToManyThroughOptions<C>>;\n /**\n * Controls foreign key constraints on the **join table**. Unlike other\n * relation kinds, hasAndBelongsToMany creates FKs on both sides of the\n * join, so this method accepts a richer options object.\n *\n * - `true` (default) — create all join-table FKs with DB defaults.\n * - `false` — skip all join-table FK creation.\n * - `{ forThisTable, forRelatedTable, forBothTables }` — fine-grained control:\n * - `forThisTable` — FK from join table → **owning table** (this table).\n * - `forRelatedTable` — FK from join table → **related table**.\n * - `forBothTables` — shorthand: applies to both FKs at once.\n *\n * Each sub-value can be `false` (skip), `true` (default), or\n * `{ onUpdate: 'CASCADE', onDelete: 'SET NULL' }` (custom options).\n *\n * Must be called **after** `.through()`.\n *\n * @example\n * // disable all join-table FKs\n * post('Id')\n * .hasAndBelongsToMany(() => TagTable('Id'))\n * .through('postTag', ['postId'], ['tagId'])\n * .foreignKey(false)\n *\n * @example\n * // custom FK on both sides\n * post('Id')\n * .hasAndBelongsToMany(() => TagTable('Id'))\n * .through('postTag', ['postId'], ['tagId'])\n * .foreignKey({\n * forThisTable: { onDelete: 'CASCADE' },\n * forRelatedTable: { onDelete: 'CASCADE' },\n * })\n *\n * @example\n * // same custom FK via shorthand\n * post('Id')\n * .hasAndBelongsToMany(() => TagTable('Id'))\n * .through('postTag', ['postId'], ['tagId'])\n * .foreignKey({ forBothTables: { onDelete: 'CASCADE' } })\n */\n foreignKey(\n value?: boolean | HasAndBelongsToManyForeignKeyOptions,\n ): HasAndBelongsToMany<C, Fn, Options>;\n }\n\n export interface ResolvedBelongsTo<\n Id extends string,\n C extends string[],\n References extends string[],\n Required extends boolean | undefined = undefined,\n > {\n type: 'belongsTo';\n id: Id;\n options: RelationRefsOptionsForRequired<C, References, Required>;\n __required?: Required;\n required(): ResolvedBelongsTo<Id, C, References, true>;\n required(value: false): ResolvedBelongsTo<Id, C, References, false>;\n /** @see BelongsTo.foreignKey */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): ResolvedBelongsTo<Id, C, References, Required>;\n }\n\n export interface ResolvedHasOne<\n Id extends string,\n C extends string[],\n References extends string[],\n Required extends boolean | undefined = undefined,\n > {\n type: 'hasOne';\n id: Id;\n options: RelationRefsOptionsForRequired<C, References, Required>;\n __required?: Required;\n required(): ResolvedHasOne<Id, C, References, true>;\n required(value: false): ResolvedHasOne<Id, C, References, false>;\n /** @see HasOne.foreignKey */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): ResolvedHasOne<Id, C, References, Required>;\n }\n\n export interface ResolvedHasMany<\n Id extends string,\n C extends string[],\n References extends string[],\n > {\n type: 'hasMany';\n id: Id;\n options: RelationRefsOptions<C, References>;\n /** @see HasMany.foreignKey */\n foreignKey(\n value?: boolean | TableData.References.BaseOptions,\n ): ResolvedHasMany<Id, C, References>;\n }\n\n export interface ResolvedHasAndBelongsToMany<\n Id extends string,\n C extends string[],\n References extends string[],\n Options = HasAndBelongsToManyOptions<C>,\n > {\n type: 'hasAndBelongsToMany';\n id: Id;\n options: Options;\n through(\n joinTable: string,\n selfColumns: string | (string[] & { length: C['length'] }),\n relColumns: string | string[],\n options?: HasAndBelongsToManyThroughConfig,\n ): ResolvedHasAndBelongsToMany<\n Id,\n C,\n References,\n HasAndBelongsToManyThroughOptions<C, References>\n >;\n }\n\n export interface RelationThroughOptions<Through extends string = string> {\n through: Through;\n source: string;\n on?: RecordUnknown;\n required?: boolean;\n }\n\n export interface HasOneThrough<\n Fn extends Function,\n Required extends boolean | undefined = undefined,\n > {\n type: 'hasOne';\n fn: Fn;\n options: ResolveHasOneThroughOptions<\n RelationThroughOptions<TargetThrough<Fn>>,\n Required\n >;\n __required?: Required;\n required(): HasOneThrough<Fn, true>;\n required(value: false): HasOneThrough<Fn, false>;\n }\n\n export interface HasManyThrough<Fn extends Function> {\n type: 'hasMany';\n fn: Fn;\n options: RelationThroughOptions<TargetThrough<Fn>>;\n }\n\n export interface ResolvedHasOneThrough<Id extends string, Options> {\n type: 'hasOne';\n id: Id;\n options: Options;\n __required?: Options extends { required?: infer Required }\n ? Required\n : undefined;\n required(): ResolvedHasOneThrough<Id, Options & { required: true }>;\n required(\n value: false,\n ): ResolvedHasOneThrough<Id, Options & { required: false }>;\n }\n\n export interface ResolvedHasManyThrough<Id extends string, Options> {\n type: 'hasMany';\n id: Id;\n options: Options;\n }\n }\n}\n\nconst makeRelationEndpoint = (\n id: string,\n columns: string[],\n on?: RecordUnknown,\n through?: string,\n source?: string,\n): OrmTable.RelationEndpointData => {\n const endpoint = {\n id,\n columns,\n on,\n relationThrough: through,\n relationSource: source,\n where(conditions: RecordUnknown) {\n return makeRelationEndpoint(\n id,\n columns,\n { ...on, ...conditions },\n through,\n source,\n );\n },\n } as RecordUnknown;\n\n if (through) {\n endpoint.through = through;\n endpoint.source = source;\n } else {\n endpoint.through = (through: string, source: string) =>\n makeRelationEndpoint(id, columns, on, through, source);\n }\n\n return endpoint as never;\n};\n\nconst getRelationTargetId = (target: unknown): string => {\n const item = target as { id?: string; data?: { id: string } };\n const id = item.id ?? item.data?.id;\n if (!id) {\n throw new Error('Cannot get relation target id');\n }\n\n return id;\n};\n\nconst getRelationEndpointOptions = (endpoint: OrmTable.RelationEndpointData) =>\n endpoint.on\n ? { references: endpoint.columns, on: endpoint.on }\n : { references: endpoint.columns };\n\nconst getRelationThroughOptions = (endpoint: OrmTable.RelationEndpointData) => {\n const options: RecordUnknown = {\n through: endpoint.relationThrough,\n source: endpoint.relationSource,\n };\n if (endpoint.on) options.on = endpoint.on;\n\n return options;\n};\n\nconst makeRelationBuilder = () => {\n const withRequired = (relation: unknown) => {\n const item = relation as {\n options: {\n required?: boolean;\n foreignKey?: boolean | TableData.References.BaseOptions;\n };\n required?: (value?: boolean) => unknown;\n foreignKey?: (\n value?: boolean | TableData.References.BaseOptions,\n ) => unknown;\n };\n item.required = (value = true) => {\n item.options.required = value;\n return item;\n };\n item.foreignKey = (\n value: boolean | TableData.References.BaseOptions = true,\n ) => {\n item.options.foreignKey = value;\n return item;\n };\n\n return item as never;\n };\n\n const builder = ((...columns: string[]) => ({\n belongsTo: (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n return withRequired({\n type: 'belongsTo',\n id: getRelationTargetId(endpoint),\n options: { columns, ...getRelationEndpointOptions(endpoint) },\n });\n },\n hasOne: (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n return withRequired({\n type: 'hasOne',\n id: getRelationTargetId(endpoint),\n options: { columns, ...getRelationEndpointOptions(endpoint) },\n } as never);\n },\n hasMany: (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n return withRequired({\n type: 'hasMany',\n id: getRelationTargetId(endpoint),\n options: { columns, ...getRelationEndpointOptions(endpoint) },\n } as never);\n },\n hasAndBelongsToMany: (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n const options = { columns } as {\n columns: string[];\n references?: string[];\n on?: RecordUnknown;\n foreignKey?: boolean | TableData.References.Options;\n through?: {\n // Schema parsed from a schema-qualified join table name.\n schema?: QuerySchema;\n table: string;\n snakeCase?: boolean;\n columns: string[];\n references: string[];\n foreignKey?: boolean | TableData.References.Options;\n };\n };\n const relation = {\n type: 'hasAndBelongsToMany',\n id: getRelationTargetId(endpoint),\n options,\n through(\n joinTable: string,\n selfColumns: string | string[],\n relColumns: string | string[],\n throughOptions?: OrmTable.Relations.HasAndBelongsToManyThroughConfig,\n ) {\n this.options.references = Array.isArray(selfColumns)\n ? selfColumns\n : [selfColumns];\n this.options.on = endpoint.on;\n const schemaIndex = joinTable.indexOf('.');\n const parsedSchema =\n schemaIndex === -1 ? undefined : joinTable.slice(0, schemaIndex);\n const table =\n schemaIndex === -1 ? joinTable : joinTable.slice(schemaIndex + 1);\n this.options.through = {\n schema: throughOptions?.schema ?? parsedSchema,\n table,\n snakeCase: throughOptions?.joinTableSnakeCase,\n columns: Array.isArray(relColumns) ? relColumns : [relColumns],\n references: endpoint.columns,\n };\n\n return this;\n },\n foreignKey(\n value?:\n | boolean\n | {\n forThisTable?: boolean | TableData.References.BaseOptions;\n forRelatedTable?: boolean | TableData.References.BaseOptions;\n forBothTables?: boolean | TableData.References.BaseOptions;\n },\n ) {\n if (value === false) {\n this.options.foreignKey = false;\n if (this.options.through) {\n this.options.through.foreignKey = false;\n }\n } else if (value === undefined || value === true) {\n this.options.foreignKey = true;\n if (this.options.through) {\n this.options.through.foreignKey = true;\n }\n } else if ('forBothTables' in value) {\n this.options.foreignKey = value.forBothTables ?? true;\n if (this.options.through) {\n this.options.through.foreignKey = value.forBothTables ?? true;\n }\n } else {\n this.options.foreignKey = value.forThisTable ?? true;\n if (this.options.through) {\n this.options.through.foreignKey = value.forRelatedTable ?? true;\n }\n }\n\n return this;\n },\n };\n\n return relation as never;\n },\n })) as unknown as {\n hasOne(fn: () => unknown): unknown;\n hasMany(fn: () => unknown): unknown;\n };\n\n builder.hasOne = (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n\n return withRequired({\n type: 'hasOne',\n id: getRelationTargetId(endpoint),\n options: getRelationThroughOptions(endpoint),\n } as never);\n };\n builder.hasMany = (fn: () => unknown) => {\n const endpoint = fn() as OrmTable.RelationEndpointData;\n\n return {\n type: 'hasMany',\n id: getRelationTargetId(endpoint),\n options: getRelationThroughOptions(endpoint),\n } as never;\n };\n\n return builder as never;\n};\n\nclass InitHookTarget extends QueryHooks {\n constructor(public q: QueryData) {\n super();\n }\n\n clone<T>(this: T): T {\n return this;\n }\n}\n\nconst setDefinitionSchemaMethods = (\n definition: {\n prototype: {\n columns?: {\n shape: ColumnsShape;\n };\n };\n inputSchema?: unknown;\n outputSchema?: unknown;\n querySchema?: unknown;\n pkeySchema?: unknown;\n createSchema?: unknown;\n updateSchema?: unknown;\n },\n schema: ColumnSchemaConfig,\n shape: ColumnsShape,\n) => {\n definition.prototype ??= {};\n definition.prototype.columns = { shape };\n definition.inputSchema = schema.inputSchema;\n definition.outputSchema = schema.outputSchema;\n definition.querySchema = schema.querySchema;\n definition.pkeySchema = schema.pkeySchema;\n definition.createSchema = schema.createSchema;\n definition.updateSchema = schema.updateSchema;\n};\n\nexport const createTableFactory = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>(\n options?: TableFactoryOptions<SchemaConfig, ColumnTypes>,\n): OrmTable.TableFactoryKit<SchemaConfig, ColumnTypes> => {\n const schema = (\n options?.schemaConfig ?? defaultSchemaConfig\n )() as SchemaConfig;\n const defaultColumnTypes = makeColumnTypes(schema);\n const columnTypesOption = options?.columnTypes;\n const columnTypes = (\n typeof columnTypesOption === 'function'\n ? // oxlint-disable-next-line typescript/no-explicit-any\n (columnTypesOption as any)(defaultColumnTypes)\n : columnTypesOption || defaultColumnTypes\n ) as ColumnTypes;\n\n const defineTableExportAs = options?.defineTableExportAs ?? 'defineTable';\n\n // stack is needed only if filePath wasn't given\n const filePathOrStack = options?.filePath || getStackTrace();\n\n let filePath: string | undefined;\n\n const defineTable = ((\n table: string,\n optionsOrT:\n | OrmTable.DefineTableOptions\n | ((columnTypes: ColumnTypes) => ColumnsShape),\n maybeT?: (columnTypes: ColumnTypes) => ColumnsShape,\n ) => {\n const tableOptions =\n typeof optionsOrT === 'function' ? undefined : optionsOrT;\n const t = typeof optionsOrT === 'function' ? optionsOrT : maybeT;\n if (!t) throw new Error('Column definitions are required');\n\n const id = tableOptions?.id ?? table;\n const shape = getColumnTypes(\n columnTypes,\n t,\n options?.nowSQL,\n options?.language,\n );\n const tableData: TableData = {};\n\n const snakeCase = tableOptions?.snakeCase ?? options?.snakeCase;\n\n if (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 const nameInDb =\n tableOptions?.nameInDb ?? (snakeCase ? toSnakeCase(table) : table);\n\n const autoForeignKeys =\n tableOptions?.autoForeignKeys !== undefined\n ? tableOptions.autoForeignKeys\n : options?.autoForeignKeys;\n\n const instance: ORMTableInput & {\n q: QueryData;\n relations?: unknown;\n init?(orm: unknown): void;\n } = {\n id,\n table,\n nameInDb,\n schema: tableOptions?.schema,\n noPrimaryKey: tableOptions?.noPrimaryKey,\n snakeCase,\n comment: tableOptions?.comment,\n generatorIgnore: tableOptions?.generatorIgnore,\n readOnly: tableOptions?.readOnly,\n columns: {\n shape,\n data: tableData as never,\n },\n types: columnTypes,\n filePath: options?.filePath ?? '',\n language: options?.language,\n autoForeignKeys:\n autoForeignKeys === true ? {} : autoForeignKeys || undefined,\n q: {} as QueryData,\n };\n\n const definition = ((...columns: string[]) =>\n makeRelationEndpoint(id, columns)) as unknown as OrmTable<\n typeof id,\n typeof table,\n ReturnType<typeof t>,\n undefined,\n typeof columnTypes,\n undefined,\n undefined,\n undefined,\n typeof schema,\n never,\n typeof tableOptions extends { readOnly: true } ? true : undefined\n >;\n\n definition.data = {\n id,\n table,\n name: undefined,\n relations: undefined,\n columns: shape as ReturnType<typeof t>,\n types: undefined,\n computed: undefined,\n scopes: undefined,\n readOnly: tableOptions?.readOnly,\n tableData: tableData as never,\n } as never;\n setDefinitionSchemaMethods(definition, schema, shape);\n\n definition.exportAs = defineTableExportAs;\n definition.nowSQL = options?.nowSQL;\n\n definition.instance = () => {\n const { computed, relations, scopes, softDelete, readOnly } =\n definition.data as RecordUnknown;\n instance.computed = computed as never;\n instance.scopes = scopes as never;\n (instance as { softDelete: unknown }).softDelete = softDelete;\n (instance as { readOnly: unknown }).readOnly = readOnly;\n instance.relations =\n typeof relations === 'function'\n ? (relations as (arg: never) => unknown)(makeRelationBuilder())\n : relations;\n\n return instance as never;\n };\n definition.where = function (conditions: RecordUnknown) {\n return makeRelationEndpoint(id, [], conditions);\n } as never;\n definition.through = (through, source) =>\n makeRelationEndpoint(id, [], undefined, through, source) as never;\n definition.primaryKey = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).primaryKey(...args) as never,\n );\n return definition as never;\n };\n definition.index = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).index(...args) as never,\n );\n return definition as never;\n };\n definition.searchIndex = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).searchIndex(...args) as never,\n );\n return definition as never;\n };\n definition.unique = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).unique(...args) as never,\n );\n return definition as never;\n };\n definition.exclude = (...args) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).exclude(...args) as never,\n );\n return definition as never;\n };\n definition.check = (...args) => {\n parseTableDataInput(tableData, tableDataMethods.check(...args) as never);\n return definition as never;\n };\n definition.softDelete = (column?: string) => {\n (definition.data as RecordUnknown).softDelete = column || true;\n return definition as never;\n };\n definition.computed = (computed) => {\n (definition.data as RecordUnknown).computed = computed;\n return definition as never;\n };\n definition.scopes = (scopes) => {\n (definition.data as RecordUnknown).scopes = scopes;\n return definition as never;\n };\n definition.grants = (grants) => {\n instance.grants = grants as never;\n return definition as never;\n };\n definition.rls = (rls) => {\n instance.rls = rls as never;\n return definition as never;\n };\n definition.init = (fn) => {\n instance.init = function (\n this: ORMTableInput & { q: QueryData },\n orm: unknown,\n ) {\n fn(orm, new InitHookTarget(this.q));\n };\n return definition as never;\n };\n definition.foreignKey = (\n columns: [string, ...string[]],\n fnOrTable: (() => unknown) | string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ) => {\n parseTableDataInput(\n tableData,\n // oxlint-disable-next-line typescript/no-explicit-any\n (tableDataMethods as any).foreignKey(\n columns,\n fnOrTable,\n foreignColumns,\n options,\n ) as never,\n );\n return definition as never;\n };\n definition.relations = (fn) => {\n (definition.data as RecordUnknown).relations = fn;\n return definition as never;\n };\n\n return definition;\n }) as OrmTable.DefineTable<SchemaConfig, ColumnTypes>;\n\n defineTable.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 table factory. Please set the `filePath` option of `createTableFactory` manually.',\n );\n };\n defineTable.types = columnTypes;\n defineTable.exportAs = defineTableExportAs;\n defineTable.nowSQL = options?.nowSQL;\n defineTable.snakeCase = options?.snakeCase;\n defineTable.language = options?.language;\n\n const defineView = ((\n name: string,\n optionsOrT:\n | OrmTable.DefineViewOptions\n | ((columnTypes: ColumnTypes) => ColumnsShape),\n maybeT?: (columnTypes: ColumnTypes) => ColumnsShape,\n ) => {\n const viewOptions =\n typeof optionsOrT === 'function' ? undefined : optionsOrT;\n const materialized = viewOptions?.materialized;\n const readOnly = (materialized || viewOptions?.readOnly !== false) as\n | false\n | true;\n const t = typeof optionsOrT === 'function' ? optionsOrT : maybeT;\n if (!t) throw new Error('Column definitions are required');\n\n const language = viewOptions?.language ?? options?.language;\n const snakeCase = viewOptions?.snakeCase ?? options?.snakeCase;\n const shape = getColumnTypes(columnTypes, t, options?.nowSQL, language);\n const tableData: TableData = {};\n const nameInDb =\n viewOptions?.nameInDb ?? (snakeCase ? toSnakeCase(name) : name);\n\n if (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 const instance: ORMTableInput & {\n name: string;\n q: QueryData;\n relations?: unknown;\n init?(orm: unknown): void;\n } = {\n id: viewOptions?.id ?? name,\n name,\n nameInDb,\n schema: viewOptions?.schema,\n snakeCase,\n columns: {\n shape,\n data: tableData as never,\n },\n types: columnTypes,\n filePath: options?.filePath ?? '',\n language,\n readOnly,\n materialized,\n generatorIgnore: viewOptions?.generatorIgnore,\n withData: viewOptions?.withData,\n sql: viewOptions?.sql,\n recursive: viewOptions?.recursive,\n checkOption: viewOptions?.checkOption,\n securityBarrier: viewOptions?.securityBarrier,\n securityInvoker: viewOptions?.securityInvoker,\n q: {} as QueryData,\n };\n\n const viewId = viewOptions?.id ?? name;\n const definition = ((...columns: string[]) =>\n makeRelationEndpoint(viewId, columns)) as unknown as OrmTable.View<\n typeof name,\n typeof name,\n ReturnType<typeof t>,\n unknown,\n undefined,\n undefined,\n undefined,\n undefined,\n typeof readOnly,\n typeof materialized\n >;\n\n definition.data = {\n id: viewOptions?.id ?? name,\n table: undefined,\n name,\n relations: undefined,\n columns: shape as ReturnType<typeof t>,\n types: undefined,\n computed: undefined,\n scopes: undefined,\n readOnly: readOnly as never,\n materialized: materialized as never,\n tableData: tableData as never,\n } as never;\n setDefinitionSchemaMethods(definition, schema, shape);\n definition.nowSQL = options?.nowSQL;\n\n // `instance` intentionally exposes the broad runtime input type while\n // static metadata keeps precise table data types.\n definition.instance = () => {\n const { computed, relations, scopes, softDelete } =\n definition.data as RecordUnknown;\n instance.computed = computed as never;\n instance.scopes = scopes as never;\n (instance as { softDelete?: unknown }).softDelete = softDelete;\n instance.relations =\n typeof relations === 'function'\n ? (relations as (arg: never) => unknown)(makeRelationBuilder())\n : relations;\n\n return instance as never;\n };\n definition.query = (fn) => {\n instance.init = (orm) => {\n instance.query = fn(orm as never) as never;\n };\n return definition;\n };\n definition.through = (through, source) =>\n makeRelationEndpoint(viewId, [], undefined, through, source) as never;\n definition.softDelete = (column?: string) => {\n (definition.data as RecordUnknown).softDelete = column || true;\n return definition as never;\n };\n definition.computed = (computed) => {\n (definition.data as RecordUnknown).computed = computed;\n return definition as never;\n };\n definition.scopes = (scopes) => {\n (definition.data as RecordUnknown).scopes = scopes;\n return definition as never;\n };\n definition.grants = (grants) => {\n instance.grants = grants as never;\n return definition as never;\n };\n definition.init = (fn) => {\n instance.init = function (\n this: ORMTableInput & { q: QueryData },\n orm: unknown,\n ) {\n fn(orm, new InitHookTarget(this.q));\n };\n return definition as never;\n };\n definition.relations = (fn) => {\n (definition.data as RecordUnknown).relations = fn;\n return definition as never;\n };\n\n return definition as never;\n }) as OrmTable.DefineView<SchemaConfig, ColumnTypes>;\n\n return {\n defineTable,\n defineView,\n sql: _createDbSqlMethod(columnTypes),\n exportAs: defineTableExportAs,\n };\n};\n","import {\n _clone,\n _queryHookAfterCreate,\n _hookSelectColumns,\n _queryWhereIn,\n Column,\n CreateCtx,\n getForeignKeyTableInstance,\n getQueryAs,\n isQueryReturnsAll,\n pushQueryOnForOuter,\n RawSql,\n setQueryObjectValueImmutable,\n UpdateData,\n WhereArg,\n emptyObject,\n MaybeArray,\n PickQueryRelations,\n RecordUnknown,\n RelationConfigBase,\n PickQuerySelectableRelations,\n UpdateSelf,\n} from 'pqb/internal';\nimport { Query } from 'pqb';\nimport { HasOneNestedInsert } from '../has-one/has-one';\nimport { HasManyNestedInsert } from '../has-many/has-many.create';\nimport { ORMTableInput } from '../../orm-table/legacy-table';\nimport { RelationRefsOptions } from './options';\n\nexport interface NestedInsertOneItem {\n create?: NestedInsertOneItemCreate;\n connect?: NestedInsertOneItemConnect;\n connectOrCreate?: NestedInsertOneItemConnectOrCreate;\n upsert?: NestedUpdateUpsert;\n}\n\nexport type NestedInsertOneItemCreate = RecordUnknown;\nexport type NestedInsertOneItemConnect = RecordUnknown;\n\nexport interface NestedInsertOneItemConnectOrCreate {\n where: WhereArg<PickQuerySelectableRelations>;\n create: RecordUnknown;\n}\n\nexport interface NestedInsertManyItems {\n create?: NestedInsertManyCreate;\n connect?: NestedInsertManyConnect;\n connectOrCreate?: NestedInsertManyConnectOrCreate;\n upsert?: MaybeArray<NestedUpdateManyUpsert>;\n}\n\nexport type NestedInsertManyCreate = RecordUnknown[];\n\nexport type NestedInsertManyConnect = WhereArg<PickQuerySelectableRelations>[];\n\nexport type NestedInsertManyConnectOrCreate =\n NestedInsertOneItemConnectOrCreate[];\n\nexport type NestedInsertItem = NestedInsertOneItem | NestedInsertManyItems;\n\nexport interface NestedUpdateOneItem {\n add?: MaybeArray<WhereArg<PickQuerySelectableRelations>>;\n disconnect?: boolean;\n set?: WhereArg<PickQuerySelectableRelations>;\n delete?: boolean;\n update?: UpdateData<UpdateSelf>;\n upsert?: {\n update: UpdateData<UpdateSelf>;\n create: RecordUnknown | (() => RecordUnknown);\n };\n create: RecordUnknown;\n}\n\nexport interface NestedUpdateManyItems {\n add?: NestedUpdateManyAdd;\n disconnect?: NestedUpdateManyDisconnect;\n set?: NestedUpdateManySet;\n delete?: NestedUpdateManyDelete;\n update?: NestedUpdateManyUpdate;\n create: NestedUpdateManyCreate;\n upsert?: NestedUpdateManyUpsert;\n}\n\nexport type NestedUpdateManyAdd = MaybeArray<\n WhereArg<PickQuerySelectableRelations>\n>;\n\nexport type NestedUpdateManyDisconnect = MaybeArray<\n WhereArg<PickQuerySelectableRelations>\n>;\n\nexport type NestedUpdateManySet = MaybeArray<\n WhereArg<PickQuerySelectableRelations>\n>;\n\nexport type NestedUpdateManyDelete = MaybeArray<\n WhereArg<PickQuerySelectableRelations>\n>;\n\nexport interface NestedUpdateManyUpdateItem {\n where: MaybeArray<WhereArg<PickQuerySelectableRelations>>;\n data: UpdateData<UpdateSelf>;\n}\n\nexport type NestedUpdateManyUpdate = MaybeArray<NestedUpdateManyUpdateItem>;\n\nexport type NestedUpdateManyCreate = RecordUnknown[];\n\nexport interface NestedUpdateManyUpsert {\n findBy: PickQuerySelectableRelations;\n update: UpdateData<UpdateSelf>;\n create?: RecordUnknown | (() => RecordUnknown);\n}\n\ninterface NestedUpdateSingleRecordParams {\n set?: unknown;\n create?: unknown;\n upsert?: unknown;\n}\n\nexport interface NestedUpdateUpsert {\n update: UpdateData<UpdateSelf>;\n create?: RecordUnknown | (() => RecordUnknown);\n}\n\nexport interface NestedUpdateRelationIds {\n existingRelQuery: Query;\n setIds: RecordUnknown;\n setAppendedAs: (as: string) => void;\n}\n\nexport const throwIfQueryReturnsAllForNestedUpdate = (\n q: Query,\n params: NestedUpdateSingleRecordParams,\n) => {\n if (!(params.set || params.create || params.upsert) || !isQueryReturnsAll(q))\n return;\n\n let key: 'set' | 'create' | 'upsert';\n if (params.set) {\n key = 'set';\n } else if (params.create) {\n key = 'create';\n } else {\n key = 'upsert';\n }\n\n throw new Error(`\\`${key}\\` option is not allowed in a batch update`);\n};\n\nconst getNestedUpdateUpsertCreate = (upsert: NestedUpdateUpsert) => {\n if (typeof upsert.create === 'function') {\n return upsert.create();\n }\n\n return upsert.create || emptyObject;\n};\n\nexport const makeNestedUpdateUpsertData = (\n upsert: NestedUpdateUpsert,\n setIds: RecordUnknown,\n) => ({\n update: upsert.update,\n create: {\n ...getNestedUpdateUpsertCreate(upsert),\n ...setIds,\n },\n});\n\nexport const makeRawSqlPlaceholders = (length: number): RawSql[] => {\n return Array.from({ length }, () => new RawSql(''));\n};\n\nexport const makeRawSqlPlaceholderRecord = (keys: string[]): RecordUnknown => {\n const placeholders = makeRawSqlPlaceholders(keys.length);\n const record: RecordUnknown = {};\n\n for (let i = 0; i < keys.length; i++) {\n record[keys[i]] = placeholders[i];\n }\n\n return record;\n};\n\nexport const setRawSqlPlaceholdersFromCte = (\n placeholders: RawSql[],\n cte: string,\n primaryKeys: string[],\n rowIndex: number,\n count: number,\n) => {\n for (let i = 0; i < placeholders.length; i++) {\n placeholders[i]._sql = selectCteColumnFromManySql(\n cte,\n primaryKeys[i],\n rowIndex,\n count,\n );\n }\n};\n\nexport const setRawSqlPlaceholderRecordFromCte = (\n record: RecordUnknown,\n keys: string[],\n cte: string,\n primaryKeys: string[],\n rowIndex: number,\n count: number,\n) => {\n setRawSqlPlaceholdersFromCte(\n keys.map((key) => record[key] as RawSql),\n cte,\n primaryKeys,\n rowIndex,\n count,\n );\n};\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 items: RecordUnknown[],\n rowIndexes: number[],\n key: string,\n primaryKeys: string[],\n nestedInsert: HasOneNestedInsert | HasManyNestedInsert,\n) => {\n q.q.wrapInTransaction = true;\n\n items.forEach((item, i) => {\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 (!('upsert' in value) ||\n !value.upsert ||\n (Array.isArray(value.upsert) && value.upsert.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 = [rowIndexes[i], value] as [number, NestedInsertItem];\n\n if (store.hasRelation[key]) {\n store.hasRelation[key].push(values);\n return;\n }\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};\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 never,\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(\n q,\n 'joinedShapes',\n baseAs,\n baseQuery.q.selectShape,\n );\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.q.nameInDb || (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 const instance = getForeignKeyTableInstance(fkey.fnOrTable());\n fkeyTable = instance.nameInDb || (instance.table as string);\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 let sameForeignTable = false;\n if (typeof refs.fnOrTable === 'string') {\n sameForeignTable =\n refs.fnOrTable === toTable &&\n refs.foreignColumns.every(\n (column, i) =>\n getColumnKeyFromDbName(to, column) === sortedPkeys[i],\n );\n } else {\n const instance = getForeignKeyTableInstance(refs.fnOrTable());\n sameForeignTable =\n (instance.nameInDb || instance.table) === toTable &&\n refs.foreignColumns.every((column, i) => column === sortedPkeys[i]);\n }\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 sameForeignTable\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\nexport const selectCteColumnsSql = (cteAs: string, columns: string[]) =>\n `(SELECT ${columns\n .map((c) => `\"${cteAs}\".\"${c}\"`)\n .join(', ')} FROM \"${cteAs}\")`;\n\nexport const selectCteColumnSql = (cteAs: string, column: string) =>\n `(SELECT \"${cteAs}\".\"${column}\" FROM \"${cteAs}\")`;\n\nexport const makeNestedUpdateRelationIds = (\n q: Query,\n relQuery: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n): NestedUpdateRelationIds => {\n const selectIdsSql = new RawSql('');\n const setIds: RecordUnknown = {};\n\n for (const foreignKey of foreignKeys) {\n setIds[foreignKey] = new RawSql('');\n }\n\n let appendedAs: string | undefined;\n _hookSelectColumns(q, primaryKeys, (aliasedPrimaryKeys) => {\n selectIdsSql._sql = selectCteColumnsSql(\n appendedAs as string,\n aliasedPrimaryKeys,\n );\n\n foreignKeys.forEach((foreignKey, i) => {\n (setIds[foreignKey] as RawSql)._sql = selectCteColumnSql(\n appendedAs as string,\n aliasedPrimaryKeys[i],\n );\n });\n });\n\n return {\n existingRelQuery: _queryWhereIn(\n _clone(relQuery),\n true,\n foreignKeys,\n selectIdsSql,\n ),\n setIds,\n setAppendedAs(as) {\n appendedAs = as;\n },\n };\n};\n\nexport const selectCteColumnFromManySql = (\n cteAs: string,\n column: string,\n rowIndex: number,\n count: number,\n) => {\n let sql = `(SELECT \"${cteAs}\".\"${column}\" FROM \"${cteAs}\"`;\n if (count > 1) {\n sql += ` LIMIT 1`;\n if (rowIndex) sql += ` OFFSET ${rowIndex}`;\n }\n return sql + ')';\n};\n\nexport const selectCteColumnMustExistSql = (\n i: number,\n cteAs: string,\n column: string,\n) => {\n const selectColumn = selectCteColumnSql(cteAs, column);\n\n return i === 0\n ? `CASE WHEN (SELECT count(*) FROM \"${cteAs}\") = 0 AND (SELECT ':not-found:1:0')::int = 0 THEN NULL ELSE ${selectColumn} END`\n : selectColumn;\n};\n\nexport const setForeignKeysFromCte = (\n record: RecordUnknown,\n primaryKeys: string[],\n foreignKeys: string[],\n mustExist?: boolean,\n) => {\n for (const key of foreignKeys) {\n record[key] = new RawSql('');\n }\n\n return (as: string) => {\n foreignKeys.forEach(\n mustExist\n ? (foreignKey, i) => {\n (record[foreignKey] as RawSql)._sql = selectCteColumnMustExistSql(\n i,\n as,\n primaryKeys[i],\n );\n }\n : (foreignKey, i) => {\n (record[foreignKey] as RawSql)._sql = selectCteColumnSql(\n as,\n primaryKeys[i],\n );\n },\n );\n };\n};\n","import {\n cloneQueryBaseUnscoped,\n DynamicRawSQL,\n getQueryAs,\n getShapeFromSelect,\n RawSql,\n HookSelectValue,\n isExpression,\n RelationJoinQuery,\n Column,\n} from 'pqb/internal';\nimport { Query } 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 { Query } from 'pqb';\nimport {\n CreateCtx,\n CreateSelf,\n getFreeAlias,\n RawSql,\n RecordUnknown,\n _orCreate,\n _prependWith,\n _queryWhere,\n _querySelect,\n _queryTake,\n _queryInsertMany,\n _queryInsertManyFrom,\n _clone,\n _onUpsertUpdate,\n _prependWithOnUpsertCreate,\n} from 'pqb/internal';\nimport {\n NestedInsertOneItemCreate,\n selectCteColumnFromManySql,\n selectCteColumnMustExistSql,\n setForeignKeysFromCte,\n} from '../common/utils';\nimport { RelationToOneDataForCreateSameQuery } from '../relations';\n\nexport interface BelongsToDataForCreate<\n Name extends string,\n FK extends string,\n Required,\n Q extends Query,\n> {\n columns: FK;\n nested: Q extends Query.Pick.IsNotReadOnly\n ? Required extends true\n ? {\n [Key in Name]: RelationToOneDataForCreateSameQuery<Q>;\n }\n : {\n [Key in Name]?: RelationToOneDataForCreateSameQuery<Q>;\n }\n : {\n [Key in Name]?: never;\n };\n}\n\nexport interface BelongsToCreateState {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n}\n\nexport const belongsToCreate = (\n key: string,\n state: BelongsToCreateState,\n q: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n) => {\n const queryForCreate = q as unknown as Query;\n const { query, primaryKeys, foreignKeys } = state;\n\n interface NestedCreateItem {\n items: RecordUnknown[];\n values: RecordUnknown[];\n }\n\n interface NestedCreateItems {\n create?: NestedCreateItem;\n connect?: NestedCreateItem;\n connectOrCreate?: NestedCreateItem;\n }\n\n let nestedCreateItems: NestedCreateItems | undefined;\n\n items.forEach((item) => {\n const value = item[key] as NestedInsertOneItemCreate;\n const kind = value.create\n ? 'create'\n : value.connect\n ? 'connect'\n : value.connectOrCreate\n ? 'connectOrCreate'\n : undefined;\n\n if (kind) {\n const nestedCreateItem = ((nestedCreateItems ??= {})[kind] ??= {\n items: [],\n values: [],\n });\n nestedCreateItem.items.push(item);\n nestedCreateItem.values.push(value[kind] as RecordUnknown);\n\n if (kind === 'create' || kind === 'connectOrCreate') {\n for (const key of foreignKeys) {\n item[key] = new RawSql('');\n }\n }\n }\n });\n\n if (!nestedCreateItems) {\n return;\n }\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 { create, connect, connectOrCreate } = nestedCreateItems;\n if (create) {\n const selectPKeys = query.select(...primaryKeys);\n\n let createQuery: Query;\n if (queryForCreate.q.type === 'upsert') {\n const createWhereNotExists = new RawSql('');\n _onUpsertUpdate(queryForCreate, (as) => {\n createWhereNotExists._sql = `NOT EXISTS (SELECT 1 FROM \"${as}\")`;\n });\n\n const sourceQuery = _queryWhere(\n _queryTake(_querySelect(_clone(query.qb), [{}])),\n [createWhereNotExists] as never,\n );\n\n // Plain INSERT ... VALUES cannot render a WHERE guard, so upsert\n // nested create uses INSERT ... SELECT FROM a guarded one-row query.\n createQuery = _queryInsertManyFrom(\n selectPKeys as unknown as CreateSelf,\n sourceQuery as never,\n create.values,\n ) as unknown as Query;\n } else {\n createQuery = _queryInsertMany(\n selectPKeys as unknown as CreateSelf,\n create.values,\n ) as unknown as Query;\n }\n\n const setForeignKeys = (as: string) => {\n const count = create.items.length;\n foreignKeys.forEach((foreignKey, i) => {\n const primaryKey = primaryKeys[i];\n create.items.forEach((item, i) => {\n (item[foreignKey] as RawSql)._sql = selectCteColumnFromManySql(\n as,\n primaryKey,\n i,\n count,\n );\n });\n });\n };\n\n if (queryForCreate.q.type === 'upsert') {\n _prependWithOnUpsertCreate(queryForCreate, setForeignKeys, createQuery);\n } else {\n _prependWith(queryForCreate, setForeignKeys, createQuery);\n }\n }\n\n if (connect) {\n connect.values.forEach((value, itemI) => {\n const as = getFreeAlias(queryForCreate.q.withShapes, 'q');\n const prependWith =\n queryForCreate.q.type === 'upsert'\n ? _prependWithOnUpsertCreate\n : _prependWith;\n\n prependWith(\n queryForCreate,\n as,\n query.select(...primaryKeys).findBy(value),\n );\n\n foreignKeys.map((foreignKey, i) => {\n connect.items[itemI][foreignKey] = new RawSql(\n selectCteColumnMustExistSql(i, as, primaryKeys[i]),\n );\n });\n });\n }\n\n if (connectOrCreate) {\n connectOrCreate.values.forEach((value, itemI) => {\n const asFn = setForeignKeysFromCte(\n connectOrCreate.items[itemI],\n primaryKeys,\n foreignKeys,\n );\n\n const selectPKeys = query.select(...primaryKeys);\n\n const prependWith =\n queryForCreate.q.type === 'upsert'\n ? _prependWithOnUpsertCreate\n : _prependWith;\n\n prependWith(\n queryForCreate,\n asFn,\n _orCreate(\n _queryWhere(selectPKeys, [(value as { where: never }).where]),\n (value as { create: never }).create,\n ),\n );\n });\n }\n};\n","import { Query } from 'pqb';\nimport {\n _queryCreate,\n _queryDelete,\n _queryFindBy,\n _queryUpdate,\n _querySelect,\n _queryWhereIn,\n _queryUpsert,\n _appendQuery,\n _prependWith,\n _hookSelectColumns,\n noop,\n RawSql,\n RecordUnknown,\n CreateSelf,\n UpdateSelf,\n UpdateData,\n UpsertData,\n UpsertThis,\n isQueryReturnsAll,\n emptyArray,\n} from 'pqb/internal';\nimport {\n NestedUpdateOneItem,\n selectCteColumnsSql,\n setForeignKeysFromCte,\n} from '../common/utils';\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n len: number;\n on?: RecordUnknown;\n}\n\nexport type BelongsToNestedUpdate = (\n q: Query,\n update: RecordUnknown,\n params: NestedUpdateOneItem,\n) => void;\n\nexport const nestedUpdate = ({\n query,\n primaryKeys,\n foreignKeys,\n len,\n}: State) => {\n return ((self, update, params) => {\n if (params.create) {\n const createQuery = _querySelect(\n _queryCreate(\n query.clone() as unknown as CreateSelf,\n params.create,\n ) as unknown as Query,\n primaryKeys,\n );\n\n const asFn = setForeignKeysFromCte(update, primaryKeys, foreignKeys);\n\n _prependWith(self, asFn, createQuery);\n } else if (params.update) {\n let appendedAs: string | undefined;\n _hookSelectColumns(self, foreignKeys, (aliasedForeignKeys) => {\n selectIdsSql._sql = selectCteColumnsSql(\n appendedAs as string,\n aliasedForeignKeys,\n );\n });\n\n const selectIdsSql = new RawSql('');\n\n const updateQuery = _queryUpdate(\n _queryWhereIn(\n query.clone() as unknown as Query,\n true,\n primaryKeys,\n selectIdsSql,\n ) as unknown as UpdateSelf,\n params.update as never,\n ) as unknown as Query;\n\n // don't throw \"not found\" if it is not found for update\n updateQuery.q.returnType = 'value';\n\n _appendQuery(self, updateQuery, (as) => (appendedAs = as));\n } else if (params.upsert) {\n if (isQueryReturnsAll(self)) {\n throw new Error('`upsert` option is not allowed in a batch update');\n }\n\n const { relQuery } = relWithSelectIds(\n self,\n query,\n primaryKeys,\n foreignKeys,\n );\n\n const upsertQuery = _querySelect(\n _queryUpsert(\n relQuery,\n params.upsert as UpsertData<UpsertThis, UpdateData<UpdateSelf>>,\n ),\n primaryKeys,\n );\n upsertQuery.q.returnType = 'one';\n\n const asFn = setForeignKeysFromCte(update, primaryKeys, foreignKeys);\n\n _prependWith(self, asFn, upsertQuery);\n } else if (params.delete) {\n _hookSelectColumns(self, foreignKeys, noop);\n\n disconnect(update, foreignKeys);\n\n const { selectIdsSql, relQuery } = relWithSelectIds(\n self,\n query,\n primaryKeys,\n foreignKeys,\n );\n\n self.q.and = self.q.or = undefined;\n\n _queryWhereIn(self, true, foreignKeys, selectIdsSql);\n\n const deleteQuery = _queryDelete(relQuery);\n // don't throw \"not found\" if it is not found for delete\n deleteQuery.q.returnType = 'value';\n\n _appendQuery(self, deleteQuery, noop);\n } else if (params.disconnect) {\n disconnect(update, foreignKeys);\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 asFn = setForeignKeysFromCte(\n update,\n loadPrimaryKeys,\n loadForeignKeys as string[],\n true,\n );\n\n const findByQuery = _queryFindBy(\n query.select(...loadPrimaryKeys),\n params.set as never,\n );\n findByQuery.q.returnType = 'value';\n\n _prependWith(self, asFn, findByQuery);\n }\n }\n }) as BelongsToNestedUpdate;\n};\n\nconst disconnect = (update: RecordUnknown, foreignKeys: string[]) => {\n for (const foreignKey of foreignKeys) {\n update[foreignKey] = null;\n }\n};\n\nconst relWithSelectIds = (\n self: Query,\n rel: Query,\n primaryKeys: string[],\n foreignKeys: string[],\n) => {\n const selectIdsQuery = makeSelectIdsQuery(self, foreignKeys);\n\n const selectIdsSql = new RawSql('');\n\n _prependWith(\n self,\n (as) => {\n selectIdsSql._sql = selectCteColumnsSql(as, foreignKeys);\n },\n selectIdsQuery,\n );\n\n return {\n selectIdsSql,\n relQuery: _queryWhereIn(rel.clone(), true, primaryKeys, selectIdsSql),\n };\n};\n\nconst makeSelectIdsQuery = (self: Query, foreignKeys: string[]) => {\n const selectIdsQuery = self.baseQuery.clone();\n selectIdsQuery.q.distinct = emptyArray;\n selectIdsQuery.q.select = foreignKeys;\n selectIdsQuery.q.and = self.q.and;\n selectIdsQuery.q.or = self.q.or;\n return selectIdsQuery;\n};\n","import { ORMTableInput } from '../../orm-table/legacy-table';\nimport { Query } from 'pqb';\nimport {\n _queryDefaults,\n _queryWhere,\n CreateData,\n CreateSelf,\n CreateMethodsNames,\n DeleteMethodsNames,\n getQueryAs,\n pushQueryOnForOuter,\n SelectableFromShape,\n setQueryObjectValueImmutable,\n UpdateData,\n UpdateSelf,\n VirtualColumn,\n WhereArg,\n TableData,\n ColumnSchemaConfig,\n getPrimaryKeys,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n ColumnsShape,\n Column,\n QueryHasWhere,\n internalSchemaConfig,\n CreateCtx,\n} from 'pqb/internal';\nimport {\n RelationConfigSelf,\n RelationData,\n RelationThunkBase,\n} from '../relations';\nimport { addAutoForeignKey, NestedUpdateOneItem } from '../common/utils';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport { BelongsToDataForCreate, belongsToCreate } from './belongs-to.create';\nimport { nestedUpdate, BelongsToNestedUpdate } from './belongs-to.update';\n\nexport { type BelongsToDataForCreate };\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 ORMTableInput = ORMTableInput,\n> {\n required?: boolean;\n columns: (keyof Columns)[];\n references: (keyof Related['columns']['shape'])[];\n foreignKey?: boolean | TableData.References.Options;\n on?: ColumnsShape.InputPartial<Related['columns']['shape']>;\n}\n\nexport type BelongsToParams<T extends RelationConfigSelf, FK extends string> = {\n [Name in FK]: T['columns']['shape'][Name]['__type'];\n};\n\nexport type BelongsToDefaultRequired<\n T extends RelationConfigSelf,\n Rel extends BelongsTo,\n Related,\n> = Related extends { softDelete: true }\n ? false\n : BelongsToDefaultRequiredFromColumns<T, Rel>;\n\ntype BelongsToDefaultRequiredFromColumns<\n T extends RelationConfigSelf,\n Rel extends BelongsTo,\n> =\n BelongsToColumnRequired<\n T['columns']['shape'][Rel['options']['columns'][number] & string]\n > extends true\n ? true\n : false;\n\ntype BelongsToColumnRequired<Column> = Column extends {\n data: { isNullable: true };\n}\n ? false\n : true;\n\nexport type BelongsToQuery<T extends Query, Name extends string> = {\n [P in keyof T]: P extends '__selectable'\n ? SelectableFromShape<T['shape'], Name>\n : P extends '__as'\n ? Name\n : P extends CreateMethodsNames | DeleteMethodsNames\n ? never\n : T[P];\n} & QueryHasWhere;\n\nexport interface BelongsToInfo<\n T extends RelationConfigSelf,\n FK extends string,\n Required,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: true;\n required: Required;\n query: Q;\n params: BelongsToParams<T, FK>;\n omitForeignKeyInCreate: FK;\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 | (Q extends Query.Pick.IsNotReadOnly\n ?\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | {\n create: CreateData<Q>;\n }\n : never);\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 | (Q extends Query.Pick.IsNotReadOnly\n ?\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 : never);\n}\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n len: number;\n on?: RecordUnknown;\n}\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: CreateSelf, ctx: CreateCtx, items: RecordUnknown[]) {\n belongsToCreate(this.key, this.state, q, ctx, items);\n }\n\n update(q: UpdateSelf, set: RecordUnknown) {\n const queryForUpdate = q as unknown as Query;\n queryForUpdate.q.wrapInTransaction = true;\n\n const data = set[this.key] as NestedUpdateOneItem;\n this.nestedUpdate(queryForUpdate, set, data);\n }\n}\n\nexport const getBelongsToRequired = (\n tableConfig: ORMTableInput,\n relatedTableConfig: ORMTableInput,\n relation: BelongsTo,\n) => {\n const { required } = relation.options;\n if (typeof required === 'boolean') return required;\n\n if (relatedTableConfig.softDelete) return false;\n\n return relation.options.columns.every((key) => {\n return !tableConfig.columns.shape[key as string].data.isNullable;\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 as unknown as CreateSelf, on);\n }\n\n const len = primaryKeys.length;\n const state: State = {\n query: query as Query.NotReadOnlyQuery,\n primaryKeys,\n foreignKeys,\n len,\n on,\n };\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(\n q,\n 'joinedShapes',\n baseAs,\n baseQuery.q.selectShape,\n );\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 internalSchemaConfig,\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","import { Query } from 'pqb';\nimport {\n _appendQuery,\n _appendQueryOnUpsertCreate,\n _clone,\n _hookSelectColumns,\n _queryInsertMany,\n _queryInsertManyFrom,\n _querySelect,\n _queryTake,\n _queryUpdate,\n _queryUpdateOrThrow,\n _queryUpsert,\n _queryWhere,\n CreateCtx,\n CreateSelf,\n prepareSubQueryForSql,\n RawSql,\n RecordUnknown,\n UpdateSelf,\n WhereArg,\n} from 'pqb/internal';\nimport {\n hasRelationHandleCreate,\n NestedInsertOneItem,\n NestedInsertOneItemConnectOrCreate,\n NestedInsertOneItemCreate,\n selectCteColumnFromManySql,\n} from '../common/utils';\n\nexport type HasOneNestedInsert = (\n query: Query,\n data: [selfData: RecordUnknown, relationData: NestedInsertOneItem][],\n) => Promise<void>;\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport const nestedInsert = ({\n query,\n primaryKeys,\n foreignKeys,\n}: State): HasOneNestedInsert => {\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 primaryKeys.forEach((primaryKey, i) => {\n data[foreignKeys[i]] = selfData[primaryKey];\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\nexport const hasOneCreate = (\n key: string,\n state: State,\n nestedInsertFn: HasOneNestedInsert,\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n) => {\n const querySelf = self as unknown as Query;\n if (count <= querySelf.qb.internal.nestedCreateBatchMax) {\n interface NestedCreateItem {\n indexes: number[];\n items: RecordUnknown[];\n values: RecordUnknown[];\n }\n\n interface NestedCreateItems {\n create?: NestedCreateItem;\n connect?: NestedCreateItem;\n connectOrCreate?: NestedCreateItem;\n }\n\n const { query: rel, primaryKeys, foreignKeys } = state;\n\n let nestedCreateItems: NestedCreateItems | undefined;\n\n items.forEach((item, i) => {\n const value = item[key] as NestedInsertOneItem;\n const kind = value.create\n ? 'create'\n : value.connect\n ? 'connect'\n : 'connectOrCreate';\n\n if (kind) {\n const nestedCreateItem = ((nestedCreateItems ??= {})[kind] ??= {\n indexes: [],\n items: [],\n values: [],\n });\n nestedCreateItem.indexes.push(rowIndexes[i]);\n nestedCreateItem.values.push(value[kind] as RecordUnknown);\n\n const data = value.create ? { ...value.create } : {};\n\n for (const key of foreignKeys) {\n data[key] = new RawSql('');\n }\n\n nestedCreateItem.items.push(data);\n }\n });\n\n if (!nestedCreateItems) {\n return;\n }\n\n let createAs: string | undefined;\n let createWhereExists: RawSql | undefined;\n let createSelectAs: RecordUnknown | undefined;\n let createAliasedPrimaryKeys: string[] | undefined;\n let upsertCreateAs: string | undefined;\n let connectAs: string | undefined;\n let connectOrCreateAs: string | undefined;\n\n // In upsert create, relation FKs point to the parent create CTE.\n // The CTE alias and selected parent PK aliases are provided by separate callbacks.\n const setUpsertCreatePlaceholders = () => {\n if (!upsertCreateAs || !createAliasedPrimaryKeys) return;\n\n const aliasedPrimaryKeys = createAliasedPrimaryKeys;\n\n if (createWhereExists) {\n createWhereExists._sql = `EXISTS (SELECT 1 FROM \"${upsertCreateAs}\")`;\n }\n\n if (createSelectAs) {\n foreignKeys.forEach((key, keyI) => {\n ((createSelectAs as RecordUnknown)[key] as RawSql)._sql =\n selectCteColumnFromManySql(\n upsertCreateAs as string,\n aliasedPrimaryKeys[keyI],\n 0,\n 1,\n );\n });\n }\n\n if (connect) {\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n for (let i = 0; i < connect.items.length; i++) {\n (connect.items[i][key] as RawSql)._sql = selectCteColumnFromManySql(\n upsertCreateAs as string,\n primaryKey,\n connect.indexes[i],\n count,\n );\n }\n });\n }\n\n if (connectOrCreate) {\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n for (let i = 0; i < connectOrCreate.items.length; i++) {\n (connectOrCreate.items[i][key] as RawSql)._sql =\n selectCteColumnFromManySql(\n upsertCreateAs as string,\n primaryKey,\n connectOrCreate.indexes[i],\n count,\n );\n }\n });\n }\n };\n\n _hookSelectColumns(querySelf, primaryKeys, (aliasedPrimaryKeys) => {\n createAliasedPrimaryKeys = aliasedPrimaryKeys;\n\n foreignKeys.forEach((key, keyI) => {\n const primaryKey = aliasedPrimaryKeys[keyI];\n\n if (create && createAs) {\n for (let i = 0; i < create.items.length; i++) {\n (create.items[i][key] as RawSql)._sql = selectCteColumnFromManySql(\n createAs,\n primaryKey,\n create.indexes[i],\n count,\n );\n }\n }\n\n if (connect && connectAs) {\n for (let i = 0; i < connect.items.length; i++) {\n (connect.items[i][key] as RawSql)._sql = selectCteColumnFromManySql(\n connectAs,\n primaryKey,\n connect.indexes[i],\n count,\n );\n }\n }\n\n if (connectOrCreate && connectOrCreateAs) {\n for (let i = 0; i < connectOrCreate.items.length; i++) {\n (connectOrCreate.items[i][key] as RawSql)._sql =\n selectCteColumnFromManySql(\n connectOrCreateAs,\n primaryKey,\n connectOrCreate.indexes[i],\n count,\n );\n }\n }\n });\n\n setUpsertCreatePlaceholders();\n });\n\n const { create, connect, connectOrCreate } = nestedCreateItems;\n\n if (create) {\n let query: Query;\n if (querySelf.q.type === 'upsert') {\n createWhereExists = new RawSql('');\n createSelectAs = {};\n for (const key of foreignKeys) {\n createSelectAs[key] = new RawSql('');\n }\n\n const sourceQuery = _queryWhere(\n _queryTake(_querySelect(_clone(rel.qb), [createSelectAs as never])),\n [createWhereExists] as never,\n );\n\n // Plain INSERT ... VALUES cannot render a WHERE guard, so upsert\n // nested create uses INSERT ... SELECT FROM a guarded one-row query.\n query = _queryInsertManyFrom(\n _clone(rel) as unknown as CreateSelf,\n sourceQuery as never,\n create.items as never,\n ) as unknown as Query;\n } else {\n query = _queryInsertMany(\n _clone(rel) as unknown as CreateSelf,\n create.items as never,\n ) as unknown as Query;\n }\n\n if (querySelf.q.type === 'upsert') {\n _appendQueryOnUpsertCreate(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n });\n } else {\n _appendQuery(querySelf, query, (as) => (createAs = as));\n }\n }\n\n if (connect) {\n connect.values.forEach((value, i) => {\n const connectWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n\n const query = _queryUpdateOrThrow(\n rel.where(value as never) as unknown as UpdateSelf,\n connect.items[i] as never,\n ) as unknown as Query;\n\n if (connectWhereExists) {\n // Only run nested connect when the parent upsert actually created a row.\n _queryWhere(query, [connectWhereExists] as never);\n }\n\n query.q.ensureCount = { expected: 1 };\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n connectAs = as;\n if (connectWhereExists) {\n connectWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n });\n }\n\n if (connectOrCreate) {\n connectOrCreate.values.forEach((value, i) => {\n const foreignKeyValues = connectOrCreate.items[i];\n const connectOrCreateWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n const connectOrCreateSelectAs: RecordUnknown = {};\n if (connectOrCreateWhereExists) {\n for (const key of foreignKeys) {\n const value = foreignKeyValues[key] as RawSql;\n // These RawSql placeholders are selected by the insertFrom\n // source query, so select parsing needs the target column type.\n value.result = {\n value: rel.qb.shape[key],\n };\n connectOrCreateSelectAs[key] = value;\n }\n }\n\n const query = _queryUpsert(rel.where(value.where as never) as Query, {\n update: foreignKeyValues,\n create: {\n ...(value.create as RecordUnknown),\n ...foreignKeyValues,\n },\n });\n\n if (connectOrCreateWhereExists) {\n // Guard the update half of child upsert with the parent create CTE.\n _queryWhere(query, [connectOrCreateWhereExists] as never);\n\n // The insert half of child upsert ignores the update query WHERE.\n // Move relation FKs into an insertFrom source that becomes empty\n // when the parent create CTE is empty.\n const guardQuery = _queryWhere(\n _queryTake(\n _querySelect(_clone(rel.qb), [{ one: new RawSql('1') }]),\n ),\n [connectOrCreateWhereExists] as never,\n );\n\n const sourceQuery = _querySelect(\n (_clone(rel.qb) as Query).from(guardQuery as never),\n [connectOrCreateSelectAs as never],\n );\n\n const q = query.q;\n const columns = q.columns || [];\n const foreignKeysSet = new Set(foreignKeys);\n // FK columns now come from sourceQuery; keep user-provided insert\n // columns after them so INSERT column order matches SELECT output.\n q.columns = [\n ...foreignKeys,\n ...columns.filter((column) => !foreignKeysSet.has(column)),\n ];\n // Drop FK values from VALUES; their values are selected from\n // sourceQuery, while the remaining row data still comes from VALUES.\n q.values = q.values.map((row) =>\n row.filter((_, i) => !foreignKeysSet.has(columns[i])),\n );\n // Tells insert SQL how many leading columns are produced by\n // sourceQuery before appending the remaining VALUES columns.\n q.queryColumnsCount = foreignKeys.length;\n q.insertFrom = prepareSubQueryForSql(query, sourceQuery as never);\n }\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n connectOrCreateAs = as;\n if (connectOrCreateWhereExists) {\n connectOrCreateWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n });\n }\n } else {\n hasRelationHandleCreate(\n querySelf,\n ctx,\n items,\n rowIndexes,\n key,\n state.primaryKeys,\n nestedInsertFn,\n );\n }\n};\n","import { Query } from 'pqb';\nimport { _queryWhere, RecordUnknown, RelationJoinQuery } from 'pqb/internal';\nimport {\n getThroughRelation,\n getSourceRelation,\n joinHasThrough,\n} from '../common/utils';\nimport { RelationThroughOptions } from '../common/options';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport { RelationData } from '../relations';\n\nexport const hasOneThrough = (\n table: Query,\n options: RelationThroughOptions & { required?: boolean },\n relationName: string,\n query: Query,\n relPKeys: string[],\n): RelationData => {\n const { through, source, on } = options;\n if (on) _queryWhere(query, [on]);\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = (sourceRelation.query as Query).as(relationName);\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","import {\n _appendQuery,\n _clone,\n _queryDelete,\n _queryInsert,\n _queryUpdate,\n _queryUpsert,\n _queryWhere,\n CreateSelf,\n noop,\n RecordUnknown,\n UpdateSelf,\n} from 'pqb/internal';\nimport { Query } from 'pqb';\nimport {\n makeNestedUpdateRelationIds,\n makeNestedUpdateUpsertData,\n NestedUpdateOneItem,\n throwIfQueryReturnsAllForNestedUpdate,\n} from '../common/utils';\nimport { State } from './has-one';\n\nexport const hasOneUpdate = (\n key: string,\n state: State,\n self: UpdateSelf,\n set: RecordUnknown,\n): void => {\n const querySelf = self as unknown as Query;\n const params = set[key] as NestedUpdateOneItem;\n throwIfQueryReturnsAllForNestedUpdate(querySelf, params);\n\n const { primaryKeys, foreignKeys, query: relQuery } = state;\n if (\n params.create ||\n params.update ||\n params.upsert ||\n params.disconnect ||\n params.set ||\n params.delete\n ) {\n const ids = makeNestedUpdateRelationIds(\n querySelf,\n relQuery,\n primaryKeys,\n foreignKeys,\n );\n\n const setNulls: RecordUnknown = {};\n for (const foreignKey of foreignKeys) {\n setNulls[foreignKey] = null;\n }\n\n const nullifyOrDeleteQuery = (params.update\n ? _queryUpdate(\n ids.existingRelQuery as unknown as UpdateSelf,\n params.update as never,\n )\n : params.upsert\n ? _queryUpsert(\n ids.existingRelQuery,\n makeNestedUpdateUpsertData(params.upsert, ids.setIds),\n )\n : params.delete\n ? _queryDelete(ids.existingRelQuery)\n : _queryUpdate(\n ids.existingRelQuery as unknown as UpdateSelf,\n setNulls as never,\n )) as unknown as Query;\n\n nullifyOrDeleteQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, nullifyOrDeleteQuery, ids.setAppendedAs);\n\n if (params.create) {\n const createQuery = _queryInsert(\n _clone(relQuery) as unknown as CreateSelf,\n {\n ...params.create,\n ...ids.setIds,\n },\n ) as unknown as Query;\n\n _appendQuery(querySelf, createQuery, noop);\n } else if (params.set) {\n const setQuery = _queryUpdate(\n _queryWhere(_clone(relQuery), [\n params.set as never,\n ]) as unknown as UpdateSelf,\n ids.setIds as never,\n ) as unknown as Query;\n setQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, setQuery, noop);\n }\n }\n};\n","import { Query } from 'pqb';\nimport { Column, internalSchemaConfig } from 'pqb/internal';\nimport {\n _queryDefaults,\n _queryWhere,\n ColumnSchemaConfig,\n CreateCtx,\n CreateData,\n CreateSelf,\n CreateManyMethodsNames,\n CreateMethodsNames,\n EmptyObject,\n getPrimaryKeys,\n PickQueryQ,\n prepareSubQueryForSql,\n QueryHasWhere,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n SelectableFromShape,\n UpdateSelf,\n UpdateData,\n VirtualColumn,\n WhereArg,\n} from 'pqb/internal';\nimport { ORMTableInput } from '../../orm-table/legacy-table';\nimport {\n RelationData,\n RelationThunkBase,\n RelationConfigParams,\n RelationConfigSelf,\n RelationToOneDataForCreate,\n} from '../relations';\nimport { addAutoForeignKey, joinHasRelation } from '../common/utils';\nimport { RelationRefsOptions, RelationThroughOptions } from '../common/options';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport {\n HasOneNestedInsert,\n hasOneCreate,\n nestedInsert,\n} from './has-one.create';\nimport { hasOneThrough } from './has-one.through';\nimport { hasOneUpdate } from './has-one.update';\n\nexport interface HasOne extends RelationThunkBase {\n type: 'hasOne';\n options: HasOneOptions;\n}\n\ninterface RelationHasOneThroughOptions<\n Through extends string,\n> extends RelationThroughOptions<Through> {\n required?: boolean;\n}\n\nexport type HasOneOptions<\n Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit,\n Related extends ORMTableInput = ORMTableInput,\n Through extends string = string,\n> =\n | RelationRefsOptions<keyof Columns, Related['columns']['shape']>\n | RelationHasOneThroughOptions<Through>;\n\nexport type HasOneParams<\n T extends RelationConfigSelf,\n Options,\n> = Options extends RelationRefsOptions\n ? {\n [Name in Options['columns'][number]]: T['columns']['shape'][Name]['__type'];\n }\n : Options extends RelationThroughOptions\n ? RelationConfigParams<T, T['relations'][Options['through']]>\n : never;\n\nexport type HasOneQueryThrough<\n Name extends string,\n TableQuery extends Query,\n> = {\n [K in keyof TableQuery]: K extends '__selectable'\n ? SelectableFromShape<TableQuery['shape'], Name>\n : K extends '__as'\n ? Name\n : K extends CreateMethodsNames\n ? never\n : TableQuery[K];\n} & QueryHasWhere;\n\nexport type HasOneQuery<\n T extends RelationConfigSelf,\n Name extends string,\n TableQuery extends Query,\n> = T['relations'][Name]['options'] extends RelationRefsOptions\n ? {\n [K in keyof TableQuery]: K extends '__defaults'\n ? {\n [K in\n | keyof TableQuery['__defaults']\n | T['relations'][Name]['options']['references'][number]]: true;\n }\n : K extends '__selectable'\n ? SelectableFromShape<TableQuery['shape'], Name>\n : K extends '__as'\n ? Name\n : K extends CreateManyMethodsNames\n ? never\n : TableQuery[K];\n } & QueryHasWhere\n : HasOneQueryThrough<Name, TableQuery>;\n\nexport interface HasOneInfo<\n T extends RelationConfigSelf,\n Name extends string,\n Rel extends HasOne,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: true;\n required: Rel['options']['required'];\n query: Q;\n params: HasOneParams<T, Rel['options']>;\n omitForeignKeyInCreate: never;\n dataForCreate: {\n [K in Name]?: Q extends Query.Pick.IsNotReadOnly\n ? Rel['options'] extends RelationThroughOptions\n ? EmptyObject\n : RelationToOneDataForCreate<{\n nestedCreateQuery: CreateData<Q>;\n table: Q;\n }>\n : never;\n };\n // `hasOne` relation data available for update. It supports:\n // - `disconnect` to nullify a foreign key of the related record\n // - `delete` to delete the related record\n // - `update` to update the related record\n dataForUpdate: Q extends Query.Pick.IsNotReadOnly\n ? { disconnect: boolean } | { delete: boolean } | { update: UpdateData<Q> }\n : never;\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: Q extends Query.Pick.IsNotReadOnly\n ?\n | { disconnect: boolean }\n | { set: WhereArg<Q> }\n | { delete: boolean }\n | { update: UpdateData<Q> }\n | {\n upsert: {\n update: UpdateData<Q>;\n create: CreateData<Q> | (() => CreateData<Q>);\n };\n }\n | {\n create: CreateData<Q>;\n }\n : never;\n}\n\nexport interface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport type { HasOneNestedInsert } from './has-one.create';\n\nclass HasOneVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasOneNestedInsert;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n }\n\n create(\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n ) {\n hasOneCreate(\n this.key,\n this.state,\n this.nestedInsert,\n self,\n ctx,\n items,\n rowIndexes,\n count,\n );\n }\n\n update(self: UpdateSelf, set: RecordUnknown) {\n hasOneUpdate(this.key, this.state, self, set);\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 return hasOneThrough(\n table,\n relation.options,\n relationName,\n query,\n relPKeys,\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 as unknown as CreateSelf, on);\n }\n\n addAutoForeignKey(\n tableConfig,\n query,\n table,\n primaryKeys,\n foreignKeys,\n relation.options,\n );\n\n const state: State = {\n query: query as Query.NotReadOnlyQuery,\n primaryKeys,\n foreignKeys,\n on,\n };\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(\n query.where(values as never) as unknown as CreateSelf,\n {\n ...on,\n ...values,\n },\n ) as unknown as Query;\n },\n virtualColumn: new HasOneVirtualColumn(\n internalSchemaConfig,\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","import { Query } from 'pqb';\nimport {\n objectHasValues,\n RecordUnknown,\n toArray,\n _appendQuery,\n _hookSelectColumns,\n _queryDelete,\n _queryInsertMany,\n _querySelect,\n _queryUpdate,\n _queryUpsert,\n CreateSelf,\n RawSql,\n UpdateSelf,\n ColumnsShape,\n getPrimaryKeys,\n MaybeArray,\n} from 'pqb/internal';\nimport {\n makeNestedUpdateRelationIds,\n makeNestedUpdateUpsertData,\n NestedUpdateManyItems,\n NestedUpdateManyUpsert,\n throwIfQueryReturnsAllForNestedUpdate,\n} from '../common/utils';\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\ntype NestedUpdateManyParams = Omit<NestedUpdateManyItems, 'upsert'> & {\n upsert?: MaybeArray<NestedUpdateManyUpsert>;\n};\n\nexport const hasManyUpdate = (\n key: string,\n state: State,\n self: UpdateSelf,\n set: RecordUnknown,\n) => {\n const querySelf = self as unknown as Query;\n const params = set[key] as NestedUpdateManyParams;\n throwIfQueryReturnsAllForNestedUpdate(querySelf, params);\n const makeRelationIds = () =>\n makeNestedUpdateRelationIds(\n querySelf,\n state.query,\n state.primaryKeys,\n state.foreignKeys,\n );\n\n const hasDisconnect =\n !!params.disconnect &&\n (!Array.isArray(params.disconnect) || params.disconnect.length > 0);\n\n const hasSetConditions =\n params.set &&\n (Array.isArray(params.set)\n ? params.set.length\n : objectHasValues(params.set));\n\n if (hasDisconnect || params.set !== undefined) {\n const { primaryKeys, foreignKeys, query: relQuery } = state;\n const relatedAs = relQuery.q.as || relQuery.table;\n const joinSql = new RawSql('');\n let mainAs: string | undefined;\n let aliasedPrimaryKeys: string[] | undefined;\n const setNulls = Object.fromEntries(\n foreignKeys.map((foreignKey) => [foreignKey, null]),\n );\n let queryToDisconnect = relQuery.clone().updateFrom('');\n if (hasDisconnect && params.set === undefined) {\n queryToDisconnect = queryToDisconnect.where({\n OR: toArray(params.disconnect),\n }) as never;\n }\n\n // Do not nullify records that are going to be set, because the column may\n // be non-nullable.\n if (params.set && hasSetConditions) {\n queryToDisconnect = queryToDisconnect.whereNot(\n Array.isArray(params.set) ? { OR: params.set } : params.set,\n ) as never;\n }\n\n const disconnectQuery = _queryUpdate(\n queryToDisconnect.whereSql(joinSql) as unknown as UpdateSelf,\n setNulls as never,\n ) as unknown as Query;\n\n disconnectQuery.q.returnType = 'void';\n\n const setJoinSql = () => {\n if (mainAs && aliasedPrimaryKeys) {\n joinSql._sql = foreignKeys\n .map(\n (foreignKey, i) =>\n `\"${relatedAs}\".\"${(relQuery.shape as ColumnsShape)[foreignKey].data.name || foreignKey}\" = \"${mainAs}\".\"${aliasedPrimaryKeys![i]}\"`,\n )\n .join(' AND ');\n }\n };\n\n _hookSelectColumns(querySelf, primaryKeys, (aliased) => {\n aliasedPrimaryKeys = aliased;\n setJoinSql();\n });\n\n _appendQuery(querySelf, disconnectQuery, (as) => {\n mainAs = as;\n (disconnectQuery.q.updateFrom as { w: string }).w = as;\n disconnectQuery.q.joinedShapes = {\n ...disconnectQuery.q.joinedShapes,\n [as]: {},\n };\n setJoinSql();\n });\n }\n\n const hasAdd =\n params.add && (!Array.isArray(params.add) || params.add.length > 0);\n const updates = params.update ? toArray(params.update) : [];\n const hasUpdate = updates.some(\n (update) => !Array.isArray(update.where) || update.where.length,\n );\n const relatedIdsAs =\n hasUpdate && (hasAdd || hasSetConditions) ? ([] as RawSql[]) : undefined;\n const sourceCondition = relatedIdsAs ? new RawSql('') : undefined;\n const updateFrom = relatedIdsAs ? new RawSql('') : undefined;\n const upsertRelatedIdsAs = params.upsert ? ([] as RawSql[]) : undefined;\n const upsertSourceCondition = upsertRelatedIdsAs ? new RawSql('') : undefined;\n const upsertUpdateFrom = upsertRelatedIdsAs ? new RawSql('') : undefined;\n let appendRelatedQuery: (() => void) | undefined;\n\n const setSourceCondition = (\n relatedIdsAs: RawSql[] | undefined,\n sourceCondition: RawSql | undefined,\n updateFrom: RawSql | undefined,\n relatedPrimaryKeys: string[],\n ) => {\n if (!relatedIdsAs) return;\n\n const relatedAs = state.query.q.as || state.query.table;\n const sourceAs = '\"relatedIds\"';\n sourceCondition!._sql = relatedPrimaryKeys\n .map(\n (primaryKey) =>\n `\"${relatedAs}\".\"${(state.query.shape as ColumnsShape)[primaryKey].data.name || primaryKey}\" = ${sourceAs}.\"${primaryKey}\"`,\n )\n .join(' AND ');\n const columns = relatedPrimaryKeys.map((key) => `\"${key}\"`).join(', ');\n updateFrom!._sql = `(${relatedIdsAs\n .map((as) => `SELECT ${columns} FROM ${as._sql}`)\n .join(' UNION ALL ')}) AS ${sourceAs}`;\n };\n\n if (hasAdd || hasSetConditions) {\n const { query: relQuery } = state;\n const relatedWheres = [\n ...(hasAdd ? toArray(params.add) : []),\n ...(hasSetConditions ? toArray(params.set) : []),\n ];\n if (relatedIdsAs || upsertRelatedIdsAs) {\n const relatedPrimaryKeys = getPrimaryKeys(relQuery);\n const relatedQuery = _querySelect(\n relQuery.clone().where({ OR: relatedWheres }),\n relatedPrimaryKeys as never,\n ) as Query;\n relatedQuery.q.returnType = 'void';\n\n _appendQuery(\n querySelf,\n relatedQuery,\n () => {},\n (as) => {\n if (relatedIdsAs) {\n relatedIdsAs.push(new RawSql(`\"${as}\"`));\n setSourceCondition(\n relatedIdsAs,\n sourceCondition,\n updateFrom,\n relatedPrimaryKeys,\n );\n }\n if (upsertRelatedIdsAs) {\n upsertRelatedIdsAs.push(new RawSql(`\"${as}\"`));\n setSourceCondition(\n upsertRelatedIdsAs,\n upsertSourceCondition,\n upsertUpdateFrom,\n relatedPrimaryKeys,\n );\n }\n },\n );\n\n if (!querySelf.q.upsertUpdate) {\n relatedQuery.q.ensureCount = {\n expected: relatedWheres.length,\n message: `based on \\`${hasAdd ? 'add' : 'set'}\\` conditions`,\n };\n }\n }\n\n appendRelatedQuery = () => {\n const ids = makeRelationIds();\n const addQuery = _queryUpdate(\n (sourceCondition\n ? relQuery.clone().where({\n OR: relatedWheres,\n NOT: {\n OR: updates.flatMap((update) => toArray(update.where)),\n },\n })\n : relQuery\n .clone()\n .where({ OR: relatedWheres })) as unknown as UpdateSelf,\n ids.setIds as never,\n ) as unknown as Query;\n\n addQuery.q.returnType = 'void';\n if (!sourceCondition && !querySelf.q.upsertUpdate) {\n addQuery.q.ensureCount = {\n expected: relatedWheres.length,\n message: `based on \\`${hasAdd ? 'add' : 'set'}\\` conditions`,\n };\n }\n\n _appendQuery(querySelf, addQuery, ids.setAppendedAs);\n };\n }\n\n if (upsertRelatedIdsAs) {\n const { query: relQuery } = state;\n const ids = makeRelationIds();\n let existingRelQuery = hasDisconnect\n ? ids.existingRelQuery.whereNot({ OR: toArray(params.disconnect) })\n : ids.existingRelQuery;\n if (params.set !== undefined) {\n existingRelQuery = (\n hasSetConditions\n ? existingRelQuery.where(\n Array.isArray(params.set) ? { OR: params.set } : params.set,\n )\n : existingRelQuery.none()\n ) as Query;\n }\n const relatedPrimaryKeys = getPrimaryKeys(relQuery);\n const relatedQuery = _querySelect(\n existingRelQuery,\n relatedPrimaryKeys as never,\n ) as Query;\n relatedQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, relatedQuery, ids.setAppendedAs, (as) => {\n upsertRelatedIdsAs.push(new RawSql(`\"${as}\"`));\n setSourceCondition(\n upsertRelatedIdsAs,\n upsertSourceCondition,\n upsertUpdateFrom,\n relatedPrimaryKeys,\n );\n });\n }\n\n if (\n params.delete &&\n (!Array.isArray(params.delete) || params.delete.length > 0)\n ) {\n const ids = makeRelationIds();\n const deleteQuery = _queryDelete(\n ids.existingRelQuery.where({\n OR: toArray(params.delete),\n }) as Query.NotReadOnlyQuery,\n ) as unknown as Query;\n\n deleteQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, deleteQuery, ids.setAppendedAs);\n }\n\n appendRelatedQuery?.();\n\n if (params.upsert) {\n const { query: relQuery } = state;\n\n for (const upsert of toArray(params.upsert)) {\n const ids = makeRelationIds();\n\n const appendedQuery = _queryUpsert(\n (upsertSourceCondition\n ? relQuery\n .clone()\n .where(upsert.findBy as never)\n .whereSql(upsertSourceCondition)\n : ids.existingRelQuery.where(upsert.findBy as never)) as Query,\n makeNestedUpdateUpsertData(\n upsertSourceCondition\n ? { ...upsert, update: { ...upsert.update, ...ids.setIds } }\n : upsert,\n ids.setIds,\n ),\n ) as unknown as Query;\n\n if (upsertUpdateFrom) {\n appendedQuery.q.updateFrom = {\n u: true,\n x: upsertUpdateFrom,\n };\n }\n\n appendedQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, appendedQuery, ids.setAppendedAs);\n }\n }\n\n if (hasUpdate) {\n for (const update of updates) {\n if (Array.isArray(update.where) && update.where.length === 0) continue;\n\n const { query: relQuery } = state;\n const ids = makeRelationIds();\n let relatedUpdateQuery: Query = relQuery.clone().where({\n OR: toArray(update.where),\n });\n\n if (sourceCondition) {\n relatedUpdateQuery.q.updateFrom = {\n u: true,\n x: updateFrom as RawSql,\n };\n relatedUpdateQuery = relatedUpdateQuery.whereSql(sourceCondition);\n } else {\n relatedUpdateQuery = ids.existingRelQuery.where({\n OR: toArray(update.where),\n });\n }\n const updateQuery = _queryUpdate(\n relatedUpdateQuery as unknown as UpdateSelf,\n (sourceCondition\n ? { ...update.data, ...ids.setIds }\n : update.data) as never,\n ) as unknown as Query;\n\n updateQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, updateQuery, ids.setAppendedAs);\n }\n }\n\n if (params.create?.length) {\n const { query: relQuery } = state;\n const ids = makeRelationIds();\n const createQuery = _queryInsertMany(\n relQuery.clone() as unknown as CreateSelf,\n params.create.map((data) => ({ ...data, ...ids.setIds })),\n ) as unknown as Query;\n\n createQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, createQuery, ids.setAppendedAs);\n }\n};\n","import { Query } from 'pqb';\nimport { RecordUnknown, RelationJoinQuery, _queryWhere } from 'pqb/internal';\nimport {\n getThroughRelation,\n getSourceRelation,\n joinHasThrough,\n} from '../common/utils';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport { RelationData } from '../relations';\nimport { HasMany } from './has-many';\n\ninterface ThroughRelationState {\n table: Query;\n query: Query;\n relation: HasMany;\n relationName: string;\n relPKeys: string[];\n}\n\nexport const makeHasManyThroughMethod = ({\n table,\n query,\n relation,\n relationName,\n relPKeys,\n}: ThroughRelationState): RelationData | undefined => {\n if (!('through' in relation.options)) {\n return undefined;\n }\n\n const { through, source, on } = relation.options;\n if (on) _queryWhere(query, [on]);\n\n const throughRelation = getThroughRelation(table, through);\n const sourceRelation = getSourceRelation(throughRelation, source);\n const sourceRelationQuery = (sourceRelation.query as Query).as(relationName);\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","import { Query } from 'pqb';\nimport {\n _appendQuery,\n _appendQueryOnUpsertCreate,\n _clone,\n _hookSelectColumns,\n _queryCreateMany,\n _queryInsertMany,\n _queryInsertManyFrom,\n _querySelect,\n _queryTake,\n _queryUpdate,\n _queryUpdateOrThrow,\n _queryUpsert,\n _queryWhere,\n CreateCtx,\n CreateSelf,\n prepareSubQueryForSql,\n RawSql,\n RecordUnknown,\n UpdateSelf,\n WhereArg,\n toArray,\n} from 'pqb/internal';\nimport {\n hasRelationHandleCreate,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n NestedUpdateManyUpsert,\n NestedInsertOneItemConnectOrCreate,\n makeNestedUpdateUpsertData,\n selectCteColumnFromManySql,\n makeRawSqlPlaceholderRecord,\n setRawSqlPlaceholderRecordFromCte,\n} from '../common/utils';\n\nexport type HasManyNestedInsert = (\n query: Query,\n data: [selfData: RecordUnknown, relationData: NestedInsertManyItems][],\n) => Promise<void>;\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nexport const 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[] }) as unknown as UpdateSelf,\n obj as never,\n ) as unknown as Query;\n }\n\n await Promise.all(items);\n }\n\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n items.push(item);\n }\n }\n\n let connected: number[];\n if (items.length) {\n const queries: Query[] = [];\n for (let i = 0, len = items.length; i < len; i++) {\n const [selfData, { connectOrCreate }] = items[i] as [\n 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 unknown as UpdateSelf,\n obj as never,\n ) as unknown as Query,\n );\n }\n }\n\n connected = (await Promise.all(queries)) as number[];\n } else {\n connected = [];\n }\n\n let connectedI = 0;\n items.length = 0;\n for (const item of data) {\n if (item[1].connectOrCreate) {\n const length = item[1].connectOrCreate.length;\n connectedI += length;\n for (let i = length; i > 0; i--) {\n if (connected[connectedI - i] === 0) {\n items.push(item);\n break;\n }\n }\n } else if (item[1].create) {\n items.push(item);\n }\n }\n\n connectedI = 0;\n if (items.length) {\n const records: 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\n items.length = 0;\n for (const item of data) {\n if (item[1].upsert) {\n items.push(item);\n }\n }\n\n if (items.length) {\n const queries: Query[] = [];\n for (const [selfData, { upsert }] of items as [\n RecordUnknown,\n NestedInsertManyItems,\n ][]) {\n const foreignKeyValues: RecordUnknown = {};\n for (let i = 0; i < len; i++) {\n foreignKeyValues[foreignKeys[i]] = selfData[primaryKeys[i]];\n }\n\n for (const item of toArray(upsert!)) {\n queries.push(\n _queryUpsert(\n t\n .clone()\n .where(item.findBy as unknown as WhereArg<Query>) as never,\n {\n update: { ...item.update, ...foreignKeyValues },\n create: makeNestedUpdateUpsertData(item, foreignKeyValues)\n .create,\n } as never,\n ) as unknown as Query,\n );\n }\n }\n\n await Promise.all(queries);\n }\n }) as HasManyNestedInsert;\n};\n\nexport const hasManyCreate = (\n key: string,\n state: State,\n nestedInsertFn: HasManyNestedInsert,\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n) => {\n const querySelf = self as unknown as Query;\n if (count <= querySelf.qb.internal.nestedCreateBatchMax) {\n interface NestedCreateItem {\n indexes: number[];\n items: RecordUnknown[];\n values: unknown[][];\n }\n\n interface NestedCreateItems {\n create?: {\n indexes: number[];\n items: RecordUnknown[][];\n };\n connect?: NestedCreateItem;\n connectOrCreate?: NestedCreateItem;\n upsert?: NestedCreateItem;\n }\n\n const { query: relQuery, primaryKeys, foreignKeys } = state;\n\n let nestedCreateItems: NestedCreateItems | undefined;\n\n items.forEach((item, i) => {\n const value = item[key] as NestedInsertManyItems;\n\n if (value.create?.length) {\n const nestedCreateItem = ((nestedCreateItems ??= {}).create ??= {\n indexes: [],\n items: [],\n });\n nestedCreateItem.indexes.push(rowIndexes[i]);\n\n const data = value.create.map((obj) => ({\n ...obj,\n ...makeRawSqlPlaceholderRecord(foreignKeys),\n }));\n\n nestedCreateItem.items.push(data);\n }\n\n for (const kind of ['connect', 'connectOrCreate', 'upsert'] as const) {\n const values = (\n kind === 'upsert'\n ? value.upsert\n ? toArray(value.upsert)\n : undefined\n : value[kind]\n ) as unknown[] | undefined;\n if (!values?.length) continue;\n\n const nestedCreateItem = ((nestedCreateItems ??= {})[kind] ??= {\n indexes: [],\n items: [],\n values: [],\n });\n nestedCreateItem.indexes.push(rowIndexes[i]);\n nestedCreateItem.values.push(values as unknown[]);\n\n const data = makeRawSqlPlaceholderRecord(foreignKeys);\n nestedCreateItem.items.push(data);\n }\n });\n\n if (!nestedCreateItems) {\n return;\n }\n\n let createAs: string | undefined;\n let createWhereExists: RawSql | undefined;\n let createSelectAs: RecordUnknown | undefined;\n let createAliasedPrimaryKeys: string[] | undefined;\n let upsertCreateAs: string | undefined;\n let connectAs: string | undefined;\n let connectOrCreateAs: string | undefined;\n let upsertAs: string | undefined;\n\n // In upsert create, relation FKs point to the parent create CTE.\n // The CTE alias and selected parent PK aliases are provided by separate callbacks.\n const setUpsertCreatePlaceholders = () => {\n if (!upsertCreateAs || !createAliasedPrimaryKeys) return;\n\n const aliasedPrimaryKeys = createAliasedPrimaryKeys;\n\n if (createWhereExists) {\n createWhereExists._sql = `EXISTS (SELECT 1 FROM \"${upsertCreateAs}\")`;\n }\n\n if (createSelectAs) {\n foreignKeys.forEach((key, keyI) => {\n ((createSelectAs as RecordUnknown)[key] as RawSql)._sql =\n selectCteColumnFromManySql(\n upsertCreateAs as string,\n aliasedPrimaryKeys[keyI],\n 0,\n 1,\n );\n });\n }\n\n if (connect) {\n for (let i = 0; i < connect.items.length; i++) {\n setRawSqlPlaceholderRecordFromCte(\n connect.items[i],\n foreignKeys,\n upsertCreateAs,\n aliasedPrimaryKeys,\n connect.indexes[i],\n count,\n );\n }\n }\n\n if (connectOrCreate) {\n for (let i = 0; i < connectOrCreate.items.length; i++) {\n setRawSqlPlaceholderRecordFromCte(\n connectOrCreate.items[i],\n foreignKeys,\n upsertCreateAs,\n aliasedPrimaryKeys,\n connectOrCreate.indexes[i],\n count,\n );\n }\n }\n\n if (upsert) {\n for (let i = 0; i < upsert.items.length; i++) {\n setRawSqlPlaceholderRecordFromCte(\n upsert.items[i],\n foreignKeys,\n upsertCreateAs,\n aliasedPrimaryKeys,\n upsert.indexes[i],\n count,\n );\n }\n }\n };\n\n _hookSelectColumns(querySelf, primaryKeys, (aliasedPrimaryKeys) => {\n createAliasedPrimaryKeys = aliasedPrimaryKeys;\n\n if (create && createAs) {\n for (let i = 0; i < create.items.length; i++) {\n for (const item of create.items[i]) {\n setRawSqlPlaceholderRecordFromCte(\n item,\n foreignKeys,\n createAs,\n aliasedPrimaryKeys,\n create.indexes[i],\n count,\n );\n }\n }\n }\n\n if (connect && connectAs) {\n for (let i = 0; i < connect.items.length; i++) {\n setRawSqlPlaceholderRecordFromCte(\n connect.items[i],\n foreignKeys,\n connectAs,\n aliasedPrimaryKeys,\n connect.indexes[i],\n count,\n );\n }\n }\n\n if (connectOrCreate && connectOrCreateAs) {\n for (let i = 0; i < connectOrCreate.items.length; i++) {\n setRawSqlPlaceholderRecordFromCte(\n connectOrCreate.items[i],\n foreignKeys,\n connectOrCreateAs,\n aliasedPrimaryKeys,\n connectOrCreate.indexes[i],\n count,\n );\n }\n }\n\n if (upsert && upsertAs) {\n for (let i = 0; i < upsert.items.length; i++) {\n setRawSqlPlaceholderRecordFromCte(\n upsert.items[i],\n foreignKeys,\n upsertAs,\n aliasedPrimaryKeys,\n upsert.indexes[i],\n count,\n );\n }\n }\n\n setUpsertCreatePlaceholders();\n });\n\n const { create, connect, connectOrCreate, upsert } = nestedCreateItems;\n\n if (create) {\n let query: Query;\n if (querySelf.q.type === 'upsert') {\n createWhereExists = new RawSql('');\n createSelectAs = {};\n for (const key of foreignKeys) {\n createSelectAs[key] = new RawSql('');\n }\n\n const sourceQuery = _queryWhere(\n _queryTake(\n _querySelect(_clone(relQuery.qb), [createSelectAs as never]),\n ),\n [createWhereExists] as never,\n );\n\n // Plain INSERT ... VALUES cannot render a WHERE guard, so upsert\n // nested create uses INSERT ... SELECT FROM a guarded one-row query.\n query = _queryInsertManyFrom(\n _clone(relQuery) as unknown as CreateSelf,\n sourceQuery as never,\n create.items.flat() as never,\n ) as unknown as Query;\n } else {\n query = _queryInsertMany(\n _clone(relQuery) as unknown as CreateSelf,\n create.items.flat() as never,\n ) as unknown as Query;\n }\n\n if (querySelf.q.type === 'upsert') {\n _appendQueryOnUpsertCreate(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n });\n } else {\n _appendQuery(querySelf, query, (as) => (createAs = as));\n }\n }\n\n if (connect) {\n connect.values.forEach((value, i) => {\n const connectWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n\n const query = _queryUpdateOrThrow(\n relQuery.whereOneOf(...(value as never[])) as never,\n connect.items[i] as never,\n ) as Query;\n\n if (connectWhereExists) {\n // Only run nested connect when the parent upsert actually created a row.\n _queryWhere(query, [connectWhereExists] as never);\n }\n\n query.q.ensureCount = { expected: value.length };\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n connectAs = as;\n if (connectWhereExists) {\n connectWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n });\n }\n\n if (connectOrCreate) {\n connectOrCreate.values.forEach((array, i) => {\n const foreignKeyValues = connectOrCreate.items[i];\n for (const value of array as NestedInsertOneItemConnectOrCreate[]) {\n const connectOrCreateWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n const connectOrCreateSelectAs: RecordUnknown = {};\n if (connectOrCreateWhereExists) {\n for (const key of foreignKeys) {\n const value = foreignKeyValues[key] as RawSql;\n // These RawSql placeholders are selected by the insertFrom\n // source query, so select parsing needs the target column type.\n value.result = {\n value: relQuery.qb.shape[key],\n };\n connectOrCreateSelectAs[key] = value;\n }\n }\n\n const query = _queryUpsert(relQuery.where(value.where) as never, {\n update: foreignKeyValues,\n create: {\n ...value.create,\n ...foreignKeyValues,\n },\n });\n\n if (connectOrCreateWhereExists) {\n // Guard the update half of child upsert with the parent create CTE.\n _queryWhere(query, [connectOrCreateWhereExists] as never);\n\n // The insert half of child upsert ignores the update query WHERE.\n // Move relation FKs into an insertFrom source that becomes empty\n // when the parent create CTE is empty.\n const guardQuery = _queryWhere(\n _queryTake(\n _querySelect(_clone(relQuery.qb), [{ one: new RawSql('1') }]),\n ),\n [connectOrCreateWhereExists] as never,\n );\n\n const sourceQuery = _querySelect(\n (_clone(relQuery.qb) as Query).from(guardQuery as never),\n [connectOrCreateSelectAs as never],\n );\n\n const q = query.q;\n const columns = q.columns || [];\n const foreignKeysSet = new Set(foreignKeys);\n // FK columns now come from sourceQuery; keep user-provided insert\n // columns after them so INSERT column order matches SELECT output.\n q.columns = [\n ...foreignKeys,\n ...columns.filter((column) => !foreignKeysSet.has(column)),\n ];\n // Drop FK values from VALUES; their values are selected from\n // sourceQuery, while the remaining row data still comes from VALUES.\n q.values = q.values.map((row) =>\n row.filter((_, i) => !foreignKeysSet.has(columns[i])),\n );\n // Tells insert SQL how many leading columns are produced by\n // sourceQuery before appending the remaining VALUES columns.\n q.queryColumnsCount = foreignKeys.length;\n q.insertFrom = prepareSubQueryForSql(query, sourceQuery as never);\n }\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n connectOrCreateAs = as;\n if (connectOrCreateWhereExists) {\n connectOrCreateWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n }\n });\n }\n\n if (upsert) {\n upsert.values.forEach((array, i) => {\n const foreignKeyValues = upsert.items[i];\n for (const value of array as NestedUpdateManyUpsert[]) {\n const upsertWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n const upsertSelectAs: RecordUnknown = {};\n if (upsertWhereExists) {\n for (const key of foreignKeys) {\n const foreignKeyValue = foreignKeyValues[key] as RawSql;\n foreignKeyValue.result = { value: relQuery.qb.shape[key] };\n upsertSelectAs[key] = foreignKeyValue;\n }\n }\n\n const query = _queryUpsert(\n relQuery.where(value.findBy as never) as never,\n {\n update: { ...value.update, ...foreignKeyValues },\n create: makeNestedUpdateUpsertData(value, foreignKeyValues)\n .create,\n },\n );\n\n if (upsertWhereExists) {\n _queryWhere(query, [upsertWhereExists] as never);\n\n const guardQuery = _queryWhere(\n _queryTake(\n _querySelect(_clone(relQuery.qb), [{ one: new RawSql('1') }]),\n ),\n [upsertWhereExists] as never,\n );\n\n const sourceQuery = _querySelect(\n (_clone(relQuery.qb) as Query).from(guardQuery as never),\n [upsertSelectAs as never],\n );\n\n const q = query.q;\n const columns = q.columns || [];\n const foreignKeysSet = new Set(foreignKeys);\n q.columns = [\n ...foreignKeys,\n ...columns.filter((column) => !foreignKeysSet.has(column)),\n ];\n q.values = q.values.map((row) =>\n row.filter((_, i) => !foreignKeysSet.has(columns[i])),\n );\n q.queryColumnsCount = foreignKeys.length;\n q.insertFrom = prepareSubQueryForSql(query, sourceQuery as never);\n }\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n\n appendQuery(querySelf, query, (as) => {\n upsertCreateAs = as;\n setUpsertCreatePlaceholders();\n upsertAs = as;\n if (upsertWhereExists) {\n upsertWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n }\n });\n }\n } else {\n hasRelationHandleCreate(\n querySelf,\n ctx,\n items,\n rowIndexes,\n key,\n state.primaryKeys,\n nestedInsertFn,\n );\n }\n};\n","import {\n RelationData,\n RelationThunkBase,\n RelationConfigSelf,\n} from '../relations';\nimport { Query } from 'pqb';\nimport {\n CreateData,\n WhereArg,\n VirtualColumn,\n CreateCtx,\n CreateSelf,\n UpdateData,\n UpdateSelf,\n _queryDefaults,\n PickQueryQ,\n _queryWhere,\n SelectableFromShape,\n ColumnSchemaConfig,\n getPrimaryKeys,\n MaybeArray,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n prepareSubQueryForSql,\n QueryHasWhere,\n internalSchemaConfig,\n} from 'pqb/internal';\nimport { addAutoForeignKey, joinHasRelation } from '../common/utils';\nimport { hasManyUpdate } from './has-many.update';\nimport { makeHasManyThroughMethod } from './has-many.through';\nimport { RelationRefsOptions, RelationThroughOptions } from '../common/options';\nimport {\n HasOneOptions,\n HasOneParams,\n HasOneQueryThrough,\n} from '../has-one/has-one';\nimport { ORMTableInput } from '../../orm-table/legacy-table';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport {\n HasManyNestedInsert,\n nestedInsert,\n hasManyCreate,\n} from './has-many.create';\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 RelationRefsOptions\n ? {\n [K in keyof TableQuery]: K extends '__defaults'\n ? {\n [K in\n | keyof TableQuery['__defaults']\n | T['relations'][Name]['options']['references'][number]]: true;\n }\n : K extends '__selectable'\n ? SelectableFromShape<TableQuery['shape'], Name>\n : K extends '__as'\n ? Name\n : TableQuery[K];\n } & QueryHasWhere\n : HasOneQueryThrough<Name, TableQuery>;\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['options']>;\n omitForeignKeyInCreate: never;\n dataForCreate: {\n [K in Name]?: Q extends Query.Pick.IsNotReadOnly\n ? Rel['options'] extends RelationThroughOptions\n ? never\n : {\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 upsert?: MaybeArray<{\n findBy: Q['internal']['uniqueColumns'];\n update: UpdateData<Q>;\n create?: CreateData<Q> | (() => CreateData<Q>);\n }>;\n }\n : never;\n };\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: Q extends Query.Pick.IsNotReadOnly\n ? {\n disconnect?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: MaybeArray<{\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n }>;\n }\n : never;\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: Q extends Query.Pick.IsNotReadOnly\n ? {\n disconnect?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: MaybeArray<{\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n }>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n create?: CreateData<Q>[];\n upsert?: MaybeArray<{\n findBy: Q['internal']['uniqueColumns'];\n update: UpdateData<Q>;\n create?: CreateData<Q> | (() => CreateData<Q>);\n }>;\n }\n : never;\n}\n\ninterface State {\n query: Query.NotReadOnlyQuery;\n primaryKeys: string[];\n foreignKeys: string[];\n on?: RecordUnknown;\n}\n\nclass HasManyVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasManyNestedInsert;\n private readonly setNulls: RecordUnknown;\n\n constructor(\n schema: ColumnSchemaConfig,\n private key: string,\n private state: State,\n ) {\n super(schema);\n this.nestedInsert = nestedInsert(state);\n\n this.setNulls = {};\n for (const foreignKey of state.foreignKeys) {\n this.setNulls[foreignKey] = null;\n }\n }\n\n create(\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n ) {\n hasManyCreate(\n this.key,\n this.state,\n this.nestedInsert,\n self,\n ctx,\n items,\n rowIndexes,\n count,\n );\n }\n\n update(self: UpdateSelf, set: RecordUnknown) {\n hasManyUpdate(this.key, this.state, self, set);\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 const throughResult = makeHasManyThroughMethod({\n table,\n query,\n relation,\n relationName,\n relPKeys,\n });\n if (throughResult) return throughResult;\n\n // After through check, we know options has columns/references\n const opts = relation.options as RelationRefsOptions;\n const primaryKeys = opts.columns as string[];\n const foreignKeys = opts.references as string[];\n const { on } = opts;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query as unknown as CreateSelf, on);\n }\n\n addAutoForeignKey(tableConfig, query, table, primaryKeys, foreignKeys, opts);\n\n const state: State = {\n query: query as Query.NotReadOnlyQuery,\n primaryKeys,\n foreignKeys,\n on,\n };\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(\n query.where(values as never) as unknown as CreateSelf,\n {\n ...on,\n ...values,\n },\n ) as unknown as Query;\n },\n virtualColumn: new HasManyVirtualColumn(\n internalSchemaConfig,\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","import { Query } from 'pqb';\nimport {\n _appendQuery,\n _appendQueryOnUpsertCreate,\n _clone,\n _hookSelectColumns,\n _queryFindBy,\n _queryFindByOptional,\n _queryCreateMany,\n _queryInsertForEachFrom,\n _queryInsertMany,\n _queryInsertManyFrom,\n _querySelect,\n _queryTake,\n _queryUpsert,\n _queryUpdate,\n _queryWhere,\n RawSql,\n RecordUnknown,\n CreateSelf,\n CreateCtx,\n UpdateSelf,\n MaybeArray,\n toArray,\n} from 'pqb/internal';\nimport {\n hasRelationHandleCreate,\n NestedInsertManyConnect,\n NestedInsertManyConnectOrCreate,\n NestedInsertManyItems,\n NestedUpdateManyUpsert,\n makeRawSqlPlaceholders,\n setRawSqlPlaceholdersFromCte,\n} from '../common/utils';\nimport { HasManyNestedInsert } from '../has-many/has-many.create';\nimport { State } from './has-and-belongs-to-many';\n\nexport const hasAndBelongsToManyCreate = (\n key: string,\n state: State,\n nestedInsertFn: HasManyNestedInsert,\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n) => {\n const querySelf = self as unknown as Query;\n if (count <= querySelf.qb.internal.nestedCreateBatchMax) {\n const {\n relatedTableQuery: relQuery,\n joinTableQuery,\n primaryKeys,\n foreignKeys,\n throughForeignKeys,\n throughPrimaryKeys,\n } = state;\n\n const nestedRecords: {\n rowIndex: number;\n records: RecordUnknown[];\n foreignKeyValues: RawSql[];\n }[] = [];\n const nestedConnects: {\n rowIndex: number;\n connect: NestedInsertManyConnect;\n foreignKeyValues: RawSql[];\n }[] = [];\n const nestedConnectOrCreates: {\n rowIndex: number;\n connectOrCreate: NestedInsertManyConnectOrCreate;\n foreignKeyValues: RawSql[];\n }[] = [];\n const nestedUpserts: {\n rowIndex: number;\n upsert: MaybeArray<NestedUpdateManyUpsert>;\n foreignKeyValues: RawSql[];\n }[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const value = item[key] as NestedInsertManyItems;\n if (value.create?.length) {\n nestedRecords.push({\n rowIndex: rowIndexes[i],\n records: value.create,\n foreignKeyValues: makeRawSqlPlaceholders(foreignKeys.length),\n });\n }\n if (value.connect?.length) {\n nestedConnects.push({\n rowIndex: rowIndexes[i],\n connect: value.connect,\n foreignKeyValues: makeRawSqlPlaceholders(foreignKeys.length),\n });\n }\n if (value.connectOrCreate?.length) {\n nestedConnectOrCreates.push({\n rowIndex: rowIndexes[i],\n connectOrCreate: value.connectOrCreate,\n foreignKeyValues: makeRawSqlPlaceholders(foreignKeys.length),\n });\n }\n if (value.upsert) {\n nestedUpserts.push({\n rowIndex: rowIndexes[i],\n upsert: value.upsert,\n foreignKeyValues: makeRawSqlPlaceholders(foreignKeys.length),\n });\n }\n }\n\n if (\n nestedRecords.length ||\n nestedConnects.length ||\n nestedConnectOrCreates.length ||\n nestedUpserts.length\n ) {\n let mainAs: string | undefined;\n let aliasedPrimaryKeysForMain: string[] | undefined;\n const setMainForeignKeyValues = () => {\n if (!mainAs || !aliasedPrimaryKeysForMain) return;\n\n for (const { rowIndex, foreignKeyValues } of [\n ...nestedRecords,\n ...nestedConnects,\n ...nestedConnectOrCreates,\n ...nestedUpserts,\n ]) {\n setRawSqlPlaceholdersFromCte(\n foreignKeyValues,\n mainAs,\n aliasedPrimaryKeysForMain,\n rowIndex,\n count,\n );\n }\n };\n const setMainAs = (as: string) => {\n mainAs = as;\n setMainForeignKeyValues();\n };\n _hookSelectColumns(querySelf, primaryKeys, (aliasedPrimaryKeys) => {\n aliasedPrimaryKeysForMain = aliasedPrimaryKeys;\n setMainForeignKeyValues();\n });\n\n const joinQueries: Query[] = [];\n for (const nested of nestedRecords) {\n const { foreignKeyValues } = nested;\n const throughForeignKeyValues = makeRawSqlPlaceholders(\n throughForeignKeys.length,\n );\n\n const selectAs: RecordUnknown = {};\n for (let i = 0; i < foreignKeys.length; i++) {\n selectAs[foreignKeys[i]] = foreignKeyValues[i];\n }\n for (let i = 0; i < throughForeignKeys.length; i++) {\n selectAs[throughForeignKeys[i]] = throughForeignKeyValues[i];\n }\n\n // `baseQuery` intentionally strips possible `on` WHERE clauses from\n // the join CTE: they are already applied in the related CTE.\n const joinRows = _querySelect(_clone(relQuery.baseQuery), [\n selectAs as never,\n ]);\n const joinQuery = _queryInsertForEachFrom(\n _clone(joinTableQuery) as unknown as CreateSelf,\n joinRows,\n ) as unknown as Query;\n joinQuery.q.returnType = 'void';\n joinQuery.q.ensureCount = { expected: 1 };\n if (querySelf.q.type === 'upsert') {\n const createWhereExists = new RawSql('');\n const sourceQuery = _queryWhere(\n _queryTake(_querySelect(_clone(relQuery.qb), [{}])),\n [createWhereExists] as never,\n );\n const query = _queryInsertManyFrom(\n _querySelect(\n _clone(relQuery),\n throughPrimaryKeys as never,\n ) as unknown as CreateSelf,\n sourceQuery as never,\n nested.records as never,\n ) as unknown as Query;\n\n const queryWithJoin = _appendQuery(query, joinQuery, (as) => {\n joinRows.q.from = as;\n joinRows.q.schema = undefined;\n for (let i = 0; i < throughForeignKeyValues.length; i++) {\n throughForeignKeyValues[i]._sql =\n `\"${as}\".\"${throughPrimaryKeys[i]}\"`;\n }\n });\n\n _appendQueryOnUpsertCreate(querySelf, queryWithJoin, (as) => {\n setMainAs(as);\n createWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n });\n } else {\n joinQueries.push(joinQuery);\n\n const query = _queryInsertMany(\n _querySelect(\n _clone(relQuery),\n throughPrimaryKeys as never,\n ) as unknown as CreateSelf,\n nested.records as never,\n ) as unknown as Query;\n\n _appendQuery(querySelf, query, setMainAs, (as) => {\n joinRows.q.from = as;\n joinRows.q.schema = undefined;\n for (let i = 0; i < throughForeignKeyValues.length; i++) {\n throughForeignKeyValues[i]._sql =\n `\"${as}\".\"${throughPrimaryKeys[i]}\"`;\n }\n });\n }\n }\n\n for (const { connect, foreignKeyValues } of nestedConnects) {\n for (const item of connect) {\n const selectAs: RecordUnknown = {};\n for (let i = 0; i < foreignKeys.length; i++) {\n selectAs[foreignKeys[i]] = foreignKeyValues[i];\n }\n for (let i = 0; i < throughForeignKeys.length; i++) {\n selectAs[throughForeignKeys[i]] = throughPrimaryKeys[i];\n }\n\n const joinRows = _queryFindBy(\n _querySelect(_clone(relQuery), [selectAs as never]),\n item as never,\n );\n const joinQuery = _queryInsertForEachFrom(\n _clone(joinTableQuery) as unknown as CreateSelf,\n joinRows,\n ) as unknown as Query;\n joinQuery.q.returnType = 'void';\n joinQuery.q.ensureCount = { expected: 1 };\n\n if (querySelf.q.type === 'upsert') {\n const connectWhereExists = new RawSql('');\n _queryWhere(joinRows, [connectWhereExists] as never);\n\n _appendQueryOnUpsertCreate(querySelf, joinQuery, (as) => {\n setMainAs(as);\n connectWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n });\n } else {\n joinQueries.push(joinQuery);\n }\n }\n }\n\n for (const joinQuery of joinQueries) {\n _appendQuery(querySelf, joinQuery, setMainAs);\n }\n\n for (const {\n connectOrCreate,\n foreignKeyValues,\n } of nestedConnectOrCreates) {\n for (const value of connectOrCreate) {\n const selectAs: RecordUnknown = {};\n for (let i = 0; i < foreignKeys.length; i++) {\n selectAs[foreignKeys[i]] = foreignKeyValues[i];\n }\n for (let i = 0; i < throughForeignKeys.length; i++) {\n selectAs[throughForeignKeys[i]] = throughPrimaryKeys[i];\n }\n\n const connectRows = _queryFindBy(\n _querySelect(_clone(relQuery), [selectAs as never]),\n value.where as never,\n );\n const connectQuery = _queryInsertForEachFrom(\n _clone(joinTableQuery) as unknown as CreateSelf,\n connectRows,\n ) as unknown as Query;\n connectQuery.q.returnType = 'void';\n\n const createWhereNotExists = new RawSql('');\n const createWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n const createSource = _queryWhere(\n _queryTake(_querySelect(_clone(relQuery.qb), [{}])),\n [createWhereNotExists, createWhereExists].filter(Boolean) as never,\n );\n const createQuery = _queryInsertManyFrom(\n _querySelect(\n _clone(relQuery),\n throughPrimaryKeys as never,\n ) as unknown as CreateSelf,\n createSource as never,\n [value.create] as never,\n ) as unknown as Query;\n\n const throughForeignKeyValues = makeRawSqlPlaceholders(\n throughForeignKeys.length,\n );\n const createSelectAs: RecordUnknown = {};\n for (let i = 0; i < foreignKeys.length; i++) {\n createSelectAs[foreignKeys[i]] = foreignKeyValues[i];\n }\n for (let i = 0; i < throughForeignKeys.length; i++) {\n createSelectAs[throughForeignKeys[i]] = throughForeignKeyValues[i];\n }\n\n const createJoinRows = _querySelect(_clone(relQuery.baseQuery), [\n createSelectAs as never,\n ]);\n const createJoinQuery = _queryInsertForEachFrom(\n _clone(joinTableQuery) as unknown as CreateSelf,\n createJoinRows,\n ) as unknown as Query;\n createJoinQuery.q.returnType = 'void';\n\n if (querySelf.q.type === 'upsert') {\n const connectWhereExists = new RawSql('');\n _queryWhere(connectRows, [connectWhereExists] as never);\n\n const createQueryWithJoin = _appendQuery(\n createQuery,\n createJoinQuery,\n (as) => {\n createJoinRows.q.from = as;\n createJoinRows.q.schema = undefined;\n for (let i = 0; i < throughForeignKeyValues.length; i++) {\n throughForeignKeyValues[i]._sql =\n `\"${as}\".\"${throughPrimaryKeys[i]}\"`;\n }\n },\n );\n const query = _appendQuery(\n connectQuery,\n createQueryWithJoin,\n (as) => {\n createWhereNotExists._sql = `NOT EXISTS (SELECT 1 FROM \"${as}\")`;\n },\n );\n\n _appendQueryOnUpsertCreate(querySelf, query, (as) => {\n setMainAs(as);\n connectWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n createWhereExists!._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n });\n } else {\n _appendQuery(querySelf, connectQuery, setMainAs, (as) => {\n createWhereNotExists._sql = `NOT EXISTS (SELECT 1 FROM \"${as}\")`;\n });\n _appendQuery(querySelf, createQuery, setMainAs, (as) => {\n createJoinRows.q.from = as;\n createJoinRows.q.schema = undefined;\n for (let i = 0; i < throughForeignKeyValues.length; i++) {\n throughForeignKeyValues[i]._sql =\n `\"${as}\".\"${throughPrimaryKeys[i]}\"`;\n }\n });\n _appendQuery(querySelf, createJoinQuery, setMainAs);\n }\n }\n }\n\n for (const { upsert, foreignKeyValues } of nestedUpserts) {\n for (const value of toArray(upsert)) {\n const upsertWhereExists =\n querySelf.q.type === 'upsert' ? new RawSql('') : undefined;\n const makeJoinQuery = () => {\n const selectAs: RecordUnknown = {};\n for (let i = 0; i < foreignKeys.length; i++) {\n selectAs[foreignKeys[i]] = foreignKeyValues[i];\n }\n for (let i = 0; i < throughForeignKeys.length; i++) {\n selectAs[throughForeignKeys[i]] = new RawSql('');\n }\n\n const joinRows = _querySelect(_clone(relQuery.baseQuery), [\n selectAs as never,\n ]);\n const joinQuery = _queryInsertForEachFrom(\n _clone(joinTableQuery) as unknown as CreateSelf,\n joinRows,\n ) as unknown as Query;\n joinQuery.q.returnType = 'void';\n\n return {\n joinQuery,\n setJoinRowsFrom: (as: string) => {\n joinRows.q.from = as;\n joinRows.q.schema = undefined;\n for (let i = 0; i < throughForeignKeys.length; i++) {\n (selectAs[throughForeignKeys[i]] as RawSql)._sql =\n `\"${as}\".\"${throughPrimaryKeys[i]}\"`;\n }\n },\n };\n };\n\n const updateQuery = _querySelect(\n _queryUpdate(\n _clone(relQuery).where(\n value.findBy as never,\n ) as unknown as UpdateSelf,\n value.update as never,\n ) as never,\n throughPrimaryKeys as never,\n ) as unknown as Query;\n if (upsertWhereExists) {\n // Prevent the child update when the parent upsert update branch wins.\n _queryWhere(updateQuery, [upsertWhereExists] as never);\n }\n const updateJoin = makeJoinQuery();\n const updateQueryWithJoin = _appendQuery(\n updateQuery,\n updateJoin.joinQuery,\n updateJoin.setJoinRowsFrom,\n );\n\n let query = updateQueryWithJoin;\n if (value.create) {\n const createWhereNotExists = new RawSql('');\n const createSource = _queryWhere(\n _queryTake(_querySelect(_clone(relQuery.qb), [{}])),\n [createWhereNotExists, upsertWhereExists].filter(\n Boolean,\n ) as never,\n );\n const create =\n typeof value.create === 'function'\n ? value.create()\n : value.create;\n const createQuery = _queryInsertManyFrom(\n _querySelect(\n _clone(relQuery),\n throughPrimaryKeys as never,\n ) as unknown as CreateSelf,\n createSource as never,\n [create] as never,\n ) as unknown as Query;\n const createJoin = makeJoinQuery();\n const createQueryWithJoin = _appendQuery(\n createQuery,\n createJoin.joinQuery,\n createJoin.setJoinRowsFrom,\n );\n\n query = _appendQuery(\n updateQueryWithJoin,\n createQueryWithJoin,\n (as) => {\n createWhereNotExists._sql = `NOT EXISTS (SELECT 1 FROM \"${as}\")`;\n },\n );\n }\n\n const appendQuery =\n querySelf.q.type === 'upsert'\n ? _appendQueryOnUpsertCreate\n : _appendQuery;\n appendQuery(querySelf, query, (as) => {\n setMainAs(as);\n if (upsertWhereExists) {\n // The insert source must also be empty when no parent was created.\n upsertWhereExists._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n }\n });\n }\n }\n }\n } else {\n hasRelationHandleCreate(\n querySelf,\n ctx,\n items,\n rowIndexes,\n key,\n state.primaryKeys,\n nestedInsertFn,\n );\n }\n};\n\nexport const 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 for (let index = 0; index < data.length; index++) {\n const item = data[index][1] as NestedInsertManyItems;\n if (!item.upsert) continue;\n\n const upserted = await Promise.all(\n toArray(item.upsert).map((upsert) =>\n _querySelect(\n _queryUpsert(t.clone().where(upsert.findBy as never) as never, {\n update: upsert.update,\n create: upsert.create || {},\n }),\n throughPrimaryKeys as never,\n ),\n ),\n );\n allKeys[index][1] = upserted.map((record) =>\n Array.isArray(record) ? record[0] : record,\n ) as 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 as Query.NotReadOnlyQuery).insertMany(records);\n }) as HasManyNestedInsert;\n};\n","import { OrchidOrmInternalError, Query } from 'pqb';\nimport {\n _queryDelete,\n _queryHookAfterCreate,\n _queryHookAfterUpdate,\n _queryInsertForEachFrom,\n _queryInsertMany,\n _queryJoinOn,\n _querySelect,\n _queryUpdate,\n _queryUpsert,\n _onUpsertUpdate,\n _queryWhere,\n _queryWhereExists,\n _queryWhereIn,\n _appendQuery,\n _appendQueryOnUpsertCreate,\n _clone,\n _hookSelectColumns,\n CreateSelf,\n objectHasValues,\n RawSql,\n RecordUnknown,\n MaybeArray,\n toArray,\n UpdateSelf,\n WhereArg,\n} from 'pqb/internal';\nimport {\n makeRawSqlPlaceholders,\n NestedUpdateManyAdd,\n NestedUpdateManyCreate,\n NestedUpdateManyDelete,\n NestedUpdateManyDisconnect,\n NestedUpdateManySet,\n NestedUpdateManyUpdate,\n NestedUpdateManyUpsert,\n selectCteColumnSql,\n selectCteColumnsSql,\n} from '../common/utils';\nimport { State } from './has-and-belongs-to-many';\n\nexport const nestedUpdateUpsert = (\n querySelf: Query,\n state: State,\n upsert: MaybeArray<NestedUpdateManyUpsert>,\n onAppended?: (as: string, index: number) => void,\n updateFrom?: RawSql,\n sourceCondition?: RawSql,\n disconnect?: NestedUpdateManyDisconnect,\n set?: NestedUpdateManySet,\n) => {\n for (const [index, item] of toArray(upsert).entries()) {\n nestedUpdateUpsertOne(\n querySelf,\n state,\n item,\n (as) => onAppended?.(as, index),\n updateFrom,\n sourceCondition,\n disconnect,\n set,\n );\n }\n};\n\nconst nestedUpdateUpsertOne = (\n querySelf: Query,\n state: State,\n upsert: NestedUpdateManyUpsert,\n onAppended?: (as: string) => void,\n updateFrom?: RawSql,\n sourceCondition?: RawSql,\n disconnect?: NestedUpdateManyDisconnect,\n set?: NestedUpdateManySet,\n) => {\n const parentIdsSql = new RawSql('');\n const parentValues = makeRawSqlPlaceholders(state.foreignKeys.length);\n const relatedIdsSql = new RawSql('');\n const relatedValues = makeRawSqlPlaceholders(state.throughPrimaryKeys.length);\n\n let parentAs: string | undefined;\n _hookSelectColumns(querySelf, state.primaryKeys, (aliasedPrimaryKeys) => {\n parentIdsSql._sql = selectCteColumnsSql(\n parentAs as string,\n aliasedPrimaryKeys,\n );\n\n for (let i = 0; i < state.foreignKeys.length; i++) {\n parentValues[i]._sql = selectCteColumnSql(\n parentAs as string,\n aliasedPrimaryKeys[i],\n );\n }\n });\n\n let existingRelQuery = _queryWhere(_clone(state.relatedTableQuery), [\n upsert.findBy as unknown as WhereArg<Query>,\n ]);\n if (disconnect) {\n existingRelQuery = existingRelQuery.whereNot({\n OR: toArray(disconnect),\n });\n }\n existingRelQuery = _queryWhereExists(existingRelQuery, state.joinTableQuery, [\n (q) => {\n for (let i = 0; i < state.throughPrimaryKeys.length; i++) {\n _queryJoinOn(q, [\n state.throughForeignKeysFull[i],\n state.throughPrimaryKeysFull[i],\n ]);\n }\n\n return _queryWhereIn(q, true, state.foreignKeysFull, parentIdsSql);\n },\n ]);\n if (sourceCondition) {\n existingRelQuery.q.updateFrom = { u: true, x: updateFrom as RawSql };\n const conditions = existingRelQuery.q.and as unknown[];\n const existingRelationCondition = conditions.pop();\n const relationCondition = set\n ? sourceCondition\n : { OR: [existingRelationCondition, sourceCondition] };\n conditions.push(relationCondition);\n }\n\n const upsertQuery = _querySelect(\n _queryUpsert(existingRelQuery, {\n update: upsert.update,\n create: upsert.create || {},\n }),\n state.throughPrimaryKeys,\n ) as unknown as Query;\n\n upsertQuery.q.returnType = 'void';\n _onUpsertUpdate(upsertQuery, (as) => onAppended?.(as));\n if (onAppended) {\n upsertQuery.q.upsertCreateAsFns = [\n ...(upsertQuery.q.upsertCreateAsFns || []),\n onAppended,\n ];\n }\n\n const selectAs: RecordUnknown = {};\n for (let i = 0; i < state.foreignKeys.length; i++) {\n selectAs[state.foreignKeys[i]] = parentValues[i];\n }\n for (let i = 0; i < state.throughForeignKeys.length; i++) {\n selectAs[state.throughForeignKeys[i]] = relatedValues[i];\n }\n\n const joinRows = _querySelect(_clone(state.queryBuilder), [\n selectAs as never,\n ]) as Query;\n _queryWhere(joinRows, [relatedIdsSql] as never);\n\n const joinQuery = (\n state.joinTableQuery as Query.NotReadOnlyQuery\n ).insertForEachFrom(joinRows as never) as Query;\n\n joinQuery.q.returnType = 'void';\n\n _appendQuery(\n querySelf,\n _appendQueryOnUpsertCreate(upsertQuery, joinQuery, (as) => {\n onAppended?.(as);\n relatedIdsSql._sql = `EXISTS (SELECT 1 FROM \"${as}\")`;\n for (let i = 0; i < relatedValues.length; i++) {\n relatedValues[i]._sql = selectCteColumnSql(\n as,\n state.throughPrimaryKeys[i],\n );\n }\n }),\n (as) => {\n parentAs = as;\n },\n );\n};\n\nexport const nestedUpdateAdd = (\n querySelf: Query,\n state: State,\n add: NestedUpdateManyAdd,\n onAppended?: (as: string) => void,\n) => {\n const relatedWheres = toArray(add);\n const joinTableColumns = [...state.foreignKeys, ...state.throughForeignKeys];\n const parentValues = makeRawSqlPlaceholders(state.foreignKeys.length);\n const mainQuery = _clone(state.queryBuilder);\n const isRootUpsert = querySelf.q.upsertUpdate;\n let parentCount = 0;\n\n if (!isRootUpsert) {\n _queryHookAfterUpdate(querySelf, state.primaryKeys, (rows) => {\n parentCount = rows.length;\n });\n }\n\n _hookSelectColumns(querySelf, state.primaryKeys, (aliased) => {\n for (let i = 0; i < parentValues.length; i++) {\n parentValues[i]._sql = `\"${mainQuery.q.from}\".\"${aliased[i]}\"`;\n }\n });\n\n const joinRows = _querySelect(\n state.relatedTableQuery.whereOneOf(...relatedWheres) as Query,\n [\n Object.fromEntries([\n ...state.foreignKeys.map((key, i) => [key, parentValues[i]]),\n ...state.throughForeignKeys.map((key, i) => [\n key,\n state.throughPrimaryKeys[i],\n ]),\n ]),\n ],\n ).join(mainQuery as never, true) as Query;\n\n const joinQuery = (state.joinTableQuery as Query.NotReadOnlyQuery)\n .insertForEachFrom(joinRows as never)\n // do update on conflict to increase the resulting counter\n .onConflict(joinTableColumns)\n .merge([state.foreignKeys[0]]);\n\n if (onAppended) {\n _querySelect(joinQuery, state.throughForeignKeys as never);\n } else {\n joinQuery.q.returnType = 'void';\n }\n\n if (!isRootUpsert) {\n joinQuery.q.ensureCount = {\n expected: relatedWheres.length,\n message: 'based on `add` conditions',\n };\n\n _queryHookAfterCreate(joinQuery, state.foreignKeys, (rows) => {\n if (rows.length < parentCount * relatedWheres.length) {\n throw new OrchidOrmInternalError(\n querySelf,\n `Expected to find at least ${\n relatedWheres.length\n } record(s) based on \\`add\\` conditions, but found ${\n rows.length / parentCount\n }`,\n );\n }\n });\n }\n\n _appendQuery(\n querySelf,\n joinQuery,\n (as) => {\n mainQuery.q.from = as;\n mainQuery.q.schema = undefined;\n mainQuery.q.as = undefined;\n },\n onAppended,\n );\n};\n\nexport const nestedUpdateDisconnect = (\n querySelf: Query,\n state: State,\n disconnect: NestedUpdateManyDisconnect,\n) => {\n const relatedWheres = toArray(disconnect);\n const joinTableColumns = [...state.foreignKeys, ...state.throughForeignKeys];\n const parentValues = makeRawSqlPlaceholders(state.foreignKeys.length);\n const mainQuery = _clone(state.queryBuilder);\n\n _hookSelectColumns(querySelf, state.primaryKeys, (aliased) => {\n for (let i = 0; i < parentValues.length; i++) {\n parentValues[i]._sql = `\"${mainQuery.q.from}\".\"${aliased[i]}\"`;\n }\n });\n\n const joinRows = _querySelect(\n state.relatedTableQuery.whereOneOf(...relatedWheres) as Query,\n [\n Object.fromEntries([\n ...state.foreignKeys.map((key, i) => [key, parentValues[i]]),\n ...state.throughForeignKeys.map((key, i) => [\n key,\n state.throughPrimaryKeys[i],\n ]),\n ]),\n ],\n ).join(mainQuery as never, true) as Query;\n\n const joinQuery = _queryDelete(\n state.joinTableQuery.where({\n IN: {\n columns: joinTableColumns,\n values: joinRows,\n },\n }),\n );\n\n joinQuery.q.returnType = 'void';\n\n _appendQuery(querySelf, joinQuery, (as) => {\n mainQuery.q.from = as;\n mainQuery.q.schema = undefined;\n mainQuery.q.as = undefined;\n });\n};\n\nexport const nestedUpdateDelete = (\n querySelf: Query,\n state: State,\n del: NestedUpdateManyDelete,\n) => {\n const relatedWheres = toArray(del);\n const parentValues = makeRawSqlPlaceholders(state.foreignKeys.length);\n const relatedValues = makeRawSqlPlaceholders(state.throughForeignKeys.length);\n const parentIdsSql = new RawSql('');\n const mainQuery = _clone(state.queryBuilder);\n const relatedRows = _querySelect(_clone(state.queryBuilder), [\n Object.fromEntries([\n ...state.foreignKeys.map((key, i) => [key, parentValues[i]]),\n ...state.throughForeignKeys.map((key, i) => [key, relatedValues[i]]),\n ]),\n ]).join(mainQuery as never, true) as Query;\n\n _hookSelectColumns(querySelf, state.primaryKeys, (aliased) => {\n parentIdsSql._sql = selectCteColumnsSql(\n mainQuery.q.from as string,\n aliased,\n );\n\n for (let i = 0; i < parentValues.length; i++) {\n parentValues[i]._sql = `\"${mainQuery.q.from}\".\"${aliased[i]}\"`;\n }\n });\n\n const relatedQuery = _queryWhereExists(\n state.relatedTableQuery.whereOneOf(...relatedWheres) as Query,\n state.joinTableQuery,\n [\n (q) => {\n for (let i = 0; i < state.throughPrimaryKeys.length; i++) {\n _queryJoinOn(q, [\n state.throughForeignKeysFull[i],\n state.throughPrimaryKeysFull[i],\n ]);\n }\n\n return _queryWhereIn(q, true, state.foreignKeysFull, parentIdsSql);\n },\n ],\n );\n\n const relatedDeleteQuery = _queryDelete(\n _querySelect(relatedQuery, state.throughPrimaryKeys),\n ) as unknown as Query;\n\n relatedDeleteQuery.q.returnType = 'void';\n\n const joinQuery = _queryDelete(\n state.joinTableQuery.where({\n IN: {\n columns: [...state.foreignKeys, ...state.throughForeignKeys],\n values: relatedRows,\n },\n }),\n );\n\n joinQuery.q.returnType = 'void';\n\n _appendQuery(\n querySelf,\n relatedDeleteQuery,\n () => {},\n (as) => {\n relatedRows.q.from = as;\n relatedRows.q.schema = undefined;\n relatedRows.q.as = undefined;\n\n for (let i = 0; i < relatedValues.length; i++) {\n relatedValues[i]._sql = `\"${as}\".\"${state.throughPrimaryKeys[i]}\"`;\n }\n },\n );\n\n _appendQuery(querySelf, joinQuery, (as) => {\n mainQuery.q.from = as;\n mainQuery.q.schema = undefined;\n mainQuery.q.as = undefined;\n });\n};\n\nexport const nestedUpdateUpdate = (\n querySelf: Query,\n state: State,\n update: NestedUpdateManyUpdate,\n updateFrom?: RawSql,\n sourceCondition?: RawSql,\n disconnect?: NestedUpdateManyDisconnect,\n set?: NestedUpdateManySet,\n) => {\n const parentIdsSql = new RawSql('');\n const mainQuery = _clone(state.queryBuilder);\n const isRootUpsert = querySelf.q.upsertUpdate;\n\n _hookSelectColumns(querySelf, state.primaryKeys, (aliased) => {\n parentIdsSql._sql = selectCteColumnsSql(\n mainQuery.q.from as string,\n aliased,\n );\n });\n\n for (const item of toArray(update)) {\n for (const relatedWhere of toArray(item.where)) {\n let relatedQuery = _queryWhere(_clone(state.relatedTableQuery), [\n relatedWhere,\n ]) as Query;\n\n if (disconnect) {\n relatedQuery = relatedQuery.whereNot({\n OR: toArray(disconnect),\n });\n }\n\n if (sourceCondition) {\n relatedQuery.q.updateFrom = { u: true, x: updateFrom as RawSql };\n relatedQuery = (relatedQuery as Query.NotReadOnlyQuery).whereSql(\n sourceCondition,\n ) as Query;\n } else {\n relatedQuery = _queryWhereExists(relatedQuery, state.joinTableQuery, [\n (q) => {\n for (let i = 0; i < state.throughPrimaryKeys.length; i++) {\n _queryJoinOn(q, [\n state.throughForeignKeysFull[i],\n state.throughPrimaryKeysFull[i],\n ]);\n }\n\n return _queryWhereIn(q, true, state.foreignKeysFull, parentIdsSql);\n },\n ]);\n }\n\n const relatedUpdateQuery = _queryUpdate(\n relatedQuery as unknown as UpdateSelf,\n item.data as never,\n ) as unknown as Query;\n\n relatedUpdateQuery.q.returnType = 'void';\n\n if (!isRootUpsert && !disconnect && !set) {\n relatedUpdateQuery.q.ensureCount = { expected: 1 };\n }\n\n _appendQuery(querySelf, relatedUpdateQuery, (as) => {\n mainQuery.q.from = as;\n mainQuery.q.schema = undefined;\n mainQuery.q.as = undefined;\n });\n }\n }\n};\n\nexport const nestedUpdateCreate = (\n querySelf: Query,\n state: State,\n create: NestedUpdateManyCreate,\n) => {\n const mainQuery = _clone(state.queryBuilder);\n const parentValues = makeRawSqlPlaceholders(state.foreignKeys.length);\n const relatedValues = makeRawSqlPlaceholders(state.throughForeignKeys.length);\n\n _hookSelectColumns(querySelf, state.primaryKeys, (aliased) => {\n for (let i = 0; i < parentValues.length; i++) {\n parentValues[i]._sql = `\"${mainQuery.q.from}\".\"${aliased[i]}\"`;\n }\n });\n\n const joinRows = _querySelect(_clone(state.relatedTableQuery.baseQuery), [\n Object.fromEntries([\n ...state.foreignKeys.map((key, i) => [key, parentValues[i]]),\n ...state.throughForeignKeys.map((key, i) => [key, relatedValues[i]]),\n ]),\n ]).join(mainQuery as never, true) as Query;\n\n const joinQuery = _queryInsertForEachFrom(\n _clone(state.joinTableQuery) as unknown as CreateSelf,\n joinRows,\n ) as unknown as Query;\n joinQuery.q.returnType = 'void';\n\n const relatedCreateQuery = _queryInsertMany(\n _querySelect(\n _clone(state.relatedTableQuery),\n state.throughPrimaryKeys as never,\n ) as unknown as CreateSelf,\n create as never,\n ) as unknown as Query;\n\n relatedCreateQuery.q.returnType = 'void';\n\n _appendQuery(\n querySelf,\n relatedCreateQuery,\n (as) => {\n mainQuery.q.from = as;\n mainQuery.q.schema = undefined;\n mainQuery.q.as = undefined;\n },\n (as) => {\n joinRows.q.from = as;\n joinRows.q.schema = undefined;\n joinRows.q.as = undefined;\n\n for (let i = 0; i < relatedValues.length; i++) {\n relatedValues[i]._sql = `\"${as}\".\"${state.throughPrimaryKeys[i]}\"`;\n }\n },\n );\n\n _appendQuery(querySelf, joinQuery, () => {});\n};\n\nexport const nestedUpdateSet = (\n querySelf: Query,\n state: State,\n set: NestedUpdateManySet,\n onAppended?: (as: string) => void,\n) => {\n const mainQuery = _clone(state.queryBuilder);\n const parentIdsSql = new RawSql('');\n const parentValues = makeRawSqlPlaceholders(state.foreignKeys.length);\n\n _hookSelectColumns(querySelf, state.primaryKeys, (aliased) => {\n parentIdsSql._sql = selectCteColumnsSql(\n mainQuery.q.from as string,\n aliased,\n );\n\n for (let i = 0; i < parentValues.length; i++) {\n parentValues[i]._sql = `\"${mainQuery.q.from}\".\"${aliased[i]}\"`;\n }\n });\n\n const deleteQuery = _queryDelete(\n state.joinTableQuery.where({\n IN: {\n columns: state.foreignKeys,\n values: parentIdsSql,\n },\n }),\n );\n\n deleteQuery.q.returnType = 'void';\n\n if (state.on) {\n _queryWhereExists(deleteQuery, 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 _appendQuery(querySelf, deleteQuery, (as) => {\n mainQuery.q.from = as;\n mainQuery.q.schema = undefined;\n mainQuery.q.as = undefined;\n });\n\n const isEmpty = Array.isArray(set) ? set.length === 0 : !objectHasValues(set);\n if (isEmpty) return;\n\n const relatedWheres = toArray(set);\n const joinTableColumns = [...state.foreignKeys, ...state.throughForeignKeys];\n const isRootUpsert = querySelf.q.upsertUpdate;\n let parentCount = 0;\n\n if (!isRootUpsert) {\n _queryHookAfterUpdate(querySelf, state.primaryKeys, (rows) => {\n parentCount = rows.length;\n });\n }\n\n const joinRows = _querySelect(\n state.relatedTableQuery.whereOneOf(...relatedWheres) as Query,\n [\n Object.fromEntries([\n ...state.foreignKeys.map((key, i) => [key, parentValues[i]]),\n ...state.throughForeignKeys.map((key, i) => [\n key,\n state.throughPrimaryKeys[i],\n ]),\n ]),\n ],\n ).join(mainQuery as never, true) as Query;\n\n const joinQuery = (state.joinTableQuery as Query.NotReadOnlyQuery)\n .insertForEachFrom(joinRows as never)\n .onConflict(joinTableColumns)\n .merge([state.foreignKeys[0]]);\n\n if (onAppended) {\n _querySelect(joinQuery, state.throughForeignKeys as never);\n } else {\n joinQuery.q.returnType = 'void';\n }\n\n if (!isRootUpsert) {\n joinQuery.q.ensureCount = {\n expected: relatedWheres.length,\n message: 'based on `set` conditions',\n };\n\n _queryHookAfterCreate(joinQuery, state.foreignKeys, (rows) => {\n if (rows.length < parentCount * relatedWheres.length) {\n throw new OrchidOrmInternalError(\n querySelf,\n `Expected to find at least ${\n relatedWheres.length\n } record(s) based on \\`set\\` conditions, but found ${\n rows.length / parentCount\n }`,\n );\n }\n });\n }\n\n _appendQuery(querySelf, joinQuery, () => {}, onAppended);\n};\n","import {\n RelationConfigSelf,\n RelationData,\n RelationThunkBase,\n} from '../relations';\nimport { NotFoundError, Query } from 'pqb';\nimport { ORMTableInput } from '../../orm-table/legacy-table';\nimport {\n _queryCreateManyFrom,\n _queryDefaults,\n _queryHookAfterCreate,\n _queryJoinOn,\n _queryWhere,\n _queryWhereExists,\n CreateCtx,\n CreateData,\n getQueryAs,\n JoinedShapes,\n SelectableFromShape,\n TableData,\n UpdateData,\n VirtualColumn,\n WhereArg,\n ColumnSchemaConfig,\n ColumnsShape,\n getPrimaryKeys,\n MaybeArray,\n RecordString,\n RecordUnknown,\n RelationConfigBase,\n RelationJoinQuery,\n toSnakeCase,\n Column,\n CreateSelf,\n toArray,\n RawSql,\n QueryHasWhere,\n QuerySchema,\n internalSchemaConfig,\n UpdateSelf,\n} from 'pqb/internal';\nimport {\n addAutoForeignKey,\n NestedUpdateManyItems,\n NestedUpdateManyUpdate,\n throwIfQueryReturnsAllForNestedUpdate,\n} from '../common/utils';\nimport { HasManyNestedInsert } from '../has-many/has-many.create';\nimport { joinQueryChainHOF } from '../common/joinQueryChain';\nimport {\n hasAndBelongsToManyCreate,\n nestedInsert,\n} from './has-and-belongs-to-many.create';\nimport {\n nestedUpdateAdd,\n nestedUpdateCreate,\n nestedUpdateDelete,\n nestedUpdateDisconnect,\n nestedUpdateSet,\n nestedUpdateUpdate,\n nestedUpdateUpsert,\n} from './has-and-belongs-to-many.update';\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 ORMTableInput = ORMTableInput,\n> {\n required?: boolean;\n columns: (keyof Columns)[];\n references: string[];\n foreignKey?: boolean | TableData.References.Options;\n through: {\n schema?: QuerySchema;\n table: string;\n snakeCase?: boolean;\n columns: string[];\n references: (keyof Related['columns']['shape'])[];\n foreignKey?: boolean | TableData.References.Options;\n };\n on?: ColumnsShape.InputPartial<Related['columns']['shape']>;\n}\n\nexport type HasAndBelongsToManyParams<\n T extends RelationConfigSelf,\n FK extends string,\n> = {\n [Name in FK]: 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 '__selectable'\n ? SelectableFromShape<TableQuery['shape'], Name>\n : K extends '__as'\n ? Name\n : TableQuery[K];\n} & QueryHasWhere;\n\nexport interface HasAndBelongsToManyInfo<\n T extends RelationConfigSelf,\n Name extends string,\n FK extends string,\n Q extends Query,\n> extends RelationConfigBase {\n returnsOne: false;\n query: Q;\n params: HasAndBelongsToManyParams<T, FK>;\n omitForeignKeyInCreate: never;\n dataForCreate: {\n [K in Name]?: Q extends Query.Pick.IsNotReadOnly\n ? {\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 upsert?: MaybeArray<{\n findBy: Q['internal']['uniqueColumns'];\n update: UpdateData<Q>;\n create?: CreateData<Q> | (() => CreateData<Q>);\n }>;\n }\n : {\n // find existing records by `where` conditions and update their foreign keys with the new id\n connect?: WhereArg<Q>[];\n };\n };\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: Q extends Query.Pick.IsNotReadOnly\n ? {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: MaybeArray<{\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n }>;\n create?: CreateData<Q>[];\n }\n : {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n };\n dataForUpdateOne: Q extends Query.Pick.IsNotReadOnly\n ? {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n delete?: MaybeArray<WhereArg<Q>>;\n update?: MaybeArray<{\n where: MaybeArray<WhereArg<Q>>;\n data: UpdateData<Q>;\n }>;\n create?: CreateData<Q>[];\n upsert?: MaybeArray<{\n findBy: Q['internal']['uniqueColumns'];\n update: UpdateData<Q>;\n create?: CreateData<Q> | (() => CreateData<Q>);\n }>;\n }\n : {\n disconnect?: MaybeArray<WhereArg<Q>>;\n set?: MaybeArray<WhereArg<Q>>;\n add?: MaybeArray<WhereArg<Q>>;\n };\n}\n\nexport interface State {\n queryBuilder: Query.NotReadOnlyQuery;\n relatedTableQuery: Query.NotReadOnlyQuery;\n joinTableQuery: Query.NotReadOnlyQuery;\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\ninterface QueryReturnsOne extends Query {\n returnType: 'one' | 'oneOrThrow';\n}\n\nclass HasAndBelongsToManyVirtualColumn extends VirtualColumn<ColumnSchemaConfig> {\n private readonly nestedInsert: HasManyNestedInsert;\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 }\n\n create(\n self: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n ) {\n hasAndBelongsToManyCreate(\n this.key,\n this.state,\n this.nestedInsert,\n self,\n ctx,\n items,\n rowIndexes,\n count,\n );\n }\n\n update(q: UpdateSelf, set: RecordUnknown) {\n const querySelf = q as unknown as Query;\n const params = set[this.key] as NestedUpdateManyItems;\n const hasUpdate =\n !!params.update &&\n toArray(params.update).some(\n (update) => !Array.isArray(update.where) || update.where.length,\n );\n const hasAdd =\n params.add && (!Array.isArray(params.add) || params.add.length > 0);\n const addedAs = hasUpdate && hasAdd ? new RawSql('') : undefined;\n const setAs = hasUpdate && params.set ? new RawSql('') : undefined;\n const sourceCondition = addedAs || setAs ? new RawSql('') : undefined;\n const updateFrom = sourceCondition ? new RawSql('') : undefined;\n\n const setSourceCondition = () => {\n if (!sourceCondition) return;\n\n const relatedAs =\n this.state.relatedTableQuery.q.as || this.state.relatedTableQuery.table;\n const joinCondition = (as: string) =>\n this.state.throughPrimaryKeys\n .map(\n (key, i) =>\n `\"${relatedAs}\".\"${(this.state.relatedTableQuery.shape as ColumnsShape)[key].data.name || key}\" = ${as}.\"${this.state.throughForeignKeys[i]}\"`,\n )\n .join(' AND ');\n const sourceAs = '\"relatedIds\"';\n sourceCondition._sql = joinCondition(sourceAs);\n const columns = this.state.throughForeignKeys;\n const sourceColumns = columns.map((key) => `\"${key}\"`).join(', ');\n updateFrom!._sql = `(${[addedAs, setAs]\n .filter((as): as is RawSql => !!as && !!as._sql)\n .map((as) => `SELECT ${sourceColumns} FROM ${as._sql}`)\n .concat()\n .join(' UNION ALL ')}) AS ${sourceAs}`;\n };\n\n if (params.add) {\n nestedUpdateAdd(querySelf, this.state, params.add, (as) => {\n if (addedAs) {\n addedAs._sql = `\"${as}\"`;\n setSourceCondition();\n }\n });\n set[this.key] = { ...params, add: undefined };\n }\n\n if (params.create?.length) {\n nestedUpdateCreate(querySelf, this.state, params.create);\n set[this.key] = { ...params, create: undefined };\n }\n\n if (\n params.disconnect &&\n (!Array.isArray(params.disconnect) || params.disconnect.length > 0)\n ) {\n nestedUpdateDisconnect(querySelf, this.state, params.disconnect);\n set[this.key] = { ...params, disconnect: undefined };\n }\n\n if (\n params.delete &&\n (!Array.isArray(params.delete) || params.delete.length)\n ) {\n nestedUpdateDelete(querySelf, this.state, params.delete);\n set[this.key] = { ...params, delete: undefined };\n }\n\n if (params.set) {\n nestedUpdateSet(querySelf, this.state, params.set, (as) => {\n if (setAs) {\n setAs._sql = `\"${as}\"`;\n setSourceCondition();\n }\n });\n set[this.key] = { ...params, set: undefined };\n }\n\n if (\n !!params.upsert &&\n (!Array.isArray(params.upsert) || params.upsert.length > 0)\n ) {\n throwIfQueryReturnsAllForNestedUpdate(querySelf, {\n upsert: params.upsert,\n });\n nestedUpdateUpsert(\n querySelf,\n this.state,\n params.upsert,\n undefined,\n hasAdd || params.set ? updateFrom : undefined,\n hasAdd || params.set ? sourceCondition : undefined,\n params.disconnect,\n params.set,\n );\n }\n\n if (hasUpdate) {\n nestedUpdateUpdate(\n querySelf,\n this.state,\n params.update as NestedUpdateManyUpdate,\n updateFrom,\n sourceCondition,\n params.disconnect,\n params.set,\n );\n set[this.key] = { ...params, update: undefined };\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 schema?: QuerySchema,\n): RelationData => {\n const { options } = relation;\n const { snakeCase } = table.internal;\n const primaryKeys = options.columns as string[];\n const originalForeignKeys = options.references;\n const foreignKeys = snakeCase\n ? [...originalForeignKeys]\n : originalForeignKeys;\n const joinTableSnakeCase = snakeCase && options.through.snakeCase !== false;\n const joinTable = joinTableSnakeCase\n ? toSnakeCase(options.through.table)\n : options.through.table;\n const originalThroughForeignKeys = options.through.columns;\n const throughForeignKeys = snakeCase\n ? [...originalThroughForeignKeys]\n : originalThroughForeignKeys;\n const throughPrimaryKeys = options.through.references as string[];\n const { on } = options;\n\n if (on) {\n _queryWhere(query, [on]);\n _queryDefaults(query as unknown as CreateSelf, 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 schema: options.through.schema || schema,\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 queryBuilder: qb as Query.NotReadOnlyQuery,\n relatedTableQuery: query as Query.NotReadOnlyQuery,\n joinTableQuery: subQuery as Query.NotReadOnlyQuery,\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.selectShape,\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\n ? (_queryDefaults(q as unknown as CreateSelf, on) as unknown as Query)\n : q;\n },\n virtualColumn: new HasAndBelongsToManyVirtualColumn(\n subQuery,\n internalSchemaConfig,\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 .selectShape,\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() as unknown as CreateSelf,\n baseQuery as QueryReturnsOne,\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","import {\n BelongsTo,\n BelongsToParams,\n getBelongsToRequired,\n makeBelongsToMethod,\n} from './belongs-to/belongs-to';\nimport { HasOne, HasOneParams, makeHasOneMethod } from './has-one/has-one';\nimport {\n TableQueryBuilder,\n ORMTableInput,\n TableClass,\n TableInfo,\n} from '../orm-table/legacy-table';\nimport {\n _queryTake,\n _queryTakeOptional,\n CreateData,\n VirtualColumn,\n WhereArg,\n ColumnSchemaConfig,\n RecordUnknown,\n RelationJoinQuery,\n RelationsBase,\n Column,\n QuerySchema,\n CreateSelf,\n PickQuerySelectableRelations,\n RelationConfigBase,\n} from 'pqb/internal';\nimport { HasMany, makeHasManyMethod } from './has-many/has-many';\nimport {\n HasAndBelongsToMany,\n HasAndBelongsToManyParams,\n makeHasAndBelongsToManyMethod,\n} from './has-and-belongs-to-many/has-and-belongs-to-many';\nimport { getSourceRelation, getThroughRelation } from './common/utils';\nimport { Query } from 'pqb';\nimport { OrmTableThunks, TableInstance } from '../orm';\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\n// - `upsert` to update an existing related record, or create one when missing\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 upsert?: never;\n }\n | {\n create?: never;\n connect?: never;\n connectOrCreate: {\n where: WhereArg<Rel['table']>;\n create: Rel['nestedCreateQuery'];\n };\n };\n\ninterface RelationToOneDataForCreateSameQuerySelf\n extends CreateSelf, PickQuerySelectableRelations {}\n\nexport type RelationToOneDataForCreateSameQuery<\n Q extends RelationToOneDataForCreateSameQuerySelf,\n> =\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 id: string;\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?: RelationConfigBase['modifyRelatedQuery'];\n}\n\ntype TableInstances<T extends OrmTableThunks> = {\n [K in keyof T]: TableInstance<T[K]>;\n};\n\ntype TableClassInstances<T extends OrmTableThunks> = TableInstances<T>[keyof T];\n\ntype RelationToTableInputById<Tables, Id extends string> = Tables extends {\n id: Id;\n}\n ? Tables\n : never;\n\ntype RelationToTableInputByName<T extends OrmTableThunks, Id extends string> = {\n [K in keyof TableInstances<T>]: TableInstances<T>[K] extends\n | { table: Id }\n | { name: Id }\n ? TableInstances<T>[K]\n : never;\n}[keyof T];\n\ntype RelationToTableInputFromClasses<\n T extends OrmTableThunks,\n Id extends string,\n> =\n RelationToTableInputById<TableClassInstances<T>, Id> extends infer Result\n ? [Result] extends [never]\n ? RelationToTableInputByName<T, Id>\n : Result\n : never;\n\nexport type RelationToTableInput<\n TT extends OrmTableThunks,\n VT extends OrmTableThunks,\n Rel extends RelationThunkBase,\n> =\n RelationToTableInputFromClasses<TT, Rel['id']> extends infer Result\n ? [Result] extends [never]\n ? RelationToTableInputFromClasses<VT, Rel['id']> extends infer Result\n ? [Result] extends [never]\n ? false\n : Result\n : never\n : Result\n : never;\n\nexport type RelationTableToQuery<\n TT extends OrmTableThunks,\n VT extends OrmTableThunks,\n Rel extends RelationThunkBase,\n> =\n RelationToTableInput<TT, VT, Rel> extends infer Result extends ORMTableInput\n ? TableQueryBuilder<TT, VT, Result>\n : never;\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['options']['columns'][number] & string>\n : Relation extends HasOne | HasMany\n ? HasOneParams<T, Relation['options']>\n : Relation extends HasAndBelongsToMany\n ? HasAndBelongsToManyParams<\n T,\n Relation['options']['columns'][number] & string\n >\n : never;\n\ninterface ApplyRelationData {\n relationName: string;\n relation: RelationThunk;\n otherTable: ORMTableInput;\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: { [K: string]: Query },\n schema?: QuerySchema,\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 = (\n relation as unknown as { fn?: () => TableClass }\n ).fn?.();\n const otherTable = otherTableClass\n ? tableEntries.find((pair) => pair[1] instanceof otherTableClass)\n : // two-pass lookup: prefer id match over name match to avoid\n // ambiguity when multiple views share the same database name\n tableEntries.find(([, table]) => {\n const { id } = relation as never;\n return table.id === id || table.table === id;\n }) ||\n tableEntries.find(([, table]) => {\n const { id } = relation as never;\n return table.name === id;\n });\n if (!otherTable) {\n throw new Error(\n otherTableClass\n ? `Cannot find table class for class ${otherTableClass.name}`\n : `Cannot find table for relation target ${\n (relation as unknown as { id?: string }).id\n }`,\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 otherTable: otherTable[1],\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, schema);\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 {\n relationName,\n relation,\n otherTable,\n dbTable,\n otherDbTable,\n }: ApplyRelationData,\n delayedRelations: DelayedRelations,\n schema?: QuerySchema,\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 schema,\n );\n } else {\n throw new Error(`Unknown relation type ${type}`);\n }\n\n if (data.returns === 'one') {\n const required =\n type === 'belongsTo'\n ? getBelongsToRequired(table, otherTable, relation)\n : relation.options.required;\n\n if (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.selectShape[relationName] =\n data.virtualColumn;\n }\n\n baseQuery.joinQuery = data.joinQuery;\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, schema);\n });\n};\n","import {\n IsolationLevel,\n TransactionOptions,\n AfterCommitStandaloneHook,\n} from 'pqb/internal';\nimport { Db } 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 Column,\n FromArg,\n FromResult,\n QueryLogOptions,\n StorageOptions,\n Adapter,\n AsyncState,\n defaultSchemaConfig,\n DbSharedOptions,\n DbTableOptionScopes,\n DbTableOptions,\n _initQueryBuilder,\n makeColumnTypes,\n MaybeArray,\n MergeQuery,\n NoPrimaryKeyOption,\n QueryData,\n ColumnSchemaConfig,\n Rls,\n Grant,\n EmptyObject,\n ColumnsShape,\n RecordUnknown,\n type TableDataItem,\n type QueryInternal,\n} from 'pqb/internal';\nimport {\n ORMTableInput,\n BaseTableClass,\n TableClass,\n TableQueryBuilder,\n} from './orm-table/legacy-table';\nimport type { OrmTable } from './orm-table/table';\nimport { applyRelations } from './relations/relations';\nimport {\n transaction,\n ensureTransaction,\n isInTransaction,\n afterCommit,\n} from './transaction';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { Db, Query } from 'pqb';\n\nexport interface FromQuery extends Query {\n returnType: 'all';\n}\n\ninterface OrchidORMQueryHelper<\n Q extends Query,\n Args extends unknown[],\n Result,\n> {\n <T extends Query>(\n q: T & { table: Q['table'] },\n ...args: Args\n ): Result extends Query ? MergeQuery<T, Result> : Result;\n isQueryHelper: true;\n table: Q['table'];\n __args: Args;\n __result: Result;\n}\n\ninterface OrchidORMTableHelper<T extends Query> {\n /**\n * Static table name from the table class.\n */\n table: T['table'];\n\n /**\n * Create a helper that binds to the DB-aware table query when used.\n */\n makeHelper<Args extends unknown[], Result>(\n fn: (q: T, ...args: Args) => Result,\n ): OrchidORMQueryHelper<T, Args, Result>;\n}\n\n/**\n * Table definitions accepted by ORM setup.\n */\nexport interface OrmTableThunks {\n /**\n * ORM table or view definition keyed by the db instance property name.\n */\n [K: string]:\n | TableClass\n | {\n data: {\n id: string;\n name: string | undefined;\n table: string | undefined;\n relations: unknown;\n columns: ColumnsShape;\n types: unknown;\n computed: unknown;\n scopes: RecordUnknown | undefined;\n softDelete?: true | string | undefined;\n readOnly?: boolean | undefined;\n materialized?: true | undefined;\n tableData: unknown;\n };\n prototype: { columns: { shape: ColumnsShape } };\n instance(): ORMTableInput;\n };\n}\n\ntype OrmTableInstance<T> = T extends {\n data: {\n id: infer Id extends string;\n table: infer Table extends string | undefined;\n name: infer Name extends string | undefined;\n columns: infer Columns extends ColumnsShape;\n types: infer ColumnTypes;\n relations: infer Relations;\n computed: infer Computed;\n scopes: infer Scopes extends RecordUnknown | undefined;\n softDelete: infer SoftDelete extends true | string | undefined;\n readOnly: infer ReadOnly extends boolean | undefined;\n materialized: infer Materialized extends true | undefined;\n tableData: infer Data extends TableDataItem[];\n };\n}\n ? OrmTable.Input<\n Id,\n Table,\n Name,\n Columns,\n ColumnTypes,\n OrmTable.Relations.Resolve<Relations>,\n Computed,\n Scopes,\n SoftDelete,\n ReadOnly,\n Materialized,\n Data[number]\n >\n : never;\n\nexport type TableInstance<T> = T extends {\n new (): infer R extends ORMTableInput;\n}\n ? R\n : OrmTableInstance<T>;\n\nexport type OrchidORMTables<\n TT extends OrmTableThunks = OrmTableThunks,\n VT extends OrmTableThunks = OrmTableThunks,\n> = {\n [K in keyof TT]: OrchidORMTableHelper<\n TableQueryBuilder<TT, VT, TableInstance<TT[K]>>\n >;\n};\n\nexport type OrchidORMBundle<\n TT extends OrmTableThunks = OrmTableThunks,\n VT extends OrmTableThunks = OrmTableThunks,\n> = OrchidORMTables<TT, VT> & {\n $views: OrchidORMTables<VT, TT>;\n};\n\nexport type OrchidORMDbTables<\n TT extends OrmTableThunks = OrmTableThunks,\n VT extends OrmTableThunks = OrmTableThunks,\n> = {\n [K in keyof TT]: TableQueryBuilder<TT, VT, TableInstance<TT[K]>>;\n};\n\nexport type OrchidORM<\n TT extends OrmTableThunks = OrmTableThunks,\n VT extends OrmTableThunks = OrmTableThunks,\n> = OrchidORMDbTables<TT, VT> & {\n $views: OrchidORMDbTables<VT, TT>;\n} & OrchidORMMethods;\n\n/**\n * Identity helper for table row-level security configuration.\n */\nexport const defineRls = <T extends Rls.TableConfig>(rls: T): T => rls;\n\n/**\n * Identity helper for table-local grant configuration.\n */\nexport const setGrants = <const T extends readonly Grant.TableClassGrant[]>(\n grants: T,\n): T => grants;\n\ninterface OrchidORMMethods {\n /**\n * @see import('pqb').QueryTransaction.prototype.transaction\n */\n $transaction: typeof transaction;\n /**\n * @see import('pqb').QueryTransaction.prototype.ensureTransaction\n */\n $ensureTransaction: typeof ensureTransaction;\n /**\n * @see import('pqb').QueryTransaction.prototype.isInTransaction\n */\n $isInTransaction: typeof isInTransaction;\n /**\n * @see import('pqb').QueryTransaction.prototype.afterCommit\n */\n $afterCommit: typeof afterCommit;\n $qb: Db;\n $adapterNotInTransaction: Adapter;\n\n /**\n * Adapter is a wrapper on top of `postgres-js`, `node-postgres`, or other db driver.\n *\n * When in transaction, returns a db adapter object for the transaction,\n * returns a default adapter object otherwise.\n *\n * Treat the adapter as implementation detail and avoid accessing it directly.\n */\n $getAdapter(): Adapter;\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 /**\n * `$withOptions` supports overriding `log`, `schema`, `role`, and `setConfig`.\n *\n * - `log`: boolean, enables or disables logging in the scope of the callback.\n * - `schema`: set a **default** schema, note that it does not override\n * if you already have a schema set in the ORM config or for a specific table.\n * - `role`: string, switches the Postgres role for the duration of the callback.\n * Used for row-level security policies.\n * - `setConfig`: object with string, number, or boolean values, sets Postgres custom\n * settings for the duration of the callback. Use dotted names like `app.tenant_id`.\n * Values are normalized to strings internally.\n *\n * SQL session options (`role` and `setConfig`) cannot be nested.\n * If an outer scope already has `role` or `setConfig`, attempting to set them again\n * in a nested `$withOptions` call will throw an error.\n * For transaction-bound work that needs nested overrides, pass `role` and\n * `setConfig` to nested `$transaction` calls instead.\n * Nested scopes that only change `log` or `schema` will inherit the outer SQL session context.\n *\n * Explicit transactions inside the callback inherit the same SQL session context:\n *\n * ```ts\n * await db.$withOptions(\n * {\n * role: 'app_user',\n * setConfig: {\n * 'app.tenant_id': tenantId,\n * 'app.user_id': userId,\n * },\n * },\n * async () => {\n * const project = await db.project.find(projectId);\n *\n * await db.$transaction(async () => {\n * // This query runs in the transaction with the same role and config\n * await db.project.find(projectId).update({ lastViewedAt: new Date() });\n * });\n * },\n * );\n * ```\n *\n * When the request's DB work should run in one transaction, prefer passing\n * `role` and `setConfig` directly to `$transaction`.\n *\n * Basic usage with `log` and `schema`:\n *\n * ```ts\n * await db.$withOptions({ log: true, schema: 'custom' }, async () => {\n * // will log this query, and will use the custom schema for this table,\n * // unless this table already has a configured schema.\n * await db.table.find(123);\n * });\n * ```\n */\n $withOptions<Result>(\n options: StorageOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n\n $close(): Promise<void>;\n}\n\nexport type OrchidOrmParam<Options> = true | null extends true\n ? 'Set strict: true to tsconfig'\n : Options;\n\ninterface OrchidORMBundleMetadata {\n // Original table classes for later DB binding.\n tables: OrmTableThunks;\n // Original view classes for later DB binding.\n views: OrmTableThunks;\n // Set db-aware instance so that the minimal preliminary query objects can access it.\n setDbAwareInstance(orm: OrchidORM): void;\n}\n\nconst orchidORMBundleMetadataKey = Symbol('orchidORMBundleMetadataKey');\n\ntype CommonOrmOptions = QueryLogOptions & {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n};\n\nexport interface OrchidORMSetupOptions<\n V extends OrmTableThunks = OrmTableThunks,\n> extends DbSharedOptions {\n /**\n * First-class regular views exposed under db.$views.\n */\n views?: V;\n}\n\nconst assignTablesToOrm = <T extends OrmTableThunks>(\n isTable: boolean,\n tables: T,\n result: { [K: string]: Query },\n adapter: Adapter,\n qb: Db,\n asyncStorage: AsyncLocalStorage<AsyncState>,\n commonOptions: CommonOrmOptions,\n schema: DbSharedOptions['schema'],\n) => {\n const tableInstances: Record<string, ORMTableInput> = {};\n\n for (const key in tables) {\n if (key[0] === '$') {\n throw new Error(\n `${isTable ? 'Table' : 'View'} class name must not start with $`,\n );\n }\n\n const tableClass = tables[key];\n const tableImmutable = (\n tableClass as unknown as { instance(): ORMTableInput }\n ).instance();\n const table = Object.create(tableImmutable);\n table.q = { ...table.q };\n table.columns = {\n shape: { ...table.columns.shape },\n data: { ...table.columns.data },\n };\n tableInstances[key] = table;\n\n const options: DbTableOptions<unknown, string, Column.Shape.QueryInit> = {\n ...commonOptions,\n schema: table.schema || 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 nameInDb: table.nameInDb,\n comment: table.comment,\n readOnly: isTable\n ? table.readOnly\n ? true\n : undefined\n : table.materialized || table.readOnly !== false\n ? true\n : undefined,\n materialized: !isTable && table.materialized ? true : undefined,\n generatorIgnore: table.generatorIgnore,\n noPrimaryKey: table.noPrimaryKey || !isTable ? '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 qb,\n isTable ? table.table : table.name,\n table.columns.shape as never,\n table.types,\n asyncStorage,\n options,\n table.columns?.data ?? {},\n getViewData(isTable, table),\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 dbTable.internal.tableRls = table.rls;\n dbTable.internal.tableGrants = table.grants;\n\n result[key] = dbTable as never;\n }\n\n return tableInstances;\n};\n\nconst getViewData = (\n isTable: boolean,\n table: ORMTableInput,\n): QueryInternal['viewData'] | undefined => {\n if (isTable) return;\n\n return {\n query: table.query,\n sql: table.sql,\n recursive: table.recursive,\n checkOption: table.checkOption,\n securityBarrier: table.securityBarrier,\n securityInvoker: table.securityInvoker,\n withData: table.withData,\n };\n};\n\nexport const bundleOrchidORM = <\n T extends OrmTableThunks = EmptyObject,\n V extends OrmTableThunks = EmptyObject,\n>({\n tables = {} as T,\n views = {} as V,\n}: {\n tables?: T;\n views?: V;\n}): OrchidORMBundle<T, V> => {\n const result = {} as OrchidORMBundle<T, V>;\n const bundledViews = {} as OrchidORMTables<V, T>;\n const hasViews = Object.keys(views).length > 0;\n\n Object.defineProperty(result, '$views', {\n enumerable: hasViews,\n value: bundledViews,\n });\n\n let dbAwareInstance: OrchidORM;\n\n for (const key in tables) {\n const tableClass = tables[key];\n const table = (\n tableClass as unknown as { instance(): ORMTableInput }\n ).instance().table;\n\n result[key] = {\n table,\n makeHelper(arg: unknown) {\n // oxlint-disable-next-line typescript/no-explicit-any\n let fn: (...args: any[]) => unknown;\n return (...args: unknown[]) => {\n if (!fn) {\n fn = dbAwareInstance[key].makeHelper(arg as never);\n }\n return fn(...args);\n };\n },\n } as never;\n }\n\n for (const key in views) {\n const viewClass = views[key];\n const table = (\n viewClass as unknown as { instance(): ORMTableInput }\n ).instance().name;\n\n bundledViews[key] = {\n table,\n makeHelper(arg: unknown) {\n // oxlint-disable-next-line typescript/no-explicit-any\n let fn: (...args: any[]) => unknown;\n return (...args: unknown[]) => {\n if (!fn) {\n fn = dbAwareInstance.$views[key].makeHelper(arg as never);\n }\n return fn(...args);\n };\n },\n } as never;\n }\n\n const meta: OrchidORMBundleMetadata = {\n tables,\n views,\n setDbAwareInstance(orm) {\n dbAwareInstance = orm;\n },\n };\n\n Object.defineProperty(result, orchidORMBundleMetadataKey, {\n enumerable: false,\n value: meta,\n });\n\n return result;\n};\n\nexport const bundleOrchidORMTables = <T extends OrmTableThunks>(\n tables: T,\n): OrchidORMBundle<T, EmptyObject> => bundleOrchidORM({ tables });\n\nconst getOrchidORMBundleMetadata = <\n T extends OrmTableThunks,\n V extends OrmTableThunks,\n>(\n orm: OrchidORMBundle<T, V>,\n): OrchidORMBundleMetadata => {\n const meta = (\n orm as {\n [orchidORMBundleMetadataKey]?: OrchidORMBundleMetadata;\n }\n )[orchidORMBundleMetadataKey];\n\n if (!meta) {\n throw new Error(\n 'Failed to bind Orchid ORM tables: pass a bundle created by bundleOrchidORM.',\n );\n }\n\n return meta;\n};\n\nexport const makeOrchidOrmDbWithAdapter = <\n T extends OrmTableThunks,\n V extends OrmTableThunks,\n>(\n orm: OrchidORMBundle<T, V>,\n options: OrchidOrmParam<\n ({ db: Query } | { adapter: Adapter }) & DbSharedOptions\n >,\n): OrchidORM<T, V> => {\n const meta = getOrchidORMBundleMetadata(orm);\n return privateOrchidORMWithAdapter<T, V>(\n options,\n meta.tables as T,\n meta.views as V,\n meta.setDbAwareInstance,\n );\n};\n\nconst privateOrchidORMWithAdapter = <\n T extends OrmTableThunks,\n V extends OrmTableThunks,\n>(\n {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey = 'error',\n schema,\n views,\n ...options\n }: OrchidOrmParam<\n ({ db: Query } | { adapter: Adapter }) & OrchidORMSetupOptions<V>\n >,\n tables: T,\n bundledViews?: V,\n setDbAwareInstance?: OrchidORMBundleMetadata['setDbAwareInstance'],\n): OrchidORM<T, V> => {\n if (bundledViews) {\n views = bundledViews;\n }\n\n const commonOptions: CommonOrmOptions = {\n log,\n logger,\n autoPreparedStatements,\n noPrimaryKey,\n };\n\n let adapter: Adapter;\n let asyncStorage;\n let qb: Db;\n if ('db' in options) {\n adapter = options.db.q.adapter;\n asyncStorage = options.db.internal.asyncStorage;\n qb = options.db.qb as Db;\n } else {\n adapter = options.adapter;\n\n asyncStorage = new AsyncLocalStorage<AsyncState>();\n\n qb = _initQueryBuilder(\n adapter,\n makeColumnTypes(defaultSchemaConfig(adapter.driverAdapter.schemaConfig)),\n asyncStorage,\n commonOptions,\n options,\n );\n }\n\n qb.internal.rls = options.rls;\n\n const result = {\n $transaction: transaction,\n $ensureTransaction: ensureTransaction,\n $isInTransaction: isInTransaction,\n $afterCommit: afterCommit,\n $adapterNotInTransaction: adapter,\n $getAdapter,\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 $withOptions: qb.withOptions.bind(qb),\n } as unknown as OrchidORM<T, V>;\n\n result.$views = {} as never;\n\n const tableInstances = assignTablesToOrm(\n true,\n tables,\n result as OrchidORMDbTables<T>,\n adapter,\n qb,\n asyncStorage,\n commonOptions,\n schema,\n );\n\n let viewInstances;\n if (views) {\n viewInstances = assignTablesToOrm(\n false,\n views,\n result.$views,\n adapter,\n qb,\n asyncStorage,\n commonOptions,\n schema,\n );\n\n const tableDbNames = Object.values(tableInstances).map((table) => {\n const s =\n typeof table.schema === 'function' ? table.schema() : table.schema;\n return `${s ? s + '.' : ''}${table.nameInDb}`;\n });\n\n for (const key in views) {\n const view = viewInstances[key];\n const s = typeof view.schema === 'function' ? view.schema() : view.schema;\n const name = `${s ? s + '.' : ''}${view.nameInDb}`;\n if (tableDbNames.includes(name)) {\n throw new Error(\n `Cannot configure both a table and a view for database relation ${name}`,\n );\n }\n }\n }\n\n applyRelations(\n qb,\n { ...tableInstances, ...viewInstances },\n { ...result, ...result.$views },\n schema,\n );\n\n setDbAwareInstance?.(result as never);\n\n const initItems = [\n [tableInstances, result, true],\n [viewInstances, result.$views, false],\n ] as const;\n\n for (const [items, queries, isTable] of initItems) {\n if (!items) continue;\n\n for (const key in items) {\n const table = items[key] as unknown as {\n init?(orm: unknown): void;\n q: QueryData;\n } & ORMTableInput;\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(queries[key].baseQuery.q, table.q);\n if (!isTable) {\n queries[key].internal.viewData = getViewData(false, table);\n }\n }\n }\n }\n\n return result as unknown as OrchidORM<T, V>;\n};\n\nexport const orchidORMWithAdapter = <\n T extends OrmTableThunks,\n V extends OrmTableThunks = EmptyObject,\n>(\n options: OrchidOrmParam<\n ({ db: Query } | { adapter: Adapter }) & OrchidORMSetupOptions<V>\n >,\n tables: T,\n): OrchidORM<T, V> => privateOrchidORMWithAdapter(options, tables);\n\nfunction $getAdapter(this: OrchidORM) {\n return this.$qb.$getAdapter();\n}\n","import {\n getClonedQueryData,\n MergeQuery,\n QueryReturnType,\n RecordUnknown,\n QueryHasWhere,\n} from 'pqb/internal';\nimport { Query } 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<T & QueryHasWhere>;\n queryOneWithWhereMethods?: QueryMethods<QueryOne<T & QueryHasWhere>>;\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<Query & QueryHasWhere>,\n Methods['queryOneWithWhereMethods'][K]\n >\n : K extends keyof Methods['queryWithWhereMethods']\n ? MapQueryMethods<\n Query & QueryHasWhere,\n Methods['queryWithWhereMethods'][K]\n >\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"],"mappings":"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"}
|