{"version":3,"file":"common.cjs","names":["ColumnBuilder","entityKind","ForeignKeyBuilder","Column","parseCockroachArray","makeCockroachArray"],"sources":["../../../src/cockroach-core/columns/common.ts"],"sourcesContent":["import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnType,\n\tHasGenerated,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Update } from '~/utils.ts';\n\nimport type { ForeignKey, UpdateDeleteAction } from '~/cockroach-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/cockroach-core/foreign-keys.ts';\nimport type { AnyCockroachTable, CockroachTable } from '~/cockroach-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport { makeCockroachArray, parseCockroachArray } from '../utils/array.ts';\n\nexport type CockroachColumns = Record<string, CockroachColumn<any>>;\n\nexport interface ReferenceConfig {\n\tref: () => CockroachColumn;\n\tconfig: {\n\t\tname?: string;\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\nexport abstract class CockroachColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnType> = ColumnBuilderBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n> extends ColumnBuilder<T, TRuntimeConfig> {\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tstatic override readonly [entityKind]: string = 'CockroachColumnBuilder';\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tconfig: ReferenceConfig['config'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, config });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | (() => SQL)): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as HasGenerated<this, {\n\t\t\ttype: 'always';\n\t\t}>;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: CockroachColumn, table: CockroachTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, config }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, config) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { name: config.name, columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (config.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(config.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (config.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(config.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tconfig,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build(table: CockroachTable): CockroachColumn<any>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyCockroachTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, this.config);\n\t}\n}\n\nexport abstract class CockroachColumnWithArrayBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnType> = ColumnBuilderBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n> extends CockroachColumnBuilder<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'CockroachColumnWithArrayBuilder';\n\tarray<TSize extends number | undefined = undefined>(size?: TSize): Omit<\n\t\tCockroachArrayBuilder<\n\t\t\t& {\n\t\t\t\tname: string;\n\t\t\t\tdataType: 'array basecolumn';\n\t\t\t\tdata: T['data'][];\n\t\t\t\tdriverParam: T['driverParam'][] | string;\n\t\t\t\tbaseBuilder: T;\n\t\t\t}\n\t\t\t& (T extends { notNull: true } ? { notNull: true } : {})\n\t\t\t& (T extends { hasDefault: true } ? { hasDefault: true } : {}),\n\t\t\tT\n\t\t>,\n\t\t'array'\n\t> {\n\t\treturn new CockroachArrayBuilder(\n\t\t\tthis.config.name,\n\t\t\tthis as CockroachColumnWithArrayBuilder<any, any>,\n\t\t\tsize as any,\n\t\t) as any; // size as any\n\t}\n}\n\n// To understand how to use `CockroachColumn` and `AnyCockroachColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class CockroachColumn<\n\tT extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = {},\n> extends Column<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'CockroachColumn';\n\n\t/** @internal */\n\toverride readonly table: CockroachTable;\n\n\tconstructor(\n\t\ttable: CockroachTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,\n\t) {\n\t\tsuper(table, config);\n\t\tthis.table = table;\n\t}\n\n\t/** @internal */\n\toverride shouldDisableInsert(): boolean {\n\t\treturn (this.config.generatedIdentity !== undefined && this.config.generatedIdentity.type === 'always')\n\t\t\t|| (this.config.generated !== undefined && this.config.generated.type !== 'byDefault');\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc' };\n\nexport class ExtraConfigColumn<\n\tT extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n> extends CockroachColumn<T, IndexedExtraConfigType> {\n\tstatic override readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string,\n\t\tkeyAsName: boolean,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.keyAsName = keyAsName;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string;\n\tkeyAsName: boolean;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyCockroachColumn<TPartial extends Partial<ColumnBaseConfig<ColumnType>> = {}> = CockroachColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnType>, TPartial>>\n>;\n\nexport type CockroachArrayColumnBuilderBaseConfig = ColumnBuilderBaseConfig<'array basecolumn'> & {\n\tbaseBuilder: ColumnBuilderBaseConfig<ColumnType>;\n};\n\nexport class CockroachArrayBuilder<\n\tT extends CockroachArrayColumnBuilderBaseConfig,\n\tTBase extends ColumnBuilderBaseConfig<ColumnType> | CockroachArrayColumnBuilderBaseConfig,\n> extends CockroachColumnWithArrayBuilder<\n\tT & {\n\t\tbaseBuilder: TBase extends CockroachArrayColumnBuilderBaseConfig ? CockroachArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: CockroachColumnWithArrayBuilder<TBase, {}>;\n\t},\n\t{\n\t\tbaseBuilder: TBase extends CockroachArrayColumnBuilderBaseConfig ? CockroachArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: CockroachColumnWithArrayBuilder<TBase, {}>;\n\t\tlength: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'CockroachArrayBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\t// CockroachArrayBuilder<T, TBase>['config']['baseBuilder'] - removed - 'config' is internal property, do not reference directly in types\n\t\tbaseBuilder: TBase extends CockroachArrayColumnBuilderBaseConfig ? CockroachArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends {\n\t\t\t\t\tbaseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any>;\n\t\t\t\t} ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: CockroachColumnWithArrayBuilder<TBase, {}>,\n\t\tlength: number | undefined,\n\t) {\n\t\tsuper(name, 'array basecolumn', 'CockroachArray');\n\t\tthis.config.baseBuilder = baseBuilder;\n\t\tthis.config.length = length;\n\t}\n\n\t/** @internal */\n\toverride build(table: CockroachTable) {\n\t\tconst baseColumn: any = this.config.baseBuilder.build(table);\n\t\treturn new CockroachArray(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t\tbaseColumn,\n\t\t);\n\t}\n}\n\nexport class CockroachArray<\n\tT extends ColumnBaseConfig<'array basecolumn'> & {\n\t\tlength: number | undefined;\n\t\tbaseBuilder: ColumnBuilderBaseConfig<ColumnType>;\n\t},\n\tTBase extends ColumnBuilderBaseConfig<ColumnType>,\n> extends CockroachColumn<T, {}> {\n\tstatic override readonly [entityKind]: string = 'CockroachArray';\n\n\tconstructor(\n\t\ttable: CockroachTable<any>,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & {\n\t\t\tbaseBuilder: TBase extends CockroachArrayColumnBuilderBaseConfig ? CockroachArrayBuilder<\n\t\t\t\t\tTBase,\n\t\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any> } ? TBaseBuilder\n\t\t\t\t\t\t: never\n\t\t\t\t>\n\t\t\t\t: CockroachColumnWithArrayBuilder<TBase, {}>;\n\t\t\tlength: number | undefined;\n\t\t},\n\t\treadonly baseColumn: CockroachColumn,\n\t\treadonly range?: [number | undefined, number | undefined],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `${this.baseColumn.getSQLType()}[${typeof this.length === 'number' ? this.length : ''}]`;\n\t}\n\n\toverride mapFromDriverValue = (value: unknown[] | string): T['data'] => {\n\t\tif (typeof value === 'string') {\n\t\t\tvalue = parseCockroachArray(value);\n\t\t}\n\t\treturn value.map((v) => this.baseColumn.mapFromDriverValue(v));\n\t};\n\n\t// Needed for arrays of custom types\n\tmapFromJsonValue(value: unknown[] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\t// Thank you node-postgres for not parsing enum arrays\n\t\t\tvalue = parseCockroachArray(value);\n\t\t}\n\n\t\tconst base = this.baseColumn;\n\n\t\treturn 'mapFromJsonValue' in base\n\t\t\t? value.map((v) => (<(value: unknown) => unknown> base.mapFromJsonValue)(v))\n\t\t\t: value.map((v) => base.mapFromDriverValue(v));\n\t}\n\n\toverride mapToDriverValue = (value: unknown[], isNestedArray = false): unknown[] | string => {\n\t\tconst a = value.map((v) =>\n\t\t\tv === null\n\t\t\t\t? null\n\t\t\t\t: is(this.baseColumn, CockroachArray)\n\t\t\t\t? this.baseColumn.mapToDriverValue(v as unknown[], true)\n\t\t\t\t: this.baseColumn.mapToDriverValue(v)\n\t\t);\n\t\tif (isNestedArray) return a;\n\t\treturn makeCockroachArray(a);\n\t};\n}\n"],"mappings":";;;;;;;;;;AA6BA,IAAsB,yBAAtB,cAGUA,kCAAiC;CAC1C,AAAQ,oBAAuC,EAAE;CAEjD,QAA0BC,0BAAsB;CAEhD,WACC,KACA,SAAoC,EAAE,EAC/B;AACP,OAAK,kBAAkB,KAAK;GAAE;GAAK;GAAQ,CAAC;AAC5C,SAAO;;CAGR,OACC,MACO;AACP,OAAK,OAAO,WAAW;AACvB,OAAK,OAAO,aAAa;AACzB,SAAO;;CAGR,kBAAkB,IAEf;AACF,OAAK,OAAO,YAAY;GACvB;GACA,MAAM;GACN,MAAM;GACN;AACD,SAAO;;;CAMR,iBAAiB,QAAyB,OAAqC;AAC9E,SAAO,KAAK,kBAAkB,KAAK,EAAE,KAAK,aAAa;AACtD,wCACE,KAAK,WAAW;IAChB,MAAM,UAAU,IAAIC,yDAAwB;KAC3C,MAAM,gBAAgB,KAAK;AAC3B,YAAO;MAAE,MAAM,OAAO;MAAM,SAAS,CAAC,OAAO;MAAE,gBAAgB,CAAC,cAAc;MAAE;MAC/E;AACF,QAAI,OAAO,SACV,SAAQ,SAAS,OAAO,SAAS;AAElC,QAAI,OAAO,SACV,SAAQ,SAAS,OAAO,SAAS;AAElC,WAAO,QAAQ,MAAM,MAAM;MAE5B,KACA,OACA;IACA;;;CAOH,uBACC,OACoB;AACpB,SAAO,IAAI,kBAAkB,OAAO,KAAK,OAAO;;;AAIlD,IAAsB,kCAAtB,cAGU,uBAA0C;CACnD,QAA0BD,0BAAsB;CAChD,MAAoD,MAclD;AACD,SAAO,IAAI,sBACV,KAAK,OAAO,MACZ,MACA,KACA;;;AAKH,IAAsB,kBAAtB,cAGUE,mBAA0B;CACnC,QAA0BF,0BAAsB;;CAGhD,AAAkB;CAElB,YACC,OACA,QACC;AACD,QAAM,OAAO,OAAO;AACpB,OAAK,QAAQ;;;CAId,AAAS,sBAA+B;AACvC,SAAQ,KAAK,OAAO,sBAAsB,UAAa,KAAK,OAAO,kBAAkB,SAAS,YACzF,KAAK,OAAO,cAAc,UAAa,KAAK,OAAO,UAAU,SAAS;;;AAM7E,IAAa,oBAAb,cAEU,gBAA2C;CACpD,QAA0BA,0BAAsB;CAEhD,AAAS,aAAqB;AAC7B,SAAO,KAAK,YAAY;;CAGzB,cAAsC,EACrC,OAAO,KAAK,OAAO,SAAS,OAC5B;CACD,gBAAwC,EACvC,OAAO,OACP;CAED,MAAkC;AACjC,OAAK,YAAY,QAAQ;AACzB,SAAO;;CAGR,OAAmC;AAClC,OAAK,YAAY,QAAQ;AACzB,SAAO;;;AAIT,IAAa,gBAAb,MAA2B;CAC1B,QAAiBA,0BAAsB;CACvC,YACC,MACA,WACA,MACA,aACC;AACD,OAAK,OAAO;AACZ,OAAK,YAAY;AACjB,OAAK,OAAO;AACZ,OAAK,cAAc;;CAGpB;CACA;CACA;CACA;;AAWD,IAAa,wBAAb,cAGU,gCAkBR;CACD,QAA0BA,0BAAsB;CAEhD,YACC,MAEA,aAQA,QACC;AACD,QAAM,MAAM,oBAAoB,iBAAiB;AACjD,OAAK,OAAO,cAAc;AAC1B,OAAK,OAAO,SAAS;;;CAItB,AAAS,MAAM,OAAuB;EACrC,MAAM,aAAkB,KAAK,OAAO,YAAY,MAAM,MAAM;AAC5D,SAAO,IAAI,eACV,OACA,KAAK,QACL,WACA;;;AAIH,IAAa,iBAAb,MAAa,uBAMH,gBAAuB;CAChC,QAA0BA,0BAAsB;CAEhD,YACC,OACA,QASA,AAAS,YACT,AAAS,OACR;AACD,QAAM,OAAO,OAAO;EAHX;EACA;;CAKV,aAAqB;AACpB,SAAO,GAAG,KAAK,WAAW,YAAY,CAAC,GAAG,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,GAAG;;CAG9F,AAAS,sBAAsB,UAAyC;AACvE,MAAI,OAAO,UAAU,SACpB,SAAQG,uDAAoB,MAAM;AAEnC,SAAO,MAAM,KAAK,MAAM,KAAK,WAAW,mBAAmB,EAAE,CAAC;;CAI/D,iBAAiB,OAAsC;AACtD,MAAI,OAAO,UAAU,SAEpB,SAAQA,uDAAoB,MAAM;EAGnC,MAAM,OAAO,KAAK;AAElB,SAAO,sBAAsB,OAC1B,MAAM,KAAK,MAAqC,KAAK,iBAAkB,EAAE,CAAC,GAC1E,MAAM,KAAK,MAAM,KAAK,mBAAmB,EAAE,CAAC;;CAGhD,AAAS,oBAAoB,OAAkB,gBAAgB,UAA8B;EAC5F,MAAM,IAAI,MAAM,KAAK,MACpB,MAAM,OACH,2BACG,KAAK,YAAY,eAAe,GACnC,KAAK,WAAW,iBAAiB,GAAgB,KAAK,GACtD,KAAK,WAAW,iBAAiB,EAAE,CACtC;AACD,MAAI,cAAe,QAAO;AAC1B,SAAOC,sDAAmB,EAAE"}