rado 0.1.34 → 0.1.36

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.
@@ -1,3 +1,4 @@
1
+ import { Driver } from './Driver';
1
2
  import { EV, Expr } from './Expr';
2
3
  import { OrderBy } from './OrderBy';
3
4
  import { Query } from './Query';
@@ -10,26 +11,27 @@ export declare class Cursor<T> {
10
11
  constructor(query: Query<T>);
11
12
  static all(strings: TemplateStringsArray, ...params: Array<any>): Cursor<any>;
12
13
  query(): Query<T>;
14
+ run(driver: Driver.Sync): T;
15
+ run(driver: Driver.Async): Promise<T>;
13
16
  toJSON(): Query<T>;
14
17
  }
15
18
  export declare namespace Cursor {
16
- class Limitable<T> extends Cursor<T> {
17
- take(limit: number | undefined): Limitable<T>;
18
- skip(offset: number | undefined): Limitable<T>;
19
- }
20
- class Filterable<T> extends Limitable<T> {
21
- where(...where: Array<EV<boolean>>): Filterable<T>;
22
- }
23
- class Delete extends Filterable<{
19
+ class Delete extends Cursor<{
24
20
  rowsAffected: number;
25
21
  }> {
26
22
  query(): Query.Delete;
23
+ where(...where: Array<EV<boolean>>): Delete;
24
+ take(limit: number | undefined): Delete;
25
+ skip(offset: number | undefined): Delete;
27
26
  }
28
- class Update<T> extends Filterable<{
27
+ class Update<T> extends Cursor<{
29
28
  rowsAffected: number;
30
29
  }> {
31
30
  query: () => Query.Update;
32
31
  set(set: UpdateSet<T>): Update<T>;
32
+ where(...where: Array<EV<boolean>>): Update<T>;
33
+ take(limit: number | undefined): Update<T>;
34
+ skip(offset: number | undefined): Update<T>;
33
35
  }
34
36
  class InsertValuesReturning<T> extends Cursor<T> {
35
37
  }
@@ -44,7 +46,7 @@ export declare namespace Cursor {
44
46
  constructor(into: Schema);
45
47
  values(...data: Array<Table.Insert<T>>): InsertValues;
46
48
  }
47
- class Create extends Cursor<void> {
49
+ class CreateTable extends Cursor<void> {
48
50
  protected table: Schema;
49
51
  constructor(table: Schema);
50
52
  }
@@ -52,7 +54,7 @@ export declare namespace Cursor {
52
54
  protected queries: Array<Query>;
53
55
  constructor(queries: Array<Query>);
54
56
  }
55
- class SelectMultiple<T> extends Filterable<Array<T>> {
57
+ class SelectMultiple<T> extends Cursor<Array<T>> {
56
58
  query(): Query.Select;
57
59
  leftJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectMultiple<T>;
58
60
  innerJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectMultiple<T>;
@@ -63,9 +65,11 @@ export declare namespace Cursor {
63
65
  first(): SelectSingle<T | undefined>;
64
66
  sure(): SelectSingle<T>;
65
67
  where(...where: Array<EV<boolean>>): SelectMultiple<T>;
68
+ take(limit: number | undefined): SelectMultiple<T>;
69
+ skip(offset: number | undefined): SelectMultiple<T>;
66
70
  toExpr(): Expr<T>;
67
71
  }
68
- class SelectSingle<T> extends Filterable<T> {
72
+ class SelectSingle<T> extends Cursor<T> {
69
73
  query(): Query.Select;
70
74
  leftJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectSingle<T>;
71
75
  innerJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectSingle<T>;
@@ -73,6 +77,8 @@ export declare namespace Cursor {
73
77
  orderBy(...orderBy: Array<OrderBy>): SelectSingle<T>;
74
78
  groupBy(...groupBy: Array<Expr<any>>): SelectSingle<T>;
75
79
  where(...where: Array<EV<boolean>>): SelectSingle<T>;
80
+ take(limit: number | undefined): SelectSingle<T>;
81
+ skip(offset: number | undefined): SelectSingle<T>;
76
82
  all(): SelectMultiple<T>;
77
83
  toExpr(): Expr<T>;
78
84
  }
@@ -21,41 +21,51 @@ var Cursor = class {
21
21
  query() {
22
22
  throw new Error("Not implemented");
23
23
  }
24
+ run(driver) {
25
+ return driver.executeQuery(this.query());
26
+ }
24
27
  toJSON() {
25
28
  return this.query();
26
29
  }
27
30
  };
31
+ function addWhere(query, where) {
32
+ const conditions = where.slice();
33
+ if (query.where)
34
+ conditions.push(query.where);
35
+ return {
36
+ ...query,
37
+ where: Expr.and(...conditions).expr
38
+ };
39
+ }
28
40
  ((Cursor2) => {
29
- class Limitable extends Cursor2 {
30
- take(limit) {
31
- return new Limitable({ ...this.query(), limit });
32
- }
33
- skip(offset) {
34
- return new Limitable({ ...this.query(), offset });
41
+ class Delete extends Cursor2 {
42
+ query() {
43
+ return super.query();
35
44
  }
36
- }
37
- Cursor2.Limitable = Limitable;
38
- class Filterable extends Limitable {
39
45
  where(...where) {
40
- const condition = Expr.and(...where);
41
- const query = this.query();
42
- return new Filterable({
43
- ...query,
44
- where: (query.where ? condition.and(new Expr(query.where)) : condition).expr
45
- });
46
+ return new Delete(addWhere(this.query(), where));
46
47
  }
47
- }
48
- Cursor2.Filterable = Filterable;
49
- class Delete extends Filterable {
50
- query() {
51
- return super.query();
48
+ take(limit) {
49
+ return new Delete({ ...this.query(), limit });
50
+ }
51
+ skip(offset) {
52
+ return new Delete({ ...this.query(), offset });
52
53
  }
53
54
  }
54
55
  Cursor2.Delete = Delete;
55
- class Update extends Filterable {
56
+ class Update extends Cursor2 {
56
57
  set(set) {
57
58
  return new Update({ ...this.query(), set });
58
59
  }
60
+ where(...where) {
61
+ return new Update(addWhere(this.query(), where));
62
+ }
63
+ take(limit) {
64
+ return new Update({ ...this.query(), limit });
65
+ }
66
+ skip(offset) {
67
+ return new Update({ ...this.query(), offset });
68
+ }
59
69
  }
60
70
  Cursor2.Update = Update;
61
71
  class InsertValuesReturning extends Cursor2 {
@@ -81,13 +91,13 @@ var Cursor = class {
81
91
  }
82
92
  }
83
93
  Cursor2.Insert = Insert;
84
- class Create extends Cursor2 {
94
+ class CreateTable extends Cursor2 {
85
95
  constructor(table) {
86
96
  super(Schema.create(table));
87
97
  this.table = table;
88
98
  }
89
99
  }
90
- Cursor2.Create = Create;
100
+ Cursor2.CreateTable = CreateTable;
91
101
  class Batch extends Cursor2 {
92
102
  constructor(queries) {
93
103
  super(Query.Batch({ queries }));
@@ -95,7 +105,7 @@ var Cursor = class {
95
105
  }
96
106
  }
97
107
  Cursor2.Batch = Batch;
98
- class SelectMultiple extends Filterable {
108
+ class SelectMultiple extends Cursor2 {
99
109
  query() {
100
110
  return super.query();
101
111
  }
@@ -161,14 +171,20 @@ var Cursor = class {
161
171
  });
162
172
  }
163
173
  where(...where) {
164
- return new SelectMultiple(super.where(...where).query());
174
+ return new SelectMultiple(addWhere(this.query(), where));
175
+ }
176
+ take(limit) {
177
+ return new SelectMultiple({ ...this.query(), limit });
178
+ }
179
+ skip(offset) {
180
+ return new SelectMultiple({ ...this.query(), offset });
165
181
  }
166
182
  toExpr() {
167
183
  return new Expr(ExprData.Query(this.query()));
168
184
  }
169
185
  }
170
186
  Cursor2.SelectMultiple = SelectMultiple;
171
- class SelectSingle extends Filterable {
187
+ class SelectSingle extends Cursor2 {
172
188
  query() {
173
189
  return super.query();
174
190
  }
@@ -215,7 +231,13 @@ var Cursor = class {
215
231
  });
216
232
  }
217
233
  where(...where) {
218
- return new SelectSingle(super.where(...where).query());
234
+ return new SelectSingle(addWhere(this.query(), where));
235
+ }
236
+ take(limit) {
237
+ return new SelectSingle({ ...this.query(), limit });
238
+ }
239
+ skip(offset) {
240
+ return new SelectSingle({ ...this.query(), offset });
219
241
  }
220
242
  all() {
221
243
  return new SelectMultiple({ ...this.query(), singleResult: false });
@@ -90,6 +90,7 @@ interface AsyncPreparedStatement {
90
90
  get<T>(params?: Array<any>): Promise<T>;
91
91
  execute(params?: Array<any>): Promise<void>;
92
92
  }
93
+ export type Driver = SyncDriver | AsyncDriver;
93
94
  export declare namespace Driver {
94
95
  type Sync = SyncDriver;
95
96
  const Sync: typeof SyncDriver;
package/dist/lib/Expr.js CHANGED
@@ -242,7 +242,7 @@ var _Expr = class {
242
242
  }
243
243
  filter(fn) {
244
244
  const alias = `__${Math.random().toString(36).slice(2, 9)}`;
245
- const target = Target.Each(this.expr, alias);
245
+ const target = Target.Expr(this.expr, alias);
246
246
  return new _Expr(
247
247
  ExprData.Filter(
248
248
  target,
@@ -252,7 +252,7 @@ var _Expr = class {
252
252
  }
253
253
  map(fn) {
254
254
  const alias = `__${Math.random().toString(36).slice(2, 9)}`;
255
- const target = Target.Each(this.expr, alias);
255
+ const target = Target.Expr(this.expr, alias);
256
256
  return new _Expr(
257
257
  ExprData.Map(
258
258
  target,
@@ -316,7 +316,7 @@ var Formatter = class {
316
316
  case TargetType.Table:
317
317
  stmt.identifier(target.table.name);
318
318
  if (target.table.alias)
319
- stmt.add("AS").addIdentifier(target.table.alias);
319
+ stmt.raw("AS").addIdentifier(target.table.alias);
320
320
  return stmt;
321
321
  case TargetType.Join:
322
322
  const { left, right, joinType } = target;
@@ -326,8 +326,15 @@ var Formatter = class {
326
326
  stmt.add("ON");
327
327
  this.formatExprValue(ctx, target.on);
328
328
  return stmt;
329
- default:
330
- throw new Error(`Cannot format target of type ${target.type}`);
329
+ case TargetType.Query:
330
+ stmt.openParenthesis();
331
+ this.format(ctx, target.query);
332
+ stmt.closeParenthesis();
333
+ if (target.alias)
334
+ stmt.raw("AS").addIdentifier(target.alias);
335
+ return stmt;
336
+ case TargetType.Expr:
337
+ throw new Error("Cannot format expression as target");
331
338
  }
332
339
  }
333
340
  formatWhere(ctx, expr) {
@@ -541,10 +548,10 @@ var Formatter = class {
541
548
  stmt.raw("exists").space();
542
549
  return this.formatExprValue(ctx, expr.params[0]);
543
550
  } else {
544
- stmt.addIdentifier(expr.method).openParenthesis();
545
- for (const param of stmt.separate(expr.params))
551
+ stmt.identifier(expr.method);
552
+ for (const param of stmt.call(expr.params))
546
553
  this.formatExprValue(ctx, param);
547
- return stmt.closeParenthesis();
554
+ return stmt;
548
555
  }
549
556
  }
550
557
  case ExprType.Query:
@@ -578,7 +585,8 @@ var Formatter = class {
578
585
  )
579
586
  )
580
587
  );
581
- case TargetType.Each:
588
+ case TargetType.Query:
589
+ case TargetType.Expr:
582
590
  return stmt.identifier(expr.target.alias).raw(".value");
583
591
  default:
584
592
  throw new Error(`Cannot select from ${expr.target.type}`);
@@ -599,10 +607,13 @@ var Formatter = class {
599
607
  case ExprType.Filter: {
600
608
  const { target, condition } = expr;
601
609
  switch (target.type) {
602
- case TargetType.Each:
610
+ case TargetType.Expr:
603
611
  stmt.openParenthesis().raw("SELECT json_group_array(json(result)) FROM ").openParenthesis().raw("SELECT value AS result").add("FROM json_each").openParenthesis();
604
- this.formatExpr(ctx, target.expr);
605
- stmt.closeParenthesis().add("AS").addIdentifier(target.alias).add("WHERE").space();
612
+ this.formatExprJson(ctx, target.expr);
613
+ stmt.closeParenthesis();
614
+ if (target.alias)
615
+ stmt.add("AS").addIdentifier(target.alias);
616
+ stmt.add("WHERE").space();
606
617
  this.formatExprValue(ctx, condition);
607
618
  return stmt.closeParenthesis().closeParenthesis();
608
619
  default:
@@ -612,11 +623,14 @@ var Formatter = class {
612
623
  case ExprType.Map: {
613
624
  const { target, result } = expr;
614
625
  switch (target.type) {
615
- case TargetType.Each:
626
+ case TargetType.Expr:
616
627
  stmt.openParenthesis().raw("SELECT json_group_array(json(result)) FROM ").openParenthesis().raw("SELECT").space();
617
628
  this.formatExprJson(ctx, result).add("AS result").add("FROM json_each").openParenthesis();
618
629
  this.formatExprJson(ctx, target.expr);
619
- return stmt.closeParenthesis().add("AS").addIdentifier(target.alias).closeParenthesis().closeParenthesis();
630
+ stmt.closeParenthesis();
631
+ if (target.alias)
632
+ stmt.add("AS").addIdentifier(target.alias);
633
+ return stmt.closeParenthesis().closeParenthesis();
620
634
  default:
621
635
  throw new Error("todo");
622
636
  }
package/dist/lib/Ops.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { Cursor } from './Cursor';
2
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>;
3
+ export declare function from<Row>(source: Table<Row> | Cursor.SelectMultiple<Row>): Cursor.SelectMultiple<Row>;
5
4
  export declare function update<Row>(table: Table<Row>): Cursor.Update<Row>;
6
5
  export declare function insertInto<Row>(table: Table<Row>): Cursor.Insert<Row>;
7
6
  export declare function deleteFrom<Row>(table: Table<Row>): Cursor.Delete;
package/dist/lib/Ops.js CHANGED
@@ -4,20 +4,12 @@ import { ExprData } from "./Expr.js";
4
4
  import { Query } from "./Query.js";
5
5
  import { Schema } from "./Schema.js";
6
6
  import { Target } from "./Target.js";
7
- function selectAll(table) {
7
+ function from(source) {
8
+ const target = "schema" in source ? Target.Table(source.schema()) : Target.Query(source.query());
8
9
  return new Cursor.SelectMultiple(
9
10
  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
11
+ from: target,
12
+ selection: ExprData.Row(target)
21
13
  })
22
14
  );
23
15
  }
@@ -38,8 +30,7 @@ function create(...tables) {
38
30
  export {
39
31
  create,
40
32
  deleteFrom,
33
+ from,
41
34
  insertInto,
42
- selectAll,
43
- selectFirst,
44
35
  update
45
36
  };
@@ -43,7 +43,7 @@ export declare class Statement {
43
43
  raw(query: string): this;
44
44
  openParenthesis(): this;
45
45
  closeParenthesis(): this;
46
- call<T>(parts: Array<T>, separator?: string): Generator<T, void, unknown>;
46
+ call<T>(parts: Array<T>, separator?: string): Generator<T, this | undefined, unknown>;
47
47
  separate<T>(parts: Array<T>, separator?: string): Generator<T, void, unknown>;
48
48
  isEmpty(): boolean;
49
49
  compile(sanitizer: Sanitizer, formatInline?: boolean): CompiledStatement;
@@ -99,6 +99,8 @@ var Statement = class {
99
99
  return this.dedent().newline().raw(")");
100
100
  }
101
101
  *call(parts, separator = SEPARATE) {
102
+ if (parts.length === 0)
103
+ return this.raw("()");
102
104
  this.openParenthesis();
103
105
  yield* this.separate(parts, separator);
104
106
  this.closeParenthesis();
@@ -16,7 +16,7 @@ export declare class Table<T> extends Cursor.SelectMultiple<Table.Normalize<T>>
16
16
  insertAll(data: Array<Table.Insert<T>>): Cursor.InsertValues;
17
17
  set(data: Update<Table.Normalize<T>>): Cursor.Update<Table.Normalize<T>>;
18
18
  delete(): Cursor.Delete;
19
- createTable(): Cursor.Create;
19
+ createTable(): Cursor.CreateTable;
20
20
  as(alias: string): this;
21
21
  alias(): Record<string, this>;
22
22
  get(name: string): Expr<any>;
package/dist/lib/Table.js CHANGED
@@ -59,7 +59,7 @@ var Table = class extends Cursor.SelectMultiple {
59
59
  return new Cursor.Delete(Query.Delete({ table: this.schema() }));
60
60
  }
61
61
  createTable() {
62
- return new Cursor.Create(this.schema());
62
+ return new Cursor.CreateTable(this.schema());
63
63
  }
64
64
  as(alias) {
65
65
  return new Table({ ...this.schema(), alias });
@@ -1,18 +1,26 @@
1
1
  import { ExprData } from './Expr';
2
+ import { Query as QueryData } from './Query';
2
3
  import { Schema } from './Schema';
3
4
  export declare enum TargetType {
4
- Each = "Each",
5
+ Expr = "Expr",
6
+ Query = "Query",
5
7
  Table = "Table",
6
8
  Join = "Join"
7
9
  }
8
- export type Target = Target.Each | Target.Table | Target.Join;
10
+ export type Target = Target.Expr | Target.Query | Target.Table | Target.Join;
9
11
  export declare namespace Target {
10
- interface Each {
11
- type: TargetType.Each;
12
+ interface Expr {
13
+ type: TargetType.Expr;
12
14
  expr: ExprData;
13
- alias: string;
15
+ alias?: string;
14
16
  }
15
- function Each(expr: ExprData, alias: string): Each;
17
+ function Expr(expr: ExprData, alias?: string): Expr;
18
+ interface Query {
19
+ type: TargetType.Query;
20
+ query: QueryData;
21
+ alias?: string;
22
+ }
23
+ function Query(query: QueryData, alias?: string): Query;
16
24
  interface Table {
17
25
  type: TargetType.Table;
18
26
  table: Schema;
@@ -1,16 +1,21 @@
1
1
  // src/lib/Target.ts
2
2
  var TargetType = /* @__PURE__ */ ((TargetType2) => {
3
- TargetType2["Each"] = "Each";
3
+ TargetType2["Expr"] = "Expr";
4
+ TargetType2["Query"] = "Query";
4
5
  TargetType2["Table"] = "Table";
5
6
  TargetType2["Join"] = "Join";
6
7
  return TargetType2;
7
8
  })(TargetType || {});
8
9
  var Target;
9
10
  ((Target2) => {
10
- function Each(expr, alias) {
11
- return { type: "Each" /* Each */, expr, alias };
11
+ function Expr(expr, alias) {
12
+ return { type: "Expr" /* Expr */, expr, alias };
12
13
  }
13
- Target2.Each = Each;
14
+ Target2.Expr = Expr;
15
+ function Query(query, alias) {
16
+ return { type: "Query" /* Query */, query, alias };
17
+ }
18
+ Target2.Query = Query;
14
19
  function Table(table) {
15
20
  return { type: "Table" /* Table */, table };
16
21
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rado",
3
- "version": "0.1.34",
3
+ "version": "0.1.36",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {