forgebook 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +917 -74
- package/dist/bin/forgebook/agentClient.d.ts +2 -1
- package/dist/bin/forgebook/agentClient.js +13 -6
- package/dist/bin/forgebook/agentGuide.d.ts +59 -0
- package/dist/bin/forgebook/agentGuide.js +203 -0
- package/dist/bin/forgebook/agentLoopCommands.mjs +22 -42
- package/dist/bin/forgebook/agentSetup/agentFiles.d.ts +55 -0
- package/dist/bin/forgebook/agentSetup/agentFiles.js +319 -0
- package/dist/bin/forgebook/agentSetup/assistantHooks.d.ts +71 -0
- package/dist/bin/forgebook/agentSetup/assistantHooks.js +125 -0
- package/dist/bin/forgebook/agentSetup/ciWorkflow.d.ts +23 -0
- package/dist/bin/forgebook/agentSetup/ciWorkflow.js +55 -0
- package/dist/bin/forgebook/agentSetup/drawCandidates.d.ts +25 -0
- package/dist/bin/forgebook/agentSetup/drawCandidates.js +116 -0
- package/dist/bin/forgebook/agentSetup/drawDiagnosis.d.ts +28 -0
- package/dist/bin/forgebook/agentSetup/drawDiagnosis.js +134 -0
- package/dist/bin/forgebook/agentSetup/drawRun.d.ts +91 -0
- package/dist/bin/forgebook/agentSetup/drawRun.js +353 -0
- package/dist/bin/forgebook/agentSetup/hookNames.d.ts +7 -0
- package/dist/bin/forgebook/agentSetup/hookNames.js +7 -0
- package/dist/bin/forgebook/agentSetup/initAgentSteps.d.ts +48 -0
- package/dist/bin/forgebook/agentSetup/initAgentSteps.js +104 -0
- package/dist/bin/forgebook/agentSetup/liftedProviders.d.ts +17 -0
- package/dist/bin/forgebook/agentSetup/liftedProviders.js +186 -0
- package/dist/bin/forgebook/agentSetup/projectRunner.d.ts +46 -0
- package/dist/bin/forgebook/agentSetup/projectRunner.js +85 -0
- package/dist/bin/forgebook/agentSetup/stopHook.d.ts +65 -0
- package/dist/bin/forgebook/agentSetup/stopHook.js +202 -0
- package/dist/bin/forgebook/agentSetup/uniformPicture.d.ts +7 -0
- package/dist/bin/forgebook/agentSetup/uniformPicture.js +98 -0
- package/dist/bin/forgebook/agentSetupCommands.d.mts +14 -0
- package/dist/bin/forgebook/agentSetupCommands.mjs +98 -0
- package/dist/bin/forgebook/agentText.d.ts +23 -3
- package/dist/bin/forgebook/agentText.js +175 -28
- package/dist/bin/forgebook/agents.md +20 -191
- package/dist/bin/forgebook/agentsText.js +2 -1
- package/dist/bin/forgebook/appBuild/appBuild.d.ts +59 -0
- package/dist/bin/forgebook/appBuild/appBuild.js +213 -0
- package/dist/bin/forgebook/appBuild/appViteConfig.d.ts +96 -0
- package/dist/bin/forgebook/appBuild/appViteConfig.js +320 -0
- package/dist/bin/forgebook/appBuild/tsconfigPaths.d.ts +14 -0
- package/dist/bin/forgebook/appBuild/tsconfigPaths.js +80 -0
- package/dist/bin/forgebook/auditCommand.d.mts +8 -0
- package/dist/bin/forgebook/auditCommand.mjs +75 -0
- package/dist/bin/forgebook/auditRun.d.ts +95 -0
- package/dist/bin/forgebook/auditRun.js +270 -0
- package/dist/bin/forgebook/browserRun.d.ts +21 -0
- package/dist/bin/forgebook/browserRun.js +57 -0
- package/dist/bin/forgebook/buildFailure.d.ts +7 -0
- package/dist/bin/forgebook/buildFailure.js +47 -0
- package/dist/bin/forgebook/buildWatch.d.ts +52 -0
- package/dist/bin/forgebook/buildWatch.js +137 -0
- package/dist/bin/forgebook/builtCatalogue.js +9 -5
- package/dist/bin/forgebook/catalogueCommands.d.ts +9 -0
- package/dist/bin/forgebook/catalogueCommands.js +23 -0
- package/dist/bin/forgebook/catalogueVite.d.ts +5 -1
- package/dist/bin/forgebook/catalogueVite.js +14 -6
- package/dist/bin/forgebook/commandCacheClaim.d.ts +18 -0
- package/dist/bin/forgebook/commandCacheClaim.js +170 -0
- package/dist/bin/forgebook/commandServer.d.ts +8 -0
- package/dist/bin/forgebook/commandServer.js +61 -13
- package/dist/bin/forgebook/forgebookCommands.mjs +105 -28
- package/dist/bin/forgebook/graphCommand.d.mts +8 -0
- package/dist/bin/forgebook/graphCommand.mjs +84 -0
- package/dist/bin/forgebook/guide/commands.md +57 -0
- package/dist/bin/forgebook/guide/devices.md +17 -0
- package/dist/bin/forgebook/guide/docs-pages.md +13 -0
- package/dist/bin/forgebook/guide/frameworks/angular.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/html.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/nextjs.md +23 -0
- package/dist/bin/forgebook/guide/frameworks/nuxt.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/preact.md +16 -0
- package/dist/bin/forgebook/guide/frameworks/react-native-web.md +21 -0
- package/dist/bin/forgebook/guide/frameworks/react.md +16 -0
- package/dist/bin/forgebook/guide/frameworks/solid.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/svelte.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/sveltekit.md +23 -0
- package/dist/bin/forgebook/guide/frameworks/vue.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/web-components.md +21 -0
- package/dist/bin/forgebook/guide/links.md +29 -0
- package/dist/bin/forgebook/guide/setup.md +23 -0
- package/dist/bin/forgebook/guide/stories.md +90 -0
- package/dist/bin/forgebook/guide/switches.md +43 -0
- package/dist/bin/forgebook/guideCommand.d.mts +13 -0
- package/dist/bin/forgebook/guideCommand.mjs +37 -0
- package/dist/bin/forgebook/importers/storybook.d.ts +21 -0
- package/dist/bin/forgebook/importers/storybook.js +11 -5
- package/dist/bin/forgebook/importers/storybookFrameworks.js +1 -1
- package/dist/bin/forgebook/initCommands.d.mts +11 -0
- package/dist/bin/forgebook/initCommands.mjs +51 -78
- package/dist/bin/forgebook/initConfig.d.ts +5 -3
- package/dist/bin/forgebook/initConfig.js +6 -3
- package/dist/bin/forgebook/initInstall.d.ts +15 -0
- package/dist/bin/forgebook/initInstall.js +77 -0
- package/dist/bin/forgebook/initPrint.d.ts +9 -0
- package/dist/bin/forgebook/initPrint.js +60 -0
- package/dist/bin/forgebook/initRefusals.d.ts +45 -0
- package/dist/bin/forgebook/initRefusals.js +91 -0
- package/dist/bin/forgebook/initRun.d.ts +28 -0
- package/dist/bin/forgebook/initRun.js +311 -0
- package/dist/bin/forgebook/mcpCommand.mjs +38 -4
- package/dist/bin/forgebook/mcpGraph.d.ts +13 -0
- package/dist/bin/forgebook/mcpGraph.js +24 -0
- package/dist/bin/forgebook/mcpTokens.d.ts +14 -0
- package/dist/bin/forgebook/mcpTokens.js +58 -0
- package/dist/bin/forgebook/mcpToolParts.d.ts +7 -0
- package/dist/bin/forgebook/mcpToolParts.js +10 -0
- package/dist/bin/forgebook/mcpTools.d.ts +13 -6
- package/dist/bin/forgebook/mcpTools.js +57 -90
- package/dist/bin/forgebook/mcpVerify.d.ts +16 -0
- package/dist/bin/forgebook/mcpVerify.js +36 -0
- package/dist/bin/forgebook/migrate/codemods.d.ts +11 -0
- package/dist/bin/forgebook/migrate/codemods.js +61 -0
- package/dist/bin/forgebook/migrate/migrate.types.d.ts +117 -0
- package/dist/bin/forgebook/migrate/migrate.types.js +5 -0
- package/dist/bin/forgebook/migrate/migrateCommand.d.mts +8 -0
- package/dist/bin/forgebook/migrate/migrateCommand.mjs +76 -0
- package/dist/bin/forgebook/migrate/migrateRun.d.ts +61 -0
- package/dist/bin/forgebook/migrate/migrateRun.js +210 -0
- package/dist/bin/forgebook/migrate/migrateText.d.ts +12 -0
- package/dist/bin/forgebook/migrate/migrateText.js +30 -0
- package/dist/bin/forgebook/migrate/migrateWrite.d.ts +27 -0
- package/dist/bin/forgebook/migrate/migrateWrite.js +66 -0
- package/dist/bin/forgebook/migrate/objectEdits.d.ts +70 -0
- package/dist/bin/forgebook/migrate/objectEdits.js +241 -0
- package/dist/bin/forgebook/migrate/playOnInBuilds.d.ts +3 -0
- package/dist/bin/forgebook/migrate/playOnInBuilds.js +86 -0
- package/dist/bin/forgebook/migrate/propGroupStrings.d.ts +5 -0
- package/dist/bin/forgebook/migrate/propGroupStrings.js +81 -0
- package/dist/bin/forgebook/newProject/newProject.d.ts +39 -0
- package/dist/bin/forgebook/newProject/newProject.js +180 -0
- package/dist/bin/forgebook/newProject/newProject.types.d.ts +97 -0
- package/dist/bin/forgebook/newProject/newProject.types.js +6 -0
- package/dist/bin/forgebook/newProject/packageManagers.d.ts +51 -0
- package/dist/bin/forgebook/newProject/packageManagers.js +121 -0
- package/dist/bin/forgebook/newProject/projectEntries.d.ts +62 -0
- package/dist/bin/forgebook/newProject/projectEntries.js +191 -0
- package/dist/bin/forgebook/newProject/projectFrameworks.d.ts +57 -0
- package/dist/bin/forgebook/newProject/projectFrameworks.js +148 -0
- package/dist/bin/forgebook/newProject/projectLook.d.ts +23 -0
- package/dist/bin/forgebook/newProject/projectLook.js +293 -0
- package/dist/bin/forgebook/newProject/projectPackages.d.ts +66 -0
- package/dist/bin/forgebook/newProject/projectPackages.js +178 -0
- package/dist/bin/forgebook/newRepair.d.ts +45 -0
- package/dist/bin/forgebook/newRepair.js +157 -0
- package/dist/bin/forgebook/newRepairRun.d.ts +69 -0
- package/dist/bin/forgebook/newRepairRun.js +148 -0
- package/dist/bin/forgebook/newStories.d.ts +23 -1
- package/dist/bin/forgebook/newStories.js +101 -11
- package/dist/bin/forgebook/newStoriesFile.d.ts +20 -1
- package/dist/bin/forgebook/newStoriesFile.js +43 -4
- package/dist/bin/forgebook/prebundleRun.d.ts +3 -1
- package/dist/bin/forgebook/prebundleRun.js +28 -8
- package/dist/bin/forgebook/proofCommand.d.mts +15 -0
- package/dist/bin/forgebook/proofCommand.mjs +212 -0
- package/dist/bin/forgebook/proofRun.d.ts +63 -0
- package/dist/bin/forgebook/proofRun.js +412 -0
- package/dist/bin/forgebook/proofText.d.ts +36 -0
- package/dist/bin/forgebook/proofText.js +131 -0
- package/dist/bin/forgebook/proofWorkflow.d.ts +29 -0
- package/dist/bin/forgebook/proofWorkflow.js +205 -0
- package/dist/bin/forgebook/setArgsTool.d.ts +8 -0
- package/dist/bin/forgebook/setArgsTool.js +70 -0
- package/dist/bin/forgebook/storyCheckCommands.mjs +42 -3
- package/dist/bin/forgebook/storyCheckRun.d.ts +50 -0
- package/dist/bin/forgebook/storyCheckRun.js +83 -9
- package/dist/bin/forgebook/storyFileIds.d.ts +15 -0
- package/dist/bin/forgebook/storyFileIds.js +14 -0
- package/dist/bin/forgebook/stressCases.d.ts +31 -0
- package/dist/bin/forgebook/stressCases.js +79 -0
- package/dist/bin/forgebook/stressRun.d.ts +12 -0
- package/dist/bin/forgebook/stressRun.js +61 -0
- package/dist/bin/forgebook/stressText.d.ts +27 -0
- package/dist/bin/forgebook/stressText.js +46 -0
- package/dist/bin/forgebook/verifyBase.d.ts +45 -0
- package/dist/bin/forgebook/verifyBase.js +196 -0
- package/dist/bin/forgebook/verifyCommand.d.mts +13 -0
- package/dist/bin/forgebook/verifyCommand.mjs +125 -0
- package/dist/bin/forgebook/verifyRun.d.ts +63 -0
- package/dist/bin/forgebook/verifyRun.js +108 -0
- package/dist/bin/forgebook/verifyVerdict.d.ts +40 -0
- package/dist/bin/forgebook/verifyVerdict.js +297 -0
- package/dist/bin/forgebook/workflowActions.d.ts +23 -0
- package/dist/bin/forgebook/workflowActions.js +23 -0
- package/dist/bin/forgebook-docs/catalogueMarkdown.js +12 -1
- package/dist/src/addressArgs.d.ts +54 -6
- package/dist/src/addressArgs.js +72 -16
- package/dist/src/addressArgsParam.d.ts +54 -0
- package/dist/src/addressArgsParam.js +51 -0
- package/dist/src/addressTexts.d.ts +14 -0
- package/dist/src/addressTexts.js +28 -21
- package/dist/src/agentIndexFile.d.ts +11 -0
- package/dist/src/agentIndexFile.js +11 -0
- package/dist/src/argConditions.d.ts +52 -0
- package/dist/src/argConditions.js +80 -0
- package/dist/src/argControl.d.ts +100 -0
- package/dist/src/argControl.js +0 -0
- package/dist/src/argExpression.d.ts +21 -0
- package/dist/src/argExpression.js +30 -0
- package/dist/src/argTypes.d.ts +40 -51
- package/dist/src/argTypes.js +66 -184
- package/dist/src/argsProps.d.ts +3 -3
- package/dist/src/argsProps.js +11 -5
- package/dist/src/bundlerErrors.d.ts +29 -0
- package/dist/src/bundlerErrors.js +49 -0
- package/dist/src/catalogue.d.ts +31 -0
- package/dist/src/catalogue.js +13 -2
- package/dist/src/catalogueRefs.d.ts +75 -0
- package/dist/src/catalogueRefs.js +122 -0
- package/dist/src/componentDocs.d.ts +71 -0
- package/dist/src/componentDocs.js +15 -2
- package/dist/src/frame/callValues.d.ts +19 -0
- package/dist/src/frame/callValues.js +58 -0
- package/dist/src/frame/canvasScheme.d.ts +33 -0
- package/dist/src/frame/canvasScheme.js +67 -0
- package/dist/src/frame/frame.css +36 -3
- package/dist/src/frame/frameStatus.d.ts +16 -1
- package/dist/src/frame/frameStatus.js +16 -1
- package/dist/src/frame/frameView.js +4 -3
- package/dist/src/frame/mountFrame.d.ts +7 -1
- package/dist/src/frame/mountFrame.js +153 -46
- package/dist/src/frame/panelValues.d.ts +35 -0
- package/dist/src/frame/panelValues.js +127 -0
- package/dist/src/frame/playActions.d.ts +39 -0
- package/dist/src/frame/playActions.js +98 -0
- package/dist/src/frame/playStepper.d.ts +28 -0
- package/dist/src/frame/playStepper.js +38 -0
- package/dist/src/frame/playStory.d.ts +9 -1
- package/dist/src/frame/playStory.js +49 -3
- package/dist/src/frame/renderer.d.ts +34 -1
- package/dist/src/frame/renderer.js +24 -0
- package/dist/src/frame/shellChannel.d.ts +1 -1
- package/dist/src/frame/shellChannel.js +1 -1
- package/dist/src/frame/shellCheck.d.ts +17 -0
- package/dist/src/frame/shellCheck.js +25 -0
- package/dist/src/frame/shellMessageCheck.d.ts +7 -0
- package/dist/src/frame/shellMessageCheck.js +53 -0
- package/dist/src/frame/storyContent.d.ts +50 -0
- package/dist/src/frame/storyContent.js +73 -0
- package/dist/src/frame/storyModule.d.ts +9 -0
- package/dist/src/frame/storyModule.js +20 -2
- package/dist/src/frame/storyRun.d.ts +15 -7
- package/dist/src/frame/storyRun.js +64 -15
- package/dist/src/frame/valueSheets.d.ts +35 -0
- package/dist/src/frame/valueSheets.js +99 -0
- package/dist/src/hotModules.d.ts +20 -0
- package/dist/src/hotModules.js +23 -0
- package/dist/src/jsxCode.d.ts +1 -14
- package/dist/src/jsxCode.js +46 -10
- package/dist/src/liveErrors.d.ts +30 -4
- package/dist/src/liveErrors.js +18 -3
- package/dist/src/messages.d.ts +77 -27
- package/dist/src/messages.js +58 -100
- package/dist/src/namedValues.d.ts +2 -26
- package/dist/src/namedValues.js +0 -47
- package/dist/src/pageConfig.d.ts +2 -0
- package/dist/src/playTrace.d.ts +19 -2
- package/dist/src/playTrace.js +10 -5
- package/dist/src/plugin.d.ts +10 -3
- package/dist/src/previewRelay.js +9 -1
- package/dist/src/printable.d.ts +12 -0
- package/dist/src/printable.js +22 -0
- package/dist/src/propsSignature.d.ts +37 -0
- package/dist/src/propsSignature.js +40 -0
- package/dist/src/search.d.ts +41 -5
- package/dist/src/search.js +93 -23
- package/dist/src/searchMatch.d.ts +4 -1
- package/dist/src/searchMatch.js +26 -5
- package/dist/src/searchTypos.d.ts +88 -0
- package/dist/src/searchTypos.js +178 -0
- package/dist/src/shapeValues.d.ts +86 -0
- package/dist/src/shapeValues.js +295 -0
- package/dist/src/shell/ApiReference.js +6 -3
- package/dist/src/shell/ApiTableBox.d.ts +15 -0
- package/dist/src/shell/ApiTableBox.js +11 -0
- package/dist/src/shell/AppearanceMenu.d.ts +4 -1
- package/dist/src/shell/AppearanceMenu.js +9 -6
- package/dist/src/shell/CodeTab.d.ts +3 -2
- package/dist/src/shell/CodeTab.js +3 -2
- package/dist/src/shell/CodeText.d.ts +1 -1
- package/dist/src/shell/CodeText.js +2 -3
- package/dist/src/shell/CompareGrid.js +1 -1
- package/dist/src/shell/ComponentPage.d.ts +1 -1
- package/dist/src/shell/ComponentPage.js +5 -1
- package/dist/src/shell/CustomControl.d.ts +34 -0
- package/dist/src/shell/CustomControl.js +132 -0
- package/dist/src/shell/DocContainers.js +1 -1
- package/dist/src/shell/DocPage.js +2 -2
- package/dist/src/shell/DroppedArgsList.d.ts +2 -2
- package/dist/src/shell/DroppedArgsList.js +1 -1
- package/dist/src/shell/EmbedPage.js +58 -14
- package/dist/src/shell/Example.d.ts +5 -1
- package/dist/src/shell/Example.js +16 -8
- package/dist/src/shell/FrameView.d.ts +6 -3
- package/dist/src/shell/FrameView.js +2 -2
- package/dist/src/shell/HomePage.d.ts +3 -1
- package/dist/src/shell/HomePage.js +16 -6
- package/dist/src/shell/InfoTip.js +2 -2
- package/dist/src/shell/InteractionsTab.d.ts +11 -4
- package/dist/src/shell/InteractionsTab.js +18 -2
- package/dist/src/shell/LazyPage.js +1 -1
- package/dist/src/shell/PackageHtml.js +3 -1
- package/dist/src/shell/PinnedControl.js +14 -62
- package/dist/src/shell/PinnedControlMenu.d.ts +44 -0
- package/dist/src/shell/PinnedControlMenu.js +72 -0
- package/dist/src/shell/PluginBlockHost.js +2 -1
- package/dist/src/shell/PluginTabHost.js +19 -2
- package/dist/src/shell/PropFields.d.ts +3 -1
- package/dist/src/shell/PropFields.js +9 -6
- package/dist/src/shell/PropRows.d.ts +23 -2
- package/dist/src/shell/PropRows.js +58 -19
- package/dist/src/shell/PropsTab.d.ts +12 -5
- package/dist/src/shell/PropsTab.js +9 -21
- package/dist/src/shell/RefStoryPage.d.ts +33 -0
- package/dist/src/shell/RefStoryPage.js +123 -0
- package/dist/src/shell/SearchPanel.js +51 -24
- package/dist/src/shell/Shell.d.ts +18 -0
- package/dist/src/shell/Shell.js +137 -22
- package/dist/src/shell/ShortcutHelp.d.ts +22 -0
- package/dist/src/shell/ShortcutHelp.js +66 -0
- package/dist/src/shell/Sidebar.d.ts +17 -4
- package/dist/src/shell/Sidebar.js +92 -41
- package/dist/src/shell/SidebarDocs.js +2 -2
- package/dist/src/shell/SidebarEntries.js +5 -3
- package/dist/src/shell/SidebarHandle.d.ts +3 -5
- package/dist/src/shell/SidebarHandle.js +4 -4
- package/dist/src/shell/SidebarRefs.d.ts +39 -0
- package/dist/src/shell/SidebarRefs.js +99 -0
- package/dist/src/shell/SidebarSearch.js +37 -9
- package/dist/src/shell/SignatureReference.js +3 -1
- package/dist/src/shell/Stage.d.ts +10 -2
- package/dist/src/shell/Stage.js +35 -60
- package/dist/src/shell/StatusBadges.d.ts +54 -0
- package/dist/src/shell/StatusBadges.js +77 -0
- package/dist/src/shell/StoryCodeBlock.d.ts +8 -19
- package/dist/src/shell/StoryCodeBlock.js +7 -6
- package/dist/src/shell/SwitchGallery.d.ts +36 -0
- package/dist/src/shell/SwitchGallery.js +17 -0
- package/dist/src/shell/SwitchGalleryPanel.d.ts +37 -0
- package/dist/src/shell/SwitchGalleryPanel.js +99 -0
- package/dist/src/shell/TagFilter.d.ts +24 -0
- package/dist/src/shell/TagFilter.js +45 -0
- package/dist/src/shell/TagViews.d.ts +39 -0
- package/dist/src/shell/TagViews.js +20 -0
- package/dist/src/shell/Toolbar.d.ts +4 -1
- package/dist/src/shell/Toolbar.js +17 -7
- package/dist/src/shell/ToolbarControl.d.ts +3 -0
- package/dist/src/shell/ToolbarControl.js +23 -6
- package/dist/src/shell/ViewMenuPanel.js +6 -1
- package/dist/src/shell/argChecks.d.ts +22 -0
- package/dist/src/shell/argChecks.js +20 -0
- package/dist/src/shell/asideStory.d.ts +17 -4
- package/dist/src/shell/asideStory.js +21 -4
- package/dist/src/shell/audienceSections.css +9 -9
- package/dist/src/shell/catalogueContext.d.ts +1 -1
- package/dist/src/shell/catalogueContext.js +6 -1
- package/dist/src/shell/codeSpans.d.ts +27 -0
- package/dist/src/shell/codeSpans.js +76 -0
- package/dist/src/shell/compareVariants.d.ts +4 -2
- package/dist/src/shell/compareVariants.js +16 -8
- package/dist/src/shell/composition.d.ts +23 -0
- package/dist/src/shell/composition.js +26 -0
- package/dist/src/shell/controlCycle.d.ts +1 -1
- package/dist/src/shell/controlCycle.js +3 -2
- package/dist/src/shell/customControls.d.ts +55 -0
- package/dist/src/shell/customControls.js +70 -0
- package/dist/src/shell/docPage.css +22 -22
- package/dist/src/shell/dockTabs.d.ts +19 -3
- package/dist/src/shell/dockTabs.js +28 -20
- package/dist/src/shell/embed.css +7 -7
- package/dist/src/shell/framesOrigin.d.ts +7 -0
- package/dist/src/shell/framesOrigin.js +1 -1
- package/dist/src/shell/galleryPlace.d.ts +20 -0
- package/dist/src/shell/galleryPlace.js +26 -0
- package/dist/src/shell/icons.d.ts +1 -0
- package/dist/src/shell/icons.js +1 -0
- package/dist/src/shell/keyboard.d.ts +14 -12
- package/dist/src/shell/keyboard.js +21 -6
- package/dist/src/shell/laterStrings.d.ts +29 -0
- package/dist/src/shell/laterStrings.js +42 -3
- package/dist/src/shell/mountShell.js +3 -0
- package/dist/src/shell/pageStrings.d.ts +4 -0
- package/dist/src/shell/pageStrings.js +4 -0
- package/dist/src/shell/pageTagView.d.ts +18 -0
- package/dist/src/shell/pageTagView.js +10 -0
- package/dist/src/shell/playMemory.d.ts +14 -0
- package/dist/src/shell/playMemory.js +8 -0
- package/dist/src/shell/propNotes.d.ts +23 -0
- package/dist/src/shell/propNotes.js +37 -0
- package/dist/src/shell/refIndexLoad.d.ts +17 -0
- package/dist/src/shell/refIndexLoad.js +38 -0
- package/dist/src/shell/refParts.d.ts +34 -0
- package/dist/src/shell/refParts.js +9 -0
- package/dist/src/shell/refStory.css +21 -0
- package/dist/src/shell/refStrings.d.ts +13 -0
- package/dist/src/shell/refStrings.js +21 -0
- package/dist/src/shell/search.css +11 -11
- package/dist/src/shell/shell.css +348 -168
- package/dist/src/shell/shellScheme.js +2 -2
- package/dist/src/shell/shortcutHelp.css +64 -0
- package/dist/src/shell/stageArgs.d.ts +53 -0
- package/dist/src/shell/stageArgs.js +64 -0
- package/dist/src/shell/statusBadges.css +51 -0
- package/dist/src/shell/strings.d.ts +7 -16
- package/dist/src/shell/strings.js +12 -17
- package/dist/src/shell/switchGallery.css +104 -0
- package/dist/src/shell/tagFilter.css +46 -0
- package/dist/src/shell/tagView.d.ts +20 -0
- package/dist/src/shell/tagView.js +10 -0
- package/dist/src/shell/useAddressArgs.d.ts +27 -2
- package/dist/src/shell/useAddressArgs.js +71 -14
- package/dist/src/shell/useControlKeys.js +2 -2
- package/dist/src/shell/useEditedProblems.d.ts +6 -0
- package/dist/src/shell/useEditedProblems.js +40 -0
- package/dist/src/shell/useFrameMessages.js +3 -0
- package/dist/src/shell/useListedTree.d.ts +13 -0
- package/dist/src/shell/useListedTree.js +32 -0
- package/dist/src/shell/usePageFrames.js +2 -2
- package/dist/src/shell/usePopover.d.ts +5 -0
- package/dist/src/shell/usePopover.js +7 -1
- package/dist/src/shell/useRefIndex.d.ts +22 -0
- package/dist/src/shell/useRefIndex.js +36 -0
- package/dist/src/shell/useScrollStops.d.ts +20 -0
- package/dist/src/shell/useScrollStops.js +41 -0
- package/dist/src/shell/useShortcutHelp.d.ts +18 -0
- package/dist/src/shell/useShortcutHelp.js +32 -0
- package/dist/src/shell/useSidebarOverlay.d.ts +2 -1
- package/dist/src/shell/useSidebarOverlay.js +12 -4
- package/dist/src/shell/useStoryCode.d.ts +2 -1
- package/dist/src/shell/useStoryCode.js +12 -7
- package/dist/src/shell/useToolbarLayout.d.ts +5 -1
- package/dist/src/shell/useToolbarLayout.js +2 -2
- package/dist/src/shell/useWorstCase.d.ts +8 -2
- package/dist/src/shell/useWorstCase.js +2 -2
- package/dist/src/shell/valueEditors/FileEditor.d.ts +28 -0
- package/dist/src/shell/valueEditors/FileEditor.js +66 -0
- package/dist/src/shell/valueEditors/JsonEditor.d.ts +14 -0
- package/dist/src/shell/valueEditors/JsonEditor.js +53 -0
- package/dist/src/shell/valueEditors/ListEditor.d.ts +24 -0
- package/dist/src/shell/valueEditors/ListEditor.js +82 -0
- package/dist/src/shell/valueEditors/ObjectEditor.d.ts +32 -0
- package/dist/src/shell/valueEditors/ObjectEditor.js +70 -0
- package/dist/src/shell/valueEditors/PropEditor.d.ts +37 -0
- package/dist/src/shell/valueEditors/PropEditor.js +53 -0
- package/dist/src/shell/valueEditors/RecordEditor.d.ts +20 -0
- package/dist/src/shell/valueEditors/RecordEditor.js +84 -0
- package/dist/src/shell/valueEditors/SearchSelect.d.ts +42 -0
- package/dist/src/shell/valueEditors/SearchSelect.js +80 -0
- package/dist/src/shell/valueEditors/TokenEditor.d.ts +49 -0
- package/dist/src/shell/valueEditors/TokenEditor.js +74 -0
- package/dist/src/shell/valueEditors/UnionEditor.d.ts +20 -0
- package/dist/src/shell/valueEditors/UnionEditor.js +64 -0
- package/dist/src/shell/valueEditors/ValueField.d.ts +15 -0
- package/dist/src/shell/valueEditors/ValueField.js +147 -0
- package/dist/src/shell/valueEditors/editorStrings.d.ts +56 -0
- package/dist/src/shell/valueEditors/editorStrings.js +66 -0
- package/dist/src/shell/valueEditors/fieldTypes.d.ts +31 -0
- package/dist/src/shell/valueEditors/fieldTypes.js +0 -0
- package/dist/src/shell/valueEditors/valueEditors.css +153 -0
- package/dist/src/shell/worstArgs.d.ts +8 -5
- package/dist/src/shell/worstArgs.js +14 -7
- package/dist/src/shellTheme.d.ts +1 -1
- package/dist/src/shellTheme.js +15 -1
- package/dist/src/shellTheme.types.d.ts +4 -0
- package/dist/src/shellWord.d.ts +12 -0
- package/dist/src/shellWord.js +15 -0
- package/dist/src/sourceFiles.js +2 -1
- package/dist/src/storyArgTypes.d.ts +57 -0
- package/dist/src/storyArgTypes.js +195 -0
- package/dist/src/storyBackground.js +14 -3
- package/dist/src/storyCheck.d.ts +85 -3
- package/dist/src/storyCheck.js +23 -1
- package/dist/src/storyCodeText.d.ts +46 -0
- package/dist/src/storyCodeText.js +27 -0
- package/dist/src/storyControls.d.ts +100 -0
- package/dist/src/storyControls.js +100 -0
- package/dist/src/storyStatuses.d.ts +55 -0
- package/dist/src/storyStatuses.js +104 -0
- package/dist/src/storyTagNames.d.ts +25 -0
- package/dist/src/storyTagNames.js +25 -0
- package/dist/src/storyTags.d.ts +29 -0
- package/dist/src/storyTags.js +85 -0
- package/dist/src/storyTree.d.ts +13 -0
- package/dist/src/storyTree.js +24 -4
- package/dist/src/storybookArgs.d.ts +24 -0
- package/dist/src/storybookArgs.js +185 -0
- package/dist/src/switches.d.ts +66 -3
- package/dist/src/switches.js +42 -1
- package/dist/src/valueSchema.d.ts +28 -0
- package/dist/src/valueSchema.js +196 -0
- package/dist/src/valueShape.d.ts +94 -0
- package/dist/src/valueShape.js +25 -0
- package/dist/src/viewState.d.ts +8 -3
- package/dist/src/viewState.js +27 -10
- package/dist/src/vite/adapter.d.ts +40 -2
- package/dist/src/vite/adapter.js +1 -0
- package/dist/src/vite/agent.types.d.ts +347 -7
- package/dist/src/vite/agentApi.d.ts +23 -0
- package/dist/src/vite/agentApi.js +90 -17
- package/dist/src/vite/agentIndex.d.ts +0 -2
- package/dist/src/vite/agentIndex.js +5 -6
- package/dist/src/vite/agentRoutes.d.ts +20 -1
- package/dist/src/vite/agentRoutes.js +106 -65
- package/dist/src/vite/agentStatuses.d.ts +42 -0
- package/dist/src/vite/agentStatuses.js +67 -0
- package/dist/src/vite/agentStoryCode.d.ts +48 -0
- package/dist/src/vite/agentStoryCode.js +38 -0
- package/dist/src/vite/agentVisibility.d.ts +47 -0
- package/dist/src/vite/agentVisibility.js +174 -0
- package/dist/src/vite/appAudit.d.ts +134 -0
- package/dist/src/vite/appAudit.js +333 -0
- package/dist/src/vite/appBuildOption.d.ts +53 -0
- package/dist/src/vite/appBuildOption.js +55 -0
- package/dist/src/vite/appTokenFiles.d.ts +92 -0
- package/dist/src/vite/appTokenFiles.js +433 -0
- package/dist/src/vite/appTokens.d.ts +23 -0
- package/dist/src/vite/appTokens.js +275 -0
- package/dist/src/vite/builtTexts.d.ts +10 -0
- package/dist/src/vite/builtTexts.js +59 -22
- package/dist/src/vite/catalogueConfig.d.ts +3 -1
- package/dist/src/vite/catalogueConfig.js +15 -3
- package/dist/src/vite/changeCoverage.d.ts +74 -0
- package/dist/src/vite/changeCoverage.js +120 -0
- package/dist/src/vite/changedRoute.d.ts +30 -0
- package/dist/src/vite/changedRoute.js +197 -0
- package/dist/src/vite/checkCode.d.ts +105 -3
- package/dist/src/vite/checkCode.js +323 -36
- package/dist/src/vite/checkoutWatch.d.ts +97 -0
- package/dist/src/vite/checkoutWatch.js +287 -0
- package/dist/src/vite/closeWatch.d.ts +8 -0
- package/dist/src/vite/closeWatch.js +1 -1
- package/dist/src/vite/componentCache.d.ts +8 -0
- package/dist/src/vite/componentCache.js +66 -0
- package/dist/src/vite/componentGraph.d.ts +71 -0
- package/dist/src/vite/componentGraph.js +133 -0
- package/dist/src/vite/componentRules.d.ts +33 -0
- package/dist/src/vite/componentRules.js +105 -0
- package/dist/src/vite/componentScan.d.ts +69 -0
- package/dist/src/vite/componentScan.js +418 -0
- package/dist/src/vite/compositionCheck.d.ts +15 -0
- package/dist/src/vite/compositionCheck.js +243 -0
- package/dist/src/vite/config.d.ts +32 -1
- package/dist/src/vite/configFile.d.ts +14 -2
- package/dist/src/vite/configFile.js +124 -40
- package/dist/src/vite/configKeys.d.ts +15 -0
- package/dist/src/vite/configKeys.js +171 -0
- package/dist/src/vite/configLoadError.d.ts +23 -0
- package/dist/src/vite/configLoadError.js +71 -0
- package/dist/src/vite/cssDeclarations.d.ts +71 -0
- package/dist/src/vite/cssDeclarations.js +290 -0
- package/dist/src/vite/cssImports.d.ts +14 -0
- package/dist/src/vite/cssImports.js +48 -0
- package/dist/src/vite/cssReferences.d.ts +54 -0
- package/dist/src/vite/cssReferences.js +157 -0
- package/dist/src/vite/cssTokenValues.d.ts +50 -0
- package/dist/src/vite/cssTokenValues.js +233 -0
- package/dist/src/vite/designTokens.d.ts +24 -0
- package/dist/src/vite/designTokens.js +5 -1
- package/dist/src/vite/docsExtractor.d.ts +9 -3
- package/dist/src/vite/docsExtractor.js +11 -3
- package/dist/src/vite/docsProgram.d.ts +17 -4
- package/dist/src/vite/docsProgram.js +52 -11
- package/dist/src/vite/docsWorker.js +7 -2
- package/dist/src/vite/emptyStoryGlobs.d.ts +41 -0
- package/dist/src/vite/emptyStoryGlobs.js +52 -0
- package/dist/src/vite/fileImports.d.ts +17 -0
- package/dist/src/vite/fileImports.js +57 -0
- package/dist/src/vite/findComponent.d.ts +10 -2
- package/dist/src/vite/findComponent.js +27 -22
- package/dist/src/vite/findRoute.js +3 -2
- package/dist/src/vite/forcedStates.d.ts +9 -2
- package/dist/src/vite/forcedStates.js +12 -3
- package/dist/src/vite/forgebookPlugin.d.ts +2 -0
- package/dist/src/vite/forgebookPlugin.js +52 -72
- package/dist/src/vite/frameErrors.d.ts +19 -0
- package/dist/src/vite/frameErrors.js +70 -0
- package/dist/src/vite/framesServer.d.ts +12 -0
- package/dist/src/vite/framesServer.js +21 -4
- package/dist/src/vite/functionComponentDocs.js +81 -12
- package/dist/src/vite/generatedModules.js +4 -2
- package/dist/src/vite/gitChange.d.ts +38 -5
- package/dist/src/vite/gitChange.js +71 -11
- package/dist/src/vite/hiddenStoryFiles.d.ts +23 -0
- package/dist/src/vite/hiddenStoryFiles.js +107 -0
- package/dist/src/vite/hotSnippets.d.ts +38 -14
- package/dist/src/vite/hotSnippets.js +137 -39
- package/dist/src/vite/importedNames.d.ts +37 -0
- package/dist/src/vite/importedNames.js +138 -0
- package/dist/src/vite/indexFields.d.ts +6 -0
- package/dist/src/vite/indexFields.js +21 -0
- package/dist/src/vite/indexStoryFile.d.ts +8 -1
- package/dist/src/vite/indexStoryFile.js +22 -157
- package/dist/src/vite/jsxCallSites.d.ts +33 -0
- package/dist/src/vite/jsxCallSites.js +200 -0
- package/dist/src/vite/jsxInScripts.d.ts +67 -0
- package/dist/src/vite/jsxInScripts.js +138 -0
- package/dist/src/vite/jsxTree.d.ts +20 -0
- package/dist/src/vite/jsxTree.js +163 -0
- package/dist/src/vite/lineAndColumn.d.ts +13 -0
- package/dist/src/vite/lineAndColumn.js +18 -0
- package/dist/src/vite/lookAlikes.d.ts +65 -0
- package/dist/src/vite/lookAlikes.js +228 -0
- package/dist/src/vite/nearestToken.d.ts +17 -0
- package/dist/src/vite/nearestToken.js +9 -2
- package/dist/src/vite/packageEntries.d.ts +42 -0
- package/dist/src/vite/packageEntries.js +127 -0
- package/dist/src/vite/pages.d.ts +9 -1
- package/dist/src/vite/pages.js +108 -4
- package/dist/src/vite/pluginConfig.js +4 -0
- package/dist/src/vite/pluginIds.d.ts +2 -0
- package/dist/src/vite/pluginIds.js +5 -1
- package/dist/src/vite/pluginModules.d.ts +81 -11
- package/dist/src/vite/pluginModules.js +109 -21
- package/dist/src/vite/prebundled.d.ts +57 -15
- package/dist/src/vite/prebundled.js +80 -0
- package/dist/src/vite/previewTags.d.ts +25 -0
- package/dist/src/vite/previewTags.js +56 -0
- package/dist/src/vite/projectFiles.d.ts +54 -0
- package/dist/src/vite/projectFiles.js +116 -0
- package/dist/src/vite/projectPostcss.d.ts +70 -0
- package/dist/src/vite/projectPostcss.js +250 -0
- package/dist/src/vite/propDocs.d.ts +12 -0
- package/dist/src/vite/propDocs.js +130 -58
- package/dist/src/vite/propKind.d.ts +40 -0
- package/dist/src/vite/propKind.js +71 -0
- package/dist/src/vite/propTypeNotes.d.ts +22 -0
- package/dist/src/vite/propTypeNotes.js +51 -0
- package/dist/src/vite/publishedExports.d.ts +27 -0
- package/dist/src/vite/publishedExports.js +298 -0
- package/dist/src/vite/realFolder.d.ts +6 -0
- package/dist/src/vite/realFolder.js +25 -0
- package/dist/src/vite/refsConfig.d.ts +39 -0
- package/dist/src/vite/refsConfig.js +54 -0
- package/dist/src/vite/reuseCheck.d.ts +45 -0
- package/dist/src/vite/reuseCheck.js +260 -0
- package/dist/src/vite/runningVersions.d.ts +33 -0
- package/dist/src/vite/runningVersions.js +25 -0
- package/dist/src/vite/scriptProblems.d.ts +60 -0
- package/dist/src/vite/scriptProblems.js +155 -0
- package/dist/src/vite/searchModule.js +3 -2
- package/dist/src/vite/searchRoute.js +4 -2
- package/dist/src/vite/shapeDocs.d.ts +36 -0
- package/dist/src/vite/shapeDocs.js +177 -0
- package/dist/src/vite/singleFileComponent.d.ts +17 -0
- package/dist/src/vite/singleFileComponent.js +83 -0
- package/dist/src/vite/sourceText.d.ts +34 -0
- package/dist/src/vite/sourceText.js +72 -0
- package/dist/src/vite/sourceTokens.d.ts +7 -0
- package/dist/src/vite/sourceTokens.js +7 -2
- package/dist/src/vite/stackLines.d.ts +49 -0
- package/dist/src/vite/stackLines.js +96 -0
- package/dist/src/vite/storyCode.d.ts +22 -7
- package/dist/src/vite/storyCode.js +263 -37
- package/dist/src/vite/storyCoverage.d.ts +48 -0
- package/dist/src/vite/storyCoverage.js +179 -0
- package/dist/src/vite/storyFilesModule.d.ts +48 -3
- package/dist/src/vite/storyFilesModule.js +105 -15
- package/dist/src/vite/storyPatterns.d.ts +31 -0
- package/dist/src/vite/storyPatterns.js +140 -5
- package/dist/src/vite/storyReach.d.ts +10 -2
- package/dist/src/vite/storyReach.js +15 -11
- package/dist/src/vite/storyTopLevel.d.ts +51 -0
- package/dist/src/vite/storyTopLevel.js +146 -0
- package/dist/src/vite/storylessRoutes.d.ts +4 -3
- package/dist/src/vite/storylessRoutes.js +210 -19
- package/dist/src/vite/switchValuesCheck.d.ts +19 -0
- package/dist/src/vite/switchValuesCheck.js +164 -0
- package/dist/src/vite/switchesDocument.d.ts +15 -0
- package/dist/src/vite/switchesDocument.js +47 -0
- package/dist/src/vite/tailwindConfigTokens.d.ts +41 -0
- package/dist/src/vite/tailwindConfigTokens.js +306 -0
- package/dist/src/vite/textImports.d.ts +15 -0
- package/dist/src/vite/textImports.js +58 -0
- package/dist/src/vite/textModules.d.ts +6 -5
- package/dist/src/vite/textModules.js +13 -8
- package/dist/src/vite/tokenAnswers.d.ts +6 -2
- package/dist/src/vite/tokenAnswers.js +11 -7
- package/dist/src/vite/typeParameters.d.ts +83 -0
- package/dist/src/vite/typeParameters.js +270 -0
- package/dist/src/vite/unionProps.d.ts +37 -0
- package/dist/src/vite/unionProps.js +121 -0
- package/dist/src/vite/unresolvedTokens.d.ts +20 -0
- package/dist/src/vite/unresolvedTokens.js +193 -0
- package/dist/src/vite/usageGraph.js +10 -52
- package/dist/src/vite/usageGuidance.d.ts +9 -2
- package/dist/src/vite/usageGuidance.js +36 -8
- package/dist/src/vite/usageImports.d.ts +35 -0
- package/dist/src/vite/usageImports.js +280 -0
- package/dist/src/vite/visibilityRoute.d.ts +16 -0
- package/dist/src/vite/visibilityRoute.js +320 -0
- package/dist/src/worstCase.d.ts +2 -0
- package/dist/src/worstCase.js +2 -0
- package/package.json +28 -8
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A generic component's props, written without the type parameters it leaves open: each one shown as its constraint,
|
|
3
|
+
* else its default, else `unknown`. Used by `propDocs.ts` and `propTypeNotes.ts`.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* A prop's text is the one its props type writes (`items: readonly T[]` in `ListProps<T>`), whose `T` is the props
|
|
7
|
+
* type's parameter, while what bounds it is the component's (`<TItem extends string>(props: ListProps<TItem>)`). The
|
|
8
|
+
* props type's parameters are followed to the types the component passes (`bindingsOf`), so the constraint shown is
|
|
9
|
+
* the component's. The replacement is made in the source's text, since the checker's instantiation is not public API.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import ts from "typescript-6";
|
|
14
|
+
/** How deep a type is walked: deep enough for a list of callbacks or a props type built on others; a recursive type ends. */
|
|
15
|
+
const TYPE_DEPTH = 4;
|
|
16
|
+
/** Whether a type is a generic's instance (`Array<TItem>`), whose type arguments the checker lists. */
|
|
17
|
+
const isReference = (type) => (type.flags & ts.TypeFlags.Object) !== 0 && "target" in type;
|
|
18
|
+
/** A type parameter's declaration, when the type is one. */
|
|
19
|
+
const parameterOf = (type) => type.flags & ts.TypeFlags.TypeParameter
|
|
20
|
+
? type.getSymbol()?.declarations?.find(ts.isTypeParameterDeclaration)
|
|
21
|
+
: undefined;
|
|
22
|
+
/**
|
|
23
|
+
* What each type parameter of a props type stands for in this component: an alias's (`type P<T>`) and an interface's,
|
|
24
|
+
* its bases' included, through unions and intersections.
|
|
25
|
+
*
|
|
26
|
+
* @param propsType - the component's props type, as its signature takes it.
|
|
27
|
+
* @param checker - the program's checker.
|
|
28
|
+
*/
|
|
29
|
+
export const bindingsOf = (propsType, checker) => {
|
|
30
|
+
const bindings = new Map();
|
|
31
|
+
const visit = (type, depth) => {
|
|
32
|
+
if (depth === 0)
|
|
33
|
+
return;
|
|
34
|
+
for (const [parameter, bound] of typeArgumentsOf(type, checker)) {
|
|
35
|
+
if (!bindings.has(parameter))
|
|
36
|
+
bindings.set(parameter, bound);
|
|
37
|
+
}
|
|
38
|
+
const inner = type.isUnionOrIntersection() ? type.types : [];
|
|
39
|
+
const bases = isReference(type) && type.target.isClassOrInterface() ? checker.getBaseTypes(type.target) : [];
|
|
40
|
+
for (const each of [...inner, ...bases])
|
|
41
|
+
visit(each, depth - 1);
|
|
42
|
+
};
|
|
43
|
+
visit(propsType, TYPE_DEPTH);
|
|
44
|
+
return bindings;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* The type arguments one type was made with, by the parameter each fills: an alias's (`P<TItem>`) and a generic
|
|
48
|
+
* interface's.
|
|
49
|
+
*
|
|
50
|
+
* @param type - the type.
|
|
51
|
+
* @param checker - the program's checker.
|
|
52
|
+
*/
|
|
53
|
+
const typeArgumentsOf = (type, checker) => {
|
|
54
|
+
const pairs = (parameters, types) => parameters.flatMap((parameter, index) => {
|
|
55
|
+
const bound = types[index];
|
|
56
|
+
return parameter === undefined || bound === undefined ? [] : [[parameter, bound]];
|
|
57
|
+
});
|
|
58
|
+
const alias = type.aliasSymbol?.declarations?.find(ts.isTypeAliasDeclaration);
|
|
59
|
+
const fromAlias = pairs(alias?.typeParameters ?? [], type.aliasTypeArguments ?? []);
|
|
60
|
+
if (!isReference(type))
|
|
61
|
+
return fromAlias;
|
|
62
|
+
return [
|
|
63
|
+
...fromAlias,
|
|
64
|
+
...pairs((type.target.typeParameters ?? []).map(parameterOf), checker.getTypeArguments(type))
|
|
65
|
+
];
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* What a type parameter comes to, following the bindings from the props type's parameter to the component's.
|
|
69
|
+
*
|
|
70
|
+
* @param declaration - the type parameter a type writes.
|
|
71
|
+
* @param bindings - what the props type's parameters stand for.
|
|
72
|
+
*/
|
|
73
|
+
const resolved = (declaration, bindings) => {
|
|
74
|
+
const seen = new Set();
|
|
75
|
+
let current = declaration;
|
|
76
|
+
for (;;) {
|
|
77
|
+
const bound = bindings.get(current);
|
|
78
|
+
if (bound === undefined)
|
|
79
|
+
return { parameter: current };
|
|
80
|
+
const next = parameterOf(bound);
|
|
81
|
+
if (next === undefined)
|
|
82
|
+
return { type: bound };
|
|
83
|
+
if (next === current || seen.has(next))
|
|
84
|
+
return { parameter: next };
|
|
85
|
+
seen.add(current);
|
|
86
|
+
current = next;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
/** Whether a node lies inside another. */
|
|
90
|
+
const isWithin = (node, outer) => node.getSourceFile() === outer.getSourceFile() && node.pos >= outer.pos && node.end <= outer.end;
|
|
91
|
+
/**
|
|
92
|
+
* Every type reference a node writes, in source order.
|
|
93
|
+
*
|
|
94
|
+
* @param node - the node.
|
|
95
|
+
*/
|
|
96
|
+
export const referencesIn = (node) => {
|
|
97
|
+
const found = [];
|
|
98
|
+
const visit = (each) => {
|
|
99
|
+
if (ts.isTypeReferenceNode(each))
|
|
100
|
+
found.push(each);
|
|
101
|
+
ts.forEachChild(each, visit);
|
|
102
|
+
};
|
|
103
|
+
visit(node);
|
|
104
|
+
return found;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* The type parameters a node uses and does not declare itself (a function type's own `<T>` stays as written).
|
|
108
|
+
*
|
|
109
|
+
* @param node - the prop's declared type, or a constraint.
|
|
110
|
+
* @param checker - the program's checker.
|
|
111
|
+
*/
|
|
112
|
+
const parameterUses = (node, checker) => referencesIn(node).flatMap((reference) => {
|
|
113
|
+
const symbol = checker.getSymbolAtLocation(reference.typeName);
|
|
114
|
+
const declaration = symbol?.declarations?.find(ts.isTypeParameterDeclaration);
|
|
115
|
+
return declaration === undefined || isWithin(declaration, node) ? [] : [{ reference, declaration }];
|
|
116
|
+
});
|
|
117
|
+
/**
|
|
118
|
+
* Whether a prop's declared types name a type parameter of the props type: their text then says `TValue` where a props
|
|
119
|
+
* type the component instantiates (`BaseProps<string>`) means `string`.
|
|
120
|
+
*
|
|
121
|
+
* @param declared - the prop's declared types.
|
|
122
|
+
* @param checker - the program's checker.
|
|
123
|
+
*/
|
|
124
|
+
export const usesTypeParameter = (declared, checker) => declared.some((node) => parameterUses(node, checker).length > 0);
|
|
125
|
+
/** What a type parameter is shown as: its constraint, else its default; none for `unknown`. */
|
|
126
|
+
const shownAs = (declaration) => declaration.constraint ?? declaration.default;
|
|
127
|
+
/** Whether a type written in a name's stead needs parentheses there (`readonly (A | B)[]`). */
|
|
128
|
+
const needsParentheses = (reference, isLoose) => {
|
|
129
|
+
const { parent } = reference;
|
|
130
|
+
return (isLoose &&
|
|
131
|
+
(ts.isArrayTypeNode(parent) ||
|
|
132
|
+
ts.isIndexedAccessTypeNode(parent) ||
|
|
133
|
+
ts.isTypeOperatorNode(parent) ||
|
|
134
|
+
ts.isUnionTypeNode(parent) ||
|
|
135
|
+
ts.isIntersectionTypeNode(parent)));
|
|
136
|
+
};
|
|
137
|
+
/** Whether a type node binds looser than an array's element (a union, a function, a conditional, an operator). */
|
|
138
|
+
const isLooseNode = (node) => ts.isUnionTypeNode(node) ||
|
|
139
|
+
ts.isIntersectionTypeNode(node) ||
|
|
140
|
+
ts.isFunctionTypeNode(node) ||
|
|
141
|
+
ts.isConstructorTypeNode(node) ||
|
|
142
|
+
ts.isConditionalTypeNode(node) ||
|
|
143
|
+
ts.isTypeOperatorNode(node);
|
|
144
|
+
/**
|
|
145
|
+
* The text that replaces a type parameter: the type the component gives it, or the component's own parameter's
|
|
146
|
+
* constraint or default as written, `unknown` when it has neither.
|
|
147
|
+
*
|
|
148
|
+
* @param use - the type parameter's use.
|
|
149
|
+
* @param generics - the checker and the bindings.
|
|
150
|
+
* @param seen - the type parameters being replaced, so a constraint naming its own parameter ends.
|
|
151
|
+
*/
|
|
152
|
+
const replacementText = ({ reference, declaration }, generics, seen) => {
|
|
153
|
+
const target = resolved(declaration, generics.bindings);
|
|
154
|
+
if (target.type !== undefined) {
|
|
155
|
+
const text = generics.checker.typeToString(target.type);
|
|
156
|
+
return needsParentheses(reference, target.type.isUnionOrIntersection()) ? `(${text})` : text;
|
|
157
|
+
}
|
|
158
|
+
const node = shownAs(target.parameter);
|
|
159
|
+
if (node === undefined)
|
|
160
|
+
return "unknown";
|
|
161
|
+
// a constraint may name another type parameter (`TName extends FieldPath<TValues>`): it is replaced too, once
|
|
162
|
+
const text = seen.has(target.parameter)
|
|
163
|
+
? target.parameter.name.text
|
|
164
|
+
: genericFreeText(node, generics, new Set([...seen, target.parameter]));
|
|
165
|
+
return needsParentheses(reference, isLooseNode(node)) ? `(${text})` : text;
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* A node's source text with each type parameter it uses replaced by what it is shown as.
|
|
169
|
+
*
|
|
170
|
+
* @param node - the prop's declared type (or one member of it), or a constraint.
|
|
171
|
+
* @param generics - the checker and the bindings.
|
|
172
|
+
* @param seen - the type parameters being replaced.
|
|
173
|
+
* @returns the text, as `getText()` would give it with the replacements made.
|
|
174
|
+
*/
|
|
175
|
+
export const genericFreeText = (node, generics, seen = new Set()) => {
|
|
176
|
+
const text = node.getSourceFile().text;
|
|
177
|
+
let written = "";
|
|
178
|
+
let at = node.getStart();
|
|
179
|
+
for (const use of parameterUses(node, generics.checker)) {
|
|
180
|
+
written += text.slice(at, use.reference.getStart()) + replacementText(use, generics, seen);
|
|
181
|
+
at = use.reference.getEnd();
|
|
182
|
+
}
|
|
183
|
+
return written + text.slice(at, node.getEnd());
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* The type a prop typed by a type parameter is shown as (`selected?: TKey`): what decides its kind and control. Read
|
|
187
|
+
* from the checker's type, whose parameter is the component's own.
|
|
188
|
+
*
|
|
189
|
+
* @param type - the prop's type, as the component takes it.
|
|
190
|
+
* @param checker - the program's checker.
|
|
191
|
+
* @param depth - how many defaults naming another parameter are followed.
|
|
192
|
+
* @returns the type, or none when the prop's type is not a type parameter.
|
|
193
|
+
*/
|
|
194
|
+
export const genericShownType = (type, checker, depth = TYPE_DEPTH) => {
|
|
195
|
+
// `T | undefined` for an optional prop, `T & {}` once `undefined` is taken away
|
|
196
|
+
const members = (type.isUnionOrIntersection() ? type.types : [type]).filter((member) => (member.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Null)) === 0);
|
|
197
|
+
const declarations = members.flatMap((member) => parameterOf(member) ?? []);
|
|
198
|
+
const [declaration] = declarations;
|
|
199
|
+
if (declaration === undefined || declarations.length !== 1)
|
|
200
|
+
return undefined;
|
|
201
|
+
if (type.isUnion() && members.length !== 1)
|
|
202
|
+
return undefined;
|
|
203
|
+
const node = shownAs(declaration);
|
|
204
|
+
if (node === undefined)
|
|
205
|
+
return checker.getUnknownType();
|
|
206
|
+
const shown = checker.getTypeFromTypeNode(node);
|
|
207
|
+
return depth > 0 ? (genericShownType(shown, checker, depth - 1) ?? shown) : shown;
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* Whether a type, as the component takes it, still holds a type parameter: `readonly TItem[]` in a generic component,
|
|
211
|
+
* not the `readonly string[]` of a props type it instantiates (`BaseProps<string>`). Through unions, intersections, a
|
|
212
|
+
* generic's arguments and a function's parameters and result.
|
|
213
|
+
*
|
|
214
|
+
* @param type - the prop's type.
|
|
215
|
+
* @param checker - the program's checker.
|
|
216
|
+
* @param depth - how many levels are left to look into.
|
|
217
|
+
*/
|
|
218
|
+
export const hasTypeParameter = (type, checker, depth = TYPE_DEPTH) => {
|
|
219
|
+
if (type.flags & ts.TypeFlags.TypeParameter)
|
|
220
|
+
return true;
|
|
221
|
+
if (depth === 0)
|
|
222
|
+
return false;
|
|
223
|
+
const inner = (each) => hasTypeParameter(each, checker, depth - 1);
|
|
224
|
+
if (type.isUnionOrIntersection())
|
|
225
|
+
return type.types.some(inner);
|
|
226
|
+
if ((type.aliasTypeArguments ?? []).some(inner))
|
|
227
|
+
return true;
|
|
228
|
+
if (isReference(type) && checker.getTypeArguments(type).some(inner))
|
|
229
|
+
return true;
|
|
230
|
+
return type
|
|
231
|
+
.getCallSignatures()
|
|
232
|
+
.some((signature) => inner(signature.getReturnType()) ||
|
|
233
|
+
signature.getParameters().some((parameter) => inner(checker.getTypeOfSymbol(parameter))));
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* What a component's type parameter is shown as, as a prop's note says it.
|
|
237
|
+
*
|
|
238
|
+
* @param declaration - the component's type parameter.
|
|
239
|
+
* @param generics - the checker and the bindings.
|
|
240
|
+
*/
|
|
241
|
+
const genericNote = (declaration, generics) => {
|
|
242
|
+
const parameter = declaration.name.text;
|
|
243
|
+
const seen = new Set([declaration]);
|
|
244
|
+
if (declaration.constraint !== undefined) {
|
|
245
|
+
const type = genericFreeText(declaration.constraint, generics, seen);
|
|
246
|
+
return { reason: "generic", parameter, shownAs: "constraint", type };
|
|
247
|
+
}
|
|
248
|
+
if (declaration.default !== undefined) {
|
|
249
|
+
const type = genericFreeText(declaration.default, generics, seen);
|
|
250
|
+
return { reason: "generic", parameter, shownAs: "default", type };
|
|
251
|
+
}
|
|
252
|
+
return { reason: "generic", parameter, shownAs: "unknown", type: "unknown" };
|
|
253
|
+
};
|
|
254
|
+
/**
|
|
255
|
+
* The notes of the type parameters a prop's declared types leave open, each once, by the component's name for it.
|
|
256
|
+
*
|
|
257
|
+
* @param declared - the prop's declared types.
|
|
258
|
+
* @param generics - the checker and the bindings.
|
|
259
|
+
*/
|
|
260
|
+
export const genericNotes = (declared, generics) => {
|
|
261
|
+
const notes = new Map();
|
|
262
|
+
for (const node of declared) {
|
|
263
|
+
for (const { declaration } of parameterUses(node, generics.checker)) {
|
|
264
|
+
const { parameter } = resolved(declaration, generics.bindings);
|
|
265
|
+
if (parameter !== undefined && !notes.has(parameter))
|
|
266
|
+
notes.set(parameter, genericNote(parameter, generics));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return [...notes.values()];
|
|
270
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The props of a component whose props are a union of variants (`{ kind: "link"; href } | { kind: "button"; onClick }`):
|
|
3
|
+
* every variant's props, not only the ones all variants share, each prop only some variants declare with the
|
|
4
|
+
* discriminant's values that select them. Used by `functionComponentDocs.ts`.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* The checker lists a union's properties as those every member has, so a variant's own props vanished from the docs
|
|
8
|
+
* with no sign. A prop only some variants declare is never required: whether it must be passed depends on the variant.
|
|
9
|
+
* The discriminant is a prop every variant declares with one literal value (`kind: "link"`) or leaves out; a prop of a
|
|
10
|
+
* variant that takes it left out (`mode?: "single"`) applies then too. A union without one lists its variants' props
|
|
11
|
+
* with no condition. A prop declared by several variants takes all their types.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import ts from "typescript-6";
|
|
16
|
+
import type { PropCondition } from "../componentDocs.ts";
|
|
17
|
+
/** A prop only some variants of a union of props declare. */
|
|
18
|
+
export type VariantProp = {
|
|
19
|
+
/** When it can be passed; none when the union has no discriminant. */
|
|
20
|
+
readonly onlyWhen: PropCondition | undefined;
|
|
21
|
+
/** The same prop as each variant that declares it has it, the first included: their types together are its type. */
|
|
22
|
+
readonly declarations: readonly ts.Symbol[];
|
|
23
|
+
};
|
|
24
|
+
/** The props of a component's props type. */
|
|
25
|
+
export type TypeProps = {
|
|
26
|
+
/** Every prop, of every variant, each once: the shared ones first, then each variant's own in the order they come. */
|
|
27
|
+
readonly props: readonly ts.Symbol[];
|
|
28
|
+
/** The props only some variants declare, by the symbol `props` lists for each. */
|
|
29
|
+
readonly variantOnly: ReadonlyMap<ts.Symbol, VariantProp>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* A component's props, read from its props type: a plain type's own, or every variant's of a union.
|
|
33
|
+
*
|
|
34
|
+
* @param propsType - the type of its props, without `undefined`.
|
|
35
|
+
* @param checker - the program's checker.
|
|
36
|
+
*/
|
|
37
|
+
export declare const propsOfType: (propsType: ts.Type, checker: ts.TypeChecker) => TypeProps;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The props of a component whose props are a union of variants (`{ kind: "link"; href } | { kind: "button"; onClick }`):
|
|
3
|
+
* every variant's props, not only the ones all variants share, each prop only some variants declare with the
|
|
4
|
+
* discriminant's values that select them. Used by `functionComponentDocs.ts`.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* The checker lists a union's properties as those every member has, so a variant's own props vanished from the docs
|
|
8
|
+
* with no sign. A prop only some variants declare is never required: whether it must be passed depends on the variant.
|
|
9
|
+
* The discriminant is a prop every variant declares with one literal value (`kind: "link"`) or leaves out; a prop of a
|
|
10
|
+
* variant that takes it left out (`mode?: "single"`) applies then too. A union without one lists its variants' props
|
|
11
|
+
* with no condition. A prop declared by several variants takes all their types.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import ts from "typescript-6";
|
|
16
|
+
/**
|
|
17
|
+
* A discriminant's value in one variant: the literal its type is, `null` when the variant leaves it out
|
|
18
|
+
* (`mode?: undefined`), none when its type is anything else.
|
|
19
|
+
*/
|
|
20
|
+
const literalOf = (type, checker) => {
|
|
21
|
+
if (type.isStringLiteral() || type.isNumberLiteral())
|
|
22
|
+
return type.value;
|
|
23
|
+
if (type.flags & ts.TypeFlags.BooleanLiteral)
|
|
24
|
+
return checker.typeToString(type) === "true";
|
|
25
|
+
return type.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Never) ? null : undefined;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* A prop's value in one variant, when it can discriminate: one literal, or left out.
|
|
29
|
+
*
|
|
30
|
+
* @param variant - the variant.
|
|
31
|
+
* @param name - the prop.
|
|
32
|
+
* @param checker - the program's checker.
|
|
33
|
+
*/
|
|
34
|
+
const variantValueOf = (variant, name, checker) => {
|
|
35
|
+
const member = checker.getPropertyOfType(variant, name);
|
|
36
|
+
if (member === undefined)
|
|
37
|
+
return undefined;
|
|
38
|
+
const type = checker.getTypeOfSymbol(member);
|
|
39
|
+
const value = literalOf(checker.getNonNullableType(type), checker);
|
|
40
|
+
if (value === undefined)
|
|
41
|
+
return undefined;
|
|
42
|
+
const canBeOmitted = (member.flags & ts.SymbolFlags.Optional) !== 0 ||
|
|
43
|
+
(type.isUnion() && type.types.some((each) => (each.flags & ts.TypeFlags.Undefined) !== 0));
|
|
44
|
+
return { value, canBeOmitted };
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* The discriminant of a union of props: among the shared props each variant declares with one literal value or leaves
|
|
48
|
+
* out, the one with the most different values (`mode` over `required` in a date picker's props), the first on a tie.
|
|
49
|
+
*
|
|
50
|
+
* @param shared - the props every variant declares.
|
|
51
|
+
* @param variants - the union's members.
|
|
52
|
+
* @param checker - the program's checker.
|
|
53
|
+
* @returns the discriminant, or none when the union has none.
|
|
54
|
+
*/
|
|
55
|
+
const discriminantOf = (shared, variants, checker) => {
|
|
56
|
+
let best;
|
|
57
|
+
for (const prop of shared) {
|
|
58
|
+
const name = prop.getName();
|
|
59
|
+
const values = variants.map((variant) => variantValueOf(variant, name, checker));
|
|
60
|
+
if (!values.every((value) => value !== undefined))
|
|
61
|
+
continue;
|
|
62
|
+
const count = new Set(values.flatMap(({ value }) => (value === null ? [] : [value]))).size;
|
|
63
|
+
if (count > 1 && (best === undefined || count > best.count)) {
|
|
64
|
+
best = { discriminant: { name, variants: values }, count };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return best?.discriminant;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Notes one variant's declaration of a prop: its symbol, and the discriminant's value there.
|
|
71
|
+
*
|
|
72
|
+
* @param entry - the prop, as read so far.
|
|
73
|
+
* @param prop - its symbol in this variant.
|
|
74
|
+
* @param at - the discriminant in this variant; none when the union has none.
|
|
75
|
+
*/
|
|
76
|
+
const record = (entry, prop, at) => {
|
|
77
|
+
entry.declarations.push(prop);
|
|
78
|
+
if (at === undefined)
|
|
79
|
+
return;
|
|
80
|
+
if (at.canBeOmitted || at.value === null)
|
|
81
|
+
entry.canBeOmitted = true;
|
|
82
|
+
if (at.value !== null && !entry.values.includes(at.value))
|
|
83
|
+
entry.values.push(at.value);
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* A component's props, read from its props type: a plain type's own, or every variant's of a union.
|
|
87
|
+
*
|
|
88
|
+
* @param propsType - the type of its props, without `undefined`.
|
|
89
|
+
* @param checker - the program's checker.
|
|
90
|
+
*/
|
|
91
|
+
export const propsOfType = (propsType, checker) => {
|
|
92
|
+
const shared = propsType.getProperties();
|
|
93
|
+
if (!propsType.isUnion())
|
|
94
|
+
return { props: shared, variantOnly: new Map() };
|
|
95
|
+
const variants = propsType.types;
|
|
96
|
+
const sharedNames = new Set(shared.map((prop) => prop.getName()));
|
|
97
|
+
const discriminant = discriminantOf(shared, variants, checker);
|
|
98
|
+
const own = new Map();
|
|
99
|
+
variants.forEach((variant, index) => {
|
|
100
|
+
const at = discriminant?.variants[index];
|
|
101
|
+
for (const prop of variant.getProperties()) {
|
|
102
|
+
const name = prop.getName();
|
|
103
|
+
if (sharedNames.has(name))
|
|
104
|
+
continue;
|
|
105
|
+
const entry = own.get(name) ?? { declarations: [], values: [], canBeOmitted: false };
|
|
106
|
+
own.set(name, entry);
|
|
107
|
+
record(entry, prop, at);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
const variantOnly = new Map();
|
|
111
|
+
for (const { declarations, values, canBeOmitted } of own.values()) {
|
|
112
|
+
const [first] = declarations;
|
|
113
|
+
if (first === undefined)
|
|
114
|
+
continue;
|
|
115
|
+
const onlyWhen = discriminant === undefined
|
|
116
|
+
? undefined
|
|
117
|
+
: { prop: discriminant.name, values, ...(canBeOmitted ? { orOmitted: true } : {}) };
|
|
118
|
+
variantOnly.set(first, { onlyWhen, declarations });
|
|
119
|
+
}
|
|
120
|
+
return { props: [...shared, ...variantOnly.keys()], variantOnly };
|
|
121
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ReadConfig, type ReadSheet } from "./appTokenFiles.ts";
|
|
2
|
+
import type { TokenDeclaration } from "./cssTokenValues.ts";
|
|
3
|
+
/** What the check found. */
|
|
4
|
+
export type UnresolvedTokens = {
|
|
5
|
+
/** Tokens with no value, one line each with its file and line. */
|
|
6
|
+
readonly problems: readonly string[];
|
|
7
|
+
/** Tokens that may have no value, where what declares the name could not all be read. */
|
|
8
|
+
readonly unread: readonly string[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Finds the tokens that resolve to nothing.
|
|
12
|
+
*
|
|
13
|
+
* @param dir - the catalogue's folder, its links followed.
|
|
14
|
+
* @param read - the sheets and configurations read, and the declarations tokens are made from, the lowest first.
|
|
15
|
+
*/
|
|
16
|
+
export declare const unresolvedTokens: (dir: string, read: {
|
|
17
|
+
readonly sheets: readonly ReadSheet[];
|
|
18
|
+
readonly configs: readonly ReadConfig[];
|
|
19
|
+
readonly declarations: readonly TokenDeclaration[];
|
|
20
|
+
}) => UnresolvedTokens;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tokens of an application's sheets that a browser gives no value, as problems: a reference that leads back to
|
|
3
|
+
* itself, or one to a name nothing declares.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* A token that resolves to nothing draws the UI with no colour or no size, and nothing else says so: the browser drops the
|
|
7
|
+
* declaration in silence. A cycle in the base is always a problem. A name the sheets do not declare may still get a value:
|
|
8
|
+
* another rule declares it, `@property` registers it, an installed package's sheet does, or code sets it (`next/font`
|
|
9
|
+
* writes `--font-geist-sans` on the page's element). So the names every sheet read declares count, those of the packages
|
|
10
|
+
* the sheets import count, and so does a name the repository's files write as code sets one: in quotes, as a declaration
|
|
11
|
+
* (`--gap:` in a template, a `.vue` style block, a sheet not read), a Svelte `style:` directive, a Tailwind arbitrary
|
|
12
|
+
* property. When that cannot all be known (a package's sheet that cannot be read, a sheet that builds names with Sass or
|
|
13
|
+
* Less, the files that cannot be searched), or when a cycle exists only inside a theme, which depends on the element the
|
|
14
|
+
* theme is set on, the line is something not read, which fails nothing, and never a problem that might be false. The
|
|
15
|
+
* repository is searched only for names already found missing, so an answer with none reads nothing more.
|
|
16
|
+
*
|
|
17
|
+
* @module
|
|
18
|
+
*/
|
|
19
|
+
import { spawnSync } from "node:child_process";
|
|
20
|
+
import { importedPackageSheets, repositoryOf } from "./appTokenFiles.js";
|
|
21
|
+
import { readCssText } from "./cssDeclarations.js";
|
|
22
|
+
import { brokenReferences } from "./cssReferences.js";
|
|
23
|
+
/** The files a custom property is set in, by code or by a sheet this does not read as the application's system. */
|
|
24
|
+
const SEARCHED_FILES = [
|
|
25
|
+
"*.js",
|
|
26
|
+
"*.jsx",
|
|
27
|
+
"*.mjs",
|
|
28
|
+
"*.cjs",
|
|
29
|
+
"*.ts",
|
|
30
|
+
"*.tsx",
|
|
31
|
+
"*.mts",
|
|
32
|
+
"*.cts",
|
|
33
|
+
"*.vue",
|
|
34
|
+
"*.svelte",
|
|
35
|
+
"*.astro",
|
|
36
|
+
"*.html",
|
|
37
|
+
"*.css",
|
|
38
|
+
"*.scss",
|
|
39
|
+
"*.sass",
|
|
40
|
+
"*.less",
|
|
41
|
+
"*.pcss",
|
|
42
|
+
"*.postcss"
|
|
43
|
+
];
|
|
44
|
+
/** How long git may take to search the repository, in milliseconds. */
|
|
45
|
+
const SEARCH_TIMEOUT = 10_000;
|
|
46
|
+
/** How many names a line gives, of a cycle or of tokens that could not be told: past a few, they say nothing more. */
|
|
47
|
+
const MOST_NAMED = 5;
|
|
48
|
+
/** A name built by Sass or Less interpolation (`--#{$key}`, `--@{key}`), which no reading of the text can know. */
|
|
49
|
+
const BUILT_NAME = /--(?:#\{|@\{)/;
|
|
50
|
+
/** A custom property `@property` registers: it has its initial value wherever nothing else sets it. */
|
|
51
|
+
const REGISTERED = /@property\s+(--[\w-]+)/g;
|
|
52
|
+
/**
|
|
53
|
+
* The names of custom properties sheets declare. A cleared one (`initial`) gives no value, and one that only reads its own
|
|
54
|
+
* name (Tailwind's `@theme inline { --font-sans: var(--font-sans); }`) takes its value from elsewhere.
|
|
55
|
+
*/
|
|
56
|
+
const declaredNames = (readings, texts) => {
|
|
57
|
+
const declared = new Set(readings.flatMap(({ declarations }) => declarations.flatMap(({ name, value }) => (isOwnReference(name, value) ? [] : [name]))));
|
|
58
|
+
for (const text of texts)
|
|
59
|
+
for (const [, name = ""] of text.matchAll(REGISTERED))
|
|
60
|
+
declared.add(name);
|
|
61
|
+
return declared;
|
|
62
|
+
};
|
|
63
|
+
/** Whether a value gives no value of its own: cleared, or reading only its own name. */
|
|
64
|
+
const isOwnReference = (name, value) => value === "initial" || value.replace(/\s/g, "") === `var(${name})`;
|
|
65
|
+
/**
|
|
66
|
+
* Whether a line of a file sets a name: in quotes (`variable: "--font-sans"`, `style={{ "--gap": … }}`,
|
|
67
|
+
* `setProperty("--gap", …)`), as a declaration (`--gap: 4px`) that is not only its own name, a Svelte `style:` directive
|
|
68
|
+
* or a Tailwind arbitrary property (`[--gap:4px]`). A reference is `var(--gap)`, which none of these match.
|
|
69
|
+
*/
|
|
70
|
+
const setsName = (line, name) => {
|
|
71
|
+
if ([`"${name}"`, `'${name}'`, `\`${name}\``, `style:${name}=`, `[${name}:`].some((form) => line.includes(form))) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
const at = line.indexOf(`${name}:`);
|
|
75
|
+
if (at === -1)
|
|
76
|
+
return false;
|
|
77
|
+
const value = line.slice(at + name.length + 1).split(/[;}]/)[0] ?? "";
|
|
78
|
+
return !isOwnReference(name, value.trim());
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* The names among some that the repository's files set, searched as fixed strings, which git matches all at once where
|
|
82
|
+
* a pattern per name takes seconds; the strings go on its input, since a command line has a limit on Windows. None when
|
|
83
|
+
* the files cannot be searched.
|
|
84
|
+
*/
|
|
85
|
+
const namesSetIn = (root, names) => {
|
|
86
|
+
// a repository's configuration may name a program for git to run: nothing here is to run
|
|
87
|
+
const found = spawnSync("git", [
|
|
88
|
+
"-c",
|
|
89
|
+
"core.fsmonitor=false",
|
|
90
|
+
"grep",
|
|
91
|
+
"--untracked",
|
|
92
|
+
"-I",
|
|
93
|
+
"-h",
|
|
94
|
+
"-F",
|
|
95
|
+
"-f",
|
|
96
|
+
"-",
|
|
97
|
+
"--",
|
|
98
|
+
...SEARCHED_FILES
|
|
99
|
+
], {
|
|
100
|
+
cwd: root,
|
|
101
|
+
input: names.join("\n"),
|
|
102
|
+
encoding: "utf8",
|
|
103
|
+
timeout: SEARCH_TIMEOUT,
|
|
104
|
+
maxBuffer: 64 * 1024 * 1024
|
|
105
|
+
});
|
|
106
|
+
if (found.status === 1)
|
|
107
|
+
return new Set();
|
|
108
|
+
if (found.status !== 0)
|
|
109
|
+
return undefined;
|
|
110
|
+
const lines = found.stdout.split("\n");
|
|
111
|
+
return new Set(names.filter((name) => lines.some((line) => line.includes(name) && setsName(line, name))));
|
|
112
|
+
};
|
|
113
|
+
/** Where a declaration stands, for a line that names it. */
|
|
114
|
+
const placeOf = ({ origin }) => origin.line === undefined ? origin.file : `${origin.file}:${origin.line}`;
|
|
115
|
+
/** What is wrong with a declaration, without where. */
|
|
116
|
+
const whatOf = (broken) => {
|
|
117
|
+
const { name } = broken.declaration;
|
|
118
|
+
if (broken.kind === "undeclared")
|
|
119
|
+
return `${name} reads var(${broken.target})`;
|
|
120
|
+
const shown = broken.through.slice(0, MOST_NAMED);
|
|
121
|
+
const more = broken.through.length - shown.length;
|
|
122
|
+
const names = more > 0 ? `${shown.join(", ")} and ${more} more` : shown.join(", ");
|
|
123
|
+
const theme = broken.mode === undefined ? "" : ` in the ${broken.mode} theme`;
|
|
124
|
+
return `${name} leads back to ${shown.length === 0 ? "itself" : `itself through ${names}`}${theme}`;
|
|
125
|
+
};
|
|
126
|
+
/** A problem's line. */
|
|
127
|
+
const problemOf = (broken) => {
|
|
128
|
+
const at = placeOf(broken.declaration);
|
|
129
|
+
if (broken.kind === "cycle")
|
|
130
|
+
return `${at}: ${whatOf(broken)}, so a browser gives it no value`;
|
|
131
|
+
return `${at}: ${whatOf(broken)}, which nothing declares, so a browser gives it no value: declare ${broken.target} or give it a fallback`;
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* What could not be told for one reason, one line a token, or one line in all past a few: an application whose
|
|
135
|
+
* dependencies are not installed has hundreds, and each says the same.
|
|
136
|
+
*/
|
|
137
|
+
const unsureLines = (unsure, why) => {
|
|
138
|
+
if (unsure.length <= MOST_NAMED)
|
|
139
|
+
return unsure.map((each) => `${placeOf(each.declaration)}: ${whatOf(each)}: ${why}`);
|
|
140
|
+
const shown = unsure.slice(0, MOST_NAMED).map(whatOf).join("; ");
|
|
141
|
+
return [
|
|
142
|
+
`${unsure.length} tokens may have no value (${shown}; and ${unsure.length - MOST_NAMED} more): ${why}`
|
|
143
|
+
];
|
|
144
|
+
};
|
|
145
|
+
/** Why a name nothing read declares cannot be called missing; none when it can. */
|
|
146
|
+
const doubtOf = (unreadable, hasBuiltNames, setInFiles) => {
|
|
147
|
+
if (setInFiles === undefined)
|
|
148
|
+
return "nothing read declares it, and the repository could not be searched for it";
|
|
149
|
+
if (hasBuiltNames)
|
|
150
|
+
return "nothing read declares it, and a sheet builds names with Sass or Less, which only running it knows";
|
|
151
|
+
if (unreadable.length > 0) {
|
|
152
|
+
const named = unreadable.map((each) => `"${each}"`).join(", ");
|
|
153
|
+
return `nothing read declares it; it may come from ${named}, which could not be read`;
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Finds the tokens that resolve to nothing.
|
|
159
|
+
*
|
|
160
|
+
* @param dir - the catalogue's folder, its links followed.
|
|
161
|
+
* @param read - the sheets and configurations read, and the declarations tokens are made from, the lowest first.
|
|
162
|
+
*/
|
|
163
|
+
export const unresolvedTokens = (dir, read) => {
|
|
164
|
+
const packages = importedPackageSheets(dir, read.sheets);
|
|
165
|
+
const declared = declaredNames([...read.sheets.map(({ reading }) => reading), ...packages.texts.map((text) => readCssText(text))], [...read.sheets.map(({ text }) => text), ...packages.texts]);
|
|
166
|
+
for (const { reading } of read.configs)
|
|
167
|
+
for (const { name } of reading.tokens)
|
|
168
|
+
declared.add(name);
|
|
169
|
+
const broken = brokenReferences(read.declarations, (name) => declared.has(name)).filter(({ declaration }) => declaration.origin.kind !== "tailwind-default");
|
|
170
|
+
const missing = [...new Set(broken.flatMap((each) => (each.kind === "undeclared" ? [each.target] : [])))];
|
|
171
|
+
const setInFiles = missing.length === 0 ? new Set() : namesSetIn(repositoryOf(dir), missing);
|
|
172
|
+
const hasBuiltNames = read.sheets.some(({ text }) => BUILT_NAME.test(text));
|
|
173
|
+
const doubt = doubtOf(packages.unreadable, hasBuiltNames, setInFiles);
|
|
174
|
+
const problems = [];
|
|
175
|
+
const inTheme = [];
|
|
176
|
+
const doubted = [];
|
|
177
|
+
for (const each of broken) {
|
|
178
|
+
if (each.kind === "cycle" && each.mode !== undefined)
|
|
179
|
+
inTheme.push(each);
|
|
180
|
+
else if (each.kind === "cycle" || (doubt === undefined && setInFiles?.has(each.target) !== true)) {
|
|
181
|
+
problems.push(problemOf(each));
|
|
182
|
+
}
|
|
183
|
+
else if (setInFiles?.has(each.target) !== true)
|
|
184
|
+
doubted.push(each);
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
problems,
|
|
188
|
+
unread: [
|
|
189
|
+
...unsureLines(inTheme, "a browser gives it no value if the theme is set on the root, as its base is"),
|
|
190
|
+
...(doubt === undefined ? [] : unsureLines(doubted, doubt))
|
|
191
|
+
]
|
|
192
|
+
};
|
|
193
|
+
};
|