forgebook 0.3.2 → 0.4.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 (693) hide show
  1. package/README.md +917 -74
  2. package/dist/bin/forgebook/agentClient.d.ts +2 -1
  3. package/dist/bin/forgebook/agentClient.js +13 -6
  4. package/dist/bin/forgebook/agentGuide.d.ts +59 -0
  5. package/dist/bin/forgebook/agentGuide.js +203 -0
  6. package/dist/bin/forgebook/agentLoopCommands.mjs +22 -42
  7. package/dist/bin/forgebook/agentSetup/agentFiles.d.ts +55 -0
  8. package/dist/bin/forgebook/agentSetup/agentFiles.js +319 -0
  9. package/dist/bin/forgebook/agentSetup/assistantHooks.d.ts +71 -0
  10. package/dist/bin/forgebook/agentSetup/assistantHooks.js +125 -0
  11. package/dist/bin/forgebook/agentSetup/ciWorkflow.d.ts +23 -0
  12. package/dist/bin/forgebook/agentSetup/ciWorkflow.js +55 -0
  13. package/dist/bin/forgebook/agentSetup/drawCandidates.d.ts +25 -0
  14. package/dist/bin/forgebook/agentSetup/drawCandidates.js +116 -0
  15. package/dist/bin/forgebook/agentSetup/drawDiagnosis.d.ts +28 -0
  16. package/dist/bin/forgebook/agentSetup/drawDiagnosis.js +134 -0
  17. package/dist/bin/forgebook/agentSetup/drawRun.d.ts +91 -0
  18. package/dist/bin/forgebook/agentSetup/drawRun.js +353 -0
  19. package/dist/bin/forgebook/agentSetup/hookNames.d.ts +7 -0
  20. package/dist/bin/forgebook/agentSetup/hookNames.js +7 -0
  21. package/dist/bin/forgebook/agentSetup/initAgentSteps.d.ts +48 -0
  22. package/dist/bin/forgebook/agentSetup/initAgentSteps.js +104 -0
  23. package/dist/bin/forgebook/agentSetup/liftedProviders.d.ts +17 -0
  24. package/dist/bin/forgebook/agentSetup/liftedProviders.js +186 -0
  25. package/dist/bin/forgebook/agentSetup/projectRunner.d.ts +46 -0
  26. package/dist/bin/forgebook/agentSetup/projectRunner.js +85 -0
  27. package/dist/bin/forgebook/agentSetup/stopHook.d.ts +65 -0
  28. package/dist/bin/forgebook/agentSetup/stopHook.js +202 -0
  29. package/dist/bin/forgebook/agentSetup/uniformPicture.d.ts +7 -0
  30. package/dist/bin/forgebook/agentSetup/uniformPicture.js +98 -0
  31. package/dist/bin/forgebook/agentSetupCommands.d.mts +14 -0
  32. package/dist/bin/forgebook/agentSetupCommands.mjs +98 -0
  33. package/dist/bin/forgebook/agentText.d.ts +23 -3
  34. package/dist/bin/forgebook/agentText.js +175 -28
  35. package/dist/bin/forgebook/agents.md +20 -191
  36. package/dist/bin/forgebook/agentsText.js +2 -1
  37. package/dist/bin/forgebook/appBuild/appBuild.d.ts +59 -0
  38. package/dist/bin/forgebook/appBuild/appBuild.js +213 -0
  39. package/dist/bin/forgebook/appBuild/appViteConfig.d.ts +96 -0
  40. package/dist/bin/forgebook/appBuild/appViteConfig.js +320 -0
  41. package/dist/bin/forgebook/appBuild/tsconfigPaths.d.ts +14 -0
  42. package/dist/bin/forgebook/appBuild/tsconfigPaths.js +80 -0
  43. package/dist/bin/forgebook/auditCommand.d.mts +8 -0
  44. package/dist/bin/forgebook/auditCommand.mjs +75 -0
  45. package/dist/bin/forgebook/auditRun.d.ts +95 -0
  46. package/dist/bin/forgebook/auditRun.js +270 -0
  47. package/dist/bin/forgebook/browserRun.d.ts +21 -0
  48. package/dist/bin/forgebook/browserRun.js +57 -0
  49. package/dist/bin/forgebook/buildFailure.d.ts +7 -0
  50. package/dist/bin/forgebook/buildFailure.js +47 -0
  51. package/dist/bin/forgebook/buildWatch.d.ts +52 -0
  52. package/dist/bin/forgebook/buildWatch.js +137 -0
  53. package/dist/bin/forgebook/builtCatalogue.js +9 -5
  54. package/dist/bin/forgebook/catalogueCommands.d.ts +9 -0
  55. package/dist/bin/forgebook/catalogueCommands.js +23 -0
  56. package/dist/bin/forgebook/catalogueVite.d.ts +5 -1
  57. package/dist/bin/forgebook/catalogueVite.js +14 -6
  58. package/dist/bin/forgebook/commandCacheClaim.d.ts +18 -0
  59. package/dist/bin/forgebook/commandCacheClaim.js +170 -0
  60. package/dist/bin/forgebook/commandServer.d.ts +8 -0
  61. package/dist/bin/forgebook/commandServer.js +61 -13
  62. package/dist/bin/forgebook/forgebookCommands.mjs +105 -28
  63. package/dist/bin/forgebook/graphCommand.d.mts +8 -0
  64. package/dist/bin/forgebook/graphCommand.mjs +84 -0
  65. package/dist/bin/forgebook/guide/commands.md +57 -0
  66. package/dist/bin/forgebook/guide/devices.md +17 -0
  67. package/dist/bin/forgebook/guide/docs-pages.md +13 -0
  68. package/dist/bin/forgebook/guide/frameworks/angular.md +22 -0
  69. package/dist/bin/forgebook/guide/frameworks/html.md +22 -0
  70. package/dist/bin/forgebook/guide/frameworks/nextjs.md +23 -0
  71. package/dist/bin/forgebook/guide/frameworks/nuxt.md +22 -0
  72. package/dist/bin/forgebook/guide/frameworks/preact.md +16 -0
  73. package/dist/bin/forgebook/guide/frameworks/react-native-web.md +21 -0
  74. package/dist/bin/forgebook/guide/frameworks/react.md +16 -0
  75. package/dist/bin/forgebook/guide/frameworks/solid.md +18 -0
  76. package/dist/bin/forgebook/guide/frameworks/svelte.md +18 -0
  77. package/dist/bin/forgebook/guide/frameworks/sveltekit.md +23 -0
  78. package/dist/bin/forgebook/guide/frameworks/vue.md +18 -0
  79. package/dist/bin/forgebook/guide/frameworks/web-components.md +21 -0
  80. package/dist/bin/forgebook/guide/links.md +29 -0
  81. package/dist/bin/forgebook/guide/setup.md +23 -0
  82. package/dist/bin/forgebook/guide/stories.md +90 -0
  83. package/dist/bin/forgebook/guide/switches.md +43 -0
  84. package/dist/bin/forgebook/guideCommand.d.mts +13 -0
  85. package/dist/bin/forgebook/guideCommand.mjs +37 -0
  86. package/dist/bin/forgebook/importers/storybook.d.ts +21 -0
  87. package/dist/bin/forgebook/importers/storybook.js +11 -5
  88. package/dist/bin/forgebook/importers/storybookFrameworks.js +1 -1
  89. package/dist/bin/forgebook/initCommands.d.mts +11 -0
  90. package/dist/bin/forgebook/initCommands.mjs +51 -78
  91. package/dist/bin/forgebook/initConfig.d.ts +5 -3
  92. package/dist/bin/forgebook/initConfig.js +6 -3
  93. package/dist/bin/forgebook/initInstall.d.ts +15 -0
  94. package/dist/bin/forgebook/initInstall.js +77 -0
  95. package/dist/bin/forgebook/initPrint.d.ts +9 -0
  96. package/dist/bin/forgebook/initPrint.js +60 -0
  97. package/dist/bin/forgebook/initRefusals.d.ts +45 -0
  98. package/dist/bin/forgebook/initRefusals.js +91 -0
  99. package/dist/bin/forgebook/initRun.d.ts +28 -0
  100. package/dist/bin/forgebook/initRun.js +311 -0
  101. package/dist/bin/forgebook/mcpCommand.mjs +38 -4
  102. package/dist/bin/forgebook/mcpGraph.d.ts +13 -0
  103. package/dist/bin/forgebook/mcpGraph.js +24 -0
  104. package/dist/bin/forgebook/mcpTokens.d.ts +14 -0
  105. package/dist/bin/forgebook/mcpTokens.js +58 -0
  106. package/dist/bin/forgebook/mcpToolParts.d.ts +7 -0
  107. package/dist/bin/forgebook/mcpToolParts.js +10 -0
  108. package/dist/bin/forgebook/mcpTools.d.ts +13 -6
  109. package/dist/bin/forgebook/mcpTools.js +57 -90
  110. package/dist/bin/forgebook/mcpVerify.d.ts +16 -0
  111. package/dist/bin/forgebook/mcpVerify.js +36 -0
  112. package/dist/bin/forgebook/migrate/codemods.d.ts +11 -0
  113. package/dist/bin/forgebook/migrate/codemods.js +61 -0
  114. package/dist/bin/forgebook/migrate/migrate.types.d.ts +117 -0
  115. package/dist/bin/forgebook/migrate/migrate.types.js +5 -0
  116. package/dist/bin/forgebook/migrate/migrateCommand.d.mts +8 -0
  117. package/dist/bin/forgebook/migrate/migrateCommand.mjs +76 -0
  118. package/dist/bin/forgebook/migrate/migrateRun.d.ts +61 -0
  119. package/dist/bin/forgebook/migrate/migrateRun.js +210 -0
  120. package/dist/bin/forgebook/migrate/migrateText.d.ts +12 -0
  121. package/dist/bin/forgebook/migrate/migrateText.js +30 -0
  122. package/dist/bin/forgebook/migrate/migrateWrite.d.ts +27 -0
  123. package/dist/bin/forgebook/migrate/migrateWrite.js +66 -0
  124. package/dist/bin/forgebook/migrate/objectEdits.d.ts +70 -0
  125. package/dist/bin/forgebook/migrate/objectEdits.js +241 -0
  126. package/dist/bin/forgebook/migrate/playOnInBuilds.d.ts +3 -0
  127. package/dist/bin/forgebook/migrate/playOnInBuilds.js +86 -0
  128. package/dist/bin/forgebook/migrate/propGroupStrings.d.ts +5 -0
  129. package/dist/bin/forgebook/migrate/propGroupStrings.js +81 -0
  130. package/dist/bin/forgebook/newProject/newProject.d.ts +39 -0
  131. package/dist/bin/forgebook/newProject/newProject.js +180 -0
  132. package/dist/bin/forgebook/newProject/newProject.types.d.ts +97 -0
  133. package/dist/bin/forgebook/newProject/newProject.types.js +6 -0
  134. package/dist/bin/forgebook/newProject/packageManagers.d.ts +51 -0
  135. package/dist/bin/forgebook/newProject/packageManagers.js +121 -0
  136. package/dist/bin/forgebook/newProject/projectEntries.d.ts +62 -0
  137. package/dist/bin/forgebook/newProject/projectEntries.js +191 -0
  138. package/dist/bin/forgebook/newProject/projectFrameworks.d.ts +57 -0
  139. package/dist/bin/forgebook/newProject/projectFrameworks.js +148 -0
  140. package/dist/bin/forgebook/newProject/projectLook.d.ts +23 -0
  141. package/dist/bin/forgebook/newProject/projectLook.js +293 -0
  142. package/dist/bin/forgebook/newProject/projectPackages.d.ts +66 -0
  143. package/dist/bin/forgebook/newProject/projectPackages.js +178 -0
  144. package/dist/bin/forgebook/newRepair.d.ts +45 -0
  145. package/dist/bin/forgebook/newRepair.js +157 -0
  146. package/dist/bin/forgebook/newRepairRun.d.ts +69 -0
  147. package/dist/bin/forgebook/newRepairRun.js +148 -0
  148. package/dist/bin/forgebook/newStories.d.ts +23 -1
  149. package/dist/bin/forgebook/newStories.js +101 -11
  150. package/dist/bin/forgebook/newStoriesFile.d.ts +20 -1
  151. package/dist/bin/forgebook/newStoriesFile.js +43 -4
  152. package/dist/bin/forgebook/prebundleRun.d.ts +3 -1
  153. package/dist/bin/forgebook/prebundleRun.js +28 -8
  154. package/dist/bin/forgebook/proofCommand.d.mts +15 -0
  155. package/dist/bin/forgebook/proofCommand.mjs +212 -0
  156. package/dist/bin/forgebook/proofRun.d.ts +63 -0
  157. package/dist/bin/forgebook/proofRun.js +412 -0
  158. package/dist/bin/forgebook/proofText.d.ts +36 -0
  159. package/dist/bin/forgebook/proofText.js +131 -0
  160. package/dist/bin/forgebook/proofWorkflow.d.ts +29 -0
  161. package/dist/bin/forgebook/proofWorkflow.js +205 -0
  162. package/dist/bin/forgebook/setArgsTool.d.ts +8 -0
  163. package/dist/bin/forgebook/setArgsTool.js +70 -0
  164. package/dist/bin/forgebook/storyCheckCommands.mjs +42 -3
  165. package/dist/bin/forgebook/storyCheckRun.d.ts +50 -0
  166. package/dist/bin/forgebook/storyCheckRun.js +83 -9
  167. package/dist/bin/forgebook/storyFileIds.d.ts +15 -0
  168. package/dist/bin/forgebook/storyFileIds.js +14 -0
  169. package/dist/bin/forgebook/stressCases.d.ts +31 -0
  170. package/dist/bin/forgebook/stressCases.js +79 -0
  171. package/dist/bin/forgebook/stressRun.d.ts +12 -0
  172. package/dist/bin/forgebook/stressRun.js +61 -0
  173. package/dist/bin/forgebook/stressText.d.ts +27 -0
  174. package/dist/bin/forgebook/stressText.js +46 -0
  175. package/dist/bin/forgebook/verifyBase.d.ts +45 -0
  176. package/dist/bin/forgebook/verifyBase.js +196 -0
  177. package/dist/bin/forgebook/verifyCommand.d.mts +13 -0
  178. package/dist/bin/forgebook/verifyCommand.mjs +125 -0
  179. package/dist/bin/forgebook/verifyRun.d.ts +63 -0
  180. package/dist/bin/forgebook/verifyRun.js +108 -0
  181. package/dist/bin/forgebook/verifyVerdict.d.ts +40 -0
  182. package/dist/bin/forgebook/verifyVerdict.js +297 -0
  183. package/dist/bin/forgebook/workflowActions.d.ts +23 -0
  184. package/dist/bin/forgebook/workflowActions.js +23 -0
  185. package/dist/bin/forgebook-docs/catalogueMarkdown.js +12 -1
  186. package/dist/src/addressArgs.d.ts +54 -6
  187. package/dist/src/addressArgs.js +72 -16
  188. package/dist/src/addressArgsParam.d.ts +54 -0
  189. package/dist/src/addressArgsParam.js +51 -0
  190. package/dist/src/addressTexts.d.ts +14 -0
  191. package/dist/src/addressTexts.js +28 -21
  192. package/dist/src/agentIndexFile.d.ts +11 -0
  193. package/dist/src/agentIndexFile.js +11 -0
  194. package/dist/src/argConditions.d.ts +52 -0
  195. package/dist/src/argConditions.js +80 -0
  196. package/dist/src/argControl.d.ts +100 -0
  197. package/dist/src/argControl.js +0 -0
  198. package/dist/src/argExpression.d.ts +21 -0
  199. package/dist/src/argExpression.js +30 -0
  200. package/dist/src/argTypes.d.ts +40 -51
  201. package/dist/src/argTypes.js +66 -184
  202. package/dist/src/argsProps.d.ts +3 -3
  203. package/dist/src/argsProps.js +11 -5
  204. package/dist/src/bundlerErrors.d.ts +29 -0
  205. package/dist/src/bundlerErrors.js +49 -0
  206. package/dist/src/catalogue.d.ts +31 -0
  207. package/dist/src/catalogue.js +13 -2
  208. package/dist/src/catalogueRefs.d.ts +75 -0
  209. package/dist/src/catalogueRefs.js +122 -0
  210. package/dist/src/componentDocs.d.ts +71 -0
  211. package/dist/src/componentDocs.js +15 -2
  212. package/dist/src/frame/callValues.d.ts +19 -0
  213. package/dist/src/frame/callValues.js +58 -0
  214. package/dist/src/frame/canvasScheme.d.ts +33 -0
  215. package/dist/src/frame/canvasScheme.js +67 -0
  216. package/dist/src/frame/frame.css +36 -3
  217. package/dist/src/frame/frameStatus.d.ts +16 -1
  218. package/dist/src/frame/frameStatus.js +16 -1
  219. package/dist/src/frame/frameView.js +4 -3
  220. package/dist/src/frame/mountFrame.d.ts +7 -1
  221. package/dist/src/frame/mountFrame.js +153 -46
  222. package/dist/src/frame/panelValues.d.ts +35 -0
  223. package/dist/src/frame/panelValues.js +127 -0
  224. package/dist/src/frame/playActions.d.ts +39 -0
  225. package/dist/src/frame/playActions.js +98 -0
  226. package/dist/src/frame/playStepper.d.ts +28 -0
  227. package/dist/src/frame/playStepper.js +38 -0
  228. package/dist/src/frame/playStory.d.ts +9 -1
  229. package/dist/src/frame/playStory.js +49 -3
  230. package/dist/src/frame/renderer.d.ts +34 -1
  231. package/dist/src/frame/renderer.js +24 -0
  232. package/dist/src/frame/shellChannel.d.ts +1 -1
  233. package/dist/src/frame/shellChannel.js +1 -1
  234. package/dist/src/frame/shellCheck.d.ts +17 -0
  235. package/dist/src/frame/shellCheck.js +25 -0
  236. package/dist/src/frame/shellMessageCheck.d.ts +7 -0
  237. package/dist/src/frame/shellMessageCheck.js +53 -0
  238. package/dist/src/frame/storyContent.d.ts +50 -0
  239. package/dist/src/frame/storyContent.js +73 -0
  240. package/dist/src/frame/storyModule.d.ts +9 -0
  241. package/dist/src/frame/storyModule.js +20 -2
  242. package/dist/src/frame/storyRun.d.ts +15 -7
  243. package/dist/src/frame/storyRun.js +64 -15
  244. package/dist/src/frame/valueSheets.d.ts +35 -0
  245. package/dist/src/frame/valueSheets.js +99 -0
  246. package/dist/src/hotModules.d.ts +20 -0
  247. package/dist/src/hotModules.js +23 -0
  248. package/dist/src/jsxCode.d.ts +1 -14
  249. package/dist/src/jsxCode.js +46 -10
  250. package/dist/src/liveErrors.d.ts +30 -4
  251. package/dist/src/liveErrors.js +18 -3
  252. package/dist/src/messages.d.ts +77 -27
  253. package/dist/src/messages.js +58 -100
  254. package/dist/src/namedValues.d.ts +2 -26
  255. package/dist/src/namedValues.js +0 -47
  256. package/dist/src/pageConfig.d.ts +2 -0
  257. package/dist/src/playTrace.d.ts +19 -2
  258. package/dist/src/playTrace.js +10 -5
  259. package/dist/src/plugin.d.ts +10 -3
  260. package/dist/src/previewRelay.js +9 -1
  261. package/dist/src/printable.d.ts +12 -0
  262. package/dist/src/printable.js +22 -0
  263. package/dist/src/propsSignature.d.ts +37 -0
  264. package/dist/src/propsSignature.js +40 -0
  265. package/dist/src/search.d.ts +41 -5
  266. package/dist/src/search.js +93 -23
  267. package/dist/src/searchMatch.d.ts +4 -1
  268. package/dist/src/searchMatch.js +26 -5
  269. package/dist/src/searchTypos.d.ts +88 -0
  270. package/dist/src/searchTypos.js +178 -0
  271. package/dist/src/shapeValues.d.ts +86 -0
  272. package/dist/src/shapeValues.js +295 -0
  273. package/dist/src/shell/ApiReference.js +6 -3
  274. package/dist/src/shell/ApiTableBox.d.ts +15 -0
  275. package/dist/src/shell/ApiTableBox.js +11 -0
  276. package/dist/src/shell/AppearanceMenu.d.ts +4 -1
  277. package/dist/src/shell/AppearanceMenu.js +9 -6
  278. package/dist/src/shell/CodeTab.d.ts +3 -2
  279. package/dist/src/shell/CodeTab.js +3 -2
  280. package/dist/src/shell/CodeText.d.ts +1 -1
  281. package/dist/src/shell/CodeText.js +2 -3
  282. package/dist/src/shell/CompareGrid.js +1 -1
  283. package/dist/src/shell/ComponentPage.d.ts +1 -1
  284. package/dist/src/shell/ComponentPage.js +5 -1
  285. package/dist/src/shell/CustomControl.d.ts +34 -0
  286. package/dist/src/shell/CustomControl.js +132 -0
  287. package/dist/src/shell/DocContainers.js +1 -1
  288. package/dist/src/shell/DocPage.js +2 -2
  289. package/dist/src/shell/DroppedArgsList.d.ts +2 -2
  290. package/dist/src/shell/DroppedArgsList.js +1 -1
  291. package/dist/src/shell/EmbedPage.js +58 -14
  292. package/dist/src/shell/Example.d.ts +5 -1
  293. package/dist/src/shell/Example.js +16 -8
  294. package/dist/src/shell/FrameView.d.ts +6 -3
  295. package/dist/src/shell/FrameView.js +2 -2
  296. package/dist/src/shell/HomePage.d.ts +3 -1
  297. package/dist/src/shell/HomePage.js +16 -6
  298. package/dist/src/shell/InfoTip.js +2 -2
  299. package/dist/src/shell/InteractionsTab.d.ts +11 -4
  300. package/dist/src/shell/InteractionsTab.js +18 -2
  301. package/dist/src/shell/LazyPage.js +1 -1
  302. package/dist/src/shell/PackageHtml.js +3 -1
  303. package/dist/src/shell/PinnedControl.js +14 -62
  304. package/dist/src/shell/PinnedControlMenu.d.ts +44 -0
  305. package/dist/src/shell/PinnedControlMenu.js +72 -0
  306. package/dist/src/shell/PluginBlockHost.js +2 -1
  307. package/dist/src/shell/PluginTabHost.js +19 -2
  308. package/dist/src/shell/PropFields.d.ts +3 -1
  309. package/dist/src/shell/PropFields.js +9 -6
  310. package/dist/src/shell/PropRows.d.ts +23 -2
  311. package/dist/src/shell/PropRows.js +58 -19
  312. package/dist/src/shell/PropsTab.d.ts +12 -5
  313. package/dist/src/shell/PropsTab.js +9 -21
  314. package/dist/src/shell/RefStoryPage.d.ts +33 -0
  315. package/dist/src/shell/RefStoryPage.js +123 -0
  316. package/dist/src/shell/SearchPanel.js +51 -24
  317. package/dist/src/shell/Shell.d.ts +18 -0
  318. package/dist/src/shell/Shell.js +137 -22
  319. package/dist/src/shell/ShortcutHelp.d.ts +22 -0
  320. package/dist/src/shell/ShortcutHelp.js +66 -0
  321. package/dist/src/shell/Sidebar.d.ts +17 -4
  322. package/dist/src/shell/Sidebar.js +92 -41
  323. package/dist/src/shell/SidebarDocs.js +2 -2
  324. package/dist/src/shell/SidebarEntries.js +5 -3
  325. package/dist/src/shell/SidebarHandle.d.ts +3 -5
  326. package/dist/src/shell/SidebarHandle.js +4 -4
  327. package/dist/src/shell/SidebarRefs.d.ts +39 -0
  328. package/dist/src/shell/SidebarRefs.js +99 -0
  329. package/dist/src/shell/SidebarSearch.js +37 -9
  330. package/dist/src/shell/SignatureReference.js +3 -1
  331. package/dist/src/shell/Stage.d.ts +10 -2
  332. package/dist/src/shell/Stage.js +35 -60
  333. package/dist/src/shell/StatusBadges.d.ts +54 -0
  334. package/dist/src/shell/StatusBadges.js +77 -0
  335. package/dist/src/shell/StoryCodeBlock.d.ts +8 -19
  336. package/dist/src/shell/StoryCodeBlock.js +7 -6
  337. package/dist/src/shell/SwitchGallery.d.ts +36 -0
  338. package/dist/src/shell/SwitchGallery.js +17 -0
  339. package/dist/src/shell/SwitchGalleryPanel.d.ts +37 -0
  340. package/dist/src/shell/SwitchGalleryPanel.js +99 -0
  341. package/dist/src/shell/TagFilter.d.ts +24 -0
  342. package/dist/src/shell/TagFilter.js +45 -0
  343. package/dist/src/shell/TagViews.d.ts +39 -0
  344. package/dist/src/shell/TagViews.js +20 -0
  345. package/dist/src/shell/Toolbar.d.ts +4 -1
  346. package/dist/src/shell/Toolbar.js +17 -7
  347. package/dist/src/shell/ToolbarControl.d.ts +3 -0
  348. package/dist/src/shell/ToolbarControl.js +23 -6
  349. package/dist/src/shell/ViewMenuPanel.js +6 -1
  350. package/dist/src/shell/argChecks.d.ts +22 -0
  351. package/dist/src/shell/argChecks.js +20 -0
  352. package/dist/src/shell/asideStory.d.ts +17 -4
  353. package/dist/src/shell/asideStory.js +21 -4
  354. package/dist/src/shell/audienceSections.css +9 -9
  355. package/dist/src/shell/catalogueContext.d.ts +1 -1
  356. package/dist/src/shell/catalogueContext.js +6 -1
  357. package/dist/src/shell/codeSpans.d.ts +27 -0
  358. package/dist/src/shell/codeSpans.js +76 -0
  359. package/dist/src/shell/compareVariants.d.ts +4 -2
  360. package/dist/src/shell/compareVariants.js +16 -8
  361. package/dist/src/shell/composition.d.ts +23 -0
  362. package/dist/src/shell/composition.js +26 -0
  363. package/dist/src/shell/controlCycle.d.ts +1 -1
  364. package/dist/src/shell/controlCycle.js +3 -2
  365. package/dist/src/shell/customControls.d.ts +55 -0
  366. package/dist/src/shell/customControls.js +70 -0
  367. package/dist/src/shell/docPage.css +22 -22
  368. package/dist/src/shell/dockTabs.d.ts +19 -3
  369. package/dist/src/shell/dockTabs.js +28 -20
  370. package/dist/src/shell/embed.css +7 -7
  371. package/dist/src/shell/framesOrigin.d.ts +7 -0
  372. package/dist/src/shell/framesOrigin.js +1 -1
  373. package/dist/src/shell/galleryPlace.d.ts +20 -0
  374. package/dist/src/shell/galleryPlace.js +26 -0
  375. package/dist/src/shell/icons.d.ts +1 -0
  376. package/dist/src/shell/icons.js +1 -0
  377. package/dist/src/shell/keyboard.d.ts +14 -12
  378. package/dist/src/shell/keyboard.js +21 -6
  379. package/dist/src/shell/laterStrings.d.ts +29 -0
  380. package/dist/src/shell/laterStrings.js +42 -3
  381. package/dist/src/shell/mountShell.js +3 -0
  382. package/dist/src/shell/pageStrings.d.ts +4 -0
  383. package/dist/src/shell/pageStrings.js +4 -0
  384. package/dist/src/shell/pageTagView.d.ts +18 -0
  385. package/dist/src/shell/pageTagView.js +10 -0
  386. package/dist/src/shell/playMemory.d.ts +14 -0
  387. package/dist/src/shell/playMemory.js +8 -0
  388. package/dist/src/shell/propNotes.d.ts +23 -0
  389. package/dist/src/shell/propNotes.js +37 -0
  390. package/dist/src/shell/refIndexLoad.d.ts +17 -0
  391. package/dist/src/shell/refIndexLoad.js +38 -0
  392. package/dist/src/shell/refParts.d.ts +34 -0
  393. package/dist/src/shell/refParts.js +9 -0
  394. package/dist/src/shell/refStory.css +21 -0
  395. package/dist/src/shell/refStrings.d.ts +13 -0
  396. package/dist/src/shell/refStrings.js +21 -0
  397. package/dist/src/shell/search.css +11 -11
  398. package/dist/src/shell/shell.css +348 -168
  399. package/dist/src/shell/shellScheme.js +2 -2
  400. package/dist/src/shell/shortcutHelp.css +64 -0
  401. package/dist/src/shell/stageArgs.d.ts +53 -0
  402. package/dist/src/shell/stageArgs.js +64 -0
  403. package/dist/src/shell/statusBadges.css +51 -0
  404. package/dist/src/shell/strings.d.ts +7 -16
  405. package/dist/src/shell/strings.js +12 -17
  406. package/dist/src/shell/switchGallery.css +104 -0
  407. package/dist/src/shell/tagFilter.css +46 -0
  408. package/dist/src/shell/tagView.d.ts +20 -0
  409. package/dist/src/shell/tagView.js +10 -0
  410. package/dist/src/shell/useAddressArgs.d.ts +27 -2
  411. package/dist/src/shell/useAddressArgs.js +71 -14
  412. package/dist/src/shell/useControlKeys.js +2 -2
  413. package/dist/src/shell/useEditedProblems.d.ts +6 -0
  414. package/dist/src/shell/useEditedProblems.js +40 -0
  415. package/dist/src/shell/useFrameMessages.js +3 -0
  416. package/dist/src/shell/useListedTree.d.ts +13 -0
  417. package/dist/src/shell/useListedTree.js +32 -0
  418. package/dist/src/shell/usePageFrames.js +2 -2
  419. package/dist/src/shell/usePopover.d.ts +5 -0
  420. package/dist/src/shell/usePopover.js +7 -1
  421. package/dist/src/shell/useRefIndex.d.ts +22 -0
  422. package/dist/src/shell/useRefIndex.js +36 -0
  423. package/dist/src/shell/useScrollStops.d.ts +20 -0
  424. package/dist/src/shell/useScrollStops.js +41 -0
  425. package/dist/src/shell/useShortcutHelp.d.ts +18 -0
  426. package/dist/src/shell/useShortcutHelp.js +32 -0
  427. package/dist/src/shell/useSidebarOverlay.d.ts +2 -1
  428. package/dist/src/shell/useSidebarOverlay.js +12 -4
  429. package/dist/src/shell/useStoryCode.d.ts +2 -1
  430. package/dist/src/shell/useStoryCode.js +12 -7
  431. package/dist/src/shell/useToolbarLayout.d.ts +5 -1
  432. package/dist/src/shell/useToolbarLayout.js +2 -2
  433. package/dist/src/shell/useWorstCase.d.ts +8 -2
  434. package/dist/src/shell/useWorstCase.js +2 -2
  435. package/dist/src/shell/valueEditors/FileEditor.d.ts +28 -0
  436. package/dist/src/shell/valueEditors/FileEditor.js +66 -0
  437. package/dist/src/shell/valueEditors/JsonEditor.d.ts +14 -0
  438. package/dist/src/shell/valueEditors/JsonEditor.js +53 -0
  439. package/dist/src/shell/valueEditors/ListEditor.d.ts +24 -0
  440. package/dist/src/shell/valueEditors/ListEditor.js +82 -0
  441. package/dist/src/shell/valueEditors/ObjectEditor.d.ts +32 -0
  442. package/dist/src/shell/valueEditors/ObjectEditor.js +70 -0
  443. package/dist/src/shell/valueEditors/PropEditor.d.ts +37 -0
  444. package/dist/src/shell/valueEditors/PropEditor.js +53 -0
  445. package/dist/src/shell/valueEditors/RecordEditor.d.ts +20 -0
  446. package/dist/src/shell/valueEditors/RecordEditor.js +84 -0
  447. package/dist/src/shell/valueEditors/SearchSelect.d.ts +42 -0
  448. package/dist/src/shell/valueEditors/SearchSelect.js +80 -0
  449. package/dist/src/shell/valueEditors/TokenEditor.d.ts +49 -0
  450. package/dist/src/shell/valueEditors/TokenEditor.js +74 -0
  451. package/dist/src/shell/valueEditors/UnionEditor.d.ts +20 -0
  452. package/dist/src/shell/valueEditors/UnionEditor.js +64 -0
  453. package/dist/src/shell/valueEditors/ValueField.d.ts +15 -0
  454. package/dist/src/shell/valueEditors/ValueField.js +147 -0
  455. package/dist/src/shell/valueEditors/editorStrings.d.ts +56 -0
  456. package/dist/src/shell/valueEditors/editorStrings.js +66 -0
  457. package/dist/src/shell/valueEditors/fieldTypes.d.ts +31 -0
  458. package/dist/src/shell/valueEditors/fieldTypes.js +0 -0
  459. package/dist/src/shell/valueEditors/valueEditors.css +153 -0
  460. package/dist/src/shell/worstArgs.d.ts +8 -5
  461. package/dist/src/shell/worstArgs.js +14 -7
  462. package/dist/src/shellTheme.d.ts +1 -1
  463. package/dist/src/shellTheme.js +15 -1
  464. package/dist/src/shellTheme.types.d.ts +4 -0
  465. package/dist/src/shellWord.d.ts +12 -0
  466. package/dist/src/shellWord.js +15 -0
  467. package/dist/src/sourceFiles.js +2 -1
  468. package/dist/src/storyArgTypes.d.ts +57 -0
  469. package/dist/src/storyArgTypes.js +195 -0
  470. package/dist/src/storyBackground.js +14 -3
  471. package/dist/src/storyCheck.d.ts +85 -3
  472. package/dist/src/storyCheck.js +23 -1
  473. package/dist/src/storyCodeText.d.ts +46 -0
  474. package/dist/src/storyCodeText.js +27 -0
  475. package/dist/src/storyControls.d.ts +100 -0
  476. package/dist/src/storyControls.js +100 -0
  477. package/dist/src/storyStatuses.d.ts +55 -0
  478. package/dist/src/storyStatuses.js +104 -0
  479. package/dist/src/storyTagNames.d.ts +25 -0
  480. package/dist/src/storyTagNames.js +25 -0
  481. package/dist/src/storyTags.d.ts +29 -0
  482. package/dist/src/storyTags.js +85 -0
  483. package/dist/src/storyTree.d.ts +13 -0
  484. package/dist/src/storyTree.js +24 -4
  485. package/dist/src/storybookArgs.d.ts +24 -0
  486. package/dist/src/storybookArgs.js +185 -0
  487. package/dist/src/switches.d.ts +66 -3
  488. package/dist/src/switches.js +42 -1
  489. package/dist/src/valueSchema.d.ts +28 -0
  490. package/dist/src/valueSchema.js +196 -0
  491. package/dist/src/valueShape.d.ts +94 -0
  492. package/dist/src/valueShape.js +25 -0
  493. package/dist/src/viewState.d.ts +8 -3
  494. package/dist/src/viewState.js +27 -10
  495. package/dist/src/vite/adapter.d.ts +40 -2
  496. package/dist/src/vite/adapter.js +1 -0
  497. package/dist/src/vite/agent.types.d.ts +347 -7
  498. package/dist/src/vite/agentApi.d.ts +23 -0
  499. package/dist/src/vite/agentApi.js +90 -17
  500. package/dist/src/vite/agentIndex.d.ts +0 -2
  501. package/dist/src/vite/agentIndex.js +5 -6
  502. package/dist/src/vite/agentRoutes.d.ts +20 -1
  503. package/dist/src/vite/agentRoutes.js +106 -65
  504. package/dist/src/vite/agentStatuses.d.ts +42 -0
  505. package/dist/src/vite/agentStatuses.js +67 -0
  506. package/dist/src/vite/agentStoryCode.d.ts +48 -0
  507. package/dist/src/vite/agentStoryCode.js +38 -0
  508. package/dist/src/vite/agentVisibility.d.ts +47 -0
  509. package/dist/src/vite/agentVisibility.js +174 -0
  510. package/dist/src/vite/appAudit.d.ts +134 -0
  511. package/dist/src/vite/appAudit.js +333 -0
  512. package/dist/src/vite/appBuildOption.d.ts +53 -0
  513. package/dist/src/vite/appBuildOption.js +55 -0
  514. package/dist/src/vite/appTokenFiles.d.ts +92 -0
  515. package/dist/src/vite/appTokenFiles.js +433 -0
  516. package/dist/src/vite/appTokens.d.ts +23 -0
  517. package/dist/src/vite/appTokens.js +275 -0
  518. package/dist/src/vite/builtTexts.d.ts +10 -0
  519. package/dist/src/vite/builtTexts.js +59 -22
  520. package/dist/src/vite/catalogueConfig.d.ts +3 -1
  521. package/dist/src/vite/catalogueConfig.js +15 -3
  522. package/dist/src/vite/changeCoverage.d.ts +74 -0
  523. package/dist/src/vite/changeCoverage.js +120 -0
  524. package/dist/src/vite/changedRoute.d.ts +30 -0
  525. package/dist/src/vite/changedRoute.js +197 -0
  526. package/dist/src/vite/checkCode.d.ts +105 -3
  527. package/dist/src/vite/checkCode.js +323 -36
  528. package/dist/src/vite/checkoutWatch.d.ts +97 -0
  529. package/dist/src/vite/checkoutWatch.js +287 -0
  530. package/dist/src/vite/closeWatch.d.ts +8 -0
  531. package/dist/src/vite/closeWatch.js +1 -1
  532. package/dist/src/vite/componentCache.d.ts +8 -0
  533. package/dist/src/vite/componentCache.js +66 -0
  534. package/dist/src/vite/componentGraph.d.ts +71 -0
  535. package/dist/src/vite/componentGraph.js +133 -0
  536. package/dist/src/vite/componentRules.d.ts +33 -0
  537. package/dist/src/vite/componentRules.js +105 -0
  538. package/dist/src/vite/componentScan.d.ts +69 -0
  539. package/dist/src/vite/componentScan.js +418 -0
  540. package/dist/src/vite/compositionCheck.d.ts +15 -0
  541. package/dist/src/vite/compositionCheck.js +243 -0
  542. package/dist/src/vite/config.d.ts +32 -1
  543. package/dist/src/vite/configFile.d.ts +14 -2
  544. package/dist/src/vite/configFile.js +124 -40
  545. package/dist/src/vite/configKeys.d.ts +15 -0
  546. package/dist/src/vite/configKeys.js +171 -0
  547. package/dist/src/vite/configLoadError.d.ts +23 -0
  548. package/dist/src/vite/configLoadError.js +71 -0
  549. package/dist/src/vite/cssDeclarations.d.ts +71 -0
  550. package/dist/src/vite/cssDeclarations.js +290 -0
  551. package/dist/src/vite/cssImports.d.ts +14 -0
  552. package/dist/src/vite/cssImports.js +48 -0
  553. package/dist/src/vite/cssReferences.d.ts +54 -0
  554. package/dist/src/vite/cssReferences.js +157 -0
  555. package/dist/src/vite/cssTokenValues.d.ts +50 -0
  556. package/dist/src/vite/cssTokenValues.js +233 -0
  557. package/dist/src/vite/designTokens.d.ts +24 -0
  558. package/dist/src/vite/designTokens.js +5 -1
  559. package/dist/src/vite/docsExtractor.d.ts +9 -3
  560. package/dist/src/vite/docsExtractor.js +11 -3
  561. package/dist/src/vite/docsProgram.d.ts +17 -4
  562. package/dist/src/vite/docsProgram.js +52 -11
  563. package/dist/src/vite/docsWorker.js +7 -2
  564. package/dist/src/vite/emptyStoryGlobs.d.ts +41 -0
  565. package/dist/src/vite/emptyStoryGlobs.js +52 -0
  566. package/dist/src/vite/fileImports.d.ts +17 -0
  567. package/dist/src/vite/fileImports.js +57 -0
  568. package/dist/src/vite/findComponent.d.ts +10 -2
  569. package/dist/src/vite/findComponent.js +27 -22
  570. package/dist/src/vite/findRoute.js +3 -2
  571. package/dist/src/vite/forcedStates.d.ts +9 -2
  572. package/dist/src/vite/forcedStates.js +12 -3
  573. package/dist/src/vite/forgebookPlugin.d.ts +2 -0
  574. package/dist/src/vite/forgebookPlugin.js +52 -72
  575. package/dist/src/vite/frameErrors.d.ts +19 -0
  576. package/dist/src/vite/frameErrors.js +70 -0
  577. package/dist/src/vite/framesServer.d.ts +12 -0
  578. package/dist/src/vite/framesServer.js +21 -4
  579. package/dist/src/vite/functionComponentDocs.js +81 -12
  580. package/dist/src/vite/generatedModules.js +4 -2
  581. package/dist/src/vite/gitChange.d.ts +38 -5
  582. package/dist/src/vite/gitChange.js +71 -11
  583. package/dist/src/vite/hiddenStoryFiles.d.ts +23 -0
  584. package/dist/src/vite/hiddenStoryFiles.js +107 -0
  585. package/dist/src/vite/hotSnippets.d.ts +38 -14
  586. package/dist/src/vite/hotSnippets.js +137 -39
  587. package/dist/src/vite/importedNames.d.ts +37 -0
  588. package/dist/src/vite/importedNames.js +138 -0
  589. package/dist/src/vite/indexFields.d.ts +6 -0
  590. package/dist/src/vite/indexFields.js +21 -0
  591. package/dist/src/vite/indexStoryFile.d.ts +8 -1
  592. package/dist/src/vite/indexStoryFile.js +22 -157
  593. package/dist/src/vite/jsxCallSites.d.ts +33 -0
  594. package/dist/src/vite/jsxCallSites.js +200 -0
  595. package/dist/src/vite/jsxInScripts.d.ts +67 -0
  596. package/dist/src/vite/jsxInScripts.js +138 -0
  597. package/dist/src/vite/jsxTree.d.ts +20 -0
  598. package/dist/src/vite/jsxTree.js +163 -0
  599. package/dist/src/vite/lineAndColumn.d.ts +13 -0
  600. package/dist/src/vite/lineAndColumn.js +18 -0
  601. package/dist/src/vite/lookAlikes.d.ts +65 -0
  602. package/dist/src/vite/lookAlikes.js +228 -0
  603. package/dist/src/vite/nearestToken.d.ts +17 -0
  604. package/dist/src/vite/nearestToken.js +9 -2
  605. package/dist/src/vite/packageEntries.d.ts +42 -0
  606. package/dist/src/vite/packageEntries.js +127 -0
  607. package/dist/src/vite/pages.d.ts +9 -1
  608. package/dist/src/vite/pages.js +108 -4
  609. package/dist/src/vite/pluginConfig.js +4 -0
  610. package/dist/src/vite/pluginIds.d.ts +2 -0
  611. package/dist/src/vite/pluginIds.js +5 -1
  612. package/dist/src/vite/pluginModules.d.ts +81 -11
  613. package/dist/src/vite/pluginModules.js +109 -21
  614. package/dist/src/vite/prebundled.d.ts +57 -15
  615. package/dist/src/vite/prebundled.js +80 -0
  616. package/dist/src/vite/previewTags.d.ts +25 -0
  617. package/dist/src/vite/previewTags.js +56 -0
  618. package/dist/src/vite/projectFiles.d.ts +54 -0
  619. package/dist/src/vite/projectFiles.js +116 -0
  620. package/dist/src/vite/projectPostcss.d.ts +70 -0
  621. package/dist/src/vite/projectPostcss.js +250 -0
  622. package/dist/src/vite/propDocs.d.ts +12 -0
  623. package/dist/src/vite/propDocs.js +130 -58
  624. package/dist/src/vite/propKind.d.ts +40 -0
  625. package/dist/src/vite/propKind.js +71 -0
  626. package/dist/src/vite/propTypeNotes.d.ts +22 -0
  627. package/dist/src/vite/propTypeNotes.js +51 -0
  628. package/dist/src/vite/publishedExports.d.ts +27 -0
  629. package/dist/src/vite/publishedExports.js +298 -0
  630. package/dist/src/vite/realFolder.d.ts +6 -0
  631. package/dist/src/vite/realFolder.js +25 -0
  632. package/dist/src/vite/refsConfig.d.ts +39 -0
  633. package/dist/src/vite/refsConfig.js +54 -0
  634. package/dist/src/vite/reuseCheck.d.ts +45 -0
  635. package/dist/src/vite/reuseCheck.js +260 -0
  636. package/dist/src/vite/runningVersions.d.ts +33 -0
  637. package/dist/src/vite/runningVersions.js +25 -0
  638. package/dist/src/vite/scriptProblems.d.ts +60 -0
  639. package/dist/src/vite/scriptProblems.js +155 -0
  640. package/dist/src/vite/searchModule.js +3 -2
  641. package/dist/src/vite/searchRoute.js +4 -2
  642. package/dist/src/vite/shapeDocs.d.ts +36 -0
  643. package/dist/src/vite/shapeDocs.js +177 -0
  644. package/dist/src/vite/singleFileComponent.d.ts +17 -0
  645. package/dist/src/vite/singleFileComponent.js +83 -0
  646. package/dist/src/vite/sourceText.d.ts +34 -0
  647. package/dist/src/vite/sourceText.js +72 -0
  648. package/dist/src/vite/sourceTokens.d.ts +7 -0
  649. package/dist/src/vite/sourceTokens.js +7 -2
  650. package/dist/src/vite/stackLines.d.ts +49 -0
  651. package/dist/src/vite/stackLines.js +96 -0
  652. package/dist/src/vite/storyCode.d.ts +22 -7
  653. package/dist/src/vite/storyCode.js +263 -37
  654. package/dist/src/vite/storyCoverage.d.ts +48 -0
  655. package/dist/src/vite/storyCoverage.js +179 -0
  656. package/dist/src/vite/storyFilesModule.d.ts +48 -3
  657. package/dist/src/vite/storyFilesModule.js +105 -15
  658. package/dist/src/vite/storyPatterns.d.ts +31 -0
  659. package/dist/src/vite/storyPatterns.js +140 -5
  660. package/dist/src/vite/storyReach.d.ts +10 -2
  661. package/dist/src/vite/storyReach.js +15 -11
  662. package/dist/src/vite/storyTopLevel.d.ts +51 -0
  663. package/dist/src/vite/storyTopLevel.js +146 -0
  664. package/dist/src/vite/storylessRoutes.d.ts +4 -3
  665. package/dist/src/vite/storylessRoutes.js +210 -19
  666. package/dist/src/vite/switchValuesCheck.d.ts +19 -0
  667. package/dist/src/vite/switchValuesCheck.js +164 -0
  668. package/dist/src/vite/switchesDocument.d.ts +15 -0
  669. package/dist/src/vite/switchesDocument.js +47 -0
  670. package/dist/src/vite/tailwindConfigTokens.d.ts +41 -0
  671. package/dist/src/vite/tailwindConfigTokens.js +306 -0
  672. package/dist/src/vite/textImports.d.ts +15 -0
  673. package/dist/src/vite/textImports.js +58 -0
  674. package/dist/src/vite/textModules.d.ts +6 -5
  675. package/dist/src/vite/textModules.js +13 -8
  676. package/dist/src/vite/tokenAnswers.d.ts +6 -2
  677. package/dist/src/vite/tokenAnswers.js +11 -7
  678. package/dist/src/vite/typeParameters.d.ts +83 -0
  679. package/dist/src/vite/typeParameters.js +270 -0
  680. package/dist/src/vite/unionProps.d.ts +37 -0
  681. package/dist/src/vite/unionProps.js +121 -0
  682. package/dist/src/vite/unresolvedTokens.d.ts +20 -0
  683. package/dist/src/vite/unresolvedTokens.js +193 -0
  684. package/dist/src/vite/usageGraph.js +10 -52
  685. package/dist/src/vite/usageGuidance.d.ts +9 -2
  686. package/dist/src/vite/usageGuidance.js +36 -8
  687. package/dist/src/vite/usageImports.d.ts +35 -0
  688. package/dist/src/vite/usageImports.js +280 -0
  689. package/dist/src/vite/visibilityRoute.d.ts +16 -0
  690. package/dist/src/vite/visibilityRoute.js +320 -0
  691. package/dist/src/worstCase.d.ts +2 -0
  692. package/dist/src/worstCase.js +2 -0
  693. package/package.json +28 -8
