@vercel/kv2 0.0.1

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 (166) hide show
  1. package/README.md +87 -0
  2. package/SKILL.md +65 -0
  3. package/dist/blob-format.d.ts +35 -0
  4. package/dist/blob-format.d.ts.map +1 -0
  5. package/dist/blob-format.js +91 -0
  6. package/dist/blob-format.js.map +1 -0
  7. package/dist/blob-store.d.ts +11 -0
  8. package/dist/blob-store.d.ts.map +1 -0
  9. package/dist/blob-store.js +32 -0
  10. package/dist/blob-store.js.map +1 -0
  11. package/dist/cache.d.ts +33 -0
  12. package/dist/cache.d.ts.map +1 -0
  13. package/dist/cache.js +146 -0
  14. package/dist/cache.js.map +1 -0
  15. package/dist/cached-kv.d.ts +63 -0
  16. package/dist/cached-kv.d.ts.map +1 -0
  17. package/dist/cached-kv.js +891 -0
  18. package/dist/cached-kv.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +342 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/create-kv.d.ts +86 -0
  24. package/dist/create-kv.d.ts.map +1 -0
  25. package/dist/create-kv.js +125 -0
  26. package/dist/create-kv.js.map +1 -0
  27. package/dist/disk-cache.d.ts.map +1 -0
  28. package/dist/disk-cache.js.map +1 -0
  29. package/dist/index.d.ts +16 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +13 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/indexed-kv.d.ts +44 -0
  34. package/dist/indexed-kv.d.ts.map +1 -0
  35. package/dist/indexed-kv.js +373 -0
  36. package/dist/indexed-kv.js.map +1 -0
  37. package/dist/manifest-log.d.ts +57 -0
  38. package/dist/manifest-log.d.ts.map +1 -0
  39. package/dist/manifest-log.js +128 -0
  40. package/dist/manifest-log.js.map +1 -0
  41. package/dist/memory-cache.d.ts +22 -0
  42. package/dist/memory-cache.d.ts.map +1 -0
  43. package/dist/memory-cache.js +90 -0
  44. package/dist/memory-cache.js.map +1 -0
  45. package/dist/proxy-cache.d.ts +40 -0
  46. package/dist/proxy-cache.d.ts.map +1 -0
  47. package/dist/proxy-cache.js +124 -0
  48. package/dist/proxy-cache.js.map +1 -0
  49. package/dist/readme.test.d.ts +9 -0
  50. package/dist/readme.test.d.ts.map +1 -0
  51. package/dist/readme.test.js +285 -0
  52. package/dist/readme.test.js.map +1 -0
  53. package/dist/schema/define-schema.d.ts +35 -0
  54. package/dist/schema/define-schema.d.ts.map +1 -0
  55. package/dist/schema/define-schema.js +70 -0
  56. package/dist/schema/define-schema.js.map +1 -0
  57. package/dist/schema/index.d.ts +4 -0
  58. package/dist/schema/index.d.ts.map +1 -0
  59. package/dist/schema/index.js +5 -0
  60. package/dist/schema/index.js.map +1 -0
  61. package/dist/schema/key-builders.d.ts +40 -0
  62. package/dist/schema/key-builders.d.ts.map +1 -0
  63. package/dist/schema/key-builders.js +124 -0
  64. package/dist/schema/key-builders.js.map +1 -0
  65. package/dist/schema/schema-kv.d.ts +48 -0
  66. package/dist/schema/schema-kv.d.ts.map +1 -0
  67. package/dist/schema/schema-kv.js +96 -0
  68. package/dist/schema/schema-kv.js.map +1 -0
  69. package/dist/schema/tree.d.ts +14 -0
  70. package/dist/schema/tree.d.ts.map +1 -0
  71. package/dist/schema/tree.js +135 -0
  72. package/dist/schema/tree.js.map +1 -0
  73. package/dist/schema/types.d.ts +135 -0
  74. package/dist/schema/types.d.ts.map +1 -0
  75. package/dist/schema/types.js +2 -0
  76. package/dist/schema/types.js.map +1 -0
  77. package/dist/testing/core-tests.d.ts +30 -0
  78. package/dist/testing/core-tests.d.ts.map +1 -0
  79. package/dist/testing/core-tests.js +383 -0
  80. package/dist/testing/core-tests.js.map +1 -0
  81. package/dist/testing/create-kv-test-setup.d.ts +21 -0
  82. package/dist/testing/create-kv-test-setup.d.ts.map +1 -0
  83. package/dist/testing/create-kv-test-setup.js +25 -0
  84. package/dist/testing/create-kv-test-setup.js.map +1 -0
  85. package/dist/testing/debug-manifest.d.ts +2 -0
  86. package/dist/testing/debug-manifest.d.ts.map +1 -0
  87. package/dist/testing/debug-manifest.js +14 -0
  88. package/dist/testing/debug-manifest.js.map +1 -0
  89. package/dist/testing/fake-blob-store.d.ts +23 -0
  90. package/dist/testing/fake-blob-store.d.ts.map +1 -0
  91. package/dist/testing/fake-blob-store.js +158 -0
  92. package/dist/testing/fake-blob-store.js.map +1 -0
  93. package/dist/testing/fake-cache.d.ts +54 -0
  94. package/dist/testing/fake-cache.d.ts.map +1 -0
  95. package/dist/testing/fake-cache.js +137 -0
  96. package/dist/testing/fake-cache.js.map +1 -0
  97. package/dist/testing/index.d.ts +34 -0
  98. package/dist/testing/index.d.ts.map +1 -0
  99. package/dist/testing/index.js +101 -0
  100. package/dist/testing/index.js.map +1 -0
  101. package/dist/testing/manifest-test-setup.d.ts +22 -0
  102. package/dist/testing/manifest-test-setup.d.ts.map +1 -0
  103. package/dist/testing/manifest-test-setup.js +43 -0
  104. package/dist/testing/manifest-test-setup.js.map +1 -0
  105. package/dist/testing/perf-test.d.ts +13 -0
  106. package/dist/testing/perf-test.d.ts.map +1 -0
  107. package/dist/testing/perf-test.js +101 -0
  108. package/dist/testing/perf-test.js.map +1 -0
  109. package/dist/testing/run-tests.d.ts +2 -0
  110. package/dist/testing/run-tests.d.ts.map +1 -0
  111. package/dist/testing/run-tests.js +141 -0
  112. package/dist/testing/run-tests.js.map +1 -0
  113. package/dist/testing/setup.d.ts +2 -0
  114. package/dist/testing/setup.d.ts.map +1 -0
  115. package/dist/testing/setup.js +3 -0
  116. package/dist/testing/setup.js.map +1 -0
  117. package/dist/testing/test-index.d.ts +28 -0
  118. package/dist/testing/test-index.d.ts.map +1 -0
  119. package/dist/testing/test-index.js +35 -0
  120. package/dist/testing/test-index.js.map +1 -0
  121. package/dist/testing/test-setup.d.ts +32 -0
  122. package/dist/testing/test-setup.d.ts.map +1 -0
  123. package/dist/testing/test-setup.js +72 -0
  124. package/dist/testing/test-setup.js.map +1 -0
  125. package/dist/testing/upstream-kv-test-setup.d.ts +30 -0
  126. package/dist/testing/upstream-kv-test-setup.d.ts.map +1 -0
  127. package/dist/testing/upstream-kv-test-setup.js +66 -0
  128. package/dist/testing/upstream-kv-test-setup.js.map +1 -0
  129. package/dist/testing/vitest-compat.d.ts +92 -0
  130. package/dist/testing/vitest-compat.d.ts.map +1 -0
  131. package/dist/testing/vitest-compat.js +601 -0
  132. package/dist/testing/vitest-compat.js.map +1 -0
  133. package/dist/tracing.d.ts +71 -0
  134. package/dist/tracing.d.ts.map +1 -0
  135. package/dist/tracing.js +232 -0
  136. package/dist/tracing.js.map +1 -0
  137. package/dist/typed-kv.d.ts +120 -0
  138. package/dist/typed-kv.d.ts.map +1 -0
  139. package/dist/typed-kv.js +565 -0
  140. package/dist/typed-kv.js.map +1 -0
  141. package/dist/typed-upstream-kv.d.ts +17 -0
  142. package/dist/typed-upstream-kv.d.ts.map +1 -0
  143. package/dist/typed-upstream-kv.js +38 -0
  144. package/dist/typed-upstream-kv.js.map +1 -0
  145. package/dist/types.d.ts +199 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +23 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/upstream-kv.d.ts +84 -0
  150. package/dist/upstream-kv.d.ts.map +1 -0
  151. package/dist/upstream-kv.js +375 -0
  152. package/dist/upstream-kv.js.map +1 -0
  153. package/docs/api-reference.md +222 -0
  154. package/docs/caching.md +60 -0
  155. package/docs/cli.md +123 -0
  156. package/docs/copy-on-write-branches.md +98 -0
  157. package/docs/getting-started.md +61 -0
  158. package/docs/indexes.md +122 -0
  159. package/docs/iterating-and-pagination.md +93 -0
  160. package/docs/metadata.md +82 -0
  161. package/docs/optimistic-locking.md +72 -0
  162. package/docs/schema-and-trees.md +222 -0
  163. package/docs/streaming.md +61 -0
  164. package/docs/testing-and-tracing.md +141 -0
  165. package/docs/typed-stores.md +68 -0
  166. package/package.json +63 -0
