firebird-wasm 0.6.1 → 0.8.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.
- package/CHANGELOG.md +224 -0
- package/README.md +5 -4
- package/dist/.tsbuildinfo.build +1 -1
- package/dist/browser/db-lock.d.ts +11 -4
- package/dist/browser/db-lock.d.ts.map +1 -1
- package/dist/browser/db-lock.js +60 -10
- package/dist/browser/db-lock.js.map +1 -1
- package/dist/browser/engine-transport.d.ts +20 -2
- package/dist/browser/engine-transport.d.ts.map +1 -1
- package/dist/browser/engine-transport.js +111 -24
- package/dist/browser/engine-transport.js.map +1 -1
- package/dist/browser/firebird-browser.d.ts +14 -6
- package/dist/browser/firebird-browser.d.ts.map +1 -1
- package/dist/browser/firebird-browser.js +82 -33
- package/dist/browser/firebird-browser.js.map +1 -1
- package/dist/browser/index.d.ts +5 -2
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +14 -6
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/serve-engine.d.ts +30 -0
- package/dist/browser/serve-engine.d.ts.map +1 -0
- package/dist/browser/serve-engine.js +93 -0
- package/dist/browser/serve-engine.js.map +1 -0
- package/dist/browser/worker-entry.d.ts +8 -22
- package/dist/browser/worker-entry.d.ts.map +1 -1
- package/dist/browser/worker-entry.js +18 -79
- package/dist/browser/worker-entry.js.map +1 -1
- package/dist/electric/apply.d.ts +53 -0
- package/dist/electric/apply.d.ts.map +1 -0
- package/dist/electric/apply.js +88 -0
- package/dist/electric/apply.js.map +1 -0
- package/dist/electric/index.d.ts +83 -0
- package/dist/electric/index.d.ts.map +1 -0
- package/dist/electric/index.js +210 -0
- package/dist/electric/index.js.map +1 -0
- package/dist/electric/values.d.ts +65 -0
- package/dist/electric/values.d.ts.map +1 -0
- package/dist/electric/values.js +243 -0
- package/dist/electric/values.js.map +1 -0
- package/dist/electric-server/capture.d.ts +36 -0
- package/dist/electric-server/capture.d.ts.map +1 -0
- package/dist/electric-server/capture.js +148 -0
- package/dist/electric-server/capture.js.map +1 -0
- package/dist/electric-server/catalog.d.ts +59 -0
- package/dist/electric-server/catalog.d.ts.map +1 -0
- package/dist/electric-server/catalog.js +122 -0
- package/dist/electric-server/catalog.js.map +1 -0
- package/dist/electric-server/index.d.ts +58 -0
- package/dist/electric-server/index.d.ts.map +1 -0
- package/dist/electric-server/index.js +348 -0
- package/dist/electric-server/index.js.map +1 -0
- package/dist/firebird.d.ts +3 -1
- package/dist/firebird.d.ts.map +1 -1
- package/dist/firebird.js +250 -22
- package/dist/firebird.js.map +1 -1
- package/dist/frameworks/query-store.d.ts +99 -0
- package/dist/frameworks/query-store.d.ts.map +1 -0
- package/dist/frameworks/query-store.js +166 -0
- package/dist/frameworks/query-store.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +68 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +92 -0
- package/dist/react/index.js.map +1 -0
- package/dist/repl/index.d.ts +76 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/repl/index.js +328 -0
- package/dist/repl/index.js.map +1 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/dist/vue/index.d.ts +68 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +107 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/wasm/firebird-embedded-st.js +5 -0
- package/dist/wasm/firebird-embedded-st.wasm +0 -0
- package/dist/wasm/firebird-embedded.js +4 -1
- package/dist/wasm/firebird-embedded.wasm +0 -0
- package/dist/wasm-loader.d.ts +82 -0
- package/dist/wasm-loader.d.ts.map +1 -1
- package/dist/wasm-loader.js +101 -9
- package/dist/wasm-loader.js.map +1 -1
- package/package.json +51 -3
- package/dist/browser/statement-types.d.ts +0 -18
- package/dist/browser/statement-types.d.ts.map +0 -1
- package/dist/browser/statement-types.js +0 -39
- package/dist/browser/statement-types.js.map +0 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* query-store.ts – a query's rows as a value a UI framework can watch.
|
|
4
|
+
*
|
|
5
|
+
* The React and Vue bindings are thin: each wraps a {@link QueryStore}, which
|
|
6
|
+
* runs a statement once (`query()`) or keeps it running (`live()`), and holds
|
|
7
|
+
* the latest `{ rows, error, loading }` for whoever subscribed. What both
|
|
8
|
+
* frameworks get wrong in the same way without it lives here once: a result
|
|
9
|
+
* that arrives after the component moved on to another query, a live query
|
|
10
|
+
* that resolves after it was stopped, and a stop and restart of the same store
|
|
11
|
+
* (React's StrictMode does exactly that on every mount).
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.QueryStore = void 0;
|
|
15
|
+
exports.resolveStatement = resolveStatement;
|
|
16
|
+
exports.queryKey = queryKey;
|
|
17
|
+
const sql_tag_1 = require("../sql-tag");
|
|
18
|
+
/**
|
|
19
|
+
* One statement with its parameters, run against one database.
|
|
20
|
+
*
|
|
21
|
+
* Immutable in what it runs: other SQL or parameters make a new store, which
|
|
22
|
+
* is how a stale result can never land in the wrong one.
|
|
23
|
+
*/
|
|
24
|
+
class QueryStore {
|
|
25
|
+
constructor(db, sql, params, options = {}, placeholder) {
|
|
26
|
+
this.db = db;
|
|
27
|
+
this.sql = sql;
|
|
28
|
+
this.params = params;
|
|
29
|
+
this.options = options;
|
|
30
|
+
this.listeners = new Set();
|
|
31
|
+
/** Bumped by every start() and stop(); a result from an older run is dropped. */
|
|
32
|
+
this.generation = 0;
|
|
33
|
+
this.running = false;
|
|
34
|
+
/** The one-off run in flight, settled once its result or error is applied. */
|
|
35
|
+
this.pending = Promise.resolve();
|
|
36
|
+
/** For `useSyncExternalStore`: register a listener, get its removal. */
|
|
37
|
+
this.subscribe = (listener) => {
|
|
38
|
+
this.listeners.add(listener);
|
|
39
|
+
return () => {
|
|
40
|
+
this.listeners.delete(listener);
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
/** The current state; the same object until something changes. */
|
|
44
|
+
this.getSnapshot = () => this.state;
|
|
45
|
+
/** Run the statement again now, without waiting for an event. */
|
|
46
|
+
this.refresh = async () => {
|
|
47
|
+
if (!this.running)
|
|
48
|
+
return;
|
|
49
|
+
if (this.live === undefined) {
|
|
50
|
+
// A one-off query: run it again, and settle when its result is in.
|
|
51
|
+
this.stop();
|
|
52
|
+
this.start();
|
|
53
|
+
await this.pending;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const live = await this.live;
|
|
57
|
+
if (live && this.running) {
|
|
58
|
+
await live.refresh();
|
|
59
|
+
}
|
|
60
|
+
else if (this.running) {
|
|
61
|
+
// The live query failed to start: try again.
|
|
62
|
+
this.stop();
|
|
63
|
+
this.start();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
this.state = { rows: placeholder, error: undefined, loading: true };
|
|
67
|
+
}
|
|
68
|
+
/** Run the statement, and with events keep running it. Idempotent. */
|
|
69
|
+
start() {
|
|
70
|
+
if (this.running)
|
|
71
|
+
return;
|
|
72
|
+
this.running = true;
|
|
73
|
+
const generation = ++this.generation;
|
|
74
|
+
const current = () => generation === this.generation;
|
|
75
|
+
const events = this.options.events ?? [];
|
|
76
|
+
if (events.length === 0) {
|
|
77
|
+
this.pending = this.db.query(this.sql, this.params).then((result) => {
|
|
78
|
+
if (current())
|
|
79
|
+
this.set({ rows: result.rows, error: undefined, loading: false });
|
|
80
|
+
}, (error) => {
|
|
81
|
+
if (current())
|
|
82
|
+
this.fail(error);
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
this.live = this.db
|
|
87
|
+
.live(this.sql, {
|
|
88
|
+
events: [...events],
|
|
89
|
+
params: this.params,
|
|
90
|
+
pollIntervalMs: this.options.pollIntervalMs,
|
|
91
|
+
onError: (error) => {
|
|
92
|
+
if (current())
|
|
93
|
+
this.fail(error);
|
|
94
|
+
},
|
|
95
|
+
}, (rows) => {
|
|
96
|
+
if (current())
|
|
97
|
+
this.set({ rows, error: undefined, loading: false });
|
|
98
|
+
})
|
|
99
|
+
.then((live) => {
|
|
100
|
+
// Stopped while it was starting: nobody else will release it.
|
|
101
|
+
if (!current()) {
|
|
102
|
+
void live.unsubscribe();
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
return live;
|
|
106
|
+
}, (error) => {
|
|
107
|
+
if (current())
|
|
108
|
+
this.fail(error);
|
|
109
|
+
return undefined;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/** Stop watching; results still in flight are dropped. start() may follow. */
|
|
113
|
+
stop() {
|
|
114
|
+
if (!this.running)
|
|
115
|
+
return;
|
|
116
|
+
this.running = false;
|
|
117
|
+
this.generation++;
|
|
118
|
+
const live = this.live;
|
|
119
|
+
this.live = undefined;
|
|
120
|
+
void live?.then((running) => running?.unsubscribe());
|
|
121
|
+
}
|
|
122
|
+
fail(error) {
|
|
123
|
+
this.set({
|
|
124
|
+
rows: this.state.rows,
|
|
125
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
126
|
+
loading: false,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
set(next) {
|
|
130
|
+
this.state = next;
|
|
131
|
+
for (const listener of [...this.listeners])
|
|
132
|
+
listener();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.QueryStore = QueryStore;
|
|
136
|
+
/**
|
|
137
|
+
* The statement a hook was given, resolved: SQL text and parameters from a
|
|
138
|
+
* string with parameters, or from an `sql` tagged template.
|
|
139
|
+
*/
|
|
140
|
+
function resolveStatement(query, params) {
|
|
141
|
+
const statement = (0, sql_tag_1.toStatement)(query, params ?? []);
|
|
142
|
+
return { sql: statement.sql, params: statement.params };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* A string that is equal exactly when two calls would run the same thing.
|
|
146
|
+
*
|
|
147
|
+
* Components pass a fresh parameter array on every render; comparing by
|
|
148
|
+
* identity would restart the query each time. Types JSON would merge are
|
|
149
|
+
* kept apart: a Date and its ISO string, a bigint and a number, bytes and an
|
|
150
|
+
* array of numbers.
|
|
151
|
+
*/
|
|
152
|
+
function queryKey(sql, params, options = {}) {
|
|
153
|
+
return JSON.stringify([sql, params, options.events ?? [], options.pollIntervalMs ?? null], function (key, value) {
|
|
154
|
+
const raw = this[key];
|
|
155
|
+
if (typeof raw === 'bigint')
|
|
156
|
+
return { $bigint: raw.toString() };
|
|
157
|
+
if (raw instanceof Date)
|
|
158
|
+
return { $date: raw.getTime() };
|
|
159
|
+
if (raw instanceof Uint8Array)
|
|
160
|
+
return { $bytes: Array.from(raw) };
|
|
161
|
+
if (raw === undefined && Array.isArray(this))
|
|
162
|
+
return { $undefined: true };
|
|
163
|
+
return value;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=query-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-store.js","sourceRoot":"","sources":["../../src/frameworks/query-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export { sql, SqlFragment, RawSql, isSqlFragment, toStatement } from './sql-tag'
|
|
|
20
20
|
export { statementKind } from './statement-types';
|
|
21
21
|
export type { SqlTag, Statement } from './sql-tag';
|
|
22
22
|
export type { FirebirdLiteOptions, QueryResult, QueryParams, Row, FieldInfo, QueryOptions, QueryDescription, StatementKind, RowMode, ArrayRow, TransactionOptions, IsolationLevel, } from './types';
|
|
23
|
-
export { loadFirebirdWasm, allocString } from './wasm-loader';
|
|
23
|
+
export { loadFirebirdWasm, allocString, wasmGlueFile, hasSharedHeap, cdnArtifacts } from './wasm-loader';
|
|
24
|
+
export type { CdnOptions, CdnArtifacts } from './wasm-loader';
|
|
25
|
+
export { VERSION } from './version';
|
|
24
26
|
export type { FirebirdWasmModule, WasmLoadOptions, EmscriptenFS, FbHandle, } from './wasm-loader';
|
|
25
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;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"}
|
|
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,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzG,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,QAAQ,GACT,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.allocString = exports.loadFirebirdWasm = exports.statementKind = exports.toStatement = exports.isSqlFragment = exports.RawSql = exports.SqlFragment = exports.sql = exports.FirebirdTransaction = exports.FirebirdLite = void 0;
|
|
20
|
+
exports.VERSION = exports.cdnArtifacts = exports.hasSharedHeap = exports.wasmGlueFile = 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; } });
|
|
@@ -33,4 +33,9 @@ Object.defineProperty(exports, "statementKind", { enumerable: true, get: functio
|
|
|
33
33
|
var wasm_loader_1 = require("./wasm-loader");
|
|
34
34
|
Object.defineProperty(exports, "loadFirebirdWasm", { enumerable: true, get: function () { return wasm_loader_1.loadFirebirdWasm; } });
|
|
35
35
|
Object.defineProperty(exports, "allocString", { enumerable: true, get: function () { return wasm_loader_1.allocString; } });
|
|
36
|
+
Object.defineProperty(exports, "wasmGlueFile", { enumerable: true, get: function () { return wasm_loader_1.wasmGlueFile; } });
|
|
37
|
+
Object.defineProperty(exports, "hasSharedHeap", { enumerable: true, get: function () { return wasm_loader_1.hasSharedHeap; } });
|
|
38
|
+
Object.defineProperty(exports, "cdnArtifacts", { enumerable: true, get: function () { return wasm_loader_1.cdnArtifacts; } });
|
|
39
|
+
var version_1 = require("./version");
|
|
40
|
+
Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_1.VERSION; } });
|
|
36
41
|
//# sourceMappingURL=index.js.map
|
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;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,
|
|
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,6CAAyG;AAAhG,+GAAA,gBAAgB,OAAA;AAAE,0GAAA,WAAW,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,4GAAA,aAAa,OAAA;AAAE,2GAAA,YAAY,OAAA;AAEjF,qCAAoC;AAA3B,kGAAA,OAAO,OAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* firebird-wasm/react – hooks that keep a component in step with a query.
|
|
3
|
+
*
|
|
4
|
+
* ```tsx
|
|
5
|
+
* import { FirebirdProvider, useLiveQuery } from 'firebird-wasm/react';
|
|
6
|
+
*
|
|
7
|
+
* <FirebirdProvider db={db}><Todos /></FirebirdProvider>
|
|
8
|
+
*
|
|
9
|
+
* function Todos() {
|
|
10
|
+
* const { rows, error } = useLiveQuery<{ ID: number; TITLE: string }>(
|
|
11
|
+
* 'SELECT id, title FROM todos ORDER BY id', { events: ['todos'] });
|
|
12
|
+
* if (error) return <p>{error.message}</p>;
|
|
13
|
+
* return <ul>{rows?.map((r) => <li key={r.ID}>{r.TITLE}</li>)}</ul>;
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* React 18 or later (`useSyncExternalStore`), a peer dependency the package
|
|
18
|
+
* does not install for you.
|
|
19
|
+
*/
|
|
20
|
+
import type { ReactNode } from 'react';
|
|
21
|
+
import type { QueryableDatabase, QueryState } from '../frameworks/query-store';
|
|
22
|
+
import type { SqlFragment } from '../sql-tag';
|
|
23
|
+
import type { QueryParams, Row } from '../types';
|
|
24
|
+
export type { QueryableDatabase, QueryState } from '../frameworks/query-store';
|
|
25
|
+
/** Makes `db` the database of every hook below it. */
|
|
26
|
+
export declare function FirebirdProvider(props: {
|
|
27
|
+
db: QueryableDatabase;
|
|
28
|
+
children?: ReactNode;
|
|
29
|
+
}): import("react").FunctionComponentElement<import("react").ProviderProps<QueryableDatabase | null>>;
|
|
30
|
+
/** The database a `FirebirdProvider` above this component provides. */
|
|
31
|
+
export declare function useFirebird<D extends QueryableDatabase = QueryableDatabase>(): D;
|
|
32
|
+
/** What `useQuery` and `useLiveQuery` return. */
|
|
33
|
+
export interface QueryHookResult<T> extends QueryState<T> {
|
|
34
|
+
/** Run the statement again now. */
|
|
35
|
+
refresh(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/** Options of {@link useQuery}. */
|
|
38
|
+
export interface UseQueryOptions {
|
|
39
|
+
/** A database other than the provider's. */
|
|
40
|
+
db?: QueryableDatabase;
|
|
41
|
+
}
|
|
42
|
+
/** Options of {@link useLiveQuery}. */
|
|
43
|
+
export interface UseLiveQueryOptions extends UseQueryOptions {
|
|
44
|
+
/** Event names whose firing re-runs the statement (`POST_EVENT`). */
|
|
45
|
+
events: readonly string[];
|
|
46
|
+
/** Parameters, when the statement is a string with `?` placeholders. */
|
|
47
|
+
params?: QueryParams;
|
|
48
|
+
/** How often to poll for events, in milliseconds. @default 250 */
|
|
49
|
+
pollIntervalMs?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Run a statement and render its rows. It runs again when the SQL or the
|
|
53
|
+
* parameters change (by value: a new array with the same values does not).
|
|
54
|
+
*
|
|
55
|
+
* ```tsx
|
|
56
|
+
* const { rows, loading } = useQuery('SELECT * FROM todos WHERE done = ?', [false]);
|
|
57
|
+
* const { rows } = useQuery(sql`SELECT * FROM todos WHERE id = ${id}`);
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function useQuery<T extends Row = Row>(query: string | SqlFragment, params?: QueryParams, options?: UseQueryOptions): QueryHookResult<T>;
|
|
61
|
+
/**
|
|
62
|
+
* Like {@link useQuery}, and the statement runs again each time one of
|
|
63
|
+
* `events` fires: `FirebirdBrowser.live()` under a hook. A trigger posts
|
|
64
|
+
* the events (`POST_EVENT 'todos'` after insert, update and delete), or the
|
|
65
|
+
* code that wrote calls `db.notify()`.
|
|
66
|
+
*/
|
|
67
|
+
export declare function useLiveQuery<T extends Row = Row>(query: string | SqlFragment, options: UseLiveQueryOptions): QueryHookResult<T>;
|
|
68
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAqB,MAAM,2BAA2B,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEjD,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI/E,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,EAAE,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,qGAEtF;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,KAAK,CAAC,CAShF;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IACvD,mCAAmC;IACnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,EAAE,CAAC,EAAE,iBAAiB,CAAC;CACxB;AAED,uCAAuC;AACvC,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,qEAAqE;IACrE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAC1C,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,eAAoB,GAC5B,eAAe,CAAC,CAAC,CAAC,CAEpB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAC9C,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,OAAO,EAAE,mBAAmB,GAC3B,eAAe,CAAC,CAAC,CAAC,CAQpB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* firebird-wasm/react – hooks that keep a component in step with a query.
|
|
4
|
+
*
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { FirebirdProvider, useLiveQuery } from 'firebird-wasm/react';
|
|
7
|
+
*
|
|
8
|
+
* <FirebirdProvider db={db}><Todos /></FirebirdProvider>
|
|
9
|
+
*
|
|
10
|
+
* function Todos() {
|
|
11
|
+
* const { rows, error } = useLiveQuery<{ ID: number; TITLE: string }>(
|
|
12
|
+
* 'SELECT id, title FROM todos ORDER BY id', { events: ['todos'] });
|
|
13
|
+
* if (error) return <p>{error.message}</p>;
|
|
14
|
+
* return <ul>{rows?.map((r) => <li key={r.ID}>{r.TITLE}</li>)}</ul>;
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* React 18 or later (`useSyncExternalStore`), a peer dependency the package
|
|
19
|
+
* does not install for you.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.FirebirdProvider = FirebirdProvider;
|
|
23
|
+
exports.useFirebird = useFirebird;
|
|
24
|
+
exports.useQuery = useQuery;
|
|
25
|
+
exports.useLiveQuery = useLiveQuery;
|
|
26
|
+
const react_1 = require("react");
|
|
27
|
+
const query_store_1 = require("../frameworks/query-store");
|
|
28
|
+
const FirebirdContext = (0, react_1.createContext)(null);
|
|
29
|
+
/** Makes `db` the database of every hook below it. */
|
|
30
|
+
function FirebirdProvider(props) {
|
|
31
|
+
return (0, react_1.createElement)(FirebirdContext.Provider, { value: props.db }, props.children);
|
|
32
|
+
}
|
|
33
|
+
/** The database a `FirebirdProvider` above this component provides. */
|
|
34
|
+
function useFirebird() {
|
|
35
|
+
const db = (0, react_1.useContext)(FirebirdContext);
|
|
36
|
+
if (db === null) {
|
|
37
|
+
throw new Error('useFirebird() found no database: wrap the component in <FirebirdProvider db={…}>, ' +
|
|
38
|
+
'or pass { db } to the hook');
|
|
39
|
+
}
|
|
40
|
+
return db;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Run a statement and render its rows. It runs again when the SQL or the
|
|
44
|
+
* parameters change (by value: a new array with the same values does not).
|
|
45
|
+
*
|
|
46
|
+
* ```tsx
|
|
47
|
+
* const { rows, loading } = useQuery('SELECT * FROM todos WHERE done = ?', [false]);
|
|
48
|
+
* const { rows } = useQuery(sql`SELECT * FROM todos WHERE id = ${id}`);
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
function useQuery(query, params, options = {}) {
|
|
52
|
+
return useStore(options.db, query, params, {});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Like {@link useQuery}, and the statement runs again each time one of
|
|
56
|
+
* `events` fires: `FirebirdBrowser.live()` under a hook. A trigger posts
|
|
57
|
+
* the events (`POST_EVENT 'todos'` after insert, update and delete), or the
|
|
58
|
+
* code that wrote calls `db.notify()`.
|
|
59
|
+
*/
|
|
60
|
+
function useLiveQuery(query, options) {
|
|
61
|
+
if (options.events.length === 0) {
|
|
62
|
+
throw new RangeError('useLiveQuery() needs at least one event name; useQuery() runs a statement once');
|
|
63
|
+
}
|
|
64
|
+
return useStore(options.db, query, options.params, {
|
|
65
|
+
events: options.events,
|
|
66
|
+
pollIntervalMs: options.pollIntervalMs,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function useStore(explicitDb, query, params, storeOptions) {
|
|
70
|
+
const provided = (0, react_1.useContext)(FirebirdContext);
|
|
71
|
+
const db = explicitDb ?? provided;
|
|
72
|
+
if (db === null) {
|
|
73
|
+
throw new Error('No database for this query: wrap the component in <FirebirdProvider db={…}>, ' +
|
|
74
|
+
'or pass { db } to the hook');
|
|
75
|
+
}
|
|
76
|
+
const statement = (0, query_store_1.resolveStatement)(query, params);
|
|
77
|
+
const key = (0, query_store_1.queryKey)(statement.sql, statement.params, storeOptions);
|
|
78
|
+
// The last store this component ran, for its rows while the next one loads.
|
|
79
|
+
const previous = (0, react_1.useRef)(null);
|
|
80
|
+
const store = (0, react_1.useMemo)(() => new query_store_1.QueryStore(db, statement.sql, statement.params, storeOptions, previous.current?.getSnapshot().rows),
|
|
81
|
+
// `key` stands for the statement, its parameters and the options, which
|
|
82
|
+
// are new objects on every render.
|
|
83
|
+
[db, key]);
|
|
84
|
+
(0, react_1.useEffect)(() => {
|
|
85
|
+
previous.current = store;
|
|
86
|
+
store.start();
|
|
87
|
+
return () => store.stop();
|
|
88
|
+
}, [store]);
|
|
89
|
+
const state = (0, react_1.useSyncExternalStore)(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
90
|
+
return (0, react_1.useMemo)(() => ({ ...state, refresh: store.refresh }), [state, store]);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* firebird-wasm/repl – an interactive SQL console as a custom element.
|
|
3
|
+
*
|
|
4
|
+
* ```js
|
|
5
|
+
* import { defineFirebirdRepl } from 'firebird-wasm/repl';
|
|
6
|
+
*
|
|
7
|
+
* defineFirebirdRepl(); // registers <firebird-repl>
|
|
8
|
+
* document.querySelector('firebird-repl').db = db;
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* A custom element, so it works the same in plain pages, React and Vue: give
|
|
12
|
+
* it a database through its `db` property. Type SQL, run it with
|
|
13
|
+
* Ctrl+Enter (⌘+Enter on a Mac) or the Run button; a script runs statement by
|
|
14
|
+
* statement (`SET TERM` included) and stops at the first error. ArrowUp on
|
|
15
|
+
* the first line and ArrowDown on the last walk the history.
|
|
16
|
+
*
|
|
17
|
+
* Every value is written as text, never as HTML, so a row cannot inject
|
|
18
|
+
* markup into the page. The element draws in its own shadow root; colours
|
|
19
|
+
* follow `color-scheme` and can be set with `--firebird-repl-*` properties.
|
|
20
|
+
*
|
|
21
|
+
* Nothing runs on import: the class is made by {@link defineFirebirdRepl},
|
|
22
|
+
* so importing this module where there is no DOM (Node, server rendering) is
|
|
23
|
+
* harmless.
|
|
24
|
+
*/
|
|
25
|
+
import type { ArrayRow, FieldInfo, QueryResult } from '../types';
|
|
26
|
+
/** What the console needs of a database: `FirebirdBrowser` has it. */
|
|
27
|
+
export interface ReplDatabase {
|
|
28
|
+
query(sql: string, params: unknown[], options: {
|
|
29
|
+
rowMode: 'array';
|
|
30
|
+
}): Promise<QueryResult<ArrayRow>>;
|
|
31
|
+
/** Whether a statement yields rows, before running it. */
|
|
32
|
+
describeQuery(sql: string): Promise<{
|
|
33
|
+
hasResultSet: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* For a statement without rows: a transaction's `exec()` runs exactly one
|
|
37
|
+
* statement and reports what it changed. (`FirebirdBrowser.exec()` would
|
|
38
|
+
* split the statement again, cutting a PSQL body at its semicolons.)
|
|
39
|
+
*/
|
|
40
|
+
transaction<T>(fn: (tx: {
|
|
41
|
+
exec(sql: string): Promise<{
|
|
42
|
+
affectedRows: number;
|
|
43
|
+
}>;
|
|
44
|
+
}) => Promise<T>): Promise<T>;
|
|
45
|
+
}
|
|
46
|
+
/** One statement the console ran, as it reports it in `firebird-repl-run`. */
|
|
47
|
+
export interface ReplEntry {
|
|
48
|
+
sql: string;
|
|
49
|
+
/** 1-based line of the statement in what was run. */
|
|
50
|
+
line: number;
|
|
51
|
+
/** Milliseconds the statement took. */
|
|
52
|
+
ms: number;
|
|
53
|
+
fields?: FieldInfo[];
|
|
54
|
+
rows?: ArrayRow[];
|
|
55
|
+
affectedRows?: number;
|
|
56
|
+
error?: Error;
|
|
57
|
+
}
|
|
58
|
+
/** The element's own API, beyond HTMLElement's. */
|
|
59
|
+
export interface FirebirdReplElement extends HTMLElement {
|
|
60
|
+
/** The database statements run against. */
|
|
61
|
+
db: ReplDatabase | null;
|
|
62
|
+
/** The editor's text. */
|
|
63
|
+
value: string;
|
|
64
|
+
/** Run `script` (default: the editor's text); resolves with what each statement did. */
|
|
65
|
+
run(script?: string): Promise<ReplEntry[]>;
|
|
66
|
+
/** Empty the output. */
|
|
67
|
+
clear(): void;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register the element under `tag` (default `firebird-repl`) and return its
|
|
71
|
+
* class. Calling it again returns the class already registered.
|
|
72
|
+
*/
|
|
73
|
+
export declare function defineFirebirdRepl(tag?: string): {
|
|
74
|
+
new (): FirebirdReplElement;
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repl/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEjE,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrG,0DAA0D;IAC1D,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/D;;;;OAIG;IACH,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9G;AAED,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,mDAAmD;AACnD,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,2CAA2C;IAC3C,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC;IACxB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,wBAAwB;IACxB,KAAK,IAAI,IAAI,CAAC;CACf;AAiDD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,SAAkB,GAAG;IAAE,QAAQ,mBAAmB,CAAA;CAAE,CAsLzF"}
|