firebird-wasm 0.2.0 → 0.3.0

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 (64) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/README.md +4 -1
  3. package/dist/.tsbuildinfo.build +1 -1
  4. package/dist/browser/engine-transport.d.ts +56 -5
  5. package/dist/browser/engine-transport.d.ts.map +1 -1
  6. package/dist/browser/engine-transport.js +271 -8
  7. package/dist/browser/engine-transport.js.map +1 -1
  8. package/dist/browser/firebird-browser.d.ts +228 -7
  9. package/dist/browser/firebird-browser.d.ts.map +1 -1
  10. package/dist/browser/firebird-browser.js +334 -26
  11. package/dist/browser/firebird-browser.js.map +1 -1
  12. package/dist/browser/index.d.ts +8 -2
  13. package/dist/browser/index.d.ts.map +1 -1
  14. package/dist/browser/index.js +19 -3
  15. package/dist/browser/index.js.map +1 -1
  16. package/dist/browser/opfs-fs.d.ts +72 -0
  17. package/dist/browser/opfs-fs.d.ts.map +1 -0
  18. package/dist/browser/opfs-fs.js +249 -0
  19. package/dist/browser/opfs-fs.js.map +1 -0
  20. package/dist/browser/shared-transport.d.ts +8 -2
  21. package/dist/browser/shared-transport.d.ts.map +1 -1
  22. package/dist/browser/shared-transport.js +29 -2
  23. package/dist/browser/shared-transport.js.map +1 -1
  24. package/dist/browser/statement-types.d.ts +18 -0
  25. package/dist/browser/statement-types.d.ts.map +1 -0
  26. package/dist/browser/statement-types.js +39 -0
  27. package/dist/browser/statement-types.js.map +1 -0
  28. package/dist/browser/value-types.d.ts +173 -0
  29. package/dist/browser/value-types.d.ts.map +1 -0
  30. package/dist/browser/value-types.js +222 -0
  31. package/dist/browser/value-types.js.map +1 -0
  32. package/dist/browser/worker-entry.d.ts.map +1 -1
  33. package/dist/browser/worker-entry.js +38 -1
  34. package/dist/browser/worker-entry.js.map +1 -1
  35. package/dist/browser/worker-protocol.d.ts +1 -1
  36. package/dist/browser/worker-protocol.d.ts.map +1 -1
  37. package/dist/browser/worker-transport.d.ts +8 -2
  38. package/dist/browser/worker-transport.d.ts.map +1 -1
  39. package/dist/browser/worker-transport.js +26 -2
  40. package/dist/browser/worker-transport.js.map +1 -1
  41. package/dist/firebird.d.ts +58 -5
  42. package/dist/firebird.d.ts.map +1 -1
  43. package/dist/firebird.js +161 -52
  44. package/dist/firebird.js.map +1 -1
  45. package/dist/index.d.ts +4 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +9 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/sql-tag.d.ts +184 -0
  50. package/dist/sql-tag.d.ts.map +1 -0
  51. package/dist/sql-tag.js +287 -0
  52. package/dist/sql-tag.js.map +1 -0
  53. package/dist/statement-types.d.ts +23 -0
  54. package/dist/statement-types.d.ts.map +1 -0
  55. package/dist/statement-types.js +44 -0
  56. package/dist/statement-types.js.map +1 -0
  57. package/dist/types.d.ts +62 -0
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/wasm/firebird-embedded.js +1 -1
  60. package/dist/wasm/firebird-embedded.wasm +0 -0
  61. package/dist/wasm-loader.d.ts +38 -2
  62. package/dist/wasm-loader.d.ts.map +1 -1
  63. package/dist/wasm-loader.js.map +1 -1
  64. package/package.json +3 -2
@@ -1,5 +1,10 @@
1
1
  import type { Attachment, Transaction } from 'node-firebird-driver';
2
- import type { FirebirdLiteOptions, QueryResult, Row, QueryParams, TransactionOptions } from './types';
2
+ import type { ArrayRow, FirebirdLiteOptions, QueryDescription, QueryResult, QueryOptions, Row, QueryParams, RowMode, TransactionOptions } from './types';
3
+ import type { SqlFragment } from './sql-tag';
4
+ /** `QueryOptions` with the array mode pinned, for the overloads below. */
5
+ type ArrayModeOptions = QueryOptions & {
6
+ rowMode: 'array';
7
+ };
3
8
  /**
4
9
  * FirebirdLite – a PGlite-style wrapper around Firebird Embedded.
5
10
  *
@@ -32,15 +37,47 @@ export declare class FirebirdLite {
32
37
  * Execute a DDL or DML statement that does not return rows.
33
38
  *
34
39
  * The statement is executed in its own auto-committed transaction.
40
+ *
41
+ * Accepts a `` sql`…` `` fragment in place of a string, in which case its
42
+ * values are bound rather than interpolated.
35
43
  */
