@prisma-next/sql-relational-core 0.5.0-dev.3 → 0.5.0-dev.30
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/README.md +67 -1
- package/dist/{codec-types-DcEITed4.d.mts → codec-types-DAQNecFs.d.mts} +84 -21
- package/dist/codec-types-DAQNecFs.d.mts.map +1 -0
- package/dist/{errors-ChY_dHam.d.mts → errors-CJKxtKSt.d.mts} +2 -2
- package/dist/errors-CJKxtKSt.d.mts.map +1 -0
- package/dist/{errors-D3xmG4h-.mjs → errors-D6kqqjHM.mjs} +1 -1
- package/dist/{errors-D3xmG4h-.mjs.map → errors-D6kqqjHM.mjs.map} +1 -1
- package/dist/exports/ast.d.mts +27 -12
- package/dist/exports/ast.d.mts.map +1 -1
- package/dist/exports/ast.mjs +63 -1089
- package/dist/exports/ast.mjs.map +1 -1
- package/dist/exports/errors.d.mts +4 -4
- package/dist/exports/errors.mjs +1 -1
- package/dist/exports/expression.d.mts +79 -0
- package/dist/exports/expression.d.mts.map +1 -0
- package/dist/exports/expression.mjs +41 -0
- package/dist/exports/expression.mjs.map +1 -0
- package/dist/exports/plan.d.mts +3 -2
- package/dist/exports/plan.mjs +1 -17
- package/dist/exports/query-lane-context.d.mts +2 -2
- package/dist/exports/types.d.mts +5 -4
- package/dist/index.d.mts +11 -9
- package/dist/index.mjs +6 -4
- package/dist/plan-C7SiEWkN.d.mts +25 -0
- package/dist/plan-C7SiEWkN.d.mts.map +1 -0
- package/dist/{query-lane-context-UlR8vOkd.d.mts → query-lane-context-Cch9CN9H.d.mts} +2 -2
- package/dist/{query-lane-context-UlR8vOkd.d.mts.map → query-lane-context-Cch9CN9H.d.mts.map} +1 -1
- package/dist/sql-execution-plan-Dgx7BGin.d.mts +33 -0
- package/dist/sql-execution-plan-Dgx7BGin.d.mts.map +1 -0
- package/dist/{types-C3Hg-CVz.d.mts → types-B4dL4lc3.d.mts} +17 -22
- package/dist/types-B4dL4lc3.d.mts.map +1 -0
- package/dist/types-BUlUvdIU.d.mts +24 -0
- package/dist/types-BUlUvdIU.d.mts.map +1 -0
- package/dist/types-DUL-3vy6.mjs +1064 -0
- package/dist/types-DUL-3vy6.mjs.map +1 -0
- package/dist/{types-k9pir8XY.d.mts → types-TPM2rhCa.d.mts} +12 -19
- package/dist/types-TPM2rhCa.d.mts.map +1 -0
- package/package.json +10 -9
- package/src/ast/adapter-types.ts +8 -0
- package/src/ast/codec-types.ts +142 -43
- package/src/ast/sql-codecs.ts +20 -3
- package/src/ast/types.ts +142 -172
- package/src/ast/util.ts +23 -0
- package/src/exports/expression.ts +1 -0
- package/src/exports/plan.ts +1 -0
- package/src/exports/types.ts +1 -0
- package/src/expression.ts +117 -0
- package/src/index.ts +1 -0
- package/src/plan.ts +11 -30
- package/src/runtime-scope.ts +20 -0
- package/src/sql-execution-plan.ts +28 -0
- package/src/types.ts +9 -22
- package/dist/codec-types-DcEITed4.d.mts.map +0 -1
- package/dist/errors-ChY_dHam.d.mts.map +0 -1
- package/dist/exports/plan.mjs.map +0 -1
- package/dist/plan-Cs65hb-E.d.mts +0 -28
- package/dist/plan-Cs65hb-E.d.mts.map +0 -1
- package/dist/types-C3Hg-CVz.d.mts.map +0 -1
- package/dist/types-k9pir8XY.d.mts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-DUL-3vy6.mjs","names":["result: Record<string, InsertValue>","rewritten","result: Record<string, ColumnRef | ParamRef>","refs: ColumnRef[]","refs: ParamRef[]","queryAstKinds: ReadonlySet<string>","whereExprKinds: ReadonlySet<string>"],"sources":["../src/ast/types.ts"],"sourcesContent":["import type { ParamSpec } from '@prisma-next/operations';\nimport type { SqlLoweringSpec } from '@prisma-next/sql-operations';\n\nexport type Direction = 'asc' | 'desc';\n\nexport type BinaryOp = 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'like' | 'in' | '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 rewriteTableSource(table: TableSource, rewriter: AstRewriter): TableSource {\n return rewriter.tableSource ? rewriter.tableSource(table) : table;\n}\n\nfunction rewriteProjectionItem(item: ProjectionItem, rewriter: AstRewriter): ProjectionItem {\n const rewrittenExpr =\n item.expr.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(item.expr)\n : item.expr\n : item.expr.rewrite(rewriter);\n return new ProjectionItem(item.alias, rewrittenExpr, item.codecId);\n}\n\nfunction rewriteInsertValue(value: InsertValue, rewriter: AstRewriter): InsertValue {\n switch (value.kind) {\n case 'param-ref':\n return rewriter.paramRef ? rewriteParamRefForInsert(value, rewriter) : value;\n case 'column-ref':\n return rewriter.columnRef ? rewriteColumnRefForInsert(value, rewriter) : value;\n case 'default-value':\n return value;\n }\n}\n\nfunction rewriteParamRefForInsert(value: ParamRef, rewriter: AstRewriter): InsertValue {\n const rewritten = rewriter.paramRef ? rewriter.paramRef(value) : value;\n return rewritten.kind === 'param-ref' ? rewritten : value;\n}\n\nfunction rewriteColumnRefForInsert(value: ColumnRef, rewriter: AstRewriter): InsertValue {\n const rewritten = rewriter.columnRef ? rewriter.columnRef(value) : value;\n return rewritten.kind === 'column-ref' ? rewritten : value;\n}\n\nfunction rewriteInsertRow(\n row: Readonly<Record<string, InsertValue>>,\n rewriter: AstRewriter,\n): Record<string, InsertValue> {\n const result: Record<string, InsertValue> = {};\n for (const [key, value] of Object.entries(row)) {\n result[key] = rewriteInsertValue(value, rewriter);\n }\n return result;\n}\n\nfunction rewriteUpdateSetValue(\n value: ColumnRef | ParamRef,\n rewriter: AstRewriter,\n): ColumnRef | ParamRef {\n if (value.kind === 'column-ref') {\n const rewritten = rewriter.columnRef ? rewriter.columnRef(value) : value;\n return rewritten.kind === 'column-ref' ? rewritten : value;\n }\n const rewritten = rewriter.paramRef ? rewriter.paramRef(value) : value;\n return rewritten.kind === 'param-ref' ? rewritten : value;\n}\n\nfunction rewriteUpdateSet(\n set: Readonly<Record<string, ColumnRef | ParamRef>>,\n rewriter: AstRewriter,\n): Record<string, ColumnRef | ParamRef> {\n const result: Record<string, ColumnRef | ParamRef> = {};\n for (const [key, value] of Object.entries(set)) {\n result[key] = rewriteUpdateSetValue(value, rewriter);\n }\n return result;\n}\n\nfunction rewriteOnConflict(onConflict: InsertOnConflict, rewriter: AstRewriter): InsertOnConflict {\n const columns = onConflict.columns.map((columnRef) => {\n const rewritten = rewriter.columnRef ? rewriter.columnRef(columnRef) : columnRef;\n return rewritten.kind === 'column-ref' ? rewritten : columnRef;\n });\n\n if (onConflict.action.kind === 'do-nothing') {\n return new InsertOnConflict(columns, new DoNothingConflictAction());\n }\n\n return new InsertOnConflict(\n columns,\n new DoUpdateSetConflictAction(rewriteUpdateSet(onConflict.action.set, rewriter)),\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 collectParamRefs(): ParamRef[];\n abstract toQueryAst(): AnyQueryAst;\n}\n\nabstract class FromSource extends AstNode {\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\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\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 self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr>;\n readonly returns: ParamSpec;\n readonly lowering: SqlLoweringSpec;\n\n constructor(options: {\n readonly method: string;\n readonly self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr> | undefined;\n readonly returns: ParamSpec;\n readonly lowering: SqlLoweringSpec;\n }) {\n super();\n this.method = options.method;\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 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 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 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 readonly codecId: string | undefined;\n\n constructor(alias: string, expr: ProjectionExpr, codecId?: string) {\n super();\n this.alias = alias;\n this.expr = expr;\n this.codecId = codecId;\n this.freeze();\n }\n\n static of(alias: string, expr: ProjectionExpr, codecId?: string): ProjectionItem {\n return new ProjectionItem(alias, expr, codecId);\n }\n\n withCodecId(codecId: string | undefined): ProjectionItem {\n return new ProjectionItem(this.alias, this.expr, codecId);\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 projection.codecId,\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 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 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<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n rows: ReadonlyArray<Record<string, InsertValue>> = [{}],\n onConflict?: InsertOnConflict,\n returning?: ReadonlyArray<ProjectionItem>,\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<ProjectionItem> | 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 rewrite(rewriter: AstRewriter): InsertAst {\n return new InsertAst(\n rewriteTableSource(this.table, rewriter),\n this.rows.map((row) => rewriteInsertRow(row, rewriter)),\n this.onConflict ? rewriteOnConflict(this.onConflict, rewriter) : undefined,\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\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 for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\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<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n set: Readonly<Record<string, ColumnRef | ParamRef>> = {},\n where?: AnyExpression,\n returning?: ReadonlyArray<ProjectionItem>,\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<ProjectionItem> | undefined): UpdateAst {\n return new UpdateAst(this.table, this.set, this.where, returning);\n }\n\n rewrite(rewriter: AstRewriter): UpdateAst {\n return new UpdateAst(\n rewriteTableSource(this.table, rewriter),\n rewriteUpdateSet(this.set, rewriter),\n this.where?.rewrite(rewriter),\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\n );\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 for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\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<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n where?: AnyExpression,\n returning?: ReadonlyArray<ProjectionItem>,\n ) {\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<ProjectionItem> | undefined): DeleteAst {\n return new DeleteAst(this.table, this.where, returning);\n }\n\n rewrite(rewriter: AstRewriter): DeleteAst {\n return new DeleteAst(\n rewriteTableSource(this.table, rewriter),\n this.where?.rewrite(rewriter),\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\n );\n }\n\n override collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n if (this.where) {\n refs.push(...this.where.collectParamRefs());\n }\n for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\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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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { G as ParamRef,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { Contract
|
|
1
|
+
import { G as ParamRef, h as ColumnRef } from "./types-B4dL4lc3.mjs";
|
|
2
|
+
import { n as ExecutionContext } from "./query-lane-context-Cch9CN9H.mjs";
|
|
3
|
+
import { t as SqlExecutionPlan } from "./sql-execution-plan-Dgx7BGin.mjs";
|
|
4
|
+
import { Contract } from "@prisma-next/contract/types";
|
|
5
5
|
import { ParamSpec } from "@prisma-next/operations";
|
|
6
6
|
import { SqlLoweringSpec } from "@prisma-next/sql-operations";
|
|
7
7
|
import { ExtractFieldOutputTypes, SqlStorage, StorageColumn } from "@prisma-next/sql-contract/types";
|
|
@@ -107,10 +107,11 @@ type HasIncludeManyCapabilities<TContract extends Contract<SqlStorage>> = TContr
|
|
|
107
107
|
jsonAgg: true;
|
|
108
108
|
} ? true : false : false : false : false : false;
|
|
109
109
|
/**
|
|
110
|
-
* SQL-
|
|
111
|
-
*
|
|
110
|
+
* Alias for the SQL-domain executable plan, exposed under the legacy
|
|
111
|
+
* `SqlPlan` name for compatibility with SQL builder/utility call sites.
|
|
112
|
+
* The canonical name is `SqlExecutionPlan` (`./sql-execution-plan`).
|
|
112
113
|
*/
|
|
113
|
-
type SqlPlan<Row = unknown> =
|
|
114
|
+
type SqlPlan<Row = unknown> = SqlExecutionPlan<Row>;
|
|
114
115
|
/**
|
|
115
116
|
* Helper types for extracting contract structure.
|
|
116
117
|
*/
|
|
@@ -160,16 +161,14 @@ type ColumnsOf<TContract, K extends TableKey<TContract>> = K extends keyof Table
|
|
|
160
161
|
columns: infer C;
|
|
161
162
|
} ? C : never : never;
|
|
162
163
|
interface RawTemplateOptions {
|
|
163
|
-
readonly refs?: PlanRefs;
|
|
164
164
|
readonly annotations?: Record<string, unknown>;
|
|
165
|
-
readonly projection?: ReadonlyArray<string>;
|
|
166
165
|
}
|
|
167
166
|
interface RawFunctionOptions extends RawTemplateOptions {
|
|
168
167
|
readonly params: ReadonlyArray<unknown>;
|
|
169
168
|
}
|
|
170
|
-
type RawTemplateFactory = (strings: TemplateStringsArray, ...values: readonly unknown[]) =>
|
|
169
|
+
type RawTemplateFactory = (strings: TemplateStringsArray, ...values: readonly unknown[]) => SqlExecutionPlan;
|
|
171
170
|
interface RawFactory extends RawTemplateFactory {
|
|
172
|
-
(text: string, options: RawFunctionOptions):
|
|
171
|
+
(text: string, options: RawFunctionOptions): SqlExecutionPlan;
|
|
173
172
|
with(options: RawTemplateOptions): RawTemplateFactory;
|
|
174
173
|
}
|
|
175
174
|
interface RuntimeError extends Error {
|
|
@@ -189,12 +188,6 @@ interface BuildOptions {
|
|
|
189
188
|
interface SqlBuilderOptions<TContract extends Contract<SqlStorage> = Contract<SqlStorage>> {
|
|
190
189
|
readonly context: ExecutionContext<TContract>;
|
|
191
190
|
}
|
|
192
|
-
/**
|
|
193
|
-
* SQL-specific ResultType that works with both Plan and SqlQueryPlan.
|
|
194
|
-
* This extends the core ResultType to also handle SqlQueryPlan.
|
|
195
|
-
* Example: `type Row = ResultType<typeof plan>`
|
|
196
|
-
*/
|
|
197
|
-
type ResultType$1<P> = P extends SqlQueryPlan<infer R> ? R : ResultType<P>;
|
|
198
191
|
//#endregion
|
|
199
|
-
export {
|
|
200
|
-
//# sourceMappingURL=types-
|
|
192
|
+
export { TableKey as C, TableDef as S, TablesOf as T, RawTemplateFactory as _, ComputeColumnJsType as a, SqlBuilderOptions as b, META as c, ModelMetadata as d, OperationTypeSignature as f, RawFunctionOptions as g, RawFactory as h, ColumnsOf as i, Meta as l, OperationsForTypeId as m, BuildParamsMap as n, Expr as o, OperationTypes as p, CodecTypes as r, HasIncludeManyCapabilities as s, BuildOptions as t, ModelDef as u, RawTemplateOptions as v, TableMetadata as w, SqlPlan as x, RuntimeError as y };
|
|
193
|
+
//# sourceMappingURL=types-TPM2rhCa.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-TPM2rhCa.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-relational-core",
|
|
3
|
-
"version": "0.5.0-dev.
|
|
3
|
+
"version": "0.5.0-dev.30",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "AST types, query lane context, and type utilities for Prisma Next SQL lanes",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"arktype": "^2.1.29",
|
|
9
9
|
"ts-toolbelt": "^9.6.0",
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/
|
|
12
|
-
"@prisma-next/
|
|
13
|
-
"@prisma-next/
|
|
14
|
-
"@prisma-next/sql-operations": "0.5.0-dev.
|
|
15
|
-
"@prisma-next/utils": "0.5.0-dev.
|
|
10
|
+
"@prisma-next/framework-components": "0.5.0-dev.30",
|
|
11
|
+
"@prisma-next/contract": "0.5.0-dev.30",
|
|
12
|
+
"@prisma-next/sql-contract": "0.5.0-dev.30",
|
|
13
|
+
"@prisma-next/operations": "0.5.0-dev.30",
|
|
14
|
+
"@prisma-next/sql-operations": "0.5.0-dev.30",
|
|
15
|
+
"@prisma-next/utils": "0.5.0-dev.30"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"tsdown": "0.18.4",
|
|
19
19
|
"typescript": "5.9.3",
|
|
20
20
|
"vitest": "4.0.17",
|
|
21
|
-
"@prisma-next/sql-contract-ts": "0.5.0-dev.
|
|
22
|
-
"@prisma-next/tsconfig": "0.0.0",
|
|
21
|
+
"@prisma-next/sql-contract-ts": "0.5.0-dev.30",
|
|
23
22
|
"@prisma-next/test-utils": "0.0.1",
|
|
23
|
+
"@prisma-next/tsconfig": "0.0.0",
|
|
24
24
|
"@prisma-next/tsdown": "0.0.0"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
".": "./dist/index.mjs",
|
|
32
32
|
"./ast": "./dist/exports/ast.mjs",
|
|
33
33
|
"./errors": "./dist/exports/errors.mjs",
|
|
34
|
+
"./expression": "./dist/exports/expression.mjs",
|
|
34
35
|
"./plan": "./dist/exports/plan.mjs",
|
|
35
36
|
"./query-lane-context": "./dist/exports/query-lane-context.mjs",
|
|
36
37
|
"./types": "./dist/exports/types.mjs",
|
package/src/ast/adapter-types.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ContractMarkerRecord } from '@prisma-next/contract/types';
|
|
1
2
|
import type { CodecRegistry } from './codec-types';
|
|
2
3
|
import type { LoweredStatement } from './types';
|
|
3
4
|
|
|
@@ -24,6 +25,13 @@ export interface AdapterProfile<TTarget extends AdapterTarget = AdapterTarget> {
|
|
|
24
25
|
* parameter placeholder style).
|
|
25
26
|
*/
|
|
26
27
|
readMarkerStatement(): MarkerStatement;
|
|
28
|
+
/**
|
|
29
|
+
* Parses a row returned by the adapter's `readMarkerStatement()` into a
|
|
30
|
+
* `ContractMarkerRecord`. Each adapter is responsible for any
|
|
31
|
+
* target-specific decoding before delegating to the shared row schema.
|
|
32
|
+
* Throws on shape violation.
|
|
33
|
+
*/
|
|
34
|
+
parseMarkerRow(row: unknown): ContractMarkerRecord;
|
|
27
35
|
}
|
|
28
36
|
|
|
29
37
|
export interface LowererContext<TContract = unknown> {
|
package/src/ast/codec-types.ts
CHANGED
|
@@ -1,10 +1,47 @@
|
|
|
1
1
|
import type { JsonValue } from '@prisma-next/contract/types';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
Codec as BaseCodec,
|
|
4
|
+
CodecCallContext,
|
|
5
|
+
CodecTrait,
|
|
6
|
+
} from '@prisma-next/framework-components/codec';
|
|
3
7
|
import { ifDefined } from '@prisma-next/utils/defined';
|
|
4
8
|
import type { Type } from 'arktype';
|
|
5
9
|
import type { O } from 'ts-toolbelt';
|
|
6
10
|
|
|
7
|
-
export type { CodecTrait } from '@prisma-next/framework-components/codec';
|
|
11
|
+
export type { CodecCallContext, CodecTrait } from '@prisma-next/framework-components/codec';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* SQL-family addressing of a single column. The decode site populates a
|
|
15
|
+
* `SqlColumnRef` whenever it can resolve the cell to a single underlying
|
|
16
|
+
* `(table, column)` (the typical case for projected columns from a
|
|
17
|
+
* single-table source); cells the runtime cannot resolve (aggregate
|
|
18
|
+
* aliases, include aggregate fields, computed projections without a
|
|
19
|
+
* simple ref) get `column = undefined`.
|
|
20
|
+
*
|
|
21
|
+
* The shape is a structural projection of the runtime's `ColumnRef` so
|
|
22
|
+
* the SQL decode site can reuse the resolution it already performs for
|
|
23
|
+
* `RUNTIME.DECODE_FAILED` envelope construction without allocating
|
|
24
|
+
* twice per cell.
|
|
25
|
+
*/
|
|
26
|
+
export interface SqlColumnRef {
|
|
27
|
+
readonly table: string;
|
|
28
|
+
readonly name: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* SQL-family per-call context. Extends the framework {@link CodecCallContext}
|
|
33
|
+
* (which carries `signal` only) with `column?: SqlColumnRef`, populated
|
|
34
|
+
* on **decode** call sites that can resolve a single underlying column
|
|
35
|
+
* ref. Encode call sites currently leave `column` undefined (encode-time
|
|
36
|
+
* column context is the middleware's domain).
|
|
37
|
+
*
|
|
38
|
+
* SQL codec authors writing a `(value, ctx)` author function for the SQL
|
|
39
|
+
* `codec()` factory observe this type. The framework codec dispatch
|
|
40
|
+
* surface (and Mongo) sees only the base `CodecCallContext`.
|
|
41
|
+
*/
|
|
42
|
+
export interface SqlCodecCallContext extends CodecCallContext {
|
|
43
|
+
readonly column?: SqlColumnRef;
|
|
44
|
+
}
|
|
8
45
|
|
|
9
46
|
/**
|
|
10
47
|
* Descriptor for parameterized codecs that require type parameter validation.
|
|
@@ -46,20 +83,30 @@ export interface CodecMeta {
|
|
|
46
83
|
}
|
|
47
84
|
|
|
48
85
|
/**
|
|
49
|
-
* SQL codec
|
|
86
|
+
* SQL codec — extends the framework codec base with SQL-specific metadata:
|
|
87
|
+
* driver-native type info (`meta.db.sql.<dialect>.nativeType`) and an
|
|
88
|
+
* optional parameterized-codec descriptor (`paramsSchema` + `init`) for
|
|
89
|
+
* codecs that require type-parameter validation (e.g. `pg/vector@1`).
|
|
90
|
+
*
|
|
91
|
+
* `encode` and `decode` are redeclared here to narrow the per-call
|
|
92
|
+
* context to the SQL-family {@link SqlCodecCallContext} (adds
|
|
93
|
+
* `column?: SqlColumnRef`). TypeScript treats method-syntax declarations
|
|
94
|
+
* bivariantly, so the SQL narrowing is structurally compatible with the
|
|
95
|
+
* framework {@link BaseCodec} super-interface.
|
|
50
96
|
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* and between JS values and contract JSON.
|
|
97
|
+
* See `Codec` in `@prisma-next/framework-components/codec` for the codec
|
|
98
|
+
* contract that this interface extends.
|
|
54
99
|
*/
|
|
55
100
|
export interface Codec<
|
|
56
101
|
Id extends string = string,
|
|
57
102
|
TTraits extends readonly CodecTrait[] = readonly CodecTrait[],
|
|
58
103
|
TWire = unknown,
|
|
59
|
-
|
|
104
|
+
TInput = unknown,
|
|
60
105
|
TParams = Record<string, unknown>,
|
|
61
106
|
THelper = unknown,
|
|
62
|
-
> extends BaseCodec<Id, TTraits, TWire,
|
|
107
|
+
> extends BaseCodec<Id, TTraits, TWire, TInput> {
|
|
108
|
+
encode(value: TInput, ctx: SqlCodecCallContext): Promise<TWire>;
|
|
109
|
+
decode(wire: TWire, ctx: SqlCodecCallContext): Promise<TInput>;
|
|
63
110
|
readonly meta?: CodecMeta;
|
|
64
111
|
readonly paramsSchema?: Type<TParams>;
|
|
65
112
|
readonly init?: (params: TParams) => THelper;
|
|
@@ -180,30 +227,72 @@ class CodecRegistryImpl implements CodecRegistry {
|
|
|
180
227
|
}
|
|
181
228
|
|
|
182
229
|
/**
|
|
183
|
-
*
|
|
184
|
-
*
|
|
230
|
+
* Conditional bundle for `encodeJson`/`decodeJson`: when `TInput` is
|
|
231
|
+
* structurally assignable to `JsonValue` the identity defaults are
|
|
232
|
+
* sound and both fields are optional; otherwise both fields are
|
|
233
|
+
* required so an author cannot silently produce a non-JSON-safe
|
|
234
|
+
* contract artifact.
|
|
235
|
+
*/
|
|
236
|
+
type JsonRoundTripConfig<TInput> = [TInput] extends [JsonValue]
|
|
237
|
+
? {
|
|
238
|
+
encodeJson?: (value: TInput) => JsonValue;
|
|
239
|
+
decodeJson?: (json: JsonValue) => TInput;
|
|
240
|
+
}
|
|
241
|
+
: {
|
|
242
|
+
encodeJson: (value: TInput) => JsonValue;
|
|
243
|
+
decodeJson: (json: JsonValue) => TInput;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Construct a SQL codec from author functions and optional metadata.
|
|
248
|
+
*
|
|
249
|
+
* Author `encode` and `decode` as sync or async functions; the factory
|
|
250
|
+
* produces a {@link Codec} whose query-time methods follow the boundary
|
|
251
|
+
* contract documented on `Codec`. Authors receive a second `ctx` options
|
|
252
|
+
* argument carrying the SQL-family per-call context; ignore it if you
|
|
253
|
+
* don't need it.
|
|
254
|
+
*
|
|
255
|
+
* Both `encode` and `decode` are required so `TInput` and `TWire` are
|
|
256
|
+
* always covered by an explicit author function — the factory installs
|
|
257
|
+
* no identity fallback. `encodeJson` and `decodeJson` default to identity
|
|
258
|
+
* **only when `TInput` is assignable to `JsonValue`**; otherwise both are
|
|
259
|
+
* required so the contract artifact stays JSON-safe.
|
|
185
260
|
*/
|
|
186
261
|
export function codec<
|
|
187
262
|
Id extends string,
|
|
188
|
-
const TTraits extends readonly CodecTrait[],
|
|
189
|
-
TWire,
|
|
190
|
-
|
|
263
|
+
const TTraits extends readonly CodecTrait[] = readonly [],
|
|
264
|
+
TWire = unknown,
|
|
265
|
+
TInput = unknown,
|
|
191
266
|
TParams = Record<string, unknown>,
|
|
192
267
|
THelper = unknown,
|
|
193
|
-
>(
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
268
|
+
>(
|
|
269
|
+
config: {
|
|
270
|
+
typeId: Id;
|
|
271
|
+
targetTypes: readonly string[];
|
|
272
|
+
encode: (value: TInput, ctx: SqlCodecCallContext) => TWire | Promise<TWire>;
|
|
273
|
+
decode: (wire: TWire, ctx: SqlCodecCallContext) => TInput | Promise<TInput>;
|
|
274
|
+
meta?: CodecMeta;
|
|
275
|
+
paramsSchema?: Type<TParams>;
|
|
276
|
+
init?: (params: TParams) => THelper;
|
|
277
|
+
traits?: TTraits;
|
|
278
|
+
renderOutputType?: (typeParams: Record<string, unknown>) => string | undefined;
|
|
279
|
+
} & JsonRoundTripConfig<TInput>,
|
|
280
|
+
): Codec<Id, TTraits, TWire, TInput, TParams, THelper> {
|
|
206
281
|
const identity = (v: unknown) => v;
|
|
282
|
+
// The runtime allocates one `SqlCodecCallContext` per `runtime.execute()`
|
|
283
|
+
// call (no caller-supplied `signal` produces `{}` instead of `undefined`)
|
|
284
|
+
// and threads it as a non-optional reference to every codec call. The
|
|
285
|
+
// author surface keeps the second parameter optional so single-arg
|
|
286
|
+
// `(value) => …` authors continue to satisfy the signature via
|
|
287
|
+
// TypeScript's bivariance for trailing parameters.
|
|
288
|
+
const userEncode = config.encode;
|
|
289
|
+
const userDecode = config.decode;
|
|
290
|
+
// The conditional JsonRoundTripConfig narrows TInput|JsonValue at the
|
|
291
|
+
// boundary; widen back to the generic shape inside the factory body.
|
|
292
|
+
const widenedConfig = config as {
|
|
293
|
+
encodeJson?: (value: TInput) => JsonValue;
|
|
294
|
+
decodeJson?: (json: JsonValue) => TInput;
|
|
295
|
+
};
|
|
207
296
|
return {
|
|
208
297
|
id: config.typeId,
|
|
209
298
|
targetTypes: config.targetTypes,
|
|
@@ -215,10 +304,22 @@ export function codec<
|
|
|
215
304
|
config.traits ? (Object.freeze([...config.traits]) as TTraits) : undefined,
|
|
216
305
|
),
|
|
217
306
|
...ifDefined('renderOutputType', config.renderOutputType),
|
|
218
|
-
encode:
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
307
|
+
encode: (value, ctx) => {
|
|
308
|
+
try {
|
|
309
|
+
return Promise.resolve(userEncode(value, ctx));
|
|
310
|
+
} catch (error) {
|
|
311
|
+
return Promise.reject(error);
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
decode: (wire, ctx) => {
|
|
315
|
+
try {
|
|
316
|
+
return Promise.resolve(userDecode(wire, ctx));
|
|
317
|
+
} catch (error) {
|
|
318
|
+
return Promise.reject(error);
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
encodeJson: (widenedConfig.encodeJson ?? identity) as (value: TInput) => JsonValue,
|
|
322
|
+
decodeJson: (widenedConfig.decodeJson ?? identity) as (json: JsonValue) => TInput,
|
|
222
323
|
};
|
|
223
324
|
}
|
|
224
325
|
|
|
@@ -228,9 +329,7 @@ export function codec<
|
|
|
228
329
|
export type CodecId<T> =
|
|
229
330
|
T extends Codec<infer Id> ? Id : T extends { readonly id: infer Id } ? Id : never;
|
|
230
331
|
export type CodecInput<T> =
|
|
231
|
-
T extends Codec<string, readonly CodecTrait[], unknown, infer
|
|
232
|
-
export type CodecOutput<T> =
|
|
233
|
-
T extends Codec<string, readonly CodecTrait[], unknown, infer JsT> ? JsT : never;
|
|
332
|
+
T extends Codec<string, readonly CodecTrait[], unknown, infer In> ? In : never;
|
|
234
333
|
export type CodecTraits<T> =
|
|
235
334
|
T extends Codec<string, infer TTraits> ? TTraits[number] & CodecTrait : never;
|
|
236
335
|
|
|
@@ -242,7 +341,7 @@ export type ExtractCodecTypes<
|
|
|
242
341
|
> = {
|
|
243
342
|
readonly [K in keyof ScalarNames as ScalarNames[K] extends Codec<infer Id> ? Id : never]: {
|
|
244
343
|
readonly input: CodecInput<ScalarNames[K]>;
|
|
245
|
-
readonly output:
|
|
344
|
+
readonly output: CodecInput<ScalarNames[K]>;
|
|
246
345
|
readonly traits: CodecTraits<ScalarNames[K]>;
|
|
247
346
|
};
|
|
248
347
|
};
|
|
@@ -283,8 +382,8 @@ export interface CodecDefBuilder<
|
|
|
283
382
|
readonly scalar: K;
|
|
284
383
|
readonly codec: ScalarNames[K];
|
|
285
384
|
readonly input: CodecInput<ScalarNames[K]>;
|
|
286
|
-
readonly output:
|
|
287
|
-
readonly jsType:
|
|
385
|
+
readonly output: CodecInput<ScalarNames[K]>;
|
|
386
|
+
readonly jsType: CodecInput<ScalarNames[K]>;
|
|
288
387
|
};
|
|
289
388
|
};
|
|
290
389
|
|
|
@@ -323,7 +422,7 @@ class CodecDefBuilderImpl<
|
|
|
323
422
|
const codecImplTyped = codecImpl as Codec<string>;
|
|
324
423
|
codecTypes[codecImplTyped.id] = {
|
|
325
424
|
input: undefined as unknown as CodecInput<typeof codecImplTyped>,
|
|
326
|
-
output: undefined as unknown as
|
|
425
|
+
output: undefined as unknown as CodecInput<typeof codecImplTyped>,
|
|
327
426
|
traits: undefined as unknown as CodecTraits<typeof codecImplTyped>,
|
|
328
427
|
};
|
|
329
428
|
}
|
|
@@ -368,8 +467,8 @@ class CodecDefBuilderImpl<
|
|
|
368
467
|
readonly scalar: K;
|
|
369
468
|
readonly codec: ScalarNames[K];
|
|
370
469
|
readonly input: CodecInput<ScalarNames[K]>;
|
|
371
|
-
readonly output:
|
|
372
|
-
readonly jsType:
|
|
470
|
+
readonly output: CodecInput<ScalarNames[K]>;
|
|
471
|
+
readonly jsType: CodecInput<ScalarNames[K]>;
|
|
373
472
|
};
|
|
374
473
|
} {
|
|
375
474
|
const result: Record<
|
|
@@ -391,8 +490,8 @@ class CodecDefBuilderImpl<
|
|
|
391
490
|
scalar: scalarName,
|
|
392
491
|
codec: codec,
|
|
393
492
|
input: undefined as unknown as CodecInput<typeof codec>,
|
|
394
|
-
output: undefined as unknown as
|
|
395
|
-
jsType: undefined as unknown as
|
|
493
|
+
output: undefined as unknown as CodecInput<typeof codec>,
|
|
494
|
+
jsType: undefined as unknown as CodecInput<typeof codec>,
|
|
396
495
|
};
|
|
397
496
|
}
|
|
398
497
|
|
|
@@ -402,8 +501,8 @@ class CodecDefBuilderImpl<
|
|
|
402
501
|
readonly scalar: K;
|
|
403
502
|
readonly codec: ScalarNames[K];
|
|
404
503
|
readonly input: CodecInput<ScalarNames[K]>;
|
|
405
|
-
readonly output:
|
|
406
|
-
readonly jsType:
|
|
504
|
+
readonly output: CodecInput<ScalarNames[K]>;
|
|
505
|
+
readonly jsType: CodecInput<ScalarNames[K]>;
|
|
407
506
|
};
|
|
408
507
|
};
|
|
409
508
|
}
|
package/src/ast/sql-codecs.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JsonValue } from '@prisma-next/contract/types';
|
|
1
2
|
import { type as arktype } from 'arktype';
|
|
2
3
|
import { codec, defineCodecs } from './codec-types';
|
|
3
4
|
|
|
@@ -104,12 +105,28 @@ const sqlTextCodec = codec({
|
|
|
104
105
|
decode: (wire: string): string => wire,
|
|
105
106
|
});
|
|
106
107
|
|
|
107
|
-
const sqlTimestampCodec = codec
|
|
108
|
+
const sqlTimestampCodec = codec<
|
|
109
|
+
typeof SQL_TIMESTAMP_CODEC_ID,
|
|
110
|
+
readonly ['equality', 'order'],
|
|
111
|
+
Date,
|
|
112
|
+
Date
|
|
113
|
+
>({
|
|
108
114
|
typeId: SQL_TIMESTAMP_CODEC_ID,
|
|
109
115
|
targetTypes: ['timestamp'],
|
|
110
116
|
traits: ['equality', 'order'],
|
|
111
|
-
encode: (value:
|
|
112
|
-
decode: (wire:
|
|
117
|
+
encode: (value: Date): Date => value,
|
|
118
|
+
decode: (wire: Date): Date => wire,
|
|
119
|
+
encodeJson: (value: Date): JsonValue => value.toISOString(),
|
|
120
|
+
decodeJson: (json: JsonValue): Date => {
|
|
121
|
+
if (typeof json !== 'string') {
|
|
122
|
+
throw new Error(`Expected ISO date string for sql/timestamp@1, got ${typeof json}`);
|
|
123
|
+
}
|
|
124
|
+
const date = new Date(json);
|
|
125
|
+
if (Number.isNaN(date.getTime())) {
|
|
126
|
+
throw new Error(`Invalid ISO date string for sql/timestamp@1: ${json}`);
|
|
127
|
+
}
|
|
128
|
+
return date;
|
|
129
|
+
},
|
|
113
130
|
paramsSchema: precisionParamsSchema,
|
|
114
131
|
renderOutputType: (typeParams) => {
|
|
115
132
|
const precision = typeParams['precision'];
|