@prisma-next/sql-relational-core 0.3.0-dev.34 → 0.3.0-dev.36
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 +4 -1
- package/dist/errors-7_V3El9I.mjs +3 -0
- package/dist/errors-DVufq9PT.d.mts +2 -0
- package/dist/exports/ast.d.mts +189 -0
- package/dist/exports/ast.d.mts.map +1 -0
- package/dist/exports/ast.mjs +360 -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/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 +4 -0
- package/dist/guards-0ycyntYX.mjs +132 -0
- package/dist/guards-0ycyntYX.mjs.map +1 -0
- package/dist/{utils/guards.d.ts → guards-l1R3q8pA.d.mts} +24 -19
- package/dist/guards-l1R3q8pA.d.mts.map +1 -0
- package/dist/index.d.mts +12 -0
- package/dist/index.mjs +12 -0
- package/dist/operations-registry-0GuSkOCC.d.mts +9 -0
- package/dist/operations-registry-0GuSkOCC.d.mts.map +1 -0
- package/dist/operations-registry-DPZ5aElH.mjs +152 -0
- package/dist/operations-registry-DPZ5aElH.mjs.map +1 -0
- package/dist/param-ChBZwVcw.d.mts +8 -0
- package/dist/param-ChBZwVcw.d.mts.map +1 -0
- package/dist/param-DMU3OWfI.mjs +14 -0
- package/dist/param-DMU3OWfI.mjs.map +1 -0
- package/dist/plan-cjDF_yFX.d.mts +182 -0
- package/dist/plan-cjDF_yFX.d.mts.map +1 -0
- package/dist/query-lane-context-CgkPuKaR.d.mts +259 -0
- package/dist/query-lane-context-CgkPuKaR.d.mts.map +1 -0
- package/dist/schema-Bi5p4aAc.mjs +175 -0
- package/dist/schema-Bi5p4aAc.mjs.map +1 -0
- package/dist/schema-CEpzzWNY.d.mts +86 -0
- package/dist/schema-CEpzzWNY.d.mts.map +1 -0
- package/dist/types-Cdi4Whda.mjs +18 -0
- package/dist/types-Cdi4Whda.mjs.map +1 -0
- package/dist/types-DicmXfBm.d.mts +447 -0
- package/dist/types-DicmXfBm.d.mts.map +1 -0
- package/package.json +34 -51
- package/src/ast/codec-types.ts +72 -4
- package/src/ast/driver-types.ts +20 -3
- package/src/ast/predicate.ts +3 -1
- package/src/ast/sql-codecs.ts +67 -0
- package/src/ast/types.ts +28 -3
- package/src/exports/ast.ts +1 -0
- package/src/exports/utils/guards.ts +1 -0
- package/src/query-lane-context.ts +70 -6
- package/src/schema.ts +4 -4
- package/src/types.ts +2 -2
- 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 -5
- 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 -143
- 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-2MAKNVCP.js +0 -86
- package/dist/chunk-2MAKNVCP.js.map +0 -1
- package/dist/chunk-36WJWNHT.js +0 -1
- package/dist/chunk-36WJWNHT.js.map +0 -1
- package/dist/chunk-3F4RFQIB.js +0 -169
- package/dist/chunk-3F4RFQIB.js.map +0 -1
- package/dist/chunk-4WKZQIDS.js +0 -193
- package/dist/chunk-4WKZQIDS.js.map +0 -1
- package/dist/chunk-7I3EMQID.js +0 -16
- package/dist/chunk-7I3EMQID.js.map +0 -1
- package/dist/chunk-G52ENULI.js +0 -1
- package/dist/chunk-G52ENULI.js.map +0 -1
- package/dist/chunk-HAUHWBE7.js +0 -13
- package/dist/chunk-HAUHWBE7.js.map +0 -1
- package/dist/chunk-KYSP7L5C.js +0 -16
- package/dist/chunk-KYSP7L5C.js.map +0 -1
- package/dist/chunk-RVHFGDZ6.js +0 -328
- package/dist/chunk-RVHFGDZ6.js.map +0 -1
- package/dist/chunk-U7AXAUJA.js +0 -1
- package/dist/chunk-U7AXAUJA.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 -48
- 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 -31
- 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 -13
- 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 -83
- 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 -27
- package/dist/query-lane-context.d.ts.map +0 -1
- package/dist/schema.d.ts +0 -93
- package/dist/schema.d.ts.map +0 -1
- package/dist/types.d.ts +0 -459
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/guards.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -24,7 +24,9 @@ Provide shared relational primitives (schema builders, column builders, paramete
|
|
|
24
24
|
- **Column Builders**: Provides column accessors with operation methods attached based on column typeId
|
|
25
25
|
- **Parameter Helpers**: Creates parameter placeholders for query building
|
|
26
26
|
- **Operations Registry**: Attaches registered operations as methods on column builders
|
|
27
|
+
- **Execution Context Types**: Defines the context shape used by query lanes
|
|
27
28
|
- **Type Definitions**: Defines TypeScript types for column builders, operations, and projections
|
|
29
|
+
- **Codec Registry Types**: Defines codec interfaces and base SQL codec definitions
|
|
28
30
|
|
|
29
31
|
**Non-goals:**
|
|
30
32
|
- Query DSL construction (sql-lane)
|
|
@@ -95,9 +97,10 @@ flowchart TD
|
|
|
95
97
|
## Dependencies
|
|
96
98
|
|
|
97
99
|
- **`@prisma-next/contract`**: Core contract types
|
|
100
|
+
- **`@prisma-next/operations`**: Operation registry used by schema builders
|
|
98
101
|
- **`@prisma-next/plan`**: Plan error helpers (`planInvalid`, `planUnsupported`) and `RuntimeError` type
|
|
99
|
-
- **`@prisma-next/runtime`**: Runtime context types (TODO: Slice 6 will clean this up)
|
|
100
102
|
- **`@prisma-next/sql-contract`**: SQL contract types (via `@prisma-next/sql-contract/types`)
|
|
103
|
+
- **`arktype`**: Parameter schema typing for codec definitions
|
|
101
104
|
|
|
102
105
|
**Note**: This package does not depend on specific adapters (e.g., `@prisma-next/adapter-postgres`). Test fixtures define `CodecTypes` inline to remain adapter-agnostic and avoid cyclic dependencies.
|
|
103
106
|
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { S as defineCodecs, _ as CodecRegistry, b as codec, d as CodecDefBuilder, f as CodecId, g as CodecParamsDescriptor, h as CodecOutput, m as CodecMeta, p as CodecInput, u as Codec, v as ExtractCodecTypes, x as createCodecRegistry, y as ExtractDataTypes } from "../query-lane-context-CgkPuKaR.mjs";
|
|
2
|
+
import { C as ParamRef, D as UpdateAst, E as TableRef, O as WhereExpr, S as OrExpr, T as SelectAst, _ as ListLiteralExpr, a as BinaryOp, b as NullCheckExpr, c as Direction, d as ExpressionSource, f as IncludeAst, g as JoinOnExpr, h as JoinAst, i as BinaryExpr, k as isOperationExpr, l as ExistsExpr, m as InsertAst, o as ColumnRef, p as IncludeRef, r as AndExpr, s as DeleteAst, u as Expression, v as LiteralExpr, w as QueryAst, x as OperationExpr, y as LoweredStatement } from "../plan-cjDF_yFX.mjs";
|
|
3
|
+
import { b as JoinOnBuilder } from "../types-DicmXfBm.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/ast/adapter-types.d.ts
|
|
6
|
+
type AdapterTarget = string;
|
|
7
|
+
interface AdapterProfile<TTarget extends AdapterTarget = AdapterTarget> {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly target: TTarget;
|
|
10
|
+
readonly capabilities: Record<string, unknown>;
|
|
11
|
+
/**
|
|
12
|
+
* Returns the adapter's default codec registry.
|
|
13
|
+
* The registry contains codecs provided by the adapter for converting
|
|
14
|
+
* between wire types and JavaScript types.
|
|
15
|
+
*/
|
|
16
|
+
codecs(): CodecRegistry;
|
|
17
|
+
}
|
|
18
|
+
interface LoweredPayload<TBody = unknown> {
|
|
19
|
+
readonly profileId?: string;
|
|
20
|
+
readonly body: TBody;
|
|
21
|
+
readonly annotations?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
interface LowererContext<TContract = unknown> {
|
|
24
|
+
readonly contract: TContract;
|
|
25
|
+
readonly params?: readonly unknown[];
|
|
26
|
+
}
|
|
27
|
+
type Lowerer<Ast = unknown, TContract = unknown, TBody = unknown> = (ast: Ast, context: LowererContext<TContract>) => LoweredPayload<TBody>;
|
|
28
|
+
interface Adapter<Ast = unknown, TContract = unknown, TBody = unknown> {
|
|
29
|
+
readonly profile: AdapterProfile;
|
|
30
|
+
lower(ast: Ast, context: LowererContext<TContract>): LoweredPayload<TBody>;
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/ast/common.d.ts
|
|
34
|
+
declare function createTableRef(name: string): TableRef;
|
|
35
|
+
declare function createColumnRef(table: string, column: string): ColumnRef;
|
|
36
|
+
declare function createParamRef(index: number, name?: string): ParamRef;
|
|
37
|
+
declare function createOperationExpr(operation: OperationExpr): OperationExpr;
|
|
38
|
+
declare function createLiteralExpr(value: unknown): LiteralExpr;
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region src/ast/delete.d.ts
|
|
41
|
+
interface CreateDeleteAstOptions {
|
|
42
|
+
readonly table: TableRef;
|
|
43
|
+
readonly where: WhereExpr;
|
|
44
|
+
readonly returning?: ReadonlyArray<ColumnRef>;
|
|
45
|
+
}
|
|
46
|
+
declare function createDeleteAst(options: CreateDeleteAstOptions): DeleteAst;
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region src/ast/driver-types.d.ts
|
|
49
|
+
interface SqlExecuteRequest {
|
|
50
|
+
readonly sql: string;
|
|
51
|
+
readonly params?: readonly unknown[];
|
|
52
|
+
}
|
|
53
|
+
interface SqlQueryResult<Row = Record<string, unknown>> {
|
|
54
|
+
readonly rows: ReadonlyArray<Row>;
|
|
55
|
+
readonly rowCount?: number | null;
|
|
56
|
+
readonly [key: string]: unknown;
|
|
57
|
+
}
|
|
58
|
+
interface SqlExplainResult<Row = Record<string, unknown>> {
|
|
59
|
+
readonly rows: ReadonlyArray<Row>;
|
|
60
|
+
}
|
|
61
|
+
type SqlDriverState = 'unbound' | 'connected' | 'closed';
|
|
62
|
+
interface SqlDriver<TBinding = void> extends SqlQueryable {
|
|
63
|
+
readonly state?: SqlDriverState;
|
|
64
|
+
connect(binding: TBinding): Promise<void>;
|
|
65
|
+
acquireConnection(): Promise<SqlConnection>;
|
|
66
|
+
close(): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
interface SqlConnection extends SqlQueryable {
|
|
69
|
+
beginTransaction(): Promise<SqlTransaction>;
|
|
70
|
+
release(): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
interface SqlTransaction extends SqlQueryable {
|
|
73
|
+
commit(): Promise<void>;
|
|
74
|
+
rollback(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
interface SqlQueryable {
|
|
77
|
+
execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row>;
|
|
78
|
+
explain?(request: SqlExecuteRequest): Promise<SqlExplainResult>;
|
|
79
|
+
query<Row = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Promise<SqlQueryResult<Row>>;
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region src/ast/insert.d.ts
|
|
83
|
+
interface CreateInsertAstOptions {
|
|
84
|
+
readonly table: TableRef;
|
|
85
|
+
readonly values: Record<string, ColumnRef | ParamRef>;
|
|
86
|
+
readonly returning?: ReadonlyArray<ColumnRef>;
|
|
87
|
+
}
|
|
88
|
+
declare function createInsertAst(options: CreateInsertAstOptions): InsertAst;
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/ast/join.d.ts
|
|
91
|
+
declare function createJoin(joinType: 'inner' | 'left' | 'right' | 'full', table: TableRef, on: JoinOnExpr): JoinAst;
|
|
92
|
+
declare function createJoinOnExpr(left: ColumnRef, right: ColumnRef): JoinOnExpr;
|
|
93
|
+
declare function createJoinOnBuilder(): JoinOnBuilder;
|
|
94
|
+
//#endregion
|
|
95
|
+
//#region src/ast/order.d.ts
|
|
96
|
+
declare function createOrderByItem(expr: ColumnRef | OperationExpr, dir: 'asc' | 'desc'): {
|
|
97
|
+
expr: ColumnRef | OperationExpr;
|
|
98
|
+
dir: Direction;
|
|
99
|
+
};
|
|
100
|
+
//#endregion
|
|
101
|
+
//#region src/ast/predicate.d.ts
|
|
102
|
+
declare function createBinaryExpr(op: BinaryOp, left: Expression, right: Expression | ParamRef | LiteralExpr | ListLiteralExpr): BinaryExpr;
|
|
103
|
+
declare function createExistsExpr(not: boolean, subquery: SelectAst): ExistsExpr;
|
|
104
|
+
declare function createNullCheckExpr(expr: Expression, isNull: boolean): NullCheckExpr;
|
|
105
|
+
//#endregion
|
|
106
|
+
//#region src/ast/select.d.ts
|
|
107
|
+
interface CreateSelectAstOptions {
|
|
108
|
+
readonly from: TableRef;
|
|
109
|
+
readonly joins?: ReadonlyArray<JoinAst>;
|
|
110
|
+
readonly includes?: ReadonlyArray<IncludeAst>;
|
|
111
|
+
readonly project: ReadonlyArray<{
|
|
112
|
+
alias: string;
|
|
113
|
+
expr: ColumnRef | IncludeRef | OperationExpr;
|
|
114
|
+
}>;
|
|
115
|
+
readonly where?: WhereExpr;
|
|
116
|
+
readonly orderBy?: ReadonlyArray<{
|
|
117
|
+
expr: ColumnRef | OperationExpr;
|
|
118
|
+
dir: Direction;
|
|
119
|
+
}>;
|
|
120
|
+
readonly limit?: number;
|
|
121
|
+
}
|
|
122
|
+
declare function createSelectAst(options: CreateSelectAstOptions): SelectAst;
|
|
123
|
+
//#endregion
|
|
124
|
+
//#region src/ast/sql-codecs.d.ts
|
|
125
|
+
declare const SQL_CHAR_CODEC_ID: "sql/char@1";
|
|
126
|
+
declare const SQL_VARCHAR_CODEC_ID: "sql/varchar@1";
|
|
127
|
+
declare const SQL_INT_CODEC_ID: "sql/int@1";
|
|
128
|
+
declare const SQL_FLOAT_CODEC_ID: "sql/float@1";
|
|
129
|
+
declare const codecs: CodecDefBuilder<{
|
|
130
|
+
char: Codec<"sql/char@1", string, string, Record<string, unknown>, unknown>;
|
|
131
|
+
varchar: Codec<"sql/varchar@1", string, string, Record<string, unknown>, unknown>;
|
|
132
|
+
int: Codec<"sql/int@1", number, number, Record<string, unknown>, unknown>;
|
|
133
|
+
} & Record<"float", Codec<"sql/float@1", number, number, Record<string, unknown>, unknown>>>;
|
|
134
|
+
declare const sqlCodecDefinitions: {
|
|
135
|
+
readonly char: {
|
|
136
|
+
readonly typeId: "sql/char@1";
|
|
137
|
+
readonly scalar: "char";
|
|
138
|
+
readonly codec: Codec<"sql/char@1", string, string, Record<string, unknown>, unknown>;
|
|
139
|
+
readonly input: string;
|
|
140
|
+
readonly output: string;
|
|
141
|
+
readonly jsType: string;
|
|
142
|
+
};
|
|
143
|
+
readonly varchar: {
|
|
144
|
+
readonly typeId: "sql/varchar@1";
|
|
145
|
+
readonly scalar: "varchar";
|
|
146
|
+
readonly codec: Codec<"sql/varchar@1", string, string, Record<string, unknown>, unknown>;
|
|
147
|
+
readonly input: string;
|
|
148
|
+
readonly output: string;
|
|
149
|
+
readonly jsType: string;
|
|
150
|
+
};
|
|
151
|
+
readonly int: {
|
|
152
|
+
readonly typeId: "sql/int@1";
|
|
153
|
+
readonly scalar: "int";
|
|
154
|
+
readonly codec: Codec<"sql/int@1", number, number, Record<string, unknown>, unknown>;
|
|
155
|
+
readonly input: number;
|
|
156
|
+
readonly output: number;
|
|
157
|
+
readonly jsType: number;
|
|
158
|
+
};
|
|
159
|
+
readonly float: {
|
|
160
|
+
readonly typeId: "sql/float@1";
|
|
161
|
+
readonly scalar: "float";
|
|
162
|
+
readonly codec: Codec<"sql/float@1", number, number, Record<string, unknown>, unknown>;
|
|
163
|
+
readonly input: number;
|
|
164
|
+
readonly output: number;
|
|
165
|
+
readonly jsType: number;
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
declare const sqlDataTypes: {
|
|
169
|
+
readonly char: "sql/char@1";
|
|
170
|
+
readonly varchar: "sql/varchar@1";
|
|
171
|
+
readonly int: "sql/int@1";
|
|
172
|
+
readonly float: "sql/float@1";
|
|
173
|
+
};
|
|
174
|
+
type SqlCodecTypes = typeof codecs.CodecTypes;
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/ast/update.d.ts
|
|
177
|
+
interface CreateUpdateAstOptions {
|
|
178
|
+
readonly table: TableRef;
|
|
179
|
+
readonly set: Record<string, ColumnRef | ParamRef>;
|
|
180
|
+
readonly where: WhereExpr;
|
|
181
|
+
readonly returning?: ReadonlyArray<ColumnRef>;
|
|
182
|
+
}
|
|
183
|
+
declare function createUpdateAst(options: CreateUpdateAstOptions): UpdateAst;
|
|
184
|
+
//#endregion
|
|
185
|
+
//#region src/ast/util.d.ts
|
|
186
|
+
declare function compact<T extends Record<string, unknown>>(o: T): T;
|
|
187
|
+
//#endregion
|
|
188
|
+
export { Adapter, AdapterProfile, AdapterTarget, AndExpr, BinaryExpr, BinaryOp, Codec, CodecDefBuilder, CodecId, CodecInput, CodecMeta, CodecOutput, CodecParamsDescriptor, CodecRegistry, ColumnRef, CreateDeleteAstOptions, CreateInsertAstOptions, CreateSelectAstOptions, CreateUpdateAstOptions, DeleteAst, Direction, ExistsExpr, Expression, ExpressionSource, ExtractCodecTypes, ExtractDataTypes, IncludeAst, IncludeRef, InsertAst, JoinAst, JoinOnExpr, ListLiteralExpr, LiteralExpr, LoweredPayload, LoweredStatement, Lowerer, LowererContext, NullCheckExpr, OperationExpr, OrExpr, ParamRef, QueryAst, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_VARCHAR_CODEC_ID, SelectAst, SqlCodecTypes, SqlConnection, SqlDriver, SqlDriverState, SqlExecuteRequest, SqlExplainResult, SqlQueryResult, SqlQueryable, SqlTransaction, TableRef, UpdateAst, WhereExpr, codec, compact, createBinaryExpr, createCodecRegistry, createColumnRef, createDeleteAst, createExistsExpr, createInsertAst, createJoin, createJoinOnBuilder, createJoinOnExpr, createLiteralExpr, createNullCheckExpr, createOperationExpr, createOrderByItem, createParamRef, createSelectAst, createTableRef, createUpdateAst, defineCodecs, isOperationExpr, sqlCodecDefinitions, sqlDataTypes };
|
|
189
|
+
//# sourceMappingURL=ast.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.mts","names":[],"sources":["../../src/ast/adapter-types.ts","../../src/ast/common.ts","../../src/ast/delete.ts","../../src/ast/driver-types.ts","../../src/ast/insert.ts","../../src/ast/join.ts","../../src/ast/order.ts","../../src/ast/predicate.ts","../../src/ast/select.ts","../../src/ast/sql-codecs.ts","../../src/ast/update.ts","../../src/ast/util.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { n as isColumnBuilder } from "../types-Cdi4Whda.mjs";
|
|
2
|
+
import { ifDefined } from "@prisma-next/utils/defined";
|
|
3
|
+
import { planInvalid } from "@prisma-next/plan";
|
|
4
|
+
import { type } from "arktype";
|
|
5
|
+
|
|
6
|
+
//#region src/ast/codec-types.ts
|
|
7
|
+
/**
|
|
8
|
+
* Implementation of CodecRegistry.
|
|
9
|
+
*/
|
|
10
|
+
var CodecRegistryImpl = class {
|
|
11
|
+
_byId = /* @__PURE__ */ new Map();
|
|
12
|
+
_byScalar = /* @__PURE__ */ new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Map-like interface for codec lookup by ID.
|
|
15
|
+
* Example: registry.get('pg/text@1')
|
|
16
|
+
*/
|
|
17
|
+
get(id) {
|
|
18
|
+
return this._byId.get(id);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if a codec with the given ID is registered.
|
|
22
|
+
*/
|
|
23
|
+
has(id) {
|
|
24
|
+
return this._byId.has(id);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get all codecs that handle a given scalar type.
|
|
28
|
+
* Returns an empty frozen array if no codecs are found.
|
|
29
|
+
* Example: registry.getByScalar('text') → [codec1, codec2, ...]
|
|
30
|
+
*/
|
|
31
|
+
getByScalar(scalar) {
|
|
32
|
+
return this._byScalar.get(scalar) ?? Object.freeze([]);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the default codec for a scalar type (first registered codec).
|
|
36
|
+
* Returns undefined if no codec handles this scalar type.
|
|
37
|
+
*/
|
|
38
|
+
getDefaultCodec(scalar) {
|
|
39
|
+
return this._byScalar.get(scalar)?.[0];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Register a codec in the registry.
|
|
43
|
+
* Throws an error if a codec with the same ID is already registered.
|
|
44
|
+
*
|
|
45
|
+
* @param codec - The codec to register
|
|
46
|
+
* @throws Error if a codec with the same ID already exists
|
|
47
|
+
*/
|
|
48
|
+
register(codec$1) {
|
|
49
|
+
if (this._byId.has(codec$1.id)) throw new Error(`Codec with ID '${codec$1.id}' is already registered`);
|
|
50
|
+
this._byId.set(codec$1.id, codec$1);
|
|
51
|
+
for (const scalarType of codec$1.targetTypes) {
|
|
52
|
+
const existing = this._byScalar.get(scalarType);
|
|
53
|
+
if (existing) existing.push(codec$1);
|
|
54
|
+
else this._byScalar.set(scalarType, [codec$1]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Returns an iterator over all registered codecs.
|
|
59
|
+
* Useful for iterating through codecs from another registry.
|
|
60
|
+
*/
|
|
61
|
+
*[Symbol.iterator]() {
|
|
62
|
+
for (const codec$1 of this._byId.values()) yield codec$1;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns an iterable of all registered codecs.
|
|
66
|
+
*/
|
|
67
|
+
values() {
|
|
68
|
+
return this._byId.values();
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Codec factory - creates a codec with typeId and encode/decode functions.
|
|
73
|
+
*/
|
|
74
|
+
function codec(config) {
|
|
75
|
+
return {
|
|
76
|
+
id: config.typeId,
|
|
77
|
+
targetTypes: config.targetTypes,
|
|
78
|
+
...ifDefined("meta", config.meta),
|
|
79
|
+
...ifDefined("paramsSchema", config.paramsSchema),
|
|
80
|
+
...ifDefined("init", config.init),
|
|
81
|
+
encode: config.encode,
|
|
82
|
+
decode: config.decode
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Implementation of CodecDefBuilder.
|
|
87
|
+
*/
|
|
88
|
+
var CodecDefBuilderImpl = class CodecDefBuilderImpl {
|
|
89
|
+
_codecs;
|
|
90
|
+
CodecTypes;
|
|
91
|
+
dataTypes;
|
|
92
|
+
constructor(codecs$1) {
|
|
93
|
+
this._codecs = codecs$1;
|
|
94
|
+
const codecTypes = {};
|
|
95
|
+
for (const [, codecImpl] of Object.entries(this._codecs)) {
|
|
96
|
+
const codecImplTyped = codecImpl;
|
|
97
|
+
codecTypes[codecImplTyped.id] = {
|
|
98
|
+
input: void 0,
|
|
99
|
+
output: void 0
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
this.CodecTypes = codecTypes;
|
|
103
|
+
const dataTypes = {};
|
|
104
|
+
for (const key in this._codecs) if (Object.hasOwn(this._codecs, key)) dataTypes[key] = this._codecs[key].id;
|
|
105
|
+
this.dataTypes = dataTypes;
|
|
106
|
+
}
|
|
107
|
+
add(scalarName, codecImpl) {
|
|
108
|
+
return new CodecDefBuilderImpl({
|
|
109
|
+
...this._codecs,
|
|
110
|
+
[scalarName]: codecImpl
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Derive codecDefinitions structure.
|
|
115
|
+
*/
|
|
116
|
+
get codecDefinitions() {
|
|
117
|
+
const result = {};
|
|
118
|
+
for (const [scalarName, codecImpl] of Object.entries(this._codecs)) {
|
|
119
|
+
const codec$1 = codecImpl;
|
|
120
|
+
result[scalarName] = {
|
|
121
|
+
typeId: codec$1.id,
|
|
122
|
+
scalar: scalarName,
|
|
123
|
+
codec: codec$1,
|
|
124
|
+
input: void 0,
|
|
125
|
+
output: void 0,
|
|
126
|
+
jsType: void 0
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Create a new codec registry.
|
|
134
|
+
*/
|
|
135
|
+
function createCodecRegistry() {
|
|
136
|
+
return new CodecRegistryImpl();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Create a new codec definition builder.
|
|
140
|
+
*/
|
|
141
|
+
function defineCodecs() {
|
|
142
|
+
return new CodecDefBuilderImpl({});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
//#endregion
|
|
146
|
+
//#region src/ast/util.ts
|
|
147
|
+
function compact(o) {
|
|
148
|
+
const out = {};
|
|
149
|
+
for (const [k, v] of Object.entries(o)) {
|
|
150
|
+
if (v === void 0 || v === null) continue;
|
|
151
|
+
if (Array.isArray(v) && v.length === 0) continue;
|
|
152
|
+
out[k] = v;
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region src/ast/common.ts
|
|
159
|
+
function createTableRef(name) {
|
|
160
|
+
return {
|
|
161
|
+
kind: "table",
|
|
162
|
+
name
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function createColumnRef(table, column) {
|
|
166
|
+
return {
|
|
167
|
+
kind: "col",
|
|
168
|
+
table,
|
|
169
|
+
column
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function createParamRef(index, name) {
|
|
173
|
+
return compact({
|
|
174
|
+
kind: "param",
|
|
175
|
+
index,
|
|
176
|
+
name
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function createOperationExpr(operation) {
|
|
180
|
+
return operation;
|
|
181
|
+
}
|
|
182
|
+
function createLiteralExpr(value) {
|
|
183
|
+
return {
|
|
184
|
+
kind: "literal",
|
|
185
|
+
value
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
//#endregion
|
|
190
|
+
//#region src/ast/delete.ts
|
|
191
|
+
function createDeleteAst(options) {
|
|
192
|
+
return compact({
|
|
193
|
+
kind: "delete",
|
|
194
|
+
table: options.table,
|
|
195
|
+
where: options.where,
|
|
196
|
+
returning: options.returning
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
//#endregion
|
|
201
|
+
//#region src/ast/insert.ts
|
|
202
|
+
function createInsertAst(options) {
|
|
203
|
+
return compact({
|
|
204
|
+
kind: "insert",
|
|
205
|
+
table: options.table,
|
|
206
|
+
values: options.values,
|
|
207
|
+
returning: options.returning
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
//#endregion
|
|
212
|
+
//#region src/ast/join.ts
|
|
213
|
+
function createJoin(joinType, table, on) {
|
|
214
|
+
return {
|
|
215
|
+
kind: "join",
|
|
216
|
+
joinType,
|
|
217
|
+
table,
|
|
218
|
+
on
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
function createJoinOnExpr(left, right) {
|
|
222
|
+
return {
|
|
223
|
+
kind: "eqCol",
|
|
224
|
+
left,
|
|
225
|
+
right
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
var JoinOnBuilderImpl = class {
|
|
229
|
+
eqCol(left, right) {
|
|
230
|
+
if (!left || !isColumnBuilder(left)) throw planInvalid("Join ON left operand must be a column");
|
|
231
|
+
if (!right || !isColumnBuilder(right)) throw planInvalid("Join ON right operand must be a column");
|
|
232
|
+
const leftCol = left;
|
|
233
|
+
const rightCol = right;
|
|
234
|
+
if (leftCol.table === rightCol.table) throw planInvalid("Self-joins are not supported in MVP");
|
|
235
|
+
return {
|
|
236
|
+
kind: "join-on",
|
|
237
|
+
left,
|
|
238
|
+
right
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
function createJoinOnBuilder() {
|
|
243
|
+
return new JoinOnBuilderImpl();
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
//#endregion
|
|
247
|
+
//#region src/ast/order.ts
|
|
248
|
+
function createOrderByItem(expr, dir) {
|
|
249
|
+
return {
|
|
250
|
+
expr,
|
|
251
|
+
dir
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
//#endregion
|
|
256
|
+
//#region src/ast/predicate.ts
|
|
257
|
+
function createBinaryExpr(op, left, right) {
|
|
258
|
+
return {
|
|
259
|
+
kind: "bin",
|
|
260
|
+
op,
|
|
261
|
+
left,
|
|
262
|
+
right
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function createExistsExpr(not, subquery) {
|
|
266
|
+
return {
|
|
267
|
+
kind: "exists",
|
|
268
|
+
not,
|
|
269
|
+
subquery
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function createNullCheckExpr(expr, isNull) {
|
|
273
|
+
return {
|
|
274
|
+
kind: "nullCheck",
|
|
275
|
+
expr,
|
|
276
|
+
isNull
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
//#endregion
|
|
281
|
+
//#region src/ast/select.ts
|
|
282
|
+
function createSelectAst(options) {
|
|
283
|
+
return compact({
|
|
284
|
+
kind: "select",
|
|
285
|
+
from: options.from,
|
|
286
|
+
joins: options.joins,
|
|
287
|
+
includes: options.includes,
|
|
288
|
+
project: options.project,
|
|
289
|
+
where: options.where,
|
|
290
|
+
orderBy: options.orderBy,
|
|
291
|
+
limit: options.limit
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
//#endregion
|
|
296
|
+
//#region src/ast/sql-codecs.ts
|
|
297
|
+
const SQL_CHAR_CODEC_ID = "sql/char@1";
|
|
298
|
+
const SQL_VARCHAR_CODEC_ID = "sql/varchar@1";
|
|
299
|
+
const SQL_INT_CODEC_ID = "sql/int@1";
|
|
300
|
+
const SQL_FLOAT_CODEC_ID = "sql/float@1";
|
|
301
|
+
const lengthParamsSchema = type({ length: "number.integer > 0" });
|
|
302
|
+
function createLengthTypeHelper(kind) {
|
|
303
|
+
return (params) => ({
|
|
304
|
+
kind,
|
|
305
|
+
maxLength: params["length"]
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
const sqlCharCodec = codec({
|
|
309
|
+
typeId: SQL_CHAR_CODEC_ID,
|
|
310
|
+
targetTypes: ["char"],
|
|
311
|
+
encode: (value) => value,
|
|
312
|
+
decode: (wire) => wire.trimEnd(),
|
|
313
|
+
paramsSchema: lengthParamsSchema,
|
|
314
|
+
init: createLengthTypeHelper("fixed")
|
|
315
|
+
});
|
|
316
|
+
const sqlVarcharCodec = codec({
|
|
317
|
+
typeId: SQL_VARCHAR_CODEC_ID,
|
|
318
|
+
targetTypes: ["varchar"],
|
|
319
|
+
encode: (value) => value,
|
|
320
|
+
decode: (wire) => wire,
|
|
321
|
+
paramsSchema: lengthParamsSchema,
|
|
322
|
+
init: createLengthTypeHelper("variable")
|
|
323
|
+
});
|
|
324
|
+
const sqlIntCodec = codec({
|
|
325
|
+
typeId: SQL_INT_CODEC_ID,
|
|
326
|
+
targetTypes: ["int"],
|
|
327
|
+
encode: (value) => value,
|
|
328
|
+
decode: (wire) => wire
|
|
329
|
+
});
|
|
330
|
+
const sqlFloatCodec = codec({
|
|
331
|
+
typeId: SQL_FLOAT_CODEC_ID,
|
|
332
|
+
targetTypes: ["float"],
|
|
333
|
+
encode: (value) => value,
|
|
334
|
+
decode: (wire) => wire
|
|
335
|
+
});
|
|
336
|
+
const codecs = defineCodecs().add("char", sqlCharCodec).add("varchar", sqlVarcharCodec).add("int", sqlIntCodec).add("float", sqlFloatCodec);
|
|
337
|
+
const sqlCodecDefinitions = codecs.codecDefinitions;
|
|
338
|
+
const sqlDataTypes = codecs.dataTypes;
|
|
339
|
+
|
|
340
|
+
//#endregion
|
|
341
|
+
//#region src/ast/types.ts
|
|
342
|
+
function isOperationExpr(expr) {
|
|
343
|
+
return expr.kind === "operation";
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
//#endregion
|
|
347
|
+
//#region src/ast/update.ts
|
|
348
|
+
function createUpdateAst(options) {
|
|
349
|
+
return compact({
|
|
350
|
+
kind: "update",
|
|
351
|
+
table: options.table,
|
|
352
|
+
set: options.set,
|
|
353
|
+
where: options.where,
|
|
354
|
+
returning: options.returning
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
//#endregion
|
|
359
|
+
export { SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_VARCHAR_CODEC_ID, codec, compact, createBinaryExpr, createCodecRegistry, createColumnRef, createDeleteAst, createExistsExpr, createInsertAst, createJoin, createJoinOnBuilder, createJoinOnExpr, createLiteralExpr, createNullCheckExpr, createOperationExpr, createOrderByItem, createParamRef, createSelectAst, createTableRef, createUpdateAst, defineCodecs, isOperationExpr, sqlCodecDefinitions, sqlDataTypes };
|
|
360
|
+
//# sourceMappingURL=ast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.mjs","names":["codec","codecs","codecTypes: Record<string, { readonly input: unknown; readonly output: unknown }>","result: Record<\n string,\n {\n typeId: string;\n scalar: string;\n codec: Codec;\n input: unknown;\n output: unknown;\n jsType: unknown;\n }\n >","out: Record<string, unknown>","arktype"],"sources":["../../src/ast/codec-types.ts","../../src/ast/util.ts","../../src/ast/common.ts","../../src/ast/delete.ts","../../src/ast/insert.ts","../../src/ast/join.ts","../../src/ast/order.ts","../../src/ast/predicate.ts","../../src/ast/select.ts","../../src/ast/sql-codecs.ts","../../src/ast/types.ts","../../src/ast/update.ts"],"sourcesContent":["import { ifDefined } from '@prisma-next/utils/defined';\nimport type { Type } from 'arktype';\nimport type { O } from 'ts-toolbelt';\n\n/**\n * Descriptor for parameterized codecs that require type parameter validation.\n * Shared between adapter (compile-time) and runtime layers to avoid duplication.\n *\n * @template TParams - The shape of the type parameters (e.g., `{ length: number }`)\n * @template THelper - The type returned by the optional `init` hook\n */\nexport interface CodecParamsDescriptor<TParams = Record<string, unknown>, THelper = unknown> {\n /** The codec ID this descriptor applies to (e.g., 'pg/vector@1') */\n readonly codecId: string;\n\n /**\n * Arktype schema for validating typeParams.\n * Used to validate both storage.types entries and inline column typeParams.\n */\n readonly paramsSchema: Type<TParams>;\n\n /**\n * Optional init hook called during runtime context creation.\n * Receives validated params and returns a helper object to be stored in context.types.\n * If not provided, the validated params are stored directly.\n */\n readonly init?: (params: TParams) => THelper;\n}\n\n/**\n * Codec metadata for database-specific type information.\n * Used for schema introspection and verification.\n */\nexport interface CodecMeta {\n readonly db?: {\n readonly sql?: {\n readonly postgres?: {\n readonly nativeType: string; // e.g. 'integer', 'text', 'vector', 'timestamp with time zone'\n };\n };\n };\n}\n\n/**\n * Codec interface for encoding/decoding values between wire format and JavaScript types.\n *\n * Codecs are pure, synchronous functions with no side effects or IO.\n * They provide deterministic conversion between database wire types and JS values.\n */\nexport interface Codec<\n Id extends string = string,\n TWire = unknown,\n TJs = unknown,\n TParams = Record<string, unknown>,\n THelper = unknown,\n> {\n /**\n * Namespaced codec identifier in format 'namespace/name@version'\n * Examples: 'pg/text@1', 'pg/uuid@1', 'pg/timestamptz@1'\n */\n readonly id: Id;\n\n /**\n * Contract scalar type IDs that this codec can handle.\n * Examples: ['text'], ['int4', 'float8'], ['timestamp', 'timestamptz']\n */\n readonly targetTypes: readonly string[];\n\n /**\n * Optional metadata for database-specific type information.\n * Used for schema introspection and verification.\n */\n readonly meta?: CodecMeta;\n\n /**\n * Optional params schema for parameterized codecs.\n * If provided, typeParams are validated against this schema.\n */\n readonly paramsSchema?: Type<TParams>;\n\n /**\n * Optional init hook for building runtime helper state from validated params.\n *\n * Useful when parameterized types need derived data at runtime, for example:\n * - normalize typeParams into a stable helper shape consumed by lanes/adapters\n * - precompute reusable values once during context creation\n * - avoid repeating typeParams parsing logic during query execution\n *\n * Example:\n * { length: 255 } -> { kind: 'variable', maxLength: 255 }\n *\n * **Convention for JSON/JSONB codecs**: When the helper includes a `validate`\n * property of type `JsonSchemaValidateFn`, the runtime will use it to enforce\n * JSON Schema conformance during encoding and decoding. The property is\n * discovered via duck typing (`helper?.validate`) for flexibility across\n * different codec types.\n */\n readonly init?: (params: TParams) => THelper;\n\n /**\n * Decode a wire value (from database) to JavaScript type.\n * Must be synchronous and pure (no side effects).\n */\n decode(wire: TWire): TJs;\n\n /**\n * Encode a JavaScript value to wire format (for database).\n * Optional - if not provided, values pass through unchanged.\n * Must be synchronous and pure (no side effects).\n */\n encode?(value: TJs): TWire;\n}\n\n/**\n * Registry interface for codecs organized by ID and by contract scalar type.\n *\n * The registry allows looking up codecs by their namespaced ID or by the\n * contract scalar types they handle. Multiple codecs may handle the same\n * scalar type; ordering in byScalar reflects preference (adapter first,\n * then packs, then app overrides).\n */\nexport interface CodecRegistry {\n get(id: string): Codec<string> | undefined;\n has(id: string): boolean;\n getByScalar(scalar: string): readonly Codec<string>[];\n getDefaultCodec(scalar: string): Codec<string> | undefined;\n register(codec: Codec<string>): void;\n [Symbol.iterator](): Iterator<Codec<string>>;\n values(): IterableIterator<Codec<string>>;\n}\n\n/**\n * Implementation of CodecRegistry.\n */\nclass CodecRegistryImpl implements CodecRegistry {\n private readonly _byId = new Map<string, Codec<string>>();\n private readonly _byScalar = new Map<string, Codec<string>[]>();\n\n /**\n * Map-like interface for codec lookup by ID.\n * Example: registry.get('pg/text@1')\n */\n get(id: string): Codec<string> | undefined {\n return this._byId.get(id);\n }\n\n /**\n * Check if a codec with the given ID is registered.\n */\n has(id: string): boolean {\n return this._byId.has(id);\n }\n\n /**\n * Get all codecs that handle a given scalar type.\n * Returns an empty frozen array if no codecs are found.\n * Example: registry.getByScalar('text') → [codec1, codec2, ...]\n */\n getByScalar(scalar: string): readonly Codec<string>[] {\n return this._byScalar.get(scalar) ?? Object.freeze([]);\n }\n\n /**\n * Get the default codec for a scalar type (first registered codec).\n * Returns undefined if no codec handles this scalar type.\n */\n getDefaultCodec(scalar: string): Codec<string> | undefined {\n const _codecs = this._byScalar.get(scalar);\n return _codecs?.[0];\n }\n\n /**\n * Register a codec in the registry.\n * Throws an error if a codec with the same ID is already registered.\n *\n * @param codec - The codec to register\n * @throws Error if a codec with the same ID already exists\n */\n register(codec: Codec<string>): void {\n if (this._byId.has(codec.id)) {\n throw new Error(`Codec with ID '${codec.id}' is already registered`);\n }\n\n this._byId.set(codec.id, codec);\n\n // Update byScalar mapping\n for (const scalarType of codec.targetTypes) {\n const existing = this._byScalar.get(scalarType);\n if (existing) {\n existing.push(codec);\n } else {\n this._byScalar.set(scalarType, [codec]);\n }\n }\n }\n\n /**\n * Returns an iterator over all registered codecs.\n * Useful for iterating through codecs from another registry.\n */\n *[Symbol.iterator](): Iterator<Codec<string>> {\n for (const codec of this._byId.values()) {\n yield codec;\n }\n }\n\n /**\n * Returns an iterable of all registered codecs.\n */\n values(): IterableIterator<Codec<string>> {\n return this._byId.values();\n }\n}\n\n/**\n * Codec factory - creates a codec with typeId and encode/decode functions.\n */\nexport function codec<\n Id extends string,\n TWire,\n TJs,\n TParams = Record<string, unknown>,\n THelper = unknown,\n>(config: {\n typeId: Id;\n targetTypes: readonly string[];\n encode: (value: TJs) => TWire;\n decode: (wire: TWire) => TJs;\n meta?: CodecMeta;\n paramsSchema?: Type<TParams>;\n init?: (params: TParams) => THelper;\n}): Codec<Id, TWire, TJs, TParams, THelper> {\n return {\n id: config.typeId,\n targetTypes: config.targetTypes,\n ...ifDefined('meta', config.meta),\n ...ifDefined('paramsSchema', config.paramsSchema),\n ...ifDefined('init', config.init),\n encode: config.encode,\n decode: config.decode,\n };\n}\n\n/**\n * Type helpers to extract codec types.\n */\nexport type CodecId<T> =\n T extends Codec<infer Id, unknown, unknown>\n ? Id\n : T extends { readonly id: infer Id }\n ? Id\n : never;\nexport type CodecInput<T> = T extends Codec<string, unknown, infer JsT> ? JsT : never;\nexport type CodecOutput<T> = T extends Codec<string, unknown, infer JsT> ? JsT : never;\n\n/**\n * Type helper to extract codec types from builder instance.\n */\nexport type ExtractCodecTypes<\n ScalarNames extends { readonly [K in keyof ScalarNames]: Codec<string> } = Record<never, never>,\n> = {\n readonly [K in keyof ScalarNames as ScalarNames[K] extends Codec<infer Id, unknown, unknown>\n ? Id\n : never]: {\n readonly input: CodecInput<ScalarNames[K]>;\n readonly output: CodecOutput<ScalarNames[K]>;\n };\n};\n\n/**\n * Type helper to extract data type IDs from builder instance.\n * Uses ExtractCodecTypes which preserves literal types as keys.\n * Since ExtractCodecTypes<Record<K, ScalarNames[K]>> has exactly one key (the Id),\n * we extract it by creating a mapped type that uses the Id as both key and value,\n * then extract the value type. This preserves literal types.\n */\nexport type ExtractDataTypes<\n ScalarNames extends { readonly [K in keyof ScalarNames]: Codec<string> },\n> = {\n readonly [K in keyof ScalarNames]: {\n readonly [Id in keyof ExtractCodecTypes<Record<K, ScalarNames[K]>>]: Id;\n }[keyof ExtractCodecTypes<Record<K, ScalarNames[K]>>];\n};\n\n/**\n * Builder interface for declaring codecs.\n */\nexport interface CodecDefBuilder<\n ScalarNames extends { readonly [K in keyof ScalarNames]: Codec<string> } = Record<never, never>,\n> {\n readonly CodecTypes: ExtractCodecTypes<ScalarNames>;\n\n add<ScalarName extends string, CodecImpl extends Codec<string>>(\n scalarName: ScalarName,\n codecImpl: CodecImpl,\n ): CodecDefBuilder<\n O.Overwrite<ScalarNames, Record<ScalarName, CodecImpl>> & Record<ScalarName, CodecImpl>\n >;\n\n readonly codecDefinitions: {\n readonly [K in keyof ScalarNames]: {\n readonly typeId: ScalarNames[K] extends Codec<infer Id extends string, unknown, unknown>\n ? Id\n : never;\n readonly scalar: K;\n readonly codec: ScalarNames[K];\n readonly input: CodecInput<ScalarNames[K]>;\n readonly output: CodecOutput<ScalarNames[K]>;\n readonly jsType: CodecOutput<ScalarNames[K]>;\n };\n };\n\n readonly dataTypes: {\n readonly [K in keyof ScalarNames]: {\n readonly [Id in keyof ExtractCodecTypes<Record<K, ScalarNames[K]>>]: Id;\n }[keyof ExtractCodecTypes<Record<K, ScalarNames[K]>>];\n };\n}\n\n/**\n * Implementation of CodecDefBuilder.\n */\nclass CodecDefBuilderImpl<\n ScalarNames extends { readonly [K in keyof ScalarNames]: Codec<string> } = Record<never, never>,\n> implements CodecDefBuilder<ScalarNames>\n{\n private readonly _codecs: ScalarNames;\n\n public readonly CodecTypes: ExtractCodecTypes<ScalarNames>;\n public readonly dataTypes: {\n readonly [K in keyof ScalarNames]: {\n readonly [Id in keyof ExtractCodecTypes<Record<K, ScalarNames[K]>>]: Id;\n }[keyof ExtractCodecTypes<Record<K, ScalarNames[K]>>];\n };\n\n constructor(codecs: ScalarNames) {\n this._codecs = codecs;\n\n // Populate CodecTypes from codecs\n const codecTypes: Record<string, { readonly input: unknown; readonly output: unknown }> = {};\n for (const [, codecImpl] of Object.entries(this._codecs)) {\n const codecImplTyped = codecImpl as Codec<string>;\n codecTypes[codecImplTyped.id] = {\n input: undefined as unknown as CodecInput<typeof codecImplTyped>,\n output: undefined as unknown as CodecOutput<typeof codecImplTyped>,\n };\n }\n this.CodecTypes = codecTypes as ExtractCodecTypes<ScalarNames>;\n\n // Populate dataTypes from codecs - extract id property from each codec\n // Build object preserving keys from ScalarNames\n // Type assertion is safe because we know ScalarNames structure matches the return type\n // biome-ignore lint/suspicious/noExplicitAny: dynamic codec mapping requires any\n const dataTypes = {} as any;\n for (const key in this._codecs) {\n if (Object.hasOwn(this._codecs, key)) {\n const codec = this._codecs[key] as Codec<string>;\n dataTypes[key] = codec.id;\n }\n }\n this.dataTypes = dataTypes as {\n readonly [K in keyof ScalarNames]: {\n readonly [Id in keyof ExtractCodecTypes<Record<K, ScalarNames[K]>>]: Id;\n }[keyof ExtractCodecTypes<Record<K, ScalarNames[K]>>];\n };\n }\n\n add<ScalarName extends string, CodecImpl extends Codec<string>>(\n scalarName: ScalarName,\n codecImpl: CodecImpl,\n ): CodecDefBuilder<\n O.Overwrite<ScalarNames, Record<ScalarName, CodecImpl>> & Record<ScalarName, CodecImpl>\n > {\n return new CodecDefBuilderImpl({\n ...this._codecs,\n [scalarName]: codecImpl,\n } as O.Overwrite<ScalarNames, Record<ScalarName, CodecImpl>> & Record<ScalarName, CodecImpl>);\n }\n\n /**\n * Derive codecDefinitions structure.\n */\n get codecDefinitions(): {\n readonly [K in keyof ScalarNames]: {\n readonly typeId: ScalarNames[K] extends Codec<infer Id, unknown, unknown> ? Id : never;\n readonly scalar: K;\n readonly codec: ScalarNames[K];\n readonly input: CodecInput<ScalarNames[K]>;\n readonly output: CodecOutput<ScalarNames[K]>;\n readonly jsType: CodecOutput<ScalarNames[K]>;\n };\n } {\n const result: Record<\n string,\n {\n typeId: string;\n scalar: string;\n codec: Codec;\n input: unknown;\n output: unknown;\n jsType: unknown;\n }\n > = {};\n\n for (const [scalarName, codecImpl] of Object.entries(this._codecs)) {\n const codec = codecImpl as Codec<string>;\n result[scalarName] = {\n typeId: codec.id,\n scalar: scalarName,\n codec: codec,\n input: undefined as unknown as CodecInput<typeof codec>,\n output: undefined as unknown as CodecOutput<typeof codec>,\n jsType: undefined as unknown as CodecOutput<typeof codec>,\n };\n }\n\n return result as {\n readonly [K in keyof ScalarNames]: {\n readonly typeId: ScalarNames[K] extends Codec<infer Id extends string, unknown, unknown>\n ? Id\n : never;\n readonly scalar: K;\n readonly codec: ScalarNames[K];\n readonly input: CodecInput<ScalarNames[K]>;\n readonly output: CodecOutput<ScalarNames[K]>;\n readonly jsType: CodecOutput<ScalarNames[K]>;\n };\n };\n }\n}\n\n/**\n * Create a new codec registry.\n */\nexport function createCodecRegistry(): CodecRegistry {\n return new CodecRegistryImpl();\n}\n\n/**\n * Create a new codec definition builder.\n */\nexport function defineCodecs(): CodecDefBuilder<Record<never, never>> {\n return new CodecDefBuilderImpl({});\n}\n","export function compact<T extends Record<string, unknown>>(o: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) {\n if (v === undefined || v === null) continue;\n if (Array.isArray(v) && v.length === 0) continue;\n out[k] = v;\n }\n return out as T;\n}\n","import type { ColumnRef, LiteralExpr, OperationExpr, ParamRef, TableRef } from './types';\nimport { compact } from './util';\n\nexport function createTableRef(name: string): TableRef {\n return {\n kind: 'table',\n name,\n };\n}\n\nexport function createColumnRef(table: string, column: string): ColumnRef {\n return {\n kind: 'col',\n table,\n column,\n };\n}\n\nexport function createParamRef(index: number, name?: string): ParamRef {\n return compact({\n kind: 'param',\n index,\n name,\n }) as ParamRef;\n}\n\nexport function createOperationExpr(operation: OperationExpr): OperationExpr {\n return operation;\n}\n\nexport function createLiteralExpr(value: unknown): LiteralExpr {\n return {\n kind: 'literal',\n value,\n };\n}\n","import type { ColumnRef, DeleteAst, TableRef, WhereExpr } from './types';\nimport { compact } from './util';\n\nexport interface CreateDeleteAstOptions {\n readonly table: TableRef;\n readonly where: WhereExpr;\n readonly returning?: ReadonlyArray<ColumnRef>;\n}\n\nexport function createDeleteAst(options: CreateDeleteAstOptions): DeleteAst {\n return compact({\n kind: 'delete',\n table: options.table,\n where: options.where,\n returning: options.returning,\n }) as DeleteAst;\n}\n","import type { ColumnRef, InsertAst, ParamRef, TableRef } from './types';\nimport { compact } from './util';\n\nexport interface CreateInsertAstOptions {\n readonly table: TableRef;\n readonly values: Record<string, ColumnRef | ParamRef>;\n readonly returning?: ReadonlyArray<ColumnRef>;\n}\n\nexport function createInsertAst(options: CreateInsertAstOptions): InsertAst {\n return compact({\n kind: 'insert',\n table: options.table,\n values: options.values,\n returning: options.returning,\n }) as InsertAst;\n}\n","import { planInvalid } from '@prisma-next/plan';\nimport type { AnyColumnBuilder, JoinOnBuilder, JoinOnPredicate } from '../types';\nimport { isColumnBuilder } from '../types';\nimport type { ColumnRef, JoinAst, JoinOnExpr, TableRef } from './types';\n\nexport function createJoin(\n joinType: 'inner' | 'left' | 'right' | 'full',\n table: TableRef,\n on: JoinOnExpr,\n): JoinAst {\n return {\n kind: 'join',\n joinType,\n table,\n on,\n };\n}\n\nexport function createJoinOnExpr(left: ColumnRef, right: ColumnRef): JoinOnExpr {\n return {\n kind: 'eqCol',\n left,\n right,\n };\n}\n\nclass JoinOnBuilderImpl implements JoinOnBuilder {\n eqCol(left: AnyColumnBuilder, right: AnyColumnBuilder): JoinOnPredicate {\n if (!left || !isColumnBuilder(left)) {\n throw planInvalid('Join ON left operand must be a column');\n }\n\n if (!right || !isColumnBuilder(right)) {\n throw planInvalid('Join ON right operand must be a column');\n }\n\n // TypeScript can't narrow ColumnBuilder properly, so we assert\n const leftCol = left as unknown as { table: string; column: string };\n const rightCol = right as unknown as { table: string; column: string };\n if (leftCol.table === rightCol.table) {\n throw planInvalid('Self-joins are not supported in MVP');\n }\n\n return {\n kind: 'join-on',\n left: left as AnyColumnBuilder,\n right: right as AnyColumnBuilder,\n };\n }\n}\n\nexport function createJoinOnBuilder(): JoinOnBuilder {\n return new JoinOnBuilderImpl();\n}\n","import type { ColumnRef, Direction, OperationExpr } from './types';\n\nexport function createOrderByItem(\n expr: ColumnRef | OperationExpr,\n dir: 'asc' | 'desc',\n): { expr: ColumnRef | OperationExpr; dir: Direction } {\n return {\n expr,\n dir,\n };\n}\n","import type {\n BinaryExpr,\n BinaryOp,\n ExistsExpr,\n Expression,\n ListLiteralExpr,\n LiteralExpr,\n NullCheckExpr,\n ParamRef,\n SelectAst,\n} from './types';\n\nexport function createBinaryExpr(\n op: BinaryOp,\n left: Expression,\n right: Expression | ParamRef | LiteralExpr | ListLiteralExpr,\n): BinaryExpr {\n return {\n kind: 'bin',\n op,\n left,\n right,\n };\n}\n\nexport function createExistsExpr(not: boolean, subquery: SelectAst): ExistsExpr {\n return {\n kind: 'exists',\n not,\n subquery,\n };\n}\n\nexport function createNullCheckExpr(expr: Expression, isNull: boolean): NullCheckExpr {\n return {\n kind: 'nullCheck',\n expr,\n isNull,\n };\n}\n","import type {\n ColumnRef,\n Direction,\n IncludeAst,\n IncludeRef,\n JoinAst,\n OperationExpr,\n SelectAst,\n TableRef,\n WhereExpr,\n} from './types';\nimport { compact } from './util';\n\nexport interface CreateSelectAstOptions {\n readonly from: TableRef;\n readonly joins?: ReadonlyArray<JoinAst>;\n readonly includes?: ReadonlyArray<IncludeAst>;\n readonly project: ReadonlyArray<{\n alias: string;\n expr: ColumnRef | IncludeRef | OperationExpr;\n }>;\n readonly where?: WhereExpr;\n readonly orderBy?: ReadonlyArray<{ expr: ColumnRef | OperationExpr; dir: Direction }>;\n readonly limit?: number;\n}\n\nexport function createSelectAst(options: CreateSelectAstOptions): SelectAst {\n return compact({\n kind: 'select',\n from: options.from,\n joins: options.joins,\n includes: options.includes,\n project: options.project,\n where: options.where,\n orderBy: options.orderBy,\n limit: options.limit,\n }) as SelectAst;\n}\n","import { type as arktype } from 'arktype';\nimport { codec, defineCodecs } from './codec-types';\n\nexport const SQL_CHAR_CODEC_ID = 'sql/char@1' as const;\nexport const SQL_VARCHAR_CODEC_ID = 'sql/varchar@1' as const;\nexport const SQL_INT_CODEC_ID = 'sql/int@1' as const;\nexport const SQL_FLOAT_CODEC_ID = 'sql/float@1' as const;\n\nconst lengthParamsSchema = arktype({\n length: 'number.integer > 0',\n});\n\ntype LengthTypeHelper = {\n readonly kind: 'fixed' | 'variable';\n readonly maxLength: number;\n};\n\nfunction createLengthTypeHelper(\n kind: LengthTypeHelper['kind'],\n): (params: Record<string, unknown>) => LengthTypeHelper {\n return (params) => ({\n kind,\n maxLength: params['length'] as number,\n });\n}\n\nconst sqlCharCodec = codec<typeof SQL_CHAR_CODEC_ID, string, string>({\n typeId: SQL_CHAR_CODEC_ID,\n targetTypes: ['char'],\n encode: (value: string): string => value,\n decode: (wire: string): string => wire.trimEnd(),\n paramsSchema: lengthParamsSchema,\n init: createLengthTypeHelper('fixed'),\n});\n\nconst sqlVarcharCodec = codec<typeof SQL_VARCHAR_CODEC_ID, string, string>({\n typeId: SQL_VARCHAR_CODEC_ID,\n targetTypes: ['varchar'],\n encode: (value: string): string => value,\n decode: (wire: string): string => wire,\n paramsSchema: lengthParamsSchema,\n init: createLengthTypeHelper('variable'),\n});\n\nconst sqlIntCodec = codec<typeof SQL_INT_CODEC_ID, number, number>({\n typeId: SQL_INT_CODEC_ID,\n targetTypes: ['int'],\n encode: (value) => value,\n decode: (wire) => wire,\n});\n\nconst sqlFloatCodec = codec<typeof SQL_FLOAT_CODEC_ID, number, number>({\n typeId: SQL_FLOAT_CODEC_ID,\n targetTypes: ['float'],\n encode: (value) => value,\n decode: (wire) => wire,\n});\n\nconst codecs = defineCodecs()\n .add('char', sqlCharCodec)\n .add('varchar', sqlVarcharCodec)\n .add('int', sqlIntCodec)\n .add('float', sqlFloatCodec);\n\nexport const sqlCodecDefinitions = codecs.codecDefinitions;\nexport const sqlDataTypes = codecs.dataTypes;\nexport type SqlCodecTypes = typeof codecs.CodecTypes;\n","import type { ReturnSpec } from '@prisma-next/operations';\nimport type { SqlLoweringSpec } from '@prisma-next/sql-operations';\n\n// SQL-specific AST types and supporting types\n// These types are needed by adapters and runtime for SQL query execution\n\nexport type Direction = 'asc' | 'desc';\n\nexport interface TableRef {\n readonly kind: 'table';\n readonly name: string;\n}\n\nexport interface ColumnRef {\n readonly kind: 'col';\n readonly table: string;\n readonly column: string;\n}\n\nexport interface ParamRef {\n readonly kind: 'param';\n readonly index: number;\n readonly name?: string;\n}\n\nexport interface LiteralExpr {\n readonly kind: 'literal';\n readonly value: unknown;\n}\n\nexport interface OperationExpr {\n readonly kind: 'operation';\n readonly method: string;\n readonly forTypeId: string;\n readonly self: Expression;\n readonly args: ReadonlyArray<Expression | ParamRef | LiteralExpr>;\n readonly returns: ReturnSpec;\n readonly lowering: SqlLoweringSpec;\n}\n\n/**\n * Unified expression type - the canonical AST representation for column references\n * and operation expressions. This is what all builders convert to via toExpr().\n */\nexport type Expression = ColumnRef | OperationExpr;\n\n/**\n * Interface for any builder that can produce an Expression.\n * Implemented by ColumnBuilder and ExpressionBuilder.\n */\nexport interface ExpressionSource {\n toExpr(): Expression;\n}\n\nexport function isOperationExpr(expr: Expression): expr is OperationExpr {\n return expr.kind === 'operation';\n}\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 interface ListLiteralExpr {\n readonly kind: 'listLiteral';\n readonly values: ReadonlyArray<ParamRef | LiteralExpr>;\n}\n\nexport interface BinaryExpr {\n readonly kind: 'bin';\n readonly op: BinaryOp;\n readonly left: Expression;\n readonly right: Expression | ParamRef | LiteralExpr | ListLiteralExpr;\n}\n\nexport interface ExistsExpr {\n readonly kind: 'exists';\n readonly not: boolean;\n readonly subquery: SelectAst;\n}\n\n/**\n * Unary expression for IS NULL / IS NOT NULL checks.\n * Used in WHERE clauses to check for null values.\n */\nexport interface NullCheckExpr {\n readonly kind: 'nullCheck';\n readonly expr: Expression;\n readonly isNull: boolean;\n}\n\nexport interface AndExpr {\n readonly kind: 'and';\n readonly exprs: ReadonlyArray<WhereExpr>;\n}\n\nexport interface OrExpr {\n readonly kind: 'or';\n readonly exprs: ReadonlyArray<WhereExpr>;\n}\n\n/**\n * Union type for WHERE clause expressions.\n */\nexport type WhereExpr = BinaryExpr | ExistsExpr | NullCheckExpr | AndExpr | OrExpr;\n\nexport type JoinOnExpr = {\n readonly kind: 'eqCol';\n readonly left: ColumnRef;\n readonly right: ColumnRef;\n};\n\nexport interface JoinAst {\n readonly kind: 'join';\n readonly joinType: 'inner' | 'left' | 'right' | 'full';\n readonly table: TableRef;\n readonly on: JoinOnExpr;\n}\n\nexport interface IncludeRef {\n readonly kind: 'includeRef';\n readonly alias: string;\n}\n\nexport interface IncludeAst {\n readonly kind: 'includeMany';\n readonly alias: string;\n readonly child: {\n readonly table: TableRef;\n readonly on: JoinOnExpr;\n readonly where?: WhereExpr;\n readonly orderBy?: ReadonlyArray<{ expr: Expression; dir: Direction }>;\n readonly limit?: number;\n readonly project: ReadonlyArray<{ alias: string; expr: Expression }>;\n };\n}\n\nexport interface SelectAst {\n readonly kind: 'select';\n readonly from: TableRef;\n readonly joins?: ReadonlyArray<JoinAst>;\n readonly includes?: ReadonlyArray<IncludeAst>;\n readonly project: ReadonlyArray<{\n alias: string;\n expr: Expression | IncludeRef | LiteralExpr;\n }>;\n readonly where?: WhereExpr;\n readonly orderBy?: ReadonlyArray<{ expr: Expression; dir: Direction }>;\n readonly limit?: number;\n}\n\nexport interface InsertAst {\n readonly kind: 'insert';\n readonly table: TableRef;\n readonly values: Record<string, ColumnRef | ParamRef>;\n readonly returning?: ReadonlyArray<ColumnRef>;\n}\n\nexport interface UpdateAst {\n readonly kind: 'update';\n readonly table: TableRef;\n readonly set: Record<string, ColumnRef | ParamRef>;\n readonly where: WhereExpr;\n readonly returning?: ReadonlyArray<ColumnRef>;\n}\n\nexport interface DeleteAst {\n readonly kind: 'delete';\n readonly table: TableRef;\n readonly where: WhereExpr;\n readonly returning?: ReadonlyArray<ColumnRef>;\n}\n\nexport type QueryAst = SelectAst | InsertAst | UpdateAst | DeleteAst;\n\nexport interface LoweredStatement {\n readonly sql: string;\n readonly params: readonly unknown[];\n readonly annotations?: Record<string, unknown>;\n}\n","import type { ColumnRef, ParamRef, TableRef, UpdateAst, WhereExpr } from './types';\nimport { compact } from './util';\n\nexport interface CreateUpdateAstOptions {\n readonly table: TableRef;\n readonly set: Record<string, ColumnRef | ParamRef>;\n readonly where: WhereExpr;\n readonly returning?: ReadonlyArray<ColumnRef>;\n}\n\nexport function createUpdateAst(options: CreateUpdateAstOptions): UpdateAst {\n return compact({\n kind: 'update',\n table: options.table,\n set: options.set,\n where: options.where,\n returning: options.returning,\n }) as UpdateAst;\n}\n"],"mappings":"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"}
|