@framers/sql-storage-adapter 0.6.14 → 0.6.15
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/README.md +50 -35
- package/dist/adapters/postgresAdapter.d.ts +83 -5
- package/dist/adapters/postgresAdapter.d.ts.map +1 -1
- package/dist/adapters/postgresAdapter.js +285 -18
- package/dist/adapters/postgresAdapter.js.map +1 -1
- package/dist/core/database.d.ts +25 -4
- package/dist/core/database.d.ts.map +1 -1
- package/dist/core/database.js +31 -3
- package/dist/core/database.js.map +1 -1
- package/dist/core/resolver.d.ts +19 -0
- package/dist/core/resolver.d.ts.map +1 -1
- package/dist/core/resolver.js +18 -4
- package/dist/core/resolver.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -119,9 +119,11 @@ const desktopDb = await createDatabase({ priority: ['better-sqlite3', 'sqljs'] }
|
|
|
119
119
|
// Mobile (Capacitor): Uses native SQLite
|
|
120
120
|
const mobileDb = await createDatabase({ priority: ['capacitor', 'indexeddb'] });
|
|
121
121
|
|
|
122
|
-
// Cloud (Node): Uses PostgreSQL
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
// Cloud (Node): Uses PostgreSQL. strict fails when DATABASE_URL is unset,
|
|
123
|
+
// where it would otherwise open a local SQLite file.
|
|
124
|
+
const cloudDb = await createDatabase({
|
|
125
|
+
url: process.env.DATABASE_URL,
|
|
126
|
+
strict: true
|
|
125
127
|
});
|
|
126
128
|
```
|
|
127
129
|
|
|
@@ -147,7 +149,7 @@ See [Platform Strategy Guide](./PLATFORM_STRATEGY.md) for detailed pros/cons and
|
|
|
147
149
|
| **Electron (Desktop)** | electron | better-sqlite3 | Desktop apps, dev tools |
|
|
148
150
|
| **Capacitor (Mobile)** | capacitor | IndexedDB | iOS/Android native apps |
|
|
149
151
|
| **Node.js** | better-sqlite3 | Postgres, sql.js | CLI tools, local servers |
|
|
150
|
-
| **Cloud (Serverless)** | Postgres | better-sqlite3 | Multi-tenant SaaS, APIs |
|
|
152
|
+
| **Cloud (Serverless)** | Postgres | None with `strict` or `createDatabase({ url })`; better-sqlite3 from `resolveStorageAdapter()` otherwise | Multi-tenant SaaS, APIs |
|
|
151
153
|
|
|
152
154
|
## Electron Adapter
|
|
153
155
|
|
|
@@ -245,6 +247,7 @@ await sync.connect();
|
|
|
245
247
|
- Adapters are attempted in priority order until one opens successfully; a `StorageResolutionError` includes the full failure chain.
|
|
246
248
|
- The resolver builds `postgres`, `better-sqlite3`, `capacitor`, `indexeddb` and `sqljs`, and builds sql.js for `memory`. Any other kind (`electron-main`, `electron-renderer`, `supabase`, or an unknown name, from `priority` or `STORAGE_ADAPTER`) fails as a candidate with an error that names it, and the next candidate is tried.
|
|
247
249
|
- On Node, `createDatabase({ url })`, `createDatabase({ postgres })` and `connectDatabase()` open PostgreSQL, with every Postgres option (pool size, SSL, timeouts, application name, or host, port, database, user and password without a connection string) passed on, and do not fall back to SQLite. In a browser and on Deno, `createDatabase()` opens sql.js whatever the options say. `DATABASE_URL` in the environment does not change what `createDatabase()` picks; `resolveStorageAdapter()` without a `priority` tries Postgres first when it is set.
|
|
250
|
+
- `strict: true` (on `createDatabase` and `resolveStorageAdapter`) is for servers: only the database the options name opens. A postgres candidate that fails ends resolution with a `StorageResolutionError`, whatever `priority` lists after it; with `DATABASE_URL` or Postgres options that name a server and no `priority`, `['postgres']` is the whole list; an explicit file path (`file`, `filePath`) outranks `DATABASE_URL`; and a `url` or `postgres` option that names no server fails instead of opening the local default, unless a file is given. Without `strict`, `resolveStorageAdapter()` falls back from a failed Postgres to better-sqlite3, IndexedDB and sql.js, and `DATABASE_URL` comes before a `filePath`.
|
|
248
251
|
- Provide `priority: ['indexeddb', 'sqljs']` for browser bundles or tests where native modules shouldn't load.
|
|
249
252
|
- Use `createCloudBackupManager` for S3-compatible backups with gzip compression and retention limits.
|
|
250
253
|
|
|
@@ -261,6 +264,41 @@ await db.transaction(async (trx) => {
|
|
|
261
264
|
|
|
262
265
|
The IndexedDB, Capacitor and better-sqlite3 adapters run every transaction on one connection, so they run transactions one at a time, and a statement from another caller waits until the open transaction ends: it neither joins the transaction (and vanishes in its rollback) nor reads what the transaction has not committed. A browser or a WebView has no async context to tell the callback's own statements apart, so on the IndexedDB and Capacitor adapters a statement the callback issues through the adapter itself, not through its handle, waits for the transaction too. The two then wait on each other, and the adapter logs a warning after 10 seconds. (On Node, better-sqlite3 tells them apart with `AsyncLocalStorage`.) Inside a callback, run every statement through the handle, and do not await work that itself needs the database.
|
|
263
266
|
|
|
267
|
+
The PostgreSQL adapter runs each transaction on its own pooled connection, so transactions run side by side. When the connection breaks during a transaction and its ROLLBACK fails too, `transaction()` still throws the transaction's own error (the callback's, or COMMIT's), with the ROLLBACK error on it as a non-enumerable `rollbackError` property. The broken connection is closed, not returned to the pool. A connection the server closes while a callback holds it, between statements, does not end the process. Once a transaction has ended, its handle runs on the pool, as the adapter's own statements do, and its `transaction()` begins a new transaction.
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
### PostgreSQL pool control
|
|
271
|
+
|
|
272
|
+
`PostgresAdapter` holds a `pg` pool. Narrow an adapter to it with `db instanceof PostgresAdapter` (or `db.kind === 'postgres'`) to reach these:
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
import { createDatabase, PostgresAdapter } from '@framers/sql-storage-adapter';
|
|
276
|
+
|
|
277
|
+
const db = await createDatabase({ url: process.env.DATABASE_URL, strict: true, postgres: { max: 10, allowExitOnIdle: true } });
|
|
278
|
+
|
|
279
|
+
if (db instanceof PostgresAdapter) {
|
|
280
|
+
// One connection for the callback: a session advisory lock, then statements on the same session
|
|
281
|
+
await db.withConnection(async (connection) => {
|
|
282
|
+
await connection.get('SELECT pg_advisory_lock(?)', [42]);
|
|
283
|
+
try {
|
|
284
|
+
await connection.run('UPDATE jobs SET owner = ? WHERE owner IS NULL', ['worker-1']);
|
|
285
|
+
} finally {
|
|
286
|
+
await connection.get('SELECT pg_advisory_unlock(?)', [42]);
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
// Isolation level and read-only and deferrable modes
|
|
291
|
+
await db.transaction(async (trx) => trx.all('SELECT * FROM ledger'), { isolationLevel: 'serializable', readOnly: true, deferrable: true });
|
|
292
|
+
|
|
293
|
+
// { total, idle, waiting }, or null before open() and after close()
|
|
294
|
+
console.log(db.getPoolStats());
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
- `withConnection(fn)` returns the connection to the pool when `fn` resolves, with whatever session state `fn` left (undo `SET` and release session locks before returning, or use `SET LOCAL` inside a transaction). When `fn` throws, the connection is closed, and `fn`'s error is rethrown. When `fn` returns inside a transaction it began and did not end, the connection is closed (rolling it back) and the call rejects; pg 8.21 and later report the transaction status this needs. The connection refuses statements once `fn` has ended, and `connection.transaction()` runs one transaction at a time.
|
|
299
|
+
- `transaction(fn, options)` refuses an isolation level outside `'read uncommitted'`, `'read committed'`, `'repeatable read'` and `'serializable'` before it checks out a connection.
|
|
300
|
+
- `allowExitOnIdle` is pg's option: Node can exit while every pooled connection is idle. Without it, idle connections keep the process running until `idleTimeoutMillis` (10 seconds by default) closes them.
|
|
301
|
+
|
|
264
302
|
### IndexedDB-Specific Config
|
|
265
303
|
|
|
266
304
|
```typescript
|
|
@@ -334,34 +372,13 @@ See [**PLATFORM_STRATEGY.md**](./PLATFORM_STRATEGY.md) for a comprehensive guide
|
|
|
334
372
|
|
|
335
373
|
## Performance Tiers & Cost Optimization
|
|
336
374
|
|
|
337
|
-
The
|
|
375
|
+
The package exports performance-tier types, the tier presets (`TIER_DEFAULTS`) and `resolvePerformanceConfig()`, which turns a tier and overrides into settings. `createDatabase()` takes no `performance` option, and no adapter applies a tier: a host that wants one reads the settings and acts on them itself.
|
|
338
376
|
|
|
339
377
|
```typescript
|
|
340
|
-
import {
|
|
341
|
-
|
|
342
|
-
// Development: Fast tier - prioritize speed
|
|
343
|
-
const devDb = await createDatabase({
|
|
344
|
-
type: 'memory',
|
|
345
|
-
performance: { tier: 'fast' }
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
// Production: Balanced tier (default)
|
|
349
|
-
const prodDb = await createDatabase({
|
|
350
|
-
priority: ['indexeddb', 'sqljs'],
|
|
351
|
-
performance: { tier: 'balanced' }
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
// Analytics/Reporting: Accurate tier - no caching, full validation
|
|
355
|
-
const analyticsDb = await createDatabase({
|
|
356
|
-
postgres: { connectionString: process.env.DATABASE_URL },
|
|
357
|
-
performance: { tier: 'accurate', trackMetrics: true }
|
|
358
|
-
});
|
|
378
|
+
import { resolvePerformanceConfig } from '@framers/sql-storage-adapter';
|
|
359
379
|
|
|
360
|
-
//
|
|
361
|
-
const
|
|
362
|
-
priority: ['capacitor', 'indexeddb'],
|
|
363
|
-
performance: { tier: 'efficient', batchWrites: true }
|
|
364
|
-
});
|
|
380
|
+
// Analytics/Reporting: the accurate tier's settings (no caching, full validation)
|
|
381
|
+
const settings = resolvePerformanceConfig({ tier: 'accurate' });
|
|
365
382
|
```
|
|
366
383
|
|
|
367
384
|
| Tier | Caching | Batching | Validation | Use Case |
|
|
@@ -375,10 +392,10 @@ See [**guides/OPTIMIZATION_GUIDE.md**](./guides/OPTIMIZATION_GUIDE.md) for detai
|
|
|
375
392
|
|
|
376
393
|
## Lifecycle Hooks
|
|
377
394
|
|
|
378
|
-
The
|
|
395
|
+
The package exports the `StorageHooks` types and the `combineHooks()` and `filterHooks()` helpers. `createDatabase()` takes no `hooks` option, and no adapter runs hooks: a host that wants them calls them around its own adapter calls.
|
|
379
396
|
|
|
380
397
|
```typescript
|
|
381
|
-
import {
|
|
398
|
+
import { combineHooks, type StorageHooks } from '@framers/sql-storage-adapter';
|
|
382
399
|
|
|
383
400
|
const myHooks: StorageHooks = {
|
|
384
401
|
// Log all writes
|
|
@@ -404,10 +421,8 @@ const myHooks: StorageHooks = {
|
|
|
404
421
|
}
|
|
405
422
|
};
|
|
406
423
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
hooks: myHooks
|
|
410
|
-
});
|
|
424
|
+
// One StorageHooks object from several; the host calls its hooks itself
|
|
425
|
+
const hooks = combineHooks(myHooks);
|
|
411
426
|
```
|
|
412
427
|
|
|
413
428
|
### Available Hooks
|
|
@@ -37,6 +37,42 @@ export interface PostgresAdapterOptions {
|
|
|
37
37
|
statement_timeout?: number;
|
|
38
38
|
/** Query timeout in ms (0 = no timeout) */
|
|
39
39
|
query_timeout?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Let Node exit while every connection in the pool is idle (pg's
|
|
42
|
+
* `allowExitOnIdle`). Default: false, so idle connections keep the process
|
|
43
|
+
* running until `idleTimeoutMillis` closes them or `close()` ends the pool.
|
|
44
|
+
*/
|
|
45
|
+
allowExitOnIdle?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** The isolation levels of PostgreSQL's `BEGIN`. */
|
|
48
|
+
export type PostgresIsolationLevel = 'read uncommitted' | 'read committed' | 'repeatable read' | 'serializable';
|
|
49
|
+
/** How a PostgreSQL transaction begins. Left out, each mode is the server's default. */
|
|
50
|
+
export interface PostgresTransactionOptions {
|
|
51
|
+
/** `BEGIN ISOLATION LEVEL ...`. The server's default is `read committed` unless configured otherwise. */
|
|
52
|
+
isolationLevel?: PostgresIsolationLevel;
|
|
53
|
+
/** `READ ONLY` when true, `READ WRITE` when false. */
|
|
54
|
+
readOnly?: boolean;
|
|
55
|
+
/** `DEFERRABLE` when true, `NOT DEFERRABLE` when false. It changes only serializable read-only transactions. */
|
|
56
|
+
deferrable?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/** The counts of a Postgres adapter's connection pool. */
|
|
59
|
+
export interface PostgresPoolStats {
|
|
60
|
+
/** Connections the pool holds, checked out or idle. */
|
|
61
|
+
total: number;
|
|
62
|
+
/** Connections idle in the pool. */
|
|
63
|
+
idle: number;
|
|
64
|
+
/** Callers waiting for a connection. */
|
|
65
|
+
waiting: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* One pooled connection, held for a `withConnection()` callback. Its
|
|
69
|
+
* statements run outside a transaction unless the callback opens one, and
|
|
70
|
+
* session state (`SET`, session advisory locks, temporary tables) lasts until
|
|
71
|
+
* the connection closes.
|
|
72
|
+
*/
|
|
73
|
+
export interface PostgresConnection extends StorageAdapter {
|
|
74
|
+
/** Runs `fn` in a transaction on this connection. One transaction at a time. */
|
|
75
|
+
transaction<T>(fn: (trx: StorageAdapter) => Promise<T>, options?: PostgresTransactionOptions): Promise<T>;
|
|
40
76
|
}
|
|
41
77
|
/**
|
|
42
78
|
* PostgreSQL adapter for production-grade SQL operations.
|
|
@@ -132,10 +168,20 @@ export interface PostgresAdapterOptions {
|
|
|
132
168
|
* });
|
|
133
169
|
* ```
|
|
134
170
|
*
|
|
135
|
-
* ##
|
|
136
|
-
* -
|
|
137
|
-
* -
|
|
138
|
-
*
|
|
171
|
+
* ## Connection failures
|
|
172
|
+
* - The pool drops a connection that fails, and the next query opens a new one.
|
|
173
|
+
* - The adapter never falls back to SQLite. `resolveStorageAdapter()` without
|
|
174
|
+
* `strict` tries its next candidate when Postgres fails to open; with
|
|
175
|
+
* `strict`, and in `createDatabase()` given a Postgres URL, it throws.
|
|
176
|
+
*
|
|
177
|
+
* ## Pool control
|
|
178
|
+
* - `withConnection(fn)` holds one connection for `fn`: session settings,
|
|
179
|
+
* session advisory locks, and statements that must run outside a
|
|
180
|
+
* transaction.
|
|
181
|
+
* - `getPoolStats()` counts the pool's connections and waiting callers.
|
|
182
|
+
* - `transaction(fn, { isolationLevel, readOnly, deferrable })` sets how the
|
|
183
|
+
* transaction begins.
|
|
184
|
+
* - `allowExitOnIdle` lets Node exit while the pool is idle.
|
|
139
185
|
*/
|
|
140
186
|
/**
|
|
141
187
|
* Production-grade PostgreSQL adapter backed by pg.Pool.
|
|
@@ -159,9 +205,41 @@ export declare class PostgresAdapter implements StorageAdapter {
|
|
|
159
205
|
get<T>(statement: string, parameters?: StorageParameters): Promise<T | null>;
|
|
160
206
|
all<T>(statement: string, parameters?: StorageParameters): Promise<T[]>;
|
|
161
207
|
exec(script: string): Promise<void>;
|
|
162
|
-
|
|
208
|
+
/**
|
|
209
|
+
* Runs `fn` in a transaction on one pooled connection: COMMIT when it
|
|
210
|
+
* resolves, ROLLBACK when it or COMMIT throws, and that error is rethrown.
|
|
211
|
+
* `options` sets the isolation level and the read-only and deferrable modes;
|
|
212
|
+
* an unknown isolation level is refused before a connection is checked out.
|
|
213
|
+
*
|
|
214
|
+
* When ROLLBACK fails too (the connection broke), the error thrown is still
|
|
215
|
+
* the transaction's own, with the ROLLBACK error on it as `rollbackError`,
|
|
216
|
+
* and the connection is closed instead of returned to the pool. The handle
|
|
217
|
+
* `fn` receives runs on the pool once the transaction has ended.
|
|
218
|
+
*/
|
|
219
|
+
transaction<T>(fn: (trx: StorageAdapter) => Promise<T>, options?: PostgresTransactionOptions): Promise<T>;
|
|
220
|
+
/**
|
|
221
|
+
* Holds one pooled connection for `fn`, for work that needs one session:
|
|
222
|
+
* `SET` and other session settings, session advisory locks
|
|
223
|
+
* (`pg_advisory_lock`), temporary tables, or statements that must not run
|
|
224
|
+
* inside a transaction. Its statements run outside a transaction unless
|
|
225
|
+
* `fn` opens one with `connection.transaction()` or `BEGIN`.
|
|
226
|
+
*
|
|
227
|
+
* When `fn` resolves, the connection goes back to the pool with its session
|
|
228
|
+
* state, so undo what `fn` set (or use `SET LOCAL` inside a transaction).
|
|
229
|
+
* When `fn` throws, the connection is closed instead, which ends its session
|
|
230
|
+
* state and any transaction it left open, and `fn`'s error is rethrown.
|
|
231
|
+
* When `fn` resolves inside a transaction it began and did not end, the
|
|
232
|
+
* connection is closed, which rolls the transaction back, and the call
|
|
233
|
+
* rejects (pg 8.21 and later report the transaction status). The connection
|
|
234
|
+
* refuses statements once `fn` has ended. A connection that broke while `fn`
|
|
235
|
+
* held it (the server ended the session) is closed, not returned.
|
|
236
|
+
*/
|
|
237
|
+
withConnection<T>(fn: (connection: PostgresConnection) => Promise<T>): Promise<T>;
|
|
238
|
+
/** The pool's counts, or null when the adapter is not open. */
|
|
239
|
+
getPoolStats(): PostgresPoolStats | null;
|
|
163
240
|
close(): Promise<void>;
|
|
164
241
|
private getExecutor;
|
|
242
|
+
private requirePool;
|
|
165
243
|
}
|
|
166
244
|
/**
|
|
167
245
|
* Create a PostgreSQL adapter with connection string.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/postgresAdapter.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIpI;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,GAAG,CAAC,EAAE,OAAO,GAAG;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3F,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"postgresAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/postgresAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,36 @@
|
|
|
4
4
|
const __isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
5
5
|
import { normaliseParameters } from '../shared/parameterUtils.js';
|
|
6
6
|
import { splitSqlStatements } from '../shared/splitSqlStatements.js';
|
|
7
|
+
const ISOLATION_LEVELS = new Map([
|
|
8
|
+
['read uncommitted', 'READ UNCOMMITTED'],
|
|
9
|
+
['read committed', 'READ COMMITTED'],
|
|
10
|
+
['repeatable read', 'REPEATABLE READ'],
|
|
11
|
+
['serializable', 'SERIALIZABLE'],
|
|
12
|
+
]);
|
|
13
|
+
/** The BEGIN statement for `options`. Refuses an isolation level it does not know, before any SQL is sent. */
|
|
14
|
+
const beginStatement = (options) => {
|
|
15
|
+
const modes = [];
|
|
16
|
+
if (options?.isolationLevel !== undefined) {
|
|
17
|
+
const level = ISOLATION_LEVELS.get(options.isolationLevel);
|
|
18
|
+
if (!level) {
|
|
19
|
+
throw new Error(`Unknown isolation level "${String(options.isolationLevel)}". Use 'read uncommitted', 'read committed', 'repeatable read' or 'serializable'.`);
|
|
20
|
+
}
|
|
21
|
+
modes.push(`ISOLATION LEVEL ${level}`);
|
|
22
|
+
}
|
|
23
|
+
if (options?.readOnly !== undefined)
|
|
24
|
+
modes.push(options.readOnly ? 'READ ONLY' : 'READ WRITE');
|
|
25
|
+
if (options?.deferrable !== undefined)
|
|
26
|
+
modes.push(options.deferrable ? 'DEFERRABLE' : 'NOT DEFERRABLE');
|
|
27
|
+
return modes.length > 0 ? `BEGIN ${modes.join(', ')}` : 'BEGIN';
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* A connection's transaction status: 'I' idle, 'T' in a transaction, 'E' in
|
|
31
|
+
* a failed one. pg reports it from 8.21; null on an older pg.
|
|
32
|
+
*/
|
|
33
|
+
const transactionStatus = (client) => {
|
|
34
|
+
const read = client.getTransactionStatus;
|
|
35
|
+
return typeof read === 'function' ? read.call(client) : null;
|
|
36
|
+
};
|
|
7
37
|
const isPositional = (statement) => statement.includes('?');
|
|
8
38
|
const buildNamedStatement = (statement, named) => {
|
|
9
39
|
const order = [];
|
|
@@ -65,32 +95,48 @@ const execWithExecutor = async (executor, script) => {
|
|
|
65
95
|
}
|
|
66
96
|
};
|
|
67
97
|
/**
|
|
68
|
-
* Adapter view
|
|
69
|
-
* Each concurrent transaction receives its own instance, so
|
|
70
|
-
* cannot leak onto another callback's client through shared
|
|
98
|
+
* Adapter view bound to one checked-out transaction client while its
|
|
99
|
+
* transaction runs. Each concurrent transaction receives its own instance, so
|
|
100
|
+
* callback queries cannot leak onto another callback's client through shared
|
|
101
|
+
* mutable state. Once its transaction has ended, the client may be another
|
|
102
|
+
* caller's, so the view sends its statements to `afterEnd` instead: the
|
|
103
|
+
* adapter's pool, or the held connection the transaction ran on.
|
|
71
104
|
*/
|
|
72
105
|
class PostgresTransactionAdapter {
|
|
73
|
-
constructor(client, capabilities) {
|
|
106
|
+
constructor(client, capabilities, afterEnd) {
|
|
74
107
|
this.client = client;
|
|
75
108
|
this.capabilities = capabilities;
|
|
109
|
+
this.afterEnd = afterEnd;
|
|
76
110
|
this.kind = 'postgres';
|
|
111
|
+
this.ended = false;
|
|
77
112
|
}
|
|
78
113
|
async open() {
|
|
79
114
|
// The owning PostgresAdapter opens the pool before creating this view.
|
|
80
115
|
}
|
|
81
116
|
async run(statement, parameters) {
|
|
117
|
+
if (this.ended)
|
|
118
|
+
return this.afterEnd.run(statement, parameters);
|
|
82
119
|
return runWithExecutor(this.client, statement, parameters);
|
|
83
120
|
}
|
|
84
121
|
async get(statement, parameters) {
|
|
122
|
+
if (this.ended)
|
|
123
|
+
return this.afterEnd.get(statement, parameters);
|
|
85
124
|
return getWithExecutor(this.client, statement, parameters);
|
|
86
125
|
}
|
|
87
126
|
async all(statement, parameters) {
|
|
127
|
+
if (this.ended)
|
|
128
|
+
return this.afterEnd.all(statement, parameters);
|
|
88
129
|
return allWithExecutor(this.client, statement, parameters);
|
|
89
130
|
}
|
|
90
131
|
async exec(script) {
|
|
132
|
+
if (this.ended)
|
|
133
|
+
return this.afterEnd.exec(script);
|
|
91
134
|
await execWithExecutor(this.client, script);
|
|
92
135
|
}
|
|
93
136
|
async transaction(fn) {
|
|
137
|
+
// After the transaction has ended, a new one begins where afterEnd runs it.
|
|
138
|
+
if (this.ended)
|
|
139
|
+
return this.afterEnd.transaction(fn);
|
|
94
140
|
// Nested callbacks share the outer transaction. Errors still reach the
|
|
95
141
|
// owning adapter, which rolls the entire transaction back.
|
|
96
142
|
return fn(this);
|
|
@@ -98,6 +144,152 @@ class PostgresTransactionAdapter {
|
|
|
98
144
|
async close() {
|
|
99
145
|
// The owning transaction releases the checked-out client after completion.
|
|
100
146
|
}
|
|
147
|
+
/** @internal runTransaction() calls this when the transaction has ended. */
|
|
148
|
+
end() {
|
|
149
|
+
this.ended = true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** An unknown thrown value as an Error. */
|
|
153
|
+
const asError = (value) => (value instanceof Error ? value : new Error(String(value)));
|
|
154
|
+
/**
|
|
155
|
+
* Puts a failed ROLLBACK's error on the transaction's error, as a
|
|
156
|
+
* non-enumerable `rollbackError` property, when that error can take one.
|
|
157
|
+
*/
|
|
158
|
+
const keepRollbackError = (error, rollbackError) => {
|
|
159
|
+
if (typeof error !== 'object' || error === null || !Object.isExtensible(error))
|
|
160
|
+
return;
|
|
161
|
+
try {
|
|
162
|
+
Object.defineProperty(error, 'rollbackError', {
|
|
163
|
+
value: rollbackError,
|
|
164
|
+
enumerable: false,
|
|
165
|
+
configurable: true,
|
|
166
|
+
writable: true,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// A non-configurable rollbackError is already there: keep it.
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Listens for a connection error on a checked-out client until `stop()`. pg
|
|
175
|
+
* emits a client's connection error (the server ending the session, a broken
|
|
176
|
+
* socket) on the client when no query is running, and pg-pool listens only on
|
|
177
|
+
* idle clients, so without this an unheard error event would end the process.
|
|
178
|
+
*/
|
|
179
|
+
const watchClient = (client) => {
|
|
180
|
+
let failure;
|
|
181
|
+
// A pg-compatible pool whose clients are not event emitters emits nothing to hear.
|
|
182
|
+
if (typeof client.on !== 'function' || typeof client.removeListener !== 'function') {
|
|
183
|
+
return { failure: () => undefined, stop: () => undefined };
|
|
184
|
+
}
|
|
185
|
+
const onError = (error) => {
|
|
186
|
+
if (!failure)
|
|
187
|
+
failure = error;
|
|
188
|
+
};
|
|
189
|
+
client.on('error', onError);
|
|
190
|
+
return {
|
|
191
|
+
failure: () => failure,
|
|
192
|
+
stop: () => {
|
|
193
|
+
client.removeListener('error', onError);
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Runs `fn` in a transaction that `begin` opens on `client`: COMMIT when `fn`
|
|
199
|
+
* resolves, ROLLBACK when `fn` or COMMIT throws, and that error is rethrown.
|
|
200
|
+
* `onBroken` hears when the connection cannot be trusted any more (BEGIN or
|
|
201
|
+
* ROLLBACK failed), so the caller closes it instead of returning it to the
|
|
202
|
+
* pool. When ROLLBACK fails, the original error is still the one thrown, with
|
|
203
|
+
* the ROLLBACK error on it as `rollbackError`.
|
|
204
|
+
*/
|
|
205
|
+
const runTransaction = async (client, begin, fn, capabilities, afterEnd, onBroken) => {
|
|
206
|
+
try {
|
|
207
|
+
await client.query(begin);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
onBroken(asError(error));
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
const handle = new PostgresTransactionAdapter(client, capabilities, afterEnd);
|
|
214
|
+
try {
|
|
215
|
+
const result = await fn(handle);
|
|
216
|
+
await client.query('COMMIT');
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
try {
|
|
221
|
+
await client.query('ROLLBACK');
|
|
222
|
+
}
|
|
223
|
+
catch (rollbackError) {
|
|
224
|
+
const failure = asError(rollbackError);
|
|
225
|
+
onBroken(failure);
|
|
226
|
+
keepRollbackError(error, failure);
|
|
227
|
+
console.warn(`[StorageAdapter] PostgreSQL ROLLBACK failed after a transaction error, so the connection was closed; the transaction's own error is rethrown. ${failure.message}`);
|
|
228
|
+
}
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
handle.end();
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* The connection a `withConnection()` callback holds. It refuses statements
|
|
237
|
+
* once the callback has ended, when the connection is back in the pool or
|
|
238
|
+
* closed.
|
|
239
|
+
*/
|
|
240
|
+
class PostgresConnectionAdapter {
|
|
241
|
+
constructor(client, capabilities) {
|
|
242
|
+
this.client = client;
|
|
243
|
+
this.capabilities = capabilities;
|
|
244
|
+
this.kind = 'postgres';
|
|
245
|
+
this.ended = false;
|
|
246
|
+
this.transactionOpen = false;
|
|
247
|
+
}
|
|
248
|
+
async open() {
|
|
249
|
+
// withConnection() checks the connection out before the callback runs.
|
|
250
|
+
}
|
|
251
|
+
async run(statement, parameters) {
|
|
252
|
+
return runWithExecutor(this.live(), statement, parameters);
|
|
253
|
+
}
|
|
254
|
+
async get(statement, parameters) {
|
|
255
|
+
return getWithExecutor(this.live(), statement, parameters);
|
|
256
|
+
}
|
|
257
|
+
async all(statement, parameters) {
|
|
258
|
+
return allWithExecutor(this.live(), statement, parameters);
|
|
259
|
+
}
|
|
260
|
+
async exec(script) {
|
|
261
|
+
await execWithExecutor(this.live(), script);
|
|
262
|
+
}
|
|
263
|
+
async transaction(fn, options) {
|
|
264
|
+
const begin = beginStatement(options);
|
|
265
|
+
const client = this.live();
|
|
266
|
+
if (this.transactionOpen) {
|
|
267
|
+
throw new Error('A transaction is already open on this connection. Run its statements through the handle its callback receives.');
|
|
268
|
+
}
|
|
269
|
+
this.transactionOpen = true;
|
|
270
|
+
try {
|
|
271
|
+
return await runTransaction(client, begin, fn, this.capabilities, this, (error) => {
|
|
272
|
+
if (!this.brokenBy)
|
|
273
|
+
this.brokenBy = error;
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
this.transactionOpen = false;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
async close() {
|
|
281
|
+
// withConnection() returns the connection to the pool, or closes it, when the callback ends.
|
|
282
|
+
}
|
|
283
|
+
/** @internal withConnection() calls this when the callback ends. */
|
|
284
|
+
end() {
|
|
285
|
+
this.ended = true;
|
|
286
|
+
}
|
|
287
|
+
live() {
|
|
288
|
+
if (this.ended) {
|
|
289
|
+
throw new Error('This connection was handed back when its withConnection() callback ended.');
|
|
290
|
+
}
|
|
291
|
+
return this.client;
|
|
292
|
+
}
|
|
101
293
|
}
|
|
102
294
|
/**
|
|
103
295
|
* PostgreSQL adapter for production-grade SQL operations.
|
|
@@ -193,10 +385,20 @@ class PostgresTransactionAdapter {
|
|
|
193
385
|
* });
|
|
194
386
|
* ```
|
|
195
387
|
*
|
|
196
|
-
* ##
|
|
197
|
-
* -
|
|
198
|
-
* -
|
|
199
|
-
*
|
|
388
|
+
* ## Connection failures
|
|
389
|
+
* - The pool drops a connection that fails, and the next query opens a new one.
|
|
390
|
+
* - The adapter never falls back to SQLite. `resolveStorageAdapter()` without
|
|
391
|
+
* `strict` tries its next candidate when Postgres fails to open; with
|
|
392
|
+
* `strict`, and in `createDatabase()` given a Postgres URL, it throws.
|
|
393
|
+
*
|
|
394
|
+
* ## Pool control
|
|
395
|
+
* - `withConnection(fn)` holds one connection for `fn`: session settings,
|
|
396
|
+
* session advisory locks, and statements that must run outside a
|
|
397
|
+
* transaction.
|
|
398
|
+
* - `getPoolStats()` counts the pool's connections and waiting callers.
|
|
399
|
+
* - `transaction(fn, { isolationLevel, readOnly, deferrable })` sets how the
|
|
400
|
+
* transaction begins.
|
|
401
|
+
* - `allowExitOnIdle` lets Node exit while the pool is idle.
|
|
200
402
|
*/
|
|
201
403
|
/**
|
|
202
404
|
* Production-grade PostgreSQL adapter backed by pg.Pool.
|
|
@@ -289,6 +491,9 @@ export class PostgresAdapter {
|
|
|
289
491
|
if (this.options.query_timeout !== undefined) {
|
|
290
492
|
poolConfig.query_timeout = this.options.query_timeout;
|
|
291
493
|
}
|
|
494
|
+
if (this.options.allowExitOnIdle !== undefined) {
|
|
495
|
+
poolConfig.allowExitOnIdle = this.options.allowExitOnIdle;
|
|
496
|
+
}
|
|
292
497
|
// SSL configuration
|
|
293
498
|
if (this.options.ssl !== undefined) {
|
|
294
499
|
poolConfig.ssl = this.options.ssl;
|
|
@@ -314,26 +519,85 @@ export class PostgresAdapter {
|
|
|
314
519
|
const executor = await this.getExecutor();
|
|
315
520
|
await execWithExecutor(executor, script);
|
|
316
521
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
522
|
+
/**
|
|
523
|
+
* Runs `fn` in a transaction on one pooled connection: COMMIT when it
|
|
524
|
+
* resolves, ROLLBACK when it or COMMIT throws, and that error is rethrown.
|
|
525
|
+
* `options` sets the isolation level and the read-only and deferrable modes;
|
|
526
|
+
* an unknown isolation level is refused before a connection is checked out.
|
|
527
|
+
*
|
|
528
|
+
* When ROLLBACK fails too (the connection broke), the error thrown is still
|
|
529
|
+
* the transaction's own, with the ROLLBACK error on it as `rollbackError`,
|
|
530
|
+
* and the connection is closed instead of returned to the pool. The handle
|
|
531
|
+
* `fn` receives runs on the pool once the transaction has ended.
|
|
532
|
+
*/
|
|
533
|
+
async transaction(fn, options) {
|
|
534
|
+
const begin = beginStatement(options);
|
|
535
|
+
const client = await this.requirePool().connect();
|
|
536
|
+
const watch = watchClient(client);
|
|
537
|
+
let brokenBy;
|
|
538
|
+
try {
|
|
539
|
+
return await runTransaction(client, begin, fn, this.capabilities, this, (error) => {
|
|
540
|
+
if (!brokenBy)
|
|
541
|
+
brokenBy = error;
|
|
542
|
+
});
|
|
320
543
|
}
|
|
321
|
-
|
|
544
|
+
finally {
|
|
545
|
+
watch.stop();
|
|
546
|
+
client.release(brokenBy ?? watch.failure());
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Holds one pooled connection for `fn`, for work that needs one session:
|
|
551
|
+
* `SET` and other session settings, session advisory locks
|
|
552
|
+
* (`pg_advisory_lock`), temporary tables, or statements that must not run
|
|
553
|
+
* inside a transaction. Its statements run outside a transaction unless
|
|
554
|
+
* `fn` opens one with `connection.transaction()` or `BEGIN`.
|
|
555
|
+
*
|
|
556
|
+
* When `fn` resolves, the connection goes back to the pool with its session
|
|
557
|
+
* state, so undo what `fn` set (or use `SET LOCAL` inside a transaction).
|
|
558
|
+
* When `fn` throws, the connection is closed instead, which ends its session
|
|
559
|
+
* state and any transaction it left open, and `fn`'s error is rethrown.
|
|
560
|
+
* When `fn` resolves inside a transaction it began and did not end, the
|
|
561
|
+
* connection is closed, which rolls the transaction back, and the call
|
|
562
|
+
* rejects (pg 8.21 and later report the transaction status). The connection
|
|
563
|
+
* refuses statements once `fn` has ended. A connection that broke while `fn`
|
|
564
|
+
* held it (the server ended the session) is closed, not returned.
|
|
565
|
+
*/
|
|
566
|
+
async withConnection(fn) {
|
|
567
|
+
const client = await this.requirePool().connect();
|
|
568
|
+
const watch = watchClient(client);
|
|
569
|
+
const connection = new PostgresConnectionAdapter(client, this.capabilities);
|
|
570
|
+
let releaseError;
|
|
322
571
|
try {
|
|
323
|
-
await
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
|
|
572
|
+
const result = await fn(connection);
|
|
573
|
+
const status = transactionStatus(client);
|
|
574
|
+
if (status === 'T' || status === 'E') {
|
|
575
|
+
releaseError = new Error('withConnection(): the callback returned inside an open transaction. The connection was closed, which rolled the transaction back. End each transaction the callback begins, or run it through connection.transaction().');
|
|
576
|
+
throw releaseError;
|
|
577
|
+
}
|
|
327
578
|
return result;
|
|
328
579
|
}
|
|
329
580
|
catch (error) {
|
|
330
|
-
|
|
581
|
+
// The connection may hold session state or an open transaction that
|
|
582
|
+
// fn did not undo: close it rather than hand it to the next caller.
|
|
583
|
+
if (!releaseError) {
|
|
584
|
+
releaseError = error instanceof Error ? error : new Error(String(error));
|
|
585
|
+
}
|
|
331
586
|
throw error;
|
|
332
587
|
}
|
|
333
588
|
finally {
|
|
334
|
-
|
|
589
|
+
connection.end();
|
|
590
|
+
watch.stop();
|
|
591
|
+
client.release(releaseError ?? connection.brokenBy ?? watch.failure());
|
|
335
592
|
}
|
|
336
593
|
}
|
|
594
|
+
/** The pool's counts, or null when the adapter is not open. */
|
|
595
|
+
getPoolStats() {
|
|
596
|
+
if (!this.pool) {
|
|
597
|
+
return null;
|
|
598
|
+
}
|
|
599
|
+
return { total: this.pool.totalCount, idle: this.pool.idleCount, waiting: this.pool.waitingCount };
|
|
600
|
+
}
|
|
337
601
|
async close() {
|
|
338
602
|
if (this.pool) {
|
|
339
603
|
await this.pool.end();
|
|
@@ -341,6 +605,9 @@ export class PostgresAdapter {
|
|
|
341
605
|
}
|
|
342
606
|
}
|
|
343
607
|
async getExecutor() {
|
|
608
|
+
return this.requirePool();
|
|
609
|
+
}
|
|
610
|
+
requirePool() {
|
|
344
611
|
if (!this.pool) {
|
|
345
612
|
throw new Error('Postgres adapter not opened.');
|
|
346
613
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresAdapter.js","sourceRoot":"","sources":["../../src/adapters/postgresAdapter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgresAdapter.js","sourceRoot":"","sources":["../../src/adapters/postgresAdapter.ts"],"names":[],"mappings":"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"}
|
package/dist/core/database.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - connectDatabase() - Explicit connection with clear options
|
|
7
7
|
* - openDatabase() - Simple file-based database
|
|
8
8
|
*/
|
|
9
|
-
import type
|
|
9
|
+
import { type StorageAdapter } from './contracts/index.js';
|
|
10
10
|
import { type AdapterKind } from './resolver.js';
|
|
11
11
|
import type { PostgresAdapterOptions } from '../adapters/postgresAdapter.js';
|
|
12
12
|
import type { CapacitorAdapterOptions } from '../adapters/capacitorSqliteAdapter.js';
|
|
@@ -67,6 +67,20 @@ export interface DatabaseOptions {
|
|
|
67
67
|
* Advanced: Only use if you need fine-grained control.
|
|
68
68
|
*/
|
|
69
69
|
priority?: AdapterKind[];
|
|
70
|
+
/**
|
|
71
|
+
* Strict resolution, for servers: no local database stands in for a
|
|
72
|
+
* Postgres the options configure. Default: false.
|
|
73
|
+
*
|
|
74
|
+
* - A `url` or `postgres` option that names no server (an empty or unset
|
|
75
|
+
* connection string and no host, database or user) fails on Node instead
|
|
76
|
+
* of opening the local default, unless `file` is given.
|
|
77
|
+
* - A postgres candidate that fails ends resolution with an error, whatever
|
|
78
|
+
* `priority` lists after it.
|
|
79
|
+
*
|
|
80
|
+
* `DATABASE_URL` in the environment does not count here, strict or not.
|
|
81
|
+
* See `StorageResolutionOptions.strict` for the resolver's side.
|
|
82
|
+
*/
|
|
83
|
+
strict?: boolean;
|
|
70
84
|
}
|
|
71
85
|
/**
|
|
72
86
|
* Create a database connection.
|
|
@@ -74,12 +88,15 @@ export interface DatabaseOptions {
|
|
|
74
88
|
*
|
|
75
89
|
* @example
|
|
76
90
|
* ```typescript
|
|
77
|
-
* //
|
|
91
|
+
* // The local default: better-sqlite3 (sql.js without it) on Node, sql.js in a
|
|
92
|
+
* // browser. DATABASE_URL in the environment does not change it.
|
|
78
93
|
* const db = await createDatabase();
|
|
79
94
|
*
|
|
80
|
-
* //
|
|
95
|
+
* // PostgreSQL from DATABASE_URL on a server; strict fails when it is unset
|
|
96
|
+
* // instead of opening a local file
|
|
81
97
|
* const db = await createDatabase({
|
|
82
|
-
* url: process.env.DATABASE_URL
|
|
98
|
+
* url: process.env.DATABASE_URL,
|
|
99
|
+
* strict: true
|
|
83
100
|
* });
|
|
84
101
|
*
|
|
85
102
|
* // Specify file path
|
|
@@ -113,6 +130,10 @@ export interface DatabaseOptions {
|
|
|
113
130
|
* count here.
|
|
114
131
|
* - Node.js otherwise: ['better-sqlite3', 'sqljs'] (native first, wasm fallback)
|
|
115
132
|
*
|
|
133
|
+
* With `strict` on Node, a `url` or `postgres` option that names no server
|
|
134
|
+
* throws instead of choosing the local default (unless `file` is given), and a
|
|
135
|
+
* postgres candidate that fails ends resolution.
|
|
136
|
+
*
|
|
116
137
|
* The function never throws solely due to a native adapter absence; it falls
|
|
117
138
|
* back to next candidates. Only when no candidate can open will it bubble an error.
|
|
118
139
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAwD,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAa5E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAElC;;;OAGG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAEjC;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CAAC,EAAE,uBAAuB,CAAC;IAEpC;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE/D;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IAEzB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAkF3F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,GAAG,sBAAsB,GACtC,OAAO,CAAC,cAAc,CAAC,CAKzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAE5E;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAEpE;AAGD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/core/database.js
CHANGED
|
@@ -6,20 +6,36 @@
|
|
|
6
6
|
* - connectDatabase() - Explicit connection with clear options
|
|
7
7
|
* - openDatabase() - Simple file-based database
|
|
8
8
|
*/
|
|
9
|
+
import { StorageResolutionError } from './contracts/index.js';
|
|
9
10
|
import { resolveStorageAdapter } from './resolver.js';
|
|
10
11
|
import { namesPostgresServer } from '../shared/postgresTarget.js';
|
|
12
|
+
/**
|
|
13
|
+
* The options that configure Postgres: `url` when the caller set the key, even
|
|
14
|
+
* to undefined (`{ url: process.env.DATABASE_URL }`), and `postgres`.
|
|
15
|
+
*/
|
|
16
|
+
const configuredPostgresOptions = (options) => {
|
|
17
|
+
const named = [];
|
|
18
|
+
if (Object.prototype.hasOwnProperty.call(options, 'url'))
|
|
19
|
+
named.push('url');
|
|
20
|
+
if (options.postgres !== undefined)
|
|
21
|
+
named.push('postgres');
|
|
22
|
+
return named;
|
|
23
|
+
};
|
|
11
24
|
/**
|
|
12
25
|
* Create a database connection.
|
|
13
26
|
* Automatically picks the best database for your environment.
|
|
14
27
|
*
|
|
15
28
|
* @example
|
|
16
29
|
* ```typescript
|
|
17
|
-
* //
|
|
30
|
+
* // The local default: better-sqlite3 (sql.js without it) on Node, sql.js in a
|
|
31
|
+
* // browser. DATABASE_URL in the environment does not change it.
|
|
18
32
|
* const db = await createDatabase();
|
|
19
33
|
*
|
|
20
|
-
* //
|
|
34
|
+
* // PostgreSQL from DATABASE_URL on a server; strict fails when it is unset
|
|
35
|
+
* // instead of opening a local file
|
|
21
36
|
* const db = await createDatabase({
|
|
22
|
-
* url: process.env.DATABASE_URL
|
|
37
|
+
* url: process.env.DATABASE_URL,
|
|
38
|
+
* strict: true
|
|
23
39
|
* });
|
|
24
40
|
*
|
|
25
41
|
* // Specify file path
|
|
@@ -53,6 +69,10 @@ import { namesPostgresServer } from '../shared/postgresTarget.js';
|
|
|
53
69
|
* count here.
|
|
54
70
|
* - Node.js otherwise: ['better-sqlite3', 'sqljs'] (native first, wasm fallback)
|
|
55
71
|
*
|
|
72
|
+
* With `strict` on Node, a `url` or `postgres` option that names no server
|
|
73
|
+
* throws instead of choosing the local default (unless `file` is given), and a
|
|
74
|
+
* postgres candidate that fails ends resolution.
|
|
75
|
+
*
|
|
56
76
|
* The function never throws solely due to a native adapter absence; it falls
|
|
57
77
|
* back to next candidates. Only when no candidate can open will it bubble an error.
|
|
58
78
|
*/
|
|
@@ -102,6 +122,9 @@ export async function createDatabase(options = {}) {
|
|
|
102
122
|
if (options.priority) {
|
|
103
123
|
resolverOptions.priority = options.priority;
|
|
104
124
|
}
|
|
125
|
+
if (options.strict) {
|
|
126
|
+
resolverOptions.strict = true;
|
|
127
|
+
}
|
|
105
128
|
// Auto-detect environment ONLY if no priority already set
|
|
106
129
|
if (!resolverOptions.priority || resolverOptions.priority.length === 0) {
|
|
107
130
|
if (isBrowser || isDeno) {
|
|
@@ -111,6 +134,11 @@ export async function createDatabase(options = {}) {
|
|
|
111
134
|
else if (isNode && namesPostgresServer(resolverOptions.postgres)) {
|
|
112
135
|
resolverOptions.priority = ['postgres'];
|
|
113
136
|
}
|
|
137
|
+
else if (isNode && options.strict && !options.file && configuredPostgresOptions(options).length > 0) {
|
|
138
|
+
const named = configuredPostgresOptions(options);
|
|
139
|
+
throw new StorageResolutionError(`[StorageAdapter] Strict resolution: the ${named.join(' and ')} option${named.length > 1 ? 's name' : ' names'} no server. ` +
|
|
140
|
+
'Give a connection string, or a host, database or user, or pass file to open a local database.');
|
|
141
|
+
}
|
|
114
142
|
else if (isNode) {
|
|
115
143
|
resolverOptions.priority = ['better-sqlite3', 'sqljs'];
|
|
116
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"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"}
|
package/dist/core/resolver.d.ts
CHANGED
|
@@ -30,6 +30,25 @@ export interface StorageResolutionOptions {
|
|
|
30
30
|
openOptions?: StorageOpenOptions;
|
|
31
31
|
/** Suppress fallback chain logs (adapter not-found warnings). Default: false. */
|
|
32
32
|
quiet?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Strict resolution, for servers: only the database the options name opens.
|
|
35
|
+
* Default: false.
|
|
36
|
+
*
|
|
37
|
+
* - The postgres candidate is the last one tried. When it fails to open,
|
|
38
|
+
* resolution throws a `StorageResolutionError` instead of trying a local
|
|
39
|
+
* SQLite database, whatever `priority` lists after it.
|
|
40
|
+
* - A Postgres server named by `postgres` or `DATABASE_URL`, with no
|
|
41
|
+
* `priority`, makes `['postgres']` the whole list.
|
|
42
|
+
* - An explicit `filePath` outranks `DATABASE_URL`: with a `filePath` and no
|
|
43
|
+
* `postgres` options that name a server, `DATABASE_URL` is not read.
|
|
44
|
+
* - `postgres` options that name no server, with no `DATABASE_URL` to fill
|
|
45
|
+
* in and no `filePath`, fail instead of opening the local default.
|
|
46
|
+
*
|
|
47
|
+
* Without `strict`, a postgres candidate that fails falls through to the
|
|
48
|
+
* next candidate, and `DATABASE_URL` puts Postgres first even when a
|
|
49
|
+
* `filePath` is given.
|
|
50
|
+
*/
|
|
51
|
+
strict?: boolean;
|
|
33
52
|
}
|
|
34
53
|
/**
|
|
35
54
|
* Resolves the most appropriate storage adapter for the current runtime.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,cAAc,EAAyB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAgC,KAAK,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAChH,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAI9F,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,wBAAwB;IACvC,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,qEAAqE;IACrE,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,yCAAyC;IACzC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,cAAc,EAAyB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAgC,KAAK,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAChH,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAI9F,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,wBAAwB;IACvC,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,qEAAqE;IACrE,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,yCAAyC;IACzC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA+DD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,aAAmB,wBAAwB,KAAQ,OAAO,CAAC,cAAc,CAgK1G,CAAC"}
|
package/dist/core/resolver.js
CHANGED
|
@@ -86,13 +86,16 @@ const unsupportedKind = (kind) => {
|
|
|
86
86
|
*/
|
|
87
87
|
export const resolveStorageAdapter = async (options = {}) => {
|
|
88
88
|
const envOverride = getEnv('STORAGE_ADAPTER');
|
|
89
|
+
const strict = options.strict === true;
|
|
89
90
|
const postgresOptions = options.postgres;
|
|
90
91
|
const explicitConnection = postgresOptions?.connectionString;
|
|
92
|
+
// In strict resolution an explicit file path outranks DATABASE_URL.
|
|
93
|
+
const fileOutranksEnv = strict && isNonEmpty(options.filePath);
|
|
91
94
|
// Explicit options that name a server are the target; DATABASE_URL fills in
|
|
92
95
|
// only when they name none.
|
|
93
96
|
const postgresConnection = isNonEmpty(explicitConnection)
|
|
94
97
|
? explicitConnection
|
|
95
|
-
: namesPostgresServer(postgresOptions)
|
|
98
|
+
: namesPostgresServer(postgresOptions) || fileOutranksEnv
|
|
96
99
|
? undefined
|
|
97
100
|
: getEnv('DATABASE_URL') || undefined;
|
|
98
101
|
const postgresTarget = isNonEmpty(postgresConnection) || namesPostgresServer(postgresOptions);
|
|
@@ -124,7 +127,12 @@ export const resolveStorageAdapter = async (options = {}) => {
|
|
|
124
127
|
return ['capacitor', 'indexeddb', 'sqljs'];
|
|
125
128
|
}
|
|
126
129
|
if (postgresTarget) {
|
|
127
|
-
return ['postgres', 'better-sqlite3', 'indexeddb', 'sqljs'];
|
|
130
|
+
return strict ? ['postgres'] : ['postgres', 'better-sqlite3', 'indexeddb', 'sqljs'];
|
|
131
|
+
}
|
|
132
|
+
if (strict && postgresOptions !== undefined && !isNonEmpty(options.filePath)) {
|
|
133
|
+
// Postgres is configured but names no server: the postgres candidate
|
|
134
|
+
// fails with the reason, where the local default would hide it.
|
|
135
|
+
return ['postgres'];
|
|
128
136
|
}
|
|
129
137
|
// Browser detection (check for IndexedDB)
|
|
130
138
|
if (typeof window !== 'undefined' && window.indexedDB) {
|
|
@@ -140,7 +148,9 @@ export const resolveStorageAdapter = async (options = {}) => {
|
|
|
140
148
|
name,
|
|
141
149
|
factory: async () => {
|
|
142
150
|
if (!postgresTarget) {
|
|
143
|
-
throw new Error(
|
|
151
|
+
throw new Error(fileOutranksEnv
|
|
152
|
+
? 'A postgres connection string, or a postgres host, database or user is required. Strict resolution does not read DATABASE_URL when a filePath is given.'
|
|
153
|
+
: 'DATABASE_URL, a postgres connection string, or a postgres host, database or user is required.');
|
|
144
154
|
}
|
|
145
155
|
return createPostgresAdapter({
|
|
146
156
|
...postgresOptions,
|
|
@@ -209,11 +219,15 @@ export const resolveStorageAdapter = async (options = {}) => {
|
|
|
209
219
|
return adapter;
|
|
210
220
|
}
|
|
211
221
|
catch (error) {
|
|
222
|
+
errors.push(error);
|
|
223
|
+
if (strict && candidate.name === 'postgres') {
|
|
224
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
225
|
+
throw new StorageResolutionError(`PostgreSQL could not be opened, and strict resolution does not fall back to a local database. ${msg}`, errors);
|
|
226
|
+
}
|
|
212
227
|
if (!quiet) {
|
|
213
228
|
const msg = error instanceof Error ? error.message : String(error);
|
|
214
229
|
console.warn(`[StorageAdapter] ${candidate.name} not available, trying next. ${msg}`);
|
|
215
230
|
}
|
|
216
|
-
errors.push(error);
|
|
217
231
|
continue;
|
|
218
232
|
}
|
|
219
233
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;AAC1F,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;AAE1E,6DAA6D;AAC7D,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAe,EAAmB,EAAE;IAC1D,IAAI,SAAS,EAAE,CAAC;QACd,8EAA8E;QAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,wCAAwC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;YAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAsB,EAAE;IACjD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,6BAA6B;AAC7B,MAAM,MAAM,GAAG,GAAW,EAAE;IAC1B,IAAI,MAAM,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAC5D,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,gDAAgD;IAChD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAGF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAgC,MAAM,oCAAoC,CAAC;AAChH,OAAO,EAAE,qBAAqB,EAA+B,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAgC,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;AAC1F,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;AAE1E,6DAA6D;AAC7D,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAe,EAAmB,EAAE;IAC1D,IAAI,SAAS,EAAE,CAAC;QACd,8EAA8E;QAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,wCAAwC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;YAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAsB,EAAE;IACjD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,6BAA6B;AAC7B,MAAM,MAAM,GAAG,GAAW,EAAE;IAC1B,IAAI,MAAM,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAC5D,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,gDAAgD;IAChD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAGF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAgC,MAAM,oCAAoC,CAAC;AAChH,OAAO,EAAE,qBAAqB,EAA+B,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAgC,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AA0D3E,MAAM,kBAAkB,GAAG,GAAY,EAAE;IACvC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,cAAc,GAAI,MAAmC,CAAC,SAAS,CAAC;IACtE,OAAO,OAAO,CAAC,cAAc,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG,GAAY,EAAE;IACnC,OAAO,OAAO,OAAO,KAAK,WAAW;QACnC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAClC,OAA8C,CAAC,IAAI,KAAK,SAAS,CAAC;AACvE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAG,GAAY,EAAE;IACvC,OAAO,OAAO,MAAM,KAAK,WAAW;QAClC,OAAO,OAAO,KAAK,WAAW;QAC9B,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAClC,OAA8C,CAAC,IAAI,KAAK,UAAU,CAAC;AACxE,CAAC,CAAC;AAQF,0DAA0D;AAC1D,MAAM,eAAe,GAAG,CAAC,IAAY,EAAS,EAAE;IAC9C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,IAAI,KAAK,CACd,2CAA2C,IAAI,2FAA2F,CAC3I,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO,IAAI,KAAK,CACd,2CAA2C,IAAI,+FAA+F,CAC/I,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,IAAI,KAAK,CACd,2CAA2C,IAAI,0FAA0F,CAC1I,CAAC;QACJ;YACE,OAAO,IAAI,KAAK,CACd,yBAAyB,IAAI,0FAA0F,CACxH,CAAC;IACN,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,UAAoC,EAAE,EAA2B,EAAE;IAC7G,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAA4B,CAAC;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IACzC,MAAM,kBAAkB,GAAG,eAAe,EAAE,gBAAgB,CAAC;IAC7D,oEAAoE;IACpE,MAAM,eAAe,GAAG,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/D,4EAA4E;IAC5E,4BAA4B;IAC5B,MAAM,kBAAkB,GAAG,UAAU,CAAC,kBAAkB,CAAC;QACvD,CAAC,CAAC,kBAAkB;QACpB,CAAC,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,eAAe;YACvD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;IAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAC9F,MAAM,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IACjH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC;IAErD,MAAM,eAAe,GAAkB,CAAC,GAAG,EAAE;QAC3C,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,OAAO,CAAC,QAAQ,CAAC;QAC1B,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;QACD,2EAA2E;QAC3E,IAAI,cAAc,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,mDAAmD;gBACnD,6EAA6E;gBAC7E,wFAAwF;gBACxF,yCAAyC,CAC1C,CAAC;YACF,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,kBAAkB,EAAE,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CACV,uDAAuD;gBACvD,sEAAsE;gBACtE,4FAA4F;gBAC5F,mFAAmF,CACpF,CAAC;YACF,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,kBAAkB,EAAE,EAAE,CAAC;YACzB,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,MAAM,IAAI,eAAe,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7E,qEAAqE;YACrE,gEAAgE;YAChE,OAAO,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC;QACD,0CAA0C;QAC1C,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtD,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,UAAU,GAAgB,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3D,0EAA0E;QAC1E,QAAQ,IAAc,EAAE,CAAC;YACvB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,OAAO;oBACL,IAAI;oBACJ,OAAO,EAAE,KAAK,IAAI,EAAE;wBAClB,IAAI,CAAC,cAAc,EAAE,CAAC;4BACpB,MAAM,IAAI,KAAK,CACb,eAAe;gCACb,CAAC,CAAC,wJAAwJ;gCAC1J,CAAC,CAAC,+FAA+F,CACpG,CAAC;wBACJ,CAAC;wBACD,OAAO,qBAAqB,CAAC;4BAC3B,GAAG,eAAe;4BAClB,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBACxE,CAAC,CAAC;oBACL,CAAC;oBACD,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS;iBACvF,CAAC;YACJ,CAAC;YACD,KAAK,gBAAgB;gBACnB,OAAO;oBACL,IAAI;oBACJ,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC;oBACxD,WAAW,EAAE,EAAE,QAAQ,EAAE;iBAC1B,CAAC;YACJ,KAAK,WAAW;gBACd,OAAO;oBACL,IAAI;oBACJ,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,CAAC,OAAO,CAAC,SAAS,CAAC;iBACrE,CAAC;YACJ,KAAK,WAAW;gBACd,OAAO;oBACL,IAAI;oBACJ,OAAO,EAAE,KAAK,IAAI,EAAE;wBAClB,iFAAiF;wBACjF,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,cAAiD,CAAC;wBAC7F,OAAO,IAAI,gBAAgB,CAAC;4BAC1B,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,IAAI,QAAQ;4BACtE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS;4BACvC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,IAAI,IAAI;4BAC7C,cAAc,EAAE,OAAO,CAAC,SAAS,EAAE,cAAc;4BACjD,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW;yBAC5C,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC;YACJ,KAAK,OAAO,CAAC;YACb,2EAA2E;YAC3E,4BAA4B;YAC5B,KAAK,QAAQ;gBACX,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,kBAAkB,EAAE;oBACzC,WAAW,EAAE,EAAE,QAAQ,EAAE;iBAC1B,CAAC;YACJ;gBACE,OAAO;oBACL,IAAI;oBACJ,OAAO,EAAE,KAAK,IAAI,EAAE;wBAClB,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;oBAC9B,CAAC;iBACF,CAAC;QACN,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC;IAErC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAuB;gBACtC,GAAG,SAAS,CAAC,WAAW;gBACxB,GAAG,OAAO,CAAC,WAAW;aACvB,CAAC;YACF,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,mCAAmC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;YAChF,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,MAAM,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,IAAI,sBAAsB,CAC9B,iGAAiG,GAAG,EAAE,EACtG,MAAM,CACP,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,oBAAoB,SAAS,CAAC,IAAI,gCAAgC,GAAG,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,IAAI,sBAAsB,CAAC,kEAAkE,EAAE,MAAM,CAAC,CAAC;AAC/G,CAAC,CAAC"}
|
package/package.json
CHANGED