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,185 @@
|
|
|
1
|
+
import { isChoiceList, UNSET_ARG } from "./messages.js";
|
|
2
|
+
/** A number as Storybook's links write it. */
|
|
3
|
+
const NUMBER_TEXT = /^-?[0-9]+(\.[0-9]+)?$/;
|
|
4
|
+
/** A colour as Storybook writes it after its `!`. */
|
|
5
|
+
const COLOR = /^(rgba?|hsla?)\(([0-9]{1,3}),\s?([0-9]{1,3})%?,\s?([0-9]{1,3})%?,?\s?([0-9](\.[0-9]{1,2})?)?\)$/i;
|
|
6
|
+
/** An arg's name in Storybook's form, with a list's index: `tags[1]`, `tags[]`. */
|
|
7
|
+
const STORYBOOK_KEY = /^([^.[\]]+)(?:\[([0-9]*)\])?$/;
|
|
8
|
+
/**
|
|
9
|
+
* What a text of a link is for a prop, whose type it does not carry: a number for a prop that takes numbers, a toggle's
|
|
10
|
+
* value, a choice's option; a text otherwise.
|
|
11
|
+
*
|
|
12
|
+
* @param prop - a prop the panel sets.
|
|
13
|
+
* @param text - the link's text.
|
|
14
|
+
*/
|
|
15
|
+
const typedText = (prop, text) => {
|
|
16
|
+
const option = (prop.choices ?? []).find((choice) => String(choice) === text);
|
|
17
|
+
if (option !== undefined)
|
|
18
|
+
return option;
|
|
19
|
+
const isToggle = prop.control === "boolean" || (prop.control === undefined && prop.kind === "toggle");
|
|
20
|
+
if (isToggle && (text === "true" || text === "false"))
|
|
21
|
+
return text === "true";
|
|
22
|
+
const isNumeric = prop.control === "number" ||
|
|
23
|
+
prop.control === "range" ||
|
|
24
|
+
prop.control === "date" ||
|
|
25
|
+
(prop.control === undefined && prop.kind === "number") ||
|
|
26
|
+
// a mixed union's number (`"sm" | number`): a text it takes too stays one only when the text is no number
|
|
27
|
+
(prop.shape?.kind === "union" && prop.shape.of.some((member) => member.kind === "number")) ||
|
|
28
|
+
(prop.shape?.kind === "list" && prop.shape.of.kind === "number");
|
|
29
|
+
return isNumeric && NUMBER_TEXT.test(text) ? Number(text) : text;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
/** What a text is for a custom control, whose type only its schema knows: a number or a toggle when it writes one. */
|
|
33
|
+
const customText = (text) => {
|
|
34
|
+
if (text === "true" || text === "false")
|
|
35
|
+
return text === "true";
|
|
36
|
+
return NUMBER_TEXT.test(text) ? Number(text) : text;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* A value of a link, typed for a prop.
|
|
40
|
+
*
|
|
41
|
+
* @param prop - the prop that receives it.
|
|
42
|
+
* @param value - the link's value.
|
|
43
|
+
*/
|
|
44
|
+
const typedLinkValue = (prop, value) => {
|
|
45
|
+
if (typeof value === "string" && prop.customControl !== undefined)
|
|
46
|
+
return customText(value);
|
|
47
|
+
if (typeof value === "string")
|
|
48
|
+
return typedText(prop, value);
|
|
49
|
+
if (!isChoiceList(value))
|
|
50
|
+
return value;
|
|
51
|
+
return value.map((item) => {
|
|
52
|
+
const typed = typeof item === "string" ? typedText(prop, item) : item;
|
|
53
|
+
return typeof typed === "boolean" ? String(typed) : typed;
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* A text decoded once more: Storybook's form goes through its own query parser after the address's. A `%` that starts no
|
|
58
|
+
* escape is the text's own.
|
|
59
|
+
*
|
|
60
|
+
* @param text - the text.
|
|
61
|
+
*/
|
|
62
|
+
const decoded = (text) => {
|
|
63
|
+
try {
|
|
64
|
+
return decodeURIComponent(text);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return text;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* A colour's text, as Storybook's reading writes it.
|
|
72
|
+
*
|
|
73
|
+
* @param marked - the value after its `!`.
|
|
74
|
+
* @returns the text; none when it is no colour.
|
|
75
|
+
*/
|
|
76
|
+
const colorOf = (marked) => {
|
|
77
|
+
const color = COLOR.exec(marked);
|
|
78
|
+
if (color === null)
|
|
79
|
+
return undefined;
|
|
80
|
+
const [, kind = "", first, second, third, alpha] = color;
|
|
81
|
+
const unit = kind.toLowerCase().startsWith("hsl") ? "%" : "";
|
|
82
|
+
return kind.toLowerCase().endsWith("a")
|
|
83
|
+
? `${kind}(${first}, ${second}${unit}, ${third}${unit}, ${alpha})`
|
|
84
|
+
: `${kind}(${first}, ${second}${unit}, ${third}${unit})`;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* One of Storybook's values: its marked ones read, the others left as text.
|
|
88
|
+
*
|
|
89
|
+
* @param text - the value.
|
|
90
|
+
* @returns the value; none when no arg can hold it.
|
|
91
|
+
*/
|
|
92
|
+
const storybookValue = (text) => {
|
|
93
|
+
if (!text.startsWith("!"))
|
|
94
|
+
return text;
|
|
95
|
+
if (text === "!undefined")
|
|
96
|
+
return UNSET_ARG;
|
|
97
|
+
if (text === "!null")
|
|
98
|
+
return null;
|
|
99
|
+
if (text === "!true")
|
|
100
|
+
return true;
|
|
101
|
+
if (text === "!false")
|
|
102
|
+
return false;
|
|
103
|
+
if (text.startsWith("!date(") && text.endsWith(")")) {
|
|
104
|
+
const time = Date.parse(text.slice(6, -1).replaceAll(" ", "+"));
|
|
105
|
+
return Number.isNaN(time) ? undefined : time;
|
|
106
|
+
}
|
|
107
|
+
if (text.startsWith("!hex(") && text.endsWith(")"))
|
|
108
|
+
return `#${text.slice(5, -1)}`;
|
|
109
|
+
// a mark that means nothing is the text's own, as Storybook reads it
|
|
110
|
+
return colorOf(text.slice(1)) ?? text;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* What one arg's entries make: its value, or a list when there are several or a bracket says so, as Storybook repeats a
|
|
114
|
+
* key for a list too (`tags:a;tags:b`).
|
|
115
|
+
*
|
|
116
|
+
* @param entries - its entries, in the address's order.
|
|
117
|
+
* @returns the value; none when it cannot be held, a list with a hole among them.
|
|
118
|
+
*/
|
|
119
|
+
const valueOfEntries = (entries) => {
|
|
120
|
+
const [only] = entries;
|
|
121
|
+
if (entries.length === 1 && only !== undefined && !only.isListed)
|
|
122
|
+
return only.value;
|
|
123
|
+
const items = new Map();
|
|
124
|
+
for (const { index, value } of entries)
|
|
125
|
+
items.set(index ?? items.size, value);
|
|
126
|
+
const list = [...Array(items.size).keys()].map((index) => items.get(index));
|
|
127
|
+
return isChoiceList(list) ? list : undefined;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* The name of an arg in a key: what comes before its first `.` or `[`.
|
|
131
|
+
*
|
|
132
|
+
* @param key - the key.
|
|
133
|
+
*/
|
|
134
|
+
const nameOfKey = (key) => key.split(/[.[]/, 1)[0] || key;
|
|
135
|
+
/**
|
|
136
|
+
* One `name:value` of Storybook's form, or the name to report when it is none that can be held.
|
|
137
|
+
*
|
|
138
|
+
* @param part - the text between two `;`.
|
|
139
|
+
*/
|
|
140
|
+
const storybookPart = (part) => {
|
|
141
|
+
const colon = part.indexOf(":");
|
|
142
|
+
const key = decoded(colon === -1 ? part : part.slice(0, colon));
|
|
143
|
+
const match = colon <= 0 ? null : STORYBOOK_KEY.exec(key);
|
|
144
|
+
const name = match?.[1];
|
|
145
|
+
if (name === undefined)
|
|
146
|
+
return { name: key === "" ? part : nameOfKey(key) };
|
|
147
|
+
const bracket = match?.[2];
|
|
148
|
+
const index = bracket === undefined || bracket === "" ? undefined : Number(bracket);
|
|
149
|
+
const value = storybookValue(decoded(part.slice(colon + 1)));
|
|
150
|
+
return { name, entry: { index, isListed: bracket !== undefined, value } };
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Storybook's form, read.
|
|
154
|
+
*
|
|
155
|
+
* @param param - the parameter.
|
|
156
|
+
*/
|
|
157
|
+
export const readStorybookArgs = (param) => {
|
|
158
|
+
const entries = new Map();
|
|
159
|
+
const unread = new Set();
|
|
160
|
+
for (const { name, entry } of param
|
|
161
|
+
.split(";")
|
|
162
|
+
.filter((each) => each !== "")
|
|
163
|
+
.map(storybookPart)) {
|
|
164
|
+
if (entry === undefined)
|
|
165
|
+
unread.add(name);
|
|
166
|
+
else {
|
|
167
|
+
const ofName = entries.get(name);
|
|
168
|
+
if (ofName === undefined)
|
|
169
|
+
entries.set(name, [entry]);
|
|
170
|
+
else
|
|
171
|
+
ofName.push(entry);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const read = [...entries].flatMap(([name, ofName]) => {
|
|
175
|
+
const value = valueOfEntries(ofName);
|
|
176
|
+
if (value === undefined)
|
|
177
|
+
unread.add(name);
|
|
178
|
+
return value === undefined ? [] : [[name, value]];
|
|
179
|
+
});
|
|
180
|
+
return {
|
|
181
|
+
// an arg with an entry that cannot be read is not given in part
|
|
182
|
+
args: Object.fromEntries(read.filter(([name]) => !unread.has(name))),
|
|
183
|
+
link: { param, isWaiting: false, typeValue: typedLinkValue, unread: [...unread] }
|
|
184
|
+
};
|
|
185
|
+
};
|
package/dist/src/switches.d.ts
CHANGED
|
@@ -12,6 +12,25 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
|
+
/**
|
|
16
|
+
* What a gallery shows of a value before it is applied (`control: "gallery"`): a picture the catalogue provides, or a
|
|
17
|
+
* few colours with a font's name.
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* Nothing here loads from an address. The picture is a file on disk, which the build gives an address of its own;
|
|
21
|
+
* the colours paint swatches; the font is a name, drawn in that font only where the reader has it installed. The
|
|
22
|
+
* configuration's check refuses anything else (`vite/switchValuesCheck.ts`).
|
|
23
|
+
*/
|
|
24
|
+
export type SwitchPreview =
|
|
25
|
+
/** A picture: a file by its path from the configuration's folder, or absolute (a preset's). */
|
|
26
|
+
{
|
|
27
|
+
readonly image: string;
|
|
28
|
+
}
|
|
29
|
+
/** Up to eight CSS colours, and a font's name to show beside them; none by default. */
|
|
30
|
+
| {
|
|
31
|
+
readonly swatches: readonly string[];
|
|
32
|
+
readonly font?: string;
|
|
33
|
+
};
|
|
15
34
|
/** One value a switch offers. */
|
|
16
35
|
export type SwitchValue = {
|
|
17
36
|
/** The value, as the address and the root's attribute write it (`dark`). */
|
|
@@ -26,6 +45,22 @@ export type SwitchValue = {
|
|
|
26
45
|
readonly isMore?: boolean;
|
|
27
46
|
/** For a `language` switch: whether the language reads right to left, which draws the story right to left. */
|
|
28
47
|
readonly isRightToLeft?: boolean;
|
|
48
|
+
/** What a gallery shows of it; a value with none shows its label's first letter. */
|
|
49
|
+
readonly preview?: SwitchPreview;
|
|
50
|
+
/**
|
|
51
|
+
* The values this value sets on other switches, by switch id (`{ theme: "dark" }`: a look drawn only for dark). While
|
|
52
|
+
* it is chosen, each named switch draws that value and its control is off, saying what sets it; the address keeps the
|
|
53
|
+
* reader's own value, which comes back when the value is left. It wins over the address, and over what a story fixes.
|
|
54
|
+
* When two values imply different values of a switch, the one of the switch declared first wins. An implied value
|
|
55
|
+
* implies nothing further: the configuration's check refuses one that would.
|
|
56
|
+
*/
|
|
57
|
+
readonly implies?: Readonly<Record<string, string>>;
|
|
58
|
+
/**
|
|
59
|
+
* A style sheet of this value alone: a file by its path from the configuration's folder, or absolute (a preset's).
|
|
60
|
+
* Loaded only while the value is drawn, with Styles › Full, after the source's sheets, the switches' in the order they
|
|
61
|
+
* are declared. A change of value keeps the old sheet until the new one has loaded.
|
|
62
|
+
*/
|
|
63
|
+
readonly sheet?: string;
|
|
29
64
|
};
|
|
30
65
|
/** Where a switch applies. */
|
|
31
66
|
export type SwitchApply =
|
|
@@ -58,6 +93,8 @@ export type SwitchApply =
|
|
|
58
93
|
* texts and the language's provider), the direction (a catalogue's own switch in place of the ready-made one).
|
|
59
94
|
*/
|
|
60
95
|
export type SwitchRole = "colorScheme" | "contrast" | "language" | "direction" | "touch";
|
|
96
|
+
/** The ways a switch can be offered. */
|
|
97
|
+
export type SwitchControlKind = "segments" | "list" | "gallery";
|
|
61
98
|
/** A switch of the toolbar or the View menu. */
|
|
62
99
|
export type ViewSwitch = {
|
|
63
100
|
/** A stable id, the address's parameter (`theme`). */
|
|
@@ -72,8 +109,11 @@ export type ViewSwitch = {
|
|
|
72
109
|
readonly apply: SwitchApply;
|
|
73
110
|
/** What the catalogue reads of it; none for a switch only the library reads. */
|
|
74
111
|
readonly role?: SwitchRole;
|
|
75
|
-
/**
|
|
76
|
-
|
|
112
|
+
/**
|
|
113
|
+
* How the toolbar and the View menu offer it: a row of segments (by default, up to six values), a list, or a gallery,
|
|
114
|
+
* a menu whose items show each value's `preview`.
|
|
115
|
+
*/
|
|
116
|
+
readonly control?: SwitchControlKind;
|
|
77
117
|
/** What a reader should know of it, in a sentence or two: under its row in the View menu and in its tooltip. */
|
|
78
118
|
readonly description?: string;
|
|
79
119
|
};
|
|
@@ -147,12 +187,35 @@ export declare const touchChoiceOf: (switches: readonly ViewSwitch[]) => TouchCh
|
|
|
147
187
|
* @param value - the value given; none for the default.
|
|
148
188
|
*/
|
|
149
189
|
export declare const switchValueOf: (each: ViewSwitch, value: string | undefined) => SwitchValue | undefined;
|
|
190
|
+
/**
|
|
191
|
+
* The values other switches' values imply, by the implied switch's id, each with the value that implies it.
|
|
192
|
+
*
|
|
193
|
+
* @remarks
|
|
194
|
+
* Read from the values alone, so applying it twice gives the same answer: the shell, a frame and a tool opening a
|
|
195
|
+
* frame's address agree without telling each other. A switch already implied implies nothing itself, and one whose value
|
|
196
|
+
* already implies cannot be implied, so a value that is not drawn never implies, and the switch declared first wins a
|
|
197
|
+
* conflict.
|
|
198
|
+
*
|
|
199
|
+
* @param values - the switches' values, by id; a switch left out has its default.
|
|
200
|
+
* @param switches - the catalogue's switches.
|
|
201
|
+
*/
|
|
202
|
+
export declare const impliedSwitches: (values: Readonly<Record<string, string>>, switches: readonly ViewSwitch[]) => ReadonlyMap<string, {
|
|
203
|
+
readonly value: string;
|
|
204
|
+
readonly by: SwitchValue;
|
|
205
|
+
}>;
|
|
206
|
+
/**
|
|
207
|
+
* The switches' values as they are drawn: the ones given, with what their values imply over them.
|
|
208
|
+
*
|
|
209
|
+
* @param values - the switches' values, by id.
|
|
210
|
+
* @param switches - the catalogue's switches.
|
|
211
|
+
*/
|
|
212
|
+
export declare const shownSwitches: (values: Readonly<Record<string, string>>, switches: readonly ViewSwitch[]) => Readonly<Record<string, string>>;
|
|
150
213
|
/**
|
|
151
214
|
* How the View menu offers a switch: as it declares, or segments up to six values and a list past them.
|
|
152
215
|
*
|
|
153
216
|
* @param each - the switch.
|
|
154
217
|
*/
|
|
155
|
-
export declare const switchControl: (each: ViewSwitch) =>
|
|
218
|
+
export declare const switchControl: (each: ViewSwitch) => SwitchControlKind;
|
|
156
219
|
/**
|
|
157
220
|
* A catalogue's switches: the ones it declares (the theme and the contrast when it declares none), then, when it or a
|
|
158
221
|
* source offers languages, the language switch over all of them, then the ready-made direction and touch switches,
|
package/dist/src/switches.js
CHANGED
|
@@ -16,6 +16,8 @@ import { DEVICE_PARAMETER, ORIENTATION_PARAMETER } from "./deviceView.js";
|
|
|
16
16
|
/** The address's own parameters: a switch may not take their names. */
|
|
17
17
|
const RESERVED_IDS = [
|
|
18
18
|
"embed",
|
|
19
|
+
"play",
|
|
20
|
+
"tag",
|
|
19
21
|
"story",
|
|
20
22
|
"component",
|
|
21
23
|
"backdrop",
|
|
@@ -33,7 +35,8 @@ const RESERVED_IDS = [
|
|
|
33
35
|
"args",
|
|
34
36
|
"matrix",
|
|
35
37
|
"clock",
|
|
36
|
-
"audience"
|
|
38
|
+
"audience",
|
|
39
|
+
"ref"
|
|
37
40
|
];
|
|
38
41
|
/**
|
|
39
42
|
* Why a list of switches cannot be used, or none: ids unique and not the address's own, a default among the values,
|
|
@@ -173,6 +176,44 @@ export const touchChoiceOf = (switches) => {
|
|
|
173
176
|
* @param value - the value given; none for the default.
|
|
174
177
|
*/
|
|
175
178
|
export const switchValueOf = (each, value) => each.values.find((candidate) => candidate.value === (value ?? each.default));
|
|
179
|
+
/**
|
|
180
|
+
* The values other switches' values imply, by the implied switch's id, each with the value that implies it.
|
|
181
|
+
*
|
|
182
|
+
* @remarks
|
|
183
|
+
* Read from the values alone, so applying it twice gives the same answer: the shell, a frame and a tool opening a
|
|
184
|
+
* frame's address agree without telling each other. A switch already implied implies nothing itself, and one whose value
|
|
185
|
+
* already implies cannot be implied, so a value that is not drawn never implies, and the switch declared first wins a
|
|
186
|
+
* conflict.
|
|
187
|
+
*
|
|
188
|
+
* @param values - the switches' values, by id; a switch left out has its default.
|
|
189
|
+
* @param switches - the catalogue's switches.
|
|
190
|
+
*/
|
|
191
|
+
export const impliedSwitches = (values, switches) => {
|
|
192
|
+
const implied = new Map();
|
|
193
|
+
const implying = new Set();
|
|
194
|
+
for (const each of switches) {
|
|
195
|
+
const by = switchValueOf(each, values[each.id]);
|
|
196
|
+
if (by?.implies === undefined || implied.has(each.id))
|
|
197
|
+
continue;
|
|
198
|
+
implying.add(each.id);
|
|
199
|
+
for (const [id, value] of Object.entries(by.implies))
|
|
200
|
+
if (!implied.has(id) && !implying.has(id))
|
|
201
|
+
implied.set(id, { value, by });
|
|
202
|
+
}
|
|
203
|
+
return implied;
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* The switches' values as they are drawn: the ones given, with what their values imply over them.
|
|
207
|
+
*
|
|
208
|
+
* @param values - the switches' values, by id.
|
|
209
|
+
* @param switches - the catalogue's switches.
|
|
210
|
+
*/
|
|
211
|
+
export const shownSwitches = (values, switches) => {
|
|
212
|
+
const shown = { ...values };
|
|
213
|
+
for (const [id, { value }] of impliedSwitches(values, switches))
|
|
214
|
+
shown[id] = value;
|
|
215
|
+
return shown;
|
|
216
|
+
};
|
|
176
217
|
/**
|
|
177
218
|
* How the View menu offers a switch: as it declares, or segments up to six values and a list past them.
|
|
178
219
|
*
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The schema of a custom control's value, and the check of a value against it: a small part of JSON Schema, written by the
|
|
3
|
+
* control's author, read in the shell and by the commands. No dependency, so the check costs a catalogue with custom
|
|
4
|
+
* controls little and any other nothing.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* A keyword outside this list is refused rather than ignored: a schema that says less than it seems to would let a link
|
|
8
|
+
* through. Pure.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { ValueSchema } from "./argControl.ts";
|
|
13
|
+
import { type ArgValue } from "./messages.ts";
|
|
14
|
+
/**
|
|
15
|
+
* Whether a module's `schema` is one this check reads in full, at any depth: a keyword it does not know, or one holding what
|
|
16
|
+
* it cannot use, would let through what the schema seems to refuse.
|
|
17
|
+
*
|
|
18
|
+
* @param value - the module's export.
|
|
19
|
+
*/
|
|
20
|
+
export declare const isValueSchema: (value: unknown) => value is ValueSchema;
|
|
21
|
+
/**
|
|
22
|
+
* What is wrong with a value, in a sentence.
|
|
23
|
+
*
|
|
24
|
+
* @param schema - the control's schema.
|
|
25
|
+
* @param value - the value.
|
|
26
|
+
* @returns the sentence; none when it fits.
|
|
27
|
+
*/
|
|
28
|
+
export declare const schemaProblem: (schema: ValueSchema, value: ArgValue) => string | undefined;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { isArgList, isArgObject } from "./messages.js";
|
|
2
|
+
/** Whether a value is a plain object. */
|
|
3
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
/** The keywords a schema may use. */
|
|
5
|
+
const KEYWORDS = [
|
|
6
|
+
"title",
|
|
7
|
+
"description",
|
|
8
|
+
"default",
|
|
9
|
+
"type",
|
|
10
|
+
"enum",
|
|
11
|
+
"const",
|
|
12
|
+
"minimum",
|
|
13
|
+
"maximum",
|
|
14
|
+
"minLength",
|
|
15
|
+
"maxLength",
|
|
16
|
+
"pattern",
|
|
17
|
+
"items",
|
|
18
|
+
"minItems",
|
|
19
|
+
"maxItems",
|
|
20
|
+
"properties",
|
|
21
|
+
"required",
|
|
22
|
+
"additionalProperties",
|
|
23
|
+
"anyOf"
|
|
24
|
+
];
|
|
25
|
+
/** The types JSON Schema names. */
|
|
26
|
+
const SCHEMA_TYPES = [
|
|
27
|
+
"string",
|
|
28
|
+
"number",
|
|
29
|
+
"integer",
|
|
30
|
+
"boolean",
|
|
31
|
+
"null",
|
|
32
|
+
"object",
|
|
33
|
+
"array"
|
|
34
|
+
];
|
|
35
|
+
/** Whether a keyword holds a number, when it is there: one that holds another thing would refuse nothing. */
|
|
36
|
+
const areNumbers = (schema, keywords) => keywords.every((keyword) => schema[keyword] === undefined || typeof schema[keyword] === "number");
|
|
37
|
+
/** Whether a pattern compiles, and repeats no repeat (`(a+)+`), the form that hangs a page on a short text. */
|
|
38
|
+
const isUsablePattern = (pattern) => {
|
|
39
|
+
if (pattern === undefined)
|
|
40
|
+
return true;
|
|
41
|
+
if (typeof pattern !== "string" || /\([^)]*[+*}][^)]*\)[+*{]/.test(pattern))
|
|
42
|
+
return false;
|
|
43
|
+
try {
|
|
44
|
+
return new RegExp(pattern, "u") !== undefined;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
/** Whether a keyword holding one schema, or several, holds schemas. */
|
|
51
|
+
const areNested = (value) => {
|
|
52
|
+
const { items, properties, additionalProperties, anyOf } = value;
|
|
53
|
+
return ((items === undefined || isValueSchema(items)) &&
|
|
54
|
+
(properties === undefined || (isRecord(properties) && Object.values(properties).every(isValueSchema))) &&
|
|
55
|
+
(additionalProperties === undefined ||
|
|
56
|
+
typeof additionalProperties === "boolean" ||
|
|
57
|
+
isValueSchema(additionalProperties)) &&
|
|
58
|
+
(anyOf === undefined || (Array.isArray(anyOf) && anyOf.every(isValueSchema))));
|
|
59
|
+
};
|
|
60
|
+
/** Whether the keywords of one level hold what they say. */
|
|
61
|
+
const areLeavesRead = (value) => {
|
|
62
|
+
const { type, required } = value;
|
|
63
|
+
const types = type === undefined ? [] : [type].flat();
|
|
64
|
+
return (types.every((each) => SCHEMA_TYPES.includes(each)) &&
|
|
65
|
+
(value["enum"] === undefined || Array.isArray(value["enum"])) &&
|
|
66
|
+
(required === undefined ||
|
|
67
|
+
(Array.isArray(required) && required.every((name) => typeof name === "string"))) &&
|
|
68
|
+
areNumbers(value, ["minimum", "maximum", "minLength", "maxLength", "minItems", "maxItems"]) &&
|
|
69
|
+
isUsablePattern(value["pattern"]));
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Whether a module's `schema` is one this check reads in full, at any depth: a keyword it does not know, or one holding what
|
|
73
|
+
* it cannot use, would let through what the schema seems to refuse.
|
|
74
|
+
*
|
|
75
|
+
* @param value - the module's export.
|
|
76
|
+
*/
|
|
77
|
+
export const isValueSchema = (value) => isRecord(value) &&
|
|
78
|
+
Object.keys(value).every((key) => KEYWORDS.includes(key)) &&
|
|
79
|
+
areLeavesRead(value) &&
|
|
80
|
+
areNested(value);
|
|
81
|
+
/** Whether a value is of one of JSON Schema's types. */
|
|
82
|
+
const isOfType = (type, value) => {
|
|
83
|
+
switch (type) {
|
|
84
|
+
case "string":
|
|
85
|
+
case "boolean":
|
|
86
|
+
return typeof value === type;
|
|
87
|
+
case "number":
|
|
88
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
89
|
+
case "integer":
|
|
90
|
+
return Number.isInteger(value);
|
|
91
|
+
case "null":
|
|
92
|
+
return value === null;
|
|
93
|
+
case "array":
|
|
94
|
+
return isArgList(value);
|
|
95
|
+
case "object":
|
|
96
|
+
return isArgObject(value);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
/** Whether two values are the same JSON, whatever order an object writes its fields in. */
|
|
100
|
+
const isSameValue = (left, right) => {
|
|
101
|
+
if (Array.isArray(left) && Array.isArray(right))
|
|
102
|
+
return left.length === right.length && left.every((each, index) => isSameValue(each, right[index]));
|
|
103
|
+
if (!isRecord(left) || !isRecord(right))
|
|
104
|
+
return left === right;
|
|
105
|
+
const names = Object.keys(left);
|
|
106
|
+
return (names.length === Object.keys(right).length &&
|
|
107
|
+
names.every((name) => Object.hasOwn(right, name) && isSameValue(left[name], right[name])));
|
|
108
|
+
};
|
|
109
|
+
/** What is wrong with a value's own kind: its type and the values it may be. */
|
|
110
|
+
const kindProblem = (schema, value, path) => {
|
|
111
|
+
const types = schema.type === undefined ? [] : [schema.type].flat();
|
|
112
|
+
if (types.length > 0 && !types.some((type) => isOfType(type, value)))
|
|
113
|
+
return `${path} must be of type ${types.join(" or ")}`;
|
|
114
|
+
if (schema.enum !== undefined && !schema.enum.some((each) => isSameValue(each, value)))
|
|
115
|
+
return `${path} must be one of ${JSON.stringify(schema.enum)}`;
|
|
116
|
+
return schema.const !== undefined && !isSameValue(schema.const, value)
|
|
117
|
+
? `${path} must be ${JSON.stringify(schema.const)}`
|
|
118
|
+
: undefined;
|
|
119
|
+
};
|
|
120
|
+
/** What is wrong with a number or a text. */
|
|
121
|
+
const leafProblem = (schema, value, path) => {
|
|
122
|
+
if (typeof value === "number") {
|
|
123
|
+
if (schema.minimum !== undefined && value < schema.minimum)
|
|
124
|
+
return `${path} must be at least ${schema.minimum}`;
|
|
125
|
+
if (schema.maximum !== undefined && value > schema.maximum)
|
|
126
|
+
return `${path} must be at most ${schema.maximum}`;
|
|
127
|
+
}
|
|
128
|
+
if (typeof value !== "string")
|
|
129
|
+
return undefined;
|
|
130
|
+
// in characters, as JSON Schema counts: an emoji is one
|
|
131
|
+
const { length } = [...value];
|
|
132
|
+
if (schema.minLength !== undefined && length < schema.minLength)
|
|
133
|
+
return `${path} must have at least ${schema.minLength} characters`;
|
|
134
|
+
if (schema.maxLength !== undefined && length > schema.maxLength)
|
|
135
|
+
return `${path} must have at most ${schema.maxLength} characters`;
|
|
136
|
+
return schema.pattern !== undefined && !new RegExp(schema.pattern, "u").test(value)
|
|
137
|
+
? `${path} must match ${schema.pattern}`
|
|
138
|
+
: undefined;
|
|
139
|
+
};
|
|
140
|
+
/** What is wrong with a list. */
|
|
141
|
+
const listProblem = (schema, value, path) => {
|
|
142
|
+
if (schema.minItems !== undefined && value.length < schema.minItems)
|
|
143
|
+
return `${path} must have at least ${schema.minItems} items`;
|
|
144
|
+
if (schema.maxItems !== undefined && value.length > schema.maxItems)
|
|
145
|
+
return `${path} must have at most ${schema.maxItems} items`;
|
|
146
|
+
const { items } = schema;
|
|
147
|
+
if (items === undefined)
|
|
148
|
+
return undefined;
|
|
149
|
+
return value
|
|
150
|
+
.map((item, index) => problemAt(items, item, `${path}[${index}]`))
|
|
151
|
+
.find((each) => each !== undefined);
|
|
152
|
+
};
|
|
153
|
+
/** What is wrong with an object. */
|
|
154
|
+
const objectProblem = (schema, value, path) => {
|
|
155
|
+
const missing = (schema.required ?? []).find((name) => !Object.hasOwn(value, name));
|
|
156
|
+
if (missing !== undefined)
|
|
157
|
+
return `${path} must have ${missing}`;
|
|
158
|
+
for (const [name, each] of Object.entries(value)) {
|
|
159
|
+
const fieldPath = `${path}.${name}`;
|
|
160
|
+
const declared = schema.properties !== undefined && Object.hasOwn(schema.properties, name);
|
|
161
|
+
const field = declared ? schema.properties?.[name] : schema.additionalProperties;
|
|
162
|
+
if (field === false)
|
|
163
|
+
return `${fieldPath} is not a field it takes`;
|
|
164
|
+
const problem = isRecord(field) ? problemAt(field, each, fieldPath) : undefined;
|
|
165
|
+
if (problem !== undefined)
|
|
166
|
+
return problem;
|
|
167
|
+
}
|
|
168
|
+
return undefined;
|
|
169
|
+
};
|
|
170
|
+
/** What is wrong with a value, at a place in the whole. */
|
|
171
|
+
const problemAt = (schema, value, path) => {
|
|
172
|
+
const problem = kindProblem(schema, value, path) ?? leafProblem(schema, value, path);
|
|
173
|
+
if (problem !== undefined)
|
|
174
|
+
return problem;
|
|
175
|
+
if (schema.anyOf !== undefined && schema.anyOf.every((each) => problemAt(each, value, path) !== undefined))
|
|
176
|
+
return `${path} fits none of its forms`;
|
|
177
|
+
if (isArgList(value))
|
|
178
|
+
return listProblem(schema, value, path);
|
|
179
|
+
return isArgObject(value) ? objectProblem(schema, value, path) : undefined;
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* What is wrong with a value, in a sentence.
|
|
183
|
+
*
|
|
184
|
+
* @param schema - the control's schema.
|
|
185
|
+
* @param value - the value.
|
|
186
|
+
* @returns the sentence; none when it fits.
|
|
187
|
+
*/
|
|
188
|
+
export const schemaProblem = (schema, value) => {
|
|
189
|
+
try {
|
|
190
|
+
return problemAt(schema, value, "the value");
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
// a pattern that is no regular expression is the control's mistake: no value can be known to fit it
|
|
194
|
+
return error instanceof Error ? error.message : String(error);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a prop's value looks like when it is more than one text or number: an object's fields, a list's items, the
|
|
3
|
+
* members of a mixed union. Read from the component's types (`vite/shapeDocs.ts`) or from a story's own arg, it drives
|
|
4
|
+
* the panel's nested fields, the check on a link's values, the worst case and what agents read of a prop.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* A shape is plain JSON, so it crosses from the plugin to the page and reaches an agent as it is. A value that fits a
|
|
8
|
+
* shape is plain JSON too, so a link can hold it. What JSON cannot hold (a component, a function, a date) is a `named`
|
|
9
|
+
* leaf: only one of the source's `namedValues` can stand for it. `json` is the way out for what cannot be drawn as
|
|
10
|
+
* fields: any JSON value, typed by hand. This module holds what the first screen needs of a shape; what reads a value
|
|
11
|
+
* against one is `shapeValues.ts`, which loads with the first prop that has a shape. Pure.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import type { ArgValue } from "./messages.ts";
|
|
16
|
+
import type { NamedValues } from "./namedValues.ts";
|
|
17
|
+
/** One field of an object's shape. */
|
|
18
|
+
export type ShapeField = {
|
|
19
|
+
/** The field's name. */
|
|
20
|
+
readonly name: string;
|
|
21
|
+
/** What it holds. */
|
|
22
|
+
readonly shape: ValueShape;
|
|
23
|
+
/** Whether a value must give it. */
|
|
24
|
+
readonly isRequired: boolean;
|
|
25
|
+
/** Whether it may hold `null`. Left out when not. */
|
|
26
|
+
readonly isNullable?: true;
|
|
27
|
+
/** The first paragraph of its TSDoc; left out when it has none. */
|
|
28
|
+
readonly description?: string;
|
|
29
|
+
};
|
|
30
|
+
/** What a value looks like. */
|
|
31
|
+
export type ValueShape = {
|
|
32
|
+
readonly kind: "text";
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: "number";
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: "boolean";
|
|
37
|
+
/** The one value it may hold, for one branch of a discriminated union. Left out when it takes both. */
|
|
38
|
+
readonly only?: boolean;
|
|
39
|
+
} | {
|
|
40
|
+
/** One of these values. */
|
|
41
|
+
readonly kind: "choice";
|
|
42
|
+
/** The values, in the order of the type. */
|
|
43
|
+
readonly values: readonly (string | number)[];
|
|
44
|
+
} | {
|
|
45
|
+
/** Any number of items of one shape. */
|
|
46
|
+
readonly kind: "list";
|
|
47
|
+
/** The items' shape. */
|
|
48
|
+
readonly of: ValueShape;
|
|
49
|
+
} | {
|
|
50
|
+
/** A fixed number of items, each of its own shape (`[number, number]`). */
|
|
51
|
+
readonly kind: "tuple";
|
|
52
|
+
/** Each item's shape, in order. */
|
|
53
|
+
readonly items: readonly ValueShape[];
|
|
54
|
+
} | {
|
|
55
|
+
/** Named fields. */
|
|
56
|
+
readonly kind: "object";
|
|
57
|
+
/** The fields, in the order of the source. */
|
|
58
|
+
readonly fields: readonly ShapeField[];
|
|
59
|
+
} | {
|
|
60
|
+
/** Any names, each holding one shape (`Record<string, number>`). */
|
|
61
|
+
readonly kind: "record";
|
|
62
|
+
/** The values' shape. */
|
|
63
|
+
readonly of: ValueShape;
|
|
64
|
+
} | {
|
|
65
|
+
/** One of several shapes, chosen first (`"sm" | number`). */
|
|
66
|
+
readonly kind: "union";
|
|
67
|
+
/** The shapes, in the order of the type. */
|
|
68
|
+
readonly of: readonly ValueShape[];
|
|
69
|
+
} | {
|
|
70
|
+
/** What JSON cannot hold: one of the source's named values, under the type as the source writes it. */
|
|
71
|
+
readonly kind: "named";
|
|
72
|
+
/** The type, as `namedValues` lists it (`IconComponent`). */
|
|
73
|
+
readonly type: string;
|
|
74
|
+
/** Whether a plain text can be given too (a node). Left out when not. */
|
|
75
|
+
readonly canTakeText?: true;
|
|
76
|
+
} | {
|
|
77
|
+
/** A moment: a `Date`, which the story receives as one (`DateArg`). */
|
|
78
|
+
readonly kind: "date";
|
|
79
|
+
} | {
|
|
80
|
+
/** Any JSON: what fields cannot show. */
|
|
81
|
+
readonly kind: "json";
|
|
82
|
+
} | {
|
|
83
|
+
/** What a story's own arg looks like, for an arg no type describes: read from it when it is needed. */
|
|
84
|
+
readonly kind: "like";
|
|
85
|
+
/** The story's own value. */
|
|
86
|
+
readonly value: ArgValue;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Whether the panel can give a shape a value at all: a required part the source names no value for leaves it no way.
|
|
90
|
+
*
|
|
91
|
+
* @param shape - the shape.
|
|
92
|
+
* @param namedValues - the source's named values.
|
|
93
|
+
*/
|
|
94
|
+
export declare const canSetShape: (shape: ValueShape, namedValues: NamedValues) => boolean;
|