36
- exec(sql: string): Promise<void>;
44
+ exec(sql: string | SqlFragment, params?: QueryParams): Promise<void>;
37
45
  /**
38
46
  * Execute a (parameterised) SQL statement and return the result rows.
39
47
  *
40
48
  * For SELECT queries the rows are returned as plain objects keyed by the
41
49
  * (upper-cased) column name, mirroring the PGlite convention.
50
+ *
51
+ * ```ts
52
+ * await db.query('SELECT * FROM items WHERE id = ?', [id]);
53
+ * await db.query(sql`SELECT * FROM items WHERE id = ${id}`);
54
+ * ```
55
+ */
56
+ query(sql: SqlFragment, options: ArrayModeOptions): Promise<QueryResult<ArrayRow>>;
57
+ query(sql: string | SqlFragment, params: QueryParams | undefined, options: ArrayModeOptions): Promise<QueryResult<ArrayRow>>;
58
+ query<T extends Row = Row>(sql: SqlFragment, options?: QueryOptions): Promise<QueryResult<T>>;
59
+ query<T extends Row = Row>(sql: string, params?: QueryParams, options?: QueryOptions): Promise<QueryResult<T>>;
60
+ query<T extends Row = Row>(sql: string | SqlFragment, params?: QueryParams, options?: QueryOptions): Promise<QueryResult<T>>;
61
+ /**
62
+ * Describe a statement's shape without running it.
63
+ *
64
+ * ```ts
65
+ * const shape = await db.describeQuery('SELECT id, name FROM items WHERE id = ?');
66
+ * // shape.fields → [{ name: 'ID' }, { name: 'NAME' }]
67
+ * // shape.statementType → 'SELECT'
68
+ * ```
69
+ *
70
+ * The statement is prepared and disposed, so nothing runs: describing an
71
+ * `INSERT` inserts nothing.
72
+ *
73
+ * **`params` is `undefined` here.** The native driver exposes no input
74
+ * metadata — `Statement` offers `columnLabels`, `hasResultSet` and `type`
75
+ * and nothing about `?` placeholders — and an empty array would claim the
76
+ * statement takes none. `fields` carries names only, for the same reason
77
+ * `FieldInfo` does everywhere on this backend. The WASM backend reports both
78
+ * in full.
42
79
  */
43
- query<T extends Row = Row>(sql: string, params?: QueryParams, options?: TransactionOptions): Promise<QueryResult<T>>;
80
+ describeQuery(sql: string | SqlFragment): Promise<QueryDescription>;
44
81
  /**
45
82
  * Run a function inside an explicit transaction.
46
83
  *
@@ -60,14 +97,30 @@ export declare class FirebirdLite {
60
97
  export declare class FirebirdTransaction {
61
98
  private readonly attachment;
62
99
  private readonly transaction;
100
+ private finished;
63
101
  constructor(attachment: Attachment, transaction: Transaction);
102
+ /** Whether this transaction has already been rolled back. */
103
+ get isFinished(): boolean;
104
+ /**
105
+ * Roll this transaction back and stop.
106
+ *
107
+ * The enclosing `transaction()` will not commit afterwards. Use this to
108
+ * abandon a transaction deliberately, rather than throwing an error you do
109
+ * not mean — throwing also rolls back, but it propagates to the caller.
110
+ */
111
+ rollback(): Promise<void>;
112
+ private assertUsable;
64
113
  /**
65
114
  * Execute a DDL or DML statement inside this transaction.
66
115
  */
67
- exec(sql: string, params?: QueryParams): Promise<void>;
116
+ exec(sql: string | SqlFragment, params?: QueryParams): Promise<void>;
68
117
  /**
69
118
  * Execute a SELECT statement inside this transaction and return rows.
70
119
  */
