@prisma-next/sql-relational-core 0.3.0-dev.12 → 0.3.0-dev.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +18 -1
- package/dist/errors-BNiBIGfC.d.mts +2 -0
- package/dist/errors-DXSQwbhk.mjs +3 -0
- package/dist/exports/ast.d.mts +126 -0
- package/dist/exports/ast.d.mts.map +1 -0
- package/dist/exports/ast.mjs +253 -0
- package/dist/exports/ast.mjs.map +1 -0
- package/dist/exports/errors.d.mts +2 -0
- package/dist/exports/errors.mjs +3 -0
- package/dist/exports/guards.d.mts +5 -0
- package/dist/exports/guards.mjs +3 -0
- package/dist/exports/operations-registry.d.mts +5 -0
- package/dist/exports/operations-registry.mjs +3 -0
- package/dist/exports/param.d.mts +5 -0
- package/dist/exports/param.mjs +3 -0
- package/dist/exports/plan.d.mts +2 -0
- package/dist/exports/plan.mjs +17 -0
- package/dist/exports/plan.mjs.map +1 -0
- package/dist/exports/query-lane-context.d.mts +2 -0
- package/dist/exports/query-lane-context.mjs +1 -0
- package/dist/exports/query-operations.d.mts +2 -0
- package/dist/exports/query-operations.mjs +18 -0
- package/dist/exports/query-operations.mjs.map +1 -0
- package/dist/exports/schema.d.mts +5 -0
- package/dist/exports/schema.mjs +4 -0
- package/dist/exports/types.d.mts +4 -0
- package/dist/exports/types.mjs +3 -0
- package/dist/exports/utils/guards.d.mts +5 -0
- package/dist/exports/utils/guards.mjs +3 -0
- package/dist/guards-D1ax7TKN.mjs +57 -0
- package/dist/guards-D1ax7TKN.mjs.map +1 -0
- package/dist/guards-DC2Ll67p.d.mts +31 -0
- package/dist/guards-DC2Ll67p.d.mts.map +1 -0
- package/dist/index.d.mts +12 -0
- package/dist/index.mjs +13 -0
- package/dist/operations-registry-CBmGut8O.d.mts +9 -0
- package/dist/operations-registry-CBmGut8O.d.mts.map +1 -0
- package/dist/operations-registry-D8INFH9J.mjs +145 -0
- package/dist/operations-registry-D8INFH9J.mjs.map +1 -0
- package/dist/param-CFyhvphn.mjs +14 -0
- package/dist/param-CFyhvphn.mjs.map +1 -0
- package/dist/param-Cmdv_exJ.d.mts +8 -0
- package/dist/param-Cmdv_exJ.d.mts.map +1 -0
- package/dist/plan-BrZtMUA9.d.mts +517 -0
- package/dist/plan-BrZtMUA9.d.mts.map +1 -0
- package/dist/query-lane-context-BTtg0xm8.d.mts +278 -0
- package/dist/query-lane-context-BTtg0xm8.d.mts.map +1 -0
- package/dist/query-operation-registry-B6bClJs8.d.mts +27 -0
- package/dist/query-operation-registry-B6bClJs8.d.mts.map +1 -0
- package/dist/schema-XcyJSq4j.mjs +174 -0
- package/dist/schema-XcyJSq4j.mjs.map +1 -0
- package/dist/schema-j3Srik3R.d.mts +88 -0
- package/dist/schema-j3Srik3R.d.mts.map +1 -0
- package/dist/types-BZKzxgOb.mjs +18 -0
- package/dist/types-BZKzxgOb.mjs.map +1 -0
- package/dist/types-CMyotK6U.d.mts +443 -0
- package/dist/types-CMyotK6U.d.mts.map +1 -0
- package/dist/types-I6Hsg-GU.mjs +1102 -0
- package/dist/types-I6Hsg-GU.mjs.map +1 -0
- package/package.json +37 -53
- package/src/ast/codec-types.ts +123 -22
- package/src/ast/driver-types.ts +20 -3
- package/src/ast/join.ts +3 -23
- package/src/ast/sql-codecs.ts +81 -0
- package/src/ast/types.ts +1704 -74
- package/src/exports/ast.ts +1 -7
- package/src/exports/guards.ts +3 -4
- package/src/exports/query-operations.ts +1 -0
- package/src/exports/utils/guards.ts +1 -0
- package/src/operations-registry.ts +115 -89
- package/src/plan.ts +4 -4
- package/src/query-lane-context.ts +79 -1
- package/src/query-operation-registry.ts +35 -0
- package/src/schema.ts +104 -43
- package/src/types.ts +333 -84
- package/src/utils/guards.ts +44 -80
- package/dist/ast/adapter-types.d.ts +0 -28
- package/dist/ast/adapter-types.d.ts.map +0 -1
- package/dist/ast/codec-types.d.ts +0 -141
- package/dist/ast/codec-types.d.ts.map +0 -1
- package/dist/ast/common.d.ts +0 -7
- package/dist/ast/common.d.ts.map +0 -1
- package/dist/ast/delete.d.ts +0 -8
- package/dist/ast/delete.d.ts.map +0 -1
- package/dist/ast/driver-types.d.ts +0 -20
- package/dist/ast/driver-types.d.ts.map +0 -1
- package/dist/ast/insert.d.ts +0 -8
- package/dist/ast/insert.d.ts.map +0 -1
- package/dist/ast/join.d.ts +0 -6
- package/dist/ast/join.d.ts.map +0 -1
- package/dist/ast/order.d.ts +0 -6
- package/dist/ast/order.d.ts.map +0 -1
- package/dist/ast/predicate.d.ts +0 -4
- package/dist/ast/predicate.d.ts.map +0 -1
- package/dist/ast/select.d.ts +0 -18
- package/dist/ast/select.d.ts.map +0 -1
- package/dist/ast/types.d.ts +0 -118
- package/dist/ast/types.d.ts.map +0 -1
- package/dist/ast/update.d.ts +0 -9
- package/dist/ast/update.d.ts.map +0 -1
- package/dist/ast/util.d.ts +0 -2
- package/dist/ast/util.d.ts.map +0 -1
- package/dist/chunk-2F7DSEOU.js +0 -8
- package/dist/chunk-2F7DSEOU.js.map +0 -1
- package/dist/chunk-36WJWNHT.js +0 -1
- package/dist/chunk-36WJWNHT.js.map +0 -1
- package/dist/chunk-5N34PNVZ.js +0 -62
- package/dist/chunk-5N34PNVZ.js.map +0 -1
- package/dist/chunk-7I3EMQID.js +0 -16
- package/dist/chunk-7I3EMQID.js.map +0 -1
- package/dist/chunk-CBTYMOX2.js +0 -152
- package/dist/chunk-CBTYMOX2.js.map +0 -1
- package/dist/chunk-G52ENULI.js +0 -1
- package/dist/chunk-G52ENULI.js.map +0 -1
- package/dist/chunk-KYSP7L5C.js +0 -16
- package/dist/chunk-KYSP7L5C.js.map +0 -1
- package/dist/chunk-M23L3JHG.js +0 -159
- package/dist/chunk-M23L3JHG.js.map +0 -1
- package/dist/chunk-MM74SVJ4.js +0 -13
- package/dist/chunk-MM74SVJ4.js.map +0 -1
- package/dist/chunk-U7AXAUJA.js +0 -1
- package/dist/chunk-U7AXAUJA.js.map +0 -1
- package/dist/chunk-WZBPVEZI.js +0 -320
- package/dist/chunk-WZBPVEZI.js.map +0 -1
- package/dist/errors.d.ts +0 -2
- package/dist/errors.d.ts.map +0 -1
- package/dist/exports/ast.d.ts +0 -14
- package/dist/exports/ast.d.ts.map +0 -1
- package/dist/exports/ast.js +0 -46
- package/dist/exports/ast.js.map +0 -1
- package/dist/exports/errors.d.ts +0 -2
- package/dist/exports/errors.d.ts.map +0 -1
- package/dist/exports/errors.js +0 -9
- package/dist/exports/errors.js.map +0 -1
- package/dist/exports/guards.d.ts +0 -2
- package/dist/exports/guards.d.ts.map +0 -1
- package/dist/exports/guards.js +0 -21
- package/dist/exports/guards.js.map +0 -1
- package/dist/exports/operations-registry.d.ts +0 -2
- package/dist/exports/operations-registry.d.ts.map +0 -1
- package/dist/exports/operations-registry.js +0 -9
- package/dist/exports/operations-registry.js.map +0 -1
- package/dist/exports/param.d.ts +0 -3
- package/dist/exports/param.d.ts.map +0 -1
- package/dist/exports/param.js +0 -7
- package/dist/exports/param.js.map +0 -1
- package/dist/exports/plan.d.ts +0 -2
- package/dist/exports/plan.d.ts.map +0 -1
- package/dist/exports/plan.js +0 -7
- package/dist/exports/plan.js.map +0 -1
- package/dist/exports/query-lane-context.d.ts +0 -2
- package/dist/exports/query-lane-context.d.ts.map +0 -1
- package/dist/exports/query-lane-context.js +0 -2
- package/dist/exports/query-lane-context.js.map +0 -1
- package/dist/exports/schema.d.ts +0 -3
- package/dist/exports/schema.d.ts.map +0 -1
- package/dist/exports/schema.js +0 -14
- package/dist/exports/schema.js.map +0 -1
- package/dist/exports/types.d.ts +0 -2
- package/dist/exports/types.d.ts.map +0 -1
- package/dist/exports/types.js +0 -10
- package/dist/exports/types.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -81
- package/dist/index.js.map +0 -1
- package/dist/operations-registry.d.ts +0 -5
- package/dist/operations-registry.d.ts.map +0 -1
- package/dist/param.d.ts +0 -4
- package/dist/param.d.ts.map +0 -1
- package/dist/plan.d.ts +0 -23
- package/dist/plan.d.ts.map +0 -1
- package/dist/query-lane-context.d.ts +0 -16
- package/dist/query-lane-context.d.ts.map +0 -1
- package/dist/schema.d.ts +0 -63
- package/dist/schema.d.ts.map +0 -1
- package/dist/types.d.ts +0 -332
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/guards.d.ts +0 -55
- package/dist/utils/guards.d.ts.map +0 -1
- package/src/ast/common.ts +0 -36
- package/src/ast/delete.ts +0 -17
- package/src/ast/insert.ts +0 -17
- package/src/ast/order.ts +0 -11
- package/src/ast/predicate.ts +0 -30
- package/src/ast/select.ts +0 -39
- package/src/ast/update.ts +0 -19
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-I6Hsg-GU.mjs","names":["refs: ColumnRef[]","refs: ParamRef[]","queryAstKinds: ReadonlySet<string>","whereExprKinds: ReadonlySet<string>"],"sources":["../src/ast/types.ts"],"sourcesContent":["import type { PlanRefs } from '@prisma-next/contract/types';\nimport type { ReturnSpec } from '@prisma-next/operations';\nimport type { SqlLoweringSpec } from '@prisma-next/sql-operations';\n\nexport type Direction = 'asc' | 'desc';\n\nexport type BinaryOp =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'lt'\n | 'gte'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'in'\n | 'notIn';\n\nexport type AggregateCountFn = 'count';\nexport type AggregateOpFn = 'sum' | 'avg' | 'min' | 'max';\nexport type AggregateFn = AggregateCountFn | AggregateOpFn;\n\nexport interface ExpressionSource {\n toExpr(): AnyExpression;\n}\n\nexport interface ExpressionRewriter {\n columnRef?(expr: ColumnRef): AnyExpression;\n identifierRef?(expr: IdentifierRef): AnyExpression;\n paramRef?(expr: ParamRef): ParamRef | LiteralExpr;\n literal?(expr: LiteralExpr): LiteralExpr;\n list?(expr: ListExpression): ListExpression | LiteralExpr;\n select?(ast: SelectAst): SelectAst;\n}\n\nexport interface AstRewriter extends ExpressionRewriter {\n tableSource?(source: TableSource): TableSource;\n eqColJoinOn?(on: EqColJoinOn): EqColJoinOn | AnyExpression;\n}\n\nexport interface ExprVisitor<R> {\n columnRef(expr: ColumnRef): R;\n identifierRef(expr: IdentifierRef): R;\n subquery(expr: SubqueryExpr): R;\n operation(expr: OperationExpr): R;\n aggregate(expr: AggregateExpr): R;\n jsonObject(expr: JsonObjectExpr): R;\n jsonArrayAgg(expr: JsonArrayAggExpr): R;\n binary(expr: BinaryExpr): R;\n and(expr: AndExpr): R;\n or(expr: OrExpr): R;\n exists(expr: ExistsExpr): R;\n nullCheck(expr: NullCheckExpr): R;\n not(expr: NotExpr): R;\n literal(expr: LiteralExpr): R;\n param(expr: ParamRef): R;\n list(expr: ListExpression): R;\n}\n\nexport interface ExpressionFolder<T> {\n empty: T;\n combine(a: T, b: T): T;\n isAbsorbing?(value: T): boolean;\n columnRef?(expr: ColumnRef): T;\n identifierRef?(expr: IdentifierRef): T;\n paramRef?(expr: ParamRef): T;\n literal?(expr: LiteralExpr): T;\n list?(expr: ListExpression): T;\n select?(ast: SelectAst): T;\n}\n\nexport type ProjectionExpr = AnyExpression;\nexport type InsertValue = ColumnRef | ParamRef | DefaultValueExpr;\nexport type JoinOnExpr = EqColJoinOn | AnyExpression;\nexport type WhereArg = AnyExpression | ToWhereExpr;\nexport type JsonObjectEntry = {\n readonly key: string;\n readonly value: ProjectionExpr;\n};\n\nfunction frozenArrayCopy<T>(values: readonly T[]): ReadonlyArray<T> {\n return Object.freeze([...values]);\n}\n\nfunction frozenOptionalRecordCopy<T extends Record<string, unknown>>(\n value: T | undefined,\n): Readonly<T> | undefined {\n return value === undefined ? undefined : Object.freeze({ ...value });\n}\n\nfunction frozenRecordCopy<T>(record: Readonly<Record<string, T>>): Readonly<Record<string, T>> {\n return Object.freeze({ ...record });\n}\n\nfunction freezeRows(\n rows: ReadonlyArray<Record<string, InsertValue>>,\n): ReadonlyArray<Readonly<Record<string, InsertValue>>> {\n return Object.freeze(rows.map((row) => Object.freeze({ ...row })));\n}\n\nfunction combineAll<T>(folder: ExpressionFolder<T>, thunks: Array<() => T>): T {\n let result = folder.empty;\n for (const thunk of thunks) {\n if (folder.isAbsorbing?.(result)) {\n return result;\n }\n result = folder.combine(result, thunk());\n }\n return result;\n}\n\nfunction rewriteComparable(value: AnyExpression, rewriter: ExpressionRewriter): AnyExpression {\n switch (value.kind) {\n case 'param-ref':\n return rewriter.paramRef ? rewriter.paramRef(value) : value;\n case 'literal':\n return rewriter.literal ? rewriter.literal(value) : value;\n case 'list':\n if (rewriter.list) {\n return rewriter.list(value);\n }\n return value.rewrite(rewriter);\n default:\n return value.rewrite(rewriter);\n }\n}\n\nfunction foldComparable<T>(value: AnyExpression, folder: ExpressionFolder<T>): T {\n switch (value.kind) {\n case 'param-ref':\n return folder.paramRef ? folder.paramRef(value) : folder.empty;\n case 'literal':\n return folder.literal ? folder.literal(value) : folder.empty;\n case 'list':\n return value.fold(folder);\n default:\n return value.fold(folder);\n }\n}\n\nfunction collectColumnRefsWith<TNode extends Expression>(node: TNode): ColumnRef[] {\n return node.fold<ColumnRef[]>({\n empty: [],\n combine: (a, b) => [...a, ...b],\n columnRef: (columnRef) => [columnRef],\n select: (ast) => ast.collectColumnRefs(),\n });\n}\n\nfunction collectParamRefsWith<TNode extends Expression>(node: TNode): ParamRef[] {\n return node.fold<ParamRef[]>({\n empty: [],\n combine: (a, b) => [...a, ...b],\n paramRef: (paramRef) => [paramRef],\n select: (ast) => ast.collectParamRefs(),\n });\n}\n\nfunction sortRefs(\n tables: ReadonlySet<string>,\n columns: ReadonlyMap<string, { table: string; column: string }>,\n): PlanRefs {\n const sortedTables = [...tables].sort((a, b) => a.localeCompare(b));\n const sortedColumns = [...columns.values()].sort((a, b) => {\n const tableCompare = a.table.localeCompare(b.table);\n if (tableCompare !== 0) {\n return tableCompare;\n }\n return a.column.localeCompare(b.column);\n });\n\n return {\n tables: sortedTables,\n columns: sortedColumns,\n };\n}\n\nfunction addColumnRefToRefSets(\n columnRef: ColumnRef,\n tables: Set<string>,\n columns: Map<string, { table: string; column: string }>,\n): void {\n if (columnRef.table === 'excluded') {\n return;\n }\n tables.add(columnRef.table);\n const key = `${columnRef.table}.${columnRef.column}`;\n if (!columns.has(key)) {\n columns.set(key, {\n table: columnRef.table,\n column: columnRef.column,\n });\n }\n}\n\nfunction mergeRefsInto(\n refs: PlanRefs,\n tables: Set<string>,\n columns: Map<string, { table: string; column: string }>,\n): void {\n for (const table of refs.tables ?? []) {\n tables.add(table);\n }\n for (const column of refs.columns ?? []) {\n addColumnRefToRefSets(new ColumnRef(column.table, column.column), tables, columns);\n }\n}\n\nabstract class AstNode {\n abstract readonly kind: string;\n\n protected freeze(): void {\n Object.freeze(this);\n }\n}\n\nabstract class QueryAst extends AstNode {\n abstract collectRefs(): PlanRefs;\n abstract collectParamRefs(): ParamRef[];\n abstract toQueryAst(): AnyQueryAst;\n\n collectColumnRefs(): ColumnRef[] {\n const refs = this.collectRefs().columns ?? [];\n return refs.map((ref) => new ColumnRef(ref.table, ref.column));\n }\n}\n\nabstract class FromSource extends AstNode {\n abstract collectRefs(): PlanRefs;\n abstract rewrite(rewriter: AstRewriter): AnyFromSource;\n abstract toFromSource(): AnyFromSource;\n}\n\nabstract class Expression extends AstNode implements ExpressionSource {\n abstract accept<R>(visitor: ExprVisitor<R>): R;\n abstract rewrite(rewriter: ExpressionRewriter): AnyExpression;\n abstract fold<T>(folder: ExpressionFolder<T>): T;\n\n collectColumnRefs(): ColumnRef[] {\n return collectColumnRefsWith(this);\n }\n\n collectParamRefs(): ParamRef[] {\n return collectParamRefsWith(this);\n }\n\n baseColumnRef(): ColumnRef {\n throw new Error(`${this.constructor.name} does not expose a base column reference`);\n }\n\n toExpr(): AnyExpression {\n return this as unknown as AnyExpression;\n }\n\n not(): NotExpr {\n return new NotExpr(this as unknown as AnyExpression);\n }\n}\n\nexport class TableSource extends FromSource {\n readonly kind = 'table-source' as const;\n readonly name: string;\n readonly alias: string | undefined;\n\n constructor(name: string, alias?: string) {\n super();\n this.name = name;\n this.alias = alias;\n this.freeze();\n }\n\n static named(name: string, alias?: string): TableSource {\n return new TableSource(name, alias);\n }\n\n override rewrite(rewriter: AstRewriter): AnyFromSource {\n return rewriter.tableSource ? rewriter.tableSource(this) : this;\n }\n\n override toFromSource(): AnyFromSource {\n return this;\n }\n\n override collectRefs(): PlanRefs {\n return {\n tables: [this.name],\n columns: [],\n };\n }\n}\n\nexport interface TableRef {\n readonly name: string;\n readonly alias?: string;\n}\n\nexport class DerivedTableSource extends FromSource {\n readonly kind = 'derived-table-source' as const;\n readonly alias: string;\n readonly query: SelectAst;\n\n constructor(alias: string, query: SelectAst) {\n super();\n this.alias = alias;\n this.query = query;\n this.freeze();\n }\n\n static as(alias: string, query: SelectAst): DerivedTableSource {\n return new DerivedTableSource(alias, query);\n }\n\n // Intentionally does not call rewriter.tableSource — derived tables are rewritten\n // via their inner query, not intercepted at the FromSource level. A future\n // fromSource?(source: AnyFromSource) callback would be needed for that.\n override rewrite(rewriter: AstRewriter): AnyFromSource {\n return new DerivedTableSource(this.alias, this.query.rewrite(rewriter));\n }\n\n override toFromSource(): AnyFromSource {\n return this;\n }\n\n override collectRefs(): PlanRefs {\n return this.query.collectRefs();\n }\n}\n\nexport class ColumnRef extends Expression {\n readonly kind = 'column-ref' as const;\n readonly table: string;\n readonly column: string;\n\n constructor(table: string, column: string) {\n super();\n this.table = table;\n this.column = column;\n this.freeze();\n }\n\n static of(table: string, column: string): ColumnRef {\n return new ColumnRef(table, column);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.columnRef(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.columnRef ? rewriter.columnRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.columnRef ? folder.columnRef(this) : folder.empty;\n }\n\n override baseColumnRef(): ColumnRef {\n return this;\n }\n}\n\nexport class IdentifierRef extends Expression {\n readonly kind = 'identifier-ref' as const;\n readonly name: string;\n\n constructor(name: string) {\n super();\n this.name = name;\n this.freeze();\n }\n\n static of(name: string): IdentifierRef {\n return new IdentifierRef(name);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.identifierRef(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.identifierRef ? rewriter.identifierRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.identifierRef ? folder.identifierRef(this) : folder.empty;\n }\n}\n\nexport class ParamRef extends Expression {\n readonly kind = 'param-ref' as const;\n readonly value: unknown;\n readonly name: string | undefined;\n readonly codecId: string | undefined;\n\n constructor(\n value: unknown,\n options?: {\n name?: string;\n codecId?: string;\n },\n ) {\n super();\n this.value = value;\n this.name = options?.name;\n this.codecId = options?.codecId;\n this.freeze();\n }\n\n static of(\n value: unknown,\n options?: {\n name?: string;\n codecId?: string;\n },\n ): ParamRef {\n return new ParamRef(value, options);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.param(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.paramRef ? rewriter.paramRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.paramRef ? folder.paramRef(this) : folder.empty;\n }\n}\n\nexport class DefaultValueExpr extends AstNode {\n readonly kind = 'default-value' as const;\n\n constructor() {\n super();\n this.freeze();\n }\n}\n\nexport class LiteralExpr extends Expression {\n readonly kind = 'literal' as const;\n readonly value: unknown;\n\n constructor(value: unknown) {\n super();\n this.value = value;\n this.freeze();\n }\n\n static of(value: unknown): LiteralExpr {\n return new LiteralExpr(value);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.literal(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.literal ? rewriter.literal(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.literal ? folder.literal(this) : folder.empty;\n }\n}\n\nexport class SubqueryExpr extends Expression {\n readonly kind = 'subquery' as const;\n readonly query: SelectAst;\n\n constructor(query: SelectAst) {\n super();\n this.query = query;\n this.freeze();\n }\n\n static of(query: SelectAst): SubqueryExpr {\n return new SubqueryExpr(query);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.subquery(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n const query = this.query.rewrite(rewriter);\n return new SubqueryExpr(query);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.select ? folder.select(this.query) : folder.empty;\n }\n}\n\nexport class OperationExpr extends Expression {\n readonly kind = 'operation' as const;\n readonly method: string;\n readonly forTypeId: string;\n readonly self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr>;\n readonly returns: ReturnSpec;\n readonly lowering: SqlLoweringSpec;\n\n constructor(options: {\n readonly method: string;\n readonly forTypeId: string;\n readonly self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr> | undefined;\n readonly returns: ReturnSpec;\n readonly lowering: SqlLoweringSpec;\n }) {\n super();\n this.method = options.method;\n this.forTypeId = options.forTypeId;\n this.self = options.self;\n this.args = frozenArrayCopy(options.args ?? []);\n this.returns = options.returns;\n this.lowering = options.lowering;\n this.freeze();\n }\n\n static function(options: {\n readonly method: string;\n readonly forTypeId: string;\n readonly self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr> | undefined;\n readonly returns: ReturnSpec;\n readonly template: string;\n }): OperationExpr {\n return new OperationExpr({\n method: options.method,\n forTypeId: options.forTypeId,\n self: options.self,\n args: options.args,\n returns: options.returns,\n lowering: {\n targetFamily: 'sql',\n strategy: 'function',\n template: options.template,\n },\n });\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.operation(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new OperationExpr({\n method: this.method,\n forTypeId: this.forTypeId,\n self: this.self.rewrite(rewriter),\n args: this.args.map((arg) => rewriteComparable(arg, rewriter)) as ReadonlyArray<\n AnyExpression | ParamRef | LiteralExpr\n >,\n returns: this.returns,\n lowering: this.lowering,\n });\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => this.self.fold(folder),\n ...this.args.map((arg) => () => foldComparable(arg, folder)),\n ]);\n }\n\n override baseColumnRef(): ColumnRef {\n return this.self.baseColumnRef();\n }\n}\n\nexport class AggregateExpr extends Expression {\n readonly kind = 'aggregate' as const;\n readonly fn: AggregateFn;\n readonly expr: AnyExpression | undefined;\n\n constructor(fn: AggregateFn, expr?: AnyExpression) {\n super();\n if (fn !== 'count' && expr === undefined) {\n throw new Error(`Aggregate function \"${fn}\" requires an expression`);\n }\n this.fn = fn;\n this.expr = expr;\n this.freeze();\n }\n\n static count(expr?: AnyExpression): AggregateExpr {\n return new AggregateExpr('count', expr);\n }\n\n static sum(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('sum', expr);\n }\n\n static avg(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('avg', expr);\n }\n\n static min(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('min', expr);\n }\n\n static max(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('max', expr);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.aggregate(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return this.expr === undefined ? this : new AggregateExpr(this.fn, this.expr.rewrite(rewriter));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr ? this.expr.fold(folder) : folder.empty;\n }\n}\n\nexport class JsonObjectExpr extends Expression {\n readonly kind = 'json-object' as const;\n readonly entries: ReadonlyArray<JsonObjectEntry>;\n\n constructor(entries: ReadonlyArray<JsonObjectEntry>) {\n super();\n this.entries = frozenArrayCopy(entries.map((entry) => Object.freeze({ ...entry })));\n this.freeze();\n }\n\n static entry(key: string, value: ProjectionExpr): JsonObjectEntry {\n return {\n key,\n value,\n };\n }\n\n static fromEntries(entries: ReadonlyArray<JsonObjectEntry>): JsonObjectExpr {\n return new JsonObjectExpr(entries);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.jsonObject(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new JsonObjectExpr(\n this.entries.map((entry) => ({\n key: entry.key,\n value:\n entry.value.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(entry.value)\n : entry.value\n : entry.value.rewrite(rewriter),\n })),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.entries.map(\n (entry) => () =>\n entry.value.kind === 'literal'\n ? folder.literal\n ? folder.literal(entry.value)\n : folder.empty\n : entry.value.fold(folder),\n ),\n );\n }\n}\n\nexport class OrderByItem extends AstNode {\n readonly kind = 'order-by-item' as const;\n readonly expr: AnyExpression;\n readonly dir: Direction;\n\n constructor(expr: AnyExpression, dir: Direction) {\n super();\n this.expr = expr;\n this.dir = dir;\n this.freeze();\n }\n\n static asc(expr: AnyExpression): OrderByItem {\n return new OrderByItem(expr, 'asc');\n }\n\n static desc(expr: AnyExpression): OrderByItem {\n return new OrderByItem(expr, 'desc');\n }\n\n rewrite(rewriter: ExpressionRewriter): OrderByItem {\n return new OrderByItem(this.expr.rewrite(rewriter), this.dir);\n }\n}\n\nexport class JsonArrayAggExpr extends Expression {\n readonly kind = 'json-array-agg' as const;\n readonly expr: AnyExpression;\n readonly onEmpty: 'null' | 'emptyArray';\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n\n constructor(\n expr: AnyExpression,\n onEmpty: 'null' | 'emptyArray' = 'null',\n orderBy?: ReadonlyArray<OrderByItem>,\n ) {\n super();\n this.expr = expr;\n this.onEmpty = onEmpty;\n this.orderBy = orderBy && orderBy.length > 0 ? frozenArrayCopy(orderBy) : undefined;\n this.freeze();\n }\n\n static of(\n expr: AnyExpression,\n onEmpty: 'null' | 'emptyArray' = 'null',\n orderBy?: ReadonlyArray<OrderByItem>,\n ): JsonArrayAggExpr {\n return new JsonArrayAggExpr(expr, onEmpty, orderBy);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.jsonArrayAgg(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new JsonArrayAggExpr(\n this.expr.rewrite(rewriter),\n this.onEmpty,\n this.orderBy?.map((orderItem) => orderItem.rewrite(rewriter)),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => this.expr.fold(folder),\n ...(this.orderBy ?? []).map((orderItem) => () => orderItem.expr.fold(folder)),\n ]);\n }\n}\n\nexport class ListExpression extends Expression {\n readonly kind = 'list' as const;\n readonly values: ReadonlyArray<AnyExpression>;\n\n constructor(values: ReadonlyArray<AnyExpression>) {\n super();\n this.values = frozenArrayCopy(values);\n this.freeze();\n }\n\n static of(values: ReadonlyArray<AnyExpression>): ListExpression {\n return new ListExpression(values);\n }\n\n static fromValues(values: ReadonlyArray<unknown>): ListExpression {\n return new ListExpression(values.map((value) => new LiteralExpr(value)));\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.list(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n if (rewriter.list) {\n return rewriter.list(this);\n }\n\n return new ListExpression(this.values.map((value) => value.rewrite(rewriter)));\n }\n\n fold<T>(folder: ExpressionFolder<T>): T {\n if (folder.list) {\n return folder.list(this);\n }\n return combineAll(\n folder,\n this.values.map((value) => () => value.fold(folder)),\n );\n }\n}\n\nexport class BinaryExpr extends Expression {\n readonly kind = 'binary' as const;\n readonly op: BinaryOp;\n readonly left: AnyExpression;\n readonly right: AnyExpression;\n\n constructor(op: BinaryOp, left: AnyExpression, right: AnyExpression) {\n super();\n this.op = op;\n this.left = left;\n this.right = right;\n this.freeze();\n }\n\n static eq(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('eq', left, right);\n }\n\n static neq(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('neq', left, right);\n }\n\n static gt(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('gt', left, right);\n }\n\n static lt(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('lt', left, right);\n }\n\n static gte(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('gte', left, right);\n }\n\n static lte(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('lte', left, right);\n }\n\n static like(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('like', left, right);\n }\n\n static ilike(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('ilike', left, right);\n }\n\n static in(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('in', left, right);\n }\n\n static notIn(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('notIn', left, right);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.binary(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new BinaryExpr(\n this.op,\n rewriteComparable(this.left, rewriter),\n rewriteComparable(this.right, rewriter),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => foldComparable(this.left, folder),\n () => foldComparable(this.right, folder),\n ]);\n }\n}\n\nexport class AndExpr extends Expression {\n readonly kind = 'and' as const;\n readonly exprs: ReadonlyArray<AnyExpression>;\n\n constructor(exprs: ReadonlyArray<AnyExpression>) {\n super();\n this.exprs = frozenArrayCopy(exprs);\n this.freeze();\n }\n\n static of(exprs: ReadonlyArray<AnyExpression>): AndExpr {\n return new AndExpr(exprs);\n }\n\n static true(): AndExpr {\n return new AndExpr([]);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.and(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new AndExpr(this.exprs.map((expr) => expr.rewrite(rewriter)));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.exprs.map((expr) => () => expr.fold(folder)),\n );\n }\n}\n\nexport class OrExpr extends Expression {\n readonly kind = 'or' as const;\n readonly exprs: ReadonlyArray<AnyExpression>;\n\n constructor(exprs: ReadonlyArray<AnyExpression>) {\n super();\n this.exprs = frozenArrayCopy(exprs);\n this.freeze();\n }\n\n static of(exprs: ReadonlyArray<AnyExpression>): OrExpr {\n return new OrExpr(exprs);\n }\n\n static false(): OrExpr {\n return new OrExpr([]);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.or(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new OrExpr(this.exprs.map((expr) => expr.rewrite(rewriter)));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.exprs.map((expr) => () => expr.fold(folder)),\n );\n }\n}\n\nexport class ExistsExpr extends Expression {\n readonly kind = 'exists' as const;\n readonly notExists: boolean;\n readonly subquery: SelectAst;\n\n constructor(subquery: SelectAst, notExists = false) {\n super();\n this.notExists = notExists;\n this.subquery = subquery;\n this.freeze();\n }\n\n static exists(subquery: SelectAst): ExistsExpr {\n return new ExistsExpr(subquery, false);\n }\n\n static notExists(subquery: SelectAst): ExistsExpr {\n return new ExistsExpr(subquery, true);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.exists(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new ExistsExpr(this.subquery.rewrite(rewriter), this.notExists);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.select ? folder.select(this.subquery) : folder.empty;\n }\n}\n\nexport class NullCheckExpr extends Expression {\n readonly kind = 'null-check' as const;\n readonly expr: AnyExpression;\n readonly isNull: boolean;\n\n constructor(expr: AnyExpression, isNull: boolean) {\n super();\n this.expr = expr;\n this.isNull = isNull;\n this.freeze();\n }\n\n static isNull(expr: AnyExpression): NullCheckExpr {\n return new NullCheckExpr(expr, true);\n }\n\n static isNotNull(expr: AnyExpression): NullCheckExpr {\n return new NullCheckExpr(expr, false);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.nullCheck(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new NullCheckExpr(this.expr.rewrite(rewriter), this.isNull);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr.fold(folder);\n }\n}\n\nexport class NotExpr extends Expression {\n readonly kind = 'not' as const;\n readonly expr: AnyExpression;\n\n constructor(expr: AnyExpression) {\n super();\n this.expr = expr;\n this.freeze();\n }\n\n toWhereExpr(): AnyExpression {\n return this;\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.not(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new NotExpr(this.expr.rewrite(rewriter));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr.fold(folder);\n }\n}\n\nexport class EqColJoinOn extends AstNode {\n readonly kind = 'eq-col-join-on' as const;\n readonly left: ColumnRef;\n readonly right: ColumnRef;\n\n constructor(left: ColumnRef, right: ColumnRef) {\n super();\n this.left = left;\n this.right = right;\n this.freeze();\n }\n\n static of(left: ColumnRef, right: ColumnRef): EqColJoinOn {\n return new EqColJoinOn(left, right);\n }\n\n rewrite(rewriter: AstRewriter): EqColJoinOn | AnyExpression {\n return rewriter.eqColJoinOn ? rewriter.eqColJoinOn(this) : this;\n }\n}\n\nexport class JoinAst extends AstNode {\n readonly kind = 'join' as const;\n readonly joinType: 'inner' | 'left' | 'right' | 'full';\n readonly source: AnyFromSource;\n readonly lateral: boolean;\n readonly on: JoinOnExpr;\n\n constructor(\n joinType: 'inner' | 'left' | 'right' | 'full',\n source: AnyFromSource,\n on: JoinOnExpr,\n lateral = false,\n ) {\n super();\n this.joinType = joinType;\n this.source = source;\n this.lateral = lateral;\n this.on = on;\n this.freeze();\n }\n\n static inner(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('inner', source, on, lateral);\n }\n\n static left(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('left', source, on, lateral);\n }\n\n static right(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('right', source, on, lateral);\n }\n\n static full(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('full', source, on, lateral);\n }\n\n rewrite(rewriter: AstRewriter): JoinAst {\n return new JoinAst(\n this.joinType,\n this.source.rewrite(rewriter),\n this.on.kind === 'eq-col-join-on' ? this.on.rewrite(rewriter) : this.on.rewrite(rewriter),\n this.lateral,\n );\n }\n}\n\nexport class ProjectionItem extends AstNode {\n readonly kind = 'projection-item' as const;\n readonly alias: string;\n readonly expr: ProjectionExpr;\n\n constructor(alias: string, expr: ProjectionExpr) {\n super();\n this.alias = alias;\n this.expr = expr;\n this.freeze();\n }\n\n static of(alias: string, expr: ProjectionExpr): ProjectionItem {\n return new ProjectionItem(alias, expr);\n }\n}\n\nexport interface SelectAstOptions {\n readonly from: AnyFromSource;\n readonly joins: ReadonlyArray<JoinAst> | undefined;\n readonly projection: ReadonlyArray<ProjectionItem>;\n readonly where: AnyExpression | undefined;\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n readonly distinct: true | undefined;\n readonly distinctOn: ReadonlyArray<AnyExpression> | undefined;\n readonly groupBy: ReadonlyArray<AnyExpression> | undefined;\n readonly having: AnyExpression | undefined;\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n readonly selectAllIntent: { readonly table?: string } | undefined;\n}\n\nexport class SelectAst extends QueryAst {\n readonly kind = 'select' as const;\n readonly from: AnyFromSource;\n readonly joins: ReadonlyArray<JoinAst> | undefined;\n readonly projection: ReadonlyArray<ProjectionItem>;\n readonly where: AnyExpression | undefined;\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n readonly distinct: true | undefined;\n readonly distinctOn: ReadonlyArray<AnyExpression> | undefined;\n readonly groupBy: ReadonlyArray<AnyExpression> | undefined;\n readonly having: AnyExpression | undefined;\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n readonly selectAllIntent: { readonly table?: string } | undefined;\n\n constructor(options: SelectAstOptions) {\n super();\n this.from = options.from;\n this.joins =\n options.joins && options.joins.length > 0 ? frozenArrayCopy(options.joins) : undefined;\n this.projection = frozenArrayCopy(options.projection);\n this.where = options.where;\n this.orderBy =\n options.orderBy && options.orderBy.length > 0 ? frozenArrayCopy(options.orderBy) : undefined;\n this.distinct = options.distinct;\n this.distinctOn =\n options.distinctOn && options.distinctOn.length > 0\n ? frozenArrayCopy(options.distinctOn)\n : undefined;\n this.groupBy =\n options.groupBy && options.groupBy.length > 0 ? frozenArrayCopy(options.groupBy) : undefined;\n this.having = options.having;\n this.limit = options.limit;\n this.offset = options.offset;\n this.selectAllIntent = frozenOptionalRecordCopy(options.selectAllIntent);\n this.freeze();\n }\n\n static from(from: AnyFromSource): SelectAst {\n return new SelectAst({\n from,\n joins: undefined,\n projection: [],\n where: undefined,\n orderBy: undefined,\n distinct: undefined,\n distinctOn: undefined,\n groupBy: undefined,\n having: undefined,\n limit: undefined,\n offset: undefined,\n selectAllIntent: undefined,\n });\n }\n\n withFrom(from: AnyFromSource): SelectAst {\n return new SelectAst({ ...this, from });\n }\n\n withJoins(joins: ReadonlyArray<JoinAst>): SelectAst {\n return new SelectAst({\n ...this,\n joins: joins.length > 0 ? joins : undefined,\n });\n }\n\n withProjection(projection: ReadonlyArray<ProjectionItem>): SelectAst {\n return new SelectAst({ ...this, projection });\n }\n\n addProjection(alias: string, expr: ProjectionExpr): SelectAst {\n return new SelectAst({\n ...this,\n projection: [...this.projection, new ProjectionItem(alias, expr)],\n });\n }\n\n withWhere(where: AnyExpression | undefined): SelectAst {\n return new SelectAst({ ...this, where });\n }\n\n withOrderBy(orderBy: ReadonlyArray<OrderByItem>): SelectAst {\n return new SelectAst({\n ...this,\n orderBy: orderBy.length > 0 ? orderBy : undefined,\n });\n }\n\n withDistinct(enabled = true): SelectAst {\n return new SelectAst({\n ...this,\n distinct: enabled ? true : undefined,\n });\n }\n\n withDistinctOn(distinctOn: ReadonlyArray<AnyExpression>): SelectAst {\n return new SelectAst({\n ...this,\n distinctOn: distinctOn.length > 0 ? distinctOn : undefined,\n });\n }\n\n withGroupBy(groupBy: ReadonlyArray<AnyExpression>): SelectAst {\n return new SelectAst({\n ...this,\n groupBy: groupBy.length > 0 ? groupBy : undefined,\n });\n }\n\n withHaving(having: AnyExpression | undefined): SelectAst {\n return new SelectAst({ ...this, having });\n }\n\n withLimit(limit: number | undefined): SelectAst {\n return new SelectAst({ ...this, limit });\n }\n\n withOffset(offset: number | undefined): SelectAst {\n return new SelectAst({ ...this, offset });\n }\n\n withSelectAllIntent(selectAllIntent: { readonly table?: string } | undefined): SelectAst {\n return new SelectAst({ ...this, selectAllIntent });\n }\n\n rewrite(rewriter: AstRewriter): SelectAst {\n const rewritten = new SelectAst({\n from: this.from.rewrite(rewriter),\n joins: this.joins?.map((join) => join.rewrite(rewriter)),\n projection: this.projection.map(\n (projection) =>\n new ProjectionItem(\n projection.alias,\n projection.expr.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(projection.expr)\n : projection.expr\n : projection.expr.rewrite(rewriter),\n ),\n ),\n where: this.where?.rewrite(rewriter),\n orderBy: this.orderBy?.map((orderItem) => orderItem.rewrite(rewriter)),\n distinct: this.distinct,\n distinctOn: this.distinctOn?.map((expr) => expr.rewrite(rewriter)),\n groupBy: this.groupBy?.map((expr) => expr.rewrite(rewriter)),\n having: this.having?.rewrite(rewriter),\n limit: this.limit,\n offset: this.offset,\n selectAllIntent: this.selectAllIntent,\n });\n\n return rewriter.select ? rewriter.select(rewritten) : rewritten;\n }\n\n override collectColumnRefs(): ColumnRef[] {\n const refs: ColumnRef[] = [];\n const pushRefs = (columns: ReadonlyArray<ColumnRef>) => {\n refs.push(...columns);\n };\n\n if (this.from.kind === 'derived-table-source') {\n pushRefs(this.from.query.collectColumnRefs());\n }\n\n for (const projection of this.projection) {\n if (!(projection.expr.kind === 'literal')) {\n pushRefs(projection.expr.collectColumnRefs());\n }\n }\n\n if (this.where) {\n pushRefs(this.where.collectColumnRefs());\n }\n if (this.having) {\n pushRefs(this.having.collectColumnRefs());\n }\n for (const orderItem of this.orderBy ?? []) {\n pushRefs(orderItem.expr.collectColumnRefs());\n }\n for (const expr of this.distinctOn ?? []) {\n pushRefs(expr.collectColumnRefs());\n }\n for (const expr of this.groupBy ?? []) {\n pushRefs(expr.collectColumnRefs());\n }\n for (const join of this.joins ?? []) {\n if (join.source.kind === 'derived-table-source') {\n pushRefs(join.source.query.collectColumnRefs());\n }\n if (join.on.kind === 'eq-col-join-on') {\n refs.push(join.on.left, join.on.right);\n } else {\n pushRefs(join.on.collectColumnRefs());\n }\n }\n\n return refs;\n }\n\n collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n const pushRefs = (params: ReadonlyArray<ParamRef>) => {\n refs.push(...params);\n };\n\n if (this.from.kind === 'derived-table-source') {\n pushRefs(this.from.query.collectParamRefs());\n }\n\n for (const projection of this.projection) {\n if (!(projection.expr.kind === 'literal')) {\n pushRefs(projection.expr.collectParamRefs());\n }\n }\n\n if (this.where) {\n pushRefs(this.where.collectParamRefs());\n }\n if (this.having) {\n pushRefs(this.having.collectParamRefs());\n }\n for (const orderItem of this.orderBy ?? []) {\n pushRefs(orderItem.expr.collectParamRefs());\n }\n for (const expr of this.distinctOn ?? []) {\n pushRefs(expr.collectParamRefs());\n }\n for (const expr of this.groupBy ?? []) {\n pushRefs(expr.collectParamRefs());\n }\n for (const join of this.joins ?? []) {\n if (join.source.kind === 'derived-table-source') {\n pushRefs(join.source.query.collectParamRefs());\n }\n if (!(join.on.kind === 'eq-col-join-on')) {\n pushRefs(join.on.collectParamRefs());\n }\n }\n\n return refs;\n }\n\n override collectRefs(): PlanRefs {\n const tables = new Set<string>();\n const columns = new Map<string, { table: string; column: string }>();\n\n const addSource = (source: AnyFromSource) => {\n mergeRefsInto(source.collectRefs(), tables, columns);\n };\n\n addSource(this.from);\n\n for (const join of this.joins ?? []) {\n addSource(join.source);\n if (join.on.kind === 'eq-col-join-on') {\n addColumnRefToRefSets(join.on.left, tables, columns);\n addColumnRefToRefSets(join.on.right, tables, columns);\n } else {\n for (const columnRef of join.on.collectColumnRefs()) {\n addColumnRefToRefSets(columnRef, tables, columns);\n }\n }\n }\n\n for (const columnRef of this.collectColumnRefs()) {\n addColumnRefToRefSets(columnRef, tables, columns);\n }\n\n return sortRefs(tables, columns);\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nabstract class InsertOnConflictAction extends AstNode {\n abstract toInsertOnConflictAction(): AnyInsertOnConflictAction;\n}\n\nexport class DoNothingConflictAction extends InsertOnConflictAction {\n readonly kind = 'do-nothing' as const;\n\n constructor() {\n super();\n this.freeze();\n }\n\n override toInsertOnConflictAction(): AnyInsertOnConflictAction {\n return this;\n }\n}\n\nexport class DoUpdateSetConflictAction extends InsertOnConflictAction {\n readonly kind = 'do-update-set' as const;\n readonly set: Readonly<Record<string, ColumnRef | ParamRef>>;\n\n constructor(set: Readonly<Record<string, ColumnRef | ParamRef>>) {\n super();\n this.set = frozenRecordCopy(set);\n this.freeze();\n }\n\n override toInsertOnConflictAction(): AnyInsertOnConflictAction {\n return this;\n }\n}\n\nexport class InsertOnConflict extends AstNode {\n readonly kind = 'insert-on-conflict' as const;\n readonly columns: ReadonlyArray<ColumnRef>;\n readonly action: AnyInsertOnConflictAction;\n\n constructor(columns: ReadonlyArray<ColumnRef>, action: AnyInsertOnConflictAction) {\n super();\n this.columns = frozenArrayCopy(columns);\n this.action = action;\n this.freeze();\n }\n\n static on(columns: ReadonlyArray<ColumnRef>): InsertOnConflict {\n return new InsertOnConflict(columns, new DoNothingConflictAction());\n }\n\n doNothing(): InsertOnConflict {\n return new InsertOnConflict(this.columns, new DoNothingConflictAction());\n }\n\n doUpdateSet(set: Readonly<Record<string, ColumnRef | ParamRef>>): InsertOnConflict {\n return new InsertOnConflict(this.columns, new DoUpdateSetConflictAction(set));\n }\n}\n\nexport class InsertAst extends QueryAst {\n readonly kind = 'insert' as const;\n readonly table: TableSource;\n readonly rows: ReadonlyArray<Readonly<Record<string, InsertValue>>>;\n readonly onConflict: InsertOnConflict | undefined;\n readonly returning: ReadonlyArray<ColumnRef> | undefined;\n\n constructor(\n table: TableSource,\n rows: ReadonlyArray<Record<string, InsertValue>> = [{}],\n onConflict?: InsertOnConflict,\n returning?: ReadonlyArray<ColumnRef>,\n ) {\n super();\n this.table = table;\n this.rows = freezeRows(rows);\n this.onConflict = onConflict;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static into(table: TableSource): InsertAst {\n return new InsertAst(table);\n }\n\n withValues(values: Record<string, InsertValue>): InsertAst {\n return new InsertAst(this.table, [{ ...values }], this.onConflict, this.returning);\n }\n\n withRows(rows: ReadonlyArray<Record<string, InsertValue>>): InsertAst {\n return new InsertAst(\n this.table,\n rows.map((row) => ({ ...row })),\n this.onConflict,\n this.returning,\n );\n }\n\n withReturning(returning: ReadonlyArray<ColumnRef> | undefined): InsertAst {\n return new InsertAst(\n this.table,\n this.rows.map((row) => ({ ...row })),\n this.onConflict,\n returning,\n );\n }\n\n withOnConflict(onConflict: InsertOnConflict | undefined): InsertAst {\n return new InsertAst(\n this.table,\n this.rows.map((row) => ({ ...row })),\n onConflict,\n this.returning,\n );\n }\n\n override collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n for (const row of this.rows) {\n for (const value of Object.values(row)) {\n if (value.kind === 'param-ref') {\n refs.push(value);\n }\n }\n }\n if (this.onConflict?.action.kind === 'do-update-set') {\n for (const value of Object.values(this.onConflict.action.set)) {\n if (value.kind === 'param-ref') {\n refs.push(value);\n }\n }\n }\n return refs;\n }\n\n override collectRefs(): PlanRefs {\n const tables = new Set<string>([this.table.name]);\n const columns = new Map<string, { table: string; column: string }>();\n\n const addColumn = (columnRef: ColumnRef) => addColumnRefToRefSets(columnRef, tables, columns);\n const addValue = (value: InsertValue) => {\n if (value.kind === 'column-ref') {\n addColumn(value);\n }\n };\n\n for (const row of this.rows) {\n for (const value of Object.values(row)) {\n addValue(value);\n }\n }\n\n for (const columnRef of this.returning ?? []) {\n addColumn(columnRef);\n }\n\n if (this.onConflict) {\n for (const columnRef of this.onConflict.columns) {\n addColumn(columnRef);\n }\n if (this.onConflict.action.kind === 'do-update-set') {\n for (const value of Object.values(this.onConflict.action.set)) {\n if (value.kind === 'column-ref') {\n addColumn(value);\n }\n }\n }\n }\n\n return sortRefs(tables, columns);\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport class UpdateAst extends QueryAst {\n readonly kind = 'update' as const;\n readonly table: TableSource;\n readonly set: Readonly<Record<string, ColumnRef | ParamRef>>;\n readonly where: AnyExpression | undefined;\n readonly returning: ReadonlyArray<ColumnRef> | undefined;\n\n constructor(\n table: TableSource,\n set: Readonly<Record<string, ColumnRef | ParamRef>> = {},\n where?: AnyExpression,\n returning?: ReadonlyArray<ColumnRef>,\n ) {\n super();\n this.table = table;\n this.set = frozenRecordCopy(set);\n this.where = where;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static table(table: TableSource): UpdateAst {\n return new UpdateAst(table);\n }\n\n withSet(set: Readonly<Record<string, ColumnRef | ParamRef>>): UpdateAst {\n return new UpdateAst(this.table, set, this.where, this.returning);\n }\n\n withWhere(where: AnyExpression | undefined): UpdateAst {\n return new UpdateAst(this.table, this.set, where, this.returning);\n }\n\n withReturning(returning: ReadonlyArray<ColumnRef> | undefined): UpdateAst {\n return new UpdateAst(this.table, this.set, this.where, returning);\n }\n\n override collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n for (const value of Object.values(this.set)) {\n if (value.kind === 'param-ref') {\n refs.push(value);\n }\n }\n if (this.where) {\n refs.push(...this.where.collectParamRefs());\n }\n return refs;\n }\n\n override collectRefs(): PlanRefs {\n const tables = new Set<string>([this.table.name]);\n const columns = new Map<string, { table: string; column: string }>();\n\n for (const value of Object.values(this.set)) {\n if (value.kind === 'column-ref') {\n addColumnRefToRefSets(value, tables, columns);\n }\n }\n\n for (const columnRef of this.where?.collectColumnRefs() ?? []) {\n addColumnRefToRefSets(columnRef, tables, columns);\n }\n\n for (const columnRef of this.returning ?? []) {\n addColumnRefToRefSets(columnRef, tables, columns);\n }\n\n return sortRefs(tables, columns);\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport class DeleteAst extends QueryAst {\n readonly kind = 'delete' as const;\n readonly table: TableSource;\n readonly where: AnyExpression | undefined;\n readonly returning: ReadonlyArray<ColumnRef> | undefined;\n\n constructor(table: TableSource, where?: AnyExpression, returning?: ReadonlyArray<ColumnRef>) {\n super();\n this.table = table;\n this.where = where;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static from(table: TableSource): DeleteAst {\n return new DeleteAst(table);\n }\n\n withWhere(where: AnyExpression | undefined): DeleteAst {\n return new DeleteAst(this.table, where, this.returning);\n }\n\n withReturning(returning: ReadonlyArray<ColumnRef> | undefined): DeleteAst {\n return new DeleteAst(this.table, this.where, returning);\n }\n\n override collectParamRefs(): ParamRef[] {\n return this.where?.collectParamRefs() ?? [];\n }\n\n override collectRefs(): PlanRefs {\n const tables = new Set<string>([this.table.name]);\n const columns = new Map<string, { table: string; column: string }>();\n\n for (const columnRef of this.where?.collectColumnRefs() ?? []) {\n addColumnRefToRefSets(columnRef, tables, columns);\n }\n\n for (const columnRef of this.returning ?? []) {\n addColumnRefToRefSets(columnRef, tables, columns);\n }\n\n return sortRefs(tables, columns);\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport type AnyQueryAst = SelectAst | InsertAst | UpdateAst | DeleteAst;\nexport type AnyFromSource = TableSource | DerivedTableSource;\nexport type AnyExpression =\n | ColumnRef\n | IdentifierRef\n | ParamRef\n | LiteralExpr\n | SubqueryExpr\n | OperationExpr\n | AggregateExpr\n | JsonObjectExpr\n | JsonArrayAggExpr\n | ListExpression\n | BinaryExpr\n | AndExpr\n | OrExpr\n | ExistsExpr\n | NullCheckExpr\n | NotExpr;\nexport type AnyInsertOnConflictAction = DoNothingConflictAction | DoUpdateSetConflictAction;\nexport type AnyInsertValue = ColumnRef | ParamRef | DefaultValueExpr;\nexport type AnyOperationArg = AnyExpression | ParamRef | LiteralExpr;\n\nexport const queryAstKinds: ReadonlySet<string> = new Set<AnyQueryAst['kind']>([\n 'select',\n 'insert',\n 'update',\n 'delete',\n]);\nexport const whereExprKinds: ReadonlySet<string> = new Set<AnyExpression['kind']>([\n 'binary',\n 'and',\n 'or',\n 'exists',\n 'null-check',\n 'not',\n]);\n\nexport function isQueryAst(value: unknown): value is AnyQueryAst {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n queryAstKinds.has((value as { kind: string }).kind)\n );\n}\n\nexport function isWhereExpr(value: unknown): value is AnyExpression {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n whereExprKinds.has((value as { kind: string }).kind)\n );\n}\n\nexport interface ToWhereExpr {\n toWhereExpr(): AnyExpression;\n}\n\nexport interface LoweredStatement {\n readonly sql: string;\n readonly params: readonly unknown[];\n readonly annotations?: Record<string, unknown>;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,79 +1,63 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-relational-core",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
3
|
+
"version": "0.3.0-dev.123",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "Schema and column builders, operation attachment, and AST types for Prisma Next",
|
|
7
7
|
"dependencies": {
|
|
8
|
+
"arktype": "^2.1.29",
|
|
8
9
|
"ts-toolbelt": "^9.6.0",
|
|
9
|
-
"@prisma-next/contract": "0.3.0-dev.
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/
|
|
12
|
-
"@prisma-next/sql-
|
|
13
|
-
"@prisma-next/sql-
|
|
10
|
+
"@prisma-next/contract": "0.3.0-dev.123",
|
|
11
|
+
"@prisma-next/plan": "0.3.0-dev.123",
|
|
12
|
+
"@prisma-next/operations": "0.3.0-dev.123",
|
|
13
|
+
"@prisma-next/sql-operations": "0.3.0-dev.123",
|
|
14
|
+
"@prisma-next/sql-contract": "0.3.0-dev.123",
|
|
15
|
+
"@prisma-next/utils": "0.3.0-dev.123"
|
|
14
16
|
},
|
|
15
17
|
"devDependencies": {
|
|
16
|
-
"
|
|
17
|
-
"tsup": "8.5.1",
|
|
18
|
+
"tsdown": "0.18.4",
|
|
18
19
|
"typescript": "5.9.3",
|
|
19
|
-
"vitest": "4.0.
|
|
20
|
-
"@prisma-next/sql-contract-ts": "0.3.0-dev.
|
|
21
|
-
"@prisma-next/test-utils": "0.0.1"
|
|
20
|
+
"vitest": "4.0.17",
|
|
21
|
+
"@prisma-next/sql-contract-ts": "0.3.0-dev.123",
|
|
22
|
+
"@prisma-next/test-utils": "0.0.1",
|
|
23
|
+
"@prisma-next/tsconfig": "0.0.0",
|
|
24
|
+
"@prisma-next/tsdown": "0.0.0"
|
|
22
25
|
},
|
|
23
26
|
"files": [
|
|
24
27
|
"dist",
|
|
25
28
|
"src"
|
|
26
29
|
],
|
|
27
30
|
"exports": {
|
|
28
|
-
".":
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"./
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"./
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"./
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
"types": "./dist/exports/errors.d.ts",
|
|
50
|
-
"import": "./dist/exports/errors.js"
|
|
51
|
-
},
|
|
52
|
-
"./ast": {
|
|
53
|
-
"types": "./dist/exports/ast.d.ts",
|
|
54
|
-
"import": "./dist/exports/ast.js"
|
|
55
|
-
},
|
|
56
|
-
"./plan": {
|
|
57
|
-
"types": "./dist/exports/plan.d.ts",
|
|
58
|
-
"import": "./dist/exports/plan.js"
|
|
59
|
-
},
|
|
60
|
-
"./query-lane-context": {
|
|
61
|
-
"types": "./dist/exports/query-lane-context.d.ts",
|
|
62
|
-
"import": "./dist/exports/query-lane-context.js"
|
|
63
|
-
},
|
|
64
|
-
"./utils/guards": {
|
|
65
|
-
"types": "./dist/exports/guards.d.ts",
|
|
66
|
-
"import": "./dist/exports/guards.js"
|
|
67
|
-
}
|
|
31
|
+
".": "./dist/index.mjs",
|
|
32
|
+
"./ast": "./dist/exports/ast.mjs",
|
|
33
|
+
"./errors": "./dist/exports/errors.mjs",
|
|
34
|
+
"./guards": "./dist/exports/guards.mjs",
|
|
35
|
+
"./operations-registry": "./dist/exports/operations-registry.mjs",
|
|
36
|
+
"./param": "./dist/exports/param.mjs",
|
|
37
|
+
"./plan": "./dist/exports/plan.mjs",
|
|
38
|
+
"./query-lane-context": "./dist/exports/query-lane-context.mjs",
|
|
39
|
+
"./query-operations": "./dist/exports/query-operations.mjs",
|
|
40
|
+
"./schema": "./dist/exports/schema.mjs",
|
|
41
|
+
"./types": "./dist/exports/types.mjs",
|
|
42
|
+
"./utils/guards": "./dist/exports/utils/guards.mjs",
|
|
43
|
+
"./package.json": "./package.json"
|
|
44
|
+
},
|
|
45
|
+
"main": "./dist/index.mjs",
|
|
46
|
+
"module": "./dist/index.mjs",
|
|
47
|
+
"types": "./dist/index.d.mts",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/prisma/prisma-next.git",
|
|
51
|
+
"directory": "packages/2-sql/4-lanes/relational-core"
|
|
68
52
|
},
|
|
69
53
|
"scripts": {
|
|
70
|
-
"build": "
|
|
54
|
+
"build": "tsdown",
|
|
71
55
|
"test": "vitest run",
|
|
72
56
|
"test:coverage": "vitest run --coverage",
|
|
73
57
|
"typecheck": "tsc --project tsconfig.json --noEmit",
|
|
74
58
|
"lint": "biome check . --error-on-warnings",
|
|
75
59
|
"lint:fix": "biome check --write .",
|
|
76
60
|
"lint:fix:unsafe": "biome check --write --unsafe .",
|
|
77
|
-
"clean": "
|
|
61
|
+
"clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output"
|
|
78
62
|
}
|
|
79
63
|
}
|
package/src/ast/codec-types.ts
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
|
+
import { ifDefined } from '@prisma-next/utils/defined';
|
|
2
|
+
import type { Type } from 'arktype';
|
|
1
3
|
import type { O } from 'ts-toolbelt';
|
|
2
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Semantic traits a codec declares.
|
|
7
|
+
* Used by DSL surfaces to gate which operators and functions are available.
|
|
8
|
+
*/
|
|
9
|
+
export type CodecTrait = 'equality' | 'order' | 'boolean' | 'numeric' | 'textual';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Descriptor for parameterized codecs that require type parameter validation.
|
|
13
|
+
* Shared between adapter (compile-time) and runtime layers to avoid duplication.
|
|
14
|
+
*
|
|
15
|
+
* @template TParams - The shape of the type parameters (e.g., `{ length: number }`)
|
|
16
|
+
* @template THelper - The type returned by the optional `init` hook
|
|
17
|
+
*/
|
|
18
|
+
export interface CodecParamsDescriptor<TParams = Record<string, unknown>, THelper = unknown> {
|
|
19
|
+
/** The codec ID this descriptor applies to (e.g., 'pg/vector@1') */
|
|
20
|
+
readonly codecId: string;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Arktype schema for validating typeParams.
|
|
24
|
+
* Used to validate both storage.types entries and inline column typeParams.
|
|
25
|
+
*/
|
|
26
|
+
readonly paramsSchema: Type<TParams>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Optional init hook called during runtime context creation.
|
|
30
|
+
* Receives validated params and returns a helper object to be stored in context.types.
|
|
31
|
+
* If not provided, the validated params are stored directly.
|
|
32
|
+
*/
|
|
33
|
+
readonly init?: (params: TParams) => THelper;
|
|
34
|
+
}
|
|
35
|
+
|
|
3
36
|
/**
|
|
4
37
|
* Codec metadata for database-specific type information.
|
|
5
38
|
* Used for schema introspection and verification.
|
|
@@ -20,7 +53,14 @@ export interface CodecMeta {
|
|
|
20
53
|
* Codecs are pure, synchronous functions with no side effects or IO.
|
|
21
54
|
* They provide deterministic conversion between database wire types and JS values.
|
|
22
55
|
*/
|
|
23
|
-
export interface Codec<
|
|
56
|
+
export interface Codec<
|
|
57
|
+
Id extends string = string,
|
|
58
|
+
TTraits extends readonly CodecTrait[] = readonly CodecTrait[],
|
|
59
|
+
TWire = unknown,
|
|
60
|
+
TJs = unknown,
|
|
61
|
+
TParams = Record<string, unknown>,
|
|
62
|
+
THelper = unknown,
|
|
63
|
+
> {
|
|
24
64
|
/**
|
|
25
65
|
* Namespaced codec identifier in format 'namespace/name@version'
|
|
26
66
|
* Examples: 'pg/text@1', 'pg/uuid@1', 'pg/timestamptz@1'
|
|
@@ -39,6 +79,31 @@ export interface Codec<Id extends string = string, TWire = unknown, TJs = unknow
|
|
|
39
79
|
*/
|
|
40
80
|
readonly meta?: CodecMeta;
|
|
41
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Optional params schema for parameterized codecs.
|
|
84
|
+
* If provided, typeParams are validated against this schema.
|
|
85
|
+
*/
|
|
86
|
+
readonly paramsSchema?: Type<TParams>;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Optional init hook for building runtime helper state from validated params.
|
|
90
|
+
*
|
|
91
|
+
* Useful when parameterized types need derived data at runtime, for example:
|
|
92
|
+
* - normalize typeParams into a stable helper shape consumed by lanes/adapters
|
|
93
|
+
* - precompute reusable values once during context creation
|
|
94
|
+
* - avoid repeating typeParams parsing logic during query execution
|
|
95
|
+
*
|
|
96
|
+
* Example:
|
|
97
|
+
* { length: 255 } -> { kind: 'variable', maxLength: 255 }
|
|
98
|
+
*
|
|
99
|
+
* **Convention for JSON/JSONB codecs**: When the helper includes a `validate`
|
|
100
|
+
* property of type `JsonSchemaValidateFn`, the runtime will use it to enforce
|
|
101
|
+
* JSON Schema conformance during encoding and decoding. The property is
|
|
102
|
+
* discovered via duck typing (`helper?.validate`) for flexibility across
|
|
103
|
+
* different codec types.
|
|
104
|
+
*/
|
|
105
|
+
readonly init?: (params: TParams) => THelper;
|
|
106
|
+
|
|
42
107
|
/**
|
|
43
108
|
* Decode a wire value (from database) to JavaScript type.
|
|
44
109
|
* Must be synchronous and pure (no side effects).
|
|
@@ -51,6 +116,13 @@ export interface Codec<Id extends string = string, TWire = unknown, TJs = unknow
|
|
|
51
116
|
* Must be synchronous and pure (no side effects).
|
|
52
117
|
*/
|
|
53
118
|
encode?(value: TJs): TWire;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Semantic traits this codec's type supports.
|
|
122
|
+
* Used by DSL surfaces to gate which operators and functions are available.
|
|
123
|
+
* When omitted, the codec is treated as having no traits.
|
|
124
|
+
*/
|
|
125
|
+
readonly traits?: TTraits;
|
|
54
126
|
}
|
|
55
127
|
|
|
56
128
|
/**
|
|
@@ -67,6 +139,10 @@ export interface CodecRegistry {
|
|
|
67
139
|
getByScalar(scalar: string): readonly Codec<string>[];
|
|
68
140
|
getDefaultCodec(scalar: string): Codec<string> | undefined;
|
|
69
141
|
register(codec: Codec<string>): void;
|
|
142
|
+
/** Returns true if the codec with this ID has the given trait. */
|
|
143
|
+
hasTrait(codecId: string, trait: CodecTrait): boolean;
|
|
144
|
+
/** Returns all traits for a codec, or an empty array if not found. */
|
|
145
|
+
traitsOf(codecId: string): readonly CodecTrait[];
|
|
70
146
|
[Symbol.iterator](): Iterator<Codec<string>>;
|
|
71
147
|
values(): IterableIterator<Codec<string>>;
|
|
72
148
|
}
|
|
@@ -136,6 +212,15 @@ class CodecRegistryImpl implements CodecRegistry {
|
|
|
136
212
|
}
|
|
137
213
|
}
|
|
138
214
|
|
|
215
|
+
hasTrait(codecId: string, trait: CodecTrait): boolean {
|
|
216
|
+
const codec = this._byId.get(codecId);
|
|
217
|
+
return codec?.traits?.includes(trait) ?? false;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
traitsOf(codecId: string): readonly CodecTrait[] {
|
|
221
|
+
return this._byId.get(codecId)?.traits ?? [];
|
|
222
|
+
}
|
|
223
|
+
|
|
139
224
|
/**
|
|
140
225
|
* Returns an iterator over all registered codecs.
|
|
141
226
|
* Useful for iterating through codecs from another registry.
|
|
@@ -157,17 +242,33 @@ class CodecRegistryImpl implements CodecRegistry {
|
|
|
157
242
|
/**
|
|
158
243
|
* Codec factory - creates a codec with typeId and encode/decode functions.
|
|
159
244
|
*/
|
|
160
|
-
export function codec<
|
|
245
|
+
export function codec<
|
|
246
|
+
Id extends string,
|
|
247
|
+
const TTraits extends readonly CodecTrait[],
|
|
248
|
+
TWire,
|
|
249
|
+
TJs,
|
|
250
|
+
TParams = Record<string, unknown>,
|
|
251
|
+
THelper = unknown,
|
|
252
|
+
>(config: {
|
|
161
253
|
typeId: Id;
|
|
162
254
|
targetTypes: readonly string[];
|
|
163
255
|
encode: (value: TJs) => TWire;
|
|
164
256
|
decode: (wire: TWire) => TJs;
|
|
165
257
|
meta?: CodecMeta;
|
|
166
|
-
|
|
258
|
+
paramsSchema?: Type<TParams>;
|
|
259
|
+
init?: (params: TParams) => THelper;
|
|
260
|
+
traits?: TTraits;
|
|
261
|
+
}): Codec<Id, TTraits, TWire, TJs, TParams, THelper> {
|
|
167
262
|
return {
|
|
168
263
|
id: config.typeId,
|
|
169
264
|
targetTypes: config.targetTypes,
|
|
170
|
-
...(
|
|
265
|
+
...ifDefined('meta', config.meta),
|
|
266
|
+
...ifDefined('paramsSchema', config.paramsSchema),
|
|
267
|
+
...ifDefined('init', config.init),
|
|
268
|
+
...ifDefined(
|
|
269
|
+
'traits',
|
|
270
|
+
config.traits ? (Object.freeze([...config.traits]) as TTraits) : undefined,
|
|
271
|
+
),
|
|
171
272
|
encode: config.encode,
|
|
172
273
|
decode: config.decode,
|
|
173
274
|
};
|
|
@@ -176,13 +277,14 @@ export function codec<Id extends string, TWire, TJs>(config: {
|
|
|
176
277
|
/**
|
|
177
278
|
* Type helpers to extract codec types.
|
|
178
279
|
*/
|
|
179
|
-
export type CodecId<T> =
|
|
180
|
-
? Id
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
export type
|
|
280
|
+
export type CodecId<T> =
|
|
281
|
+
T extends Codec<infer Id> ? Id : T extends { readonly id: infer Id } ? Id : never;
|
|
282
|
+
export type CodecInput<T> =
|
|
283
|
+
T extends Codec<string, readonly CodecTrait[], unknown, infer JsT> ? JsT : never;
|
|
284
|
+
export type CodecOutput<T> =
|
|
285
|
+
T extends Codec<string, readonly CodecTrait[], unknown, infer JsT> ? JsT : never;
|
|
286
|
+
export type CodecTraits<T> =
|
|
287
|
+
T extends Codec<string, infer TTraits> ? TTraits[number] & CodecTrait : never;
|
|
186
288
|
|
|
187
289
|
/**
|
|
188
290
|
* Type helper to extract codec types from builder instance.
|
|
@@ -190,11 +292,10 @@ export type CodecOutput<T> = T extends Codec<string, unknown, infer JsT> ? JsT :
|
|
|
190
292
|
export type ExtractCodecTypes<
|
|
191
293
|
ScalarNames extends { readonly [K in keyof ScalarNames]: Codec<string> } = Record<never, never>,
|
|
192
294
|
> = {
|
|
193
|
-
readonly [K in keyof ScalarNames as ScalarNames[K] extends Codec<infer Id
|
|
194
|
-
? Id
|
|
195
|
-
: never]: {
|
|
295
|
+
readonly [K in keyof ScalarNames as ScalarNames[K] extends Codec<infer Id> ? Id : never]: {
|
|
196
296
|
readonly input: CodecInput<ScalarNames[K]>;
|
|
197
297
|
readonly output: CodecOutput<ScalarNames[K]>;
|
|
298
|
+
readonly traits: CodecTraits<ScalarNames[K]>;
|
|
198
299
|
};
|
|
199
300
|
};
|
|
200
301
|
|
|
@@ -230,9 +331,7 @@ export interface CodecDefBuilder<
|
|
|
230
331
|
|
|
231
332
|
readonly codecDefinitions: {
|
|
232
333
|
readonly [K in keyof ScalarNames]: {
|
|
233
|
-
readonly typeId: ScalarNames[K] extends Codec<infer Id extends string
|
|
234
|
-
? Id
|
|
235
|
-
: never;
|
|
334
|
+
readonly typeId: ScalarNames[K] extends Codec<infer Id extends string> ? Id : never;
|
|
236
335
|
readonly scalar: K;
|
|
237
336
|
readonly codec: ScalarNames[K];
|
|
238
337
|
readonly input: CodecInput<ScalarNames[K]>;
|
|
@@ -268,12 +367,16 @@ class CodecDefBuilderImpl<
|
|
|
268
367
|
this._codecs = codecs;
|
|
269
368
|
|
|
270
369
|
// Populate CodecTypes from codecs
|
|
271
|
-
const codecTypes: Record<
|
|
370
|
+
const codecTypes: Record<
|
|
371
|
+
string,
|
|
372
|
+
{ readonly input: unknown; readonly output: unknown; readonly traits: unknown }
|
|
373
|
+
> = {};
|
|
272
374
|
for (const [, codecImpl] of Object.entries(this._codecs)) {
|
|
273
375
|
const codecImplTyped = codecImpl as Codec<string>;
|
|
274
376
|
codecTypes[codecImplTyped.id] = {
|
|
275
377
|
input: undefined as unknown as CodecInput<typeof codecImplTyped>,
|
|
276
378
|
output: undefined as unknown as CodecOutput<typeof codecImplTyped>,
|
|
379
|
+
traits: undefined as unknown as CodecTraits<typeof codecImplTyped>,
|
|
277
380
|
};
|
|
278
381
|
}
|
|
279
382
|
this.CodecTypes = codecTypes as ExtractCodecTypes<ScalarNames>;
|
|
@@ -313,7 +416,7 @@ class CodecDefBuilderImpl<
|
|
|
313
416
|
*/
|
|
314
417
|
get codecDefinitions(): {
|
|
315
418
|
readonly [K in keyof ScalarNames]: {
|
|
316
|
-
readonly typeId: ScalarNames[K] extends Codec<infer Id
|
|
419
|
+
readonly typeId: ScalarNames[K] extends Codec<infer Id> ? Id : never;
|
|
317
420
|
readonly scalar: K;
|
|
318
421
|
readonly codec: ScalarNames[K];
|
|
319
422
|
readonly input: CodecInput<ScalarNames[K]>;
|
|
@@ -347,9 +450,7 @@ class CodecDefBuilderImpl<
|
|
|
347
450
|
|
|
348
451
|
return result as {
|
|
349
452
|
readonly [K in keyof ScalarNames]: {
|
|
350
|
-
readonly typeId: ScalarNames[K] extends Codec<infer Id extends string
|
|
351
|
-
? Id
|
|
352
|
-
: never;
|
|
453
|
+
readonly typeId: ScalarNames[K] extends Codec<infer Id extends string> ? Id : never;
|
|
353
454
|
readonly scalar: K;
|
|
354
455
|
readonly codec: ScalarNames[K];
|
|
355
456
|
readonly input: CodecInput<ScalarNames[K]>;
|
package/src/ast/driver-types.ts
CHANGED
|
@@ -13,13 +13,30 @@ export interface SqlExplainResult<Row = Record<string, unknown>> {
|
|
|
13
13
|
readonly rows: ReadonlyArray<Row>;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export
|
|
17
|
-
|
|
16
|
+
export type SqlDriverState = 'unbound' | 'connected' | 'closed';
|
|
17
|
+
|
|
18
|
+
export interface SqlDriver<TBinding = void> extends SqlQueryable {
|
|
19
|
+
readonly state?: SqlDriverState;
|
|
20
|
+
connect(binding: TBinding): Promise<void>;
|
|
21
|
+
acquireConnection(): Promise<SqlConnection>;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface SqlConnection extends SqlQueryable {
|
|
26
|
+
beginTransaction(): Promise<SqlTransaction>;
|
|
27
|
+
release(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface SqlTransaction extends SqlQueryable {
|
|
31
|
+
commit(): Promise<void>;
|
|
32
|
+
rollback(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface SqlQueryable {
|
|
18
36
|
execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row>;
|
|
19
37
|
explain?(request: SqlExecuteRequest): Promise<SqlExplainResult>;
|
|
20
38
|
query<Row = Record<string, unknown>>(
|
|
21
39
|
sql: string,
|
|
22
40
|
params?: readonly unknown[],
|
|
23
41
|
): Promise<SqlQueryResult<Row>>;
|
|
24
|
-
close(): Promise<void>;
|
|
25
42
|
}
|
package/src/ast/join.ts
CHANGED
|
@@ -1,28 +1,7 @@
|
|
|
1
1
|
import { planInvalid } from '@prisma-next/plan';
|
|
2
2
|
import type { AnyColumnBuilder, JoinOnBuilder, JoinOnPredicate } from '../types';
|
|
3
3
|
import { isColumnBuilder } from '../types';
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
export function createJoin(
|
|
7
|
-
joinType: 'inner' | 'left' | 'right' | 'full',
|
|
8
|
-
table: TableRef,
|
|
9
|
-
on: JoinOnExpr,
|
|
10
|
-
): JoinAst {
|
|
11
|
-
return {
|
|
12
|
-
kind: 'join',
|
|
13
|
-
joinType,
|
|
14
|
-
table,
|
|
15
|
-
on,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function createJoinOnExpr(left: ColumnRef, right: ColumnRef): JoinOnExpr {
|
|
20
|
-
return {
|
|
21
|
-
kind: 'eqCol',
|
|
22
|
-
left,
|
|
23
|
-
right,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
4
|
+
import { EqColJoinOn, JoinAst } from './types';
|
|
26
5
|
|
|
27
6
|
class JoinOnBuilderImpl implements JoinOnBuilder {
|
|
28
7
|
eqCol(left: AnyColumnBuilder, right: AnyColumnBuilder): JoinOnPredicate {
|
|
@@ -34,7 +13,6 @@ class JoinOnBuilderImpl implements JoinOnBuilder {
|
|
|
34
13
|
throw planInvalid('Join ON right operand must be a column');
|
|
35
14
|
}
|
|
36
15
|
|
|
37
|
-
// TypeScript can't narrow ColumnBuilder properly, so we assert
|
|
38
16
|
const leftCol = left as unknown as { table: string; column: string };
|
|
39
17
|
const rightCol = right as unknown as { table: string; column: string };
|
|
40
18
|
if (leftCol.table === rightCol.table) {
|
|
@@ -49,6 +27,8 @@ class JoinOnBuilderImpl implements JoinOnBuilder {
|
|
|
49
27
|
}
|
|
50
28
|
}
|
|
51
29
|
|
|
30
|
+
export { EqColJoinOn, JoinAst };
|
|
31
|
+
|
|
52
32
|
export function createJoinOnBuilder(): JoinOnBuilder {
|
|
53
33
|
return new JoinOnBuilderImpl();
|
|
54
34
|
}
|