rado 0.3.4 → 0.3.5
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 +277 -277
- package/dist/lib/Formatter.js +2 -2
- package/package.json +74 -74
- package/dist/define/CTE.d.ts +0 -2
- package/dist/define/CTE.js +0 -51
- package/dist/define/Cursor.d.ts +0 -108
- package/dist/define/Cursor.js +0 -338
- package/dist/define/Update.d.ts +0 -4
- package/dist/define/Update.js +0 -0
- package/dist/define/query/Batch.d.ts +0 -7
- package/dist/define/query/Batch.js +0 -17
- package/dist/define/query/CreateTable.d.ts +0 -6
- package/dist/define/query/CreateTable.js +0 -11
- package/dist/define/query/Delete.d.ts +0 -11
- package/dist/define/query/Delete.js +0 -18
- package/dist/define/query/Insert.d.ts +0 -22
- package/dist/define/query/Insert.js +0 -47
- package/dist/define/query/Select.d.ts +0 -39
- package/dist/define/query/Select.js +0 -170
- package/dist/define/query/TableSelect.d.ts +0 -28
- package/dist/define/query/TableSelect.js +0 -79
- package/dist/define/query/Union.d.ts +0 -17
- package/dist/define/query/Union.js +0 -116
- package/dist/define/query/Update.d.ts +0 -12
- package/dist/define/query/Update.js +0 -18
- package/dist/deno/driver/better-sqlite3.js +0 -57
- package/dist/deno/driver/bun-sqlite.js +0 -69
- package/dist/deno/driver/sql.js.js +0 -72
- package/dist/deno/driver/sqlite3.js +0 -123
- package/dist/deno/index.js +0 -14
- package/dist/deno/lib/Driver.js +0 -330
- package/dist/deno/lib/Formatter.js +0 -715
- package/dist/deno/lib/Sanitizer.js +0 -0
- package/dist/deno/lib/SqlError.js +0 -11
- package/dist/deno/lib/Statement.js +0 -108
- package/dist/deno/sqlite/SqliteFormatter.js +0 -70
- package/dist/deno/sqlite/SqliteFunctions.js +0 -150
- package/dist/deno/sqlite/SqliteSchema.js +0 -47
- package/dist/deno/sqlite.js +0 -3
- package/dist/deno/util/Callable.js +0 -15
- package/dist/sqlite/index.d.ts +0 -2
- package/dist/sqlite/index.js +0 -3
- package/dist/src/driver/better-sqlite3.js +0 -49
- package/dist/src/driver/sql.js.js +0 -66
- package/dist/src/driver/sqlite3.js +0 -87
- package/dist/src/index.js +0 -24
- package/dist/src/lib/Column.js +0 -63
- package/dist/src/lib/Cursor.js +0 -231
- package/dist/src/lib/Driver.js +0 -316
- package/dist/src/lib/Expr.js +0 -284
- package/dist/src/lib/Fields.js +0 -0
- package/dist/src/lib/Formatter.js +0 -625
- package/dist/src/lib/Functions.js +0 -11
- package/dist/src/lib/Id.js +0 -0
- package/dist/src/lib/Index.js +0 -20
- package/dist/src/lib/Ops.js +0 -45
- package/dist/src/lib/OrderBy.js +0 -9
- package/dist/src/lib/Param.js +0 -27
- package/dist/src/lib/Query.js +0 -74
- package/dist/src/lib/Sanitizer.js +0 -0
- package/dist/src/lib/Schema.js +0 -67
- package/dist/src/lib/Selection.js +0 -7
- package/dist/src/lib/Statement.js +0 -103
- package/dist/src/lib/Table.js +0 -130
- package/dist/src/lib/Target.js +0 -37
- package/dist/src/lib/Update.js +0 -0
- package/dist/src/sqlite/SqliteFormatter.js +0 -67
- package/dist/src/sqlite/SqliteFunctions.js +0 -146
- package/dist/src/sqlite/SqliteSchema.js +0 -47
- package/dist/src/sqlite.js +0 -3
- package/dist/test/DbSuite.js +0 -28
- package/dist/test/TSTestTypes.js +0 -6
- package/dist/test/TestBasic.js +0 -172
- package/dist/test/TestExtend.js +0 -68
- package/dist/test/TestFts5.js +0 -34
- package/dist/test/TestFunctions.js +0 -28
- package/dist/test/TestJoins.js +0 -34
- package/dist/test/TestJson.js +0 -33
- package/dist/test/TestPrepare.js +0 -27
- package/dist/test/TestRawSql.js +0 -31
- package/dist/test/TestSchema.js +0 -69
- package/dist/test/TestSubQueries.js +0 -79
- package/dist/test/TestTransaction.js +0 -54
- package/dist/test/TestUpdate.js +0 -95
- package/dist/test/index.js +0 -14
|
@@ -1,625 +0,0 @@
|
|
|
1
|
-
// src/lib/Formatter.ts
|
|
2
|
-
import { ColumnType } from "./Column.js";
|
|
3
|
-
import { BinOp, Expr, ExprData, ExprType, UnOp } from "./Expr.js";
|
|
4
|
-
import { OrderDirection } from "./OrderBy.js";
|
|
5
|
-
import { ParamType } from "./Param.js";
|
|
6
|
-
import { Query, QueryType } from "./Query.js";
|
|
7
|
-
import { Statement } from "./Statement.js";
|
|
8
|
-
import { Target, TargetType } from "./Target.js";
|
|
9
|
-
var binOps = {
|
|
10
|
-
[BinOp.Add]: "+",
|
|
11
|
-
[BinOp.Subt]: "-",
|
|
12
|
-
[BinOp.Mult]: "*",
|
|
13
|
-
[BinOp.Mod]: "%",
|
|
14
|
-
[BinOp.Div]: "/",
|
|
15
|
-
[BinOp.Greater]: ">",
|
|
16
|
-
[BinOp.GreaterOrEqual]: ">=",
|
|
17
|
-
[BinOp.Less]: "<",
|
|
18
|
-
[BinOp.LessOrEqual]: "<=",
|
|
19
|
-
[BinOp.Equals]: "=",
|
|
20
|
-
[BinOp.NotEquals]: "!=",
|
|
21
|
-
[BinOp.And]: "and",
|
|
22
|
-
[BinOp.Or]: "or",
|
|
23
|
-
[BinOp.Like]: "like",
|
|
24
|
-
[BinOp.Glob]: "glob",
|
|
25
|
-
[BinOp.Match]: "match",
|
|
26
|
-
[BinOp.In]: "in",
|
|
27
|
-
[BinOp.NotIn]: "not in",
|
|
28
|
-
[BinOp.Concat]: "||"
|
|
29
|
-
};
|
|
30
|
-
var joins = {
|
|
31
|
-
left: "left",
|
|
32
|
-
inner: "inner"
|
|
33
|
-
};
|
|
34
|
-
function formatAsResultObject(stmt, mkSubject) {
|
|
35
|
-
stmt.raw("json_object('result', ");
|
|
36
|
-
mkSubject();
|
|
37
|
-
stmt.raw(")");
|
|
38
|
-
}
|
|
39
|
-
var Formatter = class {
|
|
40
|
-
constructor() {
|
|
41
|
-
}
|
|
42
|
-
compile(query) {
|
|
43
|
-
const stmt = new Statement(this);
|
|
44
|
-
const result = this.format({ stmt, topLevel: true }, query);
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
format(ctx, query) {
|
|
48
|
-
switch (query.type) {
|
|
49
|
-
case QueryType.Select:
|
|
50
|
-
return this.formatSelect(ctx, query);
|
|
51
|
-
case QueryType.Insert:
|
|
52
|
-
return this.formatInsert(ctx, query);
|
|
53
|
-
case QueryType.Update:
|
|
54
|
-
return this.formatUpdate(ctx, query);
|
|
55
|
-
case QueryType.Delete:
|
|
56
|
-
return this.formatDelete(ctx, query);
|
|
57
|
-
case QueryType.CreateTable:
|
|
58
|
-
return this.formatCreateTable(ctx, query);
|
|
59
|
-
case QueryType.CreateIndex:
|
|
60
|
-
return this.formatCreateIndex(ctx, query);
|
|
61
|
-
case QueryType.DropIndex:
|
|
62
|
-
return this.formatDropIndex(ctx, query);
|
|
63
|
-
case QueryType.AlterTable:
|
|
64
|
-
return this.formatAlterTable(ctx, query);
|
|
65
|
-
case QueryType.Transaction:
|
|
66
|
-
return this.formatTransaction(ctx, query);
|
|
67
|
-
case QueryType.Batch:
|
|
68
|
-
return this.formatBatch(ctx, query.queries);
|
|
69
|
-
case QueryType.Raw:
|
|
70
|
-
return this.formatRaw(ctx, query);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
formatSelect(ctx, query) {
|
|
74
|
-
const { stmt, topLevel } = ctx;
|
|
75
|
-
stmt.add("SELECT").space();
|
|
76
|
-
this.formatSelection(
|
|
77
|
-
{ ...ctx, topLevel: false },
|
|
78
|
-
query.selection,
|
|
79
|
-
topLevel ? formatAsResultObject : void 0
|
|
80
|
-
);
|
|
81
|
-
stmt.addLine("FROM").space();
|
|
82
|
-
this.formatTarget(ctx, query.from);
|
|
83
|
-
this.formatWhere(ctx, query.where);
|
|
84
|
-
this.formatGroupBy(ctx, query.groupBy);
|
|
85
|
-
this.formatHaving(ctx, query.having);
|
|
86
|
-
this.formatOrderBy(ctx, query.orderBy);
|
|
87
|
-
this.formatLimit(ctx, query);
|
|
88
|
-
return stmt;
|
|
89
|
-
}
|
|
90
|
-
formatInsert(ctx, query) {
|
|
91
|
-
const { stmt } = ctx;
|
|
92
|
-
const columns = Object.values(query.into.columns);
|
|
93
|
-
stmt.add("INSERT INTO").addIdentifier(query.into.name);
|
|
94
|
-
if (query.into.alias)
|
|
95
|
-
stmt.raw("AS").addIdentifier(query.into.alias);
|
|
96
|
-
for (const column of stmt.call(columns))
|
|
97
|
-
this.formatString(ctx, column.name);
|
|
98
|
-
stmt.add("VALUES");
|
|
99
|
-
for (const row of stmt.separate(query.data))
|
|
100
|
-
this.formatInsertRow(ctx, query.into.columns, row);
|
|
101
|
-
if (query.selection) {
|
|
102
|
-
stmt.add("RETURNING").space();
|
|
103
|
-
this.formatSelection(ctx, query.selection, formatAsResultObject);
|
|
104
|
-
}
|
|
105
|
-
return stmt;
|
|
106
|
-
}
|
|
107
|
-
formatUpdate(ctx, query) {
|
|
108
|
-
const { stmt } = ctx;
|
|
109
|
-
const data = query.set || {};
|
|
110
|
-
stmt.add("UPDATE").addIdentifier(query.table.name).add("SET").space();
|
|
111
|
-
for (const key of stmt.separate(Object.keys(data))) {
|
|
112
|
-
stmt.identifier(key).add("=").space();
|
|
113
|
-
this.formatExpr(
|
|
114
|
-
{
|
|
115
|
-
...ctx,
|
|
116
|
-
formatAsJson: true
|
|
117
|
-
},
|
|
118
|
-
ExprData.create(data[key])
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
this.formatWhere(ctx, query.where);
|
|
122
|
-
this.formatLimit(ctx, query);
|
|
123
|
-
return stmt;
|
|
124
|
-
}
|
|
125
|
-
formatDelete(ctx, query) {
|
|
126
|
-
const { stmt } = ctx;
|
|
127
|
-
stmt.add("DELETE FROM").addIdentifier(query.table.name);
|
|
128
|
-
stmt.space();
|
|
129
|
-
this.formatWhere(ctx, query.where);
|
|
130
|
-
stmt.space();
|
|
131
|
-
this.formatLimit(ctx, query);
|
|
132
|
-
return stmt;
|
|
133
|
-
}
|
|
134
|
-
formatCreateTable(ctx, query) {
|
|
135
|
-
const { stmt } = ctx;
|
|
136
|
-
stmt.add("CREATE TABLE");
|
|
137
|
-
if (query.ifNotExists)
|
|
138
|
-
stmt.add("IF NOT EXISTS");
|
|
139
|
-
stmt.addIdentifier(query.table.name);
|
|
140
|
-
for (const column of stmt.call(Object.values(query.table.columns))) {
|
|
141
|
-
this.formatColumn(ctx, column);
|
|
142
|
-
}
|
|
143
|
-
return stmt;
|
|
144
|
-
}
|
|
145
|
-
formatCreateIndex(ctx, query) {
|
|
146
|
-
const { stmt } = ctx;
|
|
147
|
-
stmt.add("CREATE");
|
|
148
|
-
if (query.index.unique)
|
|
149
|
-
stmt.add("UNIQUE");
|
|
150
|
-
stmt.add("INDEX");
|
|
151
|
-
if (query.ifNotExists)
|
|
152
|
-
stmt.add("IF NOT EXISTS");
|
|
153
|
-
stmt.addIdentifier(query.index.name).add("ON").addIdentifier(query.table.name);
|
|
154
|
-
for (const expr of stmt.call(query.index.on)) {
|
|
155
|
-
this.formatExprValue(
|
|
156
|
-
{
|
|
157
|
-
...ctx,
|
|
158
|
-
skipTableName: true,
|
|
159
|
-
forceInline: true
|
|
160
|
-
},
|
|
161
|
-
expr
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
this.formatWhere(ctx, query.where);
|
|
165
|
-
return stmt;
|
|
166
|
-
}
|
|
167
|
-
formatDropIndex(ctx, query) {
|
|
168
|
-
const { stmt } = ctx;
|
|
169
|
-
stmt.add("DROP INDEX");
|
|
170
|
-
if (query.ifExists)
|
|
171
|
-
stmt.add("IF EXISTS");
|
|
172
|
-
stmt.addIdentifier(query.name);
|
|
173
|
-
return stmt;
|
|
174
|
-
}
|
|
175
|
-
formatAlterTable(ctx, query) {
|
|
176
|
-
const { stmt } = ctx;
|
|
177
|
-
stmt.add("ALTER TABLE").addIdentifier(query.table.name);
|
|
178
|
-
if (query.addColumn) {
|
|
179
|
-
stmt.add("ADD COLUMN");
|
|
180
|
-
this.formatColumn(ctx, query.addColumn);
|
|
181
|
-
} else if (query.dropColumn) {
|
|
182
|
-
stmt.add("DROP COLUMN").addIdentifier(query.dropColumn);
|
|
183
|
-
} else if (query.alterColumn) {
|
|
184
|
-
throw new Error(`Not available in this formatter: alter column`);
|
|
185
|
-
}
|
|
186
|
-
return stmt;
|
|
187
|
-
}
|
|
188
|
-
formatTransaction(ctx, { op, id }) {
|
|
189
|
-
const { stmt } = ctx;
|
|
190
|
-
switch (op) {
|
|
191
|
-
case Query.TransactionOperation.Begin:
|
|
192
|
-
return stmt.raw("SAVEPOINT").addIdentifier(id);
|
|
193
|
-
case Query.TransactionOperation.Commit:
|
|
194
|
-
return stmt.raw("RELEASE").addIdentifier(id);
|
|
195
|
-
case Query.TransactionOperation.Rollback:
|
|
196
|
-
return stmt.raw("ROLLBACK TO").addIdentifier(id);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
formatBatch(ctx, queries) {
|
|
200
|
-
const { stmt } = ctx;
|
|
201
|
-
for (const query of stmt.separate(queries, ";"))
|
|
202
|
-
this.format(ctx, query);
|
|
203
|
-
return stmt;
|
|
204
|
-
}
|
|
205
|
-
formatRaw(ctx, { strings, params }) {
|
|
206
|
-
const { stmt } = ctx;
|
|
207
|
-
for (let i = 0; i < strings.length; i++) {
|
|
208
|
-
ctx.stmt.raw(strings[i]);
|
|
209
|
-
if (i < params.length) {
|
|
210
|
-
const param = params[i];
|
|
211
|
-
if (param instanceof Expr)
|
|
212
|
-
this.formatExpr(ctx, param.expr);
|
|
213
|
-
else
|
|
214
|
-
this.formatValue(ctx, param);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return stmt;
|
|
218
|
-
}
|
|
219
|
-
formatColumn(ctx, column) {
|
|
220
|
-
const { stmt } = ctx;
|
|
221
|
-
stmt.identifier(column.name).space();
|
|
222
|
-
this.formatType(ctx, column.type);
|
|
223
|
-
if (column.unique)
|
|
224
|
-
stmt.add("UNIQUE");
|
|
225
|
-
if (column.autoIncrement)
|
|
226
|
-
stmt.add("AUTOINCREMENT");
|
|
227
|
-
if (column.primaryKey)
|
|
228
|
-
stmt.add("PRIMARY KEY");
|
|
229
|
-
if (!column.nullable)
|
|
230
|
-
stmt.add("NOT NULL");
|
|
231
|
-
if (column.defaultValue !== void 0) {
|
|
232
|
-
stmt.add("DEFAULT").space();
|
|
233
|
-
stmt.openParenthesis();
|
|
234
|
-
this.formatExpr(
|
|
235
|
-
{
|
|
236
|
-
...ctx,
|
|
237
|
-
formatAsJson: true,
|
|
238
|
-
forceInline: true
|
|
239
|
-
},
|
|
240
|
-
column.defaultValue
|
|
241
|
-
);
|
|
242
|
-
stmt.closeParenthesis();
|
|
243
|
-
}
|
|
244
|
-
if (column.references)
|
|
245
|
-
this.formatContraintReference(ctx, column.references);
|
|
246
|
-
return stmt;
|
|
247
|
-
}
|
|
248
|
-
formatContraintReference(ctx, reference) {
|
|
249
|
-
const { stmt } = ctx;
|
|
250
|
-
if (reference.type !== ExprType.Field || reference.expr.type !== ExprType.Row)
|
|
251
|
-
throw new Error("not supported");
|
|
252
|
-
const from = reference.expr.target;
|
|
253
|
-
return stmt.add("REFERENCES").addIdentifier(Target.source(from).name).openParenthesis().identifier(reference.field).closeParenthesis();
|
|
254
|
-
}
|
|
255
|
-
formatType(ctx, type) {
|
|
256
|
-
const { stmt } = ctx;
|
|
257
|
-
switch (type) {
|
|
258
|
-
case ColumnType.String:
|
|
259
|
-
return stmt.raw("TEXT");
|
|
260
|
-
case ColumnType.Json:
|
|
261
|
-
return stmt.raw("JSON");
|
|
262
|
-
case ColumnType.Number:
|
|
263
|
-
return stmt.raw("NUMERIC");
|
|
264
|
-
case ColumnType.Boolean:
|
|
265
|
-
return stmt.raw("BOOLEAN");
|
|
266
|
-
case ColumnType.Integer:
|
|
267
|
-
return stmt.raw("INTEGER");
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
formatInsertRow(ctx, columns, row) {
|
|
271
|
-
const { stmt } = ctx;
|
|
272
|
-
for (const [property, column] of stmt.call(Object.entries(columns))) {
|
|
273
|
-
const columnValue = row[property];
|
|
274
|
-
this.formatColumnValue(ctx, column, columnValue);
|
|
275
|
-
}
|
|
276
|
-
return stmt;
|
|
277
|
-
}
|
|
278
|
-
formatColumnValue(ctx, column, columnValue) {
|
|
279
|
-
const { stmt } = ctx;
|
|
280
|
-
if (columnValue instanceof Expr)
|
|
281
|
-
return this.formatExprValue(ctx, columnValue.expr);
|
|
282
|
-
const isNull = columnValue === void 0 || columnValue === null;
|
|
283
|
-
const isOptional = column.nullable || column.autoIncrement || column.primaryKey;
|
|
284
|
-
if (isNull) {
|
|
285
|
-
if (column.defaultValue !== void 0)
|
|
286
|
-
return this.formatExprJson(ctx, column.defaultValue);
|
|
287
|
-
if (!isOptional)
|
|
288
|
-
throw new TypeError(`Expected value for column ${column.name}`);
|
|
289
|
-
return stmt.raw("NULL");
|
|
290
|
-
}
|
|
291
|
-
switch (column.type) {
|
|
292
|
-
case ColumnType.String:
|
|
293
|
-
if (typeof columnValue !== "string")
|
|
294
|
-
throw new TypeError(`Expected string for column ${column.name}`);
|
|
295
|
-
return stmt.value(columnValue);
|
|
296
|
-
case ColumnType.Integer:
|
|
297
|
-
case ColumnType.Number:
|
|
298
|
-
if (typeof columnValue !== "number")
|
|
299
|
-
throw new TypeError(`Expected number for column ${column.name}`);
|
|
300
|
-
return stmt.value(columnValue);
|
|
301
|
-
case ColumnType.Boolean:
|
|
302
|
-
if (typeof columnValue !== "boolean")
|
|
303
|
-
throw new TypeError(`Expected boolean for column ${column.name}`);
|
|
304
|
-
return stmt.raw(this.escapeValue(columnValue));
|
|
305
|
-
case ColumnType.Json:
|
|
306
|
-
if (typeof columnValue !== "object")
|
|
307
|
-
throw new TypeError(`Expected object for column ${column.name}`);
|
|
308
|
-
return stmt.value(JSON.stringify(columnValue));
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
formatTarget(ctx, target) {
|
|
312
|
-
const { stmt } = ctx;
|
|
313
|
-
switch (target.type) {
|
|
314
|
-
case TargetType.Table:
|
|
315
|
-
stmt.identifier(target.table.name);
|
|
316
|
-
if (target.table.alias)
|
|
317
|
-
stmt.add("AS").addIdentifier(target.table.alias);
|
|
318
|
-
return stmt;
|
|
319
|
-
case TargetType.Join:
|
|
320
|
-
const { left, right, joinType } = target;
|
|
321
|
-
this.formatTarget(ctx, left);
|
|
322
|
-
stmt.addLine(joins[joinType]).add("JOIN");
|
|
323
|
-
this.formatTarget(ctx, right);
|
|
324
|
-
stmt.add("ON");
|
|
325
|
-
this.formatExprValue(ctx, target.on);
|
|
326
|
-
return stmt;
|
|
327
|
-
default:
|
|
328
|
-
throw new Error(`Cannot format target of type ${target.type}`);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
formatWhere(ctx, expr) {
|
|
332
|
-
const { stmt } = ctx;
|
|
333
|
-
if (!expr)
|
|
334
|
-
return stmt;
|
|
335
|
-
stmt.newline().raw("WHERE").space();
|
|
336
|
-
this.formatExprValue(ctx, expr);
|
|
337
|
-
return stmt;
|
|
338
|
-
}
|
|
339
|
-
formatHaving(ctx, expr) {
|
|
340
|
-
const { stmt } = ctx;
|
|
341
|
-
if (!expr)
|
|
342
|
-
return stmt;
|
|
343
|
-
stmt.newline().raw("HAVING");
|
|
344
|
-
this.formatExprValue(ctx, expr);
|
|
345
|
-
return stmt;
|
|
346
|
-
}
|
|
347
|
-
formatGroupBy(ctx, groupBy) {
|
|
348
|
-
const { stmt } = ctx;
|
|
349
|
-
if (!groupBy)
|
|
350
|
-
return stmt;
|
|
351
|
-
stmt.newline().raw("GROUP BY");
|
|
352
|
-
for (const expr of stmt.separate(groupBy))
|
|
353
|
-
this.formatExprValue(ctx, expr);
|
|
354
|
-
return stmt;
|
|
355
|
-
}
|
|
356
|
-
formatOrderBy(ctx, orderBy) {
|
|
357
|
-
const { stmt } = ctx;
|
|
358
|
-
if (!orderBy)
|
|
359
|
-
return stmt;
|
|
360
|
-
stmt.newline().raw("ORDER BY");
|
|
361
|
-
for (const { expr, order } of stmt.separate(orderBy)) {
|
|
362
|
-
this.formatExprValue(ctx, expr);
|
|
363
|
-
stmt.add(order === OrderDirection.Asc ? "ASC" : "DESC");
|
|
364
|
-
}
|
|
365
|
-
return stmt;
|
|
366
|
-
}
|
|
367
|
-
formatLimit(ctx, { limit, offset, singleResult }) {
|
|
368
|
-
const { stmt } = ctx;
|
|
369
|
-
if (!limit && !offset && !singleResult)
|
|
370
|
-
return stmt;
|
|
371
|
-
stmt.newline().raw("LIMIT").addValue(singleResult ? 1 : limit);
|
|
372
|
-
if (offset && offset > 0)
|
|
373
|
-
stmt.raw("OFFSET").addValue(offset);
|
|
374
|
-
return stmt;
|
|
375
|
-
}
|
|
376
|
-
formatSelection(ctx, selection, formatSubject) {
|
|
377
|
-
const { stmt } = ctx;
|
|
378
|
-
const mkSubject = () => this.formatExpr(
|
|
379
|
-
{
|
|
380
|
-
...ctx,
|
|
381
|
-
formatAsJson: true
|
|
382
|
-
},
|
|
383
|
-
selection
|
|
384
|
-
);
|
|
385
|
-
if (formatSubject)
|
|
386
|
-
formatSubject(stmt, mkSubject);
|
|
387
|
-
else
|
|
388
|
-
mkSubject();
|
|
389
|
-
stmt.add("AS").addIdentifier("result");
|
|
390
|
-
return stmt;
|
|
391
|
-
}
|
|
392
|
-
formatExprJson(ctx, expr) {
|
|
393
|
-
return this.formatExpr({ ...ctx, formatAsJson: true }, expr);
|
|
394
|
-
}
|
|
395
|
-
formatExprValue(ctx, expr) {
|
|
396
|
-
return this.formatExpr({ ...ctx, formatAsJson: false }, expr);
|
|
397
|
-
}
|
|
398
|
-
formatIn(ctx, expr) {
|
|
399
|
-
const { stmt } = ctx;
|
|
400
|
-
switch (expr.type) {
|
|
401
|
-
case ExprType.Field:
|
|
402
|
-
stmt.openParenthesis();
|
|
403
|
-
stmt.raw("SELECT value FROM json_each");
|
|
404
|
-
stmt.openParenthesis();
|
|
405
|
-
this.formatExprJson(ctx, expr);
|
|
406
|
-
stmt.closeParenthesis();
|
|
407
|
-
stmt.closeParenthesis();
|
|
408
|
-
return stmt;
|
|
409
|
-
default:
|
|
410
|
-
return this.formatExprValue(ctx, expr);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
retrieveField(expr, field) {
|
|
414
|
-
switch (expr.type) {
|
|
415
|
-
case ExprType.Record:
|
|
416
|
-
return expr.fields[field];
|
|
417
|
-
case ExprType.Merge:
|
|
418
|
-
return this.retrieveField(expr.a, field) || this.retrieveField(expr.b, field);
|
|
419
|
-
default:
|
|
420
|
-
return void 0;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
formatField(ctx, expr, field) {
|
|
424
|
-
const { stmt } = ctx;
|
|
425
|
-
const fieldExpr = this.retrieveField(expr, field);
|
|
426
|
-
if (fieldExpr)
|
|
427
|
-
return this.formatExpr(ctx, fieldExpr);
|
|
428
|
-
switch (expr.type) {
|
|
429
|
-
case ExprType.Row:
|
|
430
|
-
switch (expr.target.type) {
|
|
431
|
-
case TargetType.Table:
|
|
432
|
-
const column = expr.target.table.columns[field];
|
|
433
|
-
const asJson = column?.type === ColumnType.Json && ctx.formatAsJson;
|
|
434
|
-
if (asJson) {
|
|
435
|
-
stmt.add("json");
|
|
436
|
-
stmt.openParenthesis();
|
|
437
|
-
}
|
|
438
|
-
if (!ctx.skipTableName) {
|
|
439
|
-
stmt.identifier(expr.target.table.alias || expr.target.table.name).raw(".");
|
|
440
|
-
}
|
|
441
|
-
stmt.identifier(field);
|
|
442
|
-
if (asJson)
|
|
443
|
-
stmt.closeParenthesis();
|
|
444
|
-
return stmt;
|
|
445
|
-
}
|
|
446
|
-
default:
|
|
447
|
-
return this.formatAccess(ctx, () => this.formatExpr(ctx, expr), field);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
formatString(ctx, input) {
|
|
451
|
-
const { stmt } = ctx;
|
|
452
|
-
return stmt.raw(this.escapeValue(String(input)));
|
|
453
|
-
}
|
|
454
|
-
formatInlineValue(ctx, rawValue) {
|
|
455
|
-
const { stmt } = ctx;
|
|
456
|
-
switch (true) {
|
|
457
|
-
case (rawValue === null || rawValue === void 0):
|
|
458
|
-
return stmt.raw("NULL");
|
|
459
|
-
case typeof rawValue === "boolean":
|
|
460
|
-
return rawValue ? stmt.raw("TRUE") : stmt.raw("FALSE");
|
|
461
|
-
case (typeof rawValue === "string" || typeof rawValue === "number"):
|
|
462
|
-
return this.formatString(ctx, rawValue);
|
|
463
|
-
default:
|
|
464
|
-
return this.formatString(ctx, JSON.stringify(rawValue));
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
formatValue(ctx, rawValue) {
|
|
468
|
-
const { stmt, formatAsJson, forceInline } = ctx;
|
|
469
|
-
switch (true) {
|
|
470
|
-
case (rawValue === null || rawValue === void 0):
|
|
471
|
-
return stmt.raw("NULL");
|
|
472
|
-
case (!formatAsJson && typeof rawValue === "boolean"):
|
|
473
|
-
return rawValue ? stmt.raw("1") : stmt.raw("0");
|
|
474
|
-
case Array.isArray(rawValue):
|
|
475
|
-
if (formatAsJson) {
|
|
476
|
-
stmt.raw("json_array");
|
|
477
|
-
stmt.openParenthesis();
|
|
478
|
-
}
|
|
479
|
-
for (const v of stmt.separate(rawValue))
|
|
480
|
-
this.formatValue({ ...ctx, formatAsJson: false }, v);
|
|
481
|
-
if (formatAsJson)
|
|
482
|
-
stmt.closeParenthesis();
|
|
483
|
-
return stmt;
|
|
484
|
-
case (typeof rawValue === "string" || typeof rawValue === "number"):
|
|
485
|
-
if (forceInline)
|
|
486
|
-
return stmt.raw(this.escapeValue(rawValue));
|
|
487
|
-
return stmt.value(rawValue);
|
|
488
|
-
default:
|
|
489
|
-
if (formatAsJson) {
|
|
490
|
-
stmt.raw("json");
|
|
491
|
-
stmt.openParenthesis();
|
|
492
|
-
}
|
|
493
|
-
this.formatString(ctx, JSON.stringify(rawValue));
|
|
494
|
-
if (formatAsJson)
|
|
495
|
-
stmt.closeParenthesis();
|
|
496
|
-
return stmt;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
formatExpr(ctx, expr) {
|
|
500
|
-
const { stmt } = ctx;
|
|
501
|
-
switch (expr.type) {
|
|
502
|
-
case ExprType.UnOp:
|
|
503
|
-
switch (expr.op) {
|
|
504
|
-
case UnOp.IsNull:
|
|
505
|
-
return this.formatExprValue(ctx, expr.expr).add("IS NULL");
|
|
506
|
-
case UnOp.Not:
|
|
507
|
-
stmt.raw("NOT").openParenthesis();
|
|
508
|
-
this.formatExprValue(ctx, expr.expr);
|
|
509
|
-
return stmt.closeParenthesis();
|
|
510
|
-
}
|
|
511
|
-
case ExprType.BinOp:
|
|
512
|
-
stmt.openParenthesis();
|
|
513
|
-
this.formatExprValue(ctx, expr.a).add(binOps[expr.op]).space();
|
|
514
|
-
if (expr.op === BinOp.In || expr.op === BinOp.NotIn)
|
|
515
|
-
this.formatIn(ctx, expr.b);
|
|
516
|
-
else
|
|
517
|
-
this.formatExprValue(ctx, expr.b);
|
|
518
|
-
return stmt.closeParenthesis();
|
|
519
|
-
case ExprType.Param:
|
|
520
|
-
switch (expr.param.type) {
|
|
521
|
-
case ParamType.Value:
|
|
522
|
-
return this.formatValue(ctx, expr.param.value);
|
|
523
|
-
case ParamType.Named:
|
|
524
|
-
return stmt.param(expr.param.name);
|
|
525
|
-
}
|
|
526
|
-
case ExprType.Field:
|
|
527
|
-
return this.formatField(ctx, expr.expr, expr.field);
|
|
528
|
-
case ExprType.Call: {
|
|
529
|
-
if (expr.method === "cast") {
|
|
530
|
-
const [e, type] = expr.params;
|
|
531
|
-
const typeName = type.type === ExprType.Param && type.param.type === ParamType.Value && type.param.value;
|
|
532
|
-
stmt.raw("cast").openParenthesis();
|
|
533
|
-
this.formatExprValue(ctx, e).add("as").space();
|
|
534
|
-
this.formatString(ctx, typeName);
|
|
535
|
-
return stmt.closeParenthesis();
|
|
536
|
-
} else if (expr.method === "exists") {
|
|
537
|
-
stmt.raw("exists").space();
|
|
538
|
-
return this.formatExprValue(ctx, expr.params[0]);
|
|
539
|
-
} else {
|
|
540
|
-
stmt.addIdentifier(expr.method).openParenthesis();
|
|
541
|
-
for (const param of stmt.separate(expr.params))
|
|
542
|
-
this.formatExprValue(ctx, param);
|
|
543
|
-
return stmt.closeParenthesis();
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
case ExprType.Query:
|
|
547
|
-
if (!ctx.formatAsJson) {
|
|
548
|
-
stmt.openParenthesis();
|
|
549
|
-
this.format(ctx, expr.query);
|
|
550
|
-
return stmt.closeParenthesis();
|
|
551
|
-
}
|
|
552
|
-
if (expr.query.singleResult) {
|
|
553
|
-
stmt.raw("json").openParenthesis().openParenthesis();
|
|
554
|
-
this.format(ctx, expr.query);
|
|
555
|
-
return stmt.closeParenthesis().closeParenthesis();
|
|
556
|
-
}
|
|
557
|
-
stmt.openParenthesis().raw("SELECT json_group_array(json(result))").newline().raw("FROM").openParenthesis();
|
|
558
|
-
this.format(ctx, expr.query);
|
|
559
|
-
return stmt.closeParenthesis().closeParenthesis();
|
|
560
|
-
case ExprType.Row:
|
|
561
|
-
switch (expr.target.type) {
|
|
562
|
-
case TargetType.Table:
|
|
563
|
-
const table = Target.source(expr.target);
|
|
564
|
-
if (!table)
|
|
565
|
-
throw new Error(`Cannot select empty target`);
|
|
566
|
-
stmt.identifier("json_object");
|
|
567
|
-
for (const [key, column] of stmt.call(
|
|
568
|
-
Object.entries(table.columns)
|
|
569
|
-
)) {
|
|
570
|
-
this.formatString(ctx, key).raw(", ");
|
|
571
|
-
this.formatField(ctx, expr, column.name);
|
|
572
|
-
}
|
|
573
|
-
return stmt;
|
|
574
|
-
case TargetType.Each:
|
|
575
|
-
return stmt.identifier(expr.target.alias).raw(".value");
|
|
576
|
-
default:
|
|
577
|
-
throw new Error(`Cannot select from ${expr.target.type}`);
|
|
578
|
-
}
|
|
579
|
-
case ExprType.Merge:
|
|
580
|
-
stmt.identifier("json_patch").openParenthesis();
|
|
581
|
-
this.formatExpr({ ...ctx, formatAsJson: true }, expr.a);
|
|
582
|
-
stmt.raw(", ");
|
|
583
|
-
this.formatExpr({ ...ctx, formatAsJson: true }, expr.b);
|
|
584
|
-
return stmt.closeParenthesis();
|
|
585
|
-
case ExprType.Record:
|
|
586
|
-
stmt.identifier("json_object");
|
|
587
|
-
for (const [key, value] of stmt.call(Object.entries(expr.fields))) {
|
|
588
|
-
this.formatString(ctx, key).raw(", ");
|
|
589
|
-
this.formatExprJson(ctx, value);
|
|
590
|
-
}
|
|
591
|
-
return stmt;
|
|
592
|
-
case ExprType.Filter: {
|
|
593
|
-
const { target, condition } = expr;
|
|
594
|
-
switch (target.type) {
|
|
595
|
-
case TargetType.Each:
|
|
596
|
-
stmt.openParenthesis().raw("SELECT json_group_array(json(result)) FROM ").openParenthesis().raw("SELECT value AS result").add("FROM json_each").openParenthesis();
|
|
597
|
-
this.formatExpr(ctx, target.expr);
|
|
598
|
-
stmt.closeParenthesis().add("AS").addIdentifier(target.alias).add("WHERE").space();
|
|
599
|
-
this.formatExprValue(ctx, condition);
|
|
600
|
-
return stmt.closeParenthesis().closeParenthesis();
|
|
601
|
-
default:
|
|
602
|
-
throw new Error("todo");
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
case ExprType.Map: {
|
|
606
|
-
const { target, result } = expr;
|
|
607
|
-
switch (target.type) {
|
|
608
|
-
case TargetType.Each:
|
|
609
|
-
stmt.openParenthesis().raw("SELECT json_group_array(json(result)) FROM ").openParenthesis().raw("SELECT").space();
|
|
610
|
-
this.formatExprJson(ctx, result).add("AS result").add("FROM json_each").openParenthesis();
|
|
611
|
-
this.formatExprJson(ctx, target.expr);
|
|
612
|
-
return stmt.closeParenthesis().add("AS").addIdentifier(target.alias).closeParenthesis().closeParenthesis();
|
|
613
|
-
default:
|
|
614
|
-
throw new Error("todo");
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
default:
|
|
618
|
-
console.log(expr);
|
|
619
|
-
throw new Error("todo");
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
};
|
|
623
|
-
export {
|
|
624
|
-
Formatter
|
|
625
|
-
};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// src/lib/Functions.ts
|
|
2
|
-
import { Expr, ExprData } from "./Expr.js";
|
|
3
|
-
function get(_, method) {
|
|
4
|
-
return (...args) => {
|
|
5
|
-
return new Expr(ExprData.Call(method, args.map(ExprData.create)));
|
|
6
|
-
};
|
|
7
|
-
}
|
|
8
|
-
var Functions = new Proxy({}, { get });
|
|
9
|
-
export {
|
|
10
|
-
Functions
|
|
11
|
-
};
|
package/dist/src/lib/Id.js
DELETED
|
File without changes
|
package/dist/src/lib/Index.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
// src/lib/Index.ts
|
|
2
|
-
import { ExprData } from "./Expr.js";
|
|
3
|
-
var Index = class {
|
|
4
|
-
constructor(data) {
|
|
5
|
-
this.data = data;
|
|
6
|
-
}
|
|
7
|
-
unique() {
|
|
8
|
-
return new Index({ ...this.data, unique: true });
|
|
9
|
-
}
|
|
10
|
-
where(where) {
|
|
11
|
-
return new Index({ ...this.data, where: ExprData.create(where) });
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
function index(...on) {
|
|
15
|
-
return new Index({ on: on.map(ExprData.create) });
|
|
16
|
-
}
|
|
17
|
-
export {
|
|
18
|
-
Index,
|
|
19
|
-
index
|
|
20
|
-
};
|
package/dist/src/lib/Ops.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
// src/lib/Ops.ts
|
|
2
|
-
import { Cursor } from "./Cursor.js";
|
|
3
|
-
import { ExprData } from "./Expr.js";
|
|
4
|
-
import { Query } from "./Query.js";
|
|
5
|
-
import { Schema } from "./Schema.js";
|
|
6
|
-
import { Target } from "./Target.js";
|
|
7
|
-
function selectAll(table) {
|
|
8
|
-
return new Cursor.SelectMultiple(
|
|
9
|
-
Query.Select({
|
|
10
|
-
from: Target.Table(table.schema()),
|
|
11
|
-
selection: ExprData.Row(Target.Table(table.schema()))
|
|
12
|
-
})
|
|
13
|
-
);
|
|
14
|
-
}
|
|
15
|
-
function selectFirst(table) {
|
|
16
|
-
return new Cursor.SelectSingle(
|
|
17
|
-
Query.Select({
|
|
18
|
-
from: Target.Table(table.schema()),
|
|
19
|
-
selection: ExprData.Row(Target.Table(table.schema())),
|
|
20
|
-
singleResult: true
|
|
21
|
-
})
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
function update(table) {
|
|
25
|
-
return new Cursor.Update(Query.Update({ table: table.schema() }));
|
|
26
|
-
}
|
|
27
|
-
function insertInto(table) {
|
|
28
|
-
return new Cursor.Insert(table.schema());
|
|
29
|
-
}
|
|
30
|
-
function deleteFrom(table) {
|
|
31
|
-
return new Cursor.Delete(Query.Delete({ table: table.schema() }));
|
|
32
|
-
}
|
|
33
|
-
function create(...tables) {
|
|
34
|
-
return new Cursor.Batch(
|
|
35
|
-
tables.flatMap((table) => Schema.create(table.schema()).queries)
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
export {
|
|
39
|
-
create,
|
|
40
|
-
deleteFrom,
|
|
41
|
-
insertInto,
|
|
42
|
-
selectAll,
|
|
43
|
-
selectFirst,
|
|
44
|
-
update
|
|
45
|
-
};
|