@@ -0,0 +1,275 @@
1
+ /**
2
+ * The design system an application already has, read from its files with nothing written for it: custom properties,
3
+ * Tailwind's `@theme` and configuration, and what shadcn's `components.json` points at.
4
+ *
5
+ * @remarks
6
+ * Nobody writes a tokens file for a catalogue they did not ask for, and an agent that finds no tokens writes colours by
7
+ * hand, so this is what a catalogue with no tokens file reads. No project code runs: the files are read as text
8
+ * (`appTokenFiles.ts`, `tailwindConfigTokens.ts`). Tailwind's default theme counts, since a project on Tailwind has it
9
+ * whether or not it writes any of its own, but it comes last in a list: it is not what makes this project's system.
10
+ *
11
+ * Later sources stand over earlier ones, and a difference between two files is a clash, reported as a tokens file's
12
+ * would be: other sheets, then the configuration, then the sheet `components.json` names.
13
+ *
14
+ * @module
15
+ */
16
+ import { realpathSync } from "node:fs";
17
+ import { dirname, relative } from "node:path";
18
+ import { packageFile, readConfigs, readSheets, shadcnConfig, smallFileText } from "./appTokenFiles.js";
19
+ import { readCssText } from "./cssDeclarations.js";
20
+ import { colorWrappers, resolvedTokens } from "./cssTokenValues.js";
21
+ import { readTailwindPalette } from "./tailwindConfigTokens.js";
22
+ import { tokenClashes } from "./tokenClashes.js";
23
+ import { unresolvedTokens } from "./unresolvedTokens.js";
24
+ /** A custom property's name, and no more. */
25
+ const TOKEN_NAME = /^--[\w.-]{1,100}$/;
26
+ /** Past this a value is not a token's, in characters. */
27
+ const LONGEST_TOKEN_VALUE = 500;
28
+ /** A block with this many custom properties is a system's root and not one component's variables. */
29
+ const SYSTEM_BLOCK = 12;
30
+ /** The steps of Tailwind's spacing scale that classes write, in units of its base. */
31
+ const SPACING_STEPS = [
32
+ 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
33
+ 60, 64, 72, 80, 96
34
+ ];
35
+ /** Tailwind 3's font sizes, which its configuration file does not list unless it changes them. */
36
+ const OLD_FONT_SIZES = {
37
+ xs: "0.75rem",
38
+ sm: "0.875rem",
39
+ base: "1rem",
40
+ lg: "1.125rem",
41
+ xl: "1.25rem",
42
+ "2xl": "1.5rem",
43
+ "3xl": "1.875rem",
44
+ "4xl": "2.25rem",
45
+ "5xl": "3rem",
46
+ "6xl": "3.75rem",
47
+ "7xl": "4.5rem",
48
+ "8xl": "6rem",
49
+ "9xl": "8rem"
50
+ };
51
+ /** Tailwind 3's radii. */
52
+ const OLD_RADII = {
53
+ sm: "0.125rem",
54
+ md: "0.375rem",
55
+ lg: "0.5rem",
56
+ xl: "0.75rem",
57
+ "2xl": "1rem",
58
+ "3xl": "1.5rem"
59
+ };
60
+ /** Plugins whose additions to the theme are not tokens worth saying they are unknown. */
61
+ const KNOWN_PLUGIN = /typography|forms|animate|container-queries|aspect-ratio/;
62
+ /** A path with forward slashes on every system, for an answer that travels. */
63
+ const toPosix = (path) => path.replaceAll("\\", "/");
64
+ /** Selectors holding enough custom properties to be a system's root, in a sheet. */
65
+ const systemSelectors = ({ declarations }) => {
66
+ const counts = new Map();
67
+ for (const { place } of declarations) {
68
+ if (place.kind === "selector")
69
+ counts.set(place.selector, (counts.get(place.selector) ?? 0) + 1);
70
+ }
71
+ return new Set([...counts].flatMap(([selector, count]) => count >= SYSTEM_BLOCK && /^[.#[][\w-]+\]?$/.test(selector) ? [selector] : []));
72
+ };
73
+ /** The kind and theme of a declaration read from a sheet, when it makes a token at all. */
74
+ const sheetToken = (place, system) => {
75
+ if (place.kind === "theme")
76
+ return { kind: "tailwind-theme", mode: undefined };
77
+ if (place.kind === "root")
78
+ return { kind: "css-variables", mode: undefined };
79
+ if (place.kind === "mode")
80
+ return { kind: "css-variables", mode: place.mode };
81
+ return place.kind === "selector" && system.has(place.selector)
82
+ ? { kind: "css-variables", mode: place.mode }
83
+ : undefined;
84
+ };
85
+ /**
86
+ * Whether a declaration is a token: not a framework's internals, a private variable or a way of clearing a namespace. A
87
+ * name is plain and a value short, since both reach an agent's context as its next step, and a file may be written by
88
+ * someone who wants that.
89
+ */
90
+ const isTokenName = (name) => TOKEN_NAME.test(name) && !name.startsWith("--tw-") && !name.startsWith("--_");
91
+ /** Whether a value is short enough to be a value. */
92
+ const isTokenValue = (value) => value !== "initial" && value.length <= LONGEST_TOKEN_VALUE;
93
+ /** The namespaces sheets clear (`--color-*: initial`), where Tailwind's defaults no longer apply. */
94
+ const clearedNamespaces = (sheets) => sheets.flatMap(({ reading }) => reading.declarations.flatMap(({ name, value }) => value === "initial" && name.endsWith("*") ? [name.slice(0, -1)] : []));
95
+ /** A sheet's declarations, in the shape tokens are made from. */
96
+ const sheetDeclarations = (dir, { file, reading }) => {
97
+ const system = systemSelectors(reading);
98
+ const label = toPosix(relative(dir, file));
99
+ return reading.declarations.flatMap(({ name, value, line, place }) => {
100
+ const token = sheetToken(place, system);
101
+ if (token === undefined || !isTokenName(name) || !isTokenValue(value))
102
+ return [];
103
+ return [
104
+ {
105
+ name,
106
+ value,
107
+ mode: token.mode,
108
+ origin: { kind: token.kind, file: label, line },
109
+ ...(place.kind === "selector" ? { isScoped: true } : {})
110
+ }
111
+ ];
112
+ });
113
+ };
114
+ /** Tailwind 4's default theme as declarations, when a sheet brings it in and it is installed. */
115
+ const themeDefaults = (sheets, cleared, unread) => {
116
+ const importing = sheets.find(({ reading }) => reading.importsTailwindTheme);
117
+ if (importing === undefined)
118
+ return [];
119
+ const file = packageFile(dirname(importing.file), "tailwindcss/theme.css");
120
+ const text = file === undefined ? undefined : smallFileText(file);
121
+ if (text === undefined) {
122
+ unread.push("Tailwind's default theme: tailwindcss is not installed here");
123
+ return [];
124
+ }
125
+ return readCssText(text).declarations.flatMap(({ name, value, line, place }) => place.kind === "theme" &&
126
+ isTokenName(name) &&
127
+ isTokenValue(value) &&
128
+ !cleared.some((prefix) => name.startsWith(prefix))
129
+ ? [{ name, value, mode: undefined, origin: { kind: "tailwind-default", file: "tailwindcss", line } }]
130
+ : []);
131
+ };
132
+ /** The spacing scale's steps as tokens: Tailwind makes them from one base, and classes write them. */
133
+ const spacingScale = (base, origin, declared) => SPACING_STEPS.flatMap((step) => {
134
+ const name = `--spacing-${step}`;
135
+ return declared.has(name)
136
+ ? []
137
+ : [{ name, value: `calc(${base} * ${step})`, mode: undefined, origin, type: "dimension" }];
138
+ });
139
+ /** Tailwind's published palette, read as text from the installed package; none when it is not there. */
140
+ const installedPalette = (dir) => {
141
+ const installed = packageFile(dir, "tailwindcss/lib/public/colors.js");
142
+ return installed === undefined ? undefined : readTailwindPalette(installed, smallFileText(installed) ?? "");
143
+ };
144
+ /** The colours a configuration takes from the palette by name: `brand: colors.blue` is a whole scale under `brand`. */
145
+ const paletteAliased = (aliases, palette, origin) => aliases.flatMap(({ name, palette: wanted }) => palette.flatMap(({ name: named, value, type }) => {
146
+ const full = `--color-${wanted}`;
147
+ if (named !== full && !named.startsWith(`${full}-`))
148
+ return [];
149
+ return [{ name: `${name}${named.slice(full.length)}`, value, mode: undefined, type, origin }];
150
+ }));
151
+ /** Tailwind's default palette and scale as declarations, for a project on a configuration file (before version 4). */
152
+ const configDefaults = (dir, configs, unread) => {
153
+ const replaced = new Set(configs.flatMap(({ reading }) => reading.replaced));
154
+ const palette = installedPalette(dir);
155
+ if (palette === undefined) {
156
+ unread.push("Tailwind's default palette: tailwindcss is not installed here");
157
+ return [];
158
+ }
159
+ const origin = { kind: "tailwind-default", file: "tailwindcss" };
160
+ const colors = replaced.has("colors")
161
+ ? []
162
+ : palette.map(({ name, value, type }) => ({ name, value, mode: undefined, type, origin }));
163
+ const scale = replaced.has("spacing") ? [] : spacingScale("0.25rem", origin, new Set());
164
+ const named = (prefix, values, key) => replaced.has(key)
165
+ ? []
166
+ : Object.entries(values).map(([name, value]) => ({
167
+ name: `${prefix}${name}`,
168
+ value,
169
+ mode: undefined,
170
+ type: "dimension",
171
+ origin
172
+ }));
173
+ return [
174
+ ...colors,
175
+ ...scale,
176
+ ...named("--text-", OLD_FONT_SIZES, "fontSize"),
177
+ ...named("--radius-", OLD_RADII, "borderRadius")
178
+ ];
179
+ };
180
+ /** A configuration's tokens as declarations. */
181
+ const configDeclarations = (dir, { file, reading }) => {
182
+ const origin = { kind: "tailwind-config", file: toPosix(relative(dir, file)) };
183
+ return [
184
+ ...paletteAliased(reading.paletteAliases, installedPalette(dirname(file)) ?? [], origin),
185
+ ...reading.tokens.map(({ name, value, type }) => ({ name, value, mode: undefined, type, origin }))
186
+ ].filter(({ name, value }) => isTokenName(name) && isTokenValue(value));
187
+ };
188
+ /** The clashes between files: each theme compared with itself. */
189
+ const clashesOf = (authors) => tokenClashes(authors.flatMap(({ label, declarations }) => [...new Set(declarations.map((each) => each.mode))].map((mode) => ({
190
+ mode,
191
+ raw: declarations
192
+ .filter((each) => each.mode === mode)
193
+ .map(({ name, value }) => ({ name, value, label, source: label }))
194
+ }))));
195
+ /** What the tokens came from, each file once with how many it gave. */
196
+ const sourcesOf = (tokens) => {
197
+ const counts = new Map();
198
+ for (const { origin } of tokens) {
199
+ if (origin === undefined)
200
+ continue;
201
+ const key = `${origin.kind}\0${origin.file}`;
202
+ const known = counts.get(key);
203
+ counts.set(key, { kind: origin.kind, file: origin.file, tokens: (known?.tokens ?? 0) + 1 });
204
+ }
205
+ return [...counts.values()];
206
+ };
207
+ /** Tailwind's defaults for a project, whichever version it is on, and the spacing scale over its own declarations. */
208
+ const defaultDeclarations = (dir, sheets, configs, own, unread) => {
209
+ const cleared = clearedNamespaces(sheets);
210
+ const hasTheme = sheets.some(({ reading }) => reading.importsTailwindTheme);
211
+ const isOnConfig = sheets.some(({ reading }) => reading.usesTailwindDirectives) || configs.length > 0;
212
+ if (!hasTheme) {
213
+ return isOnConfig ? configDefaults(dir, configs, unread) : [];
214
+ }
215
+ const defaults = themeDefaults(sheets, cleared, unread);
216
+ const base = [...defaults, ...own].findLast((each) => each.name === "--spacing" && each.mode === undefined);
217
+ const scale = base === undefined || cleared.includes("--spacing-")
218
+ ? []
219
+ : spacingScale(base.value, { kind: "tailwind-default", file: base.origin.file }, new Set(own.map((each) => each.name)));
220
+ return [...defaults, ...scale];
221
+ };
222
+ /**
223
+ * Reads what an application declares of its design system.
224
+ *
225
+ * @param folder - the catalogue's folder.
226
+ */
227
+ export const readAppTokens = (folder) => {
228
+ // a sheet's path comes back with its links followed, and the labels are relative to this
229
+ const dir = realpathSync(folder);
230
+ const unread = [];
231
+ const shadcn = shadcnConfig(dir);
232
+ const sheets = readSheets(dir, shadcn, unread);
233
+ const configs = readConfigs(dir, shadcn, sheets, unread);
234
+ for (const { file, reading } of configs) {
235
+ unread.push(...reading.unread.map((each) => `${toPosix(relative(dir, file))}: ${each}`));
236
+ }
237
+ for (const plugin of new Set(sheets.flatMap(({ reading }) => reading.plugins))) {
238
+ if (!KNOWN_PLUGIN.test(plugin))
239
+ unread.push(`Tailwind plugin ${plugin}: what it adds to the theme is known only by running it`);
240
+ }
241
+ const authorOf = (file, declarations) => ({
242
+ label: toPosix(relative(dir, file)),
243
+ declarations
244
+ });
245
+ const fromSheets = sheets.map((sheet) => authorOf(sheet.file, sheetDeclarations(dir, sheet)));
246
+ const named = shadcn?.css === undefined ? undefined : toPosix(relative(dir, shadcn.css));
247
+ const authors = [
248
+ ...fromSheets.filter(({ label }) => label !== named),
249
+ ...configs.map((config) => authorOf(config.file, configDeclarations(dir, config))),
250
+ ...fromSheets.filter(({ label }) => label === named)
251
+ ];
252
+ const declared = authors.flatMap(({ declarations }) => declarations);
253
+ const onDocument = new Set(declared.filter((each) => each.isScoped !== true).map((each) => each.name));
254
+ const own = declared.filter((each) => each.isScoped !== true || !onDocument.has(each.name));
255
+ const lowest = defaultDeclarations(dir, sheets, configs, own, unread);
256
+ const wrappers = colorWrappers([...sheets, ...configs].map(({ text }) => text));
257
+ const declarations = [...lowest, ...own];
258
+ const tokens = resolvedTokens(declarations, wrappers);
259
+ const unresolved = unresolvedTokens(dir, { sheets, configs, declarations });
260
+ const isDefault = (token) => token.origin?.kind === "tailwind-default";
261
+ const ordered = [...tokens.filter((token) => !isDefault(token)), ...tokens.filter(isDefault)];
262
+ return {
263
+ tokens: ordered,
264
+ clashes: clashesOf(authors),
265
+ sources: [
266
+ ...(shadcn === undefined
267
+ ? []
268
+ : [{ kind: "components-json", file: toPosix(relative(dir, shadcn.file)), tokens: 0 }]),
269
+ ...sourcesOf(ordered)
270
+ ],
271
+ problems: unresolved.problems,
272
+ unread: [...unread, ...unresolved.unread],
273
+ files: [...sheets, ...configs].map(({ file }) => file).concat(shadcn === undefined ? [] : [shadcn.file])
274
+ };
275
+ };
@@ -10,6 +10,11 @@
10
10
  * whose stories are all args has no code, most components have no page) is written in the module itself. Either way
11
11
  * the loader answers the text, as the query's module's default did.
12
12
  *
13
+ * The packed texts of a group go in shared files, in the rows' order, up to `PACK_LIMIT` of JSON each, rather than a
14
+ * file each: gzip reads each file alone, and the docs of neighbouring components repeat their keys, their types and
15
+ * their wording, which a file of one text cannot share. On a library of small components a file each weighs ten times
16
+ * what the same texts weigh together, and a page that asks for one text fetches a few kilobytes more.
17
+ *
13
18
  * The texts are a module of their own (`TEXTS_PREFIX`), imported by the group's module alone, so the bundler keeps
14
19
  * them in its chunk. Reading them waits for every component's docs, seconds on a large library: written in the group's
15
20
  * module, they would hold back the stories it imports, and everything those import, until the last docs were read. As
@@ -23,6 +28,11 @@ import { type IndexedStoryFile } from "./storyFilesModule.ts";
23
28
  import type { ComponentPageText, KeptCode, TextModuleContext } from "./textModules.ts";
24
29
  /** A story file's texts as their queries' modules answer them: its component's docs, its stories' code, its page. */
25
30
  export type FileTexts = readonly [docs: unknown, code: KeptCode, page: ComponentPageText];
31
+ /**
32
+ * The JSON a packed file holds at most, in characters, unless one text alone is longer: enough for the docs of a few
33
+ * components to share their words, little enough that a page asking for one text fetches a few kilobytes.
34
+ */
35
+ export declare const PACK_LIMIT: number;
26
36
  /**
27
37
  * The code of a group's texts module: the functions its loaders call, then, as its default, each file's loaders of its
28
38
  * docs, code and page, in the order of the group's rows.
@@ -10,6 +10,11 @@
10
10
  * whose stories are all args has no code, most components have no page) is written in the module itself. Either way
11
11
  * the loader answers the text, as the query's module's default did.
12
12
  *
13
+ * The packed texts of a group go in shared files, in the rows' order, up to `PACK_LIMIT` of JSON each, rather than a
14
+ * file each: gzip reads each file alone, and the docs of neighbouring components repeat their keys, their types and
15
+ * their wording, which a file of one text cannot share. On a library of small components a file each weighs ten times
16
+ * what the same texts weigh together, and a page that asks for one text fetches a few kilobytes more.
17
+ *
13
18
  * The texts are a module of their own (`TEXTS_PREFIX`), imported by the group's module alone, so the bundler keeps
14
19
  * them in its chunk. Reading them waits for every component's docs, seconds on a large library: written in the group's
15
20
  * module, they would hold back the stories it imports, and everything those import, until the last docs were read. As
@@ -25,37 +30,64 @@ import { indexedStoryFiles, storyFilesGroupOf, storyFilesGroupText } from "./sto
25
30
  import { VITE_PATHS } from "./vitePaths.js";
26
31
  /** The function that makes a packed file's loader, in the generated code. */
27
32
  const PACKED = "packedText";
33
+ /** The function that makes the loader of one text of a packed file, in the generated code. */
34
+ const PART = "packedPart";
35
+ /** The loaders of the packed files, in the generated code, numbered. */
36
+ const PACKED_FILE = "packedTexts";
28
37
  /** The function that makes the loader of a text written in the module, in the generated code. */
29
38
  const WRITTEN = "writtenText";
30
39
  /**
31
- * Writes texts as loaders: each in a gzipped file, or in the module when that weighs no more than the file and its
32
- * address (an empty page's JSON is shorter than its gzip header and the fetch it would cost). A text written in the
33
- * module is written once, however many files share it (most story files have no code and no page), and its loader
34
- * shared with them.
35
- *
36
- * @param emit - writes a packed file.
40
+ * The JSON a packed file holds at most, in characters, unless one text alone is longer: enough for the docs of a few
41
+ * components to share their words, little enough that a page asking for one text fetches a few kilobytes.
37
42
  */
38
- const textWriter = (emit) => {
39
- const names = new Map();
40
- const written = (json) => {
41
- const name = names.get(json) ?? `${WRITTEN}${names.size}`;
42
- names.set(json, name);
43
- return name;
43
+ export const PACK_LIMIT = 64 * 1024;
44
+ /**
45
+ * Writes texts as loaders: each in a packed file shared with its neighbours, or in the module when it weighs no more
46
+ * than its loader there (an empty page, a story file with no code). A text is written once, however many files share
47
+ * it, and its loader shared with them.
48
+ */
49
+ const textWriter = () => {
50
+ const written = new Map();
51
+ const packed = new Map();
52
+ const packs = [];
53
+ const pack = (json) => {
54
+ const known = packed.get(json);
55
+ if (known !== undefined)
56
+ return known;
57
+ let last = packs.at(-1);
58
+ if (last === undefined || (last.texts.length > 0 && last.length + json.length > PACK_LIMIT)) {
59
+ last = { texts: [], length: 0 };
60
+ packs.push(last);
61
+ }
62
+ const loader = `${PART}(${PACKED_FILE}${packs.length - 1},${last.texts.length})`;
63
+ last.texts.push(json);
64
+ last.length += json.length;
65
+ packed.set(json, loader);
66
+ return loader;
44
67
  };
45
68
  return {
46
69
  loaderOf: (value) => {
47
70
  const json = JSON.stringify(value);
48
- const fileName = packedFileName(json);
49
- const address = codeLiteral(fileName);
50
- const packed = gzippedJson(json);
51
- if (json.length <= address.length + packed.length)
52
- return written(json);
53
- emit({ type: "asset", fileName, source: packed });
54
- return `${PACKED}(${address})`;
71
+ if (written.has(json) || json.length <= `${PART}(${PACKED_FILE}${packs.length},0)`.length) {
72
+ const name = written.get(json) ?? `${WRITTEN}${written.size}`;
73
+ written.set(json, name);
74
+ return name;
75
+ }
76
+ return pack(json);
55
77
  },
56
- written: () => [...names].map(([json, name]) => `const ${name} = () => Promise.resolve(${codeOfJson(json)});`)
78
+ code: (emit) => [
79
+ ...[...written].map(([json, name]) => `const ${name} = () => Promise.resolve(${codeOfJson(json)});`),
80
+ ...packs.map((each, at) => {
81
+ const json = `[${each.texts.join(",")}]`;
82
+ const fileName = packedFileName(json);
83
+ emit({ type: "asset", fileName, source: gzippedJson(json) });
84
+ return `const ${PACKED_FILE}${at} = ${PACKED}(${codeLiteral(fileName)});`;
85
+ })
86
+ ]
57
87
  };
58
88
  };
89
+ /** The code of the function that makes the loader of one text of a packed file: it answers the same value each time. */
90
+ const PART_MAKER = `const ${PART} = (load, at) => () => load().then((texts) => texts[at]);`;
59
91
  /**
60
92
  * Every file's texts, read: a build reads them all once, as it would for their modules.
61
93
  *
@@ -73,10 +105,15 @@ const readTexts = (files, read) => Promise.all(files.map(({ file }) => Promise.a
73
105
  */
74
106
  export const textsModuleCode = (texts, emit) => {
75
107
  // written in the files' order once all are read, so the names in the module do not depend on which read ended first
76
- const writer = textWriter(emit);
108
+ const writer = textWriter();
77
109
  // a text not read (the docs of a catalogue that reads none) has no loader, and its place stays in the row
78
110
  const rows = texts.map((each) => `[${each.map((text) => (text === undefined ? "null" : writer.loaderOf(text))).join(", ")}]`);
79
- return [packedLoaderMaker(PACKED), ...writer.written(), `export default [${rows.join(",\n")}];`].join("\n");
111
+ return [
112
+ packedLoaderMaker(PACKED),
113
+ PART_MAKER,
114
+ ...writer.code(emit),
115
+ `export default [${rows.join(",\n")}];`
116
+ ].join("\n");
80
117
  };
81
118
  /**
82
119
  * A build's readers of the texts: the code and the pages as their queries answer them, read with the modules that
@@ -1,10 +1,12 @@
1
1
  import type { UserConfig } from "vite";
2
2
  import { type ResolvedConfig } from "./configFile.ts";
3
+ import { type ScanFindings } from "./prebundled.ts";
3
4
  /**
4
5
  * What the plugin sets in Vite's configuration for a catalogue: its folder as the root, what to pre-bundle, the pages
5
6
  * as the build's inputs, and the dev server's reads kept to each origin.
6
7
  *
7
8
  * @param config - the catalogue's configuration.
8
9
  * @param userConfig - the configuration so far, whose own `server.cors` and build output the plugin leaves alone.
10
+ * @param findings - where the dependency scan's warnings and problems go.
9
11
  */
10
- export declare const catalogueConfig: (config: ResolvedConfig, userConfig: UserConfig) => UserConfig;
12
+ export declare const catalogueConfig: (config: ResolvedConfig, userConfig: UserConfig, findings?: Omit<ScanFindings, "root">) => UserConfig;
@@ -7,7 +7,8 @@
7
7
  import { readFileSync } from "node:fs";
8
8
  import { packageResolver } from "./configFile.js";
9
9
  import { pageModulePath } from "./pages.js";
10
- import { prebundled, scannedEntries } from "./prebundled.js";
10
+ import { prebundled, scannedEntries, scanOptions } from "./prebundled.js";
11
+ import { refsDefine } from "./refsConfig.js";
11
12
  /**
12
13
  * A file's text, or none when it cannot be read.
13
14
  *
@@ -34,14 +35,25 @@ const hasOwnOutput = (userConfig) => userConfig.build?.rolldownOptions?.output !
34
35
  *
35
36
  * @param config - the catalogue's configuration.
36
37
  * @param userConfig - the configuration so far, whose own `server.cors` and build output the plugin leaves alone.
38
+ * @param findings - where the dependency scan's warnings and problems go.
37
39
  */
38
- export const catalogueConfig = (config, userConfig) => ({
40
+ export const catalogueConfig = (config, userConfig, findings = {}) => ({
39
41
  root: config.dir,
42
+ // a hoisted workspace can keep a package's React in its folder while the adapter, at the root, reads another copy, and
43
+ // every component then fails with "invalid hook call": the catalogue's folder decides
44
+ resolve: { dedupe: ["react", "react-dom"] },
45
+ // a catalogue that composes no other has every part of composition removed from its shell (`shell/composition.ts`)
46
+ define: refsDefine(config.refs),
40
47
  // the pages are generated, so Vite's scanner cannot find what they import: it is named here, and the
41
48
  // story files (the project's and the sources') are scanned for what their components import
42
49
  optimizeDeps: {
43
50
  include: prebundled(config, packageResolver(config.dir)),
44
- entries: scannedEntries(config, packageResolver(config.dir), readTextFile)
51
+ entries: scannedEntries(config, packageResolver(config.dir), readTextFile),
52
+ rolldownOptions: scanOptions({
53
+ root: config.dir,
54
+ isJsxInScripts: config.framework.compilesJsxInScripts === true,
55
+ ...findings
56
+ })
45
57
  },
46
58
  build: {
47
59
  rolldownOptions: {
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Which changed files a person sees, and which stories show them: what `verify` holds a change to.
3
+ *
4
+ * @remarks
5
+ * Pure. A UI file is a component or a style sheet, by its extension, and a story file; a plain script is one only when
6
+ * its text defines or draws a component, since most scripts are logic a change may touch freely, and a script a story
7
+ * reaches is checked by that story anyway. Tests, type declarations and what a tool wrote are not. A file reached through
8
+ * another component's stories counts as covered, and says so: a private part rarely has stories of its own, and they run
9
+ * it. A file only another catalogue of the repository can answer for is named and neither passes nor fails; any other
10
+ * file nothing reaches is this catalogue's to fail, or a component in a package beside it would pass unseen.
11
+ *
12
+ * @module
13
+ */
14
+ import type { ChangedUiFile } from "./agent.types.ts";
15
+ import type { ReachedStory } from "./storyReach.ts";
16
+ /**
17
+ * Whether a changed file is one a person sees.
18
+ *
19
+ * @param file - the file, relative to the repository.
20
+ * @param readText - its text; a plain script's is read to tell whether it defines a component.
21
+ */
22
+ export declare const isUiFile: (file: string, readText: (file: string) => string) => boolean;
23
+ /** A story with its id, as the catalogue lists it. */
24
+ export type IdentifiedStory = {
25
+ /** Its id. */
26
+ readonly id: string;
27
+ /** What it reaches. */
28
+ readonly reach: ReachedStory;
29
+ };
30
+ /**
31
+ * The forms a deleted file can have left in the graph: what still imports it wrote it with no extension, or by its
32
+ * folder.
33
+ *
34
+ * @param file - the deleted file, absolute.
35
+ */
36
+ export declare const deletedForms: (file: string) => readonly string[];
37
+ /** What `changedUiFiles` reads. */
38
+ export type UiFilesInput = {
39
+ /** The files that changed, with their forms in the graph, relative to the repository and to the catalogue. */
40
+ readonly files: readonly {
41
+ readonly file: string;
42
+ readonly path: string;
43
+ readonly absolute: string;
44
+ readonly isDeleted: boolean;
45
+ }[];
46
+ /** The catalogue's stories. */
47
+ readonly stories: readonly IdentifiedStory[];
48
+ /** The files every story shows. */
49
+ readonly everyStoryFiles: ReadonlySet<string>;
50
+ /** Whether a file, in the graph's form, belongs to another catalogue of the repository. */
51
+ readonly isOtherCatalogues: (absolute: string) => boolean;
52
+ /** Reads a file by its path relative to the repository. */
53
+ readonly readText: (file: string) => string;
54
+ };
55
+ /**
56
+ * The changed files a person sees: those this catalogue can show, with their stories, and those it cannot speak for. A
57
+ * deleted file with no story behind it is left out, as there is nothing left to look at, and so is what every story shows
58
+ * while the catalogue has no story.
59
+ *
60
+ * @param input - the change and the catalogue.
61
+ */
62
+ export declare const changedUiFiles: ({ files, stories, everyStoryFiles, isOtherCatalogues, readText }: UiFilesInput) => {
63
+ readonly uiFiles: readonly ChangedUiFile[];
64
+ readonly outside: readonly string[];
65
+ };
66
+ /**
67
+ * Whether the nearest catalogue above a file is another one.
68
+ *
69
+ * @param file - the file, absolute, under the catalogue's root as named.
70
+ * @param own - this catalogue's folder.
71
+ * @param root - the repository's folder, in the same form: nothing above it is looked at.
72
+ * @param hasCatalogue - whether a folder holds a catalogue's configuration.
73
+ */
74
+ export declare const belongsToOtherCatalogue: (file: string, own: string, root: string, hasCatalogue: (folder: string) => boolean) => boolean;
@@ -0,0 +1,120 @@
1
+ import { CHECKED_FILE } from "./checkCode.js";
2
+ import { VITE_PATHS } from "./vitePaths.js";
3
+ /** A story file, in any framework's extension; a snapshot of one is not. */
4
+ const STORY_FILE = /\.stories\.(?:[cm]?[jt]sx?|vue|svelte|astro)$/;
5
+ /** A test's file or helper, wherever it sits. */
6
+ const TEST_FILE = /(?:\.test\.|\.spec\.|\.e2e\.|\.cy\.|_test\.|(?:^|\/)(?:__tests__|__mocks__|__snapshots__|e2e|cypress)\/|(?:^|\/)test-?utils\.)/;
7
+ /** A folder of tests; under `src` a folder of that name is as likely a feature. */
8
+ const TESTS_FOLDER = /(?:^|\/)tests?\//;
9
+ /** What is under `src`. */
10
+ const UNDER_SRC = /(?:^|\/)src\//;
11
+ /** What is written by a tool, or only types: nobody sees it change. */
12
+ const NOT_SEEN = /(?:\.d\.[cm]?ts$|\.min\.|(?:^|\/)(?:dist|generated|node_modules)\/)/;
13
+ /** Components and sheets `check-code` does not read for values, and an Angular component's files. */
14
+ const OTHER_UI_FILE = /(?:\.component\.(?:ts|html)|\.(?:css|styles?)\.[cm]?[jt]s|\.(?:pcss|postcss|styl))$/;
15
+ /** A plain script. */
16
+ const SCRIPT_FILE = /\.[cm]?[jt]s$/;
17
+ /** A script's text that defines a component: a custom element, an Angular component, a Vue one, a tagged template. */
18
+ const DEFINES_COMPONENT = /\bcustomElements\.define\(|@customElement\(|\bextends\s+(?:LitElement|HTMLElement)\b|@Component\(|\bdefineComponent\(|(?<![\w./-])html`/;
19
+ /** A JavaScript file, which may hold JSX with no extension to say so; TypeScript cannot without `.tsx`. */
20
+ const PLAIN_JAVASCRIPT = /\.[cm]?js$/;
21
+ /** JSX in a file's text: a closing tag, or a component closed on itself. */
22
+ const DRAWS_JSX = /<\/[A-Za-z][\w.-]{0,80}>|<[A-Z][\w.]{0,80}[^<>\n]{0,500}\/>/;
23
+ /**
24
+ * Whether a changed file is one a person sees.
25
+ *
26
+ * @param file - the file, relative to the repository.
27
+ * @param readText - its text; a plain script's is read to tell whether it defines a component.
28
+ */
29
+ export const isUiFile = (file, readText) => {
30
+ if (TEST_FILE.test(file) || NOT_SEEN.test(file))
31
+ return false;
32
+ if (TESTS_FOLDER.test(file) && !UNDER_SRC.test(file))
33
+ return false;
34
+ if (STORY_FILE.test(file) || CHECKED_FILE.test(file) || OTHER_UI_FILE.test(file))
35
+ return true;
36
+ if (!SCRIPT_FILE.test(file))
37
+ return false;
38
+ const text = readText(file);
39
+ return DEFINES_COMPONENT.test(text) || (PLAIN_JAVASCRIPT.test(file) && DRAWS_JSX.test(text));
40
+ };
41
+ /**
42
+ * The forms a deleted file can have left in the graph: what still imports it wrote it with no extension, or by its
43
+ * folder.
44
+ *
45
+ * @param file - the deleted file, absolute.
46
+ */
47
+ export const deletedForms = (file) => {
48
+ const bare = file.replace(/\.[^./]+$/, "");
49
+ return [file, bare, ...(bare.endsWith("/index") ? [bare.slice(0, -"/index".length)] : [])];
50
+ };
51
+ /**
52
+ * How a changed file is covered.
53
+ *
54
+ * @param forms - the file's forms in the graph.
55
+ * @param stories - the catalogue's stories.
56
+ * @param everyStory - whether every story shows it: the catalogue's preview and its sheets.
57
+ */
58
+ const coverageOf = (forms, stories, everyStory) => {
59
+ const reaching = everyStory
60
+ ? stories
61
+ : stories.filter(({ reach }) => forms.some((form) => reach.files.includes(form)));
62
+ // what every story shows is none's own, though a story may name it
63
+ const isOwn = !everyStory && reaching.some(({ reach }) => forms.some((form) => reach.own.includes(form)));
64
+ const covering = isOwn ? "own" : "through";
65
+ return { coverage: reaching.length === 0 ? "none" : covering, stories: reaching.map(({ id }) => id) };
66
+ };
67
+ /**
68
+ * The changed files a story can show: what every story shows is none of them while the catalogue has no story, as a
69
+ * catalogue just set up has its preview and nothing yet that shows it.
70
+ *
71
+ * @param files - the changed files.
72
+ * @param stories - the catalogue's stories.
73
+ * @param everyStoryFiles - the files every story shows.
74
+ */
75
+ const shownFiles = (files, stories, everyStoryFiles) => stories.length > 0 ? files : files.filter(({ absolute }) => !everyStoryFiles.has(absolute));
76
+ /**
77
+ * The changed files a person sees: those this catalogue can show, with their stories, and those it cannot speak for. A
78
+ * deleted file with no story behind it is left out, as there is nothing left to look at, and so is what every story shows
79
+ * while the catalogue has no story.
80
+ *
81
+ * @param input - the change and the catalogue.
82
+ */
83
+ export const changedUiFiles = ({ files, stories, everyStoryFiles, isOtherCatalogues, readText }) => {
84
+ const uiFiles = [];
85
+ const outside = [];
86
+ for (const { file, path, absolute, isDeleted } of shownFiles(files, stories, everyStoryFiles)) {
87
+ if (!isUiFile(file, isDeleted ? () => "" : readText))
88
+ continue;
89
+ const forms = isDeleted ? deletedForms(absolute) : [absolute];
90
+ const found = coverageOf(forms, stories, everyStoryFiles.has(absolute));
91
+ if (found.coverage === "none" && isDeleted)
92
+ continue;
93
+ if (found.coverage === "none" && isOtherCatalogues(absolute))
94
+ outside.push(file);
95
+ else
96
+ uiFiles.push({ file, path, ...found });
97
+ }
98
+ return { uiFiles, outside };
99
+ };
100
+ /**
101
+ * Whether the nearest catalogue above a file is another one.
102
+ *
103
+ * @param file - the file, absolute, under the catalogue's root as named.
104
+ * @param own - this catalogue's folder.
105
+ * @param root - the repository's folder, in the same form: nothing above it is looked at.
106
+ * @param hasCatalogue - whether a folder holds a catalogue's configuration.
107
+ */
108
+ export const belongsToOtherCatalogue = (file, own, root, hasCatalogue) => {
109
+ let folder = VITE_PATHS.dirname(file);
110
+ while (folder === root || folder.startsWith(`${root}/`)) {
111
+ if (folder === own)
112
+ return false;
113
+ if (hasCatalogue(folder))
114
+ return true;
115
+ if (folder === root)
116
+ return false;
117
+ folder = VITE_PATHS.dirname(folder);
118
+ }
119
+ return false;
120
+ };