@hatk/hatk 0.0.1-alpha.36 → 0.0.1-alpha.38
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/backfill.js +6 -6
- package/dist/cli.js +56 -13
- 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/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/db.d.ts +2 -0
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +18 -5
- package/dist/database/fts.js +1 -1
- package/dist/database/schema.d.ts +1 -0
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +27 -21
- package/dist/hydrate.d.ts.map +1 -1
- package/dist/hydrate.js +2 -13
- package/dist/labels.d.ts +1 -1
- package/dist/labels.d.ts.map +1 -1
- package/dist/labels.js +2 -2
- package/dist/opengraph.d.ts.map +1 -1
- package/dist/opengraph.js +3 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -1
- package/dist/xrpc.d.ts +1 -0
- package/dist/xrpc.d.ts.map +1 -1
- package/dist/xrpc.js +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cloudflare initialization logic used by both the standalone Worker
|
|
3
|
+
* entry and the SvelteKit handle hook.
|
|
4
|
+
*/
|
|
5
|
+
import { D1Adapter } from "../database/adapters/d1.js";
|
|
6
|
+
import { initDatabase, migrateSchema } from "../database/db.js";
|
|
7
|
+
import { storeLexicons, discoverCollections, buildSchemas } from "../database/schema.js";
|
|
8
|
+
import { discoverViews } from "../views.js";
|
|
9
|
+
import { getDialect } from "../database/dialect.js";
|
|
10
|
+
import { setSearchPort } from "../database/fts.js";
|
|
11
|
+
import { initOAuth } from "../oauth/server.js";
|
|
12
|
+
import { parseSessionCookie, getSessionCookieName } from "../oauth/session.js";
|
|
13
|
+
import { createHandler, registerCoreHandlers } from "../server.js";
|
|
14
|
+
import { configureRelay } from "../xrpc.js";
|
|
15
|
+
import { callXrpc } from "../xrpc.js";
|
|
16
|
+
import { validateLexicons } from '@bigmoves/lexicon';
|
|
17
|
+
let handler = null;
|
|
18
|
+
let initPromise = null;
|
|
19
|
+
/**
|
|
20
|
+
* One-time initialization. Sets up D1 adapter, database schemas, XRPC
|
|
21
|
+
* handlers, OAuth, and the globalThis bridge for SvelteKit SSR.
|
|
22
|
+
*/
|
|
23
|
+
async function initialize(env) {
|
|
24
|
+
const relay = env.HATK_RELAY || 'wss://bsky.network';
|
|
25
|
+
const plc = env.HATK_PLC || 'https://plc.directory';
|
|
26
|
+
configureRelay(relay);
|
|
27
|
+
const admins = env.HATK_ADMINS ? env.HATK_ADMINS.split(',').map((s) => s.trim()) : [];
|
|
28
|
+
// Load lexicons — injected at build time via virtual module
|
|
29
|
+
let lexicons;
|
|
30
|
+
try {
|
|
31
|
+
// @ts-expect-error — virtual module generated at build time
|
|
32
|
+
const lexiconModule = await import('virtual:hatk-lexicons');
|
|
33
|
+
lexicons = new Map(Object.entries(lexiconModule.default));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
lexicons = new Map();
|
|
37
|
+
}
|
|
38
|
+
const lexiconErrors = validateLexicons([...lexicons.values()]);
|
|
39
|
+
if (lexiconErrors) {
|
|
40
|
+
for (const [nsid, errors] of Object.entries(lexiconErrors)) {
|
|
41
|
+
for (const err of errors) {
|
|
42
|
+
console.error(`[hatk] Invalid lexicon ${nsid}: ${err}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
throw new Error('Invalid lexicons — check build output');
|
|
46
|
+
}
|
|
47
|
+
storeLexicons(lexicons);
|
|
48
|
+
const collections = env.HATK_COLLECTIONS
|
|
49
|
+
? env.HATK_COLLECTIONS.split(',').map((s) => s.trim())
|
|
50
|
+
: discoverCollections(lexicons);
|
|
51
|
+
// Build schemas and init D1
|
|
52
|
+
discoverViews();
|
|
53
|
+
const engineDialect = getDialect('d1');
|
|
54
|
+
const { schemas, ddlStatements } = buildSchemas(lexicons, collections, engineDialect);
|
|
55
|
+
const adapter = new D1Adapter();
|
|
56
|
+
adapter.initWithBinding(env.DB);
|
|
57
|
+
setSearchPort(null);
|
|
58
|
+
await initDatabase(adapter, ':memory:', schemas, ddlStatements);
|
|
59
|
+
await migrateSchema(schemas);
|
|
60
|
+
// Register core XRPC handlers
|
|
61
|
+
const oauthConfig = env.HATK_OAUTH_ISSUER
|
|
62
|
+
? {
|
|
63
|
+
issuer: env.HATK_OAUTH_ISSUER,
|
|
64
|
+
scopes: env.HATK_OAUTH_SCOPES ? env.HATK_OAUTH_SCOPES.split(',').map((s) => s.trim()) : ['read', 'write'],
|
|
65
|
+
clients: [],
|
|
66
|
+
}
|
|
67
|
+
: null;
|
|
68
|
+
registerCoreHandlers(collections, oauthConfig);
|
|
69
|
+
if (oauthConfig) {
|
|
70
|
+
await initOAuth(oauthConfig, plc, relay);
|
|
71
|
+
}
|
|
72
|
+
// Expose bridge for SvelteKit SSR
|
|
73
|
+
;
|
|
74
|
+
globalThis.__hatk_callXrpc = callXrpc;
|
|
75
|
+
globalThis.__hatk_parseSessionCookie = parseSessionCookie;
|
|
76
|
+
globalThis.__hatk_sessionCookieName = getSessionCookieName();
|
|
77
|
+
// Create the request handler
|
|
78
|
+
handler = createHandler({
|
|
79
|
+
collections,
|
|
80
|
+
publicDir: null,
|
|
81
|
+
oauth: oauthConfig,
|
|
82
|
+
admins,
|
|
83
|
+
onResync: undefined,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Ensure initialization has completed. Concurrent calls share the same promise.
|
|
88
|
+
*/
|
|
89
|
+
export function ensureInit(env) {
|
|
90
|
+
if (handler)
|
|
91
|
+
return Promise.resolve();
|
|
92
|
+
if (!initPromise) {
|
|
93
|
+
initPromise = initialize(env).catch((err) => {
|
|
94
|
+
initPromise = null;
|
|
95
|
+
throw err;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return initPromise;
|
|
99
|
+
}
|
|
100
|
+
/** Get the hatk request handler (only valid after init). */
|
|
101
|
+
export function getHandler() {
|
|
102
|
+
return handler;
|
|
103
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Worker entry point for hatk.
|
|
3
|
+
*
|
|
4
|
+
* Handles HTTP requests via the Workers fetch handler. The firehose indexer
|
|
5
|
+
* and backfill run in a companion Container — the Worker only serves the
|
|
6
|
+
* API and web UI.
|
|
7
|
+
*
|
|
8
|
+
* For SvelteKit apps, prefer using the handle hook from
|
|
9
|
+
* '@hatk/hatk/cloudflare/hooks' with adapter-cloudflare instead.
|
|
10
|
+
*/
|
|
11
|
+
import { type CloudflareEnv } from './init.ts';
|
|
12
|
+
interface ContainerBinding {
|
|
13
|
+
resync(did: string): Promise<void>;
|
|
14
|
+
fetch(request: Request): Promise<Response>;
|
|
15
|
+
}
|
|
16
|
+
interface Env extends CloudflareEnv {
|
|
17
|
+
CONTAINER: ContainerBinding;
|
|
18
|
+
}
|
|
19
|
+
interface ExecutionContext {
|
|
20
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
21
|
+
passThroughOnException(): void;
|
|
22
|
+
}
|
|
23
|
+
declare const _default: {
|
|
24
|
+
fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response>;
|
|
25
|
+
};
|
|
26
|
+
export default _default;
|
|
27
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/cloudflare/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AAGtE,UAAU,gBAAgB;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC3C;AAED,UAAU,GAAI,SAAQ,aAAa;IACjC,SAAS,EAAE,gBAAgB,CAAA;CAC5B;AAED,UAAU,gBAAgB;IACxB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IAC1C,sBAAsB,IAAI,IAAI,CAAA;CAC/B;;mBAGsB,OAAO,OAAO,GAAG,OAAO,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;;AADnF,wBA2CC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Worker entry point for hatk.
|
|
3
|
+
*
|
|
4
|
+
* Handles HTTP requests via the Workers fetch handler. The firehose indexer
|
|
5
|
+
* and backfill run in a companion Container — the Worker only serves the
|
|
6
|
+
* API and web UI.
|
|
7
|
+
*
|
|
8
|
+
* For SvelteKit apps, prefer using the handle hook from
|
|
9
|
+
* '@hatk/hatk/cloudflare/hooks' with adapter-cloudflare instead.
|
|
10
|
+
*/
|
|
11
|
+
import { ensureInit, getHandler } from "./init.js";
|
|
12
|
+
import { isHatkRoute } from "../adapter.js";
|
|
13
|
+
export default {
|
|
14
|
+
async fetch(request, env, ctx) {
|
|
15
|
+
try {
|
|
16
|
+
await ensureInit(env);
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return new Response(JSON.stringify({ error: 'Initialization failed', detail: err.message }), {
|
|
20
|
+
status: 500,
|
|
21
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const url = new URL(request.url);
|
|
25
|
+
const handler = getHandler();
|
|
26
|
+
// Intercept admin resync to delegate to the Container via RPC
|
|
27
|
+
if (url.pathname === '/admin/repos/resync' && request.method === 'POST') {
|
|
28
|
+
try {
|
|
29
|
+
const body = await request.text();
|
|
30
|
+
const { dids } = body ? JSON.parse(body) : {};
|
|
31
|
+
if (Array.isArray(dids)) {
|
|
32
|
+
for (const did of dids) {
|
|
33
|
+
ctx.waitUntil(env.CONTAINER.resync(did));
|
|
34
|
+
}
|
|
35
|
+
return new Response(JSON.stringify({ resyncing: dids.length }), {
|
|
36
|
+
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return new Response(JSON.stringify({ error: err.message }), {
|
|
42
|
+
status: 500,
|
|
43
|
+
headers: { 'Content-Type': 'application/json' },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// hatk routes → handler
|
|
48
|
+
if (isHatkRoute(url.pathname)) {
|
|
49
|
+
return handler(request);
|
|
50
|
+
}
|
|
51
|
+
// Everything else → 404 (use cloudflare/hooks for SvelteKit integration)
|
|
52
|
+
return new Response('Not found', { status: 404 });
|
|
53
|
+
},
|
|
54
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { DatabasePort, BulkInserter, Dialect } from '../ports.ts';
|
|
2
|
+
/**
|
|
3
|
+
* D1 database adapter for Cloudflare Workers/Containers.
|
|
4
|
+
*
|
|
5
|
+
* D1 is SQLite under the hood but accessed via an HTTP-based binding API.
|
|
6
|
+
* Key differences from the SQLite adapter:
|
|
7
|
+
* - No raw transactions — uses d1.batch() for atomic multi-statement execution
|
|
8
|
+
* - No prepared statement reuse — each query is a fresh prepare+bind
|
|
9
|
+
* - Bulk inserts use batched INSERT statements instead of native appenders
|
|
10
|
+
*/
|
|
11
|
+
/** Minimal D1 type definitions (matches Cloudflare's D1Database binding) */
|
|
12
|
+
interface D1Database {
|
|
13
|
+
prepare(sql: string): D1PreparedStatement;
|
|
14
|
+
batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>;
|
|
15
|
+
exec(sql: string): Promise<D1ExecResult>;
|
|
16
|
+
}
|
|
17
|
+
interface D1PreparedStatement {
|
|
18
|
+
bind(...values: unknown[]): D1PreparedStatement;
|
|
19
|
+
all<T = Record<string, unknown>>(): Promise<D1Result<T>>;
|
|
20
|
+
run(): Promise<D1Result>;
|
|
21
|
+
first<T = Record<string, unknown>>(column?: string): Promise<T | null>;
|
|
22
|
+
}
|
|
23
|
+
interface D1Result<T = unknown> {
|
|
24
|
+
results: T[];
|
|
25
|
+
success: boolean;
|
|
26
|
+
meta: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
interface D1ExecResult {
|
|
29
|
+
count: number;
|
|
30
|
+
duration: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class D1Adapter implements DatabasePort {
|
|
33
|
+
dialect: Dialect;
|
|
34
|
+
private db;
|
|
35
|
+
private txBuffer;
|
|
36
|
+
/**
|
|
37
|
+
* Initialize with an existing D1 binding (from env.DB in Worker/Container).
|
|
38
|
+
* The `path` argument is ignored — D1 bindings are configured in wrangler.jsonc.
|
|
39
|
+
*/
|
|
40
|
+
open(_path: string): Promise<void>;
|
|
41
|
+
/** Set the D1 binding directly (called before open). */
|
|
42
|
+
initWithBinding(db: D1Database): void;
|
|
43
|
+
close(): void;
|
|
44
|
+
query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<T[]>;
|
|
45
|
+
execute(sql: string, params?: unknown[]): Promise<void>;
|
|
46
|
+
executeMultiple(sql: string): Promise<void>;
|
|
47
|
+
beginTransaction(): Promise<void>;
|
|
48
|
+
commit(): Promise<void>;
|
|
49
|
+
rollback(): Promise<void>;
|
|
50
|
+
createBulkInserter(table: string, columns: string[], options?: {
|
|
51
|
+
onConflict?: 'ignore' | 'replace';
|
|
52
|
+
batchSize?: number;
|
|
53
|
+
}): Promise<BulkInserter>;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=d1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d1.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/d1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAEtE;;;;;;;;GAQG;AAEH,4EAA4E;AAC5E,UAAU,UAAU;IAClB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAA;IACzC,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC7E,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACzC;AAED,UAAU,mBAAmB;IAC3B,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAA;IAC/C,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;CACvE;AAED,UAAU,QAAQ,CAAC,CAAC,GAAG,OAAO;IAC5B,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAmBD,qBAAa,SAAU,YAAW,YAAY;IAC5C,OAAO,EAAE,OAAO,CAAO;IAEvB,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,QAAQ,CAAqC;IAErD;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,wDAAwD;IACxD,eAAe,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;IAIrC,KAAK,IAAI,IAAI;IAIP,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAOrF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3D,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IASvB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,kBAAkB,CACtB,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;CA+BzB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translate DuckDB-style $1, $2 placeholders to ? placeholders.
|
|
3
|
+
* Same logic as the SQLite adapter — D1 uses ? style.
|
|
4
|
+
*/
|
|
5
|
+
function translateParams(sql, params) {
|
|
6
|
+
if (params.length === 0)
|
|
7
|
+
return { sql, params };
|
|
8
|
+
const expandedParams = [];
|
|
9
|
+
const translated = sql.replace(/\$(\d+)/g, (_match, numStr) => {
|
|
10
|
+
const idx = parseInt(numStr) - 1;
|
|
11
|
+
expandedParams.push(params[idx]);
|
|
12
|
+
return '?';
|
|
13
|
+
});
|
|
14
|
+
return { sql: translated, params: expandedParams };
|
|
15
|
+
}
|
|
16
|
+
export class D1Adapter {
|
|
17
|
+
dialect = 'd1';
|
|
18
|
+
db;
|
|
19
|
+
txBuffer = null;
|
|
20
|
+
/**
|
|
21
|
+
* Initialize with an existing D1 binding (from env.DB in Worker/Container).
|
|
22
|
+
* The `path` argument is ignored — D1 bindings are configured in wrangler.jsonc.
|
|
23
|
+
*/
|
|
24
|
+
async open(_path) {
|
|
25
|
+
// D1 binding is injected via initWithBinding(), not opened by path.
|
|
26
|
+
// This is a no-op if already initialized.
|
|
27
|
+
if (!this.db) {
|
|
28
|
+
throw new Error('D1Adapter requires initWithBinding(db) before use');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Set the D1 binding directly (called before open). */
|
|
32
|
+
initWithBinding(db) {
|
|
33
|
+
this.db = db;
|
|
34
|
+
}
|
|
35
|
+
close() {
|
|
36
|
+
// D1 bindings don't need explicit cleanup
|
|
37
|
+
}
|
|
38
|
+
async query(sql, params = []) {
|
|
39
|
+
const t = translateParams(sql, params);
|
|
40
|
+
const stmt = t.params.length > 0 ? this.db.prepare(t.sql).bind(...t.params) : this.db.prepare(t.sql);
|
|
41
|
+
const result = await stmt.all();
|
|
42
|
+
return result.results;
|
|
43
|
+
}
|
|
44
|
+
async execute(sql, params = []) {
|
|
45
|
+
const t = translateParams(sql, params);
|
|
46
|
+
const stmt = t.params.length > 0 ? this.db.prepare(t.sql).bind(...t.params) : this.db.prepare(t.sql);
|
|
47
|
+
// If inside a transaction, buffer instead of executing
|
|
48
|
+
if (this.txBuffer !== null) {
|
|
49
|
+
this.txBuffer.push(stmt);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await stmt.run();
|
|
53
|
+
}
|
|
54
|
+
async executeMultiple(sql) {
|
|
55
|
+
// D1's exec() can be unreliable with multi-statement SQL.
|
|
56
|
+
// Split on semicolons and run each statement via prepare().run().
|
|
57
|
+
const statements = sql
|
|
58
|
+
.split(';')
|
|
59
|
+
.map((s) => s.trim())
|
|
60
|
+
.filter((s) => s.length > 0);
|
|
61
|
+
for (const stmt of statements) {
|
|
62
|
+
await this.db.prepare(stmt).run();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async beginTransaction() {
|
|
66
|
+
this.txBuffer = [];
|
|
67
|
+
}
|
|
68
|
+
async commit() {
|
|
69
|
+
if (this.txBuffer === null)
|
|
70
|
+
return;
|
|
71
|
+
const statements = this.txBuffer;
|
|
72
|
+
this.txBuffer = null;
|
|
73
|
+
if (statements.length > 0) {
|
|
74
|
+
await this.db.batch(statements);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async rollback() {
|
|
78
|
+
this.txBuffer = null;
|
|
79
|
+
}
|
|
80
|
+
async createBulkInserter(table, columns, options) {
|
|
81
|
+
const placeholders = columns.map(() => '?').join(', ');
|
|
82
|
+
const conflict = options?.onConflict === 'ignore' ? ' OR IGNORE' : options?.onConflict === 'replace' ? ' OR REPLACE' : '';
|
|
83
|
+
const sqlTemplate = `INSERT${conflict} INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`;
|
|
84
|
+
const buffer = [];
|
|
85
|
+
const batchSize = options?.batchSize ?? 200; // smaller batches for D1 CPU limits
|
|
86
|
+
const db = this.db;
|
|
87
|
+
const flush = async () => {
|
|
88
|
+
if (buffer.length > 0) {
|
|
89
|
+
await db.batch(buffer);
|
|
90
|
+
buffer.length = 0;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
return {
|
|
94
|
+
append(values) {
|
|
95
|
+
buffer.push(db.prepare(sqlTemplate).bind(...values));
|
|
96
|
+
if (buffer.length >= batchSize) {
|
|
97
|
+
flush();
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
async flush() {
|
|
101
|
+
await flush();
|
|
102
|
+
},
|
|
103
|
+
async close() {
|
|
104
|
+
await flush();
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
package/dist/database/db.d.ts
CHANGED
|
@@ -98,6 +98,8 @@ export declare function queryRecords(collection: string, opts?: QueryOpts): Prom
|
|
|
98
98
|
}>;
|
|
99
99
|
export declare function getRecordByUri(uri: string): Promise<any | null>;
|
|
100
100
|
export declare function getRecordsByUris(collection: string, uris: string[]): Promise<any[]>;
|
|
101
|
+
/** Fetch records by URIs and return as a shaped Map keyed by URI. */
|
|
102
|
+
export declare function getRecordsMap<R = unknown>(collection: string, uris: string[]): Promise<Map<string, Row<R>>>;
|
|
101
103
|
/**
|
|
102
104
|
* Multi-phase search across any collection's records.
|
|
103
105
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAI1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAM1D,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AACD,wBAAgB,aAAa,IAAI,UAAU,CAE1C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAMD,wBAAsB,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,EAAE,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/F;AAMD,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,EAC3B,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CA0Ef;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAoED,wBAAsB,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA6F3F;AA0CD,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGnE;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGvE;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC1E,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGpE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAI9G;AAED,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOlF;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG1D;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG5D;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGvE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAE3F;AAED,wBAAsB,kBAAkB,CACtC,IAAI,GAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,MAAM,CAAA;CACN,GACL,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B1C;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAO3E;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAK3E;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAcvE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI/D;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAQxF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CA+BrD;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,EAAE,CAAA;CAAE,CA+BhC;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqGf;AAWD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBjF;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAClG,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CACR,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC,CAC7G,CAqBA;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC5B;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqN9E;AAuCD,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CACvB;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoF9C;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAgCrE;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAqCzF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwH9C;AAGD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAE9E;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,OAAO,CAAC,OAAO,YAAY,EAAE,YAAY,CAAC,CAE5C;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAErE;AAED,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpG;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAc9B;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAKvG;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CA6B7B;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CASpC;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAKD,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAI1C;AAED,wBAAsB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAW5G;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAC3C,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GACvD,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAiGrB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASpF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAIlE;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAKtF;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxE;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO3E;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAW9E;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAK9E"}
|
|
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
|
@@ -479,7 +479,7 @@ export function buildInsertOp(collection, uri, cid, authorDid, record) {
|
|
|
479
479
|
if (rawValue === undefined || rawValue === null) {
|
|
480
480
|
values.push(null);
|
|
481
481
|
}
|
|
482
|
-
else if (col.
|
|
482
|
+
else if (col.isJson) {
|
|
483
483
|
values.push(JSON.stringify(rawValue));
|
|
484
484
|
}
|
|
485
485
|
else {
|
|
@@ -514,7 +514,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
514
514
|
if (raw === undefined || raw === null) {
|
|
515
515
|
values.push(null);
|
|
516
516
|
}
|
|
517
|
-
else if (col.
|
|
517
|
+
else if (col.isJson) {
|
|
518
518
|
values.push(JSON.stringify(raw));
|
|
519
519
|
}
|
|
520
520
|
else {
|
|
@@ -553,7 +553,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
553
553
|
if (raw === undefined || raw === null) {
|
|
554
554
|
values.push(null);
|
|
555
555
|
}
|
|
556
|
-
else if (col.
|
|
556
|
+
else if (col.isJson) {
|
|
557
557
|
values.push(JSON.stringify(raw));
|
|
558
558
|
}
|
|
559
559
|
else {
|
|
@@ -577,7 +577,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
577
577
|
if (raw === undefined || raw === null) {
|
|
578
578
|
values.push(null);
|
|
579
579
|
}
|
|
580
|
-
else if (col.
|
|
580
|
+
else if (col.isJson) {
|
|
581
581
|
values.push(JSON.stringify(raw));
|
|
582
582
|
}
|
|
583
583
|
else {
|
|
@@ -1020,6 +1020,19 @@ export async function getRecordsByUris(collection, uris) {
|
|
|
1020
1020
|
const byUri = new Map(rows.map((r) => [r.uri, r]));
|
|
1021
1021
|
return uris.map((u) => byUri.get(u)).filter(Boolean);
|
|
1022
1022
|
}
|
|
1023
|
+
/** Fetch records by URIs and return as a shaped Map keyed by URI. */
|
|
1024
|
+
export async function getRecordsMap(collection, uris) {
|
|
1025
|
+
if (uris.length === 0)
|
|
1026
|
+
return new Map();
|
|
1027
|
+
const records = await getRecordsByUris(collection, uris);
|
|
1028
|
+
const map = new Map();
|
|
1029
|
+
for (const r of records) {
|
|
1030
|
+
const shaped = reshapeRow(r, r?.__childData, r?.__unionData);
|
|
1031
|
+
if (shaped)
|
|
1032
|
+
map.set(shaped.uri, shaped);
|
|
1033
|
+
}
|
|
1034
|
+
return map;
|
|
1035
|
+
}
|
|
1023
1036
|
/**
|
|
1024
1037
|
* Multi-phase search across any collection's records.
|
|
1025
1038
|
*
|
|
@@ -1267,7 +1280,7 @@ export function reshapeRow(row, childData, unionData) {
|
|
|
1267
1280
|
if (schema) {
|
|
1268
1281
|
for (const col of schema.columns) {
|
|
1269
1282
|
nameMap.set(col.name, col.originalName);
|
|
1270
|
-
if (col.
|
|
1283
|
+
if (col.isJson)
|
|
1271
1284
|
jsonCols.add(col.name);
|
|
1272
1285
|
}
|
|
1273
1286
|
}
|
package/dist/database/fts.js
CHANGED
|
@@ -106,7 +106,7 @@ function computeFtsSchema(collection) {
|
|
|
106
106
|
selectExprs.push(`t.${col.name}`);
|
|
107
107
|
searchColNames.push(col.name);
|
|
108
108
|
}
|
|
109
|
-
else if (
|
|
109
|
+
else if (col.isJson && record?.properties) {
|
|
110
110
|
const prop = record.properties[col.originalName];
|
|
111
111
|
if (prop?.type === 'blob')
|
|
112
112
|
continue; // skip blobs
|
|
@@ -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;
|
|
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"}
|
package/dist/database/schema.js
CHANGED
|
@@ -8,36 +8,36 @@ export function toSnakeCase(str) {
|
|
|
8
8
|
function mapType(prop, dialect) {
|
|
9
9
|
if (prop.type === 'string') {
|
|
10
10
|
if (prop.format === 'datetime')
|
|
11
|
-
return { sqlType: dialect.typeMap.timestamp, isRef: false };
|
|
11
|
+
return { sqlType: dialect.typeMap.timestamp, isRef: false, isJson: false };
|
|
12
12
|
if (prop.format === 'at-uri')
|
|
13
|
-
return { sqlType: dialect.typeMap.text, isRef: true };
|
|
14
|
-
return { sqlType: dialect.typeMap.text, isRef: false };
|
|
13
|
+
return { sqlType: dialect.typeMap.text, isRef: true, isJson: false };
|
|
14
|
+
return { sqlType: dialect.typeMap.text, isRef: false, isJson: false };
|
|
15
15
|
}
|
|
16
16
|
if (prop.type === 'integer')
|
|
17
|
-
return { sqlType: dialect.typeMap.integer, isRef: false };
|
|
17
|
+
return { sqlType: dialect.typeMap.integer, isRef: false, isJson: false };
|
|
18
18
|
if (prop.type === 'boolean')
|
|
19
|
-
return { sqlType: dialect.typeMap.boolean, isRef: false };
|
|
19
|
+
return { sqlType: dialect.typeMap.boolean, isRef: false, isJson: false };
|
|
20
20
|
if (prop.type === 'bytes')
|
|
21
|
-
return { sqlType: dialect.typeMap.blob, isRef: false };
|
|
21
|
+
return { sqlType: dialect.typeMap.blob, isRef: false, isJson: false };
|
|
22
22
|
if (prop.type === 'cid-link')
|
|
23
|
-
return { sqlType: dialect.typeMap.text, isRef: false };
|
|
23
|
+
return { sqlType: dialect.typeMap.text, isRef: false, isJson: false };
|
|
24
24
|
if (prop.type === 'array')
|
|
25
|
-
return { sqlType: dialect.jsonType, isRef: false };
|
|
25
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
26
26
|
if (prop.type === 'blob')
|
|
27
|
-
return { sqlType: dialect.jsonType, isRef: false };
|
|
27
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
28
28
|
if (prop.type === 'union')
|
|
29
|
-
return { sqlType: dialect.jsonType, isRef: false };
|
|
29
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
30
30
|
if (prop.type === 'unknown')
|
|
31
|
-
return { sqlType: dialect.jsonType, isRef: false };
|
|
31
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
32
32
|
if (prop.type === 'object')
|
|
33
|
-
return { sqlType: dialect.jsonType, isRef: false };
|
|
33
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
34
34
|
if (prop.type === 'ref') {
|
|
35
35
|
// strongRef contains { uri, cid } — handled specially in generateTableSchema
|
|
36
36
|
if (prop.ref === 'com.atproto.repo.strongRef')
|
|
37
|
-
return { sqlType: 'STRONG_REF', isRef: true };
|
|
38
|
-
return { sqlType: dialect.jsonType, isRef: false };
|
|
37
|
+
return { sqlType: 'STRONG_REF', isRef: true, isJson: false };
|
|
38
|
+
return { sqlType: dialect.jsonType, isRef: false, isJson: true };
|
|
39
39
|
}
|
|
40
|
-
return { sqlType: dialect.typeMap.text, isRef: false };
|
|
40
|
+
return { sqlType: dialect.typeMap.text, isRef: false, isJson: false };
|
|
41
41
|
}
|
|
42
42
|
// Recursively find all .json files in a directory
|
|
43
43
|
function findJsonFiles(dir) {
|
|
@@ -182,7 +182,7 @@ function resolveUnionBranch(ref, collection, fieldName, defs, lexicons, dialect)
|
|
|
182
182
|
const tableName = `"${collection}__${snakeField}_${branchName}"`;
|
|
183
183
|
const columns = [];
|
|
184
184
|
for (const [propName, prop] of Object.entries(propSource)) {
|
|
185
|
-
const { sqlType, isRef } = mapType(prop, dialect);
|
|
185
|
+
const { sqlType, isRef, isJson } = mapType(prop, dialect);
|
|
186
186
|
// Skip STRONG_REF expansion in branch tables — treat as JSON
|
|
187
187
|
const finalType = sqlType === 'STRONG_REF' ? dialect.jsonType : sqlType;
|
|
188
188
|
columns.push({
|
|
@@ -190,7 +190,8 @@ function resolveUnionBranch(ref, collection, fieldName, defs, lexicons, dialect)
|
|
|
190
190
|
originalName: propName,
|
|
191
191
|
sqlType: finalType,
|
|
192
192
|
notNull: branchRequired.has(propName),
|
|
193
|
-
isRef: finalType !==
|
|
193
|
+
isRef: finalType !== dialect.jsonType && isRef,
|
|
194
|
+
isJson: isJson || sqlType === 'STRONG_REF',
|
|
194
195
|
});
|
|
195
196
|
}
|
|
196
197
|
return { type: fullType, branchName, tableName, columns, isArray, arrayField, wrapperField };
|
|
@@ -229,6 +230,7 @@ export function generateTableSchema(nsid, lexicon, lexicons, dialect = DUCKDB_DI
|
|
|
229
230
|
sqlType: dialect.jsonType,
|
|
230
231
|
notNull: required.has(fieldName),
|
|
231
232
|
isRef: false,
|
|
233
|
+
isJson: true,
|
|
232
234
|
});
|
|
233
235
|
continue;
|
|
234
236
|
}
|
|
@@ -239,13 +241,14 @@ export function generateTableSchema(nsid, lexicon, lexicons, dialect = DUCKDB_DI
|
|
|
239
241
|
const childColumns = [];
|
|
240
242
|
const itemRequired = new Set(p.items?.required || lexicon.defs?.[p.items?.ref?.slice(1)]?.required || []);
|
|
241
243
|
for (const [itemField, itemProp] of Object.entries(itemProps)) {
|
|
242
|
-
const { sqlType, isRef } = mapType(itemProp, dialect);
|
|
244
|
+
const { sqlType, isRef, isJson } = mapType(itemProp, dialect);
|
|
243
245
|
childColumns.push({
|
|
244
246
|
name: toSnakeCase(itemField),
|
|
245
247
|
originalName: itemField,
|
|
246
248
|
sqlType,
|
|
247
249
|
notNull: itemRequired.has(itemField),
|
|
248
250
|
isRef,
|
|
251
|
+
isJson,
|
|
249
252
|
});
|
|
250
253
|
}
|
|
251
254
|
const snakeField = toSnakeCase(fieldName);
|
|
@@ -258,7 +261,7 @@ export function generateTableSchema(nsid, lexicon, lexicons, dialect = DUCKDB_DI
|
|
|
258
261
|
continue;
|
|
259
262
|
}
|
|
260
263
|
}
|
|
261
|
-
const { sqlType, isRef } = mapType(p, dialect);
|
|
264
|
+
const { sqlType, isRef, isJson } = mapType(p, dialect);
|
|
262
265
|
if (sqlType === 'STRONG_REF') {
|
|
263
266
|
// Expand strongRef into two columns: {name}_uri and {name}_cid
|
|
264
267
|
columns.push({
|
|
@@ -267,6 +270,7 @@ export function generateTableSchema(nsid, lexicon, lexicons, dialect = DUCKDB_DI
|
|
|
267
270
|
sqlType: dialect.typeMap.text,
|
|
268
271
|
notNull: required.has(fieldName),
|
|
269
272
|
isRef: true,
|
|
273
|
+
isJson: false,
|
|
270
274
|
});
|
|
271
275
|
columns.push({
|
|
272
276
|
name: toSnakeCase(fieldName) + '_cid',
|
|
@@ -274,6 +278,7 @@ export function generateTableSchema(nsid, lexicon, lexicons, dialect = DUCKDB_DI
|
|
|
274
278
|
sqlType: dialect.typeMap.text,
|
|
275
279
|
notNull: required.has(fieldName),
|
|
276
280
|
isRef: false,
|
|
281
|
+
isJson: false,
|
|
277
282
|
});
|
|
278
283
|
}
|
|
279
284
|
else {
|
|
@@ -283,6 +288,7 @@ export function generateTableSchema(nsid, lexicon, lexicons, dialect = DUCKDB_DI
|
|
|
283
288
|
sqlType,
|
|
284
289
|
notNull: required.has(fieldName),
|
|
285
290
|
isRef,
|
|
291
|
+
isJson,
|
|
286
292
|
});
|
|
287
293
|
}
|
|
288
294
|
}
|
|
@@ -331,7 +337,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
331
337
|
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_parent ON ${child.tableName}(parent_uri);`);
|
|
332
338
|
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_did ON ${child.tableName}(parent_did);`);
|
|
333
339
|
for (const col of child.columns) {
|
|
334
|
-
if (col.
|
|
340
|
+
if (col.isJson || col.sqlType === 'BLOB')
|
|
335
341
|
continue;
|
|
336
342
|
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_${col.name} ON ${child.tableName}(${col.name});`);
|
|
337
343
|
}
|
|
@@ -349,7 +355,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
349
355
|
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_parent ON ${branch.tableName}(parent_uri);`);
|
|
350
356
|
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_did ON ${branch.tableName}(parent_did);`);
|
|
351
357
|
for (const col of branch.columns) {
|
|
352
|
-
if (col.
|
|
358
|
+
if (col.isJson || col.sqlType === 'BLOB')
|
|
353
359
|
continue;
|
|
354
360
|
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_${col.name} ON ${branch.tableName}(${col.name});`);
|
|
355
361
|
}
|
package/dist/hydrate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../src/hydrate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../src/hydrate.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEzC,YAAY,EAAE,GAAG,EAAE,CAAA;AAInB,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IACf,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC9B,EAAE,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;KAAE,CAAA;IACtE,UAAU,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1G,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC5F,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IAC3D,OAAO,EAAE,CACP,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,OAAO,EACZ,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,GAAG,eAAe,KAC9D,MAAM,GAAG,SAAS,CAAA;CACxB;AAID,4EAA4E;AAC5E,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAoC5E;AAID,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,cAAc,CAmBzG"}
|