@hatk/hatk 0.0.1-alpha.4 → 0.0.1-alpha.40
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 +19 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +107 -0
- package/dist/backfill.d.ts +60 -1
- package/dist/backfill.d.ts.map +1 -1
- package/dist/backfill.js +167 -33
- package/dist/car.d.ts +59 -1
- package/dist/car.d.ts.map +1 -1
- package/dist/car.js +179 -7
- package/dist/cbor.d.ts +37 -0
- package/dist/cbor.d.ts.map +1 -1
- package/dist/cbor.js +36 -3
- package/dist/cid.d.ts +37 -0
- package/dist/cid.d.ts.map +1 -1
- package/dist/cid.js +38 -3
- package/dist/cli.js +417 -133
- package/dist/cloudflare/container.d.ts +73 -0
- package/dist/cloudflare/container.d.ts.map +1 -0
- package/dist/cloudflare/container.js +232 -0
- package/dist/cloudflare/hooks.d.ts +33 -0
- package/dist/cloudflare/hooks.d.ts.map +1 -0
- package/dist/cloudflare/hooks.js +40 -0
- package/dist/cloudflare/init.d.ts +27 -0
- package/dist/cloudflare/init.d.ts.map +1 -0
- package/dist/cloudflare/init.js +103 -0
- package/dist/cloudflare/worker.d.ts +27 -0
- package/dist/cloudflare/worker.d.ts.map +1 -0
- package/dist/cloudflare/worker.js +54 -0
- package/dist/config.d.ts +12 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +36 -9
- package/dist/database/adapter-factory.d.ts +6 -0
- package/dist/database/adapter-factory.d.ts.map +1 -0
- package/dist/database/adapter-factory.js +20 -0
- package/dist/database/adapters/d1.d.ts +56 -0
- package/dist/database/adapters/d1.d.ts.map +1 -0
- package/dist/database/adapters/d1.js +108 -0
- package/dist/database/adapters/duckdb-search.d.ts +12 -0
- package/dist/database/adapters/duckdb-search.d.ts.map +1 -0
- package/dist/database/adapters/duckdb-search.js +27 -0
- package/dist/database/adapters/duckdb.d.ts +25 -0
- package/dist/database/adapters/duckdb.d.ts.map +1 -0
- package/dist/database/adapters/duckdb.js +161 -0
- package/dist/database/adapters/sqlite-search.d.ts +23 -0
- package/dist/database/adapters/sqlite-search.d.ts.map +1 -0
- package/dist/database/adapters/sqlite-search.js +74 -0
- package/dist/database/adapters/sqlite.d.ts +18 -0
- package/dist/database/adapters/sqlite.d.ts.map +1 -0
- package/dist/database/adapters/sqlite.js +87 -0
- package/dist/database/db.d.ts +159 -0
- package/dist/database/db.d.ts.map +1 -0
- package/dist/database/db.js +1445 -0
- package/dist/database/dialect.d.ts +45 -0
- package/dist/database/dialect.d.ts.map +1 -0
- package/dist/database/dialect.js +72 -0
- package/dist/database/fts.d.ts +27 -0
- package/dist/database/fts.d.ts.map +1 -0
- package/dist/database/fts.js +846 -0
- package/dist/database/index.d.ts +7 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +6 -0
- package/dist/database/ports.d.ts +50 -0
- package/dist/database/ports.d.ts.map +1 -0
- package/dist/database/ports.js +1 -0
- package/dist/database/schema.d.ts +61 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +394 -0
- package/dist/db.d.ts +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +4 -38
- package/dist/dev-entry.d.ts +8 -0
- package/dist/dev-entry.d.ts.map +1 -0
- package/dist/dev-entry.js +110 -0
- package/dist/feeds.d.ts +12 -8
- package/dist/feeds.d.ts.map +1 -1
- package/dist/feeds.js +45 -6
- package/dist/fts.d.ts.map +1 -1
- package/dist/fts.js +5 -0
- package/dist/hooks.d.ts +22 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +75 -0
- package/dist/hydrate.d.ts +6 -5
- package/dist/hydrate.d.ts.map +1 -1
- package/dist/hydrate.js +4 -16
- package/dist/indexer.d.ts +20 -0
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +53 -7
- package/dist/labels.d.ts +34 -0
- package/dist/labels.d.ts.map +1 -1
- package/dist/labels.js +66 -6
- package/dist/logger.d.ts +29 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +29 -0
- package/dist/main.js +134 -67
- package/dist/mst.d.ts +18 -1
- package/dist/mst.d.ts.map +1 -1
- package/dist/mst.js +19 -8
- package/dist/oauth/db.d.ts.map +1 -1
- package/dist/oauth/db.js +43 -17
- package/dist/oauth/server.d.ts +2 -0
- package/dist/oauth/server.d.ts.map +1 -1
- package/dist/oauth/server.js +102 -7
- package/dist/oauth/session.d.ts +11 -0
- package/dist/oauth/session.d.ts.map +1 -0
- package/dist/oauth/session.js +65 -0
- package/dist/opengraph.d.ts +10 -0
- package/dist/opengraph.d.ts.map +1 -1
- package/dist/opengraph.js +73 -39
- package/dist/pds-proxy.d.ts +42 -0
- package/dist/pds-proxy.d.ts.map +1 -0
- package/dist/pds-proxy.js +189 -0
- package/dist/renderer.d.ts +27 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +46 -0
- package/dist/resolve-hatk.d.ts +6 -0
- package/dist/resolve-hatk.d.ts.map +1 -0
- package/dist/resolve-hatk.js +20 -0
- package/dist/response.d.ts +16 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +69 -0
- package/dist/scanner.d.ts +21 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +88 -0
- package/dist/schema.d.ts +8 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +29 -0
- package/dist/seed.d.ts +19 -0
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +43 -4
- package/dist/server-init.d.ts +8 -0
- package/dist/server-init.d.ts.map +1 -0
- package/dist/server-init.js +61 -0
- package/dist/server.d.ts +26 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +528 -635
- package/dist/setup.d.ts +28 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +50 -3
- package/dist/test.d.ts +1 -1
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +38 -32
- package/dist/views.js +1 -1
- package/dist/vite-plugin.d.ts +1 -1
- package/dist/vite-plugin.d.ts.map +1 -1
- package/dist/vite-plugin.js +254 -66
- package/dist/xrpc.d.ts +46 -10
- package/dist/xrpc.d.ts.map +1 -1
- package/dist/xrpc.js +128 -39
- package/package.json +13 -6
- package/public/admin.html +0 -54
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { DatabasePort, BulkInserter, SearchPort, Dialect } from './ports.ts';
|
|
2
|
+
export type { SqlDialect } from './dialect.ts';
|
|
3
|
+
export { getDialect, DUCKDB_DIALECT, SQLITE_DIALECT } from './dialect.ts';
|
|
4
|
+
export { createAdapter } from './adapter-factory.ts';
|
|
5
|
+
export { initDatabase, closeDatabase, querySQL, runSQL, insertRecord, deleteRecord, queryRecords, searchRecords, getRecordByUri, getCursor, setCursor, bulkInsertRecords, packCursor, unpackCursor, } from './db.ts';
|
|
6
|
+
export { type TableSchema, type ColumnDef, type ChildTableSchema, loadLexicons, discoverCollections, buildSchemas, generateTableSchema, generateCreateTableSQL, toSnakeCase, getLexicon, getLexiconArray, getAllLexicons, storeLexicons, } from './schema.ts';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACjF,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGpD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { getDialect, DUCKDB_DIALECT, SQLITE_DIALECT } from "./dialect.js";
|
|
2
|
+
export { createAdapter } from "./adapter-factory.js";
|
|
3
|
+
// Re-export commonly used functions from db.ts
|
|
4
|
+
export { initDatabase, closeDatabase, querySQL, runSQL, insertRecord, deleteRecord, queryRecords, searchRecords, getRecordByUri, getCursor, setCursor, bulkInsertRecords, packCursor, unpackCursor, } from "./db.js";
|
|
5
|
+
// Re-export schema utilities
|
|
6
|
+
export { loadLexicons, discoverCollections, buildSchemas, generateTableSchema, generateCreateTableSQL, toSnakeCase, getLexicon, getLexiconArray, getAllLexicons, storeLexicons, } from "./schema.js";
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type Dialect = 'duckdb' | 'sqlite' | 'postgres';
|
|
2
|
+
export interface DatabasePort {
|
|
3
|
+
/** Dialect identifier for SQL generation differences */
|
|
4
|
+
dialect: Dialect;
|
|
5
|
+
/** Open a database connection. path is file path or ':memory:' */
|
|
6
|
+
open(path: string): Promise<void>;
|
|
7
|
+
/** Close all connections and release resources */
|
|
8
|
+
close(): void;
|
|
9
|
+
/** Execute a read query, return rows as plain objects */
|
|
10
|
+
query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<T[]>;
|
|
11
|
+
/** Execute a write statement (INSERT, UPDATE, DELETE, DDL) */
|
|
12
|
+
execute(sql: string, params?: unknown[]): Promise<void>;
|
|
13
|
+
/** Execute multiple statements in sequence (for DDL batches) */
|
|
14
|
+
executeMultiple(sql: string): Promise<void>;
|
|
15
|
+
/** Begin a transaction */
|
|
16
|
+
beginTransaction(): Promise<void>;
|
|
17
|
+
/** Commit the current transaction */
|
|
18
|
+
commit(): Promise<void>;
|
|
19
|
+
/** Rollback the current transaction */
|
|
20
|
+
rollback(): Promise<void>;
|
|
21
|
+
/** Create a bulk inserter for high-throughput writes */
|
|
22
|
+
createBulkInserter(table: string, columns: string[], options?: {
|
|
23
|
+
onConflict?: 'ignore' | 'replace';
|
|
24
|
+
batchSize?: number;
|
|
25
|
+
}): Promise<BulkInserter>;
|
|
26
|
+
}
|
|
27
|
+
export interface BulkInserter {
|
|
28
|
+
/** Append a single row of values */
|
|
29
|
+
append(values: unknown[]): void;
|
|
30
|
+
/** Flush buffered rows to the database */
|
|
31
|
+
flush(): Promise<void>;
|
|
32
|
+
/** Close the inserter and release resources */
|
|
33
|
+
close(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
export interface SearchPort {
|
|
36
|
+
/** Build/rebuild an FTS index for a table */
|
|
37
|
+
buildIndex(shadowTable: string, sourceQuery: string, searchColumns: string[]): Promise<void>;
|
|
38
|
+
/** Incrementally update a single record in the FTS index */
|
|
39
|
+
updateIndex?(shadowTable: string, uri: string, row: Record<string, string | null>, searchColumns: string[]): Promise<void>;
|
|
40
|
+
/** Remove a single record from the FTS index */
|
|
41
|
+
deleteFromIndex?(shadowTable: string, uri: string, searchColumns: string[]): Promise<void>;
|
|
42
|
+
/** Check if the FTS index already exists (for skipping rebuild on startup) */
|
|
43
|
+
indexExists?(shadowTable: string): Promise<boolean>;
|
|
44
|
+
/** Search a table, returning URIs with scores */
|
|
45
|
+
search(shadowTable: string, query: string, searchColumns: string[], limit: number, offset: number): Promise<Array<{
|
|
46
|
+
uri: string;
|
|
47
|
+
score: number;
|
|
48
|
+
}>>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/database/ports.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAA;AAEtD,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAA;IAEhB,kEAAkE;IAClE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjC,kDAAkD;IAClD,KAAK,IAAI,IAAI,CAAA;IAEb,yDAAyD;IACzD,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IAEjF,8DAA8D;IAC9D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEvD,gEAAgE;IAChE,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE3C,0BAA0B;IAC1B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjC,qCAAqC;IACrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEvB,uCAAuC;IACvC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEzB,wDAAwD;IACxD,kBAAkB,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAClE,OAAO,CAAC,YAAY,CAAC,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAE/B,0CAA0C;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtB,+CAA+C;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE5F,4DAA4D;IAC5D,WAAW,CAAC,CACV,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAClC,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB,gDAAgD;IAChD,eAAe,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE1F,8EAA8E;IAC9E,WAAW,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnD,iDAAiD;IACjD,MAAM,CACJ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;CAClD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { SqlDialect } from './dialect.ts';
|
|
2
|
+
export interface ColumnDef {
|
|
3
|
+
name: string;
|
|
4
|
+
originalName: string;
|
|
5
|
+
sqlType: string;
|
|
6
|
+
notNull: boolean;
|
|
7
|
+
isRef: boolean;
|
|
8
|
+
isJson: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface UnionBranchSchema {
|
|
11
|
+
type: string;
|
|
12
|
+
branchName: string;
|
|
13
|
+
tableName: string;
|
|
14
|
+
columns: ColumnDef[];
|
|
15
|
+
isArray: boolean;
|
|
16
|
+
arrayField?: string;
|
|
17
|
+
wrapperField?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface UnionFieldSchema {
|
|
20
|
+
fieldName: string;
|
|
21
|
+
branches: UnionBranchSchema[];
|
|
22
|
+
}
|
|
23
|
+
export interface TableSchema {
|
|
24
|
+
collection: string;
|
|
25
|
+
tableName: string;
|
|
26
|
+
columns: ColumnDef[];
|
|
27
|
+
refColumns: string[];
|
|
28
|
+
children: ChildTableSchema[];
|
|
29
|
+
unions: UnionFieldSchema[];
|
|
30
|
+
}
|
|
31
|
+
export interface ChildTableSchema {
|
|
32
|
+
parentCollection: string;
|
|
33
|
+
fieldName: string;
|
|
34
|
+
tableName: string;
|
|
35
|
+
columns: ColumnDef[];
|
|
36
|
+
}
|
|
37
|
+
export declare function toSnakeCase(str: string): string;
|
|
38
|
+
export declare function loadLexicons(lexiconsDir: string): Map<string, any>;
|
|
39
|
+
/**
|
|
40
|
+
* Discover collections by scanning lexicons for record-type definitions.
|
|
41
|
+
*/
|
|
42
|
+
export declare function discoverCollections(lexicons: Map<string, any>): string[];
|
|
43
|
+
export declare function storeLexicons(lexicons: Map<string, any>): void;
|
|
44
|
+
export declare function getLexicon(nsid: string): any | undefined;
|
|
45
|
+
export declare function getAllLexicons(): Array<{
|
|
46
|
+
nsid: string;
|
|
47
|
+
lexicon: any;
|
|
48
|
+
}>;
|
|
49
|
+
/** Get all stored lexicons as a flat array (for @bigmoves/lexicon validators) */
|
|
50
|
+
export declare function getLexiconArray(): any[];
|
|
51
|
+
export declare function generateTableSchema(nsid: string, lexicon: any, lexicons?: Map<string, any>, dialect?: SqlDialect): TableSchema;
|
|
52
|
+
export declare function generateCreateTableSQL(schema: TableSchema, dialect?: SqlDialect): string;
|
|
53
|
+
/**
|
|
54
|
+
* Build table schemas and DDL from lexicons and collections.
|
|
55
|
+
* Shared by main.ts (server boot) and cli.ts (hatk schema command).
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildSchemas(lexicons: Map<string, any>, collections: string[], dialect?: SqlDialect): {
|
|
58
|
+
schemas: TableSchema[];
|
|
59
|
+
ddlStatements: string[];
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { DUCKDB_DIALECT } from "./dialect.js";
|
|
4
|
+
// Convert camelCase to snake_case
|
|
5
|
+
export function toSnakeCase(str) {
|
|
6
|
+
return str.replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
7
|
+
}
|
|
8
|
+
function mapType(prop, dialect) {
|
|
9
|
+
if (prop.type === 'string') {
|
|
10
|
+
if (prop.format === 'datetime')
|
|
11
|
+
return { sqlType: dialect.typeMap.timestamp, isRef: false, isJson: false };
|
|
12
|
+
if (prop.format === 'at-uri')
|
|
13
|
+
return { sqlType: dialect.typeMap.text, isRef: true, isJson: false };
|
|
14
|
+
return { sqlType: dialect.typeMap.text, isRef: false, isJson: false };
|
|
15
|
+
}
|
|
16
|
+
if (prop.type === 'integer')
|
|
17
|
+
return { sqlType: dialect.typeMap.integer, isRef: false, isJson: false };
|
|
18
|
+
if (prop.type === 'boolean')
|
|
19
|
+
return { sqlType: dialect.typeMap.boolean, isRef: false, isJson: false };
|
|
20
|
+
if (prop.type === 'bytes')
|
|
21
|
+
return { sqlType: dialect.typeMap.blob, isRef: false, isJson: false };
|
|
22
|
+
if (prop.type === 'cid-link')
|
|
23
|
+
return { sqlType: dialect.typeMap.text, isRef: false, isJson: false };
|
|
24
|
+
if (prop.type === 'array')
|
|
25
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
26
|
+
if (prop.type === 'blob')
|
|
27
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
28
|
+
if (prop.type === 'union')
|
|
29
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
30
|
+
if (prop.type === 'unknown')
|
|
31
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
32
|
+
if (prop.type === 'object')
|
|
33
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
34
|
+
if (prop.type === 'ref') {
|
|
35
|
+
// strongRef contains { uri, cid } — handled specially in generateTableSchema
|
|
36
|
+
if (prop.ref === 'com.atproto.repo.strongRef')
|
|
37
|
+
return { sqlType: 'STRONG_REF', isRef: true, isJson: false };
|
|
38
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
39
|
+
}
|
|
40
|
+
return { sqlType: dialect.typeMap.text, isRef: false, isJson: false };
|
|
41
|
+
}
|
|
42
|
+
// Recursively find all .json files in a directory
|
|
43
|
+
function findJsonFiles(dir) {
|
|
44
|
+
const results = [];
|
|
45
|
+
for (const entry of readdirSync(dir)) {
|
|
46
|
+
const full = join(dir, entry);
|
|
47
|
+
if (statSync(full).isDirectory()) {
|
|
48
|
+
results.push(...findJsonFiles(full));
|
|
49
|
+
}
|
|
50
|
+
else if (entry.endsWith('.json')) {
|
|
51
|
+
results.push(full);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
// Load all lexicon files and index by NSID
|
|
57
|
+
export function loadLexicons(lexiconsDir) {
|
|
58
|
+
const lexicons = new Map();
|
|
59
|
+
for (const file of findJsonFiles(lexiconsDir)) {
|
|
60
|
+
const content = JSON.parse(readFileSync(file, 'utf-8'));
|
|
61
|
+
if (content.lexicon === 1 && content.id) {
|
|
62
|
+
lexicons.set(content.id, content);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return lexicons;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Discover collections by scanning lexicons for record-type definitions.
|
|
69
|
+
*/
|
|
70
|
+
export function discoverCollections(lexicons) {
|
|
71
|
+
const collections = [];
|
|
72
|
+
for (const [nsid, lexicon] of lexicons) {
|
|
73
|
+
const mainDef = lexicon.defs?.main;
|
|
74
|
+
if (mainDef?.type === 'record') {
|
|
75
|
+
collections.push(nsid);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return collections.sort();
|
|
79
|
+
}
|
|
80
|
+
const storedLexicons = new Map();
|
|
81
|
+
export function storeLexicons(lexicons) {
|
|
82
|
+
for (const [nsid, lex] of lexicons) {
|
|
83
|
+
storedLexicons.set(nsid, lex);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function getLexicon(nsid) {
|
|
87
|
+
return storedLexicons.get(nsid);
|
|
88
|
+
}
|
|
89
|
+
export function getAllLexicons() {
|
|
90
|
+
return [...storedLexicons.entries()].map(([nsid, lexicon]) => ({ nsid, lexicon }));
|
|
91
|
+
}
|
|
92
|
+
/** Get all stored lexicons as a flat array (for @bigmoves/lexicon validators) */
|
|
93
|
+
export function getLexiconArray() {
|
|
94
|
+
return [...storedLexicons.values()];
|
|
95
|
+
}
|
|
96
|
+
function resolveArrayItemProperties(items, defs) {
|
|
97
|
+
if (!items)
|
|
98
|
+
return null;
|
|
99
|
+
// Inline object with properties
|
|
100
|
+
if (items.type === 'object' && items.properties) {
|
|
101
|
+
return items.properties;
|
|
102
|
+
}
|
|
103
|
+
// Ref to a named def (e.g., "#artist")
|
|
104
|
+
if (items.type === 'ref' && items.ref?.startsWith('#')) {
|
|
105
|
+
const defName = items.ref.slice(1);
|
|
106
|
+
const def = defs?.[defName];
|
|
107
|
+
if (def?.type === 'object' && def.properties) {
|
|
108
|
+
return def.properties;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
/** Resolve a ref string to its definition object */
|
|
114
|
+
function resolveRefDef(ref, defs, lexicons) {
|
|
115
|
+
if (ref.startsWith('#')) {
|
|
116
|
+
return defs?.[ref.slice(1)] || null;
|
|
117
|
+
}
|
|
118
|
+
if (ref.includes('#')) {
|
|
119
|
+
const [nsid, defName] = ref.split('#');
|
|
120
|
+
return lexicons?.get(nsid)?.defs?.[defName] || null;
|
|
121
|
+
}
|
|
122
|
+
return lexicons?.get(ref)?.defs?.main || null;
|
|
123
|
+
}
|
|
124
|
+
/** Resolve a single union ref to a branch schema */
|
|
125
|
+
function resolveUnionBranch(ref, collection, fieldName, defs, lexicons, dialect) {
|
|
126
|
+
let branchDef = null;
|
|
127
|
+
let branchName;
|
|
128
|
+
let fullType;
|
|
129
|
+
let branchDefs = defs; // defs context for resolving inner refs
|
|
130
|
+
if (ref.startsWith('#')) {
|
|
131
|
+
const defName = ref.slice(1);
|
|
132
|
+
branchDef = defs?.[defName];
|
|
133
|
+
branchName = toSnakeCase(defName);
|
|
134
|
+
fullType = `${collection}#${defName}`;
|
|
135
|
+
}
|
|
136
|
+
else if (ref.includes('#')) {
|
|
137
|
+
const [nsid, defName] = ref.split('#');
|
|
138
|
+
const lex = lexicons?.get(nsid);
|
|
139
|
+
branchDef = lex?.defs?.[defName];
|
|
140
|
+
branchName = toSnakeCase(defName);
|
|
141
|
+
fullType = ref;
|
|
142
|
+
branchDefs = lex?.defs || defs;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const lex = lexicons?.get(ref);
|
|
146
|
+
branchDef = lex?.defs?.main;
|
|
147
|
+
branchName = ref.split('.').pop();
|
|
148
|
+
fullType = ref;
|
|
149
|
+
branchDefs = lex?.defs || defs;
|
|
150
|
+
}
|
|
151
|
+
if (!branchDef || branchDef.type !== 'object' || !branchDef.properties)
|
|
152
|
+
return null;
|
|
153
|
+
let isArray = false;
|
|
154
|
+
let arrayField;
|
|
155
|
+
let wrapperField;
|
|
156
|
+
let propSource = branchDef.properties;
|
|
157
|
+
const branchRequired = new Set(branchDef.required || []);
|
|
158
|
+
// Check for single-property wrapper patterns
|
|
159
|
+
const propEntries = Object.entries(branchDef.properties);
|
|
160
|
+
if (propEntries.length === 1) {
|
|
161
|
+
const [onlyField, onlyProp] = propEntries[0];
|
|
162
|
+
if (onlyProp.type === 'array' && onlyProp.items) {
|
|
163
|
+
// Single array property (like embed.images wrapping images[])
|
|
164
|
+
const items = onlyProp.items;
|
|
165
|
+
const itemDef = items.type === 'ref' && items.ref ? resolveRefDef(items.ref, branchDefs, lexicons) : items;
|
|
166
|
+
if (itemDef?.type === 'object' && itemDef.properties) {
|
|
167
|
+
isArray = true;
|
|
168
|
+
arrayField = onlyField;
|
|
169
|
+
propSource = itemDef.properties;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else if (onlyProp.type === 'ref' && onlyProp.ref) {
|
|
173
|
+
// Single ref property (like embed.external wrapping external{})
|
|
174
|
+
const refDef = resolveRefDef(onlyProp.ref, branchDefs, lexicons);
|
|
175
|
+
if (refDef?.type === 'object' && refDef.properties) {
|
|
176
|
+
wrapperField = onlyField;
|
|
177
|
+
propSource = refDef.properties;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const snakeField = toSnakeCase(fieldName);
|
|
182
|
+
const tableName = `"${collection}__${snakeField}_${branchName}"`;
|
|
183
|
+
const columns = [];
|
|
184
|
+
for (const [propName, prop] of Object.entries(propSource)) {
|
|
185
|
+
const { sqlType, isRef, isJson } = mapType(prop, dialect);
|
|
186
|
+
// Skip STRONG_REF expansion in branch tables — treat as JSON
|
|
187
|
+
const finalType = sqlType === 'STRONG_REF' ? dialect.jsonType : sqlType;
|
|
188
|
+
columns.push({
|
|
189
|
+
name: toSnakeCase(propName),
|
|
190
|
+
originalName: propName,
|
|
191
|
+
sqlType: finalType,
|
|
192
|
+
notNull: branchRequired.has(propName),
|
|
193
|
+
isRef: finalType !== dialect.jsonType && isRef,
|
|
194
|
+
isJson: isJson || sqlType === 'STRONG_REF',
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return { type: fullType, branchName, tableName, columns, isArray, arrayField, wrapperField };
|
|
198
|
+
}
|
|
199
|
+
// Generate a TableSchema from a lexicon record definition
|
|
200
|
+
export function generateTableSchema(nsid, lexicon, lexicons, dialect = DUCKDB_DIALECT) {
|
|
201
|
+
const mainDef = lexicon.defs?.main;
|
|
202
|
+
if (!mainDef || mainDef.type !== 'record') {
|
|
203
|
+
throw new Error(`Lexicon ${nsid} does not define a record type`);
|
|
204
|
+
}
|
|
205
|
+
const record = mainDef.record;
|
|
206
|
+
if (!record || record.type !== 'object') {
|
|
207
|
+
throw new Error(`Lexicon ${nsid} record is not an object type`);
|
|
208
|
+
}
|
|
209
|
+
const required = new Set(record.required || []);
|
|
210
|
+
const columns = [];
|
|
211
|
+
const children = [];
|
|
212
|
+
const unions = [];
|
|
213
|
+
for (const [fieldName, prop] of Object.entries(record.properties || {})) {
|
|
214
|
+
const p = prop;
|
|
215
|
+
// Check for union fields — decompose into branch child tables
|
|
216
|
+
if (p.type === 'union' && p.refs) {
|
|
217
|
+
const branches = [];
|
|
218
|
+
for (const ref of p.refs) {
|
|
219
|
+
const branch = resolveUnionBranch(ref, nsid, fieldName, lexicon.defs, lexicons, dialect);
|
|
220
|
+
if (branch)
|
|
221
|
+
branches.push(branch);
|
|
222
|
+
}
|
|
223
|
+
if (branches.length > 0) {
|
|
224
|
+
unions.push({ fieldName, branches });
|
|
225
|
+
}
|
|
226
|
+
// Still add the JSON column for the raw union value
|
|
227
|
+
columns.push({
|
|
228
|
+
name: toSnakeCase(fieldName),
|
|
229
|
+
originalName: fieldName,
|
|
230
|
+
sqlType: dialect.jsonType,
|
|
231
|
+
notNull: required.has(fieldName),
|
|
232
|
+
isRef: false,
|
|
233
|
+
isJson: true,
|
|
234
|
+
});
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
// Check if this is a decomposable array (array of structured objects)
|
|
238
|
+
if (p.type === 'array') {
|
|
239
|
+
const itemProps = resolveArrayItemProperties(p.items, lexicon.defs);
|
|
240
|
+
if (itemProps) {
|
|
241
|
+
const childColumns = [];
|
|
242
|
+
const itemRequired = new Set(p.items?.required || lexicon.defs?.[p.items?.ref?.slice(1)]?.required || []);
|
|
243
|
+
for (const [itemField, itemProp] of Object.entries(itemProps)) {
|
|
244
|
+
const { sqlType, isRef, isJson } = mapType(itemProp, dialect);
|
|
245
|
+
childColumns.push({
|
|
246
|
+
name: toSnakeCase(itemField),
|
|
247
|
+
originalName: itemField,
|
|
248
|
+
sqlType,
|
|
249
|
+
notNull: itemRequired.has(itemField),
|
|
250
|
+
isRef,
|
|
251
|
+
isJson,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
const snakeField = toSnakeCase(fieldName);
|
|
255
|
+
children.push({
|
|
256
|
+
parentCollection: nsid,
|
|
257
|
+
fieldName,
|
|
258
|
+
tableName: `"${nsid}__${snakeField}"`,
|
|
259
|
+
columns: childColumns,
|
|
260
|
+
});
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const { sqlType, isRef, isJson } = mapType(p, dialect);
|
|
265
|
+
if (sqlType === 'STRONG_REF') {
|
|
266
|
+
// Expand strongRef into two columns: {name}_uri and {name}_cid
|
|
267
|
+
columns.push({
|
|
268
|
+
name: toSnakeCase(fieldName) + '_uri',
|
|
269
|
+
originalName: fieldName,
|
|
270
|
+
sqlType: dialect.typeMap.text,
|
|
271
|
+
notNull: required.has(fieldName),
|
|
272
|
+
isRef: true,
|
|
273
|
+
isJson: false,
|
|
274
|
+
});
|
|
275
|
+
columns.push({
|
|
276
|
+
name: toSnakeCase(fieldName) + '_cid',
|
|
277
|
+
originalName: fieldName + '__cid',
|
|
278
|
+
sqlType: dialect.typeMap.text,
|
|
279
|
+
notNull: required.has(fieldName),
|
|
280
|
+
isRef: false,
|
|
281
|
+
isJson: false,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
columns.push({
|
|
286
|
+
name: toSnakeCase(fieldName),
|
|
287
|
+
originalName: fieldName,
|
|
288
|
+
sqlType,
|
|
289
|
+
notNull: required.has(fieldName),
|
|
290
|
+
isRef,
|
|
291
|
+
isJson,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const refColumns = columns.filter((c) => c.isRef).map((c) => c.name);
|
|
296
|
+
return {
|
|
297
|
+
collection: nsid,
|
|
298
|
+
tableName: `"${nsid}"`,
|
|
299
|
+
columns,
|
|
300
|
+
refColumns,
|
|
301
|
+
children,
|
|
302
|
+
unions,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
// Generate CREATE TABLE SQL from a TableSchema
|
|
306
|
+
export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
307
|
+
const lines = [
|
|
308
|
+
' uri TEXT PRIMARY KEY',
|
|
309
|
+
' cid TEXT',
|
|
310
|
+
' did TEXT NOT NULL',
|
|
311
|
+
` indexed_at ${dialect.timestampType} NOT NULL`,
|
|
312
|
+
];
|
|
313
|
+
for (const col of schema.columns) {
|
|
314
|
+
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
315
|
+
lines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
316
|
+
}
|
|
317
|
+
const createTable = `CREATE TABLE IF NOT EXISTS ${schema.tableName} (\n${lines.join(',\n')}\n);`;
|
|
318
|
+
const prefix = schema.collection.replace(/\./g, '_');
|
|
319
|
+
const indexes = [
|
|
320
|
+
`CREATE INDEX IF NOT EXISTS idx_${prefix}_indexed ON ${schema.tableName}(indexed_at DESC);`,
|
|
321
|
+
`CREATE INDEX IF NOT EXISTS idx_${prefix}_author ON ${schema.tableName}(did);`,
|
|
322
|
+
];
|
|
323
|
+
// Index ref columns for hydration lookups
|
|
324
|
+
for (const refCol of schema.refColumns) {
|
|
325
|
+
indexes.push(`CREATE INDEX IF NOT EXISTS idx_${prefix}_${refCol} ON ${schema.tableName}(${refCol});`);
|
|
326
|
+
}
|
|
327
|
+
// Child table DDL
|
|
328
|
+
const childDDL = [];
|
|
329
|
+
for (const child of schema.children) {
|
|
330
|
+
const childLines = [' parent_uri TEXT NOT NULL', ' parent_did TEXT NOT NULL'];
|
|
331
|
+
for (const col of child.columns) {
|
|
332
|
+
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
333
|
+
childLines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
334
|
+
}
|
|
335
|
+
childDDL.push(`CREATE TABLE IF NOT EXISTS ${child.tableName} (\n${childLines.join(',\n')}\n);`);
|
|
336
|
+
const childPrefix = `${prefix}__${toSnakeCase(child.fieldName)}`;
|
|
337
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_parent ON ${child.tableName}(parent_uri);`);
|
|
338
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_did ON ${child.tableName}(parent_did);`);
|
|
339
|
+
for (const col of child.columns) {
|
|
340
|
+
if (col.isJson || col.sqlType === 'BLOB')
|
|
341
|
+
continue;
|
|
342
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_${col.name} ON ${child.tableName}(${col.name});`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Union branch table DDL
|
|
346
|
+
for (const union of schema.unions) {
|
|
347
|
+
for (const branch of union.branches) {
|
|
348
|
+
const branchLines = [' parent_uri TEXT NOT NULL', ' parent_did TEXT NOT NULL'];
|
|
349
|
+
for (const col of branch.columns) {
|
|
350
|
+
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
351
|
+
branchLines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
352
|
+
}
|
|
353
|
+
childDDL.push(`CREATE TABLE IF NOT EXISTS ${branch.tableName} (\n${branchLines.join(',\n')}\n);`);
|
|
354
|
+
const branchPrefix = branch.tableName.replace(/"/g, '').replace(/\./g, '_');
|
|
355
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_parent ON ${branch.tableName}(parent_uri);`);
|
|
356
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_did ON ${branch.tableName}(parent_did);`);
|
|
357
|
+
for (const col of branch.columns) {
|
|
358
|
+
if (col.isJson || col.sqlType === 'BLOB')
|
|
359
|
+
continue;
|
|
360
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_${col.name} ON ${branch.tableName}(${col.name});`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return [createTable, ...indexes, ...childDDL].join('\n');
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Build table schemas and DDL from lexicons and collections.
|
|
368
|
+
* Shared by main.ts (server boot) and cli.ts (hatk schema command).
|
|
369
|
+
*/
|
|
370
|
+
export function buildSchemas(lexicons, collections, dialect = DUCKDB_DIALECT) {
|
|
371
|
+
const schemas = [];
|
|
372
|
+
const ddlStatements = [];
|
|
373
|
+
for (const nsid of collections) {
|
|
374
|
+
const lexicon = lexicons.get(nsid);
|
|
375
|
+
if (!lexicon) {
|
|
376
|
+
const genericDDL = `CREATE TABLE IF NOT EXISTS "${nsid}" (
|
|
377
|
+
uri TEXT PRIMARY KEY,
|
|
378
|
+
cid TEXT,
|
|
379
|
+
did TEXT NOT NULL,
|
|
380
|
+
indexed_at ${dialect.timestampType} NOT NULL,
|
|
381
|
+
data ${dialect.jsonType}
|
|
382
|
+
);
|
|
383
|
+
CREATE INDEX IF NOT EXISTS idx_${nsid.replace(/\./g, '_')}_indexed ON "${nsid}"(indexed_at DESC);
|
|
384
|
+
CREATE INDEX IF NOT EXISTS idx_${nsid.replace(/\./g, '_')}_author ON "${nsid}"(did);`;
|
|
385
|
+
schemas.push({ collection: nsid, tableName: `"${nsid}"`, columns: [], refColumns: [], children: [], unions: [] });
|
|
386
|
+
ddlStatements.push(genericDDL);
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
const schema = generateTableSchema(nsid, lexicon, lexicons, dialect);
|
|
390
|
+
schemas.push(schema);
|
|
391
|
+
ddlStatements.push(generateCreateTableSQL(schema, dialect));
|
|
392
|
+
}
|
|
393
|
+
return { schemas, ddlStatements };
|
|
394
|
+
}
|
package/dist/db.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare function setRepoStatus(did: string, status: string, rev?: string,
|
|
|
14
14
|
retryAfter?: number;
|
|
15
15
|
handle?: string | null;
|
|
16
16
|
}): Promise<void>;
|
|
17
|
+
export declare function getRepoRev(did: string): Promise<string | null>;
|
|
17
18
|
export declare function getRepoRetryInfo(did: string): Promise<{
|
|
18
19
|
retryCount: number;
|
|
19
20
|
retryAfter: number;
|
|
@@ -129,6 +130,5 @@ export declare function isTakendownDid(did: string): Promise<boolean>;
|
|
|
129
130
|
export declare function getPreferences(did: string): Promise<Record<string, any>>;
|
|
130
131
|
export declare function putPreference(did: string, key: string, value: any): Promise<void>;
|
|
131
132
|
export declare function filterTakendownDids(dids: string[]): Promise<Set<string>>;
|
|
132
|
-
export declare function backfillChildTables(): Promise<void>;
|
|
133
133
|
export {};
|
|
134
134
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
package/dist/db.js
CHANGED
|
@@ -200,6 +200,10 @@ export async function setRepoStatus(did, status, rev, opts) {
|
|
|
200
200
|
await run(`INSERT OR IGNORE INTO _repos (did, status) VALUES ($1, $2)`, did, status);
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
|
+
export async function getRepoRev(did) {
|
|
204
|
+
const rows = await all(`SELECT rev FROM _repos WHERE did = $1`, did);
|
|
205
|
+
return rows[0]?.rev ?? null;
|
|
206
|
+
}
|
|
203
207
|
export async function getRepoRetryInfo(did) {
|
|
204
208
|
const rows = await all(`SELECT retry_count, retry_after FROM _repos WHERE did = $1`, did);
|
|
205
209
|
if (rows.length === 0)
|
|
@@ -1321,41 +1325,3 @@ export async function filterTakendownDids(dids) {
|
|
|
1321
1325
|
const rows = await all(`SELECT did FROM _repos WHERE did IN (${placeholders}) AND status = 'takendown'`, ...dids);
|
|
1322
1326
|
return new Set(rows.map((r) => r.did));
|
|
1323
1327
|
}
|
|
1324
|
-
export async function backfillChildTables() {
|
|
1325
|
-
for (const [, schema] of schemas) {
|
|
1326
|
-
for (const child of schema.children) {
|
|
1327
|
-
// Check if child table needs backfill (significantly fewer rows than parent)
|
|
1328
|
-
const mainCount = (await all(`SELECT COUNT(*)::INTEGER as n FROM ${schema.tableName}`))[0]?.n || 0;
|
|
1329
|
-
if (mainCount === 0)
|
|
1330
|
-
continue;
|
|
1331
|
-
const childCount = (await all(`SELECT COUNT(DISTINCT parent_uri)::INTEGER as n FROM ${child.tableName}`))[0]?.n || 0;
|
|
1332
|
-
if (childCount >= mainCount * 0.9)
|
|
1333
|
-
continue;
|
|
1334
|
-
console.log(`[db] Backfilling ${child.tableName} from ${schema.tableName}...`);
|
|
1335
|
-
const snakeField = toSnakeCase(child.fieldName);
|
|
1336
|
-
const childColSelects = child.columns
|
|
1337
|
-
.map((c) => `json_extract_string(item.val, '$.${c.originalName}')`)
|
|
1338
|
-
.join(', ');
|
|
1339
|
-
const childColNames = ['parent_uri', 'parent_did', ...child.columns.map((c) => c.name)];
|
|
1340
|
-
const notNullFilters = child.columns
|
|
1341
|
-
.filter((c) => c.notNull)
|
|
1342
|
-
.map((c) => `json_extract_string(item.val, '$.${c.originalName}') IS NOT NULL`);
|
|
1343
|
-
const whereClause = [`p.${snakeField} IS NOT NULL`, ...notNullFilters].join(' AND ');
|
|
1344
|
-
try {
|
|
1345
|
-
await run(`DELETE FROM ${child.tableName}`);
|
|
1346
|
-
await run(`
|
|
1347
|
-
INSERT INTO ${child.tableName} (${childColNames.join(', ')})
|
|
1348
|
-
SELECT p.uri, p.did, ${childColSelects}
|
|
1349
|
-
FROM ${schema.tableName} p,
|
|
1350
|
-
unnest(from_json(p.${snakeField}::JSON, '["json"]')) AS item(val)
|
|
1351
|
-
WHERE ${whereClause}
|
|
1352
|
-
`);
|
|
1353
|
-
const result = await all(`SELECT COUNT(*)::INTEGER as n FROM ${child.tableName}`);
|
|
1354
|
-
console.log(`[db] Backfilled ${child.tableName}: ${result[0]?.n || 0} rows`);
|
|
1355
|
-
}
|
|
1356
|
-
catch (err) {
|
|
1357
|
-
console.warn(`[db] Backfill skipped for ${child.tableName}: ${err.message}`);
|
|
1358
|
-
}
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const handler: (request: Request) => Promise<Response>;
|
|
2
|
+
/** Re-scan server/ directory to pick up changed handlers in dev mode. */
|
|
3
|
+
export declare function reloadServer(): Promise<void>;
|
|
4
|
+
export { renderPage } from './renderer.ts';
|
|
5
|
+
export { getRenderer } from './renderer.ts';
|
|
6
|
+
export { callXrpc } from './xrpc.ts';
|
|
7
|
+
export { parseSessionCookie, getSessionCookieName } from './oauth/session.ts';
|
|
8
|
+
//# sourceMappingURL=dev-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-entry.d.ts","sourceRoot":"","sources":["../src/dev-entry.ts"],"names":[],"mappings":"AA2GA,eAAO,MAAM,OAAO,yCAKlB,CAAA;AAEF,yEAAyE;AACzE,wBAAsB,YAAY,kBAEjC;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
|