baseguard 1.0.0

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 (244) hide show
  1. package/.eslintrc.json +25 -0
  2. package/.prettierrc +8 -0
  3. package/README.md +94 -0
  4. package/bin/base.js +494 -0
  5. package/dist/ai/fix-manager.d.ts +67 -0
  6. package/dist/ai/fix-manager.d.ts.map +1 -0
  7. package/dist/ai/fix-manager.js +326 -0
  8. package/dist/ai/fix-manager.js.map +1 -0
  9. package/dist/ai/gemini-analyzer.d.ts +116 -0
  10. package/dist/ai/gemini-analyzer.d.ts.map +1 -0
  11. package/dist/ai/gemini-analyzer.js +572 -0
  12. package/dist/ai/gemini-analyzer.js.map +1 -0
  13. package/dist/ai/index.d.ts +4 -0
  14. package/dist/ai/index.d.ts.map +1 -0
  15. package/dist/ai/index.js +5 -0
  16. package/dist/ai/index.js.map +1 -0
  17. package/dist/ai/jules-implementer.d.ts +115 -0
  18. package/dist/ai/jules-implementer.d.ts.map +1 -0
  19. package/dist/ai/jules-implementer.js +387 -0
  20. package/dist/ai/jules-implementer.js.map +1 -0
  21. package/dist/commands/automation.d.ts +5 -0
  22. package/dist/commands/automation.d.ts.map +1 -0
  23. package/dist/commands/automation.js +305 -0
  24. package/dist/commands/automation.js.map +1 -0
  25. package/dist/commands/check.d.ts +9 -0
  26. package/dist/commands/check.d.ts.map +1 -0
  27. package/dist/commands/check.js +113 -0
  28. package/dist/commands/check.js.map +1 -0
  29. package/dist/commands/config.d.ts +11 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +324 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/fix.d.ts +9 -0
  34. package/dist/commands/fix.d.ts.map +1 -0
  35. package/dist/commands/fix.js +207 -0
  36. package/dist/commands/fix.js.map +1 -0
  37. package/dist/commands/index.d.ts +6 -0
  38. package/dist/commands/index.d.ts.map +1 -0
  39. package/dist/commands/index.js +7 -0
  40. package/dist/commands/index.js.map +1 -0
  41. package/dist/commands/init.d.ts +9 -0
  42. package/dist/commands/init.d.ts.map +1 -0
  43. package/dist/commands/init.js +125 -0
  44. package/dist/commands/init.js.map +1 -0
  45. package/dist/core/api-key-manager.d.ts +83 -0
  46. package/dist/core/api-key-manager.d.ts.map +1 -0
  47. package/dist/core/api-key-manager.js +244 -0
  48. package/dist/core/api-key-manager.js.map +1 -0
  49. package/dist/core/baseguard.d.ts +46 -0
  50. package/dist/core/baseguard.d.ts.map +1 -0
  51. package/dist/core/baseguard.js +132 -0
  52. package/dist/core/baseguard.js.map +1 -0
  53. package/dist/core/baseline-checker.d.ts +63 -0
  54. package/dist/core/baseline-checker.d.ts.map +1 -0
  55. package/dist/core/baseline-checker.js +502 -0
  56. package/dist/core/baseline-checker.js.map +1 -0
  57. package/dist/core/cache-manager.d.ts +88 -0
  58. package/dist/core/cache-manager.d.ts.map +1 -0
  59. package/dist/core/cache-manager.js +213 -0
  60. package/dist/core/cache-manager.js.map +1 -0
  61. package/dist/core/configuration.d.ts +140 -0
  62. package/dist/core/configuration.d.ts.map +1 -0
  63. package/dist/core/configuration.js +474 -0
  64. package/dist/core/configuration.js.map +1 -0
  65. package/dist/core/directory-filter.d.ts +90 -0
  66. package/dist/core/directory-filter.d.ts.map +1 -0
  67. package/dist/core/directory-filter.js +319 -0
  68. package/dist/core/directory-filter.js.map +1 -0
  69. package/dist/core/error-handler.d.ts +110 -0
  70. package/dist/core/error-handler.d.ts.map +1 -0
  71. package/dist/core/error-handler.js +392 -0
  72. package/dist/core/error-handler.js.map +1 -0
  73. package/dist/core/file-processor.d.ts +80 -0
  74. package/dist/core/file-processor.d.ts.map +1 -0
  75. package/dist/core/file-processor.js +259 -0
  76. package/dist/core/file-processor.js.map +1 -0
  77. package/dist/core/gitignore-manager.d.ts +44 -0
  78. package/dist/core/gitignore-manager.d.ts.map +1 -0
  79. package/dist/core/gitignore-manager.js +147 -0
  80. package/dist/core/gitignore-manager.js.map +1 -0
  81. package/dist/core/index.d.ts +13 -0
  82. package/dist/core/index.d.ts.map +1 -0
  83. package/dist/core/index.js +13 -0
  84. package/dist/core/index.js.map +1 -0
  85. package/dist/core/lazy-loader.d.ts +68 -0
  86. package/dist/core/lazy-loader.d.ts.map +1 -0
  87. package/dist/core/lazy-loader.js +260 -0
  88. package/dist/core/lazy-loader.js.map +1 -0
  89. package/dist/core/memory-manager.d.ts +1 -0
  90. package/dist/core/memory-manager.d.ts.map +1 -0
  91. package/dist/core/memory-manager.js +2 -0
  92. package/dist/core/memory-manager.js.map +1 -0
  93. package/dist/core/startup-optimizer.d.ts +45 -0
  94. package/dist/core/startup-optimizer.d.ts.map +1 -0
  95. package/dist/core/startup-optimizer.js +140 -0
  96. package/dist/core/startup-optimizer.js.map +1 -0
  97. package/dist/git/automation-engine.d.ts +58 -0
  98. package/dist/git/automation-engine.d.ts.map +1 -0
  99. package/dist/git/automation-engine.js +318 -0
  100. package/dist/git/automation-engine.js.map +1 -0
  101. package/dist/git/github-manager.d.ts +71 -0
  102. package/dist/git/github-manager.d.ts.map +1 -0
  103. package/dist/git/github-manager.js +226 -0
  104. package/dist/git/github-manager.js.map +1 -0
  105. package/dist/git/hook-manager.d.ts +43 -0
  106. package/dist/git/hook-manager.d.ts.map +1 -0
  107. package/dist/git/hook-manager.js +191 -0
  108. package/dist/git/hook-manager.js.map +1 -0
  109. package/dist/git/index.d.ts +4 -0
  110. package/dist/git/index.d.ts.map +1 -0
  111. package/dist/git/index.js +5 -0
  112. package/dist/git/index.js.map +1 -0
  113. package/dist/index.d.ts +8 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +9 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/parsers/feature-validator.d.ts +60 -0
  118. package/dist/parsers/feature-validator.d.ts.map +1 -0
  119. package/dist/parsers/feature-validator.js +483 -0
  120. package/dist/parsers/feature-validator.js.map +1 -0
  121. package/dist/parsers/index.d.ts +8 -0
  122. package/dist/parsers/index.d.ts.map +1 -0
  123. package/dist/parsers/index.js +9 -0
  124. package/dist/parsers/index.js.map +1 -0
  125. package/dist/parsers/parser-manager.d.ts +103 -0
  126. package/dist/parsers/parser-manager.d.ts.map +1 -0
  127. package/dist/parsers/parser-manager.js +321 -0
  128. package/dist/parsers/parser-manager.js.map +1 -0
  129. package/dist/parsers/parser.d.ts +23 -0
  130. package/dist/parsers/parser.d.ts.map +1 -0
  131. package/dist/parsers/parser.js +6 -0
  132. package/dist/parsers/parser.js.map +1 -0
  133. package/dist/parsers/react-parser.d.ts +22 -0
  134. package/dist/parsers/react-parser.d.ts.map +1 -0
  135. package/dist/parsers/react-parser.js +307 -0
  136. package/dist/parsers/react-parser.js.map +1 -0
  137. package/dist/parsers/svelte-parser.d.ts +33 -0
  138. package/dist/parsers/svelte-parser.d.ts.map +1 -0
  139. package/dist/parsers/svelte-parser.js +408 -0
  140. package/dist/parsers/svelte-parser.js.map +1 -0
  141. package/dist/parsers/vanilla-parser.d.ts +31 -0
  142. package/dist/parsers/vanilla-parser.d.ts.map +1 -0
  143. package/dist/parsers/vanilla-parser.js +590 -0
  144. package/dist/parsers/vanilla-parser.js.map +1 -0
  145. package/dist/parsers/vue-parser.d.ts +9 -0
  146. package/dist/parsers/vue-parser.d.ts.map +1 -0
  147. package/dist/parsers/vue-parser.js +16 -0
  148. package/dist/parsers/vue-parser.js.map +1 -0
  149. package/dist/terminal-header.d.ts +12 -0
  150. package/dist/terminal-header.js +45 -0
  151. package/dist/types/index.d.ts +83 -0
  152. package/dist/types/index.d.ts.map +1 -0
  153. package/dist/types/index.js +5 -0
  154. package/dist/types/index.js.map +1 -0
  155. package/dist/ui/components.d.ts +133 -0
  156. package/dist/ui/components.d.ts.map +1 -0
  157. package/dist/ui/components.js +482 -0
  158. package/dist/ui/components.js.map +1 -0
  159. package/dist/ui/help.d.ts +11 -0
  160. package/dist/ui/help.d.ts.map +1 -0
  161. package/dist/ui/help.js +161 -0
  162. package/dist/ui/help.js.map +1 -0
  163. package/dist/ui/index.d.ts +5 -0
  164. package/dist/ui/index.d.ts.map +1 -0
  165. package/dist/ui/index.js +5 -0
  166. package/dist/ui/index.js.map +1 -0
  167. package/dist/ui/prompts.d.ts +63 -0
  168. package/dist/ui/prompts.d.ts.map +1 -0
  169. package/dist/ui/prompts.js +611 -0
  170. package/dist/ui/prompts.js.map +1 -0
  171. package/dist/ui/terminal-header.d.ts +13 -0
  172. package/dist/ui/terminal-header.d.ts.map +1 -0
  173. package/dist/ui/terminal-header.js +46 -0
  174. package/dist/ui/terminal-header.js.map +1 -0
  175. package/package.json +80 -0
  176. package/src/ai/__tests__/gemini-analyzer.test.ts +181 -0
  177. package/src/ai/fix-manager.ts +362 -0
  178. package/src/ai/gemini-analyzer.ts +671 -0
  179. package/src/ai/index.ts +4 -0
  180. package/src/ai/jules-implementer.ts +459 -0
  181. package/src/commands/automation.ts +344 -0
  182. package/src/commands/check.ts +299 -0
  183. package/src/commands/config.ts +365 -0
  184. package/src/commands/fix.ts +234 -0
  185. package/src/commands/index.ts +6 -0
  186. package/src/commands/init.ts +142 -0
  187. package/src/commands/status.ts +0 -0
  188. package/src/core/api-key-manager.ts +298 -0
  189. package/src/core/baseguard.ts +742 -0
  190. package/src/core/baseline-checker.ts +563 -0
  191. package/src/core/cache-manager.ts +270 -0
  192. package/src/core/configuration-recovery.ts +676 -0
  193. package/src/core/configuration.ts +559 -0
  194. package/src/core/debug-logger.ts +590 -0
  195. package/src/core/directory-filter.ts +421 -0
  196. package/src/core/error-handler.ts +517 -0
  197. package/src/core/file-processor.ts +331 -0
  198. package/src/core/gitignore-manager.ts +169 -0
  199. package/src/core/graceful-degradation-manager.ts +596 -0
  200. package/src/core/index.ts +13 -0
  201. package/src/core/lazy-loader.ts +307 -0
  202. package/src/core/logger.ts +0 -0
  203. package/src/core/memory-manager.ts +294 -0
  204. package/src/core/startup-optimizer.ts +173 -0
  205. package/src/core/system-error-handler.ts +746 -0
  206. package/src/git/automation-engine.ts +361 -0
  207. package/src/git/github-manager.ts +260 -0
  208. package/src/git/hook-manager.ts +210 -0
  209. package/src/git/index.ts +4 -0
  210. package/src/index.ts +8 -0
  211. package/src/parsers/feature-validator.ts +559 -0
  212. package/src/parsers/index.ts +8 -0
  213. package/src/parsers/parser-manager.ts +419 -0
  214. package/src/parsers/parser.ts +26 -0
  215. package/src/parsers/react-parser-optimized.ts +161 -0
  216. package/src/parsers/react-parser.ts +359 -0
  217. package/src/parsers/svelte-parser.ts +506 -0
  218. package/src/parsers/vanilla-parser.ts +682 -0
  219. package/src/parsers/vue-parser.ts +472 -0
  220. package/src/types/index.ts +92 -0
  221. package/src/ui/components.ts +567 -0
  222. package/src/ui/help.ts +193 -0
  223. package/src/ui/index.ts +4 -0
  224. package/src/ui/prompts.ts +688 -0
  225. package/src/ui/terminal-header.ts +59 -0
  226. package/test-config-commands.js +56 -0
  227. package/test-header-simple.js +33 -0
  228. package/test-terminal-header.js +12 -0
  229. package/test-ui.js +29 -0
  230. package/tests/e2e/baseguard.e2e.test.ts +516 -0
  231. package/tests/e2e/cross-platform.e2e.test.ts +420 -0
  232. package/tests/e2e/git-integration.e2e.test.ts +487 -0
  233. package/tests/fixtures/react-project/package.json +14 -0
  234. package/tests/fixtures/react-project/src/App.css +76 -0
  235. package/tests/fixtures/react-project/src/App.tsx +77 -0
  236. package/tests/fixtures/svelte-project/package.json +11 -0
  237. package/tests/fixtures/svelte-project/src/App.svelte +369 -0
  238. package/tests/fixtures/vanilla-project/index.html +76 -0
  239. package/tests/fixtures/vanilla-project/script.js +331 -0
  240. package/tests/fixtures/vanilla-project/styles.css +359 -0
  241. package/tests/fixtures/vue-project/package.json +12 -0
  242. package/tests/fixtures/vue-project/src/App.vue +216 -0
  243. package/tsconfig.json +36 -0
  244. package/vitest.config.ts +10 -0
