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,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a change adds against the components a project already has: imports of what is deprecated or replaced, and new
|
|
3
|
+
* components that look like one that exists. Props are left to the type checker, which catches them where this cannot.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Pure. It reads only what the change adds, as the rest of `check-code` does. A component's own words decide what is
|
|
7
|
+
* deprecated (`@deprecated`, `@replacedBy`). What fails has to be sure: a new exported component fails as a copy under any
|
|
8
|
+
* name, with the same name and two signs of being the same thing, or rebuilding a plain element a component of its name
|
|
9
|
+
* exists for. One sign is said as `advice`, as is what `@useWhen` and `@avoidWhen` say of a component just imported, since
|
|
10
|
+
* only a reader can weigh them. It compares only what the file could use: its package and those its package depends on.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import type { AddedLine, CodeAdvice, CodeProblem, ExcusedValue } from "./checkCode.ts";
|
|
15
|
+
import { type ScannedComponent } from "./componentScan.ts";
|
|
16
|
+
import type { ProjectFile, WorkspacePackage } from "./projectFiles.ts";
|
|
17
|
+
/** What the reuse check found. */
|
|
18
|
+
export type ReuseFindings = {
|
|
19
|
+
/** What fails. */
|
|
20
|
+
readonly problems: readonly CodeProblem[];
|
|
21
|
+
/** What to weigh. */
|
|
22
|
+
readonly advice: readonly CodeAdvice[];
|
|
23
|
+
/** New components a comment says are meant. */
|
|
24
|
+
readonly excused: readonly ExcusedValue[];
|
|
25
|
+
};
|
|
26
|
+
/** What the reuse check reads. */
|
|
27
|
+
export type ReuseInput = {
|
|
28
|
+
/** The lines the change adds, with paths from the repository. */
|
|
29
|
+
readonly added: readonly AddedLine[];
|
|
30
|
+
/** The changed files that can hold components, as they are now. */
|
|
31
|
+
readonly changed: readonly ProjectFile[];
|
|
32
|
+
/** The same as they were, and those the change deleted. */
|
|
33
|
+
readonly previous: readonly ProjectFile[];
|
|
34
|
+
/** Every component of the project as it is now. */
|
|
35
|
+
readonly components: readonly ScannedComponent[];
|
|
36
|
+
/** The repository's packages. */
|
|
37
|
+
readonly packages: readonly WorkspacePackage[];
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* What a change adds against the components the project has. New means new against the commit it starts from: an edit of a
|
|
41
|
+
* line that declares a component is no new component, nor is a file moved, nor a name a file already imported.
|
|
42
|
+
*
|
|
43
|
+
* @param input - the change and the project.
|
|
44
|
+
*/
|
|
45
|
+
export declare const reuseFindings: (input: ReuseInput) => ReuseFindings;
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { scannedComponents } from "./componentScan.js";
|
|
2
|
+
import { importsOfFile } from "./fileImports.js";
|
|
3
|
+
import { isBuiltOn, isRebuilt, isShareable, SAME_CODE, signsBetween, stemOf } from "./lookAlikes.js";
|
|
4
|
+
import { plainWords } from "./sourceText.js";
|
|
5
|
+
/** What says a new component is meant: its rule and why, in a comment. */
|
|
6
|
+
const IGNORE_DUPLICATE = /(?:\/\/|\/\*|<!--)\s*forgebook-ignore\s+duplicate-component\s*:\s*([^*\n]{3,120})/;
|
|
7
|
+
/** How far above a component its comment may stand, past its own documentation. */
|
|
8
|
+
const IGNORE_REACH = 20;
|
|
9
|
+
/** A name a fix may give: an agent may act on it, and a tag holds any text. */
|
|
10
|
+
const COMPONENT_NAME = /^[A-Za-z_$][\w$.]{0,80}$/;
|
|
11
|
+
/** How many things to weigh an answer gives. */
|
|
12
|
+
const MOST_ADVICE = 20;
|
|
13
|
+
/** How much of a tag's text an answer repeats. */
|
|
14
|
+
const LONGEST_WORDS = 200;
|
|
15
|
+
/** What a package name's module part is. */
|
|
16
|
+
const PACKAGE_NAME = /^(@[^/]+\/[^/]+|[^@./][^/]*)(?:\/(.*))?$/;
|
|
17
|
+
/** A file's extension and a folder's index, which an import may leave out or write. */
|
|
18
|
+
const modulePath = (file) => file.replace(/\.(?:[cm]?[jt]sx?|vue|svelte|astro)$/, "").replace(/\/index$/, "");
|
|
19
|
+
/** A relative module's path from the repository. */
|
|
20
|
+
const relativeTarget = (from, module) => {
|
|
21
|
+
const parts = from.split("/").slice(0, -1);
|
|
22
|
+
for (const part of module.split("/")) {
|
|
23
|
+
if (part === "..")
|
|
24
|
+
parts.pop();
|
|
25
|
+
else if (part !== ".")
|
|
26
|
+
parts.push(part);
|
|
27
|
+
}
|
|
28
|
+
return parts.join("/");
|
|
29
|
+
};
|
|
30
|
+
/** The folders of a file, nearest first, the repository last. */
|
|
31
|
+
const foldersOf = (file) => {
|
|
32
|
+
const parts = file.split("/").slice(0, -1);
|
|
33
|
+
return [...parts.keys(), parts.length].map((count) => parts.slice(0, count).join("/")).toReversed();
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* What an import may mean in the project's paths. An alias's folder is not known, but it is one this file sits under, so
|
|
37
|
+
* another application's file of that path is not it; a package's name is the one its manifest says, so a third party's of
|
|
38
|
+
* a similar path is not it either.
|
|
39
|
+
*/
|
|
40
|
+
const targetsOf = (from, module, packages) => {
|
|
41
|
+
const written = modulePath(module);
|
|
42
|
+
if (written.startsWith("."))
|
|
43
|
+
return [relativeTarget(from, written)];
|
|
44
|
+
if (/^[@~#]\//.test(written)) {
|
|
45
|
+
const rest = written.slice(2);
|
|
46
|
+
return foldersOf(from).map((folder) => (folder === "" ? rest : `${folder}/${rest}`));
|
|
47
|
+
}
|
|
48
|
+
const [, name = "", rest = ""] = PACKAGE_NAME.exec(written) ?? [];
|
|
49
|
+
const found = packages.find((each) => each.name === name && each.name !== "");
|
|
50
|
+
if (found === undefined)
|
|
51
|
+
return [];
|
|
52
|
+
const inside = (folder) => [found.dir, folder, rest].filter((part) => part !== "").join("/");
|
|
53
|
+
return [inside(""), inside("src")];
|
|
54
|
+
};
|
|
55
|
+
/** Whether a component is what an import of a name means. */
|
|
56
|
+
const isImported = (component, name, targets) => {
|
|
57
|
+
const path = modulePath(component.file);
|
|
58
|
+
if (targets.includes(path))
|
|
59
|
+
return name === "default" ? component.isDefault === true : component.name === name;
|
|
60
|
+
// through a folder's index the file is another; the name has to be that folder's own
|
|
61
|
+
return name === component.name && targets.some((target) => target !== "" && path.startsWith(`${target}/`));
|
|
62
|
+
};
|
|
63
|
+
/** A tag's text as an answer repeats it. */
|
|
64
|
+
const capped = (text) => plainWords(text, LONGEST_WORDS);
|
|
65
|
+
/** What an imported component's own words make of importing it. */
|
|
66
|
+
const wordsOnImport = (file, line, { name, guidance, rules }) => {
|
|
67
|
+
const { deprecated, replacedBy, useWhen, avoidWhen } = guidance ?? {};
|
|
68
|
+
if (deprecated !== undefined || replacedBy !== undefined) {
|
|
69
|
+
const why = deprecated === undefined ? "" : `: ${deprecated}`;
|
|
70
|
+
const use = replacedBy === undefined ? "" : ` Use ${replacedBy}.`;
|
|
71
|
+
return {
|
|
72
|
+
problems: [
|
|
73
|
+
{
|
|
74
|
+
rule: "deprecated-component",
|
|
75
|
+
file,
|
|
76
|
+
line,
|
|
77
|
+
value: name,
|
|
78
|
+
...(replacedBy !== undefined && COMPONENT_NAME.test(replacedBy) ? { fix: replacedBy } : {}),
|
|
79
|
+
message: `${name} is deprecated${capped(why)}${capped(use)}`
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
advice: [],
|
|
83
|
+
excused: []
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const intents = (rules?.intents ?? []).map(({ id, when }) => `for ${id}${when === undefined ? "" : ` (${when})`}`);
|
|
87
|
+
const parts = [
|
|
88
|
+
...intents,
|
|
89
|
+
...(useWhen === undefined ? [] : [`use when ${useWhen.join("; ")}`]),
|
|
90
|
+
...(avoidWhen === undefined ? [] : [`avoid when ${avoidWhen.join("; ")}`])
|
|
91
|
+
];
|
|
92
|
+
return {
|
|
93
|
+
problems: [],
|
|
94
|
+
advice: parts.length === 0 ? [] : [{ file, line, message: `${name}: ${capped(parts.join("; "))}.` }],
|
|
95
|
+
excused: []
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
/** What fails and what to weigh in one import the change adds, of the names it did not import before. */
|
|
99
|
+
const importFindings = (file, { names, module, lines }, isOld, { components, packages }) => {
|
|
100
|
+
const targets = targetsOf(file, module, packages);
|
|
101
|
+
const found = names
|
|
102
|
+
.filter((name) => !isOld(name))
|
|
103
|
+
.flatMap((name) => {
|
|
104
|
+
const matches = components.filter((each) => each.file !== file &&
|
|
105
|
+
(each.guidance !== undefined || each.rules?.intents !== undefined) &&
|
|
106
|
+
isImported(each, name, targets));
|
|
107
|
+
// two of a name through one folder could be either
|
|
108
|
+
return matches.length === 1 ? matches : [];
|
|
109
|
+
})
|
|
110
|
+
.map((each) => wordsOnImport(file, lines[0], each));
|
|
111
|
+
return {
|
|
112
|
+
problems: found.flatMap((each) => each.problems),
|
|
113
|
+
advice: found.flatMap((each) => each.advice),
|
|
114
|
+
excused: []
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
/** Where an existing component is, and when to use it. */
|
|
118
|
+
const existingWords = ({ name, file, line, guidance }) => {
|
|
119
|
+
const when = guidance?.useWhen === undefined ? "" : ` (use when ${capped(guidance.useWhen.join("; "))})`;
|
|
120
|
+
return `${name} in ${file}:${line}${when}`;
|
|
121
|
+
};
|
|
122
|
+
/** The existing component a new one is surely the same as, with why: a copy under any name, or the same name and signs. */
|
|
123
|
+
const sureMatch = (added, existing, alike) => {
|
|
124
|
+
const copied = added.code === undefined
|
|
125
|
+
? undefined
|
|
126
|
+
: existing.find((other) => other.file !== added.file && other.code === added.code);
|
|
127
|
+
if (copied !== undefined)
|
|
128
|
+
return { other: copied, why: SAME_CODE };
|
|
129
|
+
const sure = alike.find(({ signs }) => signs.length >= 2);
|
|
130
|
+
if (sure !== undefined)
|
|
131
|
+
return { other: sure.other, why: sure.signs.join(", ") };
|
|
132
|
+
const [first] = alike;
|
|
133
|
+
return first !== undefined && isRebuilt(added, stemOf(added.name))
|
|
134
|
+
? { other: first.other, why: `it renders a plain ${added.root ?? ""} of its own` }
|
|
135
|
+
: undefined;
|
|
136
|
+
};
|
|
137
|
+
/** What a new component is against those that exist. */
|
|
138
|
+
const newComponentFindings = (added, existing) => {
|
|
139
|
+
const stem = stemOf(added.name);
|
|
140
|
+
const isRebuilding = isRebuilt(added, stem);
|
|
141
|
+
const alike = existing.flatMap((other) => {
|
|
142
|
+
if (other.file === added.file || isBuiltOn(added, other) || stemOf(other.name) !== stem)
|
|
143
|
+
return [];
|
|
144
|
+
const signs = signsBetween(added, other);
|
|
145
|
+
return signs.length === 0 && !isRebuilding ? [] : [{ other, signs }];
|
|
146
|
+
});
|
|
147
|
+
const sure = sureMatch(added, existing, alike);
|
|
148
|
+
const { name, file, line } = added;
|
|
149
|
+
if (sure !== undefined) {
|
|
150
|
+
return {
|
|
151
|
+
problems: [
|
|
152
|
+
{
|
|
153
|
+
rule: "duplicate-component",
|
|
154
|
+
file,
|
|
155
|
+
line,
|
|
156
|
+
value: name,
|
|
157
|
+
fix: sure.other.name,
|
|
158
|
+
message: `${name} looks like ${existingWords(sure.other)}: ${sure.why}. Use it, or say why not.`
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
advice: [],
|
|
162
|
+
excused: []
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
problems: [],
|
|
167
|
+
excused: [],
|
|
168
|
+
advice: alike.slice(0, 1).map(({ other, signs }) => ({
|
|
169
|
+
file,
|
|
170
|
+
line,
|
|
171
|
+
message: `${name} may be ${existingWords(other)}: ${signs.join(", ")}.`
|
|
172
|
+
}))
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
/** The package a file belongs to: the nearest with a manifest. */
|
|
176
|
+
const packageOf = (file, packages) => packages
|
|
177
|
+
.filter(({ dir }) => dir === "" || file.startsWith(`${dir}/`))
|
|
178
|
+
.toSorted((first, second) => second.dir.length - first.dir.length)[0];
|
|
179
|
+
/** Whether a file could use a component of another: in one package, or one its package depends on. */
|
|
180
|
+
const canUse = (file, other, packages) => {
|
|
181
|
+
const [own, theirs] = [packageOf(file, packages), packageOf(other, packages)];
|
|
182
|
+
return own === theirs || theirs === undefined || (own?.dependsOn.includes(theirs.name) ?? true);
|
|
183
|
+
};
|
|
184
|
+
/** A comment excusing a new component, when one stands within reach above it (anywhere in a single-file component). */
|
|
185
|
+
const excuseOf = ({ name, file, line }, added) => {
|
|
186
|
+
for (const each of added) {
|
|
187
|
+
const reason = each.file === file ? IGNORE_DUPLICATE.exec(each.text)?.[1] : undefined;
|
|
188
|
+
const isNear = line === 1 || (each.line <= line && each.line >= line - IGNORE_REACH);
|
|
189
|
+
if (reason !== undefined && isNear) {
|
|
190
|
+
return { file, line: each.line, rule: "duplicate-component", reason: `${name}: ${reason.trim()}` };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return undefined;
|
|
194
|
+
};
|
|
195
|
+
/** What the components were before the change: by file, and those of files it deleted, which may only have moved. */
|
|
196
|
+
const before = (previous, changed) => {
|
|
197
|
+
const current = new Set(changed.map(({ file }) => file));
|
|
198
|
+
const scanned = previous.map(({ file, text }) => ({
|
|
199
|
+
file,
|
|
200
|
+
components: scannedComponents(file, text),
|
|
201
|
+
imported: importsOfFile(file, text).flatMap(({ names }) => names)
|
|
202
|
+
}));
|
|
203
|
+
const gone = scanned.filter(({ file }) => !current.has(file));
|
|
204
|
+
return {
|
|
205
|
+
names: new Map(scanned.map(({ file, components }) => [file, new Set(components.map(({ name }) => name))])),
|
|
206
|
+
imports: new Map(scanned.map(({ file, imported }) => [file, new Set(imported)])),
|
|
207
|
+
moved: {
|
|
208
|
+
names: new Set(gone.flatMap(({ components }) => components.map(({ name }) => name))),
|
|
209
|
+
codes: new Set(gone.flatMap(({ components }) => components.flatMap(({ code }) => code ?? []))),
|
|
210
|
+
imports: new Set(gone.flatMap(({ imported }) => imported))
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* What a change adds against the components the project has. New means new against the commit it starts from: an edit of a
|
|
216
|
+
* line that declares a component is no new component, nor is a file moved, nor a name a file already imported.
|
|
217
|
+
*
|
|
218
|
+
* @param input - the change and the project.
|
|
219
|
+
*/
|
|
220
|
+
export const reuseFindings = (input) => {
|
|
221
|
+
const { added, changed, previous, components, packages } = input;
|
|
222
|
+
const lines = new Map();
|
|
223
|
+
for (const { file, line } of added)
|
|
224
|
+
lines.set(file, (lines.get(file) ?? new Set()).add(line));
|
|
225
|
+
const isAdded = (file, from, to) => {
|
|
226
|
+
const own = lines.get(file);
|
|
227
|
+
for (let at = from; own !== undefined && at <= to; at += 1)
|
|
228
|
+
if (own.has(at))
|
|
229
|
+
return true;
|
|
230
|
+
return false;
|
|
231
|
+
};
|
|
232
|
+
const was = before(previous, changed);
|
|
233
|
+
const imports = changed.flatMap(({ file, text }) => {
|
|
234
|
+
const isOld = (name) => was.imports.get(file)?.has(name) === true || was.moved.imports.has(name);
|
|
235
|
+
return importsOfFile(file, text)
|
|
236
|
+
.filter(({ lines: [from, to] }) => isAdded(file, from, to))
|
|
237
|
+
.map((each) => importFindings(file, each, isOld, input));
|
|
238
|
+
});
|
|
239
|
+
const changedFiles = new Set(changed.map(({ file }) => file));
|
|
240
|
+
const isNew = ({ file, name, code }) => changedFiles.has(file) &&
|
|
241
|
+
was.names.get(file)?.has(name) !== true &&
|
|
242
|
+
!was.moved.names.has(name) &&
|
|
243
|
+
!(code !== undefined && was.moved.codes.has(code));
|
|
244
|
+
const usable = components.filter((each) => each.isExported && isShareable(each));
|
|
245
|
+
const fresh = usable.filter(isNew).map((each) => {
|
|
246
|
+
const excuse = excuseOf(each, added);
|
|
247
|
+
if (excuse !== undefined)
|
|
248
|
+
return { problems: [], advice: [], excused: [excuse] };
|
|
249
|
+
const reachable = usable.filter((other) => !isNew(other) && canUse(each.file, other.file, packages));
|
|
250
|
+
return newComponentFindings(each, reachable);
|
|
251
|
+
});
|
|
252
|
+
const all = [...imports, ...fresh];
|
|
253
|
+
return {
|
|
254
|
+
problems: all.flatMap((each) => each.problems),
|
|
255
|
+
advice: [
|
|
256
|
+
...new Map(all.flatMap((each) => each.advice).map((each) => [JSON.stringify(each), each])).values()
|
|
257
|
+
].slice(0, MOST_ADVICE),
|
|
258
|
+
excused: all.flatMap((each) => each.excused)
|
|
259
|
+
};
|
|
260
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a catalogue says when Vite's configuration is read: what is wrong with its theme, and of the Vite it finds itself running on: the command brings its own, and an app that puts the plugin
|
|
3
|
+
* in its own `vite.config` runs it on the app's.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { Logger } from "vite";
|
|
8
|
+
/**
|
|
9
|
+
* Stops on a Vite older than the one this runs on, for an app that puts this plugin in its own `vite.config`: the command
|
|
10
|
+
* brings its own Vite, and a project's older one would otherwise fail later, at its first watched file, far from here.
|
|
11
|
+
*
|
|
12
|
+
* @param build - the resolved configuration's `build`, which names Rolldown's options from Vite 8 on.
|
|
13
|
+
* @throws when it is an older Vite's.
|
|
14
|
+
*/
|
|
15
|
+
export declare const assertViteEight: (build: object | undefined) => void;
|
|
16
|
+
/** What is read of Vite's resolved configuration. */
|
|
17
|
+
export type ResolvedVite = {
|
|
18
|
+
/** Vite's logger. */
|
|
19
|
+
readonly logger: Logger;
|
|
20
|
+
/** Its cache folder. */
|
|
21
|
+
readonly cacheDir: string;
|
|
22
|
+
/** Its `build`; none in a test's stand-in. */
|
|
23
|
+
readonly build?: object;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Stops on a Vite too old, and warns of what will not work in the shell's theme: a warning, since a theme a reader can still
|
|
27
|
+
* use must not stop a catalogue from building.
|
|
28
|
+
*
|
|
29
|
+
* @param resolved - Vite's resolved configuration.
|
|
30
|
+
* @param themeProblems - what will not work in the theme.
|
|
31
|
+
* @throws when Vite is too old.
|
|
32
|
+
*/
|
|
33
|
+
export declare const checkAtStart: (resolved: ResolvedVite, themeProblems: readonly string[]) => void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stops on a Vite older than the one this runs on, for an app that puts this plugin in its own `vite.config`: the command
|
|
3
|
+
* brings its own Vite, and a project's older one would otherwise fail later, at its first watched file, far from here.
|
|
4
|
+
*
|
|
5
|
+
* @param build - the resolved configuration's `build`, which names Rolldown's options from Vite 8 on.
|
|
6
|
+
* @throws when it is an older Vite's.
|
|
7
|
+
*/
|
|
8
|
+
export const assertViteEight = (build) => {
|
|
9
|
+
if (build === undefined || "rolldownOptions" in build)
|
|
10
|
+
return;
|
|
11
|
+
throw new Error("forgebookPlugin runs on Vite 8.3.4 or later, and this vite.config runs on an older one: run the catalogue with the forgebook command, which brings its own, or upgrade Vite");
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Stops on a Vite too old, and warns of what will not work in the shell's theme: a warning, since a theme a reader can still
|
|
15
|
+
* use must not stop a catalogue from building.
|
|
16
|
+
*
|
|
17
|
+
* @param resolved - Vite's resolved configuration.
|
|
18
|
+
* @param themeProblems - what will not work in the theme.
|
|
19
|
+
* @throws when Vite is too old.
|
|
20
|
+
*/
|
|
21
|
+
export const checkAtStart = (resolved, themeProblems) => {
|
|
22
|
+
assertViteEight(resolved.build);
|
|
23
|
+
for (const problem of themeProblems)
|
|
24
|
+
resolved.logger.warn(`Forgebook's shell theme: ${problem}`);
|
|
25
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type Logger } from "vite";
|
|
2
|
+
import type { StoryFileRead } from "../hotModules.ts";
|
|
3
|
+
/** A project's script: JavaScript or TypeScript, with or without JSX. */
|
|
4
|
+
export declare const SCRIPT: RegExp;
|
|
5
|
+
/** A file of an installed package, which is not the project's to fix. */
|
|
6
|
+
export declare const INSTALLED: RegExp;
|
|
7
|
+
/** A script parsed: its imports, and why it does not parse. */
|
|
8
|
+
export type ParsedScript = {
|
|
9
|
+
/** The modules it imports statically, as written. */
|
|
10
|
+
readonly imports: readonly string[];
|
|
11
|
+
/** Whether it parses only as JSX (a `.js` file holding JSX). */
|
|
12
|
+
readonly isJsx: boolean;
|
|
13
|
+
/** Why it does not parse, naming the file with its line and column; none when it parses. */
|
|
14
|
+
readonly problem: string | undefined;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* A script parsed as its extension says, and as JSX when only that makes a plain `.js` file parse.
|
|
18
|
+
*
|
|
19
|
+
* @param file - the script's path, as the problem names it; its extension decides TypeScript and JSX.
|
|
20
|
+
* @param text - its source.
|
|
21
|
+
*/
|
|
22
|
+
export declare const parsedScript: (file: string, text: string) => ParsedScript;
|
|
23
|
+
/**
|
|
24
|
+
* Whether a file is one of the project's scripts this module names: not a story file, not an installed package's.
|
|
25
|
+
*
|
|
26
|
+
* @param file - the file.
|
|
27
|
+
*/
|
|
28
|
+
export declare const isNamedScript: (file: string) => boolean;
|
|
29
|
+
/** The project's scripts that do not parse, as a dev server or a dependency scan knows them. */
|
|
30
|
+
export type ScriptProblems = {
|
|
31
|
+
/**
|
|
32
|
+
* Starts once Vite's configuration is resolved: keeps the logger the scan's warnings go to, and the folder the
|
|
33
|
+
* problems are kept in between processes, reading what an earlier scan found there, each file read again.
|
|
34
|
+
*
|
|
35
|
+
* @param logger - Vite's logger.
|
|
36
|
+
* @param folder - Forgebook's cache folder; none keeps nothing (a build).
|
|
37
|
+
*/
|
|
38
|
+
readonly start: (logger: Pick<Logger, "warn">, folder: string | undefined) => void;
|
|
39
|
+
/** Writes a warning of the scan, once the logger is known (the scan runs after the configuration is resolved). */
|
|
40
|
+
readonly warn: (line: string) => void;
|
|
41
|
+
/**
|
|
42
|
+
* Notes what a scan found of a script.
|
|
43
|
+
*
|
|
44
|
+
* @param file - the script, absolute.
|
|
45
|
+
* @param problem - why it does not parse; none when it does.
|
|
46
|
+
* @returns whether that is new: a problem not known before.
|
|
47
|
+
*/
|
|
48
|
+
readonly scanned: (file: string, problem: string | undefined) => boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Reads an edited script again.
|
|
51
|
+
*
|
|
52
|
+
* @param file - the script, absolute.
|
|
53
|
+
* @returns whether it parses now, when that changed; none when nothing changed.
|
|
54
|
+
*/
|
|
55
|
+
readonly edited: (file: string) => StoryFileRead | undefined;
|
|
56
|
+
/** The problems, one per script. */
|
|
57
|
+
readonly list: () => readonly string[];
|
|
58
|
+
};
|
|
59
|
+
/** The project's scripts that do not parse, empty until a scan or an edit finds one. */
|
|
60
|
+
export declare const scriptProblems: () => ScriptProblems;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The project's scripts that do not parse, other than story files: each one a problem naming its place, among the
|
|
3
|
+
* index's problems, so a component that does not parse is named once, before any frame loads it, to people and agents.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Vite's dependency scan finds them (`prebundled.ts`), and an edit of a script finds them on a dev server, which also
|
|
7
|
+
* recovers on the fix. The scan may run in a process of its own (a first start's pre-bundling), and a later start that
|
|
8
|
+
* keeps the pre-bundled packages does not scan: what it found is kept in Forgebook's cache folder, read when a dev
|
|
9
|
+
* server starts, and each file read again then, so a file fixed in between is not named. A file broken while no server
|
|
10
|
+
* ran is named once it is edited, or by the frames of the stories that import it. Story files are the catalogue's own
|
|
11
|
+
* to name (`storyFilesModule.ts`).
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { parseSync } from "vite";
|
|
18
|
+
import { STORY_FILE } from "./autoTitle.js";
|
|
19
|
+
import { lineAndColumn } from "./lineAndColumn.js";
|
|
20
|
+
import { VITE_PATHS } from "./vitePaths.js";
|
|
21
|
+
/** A project's script: JavaScript or TypeScript, with or without JSX. */
|
|
22
|
+
export const SCRIPT = /\.[cm]?[jt]sx?$/;
|
|
23
|
+
/** A file of an installed package, which is not the project's to fix. */
|
|
24
|
+
export const INSTALLED = /[\\/]node_modules[\\/]/;
|
|
25
|
+
/** A script whose extension says nothing about JSX: it may hold JSX, as libraries written in JavaScript do. */
|
|
26
|
+
const PLAIN_SCRIPT = /\.[cm]?js$/;
|
|
27
|
+
/** The file the found problems are kept in, in Forgebook's cache folder. */
|
|
28
|
+
const KEPT_FILE = "script-problems.json";
|
|
29
|
+
/**
|
|
30
|
+
* A script parsed as its extension says, and as JSX when only that makes a plain `.js` file parse.
|
|
31
|
+
*
|
|
32
|
+
* @param file - the script's path, as the problem names it; its extension decides TypeScript and JSX.
|
|
33
|
+
* @param text - its source.
|
|
34
|
+
*/
|
|
35
|
+
export const parsedScript = (file, text) => {
|
|
36
|
+
const parsed = parseSync(file, text);
|
|
37
|
+
const imports = parsed.module.staticImports.map((each) => each.moduleRequest.value);
|
|
38
|
+
const [error] = parsed.errors;
|
|
39
|
+
if (error === undefined)
|
|
40
|
+
return { imports, isJsx: false, problem: undefined };
|
|
41
|
+
if (PLAIN_SCRIPT.test(file)) {
|
|
42
|
+
const asJsx = parseSync(file, text, { lang: "jsx" });
|
|
43
|
+
if (asJsx.errors.length === 0) {
|
|
44
|
+
return {
|
|
45
|
+
imports: asJsx.module.staticImports.map((each) => each.moduleRequest.value),
|
|
46
|
+
isJsx: true,
|
|
47
|
+
problem: undefined
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const [label] = error.labels;
|
|
52
|
+
const place = label === undefined ? file : `${file}:${lineAndColumn(text, label.start)}`;
|
|
53
|
+
return { imports, isJsx: false, problem: `${place} does not parse: ${error.message}` };
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Whether a file is one of the project's scripts this module names: not a story file, not an installed package's.
|
|
57
|
+
*
|
|
58
|
+
* @param file - the file.
|
|
59
|
+
*/
|
|
60
|
+
export const isNamedScript = (file) => SCRIPT.test(file) && !INSTALLED.test(file) && !STORY_FILE.test(file);
|
|
61
|
+
/**
|
|
62
|
+
* Why a script on disk does not parse; none when it does, or cannot be read (an editor writes it anew in place).
|
|
63
|
+
*
|
|
64
|
+
* @param file - the script, absolute in Vite's form.
|
|
65
|
+
*/
|
|
66
|
+
const problemOnDisk = (file) => {
|
|
67
|
+
if (!existsSync(file))
|
|
68
|
+
return undefined;
|
|
69
|
+
try {
|
|
70
|
+
return parsedScript(file, readFileSync(file, "utf8")).problem;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* The problems kept in a folder, each file read again; none when nothing is kept there.
|
|
78
|
+
*
|
|
79
|
+
* @param path - the kept file.
|
|
80
|
+
*/
|
|
81
|
+
const keptProblems = (path) => {
|
|
82
|
+
const problems = new Map();
|
|
83
|
+
if (!existsSync(path))
|
|
84
|
+
return problems;
|
|
85
|
+
try {
|
|
86
|
+
const kept = JSON.parse(readFileSync(path, "utf8"));
|
|
87
|
+
if (!Array.isArray(kept))
|
|
88
|
+
return problems;
|
|
89
|
+
for (const file of kept) {
|
|
90
|
+
if (typeof file !== "string")
|
|
91
|
+
continue;
|
|
92
|
+
const problem = problemOnDisk(file);
|
|
93
|
+
if (problem !== undefined)
|
|
94
|
+
problems.set(file, problem);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// a file another version wrote, or half written: the next scan or edit writes it anew
|
|
99
|
+
}
|
|
100
|
+
return problems;
|
|
101
|
+
};
|
|
102
|
+
/** The project's scripts that do not parse, empty until a scan or an edit finds one. */
|
|
103
|
+
export const scriptProblems = () => {
|
|
104
|
+
const problems = new Map();
|
|
105
|
+
let keptPath;
|
|
106
|
+
let logger;
|
|
107
|
+
const keep = () => {
|
|
108
|
+
if (keptPath === undefined)
|
|
109
|
+
return;
|
|
110
|
+
try {
|
|
111
|
+
mkdirSync(VITE_PATHS.dirname(keptPath), { recursive: true });
|
|
112
|
+
writeFileSync(keptPath, JSON.stringify([...problems.keys()]));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// a read-only cache folder: the problems stay this process's
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
start: (started, folder) => {
|
|
120
|
+
logger = started;
|
|
121
|
+
if (folder === undefined)
|
|
122
|
+
return;
|
|
123
|
+
keptPath = join(folder, KEPT_FILE);
|
|
124
|
+
for (const [file, problem] of keptProblems(keptPath))
|
|
125
|
+
problems.set(file, problem);
|
|
126
|
+
},
|
|
127
|
+
warn: (line) => logger?.warn(line),
|
|
128
|
+
scanned: (file, problem) => {
|
|
129
|
+
const key = VITE_PATHS.normalize(file);
|
|
130
|
+
const before = problems.get(key);
|
|
131
|
+
if (problem === undefined)
|
|
132
|
+
problems.delete(key);
|
|
133
|
+
else
|
|
134
|
+
problems.set(key, problem);
|
|
135
|
+
if (before !== problem)
|
|
136
|
+
keep();
|
|
137
|
+
return problem !== undefined && before !== problem;
|
|
138
|
+
},
|
|
139
|
+
edited: (file) => {
|
|
140
|
+
const key = VITE_PATHS.normalize(file);
|
|
141
|
+
if (!isNamedScript(key))
|
|
142
|
+
return undefined;
|
|
143
|
+
const problem = problemOnDisk(key);
|
|
144
|
+
if (problem === problems.get(key))
|
|
145
|
+
return undefined;
|
|
146
|
+
if (problem === undefined)
|
|
147
|
+
problems.delete(key);
|
|
148
|
+
else
|
|
149
|
+
problems.set(key, problem);
|
|
150
|
+
keep();
|
|
151
|
+
return { file: key, ...(problem === undefined ? {} : { problem }) };
|
|
152
|
+
},
|
|
153
|
+
list: () => [...problems.values()]
|
|
154
|
+
};
|
|
155
|
+
};
|
|
@@ -14,7 +14,7 @@ import { readFileSync } from "node:fs";
|
|
|
14
14
|
import { componentPage } from "./componentPage.js";
|
|
15
15
|
import { compiledDocPage } from "./docPageMarkdown.js";
|
|
16
16
|
import { indexedDocPages } from "./docPagesModule.js";
|
|
17
|
-
import { EVERY_FILE,
|
|
17
|
+
import { EVERY_FILE, readStoryFiles } from "./storyFilesModule.js";
|
|
18
18
|
/** A heading of the pages' HTML: its anchor, and what is inside it. */
|
|
19
19
|
const HEADING = /<h[1-6] id="doc-([^"]*)"[^>]*>([\s\S]*?)<\/h[1-6]>/g;
|
|
20
20
|
/** A tag: `>` inside a quoted attribute does not end it. */
|
|
@@ -186,7 +186,8 @@ const entryOf = (file, read, watch) => {
|
|
|
186
186
|
* few visits read.
|
|
187
187
|
*/
|
|
188
188
|
export const storySearchModule = async (root, patterns, watch, extract, isServing, pack, isKept = EVERY_FILE) => {
|
|
189
|
-
|
|
189
|
+
// a file that cannot be indexed has nothing to find: the group's own module names it
|
|
190
|
+
const { files } = readStoryFiles(root, patterns, watch, undefined, isKept);
|
|
190
191
|
const entries = await Promise.all(files.map(async (file) => ({ file, ...entryOf(file, await extract(file.file), watch) })));
|
|
191
192
|
const problems = entries.flatMap(({ problem }) => problem ?? []);
|
|
192
193
|
const index = {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { searchables
|
|
1
|
+
import { searchables } from "../search.js";
|
|
2
2
|
import { isSearchIndex, mergedSearchIndex } from "../searchIndex.js";
|
|
3
|
+
import { correctedSearch } from "../searchTypos.js";
|
|
3
4
|
import { sourceSearchLoaders } from "../sourceFiles.js";
|
|
4
5
|
import { componentAddressOf, docPageAddressOf, storyAddressOf } from "../viewState.js";
|
|
5
6
|
import { settled } from "./agentRoutes.js";
|
|
@@ -64,7 +65,7 @@ export const searchAnswer = async ({ tree, params, pages, view, loaded }) => {
|
|
|
64
65
|
return { status: 400, body: { error: "No words to look for" } };
|
|
65
66
|
const read = await Promise.all(loaded.sources.map(async (source) => ({ id: source.id, ...(await indexOf(source)) })));
|
|
66
67
|
const indexes = new Map(read.map(({ id, index }) => [id, index]));
|
|
67
|
-
const answer =
|
|
68
|
+
const answer = correctedSearch(searchables(tree, indexes), query, {
|
|
68
69
|
results: limitOf(params.get("limit")),
|
|
69
70
|
hits: HITS
|
|
70
71
|
});
|
|
@@ -73,6 +74,7 @@ export const searchAnswer = async ({ tree, params, pages, view, loaded }) => {
|
|
|
73
74
|
query,
|
|
74
75
|
total: answer.total,
|
|
75
76
|
results: answer.results.map((result) => agentResult(result, pages, view)),
|
|
77
|
+
corrections: answer.corrections,
|
|
76
78
|
problems: read.flatMap(({ index, problems }) => [...problems, ...(index.problems ?? [])])
|
|
77
79
|
};
|
|
78
80
|
return { status: 200, body };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a prop's value looks like, read from its type: the fields of an object, a list's items, the members of a mixed
|
|
3
|
+
* union, so the panel can draw them and a link's value can be checked against them.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* What JSON cannot hold (a function, a class's instance, a node) is a `named` part, which only the source's named values
|
|
7
|
+
* can fill: whether it offers some is known in the page. Types can be recursive and very wide (`CSSProperties`,
|
|
8
|
+
* `HTMLElement`), and every docs answer carries the shape, so a recursive part, a part too deep and a type too wide are
|
|
9
|
+
* `json`, typed by hand: the answer stays small, and the prop can still be set.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import ts from "typescript-6";
|
|
14
|
+
import type { ValueShape } from "../valueShape.ts";
|
|
15
|
+
/** What reading a shape needs from the docs that ask. */
|
|
16
|
+
export type ShapeReading = {
|
|
17
|
+
/** The program's checker. */
|
|
18
|
+
readonly checker: ts.TypeChecker;
|
|
19
|
+
/** Where the code names the component. */
|
|
20
|
+
readonly node: ts.Node;
|
|
21
|
+
/** A choice's values in the source's order; applied to the prop's own literals. */
|
|
22
|
+
readonly order: (values: readonly (string | number)[]) => readonly (string | number)[];
|
|
23
|
+
/** A member's type as the source writes it. */
|
|
24
|
+
readonly typeText: (member: ts.Symbol) => string | undefined;
|
|
25
|
+
/** A member's TSDoc. */
|
|
26
|
+
readonly description: (member: ts.Symbol) => string;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* A prop's shape, when it says more than the prop's kind does.
|
|
30
|
+
*
|
|
31
|
+
* @param type - the prop's type, without `undefined` and `null`.
|
|
32
|
+
* @param canTakeText - whether it takes a plain text: its text field stays, rather than JSON for a type that says nothing.
|
|
33
|
+
* @param reading - what reading a shape needs.
|
|
34
|
+
* @returns the shape; none for a prop no JSON value can fill, whose named values the page looks up by its type.
|
|
35
|
+
*/
|
|
36
|
+
export declare const shapeOfProp: (type: ts.Type, canTakeText: boolean, reading: ShapeReading) => ValueShape | undefined;
|