rado 0.1.23 → 0.1.25

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 (80) hide show
  1. package/README.md +1 -1
  2. package/dist/driver/better-sqlite3.d.ts +15 -17
  3. package/dist/driver/better-sqlite3.js +25 -18
  4. package/dist/driver/sql.js.d.ts +15 -17
  5. package/dist/driver/sql.js.js +29 -26
  6. package/dist/driver/sqlite3.d.ts +18 -20
  7. package/dist/driver/sqlite3.js +40 -29
  8. package/dist/index.d.ts +20 -20
  9. package/dist/lib/Column.d.ts +57 -57
  10. package/dist/lib/Cursor.d.ts +78 -77
  11. package/dist/lib/Cursor.js +3 -0
  12. package/dist/lib/Driver.d.ts +105 -89
  13. package/dist/lib/Driver.js +72 -28
  14. package/dist/lib/Expr.d.ts +154 -154
  15. package/dist/lib/Fields.d.ts +13 -13
  16. package/dist/lib/Formatter.d.ts +56 -56
  17. package/dist/lib/Formatter.js +14 -4
  18. package/dist/lib/Functions.d.ts +7 -7
  19. package/dist/lib/Id.d.ts +3 -3
  20. package/dist/lib/Index.d.ts +17 -17
  21. package/dist/lib/Index.js +3 -3
  22. package/dist/lib/Ops.d.ts +8 -8
  23. package/dist/lib/OrderBy.d.ts +9 -9
  24. package/dist/lib/Param.d.ts +20 -15
  25. package/dist/lib/Param.js +10 -1
  26. package/dist/lib/Query.d.ts +108 -108
  27. package/dist/lib/Sanitizer.d.ts +4 -4
  28. package/dist/lib/Schema.d.ts +18 -18
  29. package/dist/lib/Schema.js +4 -4
  30. package/dist/lib/Selection.d.ts +20 -20
  31. package/dist/lib/Statement.d.ts +71 -61
  32. package/dist/lib/Statement.js +46 -5
  33. package/dist/lib/Table.d.ts +59 -58
  34. package/dist/lib/Table.js +4 -7
  35. package/dist/lib/Target.d.ts +30 -30
  36. package/dist/lib/Update.d.ts +4 -4
  37. package/dist/sqlite/SqliteFormatter.d.ts +11 -11
  38. package/dist/sqlite/SqliteFunctions.d.ts +156 -156
  39. package/dist/sqlite/SqliteSchema.d.ts +25 -24
  40. package/dist/sqlite/SqliteSchema.js +5 -4
  41. package/dist/sqlite.d.ts +2 -2
  42. package/package.json +47 -47
  43. package/dist/Column.d.ts +0 -41
  44. package/dist/Column.js +0 -58
  45. package/dist/Cursor.d.ts +0 -77
  46. package/dist/Cursor.js +0 -211
  47. package/dist/Driver.d.ts +0 -72
  48. package/dist/Driver.js +0 -145
  49. package/dist/Expr.d.ts +0 -149
  50. package/dist/Expr.js +0 -284
  51. package/dist/Fields.d.ts +0 -9
  52. package/dist/Fields.js +0 -0
  53. package/dist/Formatter.d.ts +0 -50
  54. package/dist/Formatter.js +0 -453
  55. package/dist/Functions.d.ts +0 -8
  56. package/dist/Functions.js +0 -11
  57. package/dist/Key.d.ts +0 -5
  58. package/dist/Ops.d.ts +0 -8
  59. package/dist/Ops.js +0 -46
  60. package/dist/OrderBy.d.ts +0 -9
  61. package/dist/OrderBy.js +0 -9
  62. package/dist/Param.d.ts +0 -15
  63. package/dist/Param.js +0 -18
  64. package/dist/Query.d.ts +0 -94
  65. package/dist/Query.js +0 -57
  66. package/dist/Sanitizer.d.ts +0 -4
  67. package/dist/Sanitizer.js +0 -0
  68. package/dist/Schema.d.ts +0 -10
  69. package/dist/Selection.d.ts +0 -18
  70. package/dist/Selection.js +0 -0
  71. package/dist/Statement.d.ts +0 -57
  72. package/dist/Statement.js +0 -184
  73. package/dist/Table.d.ts +0 -47
  74. package/dist/Table.js +0 -82
  75. package/dist/Target.d.ts +0 -30
  76. package/dist/Target.js +0 -37
  77. package/dist/Update.d.ts +0 -4
  78. package/dist/Update.js +0 -0
  79. package/dist/sqlite/index.d.ts +0 -2
  80. package/dist/sqlite/index.js +0 -3
