@hatk/hatk 0.0.1-alpha.43 → 0.0.1-alpha.44
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/cli.js +3 -19
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +18 -18
- package/dist/database/fts.js +6 -6
- package/dist/database/schema.d.ts +1 -0
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +10 -6
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { mkdirSync, writeFileSync, existsSync, unlinkSync, readdirSync, readFileSync, cpSync } from 'node:fs';
|
|
3
|
-
import { resolve, join
|
|
3
|
+
import { resolve, join } from 'node:path';
|
|
4
4
|
import { execSync, spawn } from 'node:child_process';
|
|
5
|
-
import { loadLexicons
|
|
5
|
+
import { loadLexicons } from "./database/schema.js";
|
|
6
6
|
import { loadConfig } from "./config.js";
|
|
7
7
|
const args = process.argv.slice(2);
|
|
8
8
|
const command = args[0];
|
|
@@ -77,7 +77,6 @@ function usage() {
|
|
|
77
77
|
dev Start PDS, seed, and run hatk
|
|
78
78
|
seed Seed local PDS with fixture data
|
|
79
79
|
reset Reset database and PDS for a clean slate
|
|
80
|
-
schema Show database schema from lexicons
|
|
81
80
|
|
|
82
81
|
Code Quality
|
|
83
82
|
check Type-check and lint the project
|
|
@@ -1059,6 +1058,7 @@ else if (command === 'generate') {
|
|
|
1059
1058
|
clientOut += ` const blob = arg as Blob | ArrayBuffer\n`;
|
|
1060
1059
|
clientOut += ` const ct = blob instanceof Blob ? blob.type : 'application/octet-stream'\n`;
|
|
1061
1060
|
clientOut += ` const res = await _fetch(path, { method: 'POST', headers: { 'Content-Type': ct }, body: blob })\n`;
|
|
1061
|
+
clientOut += ` if (typeof window !== 'undefined' && res.status === 401) { const _b = await res.json().catch(() => ({})); const _h = _b.handle ?? getViewer()?.handle; window.location.href = _h ? \`/oauth/login?handle=\${encodeURIComponent(_h)}\` : '/oauth/login'; return new Promise(() => {}) as any }\n`;
|
|
1062
1062
|
clientOut += ` if (!res.ok) throw new Error(\`XRPC \${nsid} failed: \${res.status}\`)\n`;
|
|
1063
1063
|
clientOut += ` return res.json() as Promise<OutputOf<K>>\n`;
|
|
1064
1064
|
clientOut += ` }\n`;
|
|
@@ -1395,22 +1395,6 @@ else if (command === 'resolve') {
|
|
|
1395
1395
|
console.log(`\nResolved ${resolved.size} lexicon(s). Regenerating types...`);
|
|
1396
1396
|
execSync('npx hatk generate types', { stdio: 'inherit', cwd: process.cwd() });
|
|
1397
1397
|
}
|
|
1398
|
-
else if (command === 'schema') {
|
|
1399
|
-
const config = await loadConfig(resolve('hatk.config.ts'));
|
|
1400
|
-
const { initDatabase, getSchemaDump } = await import("./database/db.js");
|
|
1401
|
-
const { createAdapter } = await import("./database/adapter-factory.js");
|
|
1402
|
-
const { getDialect } = await import("./database/dialect.js");
|
|
1403
|
-
const configDir2 = resolve('.');
|
|
1404
|
-
const lexicons2 = loadLexicons(resolve(configDir2, 'lexicons'));
|
|
1405
|
-
const collections2 = config.collections.length > 0 ? config.collections : discoverCollections(lexicons2);
|
|
1406
|
-
const { schemas: schemas2, ddlStatements: ddl2 } = buildSchemas(lexicons2, collections2, getDialect(config.databaseEngine));
|
|
1407
|
-
if (config.database !== ':memory:') {
|
|
1408
|
-
mkdirSync(dirname(config.database), { recursive: true });
|
|
1409
|
-
}
|
|
1410
|
-
const { adapter: adapter2 } = await createAdapter(config.databaseEngine);
|
|
1411
|
-
await initDatabase(adapter2, config.database, schemas2, ddl2);
|
|
1412
|
-
console.log(await getSchemaDump());
|
|
1413
|
-
}
|
|
1414
1398
|
else if (command === 'start') {
|
|
1415
1399
|
const mainPath = resolve(import.meta.dirname, 'main.js');
|
|
1416
1400
|
await spawnForward('npx', ['tsx', mainPath, 'hatk.config.ts']);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"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"}
|
package/dist/database/db.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { toSnakeCase } from "./schema.js";
|
|
1
|
+
import { toSnakeCase, q } from "./schema.js";
|
|
2
2
|
import { getSearchColumns, stripStopWords, getSearchPort, updateFtsRecord, deleteFtsRecord } from "./fts.js";
|
|
3
3
|
import { emit, timer } from "../logger.js";
|
|
4
4
|
import { OAUTH_DDL } from "../oauth/db.js";
|
|
@@ -508,7 +508,7 @@ export function buildInsertOp(collection, uri, cid, authorDid, record) {
|
|
|
508
508
|
else if (col.originalName.endsWith('__cid') && record[col.originalName.replace('__cid', '')]) {
|
|
509
509
|
rawValue = record[col.originalName.replace('__cid', '')].cid;
|
|
510
510
|
}
|
|
511
|
-
colNames.push(col.name);
|
|
511
|
+
colNames.push(q(col.name));
|
|
512
512
|
placeholders.push(`$${paramIdx++}`);
|
|
513
513
|
if (rawValue === undefined || rawValue === null) {
|
|
514
514
|
values.push(null);
|
|
@@ -542,7 +542,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
542
542
|
const values = [uri, authorDid];
|
|
543
543
|
let idx = 3;
|
|
544
544
|
for (const col of child.columns) {
|
|
545
|
-
colNames.push(col.name);
|
|
545
|
+
colNames.push(q(col.name));
|
|
546
546
|
placeholders.push(`$${idx++}`);
|
|
547
547
|
const raw = item[col.originalName];
|
|
548
548
|
if (raw === undefined || raw === null) {
|
|
@@ -581,7 +581,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
581
581
|
const values = [uri, authorDid];
|
|
582
582
|
let idx = 3;
|
|
583
583
|
for (const col of branch.columns) {
|
|
584
|
-
colNames.push(col.name);
|
|
584
|
+
colNames.push(q(col.name));
|
|
585
585
|
placeholders.push(`$${idx++}`);
|
|
586
586
|
const raw = item[col.originalName];
|
|
587
587
|
if (raw === undefined || raw === null) {
|
|
@@ -605,7 +605,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
605
605
|
const values = [uri, authorDid];
|
|
606
606
|
let idx = 3;
|
|
607
607
|
for (const col of branch.columns) {
|
|
608
|
-
colNames.push(col.name);
|
|
608
|
+
colNames.push(q(col.name));
|
|
609
609
|
placeholders.push(`$${idx++}`);
|
|
610
610
|
const raw = branchData[col.originalName];
|
|
611
611
|
if (raw === undefined || raw === null) {
|
|
@@ -704,7 +704,7 @@ export async function bulkInsertRecords(records) {
|
|
|
704
704
|
if (!schema)
|
|
705
705
|
continue;
|
|
706
706
|
const stagingTable = `_staging_${collection.replace(/\./g, '_')}`;
|
|
707
|
-
const allCols = ['uri', 'cid', 'did', 'indexed_at', ...schema.columns.map((c) => c.name)];
|
|
707
|
+
const allCols = ['uri', 'cid', 'did', 'indexed_at', ...schema.columns.map((c) => q(c.name))];
|
|
708
708
|
const colDefs = [
|
|
709
709
|
'uri TEXT',
|
|
710
710
|
'cid TEXT',
|
|
@@ -713,7 +713,7 @@ export async function bulkInsertRecords(records) {
|
|
|
713
713
|
...schema.columns.map((c) => {
|
|
714
714
|
const t = c.sqlType;
|
|
715
715
|
// Use TEXT for timestamp columns in staging (will cast on merge)
|
|
716
|
-
return `${c.name} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
716
|
+
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
717
717
|
}),
|
|
718
718
|
];
|
|
719
719
|
await port.execute(`DROP TABLE IF EXISTS ${stagingTable}`, []);
|
|
@@ -736,7 +736,7 @@ export async function bulkInsertRecords(records) {
|
|
|
736
736
|
await inserter.close();
|
|
737
737
|
// Merge into target, filtering rows that would violate NOT NULL
|
|
738
738
|
const selectCols = allCols.map((name) => {
|
|
739
|
-
const col = schema.columns.find((c) => c.name === name);
|
|
739
|
+
const col = schema.columns.find((c) => q(c.name) === name);
|
|
740
740
|
if (name === 'indexed_at' || (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ'))) {
|
|
741
741
|
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
742
742
|
}
|
|
@@ -746,10 +746,10 @@ export async function bulkInsertRecords(records) {
|
|
|
746
746
|
for (const col of schema.columns) {
|
|
747
747
|
if (col.notNull) {
|
|
748
748
|
if (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ') {
|
|
749
|
-
notNullChecks.push(`${dialect.tryCastTimestamp(col.name)} IS NOT NULL`);
|
|
749
|
+
notNullChecks.push(`${dialect.tryCastTimestamp(q(col.name))} IS NOT NULL`);
|
|
750
750
|
}
|
|
751
751
|
else {
|
|
752
|
-
notNullChecks.push(`${col.name} IS NOT NULL`);
|
|
752
|
+
notNullChecks.push(`${q(col.name)} IS NOT NULL`);
|
|
753
753
|
}
|
|
754
754
|
}
|
|
755
755
|
}
|
|
@@ -764,10 +764,10 @@ export async function bulkInsertRecords(records) {
|
|
|
764
764
|
'parent_did TEXT',
|
|
765
765
|
...child.columns.map((c) => {
|
|
766
766
|
const t = c.sqlType;
|
|
767
|
-
return `${c.name} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
767
|
+
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
768
768
|
}),
|
|
769
769
|
];
|
|
770
|
-
const childAllCols = ['parent_uri', 'parent_did', ...child.columns.map((c) => c.name)];
|
|
770
|
+
const childAllCols = ['parent_uri', 'parent_did', ...child.columns.map((c) => q(c.name))];
|
|
771
771
|
await port.execute(`DROP TABLE IF EXISTS ${childStagingTable}`, []);
|
|
772
772
|
await port.execute(`CREATE TABLE ${childStagingTable} (${childColDefs.join(', ')})`, []);
|
|
773
773
|
const childInserter = await port.createBulkInserter(childStagingTable, childAllCols);
|
|
@@ -793,7 +793,7 @@ export async function bulkInsertRecords(records) {
|
|
|
793
793
|
const uriPlaceholders = recs.map((_, i) => `$${i + 1}`).join(',');
|
|
794
794
|
await port.execute(`DELETE FROM ${child.tableName} WHERE parent_uri IN (${uriPlaceholders})`, recs.map((r) => r.uri));
|
|
795
795
|
const childSelectCols = childAllCols.map((name) => {
|
|
796
|
-
const col = child.columns.find((c) => c.name === name);
|
|
796
|
+
const col = child.columns.find((c) => q(c.name) === name);
|
|
797
797
|
if (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ')) {
|
|
798
798
|
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
799
799
|
}
|
|
@@ -811,10 +811,10 @@ export async function bulkInsertRecords(records) {
|
|
|
811
811
|
'parent_did TEXT',
|
|
812
812
|
...branch.columns.map((c) => {
|
|
813
813
|
const t = c.sqlType;
|
|
814
|
-
return `${c.name} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
814
|
+
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
815
815
|
}),
|
|
816
816
|
];
|
|
817
|
-
const branchAllCols = ['parent_uri', 'parent_did', ...branch.columns.map((c) => c.name)];
|
|
817
|
+
const branchAllCols = ['parent_uri', 'parent_did', ...branch.columns.map((c) => q(c.name))];
|
|
818
818
|
await port.execute(`DROP TABLE IF EXISTS ${branchStagingTable}`, []);
|
|
819
819
|
await port.execute(`CREATE TABLE ${branchStagingTable} (${branchColDefs.join(', ')})`, []);
|
|
820
820
|
const branchInserter = await port.createBulkInserter(branchStagingTable, branchAllCols);
|
|
@@ -860,7 +860,7 @@ export async function bulkInsertRecords(records) {
|
|
|
860
860
|
const uriPlaceholders = recs.map((_, i) => `$${i + 1}`).join(',');
|
|
861
861
|
await port.execute(`DELETE FROM ${branch.tableName} WHERE parent_uri IN (${uriPlaceholders})`, recs.map((r) => r.uri));
|
|
862
862
|
const branchSelectCols = branchAllCols.map((name) => {
|
|
863
|
-
const col = branch.columns.find((c) => c.name === name);
|
|
863
|
+
const col = branch.columns.find((c) => q(c.name) === name);
|
|
864
864
|
if (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ')) {
|
|
865
865
|
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
866
866
|
}
|
|
@@ -1138,14 +1138,14 @@ export async function searchRecords(collection, query, opts = {}) {
|
|
|
1138
1138
|
const remaining = limit - bm25Results.length;
|
|
1139
1139
|
const jwFn = dialect.jaroWinklerSimilarity;
|
|
1140
1140
|
const simExprs = [
|
|
1141
|
-
...textCols.map((c) => `${jwFn}(lower(t.${c.name}), lower($1))`),
|
|
1141
|
+
...textCols.map((c) => `${jwFn}(lower(t.${q(c.name)}), lower($1))`),
|
|
1142
1142
|
`${jwFn}(lower(r.handle), lower($1))`,
|
|
1143
1143
|
];
|
|
1144
1144
|
// Include child table TEXT columns via correlated subquery
|
|
1145
1145
|
for (const child of schema.children) {
|
|
1146
1146
|
for (const col of child.columns) {
|
|
1147
1147
|
if (col.sqlType === 'TEXT') {
|
|
1148
|
-
simExprs.push(`COALESCE((SELECT MAX(${jwFn}(lower(c.${col.name}), lower($1))) FROM ${child.tableName} c WHERE c.parent_uri = t.uri), 0)`);
|
|
1148
|
+
simExprs.push(`COALESCE((SELECT MAX(${jwFn}(lower(c.${q(col.name)}), lower($1))) FROM ${child.tableName} c WHERE c.parent_uri = t.uri), 0)`);
|
|
1149
1149
|
}
|
|
1150
1150
|
}
|
|
1151
1151
|
}
|
package/dist/database/fts.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getSchema, runSQL, getSqlDialect, querySQL } from "./db.js";
|
|
2
|
-
import { getLexicon } from "./schema.js";
|
|
2
|
+
import { getLexicon, q } from "./schema.js";
|
|
3
3
|
import { emit, timer } from "../logger.js";
|
|
4
4
|
/**
|
|
5
5
|
* Resolve a lexicon ref like "#artist" to its definition.
|
|
@@ -103,7 +103,7 @@ function computeFtsSchema(collection) {
|
|
|
103
103
|
const searchColNames = [];
|
|
104
104
|
for (const col of schema.columns) {
|
|
105
105
|
if (col.sqlType === 'TEXT') {
|
|
106
|
-
selectExprs.push(`t.${col.name}`);
|
|
106
|
+
selectExprs.push(`t.${q(col.name)}`);
|
|
107
107
|
searchColNames.push(col.name);
|
|
108
108
|
}
|
|
109
109
|
else if (col.isJson && record?.properties) {
|
|
@@ -111,7 +111,7 @@ function computeFtsSchema(collection) {
|
|
|
111
111
|
if (prop?.type === 'blob')
|
|
112
112
|
continue; // skip blobs
|
|
113
113
|
if (prop && lexicon) {
|
|
114
|
-
const derived = jsonSearchColumns(`t.${col.name}`, prop, lexicon, dialect);
|
|
114
|
+
const derived = jsonSearchColumns(`t.${q(col.name)}`, prop, lexicon, dialect);
|
|
115
115
|
if (derived.length > 0) {
|
|
116
116
|
for (const d of derived) {
|
|
117
117
|
selectExprs.push(`${d.expr} AS ${d.alias}`);
|
|
@@ -121,7 +121,7 @@ function computeFtsSchema(collection) {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
// Fallback: cast JSON to TEXT
|
|
124
|
-
selectExprs.push(`CAST(t.${col.name} AS TEXT) AS ${col.name}`);
|
|
124
|
+
selectExprs.push(`CAST(t.${q(col.name)} AS TEXT) AS ${q(col.name)}`);
|
|
125
125
|
searchColNames.push(col.name);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
@@ -130,7 +130,7 @@ function computeFtsSchema(collection) {
|
|
|
130
130
|
for (const col of child.columns) {
|
|
131
131
|
if (col.sqlType === 'TEXT') {
|
|
132
132
|
const alias = `${child.fieldName}_${col.name}`;
|
|
133
|
-
const agg = dialect.stringAgg(`c.${col.name}`, "' '");
|
|
133
|
+
const agg = dialect.stringAgg(`c.${q(col.name)}`, "' '");
|
|
134
134
|
selectExprs.push(`(SELECT ${agg} FROM ${child.tableName} c WHERE c.parent_uri = t.uri) AS ${alias}`);
|
|
135
135
|
searchColNames.push(alias);
|
|
136
136
|
}
|
|
@@ -142,7 +142,7 @@ function computeFtsSchema(collection) {
|
|
|
142
142
|
for (const col of branch.columns) {
|
|
143
143
|
if (col.sqlType === 'TEXT') {
|
|
144
144
|
const alias = `${union.fieldName}_${branch.branchName}_${col.name}`;
|
|
145
|
-
const agg = dialect.stringAgg(`c.${col.name}`, "' '");
|
|
145
|
+
const agg = dialect.stringAgg(`c.${q(col.name)}`, "' '");
|
|
146
146
|
selectExprs.push(`(SELECT ${agg} FROM ${branch.tableName} c WHERE c.parent_uri = t.uri) AS ${alias}`);
|
|
147
147
|
searchColNames.push(alias);
|
|
148
148
|
}
|
|
@@ -35,6 +35,7 @@ export interface ChildTableSchema {
|
|
|
35
35
|
columns: ColumnDef[];
|
|
36
36
|
}
|
|
37
37
|
export declare function toSnakeCase(str: string): string;
|
|
38
|
+
export declare function q(name: string): string;
|
|
38
39
|
export declare function loadLexicons(lexiconsDir: string): Map<string, any>;
|
|
39
40
|
/**
|
|
40
41
|
* Discover collections by scanning lexicons for record-type definitions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AA+CD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CASlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CASxE;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAI9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAExD;AAED,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC,CAEtE;AAED,iFAAiF;AACjF,wBAAgB,eAAe,IAAI,GAAG,EAAE,CAEvC;AAyHD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,EACZ,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,GAAE,UAA2B,GACnC,WAAW,CA+Gb;AAGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,UAA2B,GAAG,MAAM,CAoExG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,UAA2B,GACnC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BrD"}
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtC;AA+CD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CASlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CASxE;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAI9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAExD;AAED,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC,CAEtE;AAED,iFAAiF;AACjF,wBAAgB,eAAe,IAAI,GAAG,EAAE,CAEvC;AAyHD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,EACZ,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,GAAE,UAA2B,GACnC,WAAW,CA+Gb;AAGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,UAA2B,GAAG,MAAM,CAoExG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,UAA2B,GACnC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BrD"}
|
package/dist/database/schema.js
CHANGED
|
@@ -5,6 +5,10 @@ import { DUCKDB_DIALECT } from "./dialect.js";
|
|
|
5
5
|
export function toSnakeCase(str) {
|
|
6
6
|
return str.replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
7
7
|
}
|
|
8
|
+
// Quote a column name to avoid conflicts with SQL reserved words
|
|
9
|
+
export function q(name) {
|
|
10
|
+
return `"${name}"`;
|
|
11
|
+
}
|
|
8
12
|
function mapType(prop, dialect) {
|
|
9
13
|
if (prop.type === 'string') {
|
|
10
14
|
if (prop.format === 'datetime')
|
|
@@ -312,7 +316,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
312
316
|
];
|
|
313
317
|
for (const col of schema.columns) {
|
|
314
318
|
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
315
|
-
lines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
319
|
+
lines.push(` ${q(col.name)} ${col.sqlType}${nullable}`);
|
|
316
320
|
}
|
|
317
321
|
const createTable = `CREATE TABLE IF NOT EXISTS ${schema.tableName} (\n${lines.join(',\n')}\n);`;
|
|
318
322
|
const prefix = schema.collection.replace(/\./g, '_');
|
|
@@ -322,7 +326,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
322
326
|
];
|
|
323
327
|
// Index ref columns for hydration lookups
|
|
324
328
|
for (const refCol of schema.refColumns) {
|
|
325
|
-
indexes.push(`CREATE INDEX IF NOT EXISTS idx_${prefix}_${refCol} ON ${schema.tableName}(${refCol});`);
|
|
329
|
+
indexes.push(`CREATE INDEX IF NOT EXISTS idx_${prefix}_${refCol} ON ${schema.tableName}(${q(refCol)});`);
|
|
326
330
|
}
|
|
327
331
|
// Child table DDL
|
|
328
332
|
const childDDL = [];
|
|
@@ -330,7 +334,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
330
334
|
const childLines = [' parent_uri TEXT NOT NULL', ' parent_did TEXT NOT NULL'];
|
|
331
335
|
for (const col of child.columns) {
|
|
332
336
|
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
333
|
-
childLines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
337
|
+
childLines.push(` ${q(col.name)} ${col.sqlType}${nullable}`);
|
|
334
338
|
}
|
|
335
339
|
childDDL.push(`CREATE TABLE IF NOT EXISTS ${child.tableName} (\n${childLines.join(',\n')}\n);`);
|
|
336
340
|
const childPrefix = `${prefix}__${toSnakeCase(child.fieldName)}`;
|
|
@@ -339,7 +343,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
339
343
|
for (const col of child.columns) {
|
|
340
344
|
if (col.isJson || col.sqlType === 'BLOB')
|
|
341
345
|
continue;
|
|
342
|
-
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_${col.name} ON ${child.tableName}(${col.name});`);
|
|
346
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_${col.name} ON ${child.tableName}(${q(col.name)});`);
|
|
343
347
|
}
|
|
344
348
|
}
|
|
345
349
|
// Union branch table DDL
|
|
@@ -348,7 +352,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
348
352
|
const branchLines = [' parent_uri TEXT NOT NULL', ' parent_did TEXT NOT NULL'];
|
|
349
353
|
for (const col of branch.columns) {
|
|
350
354
|
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
351
|
-
branchLines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
355
|
+
branchLines.push(` ${q(col.name)} ${col.sqlType}${nullable}`);
|
|
352
356
|
}
|
|
353
357
|
childDDL.push(`CREATE TABLE IF NOT EXISTS ${branch.tableName} (\n${branchLines.join(',\n')}\n);`);
|
|
354
358
|
const branchPrefix = branch.tableName.replace(/"/g, '').replace(/\./g, '_');
|
|
@@ -357,7 +361,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
357
361
|
for (const col of branch.columns) {
|
|
358
362
|
if (col.isJson || col.sqlType === 'BLOB')
|
|
359
363
|
continue;
|
|
360
|
-
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_${col.name} ON ${branch.tableName}(${col.name});`);
|
|
364
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_${col.name} ON ${branch.tableName}(${q(col.name)});`);
|
|
361
365
|
}
|
|
362
366
|
}
|
|
363
367
|
}
|