{"version":3,"file":"insert.cjs","names":["entityKind","QueryBuilder","SQL","Table","QueryPromise"],"sources":["../../../src/mssql-core/query-builders/insert.ts"],"sourcesContent":["import { entityKind, is } from '~/entity.ts';\nimport type { MsSqlDialect } from '~/mssql-core/dialect.ts';\nimport type {\n\tAnyQueryResultHKT,\n\tMsSqlSession,\n\tPreparedQueryConfig,\n\tPreparedQueryHKTBase,\n\tPreparedQueryKind,\n\tQueryResultHKT,\n\tQueryResultKind,\n} from '~/mssql-core/session.ts';\nimport type { MsSqlTable } from '~/mssql-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { type InferInsertModel, type InferSelectModel, Table } from '~/table.ts';\nimport { type DrizzleTypeError, orderSelectedFields } from '~/utils.ts';\nimport type { AnyMsSqlColumn, MsSqlColumn } from '../columns/common.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\n\nexport interface MsSqlInsertConfig<TTable extends MsSqlTable = MsSqlTable> {\n\ttable: TTable;\n\tvalues: Record<string, unknown>[] | TypedQueryBuilder<MsSqlInsertSelection<TTable>> | SQL;\n\toutput?: SelectedFieldsOrdered;\n\tselect?: boolean;\n\tcolumnList?: string[];\n}\n\nexport type MsSqlInsertValue<\n\tTTable extends MsSqlTable,\n\tTColumnsList extends string[] | 'all' = 'all',\n\tTModel extends Record<string, any> = InferInsertModel<TTable>,\n> =\n\t& {\n\t\t[K in keyof TModel as TColumnsList extends 'all' ? K : Extract<K, TColumnsList[number]>]:\n\t\t\t| TModel[K]\n\t\t\t| SQL\n\t\t\t| Placeholder;\n\t}\n\t& {};\n\nexport type MsSqlInsertSelection<\n\tTTable extends MsSqlTable,\n\tTColumnsList extends string[] | 'all' = 'all',\n\tTModel extends Record<string, unknown> = InferInsertModel<TTable>,\n> =\n\t& {\n\t\t[K in keyof TModel as TColumnsList extends 'all' ? K : Extract<K, TColumnsList[number]>]:\n\t\t\t| AnyMsSqlColumn\n\t\t\t| SQL\n\t\t\t| SQL.Aliased\n\t\t\t| TModel[K];\n\t}\n\t& {};\n\nexport type ValidateInsertSelectionKey<\n\tTTable extends MsSqlTable,\n\tTSelection extends MsSqlInsertSelection<any>,\n\tK extends keyof TSelection,\n> = K extends keyof InferInsertModel<TTable> ? TSelection[K]\n\t: DrizzleTypeError<`Column \"${K & string}\" does not exist in table \"${TTable['_']['name']}\"`>;\n\nexport type NoUnknownKeysInInsertSelection<\n\tTTable extends MsSqlTable,\n\tTSelection extends MsSqlInsertSelection<any>,\n\tTColumnList extends string[] | 'all' = 'all',\n> = {\n\t[K in keyof TSelection]: TColumnList extends string[]\n\t\t? K extends TColumnList[number] ? ValidateInsertSelectionKey<TTable, TSelection, K>\n\t\t: DrizzleTypeError<`Column \"${K & string}\" is not included in the insert column selection`>\n\t\t: ValidateInsertSelectionKey<TTable, TSelection, K>;\n};\n\nexport type NoDuplicateColumns<\n\tT extends readonly unknown[],\n\tTSeen = never,\n> = T extends readonly [infer Head, ...infer Tail] ? [\n\t\tHead extends TSeen ? DrizzleTypeError<`Duplicate columns are not allowed in insert selection: \"${Head & string}\"`>\n\t\t\t: Head,\n\t\t...NoDuplicateColumns<Tail, TSeen | Head>,\n\t]\n\t: T;\n\nexport class MsSqlInsertBuilder<\n\tTTable extends MsSqlTable,\n\tTQueryResult extends QueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTOutput extends Record<string, unknown> | undefined = undefined,\n\tTColumnList extends string[] | 'all' = 'all',\n> {\n\tstatic readonly [entityKind]: string = 'MsSqlInsertBuilder';\n\n\tprivate config: {\n\t\toutput?: SelectedFieldsOrdered;\n\t\ttable: TTable;\n\t\tcolumnList?: string[];\n\t};\n\n\tprotected table: TTable;\n\tprotected session: MsSqlSession;\n\tprotected dialect: MsSqlDialect;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tsession: MsSqlSession,\n\t\tdialect: MsSqlDialect,\n\t\toutput?: SelectedFieldsOrdered,\n\t\tcolumnList?: string[],\n\t) {\n\t\tthis.table = table;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\n\t\tthis.config = { table, output, columnList };\n\t}\n\n\tvalues(\n\t\tvalue: MsSqlInsertValue<TTable, TColumnList>,\n\t): MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput>;\n\tvalues(\n\t\tvalues: MsSqlInsertValue<TTable, TColumnList>[],\n\t): MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput>;\n\tvalues(\n\t\tvalues: MsSqlInsertValue<TTable, TColumnList> | MsSqlInsertValue<TTable, TColumnList>[],\n\t): MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\treturn new MsSqlInsertBase(\n\t\t\tthis.table,\n\t\t\tvalues,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.config.output,\n\t\t\tthis.config.columnList,\n\t\t);\n\t}\n\n\tselect<TSelection extends MsSqlInsertSelection<TTable, TColumnList>>(\n\t\tselectQuery: (\n\t\t\tqb: QueryBuilder,\n\t\t) => TypedQueryBuilder<NoUnknownKeysInInsertSelection<TTable, TSelection, TColumnList>>,\n\t): MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput>;\n\tselect(selectQuery: SQL): MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput>;\n\tselect<TSelection extends MsSqlInsertSelection<TTable, TColumnList>>(\n\t\tselectQuery: TypedQueryBuilder<NoUnknownKeysInInsertSelection<TTable, TSelection, TColumnList>>,\n\t): MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| TypedQueryBuilder<\n\t\t\t\tNoUnknownKeysInInsertSelection<TTable, MsSqlInsertSelection<TTable, TColumnList>, TColumnList>\n\t\t\t>\n\t\t\t| ((qb: QueryBuilder) =>\n\t\t\t\t| TypedQueryBuilder<\n\t\t\t\t\tNoUnknownKeysInInsertSelection<TTable, MsSqlInsertSelection<TTable, TColumnList>, TColumnList>\n\t\t\t\t>\n\t\t\t\t| SQL),\n\t): MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (!is(select, SQL)) {\n\t\t\tconst insertCols = Object.keys(this.table[Table.Symbol.Columns]);\n\t\t\tconst selected = Object.keys(select._.selectedFields);\n\n\t\t\tfor (const col of selected) {\n\t\t\t\tif (!insertCols.includes(col)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Insert select error: column \"${col}\" does not exist in table \"${this.table[Table.Symbol.Name]}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new MsSqlInsertBase(\n\t\t\tthis.table,\n\t\t\tselect,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.config.output,\n\t\t\tthis.config.columnList,\n\t\t\ttrue,\n\t\t);\n\t}\n\n\t/**\n\t * Adds an `output` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and return all fields\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t *   .output();\n\t *   .values({ brand: 'BMW' })\n\t *\n\t * // Insert one row and return only the id\n\t * const insertedCarId: { id: number }[] = await db.insert(cars)\n\t *   .output({ id: cars.id });\n\t *   .values({ brand: 'BMW' })\n\t * ```\n\t */\n\toutput(): Omit<MsSqlInsertBuilder<TTable, TQueryResult, TPreparedQueryHKT, InferSelectModel<TTable>>, 'output'>;\n\toutput<SelectedFields extends SelectedFieldsFlat>(\n\t\tfields: SelectedFields,\n\t): Omit<MsSqlInsertBuilder<TTable, TQueryResult, TPreparedQueryHKT, SelectResultFields<SelectedFields>>, 'output'>;\n\toutput(\n\t\tfields: SelectedFieldsFlat = this.table[Table.Symbol.Columns],\n\t) {\n\t\tthis.config.output = orderSelectedFields<MsSqlColumn>(fields);\n\t\treturn this as any;\n\t}\n}\n\nexport type MsSqlInsertWithout<T extends AnyMsSqlInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tMsSqlInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['queryResult'],\n\t\t\t\tT['_']['preparedQueryHKT'],\n\t\t\t\tT['_']['output'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | K\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type MsSqlInsertDynamic<T extends AnyMsSqlInsert> = MsSqlInsert<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['preparedQueryHKT'],\n\tT['_']['output']\n>;\n\nexport type MsSqlInsertPrepare<T extends AnyMsSqlInsert> = PreparedQueryKind<\n\tT['_']['preparedQueryHKT'],\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['output'] extends undefined ? QueryResultKind<T['_']['queryResult'], any> : T['_']['output'][];\n\t\titerator: never;\n\t}\n>;\n\nexport type MsSqlInsert<\n\tTTable extends MsSqlTable = MsSqlTable,\n\tTQueryResult extends QueryResultHKT = AnyQueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTOutput extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = MsSqlInsertBase<TTable, TQueryResult, TPreparedQueryHKT, TOutput, true, never>;\n\nexport type AnyMsSqlInsert = MsSqlInsertBase<any, any, any, any, any, any>;\n\nexport interface MsSqlInsertBase<\n\tTTable extends MsSqlTable,\n\tTQueryResult extends QueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTOutput extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TOutput extends undefined ? QueryResultKind<TQueryResult, any> : TOutput[]>, SQLWrapper {\n\treadonly _: {\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly preparedQueryHKT: TPreparedQueryHKT;\n\t\treadonly output: TOutput;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t};\n}\n\nexport class MsSqlInsertBase<\n\tTTable extends MsSqlTable,\n\tTQueryResult extends QueryResultHKT,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTOutput extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TOutput extends undefined ? QueryResultKind<TQueryResult, any> : TOutput[]>\n\timplements SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'MsSqlInsert';\n\n\tdeclare protected $table: TTable;\n\n\tprivate config: MsSqlInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: MsSqlInsertConfig['values'],\n\t\tprivate session: MsSqlSession,\n\t\tprivate dialect: MsSqlDialect,\n\t\toutput?: SelectedFieldsOrdered,\n\t\tcolumnList?: string[],\n\t\tselect?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, output, columnList, select };\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this.dialect.sqlToQuery(this.getSQL());\n\t}\n\n\tprepare(): MsSqlInsertPrepare<this> {\n\t\tconst fields = this.config.output;\n\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tfields ? 'arrays' : 'raw',\n\t\t\tfields ? this.dialect.mapperGenerators.rows(fields, undefined) : undefined,\n\t\t) as MsSqlInsertPrepare<this>;\n\t}\n\n\toverride execute(\n\t\tplaceholderValues?: Record<string, unknown>,\n\t): Promise<TOutput extends undefined ? QueryResultKind<TQueryResult, any> : TOutput[]> {\n\t\treturn this.prepare().execute(placeholderValues) as any;\n\t}\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {\n\t\tconst self = this;\n\t\treturn async function*(placeholderValues) {\n\t\t\tyield* self.prepare().iterator(placeholderValues);\n\t\t};\n\t};\n\n\titerator = this.createIterator();\n\n\t$dynamic(): MsSqlInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"],"mappings":";;;;;;;;;;AAsFA,IAAa,qBAAb,MAME;CACD,QAAiBA,0BAAsB;CAEvC,AAAQ;CAMR,AAAU;CACV,AAAU;CACV,AAAU;CAEV,YACC,OACA,SACA,SACA,QACA,YACC;AACD,OAAK,QAAQ;AACb,OAAK,UAAU;AACf,OAAK,UAAU;AAEf,OAAK,SAAS;GAAE;GAAO;GAAQ;GAAY;;CAS5C,OACC,QACoE;AACpE,WAAS,MAAM,QAAQ,OAAO,GAAG,SAAS,CAAC,OAAO;AAClD,MAAI,OAAO,WAAW,EACrB,OAAM,IAAI,MAAM,kDAAkD;AAEnE,SAAO,IAAI,gBACV,KAAK,OACL,QACA,KAAK,SACL,KAAK,SACL,KAAK,OAAO,QACZ,KAAK,OAAO,WACZ;;CAaF,OACC,aAUoE;EACpE,MAAM,SAAS,OAAO,gBAAgB,aAAa,YAAY,IAAIC,8DAAc,CAAC,GAAG;AAErF,MAAI,qBAAI,QAAQC,iBAAI,EAAE;GACrB,MAAM,aAAa,OAAO,KAAK,KAAK,MAAMC,iBAAM,OAAO,SAAS;GAChE,MAAM,WAAW,OAAO,KAAK,OAAO,EAAE,eAAe;AAErD,QAAK,MAAM,OAAO,SACjB,KAAI,CAAC,WAAW,SAAS,IAAI,CAC5B,OAAM,IAAI,MACT,gCAAgC,IAAI,6BAA6B,KAAK,MAAMA,iBAAM,OAAO,MAAM,GAC/F;;AAKJ,SAAO,IAAI,gBACV,KAAK,OACL,QACA,KAAK,SACL,KAAK,SACL,KAAK,OAAO,QACZ,KAAK,OAAO,YACZ,KACA;;CAyBF,OACC,SAA6B,KAAK,MAAMA,iBAAM,OAAO,UACpD;AACD,OAAK,OAAO,6CAA0C,OAAO;AAC7D,SAAO;;;AA4DT,IAAa,kBAAb,cAWUC,gCAEV;CACC,QAA0BJ,0BAAsB;CAIhD,AAAQ;CAER,YACC,OACA,QACA,AAAQ,SACR,AAAQ,SACR,QACA,YACA,QACC;AACD,SAAO;EANC;EACA;AAMR,OAAK,SAAS;GAAE;GAAe;GAAe;GAAQ;GAAY;GAAQ;;;CAI3E,SAAc;AACb,SAAO,KAAK,QAAQ,iBAAiB,KAAK,OAAO;;CAGlD,QAAe;AACd,SAAO,KAAK,QAAQ,WAAW,KAAK,QAAQ,CAAC;;CAG9C,UAAoC;EACnC,MAAM,SAAS,KAAK,OAAO;AAE3B,SAAO,KAAK,QAAQ,aACnB,KAAK,QAAQ,WAAW,KAAK,QAAQ,CAAC,EACtC,SAAS,WAAW,OACpB,SAAS,KAAK,QAAQ,iBAAiB,KAAK,QAAQ,OAAU,GAAG,OACjE;;CAGF,AAAS,QACR,mBACsF;AACtF,SAAO,KAAK,SAAS,CAAC,QAAQ,kBAAkB;;CAGjD,AAAQ,uBAAgE;EACvE,MAAM,OAAO;AACb,SAAO,iBAAgB,mBAAmB;AACzC,UAAO,KAAK,SAAS,CAAC,SAAS,kBAAkB;;;CAInD,WAAW,KAAK,gBAAgB;CAEhC,WAAqC;AACpC,SAAO"}