forgebook 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +917 -74
- 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 +54 -6
- package/dist/src/addressArgs.js +72 -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 +58 -14
- 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/PluginBlockHost.js +2 -1
- package/dist/src/shell/PluginTabHost.js +19 -2
- 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 +35 -60
- 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.d.ts +17 -4
- package/dist/src/shell/asideStory.js +21 -4
- 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 +27 -2
- package/dist/src/shell/useAddressArgs.js +71 -14
- 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
|
@@ -7,8 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { isComponentDocs } from "../componentDocs.js";
|
|
9
9
|
import { embedAddressOf } from "../embedCode.js";
|
|
10
|
+
import { panelArgsOf } from "../frame/panelValues.js";
|
|
10
11
|
import { NO_PREVIEW, readStory } from "../frame/storyModule.js";
|
|
11
12
|
import { isLiveErrorReport } from "../liveErrors.js";
|
|
13
|
+
import { controlsOfParameter, excludedControls, panelArgTypesOf } from "../storyArgTypes.js";
|
|
14
|
+
import { checkedSetArgs, customControlProblems, storyControlsOf } from "../storyControls.js";
|
|
15
|
+
import { passesTags } from "../storyTags.js";
|
|
12
16
|
import { findComponentByTitle } from "../storyTree.js";
|
|
13
17
|
import { componentAddressOf, frameAddressOf, storyAddressOf } from "../viewState.js";
|
|
14
18
|
/**
|
|
@@ -143,6 +147,14 @@ export const jsonValue = (value) => {
|
|
|
143
147
|
};
|
|
144
148
|
/** Whether a value is a plain object. */
|
|
145
149
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
150
|
+
/** Why a value an agent asked to set was left out, as its answer says it. */
|
|
151
|
+
const DROPPED_REASONS = {
|
|
152
|
+
undeclared: "the story declares no such arg, or does not let it be set",
|
|
153
|
+
type: "it is not of the type its control takes (see `controls`)",
|
|
154
|
+
unreadable: "it is not plain JSON",
|
|
155
|
+
markup: "this framework writes it into HTML, so only plain text can be set",
|
|
156
|
+
control: "its custom control's schema refuses it, or could not be read"
|
|
157
|
+
};
|
|
146
158
|
/** The docs a story file's docs loader gave, as a document field, with the problem when there is one. */
|
|
147
159
|
const docsOf = (loaded) => {
|
|
148
160
|
if ("error" in loaded)
|
|
@@ -154,6 +166,51 @@ const docsOf = (loaded) => {
|
|
|
154
166
|
return { docs: undefined, problem: `Its component's docs failed: ${value.error}` };
|
|
155
167
|
return { docs: undefined, problem: undefined };
|
|
156
168
|
};
|
|
169
|
+
/** The story read from its module, with what kept it from being read among the problems. */
|
|
170
|
+
const loadedStoryOf = (parts, location, problems) => {
|
|
171
|
+
if ("error" in parts.module) {
|
|
172
|
+
problems.push(`Its story file failed to load: ${parts.module.error}`);
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
const read = readStory(parts.module.value, location.story.exportName, parts.preview ?? NO_PREVIEW);
|
|
176
|
+
if (typeof read !== "string")
|
|
177
|
+
return read;
|
|
178
|
+
problems.push(read);
|
|
179
|
+
return undefined;
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* The custom controls a story names, read from its module before its document is made: their modules load for it.
|
|
183
|
+
*
|
|
184
|
+
* @param module - the story file's module, as the dev server loaded it.
|
|
185
|
+
* @param location - the story's place in the tree.
|
|
186
|
+
*/
|
|
187
|
+
export const customControlNames = (module, location) => {
|
|
188
|
+
const loaded = loadedStoryOf({ module, docs: { value: undefined } }, location, []);
|
|
189
|
+
if (loaded === undefined)
|
|
190
|
+
return [];
|
|
191
|
+
return Object.values(panelArgTypesOf(loaded.argTypes, [])).flatMap((each) => each.customControl ?? []);
|
|
192
|
+
};
|
|
193
|
+
/** What a loaded story declares of its args, as the shell reads it from the story's frame. */
|
|
194
|
+
const declarationOf = (loaded, docs, { namedValues = {}, customControls }) => ({
|
|
195
|
+
customSchemas: customControls?.schemas ?? {},
|
|
196
|
+
props: docs?.props ?? [],
|
|
197
|
+
argTypes: panelArgTypesOf(loaded.argTypes, excludedControls(loaded.parameters["controls"])),
|
|
198
|
+
controls: controlsOfParameter(loaded.parameters["controls"]),
|
|
199
|
+
storyArgs: panelArgsOf(loaded.args, namedValues),
|
|
200
|
+
namedValues
|
|
201
|
+
});
|
|
202
|
+
/**
|
|
203
|
+
* A story with the links that carry the values it takes, as a person's link would. Its frame's stays as it is: a frame
|
|
204
|
+
* takes its values from the shell, which checks them, and alone it draws the story's own. Its component's page shows no
|
|
205
|
+
* one story's values.
|
|
206
|
+
*/
|
|
207
|
+
const withSetArgLinks = (story, setArgs, pages, view) => {
|
|
208
|
+
if (setArgs === undefined || setArgs.param === "")
|
|
209
|
+
return story;
|
|
210
|
+
const query = new URLSearchParams({ args: setArgs.param }).toString();
|
|
211
|
+
const links = storyLinks(pages, story.id, view === "" ? query : `${view}&${query}`);
|
|
212
|
+
return { ...story, links: { ...links, frame: story.links.frame, component: story.links.component } };
|
|
213
|
+
};
|
|
157
214
|
/**
|
|
158
215
|
* One story in detail.
|
|
159
216
|
*
|
|
@@ -165,25 +222,25 @@ const docsOf = (loaded) => {
|
|
|
165
222
|
*/
|
|
166
223
|
export const storyDocument = (location, parts, pages, view, usage) => {
|
|
167
224
|
const component = agentComponent(location, pages, view, usage);
|
|
168
|
-
const
|
|
225
|
+
const listedStory = component.stories.find((each) => each.id === location.story.id) ??
|
|
169
226
|
agentStory(location.story, false, pages, view);
|
|
170
227
|
const problems = [];
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
else {
|
|
175
|
-
const read = readStory(parts.module.value, location.story.exportName, parts.preview ?? NO_PREVIEW);
|
|
176
|
-
if (typeof read === "string")
|
|
177
|
-
problems.push(read);
|
|
178
|
-
else {
|
|
179
|
-
const json = jsonValue(read.args);
|
|
180
|
-
if (isRecord(json))
|
|
181
|
-
args = json;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
228
|
+
const loaded = loadedStoryOf(parts, location, problems);
|
|
229
|
+
const json = loaded === undefined ? undefined : jsonValue(loaded.args);
|
|
230
|
+
const args = isRecord(json) ? json : {};
|
|
184
231
|
const { docs, problem } = docsOf(parts.docs);
|
|
185
232
|
if (problem !== undefined)
|
|
186
233
|
problems.push(problem);
|
|
234
|
+
const declaration = loaded === undefined ? undefined : declarationOf(loaded, docs, parts);
|
|
235
|
+
const setArgs = declaration === undefined || parts.setArgs === undefined
|
|
236
|
+
? undefined
|
|
237
|
+
: checkedSetArgs(parts.setArgs, declaration, parts.addressTexts);
|
|
238
|
+
for (const { name, reason } of setArgs?.dropped ?? []) {
|
|
239
|
+
problems.push(`The value of "${name}" was left out: ${DROPPED_REASONS[reason]}`);
|
|
240
|
+
}
|
|
241
|
+
const story = withSetArgLinks(listedStory, setArgs, pages, view);
|
|
242
|
+
const controls = declaration === undefined ? [] : storyControlsOf(declaration);
|
|
243
|
+
problems.push(...customControlProblems(controls, parts.customControls));
|
|
187
244
|
return {
|
|
188
245
|
schema: 1,
|
|
189
246
|
requiredProps: (docs?.props ?? []).filter((prop) => prop.isRequired).map((prop) => prop.name),
|
|
@@ -200,6 +257,8 @@ export const storyDocument = (location, parts, pages, view, usage) => {
|
|
|
200
257
|
...agentDesign(location.story, pages, view),
|
|
201
258
|
docs,
|
|
202
259
|
args,
|
|
260
|
+
controls,
|
|
261
|
+
...(setArgs === undefined ? {} : { setArgs: { accepted: setArgs.accepted, dropped: setArgs.dropped } }),
|
|
203
262
|
problems
|
|
204
263
|
};
|
|
205
264
|
};
|
|
@@ -211,10 +270,19 @@ export const storyDocument = (location, parts, pages, view, usage) => {
|
|
|
211
270
|
*/
|
|
212
271
|
export const filteredStories = (document, filter) => {
|
|
213
272
|
const text = filter.component?.toLowerCase();
|
|
273
|
+
const tags = filter.tags ?? [];
|
|
214
274
|
return {
|
|
215
275
|
...document,
|
|
216
|
-
components: document.components
|
|
276
|
+
components: document.components
|
|
277
|
+
.filter((component) => (filter.source === undefined || component.source === filter.source) &&
|
|
217
278
|
(text === undefined || component.title.toLowerCase().includes(text)))
|
|
279
|
+
.flatMap((component) => {
|
|
280
|
+
if (tags.length === 0)
|
|
281
|
+
return [component];
|
|
282
|
+
// an unlisted story is one the catalogue's lists leave out: a filter of those lists leaves it out too
|
|
283
|
+
const stories = component.stories.filter((story) => !story.isUnlisted && passesTags(story.tags, tags));
|
|
284
|
+
return stories.length === 0 ? [] : [{ ...component, stories }];
|
|
285
|
+
})
|
|
218
286
|
};
|
|
219
287
|
};
|
|
220
288
|
/**
|
|
@@ -293,7 +361,8 @@ export const isNearestTokensDocument = (value) => isRecord(value) &&
|
|
|
293
361
|
export const isFoundComponentsDocument = (value) => isRecord(value) &&
|
|
294
362
|
value["schema"] === 1 &&
|
|
295
363
|
typeof value["query"] === "string" &&
|
|
296
|
-
Array.isArray(value["components"])
|
|
364
|
+
Array.isArray(value["components"]) &&
|
|
365
|
+
Array.isArray(value["corrections"]);
|
|
297
366
|
/**
|
|
298
367
|
* Whether a value is a search's document, as a client receives it over HTTP.
|
|
299
368
|
*
|
|
@@ -304,6 +373,7 @@ export const isSearchDocument = (value) => isRecord(value) &&
|
|
|
304
373
|
typeof value["query"] === "string" &&
|
|
305
374
|
typeof value["total"] === "number" &&
|
|
306
375
|
Array.isArray(value["results"]) &&
|
|
376
|
+
Array.isArray(value["corrections"]) &&
|
|
307
377
|
Array.isArray(value["problems"]);
|
|
308
378
|
/**
|
|
309
379
|
* Whether a value is the changed stories' document, as a client receives it over HTTP.
|
|
@@ -313,7 +383,10 @@ export const isSearchDocument = (value) => isRecord(value) &&
|
|
|
313
383
|
export const isChangedStoriesDocument = (value) => isRecord(value) &&
|
|
314
384
|
value["schema"] === 1 &&
|
|
315
385
|
Array.isArray(value["stories"]) &&
|
|
316
|
-
Array.isArray(value["files"])
|
|
386
|
+
Array.isArray(value["files"]) &&
|
|
387
|
+
Array.isArray(value["uiFiles"]) &&
|
|
388
|
+
Array.isArray(value["outside"]) &&
|
|
389
|
+
(value["outdated"] === undefined || Array.isArray(value["outdated"]));
|
|
317
390
|
/**
|
|
318
391
|
* Whether a value is the code check's document, as a client receives it over HTTP.
|
|
319
392
|
*
|
|
@@ -14,8 +14,6 @@ import { type CataloguePages } from "./agentApi.ts";
|
|
|
14
14
|
import type { AgentAnswer } from "./agentRoutes.ts";
|
|
15
15
|
import { type FindableComponent } from "./findComponent.ts";
|
|
16
16
|
import { type TokenReading } from "./tokenAnswers.ts";
|
|
17
|
-
/** The file's name in the built catalogue. */
|
|
18
|
-
export declare const AGENT_INDEX_FILE = "forgebook-agent.json";
|
|
19
17
|
/** A component as a search finds it, with what its answer carries. */
|
|
20
18
|
export type IndexedComponent = FindableComponent & {
|
|
21
19
|
/** Its first story's id. */
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { storyLinks } from "./agentApi.js";
|
|
2
2
|
import { findComponents } from "./findComponent.js";
|
|
3
3
|
import { TOKEN_ANSWERS } from "./tokenAnswers.js";
|
|
4
|
-
/** The file's name in the built catalogue. */
|
|
5
|
-
export const AGENT_INDEX_FILE = "forgebook-agent.json";
|
|
6
4
|
/**
|
|
7
5
|
* Everything the index says went wrong while it was written, for whoever builds it: a story that failed to load is an
|
|
8
6
|
* answer with problems, not a missing one.
|
|
@@ -55,17 +53,18 @@ const findAnswer = ({ findable }, pages, params) => {
|
|
|
55
53
|
const query = params.get("query") ?? "";
|
|
56
54
|
if (query.trim() === "")
|
|
57
55
|
return { status: 400, body: { error: "No words to look for" } };
|
|
58
|
-
const components = findComponents(findable, query)
|
|
59
|
-
|
|
56
|
+
const { components: found, corrections } = findComponents(findable, query);
|
|
57
|
+
const components = found.map((match) => {
|
|
58
|
+
const component = findable.find((each) => each.id === match.id);
|
|
60
59
|
const story = component?.story;
|
|
61
60
|
return {
|
|
62
|
-
...
|
|
61
|
+
...match,
|
|
63
62
|
story,
|
|
64
63
|
links: story === undefined ? undefined : storyLinks(pages, story, ""),
|
|
65
64
|
...(component?.guidance === undefined ? {} : { guidance: component.guidance })
|
|
66
65
|
};
|
|
67
66
|
});
|
|
68
|
-
const body = { schema: 1, query, components };
|
|
67
|
+
const body = { schema: 1, query, components, corrections };
|
|
69
68
|
return { status: 200, body };
|
|
70
69
|
};
|
|
71
70
|
/**
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The dev server's answers to tools and agents, under `/__forgebook/api/`: `stories` (every story) and `story?id=…`
|
|
3
|
+
* (one in detail), `pages` and `page?id=…` (the docs pages), `search?query=…` (everything, by its text), each with an
|
|
4
|
+
* optional `view` (the view's query, `theme=dark&lang=it`) the links open in; and `preview?id=…`, the page that shows a
|
|
5
|
+
* story inside a client that renders apps, the one answer that is not JSON.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* The server loads the sources with the same imports the pages use (`AGENT_SOURCES_FILE`), so a tool sees what the
|
|
9
|
+
* shell shows. A story module that fails on Node (it reads `window` while it loads) gives its story a problem in the
|
|
10
|
+
* answer instead of an error. A preview is written for a browser, and only its args and parameters are read here: it
|
|
11
|
+
* loads with what it imports that needs a browser left as placeholders (`previewRunner.ts`), and one that still fails is
|
|
12
|
+
* left out of the answers and named among their problems, so it costs a tool neither the catalogue nor answers changed
|
|
13
|
+
* without a word. Served by the dev server only, where
|
|
14
|
+
* Vite listens (localhost by default); a build has none of it.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
1
18
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
19
|
import type { StorySource } from "@forgebook/story-format/source";
|
|
3
20
|
import { type ViteDevServer } from "vite";
|
|
@@ -66,6 +83,8 @@ export declare const ROOT_HEADER = "forgebook-root";
|
|
|
66
83
|
export declare const rootHeaderValue: (dir: string) => string;
|
|
67
84
|
/** What every route reads: the catalogue's sources and tree, its configuration, the query and the links' pages. */
|
|
68
85
|
export type RouteContext = {
|
|
86
|
+
/** What the answers ask of the dev server; none reads no custom control. */
|
|
87
|
+
readonly server?: AgentServer;
|
|
69
88
|
/** The sources and the preview, as the dev server loaded them. */
|
|
70
89
|
readonly loaded: AgentModule;
|
|
71
90
|
/** The sources' story tree. */
|
|
@@ -97,7 +116,7 @@ export declare const storyAnswer: (context: RouteContext) => Promise<AgentAnswer
|
|
|
97
116
|
* @param server - what the answers ask of the dev server.
|
|
98
117
|
* @param config - the catalogue's configuration.
|
|
99
118
|
* @param route - the path under `AGENT_API` (`stories`, `story`).
|
|
100
|
-
* @param params - the query: `id` for a story, `view` for the links, `category`, `name`, `value` and `type` for the
|
|
119
|
+
* @param params - the query: `id` for a story, `view` for the links, `args` for the values to set, `category`, `name`, `value` and `type` for the
|
|
101
120
|
* tokens, `query` and `limit` for a search, `usedIn=true` for the list's "Used in" (a
|
|
102
121
|
* story's comes with it when the catalogue offers it).
|
|
103
122
|
* @param origins - where the catalogue is served (`http://localhost:5173`) and where its frames are, for the links.
|
|
@@ -1,41 +1,28 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The dev server's answers to tools and agents, under `/__forgebook/api/`: `stories` (every story) and `story?id=…`
|
|
3
|
-
* (one in detail), `pages` and `page?id=…` (the docs pages), `search?query=…` (everything, by its text), each with an
|
|
4
|
-
* optional `view` (the view's query, `theme=dark&lang=it`) the links open in; and `preview?id=…`, the page that shows a
|
|
5
|
-
* story inside a client that renders apps, the one answer that is not JSON.
|
|
6
|
-
*
|
|
7
|
-
* @remarks
|
|
8
|
-
* The server loads the sources with the same imports the pages use (`AGENT_SOURCES_FILE`), so a tool sees what the
|
|
9
|
-
* shell shows. A story module that fails on Node (it reads `window` while it loads) gives its story a problem in the
|
|
10
|
-
* answer instead of an error. A preview is written for a browser, and only its args and parameters are read here: it
|
|
11
|
-
* loads with what it imports that needs a browser left as placeholders (`previewRunner.ts`), and one that still fails is
|
|
12
|
-
* left out of the answers and named among their problems, so it costs a tool neither the catalogue nor answers changed
|
|
13
|
-
* without a word. Served by the dev server only, where
|
|
14
|
-
* Vite listens (localhost by default); a build has none of it.
|
|
15
|
-
*
|
|
16
|
-
* @module
|
|
17
|
-
*/
|
|
18
|
-
import { realpath } from "node:fs/promises";
|
|
19
1
|
import { createIdResolver } from "vite";
|
|
20
2
|
import { offersUsedIn, readsComponentDocs } from "../catalogue.js";
|
|
21
3
|
import { mergedPreviews, NO_PREVIEW, readPreview } from "../frame/storyModule.js";
|
|
22
4
|
import { sourceFiles } from "../sourceFiles.js";
|
|
23
|
-
import {
|
|
5
|
+
import { catalogueStatuses } from "../storyStatuses.js";
|
|
6
|
+
import { findStory, storyTree } from "../storyTree.js";
|
|
24
7
|
import { sourceUsage } from "../usedIn.js";
|
|
8
|
+
import { isValueSchema } from "../valueSchema.js";
|
|
25
9
|
import { frameAddressOf } from "../viewState.js";
|
|
26
|
-
import { storiesDocument, storyDocument
|
|
10
|
+
import { customControlNames, storiesDocument, storyDocument } from "./agentApi.js";
|
|
27
11
|
import { agentIndexAnswer } from "./agentIndexRoute.js";
|
|
12
|
+
import { storiesWithStatus, storyWithStatus } from "./agentStatuses.js";
|
|
13
|
+
import { withStoryCode } from "./agentStoryCode.js";
|
|
14
|
+
import { changedAnswer } from "./changedRoute.js";
|
|
28
15
|
import { pageAnswer, pagesAnswer } from "./docPagesRoute.js";
|
|
16
|
+
import { emptyStoryGlobs, emptyStoryGlobsMessage } from "./emptyStoryGlobs.js";
|
|
29
17
|
import { findAnswer } from "./findRoute.js";
|
|
30
18
|
import { framesOriginOf } from "./framesConfig.js";
|
|
31
19
|
import { hostOf } from "./framesServer.js";
|
|
32
|
-
import {
|
|
20
|
+
import { hiddenStoryFolders, hiddenStoryFoldersMessage } from "./hiddenStoryFiles.js";
|
|
33
21
|
import { AGENT_SOURCES_FILE, pageModulePath } from "./pages.js";
|
|
34
22
|
import { PREVIEW_ROUTE } from "./previewRoute.js";
|
|
35
23
|
import { loadPreview } from "./previewRunner.js";
|
|
36
24
|
import { searchAnswer } from "./searchRoute.js";
|
|
37
25
|
import { catalogueTokens, STORYLESS_ROUTES } from "./storylessRoutes.js";
|
|
38
|
-
import { affectedStories } from "./storyReach.js";
|
|
39
26
|
/** The path the answers live under. */
|
|
40
27
|
export const AGENT_API = "/__forgebook/api/";
|
|
41
28
|
/**
|
|
@@ -148,43 +135,19 @@ export const storiesAnswer = async (context) => {
|
|
|
148
135
|
const usage = offersUsedIn(config.lists) && params.get("usedIn") === "true"
|
|
149
136
|
? await usageBySource(loaded.sources)
|
|
150
137
|
: undefined;
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
return { status: 400, body: { error: `"${since}" names no commit here` } };
|
|
165
|
-
const { root, files } = await changedFiles(config.dir, base);
|
|
166
|
-
const reaches = await Promise.all(loaded.sources.flatMap((source) => source.files.map(async (group) => {
|
|
167
|
-
const reach = await group.reach?.();
|
|
168
|
-
return { source: source.id, reach: isReach(reach) ? reach : [] };
|
|
169
|
-
})));
|
|
170
|
-
const changed = catalogueChangedFiles(config.dir, await realpath(config.dir), root, files);
|
|
171
|
-
const stories = reaches.flatMap(({ source, reach }) => affectedStories(reach, changed).flatMap((story) => {
|
|
172
|
-
const component = findComponentByTitle(tree, source, story.title)?.component;
|
|
173
|
-
const found = [...(component?.stories ?? []), ...(component?.unlisted ?? [])].find((each) => each.exportName === story.exportName);
|
|
174
|
-
return found === undefined
|
|
175
|
-
? []
|
|
176
|
-
: [{ id: found.id, title: story.title, links: storyLinks(pages, found.id, view) }];
|
|
177
|
-
}));
|
|
178
|
-
// without the import graph no story is found, which must not read as a change that touches none
|
|
179
|
-
const problems = offersUsedIn(config.lists)
|
|
180
|
-
? []
|
|
181
|
-
: [
|
|
182
|
-
readsComponentDocs(config.lists)
|
|
183
|
-
? "No story is found through the imports: the catalogue turns Used in off (usedIn: false), whose import graph this reads"
|
|
184
|
-
: "No story is found through the imports: the catalogue reads no component docs (componentDocs: false), whose programs read the import graph"
|
|
185
|
-
];
|
|
186
|
-
const body = { schema: 1, since, files, stories, problems };
|
|
187
|
-
return { status: 200, body };
|
|
138
|
+
// read for each answer: the file an agent has just written ends the problem
|
|
139
|
+
const globs = emptyStoryGlobs(config);
|
|
140
|
+
const hidden = hiddenStoryFolders(config);
|
|
141
|
+
const said = [
|
|
142
|
+
...(globs.length === 0 ? [] : [emptyStoryGlobsMessage(globs)]),
|
|
143
|
+
...(hidden.length === 0 ? [] : [hiddenStoryFoldersMessage(hidden)])
|
|
144
|
+
];
|
|
145
|
+
const listed = said.length === 0 ? tree : { ...tree, problems: [...said, ...tree.problems] };
|
|
146
|
+
const statuses = catalogueStatuses(config.lists.statuses);
|
|
147
|
+
return {
|
|
148
|
+
status: 200,
|
|
149
|
+
body: storiesWithStatus(storiesDocument(config.title, listed, pages, view, usage), listed, statuses)
|
|
150
|
+
};
|
|
188
151
|
};
|
|
189
152
|
/**
|
|
190
153
|
* One story in detail, its component's "Used in" when offered.
|
|
@@ -201,28 +164,102 @@ export const storyAnswer = async (context) => {
|
|
|
201
164
|
const files = sourceFiles(source);
|
|
202
165
|
// the story's own file: its module, and the docs of the component its meta names, which its args are for
|
|
203
166
|
const file = location.story.file;
|
|
167
|
+
const storyModule = await settled(files.stories[file]);
|
|
204
168
|
const parts = {
|
|
205
|
-
module:
|
|
169
|
+
module: storyModule,
|
|
206
170
|
docs: await settled(files.docs[file]),
|
|
207
|
-
preview: loaded.preview
|
|
171
|
+
preview: loaded.preview,
|
|
172
|
+
namedValues: source.namedValues,
|
|
173
|
+
setArgs: params.get("args") ?? undefined,
|
|
174
|
+
customControls: context.server === undefined
|
|
175
|
+
? undefined
|
|
176
|
+
: await customControlsRead(customControlNames(storyModule, location), config, context.server),
|
|
177
|
+
addressTexts: config.framework.addressTexts
|
|
208
178
|
};
|
|
179
|
+
const code = context.server === undefined
|
|
180
|
+
? undefined
|
|
181
|
+
: {
|
|
182
|
+
code: await settled(files.code[file]),
|
|
183
|
+
writer: await codeWriterOf(config, context.server),
|
|
184
|
+
namedValues: source.namedValues
|
|
185
|
+
};
|
|
209
186
|
const index = offersUsedIn(config.lists) ? await sourceUsage(source) : undefined;
|
|
210
187
|
// a usage that cannot be read leaves "Used in" out, never the story
|
|
211
188
|
const usage = index === undefined || typeof index === "string" ? undefined : { tree, index };
|
|
212
|
-
const
|
|
189
|
+
const module = "value" in storyModule ? storyModule.value : undefined;
|
|
190
|
+
const document = storyWithStatus(withStoryCode(storyDocument(location, parts, pages, view, usage), code, {
|
|
191
|
+
location,
|
|
192
|
+
module,
|
|
193
|
+
preview: loaded.preview
|
|
194
|
+
}), location.component, catalogueStatuses(config.lists.statuses));
|
|
213
195
|
// an agent must tell docs turned off from a story file that names no component
|
|
214
196
|
const body = readsComponentDocs(config.lists)
|
|
215
197
|
? document
|
|
216
198
|
: { ...document, componentDocs: "off" };
|
|
217
199
|
return { status: 200, body };
|
|
218
200
|
};
|
|
201
|
+
/** Whether a module's `codeOf` is a code writer: a function, as every framework's code module exports it. */
|
|
202
|
+
const isCodeWriter = (value) => typeof value === "function";
|
|
203
|
+
/**
|
|
204
|
+
* The framework's code writer, loaded on the server as the shell imports it; none when it does not load there.
|
|
205
|
+
*
|
|
206
|
+
* @param config - the catalogue's configuration.
|
|
207
|
+
* @param server - what the answers ask of the dev server.
|
|
208
|
+
*/
|
|
209
|
+
const codeWriterOf = async (config, server) => {
|
|
210
|
+
try {
|
|
211
|
+
const id = await server.resolveSource(config.framework.pages.code);
|
|
212
|
+
// loading a module that does not resolve would only have Vite log its failure
|
|
213
|
+
const loaded = id === undefined ? undefined : await server.load(id);
|
|
214
|
+
const writer = typeof loaded === "object" && loaded !== null && "codeOf" in loaded ? loaded.codeOf : undefined;
|
|
215
|
+
return isCodeWriter(writer) ? writer : undefined;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// a writer that touches the page as it loads has no code to give an agent; the story's answer stands without it
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
/** How long a control's module may take to load for an answer: one that hangs must not hold every answer with it. */
|
|
223
|
+
const CONTROL_LOAD_MS = 5000;
|
|
224
|
+
/** A control's schema, loaded on the server; a text says why there is none. */
|
|
225
|
+
const controlSchemaOf = async (module, server) => {
|
|
226
|
+
try {
|
|
227
|
+
const id = await server.resolveSource(module);
|
|
228
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
229
|
+
setTimeout(() => reject(new Error(`no answer in ${CONTROL_LOAD_MS} ms`)), CONTROL_LOAD_MS).unref();
|
|
230
|
+
});
|
|
231
|
+
const loaded = await Promise.race([server.load(id ?? module), timeout]);
|
|
232
|
+
const schema = typeof loaded === "object" && loaded !== null && "schema" in loaded ? loaded.schema : undefined;
|
|
233
|
+
return isValueSchema(schema) ? schema : "its module exports no schema Forgebook can read";
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
return `its module cannot be read on the server: ${error instanceof Error ? error.message : String(error)}`;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
/**
|
|
240
|
+
* The custom controls a story names, as an agent reads them: only those, each module loaded on the server for its schema.
|
|
241
|
+
* A module that cannot load there (it touches the page as it is imported) has no schema to say, and no value of it can be
|
|
242
|
+
* checked. Its import runs on the dev server, as a story file's does.
|
|
243
|
+
*
|
|
244
|
+
* @param names - the controls the story names.
|
|
245
|
+
* @param config - the catalogue's configuration.
|
|
246
|
+
* @param server - what the answers ask of the dev server.
|
|
247
|
+
*/
|
|
248
|
+
const customControlsRead = async (names, config, server) => {
|
|
249
|
+
const known = names.filter((name) => Object.hasOwn(config.argControls, name));
|
|
250
|
+
const read = await Promise.all(known.map(async (name) => [name, await controlSchemaOf(config.argControls[name] ?? "", server)]));
|
|
251
|
+
return {
|
|
252
|
+
schemas: Object.fromEntries(read.flatMap(([name, each]) => (typeof each === "string" ? [] : [[name, each]]))),
|
|
253
|
+
problems: Object.fromEntries(read.flatMap(([name, each]) => (typeof each === "string" ? [[name, each]] : [])))
|
|
254
|
+
};
|
|
255
|
+
};
|
|
219
256
|
/**
|
|
220
257
|
* Answers one of the API's paths.
|
|
221
258
|
*
|
|
222
259
|
* @param server - what the answers ask of the dev server.
|
|
223
260
|
* @param config - the catalogue's configuration.
|
|
224
261
|
* @param route - the path under `AGENT_API` (`stories`, `story`).
|
|
225
|
-
* @param params - the query: `id` for a story, `view` for the links, `category`, `name`, `value` and `type` for the
|
|
262
|
+
* @param params - the query: `id` for a story, `view` for the links, `args` for the values to set, `category`, `name`, `value` and `type` for the
|
|
226
263
|
* tokens, `query` and `limit` for a search, `usedIn=true` for the list's "Used in" (a
|
|
227
264
|
* story's comes with it when the catalogue offers it).
|
|
228
265
|
* @param origins - where the catalogue is served (`http://localhost:5173`) and where its frames are, for the links.
|
|
@@ -242,7 +279,8 @@ export const agentAnswer = async (server, config, route, params, origins, live)
|
|
|
242
279
|
config,
|
|
243
280
|
params,
|
|
244
281
|
pages: { page: `${origins.catalogue}/`, frame: `${origins.frames}/frame.html` },
|
|
245
|
-
view: params.get("view") ?? ""
|
|
282
|
+
view: params.get("view") ?? "",
|
|
283
|
+
server
|
|
246
284
|
};
|
|
247
285
|
if (route === "errors")
|
|
248
286
|
return errorsAnswer(context, live);
|
|
@@ -259,7 +297,10 @@ export const agentAnswer = async (server, config, route, params, origins, live)
|
|
|
259
297
|
if (route === "page")
|
|
260
298
|
return await pageAnswer(context);
|
|
261
299
|
if (route === "changed")
|
|
262
|
-
return await changedAnswer(context);
|
|
300
|
+
return await changedAnswer(context, server.resolveSource);
|
|
301
|
+
// loaded when asked: it reads syntax with TypeScript, which a dev server's thread must not pay for at start
|
|
302
|
+
if (route === "visibility")
|
|
303
|
+
return await (await import("./visibilityRoute.js")).visibilityAnswer(context);
|
|
263
304
|
if (route === "agent-index")
|
|
264
305
|
return await agentIndexAnswer(context, await catalogueTokens(config, server.resolveSource));
|
|
265
306
|
return { status: 404, body: { error: `No answer at ${AGENT_API}${route}` } };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The statuses in the agents' answers: each story's and each component's (`statuses`), and in a story's answer where its
|
|
3
|
+
* component's TSDoc and its meta disagree about deprecation.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* A deprecated component has two places to say so: `@deprecated` in its TSDoc, which `check_code` reads to warn where
|
|
7
|
+
* it is imported, and a `deprecated` tag on its meta, which the sidebar, the page and the tag filter read without
|
|
8
|
+
* building its types. A story's answer reads both, so it gives the component as deprecated when either says it, and
|
|
9
|
+
* names the place that does not, so the two are made to agree instead of one being trusted over the other. Pure.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import type { ComponentDocs } from "../componentDocs.ts";
|
|
14
|
+
import { type CatalogueStatus } from "../storyStatuses.ts";
|
|
15
|
+
import type { StoryTree, TreeComponent } from "../storyTree.ts";
|
|
16
|
+
import type { StoriesDocument, StoryDocument } from "./agent.types.ts";
|
|
17
|
+
/**
|
|
18
|
+
* The stories document with each component's and each story's statuses.
|
|
19
|
+
*
|
|
20
|
+
* @param document - the stories document.
|
|
21
|
+
* @param tree - the tree it was made from, whose components hold their meta's tags.
|
|
22
|
+
* @param statuses - the catalogue's statuses.
|
|
23
|
+
*/
|
|
24
|
+
export declare const storiesWithStatus: (document: StoriesDocument, tree: StoryTree, statuses: readonly CatalogueStatus[]) => StoriesDocument;
|
|
25
|
+
/**
|
|
26
|
+
* What a component's TSDoc and its meta say of its deprecation, when they disagree: the sentence that names the place
|
|
27
|
+
* to change; none when they agree, when the catalogue has no `deprecated` status, or when there are no docs to read.
|
|
28
|
+
*
|
|
29
|
+
* @param title - the component's title.
|
|
30
|
+
* @param isTagged - whether its meta holds the `deprecated` tag.
|
|
31
|
+
* @param docs - its docs; none when they are not read.
|
|
32
|
+
*/
|
|
33
|
+
export declare const deprecationMismatch: (title: string, isTagged: boolean, docs: ComponentDocs | undefined) => string | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* A story's answer with its statuses and its component's, the component deprecated when its TSDoc says so, and the
|
|
36
|
+
* disagreement between the two among the problems.
|
|
37
|
+
*
|
|
38
|
+
* @param document - the story's answer.
|
|
39
|
+
* @param component - its component in the tree, which holds its meta's tags.
|
|
40
|
+
* @param statuses - the catalogue's statuses.
|
|
41
|
+
*/
|
|
42
|
+
export declare const storyWithStatus: (document: StoryDocument, component: TreeComponent, statuses: readonly CatalogueStatus[]) => StoryDocument;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { DEPRECATED_STATUS, statusesOf } from "../storyStatuses.js";
|
|
2
|
+
/** The ids of the statuses a list of tags holds. */
|
|
3
|
+
const statusIds = (tags, statuses) => statusesOf(tags, statuses).map((status) => status.id);
|
|
4
|
+
/** A value with its statuses, or as it is when it has none: an answer stays short for what has none. */
|
|
5
|
+
const withStatus = (value, statuses) => statuses.length === 0 ? value : { ...value, statuses };
|
|
6
|
+
/**
|
|
7
|
+
* The stories document with each component's and each story's statuses.
|
|
8
|
+
*
|
|
9
|
+
* @param document - the stories document.
|
|
10
|
+
* @param tree - the tree it was made from, whose components hold their meta's tags.
|
|
11
|
+
* @param statuses - the catalogue's statuses.
|
|
12
|
+
*/
|
|
13
|
+
export const storiesWithStatus = (document, tree, statuses) => {
|
|
14
|
+
if (statuses.length === 0)
|
|
15
|
+
return document;
|
|
16
|
+
const tagsById = new Map(tree.sources.flatMap((source) => source.families.flatMap((family) => family.groups.flatMap((group) => group.components.map((component) => [component.id, component.tags])))));
|
|
17
|
+
return {
|
|
18
|
+
...document,
|
|
19
|
+
components: document.components.map((component) => ({
|
|
20
|
+
...withStatus(component, statusIds(tagsById.get(component.id) ?? [], statuses)),
|
|
21
|
+
stories: component.stories.map((story) => withStatus(story, statusIds(story.tags, statuses)))
|
|
22
|
+
}))
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* What a component's TSDoc and its meta say of its deprecation, when they disagree: the sentence that names the place
|
|
27
|
+
* to change; none when they agree, when the catalogue has no `deprecated` status, or when there are no docs to read.
|
|
28
|
+
*
|
|
29
|
+
* @param title - the component's title.
|
|
30
|
+
* @param isTagged - whether its meta holds the `deprecated` tag.
|
|
31
|
+
* @param docs - its docs; none when they are not read.
|
|
32
|
+
*/
|
|
33
|
+
export const deprecationMismatch = (title, isTagged, docs) => {
|
|
34
|
+
if (docs === undefined)
|
|
35
|
+
return undefined;
|
|
36
|
+
const isDocumented = docs.guidance?.deprecated !== undefined;
|
|
37
|
+
if (isDocumented && !isTagged)
|
|
38
|
+
return `${title} is @deprecated in its TSDoc, but its meta has no "${DEPRECATED_STATUS}" tag: add tags: ["${DEPRECATED_STATUS}"] to its meta, so the sidebar, its page and the tag filter say so too`;
|
|
39
|
+
if (isTagged && !isDocumented)
|
|
40
|
+
return `${title}'s meta is tagged "${DEPRECATED_STATUS}", but its TSDoc has no @deprecated: add one (and @replacedBy when something replaces it), so check_code warns where it is imported`;
|
|
41
|
+
return undefined;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* A story's answer with its statuses and its component's, the component deprecated when its TSDoc says so, and the
|
|
45
|
+
* disagreement between the two among the problems.
|
|
46
|
+
*
|
|
47
|
+
* @param document - the story's answer.
|
|
48
|
+
* @param component - its component in the tree, which holds its meta's tags.
|
|
49
|
+
* @param statuses - the catalogue's statuses.
|
|
50
|
+
*/
|
|
51
|
+
export const storyWithStatus = (document, component, statuses) => {
|
|
52
|
+
if (statuses.length === 0)
|
|
53
|
+
return document;
|
|
54
|
+
const own = statusIds(component.tags, statuses);
|
|
55
|
+
const hasDeprecated = statuses.some((status) => status.id === DEPRECATED_STATUS);
|
|
56
|
+
const mismatch = hasDeprecated
|
|
57
|
+
? deprecationMismatch(component.title, own.includes(DEPRECATED_STATUS), document.docs)
|
|
58
|
+
: undefined;
|
|
59
|
+
const isDocumented = document.docs?.guidance?.deprecated !== undefined;
|
|
60
|
+
const status = hasDeprecated && isDocumented ? statusIds([...component.tags, DEPRECATED_STATUS], statuses) : own;
|
|
61
|
+
return {
|
|
62
|
+
...document,
|
|
63
|
+
story: withStatus(document.story, statusIds(document.story.tags, statuses)),
|
|
64
|
+
component: withStatus(document.component, status),
|
|
65
|
+
problems: mismatch === undefined ? document.problems : [...document.problems, mismatch]
|
|
66
|
+
};
|
|
67
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type ComponentDocs } from "../componentDocs.ts";
|
|
2
|
+
import type { StoryCodeWriter } from "../frame/renderer.ts";
|
|
3
|
+
import { type LoadedPreview } from "../frame/storyModule.ts";
|
|
4
|
+
import type { ArgValue } from "../messages.ts";
|
|
5
|
+
import type { NamedValues } from "../namedValues.ts";
|
|
6
|
+
import type { StoryLocation } from "../storyTree.ts";
|
|
7
|
+
import type { StoryDocument } from "./agent.types.ts";
|
|
8
|
+
/** What a story's code is written from on the server. */
|
|
9
|
+
export type AgentCodeParts = {
|
|
10
|
+
/** The story file's code, as its `?forgebook-code` module answers, or why it could not be loaded. */
|
|
11
|
+
readonly code: {
|
|
12
|
+
readonly value: unknown;
|
|
13
|
+
} | {
|
|
14
|
+
readonly error: string;
|
|
15
|
+
};
|
|
16
|
+
/** The framework's code writer; none when it does not load on the server. */
|
|
17
|
+
readonly writer: StoryCodeWriter | undefined;
|
|
18
|
+
/** The source's named values, as the frame writes them by name. */
|
|
19
|
+
readonly namedValues: NamedValues | undefined;
|
|
20
|
+
};
|
|
21
|
+
/** The story the code is of, as the story's answer read it. */
|
|
22
|
+
export type AgentCodeStory = {
|
|
23
|
+
/** The story's place in the tree, for its export and its component's name. */
|
|
24
|
+
readonly location: StoryLocation;
|
|
25
|
+
/** The story file's module, as the dev server loaded it. */
|
|
26
|
+
readonly module: unknown;
|
|
27
|
+
/** The catalogue's previews merged, whose args are under every story's. */
|
|
28
|
+
readonly preview: LoadedPreview | undefined;
|
|
29
|
+
/** The values an agent set, by name; none sets nothing. */
|
|
30
|
+
readonly accepted: Readonly<Record<string, ArgValue>> | undefined;
|
|
31
|
+
/** The component's docs, for the name code writes it by; none takes the tree's. */
|
|
32
|
+
readonly docs: ComponentDocs | undefined;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* A story's code; none when its module, its file's code or the framework's writer cannot be read.
|
|
36
|
+
*
|
|
37
|
+
* @param parts - the file's code, the framework's writer and the named values.
|
|
38
|
+
* @param story - the story, its module, what an agent set and its component's docs.
|
|
39
|
+
*/
|
|
40
|
+
export declare const agentStoryCode: (parts: AgentCodeParts, { location, module, preview, accepted, docs }: AgentCodeStory) => string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* A story's answer with its code, when it can be written.
|
|
43
|
+
*
|
|
44
|
+
* @param document - the story's answer.
|
|
45
|
+
* @param parts - the file's code, the framework's writer and the named values; none leaves the answer as it is.
|
|
46
|
+
* @param story - the story, its module and the preview.
|
|
47
|
+
*/
|
|
48
|
+
export declare const withStoryCode: (document: StoryDocument, parts: AgentCodeParts | undefined, story: Pick<AgentCodeStory, "location" | "module" | "preview">) => StoryDocument;
|