forgebook 0.3.3 → 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.
- package/README.md +914 -72
- package/dist/bin/forgebook/agentClient.d.ts +2 -1
- package/dist/bin/forgebook/agentClient.js +13 -6
- package/dist/bin/forgebook/agentGuide.d.ts +59 -0
- package/dist/bin/forgebook/agentGuide.js +203 -0
- package/dist/bin/forgebook/agentLoopCommands.mjs +22 -42
- package/dist/bin/forgebook/agentSetup/agentFiles.d.ts +55 -0
- package/dist/bin/forgebook/agentSetup/agentFiles.js +319 -0
- package/dist/bin/forgebook/agentSetup/assistantHooks.d.ts +71 -0
- package/dist/bin/forgebook/agentSetup/assistantHooks.js +125 -0
- package/dist/bin/forgebook/agentSetup/ciWorkflow.d.ts +23 -0
- package/dist/bin/forgebook/agentSetup/ciWorkflow.js +55 -0
- package/dist/bin/forgebook/agentSetup/drawCandidates.d.ts +25 -0
- package/dist/bin/forgebook/agentSetup/drawCandidates.js +116 -0
- package/dist/bin/forgebook/agentSetup/drawDiagnosis.d.ts +28 -0
- package/dist/bin/forgebook/agentSetup/drawDiagnosis.js +134 -0
- package/dist/bin/forgebook/agentSetup/drawRun.d.ts +91 -0
- package/dist/bin/forgebook/agentSetup/drawRun.js +353 -0
- package/dist/bin/forgebook/agentSetup/hookNames.d.ts +7 -0
- package/dist/bin/forgebook/agentSetup/hookNames.js +7 -0
- package/dist/bin/forgebook/agentSetup/initAgentSteps.d.ts +48 -0
- package/dist/bin/forgebook/agentSetup/initAgentSteps.js +104 -0
- package/dist/bin/forgebook/agentSetup/liftedProviders.d.ts +17 -0
- package/dist/bin/forgebook/agentSetup/liftedProviders.js +186 -0
- package/dist/bin/forgebook/agentSetup/projectRunner.d.ts +46 -0
- package/dist/bin/forgebook/agentSetup/projectRunner.js +85 -0
- package/dist/bin/forgebook/agentSetup/stopHook.d.ts +65 -0
- package/dist/bin/forgebook/agentSetup/stopHook.js +202 -0
- package/dist/bin/forgebook/agentSetup/uniformPicture.d.ts +7 -0
- package/dist/bin/forgebook/agentSetup/uniformPicture.js +98 -0
- package/dist/bin/forgebook/agentSetupCommands.d.mts +14 -0
- package/dist/bin/forgebook/agentSetupCommands.mjs +98 -0
- package/dist/bin/forgebook/agentText.d.ts +23 -3
- package/dist/bin/forgebook/agentText.js +175 -28
- package/dist/bin/forgebook/agents.md +20 -191
- package/dist/bin/forgebook/agentsText.js +2 -1
- package/dist/bin/forgebook/appBuild/appBuild.d.ts +59 -0
- package/dist/bin/forgebook/appBuild/appBuild.js +213 -0
- package/dist/bin/forgebook/appBuild/appViteConfig.d.ts +96 -0
- package/dist/bin/forgebook/appBuild/appViteConfig.js +320 -0
- package/dist/bin/forgebook/appBuild/tsconfigPaths.d.ts +14 -0
- package/dist/bin/forgebook/appBuild/tsconfigPaths.js +80 -0
- package/dist/bin/forgebook/auditCommand.d.mts +8 -0
- package/dist/bin/forgebook/auditCommand.mjs +75 -0
- package/dist/bin/forgebook/auditRun.d.ts +95 -0
- package/dist/bin/forgebook/auditRun.js +270 -0
- package/dist/bin/forgebook/browserRun.d.ts +21 -0
- package/dist/bin/forgebook/browserRun.js +57 -0
- package/dist/bin/forgebook/buildFailure.d.ts +7 -0
- package/dist/bin/forgebook/buildFailure.js +47 -0
- package/dist/bin/forgebook/buildWatch.d.ts +52 -0
- package/dist/bin/forgebook/buildWatch.js +137 -0
- package/dist/bin/forgebook/builtCatalogue.js +9 -5
- package/dist/bin/forgebook/catalogueCommands.d.ts +9 -0
- package/dist/bin/forgebook/catalogueCommands.js +23 -0
- package/dist/bin/forgebook/catalogueVite.d.ts +5 -1
- package/dist/bin/forgebook/catalogueVite.js +14 -6
- package/dist/bin/forgebook/commandCacheClaim.d.ts +18 -0
- package/dist/bin/forgebook/commandCacheClaim.js +170 -0
- package/dist/bin/forgebook/commandServer.d.ts +8 -0
- package/dist/bin/forgebook/commandServer.js +61 -13
- package/dist/bin/forgebook/forgebookCommands.mjs +105 -28
- package/dist/bin/forgebook/graphCommand.d.mts +8 -0
- package/dist/bin/forgebook/graphCommand.mjs +84 -0
- package/dist/bin/forgebook/guide/commands.md +57 -0
- package/dist/bin/forgebook/guide/devices.md +17 -0
- package/dist/bin/forgebook/guide/docs-pages.md +13 -0
- package/dist/bin/forgebook/guide/frameworks/angular.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/html.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/nextjs.md +23 -0
- package/dist/bin/forgebook/guide/frameworks/nuxt.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/preact.md +16 -0
- package/dist/bin/forgebook/guide/frameworks/react-native-web.md +21 -0
- package/dist/bin/forgebook/guide/frameworks/react.md +16 -0
- package/dist/bin/forgebook/guide/frameworks/solid.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/svelte.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/sveltekit.md +23 -0
- package/dist/bin/forgebook/guide/frameworks/vue.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/web-components.md +21 -0
- package/dist/bin/forgebook/guide/links.md +29 -0
- package/dist/bin/forgebook/guide/setup.md +23 -0
- package/dist/bin/forgebook/guide/stories.md +90 -0
- package/dist/bin/forgebook/guide/switches.md +43 -0
- package/dist/bin/forgebook/guideCommand.d.mts +13 -0
- package/dist/bin/forgebook/guideCommand.mjs +37 -0
- package/dist/bin/forgebook/importers/storybook.d.ts +21 -0
- package/dist/bin/forgebook/importers/storybook.js +11 -5
- package/dist/bin/forgebook/importers/storybookFrameworks.js +1 -1
- package/dist/bin/forgebook/initCommands.d.mts +11 -0
- package/dist/bin/forgebook/initCommands.mjs +51 -78
- package/dist/bin/forgebook/initConfig.d.ts +5 -3
- package/dist/bin/forgebook/initConfig.js +6 -3
- package/dist/bin/forgebook/initInstall.d.ts +15 -0
- package/dist/bin/forgebook/initInstall.js +77 -0
- package/dist/bin/forgebook/initPrint.d.ts +9 -0
- package/dist/bin/forgebook/initPrint.js +60 -0
- package/dist/bin/forgebook/initRefusals.d.ts +45 -0
- package/dist/bin/forgebook/initRefusals.js +91 -0
- package/dist/bin/forgebook/initRun.d.ts +28 -0
- package/dist/bin/forgebook/initRun.js +311 -0
- package/dist/bin/forgebook/mcpCommand.mjs +38 -4
- package/dist/bin/forgebook/mcpGraph.d.ts +13 -0
- package/dist/bin/forgebook/mcpGraph.js +24 -0
- package/dist/bin/forgebook/mcpTokens.d.ts +14 -0
- package/dist/bin/forgebook/mcpTokens.js +58 -0
- package/dist/bin/forgebook/mcpToolParts.d.ts +7 -0
- package/dist/bin/forgebook/mcpToolParts.js +10 -0
- package/dist/bin/forgebook/mcpTools.d.ts +13 -6
- package/dist/bin/forgebook/mcpTools.js +57 -90
- package/dist/bin/forgebook/mcpVerify.d.ts +16 -0
- package/dist/bin/forgebook/mcpVerify.js +36 -0
- package/dist/bin/forgebook/migrate/codemods.d.ts +11 -0
- package/dist/bin/forgebook/migrate/codemods.js +61 -0
- package/dist/bin/forgebook/migrate/migrate.types.d.ts +117 -0
- package/dist/bin/forgebook/migrate/migrate.types.js +5 -0
- package/dist/bin/forgebook/migrate/migrateCommand.d.mts +8 -0
- package/dist/bin/forgebook/migrate/migrateCommand.mjs +76 -0
- package/dist/bin/forgebook/migrate/migrateRun.d.ts +61 -0
- package/dist/bin/forgebook/migrate/migrateRun.js +210 -0
- package/dist/bin/forgebook/migrate/migrateText.d.ts +12 -0
- package/dist/bin/forgebook/migrate/migrateText.js +30 -0
- package/dist/bin/forgebook/migrate/migrateWrite.d.ts +27 -0
- package/dist/bin/forgebook/migrate/migrateWrite.js +66 -0
- package/dist/bin/forgebook/migrate/objectEdits.d.ts +70 -0
- package/dist/bin/forgebook/migrate/objectEdits.js +241 -0
- package/dist/bin/forgebook/migrate/playOnInBuilds.d.ts +3 -0
- package/dist/bin/forgebook/migrate/playOnInBuilds.js +86 -0
- package/dist/bin/forgebook/migrate/propGroupStrings.d.ts +5 -0
- package/dist/bin/forgebook/migrate/propGroupStrings.js +81 -0
- package/dist/bin/forgebook/newProject/newProject.d.ts +39 -0
- package/dist/bin/forgebook/newProject/newProject.js +180 -0
- package/dist/bin/forgebook/newProject/newProject.types.d.ts +97 -0
- package/dist/bin/forgebook/newProject/newProject.types.js +6 -0
- package/dist/bin/forgebook/newProject/packageManagers.d.ts +51 -0
- package/dist/bin/forgebook/newProject/packageManagers.js +121 -0
- package/dist/bin/forgebook/newProject/projectEntries.d.ts +62 -0
- package/dist/bin/forgebook/newProject/projectEntries.js +191 -0
- package/dist/bin/forgebook/newProject/projectFrameworks.d.ts +57 -0
- package/dist/bin/forgebook/newProject/projectFrameworks.js +148 -0
- package/dist/bin/forgebook/newProject/projectLook.d.ts +23 -0
- package/dist/bin/forgebook/newProject/projectLook.js +293 -0
- package/dist/bin/forgebook/newProject/projectPackages.d.ts +66 -0
- package/dist/bin/forgebook/newProject/projectPackages.js +178 -0
- package/dist/bin/forgebook/newRepair.d.ts +45 -0
- package/dist/bin/forgebook/newRepair.js +157 -0
- package/dist/bin/forgebook/newRepairRun.d.ts +69 -0
- package/dist/bin/forgebook/newRepairRun.js +148 -0
- package/dist/bin/forgebook/newStories.d.ts +23 -1
- package/dist/bin/forgebook/newStories.js +101 -11
- package/dist/bin/forgebook/newStoriesFile.d.ts +20 -1
- package/dist/bin/forgebook/newStoriesFile.js +43 -4
- package/dist/bin/forgebook/prebundleRun.d.ts +3 -1
- package/dist/bin/forgebook/prebundleRun.js +28 -8
- package/dist/bin/forgebook/proofCommand.d.mts +15 -0
- package/dist/bin/forgebook/proofCommand.mjs +212 -0
- package/dist/bin/forgebook/proofRun.d.ts +63 -0
- package/dist/bin/forgebook/proofRun.js +412 -0
- package/dist/bin/forgebook/proofText.d.ts +36 -0
- package/dist/bin/forgebook/proofText.js +131 -0
- package/dist/bin/forgebook/proofWorkflow.d.ts +29 -0
- package/dist/bin/forgebook/proofWorkflow.js +205 -0
- package/dist/bin/forgebook/setArgsTool.d.ts +8 -0
- package/dist/bin/forgebook/setArgsTool.js +70 -0
- package/dist/bin/forgebook/storyCheckCommands.mjs +42 -3
- package/dist/bin/forgebook/storyCheckRun.d.ts +50 -0
- package/dist/bin/forgebook/storyCheckRun.js +83 -9
- package/dist/bin/forgebook/storyFileIds.d.ts +15 -0
- package/dist/bin/forgebook/storyFileIds.js +14 -0
- package/dist/bin/forgebook/stressCases.d.ts +31 -0
- package/dist/bin/forgebook/stressCases.js +79 -0
- package/dist/bin/forgebook/stressRun.d.ts +12 -0
- package/dist/bin/forgebook/stressRun.js +61 -0
- package/dist/bin/forgebook/stressText.d.ts +27 -0
- package/dist/bin/forgebook/stressText.js +46 -0
- package/dist/bin/forgebook/verifyBase.d.ts +45 -0
- package/dist/bin/forgebook/verifyBase.js +196 -0
- package/dist/bin/forgebook/verifyCommand.d.mts +13 -0
- package/dist/bin/forgebook/verifyCommand.mjs +125 -0
- package/dist/bin/forgebook/verifyRun.d.ts +63 -0
- package/dist/bin/forgebook/verifyRun.js +108 -0
- package/dist/bin/forgebook/verifyVerdict.d.ts +40 -0
- package/dist/bin/forgebook/verifyVerdict.js +297 -0
- package/dist/bin/forgebook/workflowActions.d.ts +23 -0
- package/dist/bin/forgebook/workflowActions.js +23 -0
- package/dist/bin/forgebook-docs/catalogueMarkdown.js +12 -1
- package/dist/src/addressArgs.d.ts +29 -5
- package/dist/src/addressArgs.js +58 -16
- package/dist/src/addressArgsParam.d.ts +54 -0
- package/dist/src/addressArgsParam.js +51 -0
- package/dist/src/addressTexts.d.ts +14 -0
- package/dist/src/addressTexts.js +28 -21
- package/dist/src/agentIndexFile.d.ts +11 -0
- package/dist/src/agentIndexFile.js +11 -0
- package/dist/src/argConditions.d.ts +52 -0
- package/dist/src/argConditions.js +80 -0
- package/dist/src/argControl.d.ts +100 -0
- package/dist/src/argControl.js +0 -0
- package/dist/src/argExpression.d.ts +21 -0
- package/dist/src/argExpression.js +30 -0
- package/dist/src/argTypes.d.ts +40 -51
- package/dist/src/argTypes.js +66 -184
- package/dist/src/argsProps.d.ts +3 -3
- package/dist/src/argsProps.js +11 -5
- package/dist/src/bundlerErrors.d.ts +29 -0
- package/dist/src/bundlerErrors.js +49 -0
- package/dist/src/catalogue.d.ts +31 -0
- package/dist/src/catalogue.js +13 -2
- package/dist/src/catalogueRefs.d.ts +75 -0
- package/dist/src/catalogueRefs.js +122 -0
- package/dist/src/componentDocs.d.ts +71 -0
- package/dist/src/componentDocs.js +15 -2
- package/dist/src/frame/callValues.d.ts +19 -0
- package/dist/src/frame/callValues.js +58 -0
- package/dist/src/frame/canvasScheme.d.ts +33 -0
- package/dist/src/frame/canvasScheme.js +67 -0
- package/dist/src/frame/frame.css +36 -3
- package/dist/src/frame/frameStatus.d.ts +16 -1
- package/dist/src/frame/frameStatus.js +16 -1
- package/dist/src/frame/frameView.js +4 -3
- package/dist/src/frame/mountFrame.d.ts +7 -1
- package/dist/src/frame/mountFrame.js +153 -46
- package/dist/src/frame/panelValues.d.ts +35 -0
- package/dist/src/frame/panelValues.js +127 -0
- package/dist/src/frame/playActions.d.ts +39 -0
- package/dist/src/frame/playActions.js +98 -0
- package/dist/src/frame/playStepper.d.ts +28 -0
- package/dist/src/frame/playStepper.js +38 -0
- package/dist/src/frame/playStory.d.ts +9 -1
- package/dist/src/frame/playStory.js +49 -3
- package/dist/src/frame/renderer.d.ts +34 -1
- package/dist/src/frame/renderer.js +24 -0
- package/dist/src/frame/shellChannel.d.ts +1 -1
- package/dist/src/frame/shellChannel.js +1 -1
- package/dist/src/frame/shellCheck.d.ts +17 -0
- package/dist/src/frame/shellCheck.js +25 -0
- package/dist/src/frame/shellMessageCheck.d.ts +7 -0
- package/dist/src/frame/shellMessageCheck.js +53 -0
- package/dist/src/frame/storyContent.d.ts +50 -0
- package/dist/src/frame/storyContent.js +73 -0
- package/dist/src/frame/storyModule.d.ts +9 -0
- package/dist/src/frame/storyModule.js +20 -2
- package/dist/src/frame/storyRun.d.ts +15 -7
- package/dist/src/frame/storyRun.js +64 -15
- package/dist/src/frame/valueSheets.d.ts +35 -0
- package/dist/src/frame/valueSheets.js +99 -0
- package/dist/src/hotModules.d.ts +20 -0
- package/dist/src/hotModules.js +23 -0
- package/dist/src/jsxCode.d.ts +1 -14
- package/dist/src/jsxCode.js +46 -10
- package/dist/src/liveErrors.d.ts +30 -4
- package/dist/src/liveErrors.js +18 -3
- package/dist/src/messages.d.ts +77 -27
- package/dist/src/messages.js +58 -100
- package/dist/src/namedValues.d.ts +2 -26
- package/dist/src/namedValues.js +0 -47
- package/dist/src/pageConfig.d.ts +2 -0
- package/dist/src/playTrace.d.ts +19 -2
- package/dist/src/playTrace.js +10 -5
- package/dist/src/plugin.d.ts +10 -3
- package/dist/src/previewRelay.js +9 -1
- package/dist/src/printable.d.ts +12 -0
- package/dist/src/printable.js +22 -0
- package/dist/src/propsSignature.d.ts +37 -0
- package/dist/src/propsSignature.js +40 -0
- package/dist/src/search.d.ts +41 -5
- package/dist/src/search.js +93 -23
- package/dist/src/searchMatch.d.ts +4 -1
- package/dist/src/searchMatch.js +26 -5
- package/dist/src/searchTypos.d.ts +88 -0
- package/dist/src/searchTypos.js +178 -0
- package/dist/src/shapeValues.d.ts +86 -0
- package/dist/src/shapeValues.js +295 -0
- package/dist/src/shell/ApiReference.js +6 -3
- package/dist/src/shell/ApiTableBox.d.ts +15 -0
- package/dist/src/shell/ApiTableBox.js +11 -0
- package/dist/src/shell/AppearanceMenu.d.ts +4 -1
- package/dist/src/shell/AppearanceMenu.js +9 -6
- package/dist/src/shell/CodeTab.d.ts +3 -2
- package/dist/src/shell/CodeTab.js +3 -2
- package/dist/src/shell/CodeText.d.ts +1 -1
- package/dist/src/shell/CodeText.js +2 -3
- package/dist/src/shell/CompareGrid.js +1 -1
- package/dist/src/shell/ComponentPage.d.ts +1 -1
- package/dist/src/shell/ComponentPage.js +5 -1
- package/dist/src/shell/CustomControl.d.ts +34 -0
- package/dist/src/shell/CustomControl.js +132 -0
- package/dist/src/shell/DocContainers.js +1 -1
- package/dist/src/shell/DocPage.js +2 -2
- package/dist/src/shell/DroppedArgsList.d.ts +2 -2
- package/dist/src/shell/DroppedArgsList.js +1 -1
- package/dist/src/shell/EmbedPage.js +30 -12
- package/dist/src/shell/Example.d.ts +5 -1
- package/dist/src/shell/Example.js +16 -8
- package/dist/src/shell/FrameView.d.ts +6 -3
- package/dist/src/shell/FrameView.js +2 -2
- package/dist/src/shell/HomePage.d.ts +3 -1
- package/dist/src/shell/HomePage.js +16 -6
- package/dist/src/shell/InfoTip.js +2 -2
- package/dist/src/shell/InteractionsTab.d.ts +11 -4
- package/dist/src/shell/InteractionsTab.js +18 -2
- package/dist/src/shell/LazyPage.js +1 -1
- package/dist/src/shell/PackageHtml.js +3 -1
- package/dist/src/shell/PinnedControl.js +14 -62
- package/dist/src/shell/PinnedControlMenu.d.ts +44 -0
- package/dist/src/shell/PinnedControlMenu.js +72 -0
- package/dist/src/shell/PropFields.d.ts +3 -1
- package/dist/src/shell/PropFields.js +9 -6
- package/dist/src/shell/PropRows.d.ts +23 -2
- package/dist/src/shell/PropRows.js +58 -19
- package/dist/src/shell/PropsTab.d.ts +12 -5
- package/dist/src/shell/PropsTab.js +9 -21
- package/dist/src/shell/RefStoryPage.d.ts +33 -0
- package/dist/src/shell/RefStoryPage.js +123 -0
- package/dist/src/shell/SearchPanel.js +51 -24
- package/dist/src/shell/Shell.d.ts +18 -0
- package/dist/src/shell/Shell.js +137 -22
- package/dist/src/shell/ShortcutHelp.d.ts +22 -0
- package/dist/src/shell/ShortcutHelp.js +66 -0
- package/dist/src/shell/Sidebar.d.ts +17 -4
- package/dist/src/shell/Sidebar.js +92 -41
- package/dist/src/shell/SidebarDocs.js +2 -2
- package/dist/src/shell/SidebarEntries.js +5 -3
- package/dist/src/shell/SidebarHandle.d.ts +3 -5
- package/dist/src/shell/SidebarHandle.js +4 -4
- package/dist/src/shell/SidebarRefs.d.ts +39 -0
- package/dist/src/shell/SidebarRefs.js +99 -0
- package/dist/src/shell/SidebarSearch.js +37 -9
- package/dist/src/shell/SignatureReference.js +3 -1
- package/dist/src/shell/Stage.d.ts +10 -2
- package/dist/src/shell/Stage.js +29 -49
- package/dist/src/shell/StatusBadges.d.ts +54 -0
- package/dist/src/shell/StatusBadges.js +77 -0
- package/dist/src/shell/StoryCodeBlock.d.ts +8 -19
- package/dist/src/shell/StoryCodeBlock.js +7 -6
- package/dist/src/shell/SwitchGallery.d.ts +36 -0
- package/dist/src/shell/SwitchGallery.js +17 -0
- package/dist/src/shell/SwitchGalleryPanel.d.ts +37 -0
- package/dist/src/shell/SwitchGalleryPanel.js +99 -0
- package/dist/src/shell/TagFilter.d.ts +24 -0
- package/dist/src/shell/TagFilter.js +45 -0
- package/dist/src/shell/TagViews.d.ts +39 -0
- package/dist/src/shell/TagViews.js +20 -0
- package/dist/src/shell/Toolbar.d.ts +4 -1
- package/dist/src/shell/Toolbar.js +17 -7
- package/dist/src/shell/ToolbarControl.d.ts +3 -0
- package/dist/src/shell/ToolbarControl.js +23 -6
- package/dist/src/shell/ViewMenuPanel.js +6 -1
- package/dist/src/shell/argChecks.d.ts +22 -0
- package/dist/src/shell/argChecks.js +20 -0
- package/dist/src/shell/asideStory.js +7 -2
- package/dist/src/shell/audienceSections.css +9 -9
- package/dist/src/shell/catalogueContext.d.ts +1 -1
- package/dist/src/shell/catalogueContext.js +6 -1
- package/dist/src/shell/codeSpans.d.ts +27 -0
- package/dist/src/shell/codeSpans.js +76 -0
- package/dist/src/shell/compareVariants.d.ts +4 -2
- package/dist/src/shell/compareVariants.js +16 -8
- package/dist/src/shell/composition.d.ts +23 -0
- package/dist/src/shell/composition.js +26 -0
- package/dist/src/shell/controlCycle.d.ts +1 -1
- package/dist/src/shell/controlCycle.js +3 -2
- package/dist/src/shell/customControls.d.ts +55 -0
- package/dist/src/shell/customControls.js +70 -0
- package/dist/src/shell/docPage.css +22 -22
- package/dist/src/shell/dockTabs.d.ts +19 -3
- package/dist/src/shell/dockTabs.js +28 -20
- package/dist/src/shell/embed.css +7 -7
- package/dist/src/shell/framesOrigin.d.ts +7 -0
- package/dist/src/shell/framesOrigin.js +1 -1
- package/dist/src/shell/galleryPlace.d.ts +20 -0
- package/dist/src/shell/galleryPlace.js +26 -0
- package/dist/src/shell/icons.d.ts +1 -0
- package/dist/src/shell/icons.js +1 -0
- package/dist/src/shell/keyboard.d.ts +14 -12
- package/dist/src/shell/keyboard.js +21 -6
- package/dist/src/shell/laterStrings.d.ts +29 -0
- package/dist/src/shell/laterStrings.js +42 -3
- package/dist/src/shell/mountShell.js +3 -0
- package/dist/src/shell/pageStrings.d.ts +4 -0
- package/dist/src/shell/pageStrings.js +4 -0
- package/dist/src/shell/pageTagView.d.ts +18 -0
- package/dist/src/shell/pageTagView.js +10 -0
- package/dist/src/shell/playMemory.d.ts +14 -0
- package/dist/src/shell/playMemory.js +8 -0
- package/dist/src/shell/propNotes.d.ts +23 -0
- package/dist/src/shell/propNotes.js +37 -0
- package/dist/src/shell/refIndexLoad.d.ts +17 -0
- package/dist/src/shell/refIndexLoad.js +38 -0
- package/dist/src/shell/refParts.d.ts +34 -0
- package/dist/src/shell/refParts.js +9 -0
- package/dist/src/shell/refStory.css +21 -0
- package/dist/src/shell/refStrings.d.ts +13 -0
- package/dist/src/shell/refStrings.js +21 -0
- package/dist/src/shell/search.css +11 -11
- package/dist/src/shell/shell.css +348 -168
- package/dist/src/shell/shellScheme.js +2 -2
- package/dist/src/shell/shortcutHelp.css +64 -0
- package/dist/src/shell/stageArgs.d.ts +53 -0
- package/dist/src/shell/stageArgs.js +64 -0
- package/dist/src/shell/statusBadges.css +51 -0
- package/dist/src/shell/strings.d.ts +7 -16
- package/dist/src/shell/strings.js +12 -17
- package/dist/src/shell/switchGallery.css +104 -0
- package/dist/src/shell/tagFilter.css +46 -0
- package/dist/src/shell/tagView.d.ts +20 -0
- package/dist/src/shell/tagView.js +10 -0
- package/dist/src/shell/useAddressArgs.d.ts +9 -0
- package/dist/src/shell/useAddressArgs.js +56 -11
- package/dist/src/shell/useControlKeys.js +2 -2
- package/dist/src/shell/useEditedProblems.d.ts +6 -0
- package/dist/src/shell/useEditedProblems.js +40 -0
- package/dist/src/shell/useFrameMessages.js +3 -0
- package/dist/src/shell/useListedTree.d.ts +13 -0
- package/dist/src/shell/useListedTree.js +32 -0
- package/dist/src/shell/usePageFrames.js +2 -2
- package/dist/src/shell/usePopover.d.ts +5 -0
- package/dist/src/shell/usePopover.js +7 -1
- package/dist/src/shell/useRefIndex.d.ts +22 -0
- package/dist/src/shell/useRefIndex.js +36 -0
- package/dist/src/shell/useScrollStops.d.ts +20 -0
- package/dist/src/shell/useScrollStops.js +41 -0
- package/dist/src/shell/useShortcutHelp.d.ts +18 -0
- package/dist/src/shell/useShortcutHelp.js +32 -0
- package/dist/src/shell/useSidebarOverlay.d.ts +2 -1
- package/dist/src/shell/useSidebarOverlay.js +12 -4
- package/dist/src/shell/useStoryCode.d.ts +2 -1
- package/dist/src/shell/useStoryCode.js +12 -7
- package/dist/src/shell/useToolbarLayout.d.ts +5 -1
- package/dist/src/shell/useToolbarLayout.js +2 -2
- package/dist/src/shell/useWorstCase.d.ts +8 -2
- package/dist/src/shell/useWorstCase.js +2 -2
- package/dist/src/shell/valueEditors/FileEditor.d.ts +28 -0
- package/dist/src/shell/valueEditors/FileEditor.js +66 -0
- package/dist/src/shell/valueEditors/JsonEditor.d.ts +14 -0
- package/dist/src/shell/valueEditors/JsonEditor.js +53 -0
- package/dist/src/shell/valueEditors/ListEditor.d.ts +24 -0
- package/dist/src/shell/valueEditors/ListEditor.js +82 -0
- package/dist/src/shell/valueEditors/ObjectEditor.d.ts +32 -0
- package/dist/src/shell/valueEditors/ObjectEditor.js +70 -0
- package/dist/src/shell/valueEditors/PropEditor.d.ts +37 -0
- package/dist/src/shell/valueEditors/PropEditor.js +53 -0
- package/dist/src/shell/valueEditors/RecordEditor.d.ts +20 -0
- package/dist/src/shell/valueEditors/RecordEditor.js +84 -0
- package/dist/src/shell/valueEditors/SearchSelect.d.ts +42 -0
- package/dist/src/shell/valueEditors/SearchSelect.js +80 -0
- package/dist/src/shell/valueEditors/TokenEditor.d.ts +49 -0
- package/dist/src/shell/valueEditors/TokenEditor.js +74 -0
- package/dist/src/shell/valueEditors/UnionEditor.d.ts +20 -0
- package/dist/src/shell/valueEditors/UnionEditor.js +64 -0
- package/dist/src/shell/valueEditors/ValueField.d.ts +15 -0
- package/dist/src/shell/valueEditors/ValueField.js +147 -0
- package/dist/src/shell/valueEditors/editorStrings.d.ts +56 -0
- package/dist/src/shell/valueEditors/editorStrings.js +66 -0
- package/dist/src/shell/valueEditors/fieldTypes.d.ts +31 -0
- package/dist/src/shell/valueEditors/fieldTypes.js +0 -0
- package/dist/src/shell/valueEditors/valueEditors.css +153 -0
- package/dist/src/shell/worstArgs.d.ts +8 -5
- package/dist/src/shell/worstArgs.js +14 -7
- package/dist/src/shellTheme.d.ts +1 -1
- package/dist/src/shellTheme.js +15 -1
- package/dist/src/shellTheme.types.d.ts +4 -0
- package/dist/src/shellWord.d.ts +12 -0
- package/dist/src/shellWord.js +15 -0
- package/dist/src/sourceFiles.js +2 -1
- package/dist/src/storyArgTypes.d.ts +57 -0
- package/dist/src/storyArgTypes.js +195 -0
- package/dist/src/storyBackground.js +14 -3
- package/dist/src/storyCheck.d.ts +85 -3
- package/dist/src/storyCheck.js +23 -1
- package/dist/src/storyCodeText.d.ts +46 -0
- package/dist/src/storyCodeText.js +27 -0
- package/dist/src/storyControls.d.ts +100 -0
- package/dist/src/storyControls.js +100 -0
- package/dist/src/storyStatuses.d.ts +55 -0
- package/dist/src/storyStatuses.js +104 -0
- package/dist/src/storyTagNames.d.ts +25 -0
- package/dist/src/storyTagNames.js +25 -0
- package/dist/src/storyTags.d.ts +29 -0
- package/dist/src/storyTags.js +85 -0
- package/dist/src/storyTree.d.ts +13 -0
- package/dist/src/storyTree.js +24 -4
- package/dist/src/storybookArgs.d.ts +24 -0
- package/dist/src/storybookArgs.js +185 -0
- package/dist/src/switches.d.ts +66 -3
- package/dist/src/switches.js +42 -1
- package/dist/src/valueSchema.d.ts +28 -0
- package/dist/src/valueSchema.js +196 -0
- package/dist/src/valueShape.d.ts +94 -0
- package/dist/src/valueShape.js +25 -0
- package/dist/src/viewState.d.ts +8 -3
- package/dist/src/viewState.js +27 -10
- package/dist/src/vite/adapter.d.ts +40 -2
- package/dist/src/vite/adapter.js +1 -0
- package/dist/src/vite/agent.types.d.ts +347 -7
- package/dist/src/vite/agentApi.d.ts +23 -0
- package/dist/src/vite/agentApi.js +90 -17
- package/dist/src/vite/agentIndex.d.ts +0 -2
- package/dist/src/vite/agentIndex.js +5 -6
- package/dist/src/vite/agentRoutes.d.ts +20 -1
- package/dist/src/vite/agentRoutes.js +106 -65
- package/dist/src/vite/agentStatuses.d.ts +42 -0
- package/dist/src/vite/agentStatuses.js +67 -0
- package/dist/src/vite/agentStoryCode.d.ts +48 -0
- package/dist/src/vite/agentStoryCode.js +38 -0
- package/dist/src/vite/agentVisibility.d.ts +47 -0
- package/dist/src/vite/agentVisibility.js +174 -0
- package/dist/src/vite/appAudit.d.ts +134 -0
- package/dist/src/vite/appAudit.js +333 -0
- package/dist/src/vite/appBuildOption.d.ts +53 -0
- package/dist/src/vite/appBuildOption.js +55 -0
- package/dist/src/vite/appTokenFiles.d.ts +92 -0
- package/dist/src/vite/appTokenFiles.js +433 -0
- package/dist/src/vite/appTokens.d.ts +23 -0
- package/dist/src/vite/appTokens.js +275 -0
- package/dist/src/vite/builtTexts.d.ts +10 -0
- package/dist/src/vite/builtTexts.js +59 -22
- package/dist/src/vite/catalogueConfig.d.ts +3 -1
- package/dist/src/vite/catalogueConfig.js +15 -3
- package/dist/src/vite/changeCoverage.d.ts +74 -0
- package/dist/src/vite/changeCoverage.js +120 -0
- package/dist/src/vite/changedRoute.d.ts +30 -0
- package/dist/src/vite/changedRoute.js +197 -0
- package/dist/src/vite/checkCode.d.ts +105 -3
- package/dist/src/vite/checkCode.js +323 -36
- package/dist/src/vite/checkoutWatch.d.ts +97 -0
- package/dist/src/vite/checkoutWatch.js +287 -0
- package/dist/src/vite/closeWatch.d.ts +8 -0
- package/dist/src/vite/closeWatch.js +1 -1
- package/dist/src/vite/componentCache.d.ts +8 -0
- package/dist/src/vite/componentCache.js +66 -0
- package/dist/src/vite/componentGraph.d.ts +71 -0
- package/dist/src/vite/componentGraph.js +133 -0
- package/dist/src/vite/componentRules.d.ts +33 -0
- package/dist/src/vite/componentRules.js +105 -0
- package/dist/src/vite/componentScan.d.ts +69 -0
- package/dist/src/vite/componentScan.js +418 -0
- package/dist/src/vite/compositionCheck.d.ts +15 -0
- package/dist/src/vite/compositionCheck.js +243 -0
- package/dist/src/vite/config.d.ts +32 -1
- package/dist/src/vite/configFile.d.ts +14 -2
- package/dist/src/vite/configFile.js +124 -40
- package/dist/src/vite/configKeys.d.ts +15 -0
- package/dist/src/vite/configKeys.js +171 -0
- package/dist/src/vite/configLoadError.d.ts +23 -0
- package/dist/src/vite/configLoadError.js +71 -0
- package/dist/src/vite/cssDeclarations.d.ts +71 -0
- package/dist/src/vite/cssDeclarations.js +290 -0
- package/dist/src/vite/cssImports.d.ts +14 -0
- package/dist/src/vite/cssImports.js +48 -0
- package/dist/src/vite/cssReferences.d.ts +54 -0
- package/dist/src/vite/cssReferences.js +157 -0
- package/dist/src/vite/cssTokenValues.d.ts +50 -0
- package/dist/src/vite/cssTokenValues.js +233 -0
- package/dist/src/vite/designTokens.d.ts +24 -0
- package/dist/src/vite/designTokens.js +5 -1
- package/dist/src/vite/docsExtractor.d.ts +9 -3
- package/dist/src/vite/docsExtractor.js +11 -3
- package/dist/src/vite/docsProgram.d.ts +17 -4
- package/dist/src/vite/docsProgram.js +52 -11
- package/dist/src/vite/docsWorker.js +7 -2
- package/dist/src/vite/emptyStoryGlobs.d.ts +41 -0
- package/dist/src/vite/emptyStoryGlobs.js +52 -0
- package/dist/src/vite/fileImports.d.ts +17 -0
- package/dist/src/vite/fileImports.js +57 -0
- package/dist/src/vite/findComponent.d.ts +10 -2
- package/dist/src/vite/findComponent.js +27 -22
- package/dist/src/vite/findRoute.js +3 -2
- package/dist/src/vite/forcedStates.d.ts +9 -2
- package/dist/src/vite/forcedStates.js +12 -3
- package/dist/src/vite/forgebookPlugin.d.ts +2 -0
- package/dist/src/vite/forgebookPlugin.js +52 -72
- package/dist/src/vite/frameErrors.d.ts +19 -0
- package/dist/src/vite/frameErrors.js +70 -0
- package/dist/src/vite/framesServer.d.ts +12 -0
- package/dist/src/vite/framesServer.js +21 -4
- package/dist/src/vite/functionComponentDocs.js +81 -12
- package/dist/src/vite/generatedModules.js +4 -2
- package/dist/src/vite/gitChange.d.ts +38 -5
- package/dist/src/vite/gitChange.js +71 -11
- package/dist/src/vite/hiddenStoryFiles.d.ts +23 -0
- package/dist/src/vite/hiddenStoryFiles.js +107 -0
- package/dist/src/vite/hotSnippets.d.ts +38 -14
- package/dist/src/vite/hotSnippets.js +137 -39
- package/dist/src/vite/importedNames.d.ts +37 -0
- package/dist/src/vite/importedNames.js +138 -0
- package/dist/src/vite/indexFields.d.ts +6 -0
- package/dist/src/vite/indexFields.js +21 -0
- package/dist/src/vite/indexStoryFile.d.ts +8 -1
- package/dist/src/vite/indexStoryFile.js +22 -157
- package/dist/src/vite/jsxCallSites.d.ts +33 -0
- package/dist/src/vite/jsxCallSites.js +200 -0
- package/dist/src/vite/jsxInScripts.d.ts +67 -0
- package/dist/src/vite/jsxInScripts.js +138 -0
- package/dist/src/vite/jsxTree.d.ts +20 -0
- package/dist/src/vite/jsxTree.js +163 -0
- package/dist/src/vite/lineAndColumn.d.ts +13 -0
- package/dist/src/vite/lineAndColumn.js +18 -0
- package/dist/src/vite/lookAlikes.d.ts +65 -0
- package/dist/src/vite/lookAlikes.js +228 -0
- package/dist/src/vite/nearestToken.d.ts +17 -0
- package/dist/src/vite/nearestToken.js +9 -2
- package/dist/src/vite/packageEntries.d.ts +42 -0
- package/dist/src/vite/packageEntries.js +127 -0
- package/dist/src/vite/pages.d.ts +9 -1
- package/dist/src/vite/pages.js +108 -4
- package/dist/src/vite/pluginConfig.js +4 -0
- package/dist/src/vite/pluginIds.d.ts +2 -0
- package/dist/src/vite/pluginIds.js +5 -1
- package/dist/src/vite/pluginModules.d.ts +81 -11
- package/dist/src/vite/pluginModules.js +109 -21
- package/dist/src/vite/prebundled.d.ts +57 -15
- package/dist/src/vite/prebundled.js +80 -0
- package/dist/src/vite/previewTags.d.ts +25 -0
- package/dist/src/vite/previewTags.js +56 -0
- package/dist/src/vite/projectFiles.d.ts +54 -0
- package/dist/src/vite/projectFiles.js +116 -0
- package/dist/src/vite/projectPostcss.d.ts +70 -0
- package/dist/src/vite/projectPostcss.js +250 -0
- package/dist/src/vite/propDocs.d.ts +12 -0
- package/dist/src/vite/propDocs.js +130 -58
- package/dist/src/vite/propKind.d.ts +40 -0
- package/dist/src/vite/propKind.js +71 -0
- package/dist/src/vite/propTypeNotes.d.ts +22 -0
- package/dist/src/vite/propTypeNotes.js +51 -0
- package/dist/src/vite/publishedExports.d.ts +27 -0
- package/dist/src/vite/publishedExports.js +298 -0
- package/dist/src/vite/realFolder.d.ts +6 -0
- package/dist/src/vite/realFolder.js +25 -0
- package/dist/src/vite/refsConfig.d.ts +39 -0
- package/dist/src/vite/refsConfig.js +54 -0
- package/dist/src/vite/reuseCheck.d.ts +45 -0
- package/dist/src/vite/reuseCheck.js +260 -0
- package/dist/src/vite/runningVersions.d.ts +33 -0
- package/dist/src/vite/runningVersions.js +25 -0
- package/dist/src/vite/scriptProblems.d.ts +60 -0
- package/dist/src/vite/scriptProblems.js +155 -0
- package/dist/src/vite/searchModule.js +3 -2
- package/dist/src/vite/searchRoute.js +4 -2
- package/dist/src/vite/shapeDocs.d.ts +36 -0
- package/dist/src/vite/shapeDocs.js +177 -0
- package/dist/src/vite/singleFileComponent.d.ts +17 -0
- package/dist/src/vite/singleFileComponent.js +83 -0
- package/dist/src/vite/sourceText.d.ts +34 -0
- package/dist/src/vite/sourceText.js +72 -0
- package/dist/src/vite/sourceTokens.d.ts +7 -0
- package/dist/src/vite/sourceTokens.js +7 -2
- package/dist/src/vite/stackLines.d.ts +49 -0
- package/dist/src/vite/stackLines.js +96 -0
- package/dist/src/vite/storyCode.d.ts +22 -7
- package/dist/src/vite/storyCode.js +263 -37
- package/dist/src/vite/storyCoverage.d.ts +48 -0
- package/dist/src/vite/storyCoverage.js +179 -0
- package/dist/src/vite/storyFilesModule.d.ts +48 -3
- package/dist/src/vite/storyFilesModule.js +105 -15
- package/dist/src/vite/storyPatterns.d.ts +31 -0
- package/dist/src/vite/storyPatterns.js +140 -5
- package/dist/src/vite/storyReach.d.ts +10 -2
- package/dist/src/vite/storyReach.js +15 -11
- package/dist/src/vite/storyTopLevel.d.ts +51 -0
- package/dist/src/vite/storyTopLevel.js +146 -0
- package/dist/src/vite/storylessRoutes.d.ts +4 -3
- package/dist/src/vite/storylessRoutes.js +210 -19
- package/dist/src/vite/switchValuesCheck.d.ts +19 -0
- package/dist/src/vite/switchValuesCheck.js +164 -0
- package/dist/src/vite/switchesDocument.d.ts +15 -0
- package/dist/src/vite/switchesDocument.js +47 -0
- package/dist/src/vite/tailwindConfigTokens.d.ts +41 -0
- package/dist/src/vite/tailwindConfigTokens.js +306 -0
- package/dist/src/vite/textImports.d.ts +15 -0
- package/dist/src/vite/textImports.js +58 -0
- package/dist/src/vite/textModules.d.ts +6 -5
- package/dist/src/vite/textModules.js +13 -8
- package/dist/src/vite/tokenAnswers.d.ts +6 -2
- package/dist/src/vite/tokenAnswers.js +11 -7
- package/dist/src/vite/typeParameters.d.ts +83 -0
- package/dist/src/vite/typeParameters.js +270 -0
- package/dist/src/vite/unionProps.d.ts +37 -0
- package/dist/src/vite/unionProps.js +121 -0
- package/dist/src/vite/unresolvedTokens.d.ts +20 -0
- package/dist/src/vite/unresolvedTokens.js +193 -0
- package/dist/src/vite/usageGraph.js +10 -52
- package/dist/src/vite/usageGuidance.d.ts +9 -2
- package/dist/src/vite/usageGuidance.js +36 -8
- package/dist/src/vite/usageImports.d.ts +35 -0
- package/dist/src/vite/usageImports.js +280 -0
- package/dist/src/vite/visibilityRoute.d.ts +16 -0
- package/dist/src/vite/visibilityRoute.js +320 -0
- package/dist/src/worstCase.d.ts +2 -0
- package/dist/src/worstCase.js +2 -0
- package/package.json +28 -8
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { switchWithRole } from "../../src/switches.js";
|
|
2
|
+
import { WORST_NUMBER, WORST_TEXT, WORST_WORD } from "../../src/worstCase.js";
|
|
3
|
+
/** Text in a right-to-left script, with a number and a Latin word in it, as real content mixes them. */
|
|
4
|
+
export const RTL_TEXT = "مرحبا بالعالم، هذا نص طويل بعض الشيء 12345 Forgebook";
|
|
5
|
+
/** The window's width a 200 % zoom lays a page out in, from the default window's 1,280 px. */
|
|
6
|
+
const ZOOMED_WIDTH = 640;
|
|
7
|
+
/** A phone held upright, narrower than any variant the catalogue's tests check. */
|
|
8
|
+
const NARROW_WIDTH = 320;
|
|
9
|
+
/**
|
|
10
|
+
* A text prop that names something rather than shows it (an id, a reference to one, a class, a form field's name, an
|
|
11
|
+
* address), or a slot for a picture (an icon, an avatar). A long text there is no case, only an invalid value, and checks
|
|
12
|
+
* would find the value, not the component: text in an icon's slot draws over the label beside it.
|
|
13
|
+
*/
|
|
14
|
+
const NAMES_SOMETHING = /^(?:icon|avatar|image|img|logo|id|key|name|form|qa|role|lang|dir|slot|as|type|target|rel|href|src|htmlFor|for|tabIndex|autoComplete|inputMode|pattern|accept|class|className|testId)$|(?:ClassName|Class|Id|Ids|Url|Href|Src|Ref|Key|Icon|Avatar|Image|Logo)$|^aria-(?:labelledby|describedby|details|controls|owns|activedescendant|errormessage|flowto)$|^data-/;
|
|
15
|
+
/**
|
|
16
|
+
* What axe finds when a control is given no text: an empty label is the case's doing, so a finding of these in `empty`
|
|
17
|
+
* would blame the component for the value it was given.
|
|
18
|
+
*/
|
|
19
|
+
const NAME_RULES = [
|
|
20
|
+
"button-name",
|
|
21
|
+
"link-name",
|
|
22
|
+
"label",
|
|
23
|
+
"select-name",
|
|
24
|
+
"input-button-name",
|
|
25
|
+
"aria-input-field-name",
|
|
26
|
+
"empty-heading"
|
|
27
|
+
];
|
|
28
|
+
/** The view that sets a switch of a role to the first value matching, when the catalogue has one. */
|
|
29
|
+
const switchView = (switches, role, isWanted) => {
|
|
30
|
+
const found = switchWithRole(switches, role);
|
|
31
|
+
const value = found?.values.find(isWanted);
|
|
32
|
+
return found === undefined || value === undefined
|
|
33
|
+
? undefined
|
|
34
|
+
: `${found.id}=${encodeURIComponent(value.value)}`;
|
|
35
|
+
};
|
|
36
|
+
/** The values that give every prop of a list one value. */
|
|
37
|
+
const allOf = (props, value) => Object.fromEntries(props.map((prop) => [prop.name, value]));
|
|
38
|
+
/**
|
|
39
|
+
* The cases for one story.
|
|
40
|
+
*
|
|
41
|
+
* @param controls - the props its values can set, as `forgebook story` lists them.
|
|
42
|
+
* @param switches - the catalogue's switches.
|
|
43
|
+
*/
|
|
44
|
+
export const stressPlan = (controls, switches) => {
|
|
45
|
+
const texts = controls.filter((each) => (each.control === "text" || each.control === "textarea") && !NAMES_SOMETHING.test(each.name));
|
|
46
|
+
const numbers = controls.filter((each) => each.control === "number" || each.control === "range");
|
|
47
|
+
const huge = Object.fromEntries(numbers.map((prop) => [prop.name, prop.max ?? WORST_NUMBER]));
|
|
48
|
+
const dark = switchView(switches, "colorScheme", (value) => value.scheme === "dark");
|
|
49
|
+
const more = switchView(switches, "contrast", (value) => value.isMore === true);
|
|
50
|
+
const rtl = switchView(switches, "direction", (value) => value.value === "rtl");
|
|
51
|
+
const noText = "no prop takes text";
|
|
52
|
+
const cases = [
|
|
53
|
+
texts.length === 0
|
|
54
|
+
? `long-text: ${noText}`
|
|
55
|
+
: { name: "long-text", args: allOf(texts, WORST_TEXT), view: "" },
|
|
56
|
+
texts.length === 0
|
|
57
|
+
? `unbreakable: ${noText}`
|
|
58
|
+
: { name: "unbreakable", args: allOf(texts, WORST_WORD), view: "" },
|
|
59
|
+
texts.length === 0
|
|
60
|
+
? `empty: ${noText}`
|
|
61
|
+
: { name: "empty", args: allOf(texts, ""), view: "", expectedRules: NAME_RULES },
|
|
62
|
+
numbers.length === 0
|
|
63
|
+
? "huge-number: no prop takes a number"
|
|
64
|
+
: { name: "huge-number", args: huge, view: "" },
|
|
65
|
+
rtl === undefined
|
|
66
|
+
? { name: "rtl", args: allOf(texts, RTL_TEXT), view: "", isRtl: true }
|
|
67
|
+
: { name: "rtl", args: allOf(texts, RTL_TEXT), view: rtl },
|
|
68
|
+
{ name: "zoom-200", args: {}, view: "", width: ZOOMED_WIDTH },
|
|
69
|
+
{ name: "narrow", args: allOf(texts, WORST_TEXT), view: "", width: NARROW_WIDTH },
|
|
70
|
+
dark === undefined ? "dark: the catalogue has no dark scheme" : { name: "dark", args: {}, view: dark },
|
|
71
|
+
more === undefined
|
|
72
|
+
? "contrast: the catalogue has no more-contrast value"
|
|
73
|
+
: { name: "contrast", args: {}, view: more }
|
|
74
|
+
];
|
|
75
|
+
return {
|
|
76
|
+
cases: cases.filter((each) => typeof each !== "string"),
|
|
77
|
+
skipped: cases.filter((each) => typeof each === "string")
|
|
78
|
+
};
|
|
79
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type StressReport } from "../../src/storyCheck.ts";
|
|
2
|
+
import type { ResolvedConfig } from "../../src/vite/configFile.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Runs the stress matrix on the stories an id names: each drawn plain, then with worst-case values and views it never
|
|
5
|
+
* declared, and what each case breaks that the plain story does not.
|
|
6
|
+
*
|
|
7
|
+
* @param config - the catalogue's configuration.
|
|
8
|
+
* @param url - where `forgebook dev` runs, when not at Vite's default address.
|
|
9
|
+
* @param id - a story's id, or a component's for its listed stories.
|
|
10
|
+
* @returns the report, or why it could not run.
|
|
11
|
+
*/
|
|
12
|
+
export declare const runStoryStress: (config: ResolvedConfig, url: string | undefined, id: string) => Promise<StressReport | string>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `forgebook check --stress` and `check_story` with `stress` run: the cases of each story an id names, built from its
|
|
3
|
+
* props and the catalogue's switches (`stressCases.ts`), drawn by `@forgebook/testing/stress` against the served catalogue.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { deviceDefaultOf, NO_DEVICE } from "../../src/deviceView.js";
|
|
8
|
+
import { isStressReport } from "../../src/storyCheck.js";
|
|
9
|
+
import { catalogueSwitches } from "../../src/switches.js";
|
|
10
|
+
import { isStoryDocument } from "../../src/vite/agentApi.js";
|
|
11
|
+
import { AGENT_API } from "../../src/vite/agentRoutes.js";
|
|
12
|
+
import { servedCatalogue } from "./agentClient.js";
|
|
13
|
+
import { storiesAt, storiesNamed, testingFunction } from "./storyCheckRun.js";
|
|
14
|
+
import { stressPlan } from "./stressCases.js";
|
|
15
|
+
/**
|
|
16
|
+
* Runs the stress matrix on the stories an id names: each drawn plain, then with worst-case values and views it never
|
|
17
|
+
* declared, and what each case breaks that the plain story does not.
|
|
18
|
+
*
|
|
19
|
+
* @param config - the catalogue's configuration.
|
|
20
|
+
* @param url - where `forgebook dev` runs, when not at Vite's default address.
|
|
21
|
+
* @param id - a story's id, or a component's for its listed stories.
|
|
22
|
+
* @returns the report, or why it could not run.
|
|
23
|
+
*/
|
|
24
|
+
export const runStoryStress = async (config, url, id) => {
|
|
25
|
+
const call = await testingFunction(config.dir, "@forgebook/testing/stress", "stressStories");
|
|
26
|
+
if (typeof call === "string")
|
|
27
|
+
return call;
|
|
28
|
+
const switches = catalogueSwitches(config.switches, config.languages, config.lists.controls);
|
|
29
|
+
const served = await servedCatalogue(config, url);
|
|
30
|
+
try {
|
|
31
|
+
const document = await storiesAt(served.origin);
|
|
32
|
+
if (typeof document === "string")
|
|
33
|
+
return document;
|
|
34
|
+
const stories = storiesNamed(document, id, deviceDefaultOf(NO_DEVICE, config.lists.device));
|
|
35
|
+
if (stories.length === 0)
|
|
36
|
+
return `No story or component "${id}"`;
|
|
37
|
+
const planned = await Promise.all(stories.map(async (story) => {
|
|
38
|
+
const response = await fetch(`${served.origin}${AGENT_API}story?id=${encodeURIComponent(story.id)}`);
|
|
39
|
+
const body = await response.json();
|
|
40
|
+
return isStoryDocument(body) ? { story, plan: stressPlan(body.controls, switches) } : story.id;
|
|
41
|
+
}));
|
|
42
|
+
const unread = planned.filter((each) => typeof each === "string");
|
|
43
|
+
if (unread.length > 0)
|
|
44
|
+
return `The catalogue could not say what these stories take: ${unread.join(", ")}`;
|
|
45
|
+
const plans = planned.filter((each) => typeof each !== "string");
|
|
46
|
+
const request = {
|
|
47
|
+
frameUrl: `${served.origin}/frame.html`,
|
|
48
|
+
stories: plans.map(({ story, plan }) => ({ story, cases: plan.cases })),
|
|
49
|
+
switches,
|
|
50
|
+
lists: config.lists
|
|
51
|
+
};
|
|
52
|
+
const answer = await call(request);
|
|
53
|
+
if (!isStressReport(answer))
|
|
54
|
+
return "@forgebook/testing/stress answered something that is not a stress report";
|
|
55
|
+
const skipped = plans.flatMap(({ story, plan }) => plan.skipped.map((each) => `${story.id}: ${each}`));
|
|
56
|
+
return { ...answer, skipped };
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await served.close();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a stress run says to a person, and when it fails.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { StressReport } from "../../src/storyCheck.ts";
|
|
7
|
+
import type { McpToolResult } from "../../src/vite/mcpProtocol.ts";
|
|
8
|
+
/**
|
|
9
|
+
* Whether a run found what a case breaks, or a case it could not judge.
|
|
10
|
+
*
|
|
11
|
+
* @param report - the run.
|
|
12
|
+
*/
|
|
13
|
+
export declare const isStressFailure: (report: StressReport) => boolean;
|
|
14
|
+
/**
|
|
15
|
+
* The run, a line per problem a case adds, then one line that sums it up.
|
|
16
|
+
*
|
|
17
|
+
* @param report - the run.
|
|
18
|
+
*/
|
|
19
|
+
export declare const stressText: (report: StressReport) => string;
|
|
20
|
+
/**
|
|
21
|
+
* What `check_story` answers with `stress`: the run, an error when a case breaks something, and a refusal of the options
|
|
22
|
+
* it does not take, since it chooses its own values and views.
|
|
23
|
+
*
|
|
24
|
+
* @param stress - runs the stress matrix on an id.
|
|
25
|
+
* @param args - the tool's arguments.
|
|
26
|
+
*/
|
|
27
|
+
export declare const stressToolResult: (stress: (id: string) => Promise<StressReport | string>, args: Readonly<Record<string, unknown>>) => Promise<McpToolResult>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a run found what a case breaks, or a case it could not judge.
|
|
3
|
+
*
|
|
4
|
+
* @param report - the run.
|
|
5
|
+
*/
|
|
6
|
+
export const isStressFailure = (report) => report.cases.some((each) => each.name !== "plain" && (each.problems.length > 0 || each.notVerified !== undefined));
|
|
7
|
+
/**
|
|
8
|
+
* The run, a line per problem a case adds, then one line that sums it up.
|
|
9
|
+
*
|
|
10
|
+
* @param report - the run.
|
|
11
|
+
*/
|
|
12
|
+
export const stressText = (report) => {
|
|
13
|
+
const cases = report.cases.filter((each) => each.name !== "plain");
|
|
14
|
+
const lines = cases.flatMap((each) => [
|
|
15
|
+
...(each.notVerified === undefined
|
|
16
|
+
? []
|
|
17
|
+
: [`${each.storyId} ${each.name}: not judged: ${each.notVerified}`]),
|
|
18
|
+
...each.problems.map((problem) => `${each.storyId} ${each.name}: ${problem.message}`)
|
|
19
|
+
]);
|
|
20
|
+
const breaking = cases.filter((each) => each.problems.length > 0).length;
|
|
21
|
+
return [
|
|
22
|
+
...lines,
|
|
23
|
+
...(report.skipped ?? []).map((each) => `not run: ${each}`),
|
|
24
|
+
`${cases.length} cases, ${breaking} break what the plain story does not`
|
|
25
|
+
].join("\n");
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* What `check_story` answers with `stress`: the run, an error when a case breaks something, and a refusal of the options
|
|
29
|
+
* it does not take, since it chooses its own values and views.
|
|
30
|
+
*
|
|
31
|
+
* @param stress - runs the stress matrix on an id.
|
|
32
|
+
* @param args - the tool's arguments.
|
|
33
|
+
*/
|
|
34
|
+
export const stressToolResult = async (stress, args) => {
|
|
35
|
+
if (args["views"] !== undefined || args["allVariants"] === true || args["semantic"] === true)
|
|
36
|
+
return {
|
|
37
|
+
structured: {
|
|
38
|
+
error: "stress chooses its own values and views: leave out views, allVariants and semantic"
|
|
39
|
+
},
|
|
40
|
+
isError: true
|
|
41
|
+
};
|
|
42
|
+
const stressed = await stress(typeof args["id"] === "string" ? args["id"] : "");
|
|
43
|
+
if (typeof stressed === "string")
|
|
44
|
+
return { structured: { error: stressed }, isError: true };
|
|
45
|
+
return { structured: stressed, isError: isStressFailure(stressed) };
|
|
46
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { StoryCheckReport, StoryCheckResult, StoryProblem } from "../../src/storyCheck.ts";
|
|
2
|
+
import type { ResolvedConfig } from "../../src/vite/configFile.ts";
|
|
3
|
+
/**
|
|
4
|
+
* A problem as a key two runs share when it is the same problem: an accessibility rule by its element (its message
|
|
5
|
+
* carries measures, as a contrast's ratio), anything else by its message without what differs between runs.
|
|
6
|
+
*
|
|
7
|
+
* @param result - the story and view it was found in.
|
|
8
|
+
* @param problem - the problem.
|
|
9
|
+
* @param folders - the folders to take out of its message: the working tree's and the base's.
|
|
10
|
+
*/
|
|
11
|
+
export declare const problemKey: (result: Pick<StoryCheckResult, "storyId" | "view">, problem: StoryProblem, folders: readonly string[]) => string;
|
|
12
|
+
/** What the base's report says, split: the change's problems, those the base had, and stories the base did not see. */
|
|
13
|
+
export type SplitByBase = {
|
|
14
|
+
/** The change's report with only the problems the base did not have. */
|
|
15
|
+
readonly report: StoryCheckReport;
|
|
16
|
+
/** The problems the base had too, by story and view. */
|
|
17
|
+
readonly existing: readonly StoryCheckResult[];
|
|
18
|
+
/** How many stories the base never saw in their final state: their problems all count. */
|
|
19
|
+
readonly unseen: number;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* The head's results split into the problems the change brought and those the base had too, each of the base's
|
|
23
|
+
* problems matching one of the change's.
|
|
24
|
+
*
|
|
25
|
+
* @param head - the report on the change.
|
|
26
|
+
* @param base - the report on the base, for the stories that failed on the change.
|
|
27
|
+
* @param folders - the working tree's folder and the base's, taken out of the messages.
|
|
28
|
+
*/
|
|
29
|
+
export declare const splitByBase: (head: StoryCheckReport, base: StoryCheckReport, folders: readonly string[]) => SplitByBase;
|
|
30
|
+
/** The base's run: its report, the folder it ran in and the working tree's root, or why it could not run. */
|
|
31
|
+
export type BaseRun = {
|
|
32
|
+
readonly report: StoryCheckReport;
|
|
33
|
+
readonly folder: string;
|
|
34
|
+
readonly root: string;
|
|
35
|
+
} | string;
|
|
36
|
+
/**
|
|
37
|
+
* Runs stories on the base commit, in a worktree of its own beside the repository, removed after.
|
|
38
|
+
*
|
|
39
|
+
* @param config - the catalogue's configuration on the change.
|
|
40
|
+
* @param base - the base commit, as `git merge-base` gave it.
|
|
41
|
+
* @param ids - the stories to run.
|
|
42
|
+
* @param isAllVariants - whether every variant runs, as on the change.
|
|
43
|
+
* @param runEnv - the run's environment.
|
|
44
|
+
*/
|
|
45
|
+
export declare const runOnBase: (config: ResolvedConfig, base: string, ids: readonly string[], isAllVariants: boolean, runEnv: Readonly<Record<string, string | undefined>>) => Promise<BaseRun>;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The stories `verify` found a problem in, run again on the commit the change starts from, so the verdict counts only
|
|
3
|
+
* what the change brought: an application whose stories already break an accessibility rule would otherwise fail every
|
|
4
|
+
* change, and a red verdict that is always red tells an agent nothing.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* The base is checked out with `git worktree add --detach` beside the repository (a hidden folder next to it, named
|
|
8
|
+
* after the base and the process, removed after; one a run left behind is removed by the next), so the working tree is
|
|
9
|
+
* never touched. It has no dependencies of its own: each `node_modules` folder of the working tree gets a twin in it whose
|
|
10
|
+
* entries link to the working tree's, except a workspace package, which links to the same package in the base, so the
|
|
11
|
+
* base runs its own code. Its catalogue is served by a server of its own for the run, which runs the base's configuration.
|
|
12
|
+
* A problem is the same in both when its story, view, kind and rule match and, for an accessibility rule, its element,
|
|
13
|
+
* else its message once addresses, positions and the two folders are taken out; each problem of the base matches one of
|
|
14
|
+
* the change's, so a second copy of an old problem is new.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, realpathSync, rmSync, symlinkSync } from "node:fs";
|
|
19
|
+
import { basename, dirname, join, relative, sep } from "node:path";
|
|
20
|
+
import { findConfigFile } from "../../src/vite/configFile.js";
|
|
21
|
+
import { gitOutput, gitOutputIn } from "../../src/vite/gitChange.js";
|
|
22
|
+
import { configOf } from "./catalogueCommands.js";
|
|
23
|
+
import { isProcessRunning } from "./commandCacheClaim.js";
|
|
24
|
+
import { runStoriesCheck } from "./storyCheckRun.js";
|
|
25
|
+
/** Folders whose `node_modules` are not looked for: the base's own copies of them hold no package. */
|
|
26
|
+
const NOT_WALKED = new Set(["node_modules", ".git"]);
|
|
27
|
+
/** How deep folders are searched for a `node_modules` to link: a monorepo's packages sit a few levels down. */
|
|
28
|
+
const MAX_DEPTH = 4;
|
|
29
|
+
/**
|
|
30
|
+
* The folders of a tree, relative to it, that hold a `node_modules`, at most `MAX_DEPTH` levels down.
|
|
31
|
+
*
|
|
32
|
+
* @param root - the working tree's root.
|
|
33
|
+
*/
|
|
34
|
+
const modulesFolders = (root) => {
|
|
35
|
+
const found = [];
|
|
36
|
+
const walk = (folder, depth) => {
|
|
37
|
+
if (existsSync(join(root, folder, "node_modules")))
|
|
38
|
+
found.push(folder);
|
|
39
|
+
if (depth >= MAX_DEPTH)
|
|
40
|
+
return;
|
|
41
|
+
for (const entry of readdirSync(join(root, folder), { withFileTypes: true })) {
|
|
42
|
+
if (entry.isDirectory() && !NOT_WALKED.has(entry.name) && !entry.name.startsWith("."))
|
|
43
|
+
walk(join(folder, entry.name), depth + 1);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
walk("", 0);
|
|
47
|
+
return found;
|
|
48
|
+
};
|
|
49
|
+
/** Where a working tree's package link should point in the base: the same package there, when it is a workspace's. */
|
|
50
|
+
const linkTarget = (entry, root, folder) => {
|
|
51
|
+
if (!lstatSync(entry).isSymbolicLink())
|
|
52
|
+
return entry;
|
|
53
|
+
const real = realpathSync(entry);
|
|
54
|
+
const inside = relative(root, real);
|
|
55
|
+
const isWorkspace = !inside.startsWith("..") && !inside.split(sep).includes("node_modules");
|
|
56
|
+
return isWorkspace ? join(folder, inside) : entry;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Gives a base folder a `node_modules` twin of the working tree's: each entry linked to the working tree's, a workspace
|
|
60
|
+
* package to the base's own.
|
|
61
|
+
*
|
|
62
|
+
* @param from - the working tree's `node_modules`.
|
|
63
|
+
* @param to - the base's, made.
|
|
64
|
+
* @param root - the working tree's root.
|
|
65
|
+
* @param folder - the base's root.
|
|
66
|
+
*/
|
|
67
|
+
const twinModules = (from, to, root, folder) => {
|
|
68
|
+
mkdirSync(to, { recursive: true });
|
|
69
|
+
for (const name of readdirSync(from)) {
|
|
70
|
+
const entry = join(from, name);
|
|
71
|
+
if (name.startsWith("@") && lstatSync(entry).isDirectory())
|
|
72
|
+
twinModules(entry, join(to, name), root, folder);
|
|
73
|
+
else
|
|
74
|
+
symlinkSync(linkTarget(entry, root, folder), join(to, name), "junction");
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
/** The prefix of the folders a base runs in, beside the repository. */
|
|
78
|
+
const folderPrefix = (root) => `.${basename(root)}-forgebook-base-`;
|
|
79
|
+
/**
|
|
80
|
+
* The environment of the git commands that make, remove and prune the base's worktree: without `GIT_INDEX_FILE`, which
|
|
81
|
+
* git sets for its hooks. A pre-commit hook that runs `verify` would otherwise have the base's checkout written into the
|
|
82
|
+
* index of the commit being made: a relative one fails the checkout, and an absolute one (`git commit -a`) turns the
|
|
83
|
+
* commit into the base's files.
|
|
84
|
+
*
|
|
85
|
+
* @param env - the run's environment.
|
|
86
|
+
*/
|
|
87
|
+
const worktreeEnv = (env) => Object.fromEntries(Object.entries(env).filter(([name]) => name !== "GIT_INDEX_FILE"));
|
|
88
|
+
/** Removes the base folders a run that is gone left beside the repository, and git's record of them. */
|
|
89
|
+
const sweep = async (root, env) => {
|
|
90
|
+
const prefix = folderPrefix(root);
|
|
91
|
+
for (const name of readdirSync(dirname(root)).filter((each) => each.startsWith(prefix))) {
|
|
92
|
+
const pid = Number(name.split("-").pop());
|
|
93
|
+
if (Number.isInteger(pid) && !isProcessRunning(pid))
|
|
94
|
+
rmSync(join(dirname(root), name), { recursive: true, force: true });
|
|
95
|
+
}
|
|
96
|
+
await gitOutputIn(root, env, "worktree", "prune").catch(() => undefined);
|
|
97
|
+
};
|
|
98
|
+
/** Positions, query stamps and addresses: what differs between two runs of the same code. */
|
|
99
|
+
const RUN_NOISE = [/https?:\/\/[^\s)'"]+/g, /:\d+:\d+/g, /\?[a-z]=[\w.-]+/g];
|
|
100
|
+
/** A problem's message with what differs between two runs of the same story taken out. */
|
|
101
|
+
const plainMessage = (message, folders) => RUN_NOISE.reduce((text, noise) => text.replace(noise, ""), folders.reduce((text, folder) => text.split(folder).join("<root>"), message));
|
|
102
|
+
/**
|
|
103
|
+
* A problem as a key two runs share when it is the same problem: an accessibility rule by its element (its message
|
|
104
|
+
* carries measures, as a contrast's ratio), anything else by its message without what differs between runs.
|
|
105
|
+
*
|
|
106
|
+
* @param result - the story and view it was found in.
|
|
107
|
+
* @param problem - the problem.
|
|
108
|
+
* @param folders - the folders to take out of its message: the working tree's and the base's.
|
|
109
|
+
*/
|
|
110
|
+
export const problemKey = (result, problem, folders) => [
|
|
111
|
+
result.storyId,
|
|
112
|
+
result.view,
|
|
113
|
+
problem.kind,
|
|
114
|
+
problem.rule ?? "",
|
|
115
|
+
problem.kind === "axe" ? (problem.element ?? "") : plainMessage(problem.message, folders)
|
|
116
|
+
].join("\u0000");
|
|
117
|
+
/**
|
|
118
|
+
* The head's results split into the problems the change brought and those the base had too, each of the base's
|
|
119
|
+
* problems matching one of the change's.
|
|
120
|
+
*
|
|
121
|
+
* @param head - the report on the change.
|
|
122
|
+
* @param base - the report on the base, for the stories that failed on the change.
|
|
123
|
+
* @param folders - the working tree's folder and the base's, taken out of the messages.
|
|
124
|
+
*/
|
|
125
|
+
export const splitByBase = (head, base, folders) => {
|
|
126
|
+
const left = new Map();
|
|
127
|
+
const seen = base.results.filter((result) => result.notVerified === undefined);
|
|
128
|
+
for (const result of seen)
|
|
129
|
+
for (const problem of result.problems) {
|
|
130
|
+
const key = problemKey(result, problem, folders);
|
|
131
|
+
left.set(key, (left.get(key) ?? 0) + 1);
|
|
132
|
+
}
|
|
133
|
+
const results = head.results.map((result) => {
|
|
134
|
+
const brought = [];
|
|
135
|
+
const old = [];
|
|
136
|
+
for (const problem of result.problems) {
|
|
137
|
+
const key = problemKey(result, problem, folders);
|
|
138
|
+
const count = left.get(key) ?? 0;
|
|
139
|
+
if (count > 0) {
|
|
140
|
+
left.set(key, count - 1);
|
|
141
|
+
old.push(problem);
|
|
142
|
+
}
|
|
143
|
+
else
|
|
144
|
+
brought.push(problem);
|
|
145
|
+
}
|
|
146
|
+
return { result, brought, old };
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
report: { ...head, results: results.map(({ result, brought }) => ({ ...result, problems: brought })) },
|
|
150
|
+
existing: results
|
|
151
|
+
.filter(({ old }) => old.length > 0)
|
|
152
|
+
.map(({ result, old }) => ({ ...result, problems: old })),
|
|
153
|
+
unseen: base.results.length - seen.length
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Runs stories on the base commit, in a worktree of its own beside the repository, removed after.
|
|
158
|
+
*
|
|
159
|
+
* @param config - the catalogue's configuration on the change.
|
|
160
|
+
* @param base - the base commit, as `git merge-base` gave it.
|
|
161
|
+
* @param ids - the stories to run.
|
|
162
|
+
* @param isAllVariants - whether every variant runs, as on the change.
|
|
163
|
+
* @param runEnv - the run's environment.
|
|
164
|
+
*/
|
|
165
|
+
export const runOnBase = async (config, base, ids, isAllVariants, runEnv) => {
|
|
166
|
+
const env = worktreeEnv(runEnv);
|
|
167
|
+
const root = (await gitOutput(config.dir, "rev-parse", "--show-toplevel")).trim();
|
|
168
|
+
const folder = join(dirname(root), `${folderPrefix(root)}${base.slice(0, 12)}-${process.pid}`);
|
|
169
|
+
const twins = [];
|
|
170
|
+
try {
|
|
171
|
+
await sweep(root, env);
|
|
172
|
+
await gitOutputIn(root, env, "worktree", "add", "--detach", "--force", folder, base);
|
|
173
|
+
for (const each of modulesFolders(root)) {
|
|
174
|
+
const twin = join(folder, each, "node_modules");
|
|
175
|
+
if (!existsSync(join(folder, each)) || existsSync(twin))
|
|
176
|
+
continue;
|
|
177
|
+
twinModules(join(root, each, "node_modules"), twin, root, folder);
|
|
178
|
+
twins.push(twin);
|
|
179
|
+
}
|
|
180
|
+
const configFile = findConfigFile(join(folder, relative(root, config.dir)));
|
|
181
|
+
if (configFile === undefined)
|
|
182
|
+
return "the catalogue has no configuration at the base";
|
|
183
|
+
const report = await runStoriesCheck(await configOf(configFile), undefined, { ids, isAllVariants });
|
|
184
|
+
return typeof report === "string" ? report : { report, folder, root };
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
return error instanceof Error ? error.message : String(error);
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
// the links go first, so nothing that removes the worktree can follow one into the working tree
|
|
191
|
+
for (const twin of twins)
|
|
192
|
+
rmSync(twin, { recursive: true, force: true });
|
|
193
|
+
await gitOutputIn(root, env, "worktree", "remove", "--force", folder).catch(() => undefined);
|
|
194
|
+
rmSync(folder, { recursive: true, force: true });
|
|
195
|
+
}
|
|
196
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forgebook verify`: whether a change is done, with one exit code.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandNode, CommandScope } from "@ensiria/cli-kit/commands.types";
|
|
7
|
+
import { type ForgebookOptions } from "./catalogueCommands.ts";
|
|
8
|
+
/**
|
|
9
|
+
* The command.
|
|
10
|
+
*
|
|
11
|
+
* @param forgebook - the scope of the `forgebook` command, whose options every command takes.
|
|
12
|
+
*/
|
|
13
|
+
export declare const verifyCommands: (forgebook: CommandScope<ForgebookOptions>) => Readonly<Record<string, CommandNode>>;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { EXIT } from "@ensiria/cli-kit/constants";
|
|
2
|
+
import { formatJson } from "@ensiria/cli-kit/files";
|
|
3
|
+
import { ScriptError } from "@ensiria/cli-kit/script";
|
|
4
|
+
import { isVisibilityDocument } from "../../src/vite/agentVisibility.js";
|
|
5
|
+
import { emptyStoryGlobsProblems } from "../../src/vite/emptyStoryGlobs.js";
|
|
6
|
+
import { catalogueClient } from "./agentClient.js";
|
|
7
|
+
import { verifyText, visibilityText } from "./agentText.js";
|
|
8
|
+
import { COMMAND, configOf, configWithStoriesOf } from "./catalogueCommands.js";
|
|
9
|
+
import { runStoriesCheck } from "./storyCheckRun.js";
|
|
10
|
+
import { runOnBase } from "./verifyBase.js";
|
|
11
|
+
import { errorOf, isVerifyFailure, runVerify } from "./verifyRun.js";
|
|
12
|
+
/**
|
|
13
|
+
* The command.
|
|
14
|
+
*
|
|
15
|
+
* @param forgebook - the scope of the `forgebook` command, whose options every command takes.
|
|
16
|
+
*/
|
|
17
|
+
export const verifyCommands = (forgebook) => ({
|
|
18
|
+
verify: forgebook.command({
|
|
19
|
+
summary: "Say whether a change is done: every changed UI file in stories that ran, in every variant, and what it adds against the design system.",
|
|
20
|
+
json: true,
|
|
21
|
+
options: {
|
|
22
|
+
since: {
|
|
23
|
+
type: "string",
|
|
24
|
+
valueName: "ref",
|
|
25
|
+
description: "The commit to compare with, from where the branch left it; the default branch by default, so what is committed on this branch counts."
|
|
26
|
+
},
|
|
27
|
+
quick: {
|
|
28
|
+
type: "boolean",
|
|
29
|
+
description: "Only the default view of each story: faster, and the verdict says so."
|
|
30
|
+
},
|
|
31
|
+
"all-problems": {
|
|
32
|
+
type: "boolean",
|
|
33
|
+
description: "Fail on every problem the stories have, not only those the change brought: the stories that found one are not run again on the base."
|
|
34
|
+
},
|
|
35
|
+
url: {
|
|
36
|
+
type: "string",
|
|
37
|
+
env: "FORGEBOOK_URL",
|
|
38
|
+
valueName: "address",
|
|
39
|
+
description: "Where forgebook dev runs, when not at Vite's default address (http://localhost:5173)."
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
examples: [
|
|
43
|
+
{ command: `${COMMAND} verify`, description: "Before you say a change is done." },
|
|
44
|
+
{ command: `${COMMAND} verify --since origin/develop --json`, description: "In a pull request." },
|
|
45
|
+
{ command: `${COMMAND} verify --quick`, description: "While you work: the default view of each story." }
|
|
46
|
+
],
|
|
47
|
+
run: async ({ options, io, log, isJson, style }) => {
|
|
48
|
+
// a pattern that matches nothing leaves the answer not verified, and the rest of it is still given
|
|
49
|
+
const config = await configOf(options.config);
|
|
50
|
+
const client = await catalogueClient(config, options.url);
|
|
51
|
+
try {
|
|
52
|
+
const document = await runVerify({
|
|
53
|
+
dir: config.dir,
|
|
54
|
+
ask: client.ask,
|
|
55
|
+
check: (input) => runStoriesCheck(config, options.url, input),
|
|
56
|
+
checkBase: (base, input) => runOnBase(config, base, input.ids, input.isAllVariants, io.env)
|
|
57
|
+
}, {
|
|
58
|
+
since: options.since,
|
|
59
|
+
isQuick: options.quick === true,
|
|
60
|
+
isAllProblems: options["all-problems"] === true,
|
|
61
|
+
configProblems: emptyStoryGlobsProblems(config)
|
|
62
|
+
});
|
|
63
|
+
if (typeof document === "string")
|
|
64
|
+
throw new ScriptError(document);
|
|
65
|
+
io.stdout.write(isJson ? formatJson(document) : `${verifyText(document, style)}\n`);
|
|
66
|
+
// the line says them to a person; a pipeline reading the JSON still shows them in its log
|
|
67
|
+
if (isJson)
|
|
68
|
+
for (const each of document.skipped)
|
|
69
|
+
log.warn(each);
|
|
70
|
+
if (isVerifyFailure(document))
|
|
71
|
+
throw new ScriptError(document.summary, { exitCode: EXIT.failure, isReported: true });
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
await client.close();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}),
|
|
78
|
+
visibility: forgebook.command({
|
|
79
|
+
summary: "List the published components an agent cannot see, with the fix for each: no story of their own, stories all tagged !dev, no props to read, no TSDoc.",
|
|
80
|
+
json: true,
|
|
81
|
+
options: {
|
|
82
|
+
since: {
|
|
83
|
+
type: "string",
|
|
84
|
+
valueName: "ref",
|
|
85
|
+
description: "Only those a change touches or starts publishing, as verify holds them; every published component by default."
|
|
86
|
+
},
|
|
87
|
+
url: {
|
|
88
|
+
type: "string",
|
|
89
|
+
env: "FORGEBOOK_URL",
|
|
90
|
+
valueName: "address",
|
|
91
|
+
description: "Where forgebook dev runs, when not at Vite's default address (http://localhost:5173)."
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
examples: [
|
|
95
|
+
{
|
|
96
|
+
command: `${COMMAND} visibility`,
|
|
97
|
+
description: "What a library's agents will rebuild instead of reuse."
|
|
98
|
+
},
|
|
99
|
+
{ command: `${COMMAND} visibility --json`, description: "As an agent asks." }
|
|
100
|
+
],
|
|
101
|
+
run: async ({ options, io, log, isJson }) => {
|
|
102
|
+
const config = await configWithStoriesOf(options.config);
|
|
103
|
+
const client = await catalogueClient(config, options.url);
|
|
104
|
+
try {
|
|
105
|
+
const params = new URLSearchParams(options.since === undefined ? {} : { since: options.since });
|
|
106
|
+
const answer = await client.ask("visibility", params);
|
|
107
|
+
if (answer.status !== 200 || !isVisibilityDocument(answer.body))
|
|
108
|
+
throw new ScriptError(errorOf(answer.body, answer.status));
|
|
109
|
+
const document = answer.body;
|
|
110
|
+
io.stdout.write(isJson ? formatJson(document) : `${visibilityText(document)}\n`);
|
|
111
|
+
if (isJson)
|
|
112
|
+
for (const each of document.skipped)
|
|
113
|
+
log.warn(each);
|
|
114
|
+
if (document.unseen.length > 0)
|
|
115
|
+
throw new ScriptError(`${document.unseen.length} published components agents cannot see`, {
|
|
116
|
+
exitCode: EXIT.failure,
|
|
117
|
+
isReported: true
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
await client.close();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
})
|
|
125
|
+
});
|