rado 0.3.2 → 0.3.4

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 (101) hide show
  1. package/README.md +2 -0
  2. package/dist/define/CTE.d.ts +2 -0
  3. package/dist/define/CTE.js +51 -0
  4. package/dist/define/Cursor.d.ts +65 -42
  5. package/dist/define/Cursor.js +170 -88
  6. package/dist/define/Expr.d.ts +2 -2
  7. package/dist/define/Expr.js +4 -1
  8. package/dist/define/Ops.d.ts +1 -6
  9. package/dist/define/Ops.js +10 -7
  10. package/dist/define/Query.d.ts +117 -2
  11. package/dist/define/Query.js +472 -17
  12. package/dist/define/Selection.d.ts +1 -1
  13. package/dist/define/Table.d.ts +6 -3
  14. package/dist/define/Table.js +6 -1
  15. package/dist/define/VirtualTable.d.ts +1 -1
  16. package/dist/define/query/Delete.d.ts +0 -2
  17. package/dist/define/query/Delete.js +0 -3
  18. package/dist/define/query/Select.d.ts +0 -2
  19. package/dist/define/query/Select.js +1 -14
  20. package/dist/deno/driver/better-sqlite3.js +57 -0
  21. package/dist/deno/driver/bun-sqlite.js +69 -0
  22. package/dist/deno/driver/sql.js.js +72 -0
  23. package/dist/deno/driver/sqlite3.js +123 -0
  24. package/dist/deno/index.js +14 -0
  25. package/dist/deno/lib/Driver.js +330 -0
  26. package/dist/deno/lib/Formatter.js +715 -0
  27. package/dist/deno/lib/SqlError.js +11 -0
  28. package/dist/deno/lib/Statement.js +108 -0
  29. package/dist/deno/sqlite/SqliteFormatter.js +70 -0
  30. package/dist/deno/sqlite/SqliteFunctions.js +150 -0
  31. package/dist/deno/sqlite/SqliteSchema.js +47 -0
  32. package/dist/deno/sqlite.js +3 -0
  33. package/dist/deno/util/Callable.js +15 -0
  34. package/dist/driver/bun-sqlite.js +1 -2
  35. package/dist/index.d.ts +0 -8
  36. package/dist/index.js +0 -8
  37. package/dist/lib/Driver.d.ts +1 -2
  38. package/dist/lib/Formatter.js +17 -3
  39. package/dist/sqlite/index.d.ts +2 -0
  40. package/dist/sqlite/index.js +3 -0
  41. package/dist/src/driver/better-sqlite3.js +49 -0
  42. package/dist/src/driver/sql.js.js +66 -0
  43. package/dist/src/driver/sqlite3.js +87 -0
  44. package/dist/src/index.js +24 -0
  45. package/dist/{lib → src/lib}/Column.js +1 -6
  46. package/dist/{lib → src/lib}/Cursor.js +25 -50
  47. package/dist/src/lib/Driver.js +316 -0
  48. package/dist/{lib → src/lib}/Expr.js +4 -4
  49. package/dist/src/lib/Formatter.js +625 -0
  50. package/dist/{lib → src/lib}/Ops.js +14 -5
  51. package/dist/src/lib/Sanitizer.js +0 -0
  52. package/dist/src/lib/Statement.js +103 -0
  53. package/dist/{lib → src/lib}/Table.js +1 -1
  54. package/dist/{lib → src/lib}/Target.js +4 -9
  55. package/dist/src/lib/Update.js +0 -0
  56. package/dist/src/sqlite/SqliteFormatter.js +67 -0
  57. package/dist/src/sqlite/SqliteFunctions.js +146 -0
  58. package/dist/src/sqlite/SqliteSchema.js +47 -0
  59. package/dist/src/sqlite.js +3 -0
  60. package/dist/test/DbSuite.js +28 -0
  61. package/dist/test/TSTestTypes.js +6 -0
  62. package/dist/test/TestBasic.js +172 -0
  63. package/dist/test/TestExtend.js +68 -0
  64. package/dist/test/TestFts5.js +34 -0
  65. package/dist/test/TestFunctions.js +28 -0
  66. package/dist/test/TestJoins.js +34 -0
  67. package/dist/test/TestJson.js +33 -0
  68. package/dist/test/TestPrepare.js +27 -0
  69. package/dist/test/TestRawSql.js +31 -0
  70. package/dist/test/TestSchema.js +69 -0
  71. package/dist/test/TestSubQueries.js +79 -0
  72. package/dist/test/TestTransaction.js +54 -0
  73. package/dist/test/TestUpdate.js +95 -0
  74. package/dist/test/index.js +14 -0
  75. package/package.json +1 -1
  76. package/dist/lib/Column.d.ts +0 -57
  77. package/dist/lib/Cursor.d.ts +0 -85
  78. package/dist/lib/Expr.d.ts +0 -154
  79. package/dist/lib/Fields.d.ts +0 -13
  80. package/dist/lib/Functions.d.ts +0 -5
  81. package/dist/lib/Id.d.ts +0 -3
  82. package/dist/lib/Index.d.ts +0 -17
  83. package/dist/lib/Ops.d.ts +0 -7
  84. package/dist/lib/OrderBy.d.ts +0 -9
  85. package/dist/lib/Param.d.ts +0 -20
  86. package/dist/lib/Query.d.ts +0 -109
  87. package/dist/lib/Schema.d.ts +0 -18
  88. package/dist/lib/Selection.d.ts +0 -20
  89. package/dist/lib/Table.d.ts +0 -62
  90. package/dist/lib/Target.d.ts +0 -38
  91. package/dist/lib/Update.d.ts +0 -4
  92. /package/dist/{lib/Fields.js → deno/lib/Sanitizer.js} +0 -0
  93. /package/dist/{lib/Id.js → src/lib/Fields.js} +0 -0
  94. /package/dist/{lib → src/lib}/Functions.js +0 -0
  95. /package/dist/{lib/Update.js → src/lib/Id.js} +0 -0
  96. /package/dist/{lib → src/lib}/Index.js +0 -0
  97. /package/dist/{lib → src/lib}/OrderBy.js +0 -0
  98. /package/dist/{lib → src/lib}/Param.js +0 -0
  99. /package/dist/{lib → src/lib}/Query.js +0 -0
  100. /package/dist/{lib → src/lib}/Schema.js +0 -0
  101. /package/dist/{lib → src/lib}/Selection.js +0 -0
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![npm](https://img.shields.io/npm/v/rado.svg)](https://npmjs.org/package/rado)
2
+
1
3
  # rado
2
4
 
3
5
  Fully typed, lightweight TypeScript query builder.
@@ -0,0 +1,2 @@
1
+ import { Query, QueryData } from './Query';
2
+ export declare function makeRecursiveUnion<T extends Query<any>>(initial: QueryData.Select, createUnion: (target: any) => T, operator: QueryData.UnionOperation): QueryData.Select;
@@ -0,0 +1,51 @@
1
+ // src/define/CTE.ts
2
+ import { Expr, ExprData, ExprType } from "./Expr.js";
3
+ import { Query, QueryData } from "./Query.js";
4
+ import { virtualTable } from "./Table.js";
5
+ import { Target, TargetType } from "./Target.js";
6
+ var { keys, create, fromEntries } = Object;
7
+ function columnsOf(expr) {
8
+ switch (expr.type) {
9
+ case ExprType.Record:
10
+ return keys(expr.fields);
11
+ case ExprType.Row:
12
+ switch (expr.target.type) {
13
+ case TargetType.Table:
14
+ return keys(expr.target.table.columns);
15
+ default:
16
+ throw new Error("Could not retrieve CTE columns");
17
+ }
18
+ default:
19
+ throw new Error("Could not retrieve CTE columns");
20
+ }
21
+ }
22
+ function makeRecursiveUnion(initial, createUnion, operator) {
23
+ let name;
24
+ const alias = new Proxy(create(null), {
25
+ get(_, key) {
26
+ name = key;
27
+ return virtualTable(name);
28
+ }
29
+ });
30
+ const right = createUnion(alias)[Query.Data];
31
+ if (!name)
32
+ throw new TypeError("No CTE name provided");
33
+ const cte = alias[name];
34
+ const cols = columnsOf(initial.selection);
35
+ const selection = new ExprData.Record(
36
+ fromEntries(cols.map((col) => [col, cte[col][Expr.Data]]))
37
+ );
38
+ const union = new QueryData.Union({
39
+ a: initial,
40
+ operator,
41
+ b: right
42
+ });
43
+ const from = new Target.CTE(name, union);
44
+ return new QueryData.Select({
45
+ selection,
46
+ from
47
+ });
48
+ }
49
+ export {
50
+ makeRecursiveUnion
51
+ };
@@ -1,18 +1,21 @@
1
1
  import { Driver } from '../lib/Driver';
2
+ import { CompileOptions } from '../lib/Formatter';
2
3
  import { EV, Expr } from './Expr';
3
4
  import { OrderBy } from './OrderBy';
4
5
  import { Query } from './Query';
5
- import { Schema } from './Schema';
6
6
  import { Selection } from './Selection';
7
- import { Table } from './Table';
8
- import { Update as UpdateSet } from './Update';
7
+ import { Table, TableData } from './Table';
8
+ declare const QUERY: unique symbol;
9
9
  export declare class Cursor<T> {
10
- [Selection.__cursorType](): T;
10
+ [Selection.CursorType]: () => T;
11
+ [QUERY]: Query<T>;
12
+ static Query: typeof QUERY;
11
13
  constructor(query: Query<T>);
12
14
  static all(strings: TemplateStringsArray, ...params: Array<any>): Cursor<any>;
13
- query(): Query<T>;
15
+ next<T>(cursor: Cursor<T>): Cursor<T>;
14
16
  on(driver: Driver.Sync): T;
15
17
  on(driver: Driver.Async): Promise<T>;
18
+ toSql(driver: Driver, options?: CompileOptions): string;
16
19
  toJSON(): Query<T>;
17
20
  }
18
21
  export declare namespace Cursor {
@@ -24,62 +27,82 @@ export declare namespace Cursor {
24
27
  take(limit: number | undefined): Delete;
25
28
  skip(offset: number | undefined): Delete;
26
29
  }
27
- class Update<T> extends Cursor<{
30
+ class Update<Definition> extends Cursor<{
28
31
  rowsAffected: number;
29
32
  }> {
30
- query(): Query.Update;
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
+ [QUERY]: Query.Update;
34
+ set(set: Table.Update<Definition>): Update<Definition>;
35
+ where(...where: Array<EV<boolean>>): Update<Definition>;
36
+ take(limit: number | undefined): Update<Definition>;
37
+ skip(offset: number | undefined): Update<Definition>;
35
38
  }
36
39
  class InsertValuesReturning<T> extends Cursor<T> {
37
40
  }
38
- class InsertValues extends Cursor<{
41
+ class Inserted extends Cursor<{
39
42
  rowsAffected: number;
40
43
  }> {
41
- query(): Query.Insert;
44
+ [QUERY]: Query.Insert;
45
+ constructor(query: Query.Insert);
42
46
  returning<X extends Selection>(selection: X): InsertValuesReturning<Selection.Infer<X>>;
43
47
  }
44
- class Insert<T> {
45
- protected into: Schema;
46
- constructor(into: Schema);
47
- values(...data: Array<Table.Insert<T>>): InsertValues;
48
+ class Insert<Definition> {
49
+ protected into: TableData;
50
+ constructor(into: TableData);
51
+ selection(query: Cursor.SelectMultiple<Table.Select<Definition>>): Inserted;
52
+ values(...data: Array<Table.Insert<Definition>>): Inserted;
48
53
  }
49
54
  class CreateTable extends Cursor<void> {
50
- protected table: Schema;
51
- constructor(table: Schema);
55
+ protected table: TableData;
56
+ constructor(table: TableData);
52
57
  }
53
58
  class Batch<T = void> extends Cursor<T> {
54
59
  protected queries: Array<Query>;
60
+ [QUERY]: Query.Batch;
55
61
  constructor(queries: Array<Query>);
62
+ next<T>(cursor: Cursor<T>): Cursor<T>;
56
63
  }
57
- class SelectMultiple<T> extends Cursor<Array<T>> {
58
- query(): Query.Select;
59
- leftJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectMultiple<T>;
60
- innerJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectMultiple<T>;
64
+ class SelectMultiple<Row> extends Cursor<Array<Row>> {
65
+ [QUERY]: Query.Select;
66
+ constructor(query: Query.Select);
67
+ leftJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectMultiple<Row>;
68
+ innerJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectMultiple<Row>;
61
69
  select<X extends Selection>(selection: X): SelectMultiple<Selection.Infer<X>>;
62
70
  count(): SelectSingle<number>;
63
- orderBy(...orderBy: Array<Expr<any> | OrderBy>): SelectMultiple<T>;
64
- groupBy(...groupBy: Array<Expr<any>>): SelectMultiple<T>;
65
- first(): SelectSingle<T | undefined>;
66
- sure(): SelectSingle<T>;
67
- where(...where: Array<EV<boolean>>): SelectMultiple<T>;
68
- take(limit: number | undefined): SelectMultiple<T>;
69
- skip(offset: number | undefined): SelectMultiple<T>;
70
- toExpr(): Expr<T>;
71
+ orderBy(...orderBy: Array<Expr<any> | OrderBy>): SelectMultiple<Row>;
72
+ groupBy(...groupBy: Array<Expr<any>>): SelectMultiple<Row>;
73
+ first(): SelectSingle<Row | undefined>;
74
+ sure(): SelectSingle<Row>;
75
+ where(...where: Array<EV<boolean>>): SelectMultiple<Row>;
76
+ take(limit: number | undefined): SelectMultiple<Row>;
77
+ skip(offset: number | undefined): SelectMultiple<Row>;
78
+ [Expr.ToExpr](): Expr<Row>;
71
79
  }
72
- class SelectSingle<T> extends Cursor<T> {
73
- query(): Query.Select;
74
- leftJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectSingle<T>;
75
- innerJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectSingle<T>;
80
+ class TableSelect<Definition> extends SelectMultiple<Table.Select<Definition>> {
81
+ protected table: TableData;
82
+ [QUERY]: Query.Select;
83
+ constructor(table: TableData, conditions?: Array<EV<boolean>>);
84
+ as(alias: string): Table<Definition>;
85
+ create(): CreateTable;
86
+ insertSelect(query: SelectMultiple<Table.Insert<Definition>>): Inserted;
87
+ insertOne(record: Table.Insert<Definition>): Cursor<Table.Select<Definition>>;
88
+ insertAll(data: Array<Table.Insert<Definition>>): Inserted;
89
+ set(data: Table.Update<Definition>): Update<Definition>;
90
+ delete(): Delete;
91
+ get(name: string): Expr<any>;
92
+ }
93
+ class SelectSingle<Row> extends Cursor<Row> {
94
+ [QUERY]: Query.Select;
95
+ constructor(query: Query.Select);
96
+ leftJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectSingle<Row>;
97
+ innerJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectSingle<Row>;
76
98
  select<X extends Selection>(selection: X): SelectSingle<Selection.Infer<X>>;
77
- orderBy(...orderBy: Array<OrderBy>): SelectSingle<T>;
78
- groupBy(...groupBy: Array<Expr<any>>): SelectSingle<T>;
79
- where(...where: Array<EV<boolean>>): SelectSingle<T>;
80
- take(limit: number | undefined): SelectSingle<T>;
81
- skip(offset: number | undefined): SelectSingle<T>;
82
- all(): SelectMultiple<T>;
83
- toExpr(): Expr<T>;
99
+ orderBy(...orderBy: Array<OrderBy>): SelectSingle<Row>;
100
+ groupBy(...groupBy: Array<Expr<any>>): SelectSingle<Row>;
101
+ where(...where: Array<EV<boolean>>): SelectSingle<Row>;
102
+ take(limit: number | undefined): SelectSingle<Row>;
103
+ skip(offset: number | undefined): SelectSingle<Row>;
104
+ all(): SelectMultiple<Row>;
105
+ [Expr.ToExpr](): Expr<Row>;
84
106
  }
85
107
  }
108
+ export {};
@@ -1,96 +1,112 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => {
4
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ return value;
6
+ };
7
+
1
8
  // src/define/Cursor.ts
2
9
  import { Expr, ExprData } from "./Expr.js";
3
10
  import { Functions } from "./Functions.js";
4
11
  import { Query } from "./Query.js";
5
12
  import { Schema } from "./Schema.js";
6
13
  import { Selection } from "./Selection.js";
14
+ import { Table, createTable } from "./Table.js";
7
15
  import { Target } from "./Target.js";
8
- var Cursor = class {
9
- [Selection.__cursorType]() {
10
- throw "assert";
11
- }
16
+ var QUERY = Symbol("Cursor.Query");
17
+ var _Cursor = class {
18
+ [(Selection.CursorType, QUERY)];
12
19
  constructor(query) {
13
- Object.defineProperty(this, "query", {
14
- enumerable: false,
15
- value: () => query
16
- });
20
+ this[QUERY] = query;
17
21
  }
18
22
  static all(strings, ...params) {
19
- return new Cursor(Query.Raw({ expectedReturn: "rows", strings, params }));
23
+ return new _Cursor(Query.Raw({ expectedReturn: "rows", strings, params }));
20
24
  }
21
- query() {
22
- throw new Error("Not implemented");
25
+ next(cursor) {
26
+ return new _Cursor(
27
+ Query.Batch({
28
+ queries: [this[QUERY], cursor[QUERY]]
29
+ })
30
+ );
23
31
  }
24
32
  on(driver) {
25
- return driver.executeQuery(this.query());
33
+ return driver.executeQuery(this[QUERY]);
34
+ }
35
+ toSql(driver, options = { forceInline: true }) {
36
+ return driver.formatter.compile(this[QUERY], options).sql;
26
37
  }
27
38
  toJSON() {
28
- return this.query();
39
+ return this[QUERY];
29
40
  }
30
41
  };
42
+ var Cursor = _Cursor;
43
+ __publicField(Cursor, "Query", QUERY);
31
44
  function addWhere(query, where) {
32
45
  const conditions = where.slice();
33
46
  if (query.where)
34
- conditions.push(query.where);
47
+ conditions.push(new Expr(query.where));
35
48
  return {
36
49
  ...query,
37
- where: Expr.and(...conditions).expr
50
+ where: Expr.and(...conditions)[Expr.Data]
38
51
  };
39
52
  }
40
53
  ((Cursor2) => {
41
54
  class Delete extends Cursor2 {
42
55
  query() {
43
- return super.query();
56
+ return super[QUERY];
44
57
  }
45
58
  where(...where) {
46
- return new Delete(addWhere(this.query(), where));
59
+ return new Delete(addWhere(this[QUERY], where));
47
60
  }
48
61
  take(limit) {
49
- return new Delete({ ...this.query(), limit });
62
+ return new Delete({ ...this[QUERY], limit });
50
63
  }
51
64
  skip(offset) {
52
- return new Delete({ ...this.query(), offset });
65
+ return new Delete({ ...this[QUERY], offset });
53
66
  }
54
67
  }
55
68
  Cursor2.Delete = Delete;
56
- class Update extends Cursor2 {
57
- query() {
58
- return super.query();
59
- }
69
+ const _Update = class extends Cursor2 {
60
70
  set(set) {
61
- return new Update({ ...this.query(), set });
71
+ return new _Update({ ...this[QUERY], set });
62
72
  }
63
73
  where(...where) {
64
- return new Update(addWhere(this.query(), where));
74
+ return new _Update(addWhere(this[QUERY], where));
65
75
  }
66
76
  take(limit) {
67
- return new Update({ ...this.query(), limit });
77
+ return new _Update({ ...this[QUERY], limit });
68
78
  }
69
79
  skip(offset) {
70
- return new Update({ ...this.query(), offset });
80
+ return new _Update({ ...this[QUERY], offset });
71
81
  }
72
- }
82
+ };
83
+ let Update = _Update;
84
+ QUERY;
73
85
  Cursor2.Update = Update;
74
86
  class InsertValuesReturning extends Cursor2 {
75
87
  }
76
88
  Cursor2.InsertValuesReturning = InsertValuesReturning;
77
- class InsertValues extends Cursor2 {
78
- query() {
79
- return super.query();
89
+ class Inserted extends Cursor2 {
90
+ constructor(query) {
91
+ super(query);
80
92
  }
81
93
  returning(selection) {
82
94
  return new InsertValuesReturning(
83
- Query.Insert({ ...this.query(), selection: ExprData.create(selection) })
95
+ Query.Insert({ ...this[QUERY], selection: ExprData.create(selection) })
84
96
  );
85
97
  }
86
98
  }
87
- Cursor2.InsertValues = InsertValues;
99
+ QUERY;
100
+ Cursor2.Inserted = Inserted;
88
101
  class Insert {
89
102
  constructor(into) {
90
103
  this.into = into;
91
104
  }
105
+ selection(query) {
106
+ return new Inserted(Query.Insert({ into: this.into, select: query[QUERY] }));
107
+ }
92
108
  values(...data) {
93
- return new InsertValues(Query.Insert({ into: this.into, data }));
109
+ return new Inserted(Query.Insert({ into: this.into, data }));
94
110
  }
95
111
  }
96
112
  Cursor2.Insert = Insert;
@@ -106,147 +122,213 @@ function addWhere(query, where) {
106
122
  super(Query.Batch({ queries }));
107
123
  this.queries = queries;
108
124
  }
125
+ next(cursor) {
126
+ return new Cursor2(
127
+ Query.Batch({
128
+ queries: [...this[QUERY].queries, cursor[QUERY]]
129
+ })
130
+ );
131
+ }
109
132
  }
133
+ QUERY;
110
134
  Cursor2.Batch = Batch;
135
+ function joinTarget(joinType, query, to, on) {
136
+ const toQuery = to instanceof Cursor2 ? to[QUERY] : void 0;
137
+ const target = toQuery ? toQuery.from : Target.Table(to[Table.Data]);
138
+ if (!query.from || !target)
139
+ throw new Error("No from clause");
140
+ const conditions = [...on];
141
+ if (toQuery) {
142
+ const where = toQuery.where;
143
+ if (where)
144
+ conditions.push(new Expr(where));
145
+ }
146
+ return Target.Join(
147
+ query.from,
148
+ target,
149
+ joinType,
150
+ Expr.and(...conditions)[Expr.Data]
151
+ );
152
+ }
111
153
  class SelectMultiple extends Cursor2 {
112
- query() {
113
- return super.query();
154
+ constructor(query) {
155
+ super(query);
114
156
  }
115
157
  leftJoin(that, ...on) {
116
- const query = this.query();
158
+ const query = this[QUERY];
117
159
  return new SelectMultiple({
118
160
  ...query,
119
- from: Target.Join(
120
- query.from,
121
- Target.Table(that.schema()),
122
- "left",
123
- Expr.and(...on).expr
124
- )
161
+ from: joinTarget("left", query, that, on)
125
162
  });
126
163
  }
127
164
  innerJoin(that, ...on) {
128
- const query = this.query();
165
+ const query = this[QUERY];
129
166
  return new SelectMultiple({
130
167
  ...query,
131
- from: Target.Join(
132
- query.from,
133
- Target.Table(that.schema()),
134
- "inner",
135
- Expr.and(...on).expr
136
- )
168
+ from: joinTarget("inner", query, that, on)
137
169
  });
138
170
  }
139
171
  select(selection) {
140
172
  return new SelectMultiple({
141
- ...this.query(),
173
+ ...this[QUERY],
142
174
  selection: ExprData.create(selection)
143
175
  });
144
176
  }
145
177
  count() {
146
178
  return new SelectSingle({
147
- ...this.query(),
148
- selection: Functions.count().expr,
179
+ ...this[QUERY],
180
+ selection: Functions.count()[Expr.Data],
149
181
  singleResult: true
150
182
  });
151
183
  }
152
184
  orderBy(...orderBy) {
153
185
  return new SelectMultiple({
154
- ...this.query(),
186
+ ...this[QUERY],
155
187
  orderBy: orderBy.map((e) => {
156
- return e instanceof Expr ? e.asc() : e;
188
+ return Expr.isExpr(e) ? e.asc() : e;
157
189
  })
158
190
  });
159
191
  }
160
192
  groupBy(...groupBy) {
161
193
  return new SelectMultiple({
162
- ...this.query(),
194
+ ...this[QUERY],
163
195
  groupBy: groupBy.map(ExprData.create)
164
196
  });
165
197
  }
166
198
  first() {
167
- return new SelectSingle({ ...this.query(), singleResult: true });
199
+ return new SelectSingle({ ...this[QUERY], singleResult: true });
168
200
  }
169
201
  sure() {
170
202
  return new SelectSingle({
171
- ...this.query(),
203
+ ...this[QUERY],
172
204
  singleResult: true,
173
205
  validate: true
174
206
  });
175
207
  }
176
208
  where(...where) {
177
- return new SelectMultiple(addWhere(this.query(), where));
209
+ return new SelectMultiple(addWhere(this[QUERY], where));
178
210
  }
179
211
  take(limit) {
180
- return new SelectMultiple({ ...this.query(), limit });
212
+ return new SelectMultiple({ ...this[QUERY], limit });
181
213
  }
182
214
  skip(offset) {
183
- return new SelectMultiple({ ...this.query(), offset });
215
+ return new SelectMultiple({ ...this[QUERY], offset });
184
216
  }
185
- toExpr() {
186
- return new Expr(ExprData.Query(this.query()));
217
+ [(QUERY, Expr.ToExpr)]() {
218
+ return new Expr(ExprData.Query(this[QUERY]));
187
219
  }
188
220
  }
189
221
  Cursor2.SelectMultiple = SelectMultiple;
222
+ class TableSelect extends SelectMultiple {
223
+ constructor(table, conditions = []) {
224
+ const target = Target.Table(table);
225
+ super(
226
+ Query.Select({
227
+ from: target,
228
+ selection: ExprData.Row(target),
229
+ where: Expr.and(...conditions)[Expr.Data]
230
+ })
231
+ );
232
+ this.table = table;
233
+ }
234
+ as(alias) {
235
+ return createTable({ ...this.table, alias });
236
+ }
237
+ create() {
238
+ return new Cursor2.CreateTable(this.table);
239
+ }
240
+ insertSelect(query) {
241
+ return new Cursor2.Inserted(
242
+ Query.Insert({ into: this.table, select: query[QUERY] })
243
+ );
244
+ }
245
+ insertOne(record) {
246
+ return new Cursor2(
247
+ Query.Insert({
248
+ into: this.table,
249
+ data: [record],
250
+ selection: ExprData.Row(Target.Table(this.table)),
251
+ singleResult: true
252
+ })
253
+ );
254
+ }
255
+ insertAll(data) {
256
+ return new Cursor2.Insert(this.table).values(...data);
257
+ }
258
+ set(data) {
259
+ return new Cursor2.Update(
260
+ Query.Update({
261
+ table: this.table,
262
+ where: this[QUERY].where
263
+ })
264
+ ).set(data);
265
+ }
266
+ delete() {
267
+ return new Cursor2.Delete(
268
+ Query.Delete({
269
+ table: this.table,
270
+ where: this[QUERY].where
271
+ })
272
+ );
273
+ }
274
+ get(name) {
275
+ return new Expr(
276
+ ExprData.Field(ExprData.Row(Target.Table(this.table)), name)
277
+ );
278
+ }
279
+ }
280
+ QUERY;
281
+ Cursor2.TableSelect = TableSelect;
190
282
  class SelectSingle extends Cursor2 {
191
- query() {
192
- return super.query();
283
+ constructor(query) {
284
+ super(query);
193
285
  }
194
286
  leftJoin(that, ...on) {
195
- const query = this.query();
287
+ const query = this[QUERY];
196
288
  return new SelectSingle({
197
289
  ...query,
198
- from: Target.Join(
199
- query.from,
200
- Target.Table(that.schema()),
201
- "left",
202
- Expr.and(...on).expr
203
- )
290
+ from: joinTarget("left", query, that, on)
204
291
  });
205
292
  }
206
293
  innerJoin(that, ...on) {
207
- const query = this.query();
294
+ const query = this[QUERY];
208
295
  return new SelectSingle({
209
296
  ...query,
210
- from: Target.Join(
211
- query.from,
212
- Target.Table(that.schema()),
213
- "inner",
214
- Expr.and(...on).expr
215
- )
297
+ from: joinTarget("inner", query, that, on)
216
298
  });
217
299
  }
218
300
  select(selection) {
219
301
  return new SelectSingle({
220
- ...this.query(),
302
+ ...this[QUERY],
221
303
  selection: ExprData.create(selection)
222
304
  });
223
305
  }
224
306
  orderBy(...orderBy) {
225
307
  return new SelectSingle({
226
- ...this.query(),
308
+ ...this[QUERY],
227
309
  orderBy
228
310
  });
229
311
  }
230
312
  groupBy(...groupBy) {
231
313
  return new SelectSingle({
232
- ...this.query(),
314
+ ...this[QUERY],
233
315
  groupBy: groupBy.map(ExprData.create)
234
316
  });
235
317
  }
236
318
  where(...where) {
237
- return new SelectSingle(addWhere(this.query(), where));
319
+ return new SelectSingle(addWhere(this[QUERY], where));
238
320
  }
239
321
  take(limit) {
240
- return new SelectSingle({ ...this.query(), limit });
322
+ return new SelectSingle({ ...this[QUERY], limit });
241
323
  }
242
324
  skip(offset) {
243
- return new SelectSingle({ ...this.query(), offset });
325
+ return new SelectSingle({ ...this[QUERY], offset });
244
326
  }
245
327
  all() {
246
- return new SelectMultiple({ ...this.query(), singleResult: false });
328
+ return new SelectMultiple({ ...this[QUERY], singleResult: false });
247
329
  }
248
- toExpr() {
249
- return new Expr(ExprData.Query(this.query()));
330
+ [(QUERY, Expr.ToExpr)]() {
331
+ return new Expr(ExprData.Query(this[QUERY]));
250
332
  }
251
333
  }
252
334
  Cursor2.SelectSingle = SelectSingle;
@@ -1,10 +1,9 @@
1
1
  import { Fields } from './Fields.js';
2
2
  import { OrderBy } from './OrderBy.js';
3
3
  import { ParamData } from './Param.js';
4
- import { QueryData } from './Query.js';
4
+ import { QueryData, Select, SelectFirst } from './Query.js';
5
5
  import { Selection } from './Selection.js';
6
6
  import { Target } from './Target.js';
7
- import { Select, SelectFirst } from './query/Select.js';
8
7
  export declare enum UnOpType {
9
8
  Not = "Not",
10
9
  IsNull = "IsNull"
@@ -161,6 +160,7 @@ export declare class Expr<T> {
161
160
  map<T, X extends Selection>(this: Expr<Array<T>>, fn: (cursor: Fields<T>) => X): Expr<Array<Selection.Infer<X>>>;
162
161
  sure(): Expr<NonNullable<T>>;
163
162
  get<T>(name: string): Expr<T>;
163
+ static [Symbol.hasInstance](instance: any): any;
164
164
  }
165
165
  export interface ObjectExpr {
166
166
  [Expr.Data]: ExprData;
@@ -386,6 +386,9 @@ class Expr {
386
386
  get(name) {
387
387
  return new Expr(new ExprData.Field(this[Expr.Data], name));
388
388
  }
389
+ static [Symbol.hasInstance](instance) {
390
+ return instance?.[Expr.IsExpr];
391
+ }
389
392
  }
390
393
  ((Expr2) => {
391
394
  Expr2.Data = Symbol("Expr.Data");
@@ -419,7 +422,7 @@ class Expr {
419
422
  }
420
423
  Expr2.hasExpr = hasExpr;
421
424
  function isExpr(input) {
422
- return input !== null && (typeof input === "object" || typeof input === "function") && input[Expr2.IsExpr];
425
+ return input instanceof Expr2;
423
426
  }
424
427
  Expr2.isExpr = isExpr;
425
428
  })(Expr || (Expr = {}));
@@ -1,11 +1,6 @@
1
+ import { Batch, Delete, InsertInto, RecursiveUnion, Select, Update } from './Query.js';
1
2
  import { Selection } from './Selection.js';
2
3
  import { Table } from './Table.js';
3
- import { Batch } from './query/Batch.js';
4
- import { Delete } from './query/Delete.js';
5
- import { InsertInto } from './query/Insert.js';
6
- import { Select } from './query/Select.js';
7
- import { RecursiveUnion } from './query/Union.js';
8
- import { Update } from './query/Update.js';
9
4
  export declare function withRecursive<Row>(initialSelect: Select<Row>): RecursiveUnion<Row>;
10
5
  export declare function alias<T extends Table<{}>>(table: T): Record<string, T>;
11
6
  export declare function select<X extends Selection>(selection: X): Select<Selection.Infer<X>>;