@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/lib/concurrency.ts","../../../../src/pm/detectPackageManager.ts","../../../../src/pm/registry.ts","../../../../src/lib/fillTemplate.ts","../../../../src/lib/initCwd.ts","../../../../src/lib/generateReadmeFiles.ts","../../../../src/lib/loadConfig.ts","../../../../src/actions/readme-gen.ts","../../../../src/actions/readme-init.ts","../../../../src/actions/readme-lint.ts","../../../../src/xy/param.ts","../../../../src/xy/common/readme/genCommand.ts","../../../../src/xy/common/readme/initCommand.ts","../../../../src/xy/common/readme/lintCommand.ts","../../../../src/xy/common/readme/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nexport const outputStorage = new AsyncLocalStorage<string[]>()\n\nlet captureInstalled = false\n\nexport function installOutputCapture(): void {\n if (captureInstalled) return\n captureInstalled = true\n\n const originalStdoutWrite = process.stdout.write.bind(process.stdout)\n const originalStderrWrite = process.stderr.write.bind(process.stderr)\n\n function intercept(\n original: typeof process.stdout.write,\n ): typeof process.stdout.write {\n return function (chunk: string | Uint8Array, ...args: unknown[]) {\n const buffer = outputStorage.getStore()\n if (buffer) {\n buffer.push(typeof chunk === 'string' ? chunk : new TextDecoder().decode(chunk))\n return true\n }\n return (original as (...params: unknown[]) => boolean)(chunk, ...args)\n } as typeof process.stdout.write\n }\n\n process.stdout.write = intercept(originalStdoutWrite)\n process.stderr.write = intercept(originalStderrWrite)\n}\n\nexport async function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n fn: (item: T) => Promise<void>,\n): Promise<void> {\n let next = 0\n async function worker(): Promise<void> {\n while (next < items.length) {\n const i = next++\n await fn(items[i])\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()))\n}\n","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 type { PackageManagerName } from './detectPackageManager.ts'\nimport { detectPackageManager } from './detectPackageManager.ts'\nimport type { PackageManager } from './PackageManager.ts'\n\nconst implementations = new Map<PackageManagerName, PackageManager>()\n\nexport function registerPackageManager(pm: PackageManager): void {\n implementations.set(pm.name, pm)\n}\n\nexport function getPackageManager(name?: PackageManagerName): PackageManager {\n const pmName = name ?? detectPackageManager()\n const pm = implementations.get(pmName)\n if (!pm) {\n throw new Error(\n `No package manager implementation registered for \"${pmName}\". `\n + 'Ensure registerPackageManager() has been called before getPackageManager().',\n )\n }\n return pm\n}\n","export function fillTemplate(template: string, data: Record<string, string>): string {\n return template.replaceAll(/\\{\\{(.*?)\\}\\}/g, (_, key: string) => data[key.trim()] ?? '')\n}\n","export function INIT_CWD(): string {\n return process.env.INIT_CWD ?? process.cwd()\n}\n","import { execFile } from 'node:child_process'\nimport FS, { readFileSync } from 'node:fs'\nimport {\n mkdir, readFile, writeFile,\n} from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport PATH from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { promisify } from 'node:util'\n\nimport chalk from 'chalk'\n\nimport { detectPackageManager, getPackageManager } from '../pm/index.ts'\nimport { fillTemplate } from './fillTemplate.ts'\nimport { INIT_CWD } from './initCwd.ts'\n\nconst execFileAsync = promisify(execFile)\n\nconst require = createRequire(import.meta.url)\nconst packageRoot = PATH.dirname(require.resolve('@xylabs/ts-scripts-common/package.json'))\nconst readmeTemplatesDir = PATH.resolve(packageRoot, 'templates', 'readme')\n\ninterface GenerateReadmeFilesParams {\n jobs: number\n logoLinkUrl?: string\n logoUrl?: string\n pkg?: string\n templatePath?: string\n typedoc?: boolean\n verbose?: boolean\n}\n\nfunction fillReadmeTemplate(template: string, data: Record<string, string>): string {\n const additionalData: Record<string, string> = { ...data, safeName: data.name.replaceAll('/', '__').replaceAll('@', '') }\n return fillTemplate(template, additionalData)\n}\n\nasync function generateTypedoc(packageLocation: string, entryPoints: string[]): Promise<string> {\n const tempDir = PATH.join(packageLocation, '.temp-typedoc')\n\n try {\n if (!FS.existsSync(tempDir)) {\n FS.mkdirSync(tempDir, { recursive: true })\n }\n\n const typedocConfig = {\n disableSources: true,\n entryPointStrategy: 'expand',\n entryPoints: entryPoints.map(ep => PATH.resolve(packageLocation, ep)),\n excludeExternals: true,\n excludeInternal: true,\n excludePrivate: true,\n githubPages: false,\n hideBreadcrumbs: true,\n hideGenerator: true,\n hidePageTitle: true,\n out: tempDir,\n plugin: ['typedoc-plugin-markdown'],\n readme: 'none',\n skipErrorChecking: true,\n sort: ['source-order'],\n theme: 'markdown',\n useCodeBlocks: true,\n }\n\n const typedocJsonPath = PATH.join(tempDir, 'typedoc.json')\n FS.writeFileSync(typedocJsonPath, JSON.stringify(typedocConfig, null, 2))\n\n try {\n await execFileAsync('npx', ['typedoc', '--options', typedocJsonPath], { cwd: process.cwd() })\n } catch {\n return ''\n }\n\n return consolidateMarkdown(tempDir)\n } catch {\n return ''\n } finally {\n try {\n FS.rmSync(tempDir, { force: true, recursive: true })\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\nfunction consolidateMarkdown(tempDir: string): string {\n let consolidated = '## Reference\\n\\n'\n\n const mainReadmePath = PATH.join(tempDir, 'README.md')\n if (FS.existsSync(mainReadmePath)) {\n const mainContent = FS.readFileSync(mainReadmePath, 'utf8')\n .replace(/^---(.|\\n)*?---\\n/, '')\n .replace(/^# .+\\n/, '')\n .replaceAll(/\\]\\((.+?)\\.md\\)/g, '](#$1)')\n\n consolidated += mainContent + '\\n\\n'\n }\n\n consolidated += processDirectory(tempDir)\n\n return consolidated\n .replaceAll(/\\n\\n\\n+/g, '\\n\\n')\n .replaceAll(/^#### /gm, '### ')\n .replaceAll(/^##### /gm, '#### ')\n .replaceAll(/^###### /gm, '##### ')\n}\n\nfunction processDirectory(dir: string, level = 0): string {\n const indent = ' '.repeat(level)\n let content = ''\n\n try {\n const items = FS.readdirSync(dir, { withFileTypes: true })\n\n for (const item of items) {\n if (item.isDirectory()) continue\n if (item.name === 'README.md' || !item.name.endsWith('.md')) continue\n\n const fileContent = FS.readFileSync(PATH.join(dir, item.name), 'utf8')\n .replace(/^---(.|\\n)*?---\\n/, '')\n const moduleName = item.name.replace('.md', '')\n\n content += `\\n\\n${indent}### <a id=\"${moduleName}\"></a>${moduleName}\\n\\n`\n content += fileContent\n .replace(/^# .+\\n/, '')\n .replaceAll(/\\]\\((.+?)\\.md\\)/g, '](#$1)')\n }\n\n for (const item of items) {\n if (!item.isDirectory()) continue\n if (item.name === 'spec' || item.name.includes('.spec')) continue\n\n content += `\\n\\n${indent}### ${item.name}\\n`\n content += processDirectory(PATH.join(dir, item.name), level + 1)\n }\n } catch {\n // skip unreadable directories\n }\n\n return content\n}\n\nfunction askConfirmation(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes')\n })\n })\n}\n\nexport const DEFAULT_README_TEMPLATE = readFileSync(PATH.resolve(readmeTemplatesDir, 'README.template.md'), 'utf8')\nexport const DEFAULT_README_BODY = readFileSync(PATH.resolve(readmeTemplatesDir, 'README.body.md'), 'utf8')\n\nexport function applyLogoConfig(template: string, logoUrl?: string, logoLinkUrl?: string): string {\n let result = template\n if (logoUrl) {\n result = result.replace(/\\[logo]: .+/, `[logo]: ${logoUrl}`)\n if (logoLinkUrl) {\n result = result.replace(/\\[!\\[logo]\\[]][^)]*\\)/, `[![logo][]](${logoLinkUrl})`)\n }\n } else {\n result = result.replace(/\\[!\\[logo]\\[]][^\\n]*\\n*/, '')\n result = result.replace(/\\[logo]: [^\\n]*\\n?/, '')\n }\n return result\n}\n\nexport function resolveTemplatePath(templatePath?: string): string {\n const cwd = INIT_CWD()\n return templatePath ?? PATH.join(cwd, '.xy', 'README.template.md')\n}\n\nasync function loadOrCreateTemplate(resolvedTemplatePath: string): Promise<{\n created: boolean\n template: string\n}> {\n try {\n const template = await readFile(resolvedTemplatePath, 'utf8')\n return { created: false, template }\n } catch {\n console.log(chalk.yellow(`Template not found: ${resolvedTemplatePath}`))\n const shouldCreate = await askConfirmation('Would you like to create a stock template? (y/N) ')\n if (!shouldCreate) {\n throw new Error('Template creation declined')\n }\n const template = DEFAULT_README_TEMPLATE\n await scaffoldTemplate(resolvedTemplatePath, template)\n return { created: true, template }\n }\n}\n\nexport async function scaffoldTemplate(resolvedTemplatePath: string, template: string): Promise<void> {\n const xyDir = PATH.dirname(resolvedTemplatePath)\n await mkdir(xyDir, { recursive: true })\n await writeFile(resolvedTemplatePath, template)\n console.log(chalk.green(`Created template: ${resolvedTemplatePath}`))\n const bodyPath = PATH.join(xyDir, 'README.body.md')\n await writeFile(bodyPath, DEFAULT_README_BODY)\n console.log(chalk.green(`Created body template: ${bodyPath}`))\n}\n\nasync function resolveBody(location: string, defaultBody: string): Promise<string> {\n const localBodyPath = PATH.join(location, 'README.body.md')\n try {\n return await readFile(localBodyPath, 'utf8')\n } catch {\n return defaultBody\n }\n}\n\nasync function generateReadmeForWorkspace(\n location: string,\n name: string,\n template: string,\n defaultBody: string,\n typedoc: boolean,\n verbose: boolean,\n pm: string,\n): Promise<boolean> {\n try {\n const pkgJsonPath = PATH.join(location, 'package.json')\n const pkgJson = JSON.parse(await readFile(pkgJsonPath, 'utf8')) as Record<string, string>\n const body = await resolveBody(location, defaultBody)\n const typedocContent = typedoc ? await generateTypedoc(location, ['src/index*.ts']) : ''\n const readmeContent = fillReadmeTemplate(template, {\n ...pkgJson, body, pm, typedoc: typedocContent,\n })\n await writeFile(PATH.join(location, 'README.md'), readmeContent)\n if (verbose) console.log(chalk.green(` ${name}`))\n return true\n } catch (ex) {\n const error = ex as Error\n console.warn(chalk.yellow(` Skipped ${location}: ${error.message}`))\n return false\n }\n}\n\nimport {\n installOutputCapture, outputStorage, runWithConcurrency,\n} from './concurrency.ts'\n\ninterface CapturedResult {\n output: string[]\n success: boolean\n}\n\nasync function loadDefaultBody(resolvedTemplatePath: string): Promise<string> {\n const xyBodyPath = PATH.join(PATH.dirname(resolvedTemplatePath), 'README.body.md')\n try {\n return await readFile(xyBodyPath, 'utf8')\n } catch {\n return DEFAULT_README_BODY\n }\n}\n\nfunction flushResults(results: CapturedResult[]): boolean {\n let failed = false\n for (const { output, success } of results) {\n for (const line of output) {\n process.stdout.write(line)\n }\n if (!success) failed = true\n }\n return failed\n}\n\nexport async function generateReadmeFiles({\n jobs, logoLinkUrl, logoUrl, pkg, templatePath, typedoc = false, verbose = false,\n}: GenerateReadmeFilesParams): Promise<number> {\n console.log(chalk.green('Generate README Files'))\n const resolvedTemplatePath = resolveTemplatePath(templatePath)\n\n let template: string\n let templateCreated: boolean\n try {\n ({ template, created: templateCreated } = await loadOrCreateTemplate(resolvedTemplatePath))\n } catch {\n return 1\n }\n\n template = applyLogoConfig(template, logoUrl, logoLinkUrl)\n\n if (templateCreated) {\n console.log(chalk.green('Generating README files for all packages...'))\n }\n\n const defaultBody = await loadDefaultBody(resolvedTemplatePath)\n const pmName = detectPackageManager()\n const pm = getPackageManager()\n const singleWorkspace = pkg && !templateCreated ? pm.findWorkspace(pkg) : undefined\n const workspaces = singleWorkspace ? [singleWorkspace] : pm.listWorkspaces()\n const concurrency = jobs\n const results: CapturedResult[] = Array.from({ length: workspaces.length }, () => ({ output: [], success: true }))\n\n installOutputCapture()\n\n const start = performance.now()\n\n await runWithConcurrency(\n workspaces.map((ws, i) => ({ i, ws })),\n concurrency,\n async ({ i, ws }) => {\n const output: string[] = []\n await outputStorage.run(output, async () => {\n const success = await generateReadmeForWorkspace(ws.location, ws.name, template, defaultBody, typedoc, verbose, pmName)\n results[i] = { output, success }\n })\n },\n )\n\n const failed = flushResults(results)\n const ms = performance.now() - start\n console.log(chalk.blue(`Generated ${workspaces.length} README(s) in ${ms.toFixed(0)}ms`))\n\n return failed ? 1 : 0\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 { generateReadmeFiles, loadConfig } from '../lib/index.ts'\nimport type { XyConfig } from './package/index.ts'\n\nexport interface ReadmeGenParams {\n jobs: number\n pkg?: string\n templatePath?: string\n typedoc?: boolean\n verbose?: boolean\n}\n\nexport async function readmeGen({\n jobs, pkg, templatePath, typedoc, verbose,\n}: ReadmeGenParams): Promise<number> {\n const config = await loadConfig<XyConfig>()\n return await generateReadmeFiles({\n jobs,\n logoLinkUrl: config.readme?.logoLinkUrl,\n logoUrl: config.readme?.logoUrl,\n pkg,\n templatePath,\n typedoc,\n verbose,\n })\n}\n","import {\n applyLogoConfig, DEFAULT_README_TEMPLATE, loadConfig, resolveTemplatePath, scaffoldTemplate,\n} from '../lib/index.ts'\nimport type { XyConfig } from './package/index.ts'\n\nexport interface ReadmeInitParams {\n templatePath?: string\n verbose?: boolean\n}\n\nexport async function readmeInit({ templatePath }: ReadmeInitParams): Promise<number> {\n const config = await loadConfig<XyConfig>()\n const template = applyLogoConfig(DEFAULT_README_TEMPLATE, config.readme?.logoUrl, config.readme?.logoLinkUrl)\n const resolvedTemplatePath = resolveTemplatePath(templatePath)\n await scaffoldTemplate(resolvedTemplatePath, template)\n return 0\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport { INIT_CWD, resolveTemplatePath } from '../lib/index.ts'\nimport { getPackageManager } from '../pm/index.ts'\nimport type { XyConfig } from './package/index.ts'\n\ninterface ReadmeLintResult {\n errors: string[]\n warnings: string[]\n}\n\nfunction lintTemplate(cwd: string): ReadmeLintResult {\n const result: ReadmeLintResult = { errors: [], warnings: [] }\n const templatePath = resolveTemplatePath()\n\n if (!existsSync(templatePath)) {\n result.errors.push('Missing .xy/README.template.md (run \"xy readme init\" to create)')\n return result\n }\n\n const template = readFileSync(templatePath, 'utf8')\n\n if (!template.includes('{{body}}')) {\n result.warnings.push('.xy/README.template.md does not contain a {{body}} placeholder')\n }\n if (!template.includes('{{description}}')) {\n result.warnings.push('.xy/README.template.md does not contain a {{description}} placeholder')\n }\n\n const bodyPath = PATH.join(cwd, '.xy', 'README.body.md')\n if (!existsSync(bodyPath)) {\n result.errors.push('Missing .xy/README.body.md (run \"xy readme init\" to create)')\n }\n\n return result\n}\n\nfunction lintLogoConfig(cwd: string, config: XyConfig): ReadmeLintResult {\n const result: ReadmeLintResult = { errors: [], warnings: [] }\n const templatePath = resolveTemplatePath()\n\n if (existsSync(templatePath)) {\n const template = readFileSync(templatePath, 'utf8')\n const logoRef = /\\[logo]: (.+)/.exec(template)\n if (logoRef?.[1].includes('example.com')) {\n result.warnings.push('.xy/README.template.md still has the example.com logo placeholder — update it or set readme.logoUrl in xy.config.ts')\n } else if (!logoRef && !config.readme?.logoUrl) {\n result.warnings.push('No logo URL configured in xy.config.ts (readme.logoUrl) or template')\n }\n }\n\n if (!config.readme?.logoUrl && !config.readme?.logoLinkUrl) {\n result.warnings.push('No readme.logoUrl or readme.logoLinkUrl configured in xy.config.ts')\n }\n\n return result\n}\n\nfunction lintPackages(cwd: string): ReadmeLintResult {\n const result: ReadmeLintResult = { errors: [], warnings: [] }\n const pm = getPackageManager()\n const workspaces = pm.listWorkspaces()\n\n for (const { location, name } of workspaces) {\n if (location === '.') continue\n\n const pkgPath = PATH.join(cwd, location, 'package.json')\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n\n if (pkg.private) continue\n\n if (!pkg.description) {\n result.warnings.push(`${name} is missing a \"description\" in package.json`)\n }\n\n const readmePath = PATH.join(cwd, location, 'README.md')\n if (!existsSync(readmePath)) {\n result.errors.push(`${name} is missing README.md`)\n }\n } catch {\n // skip unreadable packages\n }\n }\n\n return result\n}\n\nexport interface ReadmeLintParams {\n config: XyConfig\n verbose?: boolean\n}\n\nexport function readmeLint({ config, verbose }: ReadmeLintParams): number {\n const cwd = INIT_CWD()\n console.log(chalk.green('Readme Lint'))\n\n const checks = [\n lintTemplate(cwd),\n lintLogoConfig(cwd, config),\n lintPackages(cwd),\n ]\n\n let errorCount = 0\n let warningCount = 0\n\n for (const { errors, warnings } of checks) {\n for (const error of errors) {\n console.log(chalk.red(` ✗ ${error}`))\n errorCount++\n }\n for (const warning of warnings) {\n console.log(chalk.yellow(` ⚠ ${warning}`))\n warningCount++\n }\n }\n\n if (errorCount === 0 && warningCount === 0) {\n console.log(chalk.green(' All checks passed'))\n } else {\n if (verbose) {\n console.log(chalk.gray(` ${errorCount} error(s), ${warningCount} warning(s)`))\n }\n }\n\n return errorCount > 0 ? 1 : 0\n}\n","import type { Argv } from 'yargs'\n\nexport const packagePositionalParam = (yargs: Argv<unknown>) => {\n return yargs.positional('package', { describe: 'Specific package to target', type: 'string' })\n}\n","import type { CommandModule } from 'yargs'\n\nimport { readmeGen } from '../../../actions/index.ts'\nimport { packagePositionalParam } from '../../param.ts'\n\nexport const genCommand: CommandModule = {\n builder: (yargs) => {\n return packagePositionalParam(yargs)\n .option('template', {\n alias: 't',\n description: 'Path to README.template.md',\n type: 'string',\n })\n .option('notypedoc', {\n default: false,\n description: 'Disable TypeDoc reference sections',\n type: 'boolean',\n })\n },\n aliases: ['$0'],\n command: 'gen [package]',\n describe: 'Generate README.md files from template',\n handler: async (argv) => {\n if (argv.verbose) console.log('Readme Gen')\n process.exitCode = await readmeGen({\n jobs: argv.jobs as number,\n pkg: argv.package as string | undefined,\n templatePath: argv.template as string | undefined,\n typedoc: !argv.notypedoc,\n verbose: !!argv.verbose,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { readmeInit } from '../../../actions/index.ts'\n\nexport const initCommand: CommandModule = {\n builder: (yargs) => {\n return yargs\n .option('template', {\n alias: 't',\n description: 'Path to README.template.md',\n type: 'string',\n })\n },\n command: 'init',\n describe: 'Initialize README template and logo files',\n handler: async (argv) => {\n if (argv.verbose) console.log('Readme Init')\n process.exitCode = await readmeInit({\n templatePath: argv.template as string | undefined,\n verbose: !!argv.verbose,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport type { XyConfig } from '../../../actions/index.ts'\nimport { readmeLint } from '../../../actions/index.ts'\nimport { loadConfig } from '../../../lib/index.ts'\n\nexport const lintCommand: CommandModule = {\n command: 'lint',\n describe: 'Check for missing readme templates, body files, logos, and descriptions',\n handler: async (argv) => {\n const config = await loadConfig<XyConfig>()\n process.exitCode = readmeLint({ config, verbose: !!argv.verbose })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { genCommand } from './genCommand.ts'\nimport { initCommand } from './initCommand.ts'\nimport { lintCommand } from './lintCommand.ts'\n\nexport const readmeCommand: CommandModule = {\n builder: (yargs) => {\n return yargs\n .command(genCommand)\n .command(initCommand)\n .command(lintCommand)\n .demandCommand(1, 'Please specify a readme subcommand')\n .strictCommands()\n },\n command: 'readme',\n describe: 'Readme - README file utilities',\n handler: () => { /* parent command — no-op */ },\n}\n"],"mappings":"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","names":["require","chalk","chalk","config","config","existsSync","readFileSync","PATH","chalk","existsSync","readFileSync","PATH","config","chalk","config"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// src/lib/initCwd.ts
|
|
2
|
+
function INIT_CWD() {
|
|
3
|
+
return process.env.INIT_CWD ?? process.cwd();
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
// src/lib/generateReadmeFiles.ts
|
|
7
|
+
import { execFile } from "child_process";
|
|
8
|
+
import FS, { readFileSync } from "fs";
|
|
9
|
+
import {
|
|
10
|
+
mkdir,
|
|
11
|
+
readFile,
|
|
12
|
+
writeFile
|
|
13
|
+
} from "fs/promises";
|
|
14
|
+
import { createRequire } from "module";
|
|
15
|
+
import PATH from "path";
|
|
16
|
+
import { createInterface } from "readline";
|
|
17
|
+
import { promisify } from "util";
|
|
18
|
+
import chalk from "chalk";
|
|
19
|
+
var execFileAsync = promisify(execFile);
|
|
20
|
+
var require2 = createRequire(import.meta.url);
|
|
21
|
+
var packageRoot = PATH.dirname(require2.resolve("@xylabs/ts-scripts-common/package.json"));
|
|
22
|
+
var readmeTemplatesDir = PATH.resolve(packageRoot, "templates", "readme");
|
|
23
|
+
var DEFAULT_README_TEMPLATE = readFileSync(PATH.resolve(readmeTemplatesDir, "README.template.md"), "utf8");
|
|
24
|
+
var DEFAULT_README_BODY = readFileSync(PATH.resolve(readmeTemplatesDir, "README.body.md"), "utf8");
|
|
25
|
+
function applyLogoConfig(template, logoUrl, logoLinkUrl) {
|
|
26
|
+
let result = template;
|
|
27
|
+
if (logoUrl) {
|
|
28
|
+
result = result.replace(/\[logo]: .+/, `[logo]: ${logoUrl}`);
|
|
29
|
+
if (logoLinkUrl) {
|
|
30
|
+
result = result.replace(/\[!\[logo]\[]][^)]*\)/, `[![logo][]](${logoLinkUrl})`);
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
result = result.replace(/\[!\[logo]\[]][^\n]*\n*/, "");
|
|
34
|
+
result = result.replace(/\[logo]: [^\n]*\n?/, "");
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
function resolveTemplatePath(templatePath) {
|
|
39
|
+
const cwd = INIT_CWD();
|
|
40
|
+
return templatePath ?? PATH.join(cwd, ".xy", "README.template.md");
|
|
41
|
+
}
|
|
42
|
+
async function scaffoldTemplate(resolvedTemplatePath, template) {
|
|
43
|
+
const xyDir = PATH.dirname(resolvedTemplatePath);
|
|
44
|
+
await mkdir(xyDir, { recursive: true });
|
|
45
|
+
await writeFile(resolvedTemplatePath, template);
|
|
46
|
+
console.log(chalk.green(`Created template: ${resolvedTemplatePath}`));
|
|
47
|
+
const bodyPath = PATH.join(xyDir, "README.body.md");
|
|
48
|
+
await writeFile(bodyPath, DEFAULT_README_BODY);
|
|
49
|
+
console.log(chalk.green(`Created body template: ${bodyPath}`));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// src/lib/loadConfig.ts
|
|
53
|
+
import chalk2 from "chalk";
|
|
54
|
+
import { cosmiconfig } from "cosmiconfig";
|
|
55
|
+
import { TypeScriptLoader } from "cosmiconfig-typescript-loader";
|
|
56
|
+
import deepmerge from "deepmerge";
|
|
57
|
+
var config;
|
|
58
|
+
var rootConfigPath;
|
|
59
|
+
function createExplorer() {
|
|
60
|
+
return cosmiconfig("xy", { cache: true, loaders: { ".ts": TypeScriptLoader() } });
|
|
61
|
+
}
|
|
62
|
+
var loadConfig = async (params) => {
|
|
63
|
+
if (config === void 0) {
|
|
64
|
+
const cosmicConfigResult = await createExplorer().search();
|
|
65
|
+
config = cosmicConfigResult?.config ?? {};
|
|
66
|
+
rootConfigPath = cosmicConfigResult?.filepath;
|
|
67
|
+
const configFilePath = cosmicConfigResult?.filepath;
|
|
68
|
+
if (configFilePath !== void 0) {
|
|
69
|
+
console.log(chalk2.green(`Loaded config from ${configFilePath}`));
|
|
70
|
+
if (config.verbose) {
|
|
71
|
+
console.log(chalk2.gray(`${JSON.stringify(config, null, 2)}`));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return deepmerge(config, params ?? {});
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// src/actions/readme-init.ts
|
|
79
|
+
async function readmeInit({ templatePath }) {
|
|
80
|
+
const config2 = await loadConfig();
|
|
81
|
+
const template = applyLogoConfig(DEFAULT_README_TEMPLATE, config2.readme?.logoUrl, config2.readme?.logoLinkUrl);
|
|
82
|
+
const resolvedTemplatePath = resolveTemplatePath(templatePath);
|
|
83
|
+
await scaffoldTemplate(resolvedTemplatePath, template);
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// src/xy/common/readme/initCommand.ts
|
|
88
|
+
var initCommand = {
|
|
89
|
+
builder: (yargs) => {
|
|
90
|
+
return yargs.option("template", {
|
|
91
|
+
alias: "t",
|
|
92
|
+
description: "Path to README.template.md",
|
|
93
|
+
type: "string"
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
command: "init",
|
|
97
|
+
describe: "Initialize README template and logo files",
|
|
98
|
+
handler: async (argv) => {
|
|
99
|
+
if (argv.verbose) console.log("Readme Init");
|
|
100
|
+
process.exitCode = await readmeInit({
|
|
101
|
+
templatePath: argv.template,
|
|
102
|
+
verbose: !!argv.verbose
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
export {
|
|
107
|
+
initCommand
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=initCommand.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/initCwd.ts","../../../../src/lib/generateReadmeFiles.ts","../../../../src/lib/loadConfig.ts","../../../../src/actions/readme-init.ts","../../../../src/xy/common/readme/initCommand.ts"],"sourcesContent":["export function INIT_CWD(): string {\n return process.env.INIT_CWD ?? process.cwd()\n}\n","import { execFile } from 'node:child_process'\nimport FS, { readFileSync } from 'node:fs'\nimport {\n mkdir, readFile, writeFile,\n} from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport PATH from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { promisify } from 'node:util'\n\nimport chalk from 'chalk'\n\nimport { detectPackageManager, getPackageManager } from '../pm/index.ts'\nimport { fillTemplate } from './fillTemplate.ts'\nimport { INIT_CWD } from './initCwd.ts'\n\nconst execFileAsync = promisify(execFile)\n\nconst require = createRequire(import.meta.url)\nconst packageRoot = PATH.dirname(require.resolve('@xylabs/ts-scripts-common/package.json'))\nconst readmeTemplatesDir = PATH.resolve(packageRoot, 'templates', 'readme')\n\ninterface GenerateReadmeFilesParams {\n jobs: number\n logoLinkUrl?: string\n logoUrl?: string\n pkg?: string\n templatePath?: string\n typedoc?: boolean\n verbose?: boolean\n}\n\nfunction fillReadmeTemplate(template: string, data: Record<string, string>): string {\n const additionalData: Record<string, string> = { ...data, safeName: data.name.replaceAll('/', '__').replaceAll('@', '') }\n return fillTemplate(template, additionalData)\n}\n\nasync function generateTypedoc(packageLocation: string, entryPoints: string[]): Promise<string> {\n const tempDir = PATH.join(packageLocation, '.temp-typedoc')\n\n try {\n if (!FS.existsSync(tempDir)) {\n FS.mkdirSync(tempDir, { recursive: true })\n }\n\n const typedocConfig = {\n disableSources: true,\n entryPointStrategy: 'expand',\n entryPoints: entryPoints.map(ep => PATH.resolve(packageLocation, ep)),\n excludeExternals: true,\n excludeInternal: true,\n excludePrivate: true,\n githubPages: false,\n hideBreadcrumbs: true,\n hideGenerator: true,\n hidePageTitle: true,\n out: tempDir,\n plugin: ['typedoc-plugin-markdown'],\n readme: 'none',\n skipErrorChecking: true,\n sort: ['source-order'],\n theme: 'markdown',\n useCodeBlocks: true,\n }\n\n const typedocJsonPath = PATH.join(tempDir, 'typedoc.json')\n FS.writeFileSync(typedocJsonPath, JSON.stringify(typedocConfig, null, 2))\n\n try {\n await execFileAsync('npx', ['typedoc', '--options', typedocJsonPath], { cwd: process.cwd() })\n } catch {\n return ''\n }\n\n return consolidateMarkdown(tempDir)\n } catch {\n return ''\n } finally {\n try {\n FS.rmSync(tempDir, { force: true, recursive: true })\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\nfunction consolidateMarkdown(tempDir: string): string {\n let consolidated = '## Reference\\n\\n'\n\n const mainReadmePath = PATH.join(tempDir, 'README.md')\n if (FS.existsSync(mainReadmePath)) {\n const mainContent = FS.readFileSync(mainReadmePath, 'utf8')\n .replace(/^---(.|\\n)*?---\\n/, '')\n .replace(/^# .+\\n/, '')\n .replaceAll(/\\]\\((.+?)\\.md\\)/g, '](#$1)')\n\n consolidated += mainContent + '\\n\\n'\n }\n\n consolidated += processDirectory(tempDir)\n\n return consolidated\n .replaceAll(/\\n\\n\\n+/g, '\\n\\n')\n .replaceAll(/^#### /gm, '### ')\n .replaceAll(/^##### /gm, '#### ')\n .replaceAll(/^###### /gm, '##### ')\n}\n\nfunction processDirectory(dir: string, level = 0): string {\n const indent = ' '.repeat(level)\n let content = ''\n\n try {\n const items = FS.readdirSync(dir, { withFileTypes: true })\n\n for (const item of items) {\n if (item.isDirectory()) continue\n if (item.name === 'README.md' || !item.name.endsWith('.md')) continue\n\n const fileContent = FS.readFileSync(PATH.join(dir, item.name), 'utf8')\n .replace(/^---(.|\\n)*?---\\n/, '')\n const moduleName = item.name.replace('.md', '')\n\n content += `\\n\\n${indent}### <a id=\"${moduleName}\"></a>${moduleName}\\n\\n`\n content += fileContent\n .replace(/^# .+\\n/, '')\n .replaceAll(/\\]\\((.+?)\\.md\\)/g, '](#$1)')\n }\n\n for (const item of items) {\n if (!item.isDirectory()) continue\n if (item.name === 'spec' || item.name.includes('.spec')) continue\n\n content += `\\n\\n${indent}### ${item.name}\\n`\n content += processDirectory(PATH.join(dir, item.name), level + 1)\n }\n } catch {\n // skip unreadable directories\n }\n\n return content\n}\n\nfunction askConfirmation(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes')\n })\n })\n}\n\nexport const DEFAULT_README_TEMPLATE = readFileSync(PATH.resolve(readmeTemplatesDir, 'README.template.md'), 'utf8')\nexport const DEFAULT_README_BODY = readFileSync(PATH.resolve(readmeTemplatesDir, 'README.body.md'), 'utf8')\n\nexport function applyLogoConfig(template: string, logoUrl?: string, logoLinkUrl?: string): string {\n let result = template\n if (logoUrl) {\n result = result.replace(/\\[logo]: .+/, `[logo]: ${logoUrl}`)\n if (logoLinkUrl) {\n result = result.replace(/\\[!\\[logo]\\[]][^)]*\\)/, `[![logo][]](${logoLinkUrl})`)\n }\n } else {\n result = result.replace(/\\[!\\[logo]\\[]][^\\n]*\\n*/, '')\n result = result.replace(/\\[logo]: [^\\n]*\\n?/, '')\n }\n return result\n}\n\nexport function resolveTemplatePath(templatePath?: string): string {\n const cwd = INIT_CWD()\n return templatePath ?? PATH.join(cwd, '.xy', 'README.template.md')\n}\n\nasync function loadOrCreateTemplate(resolvedTemplatePath: string): Promise<{\n created: boolean\n template: string\n}> {\n try {\n const template = await readFile(resolvedTemplatePath, 'utf8')\n return { created: false, template }\n } catch {\n console.log(chalk.yellow(`Template not found: ${resolvedTemplatePath}`))\n const shouldCreate = await askConfirmation('Would you like to create a stock template? (y/N) ')\n if (!shouldCreate) {\n throw new Error('Template creation declined')\n }\n const template = DEFAULT_README_TEMPLATE\n await scaffoldTemplate(resolvedTemplatePath, template)\n return { created: true, template }\n }\n}\n\nexport async function scaffoldTemplate(resolvedTemplatePath: string, template: string): Promise<void> {\n const xyDir = PATH.dirname(resolvedTemplatePath)\n await mkdir(xyDir, { recursive: true })\n await writeFile(resolvedTemplatePath, template)\n console.log(chalk.green(`Created template: ${resolvedTemplatePath}`))\n const bodyPath = PATH.join(xyDir, 'README.body.md')\n await writeFile(bodyPath, DEFAULT_README_BODY)\n console.log(chalk.green(`Created body template: ${bodyPath}`))\n}\n\nasync function resolveBody(location: string, defaultBody: string): Promise<string> {\n const localBodyPath = PATH.join(location, 'README.body.md')\n try {\n return await readFile(localBodyPath, 'utf8')\n } catch {\n return defaultBody\n }\n}\n\nasync function generateReadmeForWorkspace(\n location: string,\n name: string,\n template: string,\n defaultBody: string,\n typedoc: boolean,\n verbose: boolean,\n pm: string,\n): Promise<boolean> {\n try {\n const pkgJsonPath = PATH.join(location, 'package.json')\n const pkgJson = JSON.parse(await readFile(pkgJsonPath, 'utf8')) as Record<string, string>\n const body = await resolveBody(location, defaultBody)\n const typedocContent = typedoc ? await generateTypedoc(location, ['src/index*.ts']) : ''\n const readmeContent = fillReadmeTemplate(template, {\n ...pkgJson, body, pm, typedoc: typedocContent,\n })\n await writeFile(PATH.join(location, 'README.md'), readmeContent)\n if (verbose) console.log(chalk.green(` ${name}`))\n return true\n } catch (ex) {\n const error = ex as Error\n console.warn(chalk.yellow(` Skipped ${location}: ${error.message}`))\n return false\n }\n}\n\nimport {\n installOutputCapture, outputStorage, runWithConcurrency,\n} from './concurrency.ts'\n\ninterface CapturedResult {\n output: string[]\n success: boolean\n}\n\nasync function loadDefaultBody(resolvedTemplatePath: string): Promise<string> {\n const xyBodyPath = PATH.join(PATH.dirname(resolvedTemplatePath), 'README.body.md')\n try {\n return await readFile(xyBodyPath, 'utf8')\n } catch {\n return DEFAULT_README_BODY\n }\n}\n\nfunction flushResults(results: CapturedResult[]): boolean {\n let failed = false\n for (const { output, success } of results) {\n for (const line of output) {\n process.stdout.write(line)\n }\n if (!success) failed = true\n }\n return failed\n}\n\nexport async function generateReadmeFiles({\n jobs, logoLinkUrl, logoUrl, pkg, templatePath, typedoc = false, verbose = false,\n}: GenerateReadmeFilesParams): Promise<number> {\n console.log(chalk.green('Generate README Files'))\n const resolvedTemplatePath = resolveTemplatePath(templatePath)\n\n let template: string\n let templateCreated: boolean\n try {\n ({ template, created: templateCreated } = await loadOrCreateTemplate(resolvedTemplatePath))\n } catch {\n return 1\n }\n\n template = applyLogoConfig(template, logoUrl, logoLinkUrl)\n\n if (templateCreated) {\n console.log(chalk.green('Generating README files for all packages...'))\n }\n\n const defaultBody = await loadDefaultBody(resolvedTemplatePath)\n const pmName = detectPackageManager()\n const pm = getPackageManager()\n const singleWorkspace = pkg && !templateCreated ? pm.findWorkspace(pkg) : undefined\n const workspaces = singleWorkspace ? [singleWorkspace] : pm.listWorkspaces()\n const concurrency = jobs\n const results: CapturedResult[] = Array.from({ length: workspaces.length }, () => ({ output: [], success: true }))\n\n installOutputCapture()\n\n const start = performance.now()\n\n await runWithConcurrency(\n workspaces.map((ws, i) => ({ i, ws })),\n concurrency,\n async ({ i, ws }) => {\n const output: string[] = []\n await outputStorage.run(output, async () => {\n const success = await generateReadmeForWorkspace(ws.location, ws.name, template, defaultBody, typedoc, verbose, pmName)\n results[i] = { output, success }\n })\n },\n )\n\n const failed = flushResults(results)\n const ms = performance.now() - start\n console.log(chalk.blue(`Generated ${workspaces.length} README(s) in ${ms.toFixed(0)}ms`))\n\n return failed ? 1 : 0\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 {\n applyLogoConfig, DEFAULT_README_TEMPLATE, loadConfig, resolveTemplatePath, scaffoldTemplate,\n} from '../lib/index.ts'\nimport type { XyConfig } from './package/index.ts'\n\nexport interface ReadmeInitParams {\n templatePath?: string\n verbose?: boolean\n}\n\nexport async function readmeInit({ templatePath }: ReadmeInitParams): Promise<number> {\n const config = await loadConfig<XyConfig>()\n const template = applyLogoConfig(DEFAULT_README_TEMPLATE, config.readme?.logoUrl, config.readme?.logoLinkUrl)\n const resolvedTemplatePath = resolveTemplatePath(templatePath)\n await scaffoldTemplate(resolvedTemplatePath, template)\n return 0\n}\n","import type { CommandModule } from 'yargs'\n\nimport { readmeInit } from '../../../actions/index.ts'\n\nexport const initCommand: CommandModule = {\n builder: (yargs) => {\n return yargs\n .option('template', {\n alias: 't',\n description: 'Path to README.template.md',\n type: 'string',\n })\n },\n command: 'init',\n describe: 'Initialize README template and logo files',\n handler: async (argv) => {\n if (argv.verbose) console.log('Readme Init')\n process.exitCode = await readmeInit({\n templatePath: argv.template as string | undefined,\n verbose: !!argv.verbose,\n })\n },\n}\n"],"mappings":"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","names":["require","chalk","chalk","config"]}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// src/pm/detectPackageManager.ts
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
function detectPackageManager() {
|
|
4
|
+
if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
|
|
5
|
+
return "yarn";
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// src/pm/registry.ts
|
|
9
|
+
var implementations = /* @__PURE__ */ new Map();
|
|
10
|
+
function getPackageManager(name) {
|
|
11
|
+
const pmName = name ?? detectPackageManager();
|
|
12
|
+
const pm = implementations.get(pmName);
|
|
13
|
+
if (!pm) {
|
|
14
|
+
throw new Error(
|
|
15
|
+
`No package manager implementation registered for "${pmName}". Ensure registerPackageManager() has been called before getPackageManager().`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
return pm;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// src/lib/initCwd.ts
|
|
22
|
+
function INIT_CWD() {
|
|
23
|
+
return process.env.INIT_CWD ?? process.cwd();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// src/lib/generateReadmeFiles.ts
|
|
27
|
+
import { execFile } from "child_process";
|
|
28
|
+
import FS, { readFileSync } from "fs";
|
|
29
|
+
import {
|
|
30
|
+
mkdir,
|
|
31
|
+
readFile,
|
|
32
|
+
writeFile
|
|
33
|
+
} from "fs/promises";
|
|
34
|
+
import { createRequire } from "module";
|
|
35
|
+
import PATH from "path";
|
|
36
|
+
import { createInterface } from "readline";
|
|
37
|
+
import { promisify } from "util";
|
|
38
|
+
import chalk from "chalk";
|
|
39
|
+
var execFileAsync = promisify(execFile);
|
|
40
|
+
var require2 = createRequire(import.meta.url);
|
|
41
|
+
var packageRoot = PATH.dirname(require2.resolve("@xylabs/ts-scripts-common/package.json"));
|
|
42
|
+
var readmeTemplatesDir = PATH.resolve(packageRoot, "templates", "readme");
|
|
43
|
+
var DEFAULT_README_TEMPLATE = readFileSync(PATH.resolve(readmeTemplatesDir, "README.template.md"), "utf8");
|
|
44
|
+
var DEFAULT_README_BODY = readFileSync(PATH.resolve(readmeTemplatesDir, "README.body.md"), "utf8");
|
|
45
|
+
function resolveTemplatePath(templatePath) {
|
|
46
|
+
const cwd = INIT_CWD();
|
|
47
|
+
return templatePath ?? PATH.join(cwd, ".xy", "README.template.md");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/lib/loadConfig.ts
|
|
51
|
+
import chalk2 from "chalk";
|
|
52
|
+
import { cosmiconfig } from "cosmiconfig";
|
|
53
|
+
import { TypeScriptLoader } from "cosmiconfig-typescript-loader";
|
|
54
|
+
import deepmerge from "deepmerge";
|
|
55
|
+
var config;
|
|
56
|
+
var rootConfigPath;
|
|
57
|
+
function createExplorer() {
|
|
58
|
+
return cosmiconfig("xy", { cache: true, loaders: { ".ts": TypeScriptLoader() } });
|
|
59
|
+
}
|
|
60
|
+
var loadConfig = async (params) => {
|
|
61
|
+
if (config === void 0) {
|
|
62
|
+
const cosmicConfigResult = await createExplorer().search();
|
|
63
|
+
config = cosmicConfigResult?.config ?? {};
|
|
64
|
+
rootConfigPath = cosmicConfigResult?.filepath;
|
|
65
|
+
const configFilePath = cosmicConfigResult?.filepath;
|
|
66
|
+
if (configFilePath !== void 0) {
|
|
67
|
+
console.log(chalk2.green(`Loaded config from ${configFilePath}`));
|
|
68
|
+
if (config.verbose) {
|
|
69
|
+
console.log(chalk2.gray(`${JSON.stringify(config, null, 2)}`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return deepmerge(config, params ?? {});
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// src/actions/readme-lint.ts
|
|
77
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
|
|
78
|
+
import PATH2 from "path";
|
|
79
|
+
import chalk3 from "chalk";
|
|
80
|
+
function lintTemplate(cwd) {
|
|
81
|
+
const result = { errors: [], warnings: [] };
|
|
82
|
+
const templatePath = resolveTemplatePath();
|
|
83
|
+
if (!existsSync2(templatePath)) {
|
|
84
|
+
result.errors.push('Missing .xy/README.template.md (run "xy readme init" to create)');
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
const template = readFileSync2(templatePath, "utf8");
|
|
88
|
+
if (!template.includes("{{body}}")) {
|
|
89
|
+
result.warnings.push(".xy/README.template.md does not contain a {{body}} placeholder");
|
|
90
|
+
}
|
|
91
|
+
if (!template.includes("{{description}}")) {
|
|
92
|
+
result.warnings.push(".xy/README.template.md does not contain a {{description}} placeholder");
|
|
93
|
+
}
|
|
94
|
+
const bodyPath = PATH2.join(cwd, ".xy", "README.body.md");
|
|
95
|
+
if (!existsSync2(bodyPath)) {
|
|
96
|
+
result.errors.push('Missing .xy/README.body.md (run "xy readme init" to create)');
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
function lintLogoConfig(cwd, config2) {
|
|
101
|
+
const result = { errors: [], warnings: [] };
|
|
102
|
+
const templatePath = resolveTemplatePath();
|
|
103
|
+
if (existsSync2(templatePath)) {
|
|
104
|
+
const template = readFileSync2(templatePath, "utf8");
|
|
105
|
+
const logoRef = /\[logo]: (.+)/.exec(template);
|
|
106
|
+
if (logoRef?.[1].includes("example.com")) {
|
|
107
|
+
result.warnings.push(".xy/README.template.md still has the example.com logo placeholder \u2014 update it or set readme.logoUrl in xy.config.ts");
|
|
108
|
+
} else if (!logoRef && !config2.readme?.logoUrl) {
|
|
109
|
+
result.warnings.push("No logo URL configured in xy.config.ts (readme.logoUrl) or template");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (!config2.readme?.logoUrl && !config2.readme?.logoLinkUrl) {
|
|
113
|
+
result.warnings.push("No readme.logoUrl or readme.logoLinkUrl configured in xy.config.ts");
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
function lintPackages(cwd) {
|
|
118
|
+
const result = { errors: [], warnings: [] };
|
|
119
|
+
const pm = getPackageManager();
|
|
120
|
+
const workspaces = pm.listWorkspaces();
|
|
121
|
+
for (const { location, name } of workspaces) {
|
|
122
|
+
if (location === ".") continue;
|
|
123
|
+
const pkgPath = PATH2.join(cwd, location, "package.json");
|
|
124
|
+
try {
|
|
125
|
+
const pkg = JSON.parse(readFileSync2(pkgPath, "utf8"));
|
|
126
|
+
if (pkg.private) continue;
|
|
127
|
+
if (!pkg.description) {
|
|
128
|
+
result.warnings.push(`${name} is missing a "description" in package.json`);
|
|
129
|
+
}
|
|
130
|
+
const readmePath = PATH2.join(cwd, location, "README.md");
|
|
131
|
+
if (!existsSync2(readmePath)) {
|
|
132
|
+
result.errors.push(`${name} is missing README.md`);
|
|
133
|
+
}
|
|
134
|
+
} catch {
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
function readmeLint({ config: config2, verbose }) {
|
|
140
|
+
const cwd = INIT_CWD();
|
|
141
|
+
console.log(chalk3.green("Readme Lint"));
|
|
142
|
+
const checks = [
|
|
143
|
+
lintTemplate(cwd),
|
|
144
|
+
lintLogoConfig(cwd, config2),
|
|
145
|
+
lintPackages(cwd)
|
|
146
|
+
];
|
|
147
|
+
let errorCount = 0;
|
|
148
|
+
let warningCount = 0;
|
|
149
|
+
for (const { errors, warnings } of checks) {
|
|
150
|
+
for (const error of errors) {
|
|
151
|
+
console.log(chalk3.red(` \u2717 ${error}`));
|
|
152
|
+
errorCount++;
|
|
153
|
+
}
|
|
154
|
+
for (const warning of warnings) {
|
|
155
|
+
console.log(chalk3.yellow(` \u26A0 ${warning}`));
|
|
156
|
+
warningCount++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (errorCount === 0 && warningCount === 0) {
|
|
160
|
+
console.log(chalk3.green(" All checks passed"));
|
|
161
|
+
} else {
|
|
162
|
+
if (verbose) {
|
|
163
|
+
console.log(chalk3.gray(` ${errorCount} error(s), ${warningCount} warning(s)`));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return errorCount > 0 ? 1 : 0;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// src/xy/common/readme/lintCommand.ts
|
|
170
|
+
var lintCommand = {
|
|
171
|
+
command: "lint",
|
|
172
|
+
describe: "Check for missing readme templates, body files, logos, and descriptions",
|
|
173
|
+
handler: async (argv) => {
|
|
174
|
+
const config2 = await loadConfig();
|
|
175
|
+
process.exitCode = readmeLint({ config: config2, verbose: !!argv.verbose });
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
export {
|
|
179
|
+
lintCommand
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=lintCommand.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/pm/detectPackageManager.ts","../../../../src/pm/registry.ts","../../../../src/lib/initCwd.ts","../../../../src/lib/generateReadmeFiles.ts","../../../../src/lib/loadConfig.ts","../../../../src/actions/readme-lint.ts","../../../../src/xy/common/readme/lintCommand.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 type { PackageManagerName } from './detectPackageManager.ts'\nimport { detectPackageManager } from './detectPackageManager.ts'\nimport type { PackageManager } from './PackageManager.ts'\n\nconst implementations = new Map<PackageManagerName, PackageManager>()\n\nexport function registerPackageManager(pm: PackageManager): void {\n implementations.set(pm.name, pm)\n}\n\nexport function getPackageManager(name?: PackageManagerName): PackageManager {\n const pmName = name ?? detectPackageManager()\n const pm = implementations.get(pmName)\n if (!pm) {\n throw new Error(\n `No package manager implementation registered for \"${pmName}\". `\n + 'Ensure registerPackageManager() has been called before getPackageManager().',\n )\n }\n return pm\n}\n","export function INIT_CWD(): string {\n return process.env.INIT_CWD ?? process.cwd()\n}\n","import { execFile } from 'node:child_process'\nimport FS, { readFileSync } from 'node:fs'\nimport {\n mkdir, readFile, writeFile,\n} from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport PATH from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { promisify } from 'node:util'\n\nimport chalk from 'chalk'\n\nimport { detectPackageManager, getPackageManager } from '../pm/index.ts'\nimport { fillTemplate } from './fillTemplate.ts'\nimport { INIT_CWD } from './initCwd.ts'\n\nconst execFileAsync = promisify(execFile)\n\nconst require = createRequire(import.meta.url)\nconst packageRoot = PATH.dirname(require.resolve('@xylabs/ts-scripts-common/package.json'))\nconst readmeTemplatesDir = PATH.resolve(packageRoot, 'templates', 'readme')\n\ninterface GenerateReadmeFilesParams {\n jobs: number\n logoLinkUrl?: string\n logoUrl?: string\n pkg?: string\n templatePath?: string\n typedoc?: boolean\n verbose?: boolean\n}\n\nfunction fillReadmeTemplate(template: string, data: Record<string, string>): string {\n const additionalData: Record<string, string> = { ...data, safeName: data.name.replaceAll('/', '__').replaceAll('@', '') }\n return fillTemplate(template, additionalData)\n}\n\nasync function generateTypedoc(packageLocation: string, entryPoints: string[]): Promise<string> {\n const tempDir = PATH.join(packageLocation, '.temp-typedoc')\n\n try {\n if (!FS.existsSync(tempDir)) {\n FS.mkdirSync(tempDir, { recursive: true })\n }\n\n const typedocConfig = {\n disableSources: true,\n entryPointStrategy: 'expand',\n entryPoints: entryPoints.map(ep => PATH.resolve(packageLocation, ep)),\n excludeExternals: true,\n excludeInternal: true,\n excludePrivate: true,\n githubPages: false,\n hideBreadcrumbs: true,\n hideGenerator: true,\n hidePageTitle: true,\n out: tempDir,\n plugin: ['typedoc-plugin-markdown'],\n readme: 'none',\n skipErrorChecking: true,\n sort: ['source-order'],\n theme: 'markdown',\n useCodeBlocks: true,\n }\n\n const typedocJsonPath = PATH.join(tempDir, 'typedoc.json')\n FS.writeFileSync(typedocJsonPath, JSON.stringify(typedocConfig, null, 2))\n\n try {\n await execFileAsync('npx', ['typedoc', '--options', typedocJsonPath], { cwd: process.cwd() })\n } catch {\n return ''\n }\n\n return consolidateMarkdown(tempDir)\n } catch {\n return ''\n } finally {\n try {\n FS.rmSync(tempDir, { force: true, recursive: true })\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\nfunction consolidateMarkdown(tempDir: string): string {\n let consolidated = '## Reference\\n\\n'\n\n const mainReadmePath = PATH.join(tempDir, 'README.md')\n if (FS.existsSync(mainReadmePath)) {\n const mainContent = FS.readFileSync(mainReadmePath, 'utf8')\n .replace(/^---(.|\\n)*?---\\n/, '')\n .replace(/^# .+\\n/, '')\n .replaceAll(/\\]\\((.+?)\\.md\\)/g, '](#$1)')\n\n consolidated += mainContent + '\\n\\n'\n }\n\n consolidated += processDirectory(tempDir)\n\n return consolidated\n .replaceAll(/\\n\\n\\n+/g, '\\n\\n')\n .replaceAll(/^#### /gm, '### ')\n .replaceAll(/^##### /gm, '#### ')\n .replaceAll(/^###### /gm, '##### ')\n}\n\nfunction processDirectory(dir: string, level = 0): string {\n const indent = ' '.repeat(level)\n let content = ''\n\n try {\n const items = FS.readdirSync(dir, { withFileTypes: true })\n\n for (const item of items) {\n if (item.isDirectory()) continue\n if (item.name === 'README.md' || !item.name.endsWith('.md')) continue\n\n const fileContent = FS.readFileSync(PATH.join(dir, item.name), 'utf8')\n .replace(/^---(.|\\n)*?---\\n/, '')\n const moduleName = item.name.replace('.md', '')\n\n content += `\\n\\n${indent}### <a id=\"${moduleName}\"></a>${moduleName}\\n\\n`\n content += fileContent\n .replace(/^# .+\\n/, '')\n .replaceAll(/\\]\\((.+?)\\.md\\)/g, '](#$1)')\n }\n\n for (const item of items) {\n if (!item.isDirectory()) continue\n if (item.name === 'spec' || item.name.includes('.spec')) continue\n\n content += `\\n\\n${indent}### ${item.name}\\n`\n content += processDirectory(PATH.join(dir, item.name), level + 1)\n }\n } catch {\n // skip unreadable directories\n }\n\n return content\n}\n\nfunction askConfirmation(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes')\n })\n })\n}\n\nexport const DEFAULT_README_TEMPLATE = readFileSync(PATH.resolve(readmeTemplatesDir, 'README.template.md'), 'utf8')\nexport const DEFAULT_README_BODY = readFileSync(PATH.resolve(readmeTemplatesDir, 'README.body.md'), 'utf8')\n\nexport function applyLogoConfig(template: string, logoUrl?: string, logoLinkUrl?: string): string {\n let result = template\n if (logoUrl) {\n result = result.replace(/\\[logo]: .+/, `[logo]: ${logoUrl}`)\n if (logoLinkUrl) {\n result = result.replace(/\\[!\\[logo]\\[]][^)]*\\)/, `[![logo][]](${logoLinkUrl})`)\n }\n } else {\n result = result.replace(/\\[!\\[logo]\\[]][^\\n]*\\n*/, '')\n result = result.replace(/\\[logo]: [^\\n]*\\n?/, '')\n }\n return result\n}\n\nexport function resolveTemplatePath(templatePath?: string): string {\n const cwd = INIT_CWD()\n return templatePath ?? PATH.join(cwd, '.xy', 'README.template.md')\n}\n\nasync function loadOrCreateTemplate(resolvedTemplatePath: string): Promise<{\n created: boolean\n template: string\n}> {\n try {\n const template = await readFile(resolvedTemplatePath, 'utf8')\n return { created: false, template }\n } catch {\n console.log(chalk.yellow(`Template not found: ${resolvedTemplatePath}`))\n const shouldCreate = await askConfirmation('Would you like to create a stock template? (y/N) ')\n if (!shouldCreate) {\n throw new Error('Template creation declined')\n }\n const template = DEFAULT_README_TEMPLATE\n await scaffoldTemplate(resolvedTemplatePath, template)\n return { created: true, template }\n }\n}\n\nexport async function scaffoldTemplate(resolvedTemplatePath: string, template: string): Promise<void> {\n const xyDir = PATH.dirname(resolvedTemplatePath)\n await mkdir(xyDir, { recursive: true })\n await writeFile(resolvedTemplatePath, template)\n console.log(chalk.green(`Created template: ${resolvedTemplatePath}`))\n const bodyPath = PATH.join(xyDir, 'README.body.md')\n await writeFile(bodyPath, DEFAULT_README_BODY)\n console.log(chalk.green(`Created body template: ${bodyPath}`))\n}\n\nasync function resolveBody(location: string, defaultBody: string): Promise<string> {\n const localBodyPath = PATH.join(location, 'README.body.md')\n try {\n return await readFile(localBodyPath, 'utf8')\n } catch {\n return defaultBody\n }\n}\n\nasync function generateReadmeForWorkspace(\n location: string,\n name: string,\n template: string,\n defaultBody: string,\n typedoc: boolean,\n verbose: boolean,\n pm: string,\n): Promise<boolean> {\n try {\n const pkgJsonPath = PATH.join(location, 'package.json')\n const pkgJson = JSON.parse(await readFile(pkgJsonPath, 'utf8')) as Record<string, string>\n const body = await resolveBody(location, defaultBody)\n const typedocContent = typedoc ? await generateTypedoc(location, ['src/index*.ts']) : ''\n const readmeContent = fillReadmeTemplate(template, {\n ...pkgJson, body, pm, typedoc: typedocContent,\n })\n await writeFile(PATH.join(location, 'README.md'), readmeContent)\n if (verbose) console.log(chalk.green(` ${name}`))\n return true\n } catch (ex) {\n const error = ex as Error\n console.warn(chalk.yellow(` Skipped ${location}: ${error.message}`))\n return false\n }\n}\n\nimport {\n installOutputCapture, outputStorage, runWithConcurrency,\n} from './concurrency.ts'\n\ninterface CapturedResult {\n output: string[]\n success: boolean\n}\n\nasync function loadDefaultBody(resolvedTemplatePath: string): Promise<string> {\n const xyBodyPath = PATH.join(PATH.dirname(resolvedTemplatePath), 'README.body.md')\n try {\n return await readFile(xyBodyPath, 'utf8')\n } catch {\n return DEFAULT_README_BODY\n }\n}\n\nfunction flushResults(results: CapturedResult[]): boolean {\n let failed = false\n for (const { output, success } of results) {\n for (const line of output) {\n process.stdout.write(line)\n }\n if (!success) failed = true\n }\n return failed\n}\n\nexport async function generateReadmeFiles({\n jobs, logoLinkUrl, logoUrl, pkg, templatePath, typedoc = false, verbose = false,\n}: GenerateReadmeFilesParams): Promise<number> {\n console.log(chalk.green('Generate README Files'))\n const resolvedTemplatePath = resolveTemplatePath(templatePath)\n\n let template: string\n let templateCreated: boolean\n try {\n ({ template, created: templateCreated } = await loadOrCreateTemplate(resolvedTemplatePath))\n } catch {\n return 1\n }\n\n template = applyLogoConfig(template, logoUrl, logoLinkUrl)\n\n if (templateCreated) {\n console.log(chalk.green('Generating README files for all packages...'))\n }\n\n const defaultBody = await loadDefaultBody(resolvedTemplatePath)\n const pmName = detectPackageManager()\n const pm = getPackageManager()\n const singleWorkspace = pkg && !templateCreated ? pm.findWorkspace(pkg) : undefined\n const workspaces = singleWorkspace ? [singleWorkspace] : pm.listWorkspaces()\n const concurrency = jobs\n const results: CapturedResult[] = Array.from({ length: workspaces.length }, () => ({ output: [], success: true }))\n\n installOutputCapture()\n\n const start = performance.now()\n\n await runWithConcurrency(\n workspaces.map((ws, i) => ({ i, ws })),\n concurrency,\n async ({ i, ws }) => {\n const output: string[] = []\n await outputStorage.run(output, async () => {\n const success = await generateReadmeForWorkspace(ws.location, ws.name, template, defaultBody, typedoc, verbose, pmName)\n results[i] = { output, success }\n })\n },\n )\n\n const failed = flushResults(results)\n const ms = performance.now() - start\n console.log(chalk.blue(`Generated ${workspaces.length} README(s) in ${ms.toFixed(0)}ms`))\n\n return failed ? 1 : 0\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 { existsSync, readFileSync } from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport { INIT_CWD, resolveTemplatePath } from '../lib/index.ts'\nimport { getPackageManager } from '../pm/index.ts'\nimport type { XyConfig } from './package/index.ts'\n\ninterface ReadmeLintResult {\n errors: string[]\n warnings: string[]\n}\n\nfunction lintTemplate(cwd: string): ReadmeLintResult {\n const result: ReadmeLintResult = { errors: [], warnings: [] }\n const templatePath = resolveTemplatePath()\n\n if (!existsSync(templatePath)) {\n result.errors.push('Missing .xy/README.template.md (run \"xy readme init\" to create)')\n return result\n }\n\n const template = readFileSync(templatePath, 'utf8')\n\n if (!template.includes('{{body}}')) {\n result.warnings.push('.xy/README.template.md does not contain a {{body}} placeholder')\n }\n if (!template.includes('{{description}}')) {\n result.warnings.push('.xy/README.template.md does not contain a {{description}} placeholder')\n }\n\n const bodyPath = PATH.join(cwd, '.xy', 'README.body.md')\n if (!existsSync(bodyPath)) {\n result.errors.push('Missing .xy/README.body.md (run \"xy readme init\" to create)')\n }\n\n return result\n}\n\nfunction lintLogoConfig(cwd: string, config: XyConfig): ReadmeLintResult {\n const result: ReadmeLintResult = { errors: [], warnings: [] }\n const templatePath = resolveTemplatePath()\n\n if (existsSync(templatePath)) {\n const template = readFileSync(templatePath, 'utf8')\n const logoRef = /\\[logo]: (.+)/.exec(template)\n if (logoRef?.[1].includes('example.com')) {\n result.warnings.push('.xy/README.template.md still has the example.com logo placeholder — update it or set readme.logoUrl in xy.config.ts')\n } else if (!logoRef && !config.readme?.logoUrl) {\n result.warnings.push('No logo URL configured in xy.config.ts (readme.logoUrl) or template')\n }\n }\n\n if (!config.readme?.logoUrl && !config.readme?.logoLinkUrl) {\n result.warnings.push('No readme.logoUrl or readme.logoLinkUrl configured in xy.config.ts')\n }\n\n return result\n}\n\nfunction lintPackages(cwd: string): ReadmeLintResult {\n const result: ReadmeLintResult = { errors: [], warnings: [] }\n const pm = getPackageManager()\n const workspaces = pm.listWorkspaces()\n\n for (const { location, name } of workspaces) {\n if (location === '.') continue\n\n const pkgPath = PATH.join(cwd, location, 'package.json')\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n\n if (pkg.private) continue\n\n if (!pkg.description) {\n result.warnings.push(`${name} is missing a \"description\" in package.json`)\n }\n\n const readmePath = PATH.join(cwd, location, 'README.md')\n if (!existsSync(readmePath)) {\n result.errors.push(`${name} is missing README.md`)\n }\n } catch {\n // skip unreadable packages\n }\n }\n\n return result\n}\n\nexport interface ReadmeLintParams {\n config: XyConfig\n verbose?: boolean\n}\n\nexport function readmeLint({ config, verbose }: ReadmeLintParams): number {\n const cwd = INIT_CWD()\n console.log(chalk.green('Readme Lint'))\n\n const checks = [\n lintTemplate(cwd),\n lintLogoConfig(cwd, config),\n lintPackages(cwd),\n ]\n\n let errorCount = 0\n let warningCount = 0\n\n for (const { errors, warnings } of checks) {\n for (const error of errors) {\n console.log(chalk.red(` ✗ ${error}`))\n errorCount++\n }\n for (const warning of warnings) {\n console.log(chalk.yellow(` ⚠ ${warning}`))\n warningCount++\n }\n }\n\n if (errorCount === 0 && warningCount === 0) {\n console.log(chalk.green(' All checks passed'))\n } else {\n if (verbose) {\n console.log(chalk.gray(` ${errorCount} error(s), ${warningCount} warning(s)`))\n }\n }\n\n return errorCount > 0 ? 1 : 0\n}\n","import type { CommandModule } from 'yargs'\n\nimport type { XyConfig } from '../../../actions/index.ts'\nimport { readmeLint } from '../../../actions/index.ts'\nimport { loadConfig } from '../../../lib/index.ts'\n\nexport const lintCommand: CommandModule = {\n command: 'lint',\n describe: 'Check for missing readme templates, body files, logos, and descriptions',\n handler: async (argv) => {\n const config = await loadConfig<XyConfig>()\n process.exitCode = readmeLint({ config, verbose: !!argv.verbose })\n },\n}\n"],"mappings":"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","names":["require","chalk","chalk","existsSync","readFileSync","PATH","chalk","existsSync","readFileSync","PATH","config","chalk","config"]}
|