@buoy-design/scanners 0.1.6 → 0.1.7
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/dist/base/index.d.ts +1 -0
- package/dist/base/index.d.ts.map +1 -1
- package/dist/base/index.js +1 -0
- package/dist/base/index.js.map +1 -1
- package/dist/base/signal-aware-scanner.d.ts +44 -0
- package/dist/base/signal-aware-scanner.d.ts.map +1 -0
- package/dist/base/signal-aware-scanner.js +64 -0
- package/dist/base/signal-aware-scanner.js.map +1 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +1 -0
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/with-cache.d.ts +82 -0
- package/dist/cache/with-cache.d.ts.map +1 -0
- package/dist/cache/with-cache.js +97 -0
- package/dist/cache/with-cache.js.map +1 -0
- package/dist/extractors/index.d.ts.map +1 -1
- package/dist/extractors/index.js +43 -3
- package/dist/extractors/index.js.map +1 -1
- package/dist/git/angular-scanner.d.ts +2 -25
- package/dist/git/angular-scanner.d.ts.map +1 -1
- package/dist/git/angular-scanner.js +8 -75
- package/dist/git/angular-scanner.js.map +1 -1
- package/dist/git/react-scanner.d.ts +2 -20
- package/dist/git/react-scanner.d.ts.map +1 -1
- package/dist/git/react-scanner.js +4 -39
- package/dist/git/react-scanner.js.map +1 -1
- package/dist/git/svelte-scanner.d.ts +2 -25
- package/dist/git/svelte-scanner.d.ts.map +1 -1
- package/dist/git/svelte-scanner.js +8 -75
- package/dist/git/svelte-scanner.js.map +1 -1
- package/dist/git/template-scanner.d.ts +2 -20
- package/dist/git/template-scanner.d.ts.map +1 -1
- package/dist/git/template-scanner.js +5 -40
- package/dist/git/template-scanner.js.map +1 -1
- package/dist/git/vue-scanner.d.ts +2 -25
- package/dist/git/vue-scanner.d.ts.map +1 -1
- package/dist/git/vue-scanner.js +8 -75
- package/dist/git/vue-scanner.js.map +1 -1
- package/dist/git/webcomponent-scanner.d.ts +2 -20
- package/dist/git/webcomponent-scanner.d.ts.map +1 -1
- package/dist/git/webcomponent-scanner.js +4 -39
- package/dist/git/webcomponent-scanner.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/patterns/hardcoded-values.d.ts +76 -0
- package/dist/patterns/hardcoded-values.d.ts.map +1 -0
- package/dist/patterns/hardcoded-values.js +225 -0
- package/dist/patterns/hardcoded-values.js.map +1 -0
- package/dist/patterns/index.d.ts +2 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +2 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/signals/types.d.ts +32 -32
- package/package.json +2 -2
package/dist/base/index.d.ts
CHANGED
package/dist/base/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC"}
|
package/dist/base/index.js
CHANGED
package/dist/base/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Scanner, ScannerConfig } from "./scanner.js";
|
|
2
|
+
import { type SignalAggregator, type RawSignal } from "../signals/index.js";
|
|
3
|
+
import type { CollectorStats, SignalEnrichedScanResult } from "../signals/scanner-integration.js";
|
|
4
|
+
import type { SignalEmitter } from "../signals/emitter.js";
|
|
5
|
+
/**
|
|
6
|
+
* Base scanner class with built-in signal collection support.
|
|
7
|
+
* Extends the base Scanner with methods for collecting and aggregating
|
|
8
|
+
* signals during scanning operations.
|
|
9
|
+
*
|
|
10
|
+
* Scanners that need signal collection should extend this class instead
|
|
11
|
+
* of the base Scanner class.
|
|
12
|
+
*/
|
|
13
|
+
export declare abstract class SignalAwareScanner<T, C extends ScannerConfig = ScannerConfig> extends Scanner<T, C> {
|
|
14
|
+
/** Aggregator for collecting signals across all scanned files */
|
|
15
|
+
protected signalAggregator: SignalAggregator;
|
|
16
|
+
/**
|
|
17
|
+
* Clear signals before starting a new scan.
|
|
18
|
+
* Call this at the start of scan() to reset state.
|
|
19
|
+
*/
|
|
20
|
+
protected clearSignals(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Add signals from a file's emitter to the aggregator.
|
|
23
|
+
* Call this at the end of parseFile() to collect the file's signals.
|
|
24
|
+
*
|
|
25
|
+
* @param filePath The relative file path (used as key)
|
|
26
|
+
* @param emitter The signal emitter from the file's collector
|
|
27
|
+
*/
|
|
28
|
+
protected addSignals(filePath: string, emitter: SignalEmitter): void;
|
|
29
|
+
/**
|
|
30
|
+
* Scan and return signals along with items.
|
|
31
|
+
* This is the signal-enriched version of scan().
|
|
32
|
+
*/
|
|
33
|
+
scanWithSignals(): Promise<SignalEnrichedScanResult<T>>;
|
|
34
|
+
/**
|
|
35
|
+
* Get signals collected during the last scan.
|
|
36
|
+
* Call after scan() to retrieve signals.
|
|
37
|
+
*/
|
|
38
|
+
getCollectedSignals(): RawSignal[];
|
|
39
|
+
/**
|
|
40
|
+
* Get signal statistics from the last scan.
|
|
41
|
+
*/
|
|
42
|
+
getSignalStats(): CollectorStats;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=signal-aware-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-aware-scanner.d.ts","sourceRoot":"","sources":["../../src/base/signal-aware-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;;GAOG;AACH,8BAAsB,kBAAkB,CACtC,CAAC,EACD,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACrB,iEAAiE;IACjE,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAA4B;IAExE;;;OAGG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B;;;;;;OAMG;IACH,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAIpE;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;IAY7D;;;OAGG;IACH,mBAAmB,IAAI,SAAS,EAAE;IAIlC;;OAEG;IACH,cAAc,IAAI,cAAc;CAOjC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Scanner } from "./scanner.js";
|
|
2
|
+
import { createSignalAggregator, } from "../signals/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Base scanner class with built-in signal collection support.
|
|
5
|
+
* Extends the base Scanner with methods for collecting and aggregating
|
|
6
|
+
* signals during scanning operations.
|
|
7
|
+
*
|
|
8
|
+
* Scanners that need signal collection should extend this class instead
|
|
9
|
+
* of the base Scanner class.
|
|
10
|
+
*/
|
|
11
|
+
export class SignalAwareScanner extends Scanner {
|
|
12
|
+
/** Aggregator for collecting signals across all scanned files */
|
|
13
|
+
signalAggregator = createSignalAggregator();
|
|
14
|
+
/**
|
|
15
|
+
* Clear signals before starting a new scan.
|
|
16
|
+
* Call this at the start of scan() to reset state.
|
|
17
|
+
*/
|
|
18
|
+
clearSignals() {
|
|
19
|
+
this.signalAggregator.clear();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Add signals from a file's emitter to the aggregator.
|
|
23
|
+
* Call this at the end of parseFile() to collect the file's signals.
|
|
24
|
+
*
|
|
25
|
+
* @param filePath The relative file path (used as key)
|
|
26
|
+
* @param emitter The signal emitter from the file's collector
|
|
27
|
+
*/
|
|
28
|
+
addSignals(filePath, emitter) {
|
|
29
|
+
this.signalAggregator.addEmitter(filePath, emitter);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Scan and return signals along with items.
|
|
33
|
+
* This is the signal-enriched version of scan().
|
|
34
|
+
*/
|
|
35
|
+
async scanWithSignals() {
|
|
36
|
+
const result = await this.scan();
|
|
37
|
+
return {
|
|
38
|
+
...result,
|
|
39
|
+
signals: this.signalAggregator.getAllSignals(),
|
|
40
|
+
signalStats: {
|
|
41
|
+
total: this.signalAggregator.getStats().total,
|
|
42
|
+
byType: this.signalAggregator.getStats().byType,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get signals collected during the last scan.
|
|
48
|
+
* Call after scan() to retrieve signals.
|
|
49
|
+
*/
|
|
50
|
+
getCollectedSignals() {
|
|
51
|
+
return this.signalAggregator.getAllSignals();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get signal statistics from the last scan.
|
|
55
|
+
*/
|
|
56
|
+
getSignalStats() {
|
|
57
|
+
const stats = this.signalAggregator.getStats();
|
|
58
|
+
return {
|
|
59
|
+
total: stats.total,
|
|
60
|
+
byType: stats.byType,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=signal-aware-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-aware-scanner.js","sourceRoot":"","sources":["../../src/base/signal-aware-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiB,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,sBAAsB,GAGvB,MAAM,qBAAqB,CAAC;AAI7B;;;;;;;GAOG;AACH,MAAM,OAAgB,kBAGpB,SAAQ,OAAa;IACrB,iEAAiE;IACvD,gBAAgB,GAAqB,sBAAsB,EAAE,CAAC;IAExE;;;OAGG;IACO,YAAY;QACpB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACO,UAAU,CAAC,QAAgB,EAAE,OAAsB;QAC3D,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO;YACL,GAAG,MAAM;YACT,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE;YAC9C,WAAW,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,KAAK;gBAC7C,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,MAAM;aAChD;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAC/C,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;CACF"}
|
package/dist/cache/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { ScanCache } from "./scan-cache.js";
|
|
2
|
+
export { withCache, withOptionalCache } from "./with-cache.js";
|
|
3
|
+
export type { WithCacheOptions, WithCacheResult } from "./with-cache.js";
|
|
2
4
|
export * from "./types.js";
|
|
3
5
|
export * from "./git-utils.js";
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACzE,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
package/dist/cache/index.js
CHANGED
package/dist/cache/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAII-style cache wrapper for guaranteed resource cleanup.
|
|
3
|
+
*
|
|
4
|
+
* Ensures cache is properly loaded before use and saved after use,
|
|
5
|
+
* even when errors occur during the callback execution.
|
|
6
|
+
*/
|
|
7
|
+
import { ScanCache } from "./scan-cache.js";
|
|
8
|
+
/**
|
|
9
|
+
* Options for the withCache wrapper
|
|
10
|
+
*/
|
|
11
|
+
export interface WithCacheOptions {
|
|
12
|
+
/** Clear cache before use */
|
|
13
|
+
clearCache?: boolean;
|
|
14
|
+
/** Save cache even if callback throws (default: false) */
|
|
15
|
+
saveOnError?: boolean;
|
|
16
|
+
/** Callback for verbose logging */
|
|
17
|
+
onVerbose?: (message: string) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Result from withCache including cache statistics
|
|
21
|
+
*/
|
|
22
|
+
export interface WithCacheResult<T> {
|
|
23
|
+
/** The result from the callback */
|
|
24
|
+
result: T;
|
|
25
|
+
/** Cache statistics after operation */
|
|
26
|
+
stats: {
|
|
27
|
+
entryCount: number;
|
|
28
|
+
totalSize: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Execute a callback with a properly managed cache instance.
|
|
33
|
+
*
|
|
34
|
+
* This wrapper ensures:
|
|
35
|
+
* - Cache is loaded before the callback executes
|
|
36
|
+
* - Cache is saved after successful completion
|
|
37
|
+
* - Cache state is consistent even if errors occur
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Simple usage
|
|
42
|
+
* const { result } = await withCache(projectRoot, async (cache) => {
|
|
43
|
+
* const orchestrator = new ScanOrchestrator(config, projectRoot, { cache });
|
|
44
|
+
* return orchestrator.scan(['react']);
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* // With options
|
|
48
|
+
* const { result, stats } = await withCache(
|
|
49
|
+
* projectRoot,
|
|
50
|
+
* async (cache) => doScanning(cache),
|
|
51
|
+
* { clearCache: true, onVerbose: console.log }
|
|
52
|
+
* );
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function withCache<T>(projectRoot: string, callback: (cache: ScanCache) => Promise<T>, options?: WithCacheOptions): Promise<WithCacheResult<T>>;
|
|
56
|
+
/**
|
|
57
|
+
* Execute a callback with an optional cache instance.
|
|
58
|
+
*
|
|
59
|
+
* If caching is disabled (enabled=false), the callback receives undefined
|
|
60
|
+
* and no cache operations are performed.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const result = await withOptionalCache(
|
|
65
|
+
* projectRoot,
|
|
66
|
+
* options.cache !== false, // enabled based on CLI flag
|
|
67
|
+
* async (cache) => {
|
|
68
|
+
* const orchestrator = new ScanOrchestrator(config, projectRoot, { cache });
|
|
69
|
+
* return orchestrator.scan(['react']);
|
|
70
|
+
* },
|
|
71
|
+
* { clearCache: options.clearCache }
|
|
72
|
+
* );
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function withOptionalCache<T>(projectRoot: string, enabled: boolean, callback: (cache: ScanCache | undefined) => Promise<T>, options?: WithCacheOptions): Promise<{
|
|
76
|
+
result: T;
|
|
77
|
+
stats?: {
|
|
78
|
+
entryCount: number;
|
|
79
|
+
totalSize: number;
|
|
80
|
+
};
|
|
81
|
+
}>;
|
|
82
|
+
//# sourceMappingURL=with-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-cache.d.ts","sourceRoot":"","sources":["../../src/cache/with-cache.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mCAAmC;IACnC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,mCAAmC;IACnC,MAAM,EAAE,CAAC,CAAC;IACV,uCAAuC;IACvC,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CA4C7B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,EACtD,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAO3E"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// packages/scanners/src/cache/with-cache.ts
|
|
2
|
+
/**
|
|
3
|
+
* RAII-style cache wrapper for guaranteed resource cleanup.
|
|
4
|
+
*
|
|
5
|
+
* Ensures cache is properly loaded before use and saved after use,
|
|
6
|
+
* even when errors occur during the callback execution.
|
|
7
|
+
*/
|
|
8
|
+
import { ScanCache } from "./scan-cache.js";
|
|
9
|
+
/**
|
|
10
|
+
* Execute a callback with a properly managed cache instance.
|
|
11
|
+
*
|
|
12
|
+
* This wrapper ensures:
|
|
13
|
+
* - Cache is loaded before the callback executes
|
|
14
|
+
* - Cache is saved after successful completion
|
|
15
|
+
* - Cache state is consistent even if errors occur
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Simple usage
|
|
20
|
+
* const { result } = await withCache(projectRoot, async (cache) => {
|
|
21
|
+
* const orchestrator = new ScanOrchestrator(config, projectRoot, { cache });
|
|
22
|
+
* return orchestrator.scan(['react']);
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // With options
|
|
26
|
+
* const { result, stats } = await withCache(
|
|
27
|
+
* projectRoot,
|
|
28
|
+
* async (cache) => doScanning(cache),
|
|
29
|
+
* { clearCache: true, onVerbose: console.log }
|
|
30
|
+
* );
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export async function withCache(projectRoot, callback, options = {}) {
|
|
34
|
+
const { clearCache = false, saveOnError = false, onVerbose } = options;
|
|
35
|
+
const cache = new ScanCache(projectRoot);
|
|
36
|
+
// Load existing cache data
|
|
37
|
+
await cache.load();
|
|
38
|
+
// Clear if requested
|
|
39
|
+
if (clearCache) {
|
|
40
|
+
cache.clear();
|
|
41
|
+
onVerbose?.("Cache cleared");
|
|
42
|
+
}
|
|
43
|
+
let result;
|
|
44
|
+
let error;
|
|
45
|
+
try {
|
|
46
|
+
result = await callback(cache);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
error = e instanceof Error ? e : new Error(String(e));
|
|
50
|
+
if (saveOnError) {
|
|
51
|
+
// Save partial progress even on error
|
|
52
|
+
try {
|
|
53
|
+
await cache.save();
|
|
54
|
+
onVerbose?.("Cache saved (partial progress after error)");
|
|
55
|
+
}
|
|
56
|
+
catch (saveError) {
|
|
57
|
+
// Log but don't mask the original error
|
|
58
|
+
onVerbose?.(`Failed to save cache after error: ${saveError}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
// Save cache on success
|
|
64
|
+
await cache.save();
|
|
65
|
+
onVerbose?.("Cache saved");
|
|
66
|
+
return {
|
|
67
|
+
result,
|
|
68
|
+
stats: cache.getStats(),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Execute a callback with an optional cache instance.
|
|
73
|
+
*
|
|
74
|
+
* If caching is disabled (enabled=false), the callback receives undefined
|
|
75
|
+
* and no cache operations are performed.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* const result = await withOptionalCache(
|
|
80
|
+
* projectRoot,
|
|
81
|
+
* options.cache !== false, // enabled based on CLI flag
|
|
82
|
+
* async (cache) => {
|
|
83
|
+
* const orchestrator = new ScanOrchestrator(config, projectRoot, { cache });
|
|
84
|
+
* return orchestrator.scan(['react']);
|
|
85
|
+
* },
|
|
86
|
+
* { clearCache: options.clearCache }
|
|
87
|
+
* );
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export async function withOptionalCache(projectRoot, enabled, callback, options = {}) {
|
|
91
|
+
if (!enabled) {
|
|
92
|
+
const result = await callback(undefined);
|
|
93
|
+
return { result };
|
|
94
|
+
}
|
|
95
|
+
return withCache(projectRoot, callback, options);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=with-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-cache.js","sourceRoot":"","sources":["../../src/cache/with-cache.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA2B5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,WAAmB,EACnB,QAA0C,EAC1C,UAA4B,EAAE;IAE9B,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEvE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC;IAEzC,2BAA2B;IAC3B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAEnB,qBAAqB;IACrB,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,SAAS,EAAE,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,MAAS,CAAC;IACd,IAAI,KAAwB,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtD,IAAI,WAAW,EAAE,CAAC;YAChB,sCAAsC;YACtC,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,SAAS,EAAE,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,wCAAwC;gBACxC,SAAS,EAAE,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;IAED,wBAAwB;IACxB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;IAE3B,OAAO;QACL,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;KACxB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,OAAgB,EAChB,QAAsD,EACtD,UAA4B,EAAE;IAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,SAAS,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAkDxE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,YAAY,GAEpB,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,GAChF,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAC7E,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAE5E,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAC7E,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAEtC,KAAK,GAAG,QAAQ,GAEhB,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAE1C,UAAU,GAAG,KAAK,GAAG,UAAU,GAE/B,KAAK,GAEL,eAAe,GAAG,eAAe,GAEjC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CA2BxE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,UAAU,EAAE,CAqCvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAOlE;AAGD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC5I,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,4BAA4B,EAC5B,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,4BAA4B,EAC5B,2BAA2B,EAC3B,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC"}
|
package/dist/extractors/index.js
CHANGED
|
@@ -5,6 +5,45 @@
|
|
|
5
5
|
import { extractAllHtmlStyles } from './html-style.js';
|
|
6
6
|
import { extractJsxStyleObjects } from './jsx-style.js';
|
|
7
7
|
import { extractDirectiveStyles, extractAngularStyleBindings, extractVueStyleBindings } from './directive-style.js';
|
|
8
|
+
/**
|
|
9
|
+
* Extract Svelte style directives (style:prop={value} and style:prop="value")
|
|
10
|
+
* Examples:
|
|
11
|
+
* <div style:color="red">
|
|
12
|
+
* <div style:padding={padding}>
|
|
13
|
+
* <div style:background-color="#fff">
|
|
14
|
+
*/
|
|
15
|
+
function extractSvelteStyleDirectives(content) {
|
|
16
|
+
const matches = [];
|
|
17
|
+
// Match style:property="value" or style:property={value}
|
|
18
|
+
// Handles kebab-case properties like style:background-color
|
|
19
|
+
const styleDirectiveRegex = /style:([a-z-]+)=(?:{([^}]+)}|"([^"]+)"|'([^']+)')/g;
|
|
20
|
+
let match;
|
|
21
|
+
while ((match = styleDirectiveRegex.exec(content)) !== null) {
|
|
22
|
+
const property = match[1];
|
|
23
|
+
// Value can be in curly braces {value}, double quotes "value", or single quotes 'value'
|
|
24
|
+
const value = match[2] || match[3] || match[4];
|
|
25
|
+
if (!property || !value)
|
|
26
|
+
continue;
|
|
27
|
+
// Skip dynamic expressions in curly braces that are likely variables
|
|
28
|
+
if (match[2] && /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value.trim())) {
|
|
29
|
+
// This is a variable reference, skip it
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
// Calculate line and column
|
|
33
|
+
const beforeMatch = content.slice(0, match.index);
|
|
34
|
+
const lines = beforeMatch.split('\n');
|
|
35
|
+
const line = lines.length;
|
|
36
|
+
const lastLine = lines[lines.length - 1] || '';
|
|
37
|
+
const column = lastLine.length + 1;
|
|
38
|
+
matches.push({
|
|
39
|
+
css: `${property}: ${value.trim()}`,
|
|
40
|
+
line,
|
|
41
|
+
column,
|
|
42
|
+
context: 'inline',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return matches;
|
|
46
|
+
}
|
|
8
47
|
/**
|
|
9
48
|
* Determine the syntax family for a template type
|
|
10
49
|
*/
|
|
@@ -59,9 +98,10 @@ export function extractStyles(content, templateType) {
|
|
|
59
98
|
];
|
|
60
99
|
case 'svelte':
|
|
61
100
|
// Svelte has style:prop and plain style
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
101
|
+
return [
|
|
102
|
+
...extractSvelteStyleDirectives(content),
|
|
103
|
+
...extractAllHtmlStyles(content),
|
|
104
|
+
];
|
|
65
105
|
case 'html-like':
|
|
66
106
|
default:
|
|
67
107
|
return extractAllHtmlStyles(content);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAmB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SignalAwareScanner, ScanResult, ScannerConfig } from "../base/index.js";
|
|
2
2
|
import type { Component } from "@buoy-design/core";
|
|
3
|
-
import { type SignalEnrichedScanResult, type CollectorStats } from "../signals/scanner-integration.js";
|
|
4
|
-
import { type RawSignal } from "../signals/index.js";
|
|
5
3
|
export interface AngularScannerConfig extends ScannerConfig {
|
|
6
4
|
designSystemPackage?: string;
|
|
7
5
|
}
|
|
8
|
-
export declare class AngularComponentScanner extends
|
|
6
|
+
export declare class AngularComponentScanner extends SignalAwareScanner<Component, AngularScannerConfig> {
|
|
9
7
|
/**
|
|
10
8
|
* Default file patterns for Angular components.
|
|
11
9
|
* Includes both standard *.component.ts and any *.ts files to catch
|
|
12
10
|
* Angular Material-style naming (e.g., button.ts, tab.ts)
|
|
13
11
|
*/
|
|
14
12
|
private static readonly DEFAULT_PATTERNS;
|
|
15
|
-
/** Aggregator for collecting signals across all scanned files */
|
|
16
|
-
private signalAggregator;
|
|
17
13
|
scan(): Promise<ScanResult<Component>>;
|
|
18
|
-
/**
|
|
19
|
-
* Scan and return signals along with components.
|
|
20
|
-
* This is the signal-enriched version of scan().
|
|
21
|
-
*/
|
|
22
|
-
scanWithSignals(): Promise<SignalEnrichedScanResult<Component>>;
|
|
23
|
-
/**
|
|
24
|
-
* Get signals collected during the last scan.
|
|
25
|
-
* Call after scan() to retrieve signals.
|
|
26
|
-
*/
|
|
27
|
-
getCollectedSignals(): RawSignal[];
|
|
28
|
-
/**
|
|
29
|
-
* Get signal statistics from the last scan.
|
|
30
|
-
*/
|
|
31
|
-
getSignalStats(): CollectorStats;
|
|
32
14
|
getSourceType(): string;
|
|
33
15
|
private parseFile;
|
|
34
16
|
/**
|
|
@@ -102,10 +84,5 @@ export declare class AngularComponentScanner extends Scanner<Component, AngularS
|
|
|
102
84
|
* - [ngStyle]="{ 'background-color': '#FF0000' }"
|
|
103
85
|
*/
|
|
104
86
|
private extractHardcodedValuesFromTemplate;
|
|
105
|
-
/**
|
|
106
|
-
* Determine if a CSS value is hardcoded and what type it is.
|
|
107
|
-
* Returns null if the value is a design token or variable.
|
|
108
|
-
*/
|
|
109
|
-
private getHardcodedValueType;
|
|
110
87
|
}
|
|
111
88
|
//# sourceMappingURL=angular-scanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-scanner.d.ts","sourceRoot":"","sources":["../../src/git/angular-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"angular-scanner.d.ts","sourceRoot":"","sources":["../../src/git/angular-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAkC,MAAM,mBAAmB,CAAC;AAgBnF,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAYD,qBAAa,uBAAwB,SAAQ,kBAAkB,CAC7D,SAAS,EACT,oBAAoB,CACrB;IACC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAe;IAEjD,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAkB5C,aAAa,IAAI,MAAM;YAIT,SAAS;IAiDvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,gBAAgB;IAoFxB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAyEtC;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAsFvC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8C7B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA2DpC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,aAAa;IAgPrB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAsCjC;;;OAGG;IACH,OAAO,CAAC,+BAA+B;IA4BvC,OAAO,CAAC,cAAc;IAqEtB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAkBnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+D3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2D5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,sBAAsB;IAK9B;;;;;;OAMG;IACH,OAAO,CAAC,kCAAkC;CAyH3C"}
|
|
@@ -1,60 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SignalAwareScanner } from "../base/index.js";
|
|
2
2
|
import { createComponentId } from "@buoy-design/core";
|
|
3
3
|
import * as ts from "typescript";
|
|
4
4
|
import { readFileSync } from "fs";
|
|
5
5
|
import { relative } from "path";
|
|
6
6
|
import { createScannerSignalCollector, } from "../signals/scanner-integration.js";
|
|
7
|
-
import {
|
|
8
|
-
export class AngularComponentScanner extends
|
|
7
|
+
import { getHardcodedValueType } from "../patterns/index.js";
|
|
8
|
+
export class AngularComponentScanner extends SignalAwareScanner {
|
|
9
9
|
/**
|
|
10
10
|
* Default file patterns for Angular components.
|
|
11
11
|
* Includes both standard *.component.ts and any *.ts files to catch
|
|
12
12
|
* Angular Material-style naming (e.g., button.ts, tab.ts)
|
|
13
13
|
*/
|
|
14
14
|
static DEFAULT_PATTERNS = ["**/*.ts"];
|
|
15
|
-
/** Aggregator for collecting signals across all scanned files */
|
|
16
|
-
signalAggregator = createSignalAggregator();
|
|
17
15
|
async scan() {
|
|
18
16
|
// Clear signals from previous scan
|
|
19
|
-
this.
|
|
17
|
+
this.clearSignals();
|
|
20
18
|
// Use cache if available
|
|
21
19
|
if (this.config.cache) {
|
|
22
20
|
return this.runScanWithCache((file) => this.parseFile(file), AngularComponentScanner.DEFAULT_PATTERNS);
|
|
23
21
|
}
|
|
24
22
|
return this.runScan((file) => this.parseFile(file), AngularComponentScanner.DEFAULT_PATTERNS);
|
|
25
23
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Scan and return signals along with components.
|
|
28
|
-
* This is the signal-enriched version of scan().
|
|
29
|
-
*/
|
|
30
|
-
async scanWithSignals() {
|
|
31
|
-
const result = await this.scan();
|
|
32
|
-
return {
|
|
33
|
-
...result,
|
|
34
|
-
signals: this.signalAggregator.getAllSignals(),
|
|
35
|
-
signalStats: {
|
|
36
|
-
total: this.signalAggregator.getStats().total,
|
|
37
|
-
byType: this.signalAggregator.getStats().byType,
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Get signals collected during the last scan.
|
|
43
|
-
* Call after scan() to retrieve signals.
|
|
44
|
-
*/
|
|
45
|
-
getCollectedSignals() {
|
|
46
|
-
return this.signalAggregator.getAllSignals();
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Get signal statistics from the last scan.
|
|
50
|
-
*/
|
|
51
|
-
getSignalStats() {
|
|
52
|
-
const stats = this.signalAggregator.getStats();
|
|
53
|
-
return {
|
|
54
|
-
total: stats.total,
|
|
55
|
-
byType: stats.byType,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
24
|
getSourceType() {
|
|
59
25
|
return "angular";
|
|
60
26
|
}
|
|
@@ -80,7 +46,7 @@ export class AngularComponentScanner extends Scanner {
|
|
|
80
46
|
};
|
|
81
47
|
ts.forEachChild(sourceFile, visit);
|
|
82
48
|
// Add this file's signals to the aggregator
|
|
83
|
-
this.
|
|
49
|
+
this.addSignals(relativePath, signalCollector.getEmitter());
|
|
84
50
|
return components;
|
|
85
51
|
}
|
|
86
52
|
catch (error) {
|
|
@@ -962,7 +928,7 @@ export class AngularComponentScanner extends Scanner {
|
|
|
962
928
|
const [, property, value] = propMatch;
|
|
963
929
|
if (property && value) {
|
|
964
930
|
const trimmedValue = value.trim();
|
|
965
|
-
const hardcodedType =
|
|
931
|
+
const hardcodedType = getHardcodedValueType(property, trimmedValue);
|
|
966
932
|
if (hardcodedType) {
|
|
967
933
|
hardcoded.push({
|
|
968
934
|
type: hardcodedType,
|
|
@@ -988,7 +954,7 @@ export class AngularComponentScanner extends Scanner {
|
|
|
988
954
|
while ((propMatch = propRegex.exec(bindingContent)) !== null) {
|
|
989
955
|
const [, property, value] = propMatch;
|
|
990
956
|
if (property && value) {
|
|
991
|
-
const hardcodedType =
|
|
957
|
+
const hardcodedType = getHardcodedValueType(property, value);
|
|
992
958
|
if (hardcodedType) {
|
|
993
959
|
hardcoded.push({
|
|
994
960
|
type: hardcodedType,
|
|
@@ -1014,7 +980,7 @@ export class AngularComponentScanner extends Scanner {
|
|
|
1014
980
|
while ((propMatch = propRegex.exec(bindingContent)) !== null) {
|
|
1015
981
|
const [, property, value] = propMatch;
|
|
1016
982
|
if (property && value) {
|
|
1017
|
-
const hardcodedType =
|
|
983
|
+
const hardcodedType = getHardcodedValueType(property, value);
|
|
1018
984
|
if (hardcodedType) {
|
|
1019
985
|
hardcoded.push({
|
|
1020
986
|
type: hardcodedType,
|
|
@@ -1039,38 +1005,5 @@ export class AngularComponentScanner extends Scanner {
|
|
|
1039
1005
|
return true;
|
|
1040
1006
|
});
|
|
1041
1007
|
}
|
|
1042
|
-
/**
|
|
1043
|
-
* Determine if a CSS value is hardcoded and what type it is.
|
|
1044
|
-
* Returns null if the value is a design token or variable.
|
|
1045
|
-
*/
|
|
1046
|
-
getHardcodedValueType(property, value) {
|
|
1047
|
-
// Skip CSS variables and design tokens
|
|
1048
|
-
if (value.startsWith("var(") || value.startsWith("$") || value.includes("token")) {
|
|
1049
|
-
return null;
|
|
1050
|
-
}
|
|
1051
|
-
// Color properties
|
|
1052
|
-
const colorProps = ["color", "background-color", "background", "border-color", "fill", "stroke"];
|
|
1053
|
-
if (colorProps.includes(property)) {
|
|
1054
|
-
// Hex colors, rgb(), rgba(), hsl(), etc.
|
|
1055
|
-
if (/^(#[0-9a-fA-F]{3,8}|rgba?\(|hsla?\(|oklch\()/.test(value)) {
|
|
1056
|
-
return "color";
|
|
1057
|
-
}
|
|
1058
|
-
}
|
|
1059
|
-
// Spacing properties
|
|
1060
|
-
const spacingProps = ["padding", "margin", "gap", "padding-top", "padding-bottom", "padding-left", "padding-right", "margin-top", "margin-bottom", "margin-left", "margin-right"];
|
|
1061
|
-
if (spacingProps.includes(property)) {
|
|
1062
|
-
// Values with units: 16px, 1rem, 2em, etc.
|
|
1063
|
-
if (/^\d+(\.\d+)?(px|rem|em)$/.test(value)) {
|
|
1064
|
-
return "spacing";
|
|
1065
|
-
}
|
|
1066
|
-
}
|
|
1067
|
-
// Font size properties
|
|
1068
|
-
if (property === "font-size" || property === "fontSize") {
|
|
1069
|
-
if (/^\d+(\.\d+)?(px|rem|em|pt)$/.test(value)) {
|
|
1070
|
-
return "fontSize";
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
return null;
|
|
1074
|
-
}
|
|
1075
1008
|
}
|
|
1076
1009
|
//# sourceMappingURL=angular-scanner.js.map
|