@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.
Files changed (150) hide show
  1. package/dist/adapter.d.ts +19 -0
  2. package/dist/adapter.d.ts.map +1 -0
  3. package/dist/adapter.js +107 -0
  4. package/dist/backfill.d.ts +60 -1
  5. package/dist/backfill.d.ts.map +1 -1
  6. package/dist/backfill.js +167 -33
  7. package/dist/car.d.ts +59 -1
  8. package/dist/car.d.ts.map +1 -1
  9. package/dist/car.js +179 -7
  10. package/dist/cbor.d.ts +37 -0
  11. package/dist/cbor.d.ts.map +1 -1
  12. package/dist/cbor.js +36 -3
  13. package/dist/cid.d.ts +37 -0
  14. package/dist/cid.d.ts.map +1 -1
  15. package/dist/cid.js +38 -3
  16. package/dist/cli.js +417 -133
  17. package/dist/cloudflare/container.d.ts +73 -0
  18. package/dist/cloudflare/container.d.ts.map +1 -0
  19. package/dist/cloudflare/container.js +232 -0
  20. package/dist/cloudflare/hooks.d.ts +33 -0
  21. package/dist/cloudflare/hooks.d.ts.map +1 -0
  22. package/dist/cloudflare/hooks.js +40 -0
  23. package/dist/cloudflare/init.d.ts +27 -0
  24. package/dist/cloudflare/init.d.ts.map +1 -0
  25. package/dist/cloudflare/init.js +103 -0
  26. package/dist/cloudflare/worker.d.ts +27 -0
  27. package/dist/cloudflare/worker.d.ts.map +1 -0
  28. package/dist/cloudflare/worker.js +54 -0
  29. package/dist/config.d.ts +12 -1
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +36 -9
  32. package/dist/database/adapter-factory.d.ts +6 -0
  33. package/dist/database/adapter-factory.d.ts.map +1 -0
  34. package/dist/database/adapter-factory.js +20 -0
  35. package/dist/database/adapters/d1.d.ts +56 -0
  36. package/dist/database/adapters/d1.d.ts.map +1 -0
  37. package/dist/database/adapters/d1.js +108 -0
  38. package/dist/database/adapters/duckdb-search.d.ts +12 -0
  39. package/dist/database/adapters/duckdb-search.d.ts.map +1 -0
  40. package/dist/database/adapters/duckdb-search.js +27 -0
  41. package/dist/database/adapters/duckdb.d.ts +25 -0
  42. package/dist/database/adapters/duckdb.d.ts.map +1 -0
  43. package/dist/database/adapters/duckdb.js +161 -0
  44. package/dist/database/adapters/sqlite-search.d.ts +23 -0
  45. package/dist/database/adapters/sqlite-search.d.ts.map +1 -0
  46. package/dist/database/adapters/sqlite-search.js +74 -0
  47. package/dist/database/adapters/sqlite.d.ts +18 -0
  48. package/dist/database/adapters/sqlite.d.ts.map +1 -0
  49. package/dist/database/adapters/sqlite.js +87 -0
  50. package/dist/database/db.d.ts +159 -0
  51. package/dist/database/db.d.ts.map +1 -0
  52. package/dist/database/db.js +1445 -0
  53. package/dist/database/dialect.d.ts +45 -0
  54. package/dist/database/dialect.d.ts.map +1 -0
  55. package/dist/database/dialect.js +72 -0
  56. package/dist/database/fts.d.ts +27 -0
  57. package/dist/database/fts.d.ts.map +1 -0
  58. package/dist/database/fts.js +846 -0
  59. package/dist/database/index.d.ts +7 -0
  60. package/dist/database/index.d.ts.map +1 -0
  61. package/dist/database/index.js +6 -0
  62. package/dist/database/ports.d.ts +50 -0
  63. package/dist/database/ports.d.ts.map +1 -0
  64. package/dist/database/ports.js +1 -0
  65. package/dist/database/schema.d.ts +61 -0
  66. package/dist/database/schema.d.ts.map +1 -0
  67. package/dist/database/schema.js +394 -0
  68. package/dist/db.d.ts +1 -1
  69. package/dist/db.d.ts.map +1 -1
  70. package/dist/db.js +4 -38
  71. package/dist/dev-entry.d.ts +8 -0
  72. package/dist/dev-entry.d.ts.map +1 -0
  73. package/dist/dev-entry.js +110 -0
  74. package/dist/feeds.d.ts +12 -8
  75. package/dist/feeds.d.ts.map +1 -1
  76. package/dist/feeds.js +45 -6
  77. package/dist/fts.d.ts.map +1 -1
  78. package/dist/fts.js +5 -0
  79. package/dist/hooks.d.ts +22 -0
  80. package/dist/hooks.d.ts.map +1 -0
  81. package/dist/hooks.js +75 -0
  82. package/dist/hydrate.d.ts +6 -5
  83. package/dist/hydrate.d.ts.map +1 -1
  84. package/dist/hydrate.js +4 -16
  85. package/dist/indexer.d.ts +20 -0
  86. package/dist/indexer.d.ts.map +1 -1
  87. package/dist/indexer.js +53 -7
  88. package/dist/labels.d.ts +34 -0
  89. package/dist/labels.d.ts.map +1 -1
  90. package/dist/labels.js +66 -6
  91. package/dist/logger.d.ts +29 -0
  92. package/dist/logger.d.ts.map +1 -1
  93. package/dist/logger.js +29 -0
  94. package/dist/main.js +134 -67
  95. package/dist/mst.d.ts +18 -1
  96. package/dist/mst.d.ts.map +1 -1
  97. package/dist/mst.js +19 -8
  98. package/dist/oauth/db.d.ts.map +1 -1
  99. package/dist/oauth/db.js +43 -17
  100. package/dist/oauth/server.d.ts +2 -0
  101. package/dist/oauth/server.d.ts.map +1 -1
  102. package/dist/oauth/server.js +102 -7
  103. package/dist/oauth/session.d.ts +11 -0
  104. package/dist/oauth/session.d.ts.map +1 -0
  105. package/dist/oauth/session.js +65 -0
  106. package/dist/opengraph.d.ts +10 -0
  107. package/dist/opengraph.d.ts.map +1 -1
  108. package/dist/opengraph.js +73 -39
  109. package/dist/pds-proxy.d.ts +42 -0
  110. package/dist/pds-proxy.d.ts.map +1 -0
  111. package/dist/pds-proxy.js +189 -0
  112. package/dist/renderer.d.ts +27 -0
  113. package/dist/renderer.d.ts.map +1 -0
  114. package/dist/renderer.js +46 -0
  115. package/dist/resolve-hatk.d.ts +6 -0
  116. package/dist/resolve-hatk.d.ts.map +1 -0
  117. package/dist/resolve-hatk.js +20 -0
  118. package/dist/response.d.ts +16 -0
  119. package/dist/response.d.ts.map +1 -0
  120. package/dist/response.js +69 -0
  121. package/dist/scanner.d.ts +21 -0
  122. package/dist/scanner.d.ts.map +1 -0
  123. package/dist/scanner.js +88 -0
  124. package/dist/schema.d.ts +8 -0
  125. package/dist/schema.d.ts.map +1 -1
  126. package/dist/schema.js +29 -0
  127. package/dist/seed.d.ts +19 -0
  128. package/dist/seed.d.ts.map +1 -1
  129. package/dist/seed.js +43 -4
  130. package/dist/server-init.d.ts +8 -0
  131. package/dist/server-init.d.ts.map +1 -0
  132. package/dist/server-init.js +61 -0
  133. package/dist/server.d.ts +26 -3
  134. package/dist/server.d.ts.map +1 -1
  135. package/dist/server.js +528 -635
  136. package/dist/setup.d.ts +28 -1
  137. package/dist/setup.d.ts.map +1 -1
  138. package/dist/setup.js +50 -3
  139. package/dist/test.d.ts +1 -1
  140. package/dist/test.d.ts.map +1 -1
  141. package/dist/test.js +38 -32
  142. package/dist/views.js +1 -1
  143. package/dist/vite-plugin.d.ts +1 -1
  144. package/dist/vite-plugin.d.ts.map +1 -1
  145. package/dist/vite-plugin.js +254 -66
  146. package/dist/xrpc.d.ts +46 -10
  147. package/dist/xrpc.d.ts.map +1 -1
  148. package/dist/xrpc.js +128 -39
  149. package/package.json +13 -6
  150. package/public/admin.html +0 -54