@@ -0,0 +1,96 @@
1
+ import { createKeyBuilders } from "./key-builders.js";
2
+ import { buildTree } from "./tree.js";
3
+ /**
4
+ * Create a schema-aware KV interface.
5
+ *
6
+ * Provides type-safe operations with key builders and lazy tree iteration.
7
+ *
8
+ * @param schema - Schema definition from defineSchema()
9
+ * @param kv - Underlying KV store (typically from kv.getStore())
10
+ * @returns SchemaKV interface with type-safe operations
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const schema = defineSchema("boards/", {
15
+ * boards: {
16
+ * pattern: "*",
17
+ * value: {} as Board,
18
+ * metadata: {} as BoardMeta,
19
+ * children: {
20
+ * columns: {
21
+ * pattern: "columns/*",
22
+ * value: {} as Column,
23
+ * children: {
24
+ * tasks: { pattern: "tasks/*", value: {} as Task }
25
+ * }
26
+ * }
27
+ * }
28
+ * }
29
+ * });
30
+ *
31
+ * const kv = createSchemaKV(schema, rawKV.getStore("boards/"));
32
+ *
33
+ * // Type-safe key builders
34
+ * kv.key.boards("board-1") // → "board-1"
35
+ * kv.key.columns("board-1", "col-1") // → "board-1/columns/col-1"
36
+ *
37
+ * // Lazy tree with batched fetching
38
+ * const board = await kv.tree("boards", "board-1");
39
+ * for await (const col of board.columns) {
40
+ * console.log(col.value.name);
41
+ * for await (const task of col.tasks) {
42
+ * console.log(task.value.title);
43
+ * }
44
+ * }
45
+ * ```
46
+ */
47
+ export function createSchemaKV(schema, kv) {
48
+ const keyBuilders = createKeyBuilders(schema);
49
+ // Implementation uses `any` internally for simpler code,
50
+ // but the public interface is fully type-safe via SchemaKV<P, E>
51
+ const impl = {
52
+ raw: kv,
53
+ key: keyBuilders,
54
+ async tree(type, ...ids) {
55
+ const node = schema.entities[type];
56
+ if (!node) {
57
+ throw new Error(`Unknown entity type: ${type}`);
58
+ }
59
+ // Build the root key using the key builder
60
+ const keyBuilder = keyBuilders[type];
61
+ const rootKey = keyBuilder(...ids);
62
+ // The root ID is the last ID provided
63
+ const rootId = ids[ids.length - 1] || rootKey;
64
+ // SINGLE keys() call to get all descendant keys
65
+ const allKeys = [rootKey];
66
+ for await (const key of kv.keys(`${rootKey}/`)) {
67
+ allKeys.push(key);
68
+ }
69
+ // Build the tree with lazy child iterators
70
+ return buildTree(kv, allKeys, rootKey, rootId, node);
71
+ },
72
+ async get(type, ...ids) {
73
+ const keyBuilder = keyBuilders[type];
74
+ const key = keyBuilder(...ids);
75
+ const result = await kv.get(key);
76
+ if (!result.exists)
77
+ return null;
78
+ return {
79
+ value: await result.value,
80
+ metadata: result.metadata,
81
+ };
82
+ },
83
+ async set(type, value, metadata, ...ids) {
84
+ const keyBuilder = keyBuilders[type];
85
+ const key = keyBuilder(...ids);
86
+ await kv.set(key, value, metadata);
87
+ },
88
+ async delete(type, ...ids) {
89
+ const keyBuilder = keyBuilders[type];
90
+ const key = keyBuilder(...ids);
91
+ await kv.delete(key);
92
+ },
93
+ };
94
+ return impl;
95
+ }
96
+ //# sourceMappingURL=schema-kv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-kv.js","sourceRoot":"","sources":["../../src/schema/schema-kv.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,UAAU,cAAc,CAI5B,MAAuB,EAAE,EAAmB;IAC7C,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE9C,yDAAyD;IACzD,iEAAiE;IACjE,MAAM,IAAI,GAAG;QACZ,GAAG,EAAE,EAAE;QACP,GAAG,EAAE,WAAW;QAEhB,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,GAAG,GAAa;YACxC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAkB,CAAC;YACpD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;YACjD,CAAC;YAED,2CAA2C;YAC3C,MAAM,UAAU,GACf,WACA,CAAC,IAAI,CAAC,CAAC;YACR,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;YAEnC,sCAAsC;YACtC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;YAE9C,gDAAgD;YAChD,MAAM,OAAO,GAAa,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;YAED,2CAA2C;YAC3C,OAAO,SAAS,CACf,EAAE,EACF,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAIC,CACD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,GAAG,GAAa;YACvC,MAAM,UAAU,GACf,WACA,CAAC,IAAI,CAAC,CAAC;YACR,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAEhC,OAAO;gBACN,KAAK,EAAE,MAAM,MAAM,CAAC,KAAK;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aACzB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CACR,IAAY,EACZ,KAAc,EACd,QAAiB,EACjB,GAAG,GAAa;YAEhB,MAAM,UAAU,GACf,WACA,CAAC,IAAI,CAAC,CAAC;YACR,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;YAE/B,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,GAAG,GAAa;YAC1C,MAAM,UAAU,GACf,WACA,CAAC,IAAI,CAAC,CAAC;YACR,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;YAE/B,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;KACD,CAAC;IAEF,OAAO,IAAiC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { KVLike } from "../types.js";
2
+ import type { SchemaNodeDef, TreeNodeWithChildren } from "./types.js";
3
+ /**
4
+ * Build the root of a tree from fetched data.
5
+ *
6
+ * @param kv - The KV store
7
+ * @param allKeys - All keys from keys() call (including root)
8
+ * @param rootKey - The root entity key
9
+ * @param rootId - The root entity ID
10
+ * @param rootNode - The schema node for the root
11
+ * @returns Root tree node with child iterators, or null if not found
12
+ */
13
+ export declare function buildTree<V, M, C extends Record<string, SchemaNodeDef>>(kv: KVLike<unknown>, allKeys: string[], rootKey: string, rootId: string, rootNode: SchemaNodeDef<V, M, C>): Promise<TreeNodeWithChildren<V, M, C> | null>;
14
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/schema/tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EACX,aAAa,EAIb,oBAAoB,EACpB,MAAM,YAAY,CAAC;AAoMpB;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAC5E,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EACnB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAe/C"}
@@ -0,0 +1,135 @@
1
+ import { createKeyPattern, extractIdFromKey } from "./key-builders.js";
2
+ /**
3
+ * Build a tree node from a fetched value, including lazy child iterators.
4
+ *
5
+ * @param kv - The KV store to fetch from
6
+ * @param allKeys - All keys from the initial keys() call
7
+ * @param key - The key of this node
8
+ * @param id - The extracted ID of this node
9
+ * @param value - The fetched value
10
+ * @param metadata - The fetched metadata
11
+ * @param node - The schema node definition
12
+ * @param parentPatterns - Patterns from ancestor nodes
13
+ * @returns TreeNode with child iterators attached
14
+ */
15
+ function buildTreeNode(kv, allKeys, key, id, value, metadata, node, parentPatterns) {
16
+ const treeNode = {
17
+ id,
18
+ key,
19
+ value,
20
+ metadata,
21
+ };
22
+ // Add child iterators based on schema
23
+ if (node.children) {
24
+ const currentPatterns = [...parentPatterns, node.pattern];
25
+ for (const [childName, childNode] of Object.entries(node.children)) {
26
+ treeNode[childName] =
27
+ createChildIterator(kv, allKeys, key, childNode, currentPatterns);
28
+ }
29
+ }
30
+ return treeNode;
31
+ }
32
+ /**
33
+ * Create a lazy iterator for child nodes.
34
+ *
35
+ * The iterator batches all value fetches on first access, then yields
36
+ * tree nodes one by one. This provides both lazy evaluation (no fetch
37
+ * until iteration) and efficient batching (all fetches in parallel).
38
+ */
39
+ function createChildIterator(kv, allKeys, parentKey, childNode, parentPatterns) {
40
+ // Create pattern to match child keys
41
+ const childPattern = createKeyPattern(childNode, parentPatterns);
42
+ // Filter keys that match this child type and are under the parent
43
+ const childPrefix = parentKey + "/";
44
+ const matchingKeys = allKeys.filter((k) => {
45
+ if (!k.startsWith(childPrefix))
46
+ return false;
47
+ // Get the relative key (after parent prefix) and check if it matches
48
+ // Actually, we need to match the full key pattern
49
+ return childPattern.test(k);
50
+ });
51
+ // Sort keys for consistent ordering
52
+ matchingKeys.sort();
53
+ let fetchedNodes = null;
54
+ let fetchPromise = null;
55
+ // Fetch all children with bounded concurrency
56
+ async function fetchAll() {
57
+ if (fetchedNodes !== null)
58
+ return fetchedNodes;
59
+ if (fetchPromise !== null)
60
+ return fetchPromise;
61
+ fetchPromise = (async () => {
62
+ // Use getMany for bounded concurrent fetching
63
+ const entries = await kv.getMany(matchingKeys);
64
+ const nodes = [];
65
+ for (const key of matchingKeys) {
66
+ const entry = entries.get(key);
67
+ if (!entry)
68
+ continue;
69
+ const id = extractIdFromKey(key, childPattern);
70
+ if (!id)
71
+ continue;
72
+ nodes.push(buildTreeNode(kv, allKeys, key, id, await entry.value, entry.metadata, childNode, parentPatterns));
73
+ }
74
+ fetchedNodes = nodes;
75
+ return fetchedNodes;
76
+ })();
77
+ return fetchPromise;
78
+ }
79
+ const iterator = {
80
+ async *[Symbol.asyncIterator]() {
81
+ const nodes = await fetchAll();
82
+ for (const node of nodes) {
83
+ yield node;
84
+ }
85
+ },
86
+ async page(limit, cursor) {
87
+ // Cursor is just an offset into matchingKeys
88
+ const offset = cursor ? Number.parseInt(cursor, 10) : 0;
89
+ const pageKeys = matchingKeys.slice(offset, offset + limit);
90
+ // Fetch values for this page
91
+ const entries = await kv.getMany(pageKeys);
92
+ const items = [];
93
+ for (const key of pageKeys) {
94
+ const entry = entries.get(key);
95
+ if (!entry)
96
+ continue;
97
+ const id = extractIdFromKey(key, childPattern);
98
+ if (!id)
99
+ continue;
100
+ items.push(buildTreeNode(kv, allKeys, key, id, await entry.value, entry.metadata, childNode, parentPatterns));
101
+ }
102
+ const nextOffset = offset + limit;
103
+ const nextCursor = nextOffset < matchingKeys.length ? String(nextOffset) : undefined;
104
+ return { items, cursor: nextCursor };
105
+ },
106
+ async collect() {
107
+ return fetchAll();
108
+ },
109
+ count() {
110
+ return matchingKeys.length;
111
+ },
112
+ keys() {
113
+ return [...matchingKeys];
114
+ },
115
+ };
116
+ return iterator;
117
+ }
118
+ /**
119
+ * Build the root of a tree from fetched data.
120
+ *
121
+ * @param kv - The KV store
122
+ * @param allKeys - All keys from keys() call (including root)
123
+ * @param rootKey - The root entity key
124
+ * @param rootId - The root entity ID
125
+ * @param rootNode - The schema node for the root
126
+ * @returns Root tree node with child iterators, or null if not found
127
+ */
128
+ export async function buildTree(kv, allKeys, rootKey, rootId, rootNode) {
129
+ // Fetch root value
130
+ const result = await kv.get(rootKey);
131
+ if (!result.exists)
132
+ return null;
133
+ return buildTreeNode(kv, allKeys, rootKey, rootId, await result.value, result.metadata, rootNode, []);
134
+ }
135
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/schema/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import type { KVLike } from "../types.js";
2
+ /**
3
+ * Schema node definition for hierarchical entities.
4
+ * Used in defineSchema() to define key patterns and types.
5
+ */
6
+ export interface SchemaNodeDef<V = unknown, M = unknown, C extends Record<string, any> | undefined = Record<string, any> | undefined, P extends string = string> {
7
+ /** Pattern for this level. "*" matches a single path segment (ID). */
8
+ pattern: P;
9
+ /** Type placeholder for the value (use `{} as YourType`) */
10
+ value: V;
11
+ /** Type placeholder for metadata (use `{} as YourMeta`) */
12
+ metadata?: M;
13
+ /** Child entity definitions */
14
+ children?: C;
15
+ }
16
+ type ChildrenOf<N> = N extends SchemaNodeDef<any, any, infer C> ? C extends Record<string, SchemaNodeDef<any, any, any>> ? C : Record<string, never> : Record<string, never>;
17
+ /**
18
+ * Root schema configuration returned by defineSchema().
19
+ */
20
+ export interface SchemaDef<P extends string, E extends Record<string, SchemaNodeDef<any, any, any>>> {
21
+ /** Root prefix for all keys */
22
+ prefix: P;
23
+ /** Entity definitions by name */
24
+ entities: E;
25
+ }
26
+ /**
27
+ * A tree node representing a fetched entity with its children.
28
+ * Children are accessed as named properties (e.g., board.columns).
29
+ */
30
+ export interface TreeNode<V, M> {
31
+ /** The extracted ID from the key (e.g., "col-1") */
32
+ id: string;
33
+ /** The full key path (e.g., "board-1/columns/col-1") */
34
+ key: string;
35
+ /** The entity value */
36
+ value: V;
37
+ /** The entity metadata */
38
+ metadata: M;
39
+ }
40
+ /**
41
+ * Result of paginated tree iteration.
42
+ */
43
+ export interface TreeNodePage<V, M, C extends Record<string, SchemaNodeDef<any, any, any>>> {
44
+ items: TreeNodeWithChildren<V, M, C>[];
45
+ cursor?: string;
46
+ }
47
+ /**
48
+ * An async iterable over child tree nodes with lazy batch fetching.
49
+ * On first iteration, all child values are fetched in parallel.
50
+ */
51
+ export interface TreeNodeIterator<V, M, C extends Record<string, SchemaNodeDef<any, any, any>>> extends AsyncIterable<TreeNodeWithChildren<V, M, C>> {
52
+ /**
53
+ * Fetch a page of child nodes.
54
+ * @param limit - Maximum number of nodes to return
55
+ * @param cursor - Cursor from previous page (undefined for first page)
56
+ */
57
+ page(limit: number, cursor?: string): Promise<TreeNodePage<V, M, C>>;
58
+ /**
59
+ * Eagerly collect all child nodes into an array.
60
+ * Fetches all values if not already fetched.
61
+ */
62
+ collect(): Promise<TreeNodeWithChildren<V, M, C>[]>;
63
+ /**
64
+ * Get the count of child nodes without fetching values.
65
+ */
66
+ count(): number;
67
+ /**
68
+ * Get all child keys without fetching values.
69
+ */
70
+ keys(): string[];
71
+ }
72
+ /**
73
+ * A tree node that includes child iterators based on schema.
74
+ * Child iterators are named from the schema (e.g., board.columns, column.tasks).
75
+ */
76
+ export type TreeNodeWithChildren<V, M, C extends Record<string, SchemaNodeDef<any, any, any>> | undefined> = TreeNode<V, M> & (C extends Record<string, SchemaNodeDef<any, any, any>> ? {
77
+ [K in keyof C]: C[K] extends SchemaNodeDef<infer CV, infer CM, any> ? TreeNodeIterator<CV, CM, ChildrenOf<C[K]>> : never;
78
+ } : unknown);
79
+ /**
80
+ * Extracts the path segments needed for a schema node.
81
+ * Each "*" in the pattern hierarchy requires an ID argument.
82
+ */
83
+ export type KeyBuilderArgs<N extends SchemaNodeDef<any, any, any>> = N["pattern"] extends "*" ? [id: string] : N["pattern"] extends `${string}/*` ? [id: string] : [];
84
+ /**
85
+ * Key builder function type.
86
+ * Takes ID arguments based on the pattern hierarchy and returns the full key.
87
+ */
88
+ export type KeyBuilder<N extends SchemaNodeDef<any, any, any>, ParentArgs extends unknown[]> = N["pattern"] extends "*" ? (...args: [...ParentArgs, id: string]) => string : N["pattern"] extends `${string}/*` ? (...args: [...ParentArgs, id: string]) => string : (...args: ParentArgs) => string;
89
+ /**
90
+ * Recursively builds key builder types for all nodes in schema.
91
+ */
92
+ type GetChildren<N> = N extends {
93
+ children: infer C;
94
+ } ? C : never;
95
+ type HasChildren<N> = N extends {
96
+ children: Record<string, any>;
97
+ } ? true : false;
98
+ export type KeyBuilders<E extends Record<string, SchemaNodeDef<any, any, any>>, ParentArgs extends unknown[] = []> = {
99
+ [K in keyof E]: E[K] extends SchemaNodeDef<any, any, any> ? KeyBuilder<E[K], ParentArgs> & (HasChildren<E[K]> extends true ? KeyBuilders<GetChildren<E[K]> & Record<string, SchemaNodeDef<any, any, any>>, E[K]["pattern"] extends "*" ? [...ParentArgs, string] : E[K]["pattern"] extends `${string}/*` ? [...ParentArgs, string] : ParentArgs> : unknown) : never;
100
+ };
101
+ /**
102
+ * Schema-aware KV interface with type-safe operations.
103
+ */
104
+ export interface SchemaKV<P extends string, E extends Record<string, SchemaNodeDef<any, any, any>>> {
105
+ /** Access to the underlying KV store */
106
+ raw: KVLike<unknown>;
107
+ /** Type-safe key builders for all entity types */
108
+ key: KeyBuilders<E>;
109
+ /**
110
+ * Build a lazy tree starting from a root entity.
111
+ * Makes a SINGLE keys() call, then lazily batch-fetches values on iteration.
112
+ *
113
+ * @param type - The entity type name from the schema
114
+ * @param ids - ID arguments for the root entity
115
+ * @returns Tree node with child iterators, or null if not found
116
+ */
117
+ tree<K extends keyof E>(type: K, ...ids: E[K] extends SchemaNodeDef<any, any, any> ? KeyBuilderArgs<E[K]> : never): Promise<(E[K] extends SchemaNodeDef<infer V, infer M, infer C> ? TreeNodeWithChildren<V, M, C> : never) | null>;
118
+ /**
119
+ * Get a single entity by type and IDs.
120
+ */
121
+ get<K extends keyof E>(type: K, ...ids: E[K] extends SchemaNodeDef<any, any, any> ? KeyBuilderArgs<E[K]> : never): Promise<(E[K] extends SchemaNodeDef<infer V, infer M> ? {
122
+ value: V;
123
+ metadata: M;
124
+ } : never) | null>;
125
+ /**
126
+ * Set an entity by type and IDs.
127
+ */
128
+ set<K extends keyof E>(type: K, value: E[K] extends SchemaNodeDef<infer V> ? V : never, metadata: E[K] extends SchemaNodeDef<infer _V, infer M> ? M : never, ...ids: E[K] extends SchemaNodeDef<any, any, any> ? KeyBuilderArgs<E[K]> : never): Promise<void>;
129
+ /**
130
+ * Delete an entity by type and IDs.
131
+ */
132
+ delete<K extends keyof E>(type: K, ...ids: E[K] extends SchemaNodeDef<any, any, any> ? KeyBuilderArgs<E[K]> : never): Promise<void>;
133
+ }
134
+ export {};
135
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Core test definitions that can be run with either vitest or vitest-compat.
3
+ * These functions accept the testing primitives as parameters to allow
4
+ * framework-agnostic test definitions.
5
+ */
6
+ type DescribeFn = (name: string, fn: () => void) => void;
7
+ type ItFn = (name: string, fn: () => Promise<void> | void) => void;
8
+ type ExpectFn = <T>(actual: T) => {
9
+ toBe(expected: T): void;
10
+ toEqual(expected: unknown): void;
11
+ toBeGreaterThan(expected: number): void;
12
+ };
13
+ type BeforeEachFn = (fn: () => void) => void;
14
+ type AfterEachFn = (fn: () => void) => void;
15
+ interface TestingPrimitives {
16
+ describe: DescribeFn;
17
+ it: ItFn;
18
+ expect: ExpectFn;
19
+ beforeEach: BeforeEachFn;
20
+ afterEach: AfterEachFn;
21
+ }
22
+ export declare function registerCoreTests(t: TestingPrimitives): void;
23
+ export declare function registerBinaryTests(t: TestingPrimitives): void;
24
+ export declare function registerLargeValueTests(t: TestingPrimitives): void;
25
+ export declare function registerTypedKVTests(t: TestingPrimitives): void;
26
+ export declare function registerStreamingTests(t: TestingPrimitives): void;
27
+ export declare function registerStressTests(t: TestingPrimitives): void;
28
+ export declare function registerAllTests(t: TestingPrimitives): void;
29
+ export {};
30
+ //# sourceMappingURL=core-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tests.d.ts","sourceRoot":"","sources":["../../src/testing/core-tests.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AACzD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;AACnE,KAAK,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC,CAAC;AACF,KAAK,YAAY,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAC7C,KAAK,WAAW,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAE5C,UAAU,iBAAiB;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,QAAQ,CAAC;IACjB,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC;CACvB;AAaD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAqI5D;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CA4C9D;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAmElE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CA0D/D;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAkEjE;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAkE9D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAO3D"}