rado 0.1.21 → 0.1.23

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 (69) hide show
  1. package/README.md +1 -1
  2. package/dist/Column.d.ts +41 -0
  3. package/dist/Column.js +58 -0
  4. package/dist/Cursor.d.ts +77 -0
  5. package/dist/Cursor.js +211 -0
  6. package/dist/Driver.d.ts +72 -0
  7. package/dist/Driver.js +145 -0
  8. package/dist/Expr.d.ts +149 -0
  9. package/dist/Expr.js +284 -0
  10. package/dist/Fields.d.ts +9 -0
  11. package/dist/Fields.js +0 -0
  12. package/dist/Formatter.d.ts +50 -0
  13. package/dist/Formatter.js +453 -0
  14. package/dist/Functions.d.ts +8 -0
  15. package/dist/Functions.js +11 -0
  16. package/dist/Key.d.ts +5 -0
  17. package/dist/Ops.d.ts +8 -0
  18. package/dist/Ops.js +46 -0
  19. package/dist/OrderBy.d.ts +9 -0
  20. package/dist/OrderBy.js +9 -0
  21. package/dist/Param.d.ts +15 -0
  22. package/dist/Param.js +18 -0
  23. package/dist/Query.d.ts +94 -0
  24. package/dist/Query.js +57 -0
  25. package/dist/Sanitizer.d.ts +4 -0
  26. package/dist/Sanitizer.js +0 -0
  27. package/dist/Schema.d.ts +10 -0
  28. package/dist/Selection.d.ts +18 -0
  29. package/dist/Selection.js +0 -0
  30. package/dist/Statement.d.ts +57 -0
  31. package/dist/Statement.js +184 -0
  32. package/dist/Table.d.ts +47 -0
  33. package/dist/Table.js +82 -0
  34. package/dist/Target.d.ts +30 -0
  35. package/dist/Target.js +37 -0
  36. package/dist/Update.d.ts +4 -0
  37. package/dist/Update.js +0 -0
  38. package/dist/driver/better-sqlite3.d.ts +17 -17
  39. package/dist/driver/sql.js.d.ts +17 -17
  40. package/dist/driver/sqlite3.d.ts +20 -20
  41. package/dist/index.d.ts +20 -20
  42. package/dist/lib/Column.d.ts +57 -57
  43. package/dist/lib/Cursor.d.ts +77 -77
  44. package/dist/lib/Driver.d.ts +89 -89
  45. package/dist/lib/Expr.d.ts +154 -154
  46. package/dist/lib/Fields.d.ts +13 -13
  47. package/dist/lib/Formatter.d.ts +56 -56
  48. package/dist/lib/Formatter.js +2 -2
  49. package/dist/lib/Functions.d.ts +7 -7
  50. package/dist/lib/Id.d.ts +3 -3
  51. package/dist/lib/Index.d.ts +17 -17
  52. package/dist/lib/Ops.d.ts +8 -8
  53. package/dist/lib/OrderBy.d.ts +9 -9
  54. package/dist/lib/Param.d.ts +15 -15
  55. package/dist/lib/Query.d.ts +108 -108
  56. package/dist/lib/Sanitizer.d.ts +4 -4
  57. package/dist/lib/Schema.d.ts +18 -18
  58. package/dist/lib/Selection.d.ts +20 -20
  59. package/dist/lib/Statement.d.ts +61 -61
  60. package/dist/lib/Table.d.ts +58 -58
  61. package/dist/lib/Target.d.ts +30 -30
  62. package/dist/lib/Update.d.ts +4 -4
  63. package/dist/sqlite/SqliteFormatter.d.ts +11 -11
  64. package/dist/sqlite/SqliteFunctions.d.ts +156 -156
  65. package/dist/sqlite/SqliteSchema.d.ts +24 -24
  66. package/dist/sqlite/index.d.ts +2 -0
  67. package/dist/sqlite/index.js +3 -0
  68. package/dist/sqlite.d.ts +2 -2
  69. package/package.json +47 -47