@@ -0,0 +1,45 @@
1
+ import type { Dialect } from './ports.ts';
2
+ export interface SqlDialect {
3
+ /** Map from lexicon type key to SQL column type */
4
+ typeMap: Record<string, string>;
5
+ /** Timestamp type name */
6
+ timestampType: string;
7
+ /** JSON type name */
8
+ jsonType: string;
9
+ /** Parameter placeholder for index (1-based). DuckDB/Postgres: $1 SQLite: ? */
10
+ param(index: number): string;
11
+ /** Whether the engine supports native bulk appenders (DuckDB) vs batched INSERT */
12
+ supportsAppender: boolean;
13
+ /** SQL for upsert — 'INSERT OR REPLACE' (DuckDB/SQLite) vs 'ON CONFLICT DO UPDATE' */
14
+ upsertPrefix: string;
15
+ /** Extract a string value from a JSON column. Returns SQL expression. */
16
+ jsonExtractString(column: string, path: string): string;
17
+ /** Aggregate strings from a JSON array. Returns SQL expression. */
18
+ jsonArrayStringAgg(column: string, jsonPath: string): string;
19
+ /** Information schema query to list user tables */
20
+ listTablesQuery: string;
21
+ /** CHECKPOINT or equivalent (for WAL compaction). null if not needed. */
22
+ checkpointSQL: string | null;
23
+ /** Current timestamp expression */
24
+ currentTimestamp: string;
25
+ /** ILIKE or equivalent for case-insensitive matching */
26
+ ilike: string;
27
+ /** Cast expression for safe timestamp parsing. DuckDB: TRY_CAST(x AS TIMESTAMP), SQLite: x */
28
+ tryCastTimestamp(expr: string): string;
29
+ /** COUNT(*)::INTEGER or equivalent */
30
+ countAsInteger: string;
31
+ /** GREATEST(...) or MAX(...) for multi-arg max */
32
+ greatest(exprs: string[]): string;
33
+ /** jaro_winkler_similarity or null if unsupported */
34
+ jaroWinklerSimilarity: string | null;
35
+ /** string_agg or group_concat */
36
+ stringAgg(column: string, separator: string): string;
37
+ /** CREATE SEQUENCE support */
38
+ supportsSequences: boolean;
39
+ /** SQL to get columns for a table. Returns rows with column_name/name and data_type/type. */
40
+ introspectColumnsQuery(tableName: string): string;
41
+ }
42
+ export declare const DUCKDB_DIALECT: SqlDialect;
43
+ export declare const SQLITE_DIALECT: SqlDialect;
44
+ export declare function getDialect(dialect: Dialect): SqlDialect;
45
+ //# sourceMappingURL=dialect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/database/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE/B,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAA;IAErB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAA;IAEhB,gFAAgF;IAChF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAE5B,mFAAmF;IACnF,gBAAgB,EAAE,OAAO,CAAA;IAEzB,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAA;IAEpB,yEAAyE;IACzE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAEvD,mEAAmE;IACnE,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IAE5D,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAA;IAEvB,yEAAyE;IACzE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAE5B,mCAAmC;IACnC,gBAAgB,EAAE,MAAM,CAAA;IAExB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAA;IAEb,8FAA8F;IAC9F,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAEtC,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAA;IAEtB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAEjC,qDAAqD;IACrD,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAA;IAEpC,iCAAiC;IACjC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;IAEpD,8BAA8B;IAC9B,iBAAiB,EAAE,OAAO,CAAA;IAE1B,6FAA6F;IAC7F,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;CAClD;AAED,eAAO,MAAM,cAAc,EAAE,UA8B5B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,UA+B5B,CAAA;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CASvD"}
@@ -0,0 +1,72 @@
1
+ export const DUCKDB_DIALECT = {
2
+ typeMap: {
3
+ text: 'TEXT',
4
+ integer: 'INTEGER',
5
+ bigint: 'BIGINT',
6
+ boolean: 'BOOLEAN',
7
+ blob: 'BLOB',
8
+ timestamp: 'TIMESTAMP',
9
+ timestamptz: 'TIMESTAMPTZ',
10
+ json: 'JSON',
11
+ },
12
+ timestampType: 'TIMESTAMP',
13
+ jsonType: 'JSON',
14
+ param: (i) => `$${i}`,
15
+ supportsAppender: true,
16
+ upsertPrefix: 'INSERT OR REPLACE INTO',
17
+ jsonExtractString: (col, path) => `json_extract_string(${col}, '${path}')`,
18
+ jsonArrayStringAgg: (col, path) => `list_string_agg(json_extract_string(${col}, '${path}'))`,
19
+ listTablesQuery: `SELECT table_name FROM information_schema.tables WHERE table_schema = 'main' AND table_name NOT LIKE '\\_%' ESCAPE '\\\\'`,
20
+ checkpointSQL: 'CHECKPOINT',
21
+ currentTimestamp: 'CURRENT_TIMESTAMP',
22
+ ilike: 'ILIKE',
23
+ tryCastTimestamp: (expr) => `TRY_CAST(${expr} AS TIMESTAMP)`,
24
+ countAsInteger: 'COUNT(*)::INTEGER',
25
+ greatest: (exprs) => `GREATEST(${exprs.join(', ')})`,
26
+ jaroWinklerSimilarity: 'jaro_winkler_similarity',
27
+ stringAgg: (col, sep) => `string_agg(${col}, ${sep})`,
28
+ supportsSequences: true,
29
+ introspectColumnsQuery: (tableName) => `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '${tableName}'`,
30
+ };
31
+ export const SQLITE_DIALECT = {
32
+ typeMap: {
33
+ text: 'TEXT',
34
+ integer: 'INTEGER',
35
+ bigint: 'INTEGER',
36
+ boolean: 'INTEGER',
37
+ blob: 'BLOB',
38
+ timestamp: 'TEXT',
39
+ timestamptz: 'TEXT',
40
+ json: 'TEXT',
41
+ },
42
+ timestampType: 'TEXT',
43
+ jsonType: 'TEXT',
44
+ param: (_i) => '?',
45
+ supportsAppender: false,
46
+ upsertPrefix: 'INSERT OR REPLACE INTO',
47
+ jsonExtractString: (col, path) => `json_extract(${col}, '${path}')`,
48
+ jsonArrayStringAgg: (col, path) => {
49
+ return `(SELECT group_concat(je.value, ' ') FROM json_each(${col}, '${path}') je)`;
50
+ },
51
+ listTablesQuery: `SELECT name AS table_name FROM sqlite_master WHERE type='table' AND name NOT LIKE '\\_%' ESCAPE '\\\\'`,
52
+ checkpointSQL: null,
53
+ currentTimestamp: 'CURRENT_TIMESTAMP',
54
+ ilike: 'LIKE',
55
+ tryCastTimestamp: (expr) => expr,
56
+ countAsInteger: 'CAST(COUNT(*) AS INTEGER)',
57
+ greatest: (exprs) => `MAX(${exprs.join(', ')})`,
58
+ jaroWinklerSimilarity: null,
59
+ stringAgg: (col, sep) => `group_concat(${col}, ${sep})`,
60
+ supportsSequences: false,
61
+ introspectColumnsQuery: (tableName) => `PRAGMA table_info("${tableName}")`,
62
+ };
63
+ export function getDialect(dialect) {
64
+ switch (dialect) {
65
+ case 'duckdb':
66
+ return DUCKDB_DIALECT;
67
+ case 'sqlite':
68
+ return SQLITE_DIALECT;
69
+ case 'postgres':
70
+ throw new Error('PostgreSQL adapter not yet implemented');
71
+ }
72
+ }
@@ -0,0 +1,27 @@
1
+ import type { SearchPort } from './ports.ts';
2
+ export declare function setSearchPort(port: SearchPort | null): void;
3
+ export declare function hasSearchPort(): boolean;
4
+ export declare function getSearchPort(): SearchPort | null;
5
+ export declare function getSearchColumns(collection: string): string[];
6
+ export declare function getLastRebuiltAt(collection: string): string | null;
7
+ /**
8
+ * DuckDB FTS can't handle dots in table names (interprets them as catalog.schema.table).
9
+ * We create a shadow table with underscored names for FTS indexing.
10
+ */
11
+ export declare function ftsTableName(collection: string): string;
12
+ /**
13
+ * Build FTS index for a collection.
14
+ * Creates a shadow table copy and indexes all TEXT NOT NULL columns
15
+ * using Porter stemmer with English stopwords.
16
+ */
17
+ export declare function buildFtsIndex(collection: string): Promise<void>;
18
+ export declare function buildFtsRow(collection: string, uri: string): Promise<Record<string, string | null> | null>;
19
+ export declare function updateFtsRecord(collection: string, uri: string): Promise<void>;
20
+ export declare function deleteFtsRecord(collection: string, uri: string): Promise<void>;
21
+ /**
22
+ * Strip English stop words from a search query, preserving non-stop-word terms.
23
+ * Returns the cleaned query string. If all words are stop words, returns the original query.
24
+ */
25
+ export declare function stripStopWords(query: string): string;
26
+ export declare function rebuildAllIndexes(collections: string[]): Promise<void>;
27
+ //# sourceMappingURL=fts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/database/fts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAuE5C,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAE3D;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAWD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAgFD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrE;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAehH;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAepF;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpF;AAokBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B5E"}