71
- query<T extends Row = Row>(sql: string, params?: QueryParams): Promise<QueryResult<T>>;
120
+ query(sql: string | SqlFragment, params: QueryParams | undefined, options: ArrayModeOptions): Promise<QueryResult<ArrayRow>>;
121
+ query<T extends Row = Row>(sql: string | SqlFragment, params?: QueryParams, options?: {
122
+ rowMode?: RowMode;
123
+ }): Promise<QueryResult<T>>;
72
124
  }
125
+ export {};
73
126
  //# sourceMappingURL=firebird.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"firebird.d.ts","sourceRoot":"","sources":["../src/firebird.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,UAAU,EACV,WAAW,EAEZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,GAAG,EACH,WAAW,EACX,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoE;IACnG,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;IAU7D;;OAEG;YACW,WAAW;IAgBzB;;;;OAIG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC;;;;;OAKG;IACG,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAC7B,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,WAAgB,EACxB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAqC1B;;;;;OAKG;IACG,WAAW,CAAC,CAAC,EACjB,EAAE,EAAE,CAAC,EAAE,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3C,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,CAAC,CAAC;IAkBb;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW;IAG3C;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAahE;;OAEG;IACG,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAC7B,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,WAAgB,GACvB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAkB3B"}
1
+ {"version":3,"file":"firebird.d.ts","sourceRoot":"","sources":["../src/firebird.ts"],"names":[],"mappings":"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"}
package/dist/firebird.js CHANGED
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FirebirdTransaction = exports.FirebirdLite = void 0;
4
4
  const node_firebird_driver_native_1 = require("node-firebird-driver-native");
5
5
  const node_firebird_driver_1 = require("node-firebird-driver");
6
+ const statement_types_1 = require("./statement-types");
7
+ const sql_tag_1 = require("./sql-tag");
6
8
  /**
7
9
  * FirebirdLite – a PGlite-style wrapper around Firebird Embedded.
8
10
  *
@@ -54,14 +56,64 @@ class FirebirdLite {
54
56
  * Execute a DDL or DML statement that does not return rows.
55
57
  *
56
58
  * The statement is executed in its own auto-committed transaction.
59
+ *
60
+ * Accepts a `` sql`…` `` fragment in place of a string, in which case its
61
+ * values are bound rather than interpolated.
57
62
  */