@@ -1,77 +1,78 @@
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
- }
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
+ static all(strings: TemplateStringsArray, ...params: Array<any>): Cursor<any>;
12
+ query(): Query<T>;
13
+ toJSON(): Query<T>;
14
+ }
15
+ 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<{
24
+ rowsAffected: number;
25
+ }> {
26
+ query(): Query.Delete;
27
+ }
28
+ class Update<T> extends Filterable<{
29
+ rowsAffected: number;
30
+ }> {
31
+ query: () => Query.Update;
32
+ set(set: UpdateSet<T>): Update<T>;
33
+ }
34
+ class InsertValuesReturning<T> extends Cursor<T> {
35
+ }
36
+ class InsertValues extends Cursor<{
37
+ rowsAffected: number;
38
+ }> {
39
+ query(): Query.Insert;
40
+ returning<X extends Selection>(selection: X): InsertValuesReturning<Selection.Infer<X>>;
41
+ }
42
+ class Insert<T> {
43
+ protected into: Schema;
44
+ constructor(into: Schema);
45
+ values(...data: Array<Table.Insert<T>>): InsertValues;
46
+ }
47
+ class Create extends Cursor<void> {
48
+ protected table: Schema;
49
+ constructor(table: Schema);
50
+ }
51
+ class Batch<T = void> extends Cursor<T> {
52
+ protected queries: Array<Query>;
53
+ constructor(queries: Array<Query>);
54
+ }
55
+ class SelectMultiple<T> extends Filterable<Array<T>> {
56
+ query(): Query.Select;
57
+ leftJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectMultiple<T>;
58
+ innerJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectMultiple<T>;
59
+ select<X extends Selection>(selection: X): SelectMultiple<Selection.Infer<X>>;
60
+ count(): SelectSingle<number>;
61
+ orderBy(...orderBy: Array<Expr<any> | OrderBy>): SelectMultiple<T>;
62
+ groupBy(...groupBy: Array<Expr<any>>): SelectMultiple<T>;
63
+ first(): SelectSingle<T | undefined>;
64
+ where(...where: Array<EV<boolean>>): SelectMultiple<T>;
65
+ toExpr(): Expr<T>;
66
+ }
67
+ class SelectSingle<T> extends Filterable<T> {
68
+ query(): Query.Select;
69
+ leftJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectSingle<T>;
70
+ innerJoin<C>(that: Table<C>, ...on: Array<EV<boolean>>): SelectSingle<T>;
71
+ select<X extends Selection>(selection: X): SelectSingle<Selection.Infer<X>>;
72
+ orderBy(...orderBy: Array<OrderBy>): SelectSingle<T>;
73
+ groupBy(...groupBy: Array<Expr<any>>): SelectSingle<T>;
74
+ where(...where: Array<EV<boolean>>): SelectSingle<T>;
75
+ all(): SelectMultiple<T>;
76
+ toExpr(): Expr<T>;
77
+ }
78
+ }
@@ -15,6 +15,9 @@ var Cursor = class {
15
15
  value: () => query
16
16
  });
17
17
  }
18
+ static all(strings, ...params) {
19
+ return new Cursor(Query.Raw({ expectedReturn: "rows", strings, params }));
20
+ }
18
21
  query() {
19
22
  throw new Error("Not implemented");
20
23
  }
