{"version":3,"file":"update.cjs","names":["entityKind","SQLiteTable","Table","Subquery","SQLiteViewBase","ViewBaseConfig","SelectionProxyHandler"],"sources":["../../../src/sqlite-core/query-builders/update.ts"],"sourcesContent":["import type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { JoinType, SelectResultFields } from '~/query-builders/select.types.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { type InferInsertModel, Table } from '~/table.ts';\nimport {\n\ttype Assume,\n\tgetTableLikeName,\n\tmapUpdateSet,\n\torderSelectedFields,\n\ttype UpdateSet,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type { SelectedFields, SelectedFieldsOrdered, SQLiteSelectJoinConfig } from './select.types.ts';\n\nexport interface SQLiteUpdateConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\tset: UpdateSet;\n\ttable: SQLiteTable;\n\tfrom?: SQLiteTable | Subquery | SQLiteViewBase | SQL;\n\tjoins: SQLiteSelectJoinConfig[];\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteUpdateSetSource<\n\tTTable extends SQLiteTable,\n\tTModel extends Record<string, any> = InferInsertModel<TTable>,\n> =\n\t& {\n\t\t[Key in keyof TModel & string]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key], 'query'>\n\t\t\t| SQL\n\t\t\t| SQLiteColumn\n\t\t\t| Placeholder\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport interface SQLiteUpdateBuilderConstructor {\n\tnew(\n\t\ttable: SQLiteTable,\n\t\tset: UpdateSet,\n\t\tsession: SQLiteSession<any, any>,\n\t\tdialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t): AnySQLiteUpdate;\n}\n\nexport class SQLiteUpdateBuilder<\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTHKT extends SQLiteUpdateHKTBase = SQLiteUpdateQueryBuilderHKT,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t\tprivate builder: SQLiteUpdateBuilderConstructor = SQLiteUpdateBase,\n\t) {}\n\n\tset(\n\t\tvalues: SQLiteUpdateSetSource<TTable>,\n\t): SQLiteUpdateWithout<\n\t\tAssume<SQLiteUpdateKind<THKT, TTable, TRunResult>, AnySQLiteUpdate>,\n\t\tfalse,\n\t\t'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'\n\t> {\n\t\treturn new this.builder(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t) as any;\n\t}\n}\n\nexport interface SQLiteUpdateHKTBase {\n\ttable: unknown;\n\tresultType: unknown;\n\trunResult: unknown;\n\tfrom: unknown;\n\treturning: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\t_type: unknown;\n}\n\nexport interface SQLiteUpdateQueryBuilderHKT extends SQLiteUpdateHKTBase {\n\t_type: SQLiteUpdateBase<\n\t\tSQLiteUpdateQueryBuilderHKT,\n\t\tAssume<this['table'], SQLiteTable>,\n\t\tthis['runResult'],\n\t\tAssume<this['from'], SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined>,\n\t\tthis['returning'],\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods']\n\t>;\n}\n\nexport type SQLiteUpdateKind<\n\tT extends SQLiteUpdateHKTBase,\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> = (T & {\n\ttable: TTable;\n\trunResult: TRunResult;\n\tfrom: TFrom;\n\treturning: TReturning;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n\tresult: TReturning extends undefined ? TRunResult : TReturning[];\n})['_type'];\n\nexport type SQLiteUpdateWithout<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type SQLiteUpdateWithJoins<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\n\t\tT['_']['runResult'],\n\t\tTFrom,\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n\t>,\n\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n>;\n\nexport type SQLiteUpdateReturningAll<T extends AnySQLiteUpdate, TDynamic extends boolean> = SQLiteUpdateWithout<\n\tSQLiteUpdateKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateReturning<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFields,\n> = SQLiteUpdateWithout<\n\tSQLiteUpdateKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateJoinFn<\n\tT extends AnySQLiteUpdate,\n> = <\n\tTJoinedTable extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n>(\n\ttable: TJoinedTable,\n\ton:\n\t\t| (\n\t\t\t(\n\t\t\t\tupdateTable: T['_']['table']['_']['columns'],\n\t\t\t\tfrom: T['_']['from'] extends SQLiteTable ? T['_']['from']['_']['columns']\n\t\t\t\t\t: T['_']['from'] extends Subquery | SQLiteViewBase ? T['_']['from']['_']['selectedFields']\n\t\t\t\t\t: never,\n\t\t\t) => SQL | undefined\n\t\t)\n\t\t| SQL\n\t\t| undefined,\n) => T;\n\nexport type SQLiteUpdateDynamic<T extends AnySQLiteUpdate> = SQLiteUpdateKind<\n\tT['_']['hkt'],\n\tT['_']['table'],\n\tT['_']['runResult'],\n\tT['_']['from'],\n\tT['_']['returning'],\n\ttrue,\n\tnever\n>;\n\nexport type SQLiteUpdate<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTRunResult = any,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = SQLiteUpdateBase<SQLiteUpdateQueryBuilderHKT, TTable, TRunResult, TFrom, TReturning, true, never>;\n\nexport type AnySQLiteUpdate = SQLiteUpdateBase<any, any, any, any, any, any, any>;\n\nexport interface SQLiteUpdateBase<\n\tTHKT extends SQLiteUpdateHKTBase,\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends SQLWrapper {\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly table: TTable;\n\t\treadonly runResult: TRunResult;\n\t\treadonly from: TFrom;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteUpdateBase<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTHKT extends SQLiteUpdateHKTBase,\n\tTTable extends SQLiteTable = SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTReturning = 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 = 'SQLiteUpdate';\n\n\t/** @internal */\n\tconfig: SQLiteUpdateConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprotected session: SQLiteSession<any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tthis.config = { set, table, withList, joins: [] };\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): SQLiteUpdateWithJoins<this, TDynamic, TFrom> {\n\t\tthis.config.from = source;\n\t\treturn this as any;\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): SQLiteUpdateJoinFn<this> {\n\t\treturn ((\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton: ((updateTable: TTable, from: TFrom) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\tconst from = this.config.from\n\t\t\t\t\t? is(table, SQLiteTable)\n\t\t\t\t\t\t? table[Table.Symbol.Columns]\n\t\t\t\t\t\t: is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: undefined\n\t\t\t\t\t: undefined;\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t\tfrom && new Proxy(\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\tleftJoin = this.createJoin('left');\n\n\trightJoin = this.createJoin('right');\n\n\tinnerJoin = this.createJoin('inner');\n\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'));\n\t * // or\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * db.update(cars).set({ color: 'red' })\n\t *   .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteUpdateWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Update all cars with the green color and return all fields\n\t * const updatedCars: Car[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning();\n\t *\n\t * // Update all cars with the green color and return only their id and brand fields\n\t * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.color, 'green'))\n\t *   .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteUpdateReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFields>(\n\t\tfields: TSelectedFields,\n\t): SQLiteUpdateReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFields = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteUpdateWithout<AnySQLiteUpdate, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this.dialect.sqlToQuery(this.getSQL());\n\t}\n\n\t$dynamic(): SQLiteUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n"],"mappings":";;;;;;;;;;;;AA2DA,IAAa,sBAAb,MAIE;CACD,QAAiBA,0BAAsB;CAMvC,YACC,AAAU,OACV,AAAU,SACV,AAAU,SACV,AAAQ,UACR,AAAQ,UAA0C,kBACjD;EALS;EACA;EACA;EACF;EACA;;CAGT,IACC,QAKC;AACD,SAAO,IAAI,KAAK,QACf,KAAK,oCACQ,KAAK,OAAO,OAAO,EAChC,KAAK,SACL,KAAK,SACL,KAAK,SACL;;;AA4KH,IAAa,mBAAb,MAYwB;CACvB,QAAiBA,0BAAsB;;CAGvC;CAEA,YACC,OACA,KACA,AAAU,SACV,AAAU,SACV,UACC;EAHS;EACA;AAGV,OAAK,SAAS;GAAE;GAAK;GAAO;GAAU,OAAO,EAAE;GAAE;;CAGlD,KACC,QAC+C;AAC/C,OAAK,OAAO,OAAO;AACnB,SAAO;;CAGR,AAAQ,WACP,UAC2B;AAC3B,WACC,OACA,OACI;GACJ,MAAM,6CAA6B,MAAM;AAEzC,OAAI,OAAO,cAAc,YAAY,KAAK,OAAO,MAAM,MAAM,SAAS,KAAK,UAAU,UAAU,CAC9F,OAAM,IAAI,MAAM,UAAU,UAAU,iCAAiC;AAGtE,OAAI,OAAO,OAAO,YAAY;IAC7B,MAAM,OAAO,KAAK,OAAO,2BACnB,OAAOC,mCAAY,GACrB,MAAMC,iBAAM,OAAO,+BAChB,OAAOC,uBAAS,GACnB,MAAM,EAAE,qCACL,OAAOC,6CAAe,GACzB,MAAMC,iCAAgB,iBACtB,SACD;AACH,SAAK,GACJ,IAAI,MACH,KAAK,OAAO,MAAMH,iBAAM,OAAO,UAC/B,IAAII,2CAAsB;KAAE,oBAAoB;KAAO,aAAa;KAAO,CAAC,CAC5E,EACD,QAAQ,IAAI,MACX,MACA,IAAIA,2CAAsB;KAAE,oBAAoB;KAAO,aAAa;KAAO,CAAC,CAC5E,CACD;;AAGF,QAAK,OAAO,MAAM,KAAK;IAAE;IAAI;IAAO;IAAU,OAAO;IAAW,CAAC;AAEjE,UAAO;;;CAIT,WAAW,KAAK,WAAW,OAAO;CAElC,YAAY,KAAK,WAAW,QAAQ;CAEpC,YAAY,KAAK,WAAW,QAAQ;CAEpC,WAAW,KAAK,WAAW,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmClC,MAAM,OAAsE;AAC3E,OAAK,OAAO,QAAQ;AACpB,SAAO;;CAOR,QACC,GAAG,SAG8C;AACjD,MAAI,OAAO,QAAQ,OAAO,YAAY;GACrC,MAAM,UAAU,QAAQ,GACvB,IAAI,MACH,KAAK,OAAO,MAAMJ,iBAAM,OAAO,UAC/B,IAAII,2CAAsB;IAAE,oBAAoB;IAAS,aAAa;IAAO,CAAC,CAC9E,CACD;GAED,MAAM,eAAe,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ;AACjE,QAAK,OAAO,UAAU;SAChB;GACN,MAAM,eAAe;AACrB,QAAK,OAAO,UAAU;;AAEvB,SAAO;;CAGR,MAAM,OAA2E;AAChF,OAAK,OAAO,QAAQ;AACpB,SAAO;;CA6BR,UACC,SAAyB,KAAK,OAAO,MAAML,mCAAY,OAAO,UACA;AAC9D,OAAK,OAAO,gDAA8C,OAAO;AACjE,SAAO;;CAGR,SAAc;AACb,SAAO,KAAK,QAAQ,iBAAiB,KAAK,OAAO;;CAGlD,QAAe;AACd,SAAO,KAAK,QAAQ,WAAW,KAAK,QAAQ,CAAC;;CAG9C,WAAsC;AACrC,SAAO"}