58
- async exec(sql) {
63
+ async exec(sql, params = []) {
64
+ // Delegated rather than reimplemented: "parameters present → prepare,
65
+ // execute, dispose; otherwise execute directly" is a rule that belongs in
66
+ // one place, and `transaction()` already wraps it in the commit-or-roll-
67
+ // back this needs. Two copies would drift the first time either grows a
68
+ // case.
69
+ await this.transaction((tx) => tx.exec(sql, params));
70
+ }
71
+ async query(sql, paramsOrOptions = [], maybeOptions = {}) {
59
72
  await this.ensureReady();
73
+ const { statement, options } = (0, sql_tag_1.resolveQueryCall)(sql, paramsOrOptions, maybeOptions);
74
+ const rowMode = options.rowMode ?? 'object';
60
75
  const attachment = this.attachment;
61
- const transaction = await attachment.startTransaction();
76
+ const txOptions = buildTransactionOptions(options);
77
+ const transaction = await attachment.startTransaction(txOptions);
62
78
  try {
63
- await attachment.execute(transaction, sql);
79
+ const stmt = await attachment.prepare(transaction, statement.sql);
80
+ let rows;
81
+ let fields;
82
+ // Disposed in `finally`, not after the fetch: a statement that throws on
83
+ // execute — a lock conflict, an overflow, a wrong parameter count — would
84
+ // otherwise leak its handle, and the retry loop such failures are usually
85
+ // wrapped in leaks one per attempt until the attachment refuses more.
86
+ try {
87
+ const columnLabels = await stmt.columnLabels;
88
+ fields = columnLabels.map((label) => ({ name: label.toUpperCase() }));
89
+ if (stmt.hasResultSet) {
90
+ const resultSet = await stmt.executeQuery(transaction, statement.params);
91
+ // Same reasoning one level down: a failing fetch must still close.
92
+ try {
93
+ const rawRows = await resultSet.fetch();
94
+ // The driver already hands back positional rows, so array mode is
95
+ // the shape that costs nothing — object mode is the one that
96
+ // builds.
97
+ rows = (rowMode === 'array'
98
+ ? rawRows
99
+ : rawRows.map((cols) => Object.fromEntries(fields.map((f, i) => [f.name, cols[i]]))));
100
+ }
101
+ finally {
102
+ await resultSet.close().catch(() => undefined);
103
+ }
104
+ }
105
+ else {
106
+ await stmt.execute(transaction, statement.params);
107
+ rows = [];
108
+ }
109
+ }
110
+ finally {
111
+ await stmt.dispose().catch(() => undefined);
112
+ }
113
+ // After the statement is disposed, as before — the commit is the last
114
+ // thing that happens on the success path.
64
115
  await transaction.commit();
116
+ return { rows, fields };
65
117
  }
66
118
  catch (err) {
67
119
  await transaction.rollback().catch(() => undefined);
@@ -69,40 +121,49 @@ class FirebirdLite {
69
121
  }
70
122
  }
71
123
  /**
72
- * Execute a (parameterised) SQL statement and return the result rows.
124
+ * Describe a statement's shape without running it.
125
+ *
126
+ * ```ts
127
+ * const shape = await db.describeQuery('SELECT id, name FROM items WHERE id = ?');
128
+ * // shape.fields → [{ name: 'ID' }, { name: 'NAME' }]
129
+ * // shape.statementType → 'SELECT'
130
+ * ```
73
131
  *
74
- * For SELECT queries the rows are returned as plain objects keyed by the
75
- * (upper-cased) column name, mirroring the PGlite convention.
132
+ * The statement is prepared and disposed, so nothing runs: describing an
133
+ * `INSERT` inserts nothing.
134
+ *
135
+ * **`params` is `undefined` here.** The native driver exposes no input
136
+ * metadata — `Statement` offers `columnLabels`, `hasResultSet` and `type`
137
+ * and nothing about `?` placeholders — and an empty array would claim the
138
+ * statement takes none. `fields` carries names only, for the same reason
139
+ * `FieldInfo` does everywhere on this backend. The WASM backend reports both
140
+ * in full.
76
141
  */
77
- async query(sql, params = [], options = {}) {
142
+ async describeQuery(sql) {
78
143
  await this.ensureReady();
79
144
  const attachment = this.attachment;
80
- const txOptions = buildTransactionOptions(options);
81
- const transaction = await attachment.startTransaction(txOptions);
145
+ const text = (0, sql_tag_1.toStatement)(sql).sql;
146
+ const transaction = await attachment.startTransaction();
82
147
  try {
83
- const stmt = await attachment.prepare(transaction, sql);
84
- const columnLabels = await stmt.columnLabels;
85
- const fields = columnLabels.map((label) => ({
86
- name: label.toUpperCase(),
87
- }));
88
- let rows;
89
- if (stmt.hasResultSet) {
90
- const resultSet = await stmt.executeQuery(transaction, params);
91
- const rawRows = await resultSet.fetch();
92
- await resultSet.close();
93
- rows = rawRows.map((cols) => Object.fromEntries(fields.map((f, i) => [f.name, cols[i]])));
148
+ const stmt = await attachment.prepare(transaction, text);
149
+ try {
150
+ const columnLabels = await stmt.columnLabels;
151
+ const type = await stmt.type;
152
+ return {
153
+ params: undefined,
154
+ fields: columnLabels.map((label) => ({ name: label.toUpperCase() })),
155
+ statementType: (0, statement_types_1.statementKind)(type),
156
+ hasResultSet: stmt.hasResultSet,
157
+ };
94
158
  }
95
- else {
96
- await stmt.execute(transaction, params);
97
- rows = [];
159
+ finally {
160
+ await stmt.dispose().catch(() => undefined);
98
161
  }
99
- await stmt.dispose();
100
- await transaction.commit();
101
- return { rows, fields };
102
162
  }
103
- catch (err) {
104
- await transaction.rollback().catch(() => undefined);
105
- throw err;
163
+ finally {
164
+ // Nothing ran, so there is nothing to commit — but the transaction still
165
+ // has to be finished.
166
+ await transaction.commit().catch(() => undefined);
106
167
  }
107
168
  }
108
169
  /**
@@ -117,15 +178,24 @@ class FirebirdLite {
117
178
  const txOptions = buildTransactionOptions(options);
118
179
  const transaction = await attachment.startTransaction(txOptions);
119
180
  const tx = new FirebirdTransaction(attachment, transaction);
181
+ let result;
120
182
  try {
121
- const result = await fn(tx);
122
- await transaction.commit();
123
- return result;
183
+ result = await fn(tx);
124
184
  }
125
185
  catch (err) {
126
- await transaction.rollback().catch(() => undefined);
186
+ // The callback may have rolled back before throwing; rolling back twice
187
+ // targets a transaction the driver has already finished with.
188
+ if (!tx.isFinished) {
189
+ await transaction.rollback().catch(() => undefined);
190
+ }
127
191
  throw err;
128
192
  }
193
+ // A callback that rolled back deliberately must not then be committed.
194
+ if (tx.isFinished) {
195
+ return result;
196
+ }
197
+ await transaction.commit();
198
+ return result;
129
199
  }
130
200
  /**
131
201
  * Close the database connection and release all resources.
@@ -153,39 +223,78 @@ class FirebirdTransaction {
153
223
  constructor(attachment, transaction) {
154
224
  this.attachment = attachment;
155
225
  this.transaction = transaction;
226
+ this.finished = false;
227
+ }
228
+ /** Whether this transaction has already been rolled back. */
229
+ get isFinished() {
230
+ return this.finished;
231
+ }
232
+ /**
233
+ * Roll this transaction back and stop.
234
+ *
235
+ * The enclosing `transaction()` will not commit afterwards. Use this to
236
+ * abandon a transaction deliberately, rather than throwing an error you do
237
+ * not mean — throwing also rolls back, but it propagates to the caller.
238
+ */
239
+ async rollback() {
240
+ if (this.finished)
241
+ return;
242
+ this.finished = true;
243
+ await this.transaction.rollback();
244
+ }
245
+ assertUsable() {
246
+ if (this.finished) {
247
+ throw new Error('Transaction has already been rolled back');
248
+ }
156
249
  }
157
250
  /**
158
251
  * Execute a DDL or DML statement inside this transaction.
159
252
  */
160
253
  async exec(sql, params = []) {
161
- if (params.length > 0) {
162
- const stmt = await this.attachment.prepare(this.transaction, sql);
254
+ this.assertUsable();
255
+ const statement = (0, sql_tag_1.toStatement)(sql, params);
256
+ if (statement.params.length > 0) {
257
+ const stmt = await this.attachment.prepare(this.transaction, statement.sql);
163
258
  try {
164
- await stmt.execute(this.transaction, params);
259
+ await stmt.execute(this.transaction, statement.params);
165
260
  }
166
261
  finally {
167
262
  await stmt.dispose().catch(() => undefined);
168
263
  }
169
264
  }
170
265
  else {
171
- await this.attachment.execute(this.transaction, sql);
266
+ await this.attachment.execute(this.transaction, statement.sql);
172
267
  }
173
268
  }
174
- /**
175
- * Execute a SELECT statement inside this transaction and return rows.
176
- */
177
- async query(sql, params = []) {
178
- const stmt = await this.attachment.prepare(this.transaction, sql);
179
- const columnLabels = await stmt.columnLabels;
180
- const fields = columnLabels.map((label) => ({
181
- name: label.toUpperCase(),
182
- }));
183
- const resultSet = await stmt.executeQuery(this.transaction, params);
184
- const rawRows = await resultSet.fetch();
185
- await resultSet.close();
186
- await stmt.dispose();
187
- const rows = rawRows.map((cols) => Object.fromEntries(fields.map((f, i) => [f.name, cols[i]])));
188
- return { rows, fields };
269
+ async query(sql, params = [], options = {}) {
270
+ this.assertUsable();
271
+ const statement = (0, sql_tag_1.toStatement)(sql, params);
272
+ const rowMode = options.rowMode ?? 'object';
273
+ const stmt = await this.attachment.prepare(this.transaction, statement.sql);
274
+ // Same leak as FirebirdLite.query had: a statement or result set that
275
+ // throws must still be released. More so here, because a transaction
276
+ // callback that catches its own errors goes on using the same attachment.
277
+ try {
278
+ const columnLabels = await stmt.columnLabels;
279
+ const fields = columnLabels.map((label) => ({
280
+ name: label.toUpperCase(),
281
+ }));
282
+ const resultSet = await stmt.executeQuery(this.transaction, statement.params);
283
+ let rawRows;
284
+ try {
285
+ rawRows = await resultSet.fetch();
286
+ }
287
+ finally {
288
+ await resultSet.close().catch(() => undefined);
289
+ }
290
+ const rows = (rowMode === 'array'
291
+ ? rawRows
292
+ : rawRows.map((cols) => Object.fromEntries(fields.map((f, i) => [f.name, cols[i]]))));
293
+ return { rows, fields };
294
+ }
295
+ finally {
296
+ await stmt.dispose().catch(() => undefined);
297
+ }
189
298
  }
190
299
  }
191
300
  exports.FirebirdTransaction = FirebirdTransaction;
@@ -1 +1 @@
1
- {"version":3,"file":"firebird.js","sourceRoot":"","sources":["../src/firebird.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"firebird.js","sourceRoot":"","sources":["../src/firebird.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -16,7 +16,10 @@
16
16
  * ```
17
17
  */
18
18
  export { FirebirdLite, FirebirdTransaction } from './firebird';
19
- export type { FirebirdLiteOptions, QueryResult, QueryParams, Row, FieldInfo, TransactionOptions, IsolationLevel, } from './types';
19
+ export { sql, SqlFragment, RawSql, isSqlFragment, toStatement } from './sql-tag';
20
+ export { statementKind } from './statement-types';
21
+ export type { SqlTag, Statement } from './sql-tag';
22
+ export type { FirebirdLiteOptions, QueryResult, QueryParams, Row, FieldInfo, QueryOptions, QueryDescription, StatementKind, RowMode, ArrayRow, TransactionOptions, IsolationLevel, } from './types';
20
23
  export { loadFirebirdWasm, allocString } from './wasm-loader';
21
24
  export type { FirebirdWasmModule, WasmLoadOptions, EmscriptenFS, FbHandle, } from './wasm-loader';
22
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC/D,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,GAAG,EACH,SAAS,EACT,kBAAkB,EAClB,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,QAAQ,GACT,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEnD,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,GAAG,EACH,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,QAAQ,EACR,kBAAkB,EAClB,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,QAAQ,GACT,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -17,10 +17,18 @@
17
17
  * ```
18
18
  */
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.allocString = exports.loadFirebirdWasm = exports.FirebirdTransaction = exports.FirebirdLite = void 0;
20
+ exports.allocString = exports.loadFirebirdWasm = exports.statementKind = exports.toStatement = exports.isSqlFragment = exports.RawSql = exports.SqlFragment = exports.sql = exports.FirebirdTransaction = exports.FirebirdLite = void 0;
21
21
  var firebird_1 = require("./firebird");
22
22
  Object.defineProperty(exports, "FirebirdLite", { enumerable: true, get: function () { return firebird_1.FirebirdLite; } });
23
23
  Object.defineProperty(exports, "FirebirdTransaction", { enumerable: true, get: function () { return firebird_1.FirebirdTransaction; } });
24
+ var sql_tag_1 = require("./sql-tag");
25
+ Object.defineProperty(exports, "sql", { enumerable: true, get: function () { return sql_tag_1.sql; } });
26
+ Object.defineProperty(exports, "SqlFragment", { enumerable: true, get: function () { return sql_tag_1.SqlFragment; } });
27
+ Object.defineProperty(exports, "RawSql", { enumerable: true, get: function () { return sql_tag_1.RawSql; } });
28
+ Object.defineProperty(exports, "isSqlFragment", { enumerable: true, get: function () { return sql_tag_1.isSqlFragment; } });
29
+ Object.defineProperty(exports, "toStatement", { enumerable: true, get: function () { return sql_tag_1.toStatement; } });
30
+ var statement_types_1 = require("./statement-types");
31
+ Object.defineProperty(exports, "statementKind", { enumerable: true, get: function () { return statement_types_1.statementKind; } });
24
32
  // WASM loader (available on all platforms)
25
33
  var wasm_loader_1 = require("./wasm-loader");
26
34
  Object.defineProperty(exports, "loadFirebirdWasm", { enumerable: true, get: function () { return wasm_loader_1.loadFirebirdWasm; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAEH,uCAA+D;AAAtD,wGAAA,YAAY,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAW1C,2CAA2C;AAC3C,6CAA8D;AAArD,+GAAA,gBAAgB,OAAA;AAAE,0GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAEH,uCAA+D;AAAtD,wGAAA,YAAY,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAE1C,qCAAiF;AAAxE,8FAAA,GAAG,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,iGAAA,MAAM,OAAA;AAAE,wGAAA,aAAa,OAAA;AAAE,sGAAA,WAAW,OAAA;AAC7D,qDAAkD;AAAzC,gHAAA,aAAa,OAAA;AAkBtB,2CAA2C;AAC3C,6CAA8D;AAArD,+GAAA,gBAAgB,OAAA;AAAE,0GAAA,WAAW,OAAA"}