@rengler33/prov 0.1.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 (146) hide show
  1. package/README.md +314 -0
  2. package/dist/cli.d.ts +26 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +381 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/agent.d.ts +107 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +197 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/agent.test.d.ts +5 -0
  11. package/dist/commands/agent.test.d.ts.map +1 -0
  12. package/dist/commands/agent.test.js +199 -0
  13. package/dist/commands/agent.test.js.map +1 -0
  14. package/dist/commands/constraint.d.ts +100 -0
  15. package/dist/commands/constraint.d.ts.map +1 -0
  16. package/dist/commands/constraint.js +763 -0
  17. package/dist/commands/constraint.js.map +1 -0
  18. package/dist/commands/constraint.test.d.ts +9 -0
  19. package/dist/commands/constraint.test.d.ts.map +1 -0
  20. package/dist/commands/constraint.test.js +470 -0
  21. package/dist/commands/constraint.test.js.map +1 -0
  22. package/dist/commands/graph.d.ts +99 -0
  23. package/dist/commands/graph.d.ts.map +1 -0
  24. package/dist/commands/graph.js +552 -0
  25. package/dist/commands/graph.js.map +1 -0
  26. package/dist/commands/graph.test.d.ts +2 -0
  27. package/dist/commands/graph.test.d.ts.map +1 -0
  28. package/dist/commands/graph.test.js +258 -0
  29. package/dist/commands/graph.test.js.map +1 -0
  30. package/dist/commands/impact.d.ts +83 -0
  31. package/dist/commands/impact.d.ts.map +1 -0
  32. package/dist/commands/impact.js +319 -0
  33. package/dist/commands/impact.js.map +1 -0
  34. package/dist/commands/impact.test.d.ts +2 -0
  35. package/dist/commands/impact.test.d.ts.map +1 -0
  36. package/dist/commands/impact.test.js +234 -0
  37. package/dist/commands/impact.test.js.map +1 -0
  38. package/dist/commands/init.d.ts +45 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +94 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/init.test.d.ts +7 -0
  43. package/dist/commands/init.test.d.ts.map +1 -0
  44. package/dist/commands/init.test.js +174 -0
  45. package/dist/commands/init.test.js.map +1 -0
  46. package/dist/commands/integration.test.d.ts +10 -0
  47. package/dist/commands/integration.test.d.ts.map +1 -0
  48. package/dist/commands/integration.test.js +456 -0
  49. package/dist/commands/integration.test.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +21 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +616 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/mcp.test.d.ts +7 -0
  55. package/dist/commands/mcp.test.d.ts.map +1 -0
  56. package/dist/commands/mcp.test.js +132 -0
  57. package/dist/commands/mcp.test.js.map +1 -0
  58. package/dist/commands/plan.d.ts +218 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +1307 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/plan.test.d.ts +9 -0
  63. package/dist/commands/plan.test.d.ts.map +1 -0
  64. package/dist/commands/plan.test.js +569 -0
  65. package/dist/commands/plan.test.js.map +1 -0
  66. package/dist/commands/spec.d.ts +94 -0
  67. package/dist/commands/spec.d.ts.map +1 -0
  68. package/dist/commands/spec.js +635 -0
  69. package/dist/commands/spec.js.map +1 -0
  70. package/dist/commands/spec.test.d.ts +9 -0
  71. package/dist/commands/spec.test.d.ts.map +1 -0
  72. package/dist/commands/spec.test.js +407 -0
  73. package/dist/commands/spec.test.js.map +1 -0
  74. package/dist/commands/trace.d.ts +157 -0
  75. package/dist/commands/trace.d.ts.map +1 -0
  76. package/dist/commands/trace.js +847 -0
  77. package/dist/commands/trace.js.map +1 -0
  78. package/dist/commands/trace.test.d.ts +9 -0
  79. package/dist/commands/trace.test.d.ts.map +1 -0
  80. package/dist/commands/trace.test.js +524 -0
  81. package/dist/commands/trace.test.js.map +1 -0
  82. package/dist/graph.d.ts +204 -0
  83. package/dist/graph.d.ts.map +1 -0
  84. package/dist/graph.js +496 -0
  85. package/dist/graph.js.map +1 -0
  86. package/dist/graph.test.d.ts +2 -0
  87. package/dist/graph.test.d.ts.map +1 -0
  88. package/dist/graph.test.js +382 -0
  89. package/dist/graph.test.js.map +1 -0
  90. package/dist/hash.d.ts +72 -0
  91. package/dist/hash.d.ts.map +1 -0
  92. package/dist/hash.js +137 -0
  93. package/dist/hash.js.map +1 -0
  94. package/dist/hash.test.d.ts +2 -0
  95. package/dist/hash.test.d.ts.map +1 -0
  96. package/dist/hash.test.js +227 -0
  97. package/dist/hash.test.js.map +1 -0
  98. package/dist/index.d.ts +18 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +64 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/index.test.d.ts +2 -0
  103. package/dist/index.test.d.ts.map +1 -0
  104. package/dist/index.test.js +11 -0
  105. package/dist/index.test.js.map +1 -0
  106. package/dist/output.d.ts +84 -0
  107. package/dist/output.d.ts.map +1 -0
  108. package/dist/output.js +175 -0
  109. package/dist/output.js.map +1 -0
  110. package/dist/output.test.d.ts +7 -0
  111. package/dist/output.test.d.ts.map +1 -0
  112. package/dist/output.test.js +146 -0
  113. package/dist/output.test.js.map +1 -0
  114. package/dist/staleness.d.ts +162 -0
  115. package/dist/staleness.d.ts.map +1 -0
  116. package/dist/staleness.js +309 -0
  117. package/dist/staleness.js.map +1 -0
  118. package/dist/staleness.test.d.ts +2 -0
  119. package/dist/staleness.test.d.ts.map +1 -0
  120. package/dist/staleness.test.js +448 -0
  121. package/dist/staleness.test.js.map +1 -0
  122. package/dist/storage.d.ts +267 -0
  123. package/dist/storage.d.ts.map +1 -0
  124. package/dist/storage.js +623 -0
  125. package/dist/storage.js.map +1 -0
  126. package/dist/storage.test.d.ts +5 -0
  127. package/dist/storage.test.d.ts.map +1 -0
  128. package/dist/storage.test.js +434 -0
  129. package/dist/storage.test.js.map +1 -0
  130. package/dist/types.d.ts +270 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +12 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/types.test.d.ts +2 -0
  135. package/dist/types.test.d.ts.map +1 -0
  136. package/dist/types.test.js +232 -0
  137. package/dist/types.test.js.map +1 -0
  138. package/dist/watcher.d.ts +139 -0
  139. package/dist/watcher.d.ts.map +1 -0
  140. package/dist/watcher.js +406 -0
  141. package/dist/watcher.js.map +1 -0
  142. package/dist/watcher.test.d.ts +5 -0
  143. package/dist/watcher.test.d.ts.map +1 -0
  144. package/dist/watcher.test.js +327 -0
  145. package/dist/watcher.test.js.map +1 -0
  146. package/package.json +53 -0
