@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,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* README and docs/ validation tests
|
|
3
|
+
*
|
|
4
|
+
* Ensures documentation stays in sync with the actual codebase:
|
|
5
|
+
* 1. TypeScript examples compile correctly
|
|
6
|
+
* 2. API documentation matches KVLike interface
|
|
7
|
+
*/
|
|
8
|
+
import { execSync } from "node:child_process";
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import { describe, expect, it } from "./testing/vitest-compat.js";
|
|
12
|
+
const README_PATH = path.join(import.meta.dirname, "..", "README.md");
|
|
13
|
+
const DOCS_DIR = path.join(import.meta.dirname, "..", "docs");
|
|
14
|
+
function parseMarkdown(filePath) {
|
|
15
|
+
return fs.readFileSync(filePath, "utf-8");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get all docs/*.md files sorted by name
|
|
19
|
+
*/
|
|
20
|
+
function getDocFiles() {
|
|
21
|
+
if (!fs.existsSync(DOCS_DIR))
|
|
22
|
+
return [];
|
|
23
|
+
return fs
|
|
24
|
+
.readdirSync(DOCS_DIR)
|
|
25
|
+
.filter((f) => f.endsWith(".md"))
|
|
26
|
+
.sort()
|
|
27
|
+
.map((f) => path.join(DOCS_DIR, f));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract TypeScript code blocks from markdown
|
|
31
|
+
*/
|
|
32
|
+
function extractTypeScriptBlocks(content) {
|
|
33
|
+
const blocks = [];
|
|
34
|
+
const pattern = /```typescript\n([\s\S]*?)```/g;
|
|
35
|
+
for (const match of content.matchAll(pattern)) {
|
|
36
|
+
blocks.push(match[1]);
|
|
37
|
+
}
|
|
38
|
+
return blocks;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Rename duplicate const/let declarations to avoid redeclaration errors
|
|
42
|
+
*/
|
|
43
|
+
function renameDuplicateDeclarations(code) {
|
|
44
|
+
const varCounts = new Map();
|
|
45
|
+
return code.replace(/\b(const|let)\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*=/g, (match, keyword, varName) => {
|
|
46
|
+
const count = (varCounts.get(varName) || 0) + 1;
|
|
47
|
+
varCounts.set(varName, count);
|
|
48
|
+
if (count > 1) {
|
|
49
|
+
return `${keyword} ${varName}_${count} =`;
|
|
50
|
+
}
|
|
51
|
+
return match;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Add implied imports and wrap in async IIFE
|
|
56
|
+
*/
|
|
57
|
+
function addImpliedImports(code) {
|
|
58
|
+
// Rewrite package imports to local path aliases
|
|
59
|
+
code = code.replace(/"@vercel\/kv2\/testing"/g, '"kv/testing"');
|
|
60
|
+
code = code.replace(/'@vercel\/kv2\/testing'/g, "'kv/testing'");
|
|
61
|
+
code = code.replace(/"@vercel\/kv2"/g, '"kv"');
|
|
62
|
+
code = code.replace(/'@vercel\/kv2'/g, "'kv'");
|
|
63
|
+
// Symbols auto-imported from "kv"
|
|
64
|
+
const kvSymbols = [
|
|
65
|
+
"createKV",
|
|
66
|
+
"KV2",
|
|
67
|
+
"TypedKV",
|
|
68
|
+
"UpstreamKV",
|
|
69
|
+
"KVVersionConflictError",
|
|
70
|
+
"KVIndexConflictError",
|
|
71
|
+
"defineSchema",
|
|
72
|
+
"createSchemaKV",
|
|
73
|
+
"noopTracer",
|
|
74
|
+
"consoleTracer",
|
|
75
|
+
"createOtelTracer",
|
|
76
|
+
"createStatsTracer",
|
|
77
|
+
];
|
|
78
|
+
// Symbols auto-imported from "kv/testing"
|
|
79
|
+
const testingSymbols = ["FakeBlobStore", "FakeCache", "createTestKV"];
|
|
80
|
+
// Check which symbols are used but not explicitly imported
|
|
81
|
+
const kvNeeded = [];
|
|
82
|
+
const testingNeeded = [];
|
|
83
|
+
for (const sym of kvSymbols) {
|
|
84
|
+
if (code.includes(sym) &&
|
|
85
|
+
!new RegExp(`import\\s*\\{[^}]*\\b${sym}\\b[^}]*\\}\\s*from\\s*["']kv["']`).test(code) &&
|
|
86
|
+
!new RegExp(`import\\s*\\(\\s*["']kv["']\\s*\\)\\.${sym}`).test(code)) {
|
|
87
|
+
kvNeeded.push(sym);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const sym of testingSymbols) {
|
|
91
|
+
if (code.includes(sym) &&
|
|
92
|
+
!new RegExp(`import\\s*\\{[^}]*\\b${sym}\\b[^}]*\\}\\s*from\\s*["']kv/testing["']`).test(code)) {
|
|
93
|
+
testingNeeded.push(sym);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const imports = [];
|
|
97
|
+
if (kvNeeded.length > 0) {
|
|
98
|
+
imports.push(`import { ${kvNeeded.join(", ")} } from "kv";`);
|
|
99
|
+
}
|
|
100
|
+
if (testingNeeded.length > 0) {
|
|
101
|
+
imports.push(`import { ${testingNeeded.join(", ")} } from "kv/testing";`);
|
|
102
|
+
}
|
|
103
|
+
// Extract existing imports from code
|
|
104
|
+
const existingImports = code.match(/^import .*/gm) || [];
|
|
105
|
+
const codeWithoutImports = code.replace(/^import .*\n?/gm, "").trim();
|
|
106
|
+
// Combine all imports (existing first, then implied)
|
|
107
|
+
const allImports = [...existingImports, ...imports];
|
|
108
|
+
// Rename duplicate variable declarations
|
|
109
|
+
const scopedCode = renameDuplicateDeclarations(codeWithoutImports);
|
|
110
|
+
// Wrap non-import code in async IIFE
|
|
111
|
+
const wrappedCode = `(async () => {\n${scopedCode}\n})();`;
|
|
112
|
+
if (allImports.length === 0) {
|
|
113
|
+
return wrappedCode;
|
|
114
|
+
}
|
|
115
|
+
return `${allImports.join("\n")}\n\n${wrappedCode}`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Compile TypeScript blocks in a single tsc invocation
|
|
119
|
+
*/
|
|
120
|
+
function compileTypeScriptBlocks(blocks, filePrefix = "example") {
|
|
121
|
+
const tmpDir = path.join(import.meta.dirname, "..", ".docs-test-tmp");
|
|
122
|
+
fs.mkdirSync(tmpDir, { recursive: true });
|
|
123
|
+
try {
|
|
124
|
+
const files = [];
|
|
125
|
+
// Write all blocks to files
|
|
126
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
127
|
+
const code = addImpliedImports(blocks[i]);
|
|
128
|
+
const fileName = `${filePrefix}-${i}.ts`;
|
|
129
|
+
const filePath = path.join(tmpDir, fileName);
|
|
130
|
+
fs.writeFileSync(filePath, code);
|
|
131
|
+
files.push(filePath);
|
|
132
|
+
}
|
|
133
|
+
if (files.length === 0)
|
|
134
|
+
return;
|
|
135
|
+
// Create ephemeral type definitions for types assumed in examples
|
|
136
|
+
const ephemeralTypes = `
|
|
137
|
+
// Types commonly used in README and docs examples
|
|
138
|
+
interface User {
|
|
139
|
+
name: string;
|
|
140
|
+
email: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
interface Post {
|
|
144
|
+
title: string;
|
|
145
|
+
content: string;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
interface Metadata {
|
|
149
|
+
updatedAt: number;
|
|
150
|
+
version: number;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
interface Board {
|
|
154
|
+
name: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
interface Column {
|
|
158
|
+
name: string;
|
|
159
|
+
order: number;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
interface Task {
|
|
163
|
+
title: string;
|
|
164
|
+
done: boolean;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Doc-specific types
|
|
168
|
+
interface Doc {
|
|
169
|
+
slug: string;
|
|
170
|
+
status: string;
|
|
171
|
+
tags: string[];
|
|
172
|
+
title: string;
|
|
173
|
+
content: string;
|
|
174
|
+
authorId: string;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Ambient variables for examples that don't define their own
|
|
178
|
+
declare const kv: import("kv").KV2<any>;
|
|
179
|
+
declare const users: import("kv").TypedKV<User, any>;
|
|
180
|
+
declare const posts: import("kv").TypedKV<Post, any>;
|
|
181
|
+
declare const docs: import("kv").TypedKV<Doc, any, "bySlug" | "byStatus" | "byTag">;
|
|
182
|
+
declare const metadata: any;
|
|
183
|
+
declare const userData: any;
|
|
184
|
+
declare const entry: import("kv").KVEntry<any, any>;
|
|
185
|
+
declare const newValue: any;
|
|
186
|
+
declare const docData: Doc;
|
|
187
|
+
`;
|
|
188
|
+
fs.writeFileSync(path.join(tmpDir, "example-types.d.ts"), ephemeralTypes);
|
|
189
|
+
// Create tsconfig for type checking
|
|
190
|
+
const tsconfig = {
|
|
191
|
+
compilerOptions: {
|
|
192
|
+
target: "ES2022",
|
|
193
|
+
module: "NodeNext",
|
|
194
|
+
moduleResolution: "NodeNext",
|
|
195
|
+
strict: true,
|
|
196
|
+
skipLibCheck: true,
|
|
197
|
+
noEmit: true,
|
|
198
|
+
esModuleInterop: true,
|
|
199
|
+
paths: {
|
|
200
|
+
kv: [path.join(import.meta.dirname, "index.ts")],
|
|
201
|
+
"kv/testing": [path.join(import.meta.dirname, "testing", "index.ts")],
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
include: [...files, path.join(tmpDir, "example-types.d.ts")],
|
|
205
|
+
};
|
|
206
|
+
fs.writeFileSync(path.join(tmpDir, "tsconfig.json"), JSON.stringify(tsconfig, null, 2));
|
|
207
|
+
// Run tsc to check all files
|
|
208
|
+
try {
|
|
209
|
+
execSync("npx tsc --project tsconfig.json", {
|
|
210
|
+
cwd: tmpDir,
|
|
211
|
+
encoding: "utf-8",
|
|
212
|
+
stdio: "pipe",
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const execError = error;
|
|
217
|
+
const output = execError.stdout || execError.stderr || "";
|
|
218
|
+
// Parse errors
|
|
219
|
+
const errorLines = output
|
|
220
|
+
.split("\n")
|
|
221
|
+
.filter((line) => line.includes("error TS"));
|
|
222
|
+
if (errorLines.length > 0) {
|
|
223
|
+
throw new Error(`TypeScript errors in ${filePrefix} examples:\n${errorLines.slice(0, 10).join("\n")}` +
|
|
224
|
+
(errorLines.length > 10
|
|
225
|
+
? `\n... and ${errorLines.length - 10} more`
|
|
226
|
+
: ""));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
describe("README validation", () => {
|
|
235
|
+
it("should have TypeScript code blocks", () => {
|
|
236
|
+
const readme = parseMarkdown(README_PATH);
|
|
237
|
+
const blocks = extractTypeScriptBlocks(readme);
|
|
238
|
+
expect(blocks.length).toBeGreaterThan(0);
|
|
239
|
+
});
|
|
240
|
+
it("should document KVLike interface methods", () => {
|
|
241
|
+
const readme = parseMarkdown(README_PATH);
|
|
242
|
+
const requiredMethods = [
|
|
243
|
+
"get",
|
|
244
|
+
"set",
|
|
245
|
+
"delete",
|
|
246
|
+
"keys",
|
|
247
|
+
"entries",
|
|
248
|
+
"getMany",
|
|
249
|
+
];
|
|
250
|
+
for (const method of requiredMethods) {
|
|
251
|
+
expect(readme).toContain(method);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
it("should document createKV options", () => {
|
|
255
|
+
const readme = parseMarkdown(README_PATH);
|
|
256
|
+
expect(readme).toContain("prefix");
|
|
257
|
+
expect(readme).toContain("upstream");
|
|
258
|
+
});
|
|
259
|
+
it("should have valid TypeScript syntax in all examples", () => {
|
|
260
|
+
const readme = parseMarkdown(README_PATH);
|
|
261
|
+
const blocks = extractTypeScriptBlocks(readme);
|
|
262
|
+
compileTypeScriptBlocks(blocks, "readme-example");
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe("docs/ validation", () => {
|
|
266
|
+
const docFiles = getDocFiles();
|
|
267
|
+
it("should have doc files", () => {
|
|
268
|
+
expect(docFiles.length).toBeGreaterThan(0);
|
|
269
|
+
});
|
|
270
|
+
for (const docFile of docFiles) {
|
|
271
|
+
const basename = path.basename(docFile);
|
|
272
|
+
it(`${basename} should have valid markdown`, () => {
|
|
273
|
+
const content = parseMarkdown(docFile);
|
|
274
|
+
expect(content.length).toBeGreaterThan(0);
|
|
275
|
+
});
|
|
276
|
+
it(`${basename} should have valid TypeScript syntax`, () => {
|
|
277
|
+
const content = parseMarkdown(docFile);
|
|
278
|
+
const blocks = extractTypeScriptBlocks(content);
|
|
279
|
+
if (blocks.length > 0) {
|
|
280
|
+
compileTypeScriptBlocks(blocks, `doc-${basename.replace(".md", "")}`);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
//# sourceMappingURL=readme.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readme.test.js","sourceRoot":"","sources":["../src/readme.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { SchemaDef, SchemaNodeDef } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Define a schema for hierarchical KV entities.
|
|
4
|
+
*
|
|
5
|
+
* @param prefix - Root prefix for all keys (should end with "/")
|
|
6
|
+
* @param entities - Entity definitions with patterns and types
|
|
7
|
+
* @returns Schema definition for use with createSchemaKV()
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const schema = defineSchema("boards/", {
|
|
12
|
+
* boards: {
|
|
13
|
+
* pattern: "*",
|
|
14
|
+
* value: {} as Board,
|
|
15
|
+
* metadata: {} as BoardMeta,
|
|
16
|
+
* children: {
|
|
17
|
+
* columns: {
|
|
18
|
+
* pattern: "columns/*",
|
|
19
|
+
* value: {} as Column,
|
|
20
|
+
* metadata: {} as ColumnMeta,
|
|
21
|
+
* children: {
|
|
22
|
+
* tasks: {
|
|
23
|
+
* pattern: "tasks/*",
|
|
24
|
+
* value: {} as Task,
|
|
25
|
+
* metadata: {} as TaskMeta,
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function defineSchema<const P extends string, const E extends Record<string, SchemaNodeDef<any, any, any>>>(prefix: P, entities: E): SchemaDef<P, E>;
|
|
35
|
+
//# sourceMappingURL=define-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-schema.d.ts","sourceRoot":"","sources":["../../src/schema/define-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,YAAY,CAC3B,KAAK,CAAC,CAAC,SAAS,MAAM,EAEtB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAC3D,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAQzC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Define a schema for hierarchical KV entities.
|
|
3
|
+
*
|
|
4
|
+
* @param prefix - Root prefix for all keys (should end with "/")
|
|
5
|
+
* @param entities - Entity definitions with patterns and types
|
|
6
|
+
* @returns Schema definition for use with createSchemaKV()
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const schema = defineSchema("boards/", {
|
|
11
|
+
* boards: {
|
|
12
|
+
* pattern: "*",
|
|
13
|
+
* value: {} as Board,
|
|
14
|
+
* metadata: {} as BoardMeta,
|
|
15
|
+
* children: {
|
|
16
|
+
* columns: {
|
|
17
|
+
* pattern: "columns/*",
|
|
18
|
+
* value: {} as Column,
|
|
19
|
+
* metadata: {} as ColumnMeta,
|
|
20
|
+
* children: {
|
|
21
|
+
* tasks: {
|
|
22
|
+
* pattern: "tasks/*",
|
|
23
|
+
* value: {} as Task,
|
|
24
|
+
* metadata: {} as TaskMeta,
|
|
25
|
+
* }
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function defineSchema(prefix, entities) {
|
|
34
|
+
// Validate the schema
|
|
35
|
+
validateSchema(entities);
|
|
36
|
+
return {
|
|
37
|
+
prefix,
|
|
38
|
+
entities,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validates schema definition for common errors.
|
|
43
|
+
*/
|
|
44
|
+
function validateSchema(entities) {
|
|
45
|
+
for (const [name, node] of Object.entries(entities)) {
|
|
46
|
+
validateNode(name, node, []);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function validateNode(name, node, parentPath) {
|
|
50
|
+
const fullPath = [...parentPath, name].join(".");
|
|
51
|
+
// Validate pattern
|
|
52
|
+
if (!node.pattern) {
|
|
53
|
+
throw new Error(`Schema node "${fullPath}" is missing a pattern`);
|
|
54
|
+
}
|
|
55
|
+
// Pattern should be "*" or "prefix/*"
|
|
56
|
+
if (node.pattern !== "*" && !node.pattern.endsWith("/*")) {
|
|
57
|
+
throw new Error(`Schema node "${fullPath}" has invalid pattern "${node.pattern}". ` +
|
|
58
|
+
`Pattern must be "*" or end with "/*".`);
|
|
59
|
+
}
|
|
60
|
+
// Validate children recursively
|
|
61
|
+
if (node.children) {
|
|
62
|
+
for (const [childName, childNode] of Object.entries(node.children)) {
|
|
63
|
+
validateNode(childName, childNode, [
|
|
64
|
+
...parentPath,
|
|
65
|
+
name,
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=define-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-schema.js","sourceRoot":"","sources":["../../src/schema/define-schema.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,YAAY,CAI1B,MAAS,EAAE,QAAW;IACvB,sBAAsB;IACtB,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEzB,OAAO;QACN,MAAM;QACN,QAAQ;KACR,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAuC;IAC9D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CACpB,IAAY,EACZ,IAAmB,EACnB,UAAoB;IAEpB,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjD,mBAAmB;IACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,gBAAgB,QAAQ,wBAAwB,CAAC,CAAC;IACnE,CAAC;IAED,sCAAsC;IACtC,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACd,gBAAgB,QAAQ,0BAA0B,IAAI,CAAC,OAAO,KAAK;YAClE,uCAAuC,CACxC,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpE,YAAY,CAAC,SAAS,EAAE,SAA0B,EAAE;gBACnD,GAAG,UAAU;gBACb,IAAI;aACJ,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { defineSchema } from "./define-schema.js";
|
|
2
|
+
export { createSchemaKV } from "./schema-kv.js";
|
|
3
|
+
export type { SchemaNodeDef, SchemaDef, TreeNode, TreeNodeIterator, TreeNodePage, TreeNodeWithChildren, KeyBuilders, SchemaKV, } from "./types.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,YAAY,EACX,aAAa,EACb,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,QAAQ,GACR,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { KeyBuilders, SchemaDef, SchemaNodeDef } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create type-safe key builder functions from a schema.
|
|
4
|
+
*
|
|
5
|
+
* Each entity in the schema gets a key builder function that takes
|
|
6
|
+
* the appropriate ID arguments and returns the full key path.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const key = createKeyBuilders(schema);
|
|
11
|
+
*
|
|
12
|
+
* key.boards("board-1") // → "board-1"
|
|
13
|
+
* key.columns("board-1", "col-1") // → "board-1/columns/col-1"
|
|
14
|
+
* key.tasks("board-1", "col-1", "task-1") // → "board-1/columns/col-1/tasks/task-1"
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function createKeyBuilders<P extends string, E extends Record<string, SchemaNodeDef<any, any, any>>>(schema: SchemaDef<P, E>): KeyBuilders<E>;
|
|
18
|
+
/**
|
|
19
|
+
* Create a regex pattern for matching keys of a specific entity type.
|
|
20
|
+
*
|
|
21
|
+
* Used internally to filter keys from a keys() call by entity type.
|
|
22
|
+
*
|
|
23
|
+
* @param node - The schema node to create a pattern for
|
|
24
|
+
* @param parentPatterns - Patterns from ancestor nodes
|
|
25
|
+
* @returns RegExp that matches keys of this entity type
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* // For columns under a board:
|
|
30
|
+
* // parentPatterns = ["*"], pattern = "columns/*"
|
|
31
|
+
* // → /^([^/]+)\/columns\/([^/]+)$/
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function createKeyPattern(node: SchemaNodeDef, parentPatterns: string[]): RegExp;
|
|
35
|
+
/**
|
|
36
|
+
* Extract the ID from a key given a regex pattern.
|
|
37
|
+
* Returns the last capture group (the entity's own ID).
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractIdFromKey(key: string, pattern: RegExp): string | null;
|
|
40
|
+
//# sourceMappingURL=key-builders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-builders.d.ts","sourceRoot":"","sources":["../../src/schema/key-builders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAChC,CAAC,SAAS,MAAM,EAEhB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACrD,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAQzC;AAoED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,aAAa,EACnB,cAAc,EAAE,MAAM,EAAE,GACtB,MAAM,CAiBR;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK5E"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create type-safe key builder functions from a schema.
|
|
3
|
+
*
|
|
4
|
+
* Each entity in the schema gets a key builder function that takes
|
|
5
|
+
* the appropriate ID arguments and returns the full key path.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const key = createKeyBuilders(schema);
|
|
10
|
+
*
|
|
11
|
+
* key.boards("board-1") // → "board-1"
|
|
12
|
+
* key.columns("board-1", "col-1") // → "board-1/columns/col-1"
|
|
13
|
+
* key.tasks("board-1", "col-1", "task-1") // → "board-1/columns/col-1/tasks/task-1"
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export function createKeyBuilders(schema) {
|
|
17
|
+
const builders = {};
|
|
18
|
+
for (const [name, node] of Object.entries(schema.entities)) {
|
|
19
|
+
builders[name] = createNodeKeyBuilder(node, [], name);
|
|
20
|
+
}
|
|
21
|
+
return builders;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Creates a key builder for a single node, including nested child builders.
|
|
25
|
+
*/
|
|
26
|
+
function createNodeKeyBuilder(node, parentPatterns, name) {
|
|
27
|
+
// Build the key function
|
|
28
|
+
const keyFn = createKeyFunction(node.pattern, parentPatterns);
|
|
29
|
+
// Add child builders as properties on the function
|
|
30
|
+
if (node.children) {
|
|
31
|
+
const currentPatterns = [...parentPatterns, node.pattern];
|
|
32
|
+
for (const [childName, childNode] of Object.entries(node.children)) {
|
|
33
|
+
keyFn[childName] =
|
|
34
|
+
createNodeKeyBuilder(childNode, currentPatterns, childName);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return keyFn;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Creates the actual key function for a pattern.
|
|
41
|
+
*/
|
|
42
|
+
function createKeyFunction(pattern, parentPatterns) {
|
|
43
|
+
// Count total wildcards in parent patterns + this pattern
|
|
44
|
+
const allPatterns = [...parentPatterns, pattern];
|
|
45
|
+
return (...ids) => {
|
|
46
|
+
let idIndex = 0;
|
|
47
|
+
const segments = [];
|
|
48
|
+
for (const p of allPatterns) {
|
|
49
|
+
if (p === "*") {
|
|
50
|
+
// Single wildcard at this level
|
|
51
|
+
if (idIndex >= ids.length) {
|
|
52
|
+
throw new Error(`Missing ID argument at position ${idIndex}`);
|
|
53
|
+
}
|
|
54
|
+
segments.push(ids[idIndex++]);
|
|
55
|
+
}
|
|
56
|
+
else if (p.endsWith("/*")) {
|
|
57
|
+
// Pattern with prefix like "columns/*"
|
|
58
|
+
const prefix = p.slice(0, -2); // Remove "/*"
|
|
59
|
+
segments.push(prefix);
|
|
60
|
+
if (idIndex >= ids.length) {
|
|
61
|
+
throw new Error(`Missing ID argument at position ${idIndex}`);
|
|
62
|
+
}
|
|
63
|
+
segments.push(ids[idIndex++]);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Static pattern (no wildcard)
|
|
67
|
+
segments.push(p);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return segments.join("/");
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a regex pattern for matching keys of a specific entity type.
|
|
75
|
+
*
|
|
76
|
+
* Used internally to filter keys from a keys() call by entity type.
|
|
77
|
+
*
|
|
78
|
+
* @param node - The schema node to create a pattern for
|
|
79
|
+
* @param parentPatterns - Patterns from ancestor nodes
|
|
80
|
+
* @returns RegExp that matches keys of this entity type
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* // For columns under a board:
|
|
85
|
+
* // parentPatterns = ["*"], pattern = "columns/*"
|
|
86
|
+
* // → /^([^/]+)\/columns\/([^/]+)$/
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export function createKeyPattern(node, parentPatterns) {
|
|
90
|
+
const allPatterns = [...parentPatterns, node.pattern];
|
|
91
|
+
const regexParts = [];
|
|
92
|
+
for (const p of allPatterns) {
|
|
93
|
+
if (p === "*") {
|
|
94
|
+
regexParts.push("([^/]+)");
|
|
95
|
+
}
|
|
96
|
+
else if (p.endsWith("/*")) {
|
|
97
|
+
const prefix = p.slice(0, -2);
|
|
98
|
+
regexParts.push(escapeRegex(prefix));
|
|
99
|
+
regexParts.push("([^/]+)");
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
regexParts.push(escapeRegex(p));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return new RegExp(`^${regexParts.join("/")}$`);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Extract the ID from a key given a regex pattern.
|
|
109
|
+
* Returns the last capture group (the entity's own ID).
|
|
110
|
+
*/
|
|
111
|
+
export function extractIdFromKey(key, pattern) {
|
|
112
|
+
const match = key.match(pattern);
|
|
113
|
+
if (!match)
|
|
114
|
+
return null;
|
|
115
|
+
// Return the last captured group (the entity's own ID)
|
|
116
|
+
return match[match.length - 1];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Escape special regex characters in a string.
|
|
120
|
+
*/
|
|
121
|
+
function escapeRegex(str) {
|
|
122
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=key-builders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-builders.js","sourceRoot":"","sources":["../../src/schema/key-builders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { KVLike } from "../types.js";
|
|
2
|
+
import type { SchemaDef, SchemaKV, SchemaNodeDef } from "./types.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 declare function createSchemaKV<P extends string, E extends Record<string, SchemaNodeDef<any, any, any>>>(schema: SchemaDef<P, E>, kv: KVLike<unknown>): SchemaKV<P, E>;
|
|
48
|
+
//# sourceMappingURL=schema-kv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-kv.d.ts","sourceRoot":"","sources":["../../src/schema/schema-kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,cAAc,CAC7B,CAAC,SAAS,MAAM,EAEhB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACrD,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAoF9D"}
|