@sudosandwich/limps-headless 0.1.3

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 (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +339 -0
  3. package/bin/limps-headless +2 -0
  4. package/dist/analysis/index.d.ts +6 -0
  5. package/dist/analysis/index.d.ts.map +1 -0
  6. package/dist/analysis/index.js +6 -0
  7. package/dist/analysis/index.js.map +1 -0
  8. package/dist/analysis/ir/build-ir.d.ts +10 -0
  9. package/dist/analysis/ir/build-ir.d.ts.map +1 -0
  10. package/dist/analysis/ir/build-ir.js +102 -0
  11. package/dist/analysis/ir/build-ir.js.map +1 -0
  12. package/dist/analysis/ir/types.d.ts +44 -0
  13. package/dist/analysis/ir/types.d.ts.map +1 -0
  14. package/dist/analysis/ir/types.js +2 -0
  15. package/dist/analysis/ir/types.js.map +1 -0
  16. package/dist/analysis/module-graph.d.ts +20 -0
  17. package/dist/analysis/module-graph.d.ts.map +1 -0
  18. package/dist/analysis/module-graph.js +104 -0
  19. package/dist/analysis/module-graph.js.map +1 -0
  20. package/dist/analysis/passes/behavior-evidence.d.ts +9 -0
  21. package/dist/analysis/passes/behavior-evidence.d.ts.map +1 -0
  22. package/dist/analysis/passes/behavior-evidence.js +80 -0
  23. package/dist/analysis/passes/behavior-evidence.js.map +1 -0
  24. package/dist/analysis/passes/import-evidence.d.ts +3 -0
  25. package/dist/analysis/passes/import-evidence.d.ts.map +1 -0
  26. package/dist/analysis/passes/import-evidence.js +58 -0
  27. package/dist/analysis/passes/import-evidence.js.map +1 -0
  28. package/dist/analysis/passes/index.d.ts +15 -0
  29. package/dist/analysis/passes/index.d.ts.map +1 -0
  30. package/dist/analysis/passes/index.js +21 -0
  31. package/dist/analysis/passes/index.js.map +1 -0
  32. package/dist/analysis/passes/jsx-evidence.d.ts +8 -0
  33. package/dist/analysis/passes/jsx-evidence.d.ts.map +1 -0
  34. package/dist/analysis/passes/jsx-evidence.js +149 -0
  35. package/dist/analysis/passes/jsx-evidence.js.map +1 -0
  36. package/dist/analysis/ts-program.d.ts +12 -0
  37. package/dist/analysis/ts-program.d.ts.map +1 -0
  38. package/dist/analysis/ts-program.js +59 -0
  39. package/dist/analysis/ts-program.js.map +1 -0
  40. package/dist/analyzer/disambiguator.d.ts +20 -0
  41. package/dist/analyzer/disambiguator.d.ts.map +1 -0
  42. package/dist/analyzer/disambiguator.js +83 -0
  43. package/dist/analyzer/disambiguator.js.map +1 -0
  44. package/dist/analyzer/index.d.ts +26 -0
  45. package/dist/analyzer/index.d.ts.map +1 -0
  46. package/dist/analyzer/index.js +68 -0
  47. package/dist/analyzer/index.js.map +1 -0
  48. package/dist/analyzer/parser.d.ts +23 -0
  49. package/dist/analyzer/parser.d.ts.map +1 -0
  50. package/dist/analyzer/parser.js +58 -0
  51. package/dist/analyzer/parser.js.map +1 -0
  52. package/dist/analyzer/patterns.d.ts +42 -0
  53. package/dist/analyzer/patterns.d.ts.map +1 -0
  54. package/dist/analyzer/patterns.js +206 -0
  55. package/dist/analyzer/patterns.js.map +1 -0
  56. package/dist/analyzer/props.d.ts +16 -0
  57. package/dist/analyzer/props.d.ts.map +1 -0
  58. package/dist/analyzer/props.js +235 -0
  59. package/dist/analyzer/props.js.map +1 -0
  60. package/dist/analyzer/rules/checkbox-switch-toggle.d.ts +10 -0
  61. package/dist/analyzer/rules/checkbox-switch-toggle.d.ts.map +1 -0
  62. package/dist/analyzer/rules/checkbox-switch-toggle.js +26 -0
  63. package/dist/analyzer/rules/checkbox-switch-toggle.js.map +1 -0
  64. package/dist/analyzer/rules/dialog-popover.d.ts +10 -0
  65. package/dist/analyzer/rules/dialog-popover.d.ts.map +1 -0
  66. package/dist/analyzer/rules/dialog-popover.js +25 -0
  67. package/dist/analyzer/rules/dialog-popover.js.map +1 -0
  68. package/dist/analyzer/rules/index.d.ts +24 -0
  69. package/dist/analyzer/rules/index.d.ts.map +1 -0
  70. package/dist/analyzer/rules/index.js +51 -0
  71. package/dist/analyzer/rules/index.js.map +1 -0
  72. package/dist/analyzer/rules/tooltip-hovercard.d.ts +10 -0
  73. package/dist/analyzer/rules/tooltip-hovercard.d.ts.map +1 -0
  74. package/dist/analyzer/rules/tooltip-hovercard.js +21 -0
  75. package/dist/analyzer/rules/tooltip-hovercard.js.map +1 -0
  76. package/dist/analyzer/scorer.d.ts +12 -0
  77. package/dist/analyzer/scorer.d.ts.map +1 -0
  78. package/dist/analyzer/scorer.js +171 -0
  79. package/dist/analyzer/scorer.js.map +1 -0
  80. package/dist/analyzer/weights.d.ts +28 -0
  81. package/dist/analyzer/weights.d.ts.map +1 -0
  82. package/dist/analyzer/weights.js +40 -0
  83. package/dist/analyzer/weights.js.map +1 -0
  84. package/dist/audit/analyses/migration.d.ts +42 -0
  85. package/dist/audit/analyses/migration.d.ts.map +1 -0
  86. package/dist/audit/analyses/migration.js +91 -0
  87. package/dist/audit/analyses/migration.js.map +1 -0
  88. package/dist/audit/discover-components.d.ts +7 -0
  89. package/dist/audit/discover-components.d.ts.map +1 -0
  90. package/dist/audit/discover-components.js +486 -0
  91. package/dist/audit/discover-components.js.map +1 -0
  92. package/dist/audit/generate-report.d.ts +28 -0
  93. package/dist/audit/generate-report.d.ts.map +1 -0
  94. package/dist/audit/generate-report.js +333 -0
  95. package/dist/audit/generate-report.js.map +1 -0
  96. package/dist/audit/index.d.ts +8 -0
  97. package/dist/audit/index.d.ts.map +1 -0
  98. package/dist/audit/index.js +8 -0
  99. package/dist/audit/index.js.map +1 -0
  100. package/dist/audit/run-audit.d.ts +33 -0
  101. package/dist/audit/run-audit.d.ts.map +1 -0
  102. package/dist/audit/run-audit.js +287 -0
  103. package/dist/audit/run-audit.js.map +1 -0
  104. package/dist/audit/types.d.ts +135 -0
  105. package/dist/audit/types.d.ts.map +1 -0
  106. package/dist/audit/types.js +5 -0
  107. package/dist/audit/types.js.map +1 -0
  108. package/dist/cache/index.d.ts +110 -0
  109. package/dist/cache/index.d.ts.map +1 -0
  110. package/dist/cache/index.js +176 -0
  111. package/dist/cache/index.js.map +1 -0
  112. package/dist/cache/storage.d.ts +73 -0
  113. package/dist/cache/storage.d.ts.map +1 -0
  114. package/dist/cache/storage.js +176 -0
  115. package/dist/cache/storage.js.map +1 -0
  116. package/dist/cache/ttl.d.ts +62 -0
  117. package/dist/cache/ttl.d.ts.map +1 -0
  118. package/dist/cache/ttl.js +96 -0
  119. package/dist/cache/ttl.js.map +1 -0
  120. package/dist/cli/commands/analyze.d.ts +6 -0
  121. package/dist/cli/commands/analyze.d.ts.map +1 -0
  122. package/dist/cli/commands/analyze.js +43 -0
  123. package/dist/cli/commands/analyze.js.map +1 -0
  124. package/dist/cli/commands/audit.d.ts +6 -0
  125. package/dist/cli/commands/audit.d.ts.map +1 -0
  126. package/dist/cli/commands/audit.js +73 -0
  127. package/dist/cli/commands/audit.js.map +1 -0
  128. package/dist/cli/commands/check-updates.d.ts +6 -0
  129. package/dist/cli/commands/check-updates.d.ts.map +1 -0
  130. package/dist/cli/commands/check-updates.js +34 -0
  131. package/dist/cli/commands/check-updates.js.map +1 -0
  132. package/dist/cli/commands/diff.d.ts +7 -0
  133. package/dist/cli/commands/diff.d.ts.map +1 -0
  134. package/dist/cli/commands/diff.js +48 -0
  135. package/dist/cli/commands/diff.js.map +1 -0
  136. package/dist/cli/commands/extract.d.ts +6 -0
  137. package/dist/cli/commands/extract.d.ts.map +1 -0
  138. package/dist/cli/commands/extract.js +42 -0
  139. package/dist/cli/commands/extract.js.map +1 -0
  140. package/dist/cli/commands/list.d.ts +6 -0
  141. package/dist/cli/commands/list.d.ts.map +1 -0
  142. package/dist/cli/commands/list.js +33 -0
  143. package/dist/cli/commands/list.js.map +1 -0
  144. package/dist/cli/flags.d.ts +9 -0
  145. package/dist/cli/flags.d.ts.map +1 -0
  146. package/dist/cli/flags.js +22 -0
  147. package/dist/cli/flags.js.map +1 -0
  148. package/dist/cli/index.d.ts +5 -0
  149. package/dist/cli/index.d.ts.map +1 -0
  150. package/dist/cli/index.js +40 -0
  151. package/dist/cli/index.js.map +1 -0
  152. package/dist/config.d.ts +19 -0
  153. package/dist/config.d.ts.map +1 -0
  154. package/dist/config.js +23 -0
  155. package/dist/config.js.map +1 -0
  156. package/dist/differ/hints.d.ts +21 -0
  157. package/dist/differ/hints.d.ts.map +1 -0
  158. package/dist/differ/hints.js +105 -0
  159. package/dist/differ/hints.js.map +1 -0
  160. package/dist/differ/index.d.ts +25 -0
  161. package/dist/differ/index.d.ts.map +1 -0
  162. package/dist/differ/index.js +115 -0
  163. package/dist/differ/index.js.map +1 -0
  164. package/dist/differ/props.d.ts +36 -0
  165. package/dist/differ/props.d.ts.map +1 -0
  166. package/dist/differ/props.js +210 -0
  167. package/dist/differ/props.js.map +1 -0
  168. package/dist/differ/severity.d.ts +31 -0
  169. package/dist/differ/severity.d.ts.map +1 -0
  170. package/dist/differ/severity.js +65 -0
  171. package/dist/differ/severity.js.map +1 -0
  172. package/dist/differ/types.d.ts +109 -0
  173. package/dist/differ/types.d.ts.map +1 -0
  174. package/dist/differ/types.js +5 -0
  175. package/dist/differ/types.js.map +1 -0
  176. package/dist/extractor/classifier.d.ts +30 -0
  177. package/dist/extractor/classifier.d.ts.map +1 -0
  178. package/dist/extractor/classifier.js +150 -0
  179. package/dist/extractor/classifier.js.map +1 -0
  180. package/dist/extractor/forward-ref.d.ts +28 -0
  181. package/dist/extractor/forward-ref.d.ts.map +1 -0
  182. package/dist/extractor/forward-ref.js +134 -0
  183. package/dist/extractor/forward-ref.js.map +1 -0
  184. package/dist/extractor/index.d.ts +25 -0
  185. package/dist/extractor/index.d.ts.map +1 -0
  186. package/dist/extractor/index.js +43 -0
  187. package/dist/extractor/index.js.map +1 -0
  188. package/dist/extractor/interface.d.ts +40 -0
  189. package/dist/extractor/interface.d.ts.map +1 -0
  190. package/dist/extractor/interface.js +233 -0
  191. package/dist/extractor/interface.js.map +1 -0
  192. package/dist/extractor/jsdoc.d.ts +24 -0
  193. package/dist/extractor/jsdoc.d.ts.map +1 -0
  194. package/dist/extractor/jsdoc.js +74 -0
  195. package/dist/extractor/jsdoc.js.map +1 -0
  196. package/dist/extractor/project.d.ts +17 -0
  197. package/dist/extractor/project.d.ts.map +1 -0
  198. package/dist/extractor/project.js +33 -0
  199. package/dist/extractor/project.js.map +1 -0
  200. package/dist/extractor/props.d.ts +24 -0
  201. package/dist/extractor/props.d.ts.map +1 -0
  202. package/dist/extractor/props.js +78 -0
  203. package/dist/extractor/props.js.map +1 -0
  204. package/dist/extractor/type-resolver.d.ts +32 -0
  205. package/dist/extractor/type-resolver.d.ts.map +1 -0
  206. package/dist/extractor/type-resolver.js +129 -0
  207. package/dist/extractor/type-resolver.js.map +1 -0
  208. package/dist/fetcher/index.d.ts +7 -0
  209. package/dist/fetcher/index.d.ts.map +1 -0
  210. package/dist/fetcher/index.js +7 -0
  211. package/dist/fetcher/index.js.map +1 -0
  212. package/dist/fetcher/npm-registry.d.ts +45 -0
  213. package/dist/fetcher/npm-registry.d.ts.map +1 -0
  214. package/dist/fetcher/npm-registry.js +217 -0
  215. package/dist/fetcher/npm-registry.js.map +1 -0
  216. package/dist/fetcher/unified-package.d.ts +27 -0
  217. package/dist/fetcher/unified-package.d.ts.map +1 -0
  218. package/dist/fetcher/unified-package.js +99 -0
  219. package/dist/fetcher/unified-package.js.map +1 -0
  220. package/dist/fetcher/unpkg.d.ts +20 -0
  221. package/dist/fetcher/unpkg.d.ts.map +1 -0
  222. package/dist/fetcher/unpkg.js +58 -0
  223. package/dist/fetcher/unpkg.js.map +1 -0
  224. package/dist/index.d.ts +18 -0
  225. package/dist/index.d.ts.map +1 -0
  226. package/dist/index.js +41 -0
  227. package/dist/index.js.map +1 -0
  228. package/dist/providers/base.d.ts +10 -0
  229. package/dist/providers/base.d.ts.map +1 -0
  230. package/dist/providers/base.js +80 -0
  231. package/dist/providers/base.js.map +1 -0
  232. package/dist/providers/index.d.ts +10 -0
  233. package/dist/providers/index.d.ts.map +1 -0
  234. package/dist/providers/index.js +10 -0
  235. package/dist/providers/index.js.map +1 -0
  236. package/dist/providers/interface.d.ts +56 -0
  237. package/dist/providers/interface.d.ts.map +1 -0
  238. package/dist/providers/interface.js +5 -0
  239. package/dist/providers/interface.js.map +1 -0
  240. package/dist/providers/radix-backend.d.ts +11 -0
  241. package/dist/providers/radix-backend.d.ts.map +1 -0
  242. package/dist/providers/radix-backend.js +107 -0
  243. package/dist/providers/radix-backend.js.map +1 -0
  244. package/dist/providers/radix.d.ts +6 -0
  245. package/dist/providers/radix.d.ts.map +1 -0
  246. package/dist/providers/radix.js +21 -0
  247. package/dist/providers/radix.js.map +1 -0
  248. package/dist/providers/registry.d.ts +17 -0
  249. package/dist/providers/registry.d.ts.map +1 -0
  250. package/dist/providers/registry.js +55 -0
  251. package/dist/providers/registry.js.map +1 -0
  252. package/dist/rules/engine.d.ts +4 -0
  253. package/dist/rules/engine.d.ts.map +1 -0
  254. package/dist/rules/engine.js +37 -0
  255. package/dist/rules/engine.js.map +1 -0
  256. package/dist/rules/index.d.ts +6 -0
  257. package/dist/rules/index.d.ts.map +1 -0
  258. package/dist/rules/index.js +6 -0
  259. package/dist/rules/index.js.map +1 -0
  260. package/dist/rules/predicates.d.ts +10 -0
  261. package/dist/rules/predicates.d.ts.map +1 -0
  262. package/dist/rules/predicates.js +93 -0
  263. package/dist/rules/predicates.js.map +1 -0
  264. package/dist/rules/rulesets/base-ui.d.ts +3 -0
  265. package/dist/rules/rulesets/base-ui.d.ts.map +1 -0
  266. package/dist/rules/rulesets/base-ui.js +65 -0
  267. package/dist/rules/rulesets/base-ui.js.map +1 -0
  268. package/dist/rules/rulesets/radix-legacy.d.ts +3 -0
  269. package/dist/rules/rulesets/radix-legacy.d.ts.map +1 -0
  270. package/dist/rules/rulesets/radix-legacy.js +38 -0
  271. package/dist/rules/rulesets/radix-legacy.js.map +1 -0
  272. package/dist/rules/types.d.ts +57 -0
  273. package/dist/rules/types.d.ts.map +1 -0
  274. package/dist/rules/types.js +2 -0
  275. package/dist/rules/types.js.map +1 -0
  276. package/dist/signatures/disambiguation.d.ts +30 -0
  277. package/dist/signatures/disambiguation.d.ts.map +1 -0
  278. package/dist/signatures/disambiguation.js +99 -0
  279. package/dist/signatures/disambiguation.js.map +1 -0
  280. package/dist/signatures/distinguishing.d.ts +29 -0
  281. package/dist/signatures/distinguishing.d.ts.map +1 -0
  282. package/dist/signatures/distinguishing.js +108 -0
  283. package/dist/signatures/distinguishing.js.map +1 -0
  284. package/dist/signatures/generator.d.ts +20 -0
  285. package/dist/signatures/generator.d.ts.map +1 -0
  286. package/dist/signatures/generator.js +147 -0
  287. package/dist/signatures/generator.js.map +1 -0
  288. package/dist/signatures/index.d.ts +10 -0
  289. package/dist/signatures/index.d.ts.map +1 -0
  290. package/dist/signatures/index.js +10 -0
  291. package/dist/signatures/index.js.map +1 -0
  292. package/dist/signatures/inference.d.ts +37 -0
  293. package/dist/signatures/inference.d.ts.map +1 -0
  294. package/dist/signatures/inference.js +132 -0
  295. package/dist/signatures/inference.js.map +1 -0
  296. package/dist/tools/analyze-component.d.ts +41 -0
  297. package/dist/tools/analyze-component.d.ts.map +1 -0
  298. package/dist/tools/analyze-component.js +274 -0
  299. package/dist/tools/analyze-component.js.map +1 -0
  300. package/dist/tools/check-updates.d.ts +33 -0
  301. package/dist/tools/check-updates.d.ts.map +1 -0
  302. package/dist/tools/check-updates.js +81 -0
  303. package/dist/tools/check-updates.js.map +1 -0
  304. package/dist/tools/diff-versions.d.ts +39 -0
  305. package/dist/tools/diff-versions.d.ts.map +1 -0
  306. package/dist/tools/diff-versions.js +78 -0
  307. package/dist/tools/diff-versions.js.map +1 -0
  308. package/dist/tools/extract-primitive.d.ts +50 -0
  309. package/dist/tools/extract-primitive.d.ts.map +1 -0
  310. package/dist/tools/extract-primitive.js +145 -0
  311. package/dist/tools/extract-primitive.js.map +1 -0
  312. package/dist/tools/generate-report.d.ts +29 -0
  313. package/dist/tools/generate-report.d.ts.map +1 -0
  314. package/dist/tools/generate-report.js +36 -0
  315. package/dist/tools/generate-report.js.map +1 -0
  316. package/dist/tools/index.d.ts +11 -0
  317. package/dist/tools/index.d.ts.map +1 -0
  318. package/dist/tools/index.js +11 -0
  319. package/dist/tools/index.js.map +1 -0
  320. package/dist/tools/list-primitives.d.ts +41 -0
  321. package/dist/tools/list-primitives.d.ts.map +1 -0
  322. package/dist/tools/list-primitives.js +74 -0
  323. package/dist/tools/list-primitives.js.map +1 -0
  324. package/dist/tools/run-audit.d.ts +43 -0
  325. package/dist/tools/run-audit.d.ts.map +1 -0
  326. package/dist/tools/run-audit.js +60 -0
  327. package/dist/tools/run-audit.js.map +1 -0
  328. package/dist/types/index.d.ts +143 -0
  329. package/dist/types/index.d.ts.map +1 -0
  330. package/dist/types/index.js +5 -0
  331. package/dist/types/index.js.map +1 -0
  332. package/docs/architecture.md +88 -0
  333. package/docs/providers.md +47 -0
  334. package/docs/tools.md +143 -0
  335. package/package.json +59 -0
@@ -0,0 +1,37 @@
1
+ import { evaluatePredicate } from './predicates.js';
2
+ export function evaluateRuleset(ir, ruleset) {
3
+ let score = 0;
4
+ const matches = [];
5
+ for (const rule of ruleset.rules) {
6
+ const result = evaluatePredicate(ir, rule.predicate);
7
+ const matched = result.matched;
8
+ const ruleScore = matched ? rule.weight : 0;
9
+ if (matched) {
10
+ score += ruleScore;
11
+ }
12
+ matches.push({
13
+ ruleId: rule.id,
14
+ matched,
15
+ score: ruleScore,
16
+ evidenceIds: result.evidenceIds,
17
+ });
18
+ }
19
+ let classification = 'none';
20
+ if (score >= ruleset.thresholds.strong) {
21
+ classification = 'strong';
22
+ }
23
+ else if (score >= ruleset.thresholds.possible) {
24
+ classification = 'possible';
25
+ }
26
+ const confidence = ruleset.thresholds.strong > 0
27
+ ? Math.min(1, score / ruleset.thresholds.strong)
28
+ : 0;
29
+ return {
30
+ classification,
31
+ confidence,
32
+ score,
33
+ matches,
34
+ evidence: ir.evidence,
35
+ };
36
+ }
37
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,UAAU,eAAe,CAAC,EAAe,EAAE,OAAgB;IAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,GAAgB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,IAAI,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO;YACP,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,cAAc,GAAuC,MAAM,CAAC;IAChE,IAAI,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACvC,cAAc,GAAG,QAAQ,CAAC;IAC5B,CAAC;SAAM,IAAI,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAChD,cAAc,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAChD,CAAC,CAAC,CAAC,CAAC;IAER,OAAO;QACL,cAAc;QACd,UAAU;QACV,KAAK;QACL,OAAO;QACP,QAAQ,EAAE,EAAE,CAAC,QAAQ;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './types.js';
2
+ export * from './predicates.js';
3
+ export * from './engine.js';
4
+ export * from './rulesets/base-ui.js';
5
+ export * from './rulesets/radix-legacy.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './types.js';
2
+ export * from './predicates.js';
3
+ export * from './engine.js';
4
+ export * from './rulesets/base-ui.js';
5
+ export * from './rulesets/radix-legacy.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ComponentIR } from '../analysis/ir/types.js';
2
+ import type { Condition, Predicate } from './types.js';
3
+ interface ConditionResult {
4
+ matched: boolean;
5
+ evidenceIds: string[];
6
+ }
7
+ export declare function evaluateCondition(ir: ComponentIR, condition: Condition): ConditionResult;
8
+ export declare function evaluatePredicate(ir: ComponentIR, predicate: Predicate): ConditionResult;
9
+ export {};
10
+ //# sourceMappingURL=predicates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicates.d.ts","sourceRoot":"","sources":["../../src/rules/predicates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA4BD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,eAAe,CAsCxF;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,eAAe,CAyCxF"}
@@ -0,0 +1,93 @@
1
+ function evidenceIdForImport(source) {
2
+ if (source.startsWith('@base-ui/react/')) {
3
+ return `import:base-ui:${source.slice('@base-ui/react/'.length)}`;
4
+ }
5
+ if (source.startsWith('@base-ui/')) {
6
+ return `import:base-ui:${source.slice('@base-ui/'.length)}`;
7
+ }
8
+ if (source === 'radix-ui') {
9
+ return 'import:radix-ui:radix-ui';
10
+ }
11
+ if (source.startsWith('@radix-ui/react-')) {
12
+ return `import:radix-ui:${source.slice('@radix-ui/react-'.length)}`;
13
+ }
14
+ if (source.startsWith('@radix-ui/')) {
15
+ return `import:radix-ui:${source.slice('@radix-ui/'.length)}`;
16
+ }
17
+ return null;
18
+ }
19
+ function matchEvidence(evidenceIds, id) {
20
+ return {
21
+ matched: evidenceIds.has(id),
22
+ evidenceIds: evidenceIds.has(id) ? [id] : [],
23
+ };
24
+ }
25
+ export function evaluateCondition(ir, condition) {
26
+ const evidenceIds = new Set(ir.evidence.map((entry) => entry.id));
27
+ if ('evidenceId' in condition) {
28
+ return matchEvidence(evidenceIds, condition.evidenceId);
29
+ }
30
+ if ('importSource' in condition) {
31
+ const matches = ir.imports.some((spec) => spec.source === condition.importSource);
32
+ const derivedId = evidenceIdForImport(condition.importSource);
33
+ if (matches && derivedId) {
34
+ return matchEvidence(evidenceIds, derivedId);
35
+ }
36
+ return { matched: matches, evidenceIds: matches && derivedId ? [derivedId] : [] };
37
+ }
38
+ if ('jsxElement' in condition) {
39
+ const matched = ir.jsx.elements.includes(condition.jsxElement);
40
+ return { matched, evidenceIds: matched ? [`jsx:${condition.jsxElement}`] : [] };
41
+ }
42
+ if ('role' in condition) {
43
+ return matchEvidence(evidenceIds, `role:${condition.role}`);
44
+ }
45
+ if ('dataAttr' in condition) {
46
+ return matchEvidence(evidenceIds, `data-attr:${condition.dataAttr}`);
47
+ }
48
+ if ('behavior' in condition) {
49
+ return matchEvidence(evidenceIds, `behavior:${condition.behavior}`);
50
+ }
51
+ if ('typeRef' in condition) {
52
+ return { matched: false, evidenceIds: [] };
53
+ }
54
+ return { matched: false, evidenceIds: [] };
55
+ }
56
+ export function evaluatePredicate(ir, predicate) {
57
+ const evidenceIds = [];
58
+ if (!predicate.any && !predicate.all && !predicate.not) {
59
+ return { matched: false, evidenceIds };
60
+ }
61
+ if (predicate.all) {
62
+ for (const condition of predicate.all) {
63
+ const result = evaluateCondition(ir, condition);
64
+ if (!result.matched) {
65
+ return { matched: false, evidenceIds: [] };
66
+ }
67
+ evidenceIds.push(...result.evidenceIds);
68
+ }
69
+ }
70
+ if (predicate.any) {
71
+ let matchedAny = false;
72
+ const anyEvidence = [];
73
+ for (const condition of predicate.any) {
74
+ const result = evaluateCondition(ir, condition);
75
+ if (result.matched) {
76
+ matchedAny = true;
77
+ anyEvidence.push(...result.evidenceIds);
78
+ }
79
+ }
80
+ if (!matchedAny) {
81
+ return { matched: false, evidenceIds: [] };
82
+ }
83
+ evidenceIds.push(...anyEvidence);
84
+ }
85
+ if (predicate.not) {
86
+ const result = evaluateCondition(ir, predicate.not);
87
+ if (result.matched) {
88
+ return { matched: false, evidenceIds: [] };
89
+ }
90
+ }
91
+ return { matched: true, evidenceIds };
92
+ }
93
+ //# sourceMappingURL=predicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/rules/predicates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Ruleset } from '../types.js';
2
+ export declare const baseUiRuleset: Ruleset;
3
+ //# sourceMappingURL=base-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-ui.d.ts","sourceRoot":"","sources":["../../../src/rules/rulesets/base-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AA4DjD,eAAO,MAAM,aAAa,EAAE,OAU3B,CAAC"}
@@ -0,0 +1,65 @@
1
+ const BASE_IMPORTS = [
2
+ 'tabs',
3
+ 'select',
4
+ 'switch',
5
+ 'checkbox',
6
+ 'menu',
7
+ 'popover',
8
+ 'tooltip',
9
+ 'button',
10
+ 'scroll-area',
11
+ 'separator',
12
+ ];
13
+ const BASE_ROLES = [
14
+ 'tablist',
15
+ 'tab',
16
+ 'tabpanel',
17
+ 'menu',
18
+ 'menuitem',
19
+ 'listbox',
20
+ 'option',
21
+ 'switch',
22
+ 'checkbox',
23
+ ];
24
+ function importRule(module) {
25
+ return {
26
+ id: `base-ui/import-${module}`,
27
+ title: `Base UI import: ${module}`,
28
+ description: `Detects Base UI import for ${module}.`,
29
+ severity: 'medium',
30
+ weight: 3,
31
+ predicate: {
32
+ any: [{ evidenceId: `import:base-ui:${module}` }],
33
+ },
34
+ tags: ['base-ui', 'import'],
35
+ };
36
+ }
37
+ function roleRule(role) {
38
+ return {
39
+ id: `base-ui/role-${role}`,
40
+ title: `Base UI role evidence: ${role}`,
41
+ description: `Detects JSX role usage for ${role}.`,
42
+ severity: 'low',
43
+ weight: 1,
44
+ predicate: {
45
+ any: [{ role }],
46
+ },
47
+ tags: ['base-ui', 'role'],
48
+ };
49
+ }
50
+ const rules = [
51
+ ...BASE_IMPORTS.map(importRule),
52
+ ...BASE_ROLES.map(roleRule),
53
+ ];
54
+ export const baseUiRuleset = {
55
+ id: 'base-ui',
56
+ name: 'Base UI',
57
+ description: 'Detect Base UI usage via import and role evidence.',
58
+ version: '0.1.0',
59
+ rules,
60
+ thresholds: {
61
+ strong: 4,
62
+ possible: 2,
63
+ },
64
+ };
65
+ //# sourceMappingURL=base-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-ui.js","sourceRoot":"","sources":["../../../src/rules/rulesets/base-ui.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG;IACnB,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,MAAM;IACN,SAAS;IACT,SAAS;IACT,QAAQ;IACR,aAAa;IACb,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,GAAG;IACjB,SAAS;IACT,KAAK;IACL,UAAU;IACV,MAAM;IACN,UAAU;IACV,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,UAAU;CACX,CAAC;AAEF,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO;QACL,EAAE,EAAE,kBAAkB,MAAM,EAAE;QAC9B,KAAK,EAAE,mBAAmB,MAAM,EAAE;QAClC,WAAW,EAAE,8BAA8B,MAAM,GAAG;QACpD,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,CAAC;QACT,SAAS,EAAE;YACT,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,kBAAkB,MAAM,EAAE,EAAE,CAAC;SAClD;QACD,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO;QACL,EAAE,EAAE,gBAAgB,IAAI,EAAE;QAC1B,KAAK,EAAE,0BAA0B,IAAI,EAAE;QACvC,WAAW,EAAE,8BAA8B,IAAI,GAAG;QAClD,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,CAAC;QACT,SAAS,EAAE;YACT,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;SAChB;QACD,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAW;IACpB,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,oDAAoD;IACjE,OAAO,EAAE,OAAO;IAChB,KAAK;IACL,UAAU,EAAE;QACV,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;KACZ;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Ruleset } from '../types.js';
2
+ export declare const radixLegacyRuleset: Ruleset;
3
+ //# sourceMappingURL=radix-legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radix-legacy.d.ts","sourceRoot":"","sources":["../../../src/rules/rulesets/radix-legacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AA+BjD,eAAO,MAAM,kBAAkB,EAAE,OAUhC,CAAC"}
@@ -0,0 +1,38 @@
1
+ const RADIX_IMPORTS = [
2
+ 'dialog',
3
+ 'popover',
4
+ 'tooltip',
5
+ 'select',
6
+ 'tabs',
7
+ 'toast',
8
+ 'dropdown-menu',
9
+ 'context-menu',
10
+ 'checkbox',
11
+ 'switch',
12
+ ];
13
+ function importRule(module) {
14
+ return {
15
+ id: `radix-legacy/import-${module}`,
16
+ title: `Radix import: ${module}`,
17
+ description: `Detects Radix legacy import for ${module}.`,
18
+ severity: 'high',
19
+ weight: 3,
20
+ predicate: {
21
+ any: [{ evidenceId: `import:radix-ui:${module}` }],
22
+ },
23
+ tags: ['radix', 'legacy', 'import'],
24
+ };
25
+ }
26
+ const rules = [...RADIX_IMPORTS.map(importRule)];
27
+ export const radixLegacyRuleset = {
28
+ id: 'radix-legacy',
29
+ name: 'Radix Legacy',
30
+ description: 'Detect legacy Radix usage via import evidence.',
31
+ version: '0.1.0',
32
+ rules,
33
+ thresholds: {
34
+ strong: 4,
35
+ possible: 2,
36
+ },
37
+ };
38
+ //# sourceMappingURL=radix-legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radix-legacy.js","sourceRoot":"","sources":["../../../src/rules/rulesets/radix-legacy.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG;IACpB,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,eAAe;IACf,cAAc;IACd,UAAU;IACV,QAAQ;CACT,CAAC;AAEF,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO;QACL,EAAE,EAAE,uBAAuB,MAAM,EAAE;QACnC,KAAK,EAAE,iBAAiB,MAAM,EAAE;QAChC,WAAW,EAAE,mCAAmC,MAAM,GAAG;QACzD,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,CAAC;QACT,SAAS,EAAE;YACT,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,mBAAmB,MAAM,EAAE,EAAE,CAAC;SACnD;QACD,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAW,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAY;IACzC,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,gDAAgD;IAC7D,OAAO,EAAE,OAAO;IAChB,KAAK;IACL,UAAU,EAAE;QACV,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;KACZ;CACF,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { Evidence } from '../analysis/ir/types.js';
2
+ export type RuleSeverity = 'info' | 'low' | 'medium' | 'high' | 'critical';
3
+ export type Condition = {
4
+ evidenceId: string;
5
+ } | {
6
+ importSource: string;
7
+ } | {
8
+ jsxElement: string;
9
+ } | {
10
+ role: string;
11
+ } | {
12
+ dataAttr: string;
13
+ } | {
14
+ behavior: string;
15
+ } | {
16
+ typeRef: string;
17
+ };
18
+ export interface Predicate {
19
+ any?: Condition[];
20
+ all?: Condition[];
21
+ not?: Condition;
22
+ }
23
+ export interface Rule {
24
+ id: string;
25
+ title: string;
26
+ description: string;
27
+ severity: RuleSeverity;
28
+ weight: number;
29
+ predicate: Predicate;
30
+ tags?: string[];
31
+ }
32
+ export interface Ruleset {
33
+ id: string;
34
+ name: string;
35
+ description: string;
36
+ version: string;
37
+ rules: Rule[];
38
+ thresholds: {
39
+ strong: number;
40
+ possible: number;
41
+ };
42
+ }
43
+ export type Classification = 'strong' | 'possible' | 'none';
44
+ export interface RuleMatch {
45
+ ruleId: string;
46
+ matched: boolean;
47
+ score: number;
48
+ evidenceIds: string[];
49
+ }
50
+ export interface EvaluationResult {
51
+ classification: Classification;
52
+ confidence: number;
53
+ score: number;
54
+ matches: RuleMatch[];
55
+ evidence: Evidence[];
56
+ }
57
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3E,MAAM,MAAM,SAAS,GACjB;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GACtB;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GACxB;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpB;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpB;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Disambiguation rules for similar Radix primitives.
3
+ * Helps differentiate between primitives with similar APIs.
4
+ */
5
+ /**
6
+ * Get primitives that are similar to the given primitive.
7
+ * @param primitiveName - Name of the Radix primitive
8
+ * @returns Array of similar primitive names
9
+ */
10
+ export declare function getSimilarPrimitives(primitiveName: string): string[];
11
+ /**
12
+ * Get the disambiguation rule for a primitive.
13
+ * @param primitiveName - Name of the Radix primitive
14
+ * @returns Human-readable disambiguation rule, or undefined if none
15
+ */
16
+ export declare function getDisambiguationRule(primitiveName: string): string | undefined;
17
+ /**
18
+ * Get all primitives in the same similarity group.
19
+ * @param primitiveName - Name of the Radix primitive
20
+ * @returns Array including the primitive and all similar ones
21
+ */
22
+ export declare function getSimilarityGroup(primitiveName: string): string[];
23
+ /**
24
+ * Check if two primitives are in the same similarity group.
25
+ * @param primitive1 - First primitive name
26
+ * @param primitive2 - Second primitive name
27
+ * @returns True if they are similar
28
+ */
29
+ export declare function areSimilar(primitive1: string, primitive2: string): boolean;
30
+ //# sourceMappingURL=disambiguation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disambiguation.d.ts","sourceRoot":"","sources":["../../src/signatures/disambiguation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyFH;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAMlE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAG1E"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Disambiguation rules for similar Radix primitives.
3
+ * Helps differentiate between primitives with similar APIs.
4
+ */
5
+ /**
6
+ * Groups of primitives that are similar and may be confused.
7
+ * Each group maps a primitive to its similar alternatives.
8
+ */
9
+ const SIMILARITY_GROUPS = {
10
+ // Modal/Overlay patterns
11
+ Dialog: ['AlertDialog', 'Popover', 'Tooltip', 'HoverCard'],
12
+ AlertDialog: ['Dialog'],
13
+ Popover: ['Tooltip', 'HoverCard', 'Dialog'],
14
+ Tooltip: ['Popover', 'HoverCard'],
15
+ HoverCard: ['Tooltip', 'Popover'],
16
+ // Menu patterns
17
+ DropdownMenu: ['ContextMenu', 'Select', 'Menubar'],
18
+ ContextMenu: ['DropdownMenu'],
19
+ Menubar: ['DropdownMenu', 'NavigationMenu'],
20
+ NavigationMenu: ['Menubar'],
21
+ // Selection patterns
22
+ Select: ['DropdownMenu', 'Combobox'],
23
+ Combobox: ['Select'],
24
+ RadioGroup: ['ToggleGroup', 'Select'],
25
+ ToggleGroup: ['RadioGroup'],
26
+ // Toggle patterns
27
+ Checkbox: ['Switch', 'Toggle'],
28
+ Switch: ['Checkbox', 'Toggle'],
29
+ Toggle: ['Checkbox', 'Switch'],
30
+ // Structure patterns
31
+ Tabs: ['Accordion'],
32
+ Accordion: ['Tabs', 'Collapsible'],
33
+ Collapsible: ['Accordion'],
34
+ };
35
+ /**
36
+ * Human-readable disambiguation rules.
37
+ * Explains how to distinguish this primitive from similar ones.
38
+ */
39
+ const DISAMBIGUATION_RULES = {
40
+ Dialog: 'Dialog has a modal prop and Overlay sub-component. Unlike AlertDialog, it does not have Action/Cancel buttons.',
41
+ AlertDialog: 'AlertDialog has Action and Cancel button components. Unlike Dialog, it does not have a modal prop (always modal).',
42
+ Popover: 'Popover has side/align/sideOffset/alignOffset positioning props. Unlike Tooltip, it requires explicit triggering (no hover).',
43
+ Tooltip: 'Tooltip has delayDuration and skipDelayDuration for hover timing. Unlike Popover, it activates on hover.',
44
+ HoverCard: 'HoverCard has openDelay and closeDelay props. Similar to Tooltip but designed for richer hover content.',
45
+ DropdownMenu: 'DropdownMenu has Sub/SubTrigger/SubContent for nested menus and CheckboxItem/RadioGroup for selection. Unlike Select, no Value display.',
46
+ ContextMenu: 'ContextMenu is like DropdownMenu but triggered by right-click. Has onOpenChange but no explicit Trigger component.',
47
+ Select: 'Select has Value, Viewport, ScrollUpButton/ScrollDownButton components. Unlike DropdownMenu, displays selected value.',
48
+ Checkbox: 'Checkbox has an Indicator that shows checked state (checkmark). Unlike Switch, no sliding Thumb.',
49
+ Switch: 'Switch has a sliding Thumb component. Unlike Checkbox, no Indicator with checkmark.',
50
+ Toggle: 'Toggle has a pressed state. Unlike Checkbox/Switch, it is a button that toggles appearance.',
51
+ RadioGroup: 'RadioGroup has Item and Indicator components with single-value selection. Unlike ToggleGroup, no type prop.',
52
+ ToggleGroup: 'ToggleGroup has a type prop ("single" or "multiple") and rovingFocus. Unlike RadioGroup, can have multiple selection.',
53
+ Tabs: 'Tabs has List, Trigger, and Content with orientation. Horizontal content switching without collapse.',
54
+ Accordion: 'Accordion has Item, Header, Trigger, Content with collapsible prop. Vertical stacked sections that expand/collapse.',
55
+ Collapsible: 'Collapsible is a single collapsible region. Unlike Accordion, only one section without Item components.',
56
+ Menubar: 'Menubar is a horizontal menu bar with multiple Menu components. Unlike DropdownMenu, designed for app-level menus.',
57
+ NavigationMenu: 'NavigationMenu has Viewport, Indicator, and Link components for navigation patterns. Unlike Menubar, focused on links.',
58
+ Slider: 'Slider has min/max/step with Track, Range, and Thumb. Numeric range selection, potentially multiple thumbs.',
59
+ Progress: 'Progress has value/max with Indicator. Read-only display, no user interaction.',
60
+ };
61
+ /**
62
+ * Get primitives that are similar to the given primitive.
63
+ * @param primitiveName - Name of the Radix primitive
64
+ * @returns Array of similar primitive names
65
+ */
66
+ export function getSimilarPrimitives(primitiveName) {
67
+ return SIMILARITY_GROUPS[primitiveName] || [];
68
+ }
69
+ /**
70
+ * Get the disambiguation rule for a primitive.
71
+ * @param primitiveName - Name of the Radix primitive
72
+ * @returns Human-readable disambiguation rule, or undefined if none
73
+ */
74
+ export function getDisambiguationRule(primitiveName) {
75
+ return DISAMBIGUATION_RULES[primitiveName];
76
+ }
77
+ /**
78
+ * Get all primitives in the same similarity group.
79
+ * @param primitiveName - Name of the Radix primitive
80
+ * @returns Array including the primitive and all similar ones
81
+ */
82
+ export function getSimilarityGroup(primitiveName) {
83
+ const similar = getSimilarPrimitives(primitiveName);
84
+ if (similar.length === 0) {
85
+ return [primitiveName];
86
+ }
87
+ return [primitiveName, ...similar];
88
+ }
89
+ /**
90
+ * Check if two primitives are in the same similarity group.
91
+ * @param primitive1 - First primitive name
92
+ * @param primitive2 - Second primitive name
93
+ * @returns True if they are similar
94
+ */
95
+ export function areSimilar(primitive1, primitive2) {
96
+ const group1 = getSimilarPrimitives(primitive1);
97
+ return group1.includes(primitive2);
98
+ }
99
+ //# sourceMappingURL=disambiguation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disambiguation.js","sourceRoot":"","sources":["../../src/signatures/disambiguation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,iBAAiB,GAA6B;IAClD,yBAAyB;IACzB,MAAM,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;IAC1D,WAAW,EAAE,CAAC,QAAQ,CAAC;IACvB,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC;IAC3C,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;IACjC,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;IAEjC,gBAAgB;IAChB,YAAY,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC;IAClD,WAAW,EAAE,CAAC,cAAc,CAAC;IAC7B,OAAO,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC;IAC3C,cAAc,EAAE,CAAC,SAAS,CAAC;IAE3B,qBAAqB;IACrB,MAAM,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;IACpC,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,UAAU,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC;IACrC,WAAW,EAAE,CAAC,YAAY,CAAC;IAE3B,kBAAkB;IAClB,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC9B,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;IAE9B,qBAAqB;IACrB,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;IAClC,WAAW,EAAE,CAAC,WAAW,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,oBAAoB,GAA2B;IACnD,MAAM,EACJ,gHAAgH;IAClH,WAAW,EACT,mHAAmH;IAErH,OAAO,EACL,8HAA8H;IAChI,OAAO,EACL,0GAA0G;IAC5G,SAAS,EACP,yGAAyG;IAE3G,YAAY,EACV,yIAAyI;IAC3I,WAAW,EACT,oHAAoH;IACtH,MAAM,EACJ,uHAAuH;IAEzH,QAAQ,EACN,kGAAkG;IACpG,MAAM,EACJ,qFAAqF;IACvF,MAAM,EACJ,6FAA6F;IAE/F,UAAU,EACR,6GAA6G;IAC/G,WAAW,EACT,uHAAuH;IAEzH,IAAI,EAAE,sGAAsG;IAC5G,SAAS,EACP,qHAAqH;IACvH,WAAW,EACT,yGAAyG;IAE3G,OAAO,EACL,oHAAoH;IACtH,cAAc,EACZ,wHAAwH;IAE1H,MAAM,EACJ,6GAA6G;IAC/G,QAAQ,EAAE,gFAAgF;CAC3F,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAqB;IACxD,OAAO,iBAAiB,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IACzD,OAAO,oBAAoB,CAAC,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,MAAM,OAAO,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,aAAa,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,UAAkB;IAC/D,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Distinguishing props for Radix primitives.
3
+ * Knowledge base for identifying specific primitives by their unique props.
4
+ */
5
+ /**
6
+ * Get the distinguishing props for a primitive.
7
+ * @param primitiveName - Name of the Radix primitive
8
+ * @returns Array of prop/sub-component names that distinguish this primitive
9
+ */
10
+ export declare function getDistinguishingProps(primitiveName: string): string[];
11
+ /**
12
+ * Get the anti-pattern props for a primitive.
13
+ * These props indicate the component is NOT this primitive.
14
+ * @param primitiveName - Name of the Radix primitive
15
+ * @returns Array of prop names that indicate NOT this primitive
16
+ */
17
+ export declare function getAntiPatternProps(primitiveName: string): string[];
18
+ /**
19
+ * Get all known primitive names.
20
+ * @returns Array of all primitive names in the knowledge base
21
+ */
22
+ export declare function getKnownPrimitives(): string[];
23
+ /**
24
+ * Check if a primitive name is known in the knowledge base.
25
+ * @param primitiveName - Name to check
26
+ * @returns True if the primitive is known
27
+ */
28
+ export declare function isKnownPrimitive(primitiveName: string): boolean;
29
+ //# sourceMappingURL=distinguishing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distinguishing.d.ts","sourceRoot":"","sources":["../../src/signatures/distinguishing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4FH;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAEtE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAE/D"}