{"version":3,"file":"integer.cjs","names":["SQLiteColumnBuilder","entityKind","SQLiteColumn"],"sources":["../../../src/sqlite-core/columns/integer.ts"],"sourcesContent":["import type { ColumnBuilderBaseConfig, ColumnType, HasDefault, IsPrimaryKey, NotNull } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { OnConflict } from '~/sqlite-core/utils.ts';\nimport { type Equal, getColumnNameAndConfig, type Or } from '~/utils.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport interface PrimaryKeyConfig {\n\tautoIncrement?: boolean;\n\tonConflict?: OnConflict;\n}\n\nexport abstract class SQLiteBaseIntegerBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumnBuilder<\n\tT,\n\tTRuntimeConfig & { autoIncrement: boolean },\n\t{ primaryKeyHasDefault: true }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseIntegerBuilder';\n\n\tconstructor(name: string, dataType: T['dataType'], columnType: string) {\n\t\tsuper(name, dataType, columnType);\n\t\tthis.config.autoIncrement = false;\n\t}\n\n\toverride primaryKey(config?: PrimaryKeyConfig): IsPrimaryKey<HasDefault<NotNull<this>>> {\n\t\tif (config?.autoIncrement) {\n\t\t\tthis.config.autoIncrement = true;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\treturn super.primaryKey() as IsPrimaryKey<HasDefault<NotNull<this>>>;\n\t}\n}\n\nexport abstract class SQLiteBaseInteger<\n\tT extends ColumnBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumn<T, TRuntimeConfig & { autoIncrement: boolean }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseInteger';\n\n\treadonly autoIncrement: boolean = this.config.autoIncrement;\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n}\n\nexport class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'number int53';\n\tdata: number;\n\tdriverParam: number;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteIntegerBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int53', 'SQLiteInteger');\n\t}\n\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteInteger(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteInteger<T extends ColumnBaseConfig<'number int53'>> extends SQLiteBaseInteger<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteInteger';\n}\n\nexport class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'object date';\n\tdata: Date;\n\tdriverParam: number;\n}, { mode: 'timestamp' | 'timestamp_ms' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestampBuilder';\n\n\tconstructor(name: string, mode: 'timestamp' | 'timestamp_ms') {\n\t\tsuper(name, 'object date', 'SQLiteTimestamp');\n\t\tthis.config.mode = mode;\n\t}\n\n\t/**\n\t * @deprecated Use `default()` with your own expression instead.\n\t *\n\t * Adds `DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer))` to the column, which is the current epoch timestamp in milliseconds.\n\t */\n\tdefaultNow(): HasDefault<this> {\n\t\treturn this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`) as any;\n\t}\n\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteTimestamp(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteTimestamp<T extends ColumnBaseConfig<'object date'>>\n\textends SQLiteBaseInteger<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestamp';\n\n\treadonly mode: 'timestamp' | 'timestamp_ms' = this.config.mode;\n\n\toverride mapFromDriverValue = (value: number | string): Date => {\n\t\t// legacy issue if integer had string date format\n\t\t// old kit generated defaults as quoted strings \"<string>\"\n\t\tif (typeof value === 'string') return new Date(value.replaceAll('\"', ''));\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn new Date(value * 1000);\n\t\t}\n\t\treturn new Date(value);\n\t};\n\n\toverride mapToDriverValue = (value: Date | number): number => {\n\t\tif (typeof value === 'number') return value;\n\t\tconst unix = value.getTime();\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn Math.floor(unix / 1000);\n\t\t}\n\t\treturn unix;\n\t};\n}\n\nexport class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'boolean';\n\tdata: boolean;\n\tdriverParam: number;\n}, { mode: 'boolean' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBooleanBuilder';\n\n\tconstructor(name: string, mode: 'boolean') {\n\t\tsuper(name, 'boolean', 'SQLiteBoolean');\n\t\tthis.config.mode = mode;\n\t}\n\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBoolean(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteBoolean<T extends ColumnBaseConfig<'boolean'>> extends SQLiteBaseInteger<T, { mode: 'boolean' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBoolean';\n\n\treadonly mode: 'boolean' = this.config.mode;\n\n\toverride mapFromDriverValue = (value: number): boolean => {\n\t\treturn Number(value) === 1;\n\t};\n\n\toverride mapToDriverValue = (value: boolean): number => {\n\t\treturn value ? 1 : 0;\n\t};\n}\n\nexport interface IntegerConfig<\n\tTMode extends 'number' | 'timestamp' | 'timestamp_ms' | 'boolean' =\n\t\t| 'number'\n\t\t| 'timestamp'\n\t\t| 'timestamp_ms'\n\t\t| 'boolean',\n> {\n\tmode: TMode;\n}\n\nexport function integer<TMode extends IntegerConfig['mode']>(\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilder\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilder\n\t: SQLiteIntegerBuilder;\nexport function integer<TMode extends IntegerConfig['mode']>(\n\tname: string,\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilder\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilder\n\t: SQLiteIntegerBuilder;\nexport function integer(a?: string | IntegerConfig, b?: IntegerConfig) {\n\tconst { name, config } = getColumnNameAndConfig<IntegerConfig | undefined>(a, b);\n\tif (config?.mode === 'timestamp' || config?.mode === 'timestamp_ms') {\n\t\treturn new SQLiteTimestampBuilder(name, config.mode);\n\t}\n\tif (config?.mode === 'boolean') {\n\t\treturn new SQLiteBooleanBuilder(name, config.mode);\n\t}\n\treturn new SQLiteIntegerBuilder(name);\n}\n\nexport const int = integer;\n"],"mappings":";;;;;;;;AAcA,IAAsB,2BAAtB,cAGUA,uDAIR;CACD,QAA0BC,0BAAsB;CAEhD,YAAY,MAAc,UAAyB,YAAoB;AACtE,QAAM,MAAM,UAAU,WAAW;AACjC,OAAK,OAAO,gBAAgB;;CAG7B,AAAS,WAAW,QAAoE;AACvF,MAAI,QAAQ,cACX,MAAK,OAAO,gBAAgB;AAE7B,OAAK,OAAO,aAAa;AACzB,SAAO,MAAM,YAAY;;;AAI3B,IAAsB,oBAAtB,cAGUC,gDAA6D;CACtE,QAA0BD,0BAAsB;CAEhD,AAAS,gBAAyB,KAAK,OAAO;CAE9C,aAAqB;AACpB,SAAO;;;AAIT,IAAa,uBAAb,cAA0C,yBAIvC;CACF,QAA0BA,0BAAsB;CAEhD,YAAY,MAAc;AACzB,QAAM,MAAM,gBAAgB,gBAAgB;;CAG7C,AAAS,MAAM,OAAoB;AAClC,SAAO,IAAI,cACV,OACA,KAAK,OACL;;;AAIH,IAAa,gBAAb,cAA+E,kBAAqB;CACnG,QAA0BA,0BAAsB;;AAGjD,IAAa,yBAAb,cAA4C,yBAID;CAC1C,QAA0BA,0BAAsB;CAEhD,YAAY,MAAc,MAAoC;AAC7D,QAAM,MAAM,eAAe,kBAAkB;AAC7C,OAAK,OAAO,OAAO;;;;;;;CAQpB,aAA+B;AAC9B,SAAO,KAAK,QAAQ,gBAAG,6DAA6D;;CAGrF,AAAS,MAAM,OAAoB;AAClC,SAAO,IAAI,gBACV,OACA,KAAK,OACL;;;AAIH,IAAa,kBAAb,cACS,kBACT;CACC,QAA0BA,0BAAsB;CAEhD,AAAS,OAAqC,KAAK,OAAO;CAE1D,AAAS,sBAAsB,UAAiC;AAG/D,MAAI,OAAO,UAAU,SAAU,QAAO,IAAI,KAAK,MAAM,WAAW,MAAK,GAAG,CAAC;AACzE,MAAI,KAAK,OAAO,SAAS,YACxB,wBAAO,IAAI,KAAK,QAAQ,IAAK;AAE9B,SAAO,IAAI,KAAK,MAAM;;CAGvB,AAAS,oBAAoB,UAAiC;AAC7D,MAAI,OAAO,UAAU,SAAU,QAAO;EACtC,MAAM,OAAO,MAAM,SAAS;AAC5B,MAAI,KAAK,OAAO,SAAS,YACxB,QAAO,KAAK,MAAM,OAAO,IAAK;AAE/B,SAAO;;;AAIT,IAAa,uBAAb,cAA0C,yBAIlB;CACvB,QAA0BA,0BAAsB;CAEhD,YAAY,MAAc,MAAiB;AAC1C,QAAM,MAAM,WAAW,gBAAgB;AACvC,OAAK,OAAO,OAAO;;CAGpB,AAAS,MAAM,OAAoB;AAClC,SAAO,IAAI,cACV,OACA,KAAK,OACL;;;AAIH,IAAa,gBAAb,cAA0E,kBAA0C;CACnH,QAA0BA,0BAAsB;CAEhD,AAAS,OAAkB,KAAK,OAAO;CAEvC,AAAS,sBAAsB,UAA2B;AACzD,SAAO,OAAO,MAAM,KAAK;;CAG1B,AAAS,oBAAoB,UAA2B;AACvD,SAAO,QAAQ,IAAI;;;AAyBrB,SAAgB,QAAQ,GAA4B,GAAmB;CACtE,MAAM,EAAE,MAAM,kDAA6D,GAAG,EAAE;AAChF,KAAI,QAAQ,SAAS,eAAe,QAAQ,SAAS,eACpD,QAAO,IAAI,uBAAuB,MAAM,OAAO,KAAK;AAErD,KAAI,QAAQ,SAAS,UACpB,QAAO,IAAI,qBAAqB,MAAM,OAAO,KAAK;AAEnD,QAAO,IAAI,qBAAqB,KAAK;;AAGtC,MAAa,MAAM"}