@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.
Files changed (57) hide show
  1. package/dist/base/index.d.ts +1 -0
  2. package/dist/base/index.d.ts.map +1 -1
  3. package/dist/base/index.js +1 -0
  4. package/dist/base/index.js.map +1 -1
  5. package/dist/base/signal-aware-scanner.d.ts +44 -0
  6. package/dist/base/signal-aware-scanner.d.ts.map +1 -0
  7. package/dist/base/signal-aware-scanner.js +64 -0
  8. package/dist/base/signal-aware-scanner.js.map +1 -0
  9. package/dist/cache/index.d.ts +2 -0
  10. package/dist/cache/index.d.ts.map +1 -1
  11. package/dist/cache/index.js +1 -0
  12. package/dist/cache/index.js.map +1 -1
  13. package/dist/cache/with-cache.d.ts +82 -0
  14. package/dist/cache/with-cache.d.ts.map +1 -0
  15. package/dist/cache/with-cache.js +97 -0
  16. package/dist/cache/with-cache.js.map +1 -0
  17. package/dist/extractors/index.d.ts.map +1 -1
  18. package/dist/extractors/index.js +43 -3
  19. package/dist/extractors/index.js.map +1 -1
  20. package/dist/git/angular-scanner.d.ts +2 -25
  21. package/dist/git/angular-scanner.d.ts.map +1 -1
  22. package/dist/git/angular-scanner.js +8 -75
  23. package/dist/git/angular-scanner.js.map +1 -1
  24. package/dist/git/react-scanner.d.ts +2 -20
  25. package/dist/git/react-scanner.d.ts.map +1 -1
  26. package/dist/git/react-scanner.js +4 -39
  27. package/dist/git/react-scanner.js.map +1 -1
  28. package/dist/git/svelte-scanner.d.ts +2 -25
  29. package/dist/git/svelte-scanner.d.ts.map +1 -1
  30. package/dist/git/svelte-scanner.js +8 -75
  31. package/dist/git/svelte-scanner.js.map +1 -1
  32. package/dist/git/template-scanner.d.ts +2 -20
  33. package/dist/git/template-scanner.d.ts.map +1 -1
  34. package/dist/git/template-scanner.js +5 -40
  35. package/dist/git/template-scanner.js.map +1 -1
  36. package/dist/git/vue-scanner.d.ts +2 -25
  37. package/dist/git/vue-scanner.d.ts.map +1 -1
  38. package/dist/git/vue-scanner.js +8 -75
  39. package/dist/git/vue-scanner.js.map +1 -1
  40. package/dist/git/webcomponent-scanner.d.ts +2 -20
  41. package/dist/git/webcomponent-scanner.d.ts.map +1 -1
  42. package/dist/git/webcomponent-scanner.js +4 -39
  43. package/dist/git/webcomponent-scanner.js.map +1 -1
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/patterns/hardcoded-values.d.ts +76 -0
  49. package/dist/patterns/hardcoded-values.d.ts.map +1 -0
  50. package/dist/patterns/hardcoded-values.js +225 -0
  51. package/dist/patterns/hardcoded-values.js.map +1 -0
  52. package/dist/patterns/index.d.ts +2 -0
  53. package/dist/patterns/index.d.ts.map +1 -0
  54. package/dist/patterns/index.js +2 -0
  55. package/dist/patterns/index.js.map +1 -0
  56. package/dist/signals/types.d.ts +32 -32
  57. package/package.json +2 -2
@@ -1,2 +1,3 @@
1
1
  export * from './scanner.js';
2
+ export * from './signal-aware-scanner.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -1,2 +1,3 @@
1
1
  export * from './scanner.js';
2
+ export * from './signal-aware-scanner.js';
2
3
  //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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"}
@@ -1,5 +1,6 @@
1
1
  // packages/scanners/src/cache/index.ts
2
2
  export { ScanCache } from "./scan-cache.js";
3
+ export { withCache, withOptionalCache } from "./with-cache.js";
3
4
  export * from "./types.js";
4
5
  export * from "./git-utils.js";
5
6
  //# sourceMappingURL=index.js.map
@@ -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;AAIxE,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,CAoCvF;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"}
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"}
@@ -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
- // For now, just use HTML-like extraction
63
- // TODO: Add style:prop extraction
64
- return extractAllHtmlStyles(content);
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;AAiCpH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,YAA0B;IACxD,QAAQ,YAAY,EAAE,CAAC;QACrB,uBAAuB;QACvB,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QAEf,MAAM;QACN,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QAEf,UAAU;QACV,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QAEnB,SAAS;QACT,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAElB,+BAA+B;QAC/B;YACE,OAAO,WAAW,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,YAA0B;IACvE,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAE7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,+DAA+D;YAC/D,OAAO;gBACL,GAAG,sBAAsB,CAAC,OAAO,CAAC;gBAClC,GAAG,oBAAoB,CAAC,OAAO,CAAC;aACjC,CAAC;QAEJ,KAAK,KAAK;YACR,yDAAyD;YACzD,OAAO;gBACL,GAAG,uBAAuB,CAAC,OAAO,CAAC;gBACnC,GAAG,oBAAoB,CAAC,OAAO,CAAC;aACjC,CAAC;QAEJ,KAAK,SAAS;YACZ,oDAAoD;YACpD,OAAO;gBACL,GAAG,2BAA2B,CAAC,OAAO,CAAC;gBACvC,GAAG,sBAAsB,CAAC,OAAO,CAAC;gBAClC,GAAG,oBAAoB,CAAC,OAAO,CAAC;aACjC,CAAC;QAEJ,KAAK,QAAQ;YACX,wCAAwC;YACxC,yCAAyC;YACzC,kCAAkC;YAClC,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAEvC,KAAK,WAAW,CAAC;QACjB;YACE,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,CAAC;YACN,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;AACL,CAAC;AAED,iDAAiD;AACjD,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,GAa5B,MAAM,oBAAoB,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 { Scanner, ScanResult, ScannerConfig } from "../base/scanner.js";
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 Scanner<Component, AngularScannerConfig> {
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,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAkC,MAAM,mBAAmB,CAAC;AAKnF,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAO7B,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAYD,qBAAa,uBAAwB,SAAQ,OAAO,CAClD,SAAS,EACT,oBAAoB,CACrB;IACC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAe;IAEvD,iEAAiE;IACjE,OAAO,CAAC,gBAAgB,CAA8C;IAEhE,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAkB5C;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAYrE;;;OAGG;IACH,mBAAmB,IAAI,SAAS,EAAE;IAIlC;;OAEG;IACH,cAAc,IAAI,cAAc;IAQhC,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;IA0H1C;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAoC9B"}
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 { Scanner } from "../base/scanner.js";
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 { createSignalAggregator, } from "../signals/index.js";
8
- export class AngularComponentScanner extends Scanner {
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.signalAggregator.clear();
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.signalAggregator.addEmitter(relativePath, signalCollector.getEmitter());
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 = this.getHardcodedValueType(property, trimmedValue);
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 = this.getHardcodedValueType(property, value);
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 = this.getHardcodedValueType(property, value);
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