@buoy-design/scanners 0.1.5 → 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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/base/index.d.ts +1 -0
  4. package/dist/base/index.d.ts.map +1 -1
  5. package/dist/base/index.js +1 -0
  6. package/dist/base/index.js.map +1 -1
  7. package/dist/base/signal-aware-scanner.d.ts +44 -0
  8. package/dist/base/signal-aware-scanner.d.ts.map +1 -0
  9. package/dist/base/signal-aware-scanner.js +64 -0
  10. package/dist/base/signal-aware-scanner.js.map +1 -0
  11. package/dist/cache/index.d.ts +2 -0
  12. package/dist/cache/index.d.ts.map +1 -1
  13. package/dist/cache/index.js +1 -0
  14. package/dist/cache/index.js.map +1 -1
  15. package/dist/cache/with-cache.d.ts +82 -0
  16. package/dist/cache/with-cache.d.ts.map +1 -0
  17. package/dist/cache/with-cache.js +97 -0
  18. package/dist/cache/with-cache.js.map +1 -0
  19. package/dist/extractors/index.d.ts.map +1 -1
  20. package/dist/extractors/index.js +43 -3
  21. package/dist/extractors/index.js.map +1 -1
  22. package/dist/git/angular-scanner.d.ts +2 -25
  23. package/dist/git/angular-scanner.d.ts.map +1 -1
  24. package/dist/git/angular-scanner.js +8 -75
  25. package/dist/git/angular-scanner.js.map +1 -1
  26. package/dist/git/react-scanner.d.ts +2 -20
  27. package/dist/git/react-scanner.d.ts.map +1 -1
  28. package/dist/git/react-scanner.js +4 -39
  29. package/dist/git/react-scanner.js.map +1 -1
  30. package/dist/git/svelte-scanner.d.ts +2 -25
  31. package/dist/git/svelte-scanner.d.ts.map +1 -1
  32. package/dist/git/svelte-scanner.js +8 -75
  33. package/dist/git/svelte-scanner.js.map +1 -1
  34. package/dist/git/template-scanner.d.ts +2 -20
  35. package/dist/git/template-scanner.d.ts.map +1 -1
  36. package/dist/git/template-scanner.js +5 -40
  37. package/dist/git/template-scanner.js.map +1 -1
  38. package/dist/git/vue-scanner.d.ts +2 -25
  39. package/dist/git/vue-scanner.d.ts.map +1 -1
  40. package/dist/git/vue-scanner.js +8 -75
  41. package/dist/git/vue-scanner.js.map +1 -1
  42. package/dist/git/webcomponent-scanner.d.ts +2 -20
  43. package/dist/git/webcomponent-scanner.d.ts.map +1 -1
  44. package/dist/git/webcomponent-scanner.js +4 -39
  45. package/dist/git/webcomponent-scanner.js.map +1 -1
  46. package/dist/index.d.ts +1 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/patterns/hardcoded-values.d.ts +76 -0
  51. package/dist/patterns/hardcoded-values.d.ts.map +1 -0
  52. package/dist/patterns/hardcoded-values.js +225 -0
  53. package/dist/patterns/hardcoded-values.js.map +1 -0
  54. package/dist/patterns/index.d.ts +2 -0
  55. package/dist/patterns/index.d.ts.map +1 -0
  56. package/dist/patterns/index.js +2 -0
  57. package/dist/patterns/index.js.map +1 -0
  58. package/dist/signals/types.d.ts +32 -32
  59. package/package.json +12 -12
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Buoy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # @buoy-design/scanners
2
+
3
+ Framework-specific code scanners for Buoy. Extracts components and design tokens from React, Vue, Svelte, Angular, and more.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @buoy-design/scanners
9
+ ```
10
+
11
+ ## Supported Frameworks
12
+
13
+ - **React** - JSX/TSX components
14
+ - **Vue** - Single File Components
15
+ - **Svelte** - .svelte files
16
+ - **Angular** - @Component decorators
17
+ - **Web Components** - Lit, Stencil
18
+ - **Tailwind** - Config parsing, arbitrary value detection
19
+ - **Templates** - Blade, ERB, Twig
20
+
21
+ ## Usage
22
+
23
+ ```typescript
24
+ import { createReactScanner } from '@buoy-design/scanners';
25
+
26
+ const scanner = createReactScanner({
27
+ include: ['src/**/*.tsx'],
28
+ exclude: ['**/*.test.*'],
29
+ });
30
+
31
+ const components = await scanner.scan();
32
+ ```
33
+
34
+ ## Links
35
+
36
+ - [Buoy CLI](https://www.npmjs.com/package/@buoy-design/cli)
37
+ - [Documentation](https://buoy.design/docs)
@@ -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"}