@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
package/dist/seed.js
CHANGED
|
@@ -1,12 +1,49 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Test data seeding helpers for populating a local PDS.
|
|
3
|
+
*
|
|
4
|
+
* Place a seed script at `seeds/seed.ts`. It runs during `hatk dev` to create
|
|
5
|
+
* accounts and records against your local PDS. Records are validated against
|
|
6
|
+
* your project's lexicons before being written.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* // seeds/seed.ts
|
|
11
|
+
* import { seed } from '../hatk.generated.ts'
|
|
12
|
+
*
|
|
13
|
+
* const { createAccount, createRecord } = seed()
|
|
14
|
+
*
|
|
15
|
+
* const alice = await createAccount('alice.test')
|
|
16
|
+
* const bob = await createAccount('bob.test')
|
|
17
|
+
*
|
|
18
|
+
* await createRecord(
|
|
19
|
+
* alice,
|
|
20
|
+
* 'xyz.statusphere.status',
|
|
21
|
+
* { status: '👍', createdAt: new Date().toISOString() },
|
|
22
|
+
* { rkey: 'status1' },
|
|
23
|
+
* )
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import { loadLexicons } from "./database/schema.js";
|
|
2
27
|
import { validateRecord } from '@bigmoves/lexicon';
|
|
3
28
|
import { resolve } from 'node:path';
|
|
4
29
|
import { readFileSync } from 'node:fs';
|
|
30
|
+
/**
|
|
31
|
+
* Create a seed helper for populating a local PDS with test data.
|
|
32
|
+
*
|
|
33
|
+
* Returns `createAccount`, `createRecord`, and `uploadBlob` functions bound to
|
|
34
|
+
* the target PDS. Records are validated against the project's lexicons before
|
|
35
|
+
* being written. Generic parameter `R` maps collection NSIDs to their record types
|
|
36
|
+
* for type-safe seeding.
|
|
37
|
+
*
|
|
38
|
+
* @typeParam R - Map of collection NSID → record type (defaults to untyped)
|
|
39
|
+
* @param opts - PDS URL, password, and lexicon directory overrides
|
|
40
|
+
*/
|
|
5
41
|
export function seed(opts) {
|
|
6
42
|
const pdsUrl = opts?.pds || process.env.PDS_URL || 'http://localhost:2583';
|
|
7
43
|
const password = opts?.password || process.env.SEED_PASSWORD || 'password';
|
|
8
44
|
const lexiconsDir = resolve(opts?.lexicons || 'lexicons');
|
|
9
45
|
const lexiconArray = [...loadLexicons(lexiconsDir).values()];
|
|
46
|
+
/** Create a PDS account (or reuse an existing one) and return an authenticated session. */
|
|
10
47
|
async function createAccount(handle) {
|
|
11
48
|
const res = await fetch(`${pdsUrl}/xrpc/com.atproto.server.createAccount`, {
|
|
12
49
|
method: 'POST',
|
|
@@ -34,6 +71,7 @@ export function seed(opts) {
|
|
|
34
71
|
const session = (await sessionRes.json());
|
|
35
72
|
return { ...session, handle };
|
|
36
73
|
}
|
|
74
|
+
/** Validate a record against its lexicon and write it to the PDS via `putRecord`. */
|
|
37
75
|
async function createRecord(session, collection, record, opts) {
|
|
38
76
|
const error = validateRecord(lexiconArray, collection, record);
|
|
39
77
|
if (error) {
|
|
@@ -53,10 +91,11 @@ export function seed(opts) {
|
|
|
53
91
|
if (!res.ok) {
|
|
54
92
|
throw new Error(`[seed] [${session.handle}] failed to create ${collection}: ${await res.text()}`);
|
|
55
93
|
}
|
|
56
|
-
const
|
|
57
|
-
console.log(`[seed] [${session.handle}] ${collection} → ${uri}`);
|
|
58
|
-
return
|
|
94
|
+
const result = (await res.json());
|
|
95
|
+
console.log(`[seed] [${session.handle}] ${collection} → ${result.uri}`);
|
|
96
|
+
return result;
|
|
59
97
|
}
|
|
98
|
+
/** Upload a file to the PDS as a blob. MIME type is inferred from the file extension. */
|
|
60
99
|
async function uploadBlob(session, filePath) {
|
|
61
100
|
const data = readFileSync(resolve(filePath));
|
|
62
101
|
const ext = filePath.split('.').pop()?.toLowerCase() || '';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scan the server/ directory and register all discovered handlers.
|
|
3
|
+
* Setup scripts run immediately (in sorted order).
|
|
4
|
+
*/
|
|
5
|
+
export declare function initServer(serverDir: string, opts?: {
|
|
6
|
+
skipSetup?: boolean;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=server-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-init.d.ts","sourceRoot":"","sources":["../src/server-init.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DjG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { log } from "./logger.js";
|
|
3
|
+
import { scanServerDir } from "./scanner.js";
|
|
4
|
+
import { registerFeed, listFeeds } from "./feeds.js";
|
|
5
|
+
import { registerXrpcHandler, listXrpc } from "./xrpc.js";
|
|
6
|
+
import { registerLabelModule, getLabelDefinitions } from "./labels.js";
|
|
7
|
+
import { registerOgHandler } from "./opengraph.js";
|
|
8
|
+
import { registerHook } from "./hooks.js";
|
|
9
|
+
import { runSetupHandler } from "./setup.js";
|
|
10
|
+
import { registerRenderer } from "./renderer.js";
|
|
11
|
+
/**
|
|
12
|
+
* Scan the server/ directory and register all discovered handlers.
|
|
13
|
+
* Setup scripts run immediately (in sorted order).
|
|
14
|
+
*/
|
|
15
|
+
export async function initServer(serverDir, opts) {
|
|
16
|
+
if (!existsSync(serverDir)) {
|
|
17
|
+
log(`[server] No server/ directory found, skipping`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const scanned = await scanServerDir(serverDir);
|
|
21
|
+
// 1. Run setup scripts first (sorted by name) — skipped in test context
|
|
22
|
+
if (!opts?.skipSetup) {
|
|
23
|
+
for (const entry of scanned.setup.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
24
|
+
await runSetupHandler(entry.name, entry.mod.handler);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// 2. Register feeds
|
|
28
|
+
for (const entry of scanned.feeds) {
|
|
29
|
+
const feedName = entry.name.includes('/') ? entry.name.split('/').pop() : entry.name;
|
|
30
|
+
registerFeed(feedName, entry.mod);
|
|
31
|
+
}
|
|
32
|
+
// 3. Register XRPC handlers
|
|
33
|
+
for (const entry of scanned.queries) {
|
|
34
|
+
registerXrpcHandler(entry.mod.nsid, entry.mod);
|
|
35
|
+
}
|
|
36
|
+
for (const entry of scanned.procedures) {
|
|
37
|
+
registerXrpcHandler(entry.mod.nsid, entry.mod);
|
|
38
|
+
}
|
|
39
|
+
// 4. Register hooks
|
|
40
|
+
for (const entry of scanned.hooks) {
|
|
41
|
+
registerHook(entry.mod.event, entry.mod.handler);
|
|
42
|
+
}
|
|
43
|
+
// 5. Register labels
|
|
44
|
+
for (const entry of scanned.labels) {
|
|
45
|
+
registerLabelModule(entry.name, entry.mod);
|
|
46
|
+
}
|
|
47
|
+
// 6. Register OG handlers
|
|
48
|
+
for (const entry of scanned.og) {
|
|
49
|
+
registerOgHandler(entry.mod);
|
|
50
|
+
}
|
|
51
|
+
// 7. Register renderer
|
|
52
|
+
if (scanned.renderer) {
|
|
53
|
+
registerRenderer(scanned.renderer.mod.handler);
|
|
54
|
+
}
|
|
55
|
+
log(`[server] Initialized from server/ directory:`);
|
|
56
|
+
log(` Feeds: ${listFeeds()
|
|
57
|
+
.map((f) => f.name)
|
|
58
|
+
.join(', ') || 'none'}`);
|
|
59
|
+
log(` XRPC: ${listXrpc().join(', ') || 'none'}`);
|
|
60
|
+
log(` Labels: ${getLabelDefinitions().length} definitions`);
|
|
61
|
+
}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
|
-
import { type Server, type IncomingMessage } from 'node:http';
|
|
2
1
|
import type { OAuthConfig } from './config.ts';
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Register built-in dev.hatk.* XRPC handlers in the handler registry.
|
|
4
|
+
* This makes them available to callXrpc() for use in SSR and server code.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerCoreHandlers(collections: string[], oauth: OAuthConfig | null): void;
|
|
7
|
+
export interface HandlerConfig {
|
|
8
|
+
collections: string[];
|
|
9
|
+
publicDir: string | null;
|
|
10
|
+
oauth: OAuthConfig | null;
|
|
11
|
+
admins: string[];
|
|
12
|
+
renderer?: (request: Request, manifest: any) => Promise<{
|
|
13
|
+
html: string;
|
|
14
|
+
head?: string;
|
|
15
|
+
}>;
|
|
16
|
+
resolveViewer?: (request: Request) => {
|
|
17
|
+
did: string;
|
|
18
|
+
} | null;
|
|
19
|
+
onResync?: () => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a Web Standard request handler for all hatk routes.
|
|
23
|
+
* Returns a pure function: (Request) → Promise<Response>
|
|
24
|
+
*/
|
|
25
|
+
export declare function createHandler(config: HandlerConfig): (request: Request) => Promise<Response>;
|
|
26
|
+
export declare function startServer(port: number, collections: string[], publicDir: string | null, oauth: OAuthConfig | null, admins?: string[], resolveViewer?: (request: Request) => {
|
|
4
27
|
did: string;
|
|
5
|
-
} | null): Server;
|
|
28
|
+
} | null, onResync?: () => void): import('node:http').Server;
|
|
6
29
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AA0B9C;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAwH3F;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxF,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC5D,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA8xB5F;AAGD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,WAAW,GAAG,IAAI,EACzB,MAAM,GAAE,MAAM,EAAO,EACrB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAC5D,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB,OAAO,WAAW,EAAE,MAAM,CAG5B"}
|