@@ -0,0 +1,63 @@
1
+ import type { BrowserTarget, Violation, DetectedFeature, CompatibilityResult } from '../types/index.js';
2
+ export declare class BaselineChecker {
3
+ private webFeatures;
4
+ private featureCache;
5
+ private initialized;
6
+ constructor();
7
+ /**
8
+ * Initialize web-features data lazily
9
+ */
10
+ private ensureInitialized;
11
+ /**
12
+ * Get feature status from web-features package with caching
13
+ */
14
+ private getFeatureStatus;
15
+ /**
16
+ * Map detected feature to web-features ID
17
+ */
18
+ private mapFeatureToId;
19
+ /**
20
+ * Check if a version is supported based on browser support data
21
+ */
22
+ private isVersionSupported;
23
+ /**
24
+ * Compare two version strings
25
+ */
26
+ private compareVersions;
27
+ /**
28
+ * Map browser name to web-features format
29
+ */
30
+ private mapBrowserName;
31
+ /**
32
+ * Create a violation object
33
+ */
34
+ private createViolation;
35
+ /**
36
+ * Check compatibility of a detected feature against browser targets
37
+ */
38
+ checkCompatibility(detectedFeature: DetectedFeature, targets: BrowserTarget[]): Promise<CompatibilityResult>;
39
+ /**
40
+ * Check multiple features against browser targets with memory optimization
41
+ */
42
+ checkMultipleFeatures(detectedFeatures: DetectedFeature[], targets: BrowserTarget[]): Promise<Violation[]>;
43
+ /**
44
+ * Get available feature IDs for debugging/testing
45
+ */
46
+ getAvailableFeatureIds(): Promise<string[]>;
47
+ /**
48
+ * Clear caches to free memory
49
+ */
50
+ clearCache(): void;
51
+ /**
52
+ * Get cache statistics
53
+ */
54
+ getCacheStats(): {
55
+ cacheSize: number;
56
+ memoryEstimate: string;
57
+ };
58
+ /**
59
+ * Get feature mapping for debugging/testing
60
+ */
61
+ getFeatureMapping(): Record<string, string>;
62
+ }
63
+ //# sourceMappingURL=baseline-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline-checker.d.ts","sourceRoot":"","sources":["../../src/core/baseline-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA2PxG,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,WAAW,CAAS;;IAM5B;;OAEG;YACW,iBAAiB;IAe/B;;OAEG;YACW,gBAAgB;IA4B9B;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,eAAe;IA8CvB;;OAEG;IACG,kBAAkB,CAAC,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmDlH;;OAEG;IACG,qBAAqB,CAAC,gBAAgB,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAyBhH;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKjD;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,aAAa,IAAI;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;KACxB;IAUD;;OAEG;IACH,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAG5C"}
@@ -0,0 +1,502 @@
1
+ import { LazyLoader } from './lazy-loader.js';
2
+ import { MemoryManager } from './memory-manager.js';
3
+ // Comprehensive feature mapping dictionary for ALL web platform features
4
+ const FEATURE_ID_MAP = {
5
+ // CSS Properties
6
+ 'container-type': 'container-queries',
7
+ 'container-name': 'container-queries',
8
+ 'container': 'container-queries',
9
+ 'aspect-ratio': 'aspect-ratio',
10
+ 'gap': 'grid-gap',
11
+ 'row-gap': 'grid-gap',
12
+ 'column-gap': 'grid-gap',
13
+ 'scroll-behavior': 'scroll-behavior',
14
+ 'backdrop-filter': 'backdrop-filter',
15
+ 'color-scheme': 'color-scheme',
16
+ 'accent-color': 'accent-color',
17
+ 'overscroll-behavior': 'overscroll-behavior',
18
+ 'scroll-snap-type': 'scroll-snap-type',
19
+ 'scroll-snap-align': 'scroll-snap-align',
20
+ 'object-fit': 'object-fit',
21
+ 'object-position': 'object-position',
22
+ 'place-items': 'place-items',
23
+ 'place-content': 'place-content',
24
+ 'place-self': 'place-self',
25
+ 'inset': 'inset',
26
+ 'inset-block': 'inset',
27
+ 'inset-inline': 'inset',
28
+ 'block-size': 'logical-properties',
29
+ 'inline-size': 'logical-properties',
30
+ 'margin-block': 'logical-properties',
31
+ 'margin-inline': 'logical-properties',
32
+ 'padding-block': 'logical-properties',
33
+ 'padding-inline': 'logical-properties',
34
+ 'border-block': 'logical-properties',
35
+ 'border-inline': 'logical-properties',
36
+ // CSS Selectors
37
+ ':has()': 'has',
38
+ ':is()': 'is',
39
+ ':where()': 'where',
40
+ ':focus-visible': 'focus-visible',
41
+ ':focus-within': 'focus-within',
42
+ ':target-within': 'target-within',
43
+ '::backdrop': 'backdrop',
44
+ '::marker': 'marker',
45
+ '::part()': 'part',
46
+ '::slotted()': 'slotted',
47
+ // CSS At-rules
48
+ '@supports': 'supports',
49
+ '@container': 'container-queries',
50
+ '@layer': 'cascade-layers',
51
+ '@scope': 'scope',
52
+ // JavaScript Web APIs
53
+ 'HTMLDialogElement.showModal': 'dialog',
54
+ 'HTMLDialogElement.show': 'dialog',
55
+ 'HTMLDialogElement.close': 'dialog',
56
+ 'structuredClone': 'structured-clone',
57
+ 'Array.prototype.at': 'array-at',
58
+ 'Array.prototype.findLast': 'array-find-last',
59
+ 'Array.prototype.findLastIndex': 'array-find-last',
60
+ 'String.prototype.at': 'string-at',
61
+ 'String.prototype.replaceAll': 'string-replace-all',
62
+ 'Object.hasOwn': 'object-has-own',
63
+ 'ResizeObserver': 'resize-observer',
64
+ 'IntersectionObserver': 'intersection-observer',
65
+ 'MutationObserver': 'mutation-observer',
66
+ 'PerformanceObserver': 'performance-observer',
67
+ 'BroadcastChannel': 'broadcast-channel',
68
+ 'MessageChannel': 'message-channel',
69
+ 'SharedArrayBuffer': 'shared-array-buffer',
70
+ 'Atomics': 'atomics',
71
+ 'BigInt': 'bigint',
72
+ 'WeakRef': 'weak-ref',
73
+ 'FinalizationRegistry': 'finalization-registry',
74
+ // Canvas and WebGL APIs
75
+ 'CanvasRenderingContext2D.filter': 'canvas-filter',
76
+ 'CanvasRenderingContext2D.reset': 'canvas-reset',
77
+ 'WebGL2RenderingContext': 'webgl2',
78
+ 'OffscreenCanvas': 'offscreen-canvas',
79
+ 'OffscreenCanvasRenderingContext2D': 'offscreen-canvas',
80
+ 'ImageBitmap': 'image-bitmap',
81
+ 'createImageBitmap': 'image-bitmap',
82
+ 'Path2D': 'path2d',
83
+ // WebRTC APIs
84
+ 'RTCPeerConnection': 'webrtc',
85
+ 'getUserMedia': 'getusermedia',
86
+ 'RTCDataChannel': 'rtc-data-channel',
87
+ 'RTCRtpTransceiver': 'rtc-rtp-transceiver',
88
+ 'RTCStatsReport': 'rtc-stats',
89
+ 'RTCIceCandidate': 'rtc-ice-candidate',
90
+ 'RTCSessionDescription': 'rtc-session-description',
91
+ // Service Workers and PWA
92
+ 'ServiceWorker': 'service-workers',
93
+ 'navigator.serviceWorker': 'service-workers',
94
+ 'ServiceWorkerRegistration': 'service-workers',
95
+ 'Cache': 'cache-api',
96
+ 'CacheStorage': 'cache-api',
97
+ 'PushManager': 'push-api',
98
+ 'PushSubscription': 'push-api',
99
+ 'NotificationEvent': 'notification-api',
100
+ 'BackgroundSync': 'background-sync',
101
+ 'PaymentRequest': 'payment-request',
102
+ 'PaymentResponse': 'payment-request',
103
+ // WebAssembly
104
+ 'WebAssembly': 'webassembly',
105
+ 'WebAssembly.instantiate': 'webassembly',
106
+ 'WebAssembly.compile': 'webassembly',
107
+ 'WebAssembly.Module': 'webassembly',
108
+ 'WebAssembly.Instance': 'webassembly',
109
+ 'WebAssembly.Memory': 'webassembly',
110
+ 'WebAssembly.Table': 'webassembly',
111
+ // JavaScript Syntax (ECMAScript features)
112
+ 'optional-chaining': 'optional-chaining',
113
+ 'nullish-coalescing': 'nullish-coalescing',
114
+ 'private-fields': 'private-fields',
115
+ 'private-methods': 'private-methods',
116
+ 'static-class-fields': 'static-class-fields',
117
+ 'top-level-await': 'top-level-await',
118
+ 'import-assertions': 'import-assertions',
119
+ 'import-meta': 'import-meta',
120
+ 'dynamic-import': 'dynamic-import',
121
+ 'async-iteration': 'async-iteration',
122
+ 'for-await-of': 'async-iteration',
123
+ 'destructuring': 'destructuring',
124
+ 'rest-spread': 'rest-spread',
125
+ 'template-literals': 'template-literals',
126
+ 'arrow-functions': 'arrow-functions',
127
+ 'const-let': 'const-let',
128
+ 'default-parameters': 'default-parameters',
129
+ // HTML Elements and Attributes
130
+ 'dialog': 'dialog',
131
+ 'details': 'details-summary',
132
+ 'summary': 'details-summary',
133
+ 'loading="lazy"': 'loading-lazy',
134
+ 'decoding="async"': 'image-decoding',
135
+ 'input[type="date"]': 'input-date',
136
+ 'input[type="time"]': 'input-time',
137
+ 'input[type="datetime-local"]': 'input-datetime-local',
138
+ 'input[type="month"]': 'input-month',
139
+ 'input[type="week"]': 'input-week',
140
+ 'input[type="color"]': 'input-color',
141
+ 'input[type="range"]': 'input-range',
142
+ 'input[type="search"]': 'input-search',
143
+ 'input[type="tel"]': 'input-tel',
144
+ 'input[type="url"]': 'input-url',
145
+ 'input[type="email"]': 'input-email',
146
+ 'input[type="number"]': 'input-number',
147
+ 'datalist': 'datalist',
148
+ 'output': 'output',
149
+ 'progress': 'progress',
150
+ 'meter': 'meter',
151
+ 'picture': 'picture',
152
+ 'source': 'picture',
153
+ 'track': 'track',
154
+ 'slot': 'slot',
155
+ 'template': 'template',
156
+ // DOM APIs
157
+ 'DOMMatrix': 'geometry-interfaces',
158
+ 'DOMPoint': 'geometry-interfaces',
159
+ 'DOMRect': 'geometry-interfaces',
160
+ 'DOMQuad': 'geometry-interfaces',
161
+ 'AbortController': 'abort-controller',
162
+ 'AbortSignal': 'abort-controller',
163
+ 'FormData': 'form-data',
164
+ 'URLSearchParams': 'url-search-params',
165
+ 'URL': 'url',
166
+ 'URLPattern': 'url-pattern',
167
+ 'Blob': 'blob',
168
+ 'File': 'file',
169
+ 'FileReader': 'file-reader',
170
+ 'FileList': 'file-list',
171
+ 'DataTransfer': 'data-transfer',
172
+ 'ClipboardAPI': 'clipboard-api',
173
+ 'navigator.clipboard': 'clipboard-api',
174
+ 'Permissions': 'permissions-api',
175
+ 'navigator.permissions': 'permissions-api',
176
+ 'Geolocation': 'geolocation',
177
+ 'navigator.geolocation': 'geolocation',
178
+ 'DeviceOrientationEvent': 'device-orientation',
179
+ 'DeviceMotionEvent': 'device-motion',
180
+ 'Vibration': 'vibration',
181
+ 'navigator.vibrate': 'vibration',
182
+ 'Battery': 'battery-status',
183
+ 'navigator.getBattery': 'battery-status',
184
+ 'NetworkInformation': 'network-information',
185
+ 'navigator.connection': 'network-information',
186
+ 'MediaDevices': 'media-devices',
187
+ 'navigator.mediaDevices': 'media-devices',
188
+ 'MediaStream': 'media-stream',
189
+ 'MediaRecorder': 'media-recorder',
190
+ 'SpeechSynthesis': 'speech-synthesis',
191
+ 'SpeechRecognition': 'speech-recognition',
192
+ 'Gamepad': 'gamepad',
193
+ 'navigator.getGamepads': 'gamepad',
194
+ 'PointerEvent': 'pointer-events',
195
+ 'TouchEvent': 'touch-events',
196
+ 'WheelEvent': 'wheel-events',
197
+ 'KeyboardEvent': 'keyboard-events',
198
+ 'MouseEvent': 'mouse-events',
199
+ 'FocusEvent': 'focus-events',
200
+ 'InputEvent': 'input-events',
201
+ 'CompositionEvent': 'composition-events',
202
+ 'CustomEvent': 'custom-events',
203
+ 'EventTarget': 'event-target',
204
+ 'addEventListener': 'event-listeners',
205
+ 'removeEventListener': 'event-listeners',
206
+ 'dispatchEvent': 'event-dispatch',
207
+ 'requestAnimationFrame': 'request-animation-frame',
208
+ 'cancelAnimationFrame': 'request-animation-frame',
209
+ 'requestIdleCallback': 'request-idle-callback',
210
+ 'cancelIdleCallback': 'request-idle-callback',
211
+ 'setTimeout': 'timers',
212
+ 'setInterval': 'timers',
213
+ 'clearTimeout': 'timers',
214
+ 'clearInterval': 'timers',
215
+ 'queueMicrotask': 'queue-microtask',
216
+ 'fetch': 'fetch',
217
+ 'Request': 'fetch',
218
+ 'Response': 'fetch',
219
+ 'Headers': 'fetch',
220
+ 'XMLHttpRequest': 'xhr',
221
+ 'EventSource': 'server-sent-events',
222
+ 'WebSocket': 'websockets',
223
+ 'History': 'history-api',
224
+ 'history.pushState': 'history-api',
225
+ 'history.replaceState': 'history-api',
226
+ 'Location': 'location',
227
+ 'Navigator': 'navigator',
228
+ 'Screen': 'screen',
229
+ 'Window': 'window',
230
+ 'Document': 'document',
231
+ 'Element': 'element',
232
+ 'Node': 'node',
233
+ 'DocumentFragment': 'document-fragment',
234
+ 'ShadowRoot': 'shadow-dom',
235
+ 'customElements': 'custom-elements',
236
+ 'HTMLElement': 'html-element',
237
+ 'SVGElement': 'svg-element'
238
+ };
239
+ export class BaselineChecker {
240
+ webFeatures = null;
241
+ featureCache = new Map();
242
+ initialized = false;
243
+ constructor() {
244
+ // Don't load web-features immediately - use lazy loading
245
+ }
246
+ /**
247
+ * Initialize web-features data lazily
248
+ */
249
+ async ensureInitialized() {
250
+ if (this.initialized) {
251
+ return;
252
+ }
253
+ try {
254
+ this.webFeatures = await LazyLoader.getWebFeatures();
255
+ this.initialized = true;
256
+ }
257
+ catch (error) {
258
+ console.warn('Failed to load web-features data:', error);
259
+ this.webFeatures = { features: {}, browsers: {}, groups: {} };
260
+ this.initialized = true;
261
+ }
262
+ }
263
+ /**
264
+ * Get feature status from web-features package with caching
265
+ */
266
+ async getFeatureStatus(featureId) {
267
+ await this.ensureInitialized();
268
+ // Check cache first
269
+ if (this.featureCache.has(featureId)) {
270
+ return this.featureCache.get(featureId);
271
+ }
272
+ const feature = this.webFeatures?.features?.[featureId] || this.webFeatures?.[featureId];
273
+ // Cache the result to avoid repeated lookups
274
+ if (feature) {
275
+ // Optimize the feature data to reduce memory usage
276
+ const optimized = MemoryManager.optimizeObject({
277
+ name: feature.name,
278
+ status: feature.status,
279
+ support: feature.support,
280
+ baseline: feature.baseline
281
+ });
282
+ this.featureCache.set(featureId, optimized);
283
+ return optimized;
284
+ }
285
+ // Cache null results too to avoid repeated failed lookups
286
+ this.featureCache.set(featureId, null);
287
+ return null;
288
+ }
289
+ /**
290
+ * Map detected feature to web-features ID
291
+ */
292
+ mapFeatureToId(feature) {
293
+ // Direct mapping
294
+ if (FEATURE_ID_MAP[feature]) {
295
+ return FEATURE_ID_MAP[feature];
296
+ }
297
+ // Try to find partial matches for complex features
298
+ for (const [key, value] of Object.entries(FEATURE_ID_MAP)) {
299
+ if (feature.includes(key) || key.includes(feature)) {
300
+ return value;
301
+ }
302
+ }
303
+ // Check if the feature exists directly in web-features
304
+ if (this.webFeatures[feature]) {
305
+ return feature;
306
+ }
307
+ return null;
308
+ }
309
+ /**
310
+ * Check if a version is supported based on browser support data
311
+ */
312
+ isVersionSupported(browserSupport, minVersion) {
313
+ if (!browserSupport)
314
+ return false;
315
+ // If browser support is true, it's supported
316
+ if (browserSupport === true)
317
+ return true;
318
+ // If browser support is false or null, it's not supported
319
+ if (!browserSupport)
320
+ return false;
321
+ // If it's a version string, compare versions
322
+ if (typeof browserSupport === 'string') {
323
+ return this.compareVersions(browserSupport, minVersion) >= 0;
324
+ }
325
+ // If it's an object with version info, extract the version
326
+ if (typeof browserSupport === 'object' && browserSupport.version) {
327
+ return this.compareVersions(browserSupport.version, minVersion) >= 0;
328
+ }
329
+ return false;
330
+ }
331
+ /**
332
+ * Compare two version strings
333
+ */
334
+ compareVersions(version1, version2) {
335
+ const v1Parts = version1.split('.').map(Number);
336
+ const v2Parts = version2.split('.').map(Number);
337
+ const maxLength = Math.max(v1Parts.length, v2Parts.length);
338
+ for (let i = 0; i < maxLength; i++) {
339
+ const v1Part = v1Parts[i] || 0;
340
+ const v2Part = v2Parts[i] || 0;
341
+ if (v1Part > v2Part)
342
+ return 1;
343
+ if (v1Part < v2Part)
344
+ return -1;
345
+ }
346
+ return 0;
347
+ }
348
+ /**
349
+ * Map browser name to web-features format
350
+ */
351
+ mapBrowserName(browser) {
352
+ const browserMap = {
353
+ 'chrome': 'chrome',
354
+ 'firefox': 'firefox',
355
+ 'safari': 'safari',
356
+ 'edge': 'edge',
357
+ 'opera': 'opera',
358
+ 'samsung': 'samsung_android'
359
+ };
360
+ return browserMap[browser] || browser;
361
+ }
362
+ /**
363
+ * Create a violation object
364
+ */
365
+ createViolation(detectedFeature, target, featureData, featureId) {
366
+ const browserKey = this.mapBrowserName(target.browser);
367
+ const support = featureData?.status?.support;
368
+ const browserSupport = support ? support[browserKey] : undefined;
369
+ const baselineStatus = featureData?.status?.baseline;
370
+ let actual = false;
371
+ if (browserSupport === true) {
372
+ actual = 'supported';
373
+ }
374
+ else if (typeof browserSupport === 'string') {
375
+ actual = browserSupport;
376
+ }
377
+ else if (typeof browserSupport === 'object' && browserSupport?.version) {
378
+ actual = browserSupport.version;
379
+ }
380
+ let reason = '';
381
+ if (target.minVersion === 'baseline' || target.minVersion === 'baseline-newly') {
382
+ if (baselineStatus === false) {
383
+ reason = 'Feature is not part of Baseline (not supported across all major browsers)';
384
+ }
385
+ else if (baselineStatus === 'limited') {
386
+ reason = 'Feature has limited Baseline support';
387
+ }
388
+ }
389
+ else {
390
+ reason = `Feature requires ${target.browser} ${actual || 'unknown'} but target is ${target.minVersion}`;
391
+ }
392
+ return {
393
+ feature: detectedFeature.feature,
394
+ featureId,
395
+ file: detectedFeature.file || 'unknown',
396
+ line: detectedFeature.line,
397
+ column: detectedFeature.column,
398
+ context: detectedFeature.context,
399
+ browser: target.browser,
400
+ required: target.minVersion,
401
+ actual,
402
+ baselineStatus: baselineStatus === false ? 'false' : baselineStatus === true ? 'widely' : String(baselineStatus || 'unknown'),
403
+ reason
404
+ };
405
+ }
406
+ /**
407
+ * Check compatibility of a detected feature against browser targets
408
+ */
409
+ async checkCompatibility(detectedFeature, targets) {
410
+ const featureId = this.mapFeatureToId(detectedFeature.feature);
411
+ if (!featureId) {
412
+ // Feature not found in mapping, assume it's compatible
413
+ return {
414
+ violations: [],
415
+ featureData: null
416
+ };
417
+ }
418
+ const featureData = await this.getFeatureStatus(featureId);
419
+ if (!featureData) {
420
+ // Feature not found in web-features, assume it's compatible
421
+ return {
422
+ violations: [],
423
+ featureData: null
424
+ };
425
+ }
426
+ const violations = [];
427
+ for (const target of targets) {
428
+ if (target.minVersion === 'baseline' || target.minVersion === 'baseline-newly') {
429
+ // Check baseline status
430
+ const baselineStatus = featureData.status?.baseline;
431
+ if (baselineStatus === false) {
432
+ violations.push(this.createViolation(detectedFeature, target, featureData, featureId));
433
+ }
434
+ else if (target.minVersion === 'baseline-newly' && baselineStatus === 'low') {
435
+ violations.push(this.createViolation(detectedFeature, target, featureData, featureId));
436
+ }
437
+ }
438
+ else {
439
+ // Check specific version - map browser names to web-features format
440
+ const browserKey = this.mapBrowserName(target.browser);
441
+ const support = featureData.status?.support;
442
+ const browserSupport = support ? support[browserKey] : undefined;
443
+ if (!this.isVersionSupported(browserSupport, target.minVersion)) {
444
+ violations.push(this.createViolation(detectedFeature, target, featureData, featureId));
445
+ }
446
+ }
447
+ }
448
+ return {
449
+ violations,
450
+ featureData
451
+ };
452
+ }
453
+ /**
454
+ * Check multiple features against browser targets with memory optimization
455
+ */
456
+ async checkMultipleFeatures(detectedFeatures, targets) {
457
+ const violationTracker = MemoryManager.createViolationTracker();
458
+ // Process in batches to manage memory usage
459
+ await MemoryManager.processBatches(detectedFeatures, async (batch) => {
460
+ const batchResults = await Promise.all(batch.map(feature => this.checkCompatibility(feature, targets)));
461
+ for (const result of batchResults) {
462
+ for (const violation of result.violations) {
463
+ violationTracker.addViolation(violation);
464
+ }
465
+ }
466
+ return [];
467
+ }, 50 // Process 50 features at a time
468
+ );
469
+ return violationTracker.getViolations();
470
+ }
471
+ /**
472
+ * Get available feature IDs for debugging/testing
473
+ */
474
+ async getAvailableFeatureIds() {
475
+ await this.ensureInitialized();
476
+ return Object.keys(this.webFeatures?.features || this.webFeatures || {});
477
+ }
478
+ /**
479
+ * Clear caches to free memory
480
+ */
481
+ clearCache() {
482
+ this.featureCache.clear();
483
+ }
484
+ /**
485
+ * Get cache statistics
486
+ */
487
+ getCacheStats() {
488
+ const cacheSize = this.featureCache.size;
489
+ const memoryEstimate = `${Math.round(cacheSize * 500 / 1024)}KB`; // Rough estimate
490
+ return {
491
+ cacheSize,
492
+ memoryEstimate
493
+ };
494
+ }
495
+ /**
496
+ * Get feature mapping for debugging/testing
497
+ */
498
+ getFeatureMapping() {
499
+ return { ...FEATURE_ID_MAP };
500
+ }
501
+ }
502
+ //# sourceMappingURL=baseline-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline-checker.js","sourceRoot":"","sources":["../../src/core/baseline-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import type { DetectedFeature } from '../types/index.js';
2
+ /**
3
+ * LRU Cache implementation for web-features data and parsing results
4
+ */
5
+ export declare class LRUCache<K, V> {
6
+ private cache;
7
+ private readonly maxSize;
8
+ constructor(maxSize?: number);
9
+ get(key: K): V | undefined;
10
+ set(key: K, value: V): void;
11
+ has(key: K): boolean;
12
+ clear(): void;
13
+ size(): number;
14
+ }
15
+ /**
16
+ * Cache manager for efficient file processing and incremental scanning
17
+ */
18
+ export declare class CacheManager {
19
+ private readonly parseCache;
20
+ private readonly webFeaturesCache;
21
+ private readonly fileMetadataCache;
22
+ private readonly maxCacheSize;
23
+ private readonly cacheValidityMs;
24
+ constructor(options?: {
25
+ maxCacheSize?: number;
26
+ cacheValidityMs?: number;
27
+ });
28
+ /**
29
+ * Get cached parsing result if file hasn't changed
30
+ */
31
+ getCachedParseResult(filePath: string): Promise<DetectedFeature[] | null>;
32
+ /**
33
+ * Cache parsing result
34
+ */
35
+ setCachedParseResult(filePath: string, features: DetectedFeature[]): Promise<void>;
36
+ /**
37
+ * Get cached web-features data
38
+ */
39
+ getCachedWebFeature(featureId: string): any | null;
40
+ /**
41
+ * Cache web-features data
42
+ */
43
+ setCachedWebFeature(featureId: string, data: any): void;
44
+ /**
45
+ * Check if files have changed since last scan
46
+ */
47
+ getChangedFiles(filePaths: string[]): Promise<{
48
+ changed: string[];
49
+ unchanged: string[];
50
+ }>;
51
+ /**
52
+ * Clear all caches
53
+ */
54
+ clearAll(): void;
55
+ /**
56
+ * Clear expired cache entries
57
+ */
58
+ clearExpired(): void;
59
+ /**
60
+ * Get cache statistics
61
+ */
62
+ getStats(): {
63
+ parseCache: {
64
+ size: number;
65
+ maxSize: number;
66
+ };
67
+ webFeaturesCache: {
68
+ size: number;
69
+ maxSize: number;
70
+ };
71
+ fileMetadataCache: {
72
+ size: number;
73
+ };
74
+ };
75
+ /**
76
+ * Get file metadata for change detection
77
+ */
78
+ private getFileMetadata;
79
+ /**
80
+ * Check if file has changed based on metadata
81
+ */
82
+ private hasFileChanged;
83
+ /**
84
+ * Generate hash for file identification
85
+ */
86
+ private generateFileHash;
87
+ }
88
+ //# sourceMappingURL=cache-manager.d.ts.map