@sudosandwich/limps-radix 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.
- package/LICENSE +21 -0
- package/README.md +255 -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/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 +57 -0
- package/dist/fetcher/unpkg.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.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/extract-primitive.d.ts +49 -0
- package/dist/tools/extract-primitive.d.ts.map +1 -0
- package/dist/tools/extract-primitive.js +103 -0
- package/dist/tools/extract-primitive.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-primitives.d.ts +40 -0
- package/dist/tools/list-primitives.d.ts.map +1 -0
- package/dist/tools/list-primitives.js +53 -0
- package/dist/tools/list-primitives.js.map +1 -0
- package/dist/types/index.d.ts +83 -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/package.json +46 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based cache storage for Radix primitive data.
|
|
3
|
+
*
|
|
4
|
+
* Cache structure:
|
|
5
|
+
* ~/.limps-radix/
|
|
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-radix';
|
|
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,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic prop classifier.
|
|
3
|
+
* Classifies props into categories: state, event, config, composition.
|
|
4
|
+
*/
|
|
5
|
+
import type { PropDefinition, RawProp } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Classify a raw prop into a full PropDefinition.
|
|
8
|
+
*/
|
|
9
|
+
export declare function classifyProp(raw: RawProp): PropDefinition;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a prop name indicates state control.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isStateControl(name: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a prop name indicates an event handler.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isEventHandler(name: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a prop name indicates composition.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isComposition(name: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a prop name indicates configuration.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isConfiguration(name: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get the category of a prop.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getPropCategory(name: string): 'state' | 'event' | 'composition' | 'config' | 'other';
|
|
30
|
+
//# sourceMappingURL=classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/extractor/classifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAkGjE;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAQzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GACX,OAAO,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAMxD"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic prop classifier.
|
|
3
|
+
* Classifies props into categories: state, event, config, composition.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* State control props - control component state
|
|
7
|
+
*/
|
|
8
|
+
const STATE_PROPS = new Set([
|
|
9
|
+
'open',
|
|
10
|
+
'defaultOpen',
|
|
11
|
+
'value',
|
|
12
|
+
'defaultValue',
|
|
13
|
+
'checked',
|
|
14
|
+
'defaultChecked',
|
|
15
|
+
'pressed',
|
|
16
|
+
'defaultPressed',
|
|
17
|
+
'selected',
|
|
18
|
+
'defaultSelected',
|
|
19
|
+
'active',
|
|
20
|
+
'expanded',
|
|
21
|
+
'disabled',
|
|
22
|
+
]);
|
|
23
|
+
/**
|
|
24
|
+
* State prop patterns
|
|
25
|
+
*/
|
|
26
|
+
const STATE_PATTERNS = [/^default[A-Z]/, /^is[A-Z]/];
|
|
27
|
+
/**
|
|
28
|
+
* Event handler pattern - onXxx
|
|
29
|
+
*/
|
|
30
|
+
const EVENT_PATTERN = /^on[A-Z]/;
|
|
31
|
+
/**
|
|
32
|
+
* Composition props - affect component composition
|
|
33
|
+
*/
|
|
34
|
+
const COMPOSITION_PROPS = new Set([
|
|
35
|
+
'asChild',
|
|
36
|
+
'children',
|
|
37
|
+
'as',
|
|
38
|
+
'render',
|
|
39
|
+
'slot',
|
|
40
|
+
]);
|
|
41
|
+
/**
|
|
42
|
+
* Configuration props - affect behavior/appearance
|
|
43
|
+
*/
|
|
44
|
+
const CONFIG_PROPS = new Set([
|
|
45
|
+
// Layout/positioning
|
|
46
|
+
'modal',
|
|
47
|
+
'side',
|
|
48
|
+
'sideOffset',
|
|
49
|
+
'align',
|
|
50
|
+
'alignOffset',
|
|
51
|
+
'orientation',
|
|
52
|
+
'dir',
|
|
53
|
+
'loop',
|
|
54
|
+
'sticky',
|
|
55
|
+
'hideWhenDetached',
|
|
56
|
+
'avoidCollisions',
|
|
57
|
+
'collisionBoundary',
|
|
58
|
+
'collisionPadding',
|
|
59
|
+
// Behavior
|
|
60
|
+
'closeOnEscape',
|
|
61
|
+
'closeOnOutsideClick',
|
|
62
|
+
'closeOnInteractOutside',
|
|
63
|
+
'trapFocus',
|
|
64
|
+
'restoreFocus',
|
|
65
|
+
'preventScroll',
|
|
66
|
+
'disableOutsidePointerEvents',
|
|
67
|
+
'forceMount',
|
|
68
|
+
'delayDuration',
|
|
69
|
+
'skipDelayDuration',
|
|
70
|
+
'disableHoverableContent',
|
|
71
|
+
// Accessibility
|
|
72
|
+
'ariaLabel',
|
|
73
|
+
'aria-label',
|
|
74
|
+
'ariaLabelledby',
|
|
75
|
+
'aria-labelledby',
|
|
76
|
+
'ariaDescribedby',
|
|
77
|
+
'aria-describedby',
|
|
78
|
+
// Styling
|
|
79
|
+
'className',
|
|
80
|
+
'style',
|
|
81
|
+
// Other common configs
|
|
82
|
+
'id',
|
|
83
|
+
'name',
|
|
84
|
+
'required',
|
|
85
|
+
'placeholder',
|
|
86
|
+
'min',
|
|
87
|
+
'max',
|
|
88
|
+
'step',
|
|
89
|
+
'type',
|
|
90
|
+
'form',
|
|
91
|
+
]);
|
|
92
|
+
/**
|
|
93
|
+
* Classify a raw prop into a full PropDefinition.
|
|
94
|
+
*/
|
|
95
|
+
export function classifyProp(raw) {
|
|
96
|
+
return {
|
|
97
|
+
...raw,
|
|
98
|
+
isStateControl: isStateControl(raw.name),
|
|
99
|
+
isEventHandler: isEventHandler(raw.name),
|
|
100
|
+
isConfiguration: isConfiguration(raw.name),
|
|
101
|
+
isComposition: isComposition(raw.name),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if a prop name indicates state control.
|
|
106
|
+
*/
|
|
107
|
+
export function isStateControl(name) {
|
|
108
|
+
if (STATE_PROPS.has(name)) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
for (const pattern of STATE_PATTERNS) {
|
|
112
|
+
if (pattern.test(name)) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Check if a prop name indicates an event handler.
|
|
120
|
+
*/
|
|
121
|
+
export function isEventHandler(name) {
|
|
122
|
+
return EVENT_PATTERN.test(name);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if a prop name indicates composition.
|
|
126
|
+
*/
|
|
127
|
+
export function isComposition(name) {
|
|
128
|
+
return COMPOSITION_PROPS.has(name);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if a prop name indicates configuration.
|
|
132
|
+
*/
|
|
133
|
+
export function isConfiguration(name) {
|
|
134
|
+
return CONFIG_PROPS.has(name);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get the category of a prop.
|
|
138
|
+
*/
|
|
139
|
+
export function getPropCategory(name) {
|
|
140
|
+
if (isStateControl(name))
|
|
141
|
+
return 'state';
|
|
142
|
+
if (isEventHandler(name))
|
|
143
|
+
return 'event';
|
|
144
|
+
if (isComposition(name))
|
|
145
|
+
return 'composition';
|
|
146
|
+
if (isConfiguration(name))
|
|
147
|
+
return 'config';
|
|
148
|
+
return 'other';
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/extractor/classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ForwardRefExoticComponent extraction for complex .d.ts files.
|
|
3
|
+
* Handles patterns like: React.ForwardRefExoticComponent<Props & React.RefAttributes<Element>>
|
|
4
|
+
*/
|
|
5
|
+
import type { SourceFile, VariableDeclaration } from 'ts-morph';
|
|
6
|
+
import type { RawProp } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Result of finding a ForwardRef declaration.
|
|
9
|
+
*/
|
|
10
|
+
export interface ForwardRefDeclaration {
|
|
11
|
+
name: string;
|
|
12
|
+
declaration: VariableDeclaration;
|
|
13
|
+
propsTypeName: string | null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Find all ForwardRefExoticComponent variable declarations in a source file.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findForwardRefDeclarations(sourceFile: SourceFile): ForwardRefDeclaration[];
|
|
19
|
+
/**
|
|
20
|
+
* Extract props from a ForwardRef declaration by resolving its type parameter.
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractPropsFromForwardRef(sourceFile: SourceFile, decl: ForwardRefDeclaration): RawProp[] | null;
|
|
23
|
+
/**
|
|
24
|
+
* Get the sub-component suffix from a component name.
|
|
25
|
+
* @example "DialogContent" with primitive "Dialog" -> "Content"
|
|
26
|
+
*/
|
|
27
|
+
export declare function getSubComponentSuffix(componentName: string, primitiveName: string): string | null;
|
|
28
|
+
//# sourceMappingURL=forward-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forward-ref.d.ts","sourceRoot":"","sources":["../../src/extractor/forward-ref.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EAEpB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,GACrB,qBAAqB,EAAE,CAuBzB;AAqBD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,EAAE,GAAG,IAAI,CAkBlB;AAuED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CAUf"}
|