@minnowdb/core 0.1.0 → 0.1.1
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 +29 -18
- package/package.json +1 -1
- package/dist/engine/dsl/db.d.ts +0 -137
- package/dist/engine/dsl/db.d.ts.map +0 -1
- package/dist/engine/dsl/db.js +0 -161
- package/dist/engine/dsl/db.js.map +0 -1
- package/dist/engine/dsl/expression.d.ts +0 -172
- package/dist/engine/dsl/expression.d.ts.map +0 -1
- package/dist/engine/dsl/expression.js +0 -397
- package/dist/engine/dsl/expression.js.map +0 -1
- package/dist/engine/dsl/index.d.ts +0 -8
- package/dist/engine/dsl/index.d.ts.map +0 -1
- package/dist/engine/dsl/index.js +0 -7
- package/dist/engine/dsl/index.js.map +0 -1
- package/dist/engine/dsl/live-query.d.ts +0 -45
- package/dist/engine/dsl/live-query.d.ts.map +0 -1
- package/dist/engine/dsl/live-query.js +0 -116
- package/dist/engine/dsl/live-query.js.map +0 -1
- package/dist/engine/dsl/mutations.d.ts +0 -123
- package/dist/engine/dsl/mutations.d.ts.map +0 -1
- package/dist/engine/dsl/mutations.js +0 -241
- package/dist/engine/dsl/mutations.js.map +0 -1
- package/dist/engine/dsl/select-query-builder.d.ts +0 -148
- package/dist/engine/dsl/select-query-builder.d.ts.map +0 -1
- package/dist/engine/dsl/select-query-builder.js +0 -377
- package/dist/engine/dsl/select-query-builder.js.map +0 -1
- package/dist/engine/dsl/sql-tag.d.ts +0 -46
- package/dist/engine/dsl/sql-tag.d.ts.map +0 -1
- package/dist/engine/dsl/sql-tag.js +0 -85
- package/dist/engine/dsl/sql-tag.js.map +0 -1
- package/dist/engine/dsl/types.d.ts +0 -133
- package/dist/engine/dsl/types.d.ts.map +0 -1
- package/dist/engine/dsl/types.js +0 -9
- package/dist/engine/dsl/types.js.map +0 -1
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
var _a;
|
|
2
|
-
import { optimizePlan } from "../optimizer.js";
|
|
3
|
-
import { assembleSelectBlock, compoundSelectBlock, derivedTableSource, splitCondition, validateLimit, validateOffset, } from "../query.js";
|
|
4
|
-
import { buildBinaryCondition, buildFtsExpression, createExpressionBuilder, isExpressionWrapper, ExpressionWrapper, } from "./expression.js";
|
|
5
|
-
import { LiveQuery } from "./live-query.js";
|
|
6
|
-
import { materialize, } from "./types.js";
|
|
7
|
-
/**
|
|
8
|
-
* Kysely-style immutable select builder. Every method returns a new builder; `compile()` runs the
|
|
9
|
-
* exact assembly pipeline the SQL parser ends in (`assembleSelectBlock` and friends with a shared
|
|
10
|
-
* derived-source sequence), so a builder query and its equivalent SQL produce identical optimized
|
|
11
|
-
* plans — same validation errors, same desugars, same execution strategy.
|
|
12
|
-
*/
|
|
13
|
-
/** Thrown by `executeTakeFirstOrThrow` when the query returned no rows. */
|
|
14
|
-
export class NoResultError extends Error {
|
|
15
|
-
constructor() {
|
|
16
|
-
super("The query returned no result");
|
|
17
|
-
this.name = "NoResultError";
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
export function isAliasedSelectQuery(value) {
|
|
21
|
-
return (typeof value === "object" &&
|
|
22
|
-
value !== null &&
|
|
23
|
-
value.kind === "dsl-aliased-select");
|
|
24
|
-
}
|
|
25
|
-
export function parseTableExpression(expression) {
|
|
26
|
-
const match = /^(.+?)\s+as\s+(.+)$/i.exec(expression);
|
|
27
|
-
if (match === null)
|
|
28
|
-
return { table: expression, alias: expression };
|
|
29
|
-
const table = match[1]?.trim() ?? expression;
|
|
30
|
-
const alias = match[2]?.trim() ?? expression;
|
|
31
|
-
return { table, alias };
|
|
32
|
-
}
|
|
33
|
-
export class JoinBuilder {
|
|
34
|
-
conditions;
|
|
35
|
-
constructor(conditions = []) {
|
|
36
|
-
this.conditions = conditions;
|
|
37
|
-
}
|
|
38
|
-
/** Joins on two columns; the usual `ON a.x = b.y`. */
|
|
39
|
-
onRef(lhs, operator, rhs) {
|
|
40
|
-
return new JoinBuilder([
|
|
41
|
-
...this.conditions,
|
|
42
|
-
buildBinaryCondition(new ExpressionWrapper({ kind: "column", reference: lhs }), operator, new ExpressionWrapper({ kind: "column", reference: rhs })),
|
|
43
|
-
]);
|
|
44
|
-
}
|
|
45
|
-
/** Joins a column against a value. */
|
|
46
|
-
on(lhs, operator, rhs) {
|
|
47
|
-
return new JoinBuilder([...this.conditions, buildBinaryCondition(lhs, operator, rhs)]);
|
|
48
|
-
}
|
|
49
|
-
/** @internal ANDs the accumulated conditions; a single condition stays an equi-join candidate. */
|
|
50
|
-
get onSource() {
|
|
51
|
-
const [first, ...rest] = this.conditions;
|
|
52
|
-
if (first === undefined) {
|
|
53
|
-
throw new TypeError("A join requires at least one ON condition");
|
|
54
|
-
}
|
|
55
|
-
if (rest.length === 0)
|
|
56
|
-
return first;
|
|
57
|
-
return (context) => {
|
|
58
|
-
let folded = materialize(first, context);
|
|
59
|
-
for (const source of rest) {
|
|
60
|
-
folded = {
|
|
61
|
-
kind: "logical",
|
|
62
|
-
operator: "and",
|
|
63
|
-
left: folded,
|
|
64
|
-
right: materialize(source, context),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
return folded;
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
export class SelectQueryBuilder {
|
|
72
|
-
state;
|
|
73
|
-
services;
|
|
74
|
-
kind = "dsl-select-builder";
|
|
75
|
-
constructor(state, services) {
|
|
76
|
-
this.state = state;
|
|
77
|
-
this.services = services;
|
|
78
|
-
}
|
|
79
|
-
static create(source, ctes, services) {
|
|
80
|
-
return new _a({
|
|
81
|
-
ctes,
|
|
82
|
-
base: source,
|
|
83
|
-
joins: [],
|
|
84
|
-
wheres: [],
|
|
85
|
-
groupBys: [],
|
|
86
|
-
havings: [],
|
|
87
|
-
orderBys: [],
|
|
88
|
-
selections: undefined,
|
|
89
|
-
distinct: false,
|
|
90
|
-
setOps: [],
|
|
91
|
-
}, services);
|
|
92
|
-
}
|
|
93
|
-
#with(patch) {
|
|
94
|
-
return { ...this.state, ...patch };
|
|
95
|
-
}
|
|
96
|
-
#eb() {
|
|
97
|
-
const { ctes } = this.state;
|
|
98
|
-
const services = this.services;
|
|
99
|
-
return createExpressionBuilder((table) => {
|
|
100
|
-
const { table: name, alias } = parseTableExpression(table);
|
|
101
|
-
return _a.create({ kind: "table", table: name, alias }, ctes, services);
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
innerJoin(table, lhsOrCallback, rhs) {
|
|
105
|
-
return this.#join("inner", table, lhsOrCallback, rhs);
|
|
106
|
-
}
|
|
107
|
-
leftJoin(table, lhsOrCallback, rhs) {
|
|
108
|
-
return this.#join("left", table, lhsOrCallback, rhs);
|
|
109
|
-
}
|
|
110
|
-
#join(join, table, lhsOrCallback, rhs) {
|
|
111
|
-
const { table: name, alias } = parseTableExpression(table);
|
|
112
|
-
// CTE names resolve to derived sources at compile time, in #compileSource.
|
|
113
|
-
const source = { kind: "table", table: name, alias };
|
|
114
|
-
const on = typeof lhsOrCallback === "function"
|
|
115
|
-
? lhsOrCallback(new JoinBuilder()).onSource
|
|
116
|
-
: new JoinBuilder().onRef(lhsOrCallback, "=", rhs).onSource;
|
|
117
|
-
return new _a(this.#with({ joins: [...this.state.joins, { join, source, on }] }), this.services);
|
|
118
|
-
}
|
|
119
|
-
where(lhs, operator, rhs) {
|
|
120
|
-
const source = this.#booleanSource(lhs, operator, rhs);
|
|
121
|
-
return new _a(this.#with({ wheres: [...this.state.wheres, source] }), this.services);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Typeahead-friendly document search: filters to rows matching every query term and orders
|
|
125
|
-
* by BM25 relevance, descending. Pure sugar for
|
|
126
|
-
* `.where(eb.match(columns, query)).orderBy(fn.bm25(columns, query), "desc")` — the ordering
|
|
127
|
-
* expression rides as a hidden select item, so the row shape is exactly what you selected
|
|
128
|
-
* and repeated `.search()` calls compose. Wanting the score value is the only reason to also
|
|
129
|
-
* select `fn.bm25(...)`; execution (index pruning, streaming under a budget) is identical
|
|
130
|
-
* either way. Columns default to "*" (every non-boolean column of the scanned table); a
|
|
131
|
-
* named select list is required, since hidden ordering columns cannot ride along a wildcard.
|
|
132
|
-
*/
|
|
133
|
-
search(query, options = {}) {
|
|
134
|
-
const columns = options.columns ?? "*";
|
|
135
|
-
return this.where((eb) => eb.match(columns, query)).orderBy(new ExpressionWrapper(buildFtsExpression("bm25", columns, query)), "desc");
|
|
136
|
-
}
|
|
137
|
-
having(lhs, operator, rhs) {
|
|
138
|
-
const source = this.#booleanSource(lhs, operator, rhs);
|
|
139
|
-
return new _a(this.#with({ havings: [...this.state.havings, source] }), this.services);
|
|
140
|
-
}
|
|
141
|
-
#booleanSource(lhs, operator, rhs) {
|
|
142
|
-
if (typeof lhs === "function" && operator === undefined) {
|
|
143
|
-
const wrapper = lhs(this.#eb());
|
|
144
|
-
return wrapper.source;
|
|
145
|
-
}
|
|
146
|
-
if (operator === undefined)
|
|
147
|
-
throw new TypeError("where() requires an operator");
|
|
148
|
-
return buildBinaryCondition(lhs, operator, rhs);
|
|
149
|
-
}
|
|
150
|
-
groupBy(references) {
|
|
151
|
-
const resolved = typeof references === "function" ? references(this.#eb()) : references;
|
|
152
|
-
const list = Array.isArray(resolved) ? resolved : [resolved];
|
|
153
|
-
const sources = list.map((reference) => isExpressionWrapper(reference)
|
|
154
|
-
? reference.source
|
|
155
|
-
: { kind: "column", reference: reference });
|
|
156
|
-
return new _a(this.#with({ groupBys: [...this.state.groupBys, ...sources] }), this.services);
|
|
157
|
-
}
|
|
158
|
-
orderBy(reference, direction = "asc") {
|
|
159
|
-
const resolved = typeof reference === "function" ? reference(this.#eb()) : reference;
|
|
160
|
-
const source = isExpressionWrapper(resolved)
|
|
161
|
-
? resolved.source
|
|
162
|
-
: { kind: "column", reference: resolved };
|
|
163
|
-
return new _a(this.#with({ orderBys: [...this.state.orderBys, { source, direction }] }), this.services);
|
|
164
|
-
}
|
|
165
|
-
limit(limit) {
|
|
166
|
-
return new _a(this.#with({ limit: validateLimit(limit) }), this.services);
|
|
167
|
-
}
|
|
168
|
-
offset(offset) {
|
|
169
|
-
if (this.state.limit === undefined) {
|
|
170
|
-
throw new TypeError("OFFSET requires LIMIT; call limit() first");
|
|
171
|
-
}
|
|
172
|
-
return new _a(this.#with({ offset: validateOffset(offset) }), this.services);
|
|
173
|
-
}
|
|
174
|
-
distinct() {
|
|
175
|
-
return new _a(this.#with({ distinct: true }), this.services);
|
|
176
|
-
}
|
|
177
|
-
/* eslint-enable @typescript-eslint/unified-signatures */
|
|
178
|
-
select(selections) {
|
|
179
|
-
const resolved = typeof selections === "function" ? selections(this.#eb()) : selections;
|
|
180
|
-
const list = Array.isArray(resolved) ? resolved : [resolved];
|
|
181
|
-
const additions = list.map((selection) => this.#selection(selection));
|
|
182
|
-
if (this.state.selections === "all") {
|
|
183
|
-
throw new TypeError("SELECT * cannot be mixed with other expressions");
|
|
184
|
-
}
|
|
185
|
-
const merged = [...(this.state.selections ?? []), ...additions];
|
|
186
|
-
return new _a(this.#with({ selections: merged }), this.services);
|
|
187
|
-
}
|
|
188
|
-
selectAll() {
|
|
189
|
-
if (this.state.selections !== undefined && this.state.selections !== "all") {
|
|
190
|
-
throw new TypeError("SELECT * cannot be mixed with other expressions");
|
|
191
|
-
}
|
|
192
|
-
return new _a(this.#with({ selections: "all" }), this.services);
|
|
193
|
-
}
|
|
194
|
-
#selection(selection) {
|
|
195
|
-
if (typeof selection === "string") {
|
|
196
|
-
const aliased = /^(.+?)\s+as\s+(.+)$/i.exec(selection);
|
|
197
|
-
const reference = (aliased?.[1] ?? selection).trim();
|
|
198
|
-
const alias = (aliased?.[2] ?? reference.split(".").at(-1) ?? reference).trim();
|
|
199
|
-
return { alias, source: { kind: "column", reference } };
|
|
200
|
-
}
|
|
201
|
-
// The unknown-guard is for untyped call sites, e.g. passing a subquery builder or its
|
|
202
|
-
// .as() result (an AliasedSelectQuery) where an aliased expression belongs.
|
|
203
|
-
const candidate = selection;
|
|
204
|
-
if (typeof candidate !== "object" ||
|
|
205
|
-
candidate === null ||
|
|
206
|
-
candidate.kind !== "aliased-expression") {
|
|
207
|
-
throw new TypeError("select() items must be column strings or expressions named with .as(alias)");
|
|
208
|
-
}
|
|
209
|
-
const aliasedExpression = candidate;
|
|
210
|
-
return { alias: aliasedExpression.alias, source: aliasedExpression.source };
|
|
211
|
-
}
|
|
212
|
-
// --- Set operations ---------------------------------------------------------------------------
|
|
213
|
-
union(other) {
|
|
214
|
-
return this.#setOp("union", other);
|
|
215
|
-
}
|
|
216
|
-
unionAll(other) {
|
|
217
|
-
return this.#setOp("union all", other);
|
|
218
|
-
}
|
|
219
|
-
intersect(other) {
|
|
220
|
-
return this.#setOp("intersect", other);
|
|
221
|
-
}
|
|
222
|
-
except(other) {
|
|
223
|
-
return this.#setOp("except", other);
|
|
224
|
-
}
|
|
225
|
-
#setOp(op, other) {
|
|
226
|
-
return new _a(this.#with({ setOps: [...this.state.setOps, { op, builder: other }] }), this.services);
|
|
227
|
-
}
|
|
228
|
-
/** Names this query for use as a derived table in `selectFrom`. */
|
|
229
|
-
as(alias) {
|
|
230
|
-
return { kind: "dsl-aliased-select", alias, builder: this };
|
|
231
|
-
}
|
|
232
|
-
// --- Compilation ------------------------------------------------------------------------------
|
|
233
|
-
/** Compiles to the optimized plan envelope `run()` executes. */
|
|
234
|
-
compile() {
|
|
235
|
-
let sequence = 0;
|
|
236
|
-
const cteBlocks = new Map();
|
|
237
|
-
const context = {
|
|
238
|
-
nextSequence: () => {
|
|
239
|
-
sequence += 1;
|
|
240
|
-
return sequence;
|
|
241
|
-
},
|
|
242
|
-
cteFor: (name) => {
|
|
243
|
-
const block = cteBlocks.get(name);
|
|
244
|
-
return block === undefined ? undefined : structuredClone(block);
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
for (const cte of this.state.ctes) {
|
|
248
|
-
if (cteBlocks.has(cte.name))
|
|
249
|
-
throw new TypeError(`Duplicate CTE name: ${cte.name}`);
|
|
250
|
-
cteBlocks.set(cte.name, cte.builder.compileBlock(context, "(cte)"));
|
|
251
|
-
}
|
|
252
|
-
return { kind: "typed-query", plan: optimizePlan(this.compileBlock(context, "(dsl)")) };
|
|
253
|
-
}
|
|
254
|
-
/** @internal Compiles this builder as one block under the caller's compile context. */
|
|
255
|
-
compileBlock(context, label) {
|
|
256
|
-
if (this.state.setOps.length === 0)
|
|
257
|
-
return this.#block(context, label, true);
|
|
258
|
-
const first = this.#block(context, label, false);
|
|
259
|
-
const members = [
|
|
260
|
-
first,
|
|
261
|
-
...this.state.setOps.map(({ builder }) => builder.compileBlock(context, "(union member)")),
|
|
262
|
-
];
|
|
263
|
-
return compoundSelectBlock(label, members, this.state.setOps.map(({ op }) => op), {
|
|
264
|
-
orderBy: this.state.orderBys.map(({ source, direction }) => ({
|
|
265
|
-
expression: materialize(source, context),
|
|
266
|
-
direction,
|
|
267
|
-
})),
|
|
268
|
-
...(this.state.limit === undefined ? {} : { limit: this.state.limit }),
|
|
269
|
-
...(this.state.offset === undefined ? {} : { offset: this.state.offset }),
|
|
270
|
-
}, context.nextSequence);
|
|
271
|
-
}
|
|
272
|
-
#block(context, label, includeTail) {
|
|
273
|
-
// Materialization follows the parser's order exactly — select list, base source, join
|
|
274
|
-
// sources with their ON conditions, WHERE, GROUP BY, HAVING, ORDER BY — so every derived
|
|
275
|
-
// source numbers identically to the equivalent SQL.
|
|
276
|
-
const select = this.#compileSelections(context);
|
|
277
|
-
const base = this.#compileSource(context, this.state.base);
|
|
278
|
-
const joins = this.state.joins.map((join) => {
|
|
279
|
-
const source = this.#compileSource(context, join.source);
|
|
280
|
-
const condition = materialize(join.on, context);
|
|
281
|
-
if (condition.kind === "condition" && condition.operator === "=") {
|
|
282
|
-
return { ...source, kind: join.join, left: condition.left, right: condition.right };
|
|
283
|
-
}
|
|
284
|
-
// Any other boolean condition becomes a nested-loop join.
|
|
285
|
-
return {
|
|
286
|
-
...source,
|
|
287
|
-
kind: join.join,
|
|
288
|
-
left: { kind: "literal", value: null },
|
|
289
|
-
right: { kind: "literal", value: null },
|
|
290
|
-
on: condition,
|
|
291
|
-
};
|
|
292
|
-
});
|
|
293
|
-
const predicates = this.state.wheres.flatMap((where) => splitCondition(materialize(where, context)));
|
|
294
|
-
const groupBy = this.state.groupBys.map((source) => materialize(source, context));
|
|
295
|
-
const having = this.state.havings.flatMap((source) => splitCondition(materialize(source, context)));
|
|
296
|
-
const orderBy = includeTail
|
|
297
|
-
? this.state.orderBys.map(({ source, direction }) => ({
|
|
298
|
-
expression: materialize(source, context),
|
|
299
|
-
direction,
|
|
300
|
-
}))
|
|
301
|
-
: [];
|
|
302
|
-
return assembleSelectBlock({
|
|
303
|
-
sql: label,
|
|
304
|
-
base,
|
|
305
|
-
joins,
|
|
306
|
-
select,
|
|
307
|
-
distinct: this.state.distinct,
|
|
308
|
-
predicates,
|
|
309
|
-
groupBy,
|
|
310
|
-
having,
|
|
311
|
-
orderBy,
|
|
312
|
-
...(includeTail && this.state.limit !== undefined ? { limit: this.state.limit } : {}),
|
|
313
|
-
...(includeTail && this.state.offset !== undefined ? { offset: this.state.offset } : {}),
|
|
314
|
-
}, context.nextSequence);
|
|
315
|
-
}
|
|
316
|
-
#compileSelections(context) {
|
|
317
|
-
const selections = this.state.selections;
|
|
318
|
-
if (selections === undefined) {
|
|
319
|
-
throw new TypeError("A query needs select() or selectAll() before compile()");
|
|
320
|
-
}
|
|
321
|
-
if (selections === "all")
|
|
322
|
-
return [{ expression: { kind: "wildcard" }, alias: "*" }];
|
|
323
|
-
if (selections.length === 0) {
|
|
324
|
-
throw new TypeError("A query needs select() or selectAll() before compile()");
|
|
325
|
-
}
|
|
326
|
-
const aliases = new Set();
|
|
327
|
-
return selections.map(({ alias, source }) => {
|
|
328
|
-
if (aliases.has(alias))
|
|
329
|
-
throw new TypeError(`Duplicate output column: ${alias}`);
|
|
330
|
-
aliases.add(alias);
|
|
331
|
-
return { expression: materialize(source, context), alias };
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
#compileSource(context, source) {
|
|
335
|
-
if (source.kind === "derived") {
|
|
336
|
-
const inner = source.builder.compileBlock(context, "(derived)");
|
|
337
|
-
return derivedTableSource(inner, source.alias, context.nextSequence);
|
|
338
|
-
}
|
|
339
|
-
const cte = context.cteFor(source.table);
|
|
340
|
-
if (cte !== undefined)
|
|
341
|
-
return derivedTableSource(cte, source.alias, context.nextSequence);
|
|
342
|
-
return { table: source.table, alias: source.alias };
|
|
343
|
-
}
|
|
344
|
-
// --- Execution --------------------------------------------------------------------------------
|
|
345
|
-
#services() {
|
|
346
|
-
if (this.services === undefined) {
|
|
347
|
-
throw new TypeError("This builder is a subquery; execute the outer query instead");
|
|
348
|
-
}
|
|
349
|
-
return this.services;
|
|
350
|
-
}
|
|
351
|
-
async execute() {
|
|
352
|
-
return this.#services().run(this.compile());
|
|
353
|
-
}
|
|
354
|
-
async executeTakeFirst() {
|
|
355
|
-
const rows = await this.execute();
|
|
356
|
-
return rows[0];
|
|
357
|
-
}
|
|
358
|
-
async executeTakeFirstOrThrow() {
|
|
359
|
-
const row = await this.executeTakeFirst();
|
|
360
|
-
if (row === undefined)
|
|
361
|
-
throw new NoResultError();
|
|
362
|
-
return row;
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Turns the query into a live query: subscribers get the current result immediately and a
|
|
366
|
-
* fresh result after any commit that may have changed it (digest-suppressed when identical).
|
|
367
|
-
*/
|
|
368
|
-
live() {
|
|
369
|
-
const services = this.#services();
|
|
370
|
-
if (services.live === undefined) {
|
|
371
|
-
throw new TypeError("Live queries need a database with live query support");
|
|
372
|
-
}
|
|
373
|
-
return new LiveQuery(services.live, this.compile());
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
_a = SelectQueryBuilder;
|
|
377
|
-
//# sourceMappingURL=select-query-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-query-builder.js","sourceRoot":"","sources":["../../../src/engine/dsl/select-query-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { type QueryRow, type QueryValue } from "../query.js";
|
|
2
|
-
/**
|
|
3
|
-
* Raw-SQL escape hatch: sql<Row>`SELECT ... WHERE x = ${value}`. Interpolated values become
|
|
4
|
-
* `$n` parameter placeholders bound at execution — never text spliced into the statement.
|
|
5
|
-
* Arrays expand to parenthesized placeholder lists for IN, and nested `sql` fragments splice
|
|
6
|
-
* their text with parameters renumbered under the outer statement. The result executes through
|
|
7
|
-
* the ordinary statement pipeline, so it supports everything the SQL surface supports and
|
|
8
|
-
* nothing more.
|
|
9
|
-
*/
|
|
10
|
-
export interface SqlExecutable {
|
|
11
|
-
$executeRaw(sql: string, params?: readonly QueryValue[]): Promise<QueryRow[]>;
|
|
12
|
-
}
|
|
13
|
-
type FragmentPart = {
|
|
14
|
-
kind: "text";
|
|
15
|
-
text: string;
|
|
16
|
-
} | {
|
|
17
|
-
kind: "value";
|
|
18
|
-
value: QueryValue;
|
|
19
|
-
} | {
|
|
20
|
-
kind: "fragment";
|
|
21
|
-
fragment: RawSqlFragment<unknown>;
|
|
22
|
-
};
|
|
23
|
-
export type RawSqlValue = QueryValue | ReadonlyArray<QueryValue | RawSqlFragment<unknown>> | RawSqlFragment<unknown>;
|
|
24
|
-
export interface RenderedSql {
|
|
25
|
-
readonly sql: string;
|
|
26
|
-
readonly params: readonly QueryValue[];
|
|
27
|
-
}
|
|
28
|
-
export declare class RawSqlFragment<out TRow> {
|
|
29
|
-
#private;
|
|
30
|
-
constructor(parts: readonly FragmentPart[]);
|
|
31
|
-
/** Phantom row type; never materialized at runtime. */
|
|
32
|
-
readonly __row?: TRow;
|
|
33
|
-
/** Type-only: the fragment's row, e.g. `type Row = typeof fragment.$inferRow`. Undefined at runtime. */
|
|
34
|
-
readonly $inferRow: TRow;
|
|
35
|
-
/** The statement text with `$n` placeholders, numbered as a standalone statement. */
|
|
36
|
-
get sql(): string;
|
|
37
|
-
/** The parameter values referenced by this fragment's placeholders, in order. */
|
|
38
|
-
get params(): readonly QueryValue[];
|
|
39
|
-
render(): RenderedSql;
|
|
40
|
-
/** @internal Appends this fragment's text to `out`, registering parameters into `params`. */
|
|
41
|
-
appendTo(out: string[], params: QueryValue[]): void;
|
|
42
|
-
execute(db: SqlExecutable): Promise<TRow[]>;
|
|
43
|
-
}
|
|
44
|
-
export declare function sql<TRow = QueryRow>(strings: TemplateStringsArray, ...values: RawSqlValue[]): RawSqlFragment<TRow>;
|
|
45
|
-
export {};
|
|
46
|
-
//# sourceMappingURL=sql-tag.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sql-tag.d.ts","sourceRoot":"","sources":["../../../src/engine/dsl/sql-tag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;CAC/E;AAED,KAAK,YAAY,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,WAAW,GACrB,UAAU,GAAG,aAAa,CAAC,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;AAE7F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CACxC;AAED,qBAAa,cAAc,CAAC,GAAG,CAAC,IAAI;;gBAItB,KAAK,EAAE,SAAS,YAAY,EAAE;IAI1C,uDAAuD;IACvD,SAAiB,KAAK,CAAC,EAAE,IAAI,CAAC;IAE9B,wGAAwG;IACxG,SAAiB,SAAS,EAAE,IAAI,CAAC;IAEjC,qFAAqF;IACrF,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,iFAAiF;IACjF,IAAI,MAAM,IAAI,SAAS,UAAU,EAAE,CAElC;IAED,MAAM,IAAI,WAAW;IASrB,6FAA6F;IAC7F,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI;IAI7C,OAAO,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;CAIlD;AA4CD,wBAAgB,GAAG,CAAC,IAAI,GAAG,QAAQ,EACjC,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,WAAW,EAAE,GACvB,cAAc,CAAC,IAAI,CAAC,CAOtB"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
export class RawSqlFragment {
|
|
2
|
-
#parts;
|
|
3
|
-
#rendered;
|
|
4
|
-
constructor(parts) {
|
|
5
|
-
this.#parts = parts;
|
|
6
|
-
}
|
|
7
|
-
/** The statement text with `$n` placeholders, numbered as a standalone statement. */
|
|
8
|
-
get sql() {
|
|
9
|
-
return this.render().sql;
|
|
10
|
-
}
|
|
11
|
-
/** The parameter values referenced by this fragment's placeholders, in order. */
|
|
12
|
-
get params() {
|
|
13
|
-
return this.render().params;
|
|
14
|
-
}
|
|
15
|
-
render() {
|
|
16
|
-
if (this.#rendered === undefined) {
|
|
17
|
-
const params = [];
|
|
18
|
-
const sql = renderParts(this.#parts, params);
|
|
19
|
-
this.#rendered = { sql, params };
|
|
20
|
-
}
|
|
21
|
-
return this.#rendered;
|
|
22
|
-
}
|
|
23
|
-
/** @internal Appends this fragment's text to `out`, registering parameters into `params`. */
|
|
24
|
-
appendTo(out, params) {
|
|
25
|
-
out.push(renderParts(this.#parts, params));
|
|
26
|
-
}
|
|
27
|
-
async execute(db) {
|
|
28
|
-
const { sql: text, params } = this.render();
|
|
29
|
-
return (await db.$executeRaw(text, params));
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function validateValue(value) {
|
|
33
|
-
if (typeof value === "number" && !Number.isFinite(value)) {
|
|
34
|
-
throw new TypeError("sql parameters must be finite numbers");
|
|
35
|
-
}
|
|
36
|
-
if (value instanceof Date && !Number.isFinite(value.getTime())) {
|
|
37
|
-
throw new TypeError("sql parameters must be valid dates");
|
|
38
|
-
}
|
|
39
|
-
return value;
|
|
40
|
-
}
|
|
41
|
-
function renderParts(parts, params) {
|
|
42
|
-
const out = [];
|
|
43
|
-
for (const part of parts) {
|
|
44
|
-
if (part.kind === "text") {
|
|
45
|
-
out.push(part.text);
|
|
46
|
-
}
|
|
47
|
-
else if (part.kind === "value") {
|
|
48
|
-
params.push(part.value);
|
|
49
|
-
out.push(`$${String(params.length)}`);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
part.fragment.appendTo(out, params);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return out.join("");
|
|
56
|
-
}
|
|
57
|
-
function valueParts(value) {
|
|
58
|
-
if (value instanceof RawSqlFragment)
|
|
59
|
-
return [{ kind: "fragment", fragment: value }];
|
|
60
|
-
if (Array.isArray(value)) {
|
|
61
|
-
if (value.length === 0)
|
|
62
|
-
throw new TypeError("sql IN lists require at least one value");
|
|
63
|
-
const parts = [{ kind: "text", text: "(" }];
|
|
64
|
-
value.forEach((item, index) => {
|
|
65
|
-
if (Array.isArray(item))
|
|
66
|
-
throw new TypeError("sql lists cannot nest arrays");
|
|
67
|
-
if (index > 0)
|
|
68
|
-
parts.push({ kind: "text", text: ", " });
|
|
69
|
-
parts.push(...valueParts(item));
|
|
70
|
-
});
|
|
71
|
-
parts.push({ kind: "text", text: ")" });
|
|
72
|
-
return parts;
|
|
73
|
-
}
|
|
74
|
-
// Validation is eager so a bad value fails at the interpolation site, not at execution.
|
|
75
|
-
return [{ kind: "value", value: validateValue(value) }];
|
|
76
|
-
}
|
|
77
|
-
export function sql(strings, ...values) {
|
|
78
|
-
const parts = [{ kind: "text", text: strings[0] ?? "" }];
|
|
79
|
-
values.forEach((value, index) => {
|
|
80
|
-
parts.push(...valueParts(value));
|
|
81
|
-
parts.push({ kind: "text", text: strings[index + 1] ?? "" });
|
|
82
|
-
});
|
|
83
|
-
return new RawSqlFragment(parts);
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=sql-tag.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sql-tag.js","sourceRoot":"","sources":["../../../src/engine/dsl/sql-tag.ts"],"names":[],"mappings":"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"}
|