@sudosandwich/limps-headless 0.1.3
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/LICENSE +21 -0
- package/README.md +339 -0
- package/bin/limps-headless +2 -0
- package/dist/analysis/index.d.ts +6 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +6 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/ir/build-ir.d.ts +10 -0
- package/dist/analysis/ir/build-ir.d.ts.map +1 -0
- package/dist/analysis/ir/build-ir.js +102 -0
- package/dist/analysis/ir/build-ir.js.map +1 -0
- package/dist/analysis/ir/types.d.ts +44 -0
- package/dist/analysis/ir/types.d.ts.map +1 -0
- package/dist/analysis/ir/types.js +2 -0
- package/dist/analysis/ir/types.js.map +1 -0
- package/dist/analysis/module-graph.d.ts +20 -0
- package/dist/analysis/module-graph.d.ts.map +1 -0
- package/dist/analysis/module-graph.js +104 -0
- package/dist/analysis/module-graph.js.map +1 -0
- package/dist/analysis/passes/behavior-evidence.d.ts +9 -0
- package/dist/analysis/passes/behavior-evidence.d.ts.map +1 -0
- package/dist/analysis/passes/behavior-evidence.js +80 -0
- package/dist/analysis/passes/behavior-evidence.js.map +1 -0
- package/dist/analysis/passes/import-evidence.d.ts +3 -0
- package/dist/analysis/passes/import-evidence.d.ts.map +1 -0
- package/dist/analysis/passes/import-evidence.js +58 -0
- package/dist/analysis/passes/import-evidence.js.map +1 -0
- package/dist/analysis/passes/index.d.ts +15 -0
- package/dist/analysis/passes/index.d.ts.map +1 -0
- package/dist/analysis/passes/index.js +21 -0
- package/dist/analysis/passes/index.js.map +1 -0
- package/dist/analysis/passes/jsx-evidence.d.ts +8 -0
- package/dist/analysis/passes/jsx-evidence.d.ts.map +1 -0
- package/dist/analysis/passes/jsx-evidence.js +149 -0
- package/dist/analysis/passes/jsx-evidence.js.map +1 -0
- package/dist/analysis/ts-program.d.ts +12 -0
- package/dist/analysis/ts-program.d.ts.map +1 -0
- package/dist/analysis/ts-program.js +59 -0
- package/dist/analysis/ts-program.js.map +1 -0
- package/dist/analyzer/disambiguator.d.ts +20 -0
- package/dist/analyzer/disambiguator.d.ts.map +1 -0
- package/dist/analyzer/disambiguator.js +83 -0
- package/dist/analyzer/disambiguator.js.map +1 -0
- package/dist/analyzer/index.d.ts +26 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +68 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/parser.d.ts +23 -0
- package/dist/analyzer/parser.d.ts.map +1 -0
- package/dist/analyzer/parser.js +58 -0
- package/dist/analyzer/parser.js.map +1 -0
- package/dist/analyzer/patterns.d.ts +42 -0
- package/dist/analyzer/patterns.d.ts.map +1 -0
- package/dist/analyzer/patterns.js +206 -0
- package/dist/analyzer/patterns.js.map +1 -0
- package/dist/analyzer/props.d.ts +16 -0
- package/dist/analyzer/props.d.ts.map +1 -0
- package/dist/analyzer/props.js +235 -0
- package/dist/analyzer/props.js.map +1 -0
- package/dist/analyzer/rules/checkbox-switch-toggle.d.ts +10 -0
- package/dist/analyzer/rules/checkbox-switch-toggle.d.ts.map +1 -0
- package/dist/analyzer/rules/checkbox-switch-toggle.js +26 -0
- package/dist/analyzer/rules/checkbox-switch-toggle.js.map +1 -0
- package/dist/analyzer/rules/dialog-popover.d.ts +10 -0
- package/dist/analyzer/rules/dialog-popover.d.ts.map +1 -0
- package/dist/analyzer/rules/dialog-popover.js +25 -0
- package/dist/analyzer/rules/dialog-popover.js.map +1 -0
- package/dist/analyzer/rules/index.d.ts +24 -0
- package/dist/analyzer/rules/index.d.ts.map +1 -0
- package/dist/analyzer/rules/index.js +51 -0
- package/dist/analyzer/rules/index.js.map +1 -0
- package/dist/analyzer/rules/tooltip-hovercard.d.ts +10 -0
- package/dist/analyzer/rules/tooltip-hovercard.d.ts.map +1 -0
- package/dist/analyzer/rules/tooltip-hovercard.js +21 -0
- package/dist/analyzer/rules/tooltip-hovercard.js.map +1 -0
- package/dist/analyzer/scorer.d.ts +12 -0
- package/dist/analyzer/scorer.d.ts.map +1 -0
- package/dist/analyzer/scorer.js +171 -0
- package/dist/analyzer/scorer.js.map +1 -0
- package/dist/analyzer/weights.d.ts +28 -0
- package/dist/analyzer/weights.d.ts.map +1 -0
- package/dist/analyzer/weights.js +40 -0
- package/dist/analyzer/weights.js.map +1 -0
- package/dist/audit/analyses/migration.d.ts +42 -0
- package/dist/audit/analyses/migration.d.ts.map +1 -0
- package/dist/audit/analyses/migration.js +91 -0
- package/dist/audit/analyses/migration.js.map +1 -0
- package/dist/audit/discover-components.d.ts +7 -0
- package/dist/audit/discover-components.d.ts.map +1 -0
- package/dist/audit/discover-components.js +486 -0
- package/dist/audit/discover-components.js.map +1 -0
- package/dist/audit/generate-report.d.ts +28 -0
- package/dist/audit/generate-report.d.ts.map +1 -0
- package/dist/audit/generate-report.js +333 -0
- package/dist/audit/generate-report.js.map +1 -0
- package/dist/audit/index.d.ts +8 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +8 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/run-audit.d.ts +33 -0
- package/dist/audit/run-audit.d.ts.map +1 -0
- package/dist/audit/run-audit.js +287 -0
- package/dist/audit/run-audit.js.map +1 -0
- package/dist/audit/types.d.ts +135 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +5 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/cache/index.d.ts +110 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +176 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/storage.d.ts +73 -0
- package/dist/cache/storage.d.ts.map +1 -0
- package/dist/cache/storage.js +176 -0
- package/dist/cache/storage.js.map +1 -0
- package/dist/cache/ttl.d.ts +62 -0
- package/dist/cache/ttl.d.ts.map +1 -0
- package/dist/cache/ttl.js +96 -0
- package/dist/cache/ttl.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +6 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +43 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +6 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +73 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/check-updates.d.ts +6 -0
- package/dist/cli/commands/check-updates.d.ts.map +1 -0
- package/dist/cli/commands/check-updates.js +34 -0
- package/dist/cli/commands/check-updates.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +7 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +48 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/extract.d.ts +6 -0
- package/dist/cli/commands/extract.d.ts.map +1 -0
- package/dist/cli/commands/extract.js +42 -0
- package/dist/cli/commands/extract.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +33 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/flags.d.ts +9 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +22 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +40 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/differ/hints.d.ts +21 -0
- package/dist/differ/hints.d.ts.map +1 -0
- package/dist/differ/hints.js +105 -0
- package/dist/differ/hints.js.map +1 -0
- package/dist/differ/index.d.ts +25 -0
- package/dist/differ/index.d.ts.map +1 -0
- package/dist/differ/index.js +115 -0
- package/dist/differ/index.js.map +1 -0
- package/dist/differ/props.d.ts +36 -0
- package/dist/differ/props.d.ts.map +1 -0
- package/dist/differ/props.js +210 -0
- package/dist/differ/props.js.map +1 -0
- package/dist/differ/severity.d.ts +31 -0
- package/dist/differ/severity.d.ts.map +1 -0
- package/dist/differ/severity.js +65 -0
- package/dist/differ/severity.js.map +1 -0
- package/dist/differ/types.d.ts +109 -0
- package/dist/differ/types.d.ts.map +1 -0
- package/dist/differ/types.js +5 -0
- package/dist/differ/types.js.map +1 -0
- package/dist/extractor/classifier.d.ts +30 -0
- package/dist/extractor/classifier.d.ts.map +1 -0
- package/dist/extractor/classifier.js +150 -0
- package/dist/extractor/classifier.js.map +1 -0
- package/dist/extractor/forward-ref.d.ts +28 -0
- package/dist/extractor/forward-ref.d.ts.map +1 -0
- package/dist/extractor/forward-ref.js +134 -0
- package/dist/extractor/forward-ref.js.map +1 -0
- package/dist/extractor/index.d.ts +25 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +43 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/extractor/interface.d.ts +40 -0
- package/dist/extractor/interface.d.ts.map +1 -0
- package/dist/extractor/interface.js +233 -0
- package/dist/extractor/interface.js.map +1 -0
- package/dist/extractor/jsdoc.d.ts +24 -0
- package/dist/extractor/jsdoc.d.ts.map +1 -0
- package/dist/extractor/jsdoc.js +74 -0
- package/dist/extractor/jsdoc.js.map +1 -0
- package/dist/extractor/project.d.ts +17 -0
- package/dist/extractor/project.d.ts.map +1 -0
- package/dist/extractor/project.js +33 -0
- package/dist/extractor/project.js.map +1 -0
- package/dist/extractor/props.d.ts +24 -0
- package/dist/extractor/props.d.ts.map +1 -0
- package/dist/extractor/props.js +78 -0
- package/dist/extractor/props.js.map +1 -0
- package/dist/extractor/type-resolver.d.ts +32 -0
- package/dist/extractor/type-resolver.d.ts.map +1 -0
- package/dist/extractor/type-resolver.js +129 -0
- package/dist/extractor/type-resolver.js.map +1 -0
- package/dist/fetcher/index.d.ts +7 -0
- package/dist/fetcher/index.d.ts.map +1 -0
- package/dist/fetcher/index.js +7 -0
- package/dist/fetcher/index.js.map +1 -0
- package/dist/fetcher/npm-registry.d.ts +45 -0
- package/dist/fetcher/npm-registry.d.ts.map +1 -0
- package/dist/fetcher/npm-registry.js +217 -0
- package/dist/fetcher/npm-registry.js.map +1 -0
- package/dist/fetcher/unified-package.d.ts +27 -0
- package/dist/fetcher/unified-package.d.ts.map +1 -0
- package/dist/fetcher/unified-package.js +99 -0
- package/dist/fetcher/unified-package.js.map +1 -0
- package/dist/fetcher/unpkg.d.ts +20 -0
- package/dist/fetcher/unpkg.d.ts.map +1 -0
- package/dist/fetcher/unpkg.js +58 -0
- package/dist/fetcher/unpkg.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/base.d.ts +10 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +80 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +10 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +10 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/interface.d.ts +56 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +5 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/providers/radix-backend.d.ts +11 -0
- package/dist/providers/radix-backend.d.ts.map +1 -0
- package/dist/providers/radix-backend.js +107 -0
- package/dist/providers/radix-backend.js.map +1 -0
- package/dist/providers/radix.d.ts +6 -0
- package/dist/providers/radix.d.ts.map +1 -0
- package/dist/providers/radix.js +21 -0
- package/dist/providers/radix.js.map +1 -0
- package/dist/providers/registry.d.ts +17 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +55 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/rules/engine.d.ts +4 -0
- package/dist/rules/engine.d.ts.map +1 -0
- package/dist/rules/engine.js +37 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/index.d.ts +6 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +6 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/predicates.d.ts +10 -0
- package/dist/rules/predicates.d.ts.map +1 -0
- package/dist/rules/predicates.js +93 -0
- package/dist/rules/predicates.js.map +1 -0
- package/dist/rules/rulesets/base-ui.d.ts +3 -0
- package/dist/rules/rulesets/base-ui.d.ts.map +1 -0
- package/dist/rules/rulesets/base-ui.js +65 -0
- package/dist/rules/rulesets/base-ui.js.map +1 -0
- package/dist/rules/rulesets/radix-legacy.d.ts +3 -0
- package/dist/rules/rulesets/radix-legacy.d.ts.map +1 -0
- package/dist/rules/rulesets/radix-legacy.js +38 -0
- package/dist/rules/rulesets/radix-legacy.js.map +1 -0
- package/dist/rules/types.d.ts +57 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/signatures/disambiguation.d.ts +30 -0
- package/dist/signatures/disambiguation.d.ts.map +1 -0
- package/dist/signatures/disambiguation.js +99 -0
- package/dist/signatures/disambiguation.js.map +1 -0
- package/dist/signatures/distinguishing.d.ts +29 -0
- package/dist/signatures/distinguishing.d.ts.map +1 -0
- package/dist/signatures/distinguishing.js +108 -0
- package/dist/signatures/distinguishing.js.map +1 -0
- package/dist/signatures/generator.d.ts +20 -0
- package/dist/signatures/generator.d.ts.map +1 -0
- package/dist/signatures/generator.js +147 -0
- package/dist/signatures/generator.js.map +1 -0
- package/dist/signatures/index.d.ts +10 -0
- package/dist/signatures/index.d.ts.map +1 -0
- package/dist/signatures/index.js +10 -0
- package/dist/signatures/index.js.map +1 -0
- package/dist/signatures/inference.d.ts +37 -0
- package/dist/signatures/inference.d.ts.map +1 -0
- package/dist/signatures/inference.js +132 -0
- package/dist/signatures/inference.js.map +1 -0
- package/dist/tools/analyze-component.d.ts +41 -0
- package/dist/tools/analyze-component.d.ts.map +1 -0
- package/dist/tools/analyze-component.js +274 -0
- package/dist/tools/analyze-component.js.map +1 -0
- package/dist/tools/check-updates.d.ts +33 -0
- package/dist/tools/check-updates.d.ts.map +1 -0
- package/dist/tools/check-updates.js +81 -0
- package/dist/tools/check-updates.js.map +1 -0
- package/dist/tools/diff-versions.d.ts +39 -0
- package/dist/tools/diff-versions.d.ts.map +1 -0
- package/dist/tools/diff-versions.js +78 -0
- package/dist/tools/diff-versions.js.map +1 -0
- package/dist/tools/extract-primitive.d.ts +50 -0
- package/dist/tools/extract-primitive.d.ts.map +1 -0
- package/dist/tools/extract-primitive.js +145 -0
- package/dist/tools/extract-primitive.js.map +1 -0
- package/dist/tools/generate-report.d.ts +29 -0
- package/dist/tools/generate-report.d.ts.map +1 -0
- package/dist/tools/generate-report.js +36 -0
- package/dist/tools/generate-report.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-primitives.d.ts +41 -0
- package/dist/tools/list-primitives.d.ts.map +1 -0
- package/dist/tools/list-primitives.js +74 -0
- package/dist/tools/list-primitives.js.map +1 -0
- package/dist/tools/run-audit.d.ts +43 -0
- package/dist/tools/run-audit.d.ts.map +1 -0
- package/dist/tools/run-audit.js +60 -0
- package/dist/tools/run-audit.js.map +1 -0
- package/dist/types/index.d.ts +143 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/docs/architecture.md +88 -0
- package/docs/providers.md +47 -0
- package/docs/tools.md +143 -0
- package/package.json +59 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache module for Radix primitive data.
|
|
3
|
+
*
|
|
4
|
+
* Provides version-aware caching with TTL for:
|
|
5
|
+
* - ExtractedPrimitive data
|
|
6
|
+
* - BehaviorSignature data
|
|
7
|
+
* - "Latest" version resolution
|
|
8
|
+
*/
|
|
9
|
+
import { getCacheDir, getCachePath, readFromFile, writeToFile, deleteFile, deleteDir, listCachedVersions, listCachedPrimitives, } from './storage.js';
|
|
10
|
+
import { isVersionDataExpired, isSignatureExpired, TTL } from './ttl.js';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
// Re-export storage and TTL utilities
|
|
13
|
+
export * from './storage.js';
|
|
14
|
+
export * from './ttl.js';
|
|
15
|
+
/**
|
|
16
|
+
* Get cached ExtractedPrimitive data.
|
|
17
|
+
* @param primitive - Primitive name (e.g., "Dialog")
|
|
18
|
+
* @param version - Version string
|
|
19
|
+
* @param options - Cache options
|
|
20
|
+
* @returns Cached data or null if not found or expired
|
|
21
|
+
*/
|
|
22
|
+
export async function getFromCache(primitive, version, options = {}) {
|
|
23
|
+
const cachePath = getCachePath(primitive, version, 'data', options.baseDir);
|
|
24
|
+
const data = await readFromFile(cachePath);
|
|
25
|
+
if (!data) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
// Check expiration unless ignored
|
|
29
|
+
if (!options.ignoreExpired && isVersionDataExpired(data.extractedAt)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return data;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Save ExtractedPrimitive data to cache.
|
|
36
|
+
* @param primitive - Primitive name (e.g., "Dialog")
|
|
37
|
+
* @param version - Version string
|
|
38
|
+
* @param data - Data to cache
|
|
39
|
+
* @param options - Cache options
|
|
40
|
+
*/
|
|
41
|
+
export async function saveToCache(primitive, version, data, options = {}) {
|
|
42
|
+
const cachePath = getCachePath(primitive, version, 'data', options.baseDir);
|
|
43
|
+
await writeToFile(cachePath, data);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get cached BehaviorSignature data.
|
|
47
|
+
* @param primitive - Primitive name (e.g., "Dialog")
|
|
48
|
+
* @param version - Version string
|
|
49
|
+
* @param options - Cache options
|
|
50
|
+
* @returns Cached signature or null if not found or expired
|
|
51
|
+
*/
|
|
52
|
+
export async function getSignatureFromCache(primitive, version, options = {}) {
|
|
53
|
+
const cachePath = getCachePath(primitive, version, 'sig', options.baseDir);
|
|
54
|
+
// BehaviorSignature doesn't have a timestamp, so we check the ExtractedPrimitive
|
|
55
|
+
const extractedPath = getCachePath(primitive, version, 'data', options.baseDir);
|
|
56
|
+
const extracted = await readFromFile(extractedPath);
|
|
57
|
+
// If no extracted data exists, signature is orphaned
|
|
58
|
+
if (!extracted && !options.ignoreExpired) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
// Check expiration based on extracted data timestamp
|
|
62
|
+
if (extracted && !options.ignoreExpired && isSignatureExpired(extracted.extractedAt)) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return readFromFile(cachePath);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Save BehaviorSignature data to cache.
|
|
69
|
+
* @param primitive - Primitive name (e.g., "Dialog")
|
|
70
|
+
* @param version - Version string
|
|
71
|
+
* @param signature - Signature to cache
|
|
72
|
+
* @param options - Cache options
|
|
73
|
+
*/
|
|
74
|
+
export async function saveSignatureToCache(primitive, version, signature, options = {}) {
|
|
75
|
+
const cachePath = getCachePath(primitive, version, 'sig', options.baseDir);
|
|
76
|
+
await writeToFile(cachePath, signature);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the "latest" version resolution for a primitive.
|
|
80
|
+
* @param primitive - Primitive name
|
|
81
|
+
* @param options - Cache options
|
|
82
|
+
* @returns Latest resolution or null if not found or expired
|
|
83
|
+
*/
|
|
84
|
+
export async function getLatestResolution(primitive, options = {}) {
|
|
85
|
+
const cacheDir = getCacheDir(options.baseDir);
|
|
86
|
+
const latestPath = path.join(cacheDir, 'latest-resolved.json');
|
|
87
|
+
const cache = await readFromFile(latestPath);
|
|
88
|
+
if (!cache || !cache[primitive]) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const resolution = cache[primitive];
|
|
92
|
+
// Check expiration
|
|
93
|
+
if (!options.ignoreExpired) {
|
|
94
|
+
const resolvedTime = new Date(resolution.resolvedAt).getTime();
|
|
95
|
+
const now = Date.now();
|
|
96
|
+
if (now - resolvedTime >= TTL.LATEST_RESOLUTION) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return resolution;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Save a "latest" version resolution.
|
|
104
|
+
* @param primitive - Primitive name
|
|
105
|
+
* @param version - Resolved version string
|
|
106
|
+
* @param options - Cache options
|
|
107
|
+
*/
|
|
108
|
+
export async function saveLatestResolution(primitive, version, options = {}) {
|
|
109
|
+
const cacheDir = getCacheDir(options.baseDir);
|
|
110
|
+
const latestPath = path.join(cacheDir, 'latest-resolved.json');
|
|
111
|
+
// Read existing cache
|
|
112
|
+
let cache = await readFromFile(latestPath);
|
|
113
|
+
if (!cache) {
|
|
114
|
+
cache = {};
|
|
115
|
+
}
|
|
116
|
+
// Update entry
|
|
117
|
+
cache[primitive] = {
|
|
118
|
+
version,
|
|
119
|
+
resolvedAt: new Date().toISOString(),
|
|
120
|
+
};
|
|
121
|
+
await writeToFile(latestPath, cache);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Clear cache for a specific primitive and version, or all cache.
|
|
125
|
+
* @param primitive - Optional primitive name (clears all if not provided)
|
|
126
|
+
* @param version - Optional version (clears all versions of primitive if not provided)
|
|
127
|
+
* @param options - Cache options
|
|
128
|
+
*/
|
|
129
|
+
export async function clearCache(primitive, version, options = {}) {
|
|
130
|
+
const cacheDir = getCacheDir(options.baseDir);
|
|
131
|
+
// Clear everything
|
|
132
|
+
if (!primitive) {
|
|
133
|
+
await deleteDir(cacheDir);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Clear specific primitive in specific version
|
|
137
|
+
if (version) {
|
|
138
|
+
await deleteFile(getCachePath(primitive, version, 'data', options.baseDir));
|
|
139
|
+
await deleteFile(getCachePath(primitive, version, 'sig', options.baseDir));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Clear specific primitive in all versions
|
|
143
|
+
const versions = await listCachedVersions(options.baseDir);
|
|
144
|
+
for (const v of versions) {
|
|
145
|
+
await deleteFile(getCachePath(primitive, v, 'data', options.baseDir));
|
|
146
|
+
await deleteFile(getCachePath(primitive, v, 'sig', options.baseDir));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get cache statistics.
|
|
151
|
+
* @param options - Cache options
|
|
152
|
+
* @returns Cache statistics
|
|
153
|
+
*/
|
|
154
|
+
export async function getCacheStats(options = {}) {
|
|
155
|
+
const versions = await listCachedVersions(options.baseDir);
|
|
156
|
+
let primitiveCount = 0;
|
|
157
|
+
let signatureCount = 0;
|
|
158
|
+
for (const version of versions) {
|
|
159
|
+
const primitives = await listCachedPrimitives(version, options.baseDir);
|
|
160
|
+
primitiveCount += primitives.length;
|
|
161
|
+
// Count signatures (files ending in .sig.json)
|
|
162
|
+
for (const primitive of primitives) {
|
|
163
|
+
const sigPath = getCachePath(primitive, version, 'sig', options.baseDir);
|
|
164
|
+
const sig = await readFromFile(sigPath);
|
|
165
|
+
if (sig) {
|
|
166
|
+
signatureCount++;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
versions,
|
|
172
|
+
primitiveCount,
|
|
173
|
+
signatureCount,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based cache storage for Radix primitive data.
|
|
3
|
+
*
|
|
4
|
+
* Cache structure:
|
|
5
|
+
* ~/.limps-headless/
|
|
6
|
+
* cache/
|
|
7
|
+
* 1.0.5/
|
|
8
|
+
* dialog.json # ExtractedPrimitive
|
|
9
|
+
* dialog.sig.json # BehaviorSignature
|
|
10
|
+
* 1.1.0/
|
|
11
|
+
* ...
|
|
12
|
+
* latest-resolved.json # { primitive: { version: "1.1.2", resolvedAt: "..." } }
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Get the cache directory path.
|
|
16
|
+
* @param baseDir - Optional base directory (defaults to home directory)
|
|
17
|
+
* @returns Absolute path to the cache directory
|
|
18
|
+
*/
|
|
19
|
+
export declare function getCacheDir(baseDir?: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get the versioned cache directory path.
|
|
22
|
+
* @param version - The Radix version
|
|
23
|
+
* @param baseDir - Optional base directory
|
|
24
|
+
* @returns Absolute path to the versioned cache directory
|
|
25
|
+
*/
|
|
26
|
+
export declare function getVersionedCacheDir(version: string, baseDir?: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Get the path for a cached primitive file.
|
|
29
|
+
* @param primitive - Primitive name (e.g., "Dialog")
|
|
30
|
+
* @param version - Version string
|
|
31
|
+
* @param type - Type of cache ('data' for ExtractedPrimitive, 'sig' for BehaviorSignature)
|
|
32
|
+
* @param baseDir - Optional base directory
|
|
33
|
+
* @returns Absolute file path
|
|
34
|
+
*/
|
|
35
|
+
export declare function getCachePath(primitive: string, version: string, type: 'data' | 'sig', baseDir?: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Read data from a cache file.
|
|
38
|
+
* @param cachePath - Full path to the cache file
|
|
39
|
+
* @returns Parsed JSON data or null if file doesn't exist or is invalid
|
|
40
|
+
*/
|
|
41
|
+
export declare function readFromFile<T>(cachePath: string): Promise<T | null>;
|
|
42
|
+
/**
|
|
43
|
+
* Write data to a cache file.
|
|
44
|
+
* @param cachePath - Full path to the cache file
|
|
45
|
+
* @param data - Data to write
|
|
46
|
+
*/
|
|
47
|
+
export declare function writeToFile<T>(cachePath: string, data: T): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Delete a cache file.
|
|
50
|
+
* @param cachePath - Full path to the cache file
|
|
51
|
+
* @returns True if file was deleted, false if it didn't exist
|
|
52
|
+
*/
|
|
53
|
+
export declare function deleteFile(cachePath: string): Promise<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Delete a directory and all its contents.
|
|
56
|
+
* @param dirPath - Directory path to delete
|
|
57
|
+
* @returns True if directory was deleted, false if it didn't exist
|
|
58
|
+
*/
|
|
59
|
+
export declare function deleteDir(dirPath: string): Promise<boolean>;
|
|
60
|
+
/**
|
|
61
|
+
* List all versioned cache directories.
|
|
62
|
+
* @param baseDir - Optional base directory
|
|
63
|
+
* @returns Array of version strings that have cached data
|
|
64
|
+
*/
|
|
65
|
+
export declare function listCachedVersions(baseDir?: string): Promise<string[]>;
|
|
66
|
+
/**
|
|
67
|
+
* List all cached primitives for a version.
|
|
68
|
+
* @param version - Version string
|
|
69
|
+
* @param baseDir - Optional base directory
|
|
70
|
+
* @returns Array of primitive names that have cached data
|
|
71
|
+
*/
|
|
72
|
+
export declare function listCachedPrimitives(version: string, baseDir?: string): Promise<string[]>;
|
|
73
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/cache/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GAAG,KAAK,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAOR;AAUD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAa1E;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUjE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAc5E;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based cache storage for Radix primitive data.
|
|
3
|
+
*
|
|
4
|
+
* Cache structure:
|
|
5
|
+
* ~/.limps-headless/
|
|
6
|
+
* cache/
|
|
7
|
+
* 1.0.5/
|
|
8
|
+
* dialog.json # ExtractedPrimitive
|
|
9
|
+
* dialog.sig.json # BehaviorSignature
|
|
10
|
+
* 1.1.0/
|
|
11
|
+
* ...
|
|
12
|
+
* latest-resolved.json # { primitive: { version: "1.1.2", resolvedAt: "..." } }
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'node:fs/promises';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import * as os from 'node:os';
|
|
17
|
+
/**
|
|
18
|
+
* Default cache directory name.
|
|
19
|
+
*/
|
|
20
|
+
const CACHE_DIR_NAME = '.limps-headless';
|
|
21
|
+
/**
|
|
22
|
+
* Sub-directory for versioned cache data.
|
|
23
|
+
*/
|
|
24
|
+
const CACHE_SUBDIR = 'cache';
|
|
25
|
+
/**
|
|
26
|
+
* Get the cache directory path.
|
|
27
|
+
* @param baseDir - Optional base directory (defaults to home directory)
|
|
28
|
+
* @returns Absolute path to the cache directory
|
|
29
|
+
*/
|
|
30
|
+
export function getCacheDir(baseDir) {
|
|
31
|
+
const base = baseDir || os.homedir();
|
|
32
|
+
return path.join(base, CACHE_DIR_NAME, CACHE_SUBDIR);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the versioned cache directory path.
|
|
36
|
+
* @param version - The Radix version
|
|
37
|
+
* @param baseDir - Optional base directory
|
|
38
|
+
* @returns Absolute path to the versioned cache directory
|
|
39
|
+
*/
|
|
40
|
+
export function getVersionedCacheDir(version, baseDir) {
|
|
41
|
+
return path.join(getCacheDir(baseDir), version);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the path for a cached primitive file.
|
|
45
|
+
* @param primitive - Primitive name (e.g., "Dialog")
|
|
46
|
+
* @param version - Version string
|
|
47
|
+
* @param type - Type of cache ('data' for ExtractedPrimitive, 'sig' for BehaviorSignature)
|
|
48
|
+
* @param baseDir - Optional base directory
|
|
49
|
+
* @returns Absolute file path
|
|
50
|
+
*/
|
|
51
|
+
export function getCachePath(primitive, version, type, baseDir) {
|
|
52
|
+
const dir = getVersionedCacheDir(version, baseDir);
|
|
53
|
+
const fileName = type === 'sig'
|
|
54
|
+
? `${primitive.toLowerCase()}.sig.json`
|
|
55
|
+
: `${primitive.toLowerCase()}.json`;
|
|
56
|
+
return path.join(dir, fileName);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Ensure the cache directory exists.
|
|
60
|
+
* @param dirPath - Directory path to create
|
|
61
|
+
*/
|
|
62
|
+
async function ensureDir(dirPath) {
|
|
63
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Read data from a cache file.
|
|
67
|
+
* @param cachePath - Full path to the cache file
|
|
68
|
+
* @returns Parsed JSON data or null if file doesn't exist or is invalid
|
|
69
|
+
*/
|
|
70
|
+
export async function readFromFile(cachePath) {
|
|
71
|
+
try {
|
|
72
|
+
const content = await fs.readFile(cachePath, 'utf-8');
|
|
73
|
+
return JSON.parse(content);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// File doesn't exist or parse error
|
|
77
|
+
if (error.code === 'ENOENT') {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// Log parse errors but return null
|
|
81
|
+
console.warn(`Cache read error for ${cachePath}:`, error);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Write data to a cache file.
|
|
87
|
+
* @param cachePath - Full path to the cache file
|
|
88
|
+
* @param data - Data to write
|
|
89
|
+
*/
|
|
90
|
+
export async function writeToFile(cachePath, data) {
|
|
91
|
+
const dir = path.dirname(cachePath);
|
|
92
|
+
await ensureDir(dir);
|
|
93
|
+
const content = JSON.stringify(data, null, 2);
|
|
94
|
+
await fs.writeFile(cachePath, content, 'utf-8');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Delete a cache file.
|
|
98
|
+
* @param cachePath - Full path to the cache file
|
|
99
|
+
* @returns True if file was deleted, false if it didn't exist
|
|
100
|
+
*/
|
|
101
|
+
export async function deleteFile(cachePath) {
|
|
102
|
+
try {
|
|
103
|
+
await fs.unlink(cachePath);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (error.code === 'ENOENT') {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Delete a directory and all its contents.
|
|
115
|
+
* @param dirPath - Directory path to delete
|
|
116
|
+
* @returns True if directory was deleted, false if it didn't exist
|
|
117
|
+
*/
|
|
118
|
+
export async function deleteDir(dirPath) {
|
|
119
|
+
try {
|
|
120
|
+
await fs.rm(dirPath, { recursive: true, force: true });
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error.code === 'ENOENT') {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* List all versioned cache directories.
|
|
132
|
+
* @param baseDir - Optional base directory
|
|
133
|
+
* @returns Array of version strings that have cached data
|
|
134
|
+
*/
|
|
135
|
+
export async function listCachedVersions(baseDir) {
|
|
136
|
+
const cacheDir = getCacheDir(baseDir);
|
|
137
|
+
try {
|
|
138
|
+
const entries = await fs.readdir(cacheDir, { withFileTypes: true });
|
|
139
|
+
return entries
|
|
140
|
+
.filter((entry) => entry.isDirectory())
|
|
141
|
+
.map((entry) => entry.name)
|
|
142
|
+
.filter((name) => /^\d+\.\d+\.\d+/.test(name)); // Only semver-like directories
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error.code === 'ENOENT') {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* List all cached primitives for a version.
|
|
153
|
+
* @param version - Version string
|
|
154
|
+
* @param baseDir - Optional base directory
|
|
155
|
+
* @returns Array of primitive names that have cached data
|
|
156
|
+
*/
|
|
157
|
+
export async function listCachedPrimitives(version, baseDir) {
|
|
158
|
+
const versionDir = getVersionedCacheDir(version, baseDir);
|
|
159
|
+
try {
|
|
160
|
+
const entries = await fs.readdir(versionDir);
|
|
161
|
+
return entries
|
|
162
|
+
.filter((name) => name.endsWith('.json') && !name.endsWith('.sig.json'))
|
|
163
|
+
.map((name) => {
|
|
164
|
+
// Convert filename back to primitive name (capitalize first letter)
|
|
165
|
+
const baseName = name.replace('.json', '');
|
|
166
|
+
return baseName.charAt(0).toUpperCase() + baseName.slice(1);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (error.code === 'ENOENT') {
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/cache/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTL (Time-To-Live) checking logic for cache expiration.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* TTL constants in milliseconds.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TTL: {
|
|
8
|
+
/**
|
|
9
|
+
* TTL for versioned primitive data (7 days).
|
|
10
|
+
* Versioned data is stable and can be cached longer.
|
|
11
|
+
*/
|
|
12
|
+
readonly VERSION_DATA: number;
|
|
13
|
+
/**
|
|
14
|
+
* TTL for "latest" version resolution (1 hour).
|
|
15
|
+
* Latest version can change frequently, so we check more often.
|
|
16
|
+
*/
|
|
17
|
+
readonly LATEST_RESOLUTION: number;
|
|
18
|
+
/**
|
|
19
|
+
* TTL for signature data (same as version data).
|
|
20
|
+
* Signatures derived from versioned data inherit the same TTL.
|
|
21
|
+
*/
|
|
22
|
+
readonly SIGNATURE_DATA: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Check if a timestamp has expired based on TTL.
|
|
26
|
+
* @param timestamp - ISO timestamp string
|
|
27
|
+
* @param ttlMs - Time-to-live in milliseconds
|
|
28
|
+
* @returns True if the data has expired
|
|
29
|
+
*/
|
|
30
|
+
export declare function isExpired(timestamp: string, ttlMs: number): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check if version data has expired.
|
|
33
|
+
* @param timestamp - ISO timestamp string (extractedAt)
|
|
34
|
+
* @returns True if the version data has expired
|
|
35
|
+
*/
|
|
36
|
+
export declare function isVersionDataExpired(timestamp: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Check if "latest" resolution has expired.
|
|
39
|
+
* @param timestamp - ISO timestamp string (resolvedAt)
|
|
40
|
+
* @returns True if the latest resolution has expired
|
|
41
|
+
*/
|
|
42
|
+
export declare function isLatestResolutionExpired(timestamp: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Check if signature data has expired.
|
|
45
|
+
* @param timestamp - ISO timestamp string
|
|
46
|
+
* @returns True if the signature data has expired
|
|
47
|
+
*/
|
|
48
|
+
export declare function isSignatureExpired(timestamp: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Get the remaining TTL for cached data.
|
|
51
|
+
* @param timestamp - ISO timestamp string
|
|
52
|
+
* @param ttlMs - Time-to-live in milliseconds
|
|
53
|
+
* @returns Remaining time in milliseconds (negative if expired)
|
|
54
|
+
*/
|
|
55
|
+
export declare function getRemainingTtl(timestamp: string, ttlMs: number): number;
|
|
56
|
+
/**
|
|
57
|
+
* Format remaining TTL as human-readable string.
|
|
58
|
+
* @param remainingMs - Remaining time in milliseconds
|
|
59
|
+
* @returns Human-readable string like "2 days", "3 hours", "expired"
|
|
60
|
+
*/
|
|
61
|
+
export declare function formatRemainingTtl(remainingMs: number): string;
|
|
62
|
+
//# sourceMappingURL=ttl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ttl.d.ts","sourceRoot":"","sources":["../../src/cache/ttl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,GAAG;IACd;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;CAEK,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAKnE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKxE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAoB9D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTL (Time-To-Live) checking logic for cache expiration.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* TTL constants in milliseconds.
|
|
6
|
+
*/
|
|
7
|
+
export const TTL = {
|
|
8
|
+
/**
|
|
9
|
+
* TTL for versioned primitive data (7 days).
|
|
10
|
+
* Versioned data is stable and can be cached longer.
|
|
11
|
+
*/
|
|
12
|
+
VERSION_DATA: 7 * 24 * 60 * 60 * 1000,
|
|
13
|
+
/**
|
|
14
|
+
* TTL for "latest" version resolution (1 hour).
|
|
15
|
+
* Latest version can change frequently, so we check more often.
|
|
16
|
+
*/
|
|
17
|
+
LATEST_RESOLUTION: 60 * 60 * 1000,
|
|
18
|
+
/**
|
|
19
|
+
* TTL for signature data (same as version data).
|
|
20
|
+
* Signatures derived from versioned data inherit the same TTL.
|
|
21
|
+
*/
|
|
22
|
+
SIGNATURE_DATA: 7 * 24 * 60 * 60 * 1000,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Check if a timestamp has expired based on TTL.
|
|
26
|
+
* @param timestamp - ISO timestamp string
|
|
27
|
+
* @param ttlMs - Time-to-live in milliseconds
|
|
28
|
+
* @returns True if the data has expired
|
|
29
|
+
*/
|
|
30
|
+
export function isExpired(timestamp, ttlMs) {
|
|
31
|
+
const cachedTime = new Date(timestamp).getTime();
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
const age = now - cachedTime;
|
|
34
|
+
return age >= ttlMs;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if version data has expired.
|
|
38
|
+
* @param timestamp - ISO timestamp string (extractedAt)
|
|
39
|
+
* @returns True if the version data has expired
|
|
40
|
+
*/
|
|
41
|
+
export function isVersionDataExpired(timestamp) {
|
|
42
|
+
return isExpired(timestamp, TTL.VERSION_DATA);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Check if "latest" resolution has expired.
|
|
46
|
+
* @param timestamp - ISO timestamp string (resolvedAt)
|
|
47
|
+
* @returns True if the latest resolution has expired
|
|
48
|
+
*/
|
|
49
|
+
export function isLatestResolutionExpired(timestamp) {
|
|
50
|
+
return isExpired(timestamp, TTL.LATEST_RESOLUTION);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if signature data has expired.
|
|
54
|
+
* @param timestamp - ISO timestamp string
|
|
55
|
+
* @returns True if the signature data has expired
|
|
56
|
+
*/
|
|
57
|
+
export function isSignatureExpired(timestamp) {
|
|
58
|
+
return isExpired(timestamp, TTL.SIGNATURE_DATA);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the remaining TTL for cached data.
|
|
62
|
+
* @param timestamp - ISO timestamp string
|
|
63
|
+
* @param ttlMs - Time-to-live in milliseconds
|
|
64
|
+
* @returns Remaining time in milliseconds (negative if expired)
|
|
65
|
+
*/
|
|
66
|
+
export function getRemainingTtl(timestamp, ttlMs) {
|
|
67
|
+
const cachedTime = new Date(timestamp).getTime();
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
const age = now - cachedTime;
|
|
70
|
+
return ttlMs - age;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Format remaining TTL as human-readable string.
|
|
74
|
+
* @param remainingMs - Remaining time in milliseconds
|
|
75
|
+
* @returns Human-readable string like "2 days", "3 hours", "expired"
|
|
76
|
+
*/
|
|
77
|
+
export function formatRemainingTtl(remainingMs) {
|
|
78
|
+
if (remainingMs <= 0) {
|
|
79
|
+
return 'expired';
|
|
80
|
+
}
|
|
81
|
+
const seconds = Math.floor(remainingMs / 1000);
|
|
82
|
+
const minutes = Math.floor(seconds / 60);
|
|
83
|
+
const hours = Math.floor(minutes / 60);
|
|
84
|
+
const days = Math.floor(hours / 24);
|
|
85
|
+
if (days > 0) {
|
|
86
|
+
return `${days} day${days === 1 ? '' : 's'}`;
|
|
87
|
+
}
|
|
88
|
+
if (hours > 0) {
|
|
89
|
+
return `${hours} hour${hours === 1 ? '' : 's'}`;
|
|
90
|
+
}
|
|
91
|
+
if (minutes > 0) {
|
|
92
|
+
return `${minutes} minute${minutes === 1 ? '' : 's'}`;
|
|
93
|
+
}
|
|
94
|
+
return `${seconds} second${seconds === 1 ? '' : 's'}`;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=ttl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ttl.js","sourceRoot":"","sources":["../../src/cache/ttl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB;;;OAGG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IAErC;;;OAGG;IACH,iBAAiB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAEjC;;;OAGG;IACH,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;CAC/B,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,KAAa;IACxD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC;IAC7B,OAAO,GAAG,IAAI,KAAK,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,KAAa;IAC9D,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC;IAC7B,OAAO,KAAK,GAAG,GAAG,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAEpC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B7D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command for analyzing components.
|
|
3
|
+
*/
|
|
4
|
+
import { handleAnalyzeComponent } from '../../tools/analyze-component.js';
|
|
5
|
+
function printJson(text, json) {
|
|
6
|
+
if (json) {
|
|
7
|
+
console.log(text);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const data = JSON.parse(text);
|
|
11
|
+
console.log(`${data.component} (${data.filePath})`);
|
|
12
|
+
console.log(`Action: ${data.recommendation.action}`);
|
|
13
|
+
console.log(`Confidence: ${data.recommendation.confidence}`);
|
|
14
|
+
console.log(`Reason: ${data.recommendation.reason}`);
|
|
15
|
+
if (data.isAmbiguous) {
|
|
16
|
+
console.log('Ambiguous: true');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function registerAnalyzeCommand(program) {
|
|
20
|
+
program
|
|
21
|
+
.command('analyze')
|
|
22
|
+
.description('Analyze a React component for legacy Radix matches to inform Base UI migration (run from project dir; path is relative to cwd)')
|
|
23
|
+
.argument('<file>', 'Path to a .ts/.tsx component (relative to cwd)')
|
|
24
|
+
.option('-v, --version <version>', 'Radix version to compare against', 'latest')
|
|
25
|
+
.option('-t, --threshold <number>', 'Minimum confidence threshold', '40')
|
|
26
|
+
.option('-p, --provider <provider>', 'Component library provider', 'radix')
|
|
27
|
+
.option('--ruleset <ruleset>', 'Ruleset selection: base-ui, radix-legacy, or both', 'base-ui')
|
|
28
|
+
.option('--evidence <level>', 'Evidence verbosity: summary or verbose', 'summary')
|
|
29
|
+
.option('--json', 'Output raw JSON')
|
|
30
|
+
.action(async (filePath, options) => {
|
|
31
|
+
const response = await handleAnalyzeComponent({
|
|
32
|
+
filePath,
|
|
33
|
+
radixVersion: options.version,
|
|
34
|
+
threshold: Number(options.threshold),
|
|
35
|
+
provider: options.provider,
|
|
36
|
+
ruleset: options.ruleset,
|
|
37
|
+
evidence: options.evidence,
|
|
38
|
+
});
|
|
39
|
+
const text = response.content[0]?.text ?? '{}';
|
|
40
|
+
printJson(text, Boolean(options.json));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=analyze.js.map
|