{"version":3,"file":"view.cjs","names":["entityKind","QueryBuilder","SelectionProxyHandler","sqliteTableBase","SQLiteViewBase"],"sources":["../../src/sqlite-core/view.ts"],"sourcesContent":["import type { Casing } from '~/casing.ts';\nimport type { BuildColumns, ColumnBuilderBase } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AddAliasToSelection } from '~/query-builders/select.types.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport { getTableColumns } from '~/utils.ts';\nimport type { SQLiteColumn } from './columns/common.ts';\nimport { QueryBuilder } from './query-builders/query-builder.ts';\nimport { sqliteTableBase } from './table.ts';\nimport { SQLiteViewBase } from './view-base.ts';\n\nexport interface ViewBuilderConfig {\n\talgorithm?: 'undefined' | 'merge' | 'temptable';\n\tdefiner?: string;\n\tsqlSecurity?: 'definer' | 'invoker';\n\twithCheckOption?: 'cascaded' | 'local';\n}\n\nexport class ViewBuilderCore<\n\tTConfig extends { name: string; columns?: unknown },\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteViewBuilderCore';\n\n\tdeclare readonly _: {\n\t\treadonly name: TConfig['name'];\n\t\treadonly columns: TConfig['columns'];\n\t};\n\n\tconstructor(\n\t\tprotected name: TConfig['name'],\n\t) {}\n\n\tprotected config: ViewBuilderConfig = {};\n}\n\nexport class ViewBuilder<TName extends string = string> extends ViewBuilderCore<{ name: TName }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteViewBuilder';\n\n\tas<TSelection extends ColumnsSelection>(\n\t\tqb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>),\n\t): SQLiteViewWithSelection<TName, false, AddAliasToSelection<TSelection, TName, 'sqlite'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelection>({\n\t\t\talias: this.name,\n\t\t\tsqlBehavior: 'error',\n\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\treplaceOriginalName: true,\n\t\t});\n\t\t// const aliasedSelectedFields = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\tconst aliasedSelectedFields = qb.getSelectedFields();\n\t\treturn new Proxy(\n\t\t\tnew SQLiteView({\n\t\t\t\t// sqliteConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: undefined,\n\t\t\t\t\tselectedFields: aliasedSelectedFields,\n\t\t\t\t\tquery: qb.getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as SQLiteViewWithSelection<TName, false, AddAliasToSelection<TSelection, TName, 'sqlite'>>;\n\t}\n}\n\nexport class ManualViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, ColumnBuilderBase> = Record<string, ColumnBuilderBase>,\n> extends ViewBuilderCore<\n\t{ name: TName; columns: TColumns }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteManualViewBuilder';\n\n\tprivate columns: Record<string, SQLiteColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t\tcasing: Casing | undefined,\n\t) {\n\t\tsuper(name);\n\t\tthis.columns = getTableColumns(sqliteTableBase(name, columns, undefined, undefined, casing)) as BuildColumns<\n\t\t\tTName,\n\t\t\tTColumns,\n\t\t\t'sqlite'\n\t\t>;\n\t}\n\n\texisting(): SQLiteViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'sqlite'>> {\n\t\treturn new Proxy(\n\t\t\tnew SQLiteView({\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: undefined,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: undefined,\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as SQLiteViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'sqlite'>>;\n\t}\n\n\tas(query: SQL): SQLiteViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'sqlite'>> {\n\t\treturn new Proxy(\n\t\t\tnew SQLiteView({\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: undefined,\n\t\t\t\t\tselectedFields: this.columns,\n\t\t\t\t\tquery: query.inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew SelectionProxyHandler({\n\t\t\t\talias: this.name,\n\t\t\t\tsqlBehavior: 'error',\n\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\treplaceOriginalName: true,\n\t\t\t}),\n\t\t) as SQLiteViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'sqlite'>>;\n\t}\n}\n\nexport class SQLiteView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> extends SQLiteViewBase<TName, TExisting, TSelection> {\n\tstatic override readonly [entityKind]: string = 'SQLiteView';\n\n\tconstructor({ config }: {\n\t\tconfig: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t};\n\t}) {\n\t\tsuper(config);\n\t}\n}\n\nexport type SQLiteViewWithSelection<\n\tTName extends string,\n\tTExisting extends boolean,\n\tTSelection extends ColumnsSelection,\n> = SQLiteView<TName, TExisting, TSelection> & TSelection;\n\nexport interface SQLiteViewFn {\n\t<TName extends string>(name: TName): ViewBuilder<TName>;\n\t<TName extends string, TColumns extends Record<string, ColumnBuilderBase>>(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t): ManualViewBuilder<TName, TColumns>;\n}\n\n/** @internal */\nexport function sqliteViewWithCasing(casing: Casing | undefined): SQLiteViewFn {\n\treturn ((name, columns) => {\n\t\tif (columns) {\n\t\t\treturn new ManualViewBuilder(name, columns, casing);\n\t\t}\n\t\treturn new ViewBuilder(name);\n\t}) as SQLiteViewFn;\n}\n\nexport const sqliteView = sqliteViewWithCasing(undefined);\nexport const view = sqliteView;\n"],"mappings":";;;;;;;;;;AAoBA,IAAa,kBAAb,MAEE;CACD,QAAiBA,0BAAsB;CAOvC,YACC,AAAU,MACT;EADS;;CAGX,AAAU,SAA4B,EAAE;;AAGzC,IAAa,cAAb,cAAgE,gBAAiC;CAChG,QAA0BA,0BAAsB;CAEhD,GACC,IAC0F;AAC1F,MAAI,OAAO,OAAO,WACjB,MAAK,GAAG,IAAIC,+DAAc,CAAC;EAE5B,MAAM,iBAAiB,IAAIC,2CAAkC;GAC5D,OAAO,KAAK;GACZ,aAAa;GACb,oBAAoB;GACpB,qBAAqB;GACrB,CAAC;EAEF,MAAM,wBAAwB,GAAG,mBAAmB;AACpD,SAAO,IAAI,MACV,IAAI,WAAW,EAEd,QAAQ;GACP,MAAM,KAAK;GACX,QAAQ;GACR,gBAAgB;GAChB,OAAO,GAAG,QAAQ,CAAC,cAAc;GACjC,EACD,CAAC,EACF,eACA;;;AAIH,IAAa,oBAAb,cAGU,gBAER;CACD,QAA0BF,0BAAsB;CAEhD,AAAQ;CAER,YACC,MACA,SACA,QACC;AACD,QAAM,KAAK;AACX,OAAK,0CAA0BG,0CAAgB,MAAM,SAAS,QAAW,QAAW,OAAO,CAAC;;CAO7F,WAA0F;AACzF,SAAO,IAAI,MACV,IAAI,WAAW,EACd,QAAQ;GACP,MAAM,KAAK;GACX,QAAQ;GACR,gBAAgB,KAAK;GACrB,OAAO;GACP,EACD,CAAC,EACF,IAAID,2CAAsB;GACzB,OAAO,KAAK;GACZ,aAAa;GACb,oBAAoB;GACpB,qBAAqB;GACrB,CAAC,CACF;;CAGF,GAAG,OAA4F;AAC9F,SAAO,IAAI,MACV,IAAI,WAAW,EACd,QAAQ;GACP,MAAM,KAAK;GACX,QAAQ;GACR,gBAAgB,KAAK;GACrB,OAAO,MAAM,cAAc;GAC3B,EACD,CAAC,EACF,IAAIA,2CAAsB;GACzB,OAAO,KAAK;GACZ,aAAa;GACb,oBAAoB;GACpB,qBAAqB;GACrB,CAAC,CACF;;;AAIH,IAAa,aAAb,cAIUE,6CAA6C;CACtD,QAA0BJ,0BAAsB;CAEhD,YAAY,EAAE,UAOX;AACF,QAAM,OAAO;;;;AAmBf,SAAgB,qBAAqB,QAA0C;AAC9E,UAAS,MAAM,YAAY;AAC1B,MAAI,QACH,QAAO,IAAI,kBAAkB,MAAM,SAAS,OAAO;AAEpD,SAAO,IAAI,YAAY,KAAK;;;AAI9B,MAAa,aAAa,qBAAqB,OAAU;AACzD,MAAa,OAAO"}