@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.
- package/README.md +87 -0
- package/SKILL.md +65 -0
- package/dist/blob-format.d.ts +35 -0
- package/dist/blob-format.d.ts.map +1 -0
- package/dist/blob-format.js +91 -0
- package/dist/blob-format.js.map +1 -0
- package/dist/blob-store.d.ts +11 -0
- package/dist/blob-store.d.ts.map +1 -0
- package/dist/blob-store.js +32 -0
- package/dist/blob-store.js.map +1 -0
- package/dist/cache.d.ts +33 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +146 -0
- package/dist/cache.js.map +1 -0
- package/dist/cached-kv.d.ts +63 -0
- package/dist/cached-kv.d.ts.map +1 -0
- package/dist/cached-kv.js +891 -0
- package/dist/cached-kv.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +342 -0
- package/dist/cli.js.map +1 -0
- package/dist/create-kv.d.ts +86 -0
- package/dist/create-kv.d.ts.map +1 -0
- package/dist/create-kv.js +125 -0
- package/dist/create-kv.js.map +1 -0
- package/dist/disk-cache.d.ts.map +1 -0
- package/dist/disk-cache.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/indexed-kv.d.ts +44 -0
- package/dist/indexed-kv.d.ts.map +1 -0
- package/dist/indexed-kv.js +373 -0
- package/dist/indexed-kv.js.map +1 -0
- package/dist/manifest-log.d.ts +57 -0
- package/dist/manifest-log.d.ts.map +1 -0
- package/dist/manifest-log.js +128 -0
- package/dist/manifest-log.js.map +1 -0
- package/dist/memory-cache.d.ts +22 -0
- package/dist/memory-cache.d.ts.map +1 -0
- package/dist/memory-cache.js +90 -0
- package/dist/memory-cache.js.map +1 -0
- package/dist/proxy-cache.d.ts +40 -0
- package/dist/proxy-cache.d.ts.map +1 -0
- package/dist/proxy-cache.js +124 -0
- package/dist/proxy-cache.js.map +1 -0
- package/dist/readme.test.d.ts +9 -0
- package/dist/readme.test.d.ts.map +1 -0
- package/dist/readme.test.js +285 -0
- package/dist/readme.test.js.map +1 -0
- package/dist/schema/define-schema.d.ts +35 -0
- package/dist/schema/define-schema.d.ts.map +1 -0
- package/dist/schema/define-schema.js +70 -0
- package/dist/schema/define-schema.js.map +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +5 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/key-builders.d.ts +40 -0
- package/dist/schema/key-builders.d.ts.map +1 -0
- package/dist/schema/key-builders.js +124 -0
- package/dist/schema/key-builders.js.map +1 -0
- package/dist/schema/schema-kv.d.ts +48 -0
- package/dist/schema/schema-kv.d.ts.map +1 -0
- package/dist/schema/schema-kv.js +96 -0
- package/dist/schema/schema-kv.js.map +1 -0
- package/dist/schema/tree.d.ts +14 -0
- package/dist/schema/tree.d.ts.map +1 -0
- package/dist/schema/tree.js +135 -0
- package/dist/schema/tree.js.map +1 -0
- package/dist/schema/types.d.ts +135 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +2 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/testing/core-tests.d.ts +30 -0
- package/dist/testing/core-tests.d.ts.map +1 -0
- package/dist/testing/core-tests.js +383 -0
- package/dist/testing/core-tests.js.map +1 -0
- package/dist/testing/create-kv-test-setup.d.ts +21 -0
- package/dist/testing/create-kv-test-setup.d.ts.map +1 -0
- package/dist/testing/create-kv-test-setup.js +25 -0
- package/dist/testing/create-kv-test-setup.js.map +1 -0
- package/dist/testing/debug-manifest.d.ts +2 -0
- package/dist/testing/debug-manifest.d.ts.map +1 -0
- package/dist/testing/debug-manifest.js +14 -0
- package/dist/testing/debug-manifest.js.map +1 -0
- package/dist/testing/fake-blob-store.d.ts +23 -0
- package/dist/testing/fake-blob-store.d.ts.map +1 -0
- package/dist/testing/fake-blob-store.js +158 -0
- package/dist/testing/fake-blob-store.js.map +1 -0
- package/dist/testing/fake-cache.d.ts +54 -0
- package/dist/testing/fake-cache.d.ts.map +1 -0
- package/dist/testing/fake-cache.js +137 -0
- package/dist/testing/fake-cache.js.map +1 -0
- package/dist/testing/index.d.ts +34 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +101 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/manifest-test-setup.d.ts +22 -0
- package/dist/testing/manifest-test-setup.d.ts.map +1 -0
- package/dist/testing/manifest-test-setup.js +43 -0
- package/dist/testing/manifest-test-setup.js.map +1 -0
- package/dist/testing/perf-test.d.ts +13 -0
- package/dist/testing/perf-test.d.ts.map +1 -0
- package/dist/testing/perf-test.js +101 -0
- package/dist/testing/perf-test.js.map +1 -0
- package/dist/testing/run-tests.d.ts +2 -0
- package/dist/testing/run-tests.d.ts.map +1 -0
- package/dist/testing/run-tests.js +141 -0
- package/dist/testing/run-tests.js.map +1 -0
- package/dist/testing/setup.d.ts +2 -0
- package/dist/testing/setup.d.ts.map +1 -0
- package/dist/testing/setup.js +3 -0
- package/dist/testing/setup.js.map +1 -0
- package/dist/testing/test-index.d.ts +28 -0
- package/dist/testing/test-index.d.ts.map +1 -0
- package/dist/testing/test-index.js +35 -0
- package/dist/testing/test-index.js.map +1 -0
- package/dist/testing/test-setup.d.ts +32 -0
- package/dist/testing/test-setup.d.ts.map +1 -0
- package/dist/testing/test-setup.js +72 -0
- package/dist/testing/test-setup.js.map +1 -0
- package/dist/testing/upstream-kv-test-setup.d.ts +30 -0
- package/dist/testing/upstream-kv-test-setup.d.ts.map +1 -0
- package/dist/testing/upstream-kv-test-setup.js +66 -0
- package/dist/testing/upstream-kv-test-setup.js.map +1 -0
- package/dist/testing/vitest-compat.d.ts +92 -0
- package/dist/testing/vitest-compat.d.ts.map +1 -0
- package/dist/testing/vitest-compat.js +601 -0
- package/dist/testing/vitest-compat.js.map +1 -0
- package/dist/tracing.d.ts +71 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +232 -0
- package/dist/tracing.js.map +1 -0
- package/dist/typed-kv.d.ts +120 -0
- package/dist/typed-kv.d.ts.map +1 -0
- package/dist/typed-kv.js +565 -0
- package/dist/typed-kv.js.map +1 -0
- package/dist/typed-upstream-kv.d.ts +17 -0
- package/dist/typed-upstream-kv.d.ts.map +1 -0
- package/dist/typed-upstream-kv.js +38 -0
- package/dist/typed-upstream-kv.js.map +1 -0
- package/dist/types.d.ts +199 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/dist/upstream-kv.d.ts +84 -0
- package/dist/upstream-kv.d.ts.map +1 -0
- package/dist/upstream-kv.js +375 -0
- package/dist/upstream-kv.js.map +1 -0
- package/docs/api-reference.md +222 -0
- package/docs/caching.md +60 -0
- package/docs/cli.md +123 -0
- package/docs/copy-on-write-branches.md +98 -0
- package/docs/getting-started.md +61 -0
- package/docs/indexes.md +122 -0
- package/docs/iterating-and-pagination.md +93 -0
- package/docs/metadata.md +82 -0
- package/docs/optimistic-locking.md +72 -0
- package/docs/schema-and-trees.md +222 -0
- package/docs/streaming.md +61 -0
- package/docs/testing-and-tracing.md +141 -0
- package/docs/typed-stores.md +68 -0
- 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 @@
|
|
|
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"}
|