@dotdo/pglite 0.1.0 → 0.1.1
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/dist/amcheck.tar.gz +0 -0
- package/dist/auth_delay.tar.gz +0 -0
- package/dist/auto_explain.tar.gz +0 -0
- package/dist/basebackup_to_shell.tar.gz +0 -0
- package/dist/basic_archive.tar.gz +0 -0
- package/dist/bloom.tar.gz +0 -0
- package/dist/btree_gin.tar.gz +0 -0
- package/dist/btree_gist.tar.gz +0 -0
- package/dist/{chunk-FY2WAP66.js → chunk-5U7S5PTI.js} +2 -2
- package/dist/chunk-5U7S5PTI.js.map +1 -0
- package/dist/{chunk-NS5M47NH.js → chunk-I55HERVV.js} +3 -3
- package/dist/chunk-I55HERVV.js.map +1 -0
- package/dist/{chunk-XGK36GMM.js → chunk-J77SUHST.js} +2 -2
- package/dist/chunk-J77SUHST.js.map +1 -0
- package/dist/citext.tar.gz +0 -0
- package/dist/contrib/amcheck.cjs +1 -1
- package/dist/contrib/amcheck.cjs.map +1 -1
- package/dist/contrib/amcheck.d.cts +10 -0
- package/dist/contrib/amcheck.d.ts +10 -0
- package/dist/contrib/amcheck.js +1 -1
- package/dist/contrib/amcheck.js.map +1 -1
- package/dist/contrib/auto_explain.cjs +1 -1
- package/dist/contrib/auto_explain.cjs.map +1 -1
- package/dist/contrib/auto_explain.d.cts +10 -0
- package/dist/contrib/auto_explain.d.ts +10 -0
- package/dist/contrib/auto_explain.js +1 -1
- package/dist/contrib/auto_explain.js.map +1 -1
- package/dist/contrib/bloom.cjs +1 -1
- package/dist/contrib/bloom.cjs.map +1 -1
- package/dist/contrib/bloom.d.cts +10 -0
- package/dist/contrib/bloom.d.ts +10 -0
- package/dist/contrib/bloom.js +1 -1
- package/dist/contrib/bloom.js.map +1 -1
- package/dist/contrib/btree_gin.cjs +1 -1
- package/dist/contrib/btree_gin.cjs.map +1 -1
- package/dist/contrib/btree_gin.d.cts +10 -0
- package/dist/contrib/btree_gin.d.ts +10 -0
- package/dist/contrib/btree_gin.js +1 -1
- package/dist/contrib/btree_gin.js.map +1 -1
- package/dist/contrib/btree_gist.cjs +1 -1
- package/dist/contrib/btree_gist.cjs.map +1 -1
- package/dist/contrib/btree_gist.d.cts +10 -0
- package/dist/contrib/btree_gist.d.ts +10 -0
- package/dist/contrib/btree_gist.js +1 -1
- package/dist/contrib/btree_gist.js.map +1 -1
- package/dist/contrib/citext.cjs +1 -1
- package/dist/contrib/citext.cjs.map +1 -1
- package/dist/contrib/citext.d.cts +10 -0
- package/dist/contrib/citext.d.ts +10 -0
- package/dist/contrib/citext.js +1 -1
- package/dist/contrib/citext.js.map +1 -1
- package/dist/contrib/cube.cjs +1 -1
- package/dist/contrib/cube.cjs.map +1 -1
- package/dist/contrib/cube.d.cts +10 -0
- package/dist/contrib/cube.d.ts +10 -0
- package/dist/contrib/cube.js +1 -1
- package/dist/contrib/cube.js.map +1 -1
- package/dist/contrib/dict_int.cjs +1 -1
- package/dist/contrib/dict_int.cjs.map +1 -1
- package/dist/contrib/dict_int.d.cts +10 -0
- package/dist/contrib/dict_int.d.ts +10 -0
- package/dist/contrib/dict_int.js +1 -1
- package/dist/contrib/dict_int.js.map +1 -1
- package/dist/contrib/dict_xsyn.cjs +1 -1
- package/dist/contrib/dict_xsyn.cjs.map +1 -1
- package/dist/contrib/dict_xsyn.d.cts +10 -0
- package/dist/contrib/dict_xsyn.d.ts +10 -0
- package/dist/contrib/dict_xsyn.js +1 -1
- package/dist/contrib/dict_xsyn.js.map +1 -1
- package/dist/contrib/earthdistance.cjs +1 -1
- package/dist/contrib/earthdistance.cjs.map +1 -1
- package/dist/contrib/earthdistance.d.cts +10 -0
- package/dist/contrib/earthdistance.d.ts +10 -0
- package/dist/contrib/earthdistance.js +1 -1
- package/dist/contrib/earthdistance.js.map +1 -1
- package/dist/contrib/file_fdw.cjs +1 -1
- package/dist/contrib/file_fdw.cjs.map +1 -1
- package/dist/contrib/file_fdw.d.cts +10 -0
- package/dist/contrib/file_fdw.d.ts +10 -0
- package/dist/contrib/file_fdw.js +1 -1
- package/dist/contrib/file_fdw.js.map +1 -1
- package/dist/contrib/fuzzystrmatch.cjs +1 -1
- package/dist/contrib/fuzzystrmatch.cjs.map +1 -1
- package/dist/contrib/fuzzystrmatch.d.cts +10 -0
- package/dist/contrib/fuzzystrmatch.d.ts +10 -0
- package/dist/contrib/fuzzystrmatch.js +1 -1
- package/dist/contrib/fuzzystrmatch.js.map +1 -1
- package/dist/contrib/hstore.cjs +1 -1
- package/dist/contrib/hstore.cjs.map +1 -1
- package/dist/contrib/hstore.d.cts +10 -0
- package/dist/contrib/hstore.d.ts +10 -0
- package/dist/contrib/hstore.js +1 -1
- package/dist/contrib/hstore.js.map +1 -1
- package/dist/contrib/intarray.cjs +1 -1
- package/dist/contrib/intarray.cjs.map +1 -1
- package/dist/contrib/intarray.d.cts +10 -0
- package/dist/contrib/intarray.d.ts +10 -0
- package/dist/contrib/intarray.js +1 -1
- package/dist/contrib/intarray.js.map +1 -1
- package/dist/contrib/isn.cjs +1 -1
- package/dist/contrib/isn.cjs.map +1 -1
- package/dist/contrib/isn.d.cts +10 -0
- package/dist/contrib/isn.d.ts +10 -0
- package/dist/contrib/isn.js +1 -1
- package/dist/contrib/isn.js.map +1 -1
- package/dist/contrib/lo.cjs +1 -1
- package/dist/contrib/lo.cjs.map +1 -1
- package/dist/contrib/lo.d.cts +10 -0
- package/dist/contrib/lo.d.ts +10 -0
- package/dist/contrib/lo.js +1 -1
- package/dist/contrib/lo.js.map +1 -1
- package/dist/contrib/ltree.cjs +1 -1
- package/dist/contrib/ltree.cjs.map +1 -1
- package/dist/contrib/ltree.d.cts +10 -0
- package/dist/contrib/ltree.d.ts +10 -0
- package/dist/contrib/ltree.js +1 -1
- package/dist/contrib/ltree.js.map +1 -1
- package/dist/contrib/pageinspect.cjs +1 -1
- package/dist/contrib/pageinspect.cjs.map +1 -1
- package/dist/contrib/pageinspect.d.cts +10 -0
- package/dist/contrib/pageinspect.d.ts +10 -0
- package/dist/contrib/pageinspect.js +1 -1
- package/dist/contrib/pageinspect.js.map +1 -1
- package/dist/contrib/pg_buffercache.cjs +1 -1
- package/dist/contrib/pg_buffercache.cjs.map +1 -1
- package/dist/contrib/pg_buffercache.d.cts +10 -0
- package/dist/contrib/pg_buffercache.d.ts +10 -0
- package/dist/contrib/pg_buffercache.js +1 -1
- package/dist/contrib/pg_buffercache.js.map +1 -1
- package/dist/contrib/pg_freespacemap.cjs +1 -1
- package/dist/contrib/pg_freespacemap.cjs.map +1 -1
- package/dist/contrib/pg_freespacemap.d.cts +10 -0
- package/dist/contrib/pg_freespacemap.d.ts +10 -0
- package/dist/contrib/pg_freespacemap.js +1 -1
- package/dist/contrib/pg_freespacemap.js.map +1 -1
- package/dist/contrib/pg_surgery.cjs +1 -1
- package/dist/contrib/pg_surgery.cjs.map +1 -1
- package/dist/contrib/pg_surgery.d.cts +10 -0
- package/dist/contrib/pg_surgery.d.ts +10 -0
- package/dist/contrib/pg_surgery.js +1 -1
- package/dist/contrib/pg_surgery.js.map +1 -1
- package/dist/contrib/pg_trgm.cjs +1 -1
- package/dist/contrib/pg_trgm.cjs.map +1 -1
- package/dist/contrib/pg_trgm.d.cts +10 -0
- package/dist/contrib/pg_trgm.d.ts +10 -0
- package/dist/contrib/pg_trgm.js +1 -1
- package/dist/contrib/pg_trgm.js.map +1 -1
- package/dist/contrib/pg_visibility.cjs +1 -1
- package/dist/contrib/pg_visibility.cjs.map +1 -1
- package/dist/contrib/pg_visibility.d.cts +10 -0
- package/dist/contrib/pg_visibility.d.ts +10 -0
- package/dist/contrib/pg_visibility.js +1 -1
- package/dist/contrib/pg_visibility.js.map +1 -1
- package/dist/contrib/pg_walinspect.cjs +1 -1
- package/dist/contrib/pg_walinspect.cjs.map +1 -1
- package/dist/contrib/pg_walinspect.d.cts +10 -0
- package/dist/contrib/pg_walinspect.d.ts +10 -0
- package/dist/contrib/pg_walinspect.js +1 -1
- package/dist/contrib/pg_walinspect.js.map +1 -1
- package/dist/contrib/pgcrypto.cjs +1 -1
- package/dist/contrib/pgcrypto.cjs.map +1 -1
- package/dist/contrib/pgcrypto.d.cts +10 -0
- package/dist/contrib/pgcrypto.d.ts +10 -0
- package/dist/contrib/pgcrypto.js +1 -1
- package/dist/contrib/pgcrypto.js.map +1 -1
- package/dist/contrib/seg.cjs +1 -1
- package/dist/contrib/seg.cjs.map +1 -1
- package/dist/contrib/seg.d.cts +10 -0
- package/dist/contrib/seg.d.ts +10 -0
- package/dist/contrib/seg.js +1 -1
- package/dist/contrib/seg.js.map +1 -1
- package/dist/contrib/tablefunc.cjs +1 -1
- package/dist/contrib/tablefunc.cjs.map +1 -1
- package/dist/contrib/tablefunc.d.cts +10 -0
- package/dist/contrib/tablefunc.d.ts +10 -0
- package/dist/contrib/tablefunc.js +1 -1
- package/dist/contrib/tablefunc.js.map +1 -1
- package/dist/contrib/tcn.cjs +1 -1
- package/dist/contrib/tcn.cjs.map +1 -1
- package/dist/contrib/tcn.d.cts +10 -0
- package/dist/contrib/tcn.d.ts +10 -0
- package/dist/contrib/tcn.js +1 -1
- package/dist/contrib/tcn.js.map +1 -1
- package/dist/contrib/tsm_system_rows.cjs +1 -1
- package/dist/contrib/tsm_system_rows.cjs.map +1 -1
- package/dist/contrib/tsm_system_rows.d.cts +10 -0
- package/dist/contrib/tsm_system_rows.d.ts +10 -0
- package/dist/contrib/tsm_system_rows.js +1 -1
- package/dist/contrib/tsm_system_rows.js.map +1 -1
- package/dist/contrib/tsm_system_time.cjs +1 -1
- package/dist/contrib/tsm_system_time.cjs.map +1 -1
- package/dist/contrib/tsm_system_time.d.cts +10 -0
- package/dist/contrib/tsm_system_time.d.ts +10 -0
- package/dist/contrib/tsm_system_time.js +1 -1
- package/dist/contrib/tsm_system_time.js.map +1 -1
- package/dist/contrib/unaccent.cjs +1 -1
- package/dist/contrib/unaccent.cjs.map +1 -1
- package/dist/contrib/unaccent.d.cts +10 -0
- package/dist/contrib/unaccent.d.ts +10 -0
- package/dist/contrib/unaccent.js +1 -1
- package/dist/contrib/unaccent.js.map +1 -1
- package/dist/contrib/uuid_ossp.cjs +1 -1
- package/dist/contrib/uuid_ossp.cjs.map +1 -1
- package/dist/contrib/uuid_ossp.d.cts +10 -0
- package/dist/contrib/uuid_ossp.d.ts +10 -0
- package/dist/contrib/uuid_ossp.js +1 -1
- package/dist/contrib/uuid_ossp.js.map +1 -1
- package/dist/cube.tar.gz +0 -0
- package/dist/dblink.tar.gz +0 -0
- package/dist/dict_int.tar.gz +0 -0
- package/dist/dict_xsyn.tar.gz +0 -0
- package/dist/earthdistance.tar.gz +0 -0
- package/dist/file_fdw.tar.gz +0 -0
- package/dist/fs/base.cjs +1 -1
- package/dist/fs/base.cjs.map +1 -1
- package/dist/fs/base.d.cts +1 -0
- package/dist/fs/base.d.ts +1 -0
- package/dist/fs/base.js +1 -1
- package/dist/fs/nodefs.cjs +1 -1
- package/dist/fs/nodefs.cjs.map +1 -1
- package/dist/fs/nodefs.d.cts +12 -0
- package/dist/fs/nodefs.d.ts +12 -0
- package/dist/fs/nodefs.js +1 -1
- package/dist/fs/opfs-ahp.cjs +3 -3
- package/dist/fs/opfs-ahp.cjs.map +1 -1
- package/dist/fs/opfs-ahp.d.cts +112 -0
- package/dist/fs/opfs-ahp.d.ts +112 -0
- package/dist/fs/opfs-ahp.js +1 -1
- package/dist/fuzzystrmatch.tar.gz +0 -0
- package/dist/hstore.tar.gz +0 -0
- package/dist/index.cjs +7 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +416 -0
- package/dist/index.d.ts +416 -0
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/intagg.tar.gz +0 -0
- package/dist/intarray.tar.gz +0 -0
- package/dist/isn.tar.gz +0 -0
- package/dist/live/index.cjs +5 -5
- package/dist/live/index.cjs.map +1 -1
- package/dist/live/index.d.cts +149 -0
- package/dist/live/index.d.ts +149 -0
- package/dist/live/index.js +1 -1
- package/dist/live/index.js.map +1 -1
- package/dist/lo.tar.gz +0 -0
- package/dist/ltree.tar.gz +0 -0
- package/dist/oid2name.tar.gz +0 -0
- package/dist/pageinspect.tar.gz +0 -0
- package/dist/passwordcheck.tar.gz +0 -0
- package/dist/pg_buffercache.tar.gz +0 -0
- package/dist/pg_freespacemap.tar.gz +0 -0
- package/dist/pg_hashids/index.cjs +1 -1
- package/dist/pg_hashids/index.cjs.map +1 -1
- package/dist/pg_hashids/index.d.cts +11 -0
- package/dist/pg_hashids/index.d.ts +11 -0
- package/dist/pg_hashids/index.js +1 -1
- package/dist/pg_hashids/index.js.map +1 -1
- package/dist/pg_hashids.tar.gz +0 -0
- package/dist/pg_ivm/index.cjs +1 -1
- package/dist/pg_ivm/index.cjs.map +1 -1
- package/dist/pg_ivm/index.d.cts +11 -0
- package/dist/pg_ivm/index.d.ts +11 -0
- package/dist/pg_ivm/index.js +1 -1
- package/dist/pg_ivm/index.js.map +1 -1
- package/dist/pg_ivm.tar.gz +0 -0
- package/dist/pg_prewarm.tar.gz +0 -0
- package/dist/pg_stat_statements.tar.gz +0 -0
- package/dist/pg_surgery.tar.gz +0 -0
- package/dist/pg_textsearch.tar.gz +0 -0
- package/dist/pg_trgm.tar.gz +0 -0
- package/dist/pg_uuidv7/index.cjs +1 -1
- package/dist/pg_uuidv7/index.cjs.map +1 -1
- package/dist/pg_uuidv7/index.d.cts +11 -0
- package/dist/pg_uuidv7/index.d.ts +11 -0
- package/dist/pg_uuidv7/index.js +1 -1
- package/dist/pg_uuidv7/index.js.map +1 -1
- package/dist/pg_uuidv7.tar.gz +0 -0
- package/dist/pg_visibility.tar.gz +0 -0
- package/dist/pg_walinspect.tar.gz +0 -0
- package/dist/pgcrypto.tar.gz +0 -0
- package/dist/pglite-RfkRSGmH.d.cts +1507 -0
- package/dist/pglite-RfkRSGmH.d.ts +1507 -0
- package/dist/pglite.cjs +3 -3
- package/dist/pglite.data +0 -0
- package/dist/pglite.html +1 -0
- package/dist/pglite.js +16 -0
- package/dist/pglite.wasm +0 -0
- package/dist/pgrowlocks.tar.gz +0 -0
- package/dist/pgstattuple.tar.gz +0 -0
- package/dist/pgtap/index.cjs +1 -1
- package/dist/pgtap/index.cjs.map +1 -1
- package/dist/pgtap/index.d.cts +11 -0
- package/dist/pgtap/index.d.ts +11 -0
- package/dist/pgtap/index.js +1 -1
- package/dist/pgtap/index.js.map +1 -1
- package/dist/pgtap.tar.gz +0 -0
- package/dist/postgres_fdw.tar.gz +0 -0
- package/dist/seg.tar.gz +0 -0
- package/dist/spi.tar.gz +0 -0
- package/dist/tablefunc.tar.gz +0 -0
- package/dist/tcn.tar.gz +0 -0
- package/dist/templating.d.cts +69 -0
- package/dist/templating.d.ts +69 -0
- package/dist/test_decoding.tar.gz +0 -0
- package/dist/tsm_system_rows.tar.gz +0 -0
- package/dist/tsm_system_time.tar.gz +0 -0
- package/dist/unaccent.tar.gz +0 -0
- package/dist/uuid-ossp.tar.gz +0 -0
- package/dist/vacuumlo.tar.gz +0 -0
- package/dist/vector/index.cjs +1 -1
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +11 -0
- package/dist/vector/index.d.ts +11 -0
- package/dist/vector/index.js +1 -1
- package/dist/vector/index.js.map +1 -1
- package/dist/vector.tar.gz +0 -0
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +115 -0
- package/dist/worker/index.d.ts +115 -0
- package/dist/worker/index.js +1 -1
- package/dist/worker/index.js.map +1 -1
- package/dist/xml2.tar.gz +0 -0
- package/package.json +1 -1
- package/dist/chunk-FY2WAP66.js.map +0 -1
- package/dist/chunk-NS5M47NH.js.map +0 -1
- package/dist/chunk-XGK36GMM.js.map +0 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { R as Results, d as PGliteInterfaceBase, x as PGliteInterface } from '../pglite-RfkRSGmH.cjs';
|
|
2
|
+
|
|
3
|
+
interface LiveQueryOptions<T = {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}> {
|
|
6
|
+
query: string;
|
|
7
|
+
params?: any[] | null;
|
|
8
|
+
offset?: number;
|
|
9
|
+
limit?: number;
|
|
10
|
+
callback?: (results: Results<T>) => void;
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
}
|
|
13
|
+
interface LiveChangesOptions<T = {
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
}> {
|
|
16
|
+
query: string;
|
|
17
|
+
params?: any[] | null;
|
|
18
|
+
key: string;
|
|
19
|
+
callback?: (changes: Array<Change<T>>) => void;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
}
|
|
22
|
+
interface LiveIncrementalQueryOptions<T = {
|
|
23
|
+
[key: string]: any;
|
|
24
|
+
}> {
|
|
25
|
+
query: string;
|
|
26
|
+
params?: any[] | null;
|
|
27
|
+
key: string;
|
|
28
|
+
callback?: (results: Results<T>) => void;
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
}
|
|
31
|
+
interface LiveNamespace {
|
|
32
|
+
/**
|
|
33
|
+
* Create a live query
|
|
34
|
+
* @param query - The query to run
|
|
35
|
+
* @param params - The parameters to pass to the query
|
|
36
|
+
* @param callback - A callback to run when the query is updated
|
|
37
|
+
* @returns A promise that resolves to an object with the initial results,
|
|
38
|
+
* an unsubscribe function, and a refresh function
|
|
39
|
+
*/
|
|
40
|
+
query<T = {
|
|
41
|
+
[key: string]: any;
|
|
42
|
+
}>(query: string, params?: any[] | null, callback?: (results: Results<T>) => void): Promise<LiveQuery<T>>;
|
|
43
|
+
/**
|
|
44
|
+
* Create a live query
|
|
45
|
+
* @param options - The options to pass to the query
|
|
46
|
+
* @returns A promise that resolves to an object with the initial results,
|
|
47
|
+
* an unsubscribe function, and a refresh function
|
|
48
|
+
*/
|
|
49
|
+
query<T = {
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
}>(options: LiveQueryOptions<T>): Promise<LiveQuery<T>>;
|
|
52
|
+
/**
|
|
53
|
+
* Create a live query that returns the changes to the query results
|
|
54
|
+
* @param query - The query to run
|
|
55
|
+
* @param params - The parameters to pass to the query
|
|
56
|
+
* @param callback - A callback to run when the query is updated
|
|
57
|
+
* @returns A promise that resolves to an object with the initial changes,
|
|
58
|
+
* an unsubscribe function, and a refresh function
|
|
59
|
+
*/
|
|
60
|
+
changes<T = {
|
|
61
|
+
[key: string]: any;
|
|
62
|
+
}>(query: string, params: any[] | undefined | null, key: string, callback?: (changes: Array<Change<T>>) => void): Promise<LiveChanges<T>>;
|
|
63
|
+
/**
|
|
64
|
+
* Create a live query that returns the changes to the query results
|
|
65
|
+
* @param options - The options to pass to the query
|
|
66
|
+
* @returns A promise that resolves to an object with the initial changes,
|
|
67
|
+
* an unsubscribe function, and a refresh function
|
|
68
|
+
*/
|
|
69
|
+
changes<T = {
|
|
70
|
+
[key: string]: any;
|
|
71
|
+
}>(options: LiveChangesOptions<T>): Promise<LiveChanges<T>>;
|
|
72
|
+
/**
|
|
73
|
+
* Create a live query with incremental updates
|
|
74
|
+
* @param query - The query to run
|
|
75
|
+
* @param params - The parameters to pass to the query
|
|
76
|
+
* @param callback - A callback to run when the query is updated
|
|
77
|
+
* @returns A promise that resolves to an object with the initial results,
|
|
78
|
+
* an unsubscribe function, and a refresh function
|
|
79
|
+
*/
|
|
80
|
+
incrementalQuery<T = {
|
|
81
|
+
[key: string]: any;
|
|
82
|
+
}>(query: string, params: any[] | undefined | null, key: string, callback?: (results: Results<T>) => void): Promise<LiveQuery<T>>;
|
|
83
|
+
/**
|
|
84
|
+
* Create a live query with incremental updates
|
|
85
|
+
* @param options - The options to pass to the query
|
|
86
|
+
* @returns A promise that resolves to an object with the initial results,
|
|
87
|
+
* an unsubscribe function, and a refresh function
|
|
88
|
+
*/
|
|
89
|
+
incrementalQuery<T = {
|
|
90
|
+
[key: string]: any;
|
|
91
|
+
}>(options: LiveIncrementalQueryOptions<T>): Promise<LiveQuery<T>>;
|
|
92
|
+
}
|
|
93
|
+
interface LiveQueryResults<T> extends Results<T> {
|
|
94
|
+
totalCount?: number;
|
|
95
|
+
offset?: number;
|
|
96
|
+
limit?: number;
|
|
97
|
+
}
|
|
98
|
+
interface LiveQuery<T> {
|
|
99
|
+
initialResults: LiveQueryResults<T>;
|
|
100
|
+
subscribe: (callback: (results: LiveQueryResults<T>) => void) => void;
|
|
101
|
+
unsubscribe: (callback?: (results: LiveQueryResults<T>) => void) => Promise<void>;
|
|
102
|
+
refresh: (options?: {
|
|
103
|
+
offset?: number;
|
|
104
|
+
limit?: number;
|
|
105
|
+
}) => Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
interface LiveChanges<T = {
|
|
108
|
+
[key: string]: any;
|
|
109
|
+
}> {
|
|
110
|
+
fields: {
|
|
111
|
+
name: string;
|
|
112
|
+
dataTypeID: number;
|
|
113
|
+
}[];
|
|
114
|
+
initialChanges: Array<Change<T>>;
|
|
115
|
+
subscribe: (callback: (changes: Array<Change<T>>) => void) => void;
|
|
116
|
+
unsubscribe: (callback?: (changes: Array<Change<T>>) => void) => Promise<void>;
|
|
117
|
+
refresh: () => Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
type ChangeInsert<T> = {
|
|
120
|
+
__changed_columns__: string[];
|
|
121
|
+
__op__: 'INSERT';
|
|
122
|
+
__after__: number;
|
|
123
|
+
} & T;
|
|
124
|
+
type ChangeDelete<T> = {
|
|
125
|
+
__changed_columns__: string[];
|
|
126
|
+
__op__: 'DELETE';
|
|
127
|
+
__after__: undefined;
|
|
128
|
+
} & T;
|
|
129
|
+
type ChangeUpdate<T> = {
|
|
130
|
+
__changed_columns__: string[];
|
|
131
|
+
__op__: 'UPDATE';
|
|
132
|
+
__after__: number;
|
|
133
|
+
} & T;
|
|
134
|
+
type ChangeReset<T> = {
|
|
135
|
+
__op__: 'RESET';
|
|
136
|
+
} & T;
|
|
137
|
+
type Change<T> = ChangeInsert<T> | ChangeDelete<T> | ChangeUpdate<T> | ChangeReset<T>;
|
|
138
|
+
|
|
139
|
+
declare const live: {
|
|
140
|
+
name: string;
|
|
141
|
+
setup: (pg: PGliteInterfaceBase, _emscriptenOpts: any) => Promise<{
|
|
142
|
+
namespaceObj: LiveNamespace;
|
|
143
|
+
}>;
|
|
144
|
+
};
|
|
145
|
+
type PGliteWithLive = PGliteInterface & {
|
|
146
|
+
live: LiveNamespace;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export { type Change, type LiveChanges, type LiveNamespace, type LiveQuery, type LiveQueryResults, type PGliteWithLive, live };
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { R as Results, d as PGliteInterfaceBase, x as PGliteInterface } from '../pglite-RfkRSGmH.js';
|
|
2
|
+
|
|
3
|
+
interface LiveQueryOptions<T = {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}> {
|
|
6
|
+
query: string;
|
|
7
|
+
params?: any[] | null;
|
|
8
|
+
offset?: number;
|
|
9
|
+
limit?: number;
|
|
10
|
+
callback?: (results: Results<T>) => void;
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
}
|
|
13
|
+
interface LiveChangesOptions<T = {
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
}> {
|
|
16
|
+
query: string;
|
|
17
|
+
params?: any[] | null;
|
|
18
|
+
key: string;
|
|
19
|
+
callback?: (changes: Array<Change<T>>) => void;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
}
|
|
22
|
+
interface LiveIncrementalQueryOptions<T = {
|
|
23
|
+
[key: string]: any;
|
|
24
|
+
}> {
|
|
25
|
+
query: string;
|
|
26
|
+
params?: any[] | null;
|
|
27
|
+
key: string;
|
|
28
|
+
callback?: (results: Results<T>) => void;
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
}
|
|
31
|
+
interface LiveNamespace {
|
|
32
|
+
/**
|
|
33
|
+
* Create a live query
|
|
34
|
+
* @param query - The query to run
|
|
35
|
+
* @param params - The parameters to pass to the query
|
|
36
|
+
* @param callback - A callback to run when the query is updated
|
|
37
|
+
* @returns A promise that resolves to an object with the initial results,
|
|
38
|
+
* an unsubscribe function, and a refresh function
|
|
39
|
+
*/
|
|
40
|
+
query<T = {
|
|
41
|
+
[key: string]: any;
|
|
42
|
+
}>(query: string, params?: any[] | null, callback?: (results: Results<T>) => void): Promise<LiveQuery<T>>;
|
|
43
|
+
/**
|
|
44
|
+
* Create a live query
|
|
45
|
+
* @param options - The options to pass to the query
|
|
46
|
+
* @returns A promise that resolves to an object with the initial results,
|
|
47
|
+
* an unsubscribe function, and a refresh function
|
|
48
|
+
*/
|
|
49
|
+
query<T = {
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
}>(options: LiveQueryOptions<T>): Promise<LiveQuery<T>>;
|
|
52
|
+
/**
|
|
53
|
+
* Create a live query that returns the changes to the query results
|
|
54
|
+
* @param query - The query to run
|
|
55
|
+
* @param params - The parameters to pass to the query
|
|
56
|
+
* @param callback - A callback to run when the query is updated
|
|
57
|
+
* @returns A promise that resolves to an object with the initial changes,
|
|
58
|
+
* an unsubscribe function, and a refresh function
|
|
59
|
+
*/
|
|
60
|
+
changes<T = {
|
|
61
|
+
[key: string]: any;
|
|
62
|
+
}>(query: string, params: any[] | undefined | null, key: string, callback?: (changes: Array<Change<T>>) => void): Promise<LiveChanges<T>>;
|
|
63
|
+
/**
|
|
64
|
+
* Create a live query that returns the changes to the query results
|
|
65
|
+
* @param options - The options to pass to the query
|
|
66
|
+
* @returns A promise that resolves to an object with the initial changes,
|
|
67
|
+
* an unsubscribe function, and a refresh function
|
|
68
|
+
*/
|
|
69
|
+
changes<T = {
|
|
70
|
+
[key: string]: any;
|
|
71
|
+
}>(options: LiveChangesOptions<T>): Promise<LiveChanges<T>>;
|
|
72
|
+
/**
|
|
73
|
+
* Create a live query with incremental updates
|
|
74
|
+
* @param query - The query to run
|
|
75
|
+
* @param params - The parameters to pass to the query
|
|
76
|
+
* @param callback - A callback to run when the query is updated
|
|
77
|
+
* @returns A promise that resolves to an object with the initial results,
|
|
78
|
+
* an unsubscribe function, and a refresh function
|
|
79
|
+
*/
|
|
80
|
+
incrementalQuery<T = {
|
|
81
|
+
[key: string]: any;
|
|
82
|
+
}>(query: string, params: any[] | undefined | null, key: string, callback?: (results: Results<T>) => void): Promise<LiveQuery<T>>;
|
|
83
|
+
/**
|
|
84
|
+
* Create a live query with incremental updates
|
|
85
|
+
* @param options - The options to pass to the query
|
|
86
|
+
* @returns A promise that resolves to an object with the initial results,
|
|
87
|
+
* an unsubscribe function, and a refresh function
|
|
88
|
+
*/
|
|
89
|
+
incrementalQuery<T = {
|
|
90
|
+
[key: string]: any;
|
|
91
|
+
}>(options: LiveIncrementalQueryOptions<T>): Promise<LiveQuery<T>>;
|
|
92
|
+
}
|
|
93
|
+
interface LiveQueryResults<T> extends Results<T> {
|
|
94
|
+
totalCount?: number;
|
|
95
|
+
offset?: number;
|
|
96
|
+
limit?: number;
|
|
97
|
+
}
|
|
98
|
+
interface LiveQuery<T> {
|
|
99
|
+
initialResults: LiveQueryResults<T>;
|
|
100
|
+
subscribe: (callback: (results: LiveQueryResults<T>) => void) => void;
|
|
101
|
+
unsubscribe: (callback?: (results: LiveQueryResults<T>) => void) => Promise<void>;
|
|
102
|
+
refresh: (options?: {
|
|
103
|
+
offset?: number;
|
|
104
|
+
limit?: number;
|
|
105
|
+
}) => Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
interface LiveChanges<T = {
|
|
108
|
+
[key: string]: any;
|
|
109
|
+
}> {
|
|
110
|
+
fields: {
|
|
111
|
+
name: string;
|
|
112
|
+
dataTypeID: number;
|
|
113
|
+
}[];
|
|
114
|
+
initialChanges: Array<Change<T>>;
|
|
115
|
+
subscribe: (callback: (changes: Array<Change<T>>) => void) => void;
|
|
116
|
+
unsubscribe: (callback?: (changes: Array<Change<T>>) => void) => Promise<void>;
|
|
117
|
+
refresh: () => Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
type ChangeInsert<T> = {
|
|
120
|
+
__changed_columns__: string[];
|
|
121
|
+
__op__: 'INSERT';
|
|
122
|
+
__after__: number;
|
|
123
|
+
} & T;
|
|
124
|
+
type ChangeDelete<T> = {
|
|
125
|
+
__changed_columns__: string[];
|
|
126
|
+
__op__: 'DELETE';
|
|
127
|
+
__after__: undefined;
|
|
128
|
+
} & T;
|
|
129
|
+
type ChangeUpdate<T> = {
|
|
130
|
+
__changed_columns__: string[];
|
|
131
|
+
__op__: 'UPDATE';
|
|
132
|
+
__after__: number;
|
|
133
|
+
} & T;
|
|
134
|
+
type ChangeReset<T> = {
|
|
135
|
+
__op__: 'RESET';
|
|
136
|
+
} & T;
|
|
137
|
+
type Change<T> = ChangeInsert<T> | ChangeDelete<T> | ChangeUpdate<T> | ChangeReset<T>;
|
|
138
|
+
|
|
139
|
+
declare const live: {
|
|
140
|
+
name: string;
|
|
141
|
+
setup: (pg: PGliteInterfaceBase, _emscriptenOpts: any) => Promise<{
|
|
142
|
+
namespaceObj: LiveNamespace;
|
|
143
|
+
}>;
|
|
144
|
+
};
|
|
145
|
+
type PGliteWithLive = PGliteInterface & {
|
|
146
|
+
live: LiveNamespace;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export { type Change, type LiveChanges, type LiveNamespace, type LiveQuery, type LiveQueryResults, type PGliteWithLive, live };
|
package/dist/live/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{u as I,v as O,w as C}from"../chunk-
|
|
1
|
+
import{u as I,v as O,w as C}from"../chunk-5U7S5PTI.js";import{j as P}from"../chunk-VCBR6USK.js";P();var M=5,U=async(E,y)=>{let p=new Set,$={async query(e,g,a){let m,l,_;if(typeof e!="string"&&(m=e.signal,g=e.params,a=e.callback,l=e.offset,_=e.limit,e=e.query),l===void 0!=(_===void 0))throw new Error("offset and limit must be provided together");let t=l!==void 0&&_!==void 0,T;if(t&&(typeof l!="number"||isNaN(l)||typeof _!="number"||isNaN(_)))throw new Error("offset and limit must be numbers");let d=a?[a]:[],o=I().replace(/-/g,""),A=!1,v,w,S=async()=>{await E.transaction(async i=>{let n=g&&g.length>0?await O(E,e,g,i):e;await i.exec(`CREATE OR REPLACE TEMP VIEW live_query_${o}_view AS ${n}`);let u=await q(i,`live_query_${o}_view`);await F(i,u,p),t?(await i.exec(`
|
|
2
2
|
PREPARE live_query_${o}_get(int, int) AS
|
|
3
3
|
SELECT * FROM live_query_${o}_view
|
|
4
4
|
LIMIT $1 OFFSET $2;
|
package/dist/live/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/live/index.ts"],"sourcesContent":["import type {\n Extension,\n PGliteInterface,\n Results,\n Transaction,\n} from '../interface'\nimport type {\n LiveQueryOptions,\n LiveIncrementalQueryOptions,\n LiveChangesOptions,\n LiveNamespace,\n LiveQuery,\n LiveChanges,\n Change,\n LiveQueryResults,\n} from './interface'\nimport { uuid, formatQuery, debounceMutex } from '../utils.js'\n\nexport type {\n LiveNamespace,\n LiveQuery,\n LiveChanges,\n Change,\n LiveQueryResults,\n} from './interface.js'\n\nconst MAX_RETRIES = 5\n\nconst setup = async (pg: PGliteInterface, _emscriptenOpts: any) => {\n // The notify triggers are only ever added and never removed\n // Keep track of which triggers have been added to avoid adding them multiple times\n const tableNotifyTriggersAdded = new Set<string>()\n\n const namespaceObj: LiveNamespace = {\n async query<T>(\n query: string | LiveQueryOptions<T>,\n params?: any[] | null,\n callback?: (results: Results<T>) => void,\n ) {\n let signal: AbortSignal | undefined\n let offset: number | undefined\n let limit: number | undefined\n if (typeof query !== 'string') {\n signal = query.signal\n params = query.params\n callback = query.callback\n offset = query.offset\n limit = query.limit\n query = query.query\n }\n\n // Offset and limit must be provided together\n if ((offset === undefined) !== (limit === undefined)) {\n throw new Error('offset and limit must be provided together')\n }\n\n const isWindowed = offset !== undefined && limit !== undefined\n let totalCount: number | undefined = undefined\n\n if (\n isWindowed &&\n (typeof offset !== 'number' ||\n isNaN(offset) ||\n typeof limit !== 'number' ||\n isNaN(limit))\n ) {\n throw new Error('offset and limit must be numbers')\n }\n\n let callbacks: Array<(results: Results<T>) => void> = callback\n ? [callback]\n : []\n const id = uuid().replace(/-/g, '')\n let dead = false\n\n let results: LiveQueryResults<T>\n\n let unsubList: Array<(tx?: Transaction) => Promise<void>>\n const init = async () => {\n await pg.transaction(async (tx) => {\n // Create a temporary view with the query\n const formattedQuery =\n params && params.length > 0\n ? await formatQuery(pg, query, params, tx)\n : query\n await tx.exec(\n `CREATE OR REPLACE TEMP VIEW live_query_${id}_view AS ${formattedQuery}`,\n )\n\n // Get the tables used in the view and add triggers to notify when they change\n const tables = await getTablesForView(tx, `live_query_${id}_view`)\n await addNotifyTriggersToTables(tx, tables, tableNotifyTriggersAdded)\n\n if (isWindowed) {\n await tx.exec(`\n PREPARE live_query_${id}_get(int, int) AS\n SELECT * FROM live_query_${id}_view\n LIMIT $1 OFFSET $2;\n `)\n await tx.exec(`\n PREPARE live_query_${id}_get_total_count AS\n SELECT COUNT(*) FROM live_query_${id}_view;\n `)\n totalCount = (\n await tx.query<{ count: number }>(\n `EXECUTE live_query_${id}_get_total_count;`,\n )\n ).rows[0].count\n results = {\n ...(await tx.query<T>(\n `EXECUTE live_query_${id}_get(${limit}, ${offset});`,\n )),\n offset,\n limit,\n totalCount,\n }\n } else {\n await tx.exec(`\n PREPARE live_query_${id}_get AS\n SELECT * FROM live_query_${id}_view;\n `)\n results = await tx.query<T>(`EXECUTE live_query_${id}_get;`)\n }\n // Setup the listeners\n unsubList = await Promise.all(\n tables!.map((table) =>\n tx.listen(\n `\"table_change__${table.schema_oid}__${table.table_oid}\"`,\n async () => {\n refresh()\n },\n ),\n ),\n )\n })\n }\n await init()\n\n // Function to refresh the query\n const refresh = debounceMutex(\n async ({\n offset: newOffset,\n limit: newLimit,\n }: {\n offset?: number\n limit?: number\n } = {}) => {\n // We can optionally provide new offset and limit values to refresh with\n if (\n !isWindowed &&\n (newOffset !== undefined || newLimit !== undefined)\n ) {\n throw new Error(\n 'offset and limit cannot be provided for non-windowed queries',\n )\n }\n if (\n (newOffset &&\n (typeof newOffset !== 'number' || isNaN(newOffset))) ||\n (newLimit && (typeof newLimit !== 'number' || isNaN(newLimit)))\n ) {\n throw new Error('offset and limit must be numbers')\n }\n offset = newOffset ?? offset\n limit = newLimit ?? limit\n\n const run = async (count = 0) => {\n if (callbacks.length === 0) {\n return\n }\n try {\n if (isWindowed) {\n // For a windowed query we defer the refresh of the total count until\n // after we have returned the results with the old total count. This\n // is due to a count(*) being a fairly slow query and we want to update\n // the rows on screen as quickly as possible.\n results = {\n ...(await pg.query<T>(\n `EXECUTE live_query_${id}_get(${limit}, ${offset});`,\n )),\n offset,\n limit,\n totalCount, // This is the old total count\n }\n } else {\n results = await pg.query<T>(`EXECUTE live_query_${id}_get;`)\n }\n } catch (e) {\n const msg = (e as Error).message\n if (\n msg.startsWith(`prepared statement \"live_query_${id}`) &&\n msg.endsWith('does not exist')\n ) {\n // If the prepared statement does not exist, reset and try again\n // This can happen if using the multi-tab worker\n if (count > MAX_RETRIES) {\n throw e\n }\n await init()\n run(count + 1)\n } else {\n throw e\n }\n }\n\n runResultCallbacks(callbacks, results)\n\n // Update the total count\n // If the total count has changed, refresh the query\n if (isWindowed) {\n const newTotalCount = (\n await pg.query<{ count: number }>(\n `EXECUTE live_query_${id}_get_total_count;`,\n )\n ).rows[0].count\n if (newTotalCount !== totalCount) {\n // The total count has changed, refresh the query\n totalCount = newTotalCount\n refresh()\n }\n }\n }\n await run()\n },\n )\n\n // Function to subscribe to the query\n const subscribe = (callback: (results: Results<T>) => void) => {\n if (dead) {\n throw new Error(\n 'Live query is no longer active and cannot be subscribed to',\n )\n }\n callbacks.push(callback)\n }\n\n // Function to unsubscribe from the query\n // If no function is provided, unsubscribe all callbacks\n // If there are no callbacks, unsubscribe from the notify triggers\n const unsubscribe = async (callback?: (results: Results<T>) => void) => {\n if (callback) {\n callbacks = callbacks.filter((callback) => callback !== callback)\n } else {\n callbacks = []\n }\n if (callbacks.length === 0 && !dead) {\n dead = true\n await pg.transaction(async (tx) => {\n await Promise.all(unsubList.map((unsub) => unsub(tx)))\n await tx.exec(`\n DROP VIEW IF EXISTS live_query_${id}_view;\n DEALLOCATE live_query_${id}_get;\n `)\n })\n }\n }\n\n // If the signal has already been aborted, unsubscribe\n if (signal?.aborted) {\n await unsubscribe()\n } else {\n // Add an event listener to unsubscribe if the signal is aborted\n signal?.addEventListener(\n 'abort',\n () => {\n unsubscribe()\n },\n { once: true },\n )\n }\n\n // Run the callback with the initial results\n runResultCallbacks(callbacks, results!)\n\n // Return the initial results\n return {\n initialResults: results!,\n subscribe,\n unsubscribe,\n refresh,\n } satisfies LiveQuery<T>\n },\n\n async changes<T>(\n query: string | LiveChangesOptions<T>,\n params?: any[] | null,\n key?: string,\n callback?: (changes: Array<Change<T>>) => void,\n ) {\n let signal: AbortSignal | undefined\n if (typeof query !== 'string') {\n signal = query.signal\n params = query.params\n key = query.key\n callback = query.callback\n query = query.query\n }\n if (!key) {\n throw new Error('key is required for changes queries')\n }\n let callbacks: Array<(changes: Array<Change<T>>) => void> = callback\n ? [callback]\n : []\n const id = uuid().replace(/-/g, '')\n let dead = false\n\n let stateSwitch: 1 | 2 = 1\n let changes: Results<Change<T>>\n\n let unsubList: Array<(tx?: Transaction) => Promise<void>>\n\n const init = async () => {\n await pg.transaction(async (tx) => {\n // Create a temporary view with the query\n const formattedQuery = await formatQuery(pg, query, params, tx)\n await tx.query(\n `CREATE OR REPLACE TEMP VIEW live_query_${id}_view AS ${formattedQuery}`,\n )\n\n // Get the tables used in the view and add triggers to notify when they change\n const tables = await getTablesForView(tx, `live_query_${id}_view`)\n await addNotifyTriggersToTables(tx, tables, tableNotifyTriggersAdded)\n\n // Get the columns of the view\n const columns = [\n ...(\n await tx.query<any>(`\n SELECT column_name, data_type, udt_name\n FROM information_schema.columns \n WHERE table_name = 'live_query_${id}_view'\n `)\n ).rows,\n { column_name: '__after__', data_type: 'integer' },\n ]\n\n // Init state tables as empty temp table\n await tx.exec(`\n CREATE TEMP TABLE live_query_${id}_state1 (LIKE live_query_${id}_view INCLUDING ALL);\n CREATE TEMP TABLE live_query_${id}_state2 (LIKE live_query_${id}_view INCLUDING ALL);\n `)\n\n // Create Diff views and prepared statements\n for (const curr of [1, 2]) {\n const prev = curr === 1 ? 2 : 1\n await tx.exec(`\n PREPARE live_query_${id}_diff${curr} AS\n WITH\n prev AS (SELECT LAG(\"${key}\") OVER () as __after__, * FROM live_query_${id}_state${prev}),\n curr AS (SELECT LAG(\"${key}\") OVER () as __after__, * FROM live_query_${id}_state${curr}),\n data_diff AS (\n -- INSERT operations: Include all columns\n SELECT \n 'INSERT' AS __op__,\n ${columns\n .map(\n ({ column_name }) =>\n `curr.\"${column_name}\" AS \"${column_name}\"`,\n )\n .join(',\\n')},\n ARRAY[]::text[] AS __changed_columns__\n FROM curr\n LEFT JOIN prev ON curr.${key} = prev.${key}\n WHERE prev.${key} IS NULL\n UNION ALL\n -- DELETE operations: Include only the primary key\n SELECT \n 'DELETE' AS __op__,\n ${columns\n .map(({ column_name, data_type, udt_name }) => {\n if (column_name === key) {\n return `prev.\"${column_name}\" AS \"${column_name}\"`\n } else {\n return `NULL${data_type === 'USER-DEFINED' ? `::${udt_name}` : ``} AS \"${column_name}\"`\n }\n })\n .join(',\\n')},\n ARRAY[]::text[] AS __changed_columns__\n FROM prev\n LEFT JOIN curr ON prev.${key} = curr.${key}\n WHERE curr.${key} IS NULL\n UNION ALL\n -- UPDATE operations: Include only changed columns\n SELECT \n 'UPDATE' AS __op__,\n ${columns\n .map(({ column_name, data_type, udt_name }) =>\n column_name === key\n ? `curr.\"${column_name}\" AS \"${column_name}\"`\n : `CASE \n WHEN curr.\"${column_name}\" IS DISTINCT FROM prev.\"${column_name}\" \n THEN curr.\"${column_name}\"\n ELSE NULL${data_type === 'USER-DEFINED' ? `::${udt_name}` : ``}\n END AS \"${column_name}\"`,\n )\n .join(',\\n')},\n ARRAY(SELECT unnest FROM unnest(ARRAY[${columns\n .filter(({ column_name }) => column_name !== key)\n .map(\n ({ column_name }) =>\n `CASE\n WHEN curr.\"${column_name}\" IS DISTINCT FROM prev.\"${column_name}\" \n THEN '${column_name}' \n ELSE NULL \n END`,\n )\n .join(\n ', ',\n )}]) WHERE unnest IS NOT NULL) AS __changed_columns__\n FROM curr\n INNER JOIN prev ON curr.${key} = prev.${key}\n WHERE NOT (curr IS NOT DISTINCT FROM prev)\n )\n SELECT * FROM data_diff;\n `)\n }\n\n // Setup the listeners\n unsubList = await Promise.all(\n tables!.map((table) =>\n tx.listen(\n `\"table_change__${table.schema_oid}__${table.table_oid}\"`,\n async () => {\n refresh()\n },\n ),\n ),\n )\n })\n }\n\n await init()\n\n const refresh = debounceMutex(async () => {\n if (callbacks.length === 0 && changes) {\n return\n }\n let reset = false\n for (let i = 0; i < 5; i++) {\n try {\n await pg.transaction(async (tx) => {\n // Populate the state table\n await tx.exec(`\n INSERT INTO live_query_${id}_state${stateSwitch} \n SELECT * FROM live_query_${id}_view;\n `)\n\n // Get the changes\n changes = await tx.query<any>(\n `EXECUTE live_query_${id}_diff${stateSwitch};`,\n )\n\n // Switch state\n stateSwitch = stateSwitch === 1 ? 2 : 1\n\n // Truncate the old state table\n await tx.exec(`\n TRUNCATE live_query_${id}_state${stateSwitch};\n `)\n })\n break\n } catch (e) {\n const msg = (e as Error).message\n if (\n msg ===\n `relation \"live_query_${id}_state${stateSwitch}\" does not exist`\n ) {\n // If the state table does not exist, reset and try again\n // This can happen if using the multi-tab worker\n reset = true\n await init()\n continue\n } else {\n throw e\n }\n }\n }\n\n runChangeCallbacks(callbacks, [\n ...(reset\n ? [\n {\n __op__: 'RESET' as const,\n },\n ]\n : []),\n ...changes!.rows,\n ])\n })\n\n // Function to subscribe to the query\n const subscribe = (callback: (changes: Array<Change<T>>) => void) => {\n if (dead) {\n throw new Error(\n 'Live query is no longer active and cannot be subscribed to',\n )\n }\n callbacks.push(callback)\n }\n\n // Function to unsubscribe from the query\n const unsubscribe = async (\n callback?: (changes: Array<Change<T>>) => void,\n ) => {\n if (callback) {\n callbacks = callbacks.filter((callback) => callback !== callback)\n } else {\n callbacks = []\n }\n if (callbacks.length === 0 && !dead) {\n dead = true\n await pg.transaction(async (tx) => {\n await Promise.all(unsubList.map((unsub) => unsub(tx)))\n await tx.exec(`\n DROP VIEW IF EXISTS live_query_${id}_view;\n DROP TABLE IF EXISTS live_query_${id}_state1;\n DROP TABLE IF EXISTS live_query_${id}_state2;\n DEALLOCATE live_query_${id}_diff1;\n DEALLOCATE live_query_${id}_diff2;\n `)\n })\n }\n }\n\n // If the signal has already been aborted, unsubscribe\n if (signal?.aborted) {\n await unsubscribe()\n } else {\n // Add an event listener to unsubscribe if the signal is aborted\n signal?.addEventListener(\n 'abort',\n () => {\n unsubscribe()\n },\n { once: true },\n )\n }\n\n // Run the callback with the initial changes\n await refresh()\n\n // Fields\n const fields = changes!.fields.filter(\n (field) =>\n !['__after__', '__op__', '__changed_columns__'].includes(field.name),\n )\n\n // Return the initial results\n return {\n fields,\n initialChanges: changes!.rows,\n subscribe,\n unsubscribe,\n refresh,\n } satisfies LiveChanges<T>\n },\n\n async incrementalQuery<T>(\n query: string | LiveIncrementalQueryOptions<T>,\n params?: any[] | null,\n key?: string,\n callback?: (results: Results<T>) => void,\n ) {\n let signal: AbortSignal | undefined\n if (typeof query !== 'string') {\n signal = query.signal\n params = query.params\n key = query.key\n callback = query.callback\n query = query.query\n }\n if (!key) {\n throw new Error('key is required for incremental queries')\n }\n let callbacks: Array<(results: Results<T>) => void> = callback\n ? [callback]\n : []\n const rowsMap: Map<any, any> = new Map()\n const afterMap: Map<any, any> = new Map()\n let lastRows: T[] = []\n let firstRun = true\n\n const {\n fields,\n unsubscribe: unsubscribeChanges,\n refresh,\n } = await namespaceObj.changes<T>(query, params, key, (changes) => {\n // Process the changes\n for (const change of changes) {\n const {\n __op__: op,\n __changed_columns__: changedColumns,\n ...obj\n } = change as typeof change & { [key: string]: any }\n switch (op) {\n case 'RESET':\n rowsMap.clear()\n afterMap.clear()\n break\n case 'INSERT':\n rowsMap.set(obj[key], obj)\n afterMap.set(obj.__after__, obj[key])\n break\n case 'DELETE': {\n const oldObj = rowsMap.get(obj[key])\n rowsMap.delete(obj[key])\n // null is the starting point, we don't delete it as another insert\n // may have happened thats replacing it\n if (oldObj.__after__ !== null) {\n afterMap.delete(oldObj.__after__)\n }\n break\n }\n case 'UPDATE': {\n const newObj = { ...(rowsMap.get(obj[key]) ?? {}) }\n for (const columnName of changedColumns) {\n newObj[columnName] = obj[columnName]\n if (columnName === '__after__') {\n afterMap.set(obj.__after__, obj[key])\n }\n }\n rowsMap.set(obj[key], newObj)\n break\n }\n }\n }\n\n // Get the rows in order\n const rows: T[] = []\n let lastKey: any = null\n for (let i = 0; i < rowsMap.size; i++) {\n const nextKey = afterMap.get(lastKey)\n const obj = rowsMap.get(nextKey)\n if (!obj) {\n break\n }\n // Remove the __after__ key from the exposed row\n const cleanObj = { ...obj }\n delete cleanObj.__after__\n rows.push(cleanObj)\n lastKey = nextKey\n }\n lastRows = rows\n\n // Run the callbacks\n if (!firstRun) {\n runResultCallbacks(callbacks, {\n rows,\n fields,\n })\n }\n })\n\n firstRun = false\n runResultCallbacks(callbacks, {\n rows: lastRows,\n fields,\n })\n\n const subscribe = (callback: (results: Results<T>) => void) => {\n callbacks.push(callback)\n }\n\n const unsubscribe = async (callback?: (results: Results<T>) => void) => {\n if (callback) {\n callbacks = callbacks.filter((callback) => callback !== callback)\n } else {\n callbacks = []\n }\n if (callbacks.length === 0) {\n await unsubscribeChanges()\n }\n }\n\n if (signal?.aborted) {\n await unsubscribe()\n } else {\n signal?.addEventListener(\n 'abort',\n () => {\n unsubscribe()\n },\n { once: true },\n )\n }\n\n return {\n initialResults: {\n rows: lastRows,\n fields,\n },\n subscribe,\n unsubscribe,\n refresh,\n } satisfies LiveQuery<T>\n },\n }\n\n return {\n namespaceObj,\n }\n}\n\nexport const live = {\n name: 'Live Queries',\n setup,\n} satisfies Extension\n\nexport type PGliteWithLive = PGliteInterface & {\n live: LiveNamespace\n}\n\n/**\n * Get a list of all the tables used in a view, recursively\n * @param tx a transaction or PGlite instance\n * @param viewName the name of the view\n * @returns list of tables used in the view\n */\nasync function getTablesForView(\n tx: Transaction | PGliteInterface,\n viewName: string,\n): Promise<\n {\n table_name: string\n schema_name: string\n table_oid: number\n schema_oid: number\n }[]\n> {\n const result = await tx.query<{\n table_name: string\n schema_name: string\n table_oid: number\n schema_oid: number\n }>(\n `\n WITH RECURSIVE view_dependencies AS (\n -- Base case: Get the initial view's dependencies\n SELECT DISTINCT\n cl.relname AS dependent_name,\n n.nspname AS schema_name,\n cl.oid AS dependent_oid,\n n.oid AS schema_oid,\n cl.relkind = 'v' AS is_view\n FROM pg_rewrite r\n JOIN pg_depend d ON r.oid = d.objid\n JOIN pg_class cl ON d.refobjid = cl.oid\n JOIN pg_namespace n ON cl.relnamespace = n.oid\n WHERE\n r.ev_class = (\n SELECT oid FROM pg_class WHERE relname = $1 AND relkind = 'v'\n )\n AND d.deptype = 'n'\n\n UNION ALL\n\n -- Recursive case: Traverse dependencies for views\n SELECT DISTINCT\n cl.relname AS dependent_name,\n n.nspname AS schema_name,\n cl.oid AS dependent_oid,\n n.oid AS schema_oid,\n cl.relkind = 'v' AS is_view\n FROM view_dependencies vd\n JOIN pg_rewrite r ON vd.dependent_name = (\n SELECT relname FROM pg_class WHERE oid = r.ev_class AND relkind = 'v'\n )\n JOIN pg_depend d ON r.oid = d.objid\n JOIN pg_class cl ON d.refobjid = cl.oid\n JOIN pg_namespace n ON cl.relnamespace = n.oid\n WHERE d.deptype = 'n'\n )\n SELECT DISTINCT\n dependent_name AS table_name,\n schema_name,\n dependent_oid AS table_oid,\n schema_oid\n FROM view_dependencies\n WHERE NOT is_view; -- Exclude intermediate views\n `,\n [viewName],\n )\n\n return result.rows.map((row) => ({\n table_name: row.table_name,\n schema_name: row.schema_name,\n table_oid: row.table_oid,\n schema_oid: row.schema_oid,\n }))\n}\n\n/**\n * Add triggers to tables to notify when they change\n * @param tx a transaction or PGlite instance\n * @param tables list of tables to add triggers to\n */\nasync function addNotifyTriggersToTables(\n tx: Transaction | PGliteInterface,\n tables: {\n table_name: string\n table_oid: number\n schema_name: string\n schema_oid: number\n }[],\n tableNotifyTriggersAdded: Set<string>,\n) {\n const triggers = tables\n .filter(\n (table) =>\n !tableNotifyTriggersAdded.has(`${table.schema_oid}_${table.table_oid}`),\n )\n .map((table) => {\n return `\n CREATE OR REPLACE FUNCTION \"_notify_${table.schema_oid}_${table.table_oid}\"() RETURNS TRIGGER AS $$\n BEGIN\n PERFORM pg_notify('table_change__${table.schema_oid}__${table.table_oid}', '');\n RETURN NULL;\n END;\n $$ LANGUAGE plpgsql;\n CREATE OR REPLACE TRIGGER \"_notify_trigger_${table.schema_oid}_${table.table_oid}\"\n AFTER INSERT OR UPDATE OR DELETE ON \"${table.schema_name}\".\"${table.table_name}\"\n FOR EACH STATEMENT EXECUTE FUNCTION \"_notify_${table.schema_oid}_${table.table_oid}\"();\n `\n })\n .join('\\n')\n if (triggers.trim() !== '') {\n await tx.exec(triggers)\n }\n tables.map((table) =>\n tableNotifyTriggersAdded.add(`${table.schema_oid}_${table.table_oid}`),\n )\n}\n\nconst runResultCallbacks = <T>(\n callbacks: Array<(results: Results<T>) => void>,\n results: Results<T>,\n) => {\n for (const callback of callbacks) {\n callback(results)\n }\n}\n\nconst runChangeCallbacks = <T>(\n callbacks: Array<(changes: Array<Change<T>>) => void>,\n changes: Array<Change<T>>,\n) => {\n for (const callback of callbacks) {\n callback(changes)\n }\n}\n"],"mappings":"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","names":["init_esm_shims","MAX_RETRIES","setup","pg","_emscriptenOpts","tableNotifyTriggersAdded","namespaceObj","query","params","callback","signal","offset","limit","isWindowed","totalCount","callbacks","id","uuid","dead","results","unsubList","init","tx","formattedQuery","formatQuery","tables","getTablesForView","addNotifyTriggersToTables","table","refresh","debounceMutex","newOffset","newLimit","run","count","e","msg","runResultCallbacks","newTotalCount","subscribe","unsubscribe","unsub","key","stateSwitch","changes","columns","curr","prev","column_name","data_type","udt_name","reset","runChangeCallbacks","field","rowsMap","afterMap","lastRows","firstRun","fields","unsubscribeChanges","change","op","changedColumns","obj","oldObj","newObj","columnName","rows","lastKey","i","nextKey","cleanObj","live","viewName","row","triggers"]}
|
|
1
|
+
{"version":3,"sources":["../../src/live/index.ts"],"sourcesContent":["import type {\n Extension,\n PGliteInterface,\n PGliteInterfaceBase,\n Results,\n Transaction,\n} from '../interface'\nimport type {\n LiveQueryOptions,\n LiveIncrementalQueryOptions,\n LiveChangesOptions,\n LiveNamespace,\n LiveQuery,\n LiveChanges,\n Change,\n LiveQueryResults,\n} from './interface'\nimport { uuid, formatQuery, debounceMutex } from '../utils.js'\n\nexport type {\n LiveNamespace,\n LiveQuery,\n LiveChanges,\n Change,\n LiveQueryResults,\n} from './interface.js'\n\nconst MAX_RETRIES = 5\n\nconst setup = async (pg: PGliteInterfaceBase, _emscriptenOpts: any) => {\n // The notify triggers are only ever added and never removed\n // Keep track of which triggers have been added to avoid adding them multiple times\n const tableNotifyTriggersAdded = new Set<string>()\n\n const namespaceObj: LiveNamespace = {\n async query<T>(\n query: string | LiveQueryOptions<T>,\n params?: any[] | null,\n callback?: (results: Results<T>) => void,\n ) {\n let signal: AbortSignal | undefined\n let offset: number | undefined\n let limit: number | undefined\n if (typeof query !== 'string') {\n signal = query.signal\n params = query.params\n callback = query.callback\n offset = query.offset\n limit = query.limit\n query = query.query\n }\n\n // Offset and limit must be provided together\n if ((offset === undefined) !== (limit === undefined)) {\n throw new Error('offset and limit must be provided together')\n }\n\n const isWindowed = offset !== undefined && limit !== undefined\n let totalCount: number | undefined = undefined\n\n if (\n isWindowed &&\n (typeof offset !== 'number' ||\n isNaN(offset) ||\n typeof limit !== 'number' ||\n isNaN(limit))\n ) {\n throw new Error('offset and limit must be numbers')\n }\n\n let callbacks: Array<(results: Results<T>) => void> = callback\n ? [callback]\n : []\n const id = uuid().replace(/-/g, '')\n let dead = false\n\n let results: LiveQueryResults<T>\n\n let unsubList: Array<(tx?: Transaction) => Promise<void>>\n const init = async () => {\n await pg.transaction(async (tx) => {\n // Create a temporary view with the query\n const formattedQuery =\n params && params.length > 0\n ? await formatQuery(pg, query, params, tx)\n : query\n await tx.exec(\n `CREATE OR REPLACE TEMP VIEW live_query_${id}_view AS ${formattedQuery}`,\n )\n\n // Get the tables used in the view and add triggers to notify when they change\n const tables = await getTablesForView(tx, `live_query_${id}_view`)\n await addNotifyTriggersToTables(tx, tables, tableNotifyTriggersAdded)\n\n if (isWindowed) {\n await tx.exec(`\n PREPARE live_query_${id}_get(int, int) AS\n SELECT * FROM live_query_${id}_view\n LIMIT $1 OFFSET $2;\n `)\n await tx.exec(`\n PREPARE live_query_${id}_get_total_count AS\n SELECT COUNT(*) FROM live_query_${id}_view;\n `)\n totalCount = (\n await tx.query<{ count: number }>(\n `EXECUTE live_query_${id}_get_total_count;`,\n )\n ).rows[0].count\n results = {\n ...(await tx.query<T>(\n `EXECUTE live_query_${id}_get(${limit}, ${offset});`,\n )),\n offset,\n limit,\n totalCount,\n }\n } else {\n await tx.exec(`\n PREPARE live_query_${id}_get AS\n SELECT * FROM live_query_${id}_view;\n `)\n results = await tx.query<T>(`EXECUTE live_query_${id}_get;`)\n }\n // Setup the listeners\n unsubList = await Promise.all(\n tables!.map((table) =>\n tx.listen(\n `\"table_change__${table.schema_oid}__${table.table_oid}\"`,\n async () => {\n refresh()\n },\n ),\n ),\n )\n })\n }\n await init()\n\n // Function to refresh the query\n const refresh = debounceMutex(\n async ({\n offset: newOffset,\n limit: newLimit,\n }: {\n offset?: number\n limit?: number\n } = {}) => {\n // We can optionally provide new offset and limit values to refresh with\n if (\n !isWindowed &&\n (newOffset !== undefined || newLimit !== undefined)\n ) {\n throw new Error(\n 'offset and limit cannot be provided for non-windowed queries',\n )\n }\n if (\n (newOffset &&\n (typeof newOffset !== 'number' || isNaN(newOffset))) ||\n (newLimit && (typeof newLimit !== 'number' || isNaN(newLimit)))\n ) {\n throw new Error('offset and limit must be numbers')\n }\n offset = newOffset ?? offset\n limit = newLimit ?? limit\n\n const run = async (count = 0) => {\n if (callbacks.length === 0) {\n return\n }\n try {\n if (isWindowed) {\n // For a windowed query we defer the refresh of the total count until\n // after we have returned the results with the old total count. This\n // is due to a count(*) being a fairly slow query and we want to update\n // the rows on screen as quickly as possible.\n results = {\n ...(await pg.query<T>(\n `EXECUTE live_query_${id}_get(${limit}, ${offset});`,\n )),\n offset,\n limit,\n totalCount, // This is the old total count\n }\n } else {\n results = await pg.query<T>(`EXECUTE live_query_${id}_get;`)\n }\n } catch (e) {\n const msg = (e as Error).message\n if (\n msg.startsWith(`prepared statement \"live_query_${id}`) &&\n msg.endsWith('does not exist')\n ) {\n // If the prepared statement does not exist, reset and try again\n // This can happen if using the multi-tab worker\n if (count > MAX_RETRIES) {\n throw e\n }\n await init()\n run(count + 1)\n } else {\n throw e\n }\n }\n\n runResultCallbacks(callbacks, results)\n\n // Update the total count\n // If the total count has changed, refresh the query\n if (isWindowed) {\n const newTotalCount = (\n await pg.query<{ count: number }>(\n `EXECUTE live_query_${id}_get_total_count;`,\n )\n ).rows[0].count\n if (newTotalCount !== totalCount) {\n // The total count has changed, refresh the query\n totalCount = newTotalCount\n refresh()\n }\n }\n }\n await run()\n },\n )\n\n // Function to subscribe to the query\n const subscribe = (callback: (results: Results<T>) => void) => {\n if (dead) {\n throw new Error(\n 'Live query is no longer active and cannot be subscribed to',\n )\n }\n callbacks.push(callback)\n }\n\n // Function to unsubscribe from the query\n // If no function is provided, unsubscribe all callbacks\n // If there are no callbacks, unsubscribe from the notify triggers\n const unsubscribe = async (callback?: (results: Results<T>) => void) => {\n if (callback) {\n callbacks = callbacks.filter((callback) => callback !== callback)\n } else {\n callbacks = []\n }\n if (callbacks.length === 0 && !dead) {\n dead = true\n await pg.transaction(async (tx) => {\n await Promise.all(unsubList.map((unsub) => unsub(tx)))\n await tx.exec(`\n DROP VIEW IF EXISTS live_query_${id}_view;\n DEALLOCATE live_query_${id}_get;\n `)\n })\n }\n }\n\n // If the signal has already been aborted, unsubscribe\n if (signal?.aborted) {\n await unsubscribe()\n } else {\n // Add an event listener to unsubscribe if the signal is aborted\n signal?.addEventListener(\n 'abort',\n () => {\n unsubscribe()\n },\n { once: true },\n )\n }\n\n // Run the callback with the initial results\n runResultCallbacks(callbacks, results!)\n\n // Return the initial results\n return {\n initialResults: results!,\n subscribe,\n unsubscribe,\n refresh,\n } satisfies LiveQuery<T>\n },\n\n async changes<T>(\n query: string | LiveChangesOptions<T>,\n params?: any[] | null,\n key?: string,\n callback?: (changes: Array<Change<T>>) => void,\n ) {\n let signal: AbortSignal | undefined\n if (typeof query !== 'string') {\n signal = query.signal\n params = query.params\n key = query.key\n callback = query.callback\n query = query.query\n }\n if (!key) {\n throw new Error('key is required for changes queries')\n }\n let callbacks: Array<(changes: Array<Change<T>>) => void> = callback\n ? [callback]\n : []\n const id = uuid().replace(/-/g, '')\n let dead = false\n\n let stateSwitch: 1 | 2 = 1\n let changes: Results<Change<T>>\n\n let unsubList: Array<(tx?: Transaction) => Promise<void>>\n\n const init = async () => {\n await pg.transaction(async (tx) => {\n // Create a temporary view with the query\n const formattedQuery = await formatQuery(pg, query, params, tx)\n await tx.query(\n `CREATE OR REPLACE TEMP VIEW live_query_${id}_view AS ${formattedQuery}`,\n )\n\n // Get the tables used in the view and add triggers to notify when they change\n const tables = await getTablesForView(tx, `live_query_${id}_view`)\n await addNotifyTriggersToTables(tx, tables, tableNotifyTriggersAdded)\n\n // Get the columns of the view\n const columns = [\n ...(\n await tx.query<any>(`\n SELECT column_name, data_type, udt_name\n FROM information_schema.columns \n WHERE table_name = 'live_query_${id}_view'\n `)\n ).rows,\n { column_name: '__after__', data_type: 'integer' },\n ]\n\n // Init state tables as empty temp table\n await tx.exec(`\n CREATE TEMP TABLE live_query_${id}_state1 (LIKE live_query_${id}_view INCLUDING ALL);\n CREATE TEMP TABLE live_query_${id}_state2 (LIKE live_query_${id}_view INCLUDING ALL);\n `)\n\n // Create Diff views and prepared statements\n for (const curr of [1, 2]) {\n const prev = curr === 1 ? 2 : 1\n await tx.exec(`\n PREPARE live_query_${id}_diff${curr} AS\n WITH\n prev AS (SELECT LAG(\"${key}\") OVER () as __after__, * FROM live_query_${id}_state${prev}),\n curr AS (SELECT LAG(\"${key}\") OVER () as __after__, * FROM live_query_${id}_state${curr}),\n data_diff AS (\n -- INSERT operations: Include all columns\n SELECT \n 'INSERT' AS __op__,\n ${columns\n .map(\n ({ column_name }) =>\n `curr.\"${column_name}\" AS \"${column_name}\"`,\n )\n .join(',\\n')},\n ARRAY[]::text[] AS __changed_columns__\n FROM curr\n LEFT JOIN prev ON curr.${key} = prev.${key}\n WHERE prev.${key} IS NULL\n UNION ALL\n -- DELETE operations: Include only the primary key\n SELECT \n 'DELETE' AS __op__,\n ${columns\n .map(({ column_name, data_type, udt_name }) => {\n if (column_name === key) {\n return `prev.\"${column_name}\" AS \"${column_name}\"`\n } else {\n return `NULL${data_type === 'USER-DEFINED' ? `::${udt_name}` : ``} AS \"${column_name}\"`\n }\n })\n .join(',\\n')},\n ARRAY[]::text[] AS __changed_columns__\n FROM prev\n LEFT JOIN curr ON prev.${key} = curr.${key}\n WHERE curr.${key} IS NULL\n UNION ALL\n -- UPDATE operations: Include only changed columns\n SELECT \n 'UPDATE' AS __op__,\n ${columns\n .map(({ column_name, data_type, udt_name }) =>\n column_name === key\n ? `curr.\"${column_name}\" AS \"${column_name}\"`\n : `CASE \n WHEN curr.\"${column_name}\" IS DISTINCT FROM prev.\"${column_name}\" \n THEN curr.\"${column_name}\"\n ELSE NULL${data_type === 'USER-DEFINED' ? `::${udt_name}` : ``}\n END AS \"${column_name}\"`,\n )\n .join(',\\n')},\n ARRAY(SELECT unnest FROM unnest(ARRAY[${columns\n .filter(({ column_name }) => column_name !== key)\n .map(\n ({ column_name }) =>\n `CASE\n WHEN curr.\"${column_name}\" IS DISTINCT FROM prev.\"${column_name}\" \n THEN '${column_name}' \n ELSE NULL \n END`,\n )\n .join(\n ', ',\n )}]) WHERE unnest IS NOT NULL) AS __changed_columns__\n FROM curr\n INNER JOIN prev ON curr.${key} = prev.${key}\n WHERE NOT (curr IS NOT DISTINCT FROM prev)\n )\n SELECT * FROM data_diff;\n `)\n }\n\n // Setup the listeners\n unsubList = await Promise.all(\n tables!.map((table) =>\n tx.listen(\n `\"table_change__${table.schema_oid}__${table.table_oid}\"`,\n async () => {\n refresh()\n },\n ),\n ),\n )\n })\n }\n\n await init()\n\n const refresh = debounceMutex(async () => {\n if (callbacks.length === 0 && changes) {\n return\n }\n let reset = false\n for (let i = 0; i < 5; i++) {\n try {\n await pg.transaction(async (tx) => {\n // Populate the state table\n await tx.exec(`\n INSERT INTO live_query_${id}_state${stateSwitch} \n SELECT * FROM live_query_${id}_view;\n `)\n\n // Get the changes\n changes = await tx.query<any>(\n `EXECUTE live_query_${id}_diff${stateSwitch};`,\n )\n\n // Switch state\n stateSwitch = stateSwitch === 1 ? 2 : 1\n\n // Truncate the old state table\n await tx.exec(`\n TRUNCATE live_query_${id}_state${stateSwitch};\n `)\n })\n break\n } catch (e) {\n const msg = (e as Error).message\n if (\n msg ===\n `relation \"live_query_${id}_state${stateSwitch}\" does not exist`\n ) {\n // If the state table does not exist, reset and try again\n // This can happen if using the multi-tab worker\n reset = true\n await init()\n continue\n } else {\n throw e\n }\n }\n }\n\n runChangeCallbacks(callbacks, [\n ...(reset\n ? [\n {\n __op__: 'RESET' as const,\n },\n ]\n : []),\n ...changes!.rows,\n ])\n })\n\n // Function to subscribe to the query\n const subscribe = (callback: (changes: Array<Change<T>>) => void) => {\n if (dead) {\n throw new Error(\n 'Live query is no longer active and cannot be subscribed to',\n )\n }\n callbacks.push(callback)\n }\n\n // Function to unsubscribe from the query\n const unsubscribe = async (\n callback?: (changes: Array<Change<T>>) => void,\n ) => {\n if (callback) {\n callbacks = callbacks.filter((callback) => callback !== callback)\n } else {\n callbacks = []\n }\n if (callbacks.length === 0 && !dead) {\n dead = true\n await pg.transaction(async (tx) => {\n await Promise.all(unsubList.map((unsub) => unsub(tx)))\n await tx.exec(`\n DROP VIEW IF EXISTS live_query_${id}_view;\n DROP TABLE IF EXISTS live_query_${id}_state1;\n DROP TABLE IF EXISTS live_query_${id}_state2;\n DEALLOCATE live_query_${id}_diff1;\n DEALLOCATE live_query_${id}_diff2;\n `)\n })\n }\n }\n\n // If the signal has already been aborted, unsubscribe\n if (signal?.aborted) {\n await unsubscribe()\n } else {\n // Add an event listener to unsubscribe if the signal is aborted\n signal?.addEventListener(\n 'abort',\n () => {\n unsubscribe()\n },\n { once: true },\n )\n }\n\n // Run the callback with the initial changes\n await refresh()\n\n // Fields\n const fields = changes!.fields.filter(\n (field) =>\n !['__after__', '__op__', '__changed_columns__'].includes(field.name),\n )\n\n // Return the initial results\n return {\n fields,\n initialChanges: changes!.rows,\n subscribe,\n unsubscribe,\n refresh,\n } satisfies LiveChanges<T>\n },\n\n async incrementalQuery<T>(\n query: string | LiveIncrementalQueryOptions<T>,\n params?: any[] | null,\n key?: string,\n callback?: (results: Results<T>) => void,\n ) {\n let signal: AbortSignal | undefined\n if (typeof query !== 'string') {\n signal = query.signal\n params = query.params\n key = query.key\n callback = query.callback\n query = query.query\n }\n if (!key) {\n throw new Error('key is required for incremental queries')\n }\n let callbacks: Array<(results: Results<T>) => void> = callback\n ? [callback]\n : []\n const rowsMap: Map<any, any> = new Map()\n const afterMap: Map<any, any> = new Map()\n let lastRows: T[] = []\n let firstRun = true\n\n const {\n fields,\n unsubscribe: unsubscribeChanges,\n refresh,\n } = await namespaceObj.changes<T>(query, params, key, (changes) => {\n // Process the changes\n for (const change of changes) {\n const {\n __op__: op,\n __changed_columns__: changedColumns,\n ...obj\n } = change as typeof change & { [key: string]: any }\n switch (op) {\n case 'RESET':\n rowsMap.clear()\n afterMap.clear()\n break\n case 'INSERT':\n rowsMap.set(obj[key], obj)\n afterMap.set(obj.__after__, obj[key])\n break\n case 'DELETE': {\n const oldObj = rowsMap.get(obj[key])\n rowsMap.delete(obj[key])\n // null is the starting point, we don't delete it as another insert\n // may have happened thats replacing it\n if (oldObj.__after__ !== null) {\n afterMap.delete(oldObj.__after__)\n }\n break\n }\n case 'UPDATE': {\n const newObj = { ...(rowsMap.get(obj[key]) ?? {}) }\n for (const columnName of changedColumns) {\n newObj[columnName] = obj[columnName]\n if (columnName === '__after__') {\n afterMap.set(obj.__after__, obj[key])\n }\n }\n rowsMap.set(obj[key], newObj)\n break\n }\n }\n }\n\n // Get the rows in order\n const rows: T[] = []\n let lastKey: any = null\n for (let i = 0; i < rowsMap.size; i++) {\n const nextKey = afterMap.get(lastKey)\n const obj = rowsMap.get(nextKey)\n if (!obj) {\n break\n }\n // Remove the __after__ key from the exposed row\n const cleanObj = { ...obj }\n delete cleanObj.__after__\n rows.push(cleanObj)\n lastKey = nextKey\n }\n lastRows = rows\n\n // Run the callbacks\n if (!firstRun) {\n runResultCallbacks(callbacks, {\n rows,\n fields,\n })\n }\n })\n\n firstRun = false\n runResultCallbacks(callbacks, {\n rows: lastRows,\n fields,\n })\n\n const subscribe = (callback: (results: Results<T>) => void) => {\n callbacks.push(callback)\n }\n\n const unsubscribe = async (callback?: (results: Results<T>) => void) => {\n if (callback) {\n callbacks = callbacks.filter((callback) => callback !== callback)\n } else {\n callbacks = []\n }\n if (callbacks.length === 0) {\n await unsubscribeChanges()\n }\n }\n\n if (signal?.aborted) {\n await unsubscribe()\n } else {\n signal?.addEventListener(\n 'abort',\n () => {\n unsubscribe()\n },\n { once: true },\n )\n }\n\n return {\n initialResults: {\n rows: lastRows,\n fields,\n },\n subscribe,\n unsubscribe,\n refresh,\n } satisfies LiveQuery<T>\n },\n }\n\n return {\n namespaceObj,\n }\n}\n\nexport const live = {\n name: 'Live Queries',\n setup,\n} satisfies Extension\n\nexport type PGliteWithLive = PGliteInterface & {\n live: LiveNamespace\n}\n\n/**\n * Get a list of all the tables used in a view, recursively\n * @param tx a transaction or PGlite instance\n * @param viewName the name of the view\n * @returns list of tables used in the view\n */\nasync function getTablesForView(\n tx: Transaction | PGliteInterfaceBase,\n viewName: string,\n): Promise<\n {\n table_name: string\n schema_name: string\n table_oid: number\n schema_oid: number\n }[]\n> {\n const result = await tx.query<{\n table_name: string\n schema_name: string\n table_oid: number\n schema_oid: number\n }>(\n `\n WITH RECURSIVE view_dependencies AS (\n -- Base case: Get the initial view's dependencies\n SELECT DISTINCT\n cl.relname AS dependent_name,\n n.nspname AS schema_name,\n cl.oid AS dependent_oid,\n n.oid AS schema_oid,\n cl.relkind = 'v' AS is_view\n FROM pg_rewrite r\n JOIN pg_depend d ON r.oid = d.objid\n JOIN pg_class cl ON d.refobjid = cl.oid\n JOIN pg_namespace n ON cl.relnamespace = n.oid\n WHERE\n r.ev_class = (\n SELECT oid FROM pg_class WHERE relname = $1 AND relkind = 'v'\n )\n AND d.deptype = 'n'\n\n UNION ALL\n\n -- Recursive case: Traverse dependencies for views\n SELECT DISTINCT\n cl.relname AS dependent_name,\n n.nspname AS schema_name,\n cl.oid AS dependent_oid,\n n.oid AS schema_oid,\n cl.relkind = 'v' AS is_view\n FROM view_dependencies vd\n JOIN pg_rewrite r ON vd.dependent_name = (\n SELECT relname FROM pg_class WHERE oid = r.ev_class AND relkind = 'v'\n )\n JOIN pg_depend d ON r.oid = d.objid\n JOIN pg_class cl ON d.refobjid = cl.oid\n JOIN pg_namespace n ON cl.relnamespace = n.oid\n WHERE d.deptype = 'n'\n )\n SELECT DISTINCT\n dependent_name AS table_name,\n schema_name,\n dependent_oid AS table_oid,\n schema_oid\n FROM view_dependencies\n WHERE NOT is_view; -- Exclude intermediate views\n `,\n [viewName],\n )\n\n return result.rows.map((row) => ({\n table_name: row.table_name,\n schema_name: row.schema_name,\n table_oid: row.table_oid,\n schema_oid: row.schema_oid,\n }))\n}\n\n/**\n * Add triggers to tables to notify when they change\n * @param tx a transaction or PGlite instance\n * @param tables list of tables to add triggers to\n */\nasync function addNotifyTriggersToTables(\n tx: Transaction | PGliteInterfaceBase,\n tables: {\n table_name: string\n table_oid: number\n schema_name: string\n schema_oid: number\n }[],\n tableNotifyTriggersAdded: Set<string>,\n) {\n const triggers = tables\n .filter(\n (table) =>\n !tableNotifyTriggersAdded.has(`${table.schema_oid}_${table.table_oid}`),\n )\n .map((table) => {\n return `\n CREATE OR REPLACE FUNCTION \"_notify_${table.schema_oid}_${table.table_oid}\"() RETURNS TRIGGER AS $$\n BEGIN\n PERFORM pg_notify('table_change__${table.schema_oid}__${table.table_oid}', '');\n RETURN NULL;\n END;\n $$ LANGUAGE plpgsql;\n CREATE OR REPLACE TRIGGER \"_notify_trigger_${table.schema_oid}_${table.table_oid}\"\n AFTER INSERT OR UPDATE OR DELETE ON \"${table.schema_name}\".\"${table.table_name}\"\n FOR EACH STATEMENT EXECUTE FUNCTION \"_notify_${table.schema_oid}_${table.table_oid}\"();\n `\n })\n .join('\\n')\n if (triggers.trim() !== '') {\n await tx.exec(triggers)\n }\n tables.map((table) =>\n tableNotifyTriggersAdded.add(`${table.schema_oid}_${table.table_oid}`),\n )\n}\n\nconst runResultCallbacks = <T>(\n callbacks: Array<(results: Results<T>) => void>,\n results: Results<T>,\n) => {\n for (const callback of callbacks) {\n callback(results)\n }\n}\n\nconst runChangeCallbacks = <T>(\n callbacks: Array<(changes: Array<Change<T>>) => void>,\n changes: Array<Change<T>>,\n) => {\n for (const callback of callbacks) {\n callback(changes)\n }\n}\n"],"mappings":"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","names":["init_esm_shims","MAX_RETRIES","setup","pg","_emscriptenOpts","tableNotifyTriggersAdded","namespaceObj","query","params","callback","signal","offset","limit","isWindowed","totalCount","callbacks","id","uuid","dead","results","unsubList","init","tx","formattedQuery","formatQuery","tables","getTablesForView","addNotifyTriggersToTables","table","refresh","debounceMutex","newOffset","newLimit","run","count","e","msg","runResultCallbacks","newTotalCount","subscribe","unsubscribe","unsub","key","stateSwitch","changes","columns","curr","prev","column_name","data_type","udt_name","reset","runChangeCallbacks","field","rowsMap","afterMap","lastRows","firstRun","fields","unsubscribeChanges","change","op","changedColumns","obj","oldObj","newObj","columnName","rows","lastKey","i","nextKey","cleanObj","live","viewName","row","triggers"]}
|
package/dist/lo.tar.gz
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var r=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var u=(t,e)=>{for(var s in e)r(t,s,{get:e[s],enumerable:!0})},m=(t,e,s,
|
|
1
|
+
"use strict";var r=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var u=(t,e)=>{for(var s in e)r(t,s,{get:e[s],enumerable:!0})},m=(t,e,s,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!p.call(t,n)&&n!==s&&r(t,n,{get:()=>e[n],enumerable:!(a=o(e,n))||a.enumerable});return t};var f=t=>m(r({},"__esModule",{value:!0}),t);var g={};u(g,{pg_hashids:()=>h});module.exports=f(g);var d=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,i=d();var l=async(t,e)=>({emscriptenOpts:e,bundlePath:new URL("../pg_hashids.tar.gz",i)}),h={name:"pg_hashids",setup:l};0&&(module.exports={pg_hashids});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pg_hashids/index.ts","../../../../../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["import type {\n Extension,\n ExtensionSetupResult,\n
|
|
1
|
+
{"version":3,"sources":["../../src/pg_hashids/index.ts","../../../../../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["import type {\n Extension,\n ExtensionSetupResult,\n PGliteInterfaceBase,\n} from '../interface'\n\nconst setup = async (_pg: PGliteInterfaceBase, emscriptenOpts: any) => {\n return {\n emscriptenOpts,\n bundlePath: new URL('../../release/pg_hashids.tar.gz', import.meta.url),\n } satisfies ExtensionSetupResult\n}\n\nexport const pg_hashids = {\n name: 'pg_hashids',\n setup,\n} satisfies Extension\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,IAAA,eAAAC,EAAAH,GCKA,IAAMI,EAAmB,IACvB,OAAO,SAAa,IAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,KAC7B,SAAS,eAAiB,SAAS,cAAc,QAAQ,YAAY,IAAM,SAC1E,SAAS,cAAc,IACvB,IAAI,IAAI,UAAW,SAAS,OAAO,EAAE,KAEhCC,EAAgCD,EAAiB,EDN9D,IAAME,EAAQ,MAAOC,EAA0BC,KACtC,CACL,eAAAA,EACA,WAAY,IAAI,IAAI,kCAAmCC,CAAe,CACxE,GAGWC,EAAa,CACxB,KAAM,aACN,MAAAJ,CACF","names":["pg_hashids_exports","__export","pg_hashids","__toCommonJS","getImportMetaUrl","importMetaUrl","setup","_pg","emscriptenOpts","importMetaUrl","pg_hashids"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { d as PGliteInterfaceBase } from '../pglite-RfkRSGmH.cjs';
|
|
2
|
+
|
|
3
|
+
declare const pg_hashids: {
|
|
4
|
+
name: string;
|
|
5
|
+
setup: (_pg: PGliteInterfaceBase, emscriptenOpts: any) => Promise<{
|
|
6
|
+
emscriptenOpts: any;
|
|
7
|
+
bundlePath: URL;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { pg_hashids };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { d as PGliteInterfaceBase } from '../pglite-RfkRSGmH.js';
|
|
2
|
+
|
|
3
|
+
declare const pg_hashids: {
|
|
4
|
+
name: string;
|
|
5
|
+
setup: (_pg: PGliteInterfaceBase, emscriptenOpts: any) => Promise<{
|
|
6
|
+
emscriptenOpts: any;
|
|
7
|
+
bundlePath: URL;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { pg_hashids };
|
package/dist/pg_hashids/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"../chunk-VCBR6USK.js";e();var s=async(n,t)=>({emscriptenOpts:t,bundlePath:new URL("
|
|
1
|
+
import{j as e}from"../chunk-VCBR6USK.js";e();var s=async(n,t)=>({emscriptenOpts:t,bundlePath:new URL("../pg_hashids.tar.gz",import.meta.url)}),r={name:"pg_hashids",setup:s};export{r as pg_hashids};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pg_hashids/index.ts"],"sourcesContent":["import type {\n Extension,\n ExtensionSetupResult,\n
|
|
1
|
+
{"version":3,"sources":["../../src/pg_hashids/index.ts"],"sourcesContent":["import type {\n Extension,\n ExtensionSetupResult,\n PGliteInterfaceBase,\n} from '../interface'\n\nconst setup = async (_pg: PGliteInterfaceBase, emscriptenOpts: any) => {\n return {\n emscriptenOpts,\n bundlePath: new URL('../../release/pg_hashids.tar.gz', import.meta.url),\n } satisfies ExtensionSetupResult\n}\n\nexport const pg_hashids = {\n name: 'pg_hashids',\n setup,\n} satisfies Extension\n"],"mappings":"yCAAAA,IAMA,IAAMC,EAAQ,MAAOC,EAA0BC,KACtC,CACL,eAAAA,EACA,WAAY,IAAI,IAAI,kCAAmC,YAAY,GAAG,CACxE,GAGWC,EAAa,CACxB,KAAM,aACN,MAAAH,CACF","names":["init_esm_shims","setup","_pg","emscriptenOpts","pg_hashids"]}
|
|
Binary file
|
package/dist/pg_ivm/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var m=(t,e)=>{for(var r in e)s(t,r,{get:e[r],enumerable:!0})},u=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!p.call(t,n)&&n!==r&&s(t,n,{get:()=>e[n],enumerable:!(i=o(e,n))||i.enumerable});return t};var f=t=>u(s({},"__esModule",{value:!0}),t);var R={};m(R,{pg_ivm:()=>g});module.exports=f(R);var l=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,a=l();var d=async(t,e)=>({emscriptenOpts:e,bundlePath:new URL("../pg_ivm.tar.gz",a)}),g={name:"pg_ivm",setup:d};0&&(module.exports={pg_ivm});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pg_ivm/index.ts","../../../../../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["import type {\n Extension,\n ExtensionSetupResult,\n
|
|
1
|
+
{"version":3,"sources":["../../src/pg_ivm/index.ts","../../../../../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["import type {\n Extension,\n ExtensionSetupResult,\n PGliteInterfaceBase,\n} from '../interface'\n\nconst setup = async (_pg: PGliteInterfaceBase, emscriptenOpts: any) => {\n return {\n emscriptenOpts,\n bundlePath: new URL('../../release/pg_ivm.tar.gz', import.meta.url),\n } satisfies ExtensionSetupResult\n}\n\nexport const pg_ivm = {\n name: 'pg_ivm',\n setup,\n} satisfies Extension\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,YAAAE,IAAA,eAAAC,EAAAH,GCKA,IAAMI,EAAmB,IACvB,OAAO,SAAa,IAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,KAC7B,SAAS,eAAiB,SAAS,cAAc,QAAQ,YAAY,IAAM,SAC1E,SAAS,cAAc,IACvB,IAAI,IAAI,UAAW,SAAS,OAAO,EAAE,KAEhCC,EAAgCD,EAAiB,EDN9D,IAAME,EAAQ,MAAOC,EAA0BC,KACtC,CACL,eAAAA,EACA,WAAY,IAAI,IAAI,8BAA+BC,CAAe,CACpE,GAGWC,EAAS,CACpB,KAAM,SACN,MAAAJ,CACF","names":["pg_ivm_exports","__export","pg_ivm","__toCommonJS","getImportMetaUrl","importMetaUrl","setup","_pg","emscriptenOpts","importMetaUrl","pg_ivm"]}
|
package/dist/pg_ivm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"../chunk-VCBR6USK.js";e();var n=async(s,t)=>({emscriptenOpts:t,bundlePath:new URL("
|
|
1
|
+
import{j as e}from"../chunk-VCBR6USK.js";e();var n=async(s,t)=>({emscriptenOpts:t,bundlePath:new URL("../pg_ivm.tar.gz",import.meta.url)}),r={name:"pg_ivm",setup:n};export{r as pg_ivm};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|