@shotleybuilder/gridlite-adapter-pglite 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter.d.ts +71 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +176 -0
- package/dist/adapter.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/live.d.ts +51 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +119 -0
- package/dist/live.js.map +1 -0
- package/dist/migrations.d.ts +30 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +121 -0
- package/dist/migrations.js.map +1 -0
- package/dist/schema.d.ts +21 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +35 -0
- package/dist/schema.js.map +1 -0
- package/dist/views.d.ts +57 -0
- package/dist/views.d.ts.map +1 -0
- package/dist/views.js +135 -0
- package/dist/views.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PGLite Adapter for GridLite
|
|
3
|
+
*
|
|
4
|
+
* Implements the QueryAdapter interface using PGLite as the database backend.
|
|
5
|
+
* Wraps all PGLite-specific operations: live queries, schema introspection,
|
|
6
|
+
* state persistence, and filter suggestions.
|
|
7
|
+
*/
|
|
8
|
+
import type { QueryAdapter, LiveQueryHandle, ColumnStateEntry } from "@shotleybuilder/svelte-gridlite-kit/adapter";
|
|
9
|
+
import type { ColumnMetadata, FilterNode, FilterLogic } from "@shotleybuilder/svelte-gridlite-kit/types";
|
|
10
|
+
import { type PGliteWithLive } from "./live.js";
|
|
11
|
+
export interface PGLiteAdapterOptions {
|
|
12
|
+
/** PGLite instance with the live extension loaded */
|
|
13
|
+
db: PGliteWithLive;
|
|
14
|
+
/** Table name (mutually exclusive with `query`) */
|
|
15
|
+
table?: string;
|
|
16
|
+
/** Raw SQL query (mutually exclusive with `table`) */
|
|
17
|
+
query?: string;
|
|
18
|
+
}
|
|
19
|
+
export { PGliteWithLive };
|
|
20
|
+
export declare class PGLiteAdapter implements QueryAdapter {
|
|
21
|
+
private db;
|
|
22
|
+
private table;
|
|
23
|
+
private source;
|
|
24
|
+
private allowedColumns;
|
|
25
|
+
private columns;
|
|
26
|
+
constructor(options: PGLiteAdapterOptions);
|
|
27
|
+
init(): Promise<void>;
|
|
28
|
+
destroy(): void;
|
|
29
|
+
introspect(): Promise<ColumnMetadata[]>;
|
|
30
|
+
getAllowedColumns(): string[];
|
|
31
|
+
/**
|
|
32
|
+
* Update columns and allowedColumns from query result fields.
|
|
33
|
+
* Called by GridLite when in raw query mode after the first result.
|
|
34
|
+
*/
|
|
35
|
+
setColumnsFromResult(columns: ColumnMetadata[]): void;
|
|
36
|
+
createLiveQuery(sql: string, params?: unknown[]): LiveQueryHandle;
|
|
37
|
+
execute<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{
|
|
38
|
+
rows: T[];
|
|
39
|
+
}>;
|
|
40
|
+
loadColumnState(gridId: string, viewId?: string): Promise<ColumnStateEntry[]>;
|
|
41
|
+
saveColumnState(gridId: string, columns: ColumnStateEntry[], viewId?: string): Promise<void>;
|
|
42
|
+
getDistinctValues(column: string, options?: {
|
|
43
|
+
table?: string;
|
|
44
|
+
source?: string;
|
|
45
|
+
filters?: FilterNode[];
|
|
46
|
+
filterLogic?: FilterLogic;
|
|
47
|
+
allowedColumns?: string[];
|
|
48
|
+
}): Promise<string[]>;
|
|
49
|
+
getNumericRange(column: string, options?: {
|
|
50
|
+
table?: string;
|
|
51
|
+
source?: string;
|
|
52
|
+
filters?: FilterNode[];
|
|
53
|
+
filterLogic?: FilterLogic;
|
|
54
|
+
allowedColumns?: string[];
|
|
55
|
+
}): Promise<{
|
|
56
|
+
min: number;
|
|
57
|
+
max: number;
|
|
58
|
+
} | null>;
|
|
59
|
+
getTable(): string | undefined;
|
|
60
|
+
getSource(): string | undefined;
|
|
61
|
+
_getDb(): unknown;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a QueryAdapter backed by PGLite.
|
|
65
|
+
*
|
|
66
|
+
* Usage:
|
|
67
|
+
* const adapter = createPGLiteAdapter({ db, table: 'employees' });
|
|
68
|
+
* <GridLite {adapter} ... />
|
|
69
|
+
*/
|
|
70
|
+
export declare function createPGLiteAdapter(options: PGLiteAdapterOptions): QueryAdapter;
|
|
71
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EACjB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACZ,MAAM,2CAA2C,CAAC;AAOnD,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAUtE,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,EAAE,EAAE,cAAc,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,EAAE,oBAAoB;IAgBnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,OAAO,IAAI,IAAI;IAMT,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAI7C,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;;OAGG;IACH,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAOrD,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,eAAe;IAM3D,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC;IAOnB,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAWxB,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,EAAE,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAiBV,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;QACvB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,GACA,OAAO,CAAC,MAAM,EAAE,CAAC;IA+Cd,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;QACvB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,GACA,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA6C/C,QAAQ,IAAI,MAAM,GAAG,SAAS;IAI9B,SAAS,IAAI,MAAM,GAAG,SAAS;IAM/B,MAAM,IAAI,OAAO;CAGlB;AAID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,YAAY,CAEd"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PGLite Adapter for GridLite
|
|
3
|
+
*
|
|
4
|
+
* Implements the QueryAdapter interface using PGLite as the database backend.
|
|
5
|
+
* Wraps all PGLite-specific operations: live queries, schema introspection,
|
|
6
|
+
* state persistence, and filter suggestions.
|
|
7
|
+
*/
|
|
8
|
+
import { quoteIdentifier, resolveFrom, buildWhereClauseFromNodes, } from "@shotleybuilder/svelte-gridlite-kit/builder";
|
|
9
|
+
import { createLiveQueryStore } from "./live.js";
|
|
10
|
+
import { introspectTable } from "./schema.js";
|
|
11
|
+
import { runMigrations } from "./migrations.js";
|
|
12
|
+
import { loadColumnState as loadColumnStateFromDb, saveColumnState as saveColumnStateFromDb, } from "./views.js";
|
|
13
|
+
// ─── Adapter Implementation ─────────────────────────────────────────────────
|
|
14
|
+
export class PGLiteAdapter {
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.allowedColumns = [];
|
|
17
|
+
this.columns = [];
|
|
18
|
+
if (!options.db)
|
|
19
|
+
throw new Error("PGLiteAdapter requires a db instance");
|
|
20
|
+
if (!options.table && !options.query) {
|
|
21
|
+
throw new Error("PGLiteAdapter requires either table or query");
|
|
22
|
+
}
|
|
23
|
+
if (options.table && options.query) {
|
|
24
|
+
throw new Error("PGLiteAdapter: table and query are mutually exclusive");
|
|
25
|
+
}
|
|
26
|
+
this.db = options.db;
|
|
27
|
+
this.table = options.table;
|
|
28
|
+
this.source = options.query;
|
|
29
|
+
}
|
|
30
|
+
// ── Lifecycle ─────────────────────────────────────────────────────────────
|
|
31
|
+
async init() {
|
|
32
|
+
await runMigrations(this.db);
|
|
33
|
+
if (this.table) {
|
|
34
|
+
this.columns = await introspectTable(this.db, this.table);
|
|
35
|
+
this.allowedColumns = this.columns.map((c) => c.name);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
destroy() {
|
|
39
|
+
// PGLite instance is owned by the consumer, not us
|
|
40
|
+
}
|
|
41
|
+
// ── Schema ────────────────────────────────────────────────────────────────
|
|
42
|
+
async introspect() {
|
|
43
|
+
return this.columns;
|
|
44
|
+
}
|
|
45
|
+
getAllowedColumns() {
|
|
46
|
+
return this.allowedColumns;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Update columns and allowedColumns from query result fields.
|
|
50
|
+
* Called by GridLite when in raw query mode after the first result.
|
|
51
|
+
*/
|
|
52
|
+
setColumnsFromResult(columns) {
|
|
53
|
+
this.columns = columns;
|
|
54
|
+
this.allowedColumns = columns.map((c) => c.name);
|
|
55
|
+
}
|
|
56
|
+
// ── Live Query ────────────────────────────────────────────────────────────
|
|
57
|
+
createLiveQuery(sql, params) {
|
|
58
|
+
return createLiveQueryStore(this.db, sql, params ?? []);
|
|
59
|
+
}
|
|
60
|
+
// ── One-shot Queries ──────────────────────────────────────────────────────
|
|
61
|
+
async execute(sql, params) {
|
|
62
|
+
const result = await this.db.query(sql, (params ?? []));
|
|
63
|
+
return { rows: result.rows };
|
|
64
|
+
}
|
|
65
|
+
// ── State Persistence ─────────────────────────────────────────────────────
|
|
66
|
+
async loadColumnState(gridId, viewId) {
|
|
67
|
+
const rows = await loadColumnStateFromDb(this.db, gridId, viewId);
|
|
68
|
+
return rows.map((r) => ({
|
|
69
|
+
name: r.name,
|
|
70
|
+
visible: r.visible,
|
|
71
|
+
width: r.width ?? null,
|
|
72
|
+
position: r.position ?? null,
|
|
73
|
+
label: r.label ?? null,
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
async saveColumnState(gridId, columns, viewId) {
|
|
77
|
+
await saveColumnStateFromDb(this.db, gridId, columns.map((c) => ({
|
|
78
|
+
name: c.name,
|
|
79
|
+
visible: c.visible,
|
|
80
|
+
width: c.width ?? undefined,
|
|
81
|
+
position: c.position ?? undefined,
|
|
82
|
+
label: c.label,
|
|
83
|
+
})), viewId);
|
|
84
|
+
}
|
|
85
|
+
// ── Filter Suggestions ────────────────────────────────────────────────────
|
|
86
|
+
async getDistinctValues(column, options) {
|
|
87
|
+
const tbl = options?.table ?? this.table;
|
|
88
|
+
const src = options?.source ?? this.source;
|
|
89
|
+
const cols = options?.allowedColumns ?? this.allowedColumns;
|
|
90
|
+
const fromClause = resolveFrom(tbl, src);
|
|
91
|
+
const quotedCol = quoteIdentifier(column, cols);
|
|
92
|
+
// Determine data type for JSONB detection
|
|
93
|
+
const colMeta = this.columns.find((c) => c.name === column);
|
|
94
|
+
const dataType = colMeta?.dataType;
|
|
95
|
+
let extraWhere = "";
|
|
96
|
+
let whereParams = [];
|
|
97
|
+
if (options?.filters && options.filters.length > 0) {
|
|
98
|
+
const built = buildWhereClauseFromNodes(options.filters, options.filterLogic ?? "and", 0, cols);
|
|
99
|
+
if (built.sql) {
|
|
100
|
+
// built.sql is "WHERE ..." — strip the WHERE prefix and add as AND
|
|
101
|
+
const clause = built.sql.replace(/^WHERE\s+/i, "");
|
|
102
|
+
extraWhere = ` AND ${clause}`;
|
|
103
|
+
whereParams = built.params;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
let sql;
|
|
107
|
+
if (dataType === "json") {
|
|
108
|
+
sql = `SELECT DISTINCT jsonb_object_keys(${quotedCol}) AS val FROM ${fromClause} WHERE ${quotedCol} IS NOT NULL${extraWhere} ORDER BY val LIMIT 200`;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
sql = `SELECT DISTINCT ${quotedCol}::TEXT AS val FROM ${fromClause} WHERE ${quotedCol} IS NOT NULL${extraWhere} ORDER BY val LIMIT 200`;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const result = await this.db.query(sql, whereParams);
|
|
115
|
+
return result.rows.map((r) => r.val);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async getNumericRange(column, options) {
|
|
122
|
+
const tbl = options?.table ?? this.table;
|
|
123
|
+
const src = options?.source ?? this.source;
|
|
124
|
+
const cols = options?.allowedColumns ?? this.allowedColumns;
|
|
125
|
+
// Only query for numeric columns
|
|
126
|
+
const colMeta = this.columns.find((c) => c.name === column);
|
|
127
|
+
if (colMeta?.dataType !== "number")
|
|
128
|
+
return null;
|
|
129
|
+
const fromClause = resolveFrom(tbl, src);
|
|
130
|
+
const quotedCol = quoteIdentifier(column, cols);
|
|
131
|
+
let whereClause = "";
|
|
132
|
+
let whereParams = [];
|
|
133
|
+
if (options?.filters && options.filters.length > 0) {
|
|
134
|
+
const built = buildWhereClauseFromNodes(options.filters, options.filterLogic ?? "and", 0, cols);
|
|
135
|
+
if (built.sql) {
|
|
136
|
+
whereClause = ` ${built.sql}`;
|
|
137
|
+
whereParams = built.params;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const sql = `SELECT MIN(${quotedCol})::NUMERIC AS min_val, MAX(${quotedCol})::NUMERIC AS max_val FROM ${fromClause}${whereClause}`;
|
|
142
|
+
const result = await this.db.query(sql, whereParams);
|
|
143
|
+
const row = result.rows[0];
|
|
144
|
+
if (row && row.min_val != null && row.max_val != null) {
|
|
145
|
+
return { min: Number(row.min_val), max: Number(row.max_val) };
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ── Query Source ──────────────────────────────────────────────────────────
|
|
154
|
+
getTable() {
|
|
155
|
+
return this.table;
|
|
156
|
+
}
|
|
157
|
+
getSource() {
|
|
158
|
+
return this.source;
|
|
159
|
+
}
|
|
160
|
+
// ── Phase 1 Bridge ────────────────────────────────────────────────────────
|
|
161
|
+
_getDb() {
|
|
162
|
+
return this.db;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ─── Factory Function ───────────────────────────────────────────────────────
|
|
166
|
+
/**
|
|
167
|
+
* Create a QueryAdapter backed by PGLite.
|
|
168
|
+
*
|
|
169
|
+
* Usage:
|
|
170
|
+
* const adapter = createPGLiteAdapter({ db, table: 'employees' });
|
|
171
|
+
* <GridLite {adapter} ... />
|
|
172
|
+
*/
|
|
173
|
+
export function createPGLiteAdapter(options) {
|
|
174
|
+
return new PGLiteAdapter(options);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createPGLiteAdapter, PGLiteAdapter } from "./adapter.js";
|
|
2
|
+
export type { PGLiteAdapterOptions, PGliteWithLive } from "./adapter.js";
|
|
3
|
+
export { createLiveQueryStore, createLiveQueryStoreFromQuery } from "./live.js";
|
|
4
|
+
export type { LiveQueryState, LiveQueryStore } from "./live.js";
|
|
5
|
+
export { introspectTable, getColumnNames } from "./schema.js";
|
|
6
|
+
export { runMigrations, getLatestVersion, isMigrated } from "./migrations.js";
|
|
7
|
+
export { saveView, loadView, loadViews, loadDefaultView, setDefaultView, deleteView, saveColumnState, loadColumnState, } from "./views.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGzE,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAChF,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,eAAe,EACf,cAAc,EACd,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Public API for @shotleybuilder/gridlite-adapter-pglite
|
|
2
|
+
export { createPGLiteAdapter, PGLiteAdapter } from "./adapter.js";
|
|
3
|
+
// Re-export internals for advanced usage
|
|
4
|
+
export { createLiveQueryStore, createLiveQueryStoreFromQuery } from "./live.js";
|
|
5
|
+
export { introspectTable, getColumnNames } from "./schema.js";
|
|
6
|
+
export { runMigrations, getLatestVersion, isMigrated } from "./migrations.js";
|
|
7
|
+
export { saveView, loadView, loadViews, loadDefaultView, setDefaultView, deleteView, saveColumnState, loadColumnState, } from "./views.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlE,yCAAyC;AACzC,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAEhF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,eAAe,EACf,cAAc,EACd,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/live.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte Store Wrapper for PGLite Live Queries
|
|
3
|
+
*
|
|
4
|
+
* Bridges PGLite's live.query() API with Svelte's store contract.
|
|
5
|
+
* Provides loading/error/data states and handles subscription lifecycle.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const store = createLiveQueryStore(db, 'SELECT * FROM users WHERE active = $1', [true]);
|
|
9
|
+
* // In Svelte: $store.rows, $store.loading, $store.error
|
|
10
|
+
* // Call store.destroy() on component unmount
|
|
11
|
+
*/
|
|
12
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
13
|
+
import type { LiveNamespace } from "@electric-sql/pglite/live";
|
|
14
|
+
import type { ParameterizedQuery } from "@shotleybuilder/svelte-gridlite-kit/types";
|
|
15
|
+
export interface LiveQueryState<T = Record<string, unknown>> {
|
|
16
|
+
rows: T[];
|
|
17
|
+
fields: {
|
|
18
|
+
name: string;
|
|
19
|
+
dataTypeID: number;
|
|
20
|
+
}[];
|
|
21
|
+
totalCount?: number;
|
|
22
|
+
loading: boolean;
|
|
23
|
+
error: Error | null;
|
|
24
|
+
}
|
|
25
|
+
export interface LiveQueryStore<T = Record<string, unknown>> {
|
|
26
|
+
subscribe: (callback: (state: LiveQueryState<T>) => void) => () => void;
|
|
27
|
+
refresh: () => Promise<void>;
|
|
28
|
+
update: (query: string, params?: unknown[]) => Promise<void>;
|
|
29
|
+
destroy: () => Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/** A PGLite instance that has the live extension loaded */
|
|
32
|
+
export type PGliteWithLive = PGlite & {
|
|
33
|
+
live: LiveNamespace;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Create a Svelte-compatible store backed by a PGLite live query.
|
|
37
|
+
*
|
|
38
|
+
* The store follows Svelte's store contract (has a `subscribe` method that
|
|
39
|
+
* returns an unsubscribe function). It also exposes `refresh`, `update`,
|
|
40
|
+
* and `destroy` methods.
|
|
41
|
+
*
|
|
42
|
+
* @param db - PGLite instance with the live extension loaded
|
|
43
|
+
* @param query - SQL query string with $1, $2, ... parameters
|
|
44
|
+
* @param params - Parameter values for the query
|
|
45
|
+
*/
|
|
46
|
+
export declare function createLiveQueryStore<T = Record<string, unknown>>(db: PGliteWithLive, query: string, params?: unknown[]): LiveQueryStore<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Convenience: create a live query store from a ParameterizedQuery object.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createLiveQueryStoreFromQuery<T = Record<string, unknown>>(db: PGliteWithLive, parameterizedQuery: ParameterizedQuery): LiveQueryStore<T>;
|
|
51
|
+
//# sourceMappingURL=live.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAIpF,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzD,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzD,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACxE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAID,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAI9D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,OAAO,EAAO,GACrB,cAAc,CAAC,CAAC,CAAC,CAgHnB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,EAAE,EAAE,cAAc,EAClB,kBAAkB,EAAE,kBAAkB,GACrC,cAAc,CAAC,CAAC,CAAC,CAMnB"}
|
package/dist/live.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte Store Wrapper for PGLite Live Queries
|
|
3
|
+
*
|
|
4
|
+
* Bridges PGLite's live.query() API with Svelte's store contract.
|
|
5
|
+
* Provides loading/error/data states and handles subscription lifecycle.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const store = createLiveQueryStore(db, 'SELECT * FROM users WHERE active = $1', [true]);
|
|
9
|
+
* // In Svelte: $store.rows, $store.loading, $store.error
|
|
10
|
+
* // Call store.destroy() on component unmount
|
|
11
|
+
*/
|
|
12
|
+
// ─── Store Factory ──────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Create a Svelte-compatible store backed by a PGLite live query.
|
|
15
|
+
*
|
|
16
|
+
* The store follows Svelte's store contract (has a `subscribe` method that
|
|
17
|
+
* returns an unsubscribe function). It also exposes `refresh`, `update`,
|
|
18
|
+
* and `destroy` methods.
|
|
19
|
+
*
|
|
20
|
+
* @param db - PGLite instance with the live extension loaded
|
|
21
|
+
* @param query - SQL query string with $1, $2, ... parameters
|
|
22
|
+
* @param params - Parameter values for the query
|
|
23
|
+
*/
|
|
24
|
+
export function createLiveQueryStore(db, query, params = []) {
|
|
25
|
+
let state = {
|
|
26
|
+
rows: [],
|
|
27
|
+
fields: [],
|
|
28
|
+
loading: true,
|
|
29
|
+
error: null,
|
|
30
|
+
};
|
|
31
|
+
const subscribers = new Set();
|
|
32
|
+
// Internal unsubscribe from PGLite live query
|
|
33
|
+
let liveUnsubscribe = null;
|
|
34
|
+
let liveRefresh = null;
|
|
35
|
+
let destroyed = false;
|
|
36
|
+
function notify() {
|
|
37
|
+
for (const cb of subscribers) {
|
|
38
|
+
cb(state);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function setState(partial) {
|
|
42
|
+
state = { ...state, ...partial };
|
|
43
|
+
notify();
|
|
44
|
+
}
|
|
45
|
+
function handleResults(results) {
|
|
46
|
+
setState({
|
|
47
|
+
rows: results.rows,
|
|
48
|
+
fields: results.fields,
|
|
49
|
+
totalCount: results.totalCount,
|
|
50
|
+
loading: false,
|
|
51
|
+
error: null,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async function setupLiveQuery(sql, queryParams) {
|
|
55
|
+
// Tear down existing subscription
|
|
56
|
+
if (liveUnsubscribe) {
|
|
57
|
+
await liveUnsubscribe();
|
|
58
|
+
liveUnsubscribe = null;
|
|
59
|
+
liveRefresh = null;
|
|
60
|
+
}
|
|
61
|
+
if (destroyed)
|
|
62
|
+
return;
|
|
63
|
+
setState({ loading: true, error: null });
|
|
64
|
+
try {
|
|
65
|
+
const liveQuery = await db.live.query(sql, queryParams, handleResults);
|
|
66
|
+
if (destroyed) {
|
|
67
|
+
// Component was destroyed while we were setting up
|
|
68
|
+
await liveQuery.unsubscribe();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
liveUnsubscribe = liveQuery.unsubscribe;
|
|
72
|
+
liveRefresh = liveQuery.refresh;
|
|
73
|
+
// Initial results are delivered via the callback, but also available here
|
|
74
|
+
handleResults(liveQuery.initialResults);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
setState({
|
|
78
|
+
loading: false,
|
|
79
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Start the initial live query
|
|
84
|
+
setupLiveQuery(query, params);
|
|
85
|
+
return {
|
|
86
|
+
subscribe(callback) {
|
|
87
|
+
subscribers.add(callback);
|
|
88
|
+
// Immediately deliver current state (Svelte store contract)
|
|
89
|
+
callback(state);
|
|
90
|
+
return () => {
|
|
91
|
+
subscribers.delete(callback);
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
async refresh() {
|
|
95
|
+
if (liveRefresh) {
|
|
96
|
+
await liveRefresh();
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
async update(newQuery, newParams = []) {
|
|
100
|
+
await setupLiveQuery(newQuery, newParams);
|
|
101
|
+
},
|
|
102
|
+
async destroy() {
|
|
103
|
+
destroyed = true;
|
|
104
|
+
if (liveUnsubscribe) {
|
|
105
|
+
await liveUnsubscribe();
|
|
106
|
+
liveUnsubscribe = null;
|
|
107
|
+
liveRefresh = null;
|
|
108
|
+
}
|
|
109
|
+
subscribers.clear();
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Convenience: create a live query store from a ParameterizedQuery object.
|
|
115
|
+
*/
|
|
116
|
+
export function createLiveQueryStoreFromQuery(db, parameterizedQuery) {
|
|
117
|
+
return createLiveQueryStore(db, parameterizedQuery.sql, parameterizedQuery.params);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=live.js.map
|
package/dist/live.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GridLite Config Table Migrations
|
|
3
|
+
*
|
|
4
|
+
* Creates and manages internal tables for persisting grid state:
|
|
5
|
+
* - _gridlite_meta: migration version tracking
|
|
6
|
+
* - _gridlite_views: saved view configurations per grid instance
|
|
7
|
+
* - _gridlite_column_state: column visibility, ordering, sizing per view
|
|
8
|
+
*
|
|
9
|
+
* All tables are prefixed with `_gridlite_` to avoid collision with user tables.
|
|
10
|
+
*/
|
|
11
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
12
|
+
/**
|
|
13
|
+
* Run all pending migrations.
|
|
14
|
+
*
|
|
15
|
+
* This is idempotent — safe to call on every app startup.
|
|
16
|
+
* Migrations use `IF NOT EXISTS` for table/index creation.
|
|
17
|
+
*
|
|
18
|
+
* @param db - PGLite instance
|
|
19
|
+
* @returns The final migration version
|
|
20
|
+
*/
|
|
21
|
+
export declare function runMigrations(db: PGlite): Promise<number>;
|
|
22
|
+
/**
|
|
23
|
+
* Get the latest migration version available.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getLatestVersion(): number;
|
|
26
|
+
/**
|
|
27
|
+
* Check if migrations are up to date.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isMigrated(db: PGlite): Promise<boolean>;
|
|
30
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AA+FnD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG7D"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GridLite Config Table Migrations
|
|
3
|
+
*
|
|
4
|
+
* Creates and manages internal tables for persisting grid state:
|
|
5
|
+
* - _gridlite_meta: migration version tracking
|
|
6
|
+
* - _gridlite_views: saved view configurations per grid instance
|
|
7
|
+
* - _gridlite_column_state: column visibility, ordering, sizing per view
|
|
8
|
+
*
|
|
9
|
+
* All tables are prefixed with `_gridlite_` to avoid collision with user tables.
|
|
10
|
+
*/
|
|
11
|
+
const MIGRATIONS = [
|
|
12
|
+
{
|
|
13
|
+
version: 1,
|
|
14
|
+
description: "Create meta, views, and column_state tables",
|
|
15
|
+
sql: `
|
|
16
|
+
CREATE TABLE IF NOT EXISTS _gridlite_meta (
|
|
17
|
+
key TEXT PRIMARY KEY,
|
|
18
|
+
value TEXT NOT NULL
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
CREATE TABLE IF NOT EXISTS _gridlite_views (
|
|
22
|
+
id TEXT PRIMARY KEY,
|
|
23
|
+
grid_id TEXT NOT NULL,
|
|
24
|
+
name TEXT NOT NULL,
|
|
25
|
+
description TEXT,
|
|
26
|
+
filters JSONB DEFAULT '[]',
|
|
27
|
+
filter_logic TEXT DEFAULT 'and',
|
|
28
|
+
sorting JSONB DEFAULT '[]',
|
|
29
|
+
grouping JSONB DEFAULT '[]',
|
|
30
|
+
column_visibility JSONB DEFAULT '{}',
|
|
31
|
+
column_order JSONB DEFAULT '[]',
|
|
32
|
+
is_default BOOLEAN DEFAULT false,
|
|
33
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
34
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_gridlite_views_grid_id
|
|
38
|
+
ON _gridlite_views (grid_id);
|
|
39
|
+
|
|
40
|
+
CREATE TABLE IF NOT EXISTS _gridlite_column_state (
|
|
41
|
+
grid_id TEXT NOT NULL,
|
|
42
|
+
view_id TEXT NOT NULL DEFAULT '__default__',
|
|
43
|
+
column_name TEXT NOT NULL,
|
|
44
|
+
visible BOOLEAN DEFAULT true,
|
|
45
|
+
width INTEGER,
|
|
46
|
+
position INTEGER,
|
|
47
|
+
PRIMARY KEY (grid_id, view_id, column_name)
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_gridlite_column_state_grid
|
|
51
|
+
ON _gridlite_column_state (grid_id);
|
|
52
|
+
`,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
version: 2,
|
|
56
|
+
description: "Add label column to column_state for user-editable column names",
|
|
57
|
+
sql: `
|
|
58
|
+
ALTER TABLE _gridlite_column_state ADD COLUMN IF NOT EXISTS label TEXT;
|
|
59
|
+
`,
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
// ─── Migration Runner ───────────────────────────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* Get the current migration version from the database.
|
|
65
|
+
* Returns 0 if the meta table doesn't exist yet.
|
|
66
|
+
*/
|
|
67
|
+
async function getCurrentVersion(db) {
|
|
68
|
+
try {
|
|
69
|
+
const result = await db.query(`SELECT value FROM _gridlite_meta WHERE key = 'migration_version'`);
|
|
70
|
+
if (result.rows.length > 0) {
|
|
71
|
+
return parseInt(result.rows[0].value, 10);
|
|
72
|
+
}
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Table doesn't exist yet
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set the migration version in the meta table.
|
|
82
|
+
*/
|
|
83
|
+
async function setVersion(db, version) {
|
|
84
|
+
await db.query(`INSERT INTO _gridlite_meta (key, value) VALUES ('migration_version', $1)
|
|
85
|
+
ON CONFLICT (key) DO UPDATE SET value = $1`, [String(version)]);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Run all pending migrations.
|
|
89
|
+
*
|
|
90
|
+
* This is idempotent — safe to call on every app startup.
|
|
91
|
+
* Migrations use `IF NOT EXISTS` for table/index creation.
|
|
92
|
+
*
|
|
93
|
+
* @param db - PGLite instance
|
|
94
|
+
* @returns The final migration version
|
|
95
|
+
*/
|
|
96
|
+
export async function runMigrations(db) {
|
|
97
|
+
const currentVersion = await getCurrentVersion(db);
|
|
98
|
+
const pending = MIGRATIONS.filter((m) => m.version > currentVersion);
|
|
99
|
+
if (pending.length === 0) {
|
|
100
|
+
return currentVersion;
|
|
101
|
+
}
|
|
102
|
+
for (const migration of pending) {
|
|
103
|
+
await db.exec(migration.sql);
|
|
104
|
+
await setVersion(db, migration.version);
|
|
105
|
+
}
|
|
106
|
+
return pending[pending.length - 1].version;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get the latest migration version available.
|
|
110
|
+
*/
|
|
111
|
+
export function getLatestVersion() {
|
|
112
|
+
return MIGRATIONS.length > 0 ? MIGRATIONS[MIGRATIONS.length - 1].version : 0;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if migrations are up to date.
|
|
116
|
+
*/
|
|
117
|
+
export async function isMigrated(db) {
|
|
118
|
+
const current = await getCurrentVersion(db);
|
|
119
|
+
return current >= getLatestVersion();
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,UAAU,GAAgB;IAC9B;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,6CAA6C;QAC1D,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCN;KACA;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EACT,iEAAiE;QACnE,GAAG,EAAE;;GAEN;KACA;CACF,CAAC;AAEF,+EAA+E;AAE/E;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,EAAU;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B,kEAAkE,CACnE,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,EAAU,EAAE,OAAe;IACnD,MAAM,EAAE,CAAC,KAAK,CACZ;8CAC0C,EAC1C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC5C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAErE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,OAAO,IAAI,gBAAgB,EAAE,CAAC;AACvC,CAAC"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Introspection for PGLite
|
|
3
|
+
*
|
|
4
|
+
* Queries information_schema.columns to discover column names, types,
|
|
5
|
+
* and nullability for a given table.
|
|
6
|
+
*/
|
|
7
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
8
|
+
import type { ColumnMetadata } from "@shotleybuilder/svelte-gridlite-kit/types";
|
|
9
|
+
/**
|
|
10
|
+
* Introspect a table's schema using information_schema.columns.
|
|
11
|
+
*
|
|
12
|
+
* Returns an array of ColumnMetadata in column ordinal position order.
|
|
13
|
+
* The table name is parameterized to prevent SQL injection.
|
|
14
|
+
*/
|
|
15
|
+
export declare function introspectTable(db: PGlite, tableName: string, schema?: string): Promise<ColumnMetadata[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Get the list of column names for a table.
|
|
18
|
+
* Useful for the query builder's allowedColumns parameter.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getColumnNames(db: PGlite, tableName: string, schema?: string): Promise<string[]>;
|
|
21
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAYhF;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAiB,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CAgB3B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAiB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Introspection for PGLite
|
|
3
|
+
*
|
|
4
|
+
* Queries information_schema.columns to discover column names, types,
|
|
5
|
+
* and nullability for a given table.
|
|
6
|
+
*/
|
|
7
|
+
import { mapPostgresType } from "@shotleybuilder/svelte-gridlite-kit/schema";
|
|
8
|
+
/**
|
|
9
|
+
* Introspect a table's schema using information_schema.columns.
|
|
10
|
+
*
|
|
11
|
+
* Returns an array of ColumnMetadata in column ordinal position order.
|
|
12
|
+
* The table name is parameterized to prevent SQL injection.
|
|
13
|
+
*/
|
|
14
|
+
export async function introspectTable(db, tableName, schema = "public") {
|
|
15
|
+
const result = await db.query(`SELECT column_name, data_type, is_nullable, column_default
|
|
16
|
+
FROM information_schema.columns
|
|
17
|
+
WHERE table_name = $1 AND table_schema = $2
|
|
18
|
+
ORDER BY ordinal_position`, [tableName, schema]);
|
|
19
|
+
return result.rows.map((row) => ({
|
|
20
|
+
name: row.column_name,
|
|
21
|
+
dataType: mapPostgresType(row.data_type),
|
|
22
|
+
postgresType: row.data_type,
|
|
23
|
+
nullable: row.is_nullable === "YES",
|
|
24
|
+
hasDefault: row.column_default !== null,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the list of column names for a table.
|
|
29
|
+
* Useful for the query builder's allowedColumns parameter.
|
|
30
|
+
*/
|
|
31
|
+
export async function getColumnNames(db, tableName, schema = "public") {
|
|
32
|
+
const columns = await introspectTable(db, tableName, schema);
|
|
33
|
+
return columns.map((c) => c.name);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAW7E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAU,EACV,SAAiB,EACjB,SAAiB,QAAQ;IAEzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B;;;6BAGyB,EACzB,CAAC,SAAS,EAAE,MAAM,CAAC,CACpB,CAAC;IAEF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,GAAG,CAAC,WAAW;QACrB,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;QACxC,YAAY,EAAE,GAAG,CAAC,SAAS;QAC3B,QAAQ,EAAE,GAAG,CAAC,WAAW,KAAK,KAAK;QACnC,UAAU,EAAE,GAAG,CAAC,cAAc,KAAK,IAAI;KACxC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAU,EACV,SAAiB,EACjB,SAAiB,QAAQ;IAEzB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/views.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* View Configuration Persistence
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for grid view configs stored in PGLite tables.
|
|
5
|
+
* Each grid instance (identified by `gridId`) can have multiple named views.
|
|
6
|
+
* One view per grid can be marked as the default.
|
|
7
|
+
*
|
|
8
|
+
* Requires `runMigrations()` to have been called first.
|
|
9
|
+
*/
|
|
10
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
11
|
+
import type { ViewPreset } from "@shotleybuilder/svelte-gridlite-kit/types";
|
|
12
|
+
/**
|
|
13
|
+
* Save a view configuration. Creates or updates (upserts).
|
|
14
|
+
*/
|
|
15
|
+
export declare function saveView(db: PGlite, gridId: string, view: ViewPreset): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Load a single view by ID.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadView(db: PGlite, viewId: string): Promise<ViewPreset | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Load all views for a grid instance.
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadViews(db: PGlite, gridId: string): Promise<ViewPreset[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Load the default view for a grid instance (if one is set).
|
|
26
|
+
*/
|
|
27
|
+
export declare function loadDefaultView(db: PGlite, gridId: string): Promise<ViewPreset | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Set a view as the default for its grid. Clears any existing default first.
|
|
30
|
+
*/
|
|
31
|
+
export declare function setDefaultView(db: PGlite, gridId: string, viewId: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Delete a view by ID.
|
|
34
|
+
*/
|
|
35
|
+
export declare function deleteView(db: PGlite, viewId: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Save column state for a grid (optionally scoped to a view).
|
|
38
|
+
* Replaces all existing column state for the given grid+view.
|
|
39
|
+
*/
|
|
40
|
+
export declare function saveColumnState(db: PGlite, gridId: string, columns: {
|
|
41
|
+
name: string;
|
|
42
|
+
visible?: boolean;
|
|
43
|
+
width?: number;
|
|
44
|
+
position?: number;
|
|
45
|
+
label?: string | null;
|
|
46
|
+
}[], viewId?: string): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Load column state for a grid (optionally scoped to a view).
|
|
49
|
+
*/
|
|
50
|
+
export declare function loadColumnState(db: PGlite, gridId: string, viewId?: string): Promise<{
|
|
51
|
+
name: string;
|
|
52
|
+
visible: boolean;
|
|
53
|
+
width: number | null;
|
|
54
|
+
position: number | null;
|
|
55
|
+
label: string | null;
|
|
56
|
+
}[]>;
|
|
57
|
+
//# sourceMappingURL=views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../src/views.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAKV,UAAU,EACX,MAAM,2CAA2C,CAAC;AAgCnD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ5B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,EAAE,CAAC,CAOvB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ5B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1E;AAID;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,EAAE,EACH,MAAM,GAAE,MAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAsB,GAC7B,OAAO,CACR;IACE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,EAAE,CACJ,CAeA"}
|
package/dist/views.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* View Configuration Persistence
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for grid view configs stored in PGLite tables.
|
|
5
|
+
* Each grid instance (identified by `gridId`) can have multiple named views.
|
|
6
|
+
* One view per grid can be marked as the default.
|
|
7
|
+
*
|
|
8
|
+
* Requires `runMigrations()` to have been called first.
|
|
9
|
+
*/
|
|
10
|
+
// ─── View CRUD ──────────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Save a view configuration. Creates or updates (upserts).
|
|
13
|
+
*/
|
|
14
|
+
export async function saveView(db, gridId, view) {
|
|
15
|
+
await db.query(`INSERT INTO _gridlite_views
|
|
16
|
+
(id, grid_id, name, description, filters, filter_logic, sorting, grouping, column_visibility, column_order, is_default, updated_at)
|
|
17
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, false, CURRENT_TIMESTAMP)
|
|
18
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
19
|
+
name = $3,
|
|
20
|
+
description = $4,
|
|
21
|
+
filters = $5,
|
|
22
|
+
filter_logic = $6,
|
|
23
|
+
sorting = $7,
|
|
24
|
+
grouping = $8,
|
|
25
|
+
column_visibility = $9,
|
|
26
|
+
column_order = $10,
|
|
27
|
+
updated_at = CURRENT_TIMESTAMP`, [
|
|
28
|
+
view.id,
|
|
29
|
+
gridId,
|
|
30
|
+
view.name,
|
|
31
|
+
view.description ?? null,
|
|
32
|
+
JSON.stringify(view.filters ?? []),
|
|
33
|
+
view.filterLogic ?? "and",
|
|
34
|
+
JSON.stringify(view.sorting ?? []),
|
|
35
|
+
JSON.stringify(view.grouping ?? []),
|
|
36
|
+
JSON.stringify(view.columnVisibility ?? {}),
|
|
37
|
+
JSON.stringify(view.columnOrder ?? []),
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load a single view by ID.
|
|
42
|
+
*/
|
|
43
|
+
export async function loadView(db, viewId) {
|
|
44
|
+
const result = await db.query(`SELECT * FROM _gridlite_views WHERE id = $1`, [viewId]);
|
|
45
|
+
if (result.rows.length === 0)
|
|
46
|
+
return null;
|
|
47
|
+
return rowToViewPreset(result.rows[0]);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load all views for a grid instance.
|
|
51
|
+
*/
|
|
52
|
+
export async function loadViews(db, gridId) {
|
|
53
|
+
const result = await db.query(`SELECT * FROM _gridlite_views WHERE grid_id = $1 ORDER BY name`, [gridId]);
|
|
54
|
+
return result.rows.map(rowToViewPreset);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Load the default view for a grid instance (if one is set).
|
|
58
|
+
*/
|
|
59
|
+
export async function loadDefaultView(db, gridId) {
|
|
60
|
+
const result = await db.query(`SELECT * FROM _gridlite_views WHERE grid_id = $1 AND is_default = true LIMIT 1`, [gridId]);
|
|
61
|
+
if (result.rows.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
return rowToViewPreset(result.rows[0]);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Set a view as the default for its grid. Clears any existing default first.
|
|
67
|
+
*/
|
|
68
|
+
export async function setDefaultView(db, gridId, viewId) {
|
|
69
|
+
// Clear existing default
|
|
70
|
+
await db.query(`UPDATE _gridlite_views SET is_default = false WHERE grid_id = $1`, [gridId]);
|
|
71
|
+
// Set new default
|
|
72
|
+
await db.query(`UPDATE _gridlite_views SET is_default = true WHERE id = $1 AND grid_id = $2`, [viewId, gridId]);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Delete a view by ID.
|
|
76
|
+
*/
|
|
77
|
+
export async function deleteView(db, viewId) {
|
|
78
|
+
// Also clean up associated column state
|
|
79
|
+
await db.query(`DELETE FROM _gridlite_column_state WHERE view_id = $1`, [
|
|
80
|
+
viewId,
|
|
81
|
+
]);
|
|
82
|
+
await db.query(`DELETE FROM _gridlite_views WHERE id = $1`, [viewId]);
|
|
83
|
+
}
|
|
84
|
+
// ─── Column State CRUD ──────────────────────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Save column state for a grid (optionally scoped to a view).
|
|
87
|
+
* Replaces all existing column state for the given grid+view.
|
|
88
|
+
*/
|
|
89
|
+
export async function saveColumnState(db, gridId, columns, viewId = "__default__") {
|
|
90
|
+
// Clear existing state for this grid+view
|
|
91
|
+
await db.query(`DELETE FROM _gridlite_column_state WHERE grid_id = $1 AND view_id = $2`, [gridId, viewId]);
|
|
92
|
+
// Insert new state
|
|
93
|
+
for (const col of columns) {
|
|
94
|
+
await db.query(`INSERT INTO _gridlite_column_state (grid_id, view_id, column_name, visible, width, position, label)
|
|
95
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)`, [
|
|
96
|
+
gridId,
|
|
97
|
+
viewId,
|
|
98
|
+
col.name,
|
|
99
|
+
col.visible ?? true,
|
|
100
|
+
col.width ?? null,
|
|
101
|
+
col.position ?? null,
|
|
102
|
+
col.label ?? null,
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Load column state for a grid (optionally scoped to a view).
|
|
108
|
+
*/
|
|
109
|
+
export async function loadColumnState(db, gridId, viewId = "__default__") {
|
|
110
|
+
const result = await db.query(`SELECT * FROM _gridlite_column_state
|
|
111
|
+
WHERE grid_id = $1 AND view_id = $2
|
|
112
|
+
ORDER BY position NULLS LAST, column_name`, [gridId, viewId]);
|
|
113
|
+
return result.rows.map((row) => ({
|
|
114
|
+
name: row.column_name,
|
|
115
|
+
visible: row.visible,
|
|
116
|
+
width: row.width,
|
|
117
|
+
position: row.position,
|
|
118
|
+
label: row.label,
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
122
|
+
function rowToViewPreset(row) {
|
|
123
|
+
return {
|
|
124
|
+
id: row.id,
|
|
125
|
+
name: row.name,
|
|
126
|
+
description: row.description ?? undefined,
|
|
127
|
+
filters: row.filters,
|
|
128
|
+
filterLogic: row.filter_logic,
|
|
129
|
+
sorting: row.sorting,
|
|
130
|
+
grouping: row.grouping,
|
|
131
|
+
columnVisibility: row.column_visibility,
|
|
132
|
+
columnOrder: row.column_order,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../src/views.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shotleybuilder/gridlite-adapter-pglite",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "PGLite adapter for svelte-gridlite-kit",
|
|
5
|
+
"author": "Sertantai",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/shotleybuilder/svelte-gridlite-kit.git",
|
|
10
|
+
"directory": "packages/pglite"
|
|
11
|
+
},
|
|
12
|
+
"type": "module",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"!dist/**/*.test.*",
|
|
23
|
+
"!dist/**/*.spec.*"
|
|
24
|
+
],
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@electric-sql/pglite": ">=0.2.0",
|
|
27
|
+
"@shotleybuilder/svelte-gridlite-kit": "0.5.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@electric-sql/pglite": "^0.2.0",
|
|
31
|
+
"typescript": "^5.0.0",
|
|
32
|
+
"vitest": "^2.0.0",
|
|
33
|
+
"@shotleybuilder/svelte-gridlite-kit": "0.5.0"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"test": "vitest",
|
|
38
|
+
"test:run": "vitest run",
|
|
39
|
+
"check": "tsc --noEmit"
|
|
40
|
+
}
|
|
41
|
+
}
|