{"version":3,"file":"insert.cjs","names":["entityKind","QueryBuilder","SQL","Table","sql"],"sources":["../../../src/mysql-core/query-builders/insert.ts"],"sourcesContent":["import { entityKind, is } from '~/entity.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { AnyMySqlQueryResultHKT, MySqlQueryResultHKT, MySqlQueryResultKind } from '~/mysql-core/session.ts';\nimport type { MySqlSession } from '~/mysql-core/session.ts';\nimport type { MySqlTable } from '~/mysql-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { CommentInput, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { SQL, sql } from '~/sql/sql.ts';\nimport type { InferInsertModel, InferModelFromColumns } from '~/table.ts';\nimport { Table } from '~/table.ts';\nimport { type Assume, type DrizzleTypeError, mapUpdateSet } from '~/utils.ts';\nimport type { AnyMySqlColumn } from '../columns/common.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsOrdered } from './select.types.ts';\nimport type { MySqlUpdateSetSource } from './update.ts';\n\nexport interface MySqlInsertConfig<TTable extends MySqlTable = MySqlTable> {\n\ttable: TTable;\n\tvalues: Record<string, unknown>[] | TypedQueryBuilder<MySqlInsertSelection<TTable>> | SQL;\n\tignore: boolean;\n\tonConflict?: SQL;\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n\tcolumnList?: string[];\n\tcomment?: SQL;\n}\n\nexport type AnyMySqlInsertConfig = MySqlInsertConfig<MySqlTable>;\n\nexport type MySqlInsertValue<\n\tTTable extends MySqlTable,\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 MySqlInsertSelection<\n\tTTable extends MySqlTable,\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| AnyMySqlColumn\n\t\t\t| SQL\n\t\t\t| SQL.Aliased\n\t\t\t| TModel[K];\n\t}\n\t& {};\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 type ValidateInsertSelectionKey<\n\tTTable extends MySqlTable,\n\tTSelection extends MySqlInsertSelection<any>,\n\tK extends keyof TSelection,\n> = K extends keyof InferInsertModel<TTable> ? TSelection[K]\n\t: K extends keyof InferInsertModel<TTable, { override: true }> ? DrizzleTypeError<\n\t\t\t`Column \"${\n\t\t\t\t& K\n\t\t\t\t& string}\" in table \"${TTable['_'][\n\t\t\t\t'name'\n\t\t\t]}\" is a generated column - manual value insertion restricted`\n\t\t>\n\t: DrizzleTypeError<`Column \"${K & string}\" does not exist in table \"${TTable['_']['name']}\"`>;\n\nexport type NoUnknownKeysInInsertSelection<\n\tTTable extends MySqlTable,\n\tTSelection extends MySqlInsertSelection<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 interface MySqlInsertBuilderConstructor {\n\tnew(\n\t\ttable: MySqlTable,\n\t\tvalues: MySqlInsertConfig['values'],\n\t\tignore: boolean,\n\t\tsession: MySqlSession,\n\t\tdialect: MySqlDialect,\n\t\tselect?: boolean,\n\t\tcolumnList?: string[],\n\t): AnyMySqlInsert;\n}\n\nexport class MySqlInsertBuilder<\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTColumnList extends string[] | 'all' = 'all',\n\tTBuilderHKT extends MySqlInsertHKTBase = MySqlInsertHKT,\n> {\n\tstatic readonly [entityKind]: string = 'MySqlInsertBuilder';\n\n\tprivate shouldIgnore = false;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: MySqlSession,\n\t\tprivate dialect: MySqlDialect,\n\t\tprivate columnList?: string[],\n\t\tprivate builder: MySqlInsertBuilderConstructor = MySqlInsertBase as unknown as MySqlInsertBuilderConstructor,\n\t) {}\n\n\tignore(): this {\n\t\tthis.shouldIgnore = true;\n\t\treturn this;\n\t}\n\n\tvalues(value: MySqlInsertValue<TTable, TColumnList>): MySqlInsertKind<TBuilderHKT, TTable, TQueryResult>;\n\tvalues(values: MySqlInsertValue<TTable, TColumnList>[]): MySqlInsertKind<TBuilderHKT, TTable, TQueryResult>;\n\tvalues(\n\t\tvalues: MySqlInsertValue<TTable, TColumnList> | MySqlInsertValue<TTable, TColumnList>[],\n\t): MySqlInsertKind<TBuilderHKT, TTable, TQueryResult> {\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 this.builder(\n\t\t\tthis.table,\n\t\t\tvalues,\n\t\t\tthis.shouldIgnore,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tfalse,\n\t\t\tthis.columnList,\n\t\t) as any;\n\t}\n\n\tselect<TSelection extends MySqlInsertSelection<TTable, TColumnList>>(\n\t\tselectQuery: (\n\t\t\tqb: QueryBuilder,\n\t\t) => TypedQueryBuilder<NoUnknownKeysInInsertSelection<TTable, TSelection, TColumnList>>,\n\t): MySqlInsertKind<TBuilderHKT, TTable, TQueryResult>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): MySqlInsertKind<TBuilderHKT, TTable, TQueryResult>;\n\tselect(selectQuery: SQL): MySqlInsertKind<TBuilderHKT, TTable, TQueryResult>;\n\tselect<TSelection extends MySqlInsertSelection<TTable, TColumnList>>(\n\t\tselectQuery: TypedQueryBuilder<NoUnknownKeysInInsertSelection<TTable, TSelection, TColumnList>>,\n\t): MySqlInsertKind<TBuilderHKT, TTable, TQueryResult>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| TypedQueryBuilder<\n\t\t\t\tNoUnknownKeysInInsertSelection<TTable, MySqlInsertSelection<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, MySqlInsertSelection<TTable, TColumnList>, TColumnList>\n\t\t\t\t>\n\t\t\t\t| SQL),\n\t): MySqlInsertKind<TBuilderHKT, TTable, TQueryResult> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\t\tif ('withoutSelectionCastCodecs' in select) select.withoutSelectionCastCodecs();\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 this.builder(\n\t\t\tthis.table,\n\t\t\tselect,\n\t\t\tthis.shouldIgnore,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\ttrue,\n\t\t\tthis.columnList,\n\t\t) as any;\n\t}\n}\n\nexport type MySqlInsertWithout<T extends AnyMySqlInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tMySqlInsertKind<\n\t\t\t\tT['_']['hkt'],\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['queryResult'],\n\t\t\t\tT['_']['returning'],\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 MySqlInsertDynamic<T extends AnyMySqlInsert> = MySqlInsertKind<\n\tT['_']['hkt'],\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['returning'],\n\ttrue,\n\tnever\n>;\n\nexport type MySqlInsertOnDuplicateKeyUpdateConfig<T extends AnyMySqlInsert> = {\n\tset: MySqlUpdateSetSource<T['_']['table']>;\n};\n\nexport type MySqlInsert<\n\tTTable extends MySqlTable = MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT = AnyMySqlQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = MySqlInsertBase<MySqlInsertHKT, TTable, TQueryResult, TReturning, true, never>;\n\nexport type MySqlInsertReturning<T extends AnyMySqlInsert> = T extends any ? MySqlInsertWithout<\n\t\tMySqlInsertKind<\n\t\t\tT['_']['hkt'],\n\t\t\tT['_']['table'],\n\t\t\tT['_']['queryResult'],\n\t\t\tInferModelFromColumns<GetPrimarySerialOrDefaultKeys<T['_']['table']['_']['columns']>>,\n\t\t\tT['_']['dynamic'],\n\t\t\tT['_']['excludedMethods']\n\t\t>,\n\t\tT['_']['dynamic'],\n\t\t'$returningId'\n\t>\n\t: never;\n\nexport type AnyMySqlInsert = MySqlInsertBase<any, any, any, any, any, any>;\n\nexport interface MySqlInsertHKTBase {\n\ttable: unknown;\n\tqueryResult: unknown;\n\treturning: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\t_type: unknown;\n}\n\nexport interface MySqlInsertHKT extends MySqlInsertHKTBase {\n\t_type: MySqlInsertBase<\n\t\tMySqlInsertHKT,\n\t\tAssume<this['table'], MySqlTable>,\n\t\tAssume<this['queryResult'], MySqlQueryResultHKT>,\n\t\tAssume<this['returning'], Record<string, unknown> | undefined>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods']\n\t>;\n}\n\nexport type MySqlInsertKind<\n\tT extends MySqlInsertHKTBase,\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> = (T & {\n\ttable: TTable;\n\tqueryResult: TQueryResult;\n\treturning: TReturning;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n})['_type'];\n\nexport interface MySqlInsertBase<\n\tTHKT extends MySqlInsertHKTBase,\n\tTTable extends MySqlTable,\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends SQLWrapper {\n\treadonly _: {\n\t\treadonly dialect: 'mysql';\n\t\treadonly hkt: THKT;\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly returning: TReturning;\n\t\treadonly result: TReturning extends undefined ? MySqlQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport type PrimaryKeyKeys<T extends Record<string, AnyMySqlColumn>> = {\n\t[K in keyof T]: T[K]['_']['isPrimaryKey'] extends true ? T[K]['_']['isAutoincrement'] extends true ? K\n\t\t: T[K]['_']['hasRuntimeDefault'] extends true ? T[K]['_']['isPrimaryKey'] extends true ? K : never\n\t\t: never\n\t\t: T[K]['_']['hasRuntimeDefault'] extends true ? T[K]['_']['isPrimaryKey'] extends true ? K : never\n\t\t: never;\n}[keyof T];\n\nexport type GetPrimarySerialOrDefaultKeys<T extends Record<string, AnyMySqlColumn>> = {\n\t[K in PrimaryKeyKeys<T>]: T[K];\n};\n\nexport class MySqlInsertBase<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTHKT extends MySqlInsertHKTBase,\n\tTTable extends MySqlTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTQueryResult extends MySqlQueryResultHKT,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'MySqlInsert';\n\n\tdeclare protected $table: TTable;\n\n\tprotected config: MySqlInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: MySqlInsertConfig['values'],\n\t\tignore: boolean,\n\t\tprotected session: MySqlSession,\n\t\tprotected dialect: MySqlDialect,\n\t\tselect?: boolean,\n\t\tcolumnList?: string[],\n\t) {\n\t\tthis.config = { table, values: values as any, select, ignore, columnList };\n\t}\n\n\t/**\n\t * Adds an `on duplicate key update` clause to the query.\n\t *\n\t * Calling this method will update the row if any unique index conflicts. MySQL will automatically determine the conflict target based on the primary key and unique indexes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-duplicate-key-update}\n\t *\n\t * @param config The `set` clause\n\t *\n\t * @example\n\t * ```ts\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW'})\n\t *   .onDuplicateKeyUpdate({ set: { brand: 'Porsche' }});\n\t * ```\n\t *\n\t * While MySQL does not directly support doing nothing on conflict, you can perform a no-op by setting any column's value to itself and achieve the same effect:\n\t *\n\t * ```ts\n\t * import { sql } from 'drizzle-orm';\n\t *\n\t * await db.insert(cars)\n\t *   .values({ id: 1, brand: 'BMW' })\n\t *   .onDuplicateKeyUpdate({ set: { id: sql`id` } });\n\t * ```\n\t */\n\tonDuplicateKeyUpdate(\n\t\tconfig: MySqlInsertOnDuplicateKeyUpdateConfig<this>,\n\t): MySqlInsertWithout<this, TDynamic, 'onDuplicateKeyUpdate'> {\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tthis.config.onConflict = sql`update ${setSql}`;\n\t\treturn this as any;\n\t}\n\n\t$returningId(): MySqlInsertReturning<this> {\n\t\tconst returning: SelectedFieldsOrdered = [];\n\t\tfor (const [key, value] of Object.entries(this.config.table[Table.Symbol.Columns])) {\n\t\t\tif (value.primary) {\n\t\t\t\treturning.push({ field: value, fieldType: 'Column', path: [key] });\n\t\t\t}\n\t\t}\n\t\tthis.config.returning = returning;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Attach [sqlcommenter](https://google.github.io/sqlcommenter) comment to a query\n\t */\n\tcomment(comment: CommentInput): MySqlInsertWithout<this, TDynamic, 'comment'> {\n\t\tthis.config.comment = sql.comment(comment);\n\t\treturn this as any;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config).sql;\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this.dialect.sqlToQuery(this.getSQL());\n\t}\n\n\t$dynamic(): MySqlInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"],"mappings":";;;;;;;;;AAuGA,IAAa,qBAAb,MAKE;CACD,QAAiBA,0BAAsB;CAEvC,AAAQ,eAAe;CAEvB,YACC,AAAQ,OACR,AAAQ,SACR,AAAQ,SACR,AAAQ,YACR,AAAQ,UAAyC,iBAChD;EALO;EACA;EACA;EACA;EACA;;CAGT,SAAe;AACd,OAAK,eAAe;AACpB,SAAO;;CAKR,OACC,QACqD;AACrD,WAAS,MAAM,QAAQ,OAAO,GAAG,SAAS,CAAC,OAAO;AAClD,MAAI,OAAO,WAAW,EACrB,OAAM,IAAI,MAAM,kDAAkD;AAEnE,SAAO,IAAI,KAAK,QACf,KAAK,OACL,QACA,KAAK,cACL,KAAK,SACL,KAAK,SACL,OACA,KAAK,WACL;;CAaF,OACC,aAUqD;EACrD,MAAM,SAAS,OAAO,gBAAgB,aAAa,YAAY,IAAIC,8DAAc,CAAC,GAAG;AACrF,MAAI,gCAAgC,OAAQ,QAAO,4BAA4B;AAE/E,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,KAAK,QACf,KAAK,OACL,QACA,KAAK,cACL,KAAK,SACL,KAAK,SACL,MACA,KAAK,WACL;;;AAwHH,IAAa,kBAAb,MAWwB;CACvB,QAAiBH,0BAAsB;CAIvC,AAAU;CAEV,YACC,OACA,QACA,QACA,AAAU,SACV,AAAU,SACV,QACA,YACC;EAJS;EACA;AAIV,OAAK,SAAS;GAAE;GAAe;GAAe;GAAQ;GAAQ;GAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B3E,qBACC,QAC6D;EAC7D,MAAM,SAAS,KAAK,QAAQ,eAAe,KAAK,OAAO,oCAAoB,KAAK,OAAO,OAAO,OAAO,IAAI,CAAC;AAC1G,OAAK,OAAO,aAAa,gBAAG,UAAU;AACtC,SAAO;;CAGR,eAA2C;EAC1C,MAAM,YAAmC,EAAE;AAC3C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,OAAO,MAAMG,iBAAM,OAAO,SAAS,CACjF,KAAI,MAAM,QACT,WAAU,KAAK;GAAE,OAAO;GAAO,WAAW;GAAU,MAAM,CAAC,IAAI;GAAE,CAAC;AAGpE,OAAK,OAAO,YAAY;AACxB,SAAO;;;;;CAMR,QAAQ,SAAsE;AAC7E,OAAK,OAAO,UAAUC,iBAAI,QAAQ,QAAQ;AAC1C,SAAO;;CAGR,SAAc;AACb,SAAO,KAAK,QAAQ,iBAAiB,KAAK,OAAO,CAAC;;CAGnD,QAAe;AACd,SAAO,KAAK,QAAQ,WAAW,KAAK,QAAQ,CAAC;;CAG9C,WAAqC;AACpC,SAAO"}