rado 0.1.60 → 0.1.62

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 (149) hide show
  1. package/dist/CPU.20230126.092143.12244.0.001.cpuprofile +1 -0
  2. package/dist/Column.d.ts +54 -0
  3. package/dist/Column.js +63 -0
  4. package/dist/Cursor.d.ts +77 -0
  5. package/dist/Cursor.js +221 -0
  6. package/dist/Driver.d.ts +89 -0
  7. package/dist/Driver.js +262 -0
  8. package/dist/Expr.d.ts +149 -0
  9. package/dist/Expr.js +284 -0
  10. package/dist/Fields.d.ts +11 -0
  11. package/dist/Fields.js +0 -0
  12. package/dist/Formatter.d.ts +55 -0
  13. package/dist/Formatter.js +496 -0
  14. package/dist/Functions.d.ts +7 -0
  15. package/dist/Functions.js +11 -0
  16. package/dist/Id.d.ts +3 -0
  17. package/dist/Id.js +0 -0
  18. package/dist/Ops.d.ts +8 -0
  19. package/dist/Ops.js +45 -0
  20. package/dist/OrderBy.d.ts +9 -0
  21. package/dist/OrderBy.js +9 -0
  22. package/dist/Param.d.ts +15 -0
  23. package/dist/Param.js +18 -0
  24. package/dist/Query.d.ts +107 -0
  25. package/dist/Query.js +74 -0
  26. package/dist/Sanitizer.d.ts +4 -0
  27. package/dist/Sanitizer.js +0 -0
  28. package/dist/Schema.d.ts +23 -0
  29. package/dist/Schema.js +60 -0
  30. package/dist/Selection.d.ts +20 -0
  31. package/dist/Selection.js +7 -0
  32. package/dist/Statement.d.ts +57 -0
  33. package/dist/Statement.js +184 -0
  34. package/dist/Table.d.ts +56 -0
  35. package/dist/Table.js +104 -0
  36. package/dist/Target.d.ts +30 -0
  37. package/dist/Target.js +37 -0
  38. package/dist/Update.d.ts +4 -0
  39. package/dist/Update.js +0 -0
  40. package/dist/define/Column.d.ts +58 -58
  41. package/dist/define/Cursor.d.ts +87 -87
  42. package/dist/define/Expr.d.ts +172 -154
  43. package/dist/define/Expr.js +31 -31
  44. package/dist/define/Fields.d.ts +13 -13
  45. package/dist/define/Functions.d.ts +5 -5
  46. package/dist/define/Id.d.ts +3 -3
  47. package/dist/define/Index.d.ts +17 -17
  48. package/dist/define/Ops.d.ts +7 -7
  49. package/dist/define/OrderBy.d.ts +9 -9
  50. package/dist/define/Param.d.ts +15 -15
  51. package/dist/define/Query.d.ts +109 -109
  52. package/dist/define/Schema.d.ts +18 -18
  53. package/dist/define/Selection.d.ts +20 -20
  54. package/dist/define/Table.d.ts +62 -62
  55. package/dist/define/Target.d.ts +38 -38
  56. package/dist/define/Update.d.ts +4 -4
  57. package/dist/driver/better-sqlite3.d.ts +15 -15
  58. package/dist/driver/bun-sqlite.d.ts +18 -18
  59. package/dist/driver/sql.js.d.ts +15 -15
  60. package/dist/driver/sqlite3.d.ts +18 -18
  61. package/dist/index.d.ts +21 -21
  62. package/dist/lib/Column.d.ts +57 -0
  63. package/dist/lib/Column.js +63 -0
  64. package/dist/lib/Cursor.d.ts +79 -0
  65. package/dist/lib/Cursor.js +231 -0
  66. package/dist/lib/Driver.d.ts +110 -110
  67. package/dist/lib/Expr.d.ts +154 -0
  68. package/dist/lib/Expr.js +284 -0
  69. package/dist/lib/Fields.d.ts +13 -0
  70. package/dist/lib/Fields.js +0 -0
  71. package/dist/lib/Formatter.d.ts +81 -80
  72. package/dist/lib/Formatter.js +59 -54
  73. package/dist/lib/Functions.d.ts +5 -0
  74. package/dist/lib/Functions.js +11 -0
  75. package/dist/lib/Id.d.ts +3 -0
  76. package/dist/lib/Id.js +0 -0
  77. package/dist/lib/Index.d.ts +17 -0
  78. package/dist/lib/Index.js +20 -0
  79. package/dist/lib/Ops.d.ts +8 -0
  80. package/dist/lib/Ops.js +45 -0
  81. package/dist/lib/OrderBy.d.ts +9 -0
  82. package/dist/lib/OrderBy.js +9 -0
  83. package/dist/lib/Param.d.ts +20 -0
  84. package/dist/lib/Param.js +27 -0
  85. package/dist/lib/Query.d.ts +109 -0
  86. package/dist/lib/Query.js +74 -0
  87. package/dist/lib/Sanitizer.d.ts +5 -5
  88. package/dist/lib/Schema.d.ts +18 -0
  89. package/dist/lib/Schema.js +67 -0
  90. package/dist/lib/Selection.d.ts +20 -0
  91. package/dist/lib/Selection.js +7 -0
  92. package/dist/lib/SqlError.d.ts +3 -3
  93. package/dist/lib/Statement.d.ts +33 -33
  94. package/dist/lib/Table.d.ts +62 -0
  95. package/dist/lib/Table.js +130 -0
  96. package/dist/lib/Target.d.ts +30 -0
  97. package/dist/lib/Target.js +37 -0
  98. package/dist/lib/Update.d.ts +4 -0
  99. package/dist/lib/Update.js +0 -0
  100. package/dist/sqlite/SqliteFormatter.d.ts +11 -11
  101. package/dist/sqlite/SqliteFunctions.d.ts +165 -165
  102. package/dist/sqlite/SqliteSchema.d.ts +25 -25
  103. package/dist/sqlite/index.d.ts +2 -0
  104. package/dist/sqlite/index.js +3 -0
  105. package/dist/sqlite.d.ts +2 -2
  106. package/dist/src/driver/better-sqlite3.js +49 -0
  107. package/dist/src/driver/sql.js.js +66 -0
  108. package/dist/src/driver/sqlite3.js +87 -0
  109. package/dist/src/index.js +24 -0
  110. package/dist/src/lib/Column.js +63 -0
  111. package/dist/src/lib/Cursor.js +231 -0
  112. package/dist/src/lib/Driver.js +316 -0
  113. package/dist/src/lib/Expr.js +284 -0
  114. package/dist/src/lib/Fields.js +0 -0
  115. package/dist/src/lib/Formatter.js +625 -0
  116. package/dist/src/lib/Functions.js +11 -0
  117. package/dist/src/lib/Id.js +0 -0
  118. package/dist/src/lib/Index.js +20 -0
  119. package/dist/src/lib/Ops.js +45 -0
  120. package/dist/src/lib/OrderBy.js +9 -0
  121. package/dist/src/lib/Param.js +27 -0
  122. package/dist/src/lib/Query.js +74 -0
  123. package/dist/src/lib/Sanitizer.js +0 -0
  124. package/dist/src/lib/Schema.js +67 -0
  125. package/dist/src/lib/Selection.js +7 -0
  126. package/dist/src/lib/Statement.js +103 -0
  127. package/dist/src/lib/Table.js +130 -0
  128. package/dist/src/lib/Target.js +37 -0
  129. package/dist/src/lib/Update.js +0 -0
  130. package/dist/src/sqlite/SqliteFormatter.js +67 -0
  131. package/dist/src/sqlite/SqliteFunctions.js +146 -0
  132. package/dist/src/sqlite/SqliteSchema.js +47 -0
  133. package/dist/src/sqlite.js +3 -0
  134. package/dist/test/DbSuite.js +28 -0
  135. package/dist/test/TSTestTypes.js +6 -0
  136. package/dist/test/TestBasic.js +172 -0
  137. package/dist/test/TestExtend.js +68 -0
  138. package/dist/test/TestFts5.js +34 -0
  139. package/dist/test/TestFunctions.js +28 -0
  140. package/dist/test/TestJoins.js +34 -0
  141. package/dist/test/TestJson.js +33 -0
  142. package/dist/test/TestPrepare.js +27 -0
  143. package/dist/test/TestRawSql.js +31 -0
  144. package/dist/test/TestSchema.js +69 -0
  145. package/dist/test/TestSubQueries.js +79 -0
  146. package/dist/test/TestTransaction.js +54 -0
  147. package/dist/test/TestUpdate.js +95 -0
  148. package/dist/test/index.js +14 -0
  149. package/package.json +60 -60
