@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/pm/detectPackageManager.ts","../../../src/lib/loadConfig.ts","../../../src/actions/deplint/packageJsonEditor.ts","../../../src/actions/deplint/getRequiredPeerDependencies.ts","../../../src/actions/deplint/packageEditor.ts","../../../src/actions/deplint/fixer.ts","../../../src/actions/deplint/findFiles.ts","../../../src/actions/deplint/findFilesByGlob.ts","../../../src/actions/deplint/getDependenciesFromPackageJson.ts","../../../src/actions/deplint/getExtendsFromTsconfigs.ts","../../../src/actions/deplint/getBasePackageName.ts","../../../src/actions/deplint/getExternalImportsFromFiles.ts","../../../src/actions/deplint/getImportsFromFile.ts","../../../src/actions/deplint/checkPackage/getMismatchedPeerDevVersions.ts","../../../src/actions/deplint/checkPackage/getUnlistedDependencies.ts","../../../src/actions/deplint/tsScriptsAliases.ts","../../../src/actions/deplint/checkPackage/getUnlistedDevDependencies.ts","../../../src/actions/deplint/checkPackage/getUnnecessaryPeerDependencies.ts","../../../src/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.ts","../../../src/actions/deplint/checkPackage/getUnusedDependencies.ts","../../../src/actions/deplint/checkPackage/getUnusedDevDependencies.ts","../../../src/actions/deplint/getCliReferencedPackagesFromFiles.ts","../../../src/actions/deplint/getScriptReferencedPackages.ts","../../../src/actions/deplint/implicitDevDependencies.ts","../../../src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts","../../../src/actions/deplint/checkPackage/getWorkspaceVersionProblems.ts","../../../src/actions/deplint/rules.ts","../../../src/actions/deplint/snapshot.ts","../../../src/actions/deplint/engine.ts"],"sourcesContent":["import { existsSync } from 'node:fs'\n\nexport type PackageManagerName = 'pnpm' | 'yarn'\n\nexport function detectPackageManager(): PackageManagerName {\n if (existsSync('pnpm-lock.yaml') || existsSync('pnpm-workspace.yaml')) return 'pnpm'\n return 'yarn'\n}\n","import chalk from 'chalk'\nimport { cosmiconfig } from 'cosmiconfig'\nimport { TypeScriptLoader } from 'cosmiconfig-typescript-loader'\nimport deepmerge from 'deepmerge'\n\nlet config: Record<string, unknown>\nlet rootConfigPath: string | undefined\n\nconst workspaceConfigCache = new Map<string, Record<string, unknown>>()\nconst deprecationWarned = new Set<string>()\n\nfunction createExplorer() {\n return cosmiconfig('xy', { cache: true, loaders: { '.ts': TypeScriptLoader() } })\n}\n\nexport const loadConfig = async <T extends object>(params?: T): Promise<T> => {\n if (config === undefined) {\n const cosmicConfigResult = await createExplorer().search()\n config = (cosmicConfigResult?.config ?? {}) as Record<string, unknown>\n rootConfigPath = cosmicConfigResult?.filepath\n const configFilePath = cosmicConfigResult?.filepath\n if (configFilePath !== undefined) {\n console.log(chalk.green(`Loaded config from ${configFilePath}`))\n if (config.verbose) {\n console.log(chalk.gray(`${JSON.stringify(config, null, 2)}`))\n }\n }\n }\n return deepmerge(config, params ?? {}) as T\n}\n\n/**\n * Loads the xy.config from a specific workspace directory.\n * Returns an empty object if the workspace has no config or if\n * the found config is the root config (avoids double-applying).\n */\nasync function loadWorkspaceConfig(workspaceDir: string): Promise<Record<string, unknown>> {\n const cached = workspaceConfigCache.get(workspaceDir)\n if (cached !== undefined) return cached\n\n const result = await createExplorer().search(workspaceDir)\n\n // If no config found or it's the root config, no workspace override\n if (!result || result.filepath === rootConfigPath) {\n workspaceConfigCache.set(workspaceDir, {})\n return {}\n }\n\n const wsConfig = (result.config ?? {}) as Record<string, unknown>\n workspaceConfigCache.set(workspaceDir, wsConfig)\n return wsConfig\n}\n\n/** Deprecated top-level fields that should be under `commands`. */\nconst DEPRECATED_COMMAND_FIELDS = new Set(['deplint', 'publint'])\n\n/**\n * Resolves a command's config field from a config object.\n * Prefers `commands.[name]` over top-level `[name]`.\n * Warns once per config file when a deprecated top-level field is used.\n */\nfunction resolveCommandField(\n cfg: Record<string, unknown>,\n commandName: string,\n configPath?: string,\n): Record<string, unknown> {\n const commands = cfg.commands as Record<string, unknown> | undefined\n const fromCommands = commands?.[commandName]\n const fromTopLevel = cfg[commandName]\n\n if (fromCommands !== undefined && typeof fromCommands === 'object') {\n return fromCommands as Record<string, unknown>\n }\n\n if (fromTopLevel !== undefined && typeof fromTopLevel === 'object'\n && DEPRECATED_COMMAND_FIELDS.has(commandName)) {\n const key = `${configPath ?? 'unknown'}:${commandName}`\n if (!deprecationWarned.has(key)) {\n deprecationWarned.add(key)\n console.warn(chalk.yellow(\n `[xy] Deprecated: top-level \"${commandName}\" in ${configPath ?? 'xy.config'} — move to \"commands.${commandName}\"`,\n ))\n }\n return fromTopLevel as Record<string, unknown>\n }\n\n return {}\n}\n\n/**\n * Loads a command-specific config merged from root and workspace levels.\n * The root config provides defaults; the workspace config extends/overrides.\n * Arrays (e.g. `exclude`) are unioned and maps (e.g. `packages`) are merged\n * via deepmerge, with workspace entries overriding root entries for the same key.\n */\nexport async function loadWorkspaceCommandConfig<C>(\n workspaceDir: string,\n commandName: string,\n): Promise<C> {\n // Ensure root config is loaded\n const root = await loadConfig()\n const rootCmd = resolveCommandField(root as Record<string, unknown>, commandName, rootConfigPath)\n\n const wsConfig = await loadWorkspaceConfig(workspaceDir)\n const wsConfigPath = workspaceConfigCache.has(workspaceDir) ? workspaceDir : undefined\n const wsCmd = resolveCommandField(wsConfig, commandName, wsConfigPath)\n\n return deepmerge(rootCmd, wsCmd) as C\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","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 type { Workspace } from '../../pm/index.ts'\nimport {\n addDep,\n moveDep,\n type PackageJson,\n readPackageJson,\n removeDep,\n writePackageJson,\n} from './packageJsonEditor.ts'\nimport type { DeplintAppliedFix, DeplintFix } from './types.ts'\n\nexport class DeplintPackageEditor {\n private readonly pkg: PackageJson\n\n constructor(\n private readonly workspace: Workspace,\n ) {\n this.pkg = readPackageJson(workspace.location)\n }\n\n applyFix(fix: DeplintFix): DeplintAppliedFix {\n switch (fix.action) {\n case 'add': {\n addDep(this.pkg, fix.dependency, fix.version, fix.section)\n break\n }\n case 'move': {\n moveDep(this.pkg, fix.dependency, fix.fromSection, fix.toSection)\n if (fix.version !== undefined && this.pkg[fix.toSection]?.[fix.dependency] !== undefined) {\n this.pkg[fix.toSection]![fix.dependency] = fix.version\n }\n break\n }\n case 'remove': {\n removeDep(this.pkg, fix.dependency, fix.section)\n break\n }\n case 'set-version': {\n addDep(this.pkg, fix.dependency, fix.version, fix.section)\n break\n }\n }\n\n return {\n dependency: fix.dependency,\n detail: fix.detail,\n workspace: this.workspace,\n }\n }\n\n save(): void {\n writePackageJson(this.workspace.location, this.pkg)\n }\n}\n","import { DeplintPackageEditor } from './packageEditor.ts'\nimport type { DeplintAppliedFix, DeplintDiagnostic } from './types.ts'\n\nexport function applyDeplintFixes(diagnostics: DeplintDiagnostic[]): DeplintAppliedFix[] {\n const editors = new Map<string, DeplintPackageEditor>()\n const applied: DeplintAppliedFix[] = []\n\n for (const diagnostic of diagnostics) {\n for (const fix of diagnostic.fixes ?? []) {\n const workspaceKey = diagnostic.workspace.location\n let editor = editors.get(workspaceKey)\n if (!editor) {\n editor = new DeplintPackageEditor(diagnostic.workspace)\n editors.set(workspaceKey, editor)\n }\n applied.push(editor.applyFix(fix))\n }\n }\n\n for (const editor of editors.values()) {\n editor.save()\n }\n\n return applied\n}\n","import fs from 'node:fs'\n\nimport { findFilesByGlob } from './findFilesByGlob.ts'\n\nconst codeExtensions = '*.{ts,tsx,mts,cts,js,mjs,cjs}'\n\nfunction getWorkspaceIgnores(location: string): string[] {\n try {\n const raw = fs.readFileSync(`${location}/package.json`, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n return (pkg.workspaces ?? []) as string[]\n } catch {\n return []\n }\n}\n\nexport function findFiles(location: string) {\n const workspaceIgnores = getWorkspaceIgnores(location).map(w => `${w}/**`)\n const ignore = ['**/node_modules/**', 'dist/**', ...workspaceIgnores]\n const allFiles = findFilesByGlob(location, `./**/${codeExtensions}`, ignore)\n const distFiles = [\n ...findFilesByGlob(location, './dist/**/*.d.ts'),\n ...findFilesByGlob(location, `./dist/**/${codeExtensions}`),\n ]\n\n return { allFiles, distFiles }\n}\n","import { globSync } from 'glob'\n\nexport function findFilesByGlob(cwd: string, pattern: string, ignore?: string[]) {\n return globSync(pattern, {\n cwd, absolute: true, ignore, nodir: true,\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function getDependenciesFromPackageJson(packageJsonPath: string) {\n const packageJsonFullPath = path.resolve(packageJsonPath)\n const rawContent = fs.readFileSync(packageJsonFullPath, 'utf8')\n const packageJson = JSON.parse(rawContent) as Record<string, unknown>\n\n const depsRecord = (packageJson.dependencies ?? {}) as Record<string, string>\n const devDepsRecord = (packageJson.devDependencies ?? {}) as Record<string, string>\n const peerDepsRecord = (packageJson.peerDependencies ?? {}) as Record<string, string>\n\n const dependencies = Object.keys(depsRecord)\n const devDependencies = Object.keys(devDepsRecord)\n const peerDependencies = Object.keys(peerDepsRecord)\n\n const dependencyVersions = depsRecord\n const devDependencyVersions = devDepsRecord\n const peerDependencyVersions = peerDepsRecord\n\n return {\n dependencies,\n dependencyVersions,\n devDependencies,\n devDependencyVersions,\n peerDependencies,\n peerDependencyVersions,\n }\n}\n","import fs from 'node:fs'\n\nimport { globSync } from 'glob'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\n\nconst isExternalReference = (ref: string) => !ref.startsWith('.') && !ref.startsWith('/')\n\nfunction parseExtendsField(value: unknown): string[] {\n if (typeof value === 'string') return [value]\n if (Array.isArray(value)) return value.filter((v): v is string => typeof v === 'string')\n return []\n}\n\nfunction parseTypesField(value: unknown): string[] {\n if (Array.isArray(value)) return value.filter((v): v is string => typeof v === 'string')\n return []\n}\n\nfunction parseTsconfig(file: string): Record<string, unknown> {\n const content = fs.readFileSync(file, 'utf8')\n // Strip single-line comments (tsconfig allows them) and trailing commas before parsing\n const cleaned = content\n .replaceAll(/\\/\\/.*/g, '')\n .replaceAll(/,\\s*([}\\]])/g, '$1')\n return JSON.parse(cleaned) as Record<string, unknown>\n}\n\nexport function getExtendsFromTsconfigs(location: string): string[] {\n const tsconfigFiles = globSync('./tsconfig*.json', { cwd: location, absolute: true })\n const packages = new Set<string>()\n\n for (const file of tsconfigFiles) {\n try {\n const parsed = parseTsconfig(file)\n const refs = parseExtendsField(parsed.extends)\n for (const ref of refs) {\n if (isExternalReference(ref)) {\n packages.add(getBasePackageName(ref))\n }\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n\n return [...packages]\n}\n\nexport function getTypesFromTsconfigs(location: string): string[] {\n const tsconfigFiles = globSync('./tsconfig*.json', { cwd: location, absolute: true })\n const packages = new Set<string>()\n\n for (const file of tsconfigFiles) {\n try {\n const parsed = parseTsconfig(file)\n const compilerOptions = parsed.compilerOptions as Record<string, unknown> | undefined\n const refs = parseTypesField(compilerOptions?.types)\n for (const ref of refs) {\n packages.add(getBasePackageName(ref))\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n\n return [...packages]\n}\n","export function getBasePackageName(importName: string) {\n const importNameScrubbed = importName.replaceAll('\"', '').trim()\n if (importNameScrubbed.startsWith('@')) {\n const parts = importNameScrubbed.split('/')\n return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importNameScrubbed\n }\n return importNameScrubbed.split('/')[0]\n}\n","import fs from 'node:fs'\n\nimport type { CheckSourceParams } from './checkPackage/index.ts'\nimport { getImportsFromFile } from './getImportsFromFile.ts'\n\nconst internalImportPrefixes = ['.', '#', 'node:']\n\nconst removeInternalImports = (imports: string[]) => {\n return imports.filter(imp => !internalImportPrefixes.some(prefix => imp.startsWith(prefix)))\n}\n\nconst isDeclarationFile = (file: string) =>\n file.endsWith('.d.ts') || file.endsWith('.d.cts') || file.endsWith('.d.mts')\n\nfunction shipsTsconfig(location: string): boolean {\n try {\n const raw = fs.readFileSync(`${location}/package.json`, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n const files = pkg.files as string[] | undefined\n return files?.some((f: string) => f === 'tsconfig.json' || f.includes('tsconfig')) ?? false\n } catch {\n return false\n }\n}\n\nexport function getExternalImportsFromFiles({\n allFiles, distFiles, location, tsconfigExtends = [], tsconfigTypes = [],\n}: {\n allFiles: string[]\n distFiles: string[]\n location: string\n tsconfigExtends?: string[]\n tsconfigTypes?: string[]\n}): CheckSourceParams {\n const allImportPaths: Record<string, string[]> = {}\n const distImportPaths: Record<string, string[]> = {}\n const distTypeImportPaths: Record<string, string[]> = {}\n\n for (const path of allFiles) getImportsFromFile(path, allImportPaths, allImportPaths).flat()\n\n const distTypeFiles = distFiles.filter(isDeclarationFile)\n const distCodeFiles = distFiles.filter(file => !isDeclarationFile(file))\n for (const path of distCodeFiles) getImportsFromFile(path, distImportPaths, distImportPaths).flat()\n for (const path of distTypeFiles) getImportsFromFile(path, distTypeImportPaths, distTypeImportPaths).flat()\n\n const allImports = Object.keys(allImportPaths)\n const distImports = Object.keys(distImportPaths)\n\n const externalAllImports = removeInternalImports(allImports)\n const externalDistImports = removeInternalImports(distImports)\n const externalDistTypeImports = removeInternalImports(Object.keys(distTypeImportPaths))\n\n // Tsconfig extends references count as used imports.\n // If the package ships its tsconfig.json, extends refs are dist imports\n // (consumers need them), otherwise they are build-time only (devDep).\n const isDistTsconfig = shipsTsconfig(location)\n for (const ext of tsconfigExtends) {\n if (!externalAllImports.includes(ext)) externalAllImports.push(ext)\n if (isDistTsconfig && !externalDistImports.includes(ext)) externalDistImports.push(ext)\n }\n\n // Tsconfig compilerOptions.types references count as build-time imports (devDep).\n for (const typ of tsconfigTypes) {\n if (!externalAllImports.includes(typ)) externalAllImports.push(typ)\n }\n\n return {\n allImportPaths,\n allImports,\n distImportPaths,\n distImports,\n externalAllImports,\n externalDistImports,\n externalDistTypeImports,\n tsconfigExtends: [...tsconfigExtends],\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport ts from 'typescript'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\n\nexport function isTypeOnlyImportClause(clause?: ts.ImportClause): boolean {\n if (clause === undefined) {\n return false\n }\n // Newer TS: clause.phaseModifier -> token or number\n if ('phaseModifier' in clause) {\n const mod = clause.phaseModifier\n // handle number enum or token node with .kind\n const kind: number | undefined = typeof mod === 'number' ? mod : (mod as { kind?: number } | undefined)?.kind\n return kind === ts.SyntaxKind.TypeKeyword\n }\n // Older TS fallback\n return (clause as unknown as { isTypeOnly?: boolean }).isTypeOnly ?? false\n}\n\nexport function getImportsFromFile(filePath: string, importPaths: Record<string, string[]>, typeImportPaths: Record<string, string[]>) {\n const sourceCode = fs.readFileSync(filePath, 'utf8')\n\n const isMjsFile = filePath.endsWith('.mjs')\n\n const sourceFile = ts.createSourceFile(\n path.basename(filePath),\n sourceCode,\n ts.ScriptTarget.Latest,\n true,\n isMjsFile ? ts.ScriptKind.JS : undefined,\n )\n\n const imports: string[] = []\n const typeImports: string[] = []\n\n const isDeclarationFile = filePath.endsWith('.d.ts')\n\n function visit(node: ts.Node) {\n if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {\n const moduleSpecifier = (node.moduleSpecifier)?.getFullText()\n const isTypeImport = ts.isImportDeclaration(node) ? isTypeOnlyImportClause(node.importClause) : false\n if (typeof moduleSpecifier === 'string') {\n const trimmed = moduleSpecifier.replaceAll(\"'\", '').replaceAll('\"', '').trim()\n // we are determining if the type import is being imported in an exported d.ts file\n if (isTypeImport || isDeclarationFile) {\n typeImports.push(trimmed)\n } else {\n imports.push(trimmed)\n }\n }\n } else if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {\n const [arg] = node.arguments\n if (ts.isStringLiteral(arg)) {\n imports.push(arg.text)\n }\n } else if (\n ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && node.expression.text === 'require'\n && node.arguments.length > 0\n && ts.isStringLiteral(node.arguments[0])\n ) {\n imports.push(node.arguments[0].text)\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n // Detect /// <reference types=\"package\" /> directives\n for (const ref of sourceFile.typeReferenceDirectives) {\n typeImports.push(ref.fileName)\n }\n\n const importsStartsWithExcludes = ['.', '#', 'node:']\n\n const isValidImport = (imp: string) =>\n !importsStartsWithExcludes.some(exc => imp.startsWith(exc))\n && !imp.includes('*')\n && !imp.includes('!')\n\n const cleanedImports = imports.filter(isValidImport).map(getBasePackageName)\n const cleanedTypeImports = typeImports.filter(isValidImport).map(getBasePackageName)\n\n for (const imp of cleanedImports) {\n importPaths[imp] = importPaths[imp] ?? []\n importPaths[imp].push(filePath)\n }\n\n for (const imp of cleanedTypeImports) {\n typeImportPaths[imp] = typeImportPaths[imp] ?? []\n typeImportPaths[imp].push(filePath)\n }\n\n return [cleanedImports, cleanedTypeImports]\n}\n","import chalk from 'chalk'\nimport semver from 'semver'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport { readPackageJson, writePackageJson } from '../packageJsonEditor.ts'\nimport type { CheckPackageParams } from './checkPackageTypes.ts'\n\nexport interface PeerDevMismatch {\n dep: string\n devVersion: string\n peerVersion: string\n}\n\nexport function findMismatchedPeerDevVersions(\n {\n peerDependencies, peerDependencyVersions, devDependencyVersions,\n }: CheckPackageParams,\n exclude?: Set<string>,\n): PeerDevMismatch[] {\n const mismatches: PeerDevMismatch[] = []\n for (const dep of peerDependencies) {\n if (exclude?.has(dep)) continue\n const peerVersion = peerDependencyVersions[dep]\n const devVersion = devDependencyVersions[dep]\n // Skip semver comparison for workspace protocol versions — they resolve at install time\n const hasWorkspaceProtocol = devVersion?.startsWith('workspace:') || peerVersion?.startsWith('workspace:')\n if (devVersion && peerVersion !== devVersion && !hasWorkspaceProtocol && !semver.subset(devVersion, peerVersion)) {\n mismatches.push({\n dep, devVersion, peerVersion,\n })\n }\n }\n return mismatches\n}\n\nexport function getMismatchedPeerDevVersions(\n { name, location }: Workspace,\n packageParams: CheckPackageParams,\n exclude?: Set<string>,\n): number {\n const mismatches = findMismatchedPeerDevVersions(packageParams, exclude)\n\n for (const {\n dep, peerVersion, devVersion,\n } of mismatches) {\n console.log(\n `[${chalk.blue(name)}] Peer/dev version mismatch ${chalk.red(dep)}`\n + ` — peer: ${chalk.yellow(peerVersion)}, dev: ${chalk.cyan(devVersion)}`,\n )\n }\n if (mismatches.length > 0) {\n console.log(` ${chalk.yellow(`${location}/package.json`)}\\n`)\n }\n return mismatches.length\n}\n\nexport function fixMismatchedPeerDevVersions(\n workspace: Workspace,\n packageParams: CheckPackageParams,\n exclude?: Set<string>,\n): number {\n const mismatches = findMismatchedPeerDevVersions(packageParams, exclude)\n if (mismatches.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n\n for (const { dep, devVersion } of mismatches) {\n if (pkg.peerDependencies?.[dep]) {\n pkg.peerDependencies[dep] = devVersion\n console.log(\n `[${chalk.blue(workspace.name)}] Fixed: synced peerDependency ${chalk.green(dep)}`\n + ` to devDependency version ${chalk.cyan(devVersion)}`,\n )\n }\n }\n\n writePackageJson(workspace.location, pkg)\n return mismatches.length\n}\n","import fs from 'node:fs'\nimport { builtinModules } from 'node:module'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport { findDepPackageJson } from '../getRequiredPeerDependencies.ts'\nimport {\n addDep, logFix, readPackageJson, resolveDepVersion, writePackageJson,\n} from '../packageJsonEditor.ts'\nimport { isSatisfiedByTsScriptsVariant } from '../tsScriptsAliases.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\n/**\n * Checks if a runtime import is satisfied by a listed dependency.\n * An `@types` package alone is not enough since it only provides\n * type declarations, not runnable code.\n */\nfunction isRuntimeImportListed(\n imp: string,\n name: string,\n dependencies: string[],\n peerDependencies: string[],\n) {\n return dependencies.includes(imp)\n || imp === name\n || peerDependencies.includes(imp)\n || builtinModules.includes(imp)\n}\n\n/**\n * Checks if a type-only dist import is satisfied by a listed dependency.\n * These appear in published .d.ts files, so consumers need them installed.\n * They must be in dependencies or peerDependencies (not just devDependencies)\n * because they ship in the published package.\n */\nfunction isDistTypeImportListed(\n imp: string,\n name: string,\n dependencies: string[],\n devDependencies: string[],\n peerDependencies: string[],\n) {\n return dependencies.includes(imp)\n || imp === name\n || dependencies.includes(`@types/${imp}`)\n || devDependencies.includes(`@types/${imp}`)\n || peerDependencies.includes(imp)\n || peerDependencies.includes(`@types/${imp}`)\n || builtinModules.includes(imp)\n}\n\nfunction logMissing(name: string, imp: string, importPaths: Record<string, string[]>) {\n console.log(`[${chalk.blue(name)}] Missing dependency in package.json: ${chalk.red(imp)}`)\n if (importPaths[imp]) {\n console.log(` ${importPaths[imp].join('\\n ')}`)\n }\n}\n\n/**\n * Determines whether an import should be a peerDependency in a library\n * package. Returns true when all of the import's own peer dependencies\n * are both listed in the package's peerDependencies AND directly imported\n * in the dist output. This distinguishes companion packages like react-dom\n * (whose peers the library independently imports) from implementation\n * dependencies like a widget library that merely consume a framework.\n */\nexport function shouldBePeerDependency(\n imp: string,\n location: string,\n currentPeers: string[],\n distImports: string[],\n): boolean {\n if (currentPeers.length === 0) return false\n const depPkgPath = findDepPackageJson(location, imp)\n if (!depPkgPath) return false\n try {\n const pkg = JSON.parse(fs.readFileSync(depPkgPath, 'utf8')) as Record<string, unknown>\n const importPeers = Object.keys((pkg.peerDependencies ?? {}) as Record<string, unknown>)\n // Every peer of the import must be a first-class peer of the package —\n // i.e. both listed as a peerDependency and directly imported in dist.\n return importPeers.length > 0 && importPeers.every(\n peer => currentPeers.includes(peer) && distImports.includes(peer),\n )\n } catch {\n return false\n }\n}\n\nexport interface UnlistedDep {\n imp: string\n section: 'dependencies' | 'devDependencies'\n}\n\nexport function findUnlistedDependencies(\n name: string,\n dependencies: string[],\n devDependencies: string[],\n peerDependencies: string[],\n externalDistImports: string[],\n externalDistTypeImports: string[],\n): UnlistedDep[] {\n const allDeps = [...dependencies, ...devDependencies, ...peerDependencies]\n const results: UnlistedDep[] = []\n\n for (const imp of externalDistImports) {\n if (!isRuntimeImportListed(imp, name, dependencies, peerDependencies)\n && !isSatisfiedByTsScriptsVariant(imp, allDeps)) {\n results.push({ imp, section: 'dependencies' })\n }\n }\n\n for (const imp of externalDistTypeImports) {\n if (!isDistTypeImportListed(imp, name, dependencies, devDependencies, peerDependencies)\n && !isSatisfiedByTsScriptsVariant(imp, allDeps)) {\n results.push({ imp, section: 'dependencies' })\n }\n }\n\n return results\n}\n\nexport function getUnlistedDependencies(\n { name, location }: Workspace,\n {\n dependencies, devDependencies, peerDependencies,\n }: CheckPackageParams,\n {\n externalDistImports, externalDistTypeImports, distImportPaths,\n }: CheckSourceParams,\n) {\n const unlisted = findUnlistedDependencies(name, dependencies, devDependencies, peerDependencies, externalDistImports, externalDistTypeImports)\n\n for (const { imp } of unlisted) {\n logMissing(name, imp, distImportPaths)\n }\n if (unlisted.length > 0) {\n console.log(` ${chalk.yellow(`${location}/package.json`)}\\n`)\n }\n return unlisted.length\n}\n\nexport function fixUnlistedDependencies(\n workspace: Workspace,\n {\n dependencies, devDependencies, peerDependencies,\n }: CheckPackageParams,\n { externalDistImports, externalDistTypeImports }: CheckSourceParams,\n) {\n const unlisted = findUnlistedDependencies(workspace.name, dependencies, devDependencies, peerDependencies, externalDistImports, externalDistTypeImports)\n if (unlisted.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n const isTerminal = pkg.private === true\n\n for (const { imp, section } of unlisted) {\n const version = resolveDepVersion(workspace.location, imp)\n // For library packages, if the import shares peers with existing\n // peerDependencies, add it as a peer + dev instead of a dependency.\n const isPeer = !isTerminal\n && section === 'dependencies'\n && shouldBePeerDependency(imp, workspace.location, peerDependencies, externalDistImports)\n if (isPeer) {\n addDep(pkg, imp, version, 'peerDependencies')\n logFix(workspace, 'added to peerDependencies', imp, version)\n addDep(pkg, imp, version, 'devDependencies')\n logFix(workspace, 'added to devDependencies', imp, version)\n } else {\n addDep(pkg, imp, version, section)\n logFix(workspace, `added to ${section}`, imp, version)\n }\n }\n\n writePackageJson(workspace.location, pkg)\n return unlisted.length\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","import { builtinModules } from 'node:module'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport {\n addDep, logFix, readPackageJson, resolveDepVersion, writePackageJson,\n} from '../packageJsonEditor.ts'\nimport { isSatisfiedByTsScriptsVariant } from '../tsScriptsAliases.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nexport function findUnlistedDevDeps(\n name: string,\n dependencies: string[],\n devDependencies: string[],\n peerDependencies: string[],\n externalAllImports: string[],\n distImports: string[],\n externalDistTypeImports: string[],\n): string[] {\n const results: string[] = []\n for (const imp of externalAllImports) {\n if (!distImports.includes(imp)\n && !externalDistTypeImports.includes(imp)\n && imp !== name\n && !dependencies.includes(imp)\n && !dependencies.includes(`@types/${imp}`)\n && !peerDependencies.includes(imp)\n && !peerDependencies.includes(`@types/${imp}`)\n && !devDependencies.includes(imp)\n && !devDependencies.includes(`@types/${imp}`)\n && !builtinModules.includes(imp)\n && !isSatisfiedByTsScriptsVariant(imp, [...dependencies, ...devDependencies, ...peerDependencies])\n ) {\n results.push(imp)\n }\n }\n return results\n}\n\nexport function getUnlistedDevDependencies(\n { name, location }: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n {\n allImportPaths, externalAllImports, distImports, externalDistTypeImports,\n }: CheckSourceParams,\n) {\n const unlisted = findUnlistedDevDeps(name, dependencies, devDependencies, peerDependencies, externalAllImports, distImports, externalDistTypeImports)\n\n for (const imp of unlisted) {\n console.log(`[${chalk.blue(name)}] Missing devDependency in package.json: ${chalk.red(imp)}`)\n if (allImportPaths[imp]) {\n console.log(` ${allImportPaths[imp].join('\\n ')}`)\n }\n }\n if (unlisted.length > 0) {\n console.log(` ${chalk.yellow(`${location}/package.json`)}\\n`)\n }\n return unlisted.length\n}\n\nexport function fixUnlistedDevDependencies(\n workspace: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n {\n externalAllImports, distImports, externalDistTypeImports,\n }: CheckSourceParams,\n) {\n const unlisted = findUnlistedDevDeps(workspace.name, dependencies, devDependencies, peerDependencies, externalAllImports, distImports, externalDistTypeImports)\n if (unlisted.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n\n for (const imp of unlisted) {\n const version = resolveDepVersion(workspace.location, imp)\n addDep(pkg, imp, version, 'devDependencies')\n logFix(workspace, 'added to devDependencies', imp, version)\n }\n\n writePackageJson(workspace.location, pkg)\n return unlisted.length\n}\n","import fs from 'node:fs'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport {\n logFix, readPackageJson, removeDep, writePackageJson,\n} from '../packageJsonEditor.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\nimport { getRequiredTransitivePeers } from './getUnsatisfiedPeerDependencies.ts'\n\n// --- Check A: Unrequested peers (imported but no dep requires it as a peer) ---\n\nfunction isPeerImportedInDist(dep: string, externalDistImports: string[], externalDistTypeImports: string[]): boolean {\n const baseName = dep.replace(/^@types\\//, '')\n return externalDistImports.includes(dep)\n || externalDistImports.includes(baseName)\n || externalDistTypeImports.includes(dep)\n || externalDistTypeImports.includes(baseName)\n}\n\nexport function findUnrequestedPeerDeps(\n location: string,\n packageParams: CheckPackageParams,\n { externalDistImports, externalDistTypeImports }: CheckSourceParams,\n exclude?: Set<string>,\n): string[] {\n const requiredPeers = getRequiredTransitivePeers(location, packageParams)\n\n const unrequested: string[] = []\n for (const dep of packageParams.peerDependencies) {\n if (exclude?.has(dep)) continue\n if (packageParams.dependencies.includes(dep)) continue\n if (!isPeerImportedInDist(dep, externalDistImports, externalDistTypeImports)) continue\n if (!requiredPeers.has(dep)) {\n unrequested.push(dep)\n }\n }\n return unrequested\n}\n\nexport function getUnrequestedPeerDependencies(\n { name, location }: Workspace,\n packageParams: CheckPackageParams,\n sourceParams: CheckSourceParams,\n exclude?: Set<string>,\n): number {\n // For library packages, importing a peerDep in dist is the normal pattern —\n // the library uses it but wants consumers to provide it.\n if (!isTerminalPackage(location)) return 0\n\n const unrequested = findUnrequestedPeerDeps(location, packageParams, sourceParams, exclude)\n\n for (const dep of unrequested) {\n console.log(\n `[${chalk.blue(name)}] Unnecessary peerDependency ${chalk.red(dep)}`\n + ' — imported in dist but no dependency requires it as a peer; should be a dependency',\n )\n }\n if (unrequested.length > 0) {\n console.log(` ${chalk.yellow(`${location}/package.json`)}\\n`)\n }\n return unrequested.length\n}\n\nfunction isTerminalPackage(location: string): boolean {\n try {\n const pkg = JSON.parse(fs.readFileSync(`${location}/package.json`, 'utf8')) as Record<string, unknown>\n return pkg.private === true\n } catch {\n return false\n }\n}\n\nexport function fixUnrequestedPeerDependencies(\n workspace: Workspace,\n packageParams: CheckPackageParams,\n sourceParams: CheckSourceParams,\n exclude?: Set<string>,\n): number {\n const unrequested = findUnrequestedPeerDeps(workspace.location, packageParams, sourceParams, exclude)\n if (unrequested.length === 0) return 0\n\n const isTerminal = isTerminalPackage(workspace.location)\n const tsconfigExtendsSet = new Set(sourceParams.tsconfigExtends)\n\n // For library packages (non-private), unrequested peers are intentional —\n // the library wants consumers to provide them. Only move to dependencies\n // for terminal/private packages (apps, CLIs) or when the dep is only\n // referenced via tsconfig extends (a build-time need, not a runtime peer).\n const fixable = isTerminal\n ? unrequested\n : unrequested.filter(dep => tsconfigExtendsSet.has(dep))\n\n if (fixable.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n\n for (const dep of fixable) {\n const version = packageParams.peerDependencyVersions[dep] ?? '*'\n removeDep(pkg, dep, 'peerDependencies')\n pkg.dependencies = pkg.dependencies ?? {}\n pkg.dependencies[dep] = version\n logFix(workspace, 'moved from peerDependencies to dependencies', dep)\n }\n\n writePackageJson(workspace.location, pkg)\n return fixable.length\n}\n\n// --- Check B: Redundant peers (also in dependencies) ---\n\nexport function findRedundantPeerDeps(\n { peerDependencies, dependencies }: CheckPackageParams,\n exclude?: Set<string>,\n): string[] {\n const depsSet = new Set(dependencies)\n const redundant: string[] = []\n for (const dep of peerDependencies) {\n if (exclude?.has(dep)) continue\n if (depsSet.has(dep)) {\n redundant.push(dep)\n }\n }\n return redundant\n}\n\nexport function getRedundantPeerDependencies(\n { name, location }: Workspace,\n packageParams: CheckPackageParams,\n exclude?: Set<string>,\n): number {\n const redundant = findRedundantPeerDeps(packageParams, exclude)\n\n for (const dep of redundant) {\n console.log(\n `[${chalk.blue(name)}] Redundant peerDependency ${chalk.red(dep)}`\n + ' — already listed in dependencies',\n )\n }\n if (redundant.length > 0) {\n console.log(` ${chalk.yellow(`${location}/package.json`)}\\n`)\n }\n return redundant.length\n}\n\nexport function fixRedundantPeerDependencies(\n workspace: Workspace,\n packageParams: CheckPackageParams,\n exclude?: Set<string>,\n): number {\n const redundant = findRedundantPeerDeps(packageParams, exclude)\n if (redundant.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n\n for (const dep of redundant) {\n removeDep(pkg, dep, 'peerDependencies')\n logFix(workspace, 'removed redundant peerDependency (kept in dependencies)', dep)\n }\n\n writePackageJson(workspace.location, pkg)\n return redundant.length\n}\n","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 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 chalk from 'chalk'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport { getCliReferencedPackagesFromFiles } from '../getCliReferencedPackagesFromFiles.ts'\nimport { getRequiredPeerDependencies } from '../getRequiredPeerDependencies.ts'\nimport { getScriptReferencedPackages } from '../getScriptReferencedPackages.ts'\nimport type { FileContext } from '../implicitDevDependencies.ts'\nimport { getImplicitDevDependencies } from '../implicitDevDependencies.ts'\nimport {\n logFix, readPackageJson, removeDep, writePackageJson,\n} from '../packageJsonEditor.ts'\nimport { isUsedViaTsScriptsVariant } from '../tsScriptsAliases.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nconst allExternalImports = ({\n externalAllImports,\n externalDistImports,\n externalDistTypeImports,\n}: CheckSourceParams) => {\n return new Set<string>([\n ...externalAllImports,\n ...externalDistImports,\n ...externalDistTypeImports,\n ])\n}\n\nfunction isDevDepUsed(\n dep: string,\n allImports: Set<string>,\n implicitDeps: Set<string>,\n requiredPeers: Set<string>,\n scriptRefs: Set<string>,\n cliRefs: Set<string>,\n) {\n if (implicitDeps.has(dep)) return true\n if (requiredPeers.has(dep)) return true\n if (scriptRefs.has(dep)) return true\n if (cliRefs.has(dep)) return true\n\n if (dep.startsWith('@types/')) {\n const baseName = dep.replace(/^@types\\//, '')\n return allImports.has(baseName) || allImports.has(dep) || implicitDeps.has(baseName)\n }\n\n if (allImports.has(dep)) return true\n return isUsedViaTsScriptsVariant(dep, [...allImports])\n}\n\nexport function findUnusedDevDeps(\n location: string,\n dependencies: string[],\n devDependencies: string[],\n peerDependencies: string[],\n sourceParams: CheckSourceParams,\n fileContext: FileContext,\n exclude?: Set<string>,\n): string[] {\n const allImports = allExternalImports(sourceParams)\n const allDeps = [...dependencies, ...devDependencies, ...peerDependencies]\n const implicitDeps = getImplicitDevDependencies({\n ...fileContext, allDependencies: allDeps, location,\n })\n const requiredPeers = getRequiredPeerDependencies(location, allDeps)\n const scriptRefs = getScriptReferencedPackages(location, allDeps)\n const cliRefs = getCliReferencedPackagesFromFiles(fileContext.allFiles, location, allDeps)\n const unused: string[] = []\n\n for (const dep of devDependencies) {\n if (exclude?.has(dep)) continue\n if (dependencies.includes(dep) || peerDependencies.includes(dep)) continue\n\n if (!isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs, cliRefs)) {\n unused.push(dep)\n }\n }\n\n return unused\n}\n\nexport function getUnusedDevDependencies(\n { name, location }: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n sourceParams: CheckSourceParams,\n fileContext: FileContext,\n exclude?: Set<string>,\n) {\n const unused = findUnusedDevDeps(location, dependencies, devDependencies, peerDependencies, sourceParams, fileContext, exclude)\n\n for (const dep of unused) {\n console.log(`[${chalk.blue(name)}] Unused devDependency in package.json: ${chalk.red(dep)}`)\n }\n if (unused.length > 0) {\n console.log(` ${chalk.yellow(`${location}/package.json`)}\\n`)\n }\n return unused.length\n}\n\nexport function fixUnusedDevDependencies(\n workspace: Workspace,\n {\n devDependencies, dependencies, peerDependencies,\n }: CheckPackageParams,\n sourceParams: CheckSourceParams,\n fileContext: FileContext,\n exclude?: Set<string>,\n) {\n const unused = findUnusedDevDeps(workspace.location, dependencies, devDependencies, peerDependencies, sourceParams, fileContext, exclude)\n if (unused.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n\n for (const dep of unused) {\n removeDep(pkg, dep, 'devDependencies')\n logFix(workspace, 'removed from devDependencies', dep)\n }\n\n writePackageJson(workspace.location, pkg)\n return unused.length\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport ts from 'typescript'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\nimport { getBinNames, tokenizeScript } from './getScriptReferencedPackages.ts'\n\n/**\n * Names of child_process functions that execute shell commands as a single\n * string (first argument is a command string to tokenize).\n */\nconst shellCommandFunctions = new Set(['execSync', 'exec'])\n\n/**\n * Names of child_process functions where the first argument is the\n * executable name directly (not a full shell command string).\n */\nconst directExecFunctions = new Set(['spawn', 'spawnSync', 'execFile', 'execFileSync'])\n\n/**\n * All child_process function names we scan for.\n */\nconst allExecFunctions = new Set([...shellCommandFunctions, ...directExecFunctions])\n\n/**\n * Extracts command strings from child_process calls (execSync, spawn, etc.)\n * found in a single source file.\n *\n * For shell-style calls (execSync, exec) the first argument is a command\n * string like \"npx typedoc --options foo\" — we tokenize it and return the\n * tokens. For direct-exec calls (spawn, spawnSync, execFile, execFileSync)\n * the first argument is the executable name itself.\n */\nfunction getCommandTokensFromFile(filePath: string): Set<string> {\n const tokens = new Set<string>()\n let sourceCode: string\n try {\n sourceCode = fs.readFileSync(filePath, 'utf8')\n } catch {\n return tokens\n }\n\n const isMjsFile = filePath.endsWith('.mjs')\n const sourceFile = ts.createSourceFile(\n path.basename(filePath),\n sourceCode,\n ts.ScriptTarget.Latest,\n true,\n isMjsFile ? ts.ScriptKind.JS : undefined,\n )\n\n function visit(node: ts.Node) {\n if (ts.isCallExpression(node) && node.arguments.length > 0) {\n const fnName = getFunctionName(node.expression)\n if (fnName && allExecFunctions.has(fnName)) {\n const firstArg = node.arguments[0]\n if (ts.isStringLiteral(firstArg) || ts.isNoSubstitutionTemplateLiteral(firstArg)) {\n const value = firstArg.text\n if (shellCommandFunctions.has(fnName)) {\n // Shell command string — tokenize to extract the executable and args\n for (const token of tokenizeScript(value)) {\n tokens.add(token)\n }\n } else {\n // Direct exec — first arg is the executable name\n tokens.add(value)\n }\n } else if (ts.isTemplateExpression(firstArg)) {\n // Template literal like `npx typedoc --options ${path}` — extract\n // the static head which usually contains the command name\n const head = firstArg.head.text\n if (head) {\n for (const token of tokenizeScript(head)) {\n tokens.add(token)\n }\n }\n }\n }\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n return tokens\n}\n\n/**\n * Resolves the function name from a call expression, handling both direct\n * calls like `execSync(...)` and qualified calls like `child_process.execSync(...)`.\n */\nfunction getFunctionName(expr: ts.Expression): string | undefined {\n if (ts.isIdentifier(expr)) {\n return expr.text\n }\n if (ts.isPropertyAccessExpression(expr) && ts.isIdentifier(expr.name)) {\n return expr.name.text\n }\n return undefined\n}\n\n/**\n * Scans source files for child_process calls (execSync, spawn, etc.) and\n * resolves referenced packages by matching command tokens against known\n * dependency binary names.\n *\n * This complements getScriptReferencedPackages (which scans package.json\n * scripts) by catching CLI usage in actual source code, e.g.:\n * execSync(`npx typedoc --options ${configPath}`)\n * spawnSync('eslint', ['--fix', '.'])\n */\nexport function getCliReferencedPackagesFromFiles(\n allFiles: string[],\n location: string,\n allDeps: string[],\n): Set<string> {\n // Collect all command tokens from every source file\n const allTokens = new Set<string>()\n for (const file of allFiles) {\n for (const token of getCommandTokensFromFile(file)) {\n allTokens.add(token)\n }\n }\n\n if (allTokens.size === 0) return new Set()\n\n // Build bin-name -> package-name map (same approach as getScriptReferencedPackages)\n const binToPackage = new Map<string, string>()\n for (const dep of allDeps) {\n for (const bin of getBinNames(location, dep)) {\n binToPackage.set(bin, dep)\n }\n }\n\n const referenced = new Set<string>()\n for (const token of allTokens) {\n // Direct package name match\n const baseName = getBasePackageName(token)\n if (allDeps.includes(baseName)) {\n referenced.add(baseName)\n }\n // Binary name match (e.g. token \"typedoc\" -> package \"typedoc\")\n const pkg = binToPackage.get(token)\n if (pkg) {\n referenced.add(pkg)\n }\n }\n\n return referenced\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\nimport { findDepPackageJson } from './getRequiredPeerDependencies.ts'\n\nexport function getBinNames(location: string, dep: string): string[] {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) return []\n try {\n const raw = fs.readFileSync(depPkgPath, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n if (!pkg.bin) return []\n if (typeof pkg.bin === 'string') return [((pkg.name as string | undefined)?.split('/').pop()) ?? dep]\n return Object.keys(pkg.bin as Record<string, unknown>)\n } catch {\n return []\n }\n}\n\nexport function tokenizeScript(script: string): string[] {\n // Split on shell operators and whitespace to get command tokens\n return script\n .split(/[&|;$()\"`\\s]+/)\n .map(t => t.trim())\n .filter(Boolean)\n}\n\n/**\n * Scans package.json scripts for references to installed packages,\n * either by package name or by binary name they provide.\n */\nexport function getScriptReferencedPackages(\n location: string,\n allDeps: string[],\n): Set<string> {\n const pkgPath = path.join(location, 'package.json')\n let scripts: Record<string, string>\n try {\n const raw = fs.readFileSync(pkgPath, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n scripts = (pkg.scripts ?? {}) as Record<string, string>\n } catch {\n return new Set()\n }\n\n const scriptText = Object.values(scripts).join(' ')\n const tokens = new Set(tokenizeScript(scriptText))\n\n // Build a map from bin name -> package name\n const binToPackage = new Map<string, string>()\n for (const dep of allDeps) {\n const bins = getBinNames(location, dep)\n for (const bin of bins) {\n binToPackage.set(bin, dep)\n }\n }\n\n const referenced = new Set<string>()\n for (const token of tokens) {\n // Direct package name match (e.g. \"yarn rimraf\" -> token \"rimraf\")\n const baseName = getBasePackageName(token)\n if (allDeps.includes(baseName)) {\n referenced.add(baseName)\n }\n // Binary name match (e.g. \"tsup\" -> @xylabs/ts-scripts-yarn3 provides \"tsup\"? no, tsup provides \"tsup\")\n const pkg = binToPackage.get(token)\n if (pkg) {\n referenced.add(pkg)\n }\n }\n\n return referenced\n}\n","import fs from 'node:fs'\n\nimport { detectPackageManager } from '../../pm/index.ts'\nimport { findDepPackageJson } from './getRequiredPeerDependencies.ts'\n\nexport interface ImplicitDevDependencyRule {\n isNeeded: (context: ImplicitDepContext) => boolean\n package: string\n}\n\nexport interface FileContext {\n allFiles: string[]\n distFiles: string[]\n}\n\nexport interface ImplicitDepContext extends FileContext {\n allDependencies: string[]\n location: string\n}\n\nconst hasFileWithExtension = (files: string[], extensions: string[]) =>\n files.some(f => extensions.some(ext => f.endsWith(ext)))\n\nconst tsExtensions = ['.ts', '.tsx', '.mts', '.cts']\n\nconst hasTypescriptFiles = ({ allFiles }: ImplicitDepContext) =>\n hasFileWithExtension(allFiles, tsExtensions)\n\n// Matches decorator usage: @something at the start of a line (after optional whitespace).\n// Safe from JSDoc false positives since those appear after * in comment blocks.\nconst decoratorPattern = /^\\s*@[a-zA-Z]\\w*/m\n\nconst hasDecorators = ({ allFiles }: ImplicitDepContext) =>\n allFiles\n .filter(f => tsExtensions.some(ext => f.endsWith(ext)))\n .some((file) => {\n try {\n const content = fs.readFileSync(file, 'utf8')\n return decoratorPattern.test(content)\n } catch {\n return false\n }\n })\n\n/**\n * Checks if any direct dependency declares tslib as a peer dependency.\n * Many compiled TypeScript packages require tslib at runtime even when\n * the consuming package doesn't use decorators itself.\n */\nconst hasDependencyRequiringTslib = ({ location, allDependencies }: ImplicitDepContext) =>\n allDependencies.some((dep) => {\n const pkgPath = findDepPackageJson(location, dep)\n if (!pkgPath) return false\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n const peers = pkg.peerDependencies as Record<string, string> | undefined\n return peers !== undefined && 'tslib' in peers\n } catch {\n return false\n }\n })\n\nconst importPlugins = new Set(['eslint-plugin-import-x', 'eslint-plugin-import'])\n\n/**\n * Checks whether any dependency (direct or transitive) pulls in\n * one of the eslint import plugins that require a resolver.\n */\nfunction hasImportPlugin({ location, allDependencies }: ImplicitDepContext): boolean {\n // Direct dependency on the plugin\n if (allDependencies.some(d => importPlugins.has(d))) return true\n\n // Transitive: a dependency bundles the plugin as a dep or peer\n for (const dep of allDependencies) {\n const pkgPath = findDepPackageJson(location, dep)\n if (!pkgPath) continue\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n const transitiveDeps = [\n ...Object.keys((pkg.dependencies ?? {}) as Record<string, unknown>),\n ...Object.keys((pkg.peerDependencies ?? {}) as Record<string, unknown>),\n ]\n if (transitiveDeps.some(d => importPlugins.has(d))) return true\n } catch {\n // skip unreadable packages\n }\n }\n return false\n}\n\nconst hasVitest = ({ allDependencies }: ImplicitDepContext) =>\n allDependencies.includes('vitest')\n\nconst isYarnRepo = () => detectPackageManager() === 'yarn'\nconst isPnpmRepo = () => detectPackageManager() === 'pnpm'\n\nconst rules: ImplicitDevDependencyRule[] = [\n {\n package: 'typescript',\n isNeeded: hasTypescriptFiles,\n },\n {\n package: 'eslint-import-resolver-typescript',\n isNeeded: context =>\n hasTypescriptFiles(context)\n && context.allDependencies.includes('eslint')\n && hasImportPlugin(context),\n },\n {\n package: 'tslib',\n isNeeded: context => hasDecorators(context) || hasDependencyRequiringTslib(context),\n },\n {\n package: '@vitest/coverage-v8',\n isNeeded: hasVitest,\n },\n {\n package: '@xylabs/ts-scripts-yarn3',\n isNeeded: isYarnRepo,\n },\n {\n package: '@xylabs/ts-scripts-react-yarn3',\n isNeeded: isYarnRepo,\n },\n {\n package: '@xylabs/ts-scripts-pnpm',\n isNeeded: isPnpmRepo,\n },\n {\n package: '@xylabs/ts-scripts-react-pnpm',\n isNeeded: isPnpmRepo,\n },\n]\n\nexport function getImplicitDevDependencies(context: ImplicitDepContext): Set<string> {\n const implicit = new Set<string>()\n for (const rule of rules) {\n if (rule.isNeeded(context)) {\n implicit.add(rule.package)\n }\n }\n return implicit\n}\n","import chalk from 'chalk'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport {\n logFix, readPackageJson, removeDep, writePackageJson,\n} from '../packageJsonEditor.ts'\nimport type { CheckPackageParams, CheckSourceParams } from './checkPackageTypes.ts'\n\nfunction isPeerUsed(dep: string, externalDistImports: string[], externalDistTypeImports: string[]): boolean {\n const baseName = dep.replace(/^@types\\//, '')\n return externalDistImports.includes(dep)\n || externalDistImports.includes(baseName)\n || externalDistTypeImports.includes(dep)\n || externalDistTypeImports.includes(baseName)\n}\n\nexport function findUnusedPeerDeps(\n peerDependencies: string[],\n externalDistImports: string[],\n externalDistTypeImports: string[],\n exclude?: Set<string>,\n): string[] {\n const unused: string[] = []\n for (const dep of peerDependencies) {\n if (exclude?.has(dep)) continue\n if (!isPeerUsed(dep, externalDistImports, externalDistTypeImports)) {\n unused.push(dep)\n }\n }\n return unused\n}\n\nexport function getUnusedPeerDependencies(\n { name, location }: Workspace,\n { peerDependencies, dependencies }: CheckPackageParams,\n { externalDistImports, externalDistTypeImports }: CheckSourceParams,\n exclude?: Set<string>,\n) {\n const unused = findUnusedPeerDeps(peerDependencies, externalDistImports, externalDistTypeImports, exclude)\n\n for (const dep of unused) {\n if (dependencies.includes(dep)) {\n console.log(`[${chalk.blue(name)}] Unused peerDependency [already a dependency] in package.json: ${chalk.red(dep)}`)\n } else {\n console.log(`[${chalk.blue(name)}] Unused peerDependency 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 fixUnusedPeerDependencies(\n workspace: Workspace,\n { peerDependencies }: CheckPackageParams,\n { externalDistImports, externalDistTypeImports }: CheckSourceParams,\n exclude?: Set<string>,\n) {\n const unused = findUnusedPeerDeps(peerDependencies, externalDistImports, externalDistTypeImports, exclude)\n if (unused.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n\n for (const dep of unused) {\n removeDep(pkg, dep, 'peerDependencies')\n logFix(workspace, 'removed from peerDependencies', dep)\n }\n\n writePackageJson(workspace.location, pkg)\n return unused.length\n}\n","import chalk from 'chalk'\nimport semver from 'semver'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport {\n addDep, logFix, readPackageJson, resolveDepVersion, writePackageJson,\n} from '../packageJsonEditor.ts'\nimport type { CheckPackageParams } from './checkPackageTypes.ts'\n\ntype DepSection = 'dependencies' | 'devDependencies' | 'peerDependencies'\n\nexport interface VersionProblem {\n dep: string\n section: DepSection\n version: string\n}\n\nexport interface PeerVersionIncompatibility {\n actualVersion: string\n declaredRange: string\n dep: string\n}\n\nfunction checkSection(\n deps: string[],\n versions: Record<string, string>,\n section: DepSection,\n workspaceNames: Set<string>,\n problems: VersionProblem[],\n): void {\n for (const dep of deps) {\n if (!workspaceNames.has(dep)) continue\n const version = versions[dep]\n if (version && !version.startsWith('workspace:')) {\n problems.push({\n dep, section, version,\n })\n }\n }\n}\n\nexport function findWorkspaceVersionProblems(\n packageParams: CheckPackageParams,\n workspaceNames: Set<string>,\n): VersionProblem[] {\n const problems: VersionProblem[] = []\n\n checkSection(packageParams.dependencies, packageParams.dependencyVersions, 'dependencies', workspaceNames, problems)\n checkSection(packageParams.devDependencies, packageParams.devDependencyVersions, 'devDependencies', workspaceNames, problems)\n\n return problems\n}\n\nexport function findWorkspacePeerVersionProblems(\n packageParams: CheckPackageParams,\n workspaceNames: Set<string>,\n location: string,\n): PeerVersionIncompatibility[] {\n const problems: PeerVersionIncompatibility[] = []\n\n for (const dep of packageParams.peerDependencies) {\n if (!workspaceNames.has(dep)) continue\n const declaredRange = packageParams.peerDependencyVersions[dep]\n if (!declaredRange || declaredRange.startsWith('workspace:')) continue\n\n const resolved = resolveDepVersion(location, dep)\n // resolveDepVersion returns ~X.Y.Z or *, extract the raw version\n const actualVersion = resolved.startsWith('~') ? resolved.slice(1) : resolved\n if (actualVersion === '*') continue\n\n if (!semver.satisfies(actualVersion, declaredRange)) {\n problems.push({\n actualVersion, declaredRange, dep,\n })\n }\n }\n\n return problems\n}\n\nexport function getWorkspaceVersionProblems(\n { name, location }: Workspace,\n packageParams: CheckPackageParams,\n workspaceNames: Set<string>,\n): number {\n const problems = findWorkspaceVersionProblems(packageParams, workspaceNames)\n\n for (const {\n dep, section, version,\n } of problems) {\n console.log(\n `[${chalk.blue(name)}] Workspace dependency ${chalk.red(dep)} in ${chalk.cyan(section)}`\n + ` should use workspace: protocol — found ${chalk.yellow(version)}`,\n )\n }\n if (problems.length > 0) {\n console.log(` ${chalk.yellow(`${location}/package.json`)}\\n`)\n }\n return problems.length\n}\n\nexport function fixWorkspaceVersionProblems(\n workspace: Workspace,\n packageParams: CheckPackageParams,\n workspaceNames: Set<string>,\n): number {\n const problems = findWorkspaceVersionProblems(packageParams, workspaceNames)\n if (problems.length === 0) return 0\n\n const pkg = readPackageJson(workspace.location)\n\n for (const { dep, section } of problems) {\n addDep(pkg, dep, 'workspace:~', section)\n logFix(workspace, `set workspace:~ for ${section}`, dep)\n }\n\n writePackageJson(workspace.location, pkg)\n return problems.length\n}\n","import type { UnsatisfiedPeer } from './checkPackage/index.ts'\nimport {\n findMismatchedPeerDevVersions,\n findRedundantPeerDeps,\n findUnlistedDependencies,\n findUnlistedDevDeps,\n findUnrequestedPeerDeps,\n findUnsatisfiedPeers,\n findUnusedDependencies,\n findUnusedDevDeps,\n findUnusedPeerDeps,\n findWorkspacePeerVersionProblems,\n findWorkspaceVersionProblems,\n resolvePeerTargetSections,\n shouldBePeerDependency,\n} from './checkPackage/index.ts'\nimport { resolveDepVersion, resolveExpectedPeerVersion } from './packageJsonEditor.ts'\nimport type {\n DeplintDiagnostic, DeplintFix, DeplintRule, DeplintSection, DeplintWorkspaceContext,\n} from './types.ts'\n\nfunction diagnostic(\n context: DeplintWorkspaceContext,\n id: string,\n message: string,\n dependency?: string,\n evidence?: string[],\n fixes?: DeplintFix[],\n): DeplintDiagnostic {\n return {\n dependency,\n evidence,\n file: context.packageJsonPath,\n fixes,\n id,\n message,\n severity: 'error',\n workspace: context.workspace,\n }\n}\n\nfunction resolvedAddFix(\n context: DeplintWorkspaceContext,\n dependency: string,\n section: DeplintSection,\n detail: string,\n): DeplintFix {\n return {\n action: 'add',\n dependency,\n detail,\n section,\n version: resolveDepVersion(context.workspace.location, dependency),\n }\n}\n\nconst unlistedDependenciesRule: DeplintRule = {\n category: 'dependencies',\n id: 'deplint.dependencies.unlisted',\n evaluate(context) {\n const findings = findUnlistedDependencies(\n context.workspace.name,\n context.packageParams.dependencies,\n context.packageParams.devDependencies,\n context.packageParams.peerDependencies,\n context.sourceParams.externalDistImports,\n context.sourceParams.externalDistTypeImports,\n )\n\n return findings.map(({ imp, section }) => {\n // For library packages, check if this import shares peers with the\n // package's existing peerDependencies (e.g. react-dom peers on react).\n // If so, it should be a peerDependency + devDependency, not a dependency.\n const isPeer = !context.isTerminalPackage\n && section === 'dependencies'\n && !context.forceDeps.has(imp)\n && shouldBePeerDependency(imp, context.workspace.location, context.packageParams.peerDependencies, context.sourceParams.externalDistImports)\n\n const fixes = isPeer\n ? (['peerDependencies', 'devDependencies'] as DeplintSection[]).map(\n s => resolvedAddFix(context, imp, s, `added to ${s}`),\n )\n : [resolvedAddFix(context, imp, section, `added to ${section}`)]\n\n return diagnostic(\n context,\n 'deplint.dependencies.unlisted',\n `Missing dependency in package.json: ${imp}`,\n imp,\n context.sourceParams.distImportPaths[imp],\n fixes,\n )\n })\n },\n}\n\nconst unusedDependenciesRule: DeplintRule = {\n category: 'dependencies',\n id: 'deplint.dependencies.unused',\n evaluate(context) {\n const findings = findUnusedDependencies(\n context.workspace.location,\n context.packageParams.dependencies,\n context.packageParams.devDependencies,\n context.sourceParams.externalDistImports,\n context.sourceParams.externalDistTypeImports,\n context.sourceParams.externalAllImports,\n context.unusedDependencyExclude,\n )\n\n return findings.map(({\n dep, kind, reason,\n }) => diagnostic(\n context,\n 'deplint.dependencies.unused',\n kind === 'move-to-dev'\n ? `dependency should be devDependency in package.json: ${dep}${reason ? ` (${reason})` : ''}`\n : `Unused dependency in package.json: ${dep}`,\n dep,\n undefined,\n [kind === 'move-to-dev'\n ? {\n action: 'move',\n dependency: dep,\n detail: 'moved to devDependencies',\n fromSection: 'dependencies',\n toSection: 'devDependencies',\n }\n : {\n action: 'remove',\n dependency: dep,\n detail: 'removed from dependencies',\n section: 'dependencies',\n }],\n ))\n },\n}\n\nconst unlistedDevDependenciesRule: DeplintRule = {\n category: 'devDependencies',\n id: 'deplint.devDependencies.unlisted',\n evaluate(context) {\n const findings = findUnlistedDevDeps(\n context.workspace.name,\n context.packageParams.dependencies,\n context.packageParams.devDependencies,\n context.packageParams.peerDependencies,\n context.sourceParams.externalAllImports,\n context.sourceParams.distImports,\n context.sourceParams.externalDistTypeImports,\n )\n\n return findings.map(imp => diagnostic(\n context,\n 'deplint.devDependencies.unlisted',\n `Missing devDependency in package.json: ${imp}`,\n imp,\n context.sourceParams.allImportPaths[imp],\n [resolvedAddFix(context, imp, 'devDependencies', 'added to devDependencies')],\n ))\n },\n}\n\nconst unusedDevDependenciesRule: DeplintRule = {\n category: 'devDependencies',\n id: 'deplint.devDependencies.unused',\n evaluate(context) {\n const findings = findUnusedDevDeps(\n context.workspace.location,\n context.packageParams.dependencies,\n context.packageParams.devDependencies,\n context.packageParams.peerDependencies,\n context.sourceParams,\n context.fileContext,\n context.unusedDependencyExclude,\n )\n\n return findings.map(dep => diagnostic(\n context,\n 'deplint.devDependencies.unused',\n `Unused devDependency in package.json: ${dep}`,\n dep,\n undefined,\n [{\n action: 'remove', dependency: dep, detail: 'removed from devDependencies', section: 'devDependencies',\n }],\n ))\n },\n}\n\nconst redundantDevDependenciesRule: DeplintRule = {\n category: 'devDependencies',\n id: 'deplint.devDependencies.redundant',\n evaluate(context) {\n const diagnostics: DeplintDiagnostic[] = []\n\n for (const dep of context.packageParams.devDependencies) {\n if (!context.packageParams.dependencies.includes(dep)) continue\n // Skip if this dep will be moved to peerDependencies (the devDep is needed as the peer's companion)\n if (!context.isTerminalPackage\n && !context.forceDeps.has(dep)\n && shouldBePeerDependency(dep, context.workspace.location, context.packageParams.peerDependencies, context.sourceParams.externalDistImports)) {\n continue\n }\n diagnostics.push(diagnostic(\n context,\n 'deplint.devDependencies.redundant',\n `Redundant devDependency ${dep} — already listed in dependencies`,\n dep,\n undefined,\n [{\n action: 'remove', dependency: dep, detail: 'removed redundant devDependency (kept in dependencies)', section: 'devDependencies',\n }],\n ))\n }\n\n return diagnostics\n },\n}\n\nfunction generateVersionMismatchFixes(\n context: DeplintWorkspaceContext,\n finding: UnsatisfiedPeer,\n): DeplintFix[] {\n const expectedVersion = resolveExpectedPeerVersion(\n context.workspace.location,\n finding.peer,\n finding.versionRange,\n )\n if (expectedVersion === '*') return []\n\n const fixes: DeplintFix[] = []\n\n // Fix peerDependencies if the package declares this peer\n if (context.packageParams.peerDependencies.includes(finding.peer)) {\n fixes.push({\n action: 'set-version',\n dependency: finding.peer,\n detail: `updated peerDependency version to match installed (${finding.installedVersion})`,\n section: 'peerDependencies',\n version: expectedVersion,\n })\n }\n\n // Fix devDependencies if it also has a mismatched version\n if (context.packageParams.devDependencies.includes(finding.peer)) {\n const devVersion = context.packageParams.devDependencyVersions[finding.peer]\n // Only fix non-workspace devDep versions\n if (devVersion && !devVersion.startsWith('workspace:')) {\n fixes.push({\n action: 'set-version',\n dependency: finding.peer,\n detail: `updated devDependency version to match installed (${finding.installedVersion})`,\n section: 'devDependencies',\n version: expectedVersion,\n })\n }\n }\n\n return fixes\n}\n\nconst unsatisfiedPeersRule: DeplintRule = {\n category: 'peerDependencies',\n id: 'deplint.peerDependencies.unsatisfied',\n evaluate(context) {\n const findings = findUnsatisfiedPeers(context.workspace, context.packageParams, context.exclude)\n\n return findings.map((finding) => {\n const requiredBy = finding.sources.map(source => source.requiredBy).join(', ')\n const chain = finding.sources.find(source => source.chain && source.chain.length > 0)?.chain?.join(' -> ')\n const evidence = chain ? [`via ${chain}`] : undefined\n const message = finding.reason === 'version-mismatch'\n ? `Peer dependency version mismatch ${finding.peer} — installed ${finding.installedVersion ?? 'unknown'} does not satisfy ${finding.versionRange} (required by ${requiredBy})`\n : finding.hasRuntimeSource\n ? `Unsatisfied peer dependency ${finding.peer} (required by ${requiredBy}) — must be in dependencies or peerDependencies`\n : `Unsatisfied peer dependency ${finding.peer} (required by devDependency ${requiredBy}) — must be in dependencies, devDependencies, or peerDependencies`\n\n const fixes = finding.reason === 'missing'\n ? resolvePeerTargetSections(finding.hasRuntimeSource, context.isTerminalPackage).map((section): DeplintFix => ({\n action: 'add',\n dependency: finding.peer,\n detail: `added to ${section}`,\n section: section as DeplintSection,\n version: finding.versionRange,\n }))\n : finding.reason === 'version-mismatch'\n ? generateVersionMismatchFixes(context, finding)\n : undefined\n\n return diagnostic(\n context,\n 'deplint.peerDependencies.unsatisfied',\n message,\n finding.peer,\n evidence,\n fixes,\n )\n })\n },\n}\n\nconst unusedPeerDependenciesRule: DeplintRule = {\n category: 'peerDependencies',\n id: 'deplint.peerDependencies.unused',\n evaluate(context) {\n const findings = findUnusedPeerDeps(\n context.packageParams.peerDependencies,\n context.sourceParams.externalDistImports,\n context.sourceParams.externalDistTypeImports,\n context.unusedDependencyExclude,\n )\n\n return findings.map(dep => diagnostic(\n context,\n 'deplint.peerDependencies.unused',\n context.packageParams.dependencies.includes(dep)\n ? `Unused peerDependency [already a dependency] in package.json: ${dep}`\n : `Unused peerDependency in package.json: ${dep}`,\n dep,\n undefined,\n [{\n action: 'remove', dependency: dep, detail: 'removed from peerDependencies', section: 'peerDependencies',\n }],\n ))\n },\n}\n\nconst unrequestedPeerDependenciesRule: DeplintRule = {\n category: 'peerDependencies',\n id: 'deplint.peerDependencies.unrequested',\n evaluate(context) {\n if (!context.isTerminalPackage) return []\n\n const findings = findUnrequestedPeerDeps(\n context.workspace.location,\n context.packageParams,\n context.sourceParams,\n context.exclude,\n )\n\n return findings.map(dep => diagnostic(\n context,\n 'deplint.peerDependencies.unrequested',\n `Unnecessary peerDependency ${dep} — imported in dist but no dependency requires it as a peer; should be a dependency`,\n dep,\n undefined,\n [{\n action: 'move',\n dependency: dep,\n detail: 'moved from peerDependencies to dependencies',\n fromSection: 'peerDependencies',\n toSection: 'dependencies',\n version: context.packageParams.peerDependencyVersions[dep] ?? '*',\n }],\n ))\n },\n}\n\nconst misplacedDependenciesRule: DeplintRule = {\n category: 'dependencies',\n id: 'deplint.dependencies.misplaced',\n evaluate(context) {\n // Only applies to library packages — terminal packages keep deps in dependencies\n if (context.isTerminalPackage) return []\n\n const diagnostics: DeplintDiagnostic[] = []\n\n for (const dep of context.packageParams.dependencies) {\n // Skip packages explicitly configured as dependencies via deplint.deps\n if (context.forceDeps.has(dep)) continue\n // Check if this dependency is configured as refType 'peer', or if it shares peers\n // with the package's existing peerDependencies (e.g. react-dom peers on react)\n if (context.forcePeers.has(dep)\n || shouldBePeerDependency(dep, context.workspace.location, context.packageParams.peerDependencies, context.sourceParams.externalDistImports)) {\n const fixes: DeplintFix[] = [{\n action: 'move',\n dependency: dep,\n detail: 'moved from dependencies to peerDependencies',\n fromSection: 'dependencies',\n toSection: 'peerDependencies',\n }]\n // Also ensure it's in devDependencies if not already\n if (!context.packageParams.devDependencies.includes(dep)) {\n fixes.push(resolvedAddFix(context, dep, 'devDependencies', 'added to devDependencies'))\n }\n\n const reason = context.forcePeers.has(dep)\n ? 'configured as refType \"peer\"'\n : 'it shares peers with existing peerDependencies'\n diagnostics.push(diagnostic(\n context,\n 'deplint.dependencies.misplaced',\n `dependency ${dep} should be a peerDependency — ${reason}`,\n dep,\n undefined,\n fixes,\n ))\n }\n }\n\n return diagnostics\n },\n}\n\nconst misplacedPeerDependenciesRule: DeplintRule = {\n category: 'peerDependencies',\n id: 'deplint.peerDependencies.misplaced',\n evaluate(context) {\n const diagnostics: DeplintDiagnostic[] = []\n\n for (const dep of context.packageParams.peerDependencies) {\n if (context.forceDeps.has(dep)) {\n const fixes: DeplintFix[] = [{\n action: 'move',\n dependency: dep,\n detail: 'moved from peerDependencies to dependencies',\n fromSection: 'peerDependencies',\n toSection: 'dependencies',\n version: context.packageParams.peerDependencyVersions[dep] ?? '*',\n }]\n\n diagnostics.push(diagnostic(\n context,\n 'deplint.peerDependencies.misplaced',\n `peerDependency ${dep} should be a dependency — configured as refType \"dep\"`,\n dep,\n undefined,\n fixes,\n ))\n }\n }\n\n return diagnostics\n },\n}\n\nconst redundantPeerDependenciesRule: DeplintRule = {\n category: 'peerDependencies',\n id: 'deplint.peerDependencies.redundant',\n evaluate(context) {\n const findings = findRedundantPeerDeps(context.packageParams, context.exclude)\n\n return findings.map(dep => diagnostic(\n context,\n 'deplint.peerDependencies.redundant',\n `Redundant peerDependency ${dep} — already listed in dependencies`,\n dep,\n undefined,\n [{\n action: 'remove', dependency: dep, detail: 'removed redundant peerDependency (kept in dependencies)', section: 'peerDependencies',\n }],\n ))\n },\n}\n\nconst mismatchedPeerDevVersionsRule: DeplintRule = {\n category: 'peerDependencies',\n id: 'deplint.peerDependencies.version-mismatch',\n evaluate(context) {\n const findings = findMismatchedPeerDevVersions(context.packageParams, context.exclude)\n\n return findings.map(({\n dep, devVersion, peerVersion,\n }) => diagnostic(\n context,\n 'deplint.peerDependencies.version-mismatch',\n `Peer/dev version mismatch ${dep} — peer: ${peerVersion}, dev: ${devVersion}`,\n dep,\n undefined,\n [{\n action: 'set-version', dependency: dep, detail: 'synced peerDependency to devDependency version', section: 'peerDependencies', version: devVersion,\n }],\n ))\n },\n}\n\nconst workspaceVersionProblemsRule: DeplintRule = {\n category: 'peerDependencies',\n id: 'deplint.workspace.protocol',\n evaluate(context) {\n if (!context.workspaceNames) return []\n\n const protocolFindings = findWorkspaceVersionProblems(context.packageParams, context.workspaceNames)\n const protocolDiagnostics = protocolFindings.map(({\n dep, section, version,\n }) => diagnostic(\n context,\n 'deplint.workspace.protocol',\n `Workspace dependency ${dep} in ${section} should use workspace: protocol — found ${version}`,\n dep,\n undefined,\n [{\n action: 'set-version', dependency: dep, detail: `set workspace:~ for ${section}`, section, version: 'workspace:~',\n }],\n ))\n\n const peerFindings = findWorkspacePeerVersionProblems(\n context.packageParams,\n context.workspaceNames,\n context.workspace.location,\n )\n const peerDiagnostics = peerFindings.map(({\n dep, actualVersion, declaredRange,\n }) => {\n const expectedRange = resolveExpectedPeerVersion(\n context.workspace.location,\n dep,\n declaredRange,\n )\n return diagnostic(\n context,\n 'deplint.workspace.protocol',\n `Workspace peerDependency ${dep} range ${declaredRange} does not satisfy workspace version ${actualVersion}`,\n dep,\n undefined,\n expectedRange === '*'\n ? undefined\n : [{\n action: 'set-version', dependency: dep, detail: 'updated peerDependency to match workspace version', section: 'peerDependencies', version: expectedRange,\n }],\n )\n })\n\n return [...protocolDiagnostics, ...peerDiagnostics]\n },\n}\n\nexport const deplintRules: DeplintRule[] = [\n unlistedDependenciesRule,\n unusedDependenciesRule,\n misplacedDependenciesRule,\n unlistedDevDependenciesRule,\n unusedDevDependenciesRule,\n redundantDevDependenciesRule,\n unsatisfiedPeersRule,\n unusedPeerDependenciesRule,\n unrequestedPeerDependenciesRule,\n misplacedPeerDependenciesRule,\n redundantPeerDependenciesRule,\n mismatchedPeerDevVersionsRule,\n workspaceVersionProblemsRule,\n]\n","import fs from 'node:fs'\n\nimport type { Workspace } from '../../pm/index.ts'\nimport { getRequiredTransitivePeers } from './checkPackage/index.ts'\nimport { findFiles } from './findFiles.ts'\nimport { getDependenciesFromPackageJson } from './getDependenciesFromPackageJson.ts'\nimport { getExtendsFromTsconfigs, getTypesFromTsconfigs } from './getExtendsFromTsconfigs.ts'\nimport { getExternalImportsFromFiles } from './getExternalImportsFromFiles.ts'\nimport type { DeplintWorkspaceContext } from './types.ts'\n\nfunction isTerminalPackage(location: string): boolean {\n try {\n const pkg = JSON.parse(fs.readFileSync(`${location}/package.json`, 'utf8')) as Record<string, unknown>\n return pkg.private === true\n } catch {\n return false\n }\n}\n\nexport function buildWorkspaceContext(\n workspace: Workspace,\n exclude?: Set<string>,\n workspaceNames?: Set<string>,\n forceDeps?: Set<string>,\n forcePeers?: Set<string>,\n): DeplintWorkspaceContext {\n const { allFiles, distFiles } = findFiles(workspace.location)\n const tsconfigExtends = getExtendsFromTsconfigs(workspace.location)\n const tsconfigTypes = getTypesFromTsconfigs(workspace.location)\n const sourceParams = getExternalImportsFromFiles({\n allFiles, distFiles, location: workspace.location, tsconfigExtends, tsconfigTypes,\n })\n const packageJsonPath = `${workspace.location}/package.json`\n const packageParams = getDependenciesFromPackageJson(packageJsonPath)\n const requiredTransitivePeers = getRequiredTransitivePeers(workspace.location, packageParams)\n\n return {\n exclude,\n fileContext: { allFiles, distFiles },\n forceDeps: forceDeps ?? new Set(),\n forcePeers: forcePeers ?? new Set(),\n isTerminalPackage: isTerminalPackage(workspace.location),\n packageJsonPath,\n packageParams,\n sourceParams,\n unusedDependencyExclude: new Set([...(exclude ?? []), ...requiredTransitivePeers]),\n workspace,\n workspaceNames,\n }\n}\n","import { loadWorkspaceCommandConfig } from '../../lib/index.ts'\nimport type { Workspace } from '../../pm/index.ts'\nimport type { DeplintConfig } from '../package/index.ts'\nimport { applyDeplintFixes } from './fixer.ts'\nimport { deplintRules } from './rules.ts'\nimport { buildWorkspaceContext } from './snapshot.ts'\nimport type {\n DeplintDiagnostic, DeplintRunOptions, DeplintRunResult,\n} from './types.ts'\n\nfunction resolveCheckFlags(deps = false, devDeps = false, peerDeps = false) {\n const noneExplicit = !(deps || devDeps || peerDeps)\n return {\n checkDependencies: deps || noneExplicit,\n checkDevDependencies: devDeps || noneExplicit,\n checkPeerDependencies: peerDeps || noneExplicit,\n }\n}\n\nfunction shouldRunRule(\n category: 'dependencies' | 'devDependencies' | 'peerDependencies',\n ruleId: string,\n options: DeplintRunOptions,\n): boolean {\n const flags = resolveCheckFlags(options.deps, options.devDeps, options.peerDeps)\n if (ruleId === 'deplint.peerDependencies.unsatisfied') {\n return flags.checkDependencies || flags.checkDevDependencies || flags.checkPeerDependencies\n }\n if (ruleId === 'deplint.workspace.protocol') {\n return flags.checkDependencies || flags.checkDevDependencies || flags.checkPeerDependencies\n }\n if (category === 'dependencies') return flags.checkDependencies\n if (category === 'devDependencies') return flags.checkDevDependencies\n return flags.checkPeerDependencies\n}\n\nasync function evaluateWorkspaces(\n workspaces: Workspace[],\n options: DeplintRunOptions,\n workspaceNames?: Set<string>,\n): Promise<DeplintDiagnostic[]> {\n const diagnostics: DeplintDiagnostic[] = []\n\n for (const workspace of workspaces) {\n // Load per-workspace deplint config (root merged with package-level)\n const wsConfig = await loadWorkspaceCommandConfig<DeplintConfig>(workspace.location, 'deplint')\n\n // Build exclude set: config + CLI overrides\n const exclude = new Set([\n ...(wsConfig.exclude ?? []),\n ...(options.cliExclude ?? []),\n ])\n\n // Build forceDeps/forcePeers from packages map\n const packageEntries = Object.entries(wsConfig.packages ?? {})\n const forceDeps = new Set(\n packageEntries.filter(([, cfg]) => cfg.refType === 'dep').map(([name]) => name),\n )\n const forcePeers = new Set(\n packageEntries.filter(([, cfg]) => cfg.refType === 'peer').map(([name]) => name),\n )\n\n const context = buildWorkspaceContext(workspace, exclude, workspaceNames, forceDeps, forcePeers)\n if (options.verbose) {\n console.info(`Checking package: ${workspace.name} at ${workspace.location}`)\n console.info(`All files: ${context.fileContext.allFiles.length}, Distribution files: ${context.fileContext.distFiles.length}`)\n }\n\n for (const rule of deplintRules) {\n if (shouldRunRule(rule.category, rule.id, options)) {\n diagnostics.push(...rule.evaluate(context))\n }\n }\n }\n\n return diagnostics\n}\n\nexport async function runDeplint(\n workspaces: Workspace[],\n options: DeplintRunOptions,\n workspaceNames?: Set<string>,\n): Promise<DeplintRunResult> {\n let diagnostics = await evaluateWorkspaces(workspaces, options, workspaceNames)\n const appliedFixes = [] as DeplintRunResult['appliedFixes']\n\n // Fix loop: fixes can cascade (e.g. moving a dep to peer may make a devDep redundant),\n // so re-evaluate and fix until stable or a safety cap is reached.\n const MAX_FIX_PASSES = 5\n for (let pass = 0; options.fix && diagnostics.length > 0 && pass < MAX_FIX_PASSES; pass++) {\n appliedFixes.push(...applyDeplintFixes(diagnostics))\n diagnostics = await evaluateWorkspaces(workspaces, options, workspaceNames)\n }\n\n const errorCount = diagnostics.filter(diagnostic => diagnostic.severity === 'error').length\n const warningCount = diagnostics.filter(diagnostic => diagnostic.severity === 'warning').length\n\n return {\n appliedFixes,\n diagnostics,\n summary: {\n appliedFixes: appliedFixes.length,\n errorCount,\n warningCount,\n workspacesChecked: workspaces.length,\n },\n }\n}\n"],"mappings":"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","names":["fs","chalk","fs","diagnostic","fs","fs","fs","path","fs","globSync","fs","globSync","fs","fs","path","fs","path","isDeclarationFile","fs","path","chalk","fs","chalk","fs","builtinModules","chalk","builtinModules","fs","chalk","fs","chalk","semver","sortPackageJson","fs","semver","versionRange","chalk","chalk","fs","path","ts","fs","path","fs","path","fs","ts","path","fs","fs","chalk","chalk","semver","semver","fs","fs","diagnostic"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// src/actions/deplint/findFiles.ts
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
|
|
4
|
+
// src/actions/deplint/findFilesByGlob.ts
|
|
5
|
+
import { globSync } from "glob";
|
|
6
|
+
function findFilesByGlob(cwd, pattern, ignore) {
|
|
7
|
+
return globSync(pattern, {
|
|
8
|
+
cwd,
|
|
9
|
+
absolute: true,
|
|
10
|
+
ignore,
|
|
11
|
+
nodir: true
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// src/actions/deplint/findFiles.ts
|
|
16
|
+
var codeExtensions = "*.{ts,tsx,mts,cts,js,mjs,cjs}";
|
|
17
|
+
function getWorkspaceIgnores(location) {
|
|
18
|
+
try {
|
|
19
|
+
const raw = fs.readFileSync(`${location}/package.json`, "utf8");
|
|
20
|
+
const pkg = JSON.parse(raw);
|
|
21
|
+
return pkg.workspaces ?? [];
|
|
22
|
+
} catch {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function findFiles(location) {
|
|
27
|
+
const workspaceIgnores = getWorkspaceIgnores(location).map((w) => `${w}/**`);
|
|
28
|
+
const ignore = ["**/node_modules/**", "dist/**", ...workspaceIgnores];
|
|
29
|
+
const allFiles = findFilesByGlob(location, `./**/${codeExtensions}`, ignore);
|
|
30
|
+
const distFiles = [
|
|
31
|
+
...findFilesByGlob(location, "./dist/**/*.d.ts"),
|
|
32
|
+
...findFilesByGlob(location, `./dist/**/${codeExtensions}`)
|
|
33
|
+
];
|
|
34
|
+
return { allFiles, distFiles };
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
findFiles
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=findFiles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/deplint/findFiles.ts","../../../src/actions/deplint/findFilesByGlob.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { findFilesByGlob } from './findFilesByGlob.ts'\n\nconst codeExtensions = '*.{ts,tsx,mts,cts,js,mjs,cjs}'\n\nfunction getWorkspaceIgnores(location: string): string[] {\n try {\n const raw = fs.readFileSync(`${location}/package.json`, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n return (pkg.workspaces ?? []) as string[]\n } catch {\n return []\n }\n}\n\nexport function findFiles(location: string) {\n const workspaceIgnores = getWorkspaceIgnores(location).map(w => `${w}/**`)\n const ignore = ['**/node_modules/**', 'dist/**', ...workspaceIgnores]\n const allFiles = findFilesByGlob(location, `./**/${codeExtensions}`, ignore)\n const distFiles = [\n ...findFilesByGlob(location, './dist/**/*.d.ts'),\n ...findFilesByGlob(location, `./dist/**/${codeExtensions}`),\n ]\n\n return { allFiles, distFiles }\n}\n","import { globSync } from 'glob'\n\nexport function findFilesByGlob(cwd: string, pattern: string, ignore?: string[]) {\n return globSync(pattern, {\n cwd, absolute: true, ignore, nodir: true,\n })\n}\n"],"mappings":";AAAA,OAAO,QAAQ;;;ACAf,SAAS,gBAAgB;AAElB,SAAS,gBAAgB,KAAa,SAAiB,QAAmB;AAC/E,SAAO,SAAS,SAAS;AAAA,IACvB;AAAA,IAAK,UAAU;AAAA,IAAM;AAAA,IAAQ,OAAO;AAAA,EACtC,CAAC;AACH;;;ADFA,IAAM,iBAAiB;AAEvB,SAAS,oBAAoB,UAA4B;AACvD,MAAI;AACF,UAAM,MAAM,GAAG,aAAa,GAAG,QAAQ,iBAAiB,MAAM;AAC9D,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,WAAQ,IAAI,cAAc,CAAC;AAAA,EAC7B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,UAAU,UAAkB;AAC1C,QAAM,mBAAmB,oBAAoB,QAAQ,EAAE,IAAI,OAAK,GAAG,CAAC,KAAK;AACzE,QAAM,SAAS,CAAC,sBAAsB,WAAW,GAAG,gBAAgB;AACpE,QAAM,WAAW,gBAAgB,UAAU,QAAQ,cAAc,IAAI,MAAM;AAC3E,QAAM,YAAY;AAAA,IAChB,GAAG,gBAAgB,UAAU,kBAAkB;AAAA,IAC/C,GAAG,gBAAgB,UAAU,aAAa,cAAc,EAAE;AAAA,EAC5D;AAEA,SAAO,EAAE,UAAU,UAAU;AAC/B;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/actions/deplint/findFilesByGlob.ts
|
|
2
|
+
import { globSync } from "glob";
|
|
3
|
+
function findFilesByGlob(cwd, pattern, ignore) {
|
|
4
|
+
return globSync(pattern, {
|
|
5
|
+
cwd,
|
|
6
|
+
absolute: true,
|
|
7
|
+
ignore,
|
|
8
|
+
nodir: true
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
findFilesByGlob
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=findFilesByGlob.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/deplint/findFilesByGlob.ts"],"sourcesContent":["import { globSync } from 'glob'\n\nexport function findFilesByGlob(cwd: string, pattern: string, ignore?: string[]) {\n return globSync(pattern, {\n cwd, absolute: true, ignore, nodir: true,\n })\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAElB,SAAS,gBAAgB,KAAa,SAAiB,QAAmB;AAC/E,SAAO,SAAS,SAAS;AAAA,IACvB;AAAA,IAAK,UAAU;AAAA,IAAM;AAAA,IAAQ,OAAO;AAAA,EACtC,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// src/actions/deplint/packageJsonEditor.ts
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import sortPackageJson from "sort-package-json";
|
|
5
|
+
function readPackageJson(location) {
|
|
6
|
+
return JSON.parse(fs.readFileSync(`${location}/package.json`, "utf8"));
|
|
7
|
+
}
|
|
8
|
+
function writePackageJson(location, pkg) {
|
|
9
|
+
const sorted = sortPackageJson(JSON.stringify(pkg, null, 2));
|
|
10
|
+
fs.writeFileSync(`${location}/package.json`, `${sorted}
|
|
11
|
+
`);
|
|
12
|
+
}
|
|
13
|
+
function moveDep(pkg, dep, from, to) {
|
|
14
|
+
const fromSection = pkg[from];
|
|
15
|
+
if (!fromSection?.[dep]) return;
|
|
16
|
+
const version = fromSection[dep];
|
|
17
|
+
delete fromSection[dep];
|
|
18
|
+
if (Object.keys(fromSection).length === 0) {
|
|
19
|
+
delete pkg[from];
|
|
20
|
+
}
|
|
21
|
+
const toSection = pkg[to] ?? {};
|
|
22
|
+
toSection[dep] = version;
|
|
23
|
+
pkg[to] = toSection;
|
|
24
|
+
}
|
|
25
|
+
function removeDep(pkg, dep, section) {
|
|
26
|
+
const sectionObj = pkg[section];
|
|
27
|
+
if (!sectionObj?.[dep]) return;
|
|
28
|
+
delete sectionObj[dep];
|
|
29
|
+
if (Object.keys(sectionObj).length === 0) {
|
|
30
|
+
delete pkg[section];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function addDep(pkg, dep, version, section) {
|
|
34
|
+
const sectionObj = pkg[section] ?? {};
|
|
35
|
+
sectionObj[dep] = version;
|
|
36
|
+
pkg[section] = sectionObj;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// src/actions/deplint/packageEditor.ts
|
|
40
|
+
var DeplintPackageEditor = class {
|
|
41
|
+
constructor(workspace) {
|
|
42
|
+
this.workspace = workspace;
|
|
43
|
+
this.pkg = readPackageJson(workspace.location);
|
|
44
|
+
}
|
|
45
|
+
workspace;
|
|
46
|
+
pkg;
|
|
47
|
+
applyFix(fix) {
|
|
48
|
+
switch (fix.action) {
|
|
49
|
+
case "add": {
|
|
50
|
+
addDep(this.pkg, fix.dependency, fix.version, fix.section);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case "move": {
|
|
54
|
+
moveDep(this.pkg, fix.dependency, fix.fromSection, fix.toSection);
|
|
55
|
+
if (fix.version !== void 0 && this.pkg[fix.toSection]?.[fix.dependency] !== void 0) {
|
|
56
|
+
this.pkg[fix.toSection][fix.dependency] = fix.version;
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case "remove": {
|
|
61
|
+
removeDep(this.pkg, fix.dependency, fix.section);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case "set-version": {
|
|
65
|
+
addDep(this.pkg, fix.dependency, fix.version, fix.section);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
dependency: fix.dependency,
|
|
71
|
+
detail: fix.detail,
|
|
72
|
+
workspace: this.workspace
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
save() {
|
|
76
|
+
writePackageJson(this.workspace.location, this.pkg);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// src/actions/deplint/fixer.ts
|
|
81
|
+
function applyDeplintFixes(diagnostics) {
|
|
82
|
+
const editors = /* @__PURE__ */ new Map();
|
|
83
|
+
const applied = [];
|
|
84
|
+
for (const diagnostic of diagnostics) {
|
|
85
|
+
for (const fix of diagnostic.fixes ?? []) {
|
|
86
|
+
const workspaceKey = diagnostic.workspace.location;
|
|
87
|
+
let editor = editors.get(workspaceKey);
|
|
88
|
+
if (!editor) {
|
|
89
|
+
editor = new DeplintPackageEditor(diagnostic.workspace);
|
|
90
|
+
editors.set(workspaceKey, editor);
|
|
91
|
+
}
|
|
92
|
+
applied.push(editor.applyFix(fix));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const editor of editors.values()) {
|
|
96
|
+
editor.save();
|
|
97
|
+
}
|
|
98
|
+
return applied;
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
applyDeplintFixes
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=fixer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/deplint/packageJsonEditor.ts","../../../src/actions/deplint/packageEditor.ts","../../../src/actions/deplint/fixer.ts"],"sourcesContent":["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","import type { Workspace } from '../../pm/index.ts'\nimport {\n addDep,\n moveDep,\n type PackageJson,\n readPackageJson,\n removeDep,\n writePackageJson,\n} from './packageJsonEditor.ts'\nimport type { DeplintAppliedFix, DeplintFix } from './types.ts'\n\nexport class DeplintPackageEditor {\n private readonly pkg: PackageJson\n\n constructor(\n private readonly workspace: Workspace,\n ) {\n this.pkg = readPackageJson(workspace.location)\n }\n\n applyFix(fix: DeplintFix): DeplintAppliedFix {\n switch (fix.action) {\n case 'add': {\n addDep(this.pkg, fix.dependency, fix.version, fix.section)\n break\n }\n case 'move': {\n moveDep(this.pkg, fix.dependency, fix.fromSection, fix.toSection)\n if (fix.version !== undefined && this.pkg[fix.toSection]?.[fix.dependency] !== undefined) {\n this.pkg[fix.toSection]![fix.dependency] = fix.version\n }\n break\n }\n case 'remove': {\n removeDep(this.pkg, fix.dependency, fix.section)\n break\n }\n case 'set-version': {\n addDep(this.pkg, fix.dependency, fix.version, fix.section)\n break\n }\n }\n\n return {\n dependency: fix.dependency,\n detail: fix.detail,\n workspace: this.workspace,\n }\n }\n\n save(): void {\n writePackageJson(this.workspace.location, this.pkg)\n }\n}\n","import { DeplintPackageEditor } from './packageEditor.ts'\nimport type { DeplintAppliedFix, DeplintDiagnostic } from './types.ts'\n\nexport function applyDeplintFixes(diagnostics: DeplintDiagnostic[]): DeplintAppliedFix[] {\n const editors = new Map<string, DeplintPackageEditor>()\n const applied: DeplintAppliedFix[] = []\n\n for (const diagnostic of diagnostics) {\n for (const fix of diagnostic.fixes ?? []) {\n const workspaceKey = diagnostic.workspace.location\n let editor = editors.get(workspaceKey)\n if (!editor) {\n editor = new DeplintPackageEditor(diagnostic.workspace)\n editors.set(workspaceKey, editor)\n }\n applied.push(editor.applyFix(fix))\n }\n }\n\n for (const editor of editors.values()) {\n editor.save()\n }\n\n return applied\n}\n"],"mappings":";AAAA,OAAO,QAAQ;AAEf,OAAO,WAAW;AAClB,OAAO,qBAAqB;AAYrB,SAAS,gBAAgB,UAA+B;AAC7D,SAAO,KAAK,MAAM,GAAG,aAAa,GAAG,QAAQ,iBAAiB,MAAM,CAAC;AACvE;AAEO,SAAS,iBAAiB,UAAkB,KAAwB;AACzE,QAAM,SAAS,gBAAgB,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAC3D,KAAG,cAAc,GAAG,QAAQ,iBAAiB,GAAG,MAAM;AAAA,CAAI;AAC5D;AAKO,SAAS,QAAQ,KAAkB,KAAa,MAAc,IAAkB;AACrF,QAAM,cAAc,IAAI,IAAI;AAC5B,MAAI,CAAC,cAAc,GAAG,EAAG;AAEzB,QAAM,UAAU,YAAY,GAAG;AAC/B,SAAO,YAAY,GAAG;AACtB,MAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,WAAO,IAAI,IAAI;AAAA,EACjB;AAEA,QAAM,YAAa,IAAI,EAAE,KAAK,CAAC;AAC/B,YAAU,GAAG,IAAI;AACjB,MAAI,EAAE,IAAI;AACZ;AAKO,SAAS,UAAU,KAAkB,KAAa,SAAuB;AAC9E,QAAM,aAAa,IAAI,OAAO;AAC9B,MAAI,CAAC,aAAa,GAAG,EAAG;AAExB,SAAO,WAAW,GAAG;AACrB,MAAI,OAAO,KAAK,UAAU,EAAE,WAAW,GAAG;AACxC,WAAO,IAAI,OAAO;AAAA,EACpB;AACF;AAKO,SAAS,OAAO,KAAkB,KAAa,SAAiB,SAAuB;AAC5F,QAAM,aAAc,IAAI,OAAO,KAAK,CAAC;AACrC,aAAW,GAAG,IAAI;AAClB,MAAI,OAAO,IAAI;AACjB;;;ACnDO,IAAM,uBAAN,MAA2B;AAAA,EAGhC,YACmB,WACjB;AADiB;AAEjB,SAAK,MAAM,gBAAgB,UAAU,QAAQ;AAAA,EAC/C;AAAA,EAHmB;AAAA,EAHF;AAAA,EAQjB,SAAS,KAAoC;AAC3C,YAAQ,IAAI,QAAQ;AAAA,MAClB,KAAK,OAAO;AACV,eAAO,KAAK,KAAK,IAAI,YAAY,IAAI,SAAS,IAAI,OAAO;AACzD;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,gBAAQ,KAAK,KAAK,IAAI,YAAY,IAAI,aAAa,IAAI,SAAS;AAChE,YAAI,IAAI,YAAY,UAAa,KAAK,IAAI,IAAI,SAAS,IAAI,IAAI,UAAU,MAAM,QAAW;AACxF,eAAK,IAAI,IAAI,SAAS,EAAG,IAAI,UAAU,IAAI,IAAI;AAAA,QACjD;AACA;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,kBAAU,KAAK,KAAK,IAAI,YAAY,IAAI,OAAO;AAC/C;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,eAAO,KAAK,KAAK,IAAI,YAAY,IAAI,SAAS,IAAI,OAAO;AACzD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,YAAY,IAAI;AAAA,MAChB,QAAQ,IAAI;AAAA,MACZ,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,OAAa;AACX,qBAAiB,KAAK,UAAU,UAAU,KAAK,GAAG;AAAA,EACpD;AACF;;;AClDO,SAAS,kBAAkB,aAAuD;AACvF,QAAM,UAAU,oBAAI,IAAkC;AACtD,QAAM,UAA+B,CAAC;AAEtC,aAAW,cAAc,aAAa;AACpC,eAAW,OAAO,WAAW,SAAS,CAAC,GAAG;AACxC,YAAM,eAAe,WAAW,UAAU;AAC1C,UAAI,SAAS,QAAQ,IAAI,YAAY;AACrC,UAAI,CAAC,QAAQ;AACX,iBAAS,IAAI,qBAAqB,WAAW,SAAS;AACtD,gBAAQ,IAAI,cAAc,MAAM;AAAA,MAClC;AACA,cAAQ,KAAK,OAAO,SAAS,GAAG,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,aAAW,UAAU,QAAQ,OAAO,GAAG;AACrC,WAAO,KAAK;AAAA,EACd;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/actions/deplint/getBasePackageName.ts
|
|
2
|
+
function getBasePackageName(importName) {
|
|
3
|
+
const importNameScrubbed = importName.replaceAll('"', "").trim();
|
|
4
|
+
if (importNameScrubbed.startsWith("@")) {
|
|
5
|
+
const parts = importNameScrubbed.split("/");
|
|
6
|
+
return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importNameScrubbed;
|
|
7
|
+
}
|
|
8
|
+
return importNameScrubbed.split("/")[0];
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
getBasePackageName
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=getBasePackageName.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/deplint/getBasePackageName.ts"],"sourcesContent":["export function getBasePackageName(importName: string) {\n const importNameScrubbed = importName.replaceAll('\"', '').trim()\n if (importNameScrubbed.startsWith('@')) {\n const parts = importNameScrubbed.split('/')\n return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importNameScrubbed\n }\n return importNameScrubbed.split('/')[0]\n}\n"],"mappings":";AAAO,SAAS,mBAAmB,YAAoB;AACrD,QAAM,qBAAqB,WAAW,WAAW,KAAK,EAAE,EAAE,KAAK;AAC/D,MAAI,mBAAmB,WAAW,GAAG,GAAG;AACtC,UAAM,QAAQ,mBAAmB,MAAM,GAAG;AAC1C,WAAO,MAAM,UAAU,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK;AAAA,EACzD;AACA,SAAO,mBAAmB,MAAM,GAAG,EAAE,CAAC;AACxC;","names":[]}
|