{"version":3,"file":"view.cjs","names":["entityKind","QueryBuilder","SelectionProxyHandler","mysqlTableWithSchema","MySqlViewBase","MySqlViewConfig"],"sources":["../../src/mysql-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 { MySqlColumn } from './columns/index.ts';\nimport { QueryBuilder } from './query-builders/query-builder.ts';\nimport { mysqlTableWithSchema } from './table.ts';\nimport { MySqlViewBase } from './view-base.ts';\nimport { MySqlViewConfig } from './view-common.ts';\n\nexport interface ViewBuilderConfig {\n\talgorithm?: 'undefined' | 'merge' | 'temptable';\n\tsqlSecurity?: 'definer' | 'invoker';\n\twithCheckOption?: 'cascaded' | 'local';\n}\n\nexport class ViewBuilderCore<TConfig extends { name: string; columns?: unknown }> {\n\tstatic readonly [entityKind]: string = 'MySqlViewBuilder';\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\tprotected schema: string | undefined,\n\t) {}\n\n\tprotected config: ViewBuilderConfig = {};\n\n\talgorithm(\n\t\talgorithm: Exclude<ViewBuilderConfig['algorithm'], undefined>,\n\t): this {\n\t\tthis.config.algorithm = algorithm;\n\t\treturn this;\n\t}\n\n\tsqlSecurity(\n\t\tsqlSecurity: Exclude<ViewBuilderConfig['sqlSecurity'], undefined>,\n\t): this {\n\t\tthis.config.sqlSecurity = sqlSecurity;\n\t\treturn this;\n\t}\n\n\twithCheckOption(\n\t\twithCheckOption?: Exclude<ViewBuilderConfig['withCheckOption'], undefined>,\n\t): this {\n\t\tthis.config.withCheckOption = withCheckOption ?? 'cascaded';\n\t\treturn this;\n\t}\n}\n\nexport class ViewBuilder<TName extends string = string> extends ViewBuilderCore<{ name: TName }> {\n\tstatic override readonly [entityKind]: string = 'MySqlViewBuilder';\n\n\tas<TSelectedFields extends ColumnsSelection>(\n\t\tqb: TypedQueryBuilder<TSelectedFields> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelectedFields>),\n\t): MySqlViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'mysql'>> {\n\t\tif (typeof qb === 'function') {\n\t\t\tqb = qb(new QueryBuilder());\n\t\t}\n\t\tconst selectionProxy = new SelectionProxyHandler<TSelectedFields>({\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\tconst aliasedSelection = new Proxy(qb.getSelectedFields(), selectionProxy);\n\t\treturn new Proxy(\n\t\t\tnew MySqlView({\n\t\t\t\tmysqlConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\n\t\t\t\t\tselectedFields: aliasedSelection,\n\t\t\t\t\tquery: qb.withoutSelectionCastCodecs().getSQL().inlineParams(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tselectionProxy as any,\n\t\t) as MySqlViewWithSelection<TName, false, AddAliasToSelection<TSelectedFields, TName, 'mysql'>>;\n\t}\n}\n\nexport class ManualViewBuilder<\n\tTName extends string = string,\n\tTColumns extends Record<string, ColumnBuilderBase> = Record<string, ColumnBuilderBase>,\n> extends ViewBuilderCore<{ name: TName; columns: TColumns }> {\n\tstatic override readonly [entityKind]: string = 'MySqlManualViewBuilder';\n\n\tprivate columns: Record<string, MySqlColumn>;\n\n\tconstructor(\n\t\tname: TName,\n\t\tcolumns: TColumns,\n\t\tschema: string | undefined,\n\t\tcasing: Casing | undefined,\n\t) {\n\t\tsuper(name, schema);\n\t\tthis.columns = getTableColumns(mysqlTableWithSchema(name, columns, undefined, schema, casing)) as BuildColumns<\n\t\t\tTName,\n\t\t\tTColumns,\n\t\t\t'mysql'\n\t\t>;\n\t}\n\n\texisting(): MySqlViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'mysql'>> {\n\t\treturn new Proxy(\n\t\t\tnew MySqlView({\n\t\t\t\tmysqlConfig: undefined,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\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 MySqlViewWithSelection<TName, true, BuildColumns<TName, TColumns, 'mysql'>>;\n\t}\n\n\tas(query: SQL): MySqlViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'mysql'>> {\n\t\treturn new Proxy(\n\t\t\tnew MySqlView({\n\t\t\t\tmysqlConfig: this.config,\n\t\t\t\tconfig: {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tschema: this.schema,\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 MySqlViewWithSelection<TName, false, BuildColumns<TName, TColumns, 'mysql'>>;\n\t}\n}\n\nexport class MySqlView<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends MySqlViewBase<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'MySqlView';\n\n\tdeclare protected $MySqlViewBrand: 'MySqlView';\n\n\t[MySqlViewConfig]: ViewBuilderConfig | undefined;\n\n\tconstructor({ mysqlConfig, config }: {\n\t\tmysqlConfig: ViewBuilderConfig | undefined;\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\tthis[MySqlViewConfig] = mysqlConfig;\n\t}\n}\n\nexport type MySqlViewWithSelection<\n\tTName extends string,\n\tTExisting extends boolean,\n\tTSelectedFields extends ColumnsSelection,\n> = MySqlView<TName, TExisting, TSelectedFields> & TSelectedFields;\n\n/** @internal */\nexport function mysqlViewWithSchema(\n\tname: string,\n\tselection: Record<string, ColumnBuilderBase> | undefined,\n\tschema: string | undefined,\n\tcasing: Casing | undefined,\n): ViewBuilder | ManualViewBuilder {\n\tif (selection) {\n\t\treturn new ManualViewBuilder(name, selection, schema, casing);\n\t}\n\treturn new ViewBuilder(name, schema);\n}\n\nexport interface MySqlViewFn {\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 mysqlViewWithCasing(casing: Casing | undefined): MySqlViewFn {\n\treturn ((name, columns) => mysqlViewWithSchema(name, columns, undefined, casing)) as MySqlViewFn;\n}\n\nexport const mysqlView = mysqlViewWithCasing(undefined);\n"],"mappings":";;;;;;;;;;;AAoBA,IAAa,kBAAb,MAAkF;CACjF,QAAiBA,0BAAsB;CAOvC,YACC,AAAU,MACV,AAAU,QACT;EAFS;EACA;;CAGX,AAAU,SAA4B,EAAE;CAExC,UACC,WACO;AACP,OAAK,OAAO,YAAY;AACxB,SAAO;;CAGR,YACC,aACO;AACP,OAAK,OAAO,cAAc;AAC1B,SAAO;;CAGR,gBACC,iBACO;AACP,OAAK,OAAO,kBAAkB,mBAAmB;AACjD,SAAO;;;AAIT,IAAa,cAAb,cAAgE,gBAAiC;CAChG,QAA0BA,0BAAsB;CAEhD,GACC,IAC6F;AAC7F,MAAI,OAAO,OAAO,WACjB,MAAK,GAAG,IAAIC,8DAAc,CAAC;EAE5B,MAAM,iBAAiB,IAAIC,2CAAuC;GACjE,OAAO,KAAK;GACZ,aAAa;GACb,oBAAoB;GACpB,qBAAqB;GACrB,CAAC;EACF,MAAM,mBAAmB,IAAI,MAAM,GAAG,mBAAmB,EAAE,eAAe;AAC1E,SAAO,IAAI,MACV,IAAI,UAAU;GACb,aAAa,KAAK;GAClB,QAAQ;IACP,MAAM,KAAK;IACX,QAAQ,KAAK;IACb,gBAAgB;IAChB,OAAO,GAAG,4BAA4B,CAAC,QAAQ,CAAC,cAAc;IAC9D;GACD,CAAC,EACF,eACA;;;AAIH,IAAa,oBAAb,cAGU,gBAAoD;CAC7D,QAA0BF,0BAAsB;CAEhD,AAAQ;CAER,YACC,MACA,SACA,QACA,QACC;AACD,QAAM,MAAM,OAAO;AACnB,OAAK,0CAA0BG,8CAAqB,MAAM,SAAS,QAAW,QAAQ,OAAO,CAAC;;CAO/F,WAAwF;AACvF,SAAO,IAAI,MACV,IAAI,UAAU;GACb,aAAa;GACb,QAAQ;IACP,MAAM,KAAK;IACX,QAAQ,KAAK;IACb,gBAAgB,KAAK;IACrB,OAAO;IACP;GACD,CAAC,EACF,IAAID,2CAAsB;GACzB,OAAO,KAAK;GACZ,aAAa;GACb,oBAAoB;GACpB,qBAAqB;GACrB,CAAC,CACF;;CAGF,GAAG,OAA0F;AAC5F,SAAO,IAAI,MACV,IAAI,UAAU;GACb,aAAa,KAAK;GAClB,QAAQ;IACP,MAAM,KAAK;IACX,QAAQ,KAAK;IACb,gBAAgB,KAAK;IACrB,OAAO,MAAM,cAAc;IAC3B;GACD,CAAC,EACF,IAAIA,2CAAsB;GACzB,OAAO,KAAK;GACZ,aAAa;GACb,oBAAoB;GACpB,qBAAqB;GACrB,CAAC,CACF;;;AAIH,IAAa,YAAb,cAIUE,2CAAiD;CAC1D,QAA0BJ,0BAAsB;CAIhD,CAACK;CAED,YAAY,EAAE,aAAa,UAQxB;AACF,QAAM,OAAO;AACb,OAAKA,kDAAmB;;;;AAW1B,SAAgB,oBACf,MACA,WACA,QACA,QACkC;AAClC,KAAI,UACH,QAAO,IAAI,kBAAkB,MAAM,WAAW,QAAQ,OAAO;AAE9D,QAAO,IAAI,YAAY,MAAM,OAAO;;;AAYrC,SAAgB,oBAAoB,QAAyC;AAC5E,UAAS,MAAM,YAAY,oBAAoB,MAAM,SAAS,QAAW,OAAO;;AAGjF,MAAa,YAAY,oBAAoB,OAAU"}