@@ -0,0 +1,453 @@
1
+ // src/Formatter.ts
2
+ import { ColumnType } from "./Column";
3
+ import { BinOp, ExprData, ExprType, UnOp } from "./Expr";
4
+ import { OrderDirection } from "./OrderBy";
5
+ import { ParamType } from "./Param";
6
+ import { Query, QueryType } from "./Query";
7
+ import {
8
+ Statement,
9
+ call,
10
+ identifier,
11
+ newline,
12
+ parenthesis,
13
+ raw,
14
+ separated,
15
+ value
16
+ } from "./Statement";
17
+ import { Target, TargetType } from "./Target";
18
+ var binOps = {
19
+ [BinOp.Add]: "+",
20
+ [BinOp.Subt]: "-",
21
+ [BinOp.Mult]: "*",
22
+ [BinOp.Mod]: "%",
23
+ [BinOp.Div]: "/",
24
+ [BinOp.Greater]: ">",
25
+ [BinOp.GreaterOrEqual]: ">=",
26
+ [BinOp.Less]: "<",
27
+ [BinOp.LessOrEqual]: "<=",
28
+ [BinOp.Equals]: "=",
29
+ [BinOp.NotEquals]: "!=",
30
+ [BinOp.And]: "and",
31
+ [BinOp.Or]: "or",
32
+ [BinOp.Like]: "like",
33
+ [BinOp.Glob]: "glob",
34
+ [BinOp.Match]: "match",
35
+ [BinOp.In]: "in",
36
+ [BinOp.NotIn]: "not in",
37
+ [BinOp.Concat]: "||"
38
+ };
39
+ var joins = {
40
+ left: "left",
41
+ inner: "inner"
42
+ };
43
+ var Formatter = class {
44
+ constructor() {
45
+ }
46
+ formatAccess(on, field, formatAsJson) {
47
+ return formatAsJson ? this.formatJsonAccess(on, field) : this.formatSqlAccess(on, field);
48
+ }
49
+ compile(query, formatInline = false) {
50
+ const result = this.format(query, {
51
+ formatSubject: (select) => call("json_object", raw("'result'"), select),
52
+ nameResult: "result"
53
+ }).compile(this, formatInline);
54
+ return result;
55
+ }
56
+ format(query, ctx = {}) {
57
+ switch (query.type) {
58
+ case QueryType.Select:
59
+ return this.formatSelect(query, ctx);
60
+ case QueryType.Insert:
61
+ return this.formatInsert(query, ctx);
62
+ case QueryType.Update:
63
+ return this.formatUpdate(query, ctx);
64
+ case QueryType.Delete:
65
+ return this.formatDelete(query, ctx);
66
+ case QueryType.CreateTable:
67
+ return this.formatCreateTable(query, ctx);
68
+ case QueryType.Transaction:
69
+ return this.formatTransaction(query, ctx);
70
+ case QueryType.Batch:
71
+ return this.formatBatch(query.queries, ctx);
72
+ case QueryType.Raw:
73
+ return this.formatRaw(query, ctx);
74
+ }
75
+ }
76
+ formatSelect(query, ctx) {
77
+ return raw("select").add(this.formatSelection(query.selection, ctx)).addLine("from").add(this.formatTarget(query.from, ctx)).add(this.formatWhere(query.where, ctx)).add(this.formatGroupBy(query.groupBy, ctx)).add(this.formatHaving(query.having, ctx)).add(this.formatOrderBy(query.orderBy, ctx)).add(this.formatLimit(query, ctx));
78
+ }
79
+ formatInsert(query, ctx) {
80
+ const columns = Object.values(query.into.columns);
81
+ return raw("insert into").addCall(
82
+ query.into.name,
83
+ ...columns.map((column) => this.formatString(column.name))
84
+ ).add("values").addSeparated(
85
+ query.data.map((row) => this.formatInsertRow(query.into.columns, row))
86
+ ).addIf(
87
+ query.selection,
88
+ () => raw("returning").add(this.formatSelection(query.selection, ctx))
89
+ );
90
+ }
91
+ formatUpdate(query, ctx) {
92
+ const data = query.set || {};
93
+ return raw("update").addIdentifier(query.table.name).add("set").addSeparated(
94
+ Object.keys(data).map((key) => {
95
+ const column = query.table.columns[key];
96
+ const exprData = data[key];
97
+ return identifier(key).add("=").add(
98
+ this.formatExpr(ExprData.create(data[key]), {
99
+ ...ctx,
100
+ formatAsJson: true
101
+ })
102
+ );
103
+ })
104
+ ).add(this.formatWhere(query.where, ctx)).add(this.formatLimit(query, ctx));
105
+ }
106
+ formatDelete(query, ctx) {
107
+ return raw("delete from").addIdentifier(query.table.name).add(this.formatWhere(query.where, ctx)).add(this.formatLimit(query, ctx));
108
+ }
109
+ formatCreateTable(query, ctx) {
110
+ return raw("create table").addIf(query.ifNotExists, "if not exists").addCall(
111
+ query.table.name,
112
+ ...Object.values(query.table.columns).map((column) => {
113
+ return this.formatColumn(column);
114
+ })
115
+ );
116
+ }
117
+ formatTransaction({ op, id }, ctx) {
118
+ switch (op) {
119
+ case Query.TransactionOperation.Begin:
120
+ return raw("savepoint").addIdentifier(id);
121
+ case Query.TransactionOperation.Commit:
122
+ return raw("release").addIdentifier(id);
123
+ case Query.TransactionOperation.Rollback:
124
+ return raw("rollback to").addIdentifier(id);
125
+ }
126
+ }
127
+ formatBatch(queries, ctx) {
128
+ return separated(
129
+ queries.map((query) => this.format(query, ctx)),
130
+ "; "
131
+ );
132
+ }
133
+ formatRaw({ strings, params }, ctx) {
134
+ return Statement.ofTemplate(strings, params);
135
+ }
136
+ formatColumn(column) {
137
+ return identifier(column.name).add(this.formatType(column.type)).addIf(column.unique, "unique").addIf(column.autoIncrement, "autoincrement").addIf(column.primaryKey, "primary key").addIf(!column.nullable, "not null").addIf(
138
+ column.defaultValue !== void 0,
139
+ raw("default").value(column.defaultValue)
140
+ );
141
+ }
142
+ formatType(type) {
143
+ switch (type) {
144
+ case ColumnType.String:
145
+ case ColumnType.Object:
146
+ case ColumnType.Array:
147
+ return raw("text");
148
+ case ColumnType.Number:
149
+ case ColumnType.Boolean:
150
+ return raw("numeric");
151
+ case ColumnType.Integer:
152
+ return raw("integer");
153
+ }
154
+ }
155
+ formatInsertRow(columns, row) {
156
+ return parenthesis(
157
+ separated(
158
+ Object.entries(columns).map(([property, column]) => {
159
+ const columnValue = row[property];
160
+ return this.formatColumnValue(column, columnValue);
161
+ })
162
+ )
163
+ );
164
+ }
165
+ formatColumnValue(column, columnValue) {
166
+ const isNull = columnValue === void 0 || columnValue === null;
167
+ const isOptional = column.nullable || column.autoIncrement || column.primaryKey || column.defaultValue;
168
+ if (isNull) {
169
+ if (!isOptional)
170
+ throw new TypeError(`Expected value for column ${column.name}`);
171
+ return raw("null");
172
+ }
173
+ switch (column.type) {
174
+ case ColumnType.String:
175
+ if (typeof columnValue !== "string")
176
+ throw new TypeError(`Expected string for column ${column.name}`);
177
+ return value(columnValue);
178
+ case ColumnType.Integer:
179
+ case ColumnType.Number:
180
+ if (typeof columnValue !== "number")
181
+ throw new TypeError(`Expected number for column ${column.name}`);
182
+ return value(columnValue);
183
+ case ColumnType.Boolean:
184
+ if (typeof columnValue !== "boolean")
185
+ throw new TypeError(`Expected boolean for column ${column.name}`);
186
+ return value(columnValue);
187
+ case ColumnType.Object:
188
+ if (typeof columnValue !== "object")
189
+ throw new TypeError(`Expected object for column ${column.name}`);
190
+ return value(JSON.stringify(columnValue));
191
+ case ColumnType.Array:
192
+ if (!Array.isArray(columnValue))
193
+ throw new TypeError(`Expected array for column ${column.name}`);
194
+ return value(JSON.stringify(columnValue));
195
+ }
196
+ }
197
+ formatTarget(target, ctx) {
198
+ switch (target.type) {
199
+ case TargetType.Table:
200
+ return identifier(target.table.name).addIf(
201
+ target.table.alias,
202
+ () => raw("as").addIdentifier(target.table.alias)
203
+ );
204
+ case TargetType.Join:
205
+ const { left, right, joinType } = target;
206
+ return this.formatTarget(left, ctx).addLine(joins[joinType]).add("join").add(this.formatTarget(right, ctx)).add("on").add(this.formatExprValue(target.on, ctx));
207
+ default:
208
+ throw new Error(`Cannot format target of type ${target.type}`);
209
+ }
210
+ }
211
+ formatWhere(expr, ctx) {
212
+ if (!expr)
213
+ return;
214
+ return newline().raw("where").add(this.formatExprValue(expr, ctx));
215
+ }
216
+ formatHaving(expr, ctx) {
217
+ if (!expr)
218
+ return;
219
+ return newline().raw("having").add(this.formatExprValue(expr, ctx));
220
+ }
221
+ formatGroupBy(groupBy, ctx) {
222
+ if (!groupBy)
223
+ return;
224
+ return newline().raw("group by").addSeparated(groupBy.map((expr) => this.formatExprValue(expr, ctx)));
225
+ }
226
+ formatOrderBy(orderBy, ctx) {
227
+ if (!orderBy)
228
+ return;
229
+ return newline().raw("order by").addSeparated(
230
+ orderBy.map(
231
+ ({ expr, order }) => this.formatExprValue(expr, ctx).add(
232
+ order === OrderDirection.Asc ? "asc" : "desc"
233
+ )
234
+ )
235
+ );
236
+ }
237
+ formatLimit({ limit, offset, singleResult }, ctx) {
238
+ if (!limit && !offset && !singleResult)
239
+ return;
240
+ return newline().raw("limit").addValue(singleResult ? 1 : limit).addIf(offset && offset > 0, raw("offset").addValue(offset));
241
+ }
242
+ formatSelection(selection, ctx) {
243
+ const { formatSubject } = ctx;
244
+ const subject = this.formatExpr(selection, {
245
+ ...ctx,
246
+ formatSubject: void 0,
247
+ formatAsJson: true
248
+ });
249
+ return (formatSubject ? formatSubject(subject) : subject).addIf(
250
+ ctx.nameResult,
251
+ raw("as").addIdentifier(ctx.nameResult)
252
+ );
253
+ }
254
+ formatExprValue(expr, ctx) {
255
+ return this.formatExpr(expr, { ...ctx, formatAsJson: false });
256
+ }
257
+ formatIn(expr, ctx) {
258
+ switch (expr.type) {
259
+ case ExprType.Field:
260
+ return this.formatUnwrapArray(this.formatExprValue(expr, ctx));
261
+ default:
262
+ return this.formatExprValue(expr, ctx);
263
+ }
264
+ }
265
+ formatUnwrapArray(stmt) {
266
+ return parenthesis(raw("select value from").addCall("json_each", stmt));
267
+ }
268
+ retrieveField(expr, field) {
269
+ switch (expr.type) {
270
+ case ExprType.Record:
271
+ return expr.fields[field];
272
+ case ExprType.Merge:
273
+ return this.retrieveField(expr.a, field) || this.retrieveField(expr.b, field);
274
+ default:
275
+ return void 0;
276
+ }
277
+ }
278
+ formatField(expr, field, ctx) {
279
+ const fieldExpr = this.retrieveField(expr, field);
280
+ if (fieldExpr)
281
+ return this.formatExpr(fieldExpr, ctx);
282
+ switch (expr.type) {
283
+ case ExprType.Row:
284
+ switch (expr.target.type) {
285
+ case TargetType.Table:
286
+ const selection = identifier(
287
+ expr.target.table.alias || expr.target.table.name
288
+ ).raw(".").identifier(field);
289
+ const column = expr.target.table.columns[field];
290
+ switch (column?.type) {
291
+ case ColumnType.Array:
292
+ case ColumnType.Object:
293
+ return call("json", selection);
294
+ default:
295
+ return selection;
296
+ }
297
+ }
298
+ default:
299
+ return this.formatAccess(
300
+ this.formatExpr(expr, { ...ctx, formatAsJson: true }),
301
+ field,
302
+ ctx.formatAsJson
303
+ );
304
+ }
305
+ }
306
+ formatString(input) {
307
+ return raw(this.escapeValue(String(input)));
308
+ }
309
+ formatValue(rawValue, formatAsJson) {
310
+ switch (true) {
311
+ case (rawValue === null || rawValue === void 0):
312
+ return raw("null");
313
+ case (!formatAsJson && typeof rawValue === "boolean"):
314
+ return rawValue ? raw("1") : raw("0");
315
+ case Array.isArray(rawValue):
316
+ const res = parenthesis(
317
+ separated(rawValue.map((v) => this.formatValue(v, false)))
318
+ );
319
+ return formatAsJson ? raw("json_array").concat(res) : res;
320
+ case (typeof rawValue === "string" || typeof rawValue === "number"):
321
+ return value(rawValue);
322
+ default:
323
+ const expr = this.formatString(JSON.stringify(rawValue));
324
+ if (formatAsJson)
325
+ return call("json", expr);
326
+ return expr;
327
+ }
328
+ }
329
+ formatExpr(expr, ctx) {
330
+ switch (expr.type) {
331
+ case ExprType.UnOp:
332
+ switch (expr.op) {
333
+ case UnOp.IsNull:
334
+ return this.formatExprValue(expr.expr, ctx).add("is null");
335
+ case UnOp.Not:
336
+ return raw("not").addParenthesis(
337
+ this.formatExprValue(expr.expr, ctx)
338
+ );
339
+ }
340
+ case ExprType.BinOp:
341
+ return parenthesis(
342
+ this.formatExprValue(expr.a, ctx).add(binOps[expr.op]).add(
343
+ expr.op === BinOp.In || expr.op === BinOp.NotIn ? this.formatIn(expr.b, ctx) : this.formatExprValue(expr.b, ctx)
344
+ )
345
+ );
346
+ case ExprType.Param:
347
+ switch (expr.param.type) {
348
+ case ParamType.Value:
349
+ return this.formatValue(expr.param.value, ctx.formatAsJson);
350
+ case ParamType.Named:
351
+ throw new Error("todo");
352
+ }
353
+ case ExprType.Field:
354
+ return this.formatField(expr.expr, expr.field, ctx);
355
+ case ExprType.Call: {
356
+ if (expr.method === "cast") {
357
+ const [e, type] = expr.params;
358
+ const typeName = type.type === ExprType.Param && type.param.type === ParamType.Value && type.param.value;
359
+ return raw("cast").parenthesis(
360
+ this.formatExprValue(e, ctx).add("as").add(this.formatString(typeName))
361
+ );
362
+ } else {
363
+ const params = expr.params.map(
364
+ (expr2) => this.formatExprValue(expr2, ctx)
365
+ );
366
+ return call(expr.method, ...params);
367
+ }
368
+ }
369
+ case ExprType.Query:
370
+ if (!ctx.formatAsJson)
371
+ return parenthesis(this.format(expr.query, ctx));
372
+ const subQuery = this.format(expr.query, { ...ctx, nameResult: "result" });
373
+ if (expr.query.singleResult)
374
+ return call("json", parenthesis(subQuery));
375
+ return parenthesis(
376
+ raw("select json_group_array(json(result))").newline().raw("from ").parenthesis(subQuery)
377
+ );
378
+ case ExprType.Row:
379
+ switch (expr.target.type) {
380
+ case TargetType.Table:
381
+ const table = Target.source(expr.target);
382
+ if (!table)
383
+ throw new Error(`Cannot select empty target`);
384
+ return this.formatExpr(
385
+ ExprData.Record(
386
+ Object.fromEntries(
387
+ Object.entries(table.columns).map(([key, column]) => [
388
+ key,
389
+ ExprData.Field(ExprData.Row(expr.target), column.name)
390
+ ])
391
+ )
392
+ ),
393
+ ctx
394
+ );
395
+ case TargetType.Each:
396
+ return identifier(expr.target.alias).raw(".value");
397
+ default:
398
+ throw new Error(`Cannot select from ${expr.target.type}`);
399
+ }
400
+ case ExprType.Merge:
401
+ return call(
402
+ "json_patch",
403
+ this.formatExpr(expr.a, { ...ctx, formatAsJson: true }),
404
+ this.formatExpr(expr.b, { ...ctx, formatAsJson: true })
405
+ );
406
+ case ExprType.Record:
407
+ return call(
408
+ "json_object",
409
+ ...Object.entries(expr.fields).map(([key, value2]) => {
410
+ return this.formatString(key).raw(",").newline().concat(this.formatExpr(value2, { ...ctx, formatAsJson: true }));
411
+ })
412
+ );
413
+ case ExprType.Filter: {
414
+ const { target, condition } = expr;
415
+ switch (target.type) {
416
+ case TargetType.Each:
417
+ return parenthesis(
418
+ raw("select json_group_array(json(result)) from").addParenthesis(
419
+ raw("select value as result").add("from").addCall(
420
+ "json_each",
421
+ this.formatExpr(target.expr, { ...ctx, formatAsJson: true })
422
+ ).add("as").addIdentifier(target.alias).add("where").add(this.formatExprValue(condition, ctx))
423
+ )
424
+ );
425
+ default:
426
+ throw new Error("todo");
427
+ }
428
+ }
429
+ case ExprType.Map: {
430
+ const { target, result } = expr;
431
+ switch (target.type) {
432
+ case TargetType.Each:
433
+ return parenthesis(
434
+ raw("select json_group_array(json(result)) from").addParenthesis(
435
+ raw("select").add(this.formatExpr(result, { ...ctx, formatAsJson: true })).add("as").addIdentifier("result").add("from").addCall(
436
+ "json_each",
437
+ this.formatExpr(target.expr, { ...ctx, formatAsJson: true })
438
+ ).add("as").addIdentifier(target.alias)
439
+ )
440
+ );
441
+ default:
442
+ throw new Error("todo");
443
+ }
444
+ }
445
+ default:
446
+ console.log(expr);
447
+ throw new Error("todo");
448
+ }
449
+ }
450
+ };
451
+ export {
452
+ Formatter
453
+ };
@@ -0,0 +1,8 @@
1
+ import { EV, Expr } from './Expr';
2
+ export declare const Functions: Functions;
3
+ /** These will have to be supported in every driver */
4
+ export type Functions = {
5
+ arrayLength(x: EV<Array<any>>): Expr<number>;
6
+ count(x?: Expr<any>): Expr<number>;
7
+ iif<T>(x: EV<boolean>, y: EV<T>, z: EV<T>): Expr<T>;
8
+ };
@@ -0,0 +1,11 @@
1
+ // src/Functions.ts
2
+ import { Expr, ExprData } from "./Expr";
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/Key.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { ExprData } from './Expr';
2
+ export interface Key {
3
+ name: string;
4
+ on: Array<ExprData>;
5
+ }
package/dist/Ops.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { Cursor } from './Cursor';
2
+ import { Table } from './Table';
3
+ export declare function selectAll<Row>(table: Table<Row>): Cursor.SelectMultiple<Row>;
4
+ export declare function selectFirst<Row>(table: Table<Row>): Cursor.SelectSingle<Row>;
5
+ export declare function update<Row>(table: Table<Row>): Cursor.Update<Row>;
6
+ export declare function insertInto<Row>(table: Table<Row>): Cursor.Insert<Row>;
7
+ export declare function deleteFrom<Row>(table: Table<Row>): Cursor.Delete<Row>;
8
+ export declare function create(...tables: Array<Table<any>>): Cursor.Batch;
package/dist/Ops.js ADDED
@@ -0,0 +1,46 @@
1
+ // src/Ops.ts
2
+ import { Cursor } from "./Cursor";
3
+ import { ExprData } from "./Expr";
4
+ import { Query } from "./Query";
5
+ import { Target } from "./Target";
6
+ function selectAll(table) {
7
+ return new Cursor.SelectMultiple(
8
+ Query.Select({
9
+ from: Target.Table(table.data()),
10
+ selection: ExprData.Row(Target.Table(table.data()))
11
+ })
12
+ );
13
+ }
14
+ function selectFirst(table) {
15
+ return new Cursor.SelectSingle(
16
+ Query.Select({
17
+ from: Target.Table(table.data()),
18
+ selection: ExprData.Row(Target.Table(table.data())),
19
+ singleResult: true
20
+ })
21
+ );
22
+ }
23
+ function update(table) {
24
+ return new Cursor.Update(Query.Update({ table: table.data() }));
25
+ }
26
+ function insertInto(table) {
27
+ return new Cursor.Insert(table.data());
28
+ }
29
+ function deleteFrom(table) {
30
+ return new Cursor.Delete(Query.Delete({ table: table.data() }));
31
+ }
32
+ function create(...tables) {
33
+ return new Cursor.Batch(
34
+ tables.map(
35
+ (table) => Query.CreateTable({ table: table.data(), ifNotExists: true })
36
+ )
37
+ );
38
+ }
39
+ export {
40
+ create,
41
+ deleteFrom,
42
+ insertInto,
43
+ selectAll,
44
+ selectFirst,
45
+ update
46
+ };
@@ -0,0 +1,9 @@
1
+ import { ExprData } from './Expr';
2
+ export declare const enum OrderDirection {
3
+ Asc = "Asc",
4
+ Desc = "Desc"
5
+ }
6
+ export type OrderBy = {
7
+ expr: ExprData;
8
+ order: OrderDirection;
9
+ };
@@ -0,0 +1,9 @@
1
+ // src/OrderBy.ts
2
+ var OrderDirection = /* @__PURE__ */ ((OrderDirection2) => {
3
+ OrderDirection2["Asc"] = "Asc";
4
+ OrderDirection2["Desc"] = "Desc";
5
+ return OrderDirection2;
6
+ })(OrderDirection || {});
7
+ export {
8
+ OrderDirection
9
+ };
@@ -0,0 +1,15 @@
1
+ export declare const enum ParamType {
2
+ Value = "Value",
3
+ Named = "Named"
4
+ }
5
+ export type ParamData = {
6
+ type: ParamType.Value;
7
+ value: any;
8
+ } | {
9
+ type: ParamType.Named;
10
+ name: string;
11
+ };
12
+ export declare const ParamData: {
13
+ Value(value: any): ParamData;
14
+ Named(name: string): ParamData;
15
+ };
package/dist/Param.js ADDED
@@ -0,0 +1,18 @@
1
+ // src/Param.ts
2
+ var ParamType = /* @__PURE__ */ ((ParamType2) => {
3
+ ParamType2["Value"] = "Value";
4
+ ParamType2["Named"] = "Named";
5
+ return ParamType2;
6
+ })(ParamType || {});
7
+ var ParamData = {
8
+ Value(value) {
9
+ return { type: "Value" /* Value */, value };
10
+ },
11
+ Named(name) {
12
+ return { type: "Named" /* Named */, name };
13
+ }
14
+ };
15
+ export {
16
+ ParamData,
17
+ ParamType
18
+ };
@@ -0,0 +1,94 @@
1
+ import { ColumnData } from './Column';
2
+ import { ExprData } from './Expr';
3
+ import { Key } from './Key';
4
+ import { OrderBy } from './OrderBy';
5
+ import { Schema } from './Schema';
6
+ import { Target } from './Target';
7
+ export declare const enum QueryType {
8
+ Insert = "Insert",
9
+ Select = "Select",
10
+ Update = "Update",
11
+ Delete = "Delete",
12
+ CreateTable = "CreateTable",
13
+ AlterTable = "AlterTable",
14
+ Batch = "Batch",
15
+ Transaction = "Transaction",
16
+ Raw = "Raw"
17
+ }
18
+ export type Query<T = any> = Query.Insert | Query.Select | Query.Update | Query.Delete | Query.CreateTable | Query.AlterTable | Query.Batch | Query.Transaction | Query.Raw;
19
+ export declare namespace Query {
20
+ interface QueryBase {
21
+ limit?: number;
22
+ offset?: number;
23
+ type: QueryType;
24
+ where?: ExprData;
25
+ orderBy?: Array<OrderBy>;
26
+ groupBy?: Array<ExprData>;
27
+ having?: ExprData;
28
+ selection?: ExprData;
29
+ singleResult?: boolean;
30
+ }
31
+ interface Insert extends QueryBase {
32
+ type: QueryType.Insert;
33
+ into: Schema;
34
+ data: Array<any>;
35
+ }
36
+ function Insert(insert: Omit<Insert, 'type'>): Query.Insert;
37
+ interface Select extends QueryBase {
38
+ type: QueryType.Select;
39
+ selection: ExprData;
40
+ from: Target;
41
+ }
42
+ function Select(select: Omit<Select, 'type'>): Query.Select;
43
+ interface Update extends QueryBase {
44
+ type: QueryType.Update;
45
+ table: Schema;
46
+ set?: Record<string, any>;
47
+ }
48
+ function Update(update: Omit<Update, 'type'>): Query.Update;
49
+ interface Delete extends QueryBase {
50
+ type: QueryType.Delete;
51
+ table: Schema;
52
+ }
53
+ function Delete(del: Omit<Delete, 'type'>): Query.Delete;
54
+ interface CreateTable extends QueryBase {
55
+ type: QueryType.CreateTable;
56
+ table: Schema;
57
+ ifNotExists?: boolean;
58
+ }
59
+ function CreateTable(create: Omit<CreateTable, 'type'>): Query.CreateTable;
60
+ interface Batch extends QueryBase {
61
+ type: QueryType.Batch;
62
+ queries: Array<Query<any>>;
63
+ }
64
+ function Batch(batch: Omit<Batch, 'type'>): Query.Batch;
65
+ enum TransactionOperation {
66
+ Begin = "Begin",
67
+ Commit = "Commit",
68
+ Rollback = "Rollback"
69
+ }
70
+ interface Transaction extends QueryBase {
71
+ type: QueryType.Transaction;
72
+ id: string;
73
+ op: TransactionOperation;
74
+ }
75
+ function Transaction(transaction: Omit<Transaction, 'type'>): Query.Transaction;
76
+ type RawReturn = 'row' | 'rows' | undefined;
77
+ interface Raw extends QueryBase {
78
+ type: QueryType.Raw;
79
+ expectedReturn?: 'row' | 'rows';
80
+ strings: ReadonlyArray<string>;
81
+ params: Array<any>;
82
+ }
83
+ function Raw(raw: Omit<Raw, 'type'>): Query.Raw;
84
+ interface AlterTable extends QueryBase {
85
+ type: QueryType.AlterTable;
86
+ table: Schema;
87
+ alterColumn?: [to: ColumnData, from: ColumnData | undefined];
88
+ addColumn?: ColumnData;
89
+ dropColumn?: ColumnData;
90
+ addKey?: Key;
91
+ dropKey?: Key;
92
+ }
93
+ function AlterTable(alter: Omit<AlterTable, 'type'>): Query.AlterTable;
94
+ }