@@ -0,0 +1,77 @@
1
+ import { EV, Expr } from './Expr';
2
+ import { OrderBy } from './OrderBy';
3
+ import { Query } from './Query';
4
+ import { Schema } from './Schema';
5
+ import { Selection } from './Selection';
6
+ import { Table } from './Table';
7
+ import { Update as UpdateSet } from './Update';
8
+ export declare class Cursor<T> {
9
+ [Selection.__cursorType](): T;
10
+ constructor(query: Query<T>);
11
+ query(): Query<T>;
12
+ toJSON(): Query<T>;
13
+ }
14
+ export declare namespace Cursor {
15
+ class Limitable<T> extends Cursor<T> {
16
+ take(limit: number | undefined): Limitable<T>;
17
+ skip(offset: number | undefined): Limitable<T>;
18
+ }
19
+ class Filterable<T> extends Limitable<T> {
20
+ where(...where: Array<EV<boolean>>): Filterable<T>;
21
+ }
22
+ class Delete<T> extends Filterable<{
23
+ rowsAffected: number;
24
+ }> {
25
+ query(): Query.Delete;
26
+ }
27
+ class Update<T> extends Filterable<{
28
+ rowsAffected: number;
29
+ }> {
30
+ query: () => Query.Update;
31
+ set(set: UpdateSet<T>): Update<T>;
32
+ }
33
+ class InsertValuesReturning<T> extends Cursor<T> {
34
+ }
35
+ class InsertValues extends Cursor<{
36
+ rowsAffected: number;
37
+ }> {
38
+ query(): Query.Insert;
39
+ returning<X extends Selection>(selection: X): InsertValuesReturning<Selection.Infer<X>>;
40
+ }
41
+ class Insert<T> {
42
+ protected into: Schema;
43
+ constructor(into: Schema);
44
+ values(...data: Array<Table.Insert<T>>): InsertValues;
45
+ }
46
+ class Create extends Cursor<void> {
47
+ protected table: Schema;
48
+ constructor(table: Schema);
49
+ }
50
+ class Batch<T = void> extends Cursor<T> {
51
+ protected queries: Array<Query>;
52
+ constructor(queries: Array<Query>);
53
+ }
54
+ class SelectMultiple<T> extends Filterable<Array<T>> {
55
+ query(): Query.Select;
56
+ leftJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectMultiple<T>;
57
+ innerJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectMultiple<T>;
58
+ select<X extends Selection>(selection: X): SelectMultiple<Selection.Infer<X>>;
59
+ count(): SelectSingle<number>;
60
+ orderBy(...orderBy: Array<Expr<any> | OrderBy>): SelectMultiple<T>;
61
+ groupBy(...groupBy: Array<Expr<any>>): SelectMultiple<T>;
62
+ first(): SelectSingle<T | undefined>;
63
+ where(...where: Array<EV<boolean>>): SelectMultiple<T>;
64
+ toExpr(): Expr<T>;
65
+ }
66
+ class SelectSingle<T> extends Filterable<T> {
67
+ query(): Query.Select;
68
+ leftJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectSingle<T>;
69
+ innerJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectSingle<T>;
70
+ select<X extends Selection>(selection: X): SelectSingle<Selection.Infer<X>>;
71
+ orderBy(...orderBy: Array<OrderBy>): SelectSingle<T>;
72
+ groupBy(...groupBy: Array<Expr<any>>): SelectSingle<T>;
73
+ where(...where: Array<EV<boolean>>): SelectSingle<T>;
74
+ all(): SelectMultiple<T>;
75
+ toExpr(): Expr<T>;
76
+ }
77
+ }
package/dist/Cursor.js ADDED
@@ -0,0 +1,221 @@
1
+ // src/Cursor.ts
2
+ import { Expr, ExprData } from "./Expr.js";
3
+ import { Functions } from "./Functions.js";
4
+ import { Query } from "./Query.js";
5
+ import { Schema } from "./Schema.js";
6
+ import { Selection } from "./Selection.js";
7
+ import { Target } from "./Target.js";
8
+ var Cursor = class {
9
+ [Selection.__cursorType]() {
10
+ throw "assert";
11
+ }
12
+ constructor(query) {
13
+ Object.defineProperty(this, "query", {
14
+ enumerable: false,
15
+ value: () => query
16
+ });
17
+ }
18
+ query() {
19
+ throw new Error("Not implemented");
20
+ }
21
+ toJSON() {
22
+ return this.query();
23
+ }
24
+ };
25
+ ((Cursor2) => {
26
+ class Limitable extends Cursor2 {
27
+ take(limit) {
28
+ return new Limitable({ ...this.query(), limit });
29
+ }
30
+ skip(offset) {
31
+ return new Limitable({ ...this.query(), offset });
32
+ }
33
+ }
34
+ Cursor2.Limitable = Limitable;
35
+ class Filterable extends Limitable {
36
+ where(...where) {
37
+ const condition = Expr.and(...where);
38
+ const query = this.query();
39
+ return new Filterable({
40
+ ...query,
41
+ where: (query.where ? condition.and(new Expr(query.where)) : condition).expr
42
+ });
43
+ }
44
+ }
45
+ Cursor2.Filterable = Filterable;
46
+ class Delete extends Filterable {
47
+ query() {
48
+ return super.query();
49
+ }
50
+ }
51
+ Cursor2.Delete = Delete;
52
+ class Update extends Filterable {
53
+ set(set) {
54
+ return new Update({ ...this.query(), set });
55
+ }
56
+ }
57
+ Cursor2.Update = Update;
58
+ class InsertValuesReturning extends Cursor2 {
59
+ }
60
+ Cursor2.InsertValuesReturning = InsertValuesReturning;
61
+ class InsertValues extends Cursor2 {
62
+ query() {
63
+ return super.query();
64
+ }
65
+ returning(selection) {
66
+ return new InsertValuesReturning(
67
+ Query.Insert({ ...this.query(), selection: ExprData.create(selection) })
68
+ );
69
+ }
70
+ }
71
+ Cursor2.InsertValues = InsertValues;
72
+ class Insert {
73
+ constructor(into) {
74
+ this.into = into;
75
+ }
76
+ values(...data) {
77
+ return new InsertValues(Query.Insert({ into: this.into, data }));
78
+ }
79
+ }
80
+ Cursor2.Insert = Insert;
81
+ class Create extends Cursor2 {
82
+ constructor(table) {
83
+ super(Schema.create(table));
84
+ this.table = table;
85
+ }
86
+ }
87
+ Cursor2.Create = Create;
88
+ class Batch extends Cursor2 {
89
+ constructor(queries) {
90
+ super(Query.Batch({ queries }));
91
+ this.queries = queries;
92
+ }
93
+ }
94
+ Cursor2.Batch = Batch;
95
+ class SelectMultiple extends Filterable {
96
+ query() {
97
+ return super.query();
98
+ }
99
+ leftJoin(that, ...on) {
100
+ const query = this.query();
101
+ return new SelectMultiple({
102
+ ...query,
103
+ from: Target.Join(
104
+ query.from,
105
+ Target.Table(that.schema()),
106
+ "left",
107
+ Expr.and(...on).expr
108
+ )
109
+ });
110
+ }
111
+ innerJoin(that, ...on) {
112
+ const query = this.query();
113
+ return new SelectMultiple({
114
+ ...query,
115
+ from: Target.Join(
116
+ query.from,
117
+ Target.Table(that.schema()),
118
+ "inner",
119
+ Expr.and(...on).expr
120
+ )
121
+ });
122
+ }
123
+ select(selection) {
124
+ return new SelectMultiple({
125
+ ...this.query(),
126
+ selection: ExprData.create(selection)
127
+ });
128
+ }
129
+ count() {
130
+ return new SelectSingle({
131
+ ...this.query(),
132
+ selection: Functions.count().expr,
133
+ singleResult: true
134
+ });
135
+ }
136
+ orderBy(...orderBy) {
137
+ return new SelectMultiple({
138
+ ...this.query(),
139
+ orderBy: orderBy.map((e) => {
140
+ return e instanceof Expr ? e.asc() : e;
141
+ })
142
+ });
143
+ }
144
+ groupBy(...groupBy) {
145
+ return new SelectMultiple({
146
+ ...this.query(),
147
+ groupBy: groupBy.map(ExprData.create)
148
+ });
149
+ }
150
+ first() {
151
+ return new SelectSingle({ ...this.query(), singleResult: true });
152
+ }
153
+ where(...where) {
154
+ return new SelectMultiple(super.where(...where).query());
155
+ }
156
+ toExpr() {
157
+ return new Expr(ExprData.Query(this.query()));
158
+ }
159
+ }
160
+ Cursor2.SelectMultiple = SelectMultiple;
161
+ class SelectSingle extends Filterable {
162
+ query() {
163
+ return super.query();
164
+ }
165
+ leftJoin(that, ...on) {
166
+ const query = this.query();
167
+ return new SelectSingle({
168
+ ...query,
169
+ from: Target.Join(
170
+ query.from,
171
+ Target.Table(that.schema()),
172
+ "left",
173
+ Expr.and(...on).expr
174
+ )
175
+ });
176
+ }
177
+ innerJoin(that, ...on) {
178
+ const query = this.query();
179
+ return new SelectSingle({
180
+ ...query,
181
+ from: Target.Join(
182
+ query.from,
183
+ Target.Table(that.schema()),
184
+ "inner",
185
+ Expr.and(...on).expr
186
+ )
187
+ });
188
+ }
189
+ select(selection) {
190
+ return new SelectSingle({
191
+ ...this.query(),
192
+ selection: ExprData.create(selection)
193
+ });
194
+ }
195
+ orderBy(...orderBy) {
196
+ return new SelectSingle({
197
+ ...this.query(),
198
+ orderBy
199
+ });
200
+ }
201
+ groupBy(...groupBy) {
202
+ return new SelectSingle({
203
+ ...this.query(),
204
+ groupBy: groupBy.map(ExprData.create)
205
+ });
206
+ }
207
+ where(...where) {
208
+ return new SelectSingle(super.where(...where).query());
209
+ }
210
+ all() {
211
+ return new SelectMultiple({ ...this.query(), singleResult: false });
212
+ }
213
+ toExpr() {
214
+ return new Expr(ExprData.Query(this.query()));
215
+ }
216
+ }
217
+ Cursor2.SelectSingle = SelectSingle;
218
+ })(Cursor || (Cursor = {}));
219
+ export {
220
+ Cursor
221
+ };
@@ -0,0 +1,89 @@
1
+ import { Cursor } from './Cursor';
2
+ import { Formatter } from './Formatter';
3
+ import { Query } from './Query';
4
+ import { SchemaInstructions } from './Schema';
5
+ import { Statement } from './Statement';
6
+ import { Table } from './Table';
7
+ declare class Callable extends Function {
8
+ constructor(fn: Function);
9
+ }
10
+ declare abstract class DriverBase extends Callable {
11
+ formatter: Formatter;
12
+ constructor(formatter: Formatter);
13
+ all(...args: Array<any>): any;
14
+ get(...args: Array<any>): any;
15
+ sql(strings: TemplateStringsArray, ...params: Array<any>): Cursor<unknown>;
16
+ executeTemplate(expectedReturn: Query.RawReturn, strings: TemplateStringsArray, ...params: Array<any>): any;
17
+ abstract executeQuery(query: Query<any>): any;
18
+ }
19
+ interface SyncDriver {
20
+ <T>(query: Cursor<T>): T;
21
+ <T>(...queries: Array<Cursor<any>>): T;
22
+ (strings: TemplateStringsArray, ...values: any[]): any;
23
+ }
24
+ declare abstract class SyncDriver extends DriverBase {
25
+ transactionId: number;
26
+ abstract rows(stmt: Statement.Compiled): Array<object>;
27
+ abstract values(stmt: Statement.Compiled): Array<Array<any>>;
28
+ abstract execute(stmt: Statement.Compiled): void;
29
+ abstract mutate(stmt: Statement.Compiled): {
30
+ rowsAffected: number;
31
+ };
32
+ abstract schemaInstructions(tableName: string): SchemaInstructions | undefined;
33
+ migrateSchema(...tables: Array<Table<any>>): unknown;
34
+ executeQuery<T>(query: Query<T>): T;
35
+ all<T>(cursor: Cursor.SelectSingle<T>): Array<T>;
36
+ all<T>(cursor: Cursor<T>): Array<T>;
37
+ all<T>(strings: TemplateStringsArray, ...params: Array<any>): Array<T>;
38
+ get<T>(cursor: Cursor.SelectMultiple<T>): T | null;
39
+ get<T>(cursor: Cursor<T>): T;
40
+ get<T>(strings: TemplateStringsArray, ...params: Array<any>): T;
41
+ transaction<T>(run: (query: SyncDriver) => T): T;
42
+ toAsync(): SyncWrapper;
43
+ }
44
+ interface AsyncDriver {
45
+ <T>(query: Cursor<T>): Promise<T>;
46
+ <T>(...queries: Array<Cursor<any>>): Promise<T>;
47
+ (strings: TemplateStringsArray, ...values: any[]): Promise<any>;
48
+ }
49
+ declare abstract class AsyncDriver extends DriverBase {
50
+ transactionId: number;
51
+ abstract isolate(): [connection: AsyncDriver, release: () => Promise<void>];
52
+ abstract rows(stmt: Statement.Compiled): Promise<Array<object>>;
53
+ abstract values(stmt: Statement.Compiled): Promise<Array<Array<any>>>;
54
+ abstract execute(stmt: Statement.Compiled): Promise<void>;
55
+ abstract mutate(stmt: Statement.Compiled): Promise<{
56
+ rowsAffected: number;
57
+ }>;
58
+ abstract schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
59
+ migrateSchema(...tables: Array<Table<any>>): Promise<unknown>;
60
+ executeQuery<T>(query: Query<T>): Promise<T>;
61
+ all<T>(cursor: Cursor.SelectSingle<T>): Promise<Array<T>>;
62
+ all<T>(cursor: Cursor<T>): Promise<T>;
63
+ all<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<Array<T>>;
64
+ get<T>(cursor: Cursor.SelectMultiple<T>): Promise<T | null>;
65
+ get<T>(cursor: Cursor<T>): Promise<T>;
66
+ get<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<T>;
67
+ transaction<T>(run: (query: AsyncDriver) => T): Promise<T>;
68
+ }
69
+ declare class SyncWrapper extends AsyncDriver {
70
+ private sync;
71
+ lock: Promise<void> | undefined;
72
+ constructor(sync: SyncDriver);
73
+ executeQuery<T>(query: Query<T>): Promise<T>;
74
+ rows(stmt: Statement.Compiled): Promise<Array<object>>;
75
+ values(stmt: Statement.Compiled): Promise<Array<Array<any>>>;
76
+ execute(stmt: Statement.Compiled): Promise<void>;
77
+ mutate(stmt: Statement.Compiled): Promise<{
78
+ rowsAffected: number;
79
+ }>;
80
+ schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
81
+ isolate(): [connection: AsyncDriver, release: () => Promise<void>];
82
+ }
83
+ export declare namespace Driver {
84
+ type Sync = SyncDriver;
85
+ const Sync: typeof SyncDriver;
86
+ type Async = AsyncDriver;
87
+ const Async: typeof AsyncDriver;
88
+ }
89
+ export {};
package/dist/Driver.js ADDED
@@ -0,0 +1,262 @@
1
+ // src/Driver.ts
2
+ import { Cursor } from "./Cursor.js";
3
+ import { Query, QueryType } from "./Query.js";
4
+ import { Schema } from "./Schema.js";
5
+ var Callable = class extends Function {
6
+ constructor(fn) {
7
+ super();
8
+ return new Proxy(this, {
9
+ apply(_, thisArg, input) {
10
+ return fn.apply(thisArg, input);
11
+ }
12
+ });
13
+ }
14
+ };
15
+ function isTemplateStringsArray(input) {
16
+ return Boolean(Array.isArray(input) && input.raw);
17
+ }
18
+ var DriverBase = class extends Callable {
19
+ constructor(formatter) {
20
+ super((...args) => {
21
+ const [input, ...rest] = args;
22
+ if (input instanceof Cursor && rest.length === 0)
23
+ return this.executeQuery(input.query());
24
+ if (isTemplateStringsArray(input))
25
+ return this.executeTemplate(void 0, input, ...rest);
26
+ return this.executeQuery(
27
+ Query.Batch({
28
+ queries: args.filter((arg) => arg instanceof Cursor).map((arg) => arg.query())
29
+ })
30
+ );
31
+ });
32
+ this.formatter = formatter;
33
+ }
34
+ all(...args) {
35
+ const [input, ...rest] = args;
36
+ if (input instanceof Cursor.SelectSingle)
37
+ return this.executeQuery(input.all().query());
38
+ if (input instanceof Cursor)
39
+ return this.executeQuery(input.query());
40
+ return this.executeTemplate("rows", input, ...rest);
41
+ }
42
+ get(...args) {
43
+ const [input, ...rest] = args;
44
+ if (input instanceof Cursor.SelectMultiple)
45
+ return this.executeQuery(input.first().query());
46
+ if (input instanceof Cursor)
47
+ return this.executeQuery(input.query());
48
+ return this.executeTemplate("row", input, ...rest);
49
+ }
50
+ sql(strings, ...params) {
51
+ return new Cursor(Query.Raw({ strings, params }));
52
+ }
53
+ executeTemplate(expectedReturn, strings, ...params) {
54
+ return this.executeQuery(Query.Raw({ strings, params, expectedReturn }));
55
+ }
56
+ };
57
+ var SyncDriver = class extends DriverBase {
58
+ transactionId = 0;
59
+ migrateSchema(...tables) {
60
+ const queries = [];
61
+ for (const table of Object.values(tables)) {
62
+ const schema = table.schema();
63
+ const localSchema = this.schemaInstructions(schema.name);
64
+ if (!localSchema) {
65
+ queries.push(...Schema.create(schema).queries);
66
+ } else {
67
+ const changes = Schema.upgrade(this.formatter, localSchema, schema);
68
+ if (changes.length)
69
+ queries.push(...changes);
70
+ }
71
+ }
72
+ return this.executeQuery(Query.Batch({ queries }));
73
+ }
74
+ executeQuery(query) {
75
+ switch (query.type) {
76
+ case QueryType.Batch:
77
+ let result;
78
+ const stmts = query.queries;
79
+ if (stmts.length === 0)
80
+ return void 0;
81
+ if (stmts.length === 1)
82
+ return this.executeQuery(stmts[0]);
83
+ return this.transaction((cnx) => {
84
+ for (const query2 of stmts)
85
+ result = cnx.executeQuery(query2);
86
+ return result;
87
+ });
88
+ default:
89
+ const stmt = this.formatter.compile(query);
90
+ if ("selection" in query) {
91
+ const res = this.values(stmt).map(([item]) => JSON.parse(item).result);
92
+ if (query.singleResult)
93
+ return res[0];
94
+ return res;
95
+ } else if (query.type === QueryType.Raw) {
96
+ switch (query.expectedReturn) {
97
+ case "row":
98
+ return this.rows(stmt)[0];
99
+ case "rows":
100
+ return this.rows(stmt);
101
+ default:
102
+ this.execute(stmt);
103
+ return void 0;
104
+ }
105
+ } else {
106
+ return this.mutate(stmt);
107
+ }
108
+ }
109
+ }
110
+ all(...args) {
111
+ return super.all(...args);
112
+ }
113
+ get(...args) {
114
+ return super.get(...args);
115
+ }
116
+ transaction(run) {
117
+ const id = `t${this.transactionId++}`;
118
+ this.executeQuery(
119
+ Query.Transaction({ op: Query.TransactionOperation.Begin, id })
120
+ );
121
+ try {
122
+ const res = run(this);
123
+ this.executeQuery(
124
+ Query.Transaction({ op: Query.TransactionOperation.Commit, id })
125
+ );
126
+ return res;
127
+ } catch (e) {
128
+ this.executeQuery(
129
+ Query.Transaction({ op: Query.TransactionOperation.Rollback, id })
130
+ );
131
+ throw e;
132
+ }
133
+ }
134
+ toAsync() {
135
+ return new SyncWrapper(this);
136
+ }
137
+ };
138
+ var AsyncDriver = class extends DriverBase {
139
+ transactionId = 0;
140
+ async migrateSchema(...tables) {
141
+ const queries = [];
142
+ for (const table of Object.values(tables)) {
143
+ const schema = table.schema();
144
+ const localSchema = await this.schemaInstructions(schema.name);
145
+ if (!localSchema) {
146
+ queries.push(...Schema.create(schema).queries);
147
+ } else {
148
+ const changes = Schema.upgrade(this.formatter, localSchema, schema);
149
+ if (changes.length)
150
+ queries.push(...changes);
151
+ }
152
+ }
153
+ return this.executeQuery(Query.Batch({ queries }));
154
+ }
155
+ async executeQuery(query) {
156
+ switch (query.type) {
157
+ case QueryType.Batch:
158
+ let result;
159
+ const stmts = query.queries;
160
+ if (stmts.length === 0)
161
+ return void 0;
162
+ if (stmts.length === 1)
163
+ return this.executeQuery(stmts[0]);
164
+ return this.transaction(async (cnx) => {
165
+ for (const query2 of stmts)
166
+ result = await cnx.executeQuery(query2);
167
+ return result;
168
+ });
169
+ default:
170
+ const stmt = this.formatter.compile(query);
171
+ if ("selection" in query) {
172
+ const res = (await this.values(stmt)).map(
173
+ ([item]) => JSON.parse(item).result
174
+ );
175
+ if (query.singleResult)
176
+ return res[0];
177
+ return res;
178
+ } else if (query.type === QueryType.Raw) {
179
+ switch (query.expectedReturn) {
180
+ case "row":
181
+ return (await this.rows(stmt))[0];
182
+ case "rows":
183
+ return await this.rows(stmt);
184
+ default:
185
+ await this.execute(stmt);
186
+ return void 0;
187
+ }
188
+ } else {
189
+ return await this.mutate(stmt);
190
+ }
191
+ }
192
+ }
193
+ all(...args) {
194
+ return super.all(...args);
195
+ }
196
+ get(...args) {
197
+ return super.get(...args);
198
+ }
199
+ async transaction(run) {
200
+ const id = `t${this.transactionId++}`;
201
+ const [connection, release] = this.isolate();
202
+ await connection.executeQuery(
203
+ Query.Transaction({ op: Query.TransactionOperation.Begin, id })
204
+ );
205
+ try {
206
+ const res = await run(connection);
207
+ await connection.executeQuery(
208
+ Query.Transaction({ op: Query.TransactionOperation.Commit, id })
209
+ );
210
+ return res;
211
+ } catch (e) {
212
+ await connection.executeQuery(
213
+ Query.Transaction({ op: Query.TransactionOperation.Rollback, id })
214
+ );
215
+ throw e;
216
+ } finally {
217
+ await release();
218
+ }
219
+ }
220
+ };
221
+ var SyncWrapper = class extends AsyncDriver {
222
+ constructor(sync) {
223
+ super(sync.formatter);
224
+ this.sync = sync;
225
+ }
226
+ lock;
227
+ async executeQuery(query) {
228
+ await this.lock;
229
+ return super.executeQuery(query);
230
+ }
231
+ async rows(stmt) {
232
+ return this.sync.rows(stmt);
233
+ }
234
+ async values(stmt) {
235
+ return this.sync.values(stmt);
236
+ }
237
+ async execute(stmt) {
238
+ return this.sync.execute(stmt);
239
+ }
240
+ async mutate(stmt) {
241
+ return this.sync.mutate(stmt);
242
+ }
243
+ async schemaInstructions(tableName) {
244
+ return this.sync.schemaInstructions(tableName);
245
+ }
246
+ isolate() {
247
+ const connection = new SyncWrapper(this.sync);
248
+ let release, trigger = new Promise((resolve) => {
249
+ release = async () => resolve();
250
+ });
251
+ this.lock = Promise.resolve(this.lock).then(() => trigger);
252
+ return [connection, release];
253
+ }
254
+ };
255
+ var Driver;
256
+ ((Driver2) => {
257
+ Driver2.Sync = SyncDriver;
258
+ Driver2.Async = AsyncDriver;
259
+ })(Driver || (Driver = {}));
260
+ export {
261
+ Driver
262
+ };