@@ -1,89 +1,105 @@
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 {};
1
+ import { Cursor } from './Cursor';
2
+ import { Expr } from './Expr';
3
+ import { Formatter } from './Formatter';
4
+ import { Query } from './Query';
5
+ import { SchemaInstructions } from './Schema';
6
+ import { CompiledStatement } from './Statement';
7
+ import { Table } from './Table';
8
+ declare class Callable extends Function {
9
+ constructor(fn: Function);
10
+ }
11
+ declare abstract class DriverBase extends Callable {
12
+ formatter: Formatter;
13
+ constructor(formatter: Formatter);
14
+ compile<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): [Query<T>, CompiledStatement];
15
+ all(...args: Array<any>): any;
16
+ get(...args: Array<any>): any;
17
+ sql(strings: TemplateStringsArray, ...params: Array<any>): Cursor<unknown>;
18
+ executeTemplate(expectedReturn: Query.RawReturn, strings: TemplateStringsArray, ...params: Array<any>): any;
19
+ abstract executeQuery(query: Query<any>): any;
20
+ }
21
+ type ParamTypes<Params extends [...any[]]> = {
22
+ [K in keyof Params]: Params[K] extends Expr<infer T> ? T : never;
23
+ } & {
24
+ length: Params['length'];
25
+ };
26
+ interface SyncDriver {
27
+ <T>(query: Cursor<T>): T;
28
+ <T>(...queries: Array<Cursor<any>>): T;
29
+ (strings: TemplateStringsArray, ...values: any[]): any;
30
+ }
31
+ declare abstract class SyncDriver extends DriverBase {
32
+ transactionId: number;
33
+ abstract prepareStatement(stmt: CompiledStatement): SyncPreparedStatement;
34
+ abstract schemaInstructions(tableName: string): SchemaInstructions | undefined;
35
+ prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): (...params: ParamTypes<T>) => R;
36
+ migrateSchema(...tables: Array<Table<any>>): unknown;
37
+ executeQuery<T>(query: Query<T>, stmt?: SyncPreparedStatement, params?: Array<any>): T;
38
+ all<T>(cursor: Cursor.SelectSingle<T>): Array<T>;
39
+ all<T>(cursor: Cursor<T>): T;
40
+ all<T>(strings: TemplateStringsArray, ...params: Array<any>): Array<T>;
41
+ get<T>(cursor: Cursor.SelectMultiple<T>): T | null;
42
+ get<T>(cursor: Cursor<T>): T;
43
+ get<T>(strings: TemplateStringsArray, ...params: Array<any>): T;
44
+ transaction<T>(run: (query: SyncDriver) => T): T;
45
+ toAsync(): SyncWrapper;
46
+ }
47
+ interface SyncPreparedStatement {
48
+ run(params?: Array<any>): {
49
+ rowsAffected: number;
50
+ };
51
+ all<T>(params?: Array<any>): Array<T>;
52
+ get<T>(params?: Array<any>): T;
53
+ execute(params?: Array<any>): void;
54
+ }
55
+ interface AsyncDriver {
56
+ <T>(query: Cursor<T>): Promise<T>;
57
+ <T>(...queries: Array<Cursor<any>>): Promise<T>;
58
+ (strings: TemplateStringsArray, ...values: any[]): Promise<any>;
59
+ }
60
+ declare abstract class AsyncDriver extends DriverBase {
61
+ transactionId: number;
62
+ abstract isolate(): [connection: AsyncDriver, release: () => Promise<void>];
63
+ abstract prepareStatement(stmt: CompiledStatement): AsyncPreparedStatement;
64
+ abstract schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
65
+ prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): (...params: ParamTypes<T>) => Promise<R>;
66
+ migrateSchema(...tables: Array<Table<any>>): Promise<unknown>;
67
+ executeQuery<T>(query: Query<T>, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<T>;
68
+ all<T>(cursor: Cursor.SelectSingle<T>): Promise<Array<T>>;
69
+ all<T>(cursor: Cursor<T>): Promise<T>;
70
+ all<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<Array<T>>;
71
+ get<T>(cursor: Cursor.SelectMultiple<T>): Promise<T | null>;
72
+ get<T>(cursor: Cursor<T>): Promise<T>;
73
+ get<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<T>;
74
+ transaction<T>(run: (query: AsyncDriver) => T): Promise<T>;
75
+ }
76
+ declare class SyncWrapper extends AsyncDriver {
77
+ private sync;
78
+ lock: Promise<void> | undefined;
79
+ constructor(sync: SyncDriver);
80
+ executeQuery<T>(query: Query<T>, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<T>;
81
+ prepareStatement(stmt: CompiledStatement): AsyncPreparedStatement;
82
+ schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
83
+ isolate(): [connection: AsyncDriver, release: () => Promise<void>];
84
+ }
85
+ interface AsyncPreparedStatement {
86
+ run(params?: Array<any>): Promise<{
87
+ rowsAffected: number;
88
+ }>;
89
+ all<T>(params?: Array<any>): Promise<Array<T>>;
90
+ get<T>(params?: Array<any>): Promise<T>;
91
+ execute(params?: Array<any>): Promise<void>;
92
+ }
93
+ export declare namespace Driver {
94
+ type Sync = SyncDriver;
95
+ const Sync: typeof SyncDriver;
96
+ namespace Sync {
97
+ type PreparedStatement = SyncPreparedStatement;
98
+ }
99
+ type Async = AsyncDriver;
100
+ const Async: typeof AsyncDriver;
101
+ namespace Async {
102
+ type PreparedStatement = AsyncPreparedStatement;
103
+ }
104
+ }
105
+ export {};
@@ -1,5 +1,7 @@
1
1
  // src/lib/Driver.ts
2
2
  import { Cursor } from "./Cursor.js";
3
+ import { Expr, ExprData } from "./Expr.js";
4
+ import { ParamData } from "./Param.js";
3
5
  import { Query, QueryType } from "./Query.js";
4
6
  import { Schema } from "./Schema.js";
5
7
  var Callable = class extends Function {
@@ -31,6 +33,16 @@ var DriverBase = class extends Callable {
31
33
  });
32
34
  this.formatter = formatter;
33
35
  }
