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,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The edges of the import graph: what a module takes from the package's own modules, what a style sheet or a single-file
|
|
3
|
+
* component names in its text.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* An import counts for the file that declares each name it takes, not for the module it is written against: a barrel
|
|
7
|
+
* lists every component, so following it would make a story of one component reach all of them, and a new component
|
|
8
|
+
* would look verified for being exported. A name only an ambient declaration knows (a `.vue` shim) counts for the file its
|
|
9
|
+
* last re-export names, and a name from a dependency for nothing. A barrel is followed only for a namespace import or a
|
|
10
|
+
* side effect, and what it imports for its side effects (a global sheet) still runs when a name is taken through it. A
|
|
11
|
+
* module's own `export … from` stays an edge, for those cases. A relative import that resolves to nothing is kept as an edge to where it points: the file may
|
|
12
|
+
* have just been deleted, and the stories behind the edge are the ones that break. TypeScript does not resolve a style
|
|
13
|
+
* sheet or a single-file component, so their names are read from the text; an Angular component's `templateUrl` and
|
|
14
|
+
* `styleUrls` are found the same way.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import ts from "typescript-6";
|
|
19
|
+
import { assetImports, sheetImports } from "./textImports.js";
|
|
20
|
+
import { VITE_PATHS } from "./vitePaths.js";
|
|
21
|
+
/** A dynamic import of a path written out: a lazy component is drawn as any other. */
|
|
22
|
+
const DYNAMIC_IMPORT = /\bimport\(\s*["'`]([^"'`\n$]+)["'`]\s*\)/g;
|
|
23
|
+
/** A static import in the script of a single-file component, whose text no program holds. */
|
|
24
|
+
const STATIC_IMPORT = /^[ \t]*(?:import|export)\s+(?:[^"';]{0,2000}?\sfrom\s+)?["']([^"']+)["']/gm;
|
|
25
|
+
/** A file whose imports are read from its text. */
|
|
26
|
+
const SINGLE_FILE_COMPONENT = /\.(?:vue|svelte|astro)$/;
|
|
27
|
+
/** A style sheet. */
|
|
28
|
+
const STYLE_SHEET = /\.(?:css|scss|sass|less)$/;
|
|
29
|
+
/** The file system as each resolution cache's resolutions read it, remembered for the cache's life. */
|
|
30
|
+
const HOSTS = new WeakMap();
|
|
31
|
+
/**
|
|
32
|
+
* The file system a resolution reads, with what it asked remembered as long as its cache lives: resolving every import
|
|
33
|
+
* of a library asks again and again whether the same candidate files and folders exist, each time a call to the disk.
|
|
34
|
+
*
|
|
35
|
+
* @param cache - the resolution cache, made for one graph.
|
|
36
|
+
*/
|
|
37
|
+
const hostOf = (cache) => {
|
|
38
|
+
const known = HOSTS.get(cache);
|
|
39
|
+
if (known !== undefined)
|
|
40
|
+
return known;
|
|
41
|
+
const remembered = (read) => {
|
|
42
|
+
const answers = new Map();
|
|
43
|
+
return (path) => {
|
|
44
|
+
const answer = answers.get(path) ?? { value: read(path) };
|
|
45
|
+
answers.set(path, answer);
|
|
46
|
+
return answer.value;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
const host = {
|
|
50
|
+
fileExists: remembered((path) => ts.sys.fileExists(path)),
|
|
51
|
+
readFile: remembered((path) => ts.sys.readFile(path)),
|
|
52
|
+
directoryExists: remembered((path) => ts.sys.directoryExists(path)),
|
|
53
|
+
realpath: remembered((path) => (ts.sys.realpath === undefined ? path : ts.sys.realpath(path))),
|
|
54
|
+
getCurrentDirectory: () => ts.sys.getCurrentDirectory(),
|
|
55
|
+
getDirectories: (path) => ts.sys.getDirectories(path)
|
|
56
|
+
};
|
|
57
|
+
HOSTS.set(cache, host);
|
|
58
|
+
return host;
|
|
59
|
+
};
|
|
60
|
+
/** Resolves a specifier as a program does, leaving out a dependency's files. */
|
|
61
|
+
const resolverOf = (program, cache) => {
|
|
62
|
+
return (specifier, containing) => {
|
|
63
|
+
const resolved = ts.resolveModuleName(specifier, containing, program.getCompilerOptions(), hostOf(cache), cache).resolvedModule;
|
|
64
|
+
return resolved === undefined || resolved.isExternalLibraryImport ? undefined : resolved.resolvedFileName;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
/** Where a path alias of the program's configuration sends a name TypeScript cannot resolve: a sheet, a `.vue` file. */
|
|
68
|
+
const aliased = (specifier, options) => {
|
|
69
|
+
const configFile = options["configFilePath"];
|
|
70
|
+
const base = options.baseUrl ?? (typeof configFile === "string" ? VITE_PATHS.dirname(configFile) : undefined);
|
|
71
|
+
if (base === undefined)
|
|
72
|
+
return undefined;
|
|
73
|
+
for (const [pattern, targets] of Object.entries(options.paths ?? {})) {
|
|
74
|
+
const [prefix = "", suffix] = pattern.split("*");
|
|
75
|
+
const [target] = targets;
|
|
76
|
+
if (target === undefined || suffix === undefined)
|
|
77
|
+
continue;
|
|
78
|
+
if (specifier.startsWith(prefix) && specifier.endsWith(suffix))
|
|
79
|
+
return VITE_PATHS.resolve(base, target.split("*").join(specifier.slice(prefix.length, specifier.length - suffix.length)));
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
};
|
|
83
|
+
/** A specifier that resolves to nothing, as a path: where an alias sends it, or where a relative one points. */
|
|
84
|
+
const unresolvedTarget = (specifier, file, options) => {
|
|
85
|
+
const name = specifier.split("?")[0] ?? specifier;
|
|
86
|
+
if (name.startsWith("."))
|
|
87
|
+
return VITE_PATHS.join(VITE_PATHS.dirname(file), name);
|
|
88
|
+
return aliased(name, options);
|
|
89
|
+
};
|
|
90
|
+
/** The specifiers matched in a text, resolved; a relative one that resolves to nothing kept as where it points. */
|
|
91
|
+
const specifierTargets = (file, text, pattern, program, cache) => [...text.matchAll(pattern)].flatMap((match) => {
|
|
92
|
+
const specifier = match[1] ?? "";
|
|
93
|
+
const resolved = program === undefined || cache === undefined ? undefined : resolverOf(program, cache)(specifier, file);
|
|
94
|
+
if (resolved !== undefined)
|
|
95
|
+
return [resolved];
|
|
96
|
+
return [unresolvedTarget(specifier, file, program?.getCompilerOptions() ?? {}) ?? []].flat();
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* The edges of a file no program holds, read from its text; a file that cannot be read has none.
|
|
100
|
+
*
|
|
101
|
+
* @param file - the file, absolute.
|
|
102
|
+
* @param program - a program whose rules resolve its imports.
|
|
103
|
+
* @param cache - that program's resolution cache.
|
|
104
|
+
*/
|
|
105
|
+
export const textImportsOf = (file, program, cache) => {
|
|
106
|
+
const text = ts.sys.readFile(file);
|
|
107
|
+
if (text === undefined)
|
|
108
|
+
return [];
|
|
109
|
+
if (STYLE_SHEET.test(file))
|
|
110
|
+
return sheetImports(file, text);
|
|
111
|
+
if (!SINGLE_FILE_COMPONENT.test(file))
|
|
112
|
+
return [];
|
|
113
|
+
return [
|
|
114
|
+
...new Set([
|
|
115
|
+
...assetImports(file, text),
|
|
116
|
+
...specifierTargets(file, text, STATIC_IMPORT, program, cache),
|
|
117
|
+
...specifierTargets(file, text, DYNAMIC_IMPORT, program, cache)
|
|
118
|
+
])
|
|
119
|
+
];
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Whether an import or an export takes types only (`import type`, `export type`, `import { type A }`).
|
|
123
|
+
*
|
|
124
|
+
* @param statement - the statement.
|
|
125
|
+
*/
|
|
126
|
+
const isTypeOnly = (statement) => {
|
|
127
|
+
if (ts.isExportDeclaration(statement))
|
|
128
|
+
return statement.isTypeOnly;
|
|
129
|
+
if (!ts.isImportDeclaration(statement))
|
|
130
|
+
return false;
|
|
131
|
+
const clause = statement.importClause;
|
|
132
|
+
if (clause === undefined)
|
|
133
|
+
return false;
|
|
134
|
+
if (clause.isTypeOnly)
|
|
135
|
+
return true;
|
|
136
|
+
// `import { type A, type B }`: every name a type, and no default
|
|
137
|
+
const bindings = clause.namedBindings;
|
|
138
|
+
return (clause.name === undefined &&
|
|
139
|
+
bindings !== undefined &&
|
|
140
|
+
ts.isNamedImports(bindings) &&
|
|
141
|
+
bindings.elements.length > 0 &&
|
|
142
|
+
bindings.elements.every((element) => element.isTypeOnly));
|
|
143
|
+
};
|
|
144
|
+
/** The import or export statement a declaration of a name belongs to, with its module's name. */
|
|
145
|
+
const moduleOfDeclaration = (declaration) => {
|
|
146
|
+
let node = declaration;
|
|
147
|
+
while (node !== undefined && !ts.isSourceFile(node)) {
|
|
148
|
+
if ((ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) &&
|
|
149
|
+
node.moduleSpecifier !== undefined &&
|
|
150
|
+
ts.isStringLiteral(node.moduleSpecifier))
|
|
151
|
+
return node.moduleSpecifier;
|
|
152
|
+
node = node.parent;
|
|
153
|
+
}
|
|
154
|
+
return undefined;
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* The file an ambiently declared name comes from: the module named by the last import or re-export on its way, which is
|
|
158
|
+
* the only place that says which `.vue` file it is.
|
|
159
|
+
*
|
|
160
|
+
* @param name - the imported name.
|
|
161
|
+
* @param checker - its program's checker.
|
|
162
|
+
* @param options - its program's options.
|
|
163
|
+
*/
|
|
164
|
+
const ambientOrigin = (name, checker, options) => {
|
|
165
|
+
let symbol = checker.getSymbolAtLocation(name);
|
|
166
|
+
let origin;
|
|
167
|
+
while (symbol !== undefined && (symbol.flags & ts.SymbolFlags.Alias) !== 0) {
|
|
168
|
+
const literal = moduleOfDeclaration(symbol.declarations?.[0]);
|
|
169
|
+
if (literal !== undefined)
|
|
170
|
+
origin = unresolvedTarget(literal.text, literal.getSourceFile().fileName, options) ?? origin;
|
|
171
|
+
symbol = checker.getImmediateAliasedSymbol(symbol);
|
|
172
|
+
}
|
|
173
|
+
return origin;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Where an imported name comes from: the file that declares it, nothing for a dependency's, or none when it cannot be told.
|
|
177
|
+
*
|
|
178
|
+
* @param name - the imported name.
|
|
179
|
+
* @param program - its program.
|
|
180
|
+
*/
|
|
181
|
+
const nameOrigin = (name, program) => {
|
|
182
|
+
const checker = program.getTypeChecker();
|
|
183
|
+
const symbol = checker.getSymbolAtLocation(name);
|
|
184
|
+
const target = symbol !== undefined && (symbol.flags & ts.SymbolFlags.Alias) !== 0
|
|
185
|
+
? checker.getAliasedSymbol(symbol)
|
|
186
|
+
: symbol;
|
|
187
|
+
const declaring = target?.declarations?.[0]?.getSourceFile();
|
|
188
|
+
if (declaring !== undefined && program.isSourceFileFromExternalLibrary(declaring))
|
|
189
|
+
return null;
|
|
190
|
+
if (declaring !== undefined && !declaring.isDeclarationFile)
|
|
191
|
+
return declaring.fileName;
|
|
192
|
+
return ambientOrigin(name, checker, program.getCompilerOptions());
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* The files that declare the names an import takes, or none when that cannot be told: a side effect, a namespace, a name
|
|
196
|
+
* with no known origin.
|
|
197
|
+
*
|
|
198
|
+
* @param statement - the import.
|
|
199
|
+
* @param program - its program.
|
|
200
|
+
*/
|
|
201
|
+
const declaringFiles = (statement, program) => {
|
|
202
|
+
if (!ts.isImportDeclaration(statement))
|
|
203
|
+
return undefined;
|
|
204
|
+
const clause = statement.importClause;
|
|
205
|
+
const bindings = clause?.namedBindings;
|
|
206
|
+
if (clause === undefined || (bindings !== undefined && ts.isNamespaceImport(bindings)))
|
|
207
|
+
return undefined;
|
|
208
|
+
const names = [
|
|
209
|
+
...(clause.name === undefined ? [] : [clause.name]),
|
|
210
|
+
...(bindings === undefined || !ts.isNamedImports(bindings)
|
|
211
|
+
? []
|
|
212
|
+
: bindings.elements.filter((element) => !element.isTypeOnly).map((element) => element.name))
|
|
213
|
+
];
|
|
214
|
+
const found = names.map((name) => nameOrigin(name, program));
|
|
215
|
+
return found.includes(undefined) ? undefined : found.flatMap((file) => file ?? []);
|
|
216
|
+
};
|
|
217
|
+
/** The module a statement names, when it is an import or a re-export that takes more than types. */
|
|
218
|
+
const moduleNamed = (statement) => {
|
|
219
|
+
if (!ts.isImportDeclaration(statement) && !ts.isExportDeclaration(statement))
|
|
220
|
+
return undefined;
|
|
221
|
+
const literal = statement.moduleSpecifier;
|
|
222
|
+
// a type renders nothing: a file that only takes types from another does not use its components
|
|
223
|
+
if (literal === undefined || !ts.isStringLiteral(literal) || isTypeOnly(statement))
|
|
224
|
+
return undefined;
|
|
225
|
+
return literal.text;
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* What a module imports for its side effects alone: it runs whichever name is taken through it.
|
|
229
|
+
*
|
|
230
|
+
* @param file - the module, absolute.
|
|
231
|
+
* @param reading - its program.
|
|
232
|
+
*/
|
|
233
|
+
const sideEffectTargets = (file, { program, cache }) => {
|
|
234
|
+
const source = program.getSourceFile(file);
|
|
235
|
+
if (source === undefined)
|
|
236
|
+
return [];
|
|
237
|
+
return source.statements.flatMap((statement) => ts.isImportDeclaration(statement) && statement.importClause === undefined
|
|
238
|
+
? statementTargets(statement, { source, program, cache })
|
|
239
|
+
: []);
|
|
240
|
+
};
|
|
241
|
+
/**
|
|
242
|
+
* The files a statement of a module takes.
|
|
243
|
+
*
|
|
244
|
+
* @param statement - the statement.
|
|
245
|
+
* @param reading - its module and program.
|
|
246
|
+
*/
|
|
247
|
+
const statementTargets = (statement, reading) => {
|
|
248
|
+
const { source, program, cache } = reading;
|
|
249
|
+
const specifier = moduleNamed(statement);
|
|
250
|
+
if (specifier === undefined)
|
|
251
|
+
return [];
|
|
252
|
+
const options = program.getCompilerOptions();
|
|
253
|
+
const resolved = ts.resolveModuleName(specifier, source.fileName, options, hostOf(cache), cache).resolvedModule;
|
|
254
|
+
if (resolved === undefined)
|
|
255
|
+
return [unresolvedTarget(specifier, source.fileName, options) ?? []].flat();
|
|
256
|
+
if (resolved.isExternalLibraryImport)
|
|
257
|
+
return [];
|
|
258
|
+
const declaring = declaringFiles(statement, program);
|
|
259
|
+
if (declaring === undefined)
|
|
260
|
+
return [resolved.resolvedFileName];
|
|
261
|
+
const through = declaring.includes(resolved.resolvedFileName)
|
|
262
|
+
? []
|
|
263
|
+
: sideEffectTargets(resolved.resolvedFileName, reading);
|
|
264
|
+
return [...declaring, ...through];
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* The package's own modules a module imports or re-exports from, resolved as its program resolves them, with the assets
|
|
268
|
+
* and lazy modules its text names.
|
|
269
|
+
*
|
|
270
|
+
* @param source - the module.
|
|
271
|
+
* @param program - its program.
|
|
272
|
+
* @param cache - the program's resolution cache.
|
|
273
|
+
*/
|
|
274
|
+
export const importsOf = (source, program, cache) => [
|
|
275
|
+
...new Set([
|
|
276
|
+
...source.statements.flatMap((statement) => statementTargets(statement, { source, program, cache })),
|
|
277
|
+
...assetImports(source.fileName, source.text),
|
|
278
|
+
...specifierTargets(source.fileName, source.text, DYNAMIC_IMPORT, program, cache)
|
|
279
|
+
])
|
|
280
|
+
];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type AgentAnswer, type RouteContext } from "./agentRoutes.ts";
|
|
2
|
+
import { type PublishedFile } from "./publishedExports.ts";
|
|
3
|
+
/**
|
|
4
|
+
* The published files a change holds to the check: those it edits, and those it starts publishing or names anew.
|
|
5
|
+
*
|
|
6
|
+
* @param now - what is published now.
|
|
7
|
+
* @param changed - the files it changes, in the catalogue's form.
|
|
8
|
+
* @param readBefore - what the change's start published; read only when an entry or a barrel changed.
|
|
9
|
+
*/
|
|
10
|
+
export declare const filesOfChange: (now: readonly PublishedFile[], changed: readonly string[], readBefore: () => Promise<readonly PublishedFile[]>) => Promise<readonly PublishedFile[]>;
|
|
11
|
+
/**
|
|
12
|
+
* What agents cannot see.
|
|
13
|
+
*
|
|
14
|
+
* @param context - what the routes read.
|
|
15
|
+
*/
|
|
16
|
+
export declare const visibilityAnswer: (context: RouteContext) => Promise<AgentAnswer>;
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The answer to `visibility`: the published components of the repository's packages an agent cannot see, every one, or
|
|
3
|
+
* with `since` those a change touches or newly publishes.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* The change is held to it, and not the whole repository: a project adopting the gate would otherwise fail on all it has,
|
|
7
|
+
* and turn it off. A name a barrel starts exporting counts as a change of that component, though its own file did not
|
|
8
|
+
* move, since that is the moment it reaches everyone. What cannot be told is said, and never reads as nothing unseen: with
|
|
9
|
+
* no import graph every component would look storyless, so none is judged.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { execFileSync } from "node:child_process";
|
|
14
|
+
import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
15
|
+
import { realpath } from "node:fs/promises";
|
|
16
|
+
import { offersUsedIn, readsComponentDocs } from "../catalogue.js";
|
|
17
|
+
import { isComponentDocs } from "../componentDocs.js";
|
|
18
|
+
import { printable } from "../printable.js";
|
|
19
|
+
import { sourceFiles } from "../sourceFiles.js";
|
|
20
|
+
import { settled } from "./agentRoutes.js";
|
|
21
|
+
import { unseenComponent } from "./agentVisibility.js";
|
|
22
|
+
import { belongsToOtherCatalogue } from "./changeCoverage.js";
|
|
23
|
+
import { identifiedStories } from "./changedRoute.js";
|
|
24
|
+
import { findConfigFile } from "./configFile.js";
|
|
25
|
+
import { catalogueChangedFiles, changeBase, changedFiles, gitOutput, noBaseReason } from "./gitChange.js";
|
|
26
|
+
import { isPublished, packageEntries } from "./packageEntries.js";
|
|
27
|
+
import { publishedComponents } from "./publishedExports.js";
|
|
28
|
+
import { VITE_PATHS } from "./vitePaths.js";
|
|
29
|
+
/** The extensions an import may leave out, in the order a bundler tries them. */
|
|
30
|
+
const RESOLVED_EXTENSIONS = [".ts", ".tsx", ".mts", ".js", ".jsx", ".mjs", ".vue", ".svelte"];
|
|
31
|
+
/** A package that is a project's sample, published or not: nobody looks for its components. */
|
|
32
|
+
const NOT_A_LIBRARY = /(?:^|\/)(?:examples?|fixtures?|__fixtures__|e2e|tests?|__tests__|templates?|docs?)\//;
|
|
33
|
+
/** The largest file read: a generated bundle says nothing here, and a hostile one must not hold the server. */
|
|
34
|
+
const MAX_FILE_BYTES = 2 * 1024 * 1024;
|
|
35
|
+
/** The most files a pattern's folder is walked for. */
|
|
36
|
+
const MAX_WALKED = 20_000;
|
|
37
|
+
/** A folder's entries; none when it cannot be read. */
|
|
38
|
+
const entriesOf = (folder) => {
|
|
39
|
+
try {
|
|
40
|
+
return readdirSync(folder, { withFileTypes: true });
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Every file under a folder, walked by hand: a recursive listing follows links in circles and goes through `node_modules`.
|
|
48
|
+
*
|
|
49
|
+
* @param folder - the folder.
|
|
50
|
+
*/
|
|
51
|
+
const filesUnder = (folder) => {
|
|
52
|
+
const files = [];
|
|
53
|
+
const pending = [folder];
|
|
54
|
+
while (pending.length > 0 && files.length < MAX_WALKED) {
|
|
55
|
+
const current = pending.pop() ?? "";
|
|
56
|
+
for (const entry of entriesOf(current)) {
|
|
57
|
+
const path = VITE_PATHS.join(current, entry.name);
|
|
58
|
+
const isWalked = entry.isDirectory() && entry.name !== "node_modules" && !entry.name.startsWith(".");
|
|
59
|
+
if (entry.isFile())
|
|
60
|
+
files.push(path);
|
|
61
|
+
else if (isWalked)
|
|
62
|
+
pending.push(path);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return files;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* A file's text, and nothing outside the repository: a manifest or an import names what the branch likes, and a link may
|
|
69
|
+
* lead anywhere, so only a regular file under the repository's real folder is read.
|
|
70
|
+
*
|
|
71
|
+
* @param root - the repository's real folder.
|
|
72
|
+
* @param file - the file.
|
|
73
|
+
*/
|
|
74
|
+
const textIn = (root, file) => {
|
|
75
|
+
try {
|
|
76
|
+
const real = VITE_PATHS.normalize(realpathSync(file));
|
|
77
|
+
if (!real.startsWith(`${root}/`))
|
|
78
|
+
return undefined;
|
|
79
|
+
const stats = statSync(real);
|
|
80
|
+
return stats.isFile() && stats.size <= MAX_FILE_BYTES ? readFileSync(real, "utf8") : undefined;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* What the readers ask of a tree of files: the working tree's, or a commit's.
|
|
88
|
+
*
|
|
89
|
+
* @param exists - whether a file is there.
|
|
90
|
+
* @param readText - its text.
|
|
91
|
+
*/
|
|
92
|
+
const exportsDisk = (exists, readText, onAlias) => ({
|
|
93
|
+
readText,
|
|
94
|
+
onAlias,
|
|
95
|
+
resolve: (specifier, from) => {
|
|
96
|
+
const bare = VITE_PATHS.join(VITE_PATHS.dirname(from), specifier);
|
|
97
|
+
const written = bare.replace(/\.[cm]?jsx?$/, "");
|
|
98
|
+
if (/\.(?:[cm]?tsx?|jsx|vue|svelte)$/.test(bare) && exists(bare))
|
|
99
|
+
return bare;
|
|
100
|
+
for (const form of [written, `${written}/index`]) {
|
|
101
|
+
for (const extension of RESOLVED_EXTENSIONS) {
|
|
102
|
+
if (exists(`${form}${extension}`))
|
|
103
|
+
return `${form}${extension}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return exists(bare) ? bare : undefined;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
/** A manifest's value, or why it cannot be read. */
|
|
110
|
+
const manifestOf = (text) => {
|
|
111
|
+
try {
|
|
112
|
+
return { value: JSON.parse(text ?? "null") };
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* What the packages publish.
|
|
120
|
+
*
|
|
121
|
+
* @param manifests - the packages' manifests, in the catalogue's form of their paths.
|
|
122
|
+
* @param exists - whether a file is there.
|
|
123
|
+
* @param readText - its text.
|
|
124
|
+
* @param listFiles - every file under a folder.
|
|
125
|
+
*/
|
|
126
|
+
const publishedIn = (manifests, exists, readText, listFiles) => {
|
|
127
|
+
const packages = [];
|
|
128
|
+
const files = [];
|
|
129
|
+
const seen = new Set();
|
|
130
|
+
const unread = [];
|
|
131
|
+
for (const file of manifests) {
|
|
132
|
+
const dir = VITE_PATHS.dirname(file);
|
|
133
|
+
const read = manifestOf(readText(file));
|
|
134
|
+
if ("error" in read) {
|
|
135
|
+
unread.push({ dir, text: `a manifest that cannot be read: ${read.error}` });
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const manifest = read.value;
|
|
139
|
+
if (!isPublished(manifest))
|
|
140
|
+
continue;
|
|
141
|
+
const found = packageEntries(manifest, dir, { exists, filesUnder: listFiles });
|
|
142
|
+
const name = typeof manifest === "object" && manifest !== null && "name" in manifest ? String(manifest.name) : dir;
|
|
143
|
+
const aliases = new Set();
|
|
144
|
+
const own = publishedComponents(found.entries, exportsDisk(exists, readText, (specifier) => aliases.add(specifier)));
|
|
145
|
+
if (own.length > 0)
|
|
146
|
+
packages.push(name);
|
|
147
|
+
files.push(...own.filter((each) => !seen.has(each.file)));
|
|
148
|
+
for (const each of own)
|
|
149
|
+
seen.add(each.file);
|
|
150
|
+
unread.push(...found.unread.map((path) => ({
|
|
151
|
+
dir,
|
|
152
|
+
text: `a published entry not led back to its source: ${name}: ${path}`
|
|
153
|
+
})), ...[...aliases].map((alias) => ({
|
|
154
|
+
dir,
|
|
155
|
+
text: `a published export through an alias not followed: ${name}: ${alias}`
|
|
156
|
+
})));
|
|
157
|
+
}
|
|
158
|
+
return { packages, files, unread };
|
|
159
|
+
};
|
|
160
|
+
/** The manifests git lists, a new package's among them: the change may be what adds it. */
|
|
161
|
+
const manifestsOf = async (dir, realDir, root) => {
|
|
162
|
+
const names = (await gitOutput(root, "ls-files", "-z", "--cached", "--others", "--exclude-standard", "--", "package.json", "*/package.json"))
|
|
163
|
+
.split("\0")
|
|
164
|
+
.filter((name) => name !== "" && !NOT_A_LIBRARY.test(name));
|
|
165
|
+
return catalogueChangedFiles(dir, realDir, root, names);
|
|
166
|
+
};
|
|
167
|
+
/** Each component of a tree. */
|
|
168
|
+
const treeComponents = (tree) => tree.sources.flatMap((source) => source.families.flatMap((family) => family.groups.flatMap((group) => group.components.map((component) => ({ source: source.id, component })))));
|
|
169
|
+
/** A source's component as the check reads it, with its docs. */
|
|
170
|
+
const seenComponent = async ({ loaded }, readStory, source, component, reach) => {
|
|
171
|
+
const own = reach.filter((each) => each.title === component.title);
|
|
172
|
+
const loadedSource = loaded.sources.find((each) => each.id === source);
|
|
173
|
+
const files = loadedSource === undefined ? undefined : sourceFiles(loadedSource);
|
|
174
|
+
const docs = await settled(files?.docs[component.file]);
|
|
175
|
+
const value = "value" in docs && isComponentDocs(docs.value) ? docs.value : undefined;
|
|
176
|
+
return {
|
|
177
|
+
title: component.title,
|
|
178
|
+
storyFile: component.file,
|
|
179
|
+
words: [...component.stories.map((each) => each.name), ...component.keywords],
|
|
180
|
+
listed: component.stories.length,
|
|
181
|
+
unlisted: component.unlisted.length,
|
|
182
|
+
metaFile: own.find((each) => each.metaFile !== undefined)?.metaFile,
|
|
183
|
+
reached: [...new Set(own.flatMap((each) => each.files))],
|
|
184
|
+
storyText: [...new Set(own.map((each) => each.storyFile))]
|
|
185
|
+
.map((file) => readStory(file) ?? "")
|
|
186
|
+
.join("\n"),
|
|
187
|
+
docs: value === undefined
|
|
188
|
+
? undefined
|
|
189
|
+
: {
|
|
190
|
+
props: value.props.length,
|
|
191
|
+
hasText: value.description !== "" || value.summary !== "",
|
|
192
|
+
subcomponents: value.subcomponents.map((each) => each.name)
|
|
193
|
+
},
|
|
194
|
+
description: files?.index[component.file]?.description
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
/** What a commit published, read with git and nothing of the working tree. */
|
|
198
|
+
const publishedAt = async (dir, root, base, manifests) => {
|
|
199
|
+
const paths = new Set((await gitOutput(root, "ls-tree", "-r", "-z", "--name-only", base))
|
|
200
|
+
.split("\0")
|
|
201
|
+
.map((name) => VITE_PATHS.join(root, name)));
|
|
202
|
+
const inRoot = (file) => VITE_PATHS.join(root, VITE_PATHS.relative(dir, file));
|
|
203
|
+
const fromRoot = (file) => VITE_PATHS.join(dir, VITE_PATHS.relative(root, file));
|
|
204
|
+
const tree = publishedIn(manifests.map(inRoot).filter((file) => paths.has(file)), (file) => paths.has(file), (file) => {
|
|
205
|
+
if (!paths.has(file))
|
|
206
|
+
return undefined;
|
|
207
|
+
return execFileSync("git", ["show", `${base}:${VITE_PATHS.relative(root, file)}`], {
|
|
208
|
+
cwd: root,
|
|
209
|
+
encoding: "utf8",
|
|
210
|
+
maxBuffer: 16 * 1024 * 1024
|
|
211
|
+
});
|
|
212
|
+
}, (folder) => [...paths].filter((file) => file.startsWith(`${folder}/`)));
|
|
213
|
+
return { ...tree, files: tree.files.map((each) => ({ ...each, file: fromRoot(each.file) })) };
|
|
214
|
+
};
|
|
215
|
+
/** A story file. */
|
|
216
|
+
const STORY_FILE = /\.stories\.[^/]+$/;
|
|
217
|
+
/** A name with what does not change its reading taken off. */
|
|
218
|
+
const plainWord = (name) => name.replace(/[^A-Za-z0-9]/g, "").toLowerCase();
|
|
219
|
+
/** What a file is named after: itself, or its folder for an index. */
|
|
220
|
+
const namedAfter = (file) => {
|
|
221
|
+
const parts = file.split("/");
|
|
222
|
+
const name = (parts.at(-1) ?? "").replace(/\.[^.]+$/, "");
|
|
223
|
+
return name === "index" ? (parts.at(-2) ?? name) : name;
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* What a story file may be about, in plain words: its own name, and its folder's, past a folder only for stories
|
|
227
|
+
* (`Box/stories/Simple.stories.js` is about `Box`).
|
|
228
|
+
*/
|
|
229
|
+
const storyFileNames = (file) => {
|
|
230
|
+
const parts = file.split("/").slice(0, -1);
|
|
231
|
+
const folders = parts.filter((part) => !/^_*stories_*$/.test(part)).slice(-1);
|
|
232
|
+
const name = (file.split("/").at(-1) ?? "").replace(/\.stories\.[^/]+$/, "");
|
|
233
|
+
return [name, ...folders].map(plainWord);
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* The published files a change holds to the check: those it edits, and those it starts publishing or names anew.
|
|
237
|
+
*
|
|
238
|
+
* @param now - what is published now.
|
|
239
|
+
* @param changed - the files it changes, in the catalogue's form.
|
|
240
|
+
* @param readBefore - what the change's start published; read only when an entry or a barrel changed.
|
|
241
|
+
*/
|
|
242
|
+
export const filesOfChange = async (now, changed, readBefore) => {
|
|
243
|
+
const moved = new Set(changed);
|
|
244
|
+
// losing a story, its listing or its meta's component hides a component whose own file did not move
|
|
245
|
+
const stories = changed.filter((file) => STORY_FILE.test(file)).flatMap(storyFileNames);
|
|
246
|
+
const edited = now.filter(({ file, names }) => moved.has(file) || [...names, namedAfter(file)].some((name) => stories.includes(plainWord(name))));
|
|
247
|
+
// a change touching only components cannot have published anything new, and a commit's tree costs a git call per file
|
|
248
|
+
if (changed.every((file) => STORY_FILE.test(file) || now.some((each) => each.file === file)))
|
|
249
|
+
return edited;
|
|
250
|
+
const before = new Map((await readBefore()).map((each) => [each.file, new Set(each.names)]));
|
|
251
|
+
const named = now.filter((each) => {
|
|
252
|
+
const known = before.get(each.file);
|
|
253
|
+
return !edited.includes(each) && each.names.some((name) => known?.has(name) !== true);
|
|
254
|
+
});
|
|
255
|
+
return [...edited, ...named];
|
|
256
|
+
};
|
|
257
|
+
/**
|
|
258
|
+
* What agents cannot see.
|
|
259
|
+
*
|
|
260
|
+
* @param context - what the routes read.
|
|
261
|
+
*/
|
|
262
|
+
export const visibilityAnswer = async (context) => {
|
|
263
|
+
const { config, loaded, tree, params } = context;
|
|
264
|
+
const since = params.get("since") || undefined;
|
|
265
|
+
const base = since === undefined ? undefined : await changeBase(config.dir, since);
|
|
266
|
+
if (since !== undefined && base === undefined)
|
|
267
|
+
return { status: 400, body: { error: await noBaseReason(config.dir, since) } };
|
|
268
|
+
const answerOf = (packages, unseen, checked, skipped) => {
|
|
269
|
+
const body = {
|
|
270
|
+
schema: 1,
|
|
271
|
+
...(since === undefined ? {} : { since }),
|
|
272
|
+
packages,
|
|
273
|
+
checked,
|
|
274
|
+
unseen,
|
|
275
|
+
// a branch writes these: what reaches an agent or a terminal holds no control character
|
|
276
|
+
skipped: skipped.map(printable)
|
|
277
|
+
};
|
|
278
|
+
return { status: 200, body };
|
|
279
|
+
};
|
|
280
|
+
const realDir = await realpath(config.dir);
|
|
281
|
+
const root = await gitOutput(config.dir, "rev-parse", "--show-toplevel").then((text) => text.trim(), () => undefined);
|
|
282
|
+
if (root === undefined)
|
|
283
|
+
return answerOf([], [], 0, ["what agents see not checked: this is not a git repository"]);
|
|
284
|
+
const rootInDir = VITE_PATHS.join(config.dir, VITE_PATHS.relative(realDir, root));
|
|
285
|
+
const manifests = await manifestsOf(config.dir, realDir, root);
|
|
286
|
+
const own = VITE_PATHS.normalize(config.dir);
|
|
287
|
+
const realRoot = VITE_PATHS.normalize(realpathSync(root));
|
|
288
|
+
const published = publishedIn(manifests.filter((file) => !belongsToOtherCatalogue(file, own, rootInDir, (folder) => findConfigFile(folder) !== undefined)), (file) => existsSync(file), (file) => textIn(realRoot, file), filesUnder);
|
|
289
|
+
const change = base === undefined ? undefined : await changedFiles(config.dir, base);
|
|
290
|
+
const changed = change === undefined ? [] : catalogueChangedFiles(config.dir, realDir, root, change.files);
|
|
291
|
+
// a package the change does not touch is no reason to call the change only partly verified
|
|
292
|
+
const unread = published.unread
|
|
293
|
+
.filter(({ dir }) => change === undefined || changed.some((file) => file.startsWith(`${dir}/`)))
|
|
294
|
+
.map(({ text }) => text);
|
|
295
|
+
if (!offersUsedIn(config.lists) || !readsComponentDocs(config.lists))
|
|
296
|
+
return answerOf(published.packages, [], 0, [
|
|
297
|
+
...unread,
|
|
298
|
+
"what agents see not checked: the catalogue turns off the component docs or Used in, which it reads"
|
|
299
|
+
]);
|
|
300
|
+
const relevant = change === undefined || base === undefined
|
|
301
|
+
? published.files
|
|
302
|
+
: await filesOfChange(published.files, changed, async () => (await publishedAt(rootInDir, root, base, manifests)).files);
|
|
303
|
+
if (relevant.length === 0)
|
|
304
|
+
return answerOf(published.packages, [], 0, unread);
|
|
305
|
+
const { groups, identified } = await identifiedStories(loaded, tree);
|
|
306
|
+
// with no graph every component would look storyless
|
|
307
|
+
if (groups.some(({ reach }) => typeof reach === "string"))
|
|
308
|
+
return answerOf(published.packages, [], 0, [
|
|
309
|
+
...unread,
|
|
310
|
+
"what agents see not checked: the stories' imports could not be read"
|
|
311
|
+
]);
|
|
312
|
+
const reach = identified.map((each) => each.reach);
|
|
313
|
+
const components = await Promise.all(treeComponents(tree).map(({ source, component }) => seenComponent(context, (file) => textIn(realRoot, file), source, component, reach)));
|
|
314
|
+
const unseen = relevant.flatMap((file) => {
|
|
315
|
+
const path = VITE_PATHS.relative(config.dir, file.file);
|
|
316
|
+
const found = unseenComponent(file, path, VITE_PATHS.relative(rootInDir, file.file), components);
|
|
317
|
+
return found === undefined ? [] : [found];
|
|
318
|
+
});
|
|
319
|
+
return answerOf(published.packages, unseen, relevant.length, unread);
|
|
320
|
+
};
|
package/dist/src/worstCase.d.ts
CHANGED
|
@@ -13,3 +13,5 @@ export declare const WORST_WORD = "Supercalifragilisticexpialidocious_with_no_pl
|
|
|
13
13
|
export declare const WORST_SCRIPTS = "\u00DCn\u00EFc\u00F6d\u00E9 \u540D\u524D \u0645\u0631\u062D\u0628\u0627 \uD83D\uDC69\uD83C\uDFFD\u200D\uD83D\uDCBB";
|
|
14
14
|
/** A number with more digits than a box usually holds. */
|
|
15
15
|
export declare const WORST_NUMBER = 123456789012;
|
|
16
|
+
/** The worst text: a long one, with a word that cannot break. */
|
|
17
|
+
export declare const WORST_ARG_TEXT = "A label long enough to wrap onto several lines in any box it is given, with words of every length in it Supercalifragilisticexpialidocious_with_no_place_to_break_it_at_all_1234567890";
|
package/dist/src/worstCase.js
CHANGED
|
@@ -13,3 +13,5 @@ export const WORST_WORD = "Supercalifragilisticexpialidocious_with_no_place_to_b
|
|
|
13
13
|
export const WORST_SCRIPTS = "Ünïcödé 名前 مرحبا 👩🏽💻";
|
|
14
14
|
/** A number with more digits than a box usually holds. */
|
|
15
15
|
export const WORST_NUMBER = 123_456_789_012;
|
|
16
|
+
/** The worst text: a long one, with a word that cannot break. */
|
|
17
|
+
export const WORST_ARG_TEXT = `${WORST_TEXT} ${WORST_WORD}`;
|