@prisma-next/sql-relational-core 0.3.0-dev.10 → 0.3.0-dev.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +18 -1
- package/dist/errors-BNiBIGfC.d.mts +2 -0
- package/dist/errors-DXSQwbhk.mjs +3 -0
- package/dist/exports/ast.d.mts +126 -0
- package/dist/exports/ast.d.mts.map +1 -0
- package/dist/exports/ast.mjs +253 -0
- package/dist/exports/ast.mjs.map +1 -0
- package/dist/exports/errors.d.mts +2 -0
- package/dist/exports/errors.mjs +3 -0
- package/dist/exports/guards.d.mts +5 -0
- package/dist/exports/guards.mjs +3 -0
- package/dist/exports/operations-registry.d.mts +5 -0
- package/dist/exports/operations-registry.mjs +3 -0
- package/dist/exports/param.d.mts +5 -0
- package/dist/exports/param.mjs +3 -0
- package/dist/exports/plan.d.mts +2 -0
- package/dist/exports/plan.mjs +17 -0
- package/dist/exports/plan.mjs.map +1 -0
- package/dist/exports/query-lane-context.d.mts +2 -0
- package/dist/exports/query-lane-context.mjs +1 -0
- package/dist/exports/query-operations.d.mts +2 -0
- package/dist/exports/query-operations.mjs +18 -0
- package/dist/exports/query-operations.mjs.map +1 -0
- package/dist/exports/schema.d.mts +5 -0
- package/dist/exports/schema.mjs +4 -0
- package/dist/exports/types.d.mts +4 -0
- package/dist/exports/types.mjs +3 -0
- package/dist/exports/utils/guards.d.mts +5 -0
- package/dist/exports/utils/guards.mjs +3 -0
- package/dist/guards-D1ax7TKN.mjs +57 -0
- package/dist/guards-D1ax7TKN.mjs.map +1 -0
- package/dist/guards-DC2Ll67p.d.mts +31 -0
- package/dist/guards-DC2Ll67p.d.mts.map +1 -0
- package/dist/index.d.mts +12 -0
- package/dist/index.mjs +13 -0
- package/dist/operations-registry-CBmGut8O.d.mts +9 -0
- package/dist/operations-registry-CBmGut8O.d.mts.map +1 -0
- package/dist/operations-registry-D8INFH9J.mjs +145 -0
- package/dist/operations-registry-D8INFH9J.mjs.map +1 -0
- package/dist/param-CFyhvphn.mjs +14 -0
- package/dist/param-CFyhvphn.mjs.map +1 -0
- package/dist/param-Cmdv_exJ.d.mts +8 -0
- package/dist/param-Cmdv_exJ.d.mts.map +1 -0
- package/dist/plan-BrZtMUA9.d.mts +517 -0
- package/dist/plan-BrZtMUA9.d.mts.map +1 -0
- package/dist/query-lane-context-BTtg0xm8.d.mts +278 -0
- package/dist/query-lane-context-BTtg0xm8.d.mts.map +1 -0
- package/dist/query-operation-registry-B6bClJs8.d.mts +27 -0
- package/dist/query-operation-registry-B6bClJs8.d.mts.map +1 -0
- package/dist/schema-XcyJSq4j.mjs +174 -0
- package/dist/schema-XcyJSq4j.mjs.map +1 -0
- package/dist/schema-j3Srik3R.d.mts +88 -0
- package/dist/schema-j3Srik3R.d.mts.map +1 -0
- package/dist/types-BZKzxgOb.mjs +18 -0
- package/dist/types-BZKzxgOb.mjs.map +1 -0
- package/dist/types-CMyotK6U.d.mts +443 -0
- package/dist/types-CMyotK6U.d.mts.map +1 -0
- package/dist/types-I6Hsg-GU.mjs +1102 -0
- package/dist/types-I6Hsg-GU.mjs.map +1 -0
- package/package.json +40 -56
- package/src/ast/codec-types.ts +123 -22
- package/src/ast/driver-types.ts +20 -3
- package/src/ast/join.ts +3 -23
- package/src/ast/sql-codecs.ts +81 -0
- package/src/ast/types.ts +1704 -74
- package/src/exports/ast.ts +1 -7
- package/src/exports/guards.ts +3 -4
- package/src/exports/query-operations.ts +1 -0
- package/src/exports/utils/guards.ts +1 -0
- package/src/operations-registry.ts +115 -89
- package/src/plan.ts +4 -4
- package/src/query-lane-context.ts +79 -1
- package/src/query-operation-registry.ts +35 -0
- package/src/schema.ts +104 -43
- package/src/types.ts +333 -84
- package/src/utils/guards.ts +44 -80
- package/dist/ast/adapter-types.d.ts +0 -28
- package/dist/ast/adapter-types.d.ts.map +0 -1
- package/dist/ast/codec-types.d.ts +0 -141
- package/dist/ast/codec-types.d.ts.map +0 -1
- package/dist/ast/common.d.ts +0 -7
- package/dist/ast/common.d.ts.map +0 -1
- package/dist/ast/delete.d.ts +0 -8
- package/dist/ast/delete.d.ts.map +0 -1
- package/dist/ast/driver-types.d.ts +0 -20
- package/dist/ast/driver-types.d.ts.map +0 -1
- package/dist/ast/insert.d.ts +0 -8
- package/dist/ast/insert.d.ts.map +0 -1
- package/dist/ast/join.d.ts +0 -6
- package/dist/ast/join.d.ts.map +0 -1
- package/dist/ast/order.d.ts +0 -6
- package/dist/ast/order.d.ts.map +0 -1
- package/dist/ast/predicate.d.ts +0 -4
- package/dist/ast/predicate.d.ts.map +0 -1
- package/dist/ast/select.d.ts +0 -18
- package/dist/ast/select.d.ts.map +0 -1
- package/dist/ast/types.d.ts +0 -118
- package/dist/ast/types.d.ts.map +0 -1
- package/dist/ast/update.d.ts +0 -9
- package/dist/ast/update.d.ts.map +0 -1
- package/dist/ast/util.d.ts +0 -2
- package/dist/ast/util.d.ts.map +0 -1
- package/dist/chunk-2F7DSEOU.js +0 -8
- package/dist/chunk-2F7DSEOU.js.map +0 -1
- package/dist/chunk-36WJWNHT.js +0 -1
- package/dist/chunk-36WJWNHT.js.map +0 -1
- package/dist/chunk-5N34PNVZ.js +0 -62
- package/dist/chunk-5N34PNVZ.js.map +0 -1
- package/dist/chunk-7I3EMQID.js +0 -16
- package/dist/chunk-7I3EMQID.js.map +0 -1
- package/dist/chunk-CBTYMOX2.js +0 -152
- package/dist/chunk-CBTYMOX2.js.map +0 -1
- package/dist/chunk-G52ENULI.js +0 -1
- package/dist/chunk-G52ENULI.js.map +0 -1
- package/dist/chunk-KYSP7L5C.js +0 -16
- package/dist/chunk-KYSP7L5C.js.map +0 -1
- package/dist/chunk-M23L3JHG.js +0 -159
- package/dist/chunk-M23L3JHG.js.map +0 -1
- package/dist/chunk-MM74SVJ4.js +0 -13
- package/dist/chunk-MM74SVJ4.js.map +0 -1
- package/dist/chunk-U7AXAUJA.js +0 -1
- package/dist/chunk-U7AXAUJA.js.map +0 -1
- package/dist/chunk-WZBPVEZI.js +0 -320
- package/dist/chunk-WZBPVEZI.js.map +0 -1
- package/dist/errors.d.ts +0 -2
- package/dist/errors.d.ts.map +0 -1
- package/dist/exports/ast.d.ts +0 -14
- package/dist/exports/ast.d.ts.map +0 -1
- package/dist/exports/ast.js +0 -46
- package/dist/exports/ast.js.map +0 -1
- package/dist/exports/errors.d.ts +0 -2
- package/dist/exports/errors.d.ts.map +0 -1
- package/dist/exports/errors.js +0 -9
- package/dist/exports/errors.js.map +0 -1
- package/dist/exports/guards.d.ts +0 -2
- package/dist/exports/guards.d.ts.map +0 -1
- package/dist/exports/guards.js +0 -21
- package/dist/exports/guards.js.map +0 -1
- package/dist/exports/operations-registry.d.ts +0 -2
- package/dist/exports/operations-registry.d.ts.map +0 -1
- package/dist/exports/operations-registry.js +0 -9
- package/dist/exports/operations-registry.js.map +0 -1
- package/dist/exports/param.d.ts +0 -3
- package/dist/exports/param.d.ts.map +0 -1
- package/dist/exports/param.js +0 -7
- package/dist/exports/param.js.map +0 -1
- package/dist/exports/plan.d.ts +0 -2
- package/dist/exports/plan.d.ts.map +0 -1
- package/dist/exports/plan.js +0 -7
- package/dist/exports/plan.js.map +0 -1
- package/dist/exports/query-lane-context.d.ts +0 -2
- package/dist/exports/query-lane-context.d.ts.map +0 -1
- package/dist/exports/query-lane-context.js +0 -2
- package/dist/exports/query-lane-context.js.map +0 -1
- package/dist/exports/schema.d.ts +0 -3
- package/dist/exports/schema.d.ts.map +0 -1
- package/dist/exports/schema.js +0 -14
- package/dist/exports/schema.js.map +0 -1
- package/dist/exports/types.d.ts +0 -2
- package/dist/exports/types.d.ts.map +0 -1
- package/dist/exports/types.js +0 -10
- package/dist/exports/types.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -81
- package/dist/index.js.map +0 -1
- package/dist/operations-registry.d.ts +0 -5
- package/dist/operations-registry.d.ts.map +0 -1
- package/dist/param.d.ts +0 -4
- package/dist/param.d.ts.map +0 -1
- package/dist/plan.d.ts +0 -23
- package/dist/plan.d.ts.map +0 -1
- package/dist/query-lane-context.d.ts +0 -16
- package/dist/query-lane-context.d.ts.map +0 -1
- package/dist/schema.d.ts +0 -63
- package/dist/schema.d.ts.map +0 -1
- package/dist/types.d.ts +0 -332
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/guards.d.ts +0 -55
- package/dist/utils/guards.d.ts.map +0 -1
- package/src/ast/common.ts +0 -36
- package/src/ast/delete.ts +0 -17
- package/src/ast/insert.ts +0 -17
- package/src/ast/order.ts +0 -11
- package/src/ast/predicate.ts +0 -30
- package/src/ast/select.ts +0 -39
- package/src/ast/update.ts +0 -19
package/src/types.ts
CHANGED
|
@@ -7,28 +7,38 @@ import type { ArgSpec, ReturnSpec } from '@prisma-next/operations';
|
|
|
7
7
|
import type { SqlContract, SqlStorage, StorageColumn } from '@prisma-next/sql-contract/types';
|
|
8
8
|
import type { SqlLoweringSpec } from '@prisma-next/sql-operations';
|
|
9
9
|
import type {
|
|
10
|
+
AnyExpression,
|
|
11
|
+
AnyQueryAst,
|
|
10
12
|
BinaryOp,
|
|
11
13
|
ColumnRef,
|
|
12
14
|
Direction,
|
|
15
|
+
ExpressionSource,
|
|
13
16
|
OperationExpr,
|
|
14
17
|
ParamRef,
|
|
15
|
-
QueryAst,
|
|
16
18
|
} from './ast/types';
|
|
17
19
|
import type { SqlQueryPlan } from './plan';
|
|
18
|
-
import type {
|
|
20
|
+
import type { ExecutionContext } from './query-lane-context';
|
|
19
21
|
|
|
20
22
|
export interface ParamPlaceholder {
|
|
21
23
|
readonly kind: 'param-placeholder';
|
|
22
24
|
readonly name: string;
|
|
23
25
|
}
|
|
24
26
|
|
|
27
|
+
/**
|
|
28
|
+
* ValueSource represents any value that can appear in a comparison or as an argument.
|
|
29
|
+
* This includes:
|
|
30
|
+
* - ParamPlaceholder: A parameter placeholder (e.g., `param('userId')`)
|
|
31
|
+
* - ExpressionSource: Something that can be converted to an Expression (ColumnBuilder, ExpressionBuilder)
|
|
32
|
+
*/
|
|
33
|
+
export type ValueSource = ParamPlaceholder | ExpressionSource;
|
|
34
|
+
|
|
25
35
|
export interface OrderBuilder<
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
_ColumnName extends string = string,
|
|
37
|
+
_ColumnMeta extends StorageColumn = StorageColumn,
|
|
38
|
+
_JsType = unknown,
|
|
29
39
|
> {
|
|
30
40
|
readonly kind: 'order';
|
|
31
|
-
readonly expr:
|
|
41
|
+
readonly expr: AnyExpression;
|
|
32
42
|
readonly dir: Direction;
|
|
33
43
|
}
|
|
34
44
|
|
|
@@ -45,6 +55,9 @@ export function createOrderBuilder(
|
|
|
45
55
|
/**
|
|
46
56
|
* ColumnBuilder with optional operation methods based on the column's typeId.
|
|
47
57
|
* When Operations is provided and the column's typeId matches, operation methods are included.
|
|
58
|
+
* Implements ExpressionSource to provide type-safe conversion to ColumnRef.
|
|
59
|
+
*
|
|
60
|
+
* For nullable columns (ColumnMeta['nullable'] extends true), includes isNull() and isNotNull() methods.
|
|
48
61
|
*/
|
|
49
62
|
export type ColumnBuilder<
|
|
50
63
|
ColumnName extends string = string,
|
|
@@ -56,20 +69,17 @@ export type ColumnBuilder<
|
|
|
56
69
|
readonly table: string;
|
|
57
70
|
readonly column: ColumnName;
|
|
58
71
|
readonly columnMeta: ColumnMeta;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
value: ParamPlaceholder | AnyColumnBuilderBase,
|
|
67
|
-
): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
68
|
-
lte(
|
|
69
|
-
value: ParamPlaceholder | AnyColumnBuilderBase,
|
|
70
|
-
): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
72
|
+
// Methods accept ValueSource (ParamPlaceholder or ExpressionSource)
|
|
73
|
+
eq(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
74
|
+
neq(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
75
|
+
gt(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
76
|
+
lt(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
77
|
+
gte(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
78
|
+
lte(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
|
|
71
79
|
asc(): OrderBuilder<ColumnName, ColumnMeta, JsType>;
|
|
72
80
|
desc(): OrderBuilder<ColumnName, ColumnMeta, JsType>;
|
|
81
|
+
/** Converts this column builder to a ColumnRef expression */
|
|
82
|
+
toExpr(): ColumnRef;
|
|
73
83
|
// Helper property for type extraction (not used at runtime)
|
|
74
84
|
readonly __jsType: JsType;
|
|
75
85
|
} & (ColumnMeta['codecId'] extends string
|
|
@@ -81,17 +91,92 @@ export type ColumnBuilder<
|
|
|
81
91
|
JsType
|
|
82
92
|
>
|
|
83
93
|
: Record<string, never>
|
|
84
|
-
: Record<string, never>)
|
|
94
|
+
: Record<string, never>) &
|
|
95
|
+
(ColumnMeta['nullable'] extends true
|
|
96
|
+
? NullableMethods<ColumnName, ColumnMeta, JsType>
|
|
97
|
+
: Record<string, never>);
|
|
85
98
|
|
|
86
99
|
export interface BinaryBuilder<
|
|
100
|
+
_ColumnName extends string = string,
|
|
101
|
+
_ColumnMeta extends StorageColumn = StorageColumn,
|
|
102
|
+
_JsType = unknown,
|
|
103
|
+
> {
|
|
104
|
+
readonly kind: 'binary';
|
|
105
|
+
readonly op: BinaryOp;
|
|
106
|
+
readonly left: AnyExpression;
|
|
107
|
+
readonly right: ValueSource;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Builder for IS NULL / IS NOT NULL checks.
|
|
112
|
+
* Used to build unary null check expressions in WHERE clauses.
|
|
113
|
+
*/
|
|
114
|
+
export interface NullCheckBuilder<
|
|
115
|
+
_ColumnName extends string = string,
|
|
116
|
+
_ColumnMeta extends StorageColumn = StorageColumn,
|
|
117
|
+
_JsType = unknown,
|
|
118
|
+
> {
|
|
119
|
+
readonly kind: 'nullCheck';
|
|
120
|
+
readonly expr: AnyExpression;
|
|
121
|
+
readonly isNull: boolean;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Union type for unary builders (currently just NullCheckBuilder).
|
|
126
|
+
* Extensible for future unary operators.
|
|
127
|
+
*/
|
|
128
|
+
export type UnaryBuilder = NullCheckBuilder;
|
|
129
|
+
|
|
130
|
+
// Forward declare AnyBinaryBuilder and AnyOrderBuilder for use in ExpressionBuilder
|
|
131
|
+
export type AnyBinaryBuilder = BinaryBuilder;
|
|
132
|
+
export type AnyOrderBuilder = OrderBuilder;
|
|
133
|
+
export type AnyUnaryBuilder = UnaryBuilder;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Methods available only on nullable columns.
|
|
137
|
+
* These are conditionally added to ColumnBuilder when ColumnMeta['nullable'] is true.
|
|
138
|
+
* Note: Index signature is required for compatibility with AnyColumnBuilderBase's index signature.
|
|
139
|
+
*/
|
|
140
|
+
export interface NullableMethods<
|
|
87
141
|
ColumnName extends string = string,
|
|
88
142
|
ColumnMeta extends StorageColumn = StorageColumn,
|
|
89
143
|
JsType = unknown,
|
|
90
144
|
> {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
145
|
+
/** Creates an IS NULL check for this column */
|
|
146
|
+
isNull(): NullCheckBuilder<ColumnName, ColumnMeta, JsType>;
|
|
147
|
+
/** Creates an IS NOT NULL check for this column */
|
|
148
|
+
isNotNull(): NullCheckBuilder<ColumnName, ColumnMeta, JsType>;
|
|
149
|
+
/** Index signature for compatibility with AnyColumnBuilderBase */
|
|
150
|
+
readonly [key: string]: unknown;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* ExpressionBuilder represents the result of an operation (e.g., col.distance(...)).
|
|
155
|
+
* Unlike ColumnBuilder (which represents a column), ExpressionBuilder represents
|
|
156
|
+
* an operation expression and provides the same DSL methods for chaining.
|
|
157
|
+
*
|
|
158
|
+
* Implements ExpressionSource to provide type-safe conversion to OperationExpr.
|
|
159
|
+
*/
|
|
160
|
+
export interface ExpressionBuilder<JsType = unknown> extends ExpressionSource {
|
|
161
|
+
readonly kind: 'expression';
|
|
162
|
+
readonly expr: OperationExpr;
|
|
163
|
+
readonly columnMeta: StorageColumn;
|
|
164
|
+
|
|
165
|
+
// Methods accept ValueSource (ParamPlaceholder or ExpressionSource)
|
|
166
|
+
eq(value: ValueSource): AnyBinaryBuilder;
|
|
167
|
+
neq(value: ValueSource): AnyBinaryBuilder;
|
|
168
|
+
gt(value: ValueSource): AnyBinaryBuilder;
|
|
169
|
+
lt(value: ValueSource): AnyBinaryBuilder;
|
|
170
|
+
gte(value: ValueSource): AnyBinaryBuilder;
|
|
171
|
+
lte(value: ValueSource): AnyBinaryBuilder;
|
|
172
|
+
asc(): AnyOrderBuilder;
|
|
173
|
+
desc(): AnyOrderBuilder;
|
|
174
|
+
|
|
175
|
+
/** Converts this expression builder to the underlying OperationExpr */
|
|
176
|
+
toExpr(): OperationExpr;
|
|
177
|
+
|
|
178
|
+
// Helper property for type extraction (not used at runtime)
|
|
179
|
+
readonly __jsType: JsType;
|
|
95
180
|
}
|
|
96
181
|
|
|
97
182
|
// Helper aliases for usage sites where the specific column parameters are irrelevant
|
|
@@ -108,15 +193,20 @@ export type AnyColumnBuilderBase = {
|
|
|
108
193
|
readonly table: string;
|
|
109
194
|
readonly column: string;
|
|
110
195
|
readonly columnMeta: StorageColumn;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
196
|
+
// Methods accept ValueSource (ParamPlaceholder or ExpressionSource)
|
|
197
|
+
eq(value: ValueSource): AnyBinaryBuilder;
|
|
198
|
+
neq(value: ValueSource): AnyBinaryBuilder;
|
|
199
|
+
gt(value: ValueSource): AnyBinaryBuilder;
|
|
200
|
+
lt(value: ValueSource): AnyBinaryBuilder;
|
|
201
|
+
gte(value: ValueSource): AnyBinaryBuilder;
|
|
202
|
+
lte(value: ValueSource): AnyBinaryBuilder;
|
|
117
203
|
asc(): AnyOrderBuilder;
|
|
118
204
|
desc(): AnyOrderBuilder;
|
|
205
|
+
toExpr(): ColumnRef;
|
|
119
206
|
readonly __jsType: unknown;
|
|
207
|
+
// Optional nullable methods (present when columnMeta.nullable is true)
|
|
208
|
+
isNull?(): AnyUnaryBuilder;
|
|
209
|
+
isNotNull?(): AnyUnaryBuilder;
|
|
120
210
|
// Allow any operation methods (from conditional type)
|
|
121
211
|
readonly [key: string]: unknown;
|
|
122
212
|
};
|
|
@@ -130,8 +220,13 @@ export type AnyColumnBuilder =
|
|
|
130
220
|
any
|
|
131
221
|
>
|
|
132
222
|
| AnyColumnBuilderBase;
|
|
133
|
-
|
|
134
|
-
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Union type for any builder that can produce an Expression.
|
|
226
|
+
* Used in DSL method signatures where either a column or operation result can be passed.
|
|
227
|
+
*/
|
|
228
|
+
// TODO: do we still need this? can we just replace it with ExpressionSource
|
|
229
|
+
export type AnyExpressionSource = AnyColumnBuilder | ExpressionBuilder;
|
|
135
230
|
|
|
136
231
|
export function isColumnBuilder(value: unknown): value is AnyColumnBuilder {
|
|
137
232
|
return (
|
|
@@ -167,6 +262,136 @@ type ExtractCodecOutputType<
|
|
|
167
262
|
: never
|
|
168
263
|
: never;
|
|
169
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Extracts the model name for a given table from the contract mappings.
|
|
267
|
+
*/
|
|
268
|
+
type ExtractTableToModel<
|
|
269
|
+
Contract extends SqlContract<SqlStorage>,
|
|
270
|
+
TableName extends string,
|
|
271
|
+
> = Contract['mappings'] extends {
|
|
272
|
+
readonly tableToModel: infer TableToModel;
|
|
273
|
+
}
|
|
274
|
+
? TableToModel extends Record<string, string>
|
|
275
|
+
? TableName extends keyof TableToModel
|
|
276
|
+
? TableToModel[TableName]
|
|
277
|
+
: never
|
|
278
|
+
: never
|
|
279
|
+
: never;
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Extracts the field name for a given table column from the contract mappings.
|
|
283
|
+
*/
|
|
284
|
+
type ExtractColumnToField<
|
|
285
|
+
Contract extends SqlContract<SqlStorage>,
|
|
286
|
+
TableName extends string,
|
|
287
|
+
ColumnName extends string,
|
|
288
|
+
> = Contract['mappings'] extends {
|
|
289
|
+
readonly columnToField: infer ColumnToField;
|
|
290
|
+
}
|
|
291
|
+
? ColumnToField extends Record<string, Record<string, string>>
|
|
292
|
+
? TableName extends keyof ColumnToField
|
|
293
|
+
? ColumnName extends keyof ColumnToField[TableName]
|
|
294
|
+
? ColumnToField[TableName][ColumnName]
|
|
295
|
+
: never
|
|
296
|
+
: never
|
|
297
|
+
: never
|
|
298
|
+
: never;
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Extracts the field value type from a model's fields.
|
|
302
|
+
*/
|
|
303
|
+
type ExtractFieldValue<
|
|
304
|
+
Contract extends SqlContract<SqlStorage>,
|
|
305
|
+
ModelName extends string,
|
|
306
|
+
FieldName extends string,
|
|
307
|
+
> = Contract['models'] extends infer Models
|
|
308
|
+
? Models extends Record<string, unknown>
|
|
309
|
+
? ModelName extends keyof Models
|
|
310
|
+
? Models[ModelName] extends { readonly fields: infer Fields }
|
|
311
|
+
? Fields extends Record<string, unknown>
|
|
312
|
+
? FieldName extends keyof Fields
|
|
313
|
+
? Fields[FieldName]
|
|
314
|
+
: never
|
|
315
|
+
: never
|
|
316
|
+
: never
|
|
317
|
+
: never
|
|
318
|
+
: never
|
|
319
|
+
: never;
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Extracts the JavaScript type for a column from model mappings if available.
|
|
323
|
+
* Returns `never` if the column maps to a ModelField object (which indicates
|
|
324
|
+
* a relation that should fall through to codec-based type resolution).
|
|
325
|
+
*
|
|
326
|
+
* The check for ModelField uses `Exclude<keyof FieldValue, 'column'> extends never`
|
|
327
|
+
* to ensure we only skip pure `{ column: string }` marker objects, not richer
|
|
328
|
+
* object types that happen to include a `column` property.
|
|
329
|
+
*/
|
|
330
|
+
type ExtractColumnJsTypeFromModels<
|
|
331
|
+
Contract extends SqlContract<SqlStorage>,
|
|
332
|
+
TableName extends string,
|
|
333
|
+
ColumnName extends string,
|
|
334
|
+
> = ExtractTableToModel<Contract, TableName> extends infer ModelName
|
|
335
|
+
? ModelName extends string
|
|
336
|
+
? ExtractColumnToField<Contract, TableName, ColumnName> extends infer FieldName
|
|
337
|
+
? FieldName extends string
|
|
338
|
+
? ExtractFieldValue<Contract, ModelName, FieldName> extends infer FieldValue
|
|
339
|
+
? FieldValue extends { readonly column: string }
|
|
340
|
+
? Exclude<keyof FieldValue, 'column'> extends never
|
|
341
|
+
? never
|
|
342
|
+
: FieldValue
|
|
343
|
+
: FieldValue
|
|
344
|
+
: never
|
|
345
|
+
: never
|
|
346
|
+
: never
|
|
347
|
+
: never
|
|
348
|
+
: never;
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Resolves type params for a column from either:
|
|
352
|
+
* - inline `columnMeta.typeParams`, or
|
|
353
|
+
* - `columnMeta.typeRef` (resolving into `contract.storage.types[typeRef].typeParams`).
|
|
354
|
+
*/
|
|
355
|
+
type ResolveColumnTypeParams<
|
|
356
|
+
Contract extends SqlContract<SqlStorage>,
|
|
357
|
+
ColumnMeta extends StorageColumn,
|
|
358
|
+
> = ColumnMeta extends { typeParams: infer Params }
|
|
359
|
+
? Params extends object
|
|
360
|
+
? Params
|
|
361
|
+
: undefined
|
|
362
|
+
: ColumnMeta extends { typeRef: infer TypeRef extends string }
|
|
363
|
+
? Contract['storage'] extends { types: infer Types }
|
|
364
|
+
? Types extends Record<string, unknown>
|
|
365
|
+
? TypeRef extends keyof Types
|
|
366
|
+
? Types[TypeRef] extends { typeParams: infer Params }
|
|
367
|
+
? Params extends object
|
|
368
|
+
? Params
|
|
369
|
+
: undefined
|
|
370
|
+
: undefined
|
|
371
|
+
: undefined
|
|
372
|
+
: undefined
|
|
373
|
+
: undefined
|
|
374
|
+
: undefined;
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* If a codec entry exposes a type-level parameterized output surface, compute the output type
|
|
378
|
+
* for a specific params object. Falls back to `never` if not supported.
|
|
379
|
+
*
|
|
380
|
+
* This enables lane typing to incorporate `columnMeta.typeParams` without branching on codec IDs
|
|
381
|
+
* in core lane code.
|
|
382
|
+
*/
|
|
383
|
+
type ExtractParameterizedCodecOutputType<
|
|
384
|
+
CodecId extends string,
|
|
385
|
+
Params,
|
|
386
|
+
CodecTypes extends Record<string, { readonly output: unknown }>,
|
|
387
|
+
> = CodecId extends keyof CodecTypes
|
|
388
|
+
? CodecTypes[CodecId] extends { readonly parameterizedOutput: infer Fn }
|
|
389
|
+
? Fn extends (params: Params) => infer Out
|
|
390
|
+
? Out
|
|
391
|
+
: never
|
|
392
|
+
: never
|
|
393
|
+
: never;
|
|
394
|
+
|
|
170
395
|
/**
|
|
171
396
|
* Type-level operation signature.
|
|
172
397
|
* Represents an operation at the type level, similar to OperationSignature at runtime.
|
|
@@ -251,7 +476,7 @@ type OperationMethods<
|
|
|
251
476
|
/**
|
|
252
477
|
* Maps operation argument specs to TypeScript argument types.
|
|
253
478
|
* - typeId args: ColumnBuilder (accepts base columns or operation results)
|
|
254
|
-
* - param args:
|
|
479
|
+
* - param args: unknown (raw value; converted to ParamRef at operation build time)
|
|
255
480
|
* - literal args: unknown (could be more specific in future)
|
|
256
481
|
*/
|
|
257
482
|
type OperationArgs<Args extends ReadonlyArray<ArgSpec>> = Args extends readonly [
|
|
@@ -264,34 +489,30 @@ type OperationArgs<Args extends ReadonlyArray<ArgSpec>> = Args extends readonly
|
|
|
264
489
|
: [];
|
|
265
490
|
|
|
266
491
|
type ArgToType<Arg extends ArgSpec> = Arg extends { kind: 'typeId' }
|
|
267
|
-
?
|
|
268
|
-
:
|
|
269
|
-
? ParamPlaceholder
|
|
270
|
-
: Arg extends { kind: 'literal' }
|
|
271
|
-
? unknown
|
|
272
|
-
: never;
|
|
492
|
+
? AnyExpressionSource
|
|
493
|
+
: unknown;
|
|
273
494
|
|
|
274
495
|
/**
|
|
275
496
|
* Maps operation return spec to return type.
|
|
276
|
-
*
|
|
277
|
-
*
|
|
497
|
+
* Operations return ExpressionBuilder, not ColumnBuilder, because the result
|
|
498
|
+
* represents an expression (OperationExpr) rather than a column reference.
|
|
278
499
|
*/
|
|
279
500
|
type OperationReturn<
|
|
280
501
|
Returns extends ReturnSpec,
|
|
281
|
-
|
|
282
|
-
|
|
502
|
+
_ColumnName extends string,
|
|
503
|
+
_ColumnMeta extends StorageColumn,
|
|
283
504
|
_JsType,
|
|
284
505
|
> = Returns extends { kind: 'builtin'; type: infer T }
|
|
285
506
|
? T extends 'number'
|
|
286
|
-
?
|
|
507
|
+
? ExpressionBuilder<number>
|
|
287
508
|
: T extends 'boolean'
|
|
288
|
-
?
|
|
509
|
+
? ExpressionBuilder<boolean>
|
|
289
510
|
: T extends 'string'
|
|
290
|
-
?
|
|
291
|
-
:
|
|
511
|
+
? ExpressionBuilder<string>
|
|
512
|
+
: ExpressionBuilder<unknown>
|
|
292
513
|
: Returns extends { kind: 'typeId' }
|
|
293
|
-
?
|
|
294
|
-
:
|
|
514
|
+
? ExpressionBuilder<unknown>
|
|
515
|
+
: ExpressionBuilder<unknown>;
|
|
295
516
|
|
|
296
517
|
/**
|
|
297
518
|
* Computes JavaScript type for a column at column creation time.
|
|
@@ -308,23 +529,47 @@ type ColumnMetaTypeId<ColumnMeta> = ColumnMeta extends { codecId: infer CodecId
|
|
|
308
529
|
: never;
|
|
309
530
|
|
|
310
531
|
export type ComputeColumnJsType<
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
532
|
+
Contract extends SqlContract<SqlStorage>,
|
|
533
|
+
TableName extends string,
|
|
534
|
+
ColumnName extends string,
|
|
314
535
|
ColumnMeta extends StorageColumn,
|
|
315
536
|
CodecTypes extends Record<string, { readonly output: unknown }>,
|
|
316
|
-
> =
|
|
317
|
-
?
|
|
318
|
-
?
|
|
319
|
-
?
|
|
320
|
-
?
|
|
321
|
-
?
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
537
|
+
> = ExtractColumnJsTypeFromModels<Contract, TableName, ColumnName> extends infer FromModels
|
|
538
|
+
? [FromModels] extends [never]
|
|
539
|
+
? ColumnMeta extends { nullable: infer Nullable }
|
|
540
|
+
? ColumnMetaTypeId<ColumnMeta> extends infer TypeId
|
|
541
|
+
? TypeId extends string
|
|
542
|
+
? ResolveColumnTypeParams<Contract, ColumnMeta> extends infer Params
|
|
543
|
+
? Params extends object
|
|
544
|
+
? ExtractParameterizedCodecOutputType<
|
|
545
|
+
TypeId,
|
|
546
|
+
Params,
|
|
547
|
+
CodecTypes
|
|
548
|
+
> extends infer ParamOutput
|
|
549
|
+
? [ParamOutput] extends [never]
|
|
550
|
+
? ExtractCodecOutputType<TypeId, CodecTypes> extends infer CodecOutput
|
|
551
|
+
? [CodecOutput] extends [never]
|
|
552
|
+
? unknown // Codec not found in CodecTypes
|
|
553
|
+
: Nullable extends true
|
|
554
|
+
? CodecOutput | null
|
|
555
|
+
: CodecOutput
|
|
556
|
+
: unknown
|
|
557
|
+
: Nullable extends true
|
|
558
|
+
? ParamOutput | null
|
|
559
|
+
: ParamOutput
|
|
560
|
+
: unknown
|
|
561
|
+
: ExtractCodecOutputType<TypeId, CodecTypes> extends infer CodecOutput
|
|
562
|
+
? [CodecOutput] extends [never]
|
|
563
|
+
? unknown // Codec not found in CodecTypes
|
|
564
|
+
: Nullable extends true
|
|
565
|
+
? CodecOutput | null
|
|
566
|
+
: CodecOutput
|
|
567
|
+
: unknown
|
|
568
|
+
: unknown
|
|
569
|
+
: unknown
|
|
325
570
|
: unknown
|
|
326
571
|
: unknown
|
|
327
|
-
:
|
|
572
|
+
: FromModels
|
|
328
573
|
: unknown;
|
|
329
574
|
|
|
330
575
|
/**
|
|
@@ -336,31 +581,33 @@ export type ComputeColumnJsType<
|
|
|
336
581
|
/**
|
|
337
582
|
* Extracts the inferred JsType carried by a ColumnBuilder.
|
|
338
583
|
*/
|
|
339
|
-
type ExtractJsTypeFromColumnBuilder<CB extends AnyColumnBuilder> =
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
584
|
+
type ExtractJsTypeFromColumnBuilder<CB extends AnyColumnBuilder> =
|
|
585
|
+
CB extends ColumnBuilder<
|
|
586
|
+
infer _ColumnName extends string,
|
|
587
|
+
infer _ColumnMeta extends StorageColumn,
|
|
588
|
+
infer JsType,
|
|
589
|
+
infer _Ops
|
|
590
|
+
>
|
|
591
|
+
? JsType
|
|
592
|
+
: never;
|
|
347
593
|
|
|
348
594
|
export type InferProjectionRow<P extends Record<string, AnyColumnBuilder>> = {
|
|
349
595
|
[K in keyof P]: ExtractJsTypeFromColumnBuilder<P[K]>;
|
|
350
596
|
};
|
|
351
597
|
|
|
352
598
|
/**
|
|
353
|
-
* Nested projection type - allows recursive nesting of ColumnBuilder or nested objects.
|
|
599
|
+
* Nested projection type - allows recursive nesting of ColumnBuilder, ExpressionBuilder, or nested objects.
|
|
354
600
|
*/
|
|
355
601
|
export type NestedProjection = Record<
|
|
356
602
|
string,
|
|
357
|
-
|
|
|
603
|
+
| AnyExpressionSource
|
|
358
604
|
| Record<
|
|
359
605
|
string,
|
|
360
|
-
|
|
|
606
|
+
| AnyExpressionSource
|
|
361
607
|
| Record<
|
|
362
608
|
string,
|
|
363
|
-
|
|
609
|
+
| AnyExpressionSource
|
|
610
|
+
| Record<string, AnyExpressionSource | Record<string, AnyExpressionSource>>
|
|
364
611
|
>
|
|
365
612
|
>
|
|
366
613
|
>;
|
|
@@ -383,17 +630,19 @@ type ExtractIncludeType<
|
|
|
383
630
|
* by looking up the include alias in the Includes type map.
|
|
384
631
|
*/
|
|
385
632
|
export type InferNestedProjectionRow<
|
|
386
|
-
P extends Record<string,
|
|
633
|
+
P extends Record<string, AnyExpressionSource | boolean | NestedProjection>,
|
|
387
634
|
CodecTypes extends Record<string, { readonly output: unknown }> = Record<string, never>,
|
|
388
635
|
Includes extends Record<string, unknown> = Record<string, never>,
|
|
389
636
|
> = {
|
|
390
|
-
[K in keyof P]: P[K] extends
|
|
391
|
-
?
|
|
392
|
-
: P[K] extends
|
|
393
|
-
?
|
|
394
|
-
: P[K] extends
|
|
395
|
-
?
|
|
396
|
-
:
|
|
637
|
+
[K in keyof P]: P[K] extends ExpressionBuilder<infer JsType>
|
|
638
|
+
? JsType
|
|
639
|
+
: P[K] extends AnyColumnBuilder
|
|
640
|
+
? ExtractJsTypeFromColumnBuilder<P[K]>
|
|
641
|
+
: P[K] extends true
|
|
642
|
+
? Array<ExtractIncludeType<K & string, Includes>> // Include reference - infers Array<ChildShape> from Includes map
|
|
643
|
+
: P[K] extends NestedProjection
|
|
644
|
+
? InferNestedProjectionRow<P[K], CodecTypes, Includes>
|
|
645
|
+
: never;
|
|
397
646
|
};
|
|
398
647
|
|
|
399
648
|
/**
|
|
@@ -435,10 +684,10 @@ export type HasIncludeManyCapabilities<TContract extends SqlContract<SqlStorage>
|
|
|
435
684
|
: false;
|
|
436
685
|
|
|
437
686
|
/**
|
|
438
|
-
* SQL-specific Plan type that refines the ast field to use
|
|
687
|
+
* SQL-specific Plan type that refines the ast field to use AnyQueryAst.
|
|
439
688
|
* This is the type used by SQL query builders.
|
|
440
689
|
*/
|
|
441
|
-
export type SqlPlan<Row = unknown> = ExecutionPlan<Row,
|
|
690
|
+
export type SqlPlan<Row = unknown> = ExecutionPlan<Row, AnyQueryAst>;
|
|
442
691
|
|
|
443
692
|
/**
|
|
444
693
|
* Helper types for extracting contract structure.
|
|
@@ -536,7 +785,7 @@ export interface BuildOptions {
|
|
|
536
785
|
export interface SqlBuilderOptions<
|
|
537
786
|
TContract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>,
|
|
538
787
|
> {
|
|
539
|
-
readonly context:
|
|
788
|
+
readonly context: ExecutionContext<TContract>;
|
|
540
789
|
}
|
|
541
790
|
|
|
542
791
|
/**
|