forgebook 0.3.3 → 0.4.1
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 +994 -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 +182 -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 +62 -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 +95 -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 +204 -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 +323 -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 +148 -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 +69 -185
- 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 +83 -0
- package/dist/src/componentDocs.js +20 -3
- package/dist/src/controlCode.d.ts +27 -0
- package/dist/src/controlCode.js +41 -0
- 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/controlValues.d.ts +39 -0
- package/dist/src/frame/controlValues.js +143 -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 +10 -1
- package/dist/src/frame/mountFrame.js +160 -55
- package/dist/src/frame/panelControls.d.ts +67 -0
- package/dist/src/frame/panelControls.js +110 -0
- 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/AuthoredHome.js +3 -1
- package/dist/src/shell/CodeTab.d.ts +12 -6
- package/dist/src/shell/CodeTab.js +47 -3
- 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 +6 -6
- package/dist/src/shell/ComponentPage.js +8 -2
- package/dist/src/shell/CustomControl.d.ts +34 -0
- package/dist/src/shell/CustomControl.js +125 -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 +18 -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/PageWidth.d.ts +29 -0
- package/dist/src/shell/PageWidth.js +18 -0
- 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 +22 -11
- package/dist/src/shell/PropRows.js +62 -24
- package/dist/src/shell/PropsTab.d.ts +12 -5
- package/dist/src/shell/PropsTab.js +9 -22
- 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 +141 -23
- 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/StoryPicker.d.ts +4 -2
- package/dist/src/shell/StoryPicker.js +3 -3
- package/dist/src/shell/Switch.d.ts +29 -0
- package/dist/src/shell/Switch.js +11 -0
- 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 +62 -0
- package/dist/src/shell/customControls.js +81 -0
- package/dist/src/shell/docPage.css +22 -22
- package/dist/src/shell/dockTabs.d.ts +19 -3
- package/dist/src/shell/dockTabs.js +29 -20
- package/dist/src/shell/embed.css +7 -7
- package/dist/src/shell/frameOrder.d.ts +35 -0
- package/dist/src/shell/frameOrder.js +45 -0
- 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 +30 -0
- package/dist/src/shell/laterStrings.js +43 -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 +376 -169
- 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/useFrameQueue.d.ts +8 -3
- package/dist/src/shell/useFrameQueue.js +42 -12
- 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/useScrollSettled.d.ts +18 -0
- package/dist/src/shell/useScrollSettled.js +56 -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 +148 -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 +99 -3
- package/dist/src/storyCheck.js +39 -1
- package/dist/src/storyCodeText.d.ts +52 -0
- package/dist/src/storyCodeText.js +30 -0
- package/dist/src/storyControls.d.ts +103 -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 +354 -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 +135 -66
- package/dist/src/vite/agentStatuses.d.ts +42 -0
- package/dist/src/vite/agentStatuses.js +67 -0
- package/dist/src/vite/agentStoryCode.d.ts +51 -0
- package/dist/src/vite/agentStoryCode.js +44 -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/argControlsConfig.d.ts +30 -0
- package/dist/src/vite/argControlsConfig.js +176 -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 +21 -4
- 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 +67 -1
- package/dist/src/vite/configFile.d.ts +15 -2
- package/dist/src/vite/configFile.js +109 -40
- package/dist/src/vite/configKeys.d.ts +15 -0
- package/dist/src/vite/configKeys.js +172 -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 +55 -73
- 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 +119 -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 +187 -60
- 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/typedControls.d.ts +31 -0
- package/dist/src/vite/typedControls.js +66 -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,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the written configuration needs installed, and what a project has of it: the packages to add, and the ones it
|
|
3
|
+
* has declared too old for Forgebook to draw with.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* A package's folder is looked for in the `node_modules` folders going up rather than resolved: many packages' `exports`
|
|
7
|
+
* leave out `package.json`, which would read as not installed, and `NODE_PATH`, which a package manager's shims set, is
|
|
8
|
+
* something Vite does not read. A declared version is the project's decision, so one too old is
|
|
9
|
+
* a stop, while a version found only in `node_modules` came with something else and is simply not the project's yet.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { dirname, join } from "node:path";
|
|
15
|
+
import { isRecord, projectManifest } from "../importers/storybook.js";
|
|
16
|
+
import { FORGEBOOK_PEERS, PROJECT_FRAMEWORKS } from "./projectFrameworks.js";
|
|
17
|
+
/** The longest range read, so a planted one costs nothing. */
|
|
18
|
+
const MAX_RANGE_LENGTH = 256;
|
|
19
|
+
/** A version's numbers. */
|
|
20
|
+
const numbersOf = (parts) => parts.map((part) => Number(part ?? 0) || 0);
|
|
21
|
+
/** Whether one version's numbers come before another's. */
|
|
22
|
+
const isBelow = (version, floor) => {
|
|
23
|
+
for (const [index, number] of version.entries()) {
|
|
24
|
+
const other = floor[index] ?? 0;
|
|
25
|
+
if (number !== other)
|
|
26
|
+
return number < other;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
};
|
|
30
|
+
/** A version as text: one that names no number reads as zero. */
|
|
31
|
+
const parsedVersion = (text) => {
|
|
32
|
+
const match = text.match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?/);
|
|
33
|
+
return numbersOf([match?.[1], match?.[2], match?.[3]]);
|
|
34
|
+
};
|
|
35
|
+
/** The first version a plain range does not take; none when it has no such end. */
|
|
36
|
+
const rangeEnd = (operator, major, minor, patch) => {
|
|
37
|
+
const isWild = (part) => part === undefined || part === "x" || part === "*";
|
|
38
|
+
const minorNumber = Number(minor) || 0;
|
|
39
|
+
if (operator === "^")
|
|
40
|
+
return major > 0 ? [major + 1, 0, 0] : [0, minorNumber + 1, 0];
|
|
41
|
+
if (isWild(minor))
|
|
42
|
+
return [major + 1, 0, 0];
|
|
43
|
+
return operator === "~" || isWild(patch)
|
|
44
|
+
? [major, minorNumber + 1, 0]
|
|
45
|
+
: [major, minorNumber, (Number(patch) || 0) + 1];
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Whether one alternative of a range can give a version at or above a floor. What names no version (`workspace:*`,
|
|
49
|
+
* `latest`) can, since only the package manager can read it.
|
|
50
|
+
*/
|
|
51
|
+
const canReach = (alternative, floor) => {
|
|
52
|
+
const text = alternative.trim();
|
|
53
|
+
const upper = text.match(/<(=?)\s*(\d[\d.]*)/);
|
|
54
|
+
if (upper !== null) {
|
|
55
|
+
const end = parsedVersion(upper[2] ?? "");
|
|
56
|
+
return upper[1] === "=" ? !isBelow(end, floor) : isBelow(floor, end);
|
|
57
|
+
}
|
|
58
|
+
if (text.startsWith(">"))
|
|
59
|
+
return true;
|
|
60
|
+
const match = text.match(/^([\^~]|=|v)?(\d+)(?:\.(\d+|x|\*))?(?:\.(\d+|x|\*))?/);
|
|
61
|
+
if (match === null)
|
|
62
|
+
return true;
|
|
63
|
+
const end = rangeEnd(match[1] ?? "", Number(match[2]), match[3], match[4]);
|
|
64
|
+
return isBelow(floor, end);
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Whether what a project wrote or has installed cannot reach a floor: `^8.0.1` can reach `8.3.4`, `^18.3.0` cannot reach
|
|
68
|
+
* `19.0.0`, and a range counts by its best alternative, since a library's `^18 || ^19` takes the floor's major too.
|
|
69
|
+
*
|
|
70
|
+
* @param version - the version or the range.
|
|
71
|
+
* @param floor - the lowest version taken.
|
|
72
|
+
*/
|
|
73
|
+
export const isBelowFloor = (version, floor) => {
|
|
74
|
+
const floorNumbers = parsedVersion(floor);
|
|
75
|
+
return !version
|
|
76
|
+
.slice(0, MAX_RANGE_LENGTH)
|
|
77
|
+
.split("||")
|
|
78
|
+
.some((alternative) => canReach(alternative, floorNumbers));
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* The packages a project declares, with their versions as written: a design system's framework is a peer.
|
|
82
|
+
*
|
|
83
|
+
* @param projectDir - the project's folder.
|
|
84
|
+
*/
|
|
85
|
+
export const declaredPackages = (projectDir) => {
|
|
86
|
+
const manifest = projectManifest(projectDir);
|
|
87
|
+
return new Map(["peerDependencies", "devDependencies", "dependencies"].flatMap((field) => {
|
|
88
|
+
const list = manifest[field];
|
|
89
|
+
return isRecord(list)
|
|
90
|
+
? Object.entries(list).flatMap(([name, version]) => typeof version === "string" ? [[name, version]] : [])
|
|
91
|
+
: [];
|
|
92
|
+
}));
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* How the install command names a package: Angular's own at the project's major, since the latest of one beside the
|
|
96
|
+
* rest at an older major does not install.
|
|
97
|
+
*
|
|
98
|
+
* @param name - the package.
|
|
99
|
+
* @param declared - the packages the project declares.
|
|
100
|
+
*/
|
|
101
|
+
export const installSpecifier = (name, declared) => {
|
|
102
|
+
const major = declared.get("@angular/core")?.match(/\d+/)?.[0];
|
|
103
|
+
return name.startsWith("@angular/") && major !== undefined ? `${name}@^${major}.0.0` : name;
|
|
104
|
+
};
|
|
105
|
+
/** The nearest `node_modules` copy of a package, going up from a folder. */
|
|
106
|
+
const nearestManifest = (dir, name) => {
|
|
107
|
+
const manifest = join(dir, "node_modules", name, "package.json");
|
|
108
|
+
if (existsSync(manifest))
|
|
109
|
+
return manifest;
|
|
110
|
+
const parent = dirname(dir);
|
|
111
|
+
return parent === dir ? undefined : nearestManifest(parent, name);
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* The version of a package a folder can load, read from its `package.json`.
|
|
115
|
+
*
|
|
116
|
+
* @param dir - the folder.
|
|
117
|
+
* @param name - the package.
|
|
118
|
+
* @returns its version, `""` for one that names none, or none when it is not installed.
|
|
119
|
+
*/
|
|
120
|
+
export const installedVersion = (dir, name) => {
|
|
121
|
+
const manifest = nearestManifest(dir, name);
|
|
122
|
+
if (manifest === undefined)
|
|
123
|
+
return undefined;
|
|
124
|
+
const parsed = JSON.parse(readFileSync(manifest, "utf8"));
|
|
125
|
+
const version = typeof parsed === "object" && parsed !== null && "version" in parsed ? parsed.version : undefined;
|
|
126
|
+
return typeof version === "string" ? version : "";
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* The packages a configuration needs with the lowest version of each: `forgebook`, the adapter, what either asks the
|
|
130
|
+
* project for, and what the adapter's options add (no floor, written as `0.0.0`). Forgebook's own Vite is its dependency,
|
|
131
|
+
* so a project's is no concern here.
|
|
132
|
+
*
|
|
133
|
+
* @param framework - the framework.
|
|
134
|
+
* @param extraPeers - what its options add.
|
|
135
|
+
*/
|
|
136
|
+
export const requiredPackages = (framework, extraPeers) => {
|
|
137
|
+
const required = new Map([
|
|
138
|
+
["forgebook", "0.0.0"],
|
|
139
|
+
[`@forgebook/${framework}`, "0.0.0"]
|
|
140
|
+
]);
|
|
141
|
+
for (const peers of [FORGEBOOK_PEERS, PROJECT_FRAMEWORKS[framework].peers]) {
|
|
142
|
+
for (const [name, floor] of Object.entries(peers)) {
|
|
143
|
+
const known = required.get(name);
|
|
144
|
+
if (known === undefined || isBelowFloor(known, floor))
|
|
145
|
+
required.set(name, floor);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const name of extraPeers)
|
|
149
|
+
if (!required.has(name))
|
|
150
|
+
required.set(name, "0.0.0");
|
|
151
|
+
return required;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* What a project has of the packages a configuration needs.
|
|
155
|
+
*
|
|
156
|
+
* @param dir - the project's folder.
|
|
157
|
+
* @param declared - the packages it declares, with their versions as written.
|
|
158
|
+
* @param required - the packages needed, with the lowest version of each.
|
|
159
|
+
*/
|
|
160
|
+
export const packageState = (dir, declared, required) => {
|
|
161
|
+
const missing = [];
|
|
162
|
+
const tooOld = [];
|
|
163
|
+
let hasUninstalled = false;
|
|
164
|
+
for (const [name, floor] of required) {
|
|
165
|
+
const written = declared.get(name);
|
|
166
|
+
const installed = installedVersion(dir, name);
|
|
167
|
+
const found = installed === undefined || installed === "" ? written : installed;
|
|
168
|
+
// an alias (`npm:@preact/compat`) has a version of its own package's, which says nothing of this one's
|
|
169
|
+
const isOld = found !== undefined && written?.startsWith("npm:") !== true && isBelowFloor(found, floor);
|
|
170
|
+
if (written !== undefined && isOld)
|
|
171
|
+
tooOld.push({ name, found: found ?? written, floor });
|
|
172
|
+
else if (written === undefined && (installed === undefined || isOld))
|
|
173
|
+
missing.push(name);
|
|
174
|
+
else if (installed === undefined)
|
|
175
|
+
hasUninstalled = true;
|
|
176
|
+
}
|
|
177
|
+
return { missing, tooOld, hasUninstalled };
|
|
178
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { StoryCheckReport } from "../../src/storyCheck.ts";
|
|
2
|
+
import type { StoryWrapper } from "./newStories.ts";
|
|
3
|
+
/** How many times the stories are drawn again after a repair. */
|
|
4
|
+
export declare const MAX_ROUNDS = 2;
|
|
5
|
+
/**
|
|
6
|
+
* The components a report's failures say their stories must be drawn inside, each once, in the order met.
|
|
7
|
+
*
|
|
8
|
+
* @param report - the new stories' check.
|
|
9
|
+
* @returns the names; a context's provider (`Theme.Provider`) is left out, since its value cannot be made up.
|
|
10
|
+
*/
|
|
11
|
+
export declare const neededWrappers: (report: StoryCheckReport) => string[];
|
|
12
|
+
/**
|
|
13
|
+
* The component of the application a story must be drawn inside, as a wrapper the story file imports.
|
|
14
|
+
*
|
|
15
|
+
* @param componentFile - the component's file, absolute.
|
|
16
|
+
* @param storyFile - the story file the import is written in, absolute.
|
|
17
|
+
* @param name - the component's name, as the error gives it.
|
|
18
|
+
* @returns the wrapper; none when the application exports no such component, or several in places equally near.
|
|
19
|
+
*/
|
|
20
|
+
export declare const wrapperFor: (componentFile: string, storyFile: string, name: string) => StoryWrapper | undefined;
|
|
21
|
+
/** What a repair round did. */
|
|
22
|
+
export type RepairOutcome = {
|
|
23
|
+
/** The wrappers the stories are now drawn inside, outermost first. */
|
|
24
|
+
readonly wrappers: readonly StoryWrapper[];
|
|
25
|
+
/**
|
|
26
|
+
* The components an error named that the application does not export as a component it can draw with no props, in the
|
|
27
|
+
* component's package, or that the last draw still names: for a person or an agent to give in a decorator.
|
|
28
|
+
*/
|
|
29
|
+
readonly notFound: readonly string[];
|
|
30
|
+
/** The last check's report; a text when the stories could not be drawn. */
|
|
31
|
+
readonly report: StoryCheckReport | string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Draws the new stories, adds what their errors name as wrappers, writes them again and draws them again.
|
|
35
|
+
*
|
|
36
|
+
* @param input - the files, how to check the stories, and how to write them with wrappers.
|
|
37
|
+
*/
|
|
38
|
+
export declare const repairRounds: (input: {
|
|
39
|
+
readonly componentFile: string;
|
|
40
|
+
readonly storyFile: string;
|
|
41
|
+
readonly check: () => Promise<StoryCheckReport | string>;
|
|
42
|
+
readonly write: (wrappers: readonly StoryWrapper[]) => Promise<void>;
|
|
43
|
+
readonly find?: (name: string) => StoryWrapper | undefined;
|
|
44
|
+
readonly packageDir?: string;
|
|
45
|
+
}) => Promise<RepairOutcome>;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The repair round of `forgebook new --repair`: the new stories are drawn, and a story whose component says it needs to
|
|
3
|
+
* be drawn inside another one (`useSidebar must be used within a SidebarProvider`) gets that component as a decorator,
|
|
4
|
+
* found in the application by its name; then they are drawn again, at most `MAX_ROUNDS` times.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Only what the error names is added, and only a component the application exports: a context's value (`X.Provider`)
|
|
8
|
+
* or a store cannot be made up, so those are named for a person or an agent to give. The browser run is the caller's
|
|
9
|
+
* (`check`), so the round itself is tested without one.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import ts from "typescript-6";
|
|
14
|
+
import { programFor } from "../../src/vite/docsProgram.js";
|
|
15
|
+
import { VITE_PATHS } from "../../src/vite/vitePaths.js";
|
|
16
|
+
/** How many times the stories are drawn again after a repair. */
|
|
17
|
+
export const MAX_ROUNDS = 2;
|
|
18
|
+
/**
|
|
19
|
+
* The component an error says the story must be drawn inside: the words React libraries and applications use for it
|
|
20
|
+
* ("must be used within", "can only be used inside", "is missing a parent"), then the component's name.
|
|
21
|
+
*/
|
|
22
|
+
const NEEDED_WRAPPER = /(?:must be (?:used|placed|rendered|wrapped)|can only be used|may be used only|should be used|has to be used|only be used|used outside)\s*(?:within|in|inside|with|by|under)?\s*(?:the context of\s+)?(?:the\s+|an?\s+|a descendant of\s+)?[`<"']?([A-Z][\w.]*)/;
|
|
23
|
+
/** Names a wrapper cannot have in a story file: they are the file's own (`Story`, `Meta`) or the component's. */
|
|
24
|
+
const RESERVED = new Set(["Story", "Meta", "React"]);
|
|
25
|
+
/** A file that is not the application: a story, a test, a declaration, a dependency. */
|
|
26
|
+
const NOT_APPLICATION = /\.(?:stories|story|test|spec)\.[cm]?[jt]sx?$|\.d\.[cm]?ts$|[\\/]node_modules[\\/]/;
|
|
27
|
+
/**
|
|
28
|
+
* The components a report's failures say their stories must be drawn inside, each once, in the order met.
|
|
29
|
+
*
|
|
30
|
+
* @param report - the new stories' check.
|
|
31
|
+
* @returns the names; a context's provider (`Theme.Provider`) is left out, since its value cannot be made up.
|
|
32
|
+
*/
|
|
33
|
+
export const neededWrappers = (report) => {
|
|
34
|
+
const names = report.results.flatMap((result) => result.problems.flatMap((problem) => {
|
|
35
|
+
const name = NEEDED_WRAPPER.exec(problem.message)?.[1]?.replace(/\.$/, "");
|
|
36
|
+
return name === undefined || name.includes(".") || RESERVED.has(name) ? [] : [name];
|
|
37
|
+
}));
|
|
38
|
+
return [...new Set(names)];
|
|
39
|
+
};
|
|
40
|
+
/** Whether a symbol's value is a component: a function, or a class. */
|
|
41
|
+
const isComponent = (symbol, checker) => {
|
|
42
|
+
const declaration = symbol.valueDeclaration ?? symbol.declarations?.[0];
|
|
43
|
+
if (declaration === undefined)
|
|
44
|
+
return false;
|
|
45
|
+
const type = checker.getTypeOfSymbolAtLocation(symbol, declaration);
|
|
46
|
+
return type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0;
|
|
47
|
+
};
|
|
48
|
+
/** The props a function component must be given besides its children: a wrapper written with none would not draw. */
|
|
49
|
+
const requiredProps = (symbol, checker) => {
|
|
50
|
+
const declaration = symbol.valueDeclaration ?? symbol.declarations?.[0];
|
|
51
|
+
if (declaration === undefined)
|
|
52
|
+
return [];
|
|
53
|
+
const [signature] = checker.getTypeOfSymbolAtLocation(symbol, declaration).getCallSignatures();
|
|
54
|
+
const [props] = signature?.getParameters() ?? [];
|
|
55
|
+
if (props === undefined)
|
|
56
|
+
return [];
|
|
57
|
+
return checker
|
|
58
|
+
.getTypeOfSymbolAtLocation(props, declaration)
|
|
59
|
+
.getProperties()
|
|
60
|
+
.filter((prop) => (prop.flags & ts.SymbolFlags.Optional) === 0 && prop.getName() !== "children")
|
|
61
|
+
.map((prop) => prop.getName());
|
|
62
|
+
};
|
|
63
|
+
/** The name a declaration gives its symbol: `SidebarProvider` for `export default function SidebarProvider()`. */
|
|
64
|
+
const declaredName = (symbol) => {
|
|
65
|
+
const declaration = symbol.valueDeclaration ?? symbol.declarations?.[0];
|
|
66
|
+
const name = declaration === undefined ? undefined : ts.getNameOfDeclaration(declaration);
|
|
67
|
+
return name !== undefined && ts.isIdentifier(name) ? name.text : symbol.getName();
|
|
68
|
+
};
|
|
69
|
+
/** The application's exports of a component by a name, from the component's program read whole. */
|
|
70
|
+
const exportsNamed = (componentFile, name) => {
|
|
71
|
+
const program = programFor(componentFile, { reach: "whole" });
|
|
72
|
+
if (typeof program === "string")
|
|
73
|
+
return [];
|
|
74
|
+
const { checker } = program;
|
|
75
|
+
return program.program.getSourceFiles().flatMap((source) => {
|
|
76
|
+
if (NOT_APPLICATION.test(source.fileName) || program.program.isSourceFileFromExternalLibrary(source))
|
|
77
|
+
return [];
|
|
78
|
+
if (!source.text.includes(name))
|
|
79
|
+
return [];
|
|
80
|
+
const moduleSymbol = checker.getSymbolAtLocation(source);
|
|
81
|
+
if (moduleSymbol === undefined)
|
|
82
|
+
return [];
|
|
83
|
+
return checker.getExportsOfModule(moduleSymbol).flatMap((each) => {
|
|
84
|
+
const symbol = (each.flags & ts.SymbolFlags.Alias) !== 0 ? checker.getAliasedSymbol(each) : each;
|
|
85
|
+
const isNamed = each.getName() === name;
|
|
86
|
+
const isDefaultNamed = each.getName() === "default" && declaredName(symbol) === name;
|
|
87
|
+
if ((!isNamed && !isDefaultNamed) || !isComponent(symbol, checker))
|
|
88
|
+
return [];
|
|
89
|
+
// a barrel's re-export is the same component: it is imported from where it is declared
|
|
90
|
+
const declaredIn = symbol.valueDeclaration?.getSourceFile().fileName ?? source.fileName;
|
|
91
|
+
const isOwn = declaredIn === source.fileName;
|
|
92
|
+
return isOwn || !isNamed
|
|
93
|
+
? [{ file: source.fileName, isDefault: !isNamed, required: requiredProps(symbol, checker) }]
|
|
94
|
+
: [];
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* The component of the application a story must be drawn inside, as a wrapper the story file imports.
|
|
100
|
+
*
|
|
101
|
+
* @param componentFile - the component's file, absolute.
|
|
102
|
+
* @param storyFile - the story file the import is written in, absolute.
|
|
103
|
+
* @param name - the component's name, as the error gives it.
|
|
104
|
+
* @returns the wrapper; none when the application exports no such component, or several in places equally near.
|
|
105
|
+
*/
|
|
106
|
+
export const wrapperFor = (componentFile, storyFile, name) => {
|
|
107
|
+
const found = exportsNamed(componentFile, name);
|
|
108
|
+
const component = VITE_PATHS.normalize(componentFile);
|
|
109
|
+
const folder = VITE_PATHS.dirname(component);
|
|
110
|
+
// the nearest wins: the component's own file (a compound's parts), then its folder, then the only one
|
|
111
|
+
const chosen = found.find((each) => VITE_PATHS.normalize(each.file) === component) ??
|
|
112
|
+
found.find((each) => VITE_PATHS.dirname(VITE_PATHS.normalize(each.file)) === folder) ??
|
|
113
|
+
(found.length === 1 ? found[0] : undefined);
|
|
114
|
+
if (chosen === undefined)
|
|
115
|
+
return undefined;
|
|
116
|
+
const relative = VITE_PATHS.relative(VITE_PATHS.dirname(VITE_PATHS.normalize(storyFile)), chosen.file);
|
|
117
|
+
const path = (relative.startsWith(".") ? relative : `./${relative}`).replace(/\.[cm]?[jt]sx?$/, "");
|
|
118
|
+
return {
|
|
119
|
+
name,
|
|
120
|
+
importStatement: chosen.isDefault
|
|
121
|
+
? `import ${name} from ${JSON.stringify(path)};`
|
|
122
|
+
: `import { ${name} } from ${JSON.stringify(path)};`
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Draws the new stories, adds what their errors name as wrappers, writes them again and draws them again.
|
|
127
|
+
*
|
|
128
|
+
* @param input - the files, how to check the stories, and how to write them with wrappers.
|
|
129
|
+
*/
|
|
130
|
+
export const repairRounds = async (input) => {
|
|
131
|
+
const find = input.find ??
|
|
132
|
+
((name) => wrapperFor(input.componentFile, input.storyFile, name));
|
|
133
|
+
let wrappers = [];
|
|
134
|
+
const notFound = new Set();
|
|
135
|
+
let report = await input.check();
|
|
136
|
+
for (let round = 0; round < MAX_ROUNDS && typeof report !== "string"; round += 1) {
|
|
137
|
+
const names = neededWrappers(report).filter((name) => !notFound.has(name) && !wrappers.some((each) => each.name === name));
|
|
138
|
+
const added = names.flatMap((name) => {
|
|
139
|
+
const wrapper = find(name);
|
|
140
|
+
if (wrapper === undefined)
|
|
141
|
+
notFound.add(name);
|
|
142
|
+
return wrapper === undefined ? [] : [wrapper];
|
|
143
|
+
});
|
|
144
|
+
if (added.length === 0)
|
|
145
|
+
break;
|
|
146
|
+
// what an inner wrapper needs goes around it
|
|
147
|
+
wrappers = [...added, ...wrappers];
|
|
148
|
+
await input.write(wrappers);
|
|
149
|
+
report = await input.check();
|
|
150
|
+
}
|
|
151
|
+
// what the last draw still names was never tried: it is said with what was not found
|
|
152
|
+
if (typeof report !== "string")
|
|
153
|
+
for (const name of neededWrappers(report))
|
|
154
|
+
if (!wrappers.some((each) => each.name === name))
|
|
155
|
+
notFound.add(name);
|
|
156
|
+
return { wrappers, notFound: [...notFound], report };
|
|
157
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { ResolvedConfig } from "../../src/vite/configFile.ts";
|
|
2
|
+
import { type RepairOutcome } from "./newRepair.ts";
|
|
3
|
+
import type { StoryWrapper } from "./newStories.ts";
|
|
4
|
+
import { type NewStoriesFile } from "./newStoriesFile.ts";
|
|
5
|
+
/**
|
|
6
|
+
* The catalogue a component's new stories are repaired in, when they can be: a wrapper is written as JSX, so only a
|
|
7
|
+
* framework whose story files hold JSX takes one.
|
|
8
|
+
*
|
|
9
|
+
* @param written - the stories about to be written.
|
|
10
|
+
* @param configFile - the configuration file given; none to look in the current folder.
|
|
11
|
+
* @throws a `ScriptError` for a story file that holds no JSX, or a configuration that cannot be read.
|
|
12
|
+
*/
|
|
13
|
+
export declare const repairable: (written: NewStoriesFile, configFile: string | undefined) => Promise<ResolvedConfig>;
|
|
14
|
+
/**
|
|
15
|
+
* Repairs a component's new stories.
|
|
16
|
+
*
|
|
17
|
+
* @param storyFile - the stories file written, absolute.
|
|
18
|
+
* @param componentFile - the component's file, absolute.
|
|
19
|
+
* @param config - the catalogue's configuration.
|
|
20
|
+
* @param write - writes the stories again with wrappers.
|
|
21
|
+
*/
|
|
22
|
+
export declare const repairNew: (storyFile: string, componentFile: string, config: ResolvedConfig, write: (wrappers: readonly StoryWrapper[]) => Promise<NewStoriesFile>) => Promise<RepairOutcome>;
|
|
23
|
+
/**
|
|
24
|
+
* What `new --json` answers: the file and its uses, and with `--repair` what the round added and found.
|
|
25
|
+
*
|
|
26
|
+
* @param written - the stories written.
|
|
27
|
+
* @param shown - the file as the command names it.
|
|
28
|
+
* @param repaired - the round's outcome, when one ran.
|
|
29
|
+
*/
|
|
30
|
+
export declare const newDocument: (written: NewStoriesFile, shown: string, repaired: RepairOutcome | undefined) => Readonly<Record<string, unknown>>;
|
|
31
|
+
/**
|
|
32
|
+
* What the command says of a repair round.
|
|
33
|
+
*
|
|
34
|
+
* @param repaired - the round's outcome.
|
|
35
|
+
*/
|
|
36
|
+
export declare const repairLines: (repaired: RepairOutcome) => string[];
|
|
37
|
+
/** What `new` was given. */
|
|
38
|
+
export type NewOptions = {
|
|
39
|
+
/** The component to read, when the file exports several. */
|
|
40
|
+
readonly export?: string | undefined;
|
|
41
|
+
/** The framework the stories are written for; the catalogue's when none. */
|
|
42
|
+
readonly framework?: string | undefined;
|
|
43
|
+
/** Print the file instead of writing it. */
|
|
44
|
+
readonly print?: boolean | undefined;
|
|
45
|
+
/** Replace a stories file that exists. */
|
|
46
|
+
readonly force?: boolean | undefined;
|
|
47
|
+
/** Draw the stories and repair them. */
|
|
48
|
+
readonly repair?: boolean | undefined;
|
|
49
|
+
/** The configuration file; the current folder's when none. */
|
|
50
|
+
readonly config?: string | undefined;
|
|
51
|
+
};
|
|
52
|
+
/** What `new` prints: the file's text with `--print`, else the answer and the lines to log with their tone. */
|
|
53
|
+
export type NewOutcome = {
|
|
54
|
+
/** The file's text, with `--print`. */
|
|
55
|
+
readonly printed?: string;
|
|
56
|
+
/** What `--json` answers. */
|
|
57
|
+
readonly document: Readonly<Record<string, unknown>>;
|
|
58
|
+
/** The lines to log, each with its tone. */
|
|
59
|
+
readonly lines: readonly (readonly ["success" | "info" | "warn", string])[];
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Writes a component's first stories, and repairs them with `--repair`.
|
|
63
|
+
*
|
|
64
|
+
* @param componentFile - the component's file, absolute.
|
|
65
|
+
* @param options - what the command was given.
|
|
66
|
+
* @throws a `ScriptError` on a usage the command refuses, a file that exists without `--force`, or what writing the
|
|
67
|
+
* stories throws.
|
|
68
|
+
*/
|
|
69
|
+
export declare const runNew: (componentFile: string, options: NewOptions) => Promise<NewOutcome>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `forgebook new --repair` runs around the repair round (`newRepair.ts`): the stories checked in a browser through
|
|
3
|
+
* the catalogue, the file written again with each round's wrappers, and what the command says and answers.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { relative } from "node:path";
|
|
9
|
+
import { EXIT } from "@ensiria/cli-kit/constants";
|
|
10
|
+
import { ScriptError } from "@ensiria/cli-kit/script";
|
|
11
|
+
import { VITE_PATHS } from "../../src/vite/vitePaths.js";
|
|
12
|
+
import { configOf } from "./catalogueCommands.js";
|
|
13
|
+
import { repairRounds } from "./newRepair.js";
|
|
14
|
+
import { newStoriesDocument, newStoriesFile, usesWords } from "./newStoriesFile.js";
|
|
15
|
+
import { runStoriesCheck } from "./storyCheckRun.js";
|
|
16
|
+
/**
|
|
17
|
+
* The catalogue a component's new stories are repaired in, when they can be: a wrapper is written as JSX, so only a
|
|
18
|
+
* framework whose story files hold JSX takes one.
|
|
19
|
+
*
|
|
20
|
+
* @param written - the stories about to be written.
|
|
21
|
+
* @param configFile - the configuration file given; none to look in the current folder.
|
|
22
|
+
* @throws a `ScriptError` for a story file that holds no JSX, or a configuration that cannot be read.
|
|
23
|
+
*/
|
|
24
|
+
export const repairable = async (written, configFile) => {
|
|
25
|
+
if (!JSX_STORY_FILE.test(written.file))
|
|
26
|
+
throw new ScriptError(`--repair draws stories inside providers as JSX, which ${written.file} cannot hold`, {
|
|
27
|
+
hint: "Give the providers in a decorator of the file, or in the preview",
|
|
28
|
+
exitCode: EXIT.usage
|
|
29
|
+
});
|
|
30
|
+
return configOf(configFile);
|
|
31
|
+
};
|
|
32
|
+
/** A story file that holds JSX. */
|
|
33
|
+
const JSX_STORY_FILE = /\.stories\.[jt]sx$/;
|
|
34
|
+
/** What a run that found no story of the file says: the file is not listed, or does not load. */
|
|
35
|
+
const NO_STORY = /^No story or component /;
|
|
36
|
+
/**
|
|
37
|
+
* Repairs a component's new stories.
|
|
38
|
+
*
|
|
39
|
+
* @param storyFile - the stories file written, absolute.
|
|
40
|
+
* @param componentFile - the component's file, absolute.
|
|
41
|
+
* @param config - the catalogue's configuration.
|
|
42
|
+
* @param write - writes the stories again with wrappers.
|
|
43
|
+
*/
|
|
44
|
+
export const repairNew = async (storyFile, componentFile, config, write) => {
|
|
45
|
+
const outcome = await repairRounds({
|
|
46
|
+
componentFile,
|
|
47
|
+
storyFile,
|
|
48
|
+
packageDir: config.dir,
|
|
49
|
+
check: () => runStoriesCheck(config, undefined, {
|
|
50
|
+
ids: [],
|
|
51
|
+
files: [storyFile],
|
|
52
|
+
isAllVariants: false,
|
|
53
|
+
isOwnServer: true
|
|
54
|
+
}),
|
|
55
|
+
write: async (wrappers) => {
|
|
56
|
+
writeFileSync(storyFile, (await write(wrappers)).text);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return typeof outcome.report === "string" && NO_STORY.test(outcome.report)
|
|
60
|
+
? {
|
|
61
|
+
...outcome,
|
|
62
|
+
report: `the catalogue lists no story of ${VITE_PATHS.relative(config.dir, storyFile)}: its stories' patterns (${config.stories.join(", ")}) do not match it, or it does not load (npx forgebook stories --json says why)`
|
|
63
|
+
}
|
|
64
|
+
: outcome;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* What `new --json` answers: the file and its uses, and with `--repair` what the round added and found.
|
|
68
|
+
*
|
|
69
|
+
* @param written - the stories written.
|
|
70
|
+
* @param shown - the file as the command names it.
|
|
71
|
+
* @param repaired - the round's outcome, when one ran.
|
|
72
|
+
*/
|
|
73
|
+
export const newDocument = (written, shown, repaired) => ({
|
|
74
|
+
...newStoriesDocument(written, shown),
|
|
75
|
+
...(repaired === undefined
|
|
76
|
+
? {}
|
|
77
|
+
: {
|
|
78
|
+
repair: {
|
|
79
|
+
wrappers: repaired.wrappers.map((each) => each.name),
|
|
80
|
+
notFound: repaired.notFound,
|
|
81
|
+
...(typeof repaired.report === "string"
|
|
82
|
+
? { notRun: repaired.report }
|
|
83
|
+
: {
|
|
84
|
+
stories: repaired.report.results.length,
|
|
85
|
+
failing: repaired.report.results.filter((result) => result.problems.length > 0).length
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* What the command says of a repair round.
|
|
92
|
+
*
|
|
93
|
+
* @param repaired - the round's outcome.
|
|
94
|
+
*/
|
|
95
|
+
export const repairLines = (repaired) => {
|
|
96
|
+
const { report, wrappers, notFound } = repaired;
|
|
97
|
+
if (typeof report === "string")
|
|
98
|
+
return [`The stories were not drawn: ${report}`];
|
|
99
|
+
const failing = report.results.filter((result) => result.problems.length > 0).length;
|
|
100
|
+
return [
|
|
101
|
+
...(wrappers.length === 0 ? [] : [`Drawn inside ${wrappers.map((each) => each.name).join(", ")}`]),
|
|
102
|
+
...(notFound.length === 0
|
|
103
|
+
? []
|
|
104
|
+
: [
|
|
105
|
+
`Needs ${notFound.join(", ")}, which the application does not export as a component: give it in a decorator`
|
|
106
|
+
]),
|
|
107
|
+
`${report.results.length - failing} of ${report.results.length} stories draw with no problem`
|
|
108
|
+
];
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Writes a component's first stories, and repairs them with `--repair`.
|
|
112
|
+
*
|
|
113
|
+
* @param componentFile - the component's file, absolute.
|
|
114
|
+
* @param options - what the command was given.
|
|
115
|
+
* @throws a `ScriptError` on a usage the command refuses, a file that exists without `--force`, or what writing the
|
|
116
|
+
* stories throws.
|
|
117
|
+
*/
|
|
118
|
+
export const runNew = async (componentFile, options) => {
|
|
119
|
+
if (options.print === true && options.repair === true)
|
|
120
|
+
throw new ScriptError("--repair draws the file it writes, and --print writes none", {
|
|
121
|
+
exitCode: EXIT.usage
|
|
122
|
+
});
|
|
123
|
+
const written = await newStoriesFile(componentFile, options.export, options.framework);
|
|
124
|
+
// read first: a configuration that cannot be read must not leave a file written and the command failed
|
|
125
|
+
const config = options.repair === true ? await repairable(written, options.config) : undefined;
|
|
126
|
+
if (options.print === true)
|
|
127
|
+
return { printed: written.text, document: {}, lines: [] };
|
|
128
|
+
const shown = relative(process.cwd(), written.file);
|
|
129
|
+
if (existsSync(written.file) && options.force !== true)
|
|
130
|
+
throw new ScriptError(`${shown} exists`, { hint: "Give --force to replace it, or --print to see it" });
|
|
131
|
+
writeFileSync(written.file, written.text);
|
|
132
|
+
const repaired = config === undefined
|
|
133
|
+
? undefined
|
|
134
|
+
: await repairNew(written.file, componentFile, config, (wrappers) => newStoriesFile(componentFile, options.export, options.framework, wrappers));
|
|
135
|
+
const problemLines = written.usesProblem === undefined ? [] : [["warn", `Its uses were not read: ${written.usesProblem}`]];
|
|
136
|
+
const title = written.text.match(/title: "([^"]*)"/)?.[1] ?? "";
|
|
137
|
+
return {
|
|
138
|
+
document: newDocument(written, shown, repaired),
|
|
139
|
+
lines: [
|
|
140
|
+
["success", `${shown} written${usesWords(written.uses)}`],
|
|
141
|
+
...problemLines,
|
|
142
|
+
...(repaired === undefined
|
|
143
|
+
? []
|
|
144
|
+
: repairLines(repaired).map((line) => ["info", line])),
|
|
145
|
+
["info", `npx forgebook stories --component ${title} lists them`]
|
|
146
|
+
]
|
|
147
|
+
};
|
|
148
|
+
};
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The first stories of a component, written from its props as the docs extractor reads them (`forgebook new`): the
|
|
3
3
|
* meta, the main story with the required props filled, one story per value of its first choice prop, and the worst
|
|
4
|
-
* case. Args only, so the file is the same for any framework but its type import.
|
|
4
|
+
* case. Args only, so the file is the same for any framework but its type import. The file carries the signature of
|
|
5
|
+
* the props it was written for (`propsSignature.ts`), so `verify` can say when they change. Pure: docs in, text out.
|
|
5
6
|
*
|
|
6
7
|
* @module
|
|
7
8
|
*/
|
|
8
9
|
import type { ComponentDocs } from "../../src/componentDocs.ts";
|
|
10
|
+
/** A place the application draws the component, as the file is written from it. */
|
|
11
|
+
export type StoryUse = {
|
|
12
|
+
/** The file that draws it, relative to the package: the story's summary names it. */
|
|
13
|
+
readonly file: string;
|
|
14
|
+
/** The props it gives a literal value, as code. */
|
|
15
|
+
readonly args: Readonly<Record<string, string>>;
|
|
16
|
+
};
|
|
9
17
|
/** What the file is written from. */
|
|
10
18
|
export type NewStoriesInput = {
|
|
11
19
|
/** The component's docs (its props). */
|
|
@@ -16,6 +24,20 @@ export type NewStoriesInput = {
|
|
|
16
24
|
readonly title: string;
|
|
17
25
|
/** The module the story types come from (`@forgebook/react`). */
|
|
18
26
|
readonly typesModule: string;
|
|
27
|
+
/**
|
|
28
|
+
* Components every story is drawn inside, outermost first, each with its import: the providers a first draw said the
|
|
29
|
+
* component needs (`forgebook new --repair`); none by default. Written as JSX, for a JSX framework's story file.
|
|
30
|
+
*/
|
|
31
|
+
readonly wrappers?: readonly StoryWrapper[];
|
|
32
|
+
/** Where the application draws it, for realistic values and a story per way it is used; none by default. */
|
|
33
|
+
readonly uses?: readonly StoryUse[];
|
|
34
|
+
};
|
|
35
|
+
/** A component a story is drawn inside, and the statement that imports it. */
|
|
36
|
+
export type StoryWrapper = {
|
|
37
|
+
/** The component's name in the file (`SidebarProvider`). */
|
|
38
|
+
readonly name: string;
|
|
39
|
+
/** The statement that imports it (`import { SidebarProvider } from "./sidebar";`). */
|
|
40
|
+
readonly importStatement: string;
|
|
19
41
|
};
|
|
20
42
|
/**
|
|
21
43
|
* The story file's text.
|