@xylabs/toolchain 7.10.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/dist/actions/analyze.mjs +140 -0
- package/dist/actions/analyze.mjs.map +1 -0
- package/dist/actions/build.mjs +173 -0
- package/dist/actions/build.mjs.map +1 -0
- package/dist/actions/claude-check.mjs +199 -0
- package/dist/actions/claude-check.mjs.map +1 -0
- package/dist/actions/claude-clean.mjs +70 -0
- package/dist/actions/claude-clean.mjs.map +1 -0
- package/dist/actions/claude-commands.mjs +126 -0
- package/dist/actions/claude-commands.mjs.map +1 -0
- package/dist/actions/claude-rules.mjs +151 -0
- package/dist/actions/claude-rules.mjs.map +1 -0
- package/dist/actions/claude-settings.mjs +99 -0
- package/dist/actions/claude-settings.mjs.map +1 -0
- package/dist/actions/claude-skills.mjs +131 -0
- package/dist/actions/claude-skills.mjs.map +1 -0
- package/dist/actions/clean-docs.mjs +66 -0
- package/dist/actions/clean-docs.mjs.map +1 -0
- package/dist/actions/clean-eslint.mjs +47 -0
- package/dist/actions/clean-eslint.mjs.map +1 -0
- package/dist/actions/clean.mjs +166 -0
- package/dist/actions/clean.mjs.map +1 -0
- package/dist/actions/compile.mjs +184 -0
- package/dist/actions/compile.mjs.map +1 -0
- package/dist/actions/copy-assets.mjs +81 -0
- package/dist/actions/copy-assets.mjs.map +1 -0
- package/dist/actions/cycle.mjs +275 -0
- package/dist/actions/cycle.mjs.map +1 -0
- package/dist/actions/dead.mjs +119 -0
- package/dist/actions/dead.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/checkPackage.mjs +1556 -0
- package/dist/actions/deplint/checkPackage/checkPackage.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/checkPackageTypes.mjs +1 -0
- package/dist/actions/deplint/checkPackage/checkPackageTypes.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getMismatchedPeerDevVersions.mjs +77 -0
- package/dist/actions/deplint/checkPackage/getMismatchedPeerDevVersions.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs +158 -0
- package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs +125 -0
- package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnnecessaryPeerDependencies.mjs +207 -0
- package/dist/actions/deplint/checkPackage/getUnnecessaryPeerDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.mjs +318 -0
- package/dist/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs +163 -0
- package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs +408 -0
- package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs +75 -0
- package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/getWorkspaceVersionProblems.mjs +128 -0
- package/dist/actions/deplint/checkPackage/getWorkspaceVersionProblems.mjs.map +1 -0
- package/dist/actions/deplint/checkPackage/index.mjs +1609 -0
- package/dist/actions/deplint/checkPackage/index.mjs.map +1 -0
- package/dist/actions/deplint/deplint.mjs +1840 -0
- package/dist/actions/deplint/deplint.mjs.map +1 -0
- package/dist/actions/deplint/engine.mjs +1736 -0
- package/dist/actions/deplint/engine.mjs.map +1 -0
- package/dist/actions/deplint/findFiles.mjs +39 -0
- package/dist/actions/deplint/findFiles.mjs.map +1 -0
- package/dist/actions/deplint/findFilesByGlob.mjs +14 -0
- package/dist/actions/deplint/findFilesByGlob.mjs.map +1 -0
- package/dist/actions/deplint/fixer.mjs +103 -0
- package/dist/actions/deplint/fixer.mjs.map +1 -0
- package/dist/actions/deplint/getBasePackageName.mjs +13 -0
- package/dist/actions/deplint/getBasePackageName.mjs.map +1 -0
- package/dist/actions/deplint/getCliReferencedPackagesFromFiles.mjs +140 -0
- package/dist/actions/deplint/getCliReferencedPackagesFromFiles.mjs.map +1 -0
- package/dist/actions/deplint/getDependenciesFromPackageJson.mjs +29 -0
- package/dist/actions/deplint/getDependenciesFromPackageJson.mjs.map +1 -0
- package/dist/actions/deplint/getExtendsFromTsconfigs.mjs +68 -0
- package/dist/actions/deplint/getExtendsFromTsconfigs.mjs.map +1 -0
- package/dist/actions/deplint/getExternalImportsFromFiles.mjs +143 -0
- package/dist/actions/deplint/getExternalImportsFromFiles.mjs.map +1 -0
- package/dist/actions/deplint/getImportsFromFile.mjs +85 -0
- package/dist/actions/deplint/getImportsFromFile.mjs.map +1 -0
- package/dist/actions/deplint/getRequiredPeerDependencies.mjs +37 -0
- package/dist/actions/deplint/getRequiredPeerDependencies.mjs.map +1 -0
- package/dist/actions/deplint/getScriptReferencedPackages.mjs +83 -0
- package/dist/actions/deplint/getScriptReferencedPackages.mjs.map +1 -0
- package/dist/actions/deplint/implicitDevDependencies.mjs +116 -0
- package/dist/actions/deplint/implicitDevDependencies.mjs.map +1 -0
- package/dist/actions/deplint/index.mjs +1848 -0
- package/dist/actions/deplint/index.mjs.map +1 -0
- package/dist/actions/deplint/packageEditor.mjs +82 -0
- package/dist/actions/deplint/packageEditor.mjs.map +1 -0
- package/dist/actions/deplint/packageJsonEditor.mjs +101 -0
- package/dist/actions/deplint/packageJsonEditor.mjs.map +1 -0
- package/dist/actions/deplint/reporters.mjs +36 -0
- package/dist/actions/deplint/reporters.mjs.map +1 -0
- package/dist/actions/deplint/rules.mjs +1223 -0
- package/dist/actions/deplint/rules.mjs.map +1 -0
- package/dist/actions/deplint/snapshot.mjs +372 -0
- package/dist/actions/deplint/snapshot.mjs.map +1 -0
- package/dist/actions/deplint/tsScriptsAliases.mjs +20 -0
- package/dist/actions/deplint/tsScriptsAliases.mjs.map +1 -0
- package/dist/actions/deplint/types.mjs +1 -0
- package/dist/actions/deplint/types.mjs.map +1 -0
- package/dist/actions/deploy.mjs +194 -0
- package/dist/actions/deploy.mjs.map +1 -0
- package/dist/actions/dupdeps.mjs +226 -0
- package/dist/actions/dupdeps.mjs.map +1 -0
- package/dist/actions/eject.mjs +142 -0
- package/dist/actions/eject.mjs.map +1 -0
- package/dist/actions/fix.mjs +359 -0
- package/dist/actions/fix.mjs.map +1 -0
- package/dist/actions/gen-docs.mjs +155 -0
- package/dist/actions/gen-docs.mjs.map +1 -0
- package/dist/actions/gitignore.mjs +159 -0
- package/dist/actions/gitignore.mjs.map +1 -0
- package/dist/actions/gitlint-fix.mjs +27 -0
- package/dist/actions/gitlint-fix.mjs.map +1 -0
- package/dist/actions/gitlint.mjs +48 -0
- package/dist/actions/gitlint.mjs.map +1 -0
- package/dist/actions/index.mjs +8259 -0
- package/dist/actions/index.mjs.map +1 -0
- package/dist/actions/knip.mjs +119 -0
- package/dist/actions/knip.mjs.map +1 -0
- package/dist/actions/license.mjs +92 -0
- package/dist/actions/license.mjs.map +1 -0
- package/dist/actions/lint-init.mjs +275 -0
- package/dist/actions/lint-init.mjs.map +1 -0
- package/dist/actions/lint.mjs +356 -0
- package/dist/actions/lint.mjs.map +1 -0
- package/dist/actions/lintNext.mjs +209 -0
- package/dist/actions/lintNext.mjs.map +1 -0
- package/dist/actions/lintlint.mjs +341 -0
- package/dist/actions/lintlint.mjs.map +1 -0
- package/dist/actions/npmignore-gen.mjs +90 -0
- package/dist/actions/npmignore-gen.mjs.map +1 -0
- package/dist/actions/orphan.mjs +110 -0
- package/dist/actions/orphan.mjs.map +1 -0
- package/dist/actions/package/clean-outputs.mjs +50 -0
- package/dist/actions/package/clean-outputs.mjs.map +1 -0
- package/dist/actions/package/clean-typescript.mjs +50 -0
- package/dist/actions/package/clean-typescript.mjs.map +1 -0
- package/dist/actions/package/clean.mjs +69 -0
- package/dist/actions/package/clean.mjs.map +1 -0
- package/dist/actions/package/compile/XyConfig.mjs +32 -0
- package/dist/actions/package/compile/XyConfig.mjs.map +1 -0
- package/dist/actions/package/compile/buildEntries.mjs +53 -0
- package/dist/actions/package/compile/buildEntries.mjs.map +1 -0
- package/dist/actions/package/compile/compile.mjs +439 -0
- package/dist/actions/package/compile/compile.mjs.map +1 -0
- package/dist/actions/package/compile/copyTypeFiles.mjs +34 -0
- package/dist/actions/package/compile/copyTypeFiles.mjs.map +1 -0
- package/dist/actions/package/compile/deepMerge.mjs +27 -0
- package/dist/actions/package/compile/deepMerge.mjs.map +1 -0
- package/dist/actions/package/compile/getCompilerOptions.mjs +12 -0
- package/dist/actions/package/compile/getCompilerOptions.mjs.map +1 -0
- package/dist/actions/package/compile/index.mjs +472 -0
- package/dist/actions/package/compile/index.mjs.map +1 -0
- package/dist/actions/package/compile/inputs.mjs +22 -0
- package/dist/actions/package/compile/inputs.mjs.map +1 -0
- package/dist/actions/package/compile/packageCompileTsc.mjs +93 -0
- package/dist/actions/package/compile/packageCompileTsc.mjs.map +1 -0
- package/dist/actions/package/compile/packageCompileTscTypes.mjs +92 -0
- package/dist/actions/package/compile/packageCompileTscTypes.mjs.map +1 -0
- package/dist/actions/package/compile/packageCompileTsup.mjs +402 -0
- package/dist/actions/package/compile/packageCompileTsup.mjs.map +1 -0
- package/dist/actions/package/copy-assets.mjs +69 -0
- package/dist/actions/package/copy-assets.mjs.map +1 -0
- package/dist/actions/package/cycle.mjs +62 -0
- package/dist/actions/package/cycle.mjs.map +1 -0
- package/dist/actions/package/gen-docs.mjs +137 -0
- package/dist/actions/package/gen-docs.mjs.map +1 -0
- package/dist/actions/package/index.mjs +1131 -0
- package/dist/actions/package/index.mjs.map +1 -0
- package/dist/actions/package/lint.mjs +87 -0
- package/dist/actions/package/lint.mjs.map +1 -0
- package/dist/actions/package/publint.mjs +336 -0
- package/dist/actions/package/publint.mjs.map +1 -0
- package/dist/actions/package/recompile.mjs +510 -0
- package/dist/actions/package/recompile.mjs.map +1 -0
- package/dist/actions/package-lint-deps.mjs +348 -0
- package/dist/actions/package-lint-deps.mjs.map +1 -0
- package/dist/actions/package-lint.mjs +774 -0
- package/dist/actions/package-lint.mjs.map +1 -0
- package/dist/actions/packman/clean.mjs +144 -0
- package/dist/actions/packman/clean.mjs.map +1 -0
- package/dist/actions/packman/convert.mjs +1331 -0
- package/dist/actions/packman/convert.mjs.map +1 -0
- package/dist/actions/packman/convertToPnpm.mjs +295 -0
- package/dist/actions/packman/convertToPnpm.mjs.map +1 -0
- package/dist/actions/packman/convertToYarn.mjs +307 -0
- package/dist/actions/packman/convertToYarn.mjs.map +1 -0
- package/dist/actions/packman/index.mjs +1493 -0
- package/dist/actions/packman/index.mjs.map +1 -0
- package/dist/actions/packman/lint.mjs +109 -0
- package/dist/actions/packman/lint.mjs.map +1 -0
- package/dist/actions/packman/rewriteScripts.mjs +52 -0
- package/dist/actions/packman/rewriteScripts.mjs.map +1 -0
- package/dist/actions/packman/rewriteSourceImports.mjs +60 -0
- package/dist/actions/packman/rewriteSourceImports.mjs.map +1 -0
- package/dist/actions/packman/swapTsScriptsDependency.mjs +57 -0
- package/dist/actions/packman/swapTsScriptsDependency.mjs.map +1 -0
- package/dist/actions/publint.mjs +748 -0
- package/dist/actions/publint.mjs.map +1 -0
- package/dist/actions/publish.mjs +208 -0
- package/dist/actions/publish.mjs.map +1 -0
- package/dist/actions/reactTest.mjs +142 -0
- package/dist/actions/reactTest.mjs.map +1 -0
- package/dist/actions/readme-gen.mjs +362 -0
- package/dist/actions/readme-gen.mjs.map +1 -0
- package/dist/actions/readme-init.mjs +89 -0
- package/dist/actions/readme-init.mjs.map +1 -0
- package/dist/actions/readme-lint.mjs +147 -0
- package/dist/actions/readme-lint.mjs.map +1 -0
- package/dist/actions/rebuild.mjs +143 -0
- package/dist/actions/rebuild.mjs.map +1 -0
- package/dist/actions/recompile.mjs +196 -0
- package/dist/actions/recompile.mjs.map +1 -0
- package/dist/actions/reinstall.mjs +283 -0
- package/dist/actions/reinstall.mjs.map +1 -0
- package/dist/actions/relint.mjs +355 -0
- package/dist/actions/relint.mjs.map +1 -0
- package/dist/actions/repo-init.mjs +217 -0
- package/dist/actions/repo-init.mjs.map +1 -0
- package/dist/actions/retest.mjs +150 -0
- package/dist/actions/retest.mjs.map +1 -0
- package/dist/actions/sitemap.mjs +121 -0
- package/dist/actions/sitemap.mjs.map +1 -0
- package/dist/actions/sonar.mjs +119 -0
- package/dist/actions/sonar.mjs.map +1 -0
- package/dist/actions/start.mjs +142 -0
- package/dist/actions/start.mjs.map +1 -0
- package/dist/actions/statics.mjs +225 -0
- package/dist/actions/statics.mjs.map +1 -0
- package/dist/actions/test.mjs +144 -0
- package/dist/actions/test.mjs.map +1 -0
- package/dist/actions/up.mjs +140 -0
- package/dist/actions/up.mjs.map +1 -0
- package/dist/actions/updo.mjs +533 -0
- package/dist/actions/updo.mjs.map +1 -0
- package/dist/actions/upplug.mjs +124 -0
- package/dist/actions/upplug.mjs.map +1 -0
- package/dist/actions/upyarn.mjs +119 -0
- package/dist/actions/upyarn.mjs.map +1 -0
- package/dist/actions/yarn3only.mjs +60 -0
- package/dist/actions/yarn3only.mjs.map +1 -0
- package/dist/bin/package/build-only.mjs +451 -0
- package/dist/bin/package/build-only.mjs.map +1 -0
- package/dist/bin/package/build.mjs +451 -0
- package/dist/bin/package/build.mjs.map +1 -0
- package/dist/bin/package/clean-outputs.mjs +50 -0
- package/dist/bin/package/clean-outputs.mjs.map +1 -0
- package/dist/bin/package/clean-typescript.mjs +50 -0
- package/dist/bin/package/clean-typescript.mjs.map +1 -0
- package/dist/bin/package/clean.mjs +75 -0
- package/dist/bin/package/clean.mjs.map +1 -0
- package/dist/bin/package/compile-only.mjs +447 -0
- package/dist/bin/package/compile-only.mjs.map +1 -0
- package/dist/bin/package/compile-tsup.mjs +409 -0
- package/dist/bin/package/compile-tsup.mjs.map +1 -0
- package/dist/bin/package/compile.mjs +451 -0
- package/dist/bin/package/compile.mjs.map +1 -0
- package/dist/bin/package/copy-assets-cjs.mjs +75 -0
- package/dist/bin/package/copy-assets-cjs.mjs.map +1 -0
- package/dist/bin/package/copy-assets-esm.mjs +75 -0
- package/dist/bin/package/copy-assets-esm.mjs.map +1 -0
- package/dist/bin/package/cycle.mjs +72 -0
- package/dist/bin/package/cycle.mjs.map +1 -0
- package/dist/bin/package/fix.mjs +97 -0
- package/dist/bin/package/fix.mjs.map +1 -0
- package/dist/bin/package/gen-docs.mjs +142 -0
- package/dist/bin/package/gen-docs.mjs.map +1 -0
- package/dist/bin/package/lint-verbose.mjs +97 -0
- package/dist/bin/package/lint-verbose.mjs.map +1 -0
- package/dist/bin/package/lint.mjs +97 -0
- package/dist/bin/package/lint.mjs.map +1 -0
- package/dist/bin/package/publint.mjs +423 -0
- package/dist/bin/package/publint.mjs.map +1 -0
- package/dist/bin/package/recompile.mjs +516 -0
- package/dist/bin/package/recompile.mjs.map +1 -0
- package/dist/bin/package/relint.mjs +97 -0
- package/dist/bin/package/relint.mjs.map +1 -0
- package/dist/bin/run-or-exec.mjs +20 -0
- package/dist/bin/run-or-exec.mjs.map +1 -0
- package/dist/bin/xy.mjs +8885 -0
- package/dist/bin/xy.mjs.map +1 -0
- package/dist/index.d.ts +1102 -0
- package/dist/index.mjs +9986 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/checkResult.mjs +16 -0
- package/dist/lib/checkResult.mjs.map +1 -0
- package/dist/lib/claudeMdTemplate.mjs +69 -0
- package/dist/lib/claudeMdTemplate.mjs.map +1 -0
- package/dist/lib/concurrency.mjs +38 -0
- package/dist/lib/concurrency.mjs.map +1 -0
- package/dist/lib/createBuildConfig.mjs +55 -0
- package/dist/lib/createBuildConfig.mjs.map +1 -0
- package/dist/lib/defaultBuildConfig.mjs +23 -0
- package/dist/lib/defaultBuildConfig.mjs.map +1 -0
- package/dist/lib/deleteGlob.mjs +13 -0
- package/dist/lib/deleteGlob.mjs.map +1 -0
- package/dist/lib/dependencies/DuplicateDetector.mjs +99 -0
- package/dist/lib/dependencies/DuplicateDetector.mjs.map +1 -0
- package/dist/lib/dependencies/detectDuplicateDependencies.mjs +203 -0
- package/dist/lib/dependencies/detectDuplicateDependencies.mjs.map +1 -0
- package/dist/lib/dependencies/index.mjs +281 -0
- package/dist/lib/dependencies/index.mjs.map +1 -0
- package/dist/lib/dependencies/workspaceCycles.mjs +79 -0
- package/dist/lib/dependencies/workspaceCycles.mjs.map +1 -0
- package/dist/lib/file/ReadFileSyncOptions.mjs +6 -0
- package/dist/lib/file/ReadFileSyncOptions.mjs.map +1 -0
- package/dist/lib/file/constants.mjs +8 -0
- package/dist/lib/file/constants.mjs.map +1 -0
- package/dist/lib/file/fileLines.mjs +32 -0
- package/dist/lib/file/fileLines.mjs.map +1 -0
- package/dist/lib/file/index.mjs +42 -0
- package/dist/lib/file/index.mjs.map +1 -0
- package/dist/lib/file/tryReadFileSync.mjs +14 -0
- package/dist/lib/file/tryReadFileSync.mjs.map +1 -0
- package/dist/lib/fillTemplate.mjs +8 -0
- package/dist/lib/fillTemplate.mjs.map +1 -0
- package/dist/lib/generateIgnoreFiles.mjs +86 -0
- package/dist/lib/generateIgnoreFiles.mjs.map +1 -0
- package/dist/lib/generateReadmeFiles.mjs +323 -0
- package/dist/lib/generateReadmeFiles.mjs.map +1 -0
- package/dist/lib/gitignoreTemplate.mjs +12 -0
- package/dist/lib/gitignoreTemplate.mjs.map +1 -0
- package/dist/lib/index.mjs +1627 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/initCwd.mjs +8 -0
- package/dist/lib/initCwd.mjs.map +1 -0
- package/dist/lib/jsonFormatters.mjs +11 -0
- package/dist/lib/jsonFormatters.mjs.map +1 -0
- package/dist/lib/latestVersions.mjs +12 -0
- package/dist/lib/latestVersions.mjs.map +1 -0
- package/dist/lib/loadConfig.mjs +72 -0
- package/dist/lib/loadConfig.mjs.map +1 -0
- package/dist/lib/packageName.mjs +26 -0
- package/dist/lib/packageName.mjs.map +1 -0
- package/dist/lib/parsedPackageJSON.mjs +11 -0
- package/dist/lib/parsedPackageJSON.mjs.map +1 -0
- package/dist/lib/processEx.mjs +36 -0
- package/dist/lib/processEx.mjs.map +1 -0
- package/dist/lib/repoTemplates.mjs +34 -0
- package/dist/lib/repoTemplates.mjs.map +1 -0
- package/dist/lib/runInstall.mjs +30 -0
- package/dist/lib/runInstall.mjs.map +1 -0
- package/dist/lib/runSteps.mjs +118 -0
- package/dist/lib/runSteps.mjs.map +1 -0
- package/dist/lib/runStepsAsync.mjs +136 -0
- package/dist/lib/runStepsAsync.mjs.map +1 -0
- package/dist/lib/runXy.mjs +147 -0
- package/dist/lib/runXy.mjs.map +1 -0
- package/dist/lib/runXyWithWarning.mjs +36 -0
- package/dist/lib/runXyWithWarning.mjs.map +1 -0
- package/dist/lib/safeExit.mjs +61 -0
- package/dist/lib/safeExit.mjs.map +1 -0
- package/dist/lib/string/empty.mjs +8 -0
- package/dist/lib/string/empty.mjs.map +1 -0
- package/dist/lib/string/index.mjs +12 -0
- package/dist/lib/string/index.mjs.map +1 -0
- package/dist/lib/string/union.mjs +6 -0
- package/dist/lib/string/union.mjs.map +1 -0
- package/dist/lib/tryRunLocalScript.mjs +57 -0
- package/dist/lib/tryRunLocalScript.mjs.map +1 -0
- package/dist/lib/updo/applyUpdates.mjs +44 -0
- package/dist/lib/updo/applyUpdates.mjs.map +1 -0
- package/dist/lib/updo/collectWorkspaceDeps.mjs +48 -0
- package/dist/lib/updo/collectWorkspaceDeps.mjs.map +1 -0
- package/dist/lib/updo/fetchRegistryInfo.mjs +53 -0
- package/dist/lib/updo/fetchRegistryInfo.mjs.map +1 -0
- package/dist/lib/updo/index.mjs +594 -0
- package/dist/lib/updo/index.mjs.map +1 -0
- package/dist/lib/updo/interactiveSelect.mjs +185 -0
- package/dist/lib/updo/interactiveSelect.mjs.map +1 -0
- package/dist/lib/updo/interfaces.mjs +1 -0
- package/dist/lib/updo/interfaces.mjs.map +1 -0
- package/dist/lib/updo/renderTable.mjs +79 -0
- package/dist/lib/updo/renderTable.mjs.map +1 -0
- package/dist/lib/updo/resolveVersions.mjs +49 -0
- package/dist/lib/updo/resolveVersions.mjs.map +1 -0
- package/dist/lib/updo/runUpdo.mjs +511 -0
- package/dist/lib/updo/runUpdo.mjs.map +1 -0
- package/dist/lib/withErrnoException.mjs +13 -0
- package/dist/lib/withErrnoException.mjs.map +1 -0
- package/dist/lib/withError.mjs +8 -0
- package/dist/lib/withError.mjs.map +1 -0
- package/dist/lib/yarn/index.mjs +39 -0
- package/dist/lib/yarn/index.mjs.map +1 -0
- package/dist/lib/yarn/isYarnVersionOrGreater.mjs +18 -0
- package/dist/lib/yarn/isYarnVersionOrGreater.mjs.map +1 -0
- package/dist/lib/yarn/workspace/Workspace.mjs +1 -0
- package/dist/lib/yarn/workspace/Workspace.mjs.map +1 -0
- package/dist/lib/yarn/workspace/index.mjs +23 -0
- package/dist/lib/yarn/workspace/index.mjs.map +1 -0
- package/dist/lib/yarn/workspace/yarnWorkspace.mjs +22 -0
- package/dist/lib/yarn/workspace/yarnWorkspace.mjs.map +1 -0
- package/dist/lib/yarn/workspace/yarnWorkspaces.mjs +15 -0
- package/dist/lib/yarn/workspace/yarnWorkspaces.mjs.map +1 -0
- package/dist/lib/yarn/yarnInitCwd.mjs +8 -0
- package/dist/lib/yarn/yarnInitCwd.mjs.map +1 -0
- package/dist/loadPackageConfig.mjs +18 -0
- package/dist/loadPackageConfig.mjs.map +1 -0
- package/dist/pm/PackageManager.mjs +1 -0
- package/dist/pm/PackageManager.mjs.map +1 -0
- package/dist/pm/detectPackageManager.mjs +10 -0
- package/dist/pm/detectPackageManager.mjs.map +1 -0
- package/dist/pm/detectReact.mjs +52 -0
- package/dist/pm/detectReact.mjs.map +1 -0
- package/dist/pm/index.mjs +263 -0
- package/dist/pm/index.mjs.map +1 -0
- package/dist/pm/pnpmPackageManager.mjs +97 -0
- package/dist/pm/pnpmPackageManager.mjs.map +1 -0
- package/dist/pm/registry.mjs +27 -0
- package/dist/pm/registry.mjs.map +1 -0
- package/dist/pm/yarnPackageManager.mjs +112 -0
- package/dist/pm/yarnPackageManager.mjs.map +1 -0
- package/dist/types.d.mjs +1 -0
- package/dist/types.d.mjs.map +1 -0
- package/dist/xy/build/buildCommand.mjs +194 -0
- package/dist/xy/build/buildCommand.mjs.map +1 -0
- package/dist/xy/build/compileCommand.mjs +203 -0
- package/dist/xy/build/compileCommand.mjs.map +1 -0
- package/dist/xy/build/compileOnlyCommand.mjs +204 -0
- package/dist/xy/build/compileOnlyCommand.mjs.map +1 -0
- package/dist/xy/build/copyAssetsCommand.mjs +92 -0
- package/dist/xy/build/copyAssetsCommand.mjs.map +1 -0
- package/dist/xy/build/index.mjs +487 -0
- package/dist/xy/build/index.mjs.map +1 -0
- package/dist/xy/build/rebuildCommand.mjs +156 -0
- package/dist/xy/build/rebuildCommand.mjs.map +1 -0
- package/dist/xy/build/recompileCommand.mjs +215 -0
- package/dist/xy/build/recompileCommand.mjs.map +1 -0
- package/dist/xy/common/checkCommand.mjs +1909 -0
- package/dist/xy/common/checkCommand.mjs.map +1 -0
- package/dist/xy/common/claude/checkCommand.mjs +207 -0
- package/dist/xy/common/claude/checkCommand.mjs.map +1 -0
- package/dist/xy/common/claude/cleanCommand.mjs +78 -0
- package/dist/xy/common/claude/cleanCommand.mjs.map +1 -0
- package/dist/xy/common/claude/commandsCommand.mjs +134 -0
- package/dist/xy/common/claude/commandsCommand.mjs.map +1 -0
- package/dist/xy/common/claude/index.mjs +734 -0
- package/dist/xy/common/claude/index.mjs.map +1 -0
- package/dist/xy/common/claude/initCommand.mjs +458 -0
- package/dist/xy/common/claude/initCommand.mjs.map +1 -0
- package/dist/xy/common/claude/rulesCommand.mjs +167 -0
- package/dist/xy/common/claude/rulesCommand.mjs.map +1 -0
- package/dist/xy/common/claude/settingsCommand.mjs +115 -0
- package/dist/xy/common/claude/settingsCommand.mjs.map +1 -0
- package/dist/xy/common/claude/skillsCommand.mjs +140 -0
- package/dist/xy/common/claude/skillsCommand.mjs.map +1 -0
- package/dist/xy/common/cleanDocsCommand.mjs +74 -0
- package/dist/xy/common/cleanDocsCommand.mjs.map +1 -0
- package/dist/xy/common/deadCommand.mjs +137 -0
- package/dist/xy/common/deadCommand.mjs.map +1 -0
- package/dist/xy/common/genDocsCommand.mjs +175 -0
- package/dist/xy/common/genDocsCommand.mjs.map +1 -0
- package/dist/xy/common/gitignoreCommand.mjs +165 -0
- package/dist/xy/common/gitignoreCommand.mjs.map +1 -0
- package/dist/xy/common/gitlintCommand.mjs +89 -0
- package/dist/xy/common/gitlintCommand.mjs.map +1 -0
- package/dist/xy/common/index.mjs +4654 -0
- package/dist/xy/common/index.mjs.map +1 -0
- package/dist/xy/common/licenseCommand.mjs +108 -0
- package/dist/xy/common/licenseCommand.mjs.map +1 -0
- package/dist/xy/common/npmignoreGenCommand.mjs +100 -0
- package/dist/xy/common/npmignoreGenCommand.mjs.map +1 -0
- package/dist/xy/common/orphan/cleanCommand.mjs +102 -0
- package/dist/xy/common/orphan/cleanCommand.mjs.map +1 -0
- package/dist/xy/common/orphan/index.mjs +138 -0
- package/dist/xy/common/orphan/index.mjs.map +1 -0
- package/dist/xy/common/orphan/listCommand.mjs +100 -0
- package/dist/xy/common/orphan/listCommand.mjs.map +1 -0
- package/dist/xy/common/packmanCommand.mjs +1538 -0
- package/dist/xy/common/packmanCommand.mjs.map +1 -0
- package/dist/xy/common/readme/genCommand.mjs +395 -0
- package/dist/xy/common/readme/genCommand.mjs.map +1 -0
- package/dist/xy/common/readme/index.mjs +538 -0
- package/dist/xy/common/readme/index.mjs.map +1 -0
- package/dist/xy/common/readme/initCommand.mjs +109 -0
- package/dist/xy/common/readme/initCommand.mjs.map +1 -0
- package/dist/xy/common/readme/lintCommand.mjs +181 -0
- package/dist/xy/common/readme/lintCommand.mjs.map +1 -0
- package/dist/xy/common/repo/index.mjs +1070 -0
- package/dist/xy/common/repo/index.mjs.map +1 -0
- package/dist/xy/common/repo/initCommand.mjs +273 -0
- package/dist/xy/common/repo/initCommand.mjs.map +1 -0
- package/dist/xy/common/repo/lintCommand.mjs +789 -0
- package/dist/xy/common/repo/lintCommand.mjs.map +1 -0
- package/dist/xy/common/retestCommand.mjs +163 -0
- package/dist/xy/common/retestCommand.mjs.map +1 -0
- package/dist/xy/common/testCommand.mjs +157 -0
- package/dist/xy/common/testCommand.mjs.map +1 -0
- package/dist/xy/deploy/deployCommand.mjs +214 -0
- package/dist/xy/deploy/deployCommand.mjs.map +1 -0
- package/dist/xy/deploy/index.mjs +289 -0
- package/dist/xy/deploy/index.mjs.map +1 -0
- package/dist/xy/deploy/publishCommand.mjs +218 -0
- package/dist/xy/deploy/publishCommand.mjs.map +1 -0
- package/dist/xy/index.mjs +8887 -0
- package/dist/xy/index.mjs.map +1 -0
- package/dist/xy/install/cleanCommand.mjs +182 -0
- package/dist/xy/install/cleanCommand.mjs.map +1 -0
- package/dist/xy/install/dupdepsCommand.mjs +234 -0
- package/dist/xy/install/dupdepsCommand.mjs.map +1 -0
- package/dist/xy/install/index.mjs +1006 -0
- package/dist/xy/install/index.mjs.map +1 -0
- package/dist/xy/install/reinstallCommand.mjs +292 -0
- package/dist/xy/install/reinstallCommand.mjs.map +1 -0
- package/dist/xy/install/staticsCommand.mjs +233 -0
- package/dist/xy/install/staticsCommand.mjs.map +1 -0
- package/dist/xy/install/upCommand.mjs +150 -0
- package/dist/xy/install/upCommand.mjs.map +1 -0
- package/dist/xy/install/updoCommand.mjs +550 -0
- package/dist/xy/install/updoCommand.mjs.map +1 -0
- package/dist/xy/lint/cycleCommand.mjs +289 -0
- package/dist/xy/lint/cycleCommand.mjs.map +1 -0
- package/dist/xy/lint/deplintCommand.mjs +1897 -0
- package/dist/xy/lint/deplintCommand.mjs.map +1 -0
- package/dist/xy/lint/fixCommand.mjs +398 -0
- package/dist/xy/lint/fixCommand.mjs.map +1 -0
- package/dist/xy/lint/index.mjs +3759 -0
- package/dist/xy/lint/index.mjs.map +1 -0
- package/dist/xy/lint/knipCommand.mjs +142 -0
- package/dist/xy/lint/knipCommand.mjs.map +1 -0
- package/dist/xy/lint/lint/index.mjs +695 -0
- package/dist/xy/lint/lint/index.mjs.map +1 -0
- package/dist/xy/lint/lint/initCommand.mjs +282 -0
- package/dist/xy/lint/lint/initCommand.mjs.map +1 -0
- package/dist/xy/lint/lint/runCommand.mjs +405 -0
- package/dist/xy/lint/lint/runCommand.mjs.map +1 -0
- package/dist/xy/lint/lintCommand.mjs +695 -0
- package/dist/xy/lint/lintCommand.mjs.map +1 -0
- package/dist/xy/lint/lintlintCommand.mjs +359 -0
- package/dist/xy/lint/lintlintCommand.mjs.map +1 -0
- package/dist/xy/lint/publintCommand.mjs +778 -0
- package/dist/xy/lint/publintCommand.mjs.map +1 -0
- package/dist/xy/lint/relintCommand.mjs +381 -0
- package/dist/xy/lint/relintCommand.mjs.map +1 -0
- package/dist/xy/lint/sonarCommand.mjs +137 -0
- package/dist/xy/lint/sonarCommand.mjs.map +1 -0
- package/dist/xy/param.mjs +8 -0
- package/dist/xy/param.mjs.map +1 -0
- package/dist/xy/react/analyzeCommand.mjs +150 -0
- package/dist/xy/react/analyzeCommand.mjs.map +1 -0
- package/dist/xy/react/ejectCommand.mjs +150 -0
- package/dist/xy/react/ejectCommand.mjs.map +1 -0
- package/dist/xy/react/index.mjs +202 -0
- package/dist/xy/react/index.mjs.map +1 -0
- package/dist/xy/react/sitemapCommand.mjs +129 -0
- package/dist/xy/react/sitemapCommand.mjs.map +1 -0
- package/dist/xy/react/startCommand.mjs +150 -0
- package/dist/xy/react/startCommand.mjs.map +1 -0
- package/dist/xy/xy.mjs +8879 -0
- package/dist/xy/xy.mjs.map +1 -0
- package/dist/xy/xyParseOptions.mjs +117 -0
- package/dist/xy/xyParseOptions.mjs.map +1 -0
- package/dist/xy/yarn/index.mjs +188 -0
- package/dist/xy/yarn/index.mjs.map +1 -0
- package/dist/xy/yarn/upplugCommand.mjs +134 -0
- package/dist/xy/yarn/upplugCommand.mjs.map +1 -0
- package/dist/xy/yarn/upyarnCommand.mjs +129 -0
- package/dist/xy/yarn/upyarnCommand.mjs.map +1 -0
- package/dist/xy/yarn/yarn3OnlyCommand.mjs +70 -0
- package/dist/xy/yarn/yarn3OnlyCommand.mjs.map +1 -0
- package/package.json +119 -0
- package/templates/claude/CLAUDE-local.md +4 -0
- package/templates/claude/CLAUDE-project.md +4 -0
- package/templates/claude/commands/xy-build.md +7 -0
- package/templates/claude/commands/xy-clean.md +7 -0
- package/templates/claude/commands/xy-compile.md +7 -0
- package/templates/claude/commands/xy-cycle.md +7 -0
- package/templates/claude/commands/xy-dead.md +7 -0
- package/templates/claude/commands/xy-deplint.md +7 -0
- package/templates/claude/commands/xy-deps.md +24 -0
- package/templates/claude/commands/xy-dupdeps.md +7 -0
- package/templates/claude/commands/xy-fix.md +7 -0
- package/templates/claude/commands/xy-gen-docs.md +7 -0
- package/templates/claude/commands/xy-gitignore.md +7 -0
- package/templates/claude/commands/xy-gitlint.md +7 -0
- package/templates/claude/commands/xy-knip.md +7 -0
- package/templates/claude/commands/xy-license.md +7 -0
- package/templates/claude/commands/xy-lint-rules.md +44 -0
- package/templates/claude/commands/xy-lint.md +7 -0
- package/templates/claude/commands/xy-publint.md +7 -0
- package/templates/claude/commands/xy-rebuild.md +7 -0
- package/templates/claude/commands/xy-recompile.md +7 -0
- package/templates/claude/commands/xy-reinstall.md +7 -0
- package/templates/claude/commands/xy-relint.md +7 -0
- package/templates/claude/commands/xy-retest.md +7 -0
- package/templates/claude/commands/xy-sonar.md +7 -0
- package/templates/claude/commands/xy-test.md +7 -0
- package/templates/claude/commands/xy-up.md +9 -0
- package/templates/claude/rules/xylabs-architecture.md +8 -0
- package/templates/claude/rules/xylabs-git-workflow.md +7 -0
- package/templates/claude/rules/xylabs-naming.md +7 -0
- package/templates/claude/rules/xylabs-style.md +17 -0
- package/templates/claude/skills/xylabs-e2e-setup/SKILL.md +223 -0
- package/templates/claude/skills/xylabs-xy-cli/SKILL.md +236 -0
- package/templates/claude/skills/xylabs-xy-deplint-fix/SKILL.md +122 -0
- package/templates/gitignore/gitignore/template.gitignore +51 -0
- package/templates/gitignore/template.gitignore +51 -0
- package/templates/readme/README.body.md +25 -0
- package/templates/readme/README.template.md +22 -0
- package/templates/repo/cli/package/package.json.tmpl +63 -0
- package/templates/repo/cli/package/src/__packageName__.ts.tmpl +21 -0
- package/templates/repo/cli/package/src/actions/index.ts +1 -0
- package/templates/repo/cli/package/src/actions/printVersion.ts.tmpl +8 -0
- package/templates/repo/cli/package/src/bin/__packageName__.ts.tmpl +12 -0
- package/templates/repo/cli/package/src/commands/index.ts +1 -0
- package/templates/repo/cli/package/src/commands/versionCommand.ts.tmpl +11 -0
- package/templates/repo/cli/package/src/index.ts.tmpl +1 -0
- package/templates/repo/cli/package/tsconfig.build.json +25 -0
- package/templates/repo/cli/package/tsconfig.json +4 -0
- package/templates/repo/cli/package/tsup.config.ts +15 -0
- package/templates/repo/cli/package/xy.config.ts +3 -0
- package/templates/repo/cli/root/CLAUDE.md.tmpl +38 -0
- package/templates/repo/cli/root/cspell.json.tmpl +13 -0
- package/templates/repo/cli/root/eslint.config.ts +28 -0
- package/templates/repo/cli/root/github/workflows/build-pnpm.yml.tmpl +34 -0
- package/templates/repo/cli/root/github/workflows/build-yarn.yml.tmpl +32 -0
- package/templates/repo/cli/root/gitignore.tmpl +47 -0
- package/templates/repo/cli/root/knip.config.ts +16 -0
- package/templates/repo/cli/root/package.json.tmpl +54 -0
- package/templates/repo/cli/root/pnpm-workspace.yaml +2 -0
- package/templates/repo/cli/root/tsconfig.json +4 -0
- package/templates/repo/cli/root/vitest.config.ts +31 -0
- package/templates/repo/cli/root/xy.config.ts.tmpl +5 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
// src/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.ts
|
|
2
|
+
import fs2 from "fs";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import semver from "semver";
|
|
5
|
+
import sortPackageJson from "sort-package-json";
|
|
6
|
+
|
|
7
|
+
// src/actions/deplint/getRequiredPeerDependencies.ts
|
|
8
|
+
import fs from "fs";
|
|
9
|
+
import path from "path";
|
|
10
|
+
function findDepPackageJson(location, dep) {
|
|
11
|
+
let dir = location;
|
|
12
|
+
while (true) {
|
|
13
|
+
const candidate = path.join(dir, "node_modules", dep, "package.json");
|
|
14
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
15
|
+
const parent = path.dirname(dir);
|
|
16
|
+
if (parent === dir) return void 0;
|
|
17
|
+
dir = parent;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// src/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.ts
|
|
22
|
+
function readDepPackageJson(location, dep) {
|
|
23
|
+
const depPkgPath = findDepPackageJson(location, dep);
|
|
24
|
+
if (!depPkgPath) return void 0;
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(fs2.readFileSync(depPkgPath, "utf8"));
|
|
27
|
+
} catch {
|
|
28
|
+
return void 0;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function readPeerDeps(location, dep) {
|
|
32
|
+
const pkg = readDepPackageJson(location, dep);
|
|
33
|
+
if (!pkg) return [];
|
|
34
|
+
const peers = pkg.peerDependencies;
|
|
35
|
+
return Object.keys(peers ?? {});
|
|
36
|
+
}
|
|
37
|
+
function readPeerVersionRange(location, dep, peer) {
|
|
38
|
+
const pkg = readDepPackageJson(location, dep);
|
|
39
|
+
if (!pkg) return void 0;
|
|
40
|
+
const peers = pkg.peerDependencies;
|
|
41
|
+
return peers?.[peer];
|
|
42
|
+
}
|
|
43
|
+
function readInstalledVersion(location, dep) {
|
|
44
|
+
const pkg = readDepPackageJson(location, dep);
|
|
45
|
+
if (!pkg) return void 0;
|
|
46
|
+
return pkg.version;
|
|
47
|
+
}
|
|
48
|
+
function isPeerOptionalInAll(location, peer, sources) {
|
|
49
|
+
for (const source of sources) {
|
|
50
|
+
const pkg = readDepPackageJson(location, source.requiredBy);
|
|
51
|
+
if (!pkg) continue;
|
|
52
|
+
const meta = pkg.peerDependenciesMeta?.[peer];
|
|
53
|
+
if (!meta?.optional) return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
var MAX_TRANSITIVE_DEPTH = 2;
|
|
58
|
+
function collectPeerSources(location, dependencies, devDependencies) {
|
|
59
|
+
const peerSources = /* @__PURE__ */ new Map();
|
|
60
|
+
const visited = /* @__PURE__ */ new Set();
|
|
61
|
+
function addPeerSource(peer, source) {
|
|
62
|
+
const sources = peerSources.get(peer) ?? [];
|
|
63
|
+
sources.push(source);
|
|
64
|
+
peerSources.set(peer, sources);
|
|
65
|
+
}
|
|
66
|
+
function collectFromDeps(deps, isRuntime, chain) {
|
|
67
|
+
for (const dep of deps) {
|
|
68
|
+
const visitKey = `${dep}:${chain.join(">")}`;
|
|
69
|
+
if (visited.has(visitKey)) continue;
|
|
70
|
+
visited.add(visitKey);
|
|
71
|
+
for (const peer of readPeerDeps(location, dep)) {
|
|
72
|
+
addPeerSource(peer, {
|
|
73
|
+
chain: chain.length > 0 ? [...chain, dep] : void 0,
|
|
74
|
+
isRuntimeDep: isRuntime,
|
|
75
|
+
requiredBy: dep
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (chain.length < MAX_TRANSITIVE_DEPTH) {
|
|
79
|
+
const depPkg = readDepPackageJson(location, dep);
|
|
80
|
+
if (depPkg) {
|
|
81
|
+
const transitiveDeps = Object.keys(depPkg.dependencies ?? {});
|
|
82
|
+
collectFromDeps(transitiveDeps, isRuntime, [...chain, dep]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
collectFromDeps(dependencies, true, []);
|
|
88
|
+
const devOnly = devDependencies.filter((d) => !dependencies.includes(d));
|
|
89
|
+
collectFromDeps(devOnly, false, []);
|
|
90
|
+
return peerSources;
|
|
91
|
+
}
|
|
92
|
+
function formatChain(sources) {
|
|
93
|
+
const chainsWithDepth = sources.filter((s) => s.chain && s.chain.length > 0);
|
|
94
|
+
if (chainsWithDepth.length === 0) return "";
|
|
95
|
+
const first = chainsWithDepth[0];
|
|
96
|
+
return ` (via ${chalk.dim(first.chain.join(" \u2192 "))})`;
|
|
97
|
+
}
|
|
98
|
+
function getRequiredTransitivePeers(location, { dependencies, devDependencies }) {
|
|
99
|
+
const peerSources = collectPeerSources(location, dependencies, devDependencies);
|
|
100
|
+
return new Set(peerSources.keys());
|
|
101
|
+
}
|
|
102
|
+
function logUnsatisfiedPeer(name, unsatisfied) {
|
|
103
|
+
const {
|
|
104
|
+
peer,
|
|
105
|
+
sources,
|
|
106
|
+
reason,
|
|
107
|
+
hasRuntimeSource,
|
|
108
|
+
installedVersion,
|
|
109
|
+
versionRange
|
|
110
|
+
} = unsatisfied;
|
|
111
|
+
const chainInfo = formatChain(sources);
|
|
112
|
+
if (reason === "version-mismatch") {
|
|
113
|
+
const requiredByList = sources.map((s) => s.requiredBy);
|
|
114
|
+
console.log(
|
|
115
|
+
`[${chalk.blue(name)}] Peer dependency version mismatch ${chalk.red(peer)} \u2014 installed ${chalk.yellow(installedVersion ?? "unknown")} does not satisfy ${chalk.cyan(versionRange)} (required by ${chalk.cyan(requiredByList.join(", "))})` + chainInfo
|
|
116
|
+
);
|
|
117
|
+
} else if (hasRuntimeSource) {
|
|
118
|
+
const requiredByList = sources.filter((s) => s.isRuntimeDep).map((s) => s.requiredBy);
|
|
119
|
+
console.log(
|
|
120
|
+
`[${chalk.blue(name)}] Unsatisfied peer dependency ${chalk.red(peer)} (required by ${chalk.cyan(requiredByList.join(", "))})` + chainInfo + " \u2014 must be in dependencies or peerDependencies"
|
|
121
|
+
);
|
|
122
|
+
} else {
|
|
123
|
+
const requiredByList = sources.map((s) => s.requiredBy);
|
|
124
|
+
console.log(
|
|
125
|
+
`[${chalk.blue(name)}] Unsatisfied peer dependency ${chalk.red(peer)} (required by devDependency ${chalk.cyan(requiredByList.join(", "))})` + chainInfo + " \u2014 must be in dependencies, devDependencies, or peerDependencies"
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function resolveVersionRange(location, sources, peer) {
|
|
130
|
+
for (const source of sources) {
|
|
131
|
+
const range = readPeerVersionRange(location, source.requiredBy, peer);
|
|
132
|
+
if (range) return range;
|
|
133
|
+
}
|
|
134
|
+
return "*";
|
|
135
|
+
}
|
|
136
|
+
function checkVersionSatisfaction(location, peer, requestedRange) {
|
|
137
|
+
const installedVersion = readInstalledVersion(location, peer);
|
|
138
|
+
if (!installedVersion) return { satisfied: true };
|
|
139
|
+
if (requestedRange === "*") return { installedVersion, satisfied: true };
|
|
140
|
+
if (requestedRange.startsWith("workspace:")) return { installedVersion, satisfied: true };
|
|
141
|
+
try {
|
|
142
|
+
const satisfied = semver.satisfies(installedVersion, requestedRange, { includePrerelease: true });
|
|
143
|
+
return { installedVersion, satisfied };
|
|
144
|
+
} catch {
|
|
145
|
+
return { installedVersion, satisfied: true };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function findDeclaredPeerVersionMismatches(name, location, peerDependencies, peerDependencyVersions, exclude) {
|
|
149
|
+
const results = [];
|
|
150
|
+
for (const peer of peerDependencies) {
|
|
151
|
+
if (exclude?.has(peer) || peer === name) continue;
|
|
152
|
+
const declaredRange = peerDependencyVersions[peer];
|
|
153
|
+
if (!declaredRange || declaredRange === "*") continue;
|
|
154
|
+
const { installedVersion, satisfied } = checkVersionSatisfaction(location, peer, declaredRange);
|
|
155
|
+
if (!satisfied) {
|
|
156
|
+
results.push({
|
|
157
|
+
hasRuntimeSource: true,
|
|
158
|
+
installedVersion,
|
|
159
|
+
peer,
|
|
160
|
+
reason: "version-mismatch",
|
|
161
|
+
sources: [{ isRuntimeDep: true, requiredBy: name }],
|
|
162
|
+
versionRange: declaredRange
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return results;
|
|
167
|
+
}
|
|
168
|
+
function findUnsatisfiedPeers({ name, location }, {
|
|
169
|
+
dependencies,
|
|
170
|
+
devDependencies,
|
|
171
|
+
peerDependencies,
|
|
172
|
+
peerDependencyVersions
|
|
173
|
+
}, exclude) {
|
|
174
|
+
const peerSources = collectPeerSources(location, dependencies, devDependencies);
|
|
175
|
+
const depsSet = new Set(dependencies);
|
|
176
|
+
const devDepsSet = new Set(devDependencies);
|
|
177
|
+
const unsatisfied = [];
|
|
178
|
+
for (const [peer, sources] of peerSources) {
|
|
179
|
+
if (exclude?.has(peer) || peer === name) continue;
|
|
180
|
+
if (isPeerOptionalInAll(location, peer, sources)) continue;
|
|
181
|
+
const hasRuntimeSource = sources.some((s) => s.isRuntimeDep);
|
|
182
|
+
const isPresent = depsSet.has(peer) || devDepsSet.has(peer);
|
|
183
|
+
if (!isPresent) {
|
|
184
|
+
const versionRange2 = resolveVersionRange(location, sources, peer);
|
|
185
|
+
unsatisfied.push({
|
|
186
|
+
hasRuntimeSource,
|
|
187
|
+
peer,
|
|
188
|
+
reason: "missing",
|
|
189
|
+
sources,
|
|
190
|
+
versionRange: versionRange2
|
|
191
|
+
});
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const versionRange = resolveVersionRange(location, sources, peer);
|
|
195
|
+
const { installedVersion, satisfied } = checkVersionSatisfaction(location, peer, versionRange);
|
|
196
|
+
if (!satisfied) {
|
|
197
|
+
unsatisfied.push({
|
|
198
|
+
hasRuntimeSource,
|
|
199
|
+
installedVersion,
|
|
200
|
+
peer,
|
|
201
|
+
reason: "version-mismatch",
|
|
202
|
+
sources,
|
|
203
|
+
versionRange
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return [
|
|
208
|
+
...unsatisfied,
|
|
209
|
+
...findDeclaredPeerVersionMismatches(name, location, peerDependencies, peerDependencyVersions, exclude)
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
function getUnsatisfiedPeerDependencies(workspace, packageParams, exclude) {
|
|
213
|
+
const unsatisfied = findUnsatisfiedPeers(workspace, packageParams, exclude);
|
|
214
|
+
for (const entry of unsatisfied) {
|
|
215
|
+
logUnsatisfiedPeer(workspace.name, entry);
|
|
216
|
+
}
|
|
217
|
+
if (unsatisfied.length > 0) {
|
|
218
|
+
console.log(` ${chalk.yellow(`${workspace.location}/package.json`)}
|
|
219
|
+
`);
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
count: unsatisfied.length,
|
|
223
|
+
unsatisfiedPeers: new Set(unsatisfied.map((u) => u.peer))
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function isTerminalPackage(packageJsonPath) {
|
|
227
|
+
try {
|
|
228
|
+
const pkg = JSON.parse(fs2.readFileSync(packageJsonPath, "utf8"));
|
|
229
|
+
return pkg.private === true;
|
|
230
|
+
} catch {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function fixVersionMismatch(workspaceName, entry, pkg) {
|
|
235
|
+
const {
|
|
236
|
+
installedVersion,
|
|
237
|
+
peer,
|
|
238
|
+
versionRange
|
|
239
|
+
} = entry;
|
|
240
|
+
if (!installedVersion) {
|
|
241
|
+
logUnsatisfiedPeer(workspaceName, entry);
|
|
242
|
+
console.log(
|
|
243
|
+
` ${chalk.dim("(version mismatch \u2014 could not resolve installed version)")}`
|
|
244
|
+
);
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
const match = /^(\d+)\.(\d+)/.exec(installedVersion);
|
|
248
|
+
if (!match) {
|
|
249
|
+
logUnsatisfiedPeer(workspaceName, entry);
|
|
250
|
+
console.log(
|
|
251
|
+
` ${chalk.dim("(version mismatch \u2014 could not resolve installed version)")}`
|
|
252
|
+
);
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
const expectedVersion = versionRange.startsWith("^") ? `^${match[1]}` : `~${match[1]}.${match[2]}`;
|
|
256
|
+
if (pkg.peerDependencies?.[peer]) {
|
|
257
|
+
pkg.peerDependencies[peer] = expectedVersion;
|
|
258
|
+
}
|
|
259
|
+
if (pkg.devDependencies?.[peer] && !pkg.devDependencies[peer].startsWith("workspace:")) {
|
|
260
|
+
pkg.devDependencies[peer] = expectedVersion;
|
|
261
|
+
}
|
|
262
|
+
console.log(
|
|
263
|
+
`[${chalk.blue(workspaceName)}] Fixed: updated ${chalk.green(peer)} version to ${chalk.cyan(expectedVersion)} (was ${chalk.yellow(versionRange)})`
|
|
264
|
+
);
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
function fixUnsatisfiedPeerDependencies(workspace, packageParams, exclude) {
|
|
268
|
+
const unsatisfied = findUnsatisfiedPeers(workspace, packageParams, exclude);
|
|
269
|
+
if (unsatisfied.length === 0) return { addedPeers: /* @__PURE__ */ new Set(), count: 0 };
|
|
270
|
+
const packageJsonPath = `${workspace.location}/package.json`;
|
|
271
|
+
const pkg = JSON.parse(fs2.readFileSync(packageJsonPath, "utf8"));
|
|
272
|
+
const isTerminal = isTerminalPackage(packageJsonPath);
|
|
273
|
+
const addedPeers = /* @__PURE__ */ new Set();
|
|
274
|
+
let fixedCount = 0;
|
|
275
|
+
for (const entry of unsatisfied) {
|
|
276
|
+
const {
|
|
277
|
+
hasRuntimeSource,
|
|
278
|
+
peer,
|
|
279
|
+
reason,
|
|
280
|
+
sources,
|
|
281
|
+
versionRange
|
|
282
|
+
} = entry;
|
|
283
|
+
if (reason === "version-mismatch") {
|
|
284
|
+
if (fixVersionMismatch(workspace.name, entry, pkg)) fixedCount++;
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
const sections = resolvePeerTargetSections(hasRuntimeSource, isTerminal);
|
|
288
|
+
for (const section of sections) {
|
|
289
|
+
pkg[section] = pkg[section] ?? {};
|
|
290
|
+
pkg[section][peer] = versionRange;
|
|
291
|
+
}
|
|
292
|
+
addedPeers.add(peer);
|
|
293
|
+
const requiredByList = sources.map((s) => s.requiredBy).join(", ");
|
|
294
|
+
console.log(
|
|
295
|
+
`[${chalk.blue(workspace.name)}] Fixed: added ${chalk.green(peer)}@${versionRange} to ${chalk.cyan(sections.join(" + "))} (required by ${requiredByList})`
|
|
296
|
+
);
|
|
297
|
+
fixedCount++;
|
|
298
|
+
}
|
|
299
|
+
if (fixedCount > 0) {
|
|
300
|
+
const sorted = sortPackageJson(JSON.stringify(pkg, null, 2));
|
|
301
|
+
fs2.writeFileSync(packageJsonPath, `${sorted}
|
|
302
|
+
`);
|
|
303
|
+
}
|
|
304
|
+
return { addedPeers, count: unsatisfied.length };
|
|
305
|
+
}
|
|
306
|
+
function resolvePeerTargetSections(hasRuntimeSource, isTerminal) {
|
|
307
|
+
if (!hasRuntimeSource) return ["devDependencies"];
|
|
308
|
+
if (isTerminal) return ["dependencies"];
|
|
309
|
+
return ["peerDependencies", "devDependencies"];
|
|
310
|
+
}
|
|
311
|
+
export {
|
|
312
|
+
findUnsatisfiedPeers,
|
|
313
|
+
fixUnsatisfiedPeerDependencies,
|
|
314
|
+
getRequiredTransitivePeers,
|
|
315
|
+
getUnsatisfiedPeerDependencies,
|
|
316
|
+
resolvePeerTargetSections
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=getUnsatisfiedPeerDependencies.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.ts","../../../../src/actions/deplint/getRequiredPeerDependencies.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport chalk from 'chalk'\nimport semver from 'semver'\nimport sortPackageJson from 'sort-package-json'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport { findDepPackageJson } from '../getRequiredPeerDependencies.ts'\nimport type { CheckPackageParams } from './checkPackageTypes.ts'\n\nexport interface PeerSource {\n /** Dependency chain for transitive peers, e.g. ['direct-dep', 'transitive-dep'] */\n chain?: string[]\n isRuntimeDep: boolean\n requiredBy: string\n}\n\nexport interface UnsatisfiedPeer {\n hasRuntimeSource: boolean\n installedVersion?: string\n peer: string\n reason: 'missing' | 'version-mismatch'\n sources: PeerSource[]\n versionRange: string\n}\n\nfunction readDepPackageJson(location: string, dep: string): Record<string, unknown> | undefined {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) return undefined\n try {\n return JSON.parse(fs.readFileSync(depPkgPath, 'utf8')) as Record<string, unknown>\n } catch {\n return undefined\n }\n}\n\nfunction readPeerDeps(location: string, dep: string): string[] {\n const pkg = readDepPackageJson(location, dep)\n if (!pkg) return []\n const peers = pkg.peerDependencies as Record<string, string> | undefined\n return Object.keys(peers ?? {})\n}\n\nfunction readPeerVersionRange(location: string, dep: string, peer: string): string | undefined {\n const pkg = readDepPackageJson(location, dep)\n if (!pkg) return undefined\n const peers = pkg.peerDependencies as Record<string, string> | undefined\n return peers?.[peer]\n}\n\nfunction readInstalledVersion(location: string, dep: string): string | undefined {\n const pkg = readDepPackageJson(location, dep)\n if (!pkg) return undefined\n return pkg.version as string | undefined\n}\n\nfunction isPeerOptionalInAll(location: string, peer: string, sources: PeerSource[]): boolean {\n for (const source of sources) {\n const pkg = readDepPackageJson(location, source.requiredBy)\n if (!pkg) continue\n const meta = (pkg.peerDependenciesMeta as Record<string, { optional?: boolean }> | undefined)?.[peer]\n if (!meta?.optional) return false\n }\n return true\n}\n\nconst MAX_TRANSITIVE_DEPTH = 2\n\nfunction collectPeerSources(\n location: string,\n dependencies: string[],\n devDependencies: string[],\n): Map<string, PeerSource[]> {\n const peerSources = new Map<string, PeerSource[]>()\n const visited = new Set<string>()\n\n function addPeerSource(peer: string, source: PeerSource): void {\n const sources = peerSources.get(peer) ?? []\n sources.push(source)\n peerSources.set(peer, sources)\n }\n\n function collectFromDeps(deps: string[], isRuntime: boolean, chain: string[]): void {\n for (const dep of deps) {\n const visitKey = `${dep}:${chain.join('>')}`\n if (visited.has(visitKey)) continue\n visited.add(visitKey)\n\n for (const peer of readPeerDeps(location, dep)) {\n addPeerSource(peer, {\n chain: chain.length > 0 ? [...chain, dep] : undefined,\n isRuntimeDep: isRuntime,\n requiredBy: dep,\n })\n }\n\n // Recurse into this dep's own runtime dependencies (not devDeps)\n if (chain.length < MAX_TRANSITIVE_DEPTH) {\n const depPkg = readDepPackageJson(location, dep)\n if (depPkg) {\n const transitiveDeps = Object.keys((depPkg.dependencies as Record<string, string> | undefined) ?? {})\n collectFromDeps(transitiveDeps, isRuntime, [...chain, dep])\n }\n }\n }\n }\n\n collectFromDeps(dependencies, true, [])\n\n const devOnly = devDependencies.filter(d => !dependencies.includes(d))\n collectFromDeps(devOnly, false, [])\n\n return peerSources\n}\n\nfunction formatChain(sources: PeerSource[]): string {\n const chainsWithDepth = sources.filter(s => s.chain && s.chain.length > 0)\n if (chainsWithDepth.length === 0) return ''\n const first = chainsWithDepth[0]\n return ` (via ${chalk.dim(first.chain!.join(' → '))})`\n}\n\n/**\n * Returns the full set of peer dependency names required by all deps and devDeps.\n * Used to prevent the unused-dependency checks from removing deps that satisfy\n * transitive peer requirements.\n */\nexport function getRequiredTransitivePeers(\n location: string,\n { dependencies, devDependencies }: CheckPackageParams,\n): Set<string> {\n const peerSources = collectPeerSources(location, dependencies, devDependencies)\n return new Set(peerSources.keys())\n}\n\nfunction logUnsatisfiedPeer(name: string, unsatisfied: UnsatisfiedPeer): void {\n const {\n peer, sources, reason, hasRuntimeSource, installedVersion, versionRange,\n } = unsatisfied\n const chainInfo = formatChain(sources)\n\n if (reason === 'version-mismatch') {\n const requiredByList = sources.map(s => s.requiredBy)\n console.log(\n `[${chalk.blue(name)}] Peer dependency version mismatch ${chalk.red(peer)}`\n + ` — installed ${chalk.yellow(installedVersion ?? 'unknown')}`\n + ` does not satisfy ${chalk.cyan(versionRange)}`\n + ` (required by ${chalk.cyan(requiredByList.join(', '))})`\n + chainInfo,\n )\n } else if (hasRuntimeSource) {\n const requiredByList = sources.filter(s => s.isRuntimeDep).map(s => s.requiredBy)\n console.log(\n `[${chalk.blue(name)}] Unsatisfied peer dependency ${chalk.red(peer)}`\n + ` (required by ${chalk.cyan(requiredByList.join(', '))})`\n + chainInfo\n + ' — must be in dependencies or peerDependencies',\n )\n } else {\n const requiredByList = sources.map(s => s.requiredBy)\n console.log(\n `[${chalk.blue(name)}] Unsatisfied peer dependency ${chalk.red(peer)}`\n + ` (required by devDependency ${chalk.cyan(requiredByList.join(', '))})`\n + chainInfo\n + ' — must be in dependencies, devDependencies, or peerDependencies',\n )\n }\n}\n\nfunction resolveVersionRange(location: string, sources: PeerSource[], peer: string): string {\n for (const source of sources) {\n const range = readPeerVersionRange(location, source.requiredBy, peer)\n if (range) return range\n }\n return '*'\n}\n\nfunction checkVersionSatisfaction(location: string, peer: string, requestedRange: string): { installedVersion?: string; satisfied: boolean } {\n const installedVersion = readInstalledVersion(location, peer)\n if (!installedVersion) return { satisfied: true }\n if (requestedRange === '*') return { installedVersion, satisfied: true }\n // workspace: protocol versions resolve at install time — always satisfied\n if (requestedRange.startsWith('workspace:')) return { installedVersion, satisfied: true }\n\n try {\n const satisfied = semver.satisfies(installedVersion, requestedRange, { includePrerelease: true })\n return { installedVersion, satisfied }\n } catch {\n // Invalid semver range or version — skip version check\n return { installedVersion, satisfied: true }\n }\n}\n\nfunction findDeclaredPeerVersionMismatches(\n name: string,\n location: string,\n peerDependencies: string[],\n peerDependencyVersions: Record<string, string>,\n exclude?: Set<string>,\n): UnsatisfiedPeer[] {\n const results: UnsatisfiedPeer[] = []\n for (const peer of peerDependencies) {\n if (exclude?.has(peer) || peer === name) continue\n const declaredRange = peerDependencyVersions[peer]\n if (!declaredRange || declaredRange === '*') continue\n const { installedVersion, satisfied } = checkVersionSatisfaction(location, peer, declaredRange)\n if (!satisfied) {\n results.push({\n hasRuntimeSource: true,\n installedVersion,\n peer,\n reason: 'version-mismatch',\n sources: [{ isRuntimeDep: true, requiredBy: name }],\n versionRange: declaredRange,\n })\n }\n }\n return results\n}\n\nexport function findUnsatisfiedPeers(\n { name, location }: Workspace,\n {\n dependencies, devDependencies, peerDependencies, peerDependencyVersions,\n }: CheckPackageParams,\n exclude?: Set<string>,\n): UnsatisfiedPeer[] {\n const peerSources = collectPeerSources(location, dependencies, devDependencies)\n const depsSet = new Set(dependencies)\n const devDepsSet = new Set(devDependencies)\n const unsatisfied: UnsatisfiedPeer[] = []\n\n for (const [peer, sources] of peerSources) {\n if (exclude?.has(peer) || peer === name) continue\n if (isPeerOptionalInAll(location, peer, sources)) continue\n\n const hasRuntimeSource = sources.some(s => s.isRuntimeDep)\n // A peer is provided if it's in dependencies or devDependencies.\n // Being in peerDependencies alone only passes the requirement to consumers\n // but doesn't actually provide the package (yarn will warn \"doesn't provide\").\n const isPresent = depsSet.has(peer) || devDepsSet.has(peer)\n\n if (!isPresent) {\n const versionRange = resolveVersionRange(location, sources, peer)\n unsatisfied.push({\n hasRuntimeSource, peer, reason: 'missing', sources, versionRange,\n })\n continue\n }\n\n const versionRange = resolveVersionRange(location, sources, peer)\n const { installedVersion, satisfied } = checkVersionSatisfaction(location, peer, versionRange)\n if (!satisfied) {\n unsatisfied.push({\n hasRuntimeSource, installedVersion, peer, reason: 'version-mismatch', sources, versionRange,\n })\n }\n }\n\n return [\n ...unsatisfied,\n ...findDeclaredPeerVersionMismatches(name, location, peerDependencies, peerDependencyVersions, exclude),\n ]\n}\n\n/**\n * Checks that peerDependencies of all dependencies and devDependencies are\n * properly satisfied — both present and version-compatible.\n *\n * Rules:\n * - If a dep in `dependencies` requires peer P, then P must be in\n * `dependencies` or `peerDependencies`.\n * - If a dep in `devDependencies` requires peer P, then P can also be\n * in `devDependencies`.\n * - If multiple deps require the same peer P and at least one is a runtime\n * dependency, the runtime rule applies (P must be in deps or peerDeps).\n * - Checks peers transitively up to 2 levels deep in the dependency tree.\n * - Validates that installed versions satisfy the requested peer ranges.\n */\nexport interface CheckPeerResult {\n count: number\n unsatisfiedPeers: Set<string>\n}\n\nexport function getUnsatisfiedPeerDependencies(\n workspace: Workspace,\n packageParams: CheckPackageParams,\n exclude?: Set<string>,\n): CheckPeerResult {\n const unsatisfied = findUnsatisfiedPeers(workspace, packageParams, exclude)\n\n for (const entry of unsatisfied) {\n logUnsatisfiedPeer(workspace.name, entry)\n }\n\n if (unsatisfied.length > 0) {\n console.log(` ${chalk.yellow(`${workspace.location}/package.json`)}\\n`)\n }\n return {\n count: unsatisfied.length,\n unsatisfiedPeers: new Set(unsatisfied.map(u => u.peer)),\n }\n}\n\n/**\n * Determines if a package is \"terminal\" (an app, CLI, or website — not a library).\n * Terminal packages have their peers added to dependencies; libraries use peerDependencies.\n */\nfunction isTerminalPackage(packageJsonPath: string): boolean {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as Record<string, unknown>\n return pkg.private === true\n } catch {\n return false\n }\n}\n\n/**\n * Fixes unsatisfied peer dependencies by adding them to package.json.\n *\n * - Terminal packages (private: true): runtime peers go to dependencies,\n * dev-only peers go to devDependencies\n * - Library packages: runtime peers go to peerDependencies,\n * dev-only peers go to devDependencies\n * - Version mismatches are reported but not auto-fixed (requires manual review)\n */\nexport interface FixPeerResult {\n addedPeers: Set<string>\n count: number\n}\n\nfunction fixVersionMismatch(\n workspaceName: string,\n entry: UnsatisfiedPeer,\n pkg: Record<string, Record<string, string>>,\n): boolean {\n const {\n installedVersion, peer, versionRange,\n } = entry\n if (!installedVersion) {\n logUnsatisfiedPeer(workspaceName, entry)\n console.log(\n ` ${chalk.dim('(version mismatch — could not resolve installed version)')}`,\n )\n return false\n }\n\n const match = /^(\\d+)\\.(\\d+)/.exec(installedVersion)\n if (!match) {\n logUnsatisfiedPeer(workspaceName, entry)\n console.log(\n ` ${chalk.dim('(version mismatch — could not resolve installed version)')}`,\n )\n return false\n }\n\n const expectedVersion = versionRange.startsWith('^')\n ? `^${match[1]}`\n : `~${match[1]}.${match[2]}`\n\n if (pkg.peerDependencies?.[peer]) {\n pkg.peerDependencies[peer] = expectedVersion\n }\n if (pkg.devDependencies?.[peer] && !pkg.devDependencies[peer].startsWith('workspace:')) {\n pkg.devDependencies[peer] = expectedVersion\n }\n\n console.log(\n `[${chalk.blue(workspaceName)}] Fixed: updated ${chalk.green(peer)}`\n + ` version to ${chalk.cyan(expectedVersion)} (was ${chalk.yellow(versionRange)})`,\n )\n return true\n}\n\nexport function fixUnsatisfiedPeerDependencies(\n workspace: Workspace,\n packageParams: CheckPackageParams,\n exclude?: Set<string>,\n): FixPeerResult {\n const unsatisfied = findUnsatisfiedPeers(workspace, packageParams, exclude)\n if (unsatisfied.length === 0) return { addedPeers: new Set(), count: 0 }\n\n const packageJsonPath = `${workspace.location}/package.json`\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as Record<string, Record<string, string>>\n const isTerminal = isTerminalPackage(packageJsonPath)\n\n const addedPeers = new Set<string>()\n let fixedCount = 0\n for (const entry of unsatisfied) {\n const {\n hasRuntimeSource,\n peer,\n reason,\n sources,\n versionRange,\n } = entry\n\n if (reason === 'version-mismatch') {\n if (fixVersionMismatch(workspace.name, entry, pkg)) fixedCount++\n continue\n }\n\n const sections = resolvePeerTargetSections(hasRuntimeSource, isTerminal)\n for (const section of sections) {\n pkg[section] = pkg[section] ?? {}\n pkg[section][peer] = versionRange\n }\n addedPeers.add(peer)\n\n const requiredByList = sources.map(s => s.requiredBy).join(', ')\n console.log(\n `[${chalk.blue(workspace.name)}] Fixed: added ${chalk.green(peer)}@${versionRange}`\n + ` to ${chalk.cyan(sections.join(' + '))} (required by ${requiredByList})`,\n )\n fixedCount++\n }\n\n if (fixedCount > 0) {\n const sorted = sortPackageJson(JSON.stringify(pkg, null, 2))\n fs.writeFileSync(packageJsonPath, `${sorted}\\n`)\n }\n\n return { addedPeers, count: unsatisfied.length }\n}\n\n/**\n * For terminal packages (apps): runtime peers → dependencies, dev-only → devDependencies.\n * For library packages: runtime peers → peerDependencies + devDependencies (peer passes\n * the requirement to consumers, devDep satisfies it for the library's own development).\n * Dev-only peers → devDependencies only.\n */\nexport function resolvePeerTargetSections(hasRuntimeSource: boolean, isTerminal: boolean): string[] {\n if (!hasRuntimeSource) return ['devDependencies']\n if (isTerminal) return ['dependencies']\n return ['peerDependencies', 'devDependencies']\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function findDepPackageJson(location: string, dep: string): string | undefined {\n let dir = location\n while (true) {\n const candidate = path.join(dir, 'node_modules', dep, 'package.json')\n if (fs.existsSync(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\n/**\n * Collects the peerDependencies declared by all of a package's\n * dependencies and devDependencies. A devDependency that satisfies\n * one of these peer requirements should not be flagged as unused.\n */\nexport function getRequiredPeerDependencies(\n location: string,\n allDeps: string[],\n): Set<string> {\n const required = new Set<string>()\n for (const dep of allDeps) {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) continue\n try {\n const raw = fs.readFileSync(depPkgPath, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n const peerDeps = pkg.peerDependencies as Record<string, string> | undefined\n if (peerDeps) {\n for (const peer of Object.keys(peerDeps)) {\n required.add(peer)\n }\n }\n } catch {\n // Package not readable — skip\n }\n }\n return required\n}\n"],"mappings":"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","names":["fs","fs","versionRange"]}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// src/actions/deplint/checkPackage/getUnusedDependencies.ts
|
|
2
|
+
import chalk2 from "chalk";
|
|
3
|
+
|
|
4
|
+
// src/actions/deplint/getRequiredPeerDependencies.ts
|
|
5
|
+
import fs from "fs";
|
|
6
|
+
import path from "path";
|
|
7
|
+
function findDepPackageJson(location, dep) {
|
|
8
|
+
let dir = location;
|
|
9
|
+
while (true) {
|
|
10
|
+
const candidate = path.join(dir, "node_modules", dep, "package.json");
|
|
11
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
12
|
+
const parent = path.dirname(dir);
|
|
13
|
+
if (parent === dir) return void 0;
|
|
14
|
+
dir = parent;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function getRequiredPeerDependencies(location, allDeps) {
|
|
18
|
+
const required = /* @__PURE__ */ new Set();
|
|
19
|
+
for (const dep of allDeps) {
|
|
20
|
+
const depPkgPath = findDepPackageJson(location, dep);
|
|
21
|
+
if (!depPkgPath) continue;
|
|
22
|
+
try {
|
|
23
|
+
const raw = fs.readFileSync(depPkgPath, "utf8");
|
|
24
|
+
const pkg = JSON.parse(raw);
|
|
25
|
+
const peerDeps = pkg.peerDependencies;
|
|
26
|
+
if (peerDeps) {
|
|
27
|
+
for (const peer of Object.keys(peerDeps)) {
|
|
28
|
+
required.add(peer);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return required;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// src/actions/deplint/packageJsonEditor.ts
|
|
38
|
+
import fs2 from "fs";
|
|
39
|
+
import chalk from "chalk";
|
|
40
|
+
import sortPackageJson from "sort-package-json";
|
|
41
|
+
function readPackageJson(location) {
|
|
42
|
+
return JSON.parse(fs2.readFileSync(`${location}/package.json`, "utf8"));
|
|
43
|
+
}
|
|
44
|
+
function writePackageJson(location, pkg) {
|
|
45
|
+
const sorted = sortPackageJson(JSON.stringify(pkg, null, 2));
|
|
46
|
+
fs2.writeFileSync(`${location}/package.json`, `${sorted}
|
|
47
|
+
`);
|
|
48
|
+
}
|
|
49
|
+
function moveDep(pkg, dep, from, to) {
|
|
50
|
+
const fromSection = pkg[from];
|
|
51
|
+
if (!fromSection?.[dep]) return;
|
|
52
|
+
const version = fromSection[dep];
|
|
53
|
+
delete fromSection[dep];
|
|
54
|
+
if (Object.keys(fromSection).length === 0) {
|
|
55
|
+
delete pkg[from];
|
|
56
|
+
}
|
|
57
|
+
const toSection = pkg[to] ?? {};
|
|
58
|
+
toSection[dep] = version;
|
|
59
|
+
pkg[to] = toSection;
|
|
60
|
+
}
|
|
61
|
+
function removeDep(pkg, dep, section) {
|
|
62
|
+
const sectionObj = pkg[section];
|
|
63
|
+
if (!sectionObj?.[dep]) return;
|
|
64
|
+
delete sectionObj[dep];
|
|
65
|
+
if (Object.keys(sectionObj).length === 0) {
|
|
66
|
+
delete pkg[section];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function logFix(workspace, action, dep, detail) {
|
|
70
|
+
const detailStr = detail ? ` (${detail})` : "";
|
|
71
|
+
console.log(`[${chalk.blue(workspace.name)}] Fixed: ${action} ${chalk.green(dep)}${detailStr}`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// src/actions/deplint/tsScriptsAliases.ts
|
|
75
|
+
var VARIANT_MAP = {
|
|
76
|
+
"@xylabs/ts-scripts-yarn3": "@xylabs/ts-scripts-pnpm",
|
|
77
|
+
"@xylabs/ts-scripts-pnpm": "@xylabs/ts-scripts-yarn3",
|
|
78
|
+
"@xylabs/ts-scripts-react-yarn3": "@xylabs/ts-scripts-react-pnpm",
|
|
79
|
+
"@xylabs/ts-scripts-react-pnpm": "@xylabs/ts-scripts-react-yarn3"
|
|
80
|
+
};
|
|
81
|
+
function isUsedViaTsScriptsVariant(dep, imports) {
|
|
82
|
+
const variant = VARIANT_MAP[dep];
|
|
83
|
+
return variant !== void 0 && imports.includes(variant);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/actions/deplint/checkPackage/getUnusedDependencies.ts
|
|
87
|
+
function isDepImported(dep, distImports, distTypeImports) {
|
|
88
|
+
const baseName = dep.replace(/^@types\//, "");
|
|
89
|
+
return distImports.includes(dep) || distImports.includes(baseName) || distTypeImports.includes(dep) || distTypeImports.includes(baseName);
|
|
90
|
+
}
|
|
91
|
+
function findUnusedDependencies(location, dependencies, devDependencies, externalDistImports, externalDistTypeImports, externalAllImports, exclude) {
|
|
92
|
+
const runtimeRequiredPeers = getRequiredPeerDependencies(location, dependencies);
|
|
93
|
+
const devRequiredPeers = getRequiredPeerDependencies(location, devDependencies);
|
|
94
|
+
const results = [];
|
|
95
|
+
for (const dep of dependencies) {
|
|
96
|
+
if (exclude?.has(dep)) continue;
|
|
97
|
+
if (runtimeRequiredPeers.has(dep)) continue;
|
|
98
|
+
const isImported = isDepImported(dep, externalDistImports, externalDistTypeImports);
|
|
99
|
+
if (isImported || isUsedViaTsScriptsVariant(dep, [...externalDistImports, ...externalDistTypeImports])) continue;
|
|
100
|
+
if (devRequiredPeers.has(dep)) {
|
|
101
|
+
results.push({
|
|
102
|
+
dep,
|
|
103
|
+
kind: "move-to-dev",
|
|
104
|
+
reason: "only needed as peer of devDependencies"
|
|
105
|
+
});
|
|
106
|
+
} else if (externalAllImports.includes(dep)) {
|
|
107
|
+
results.push({ dep, kind: "move-to-dev" });
|
|
108
|
+
} else {
|
|
109
|
+
results.push({ dep, kind: "remove" });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return results;
|
|
113
|
+
}
|
|
114
|
+
function getUnusedDependencies({ name, location }, { dependencies, devDependencies }, {
|
|
115
|
+
externalDistImports,
|
|
116
|
+
externalDistTypeImports,
|
|
117
|
+
externalAllImports
|
|
118
|
+
}, exclude) {
|
|
119
|
+
const unused = findUnusedDependencies(location, dependencies, devDependencies, externalDistImports, externalDistTypeImports, externalAllImports, exclude);
|
|
120
|
+
for (const {
|
|
121
|
+
dep,
|
|
122
|
+
kind,
|
|
123
|
+
reason
|
|
124
|
+
} of unused) {
|
|
125
|
+
const reasonStr = reason ? ` (${reason})` : "";
|
|
126
|
+
if (kind === "move-to-dev") {
|
|
127
|
+
console.log(`[${chalk2.blue(name)}] dependency should be devDependency in package.json: ${chalk2.red(dep)}${reasonStr}`);
|
|
128
|
+
} else {
|
|
129
|
+
console.log(`[${chalk2.blue(name)}] Unused dependency in package.json: ${chalk2.red(dep)}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (unused.length > 0) {
|
|
133
|
+
console.log(` ${chalk2.yellow(`${location}/package.json`)}
|
|
134
|
+
`);
|
|
135
|
+
}
|
|
136
|
+
return unused.length;
|
|
137
|
+
}
|
|
138
|
+
function fixUnusedDependencies(workspace, { dependencies, devDependencies }, {
|
|
139
|
+
externalDistImports,
|
|
140
|
+
externalDistTypeImports,
|
|
141
|
+
externalAllImports
|
|
142
|
+
}, exclude) {
|
|
143
|
+
const unused = findUnusedDependencies(workspace.location, dependencies, devDependencies, externalDistImports, externalDistTypeImports, externalAllImports, exclude);
|
|
144
|
+
if (unused.length === 0) return 0;
|
|
145
|
+
const pkg = readPackageJson(workspace.location);
|
|
146
|
+
for (const { dep, kind } of unused) {
|
|
147
|
+
if (kind === "move-to-dev") {
|
|
148
|
+
moveDep(pkg, dep, "dependencies", "devDependencies");
|
|
149
|
+
logFix(workspace, "moved to devDependencies", dep);
|
|
150
|
+
} else {
|
|
151
|
+
removeDep(pkg, dep, "dependencies");
|
|
152
|
+
logFix(workspace, "removed from dependencies", dep);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
writePackageJson(workspace.location, pkg);
|
|
156
|
+
return unused.length;
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
findUnusedDependencies,
|
|
160
|
+
fixUnusedDependencies,
|
|
161
|
+
getUnusedDependencies
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=getUnusedDependencies.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/deplint/checkPackage/getUnusedDependencies.ts","../../../../src/actions/deplint/getRequiredPeerDependencies.ts","../../../../src/actions/deplint/packageJsonEditor.ts","../../../../src/actions/deplint/tsScriptsAliases.ts"],"sourcesContent":["import chalk from 'chalk'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport { getRequiredPeerDependencies } from '../getRequiredPeerDependencies.ts'\nimport {\n logFix, moveDep, readPackageJson, removeDep, writePackageJson,\n} from '../packageJsonEditor.ts'\nimport { isUsedViaTsScriptsVariant } from '../tsScriptsAliases.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nfunction isDepImported(dep: string, distImports: string[], distTypeImports: string[]): boolean {\n const baseName = dep.replace(/^@types\\//, '')\n return distImports.includes(dep)\n || distImports.includes(baseName)\n || distTypeImports.includes(dep)\n || distTypeImports.includes(baseName)\n}\n\nexport type UnusedDepKind = 'move-to-dev' | 'remove'\n\nexport interface UnusedDep {\n dep: string\n kind: UnusedDepKind\n reason?: string\n}\n\nexport function findUnusedDependencies(\n location: string,\n dependencies: string[],\n devDependencies: string[],\n externalDistImports: string[],\n externalDistTypeImports: string[],\n externalAllImports: string[],\n exclude?: Set<string>,\n): UnusedDep[] {\n const runtimeRequiredPeers = getRequiredPeerDependencies(location, dependencies)\n const devRequiredPeers = getRequiredPeerDependencies(location, devDependencies)\n const results: UnusedDep[] = []\n\n for (const dep of dependencies) {\n if (exclude?.has(dep)) continue\n if (runtimeRequiredPeers.has(dep)) continue\n\n const isImported = isDepImported(dep, externalDistImports, externalDistTypeImports)\n if (isImported || isUsedViaTsScriptsVariant(dep, [...externalDistImports, ...externalDistTypeImports])) continue\n\n if (devRequiredPeers.has(dep)) {\n results.push({\n dep, kind: 'move-to-dev', reason: 'only needed as peer of devDependencies',\n })\n } else if (externalAllImports.includes(dep)) {\n results.push({ dep, kind: 'move-to-dev' })\n } else {\n results.push({ dep, kind: 'remove' })\n }\n }\n\n return results\n}\n\nexport function getUnusedDependencies(\n { name, location }: Workspace,\n { dependencies, devDependencies }: CheckPackageParams,\n {\n externalDistImports,\n externalDistTypeImports,\n externalAllImports,\n }: CheckSourceParams,\n exclude?: Set<string>,\n) {\n const unused = findUnusedDependencies(location, dependencies, devDependencies, externalDistImports, externalDistTypeImports, externalAllImports, exclude)\n\n for (const {\n dep, kind, reason,\n } of unused) {\n const reasonStr = reason ? ` (${reason})` : ''\n if (kind === 'move-to-dev') {\n console.log(`[${chalk.blue(name)}] dependency should be devDependency in package.json: ${chalk.red(dep)}${reasonStr}`)\n } else {\n console.log(`[${chalk.blue(name)}] Unused dependency in package.json: ${chalk.red(dep)}`)\n }\n }\n if (unused.length > 0) {\n console.log(` ${chalk.yellow(`${location}/package.json`)}\\n`)\n }\n return unused.length\n}\n\nexport function fixUnusedDependencies(\n workspace: Workspace,\n { dependencies, devDependencies }: CheckPackageParams,\n {\n externalDistImports,\n externalDistTypeImports,\n externalAllImports,\n }: CheckSourceParams,\n exclude?: Set<string>,\n) {\n const unused = findUnusedDependencies(workspace.location, dependencies, devDependencies, externalDistImports, externalDistTypeImports, externalAllImports, exclude)\n if (unused.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n\n for (const { dep, kind } of unused) {\n if (kind === 'move-to-dev') {\n moveDep(pkg, dep, 'dependencies', 'devDependencies')\n logFix(workspace, 'moved to devDependencies', dep)\n } else {\n removeDep(pkg, dep, 'dependencies')\n logFix(workspace, 'removed from dependencies', dep)\n }\n }\n\n writePackageJson(workspace.location, pkg)\n return unused.length\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function findDepPackageJson(location: string, dep: string): string | undefined {\n let dir = location\n while (true) {\n const candidate = path.join(dir, 'node_modules', dep, 'package.json')\n if (fs.existsSync(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\n/**\n * Collects the peerDependencies declared by all of a package's\n * dependencies and devDependencies. A devDependency that satisfies\n * one of these peer requirements should not be flagged as unused.\n */\nexport function getRequiredPeerDependencies(\n location: string,\n allDeps: string[],\n): Set<string> {\n const required = new Set<string>()\n for (const dep of allDeps) {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) continue\n try {\n const raw = fs.readFileSync(depPkgPath, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n const peerDeps = pkg.peerDependencies as Record<string, string> | undefined\n if (peerDeps) {\n for (const peer of Object.keys(peerDeps)) {\n required.add(peer)\n }\n }\n } catch {\n // Package not readable — skip\n }\n }\n return required\n}\n","import fs from 'node:fs'\n\nimport chalk from 'chalk'\nimport sortPackageJson from 'sort-package-json'\n\nimport type { Workspace } from '../../pm/index.ts'\nimport { findDepPackageJson } from './getRequiredPeerDependencies.ts'\n\nexport interface PackageJson {\n [key: string]: unknown\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n}\n\nexport function readPackageJson(location: string): PackageJson {\n return JSON.parse(fs.readFileSync(`${location}/package.json`, 'utf8')) as PackageJson\n}\n\nexport function writePackageJson(location: string, pkg: PackageJson): void {\n const sorted = sortPackageJson(JSON.stringify(pkg, null, 2))\n fs.writeFileSync(`${location}/package.json`, `${sorted}\\n`)\n}\n\n/**\n * Move a dependency from one section to another (e.g. dependencies → devDependencies).\n */\nexport function moveDep(pkg: PackageJson, dep: string, from: string, to: string): void {\n const fromSection = pkg[from] as Record<string, string> | undefined\n if (!fromSection?.[dep]) return\n\n const version = fromSection[dep]\n delete fromSection[dep]\n if (Object.keys(fromSection).length === 0) {\n delete pkg[from]\n }\n\n const toSection = (pkg[to] ?? {}) as Record<string, string>\n toSection[dep] = version\n pkg[to] = toSection\n}\n\n/**\n * Remove a dependency from a section.\n */\nexport function removeDep(pkg: PackageJson, dep: string, section: string): void {\n const sectionObj = pkg[section] as Record<string, string> | undefined\n if (!sectionObj?.[dep]) return\n\n delete sectionObj[dep]\n if (Object.keys(sectionObj).length === 0) {\n delete pkg[section]\n }\n}\n\n/**\n * Add a dependency to a section with a resolved version.\n */\nexport function addDep(pkg: PackageJson, dep: string, version: string, section: string): void {\n const sectionObj = (pkg[section] ?? {}) as Record<string, string>\n sectionObj[dep] = version\n pkg[section] = sectionObj\n}\n\n/**\n * Resolve the version for a missing dependency.\n * Looks in node_modules first, then falls back to '*'.\n */\nexport function resolveDepVersion(location: string, dep: string): string {\n const depPkgPath = findDepPackageJson(location, dep)\n if (depPkgPath) {\n try {\n const depPkg = JSON.parse(fs.readFileSync(depPkgPath, 'utf8')) as Record<string, unknown>\n const version = depPkg.version as string | undefined\n if (version) return `~${version}`\n } catch {\n // Fall through\n }\n }\n return '*'\n}\n\n/**\n * Compute the expected peerDependency version range for a dependency,\n * preserving the current range style (^ vs ~).\n *\n * - If the current range uses ^, returns ^<major> (e.g. ^7)\n * - Otherwise returns ~<major>.<minor> (e.g. ~7.6)\n * - Falls back to resolveDepVersion if no installed version found\n */\nexport function resolveExpectedPeerVersion(location: string, dep: string, currentRange?: string): string {\n const depPkgPath = findDepPackageJson(location, dep)\n if (depPkgPath) {\n try {\n const depPkg = JSON.parse(fs.readFileSync(depPkgPath, 'utf8')) as Record<string, unknown>\n const version = depPkg.version as string | undefined\n if (version) {\n const match = /^(\\d+)\\.(\\d+)/.exec(version)\n if (match) {\n if (currentRange?.startsWith('^')) {\n return `^${match[1]}`\n }\n return `~${match[1]}.${match[2]}`\n }\n return `~${version}`\n }\n } catch {\n // Fall through\n }\n }\n return '*'\n}\n\nexport function logFix(workspace: Workspace, action: string, dep: string, detail?: string): void {\n const detailStr = detail ? ` (${detail})` : ''\n console.log(`[${chalk.blue(workspace.name)}] Fixed: ${action} ${chalk.green(dep)}${detailStr}`)\n}\n","/**\n * After a packman convert, source files may still import from the old\n * ts-scripts variant (e.g. yarn3 → pnpm). Deplint should not flag\n * these as missing when the correct PM variant is installed.\n *\n * Maps each ts-scripts package to the variant it can be satisfied by.\n */\nconst VARIANT_MAP: Record<string, string> = {\n '@xylabs/ts-scripts-yarn3': '@xylabs/ts-scripts-pnpm',\n '@xylabs/ts-scripts-pnpm': '@xylabs/ts-scripts-yarn3',\n '@xylabs/ts-scripts-react-yarn3': '@xylabs/ts-scripts-react-pnpm',\n '@xylabs/ts-scripts-react-pnpm': '@xylabs/ts-scripts-react-yarn3',\n}\n\n/**\n * Returns true if `imp` is a ts-scripts import whose other PM variant\n * is present in the dependency lists, meaning the import is satisfied.\n */\nexport function isSatisfiedByTsScriptsVariant(\n imp: string,\n allDeps: string[],\n): boolean {\n const variant = VARIANT_MAP[imp]\n return variant !== undefined && allDeps.includes(variant)\n}\n\n/**\n * Returns true if `dep` is a ts-scripts package whose other PM variant\n * appears in the import list, meaning the dep is effectively used.\n */\nexport function isUsedViaTsScriptsVariant(\n dep: string,\n imports: string[],\n): boolean {\n const variant = VARIANT_MAP[dep]\n return variant !== undefined && imports.includes(variant)\n}\n"],"mappings":"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","names":["chalk","fs","fs","chalk"]}
|