@undefineds.co/xpod 0.3.25 → 0.3.27
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/config/cloud.json +6 -5
- package/config/main.json +0 -3
- package/config/xpod.base.json +0 -32
- package/dist/api/container/index.js +3 -0
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/routes.js +2 -0
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +5 -0
- package/dist/api/container/types.js.map +1 -1
- package/dist/authorization/AuthMode.d.ts +8 -0
- package/dist/authorization/AuthMode.js +51 -0
- package/dist/authorization/AuthMode.js.map +1 -0
- package/dist/authorization/PodAuthorizationResources.d.ts +18 -0
- package/dist/authorization/PodAuthorizationResources.js +108 -0
- package/dist/authorization/PodAuthorizationResources.js.map +1 -0
- package/dist/cli/commands/start.js +11 -2
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/components/components.jsonld +3 -2
- package/dist/components/context.jsonld +115 -14
- package/dist/index.d.ts +5 -3
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/main.js +11 -2
- package/dist/main.js.map +1 -1
- package/dist/provision/LocalPodProvisioningService.d.ts +6 -2
- package/dist/provision/LocalPodProvisioningService.js +36 -33
- package/dist/provision/LocalPodProvisioningService.js.map +1 -1
- package/dist/provision/LocalPodProvisioningService.jsonld +65 -8
- package/dist/runtime/XpodRuntime.js +0 -1
- package/dist/runtime/XpodRuntime.js.map +1 -1
- package/dist/runtime/bootstrap.d.ts +4 -2
- package/dist/runtime/bootstrap.js +43 -11
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/runtime/css-process.d.ts +6 -1
- package/dist/runtime/css-process.js +18 -6
- package/dist/runtime/css-process.js.map +1 -1
- package/dist/runtime/lifecycle.d.ts +2 -3
- package/dist/runtime/lifecycle.js +2 -2
- package/dist/runtime/lifecycle.js.map +1 -1
- package/dist/runtime/runtime-types.d.ts +2 -1
- package/dist/runtime/runtime-types.js.map +1 -1
- package/dist/storage/accessors/SolidRdfDataAccessor.d.ts +2 -3
- package/dist/storage/accessors/SolidRdfDataAccessor.js +48 -42
- package/dist/storage/accessors/SolidRdfDataAccessor.js.map +1 -1
- package/dist/storage/accessors/SolidRdfDataAccessor.jsonld +1 -1
- package/dist/storage/keyvalue/BaseKeyValueStorage.d.ts +33 -0
- package/dist/storage/keyvalue/BaseKeyValueStorage.js +106 -0
- package/dist/storage/keyvalue/BaseKeyValueStorage.js.map +1 -0
- package/dist/storage/keyvalue/BaseKeyValueStorage.jsonld +177 -0
- package/dist/storage/keyvalue/PostgresKeyValueStorage.d.ts +9 -18
- package/dist/storage/keyvalue/PostgresKeyValueStorage.js +24 -96
- package/dist/storage/keyvalue/PostgresKeyValueStorage.js.map +1 -1
- package/dist/storage/keyvalue/PostgresKeyValueStorage.jsonld +15 -58
- package/dist/storage/keyvalue/SqliteKeyValueStorage.d.ts +9 -15
- package/dist/storage/keyvalue/SqliteKeyValueStorage.js +36 -104
- package/dist/storage/keyvalue/SqliteKeyValueStorage.js.map +1 -1
- package/dist/storage/keyvalue/SqliteKeyValueStorage.jsonld +21 -52
- package/dist/storage/quint/BaseQuintStore.d.ts +4 -1
- package/dist/storage/quint/BaseQuintStore.js +41 -52
- package/dist/storage/quint/BaseQuintStore.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.d.ts +4 -3
- package/dist/storage/quint/PgQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.d.ts +43 -54
- package/dist/storage/quint/SqliteQuintStore.js +197 -520
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.jsonld +38 -86
- package/dist/storage/rdf/PostgresRdfEngine.d.ts +118 -0
- package/dist/storage/rdf/PostgresRdfEngine.js +2609 -0
- package/dist/storage/rdf/PostgresRdfEngine.js.map +1 -0
- package/dist/storage/rdf/PostgresRdfEngine.jsonld +657 -0
- package/dist/storage/rdf/SolidRdfEngine.d.ts +2 -2
- package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
- package/dist/storage/rdf/SolidRdfEngine.jsonld +3 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +3 -3
- package/dist/storage/rdf/SolidRdfSparqlEngine.js +20 -20
- package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -1
- package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +1 -1
- package/dist/storage/rdf/index.d.ts +2 -1
- package/dist/storage/rdf/index.js +3 -1
- package/dist/storage/rdf/index.js.map +1 -1
- package/dist/storage/rdf/types.d.ts +19 -0
- package/dist/storage/rdf/types.js.map +1 -1
- package/dist/storage/rdf/types.jsonld +115 -0
- package/package.json +2 -2
- package/config/runtime-open.json +0 -22
- package/dist/authorization/AuthModeSelector.d.ts +0 -10
- package/dist/authorization/AuthModeSelector.js +0 -27
- package/dist/authorization/AuthModeSelector.js.map +0 -1
- package/dist/authorization/AuthModeSelector.jsonld +0 -81
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SqliteKeyValueStorage = void 0;
|
|
4
|
-
const global_logger_factory_1 = require("global-logger-factory");
|
|
5
4
|
const SqliteRuntime_1 = require("../SqliteRuntime");
|
|
6
|
-
|
|
7
|
-
if (!/^[A-Za-z0-9_]+$/u.test(name)) {
|
|
8
|
-
throw new Error(`Invalid identifier: "${name}". Only alphanumeric and underscore are allowed.`);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
5
|
+
const BaseKeyValueStorage_1 = require("./BaseKeyValueStorage");
|
|
11
6
|
function parseSqlitePath(path) {
|
|
12
|
-
// Handle sqlite: prefix (e.g., "sqlite:./data/identity.sqlite")
|
|
13
7
|
if (path.startsWith('sqlite:')) {
|
|
14
8
|
return path.slice(7);
|
|
15
9
|
}
|
|
@@ -19,87 +13,43 @@ function parseSqlitePath(path) {
|
|
|
19
13
|
* SQLite-backed KeyValueStorage for local deployments.
|
|
20
14
|
* Stores internal CSS data (OIDC tokens, migration status, etc.) in SQLite.
|
|
21
15
|
*/
|
|
22
|
-
class SqliteKeyValueStorage {
|
|
16
|
+
class SqliteKeyValueStorage extends BaseKeyValueStorage_1.BaseKeyValueStorage {
|
|
23
17
|
constructor(options) {
|
|
24
|
-
|
|
18
|
+
super(options);
|
|
25
19
|
this.db = null;
|
|
26
20
|
this.sqliteRuntime = (0, SqliteRuntime_1.getSqliteRuntime)();
|
|
27
21
|
this.path = parseSqlitePath(options.path);
|
|
28
|
-
this.
|
|
29
|
-
this.namespace = options.namespace ?? '';
|
|
30
|
-
assertIdentifier(this.tableName);
|
|
22
|
+
this.setReady(this.ensureDatabase());
|
|
31
23
|
}
|
|
32
|
-
async
|
|
33
|
-
if (this.db)
|
|
34
|
-
return;
|
|
35
|
-
this.db = this.createDatabase();
|
|
36
|
-
}
|
|
37
|
-
async finalize() {
|
|
24
|
+
async closeStorage() {
|
|
38
25
|
if (this.db) {
|
|
39
26
|
this.db.close();
|
|
40
27
|
this.db = null;
|
|
41
28
|
}
|
|
42
29
|
}
|
|
43
|
-
|
|
44
|
-
if (!this.db) {
|
|
45
|
-
this.db = this.createDatabase();
|
|
46
|
-
}
|
|
47
|
-
return this.db;
|
|
48
|
-
}
|
|
49
|
-
createDatabase() {
|
|
50
|
-
const db = this.sqliteRuntime.openDatabase(this.path);
|
|
51
|
-
db.pragma('journal_mode = WAL');
|
|
52
|
-
db.exec(`
|
|
53
|
-
CREATE TABLE IF NOT EXISTS ${this.tableName} (
|
|
54
|
-
key TEXT PRIMARY KEY,
|
|
55
|
-
value TEXT NOT NULL,
|
|
56
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
57
|
-
)
|
|
58
|
-
`);
|
|
59
|
-
this.logger.info(`SqliteKeyValueStorage initialized: ${this.path}`);
|
|
60
|
-
return db;
|
|
61
|
-
}
|
|
62
|
-
async has(key) {
|
|
63
|
-
const storageKey = this.toStorageKey(key);
|
|
30
|
+
async hasValue(key) {
|
|
64
31
|
const stmt = this.getDb().prepare(`SELECT 1 FROM ${this.tableName} WHERE key = ? LIMIT 1`);
|
|
65
|
-
|
|
66
|
-
return result !== undefined;
|
|
32
|
+
return stmt.get(key) !== undefined;
|
|
67
33
|
}
|
|
68
|
-
async
|
|
69
|
-
const storageKey = this.toStorageKey(key);
|
|
34
|
+
async selectValue(key) {
|
|
70
35
|
const stmt = this.getDb().prepare(`SELECT value FROM ${this.tableName} WHERE key = ? LIMIT 1`);
|
|
71
|
-
const result = stmt.get(
|
|
72
|
-
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
return this.parseValue(result.value);
|
|
36
|
+
const result = stmt.get(key);
|
|
37
|
+
return result?.value;
|
|
76
38
|
}
|
|
77
|
-
async
|
|
78
|
-
const storageKey = this.toStorageKey(key);
|
|
79
|
-
let payload;
|
|
80
|
-
try {
|
|
81
|
-
payload = this.validateAndSerialize(value, key);
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
this.logger.error(`Failed to serialize value for key "${key}": ${error}`);
|
|
85
|
-
throw error;
|
|
86
|
-
}
|
|
39
|
+
async upsertValue(key, payload) {
|
|
87
40
|
const stmt = this.getDb().prepare(`
|
|
88
41
|
INSERT INTO ${this.tableName} (key, value, updated_at)
|
|
89
42
|
VALUES (?, ?, datetime('now'))
|
|
90
43
|
ON CONFLICT (key) DO UPDATE SET value = excluded.value, updated_at = datetime('now')
|
|
91
44
|
`);
|
|
92
|
-
stmt.run(
|
|
93
|
-
return this;
|
|
45
|
+
stmt.run(key, payload);
|
|
94
46
|
}
|
|
95
|
-
async
|
|
96
|
-
const storageKey = this.toStorageKey(key);
|
|
47
|
+
async deleteValue(key) {
|
|
97
48
|
const stmt = this.getDb().prepare(`DELETE FROM ${this.tableName} WHERE key = ?`);
|
|
98
|
-
const result = stmt.run(
|
|
49
|
+
const result = stmt.run(key);
|
|
99
50
|
return result.changes > 0;
|
|
100
51
|
}
|
|
101
|
-
async
|
|
102
|
-
const prefix = this.namespace;
|
|
52
|
+
async selectEntries(prefix) {
|
|
103
53
|
const query = prefix.length > 0
|
|
104
54
|
? `SELECT key, value FROM ${this.tableName} WHERE key LIKE ?`
|
|
105
55
|
: `SELECT key, value FROM ${this.tableName}`;
|
|
@@ -107,49 +57,31 @@ class SqliteKeyValueStorage {
|
|
|
107
57
|
const rows = prefix.length > 0
|
|
108
58
|
? stmt.all(`${prefix}%`)
|
|
109
59
|
: stmt.all();
|
|
110
|
-
|
|
111
|
-
if (!row.key.startsWith(prefix)) {
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
const logicalKey = row.key.slice(prefix.length);
|
|
115
|
-
const value = this.parseValue(row.value);
|
|
116
|
-
if (typeof value === 'undefined') {
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
yield [logicalKey, value];
|
|
120
|
-
}
|
|
60
|
+
return rows;
|
|
121
61
|
}
|
|
122
|
-
|
|
123
|
-
|
|
62
|
+
async ensureDatabase() {
|
|
63
|
+
if (this.db)
|
|
64
|
+
return;
|
|
65
|
+
this.db = this.createDatabase();
|
|
124
66
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (payload === 'undefined') {
|
|
129
|
-
throw new Error(`Cannot serialize undefined value`);
|
|
130
|
-
}
|
|
131
|
-
// Validate JSON can be parsed back
|
|
132
|
-
JSON.parse(payload);
|
|
133
|
-
return payload;
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
this.logger.error(`JSON serialization failed for key "${key}": ${error}`);
|
|
137
|
-
throw new Error(`JSON serialization failed for key "${key}": ${error}`);
|
|
67
|
+
getDb() {
|
|
68
|
+
if (!this.db) {
|
|
69
|
+
this.db = this.createDatabase();
|
|
138
70
|
}
|
|
71
|
+
return this.db;
|
|
139
72
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
73
|
+
createDatabase() {
|
|
74
|
+
const db = this.sqliteRuntime.openDatabase(this.path);
|
|
75
|
+
db.pragma('journal_mode = WAL');
|
|
76
|
+
db.exec(`
|
|
77
|
+
CREATE TABLE IF NOT EXISTS ${this.tableName} (
|
|
78
|
+
key TEXT PRIMARY KEY,
|
|
79
|
+
value TEXT NOT NULL,
|
|
80
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
81
|
+
)
|
|
82
|
+
`);
|
|
83
|
+
this.logger.info(`SqliteKeyValueStorage initialized: ${this.path}`);
|
|
84
|
+
return db;
|
|
153
85
|
}
|
|
154
86
|
}
|
|
155
87
|
exports.SqliteKeyValueStorage = SqliteKeyValueStorage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteKeyValueStorage.js","sourceRoot":"","sources":["../../../src/storage/keyvalue/SqliteKeyValueStorage.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Finalizable,\n Initializable,\n KeyValueStorage,\n} from '@solid/community-server';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { getSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\n\nexport interface SqliteKeyValueStorageOptions {\n /** Path to SQLite database file (can be prefixed with sqlite:) */\n path: string;\n tableName?: string;\n namespace?: string;\n}\n\nfunction assertIdentifier(name: string): void {\n if (!/^[A-Za-z0-9_]+$/u.test(name)) {\n throw new Error(`Invalid identifier: \"${name}\". Only alphanumeric and underscore are allowed.`);\n }\n}\n\nfunction parseSqlitePath(path: string): string {\n // Handle sqlite: prefix (e.g., \"sqlite:./data/identity.sqlite\")\n if (path.startsWith('sqlite:')) {\n return path.slice(7);\n }\n return path;\n}\n\n/**\n * SQLite-backed KeyValueStorage for local deployments.\n * Stores internal CSS data (OIDC tokens, migration status, etc.) in SQLite.\n */\nexport class SqliteKeyValueStorage<T = unknown> implements\n KeyValueStorage<string, T>,\n Initializable,\n Finalizable {\n protected readonly logger = getLoggerFor(this);\n private db: SqliteDatabase | null = null;\n private readonly path: string;\n private readonly tableName: string;\n private readonly namespace: string;\n private readonly sqliteRuntime = getSqliteRuntime();\n\n public constructor(options: SqliteKeyValueStorageOptions) {\n this.path = parseSqlitePath(options.path);\n this.tableName = options.tableName ?? 'internal_kv';\n this.namespace = options.namespace ?? '';\n assertIdentifier(this.tableName);\n }\n\n public async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = this.createDatabase();\n }\n\n public async finalize(): Promise<void> {\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n }\n\n private getDb(): SqliteDatabase {\n if (!this.db) {\n this.db = this.createDatabase();\n }\n return this.db;\n }\n\n private createDatabase(): SqliteDatabase {\n const db = this.sqliteRuntime.openDatabase(this.path);\n db.pragma('journal_mode = WAL');\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.tableName} (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n )\n `);\n\n this.logger.info(`SqliteKeyValueStorage initialized: ${this.path}`);\n return db;\n }\n\n public async has(key: string): Promise<boolean> {\n const storageKey = this.toStorageKey(key);\n const stmt = this.getDb().prepare(\n `SELECT 1 FROM ${this.tableName} WHERE key = ? LIMIT 1`\n );\n const result = stmt.get(storageKey);\n return result !== undefined;\n }\n\n public async get(key: string): Promise<T | undefined> {\n const storageKey = this.toStorageKey(key);\n const stmt = this.getDb().prepare(\n `SELECT value FROM ${this.tableName} WHERE key = ? LIMIT 1`\n );\n const result = stmt.get(storageKey) as { value: string } | undefined;\n if (!result) {\n return undefined;\n }\n return this.parseValue(result.value);\n }\n\n public async set(key: string, value: T): Promise<this> {\n const storageKey = this.toStorageKey(key);\n\n let payload: string;\n try {\n payload = this.validateAndSerialize(value, key);\n } catch (error: unknown) {\n this.logger.error(`Failed to serialize value for key \"${key}\": ${error}`);\n throw error;\n }\n\n const stmt = this.getDb().prepare(`\n INSERT INTO ${this.tableName} (key, value, updated_at)\n VALUES (?, ?, datetime('now'))\n ON CONFLICT (key) DO UPDATE SET value = excluded.value, updated_at = datetime('now')\n `);\n stmt.run(storageKey, payload);\n return this;\n }\n\n public async delete(key: string): Promise<boolean> {\n const storageKey = this.toStorageKey(key);\n const stmt = this.getDb().prepare(\n `DELETE FROM ${this.tableName} WHERE key = ?`\n );\n const result = stmt.run(storageKey);\n return result.changes > 0;\n }\n\n public async *entries(): AsyncIterableIterator<[string, T]> {\n const prefix = this.namespace;\n const query = prefix.length > 0\n ? `SELECT key, value FROM ${this.tableName} WHERE key LIKE ?`\n : `SELECT key, value FROM ${this.tableName}`;\n\n const stmt = this.getDb().prepare(query);\n const rows = prefix.length > 0\n ? stmt.all(`${prefix}%`) as { key: string; value: string }[]\n : stmt.all() as { key: string; value: string }[];\n\n for (const row of rows) {\n if (!row.key.startsWith(prefix)) {\n continue;\n }\n const logicalKey = row.key.slice(prefix.length);\n const value = this.parseValue(row.value);\n if (typeof value === 'undefined') {\n continue;\n }\n yield [logicalKey, value];\n }\n }\n\n protected toStorageKey(key: string): string {\n return `${this.namespace}${key}`;\n }\n\n protected validateAndSerialize(value: T, key: string): string {\n try {\n const payload = JSON.stringify(value ?? null);\n\n if (payload === 'undefined') {\n throw new Error(`Cannot serialize undefined value`);\n }\n\n // Validate JSON can be parsed back\n JSON.parse(payload);\n\n return payload;\n } catch (error: unknown) {\n this.logger.error(`JSON serialization failed for key \"${key}\": ${error}`);\n throw new Error(`JSON serialization failed for key \"${key}\": ${error}`);\n }\n }\n\n protected parseValue(raw: string): T | undefined {\n try {\n const parsed = JSON.parse(raw);\n\n // Handle CSS internal storage format: {\"key\": \"...\", \"payload\": ...}\n if (parsed && typeof parsed === 'object' && 'key' in parsed && 'payload' in parsed) {\n return parsed.payload as T;\n }\n\n return parsed as T;\n } catch (error: unknown) {\n this.logger.error(`Failed to parse stored value: ${error}. Raw value: ${raw}`);\n return undefined;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SqliteKeyValueStorage.js","sourceRoot":"","sources":["../../../src/storage/keyvalue/SqliteKeyValueStorage.ts"],"names":[],"mappings":"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","sourcesContent":["import { getSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport { BaseKeyValueStorage, type BaseKeyValueStorageRow } from './BaseKeyValueStorage';\n\nexport interface SqliteKeyValueStorageOptions {\n /** Path to SQLite database file (can be prefixed with sqlite:) */\n path: string;\n tableName?: string;\n namespace?: string;\n}\n\nfunction parseSqlitePath(path: string): string {\n if (path.startsWith('sqlite:')) {\n return path.slice(7);\n }\n return path;\n}\n\n/**\n * SQLite-backed KeyValueStorage for local deployments.\n * Stores internal CSS data (OIDC tokens, migration status, etc.) in SQLite.\n */\nexport class SqliteKeyValueStorage<T = unknown> extends BaseKeyValueStorage<T> {\n private db: SqliteDatabase | null = null;\n private readonly path: string;\n private readonly sqliteRuntime = getSqliteRuntime();\n\n public constructor(options: SqliteKeyValueStorageOptions) {\n super(options);\n this.path = parseSqlitePath(options.path);\n this.setReady(this.ensureDatabase());\n }\n\n protected async closeStorage(): Promise<void> {\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n }\n\n protected async hasValue(key: string): Promise<boolean> {\n const stmt = this.getDb().prepare(\n `SELECT 1 FROM ${this.tableName} WHERE key = ? LIMIT 1`,\n );\n return stmt.get(key) !== undefined;\n }\n\n protected async selectValue(key: string): Promise<unknown | undefined> {\n const stmt = this.getDb().prepare(\n `SELECT value FROM ${this.tableName} WHERE key = ? LIMIT 1`,\n );\n const result = stmt.get(key) as { value: unknown } | undefined;\n return result?.value;\n }\n\n protected async upsertValue(key: string, payload: string): Promise<void> {\n const stmt = this.getDb().prepare(`\n INSERT INTO ${this.tableName} (key, value, updated_at)\n VALUES (?, ?, datetime('now'))\n ON CONFLICT (key) DO UPDATE SET value = excluded.value, updated_at = datetime('now')\n `);\n stmt.run(key, payload);\n }\n\n protected async deleteValue(key: string): Promise<boolean> {\n const stmt = this.getDb().prepare(\n `DELETE FROM ${this.tableName} WHERE key = ?`,\n );\n const result = stmt.run(key);\n return result.changes > 0;\n }\n\n protected async selectEntries(prefix: string): Promise<BaseKeyValueStorageRow[]> {\n const query = prefix.length > 0\n ? `SELECT key, value FROM ${this.tableName} WHERE key LIKE ?`\n : `SELECT key, value FROM ${this.tableName}`;\n\n const stmt = this.getDb().prepare(query);\n const rows = prefix.length > 0\n ? stmt.all(`${prefix}%`) as BaseKeyValueStorageRow[]\n : stmt.all() as BaseKeyValueStorageRow[];\n return rows;\n }\n\n private async ensureDatabase(): Promise<void> {\n if (this.db) return;\n this.db = this.createDatabase();\n }\n\n private getDb(): SqliteDatabase {\n if (!this.db) {\n this.db = this.createDatabase();\n }\n return this.db;\n }\n\n private createDatabase(): SqliteDatabase {\n const db = this.sqliteRuntime.openDatabase(this.path);\n db.pragma('journal_mode = WAL');\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.tableName} (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n )\n `);\n\n this.logger.info(`SqliteKeyValueStorage initialized: ${this.path}`);\n return db;\n }\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"@context": [
|
|
3
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld"
|
|
4
|
-
"https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld"
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld"
|
|
5
4
|
],
|
|
6
5
|
"@id": "npmd:@undefineds.co/xpod",
|
|
7
6
|
"components": [
|
|
@@ -12,17 +11,14 @@
|
|
|
12
11
|
"extends": [
|
|
13
12
|
{
|
|
14
13
|
"@type": "GenericComponentExtension",
|
|
15
|
-
"component": "
|
|
14
|
+
"component": "undefineds:dist/storage/keyvalue/BaseKeyValueStorage.jsonld#BaseKeyValueStorage",
|
|
16
15
|
"genericTypeInstances": [
|
|
17
|
-
"xsd:string",
|
|
18
16
|
{
|
|
19
17
|
"@type": "ParameterRangeGenericTypeReference",
|
|
20
18
|
"parameterRangeGenericType": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__generic_T"
|
|
21
19
|
}
|
|
22
20
|
]
|
|
23
|
-
}
|
|
24
|
-
"css:dist/init/Initializable.jsonld#Initializable",
|
|
25
|
-
"css:dist/init/final/Finalizable.jsonld#Finalizable"
|
|
21
|
+
}
|
|
26
22
|
],
|
|
27
23
|
"comment": "SQLite-backed KeyValueStorage for local deployments. Stores internal CSS data (OIDC tokens, migration status, etc.) in SQLite.",
|
|
28
24
|
"genericTypeParameters": [
|
|
@@ -65,13 +61,6 @@
|
|
|
65
61
|
}
|
|
66
62
|
],
|
|
67
63
|
"memberFields": [
|
|
68
|
-
{
|
|
69
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_logger",
|
|
70
|
-
"memberFieldName": "logger",
|
|
71
|
-
"range": {
|
|
72
|
-
"@type": "ParameterRangeWildcard"
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
64
|
{
|
|
76
65
|
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_db",
|
|
77
66
|
"memberFieldName": "db"
|
|
@@ -80,14 +69,6 @@
|
|
|
80
69
|
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_path",
|
|
81
70
|
"memberFieldName": "path"
|
|
82
71
|
},
|
|
83
|
-
{
|
|
84
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_tableName",
|
|
85
|
-
"memberFieldName": "tableName"
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_namespace",
|
|
89
|
-
"memberFieldName": "namespace"
|
|
90
|
-
},
|
|
91
72
|
{
|
|
92
73
|
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_sqliteRuntime",
|
|
93
74
|
"memberFieldName": "sqliteRuntime"
|
|
@@ -97,52 +78,40 @@
|
|
|
97
78
|
"memberFieldName": "constructor"
|
|
98
79
|
},
|
|
99
80
|
{
|
|
100
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
101
|
-
"memberFieldName": "
|
|
81
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_closeStorage",
|
|
82
|
+
"memberFieldName": "closeStorage"
|
|
102
83
|
},
|
|
103
84
|
{
|
|
104
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
105
|
-
"memberFieldName": "
|
|
85
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_hasValue",
|
|
86
|
+
"memberFieldName": "hasValue"
|
|
106
87
|
},
|
|
107
88
|
{
|
|
108
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
109
|
-
"memberFieldName": "
|
|
89
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_selectValue",
|
|
90
|
+
"memberFieldName": "selectValue"
|
|
110
91
|
},
|
|
111
92
|
{
|
|
112
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
113
|
-
"memberFieldName": "
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_has",
|
|
117
|
-
"memberFieldName": "has"
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_get",
|
|
121
|
-
"memberFieldName": "get"
|
|
93
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_upsertValue",
|
|
94
|
+
"memberFieldName": "upsertValue"
|
|
122
95
|
},
|
|
123
96
|
{
|
|
124
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
125
|
-
"memberFieldName": "
|
|
97
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_deleteValue",
|
|
98
|
+
"memberFieldName": "deleteValue"
|
|
126
99
|
},
|
|
127
100
|
{
|
|
128
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
129
|
-
"memberFieldName": "
|
|
101
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_selectEntries",
|
|
102
|
+
"memberFieldName": "selectEntries"
|
|
130
103
|
},
|
|
131
104
|
{
|
|
132
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
133
|
-
"memberFieldName": "
|
|
105
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_ensureDatabase",
|
|
106
|
+
"memberFieldName": "ensureDatabase"
|
|
134
107
|
},
|
|
135
108
|
{
|
|
136
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
137
|
-
"memberFieldName": "
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_validateAndSerialize",
|
|
141
|
-
"memberFieldName": "validateAndSerialize"
|
|
109
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_getDb",
|
|
110
|
+
"memberFieldName": "getDb"
|
|
142
111
|
},
|
|
143
112
|
{
|
|
144
|
-
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#
|
|
145
|
-
"memberFieldName": "
|
|
113
|
+
"@id": "undefineds:dist/storage/keyvalue/SqliteKeyValueStorage.jsonld#SqliteKeyValueStorage__member_createDatabase",
|
|
114
|
+
"memberFieldName": "createDatabase"
|
|
146
115
|
}
|
|
147
116
|
],
|
|
148
117
|
"constructorArguments": [
|
|
@@ -76,8 +76,11 @@ export declare abstract class BaseQuintStore extends QuintStore {
|
|
|
76
76
|
sql: string;
|
|
77
77
|
params: any[];
|
|
78
78
|
};
|
|
79
|
-
protected addAliasedConditions(conditions: string[], params: any[], alias: string, pattern: QuintPattern): void;
|
|
80
79
|
protected quintToRow(quint: Quint): QuintRow;
|
|
81
80
|
protected rowToQuint(row: QuintRow): Quint;
|
|
82
81
|
protected deserializeObject(value: string): Term;
|
|
82
|
+
protected resolveObjectDataTypeForPattern(_pattern: QuintPattern): string | undefined;
|
|
83
|
+
protected extractExactPredicate(match: TermMatch | undefined): string | undefined;
|
|
84
|
+
protected addTermConditions(conditions: string[], params: any[], column: string, match: TermMatch | undefined, isObject: boolean): void;
|
|
85
|
+
protected addAliasedConditions(conditions: string[], params: any[], alias: string, pattern: QuintPattern): void;
|
|
83
86
|
}
|
|
@@ -94,14 +94,9 @@ class BaseQuintStore extends types_1.QuintStore {
|
|
|
94
94
|
// Query Operations
|
|
95
95
|
// ============================================
|
|
96
96
|
async get(pattern, options) {
|
|
97
|
-
const patternDesc = Object.entries(pattern).map(([k, v]) => `${k}=${v ? 'set' : 'any'}`).join(',');
|
|
98
|
-
console.log(`[BaseQuintStore.get] Starting: ${patternDesc}`);
|
|
99
97
|
this.ensureOpen();
|
|
100
98
|
const { sql, params } = this.buildSelectQuery(pattern, options);
|
|
101
|
-
console.log(`[BaseQuintStore.get] SQL: ${sql.slice(0, 80)}...`);
|
|
102
|
-
const start = Date.now();
|
|
103
99
|
const rows = await this.executor.query(sql, params);
|
|
104
|
-
console.log(`[BaseQuintStore.get] Completed in ${Date.now() - start}ms, got ${rows.length} rows`);
|
|
105
100
|
return rows.map(row => this.rowToQuint(row));
|
|
106
101
|
}
|
|
107
102
|
match(subject, predicate, object, graph) {
|
|
@@ -466,6 +461,47 @@ class BaseQuintStore extends types_1.QuintStore {
|
|
|
466
461
|
}
|
|
467
462
|
return { sql, params };
|
|
468
463
|
}
|
|
464
|
+
// ============================================
|
|
465
|
+
// Serialization Helpers
|
|
466
|
+
// ============================================
|
|
467
|
+
quintToRow(quint) {
|
|
468
|
+
return {
|
|
469
|
+
graph: (0, serialization_1.termToId)(quint.graph),
|
|
470
|
+
subject: (0, serialization_1.termToId)(quint.subject),
|
|
471
|
+
predicate: (0, serialization_1.termToId)(quint.predicate),
|
|
472
|
+
object: (0, serialization_1.serializeObject)(quint.object),
|
|
473
|
+
vector: quint.vector ? JSON.stringify(quint.vector) : null,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
rowToQuint(row) {
|
|
477
|
+
const quad = (0, serialization_1.rowToQuad)(row);
|
|
478
|
+
const quint = quad;
|
|
479
|
+
if (row.vector) {
|
|
480
|
+
quint.vector = (0, serialization_1.parseVector)(row.vector);
|
|
481
|
+
}
|
|
482
|
+
return quint;
|
|
483
|
+
}
|
|
484
|
+
deserializeObject(value) {
|
|
485
|
+
return (0, serialization_1.deserializeObject)(value);
|
|
486
|
+
}
|
|
487
|
+
resolveObjectDataTypeForPattern(_pattern) {
|
|
488
|
+
return undefined;
|
|
489
|
+
}
|
|
490
|
+
extractExactPredicate(match) {
|
|
491
|
+
if (!match)
|
|
492
|
+
return undefined;
|
|
493
|
+
if (typeof match === 'object' && 'termType' in match) {
|
|
494
|
+
return (0, serialization_1.termToId)(match);
|
|
495
|
+
}
|
|
496
|
+
const ops = match;
|
|
497
|
+
if (ops.$eq !== undefined) {
|
|
498
|
+
return String(this.serializeOpValue(ops.$eq, false, '$eq'));
|
|
499
|
+
}
|
|
500
|
+
return undefined;
|
|
501
|
+
}
|
|
502
|
+
addTermConditions(conditions, params, column, match, isObject) {
|
|
503
|
+
this.addConditions(conditions, params, column, match, isObject);
|
|
504
|
+
}
|
|
469
505
|
addAliasedConditions(conditions, params, alias, pattern) {
|
|
470
506
|
const addCond = (col, match, isObject) => {
|
|
471
507
|
if (!match)
|
|
@@ -507,53 +543,6 @@ class BaseQuintStore extends types_1.QuintStore {
|
|
|
507
543
|
addCond('predicate', pattern.predicate, false);
|
|
508
544
|
addCond('object', pattern.object, true);
|
|
509
545
|
}
|
|
510
|
-
// ============================================
|
|
511
|
-
// Serialization Helpers
|
|
512
|
-
// ============================================
|
|
513
|
-
quintToRow(quint) {
|
|
514
|
-
return {
|
|
515
|
-
graph: (0, serialization_1.termToId)(quint.graph),
|
|
516
|
-
subject: (0, serialization_1.termToId)(quint.subject),
|
|
517
|
-
predicate: (0, serialization_1.termToId)(quint.predicate),
|
|
518
|
-
object: (0, serialization_1.serializeObject)(quint.object),
|
|
519
|
-
vector: quint.vector ? JSON.stringify(quint.vector) : null,
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
rowToQuint(row) {
|
|
523
|
-
const quad = (0, serialization_1.rowToQuad)(row);
|
|
524
|
-
const quint = quad;
|
|
525
|
-
if (row.vector) {
|
|
526
|
-
quint.vector = (0, serialization_1.parseVector)(row.vector);
|
|
527
|
-
}
|
|
528
|
-
return quint;
|
|
529
|
-
}
|
|
530
|
-
deserializeObject(value) {
|
|
531
|
-
if (value.startsWith('"')) {
|
|
532
|
-
const match = value.match(/^"([^"]*)"(?:@([a-zA-Z-]+)|\^\^<([^>]+)>)?$/);
|
|
533
|
-
if (match) {
|
|
534
|
-
const [, lexical, lang, datatype] = match;
|
|
535
|
-
if (lang) {
|
|
536
|
-
return n3_1.DataFactory.literal(lexical, lang);
|
|
537
|
-
}
|
|
538
|
-
if (datatype) {
|
|
539
|
-
return n3_1.DataFactory.literal(lexical, n3_1.DataFactory.namedNode(datatype));
|
|
540
|
-
}
|
|
541
|
-
return n3_1.DataFactory.literal(lexical);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
if (value.startsWith('N\u0000')) {
|
|
545
|
-
const parts = value.split('\u0000');
|
|
546
|
-
const datatype = parts[2];
|
|
547
|
-
const originalValue = parts[3];
|
|
548
|
-
return n3_1.DataFactory.literal(originalValue, n3_1.DataFactory.namedNode(datatype));
|
|
549
|
-
}
|
|
550
|
-
if (value.startsWith('D\u0000')) {
|
|
551
|
-
const parts = value.split('\u0000');
|
|
552
|
-
const originalValue = parts[2];
|
|
553
|
-
return n3_1.DataFactory.literal(originalValue, n3_1.DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#dateTime'));
|
|
554
|
-
}
|
|
555
|
-
return n3_1.DataFactory.namedNode(value);
|
|
556
|
-
}
|
|
557
546
|
}
|
|
558
547
|
exports.BaseQuintStore = BaseQuintStore;
|
|
559
548
|
//# sourceMappingURL=BaseQuintStore.js.map
|