rado 0.3.4 → 0.3.6

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.
Files changed (95) hide show
  1. package/README.md +277 -277
  2. package/dist/driver/better-sqlite3.d.ts +1 -0
  3. package/dist/driver/better-sqlite3.js +3 -0
  4. package/dist/driver/bun-sqlite.d.ts +1 -0
  5. package/dist/driver/bun-sqlite.js +3 -0
  6. package/dist/driver/sql.js.d.ts +1 -0
  7. package/dist/driver/sql.js.js +3 -0
  8. package/dist/driver/sqlite3.d.ts +1 -0
  9. package/dist/driver/sqlite3.js +11 -0
  10. package/dist/lib/Driver.d.ts +3 -0
  11. package/dist/lib/Driver.js +3 -0
  12. package/dist/lib/Formatter.js +2 -2
  13. package/package.json +74 -74
  14. package/dist/define/CTE.d.ts +0 -2
  15. package/dist/define/CTE.js +0 -51
  16. package/dist/define/Cursor.d.ts +0 -108
  17. package/dist/define/Cursor.js +0 -338
  18. package/dist/define/Update.d.ts +0 -4
  19. package/dist/define/Update.js +0 -0
  20. package/dist/define/query/Batch.d.ts +0 -7
  21. package/dist/define/query/Batch.js +0 -17
  22. package/dist/define/query/CreateTable.d.ts +0 -6
  23. package/dist/define/query/CreateTable.js +0 -11
  24. package/dist/define/query/Delete.d.ts +0 -11
  25. package/dist/define/query/Delete.js +0 -18
  26. package/dist/define/query/Insert.d.ts +0 -22
  27. package/dist/define/query/Insert.js +0 -47
  28. package/dist/define/query/Select.d.ts +0 -39
  29. package/dist/define/query/Select.js +0 -170
  30. package/dist/define/query/TableSelect.d.ts +0 -28
  31. package/dist/define/query/TableSelect.js +0 -79
  32. package/dist/define/query/Union.d.ts +0 -17
  33. package/dist/define/query/Union.js +0 -116
  34. package/dist/define/query/Update.d.ts +0 -12
  35. package/dist/define/query/Update.js +0 -18
  36. package/dist/deno/driver/better-sqlite3.js +0 -57
  37. package/dist/deno/driver/bun-sqlite.js +0 -69
  38. package/dist/deno/driver/sql.js.js +0 -72
  39. package/dist/deno/driver/sqlite3.js +0 -123
  40. package/dist/deno/index.js +0 -14
  41. package/dist/deno/lib/Driver.js +0 -330
  42. package/dist/deno/lib/Formatter.js +0 -715
  43. package/dist/deno/lib/Sanitizer.js +0 -0
  44. package/dist/deno/lib/SqlError.js +0 -11
  45. package/dist/deno/lib/Statement.js +0 -108
  46. package/dist/deno/sqlite/SqliteFormatter.js +0 -70
  47. package/dist/deno/sqlite/SqliteFunctions.js +0 -150
  48. package/dist/deno/sqlite/SqliteSchema.js +0 -47
  49. package/dist/deno/sqlite.js +0 -3
  50. package/dist/deno/util/Callable.js +0 -15
  51. package/dist/sqlite/index.d.ts +0 -2
  52. package/dist/sqlite/index.js +0 -3
  53. package/dist/src/driver/better-sqlite3.js +0 -49
  54. package/dist/src/driver/sql.js.js +0 -66
  55. package/dist/src/driver/sqlite3.js +0 -87
  56. package/dist/src/index.js +0 -24
  57. package/dist/src/lib/Column.js +0 -63
  58. package/dist/src/lib/Cursor.js +0 -231
  59. package/dist/src/lib/Driver.js +0 -316
  60. package/dist/src/lib/Expr.js +0 -284
  61. package/dist/src/lib/Fields.js +0 -0
  62. package/dist/src/lib/Formatter.js +0 -625
  63. package/dist/src/lib/Functions.js +0 -11
  64. package/dist/src/lib/Id.js +0 -0
  65. package/dist/src/lib/Index.js +0 -20
  66. package/dist/src/lib/Ops.js +0 -45
  67. package/dist/src/lib/OrderBy.js +0 -9
  68. package/dist/src/lib/Param.js +0 -27
  69. package/dist/src/lib/Query.js +0 -74
  70. package/dist/src/lib/Sanitizer.js +0 -0
  71. package/dist/src/lib/Schema.js +0 -67
  72. package/dist/src/lib/Selection.js +0 -7
  73. package/dist/src/lib/Statement.js +0 -103
  74. package/dist/src/lib/Table.js +0 -130
  75. package/dist/src/lib/Target.js +0 -37
  76. package/dist/src/lib/Update.js +0 -0
  77. package/dist/src/sqlite/SqliteFormatter.js +0 -67
  78. package/dist/src/sqlite/SqliteFunctions.js +0 -146
  79. package/dist/src/sqlite/SqliteSchema.js +0 -47
  80. package/dist/src/sqlite.js +0 -3
  81. package/dist/test/DbSuite.js +0 -28
  82. package/dist/test/TSTestTypes.js +0 -6
  83. package/dist/test/TestBasic.js +0 -172
  84. package/dist/test/TestExtend.js +0 -68
  85. package/dist/test/TestFts5.js +0 -34
  86. package/dist/test/TestFunctions.js +0 -28
  87. package/dist/test/TestJoins.js +0 -34
  88. package/dist/test/TestJson.js +0 -33
  89. package/dist/test/TestPrepare.js +0 -27
  90. package/dist/test/TestRawSql.js +0 -31
  91. package/dist/test/TestSchema.js +0 -69
  92. package/dist/test/TestSubQueries.js +0 -79
  93. package/dist/test/TestTransaction.js +0 -54
  94. package/dist/test/TestUpdate.js +0 -95
  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
- };
File without changes
@@ -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
- };
@@ -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
- };