36
+ compile(create) {
37
+ const { length } = create;
38
+ const paramNames = Array.from({ length }, (_, i) => `p${i}`);
39
+ const params = paramNames.map(
40
+ (name) => new Expr(ExprData.Param(ParamData.Named(name)))
41
+ );
42
+ const cursor = create(...params);
43
+ const query = cursor.query();
44
+ return [query, this.formatter.compile(query)];
45
+ }
34
46
  all(...args) {
35
47
  const [input, ...rest] = args;
36
48
  if (input instanceof Cursor.SelectSingle)
@@ -56,6 +68,16 @@ var DriverBase = class extends Callable {
56
68
  };
57
69
  var SyncDriver = class extends DriverBase {
58
70
  transactionId = 0;
71
+ prepare(create) {
72
+ const [query, compiled] = this.compile(create);
73
+ const prepared = this.prepareStatement(compiled);
74
+ return (...params) => {
75
+ const namedParams = Object.fromEntries(
76
+ params.map((value, i) => [`p${i}`, value])
77
+ );
78
+ return this.executeQuery(query, prepared, compiled.params(namedParams));
79
+ };
80
+ }
59
81
  migrateSchema(...tables) {
60
82
  const queries = [];
61
83
  for (const table of Object.values(tables)) {
@@ -71,7 +93,7 @@ var SyncDriver = class extends DriverBase {
71
93
  }
72
94
  return this.executeQuery(Query.Batch({ queries }));
73
95
  }
74
- executeQuery(query) {
96
+ executeQuery(query, stmt, params) {
75
97
  switch (query.type) {
76
98
  case QueryType.Batch:
77
99
  let result;
@@ -86,24 +108,26 @@ var SyncDriver = class extends DriverBase {
86
108
  return result;
87
109
  });
88
110
  default:
89
- const stmt = this.formatter.compile(query);
111
+ const compiled = stmt ? void 0 : this.formatter.compile(query);
112
+ stmt = stmt || this.prepareStatement(compiled);
113
+ params = params || compiled.params();
90
114
  if ("selection" in query) {
91
- const res = this.values(stmt).map(([item]) => JSON.parse(item).result);
115
+ const res = stmt.all(params).map((row) => JSON.parse(row.result).result);
92
116
  if (query.singleResult)
93
117
  return res[0];
94
118
  return res;
95
119
  } else if (query.type === QueryType.Raw) {
96
120
  switch (query.expectedReturn) {
97
121
  case "row":
98
- return this.rows(stmt)[0];
122
+ return stmt.all(params)[0];
99
123
  case "rows":
100
- return this.rows(stmt);
124
+ return stmt.all(params);
101
125
  default:
102
- this.execute(stmt);
126
+ stmt.execute(params);
103
127
  return void 0;
104
128
  }
105
129
  } else {
106
- return this.mutate(stmt);
130
+ return stmt.run(params);
107
131
  }
108
132
  }
109
133
  }
@@ -137,6 +161,16 @@ var SyncDriver = class extends DriverBase {
137
161
  };
138
162
  var AsyncDriver = class extends DriverBase {
139
163
  transactionId = 0;
164
+ prepare(create) {
165
+ const [query, compiled] = this.compile(create);
166
+ const prepared = this.prepareStatement(compiled);
167
+ return (...params) => {
168
+ const namedParams = Object.fromEntries(
169
+ params.map((value, i) => [`p${i}`, value])
170
+ );
171
+ return this.executeQuery(query, prepared, compiled.params(namedParams));
172
+ };
173
+ }
140
174
  async migrateSchema(...tables) {
141
175
  const queries = [];
142
176
  for (const table of Object.values(tables)) {
@@ -152,7 +186,7 @@ var AsyncDriver = class extends DriverBase {
152
186
  }
153
187
  return this.executeQuery(Query.Batch({ queries }));
154
188
  }
155
- async executeQuery(query) {
189
+ async executeQuery(query, stmt, params) {
156
190
  switch (query.type) {
157
191
  case QueryType.Batch:
158
192
  let result;
@@ -167,10 +201,12 @@ var AsyncDriver = class extends DriverBase {
167
201
  return result;
168
202
  });
169
203
  default:
170
- const stmt = this.formatter.compile(query);
204
+ const compiled = stmt ? void 0 : this.formatter.compile(query);
205
+ stmt = stmt || this.prepareStatement(compiled);
206
+ params = params || compiled.params();
171
207
  if ("selection" in query) {
172
- const res = (await this.values(stmt)).map(
173
- ([item]) => JSON.parse(item).result
208
+ const res = (await stmt.all(params)).map(
209
+ (item) => JSON.parse(item.result).result
174
210
  );
175
211
  if (query.singleResult)
176
212
  return res[0];
@@ -178,15 +214,15 @@ var AsyncDriver = class extends DriverBase {
178
214
  } else if (query.type === QueryType.Raw) {
179
215
  switch (query.expectedReturn) {
180
216
  case "row":
181
- return (await this.rows(stmt))[0];
217
+ return (await stmt.all(params))[0];
182
218
  case "rows":
183
- return await this.rows(stmt);
219
+ return await stmt.all(params);
184
220
  default:
185
- await this.execute(stmt);
221
+ await stmt.execute(params);
186
222
  return void 0;
187
223
  }
188
224
  } else {
189
- return await this.mutate(stmt);
225
+ return await stmt.run(params);
190
226
  }
191
227
  }
192
228
  }
@@ -218,27 +254,35 @@ var AsyncDriver = class extends DriverBase {
218
254
  }
219
255
  }
220
256
  };
257
+ var SyncPreparedStatementWrapper = class {
258
+ constructor(stmt) {
259
+ this.stmt = stmt;
260
+ }
261
+ async run(params) {
262
+ return this.stmt.run(params);
263
+ }
264
+ async all(params) {
265
+ return this.stmt.all(params);
266
+ }
267
+ async get(params) {
268
+ return this.stmt.get(params);
269
+ }
270
+ async execute(params) {
271
+ return this.stmt.execute(params);
272
+ }
273
+ };
221
274
  var SyncWrapper = class extends AsyncDriver {
222
275
  constructor(sync) {
223
276
  super(sync.formatter);
224
277
  this.sync = sync;
225
278
  }
226
279
  lock;
227
- async executeQuery(query) {
280
+ async executeQuery(query, stmt, params) {
228
281
  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);
282
+ return super.executeQuery(query, stmt, params);
239
283
  }
240
- async mutate(stmt) {
241
- return this.sync.mutate(stmt);
284
+ prepareStatement(stmt) {
285
+ return new SyncPreparedStatementWrapper(this.sync.prepareStatement(stmt));
242
286
  }
243
287
  async schemaInstructions(tableName) {
244
288
  return this.sync.schemaInstructions(tableName);