@@ -0,0 +1,623 @@
1
+ /**
2
+ * Storage layer for prov.
3
+ *
4
+ * Handles persistence of the intent graph and trace mappings to disk.
5
+ * Uses file-based storage in .prov/ directory for git-friendliness.
6
+ *
7
+ * @see spec:storage:v1
8
+ */
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, renameSync, readdirSync, statSync } from 'node:fs';
10
+ import { join, dirname, relative } from 'node:path';
11
+ import { IntentGraph } from './graph.js';
12
+ import { parseYaml, toYaml, sha256 } from './hash.js';
13
+ // ============================================================================
14
+ // Constants
15
+ // ============================================================================
16
+ /** Root directory name for prov metadata */
17
+ export const PROV_DIR = '.prov';
18
+ /** Intent graph file name */
19
+ export const GRAPH_FILE = 'graph.json';
20
+ /** Mappings directory name */
21
+ export const MAPPINGS_DIR = 'mappings';
22
+ /** Cache directory name */
23
+ export const CACHE_DIR = 'cache';
24
+ /** Lock file name */
25
+ export const LOCK_FILE = '.lock';
26
+ /** Schema version for graph format */
27
+ export const SCHEMA_VERSION = 1;
28
+ /** Lock timeout in milliseconds */
29
+ const LOCK_TIMEOUT_MS = 30000;
30
+ // ============================================================================
31
+ // Path Utilities
32
+ // ============================================================================
33
+ /**
34
+ * Get the .prov directory path for a project.
35
+ */
36
+ export function getProvDir(projectRoot = process.cwd()) {
37
+ return join(projectRoot, PROV_DIR);
38
+ }
39
+ /**
40
+ * Get the graph.json file path.
41
+ */
42
+ export function getGraphPath(projectRoot = process.cwd()) {
43
+ return join(getProvDir(projectRoot), GRAPH_FILE);
44
+ }
45
+ /**
46
+ * Get the mappings directory path.
47
+ */
48
+ export function getMappingsDir(projectRoot = process.cwd()) {
49
+ return join(getProvDir(projectRoot), MAPPINGS_DIR);
50
+ }
51
+ /**
52
+ * Get the cache directory path.
53
+ */
54
+ export function getCacheDir(projectRoot = process.cwd()) {
55
+ return join(getProvDir(projectRoot), CACHE_DIR);
56
+ }
57
+ /**
58
+ * Get the lock file path.
59
+ */
60
+ export function getLockPath(projectRoot = process.cwd()) {
61
+ return join(getProvDir(projectRoot), LOCK_FILE);
62
+ }
63
+ /**
64
+ * Get the mapping file path for a source file.
65
+ *
66
+ * @example
67
+ * getMappingPath('src/auth/login.ts') → '.prov/mappings/src/auth/login.ts.yaml'
68
+ */
69
+ export function getMappingPath(sourcePath, projectRoot = process.cwd()) {
70
+ // Normalize path to use forward slashes and be relative
71
+ const normalizedPath = sourcePath.replace(/\\/g, '/');
72
+ const relativePath = normalizedPath.startsWith('/')
73
+ ? normalizedPath.slice(1)
74
+ : normalizedPath;
75
+ return join(getMappingsDir(projectRoot), `${relativePath}.yaml`);
76
+ }
77
+ // ============================================================================
78
+ // Directory Management
79
+ // ============================================================================
80
+ /**
81
+ * Check if prov is initialized in the project.
82
+ */
83
+ export function isInitialized(projectRoot = process.cwd()) {
84
+ return existsSync(getProvDir(projectRoot));
85
+ }
86
+ /**
87
+ * Initialize prov directory structure.
88
+ *
89
+ * Creates:
90
+ * - .prov/
91
+ * - .prov/mappings/
92
+ * - .prov/cache/
93
+ *
94
+ * @see req:storage:directory-structure
95
+ */
96
+ export function initialize(projectRoot = process.cwd()) {
97
+ try {
98
+ const provDir = getProvDir(projectRoot);
99
+ if (existsSync(provDir)) {
100
+ return { success: true };
101
+ }
102
+ // Create directory structure
103
+ mkdirSync(provDir, { recursive: true });
104
+ mkdirSync(getMappingsDir(projectRoot), { recursive: true });
105
+ mkdirSync(getCacheDir(projectRoot), { recursive: true });
106
+ // Create .gitignore for cache
107
+ const gitignorePath = join(getCacheDir(projectRoot), '.gitignore');
108
+ writeFileSync(gitignorePath, '*\n!.gitignore\n');
109
+ return { success: true };
110
+ }
111
+ catch (error) {
112
+ return {
113
+ success: false,
114
+ error: `Failed to initialize prov: ${error instanceof Error ? error.message : String(error)}`,
115
+ };
116
+ }
117
+ }
118
+ /**
119
+ * Acquire a write lock.
120
+ *
121
+ * @see req:storage:atomic-writes
122
+ */
123
+ export function acquireLock(projectRoot = process.cwd()) {
124
+ const lockPath = getLockPath(projectRoot);
125
+ try {
126
+ // Check for stale lock
127
+ if (existsSync(lockPath)) {
128
+ const content = readFileSync(lockPath, 'utf8');
129
+ const lockInfo = JSON.parse(content);
130
+ const lockAge = Date.now() - new Date(lockInfo.timestamp).getTime();
131
+ if (lockAge > LOCK_TIMEOUT_MS) {
132
+ // Stale lock, remove it
133
+ unlinkSync(lockPath);
134
+ }
135
+ else {
136
+ return {
137
+ success: false,
138
+ error: `Lock held by PID ${lockInfo.pid} since ${lockInfo.timestamp}`,
139
+ };
140
+ }
141
+ }
142
+ // Create lock file
143
+ const lockInfo = {
144
+ pid: process.pid,
145
+ timestamp: new Date().toISOString(),
146
+ };
147
+ writeFileSync(lockPath, JSON.stringify(lockInfo), { flag: 'wx' });
148
+ return { success: true };
149
+ }
150
+ catch (error) {
151
+ if (error.code === 'EEXIST') {
152
+ return { success: false, error: 'Lock file already exists' };
153
+ }
154
+ return {
155
+ success: false,
156
+ error: `Failed to acquire lock: ${error instanceof Error ? error.message : String(error)}`,
157
+ };
158
+ }
159
+ }
160
+ /**
161
+ * Release the write lock.
162
+ */
163
+ export function releaseLock(projectRoot = process.cwd()) {
164
+ const lockPath = getLockPath(projectRoot);
165
+ try {
166
+ if (existsSync(lockPath)) {
167
+ unlinkSync(lockPath);
168
+ }
169
+ return { success: true };
170
+ }
171
+ catch (error) {
172
+ return {
173
+ success: false,
174
+ error: `Failed to release lock: ${error instanceof Error ? error.message : String(error)}`,
175
+ };
176
+ }
177
+ }
178
+ /**
179
+ * Execute a function with a lock held.
180
+ */
181
+ export async function withLock(projectRoot, fn) {
182
+ const lockResult = acquireLock(projectRoot);
183
+ if (!lockResult.success) {
184
+ return { success: false, error: lockResult.error ?? 'Failed to acquire lock' };
185
+ }
186
+ try {
187
+ const result = await fn();
188
+ return { success: true, data: result };
189
+ }
190
+ catch (error) {
191
+ return {
192
+ success: false,
193
+ error: error instanceof Error ? error.message : String(error),
194
+ };
195
+ }
196
+ finally {
197
+ releaseLock(projectRoot);
198
+ }
199
+ }
200
+ // ============================================================================
201
+ // Atomic Write
202
+ // ============================================================================
203
+ /**
204
+ * Write data atomically (write to temp, then rename).
205
+ *
206
+ * @see req:storage:atomic-writes
207
+ */
208
+ export function atomicWrite(filePath, content) {
209
+ const tempPath = `${filePath}.tmp.${process.pid}`;
210
+ try {
211
+ // Ensure parent directory exists
212
+ const dir = dirname(filePath);
213
+ if (!existsSync(dir)) {
214
+ mkdirSync(dir, { recursive: true });
215
+ }
216
+ // Write to temp file
217
+ writeFileSync(tempPath, content, 'utf8');
218
+ // Atomic rename
219
+ renameSync(tempPath, filePath);
220
+ return { success: true };
221
+ }
222
+ catch (error) {
223
+ // Clean up temp file on failure
224
+ try {
225
+ if (existsSync(tempPath)) {
226
+ unlinkSync(tempPath);
227
+ }
228
+ }
229
+ catch {
230
+ // Ignore cleanup errors
231
+ }
232
+ return {
233
+ success: false,
234
+ error: `Atomic write failed: ${error instanceof Error ? error.message : String(error)}`,
235
+ };
236
+ }
237
+ }
238
+ // ============================================================================
239
+ // Graph Persistence
240
+ // ============================================================================
241
+ /**
242
+ * Sort object keys recursively for deterministic JSON output.
243
+ */
244
+ function sortObjectKeys(obj) {
245
+ if (obj === null || obj === undefined) {
246
+ return obj;
247
+ }
248
+ if (Array.isArray(obj)) {
249
+ return obj.map(sortObjectKeys);
250
+ }
251
+ if (typeof obj === 'object') {
252
+ const sorted = {};
253
+ const keys = Object.keys(obj).sort();
254
+ for (const key of keys) {
255
+ sorted[key] = sortObjectKeys(obj[key]);
256
+ }
257
+ return sorted;
258
+ }
259
+ return obj;
260
+ }
261
+ /**
262
+ * Serialize graph to JSON with deterministic key ordering.
263
+ *
264
+ * @see req:storage:graph-format
265
+ */
266
+ function serializeGraph(graph) {
267
+ const nodes = {};
268
+ // Sort nodes by ID for deterministic output
269
+ const sortedNodes = graph.getAllNodes().sort((a, b) => a.id.localeCompare(b.id));
270
+ for (const node of sortedNodes) {
271
+ nodes[node.id] = {
272
+ id: node.id,
273
+ type: node.type,
274
+ hash: node.hash,
275
+ data: sortObjectKeys(node.data),
276
+ };
277
+ }
278
+ // Sort edges for deterministic output
279
+ const edges = graph.getAllEdges()
280
+ .map((e) => ({
281
+ from: e.from,
282
+ to: e.to,
283
+ type: e.type,
284
+ }))
285
+ .sort((a, b) => {
286
+ const fromCmp = a.from.localeCompare(b.from);
287
+ if (fromCmp !== 0)
288
+ return fromCmp;
289
+ const toCmp = a.to.localeCompare(b.to);
290
+ if (toCmp !== 0)
291
+ return toCmp;
292
+ return a.type.localeCompare(b.type);
293
+ });
294
+ return {
295
+ schemaVersion: SCHEMA_VERSION,
296
+ updatedAt: new Date().toISOString(),
297
+ nodes,
298
+ edges,
299
+ };
300
+ }
301
+ /**
302
+ * Deserialize graph from JSON.
303
+ */
304
+ function deserializeGraph(data) {
305
+ const graph = new IntentGraph();
306
+ // Add nodes
307
+ for (const node of Object.values(data.nodes)) {
308
+ graph.addNode(node.id, node.type, node.data, node.hash);
309
+ }
310
+ // Add edges
311
+ for (const edge of data.edges) {
312
+ graph.addEdge(edge.from, edge.to, edge.type);
313
+ }
314
+ return graph;
315
+ }
316
+ /**
317
+ * Save the intent graph to disk.
318
+ *
319
+ * @see req:storage:graph-format
320
+ * @see req:storage:atomic-writes
321
+ */
322
+ export function saveGraph(graph, projectRoot = process.cwd()) {
323
+ const graphPath = getGraphPath(projectRoot);
324
+ try {
325
+ const graphFile = serializeGraph(graph);
326
+ const content = JSON.stringify(graphFile, null, 2);
327
+ return atomicWrite(graphPath, content);
328
+ }
329
+ catch (error) {
330
+ return {
331
+ success: false,
332
+ error: `Failed to save graph: ${error instanceof Error ? error.message : String(error)}`,
333
+ };
334
+ }
335
+ }
336
+ /**
337
+ * Load the intent graph from disk.
338
+ *
339
+ * @see req:storage:graph-format
340
+ */
341
+ export function loadGraph(projectRoot = process.cwd()) {
342
+ const graphPath = getGraphPath(projectRoot);
343
+ try {
344
+ if (!existsSync(graphPath)) {
345
+ // Return empty graph if file doesn't exist
346
+ return { success: true, data: new IntentGraph() };
347
+ }
348
+ const content = readFileSync(graphPath, 'utf8');
349
+ const data = JSON.parse(content);
350
+ // Validate schema version
351
+ if (data.schemaVersion !== SCHEMA_VERSION) {
352
+ return {
353
+ success: false,
354
+ error: `Unsupported schema version: ${data.schemaVersion} (expected ${SCHEMA_VERSION})`,
355
+ };
356
+ }
357
+ const graph = deserializeGraph(data);
358
+ return { success: true, data: graph };
359
+ }
360
+ catch (error) {
361
+ return {
362
+ success: false,
363
+ error: `Failed to load graph: ${error instanceof Error ? error.message : String(error)}`,
364
+ };
365
+ }
366
+ }
367
+ // ============================================================================
368
+ // Mapping Persistence
369
+ // ============================================================================
370
+ /**
371
+ * Save a trace mapping for a source file.
372
+ *
373
+ * @see req:storage:mapping-format
374
+ */
375
+ export function saveMapping(mapping, projectRoot = process.cwd()) {
376
+ const mappingPath = getMappingPath(mapping.path, projectRoot);
377
+ try {
378
+ const content = toYaml(mapping);
379
+ return atomicWrite(mappingPath, content);
380
+ }
381
+ catch (error) {
382
+ return {
383
+ success: false,
384
+ error: `Failed to save mapping: ${error instanceof Error ? error.message : String(error)}`,
385
+ };
386
+ }
387
+ }
388
+ /**
389
+ * Load a trace mapping for a source file.
390
+ *
391
+ * @see req:storage:mapping-format
392
+ */
393
+ export function loadMapping(sourcePath, projectRoot = process.cwd()) {
394
+ const mappingPath = getMappingPath(sourcePath, projectRoot);
395
+ try {
396
+ if (!existsSync(mappingPath)) {
397
+ return { success: true, data: null };
398
+ }
399
+ const content = readFileSync(mappingPath, 'utf8');
400
+ const mapping = parseYaml(content);
401
+ return { success: true, data: mapping };
402
+ }
403
+ catch (error) {
404
+ return {
405
+ success: false,
406
+ error: `Failed to load mapping: ${error instanceof Error ? error.message : String(error)}`,
407
+ };
408
+ }
409
+ }
410
+ /**
411
+ * Delete a trace mapping for a source file.
412
+ */
413
+ export function deleteMapping(sourcePath, projectRoot = process.cwd()) {
414
+ const mappingPath = getMappingPath(sourcePath, projectRoot);
415
+ try {
416
+ if (existsSync(mappingPath)) {
417
+ unlinkSync(mappingPath);
418
+ }
419
+ return { success: true };
420
+ }
421
+ catch (error) {
422
+ return {
423
+ success: false,
424
+ error: `Failed to delete mapping: ${error instanceof Error ? error.message : String(error)}`,
425
+ };
426
+ }
427
+ }
428
+ /**
429
+ * List all trace mappings.
430
+ */
431
+ export function listMappings(projectRoot = process.cwd()) {
432
+ const mappingsDir = getMappingsDir(projectRoot);
433
+ try {
434
+ if (!existsSync(mappingsDir)) {
435
+ return { success: true, data: [] };
436
+ }
437
+ const files = [];
438
+ const walkDir = (dir) => {
439
+ const entries = readdirSync(dir);
440
+ for (const entry of entries) {
441
+ const fullPath = join(dir, entry);
442
+ const stat = statSync(fullPath);
443
+ if (stat.isDirectory()) {
444
+ walkDir(fullPath);
445
+ }
446
+ else if (entry.endsWith('.yaml')) {
447
+ // Convert mapping path back to source path
448
+ const relPath = relative(mappingsDir, fullPath);
449
+ // Remove .yaml extension
450
+ const sourcePath = relPath.slice(0, -5);
451
+ files.push(sourcePath);
452
+ }
453
+ }
454
+ };
455
+ walkDir(mappingsDir);
456
+ return { success: true, data: files.sort() };
457
+ }
458
+ catch (error) {
459
+ return {
460
+ success: false,
461
+ error: `Failed to list mappings: ${error instanceof Error ? error.message : String(error)}`,
462
+ };
463
+ }
464
+ }
465
+ // ============================================================================
466
+ // Cache Management
467
+ // ============================================================================
468
+ /**
469
+ * Get cached hash for a file.
470
+ */
471
+ export function getCachedHash(filePath, projectRoot = process.cwd()) {
472
+ const cacheDir = getCacheDir(projectRoot);
473
+ const cacheFile = join(cacheDir, `${sha256(filePath)}.hash`);
474
+ try {
475
+ if (existsSync(cacheFile)) {
476
+ return readFileSync(cacheFile, 'utf8').trim();
477
+ }
478
+ return null;
479
+ }
480
+ catch {
481
+ return null;
482
+ }
483
+ }
484
+ /**
485
+ * Set cached hash for a file.
486
+ */
487
+ export function setCachedHash(filePath, hash, projectRoot = process.cwd()) {
488
+ const cacheDir = getCacheDir(projectRoot);
489
+ const cacheFile = join(cacheDir, `${sha256(filePath)}.hash`);
490
+ try {
491
+ if (!existsSync(cacheDir)) {
492
+ mkdirSync(cacheDir, { recursive: true });
493
+ }
494
+ writeFileSync(cacheFile, hash);
495
+ return { success: true };
496
+ }
497
+ catch (error) {
498
+ return {
499
+ success: false,
500
+ error: `Failed to cache hash: ${error instanceof Error ? error.message : String(error)}`,
501
+ };
502
+ }
503
+ }
504
+ /**
505
+ * Clear the hash cache.
506
+ */
507
+ export function clearCache(projectRoot = process.cwd()) {
508
+ const cacheDir = getCacheDir(projectRoot);
509
+ try {
510
+ if (existsSync(cacheDir)) {
511
+ const entries = readdirSync(cacheDir);
512
+ for (const entry of entries) {
513
+ if (entry !== '.gitignore') {
514
+ unlinkSync(join(cacheDir, entry));
515
+ }
516
+ }
517
+ }
518
+ return { success: true };
519
+ }
520
+ catch (error) {
521
+ return {
522
+ success: false,
523
+ error: `Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`,
524
+ };
525
+ }
526
+ }
527
+ // ============================================================================
528
+ // High-Level Storage Interface
529
+ // ============================================================================
530
+ /**
531
+ * Storage class providing a high-level interface for prov persistence.
532
+ */
533
+ export class Storage {
534
+ projectRoot;
535
+ constructor(options = {}) {
536
+ this.projectRoot = options.projectRoot ?? process.cwd();
537
+ }
538
+ /**
539
+ * Check if prov is initialized.
540
+ */
541
+ isInitialized() {
542
+ return isInitialized(this.projectRoot);
543
+ }
544
+ /**
545
+ * Initialize prov directory structure.
546
+ */
547
+ initialize() {
548
+ return initialize(this.projectRoot);
549
+ }
550
+ /**
551
+ * Load the intent graph.
552
+ */
553
+ loadGraph() {
554
+ return loadGraph(this.projectRoot);
555
+ }
556
+ /**
557
+ * Save the intent graph.
558
+ */
559
+ saveGraph(graph) {
560
+ return saveGraph(graph, this.projectRoot);
561
+ }
562
+ /**
563
+ * Load a file mapping.
564
+ */
565
+ loadMapping(sourcePath) {
566
+ return loadMapping(sourcePath, this.projectRoot);
567
+ }
568
+ /**
569
+ * Save a file mapping.
570
+ */
571
+ saveMapping(mapping) {
572
+ return saveMapping(mapping, this.projectRoot);
573
+ }
574
+ /**
575
+ * Delete a file mapping.
576
+ */
577
+ deleteMapping(sourcePath) {
578
+ return deleteMapping(sourcePath, this.projectRoot);
579
+ }
580
+ /**
581
+ * List all file mappings.
582
+ */
583
+ listMappings() {
584
+ return listMappings(this.projectRoot);
585
+ }
586
+ /**
587
+ * Get cached hash for a file.
588
+ */
589
+ getCachedHash(filePath) {
590
+ return getCachedHash(filePath, this.projectRoot);
591
+ }
592
+ /**
593
+ * Set cached hash for a file.
594
+ */
595
+ setCachedHash(filePath, hash) {
596
+ return setCachedHash(filePath, hash, this.projectRoot);
597
+ }
598
+ /**
599
+ * Clear the cache.
600
+ */
601
+ clearCache() {
602
+ return clearCache(this.projectRoot);
603
+ }
604
+ /**
605
+ * Execute a function with a write lock.
606
+ */
607
+ async withLock(fn) {
608
+ return withLock(this.projectRoot, fn);
609
+ }
610
+ /**
611
+ * Get path utilities.
612
+ */
613
+ get paths() {
614
+ return {
615
+ provDir: getProvDir(this.projectRoot),
616
+ graphPath: getGraphPath(this.projectRoot),
617
+ mappingsDir: getMappingsDir(this.projectRoot),
618
+ cacheDir: getCacheDir(this.projectRoot),
619
+ getMappingPath: (sourcePath) => getMappingPath(sourcePath, this.projectRoot),
620
+ };
621
+ }
622
+ }
623
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5H,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGtD,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEhC,6BAA6B;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEvC,8BAA8B;AAC9B,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAEvC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AAEjC,qBAAqB;AACrB,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AAEjC,sCAAsC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,mCAAmC;AACnC,MAAM,eAAe,GAAG,KAAK,CAAC;AAqF9B,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC5D,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAChE,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC7D,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC7D,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,wDAAwD;IACxD,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC;QACjD,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,cAAc,CAAC;IACnB,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,YAAY,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC/D,OAAO,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;QAExC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,6BAA6B;QAC7B,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,SAAS,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,8BAA8B;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC;QACnE,aAAa,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QAEjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC9F,CAAC;IACJ,CAAC;AACH,CAAC;AAeD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC7D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,uBAAuB;QACvB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAEpE,IAAI,OAAO,GAAG,eAAe,EAAE,CAAC;gBAC9B,wBAAwB;gBACxB,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,oBAAoB,QAAQ,CAAC,GAAG,UAAU,QAAQ,CAAC,SAAS,EAAE;iBACtE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,QAAQ,GAAa;YACzB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC3F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC7D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC3F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,WAAmB,EACnB,EAAwB;IAExB,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,wBAAwB,EAAE,CAAC;IACjF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,WAAW,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAe;IAC3D,MAAM,QAAQ,GAAG,GAAG,QAAQ,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IAElD,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,qBAAqB;QACrB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEzC,gBAAgB;QAChB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE/B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gCAAgC;QAChC,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAkB;IACxC,MAAM,KAAK,GAAmC,EAAE,CAAC;IAEjD,4CAA4C;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAClC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9B,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEL,OAAO;QACL,aAAa,EAAE,cAAc;QAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;QACL,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAe;IACvC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAEhC,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,OAAO,CACX,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,IAAyB,EAC9B,IAAI,CAAC,IAAyB,EAC9B,IAAI,CAAC,IAAI,CACV,CAAC;IACJ,CAAC;IAED,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,KAAK,CAAC,OAAO,CACX,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,IAAyB,CAC/B,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,KAAkB,EAClB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEnD,OAAO,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,2CAA2C;YAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,EAAE,CAAC;QACpD,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAE9C,0BAA0B;QAC1B,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,+BAA+B,IAAI,CAAC,aAAa,cAAc,cAAc,GAAG;aACxF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,OAAoB,EACpB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC3F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB,EAClB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,SAAS,CAAc,OAAO,CAAC,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC3F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,UAAkB,EAClB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC7F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC9D,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,OAAO,GAAG,CAAC,GAAW,EAAQ,EAAE;YACpC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpB,CAAC;qBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,2CAA2C;oBAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;oBAChD,yBAAyB;oBACzB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,WAAW,CAAC,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAU,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,IAAU,EACV,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC1F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,OAAO;IACD,WAAW,CAAS;IAErC,YAAY,UAA0B,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAkB;QAC1B,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,UAAkB;QAC5B,OAAO,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAoB;QAC9B,OAAO,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,UAAkB;QAC9B,OAAO,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB;QAC5B,OAAO,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB,EAAE,IAAU;QACxC,OAAO,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAI,EAAwB;QACxC,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QAOP,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;YACrC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;YACzC,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YAC7C,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;YACvC,cAAc,EAAE,CAAC,UAAkB,EAAU,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC;SAC7F,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for the storage layer.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=storage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.d.ts","sourceRoot":"","sources":["../src/storage.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}