@tspub-dev/tspub 0.1.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/LICENSE +21 -0
- package/README.md +495 -0
- package/dist/bin/tspub.d.cts +4 -0
- package/dist/bin/tspub.d.ts +3 -0
- package/dist/bin/tspub.js +1308 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-TNGZXD6W.js +9113 -0
- package/dist/index.d.cts +70 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.js +72 -0
- package/dist/src/builder/changelog-conventional.d.cts +12 -0
- package/dist/src/builder/changelog-conventional.d.ts +11 -0
- package/dist/src/builder/changelog.d.cts +4 -0
- package/dist/src/builder/changelog.d.ts +3 -0
- package/dist/src/builder/cjs-interop.d.cts +4 -0
- package/dist/src/builder/cjs-interop.d.ts +3 -0
- package/dist/src/builder/dts-bundle.d.cts +19 -0
- package/dist/src/builder/dts-bundle.d.ts +18 -0
- package/dist/src/builder/dts.d.cts +9 -0
- package/dist/src/builder/dts.d.ts +8 -0
- package/dist/src/builder/entry-inference.d.cts +4 -0
- package/dist/src/builder/entry-inference.d.ts +3 -0
- package/dist/src/builder/esbuild-builder.d.cts +49 -0
- package/dist/src/builder/esbuild-builder.d.ts +48 -0
- package/dist/src/builder/externals.d.cts +18 -0
- package/dist/src/builder/externals.d.ts +17 -0
- package/dist/src/builder/index.d.cts +52 -0
- package/dist/src/builder/index.d.ts +51 -0
- package/dist/src/builder/plugins.d.cts +26 -0
- package/dist/src/builder/plugins.d.ts +25 -0
- package/dist/src/builder/public-dir.d.cts +7 -0
- package/dist/src/builder/public-dir.d.ts +6 -0
- package/dist/src/builder/shims-plugin.d.cts +4 -0
- package/dist/src/builder/shims-plugin.d.ts +3 -0
- package/dist/src/builder/size-report.d.cts +12 -0
- package/dist/src/builder/size-report.d.ts +11 -0
- package/dist/src/changeset/dependent-bumping.d.cts +9 -0
- package/dist/src/changeset/dependent-bumping.d.ts +8 -0
- package/dist/src/changeset/index.d.cts +9 -0
- package/dist/src/changeset/index.d.ts +8 -0
- package/dist/src/changeset/parser.d.cts +5 -0
- package/dist/src/changeset/parser.d.ts +4 -0
- package/dist/src/changeset/snapshot.d.cts +3 -0
- package/dist/src/changeset/snapshot.d.ts +2 -0
- package/dist/src/changeset/types.d.cts +22 -0
- package/dist/src/changeset/types.d.ts +21 -0
- package/dist/src/changeset/version.d.cts +23 -0
- package/dist/src/changeset/version.d.ts +22 -0
- package/dist/src/changeset/writer.d.cts +4 -0
- package/dist/src/changeset/writer.d.ts +3 -0
- package/dist/src/checker/browser.d.cts +29 -0
- package/dist/src/checker/browser.d.ts +28 -0
- package/dist/src/checker/formatter.d.cts +11 -0
- package/dist/src/checker/formatter.d.ts +10 -0
- package/dist/src/checker/framework/context.d.cts +9 -0
- package/dist/src/checker/framework/context.d.ts +8 -0
- package/dist/src/checker/framework/runner.d.cts +20 -0
- package/dist/src/checker/framework/runner.d.ts +19 -0
- package/dist/src/checker/framework/types.d.cts +42 -0
- package/dist/src/checker/framework/types.d.ts +41 -0
- package/dist/src/checker/index.d.cts +25 -0
- package/dist/src/checker/index.d.ts +24 -0
- package/dist/src/checker/plugins.d.cts +8 -0
- package/dist/src/checker/plugins.d.ts +7 -0
- package/dist/src/checker/profiles.d.cts +19 -0
- package/dist/src/checker/profiles.d.ts +18 -0
- package/dist/src/checker/rules/exports/browser-conflict.d.cts +4 -0
- package/dist/src/checker/rules/exports/browser-conflict.d.ts +3 -0
- package/dist/src/checker/rules/exports/browser-value-conflict.d.cts +4 -0
- package/dist/src/checker/rules/exports/browser-value-conflict.d.ts +3 -0
- package/dist/src/checker/rules/exports/cjs-default-export.d.cts +4 -0
- package/dist/src/checker/rules/exports/cjs-default-export.d.ts +3 -0
- package/dist/src/checker/rules/exports/cjs-esmodule-interop.d.cts +4 -0
- package/dist/src/checker/rules/exports/cjs-esmodule-interop.d.ts +3 -0
- package/dist/src/checker/rules/exports/condition-types.d.cts +4 -0
- package/dist/src/checker/rules/exports/condition-types.d.ts +3 -0
- package/dist/src/checker/rules/exports/default-last.d.cts +4 -0
- package/dist/src/checker/rules/exports/default-last.d.ts +3 -0
- package/dist/src/checker/rules/exports/dot-entry.d.cts +4 -0
- package/dist/src/checker/rules/exports/dot-entry.d.ts +3 -0
- package/dist/src/checker/rules/exports/esm-main-no-exports.d.cts +10 -0
- package/dist/src/checker/rules/exports/esm-main-no-exports.d.ts +9 -0
- package/dist/src/checker/rules/exports/exports-field.d.cts +4 -0
- package/dist/src/checker/rules/exports/exports-field.d.ts +3 -0
- package/dist/src/checker/rules/exports/fallback-array.d.cts +4 -0
- package/dist/src/checker/rules/exports/fallback-array.d.ts +3 -0
- package/dist/src/checker/rules/exports/file-exists.d.cts +4 -0
- package/dist/src/checker/rules/exports/file-exists.d.ts +3 -0
- package/dist/src/checker/rules/exports/file-not-published.d.cts +4 -0
- package/dist/src/checker/rules/exports/file-not-published.d.ts +3 -0
- package/dist/src/checker/rules/exports/format-mismatch.d.cts +4 -0
- package/dist/src/checker/rules/exports/format-mismatch.d.ts +3 -0
- package/dist/src/checker/rules/exports/glob-matched-files.d.cts +4 -0
- package/dist/src/checker/rules/exports/glob-matched-files.d.ts +3 -0
- package/dist/src/checker/rules/exports/import-condition.d.cts +4 -0
- package/dist/src/checker/rules/exports/import-condition.d.ts +3 -0
- package/dist/src/checker/rules/exports/imports-field.d.cts +4 -0
- package/dist/src/checker/rules/exports/imports-field.d.ts +3 -0
- package/dist/src/checker/rules/exports/imports-key-invalid.d.cts +4 -0
- package/dist/src/checker/rules/exports/imports-key-invalid.d.ts +3 -0
- package/dist/src/checker/rules/exports/jsx-extensions.d.cts +4 -0
- package/dist/src/checker/rules/exports/jsx-extensions.d.ts +3 -0
- package/dist/src/checker/rules/exports/module-before-require.d.cts +4 -0
- package/dist/src/checker/rules/exports/module-before-require.d.ts +3 -0
- package/dist/src/checker/rules/exports/module-esm-only.d.cts +4 -0
- package/dist/src/checker/rules/exports/module-esm-only.d.ts +3 -0
- package/dist/src/checker/rules/exports/module-no-exports.d.cts +10 -0
- package/dist/src/checker/rules/exports/module-no-exports.d.ts +9 -0
- package/dist/src/checker/rules/exports/no-deprecated-subpath-mapping.d.cts +4 -0
- package/dist/src/checker/rules/exports/no-deprecated-subpath-mapping.d.ts +3 -0
- package/dist/src/checker/rules/exports/type-module.d.cts +4 -0
- package/dist/src/checker/rules/exports/type-module.d.ts +3 -0
- package/dist/src/checker/rules/exports/types-first.d.cts +11 -0
- package/dist/src/checker/rules/exports/types-first.d.ts +10 -0
- package/dist/src/checker/rules/exports/types-format.d.cts +4 -0
- package/dist/src/checker/rules/exports/types-format.d.ts +3 -0
- package/dist/src/checker/rules/exports/types-not-exported.d.cts +11 -0
- package/dist/src/checker/rules/exports/types-not-exported.d.ts +10 -0
- package/dist/src/checker/rules/exports/types-order.d.cts +4 -0
- package/dist/src/checker/rules/exports/types-order.d.ts +3 -0
- package/dist/src/checker/rules/exports/value-invalid.d.cts +4 -0
- package/dist/src/checker/rules/exports/value-invalid.d.ts +3 -0
- package/dist/src/checker/rules/files/all-files-format.d.cts +4 -0
- package/dist/src/checker/rules/files/all-files-format.d.ts +3 -0
- package/dist/src/checker/rules/files/bin-executable.d.cts +10 -0
- package/dist/src/checker/rules/files/bin-executable.d.ts +9 -0
- package/dist/src/checker/rules/files/bin-shebang.d.cts +4 -0
- package/dist/src/checker/rules/files/bin-shebang.d.ts +3 -0
- package/dist/src/checker/rules/files/duplicate-dep.d.cts +4 -0
- package/dist/src/checker/rules/files/duplicate-dep.d.ts +3 -0
- package/dist/src/checker/rules/files/files-field.d.cts +4 -0
- package/dist/src/checker/rules/files/files-field.d.ts +3 -0
- package/dist/src/checker/rules/files/format-validation.d.cts +12 -0
- package/dist/src/checker/rules/files/format-validation.d.ts +11 -0
- package/dist/src/checker/rules/files/implicit-index-format.d.cts +13 -0
- package/dist/src/checker/rules/files/implicit-index-format.d.ts +12 -0
- package/dist/src/checker/rules/files/local-dependency.d.cts +4 -0
- package/dist/src/checker/rules/files/local-dependency.d.ts +3 -0
- package/dist/src/checker/rules/files/prepublish.d.cts +4 -0
- package/dist/src/checker/rules/files/prepublish.d.ts +3 -0
- package/dist/src/checker/rules/files/sensitive.d.cts +4 -0
- package/dist/src/checker/rules/files/sensitive.d.ts +3 -0
- package/dist/src/checker/rules/imports/default-last.d.cts +4 -0
- package/dist/src/checker/rules/imports/default-last.d.ts +3 -0
- package/dist/src/checker/rules/imports/fallback-array.d.cts +4 -0
- package/dist/src/checker/rules/imports/fallback-array.d.ts +3 -0
- package/dist/src/checker/rules/imports/glob-matched-files.d.cts +4 -0
- package/dist/src/checker/rules/imports/glob-matched-files.d.ts +3 -0
- package/dist/src/checker/rules/imports/module-before-require.d.cts +4 -0
- package/dist/src/checker/rules/imports/module-before-require.d.ts +3 -0
- package/dist/src/checker/rules/imports/module-esm-only.d.cts +4 -0
- package/dist/src/checker/rules/imports/module-esm-only.d.ts +3 -0
- package/dist/src/checker/rules/imports/no-deprecated-subpath.d.cts +4 -0
- package/dist/src/checker/rules/imports/no-deprecated-subpath.d.ts +3 -0
- package/dist/src/checker/rules/index.d.cts +4 -0
- package/dist/src/checker/rules/index.d.ts +3 -0
- package/dist/src/checker/rules/metadata/deprecated-fields.d.cts +4 -0
- package/dist/src/checker/rules/metadata/deprecated-fields.d.ts +3 -0
- package/dist/src/checker/rules/metadata/engines.d.cts +4 -0
- package/dist/src/checker/rules/metadata/engines.d.ts +3 -0
- package/dist/src/checker/rules/metadata/field-value-type.d.cts +4 -0
- package/dist/src/checker/rules/metadata/field-value-type.d.ts +3 -0
- package/dist/src/checker/rules/metadata/license-file.d.cts +4 -0
- package/dist/src/checker/rules/metadata/license-file.d.ts +3 -0
- package/dist/src/checker/rules/metadata/license.d.cts +4 -0
- package/dist/src/checker/rules/metadata/license.d.ts +3 -0
- package/dist/src/checker/rules/metadata/module-esm.d.cts +4 -0
- package/dist/src/checker/rules/metadata/module-esm.d.ts +3 -0
- package/dist/src/checker/rules/metadata/peer-dep-conflict.d.cts +4 -0
- package/dist/src/checker/rules/metadata/peer-dep-conflict.d.ts +3 -0
- package/dist/src/checker/rules/metadata/repository-format.d.cts +13 -0
- package/dist/src/checker/rules/metadata/repository-format.d.ts +12 -0
- package/dist/src/checker/rules/metadata/repository.d.cts +4 -0
- package/dist/src/checker/rules/metadata/repository.d.ts +3 -0
- package/dist/src/checker/rules/metadata/side-effects.d.cts +4 -0
- package/dist/src/checker/rules/metadata/side-effects.d.ts +3 -0
- package/dist/src/checker/rules/metadata/use-exports-browser.d.cts +4 -0
- package/dist/src/checker/rules/metadata/use-exports-browser.d.ts +3 -0
- package/dist/src/checker/rules/size/package-size.d.cts +4 -0
- package/dist/src/checker/rules/size/package-size.d.ts +3 -0
- package/dist/src/checker/rules/types/cjs-resolves-esm.d.cts +15 -0
- package/dist/src/checker/rules/types/cjs-resolves-esm.d.ts +14 -0
- package/dist/src/checker/rules/types/declaration-completeness.d.cts +4 -0
- package/dist/src/checker/rules/types/declaration-completeness.d.ts +3 -0
- package/dist/src/checker/rules/types/declaration.d.cts +4 -0
- package/dist/src/checker/rules/types/declaration.d.ts +3 -0
- package/dist/src/checker/rules/types/esm-dynamic-only.d.cts +11 -0
- package/dist/src/checker/rules/types/esm-dynamic-only.d.ts +10 -0
- package/dist/src/checker/rules/types/false-cjs-esm.d.cts +13 -0
- package/dist/src/checker/rules/types/false-cjs-esm.d.ts +12 -0
- package/dist/src/checker/rules/types/false-export-default.d.cts +11 -0
- package/dist/src/checker/rules/types/false-export-default.d.ts +10 -0
- package/dist/src/checker/rules/types/isolated-modules.d.cts +4 -0
- package/dist/src/checker/rules/types/isolated-modules.d.ts +3 -0
- package/dist/src/checker/rules/types/missing-export-equals.d.cts +11 -0
- package/dist/src/checker/rules/types/missing-export-equals.d.ts +10 -0
- package/dist/src/checker/rules/types/module-resolution.d.cts +4 -0
- package/dist/src/checker/rules/types/module-resolution.d.ts +3 -0
- package/dist/src/checker/rules/types/module.d.cts +4 -0
- package/dist/src/checker/rules/types/module.d.ts +3 -0
- package/dist/src/checker/rules/types/no-any-export.d.cts +4 -0
- package/dist/src/checker/rules/types/no-any-export.d.ts +3 -0
- package/dist/src/checker/rules/types/resolution.d.cts +4 -0
- package/dist/src/checker/rules/types/resolution.d.ts +3 -0
- package/dist/src/checker/rules/types/strict.d.cts +4 -0
- package/dist/src/checker/rules/types/strict.d.ts +3 -0
- package/dist/src/checker/rules/types/tsconfig-exists.d.cts +4 -0
- package/dist/src/checker/rules/types/tsconfig-exists.d.ts +3 -0
- package/dist/src/checker/rules/utils/exports-traversal.d.cts +12 -0
- package/dist/src/checker/rules/utils/exports-traversal.d.ts +11 -0
- package/dist/src/checker/rules/utils/format-detection.d.cts +8 -0
- package/dist/src/checker/rules/utils/format-detection.d.ts +7 -0
- package/dist/src/checker/rules/utils/imports-traversal.d.cts +10 -0
- package/dist/src/checker/rules/utils/imports-traversal.d.ts +9 -0
- package/dist/src/cli/build.d.cts +6 -0
- package/dist/src/cli/build.d.ts +5 -0
- package/dist/src/cli/changeset.d.cts +4 -0
- package/dist/src/cli/changeset.d.ts +3 -0
- package/dist/src/cli/check.d.cts +4 -0
- package/dist/src/cli/check.d.ts +3 -0
- package/dist/src/cli/doctor.d.cts +4 -0
- package/dist/src/cli/doctor.d.ts +3 -0
- package/dist/src/cli/index.d.cts +5 -0
- package/dist/src/cli/index.d.ts +4 -0
- package/dist/src/cli/init.d.cts +4 -0
- package/dist/src/cli/init.d.ts +3 -0
- package/dist/src/cli/publish.d.cts +7 -0
- package/dist/src/cli/publish.d.ts +6 -0
- package/dist/src/cli/scan.d.cts +4 -0
- package/dist/src/cli/scan.d.ts +3 -0
- package/dist/src/cli/test-types.d.cts +4 -0
- package/dist/src/cli/test-types.d.ts +3 -0
- package/dist/src/config/index.d.cts +4 -0
- package/dist/src/config/index.d.ts +3 -0
- package/dist/src/config/loader.d.cts +6 -0
- package/dist/src/config/loader.d.ts +5 -0
- package/dist/src/config/types.d.cts +109 -0
- package/dist/src/config/types.d.ts +108 -0
- package/dist/src/doctor/environment.d.cts +13 -0
- package/dist/src/doctor/environment.d.ts +12 -0
- package/dist/src/doctor/formatter.d.cts +13 -0
- package/dist/src/doctor/formatter.d.ts +12 -0
- package/dist/src/doctor/framework/context.d.cts +5 -0
- package/dist/src/doctor/framework/context.d.ts +4 -0
- package/dist/src/doctor/framework/runner.d.cts +18 -0
- package/dist/src/doctor/framework/runner.d.ts +17 -0
- package/dist/src/doctor/framework/types.d.cts +40 -0
- package/dist/src/doctor/framework/types.d.ts +39 -0
- package/dist/src/doctor/index.d.cts +23 -0
- package/dist/src/doctor/index.d.ts +22 -0
- package/dist/src/doctor/plugins.d.cts +8 -0
- package/dist/src/doctor/plugins.d.ts +7 -0
- package/dist/src/doctor/profiles.d.cts +3 -0
- package/dist/src/doctor/profiles.d.ts +2 -0
- package/dist/src/doctor/resolution.d.cts +8 -0
- package/dist/src/doctor/resolution.d.ts +7 -0
- package/dist/src/doctor/rules/build.d.cts +6 -0
- package/dist/src/doctor/rules/build.d.ts +5 -0
- package/dist/src/doctor/rules/dependencies.d.cts +7 -0
- package/dist/src/doctor/rules/dependencies.d.ts +6 -0
- package/dist/src/doctor/rules/environment.d.cts +10 -0
- package/dist/src/doctor/rules/environment.d.ts +9 -0
- package/dist/src/doctor/rules/index.d.cts +4 -0
- package/dist/src/doctor/rules/index.d.ts +3 -0
- package/dist/src/doctor/rules/typescript.d.cts +9 -0
- package/dist/src/doctor/rules/typescript.d.ts +8 -0
- package/dist/src/publisher/framework/types.d.cts +27 -0
- package/dist/src/publisher/framework/types.d.ts +26 -0
- package/dist/src/publisher/git.d.cts +22 -0
- package/dist/src/publisher/git.d.ts +21 -0
- package/dist/src/publisher/github.d.cts +26 -0
- package/dist/src/publisher/github.d.ts +25 -0
- package/dist/src/publisher/hooks.d.cts +22 -0
- package/dist/src/publisher/hooks.d.ts +21 -0
- package/dist/src/publisher/index.d.cts +13 -0
- package/dist/src/publisher/index.d.ts +12 -0
- package/dist/src/publisher/npm.d.cts +14 -0
- package/dist/src/publisher/npm.d.ts +13 -0
- package/dist/src/publisher/prereqs/branch.d.cts +4 -0
- package/dist/src/publisher/prereqs/branch.d.ts +3 -0
- package/dist/src/publisher/prereqs/checker.d.cts +4 -0
- package/dist/src/publisher/prereqs/checker.d.ts +3 -0
- package/dist/src/publisher/prereqs/dirty-tree.d.cts +4 -0
- package/dist/src/publisher/prereqs/dirty-tree.d.ts +3 -0
- package/dist/src/publisher/prereqs/index.d.cts +4 -0
- package/dist/src/publisher/prereqs/index.d.ts +3 -0
- package/dist/src/publisher/prereqs/registry.d.cts +5 -0
- package/dist/src/publisher/prereqs/registry.d.ts +4 -0
- package/dist/src/publisher/publish.d.cts +24 -0
- package/dist/src/publisher/publish.d.ts +23 -0
- package/dist/src/publisher/types.d.cts +28 -0
- package/dist/src/publisher/types.d.ts +27 -0
- package/dist/src/publisher/version-bump.d.cts +12 -0
- package/dist/src/publisher/version-bump.d.ts +11 -0
- package/dist/src/publisher/version-from-commits.d.cts +7 -0
- package/dist/src/publisher/version-from-commits.d.ts +6 -0
- package/dist/src/scaffold/index.d.cts +15 -0
- package/dist/src/scaffold/index.d.ts +14 -0
- package/dist/src/scaffold/prompts.d.cts +11 -0
- package/dist/src/scaffold/prompts.d.ts +10 -0
- package/dist/src/scaffold/templates/changelog.d.cts +3 -0
- package/dist/src/scaffold/templates/changelog.d.ts +2 -0
- package/dist/src/scaffold/templates/ci.yml.d.cts +4 -0
- package/dist/src/scaffold/templates/ci.yml.d.ts +3 -0
- package/dist/src/scaffold/templates/gitignore.d.cts +3 -0
- package/dist/src/scaffold/templates/gitignore.d.ts +2 -0
- package/dist/src/scaffold/templates/index.ts.d.cts +3 -0
- package/dist/src/scaffold/templates/index.ts.d.ts +2 -0
- package/dist/src/scaffold/templates/license.d.cts +4 -0
- package/dist/src/scaffold/templates/license.d.ts +3 -0
- package/dist/src/scaffold/templates/npmignore.d.cts +3 -0
- package/dist/src/scaffold/templates/npmignore.d.ts +2 -0
- package/dist/src/scaffold/templates/package.json.d.cts +4 -0
- package/dist/src/scaffold/templates/package.json.d.ts +3 -0
- package/dist/src/scaffold/templates/readme.d.cts +4 -0
- package/dist/src/scaffold/templates/readme.d.ts +3 -0
- package/dist/src/scaffold/templates/test.ts.d.cts +4 -0
- package/dist/src/scaffold/templates/test.ts.d.ts +3 -0
- package/dist/src/scaffold/templates/tsconfig.json.d.cts +4 -0
- package/dist/src/scaffold/templates/tsconfig.json.d.ts +3 -0
- package/dist/src/scanner/clone.d.cts +9 -0
- package/dist/src/scanner/clone.d.ts +8 -0
- package/dist/src/scanner/github.d.cts +16 -0
- package/dist/src/scanner/github.d.ts +15 -0
- package/dist/src/scanner/index.d.cts +45 -0
- package/dist/src/scanner/index.d.ts +44 -0
- package/dist/src/scanner/profiles.d.cts +4 -0
- package/dist/src/scanner/profiles.d.ts +3 -0
- package/dist/src/scanner/report.d.cts +18 -0
- package/dist/src/scanner/report.d.ts +17 -0
- package/dist/src/shared/logger.d.cts +15 -0
- package/dist/src/shared/logger.d.ts +14 -0
- package/dist/src/shared/package-json.d.cts +29 -0
- package/dist/src/shared/package-json.d.ts +28 -0
- package/dist/src/shared/resolve.d.cts +3 -0
- package/dist/src/shared/resolve.d.ts +2 -0
- package/dist/src/shared/strip-json-comments.d.cts +8 -0
- package/dist/src/shared/strip-json-comments.d.ts +7 -0
- package/dist/src/type-tester/index.d.cts +17 -0
- package/dist/src/type-tester/index.d.ts +16 -0
- package/dist/src/workspace/index.d.cts +22 -0
- package/dist/src/workspace/index.d.ts +21 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/type-tester/assertions.d.cts +51 -0
- package/dist/type-tester/assertions.d.ts +50 -0
- package/dist/type-tester/assertions.js +21 -0
- package/package.json +90 -0
|
@@ -0,0 +1,1308 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ALLOW_LIST_PROFILES,
|
|
4
|
+
PROFILES,
|
|
5
|
+
allRules,
|
|
6
|
+
build,
|
|
7
|
+
check,
|
|
8
|
+
createHooksFromConfig,
|
|
9
|
+
debugResolution,
|
|
10
|
+
discoverWorkspaces,
|
|
11
|
+
doctor,
|
|
12
|
+
fileExists,
|
|
13
|
+
filterPackages,
|
|
14
|
+
generateMarkdownReport,
|
|
15
|
+
isMonorepoRoot,
|
|
16
|
+
loadConfig,
|
|
17
|
+
loadConfigWithInheritance,
|
|
18
|
+
logger,
|
|
19
|
+
parseSeverityOverrides,
|
|
20
|
+
printGroupedResults,
|
|
21
|
+
printListRules,
|
|
22
|
+
printResolutionTable,
|
|
23
|
+
publishMonorepo,
|
|
24
|
+
publishPackage,
|
|
25
|
+
pushWithTags,
|
|
26
|
+
readPackageJson,
|
|
27
|
+
runTypeTests,
|
|
28
|
+
scaffold,
|
|
29
|
+
scan,
|
|
30
|
+
topoSort,
|
|
31
|
+
writePackageJson
|
|
32
|
+
} from "../chunk-TNGZXD6W.js";
|
|
33
|
+
import "../chunk-DGUM43GV.js";
|
|
34
|
+
|
|
35
|
+
// src/cli/index.ts
|
|
36
|
+
import { Command } from "commander";
|
|
37
|
+
import { createRequire } from "node:module";
|
|
38
|
+
|
|
39
|
+
// src/scaffold/prompts.ts
|
|
40
|
+
import prompts from "prompts";
|
|
41
|
+
async function promptInit(defaultName) {
|
|
42
|
+
const answers = await prompts([
|
|
43
|
+
{
|
|
44
|
+
type: "text",
|
|
45
|
+
name: "name",
|
|
46
|
+
message: "Package name",
|
|
47
|
+
initial: defaultName ?? "my-package"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: "text",
|
|
51
|
+
name: "description",
|
|
52
|
+
message: "Description",
|
|
53
|
+
initial: ""
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
type: "text",
|
|
57
|
+
name: "author",
|
|
58
|
+
message: "Author",
|
|
59
|
+
initial: ""
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: "select",
|
|
63
|
+
name: "license",
|
|
64
|
+
message: "License",
|
|
65
|
+
choices: [
|
|
66
|
+
{ title: "MIT", value: "MIT" },
|
|
67
|
+
{ title: "Apache-2.0", value: "Apache-2.0" },
|
|
68
|
+
{ title: "ISC", value: "ISC" }
|
|
69
|
+
],
|
|
70
|
+
initial: 0
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
type: "confirm",
|
|
74
|
+
name: "dualPublish",
|
|
75
|
+
message: "Include CJS output (dual publish)?",
|
|
76
|
+
initial: false
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: "confirm",
|
|
80
|
+
name: "react",
|
|
81
|
+
message: "Add React/JSX support?",
|
|
82
|
+
initial: false
|
|
83
|
+
}
|
|
84
|
+
]);
|
|
85
|
+
return answers;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// src/cli/init.ts
|
|
89
|
+
function registerInit(program) {
|
|
90
|
+
program.command("init [name]").description("Scaffold a new TypeScript package").option("--esm-only", "Skip CJS output (recommended for new packages)", true).option("--cjs", "Include CJS output (dual publishing)").option("--monorepo", "Init inside an existing monorepo").option("--react", "Add JSX support + react peer dep").option("--author <name>", "Author name").option("--description <desc>", "Package description").option("--license <license>", "License (MIT, Apache-2.0, ISC)").option("--no-git", "Skip git init").action(async (name, options) => {
|
|
91
|
+
let packageName = name ?? "my-package";
|
|
92
|
+
let dualPublish = options.cjs === true;
|
|
93
|
+
let react = options.react === true;
|
|
94
|
+
let { author, description, license } = options;
|
|
95
|
+
const monorepo = options.monorepo === true;
|
|
96
|
+
if (!name && process.stdin.isTTY) {
|
|
97
|
+
try {
|
|
98
|
+
const answers = await promptInit();
|
|
99
|
+
packageName = answers.name;
|
|
100
|
+
dualPublish = answers.dualPublish;
|
|
101
|
+
react = answers.react;
|
|
102
|
+
author = answers.author || author;
|
|
103
|
+
description = answers.description || description;
|
|
104
|
+
license = answers.license || license;
|
|
105
|
+
} catch {
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
logger.heading(`tspub init \u2014 creating ${packageName}`);
|
|
109
|
+
try {
|
|
110
|
+
await scaffold({
|
|
111
|
+
name: packageName,
|
|
112
|
+
dualPublish,
|
|
113
|
+
react,
|
|
114
|
+
monorepo,
|
|
115
|
+
dir: process.cwd(),
|
|
116
|
+
author,
|
|
117
|
+
description,
|
|
118
|
+
license,
|
|
119
|
+
git: options.git
|
|
120
|
+
});
|
|
121
|
+
logger.success(`Package ${packageName} created successfully!`);
|
|
122
|
+
console.log();
|
|
123
|
+
console.log(` cd ${packageName}`);
|
|
124
|
+
console.log(" npm install");
|
|
125
|
+
console.log(" npm run build");
|
|
126
|
+
console.log();
|
|
127
|
+
} catch (err) {
|
|
128
|
+
logger.error(
|
|
129
|
+
`Failed to create package: ${err instanceof Error ? err.message : String(err)}`
|
|
130
|
+
);
|
|
131
|
+
process.exitCode = 1;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// src/cli/build.ts
|
|
137
|
+
function parseEntryFlag(raw) {
|
|
138
|
+
const parts = raw.split(",").map((e) => e.trim());
|
|
139
|
+
if (parts.some((p) => p.includes("="))) {
|
|
140
|
+
const result = {};
|
|
141
|
+
for (const part of parts) {
|
|
142
|
+
const eqIdx = part.indexOf("=");
|
|
143
|
+
if (eqIdx === -1) {
|
|
144
|
+
const name = part.replace(/^src\//, "").replace(/\.tsx?$/, "");
|
|
145
|
+
result[name] = part;
|
|
146
|
+
} else {
|
|
147
|
+
result[part.slice(0, eqIdx)] = part.slice(eqIdx + 1);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
return parts;
|
|
153
|
+
}
|
|
154
|
+
async function buildSinglePackage(dir, options, config, prefix) {
|
|
155
|
+
const buildConfig = config?.build;
|
|
156
|
+
const VALID_FORMATS = /* @__PURE__ */ new Set(["esm", "cjs", "iife"]);
|
|
157
|
+
let formats;
|
|
158
|
+
if (options.format) {
|
|
159
|
+
const parsed = options.format.split(",").map((f) => f.trim());
|
|
160
|
+
const invalid = parsed.filter((f) => !VALID_FORMATS.has(f));
|
|
161
|
+
if (invalid.length > 0) {
|
|
162
|
+
logger.error(`Invalid format(s): ${invalid.join(", ")}. Valid formats: esm, cjs, iife`);
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
formats = parsed;
|
|
166
|
+
} else {
|
|
167
|
+
formats = buildConfig?.formats ?? ["esm"];
|
|
168
|
+
}
|
|
169
|
+
const entry = options.entry ? parseEntryFlag(options.entry) : buildConfig?.entry ?? void 0;
|
|
170
|
+
const clean = options.clean === true || options.clean === void 0 && buildConfig?.clean === true;
|
|
171
|
+
const outDir = options.outDir ?? buildConfig?.outDir ?? "dist";
|
|
172
|
+
const dts = options.dts !== false && (options.dts !== void 0 || buildConfig?.dts !== false);
|
|
173
|
+
const sourcemap = options.sourcemap !== false && (options.sourcemap !== void 0 || buildConfig?.sourcemap !== false);
|
|
174
|
+
const label = prefix ? `[${prefix}] ` : "";
|
|
175
|
+
try {
|
|
176
|
+
await build({
|
|
177
|
+
formats,
|
|
178
|
+
dts,
|
|
179
|
+
sourcemap,
|
|
180
|
+
watch: options.watch === true,
|
|
181
|
+
dir,
|
|
182
|
+
entry,
|
|
183
|
+
clean,
|
|
184
|
+
outDir,
|
|
185
|
+
minify: options.minify ?? buildConfig?.minify,
|
|
186
|
+
splitting: options.splitting ?? buildConfig?.splitting,
|
|
187
|
+
target: options.target ?? buildConfig?.target,
|
|
188
|
+
platform: options.platform ?? buildConfig?.platform,
|
|
189
|
+
external: options.external ? options.external.split(",").map((e) => e.trim()) : buildConfig?.external,
|
|
190
|
+
noExternal: buildConfig?.noExternal,
|
|
191
|
+
define: buildConfig?.define,
|
|
192
|
+
banner: buildConfig?.banner,
|
|
193
|
+
footer: buildConfig?.footer,
|
|
194
|
+
cjsInterop: options.cjsInterop !== false ? buildConfig?.cjsInterop ?? true : false,
|
|
195
|
+
esbuildPlugins: buildConfig?.esbuildPlugins,
|
|
196
|
+
loader: buildConfig?.loader,
|
|
197
|
+
envProduction: options.envProduction ?? buildConfig?.envProduction,
|
|
198
|
+
replaceNodeEnv: buildConfig?.replaceNodeEnv,
|
|
199
|
+
globalName: options.globalName ?? buildConfig?.globalName,
|
|
200
|
+
onSuccess: buildConfig?.onSuccess,
|
|
201
|
+
treeshake: options.noTreeshake === true ? false : buildConfig?.treeshake,
|
|
202
|
+
publicDir: options.publicDir ?? buildConfig?.publicDir,
|
|
203
|
+
inject: buildConfig?.inject,
|
|
204
|
+
dtsBundle: options.dtsBundle ?? buildConfig?.dtsBundle,
|
|
205
|
+
dtsResolve: buildConfig?.dtsResolve,
|
|
206
|
+
legacy: options.legacy
|
|
207
|
+
});
|
|
208
|
+
logger.success(`${label}Build complete`);
|
|
209
|
+
return true;
|
|
210
|
+
} catch (err) {
|
|
211
|
+
logger.error(
|
|
212
|
+
`${label}Build failed: ${err instanceof Error ? err.message : String(err)}`
|
|
213
|
+
);
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function registerBuild(program) {
|
|
218
|
+
program.command("build").description("Build ESM + CJS + types").option("--format <formats>", "Output formats (comma-separated: esm,cjs,iife)").option("--no-dts", "Skip .d.ts generation").option("--no-sourcemap", "Skip sourcemap generation").option("--watch", "Watch mode").option("--entry <paths>", "Entry file(s): paths or name=path mappings (comma-separated)").option("--clean", "Remove output directory before building").option("--out-dir <dir>", "Output directory").option("--filter <pattern>", "Filter workspace packages by name pattern").option("--minify", "Minify output").option("--target <target>", "Build target (e.g. node18, es2020)").option("--platform <platform>", "Target platform (node, browser, neutral)").option("--splitting", "Enable code splitting (ESM only)").option("--external <deps>", "Additional externals (comma-separated)").option("--no-cjs-interop", "Disable CJS default export interop").option("--legacy", "Use legacy tsc-only build").option("--env-production", "Replace process.env.NODE_ENV with 'production'").option("--global-name <name>", "Global variable name for IIFE builds").option("--no-treeshake", "Disable tree-shaking").option("--public-dir <dir>", "Copy static assets from this directory").option("--dts-bundle", "Bundle .d.ts into single files per entry").action(async (options) => {
|
|
219
|
+
const dir = process.cwd();
|
|
220
|
+
logger.heading("tspub build");
|
|
221
|
+
if (await isMonorepoRoot(dir)) {
|
|
222
|
+
let packages = topoSort(await discoverWorkspaces(dir));
|
|
223
|
+
if (options.filter) {
|
|
224
|
+
packages = filterPackages(packages, options.filter);
|
|
225
|
+
}
|
|
226
|
+
logger.info(`Monorepo detected \u2014 building ${packages.length} package(s)`);
|
|
227
|
+
let hasErrors = false;
|
|
228
|
+
for (const wp of packages) {
|
|
229
|
+
logger.info(`[${wp.name}] Building...`);
|
|
230
|
+
const config = await loadConfigWithInheritance(wp.dir, dir);
|
|
231
|
+
const ok = await buildSinglePackage(wp.dir, options, config, wp.name);
|
|
232
|
+
if (!ok) hasErrors = true;
|
|
233
|
+
}
|
|
234
|
+
if (hasErrors) process.exitCode = 1;
|
|
235
|
+
} else {
|
|
236
|
+
const config = await loadConfig(dir);
|
|
237
|
+
const ok = await buildSinglePackage(dir, options, config);
|
|
238
|
+
if (!ok) process.exitCode = 1;
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// src/cli/check.ts
|
|
244
|
+
import chalk from "chalk";
|
|
245
|
+
function registerCheck(program) {
|
|
246
|
+
program.command("check").description("Validate package.json, exports, types, and more").option("--fix", "Auto-fix package.json issues where possible").option("--fix-dry-run", "Show what fixes would be applied without writing").option("--fix-type <types>", "Only fix specific categories (exports,files,metadata)").option("-i, --interactive", "Confirm each fix before applying (requires --fix)").option("--unsafe", "Also apply unsafe fixes (requires --fix)").option("--strict", "Treat warnings as errors").option("--rule <spec>", "Override rule severity (e.g. exports/file-exists=off)", collect, []).option("--format <fmt>", "Output format: text, json, or table", "text").option("--filter <pattern>", "Filter workspace packages by name pattern").option("--list-rules", "Print all available rules and exit").option("--ignore-rules <ids>", "Comma-separated rule IDs to skip").option("--profile <name>", "Check profile: strict, library, or app").option("--compare", "Show equivalent publint/attw rule IDs alongside results").action(async (options) => {
|
|
247
|
+
if (options.listRules) {
|
|
248
|
+
printListRules();
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const isJson = options.format === "json";
|
|
252
|
+
const isTable = options.format === "table";
|
|
253
|
+
if (!isJson && !isTable) {
|
|
254
|
+
logger.heading("tspub check \u2014 validating your package...");
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
const dryRun = options.fixDryRun === true;
|
|
258
|
+
const fixTypes = options.fixType ? options.fixType.split(",").map((s) => s.trim()) : void 0;
|
|
259
|
+
const severityOverrides = parseSeverityOverrides(options.rule);
|
|
260
|
+
if (options.ignoreRules) {
|
|
261
|
+
for (const id of options.ignoreRules.split(",").map((s) => s.trim())) {
|
|
262
|
+
if (id) severityOverrides[id] = "off";
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (options.profile && PROFILES[options.profile]) {
|
|
266
|
+
const profileRules = PROFILES[options.profile];
|
|
267
|
+
if (ALLOW_LIST_PROFILES.has(options.profile)) {
|
|
268
|
+
const allowed = new Set(profileRules);
|
|
269
|
+
for (const rule of allRules) {
|
|
270
|
+
if (!allowed.has(rule.meta.id) && !(rule.meta.id in severityOverrides)) {
|
|
271
|
+
severityOverrides[rule.meta.id] = "off";
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
} else {
|
|
275
|
+
for (const id of profileRules) {
|
|
276
|
+
if (!(id in severityOverrides)) {
|
|
277
|
+
severityOverrides[id] = "off";
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const dir = process.cwd();
|
|
283
|
+
let results;
|
|
284
|
+
if (await isMonorepoRoot(dir)) {
|
|
285
|
+
let packages = topoSort(await discoverWorkspaces(dir));
|
|
286
|
+
if (options.filter) {
|
|
287
|
+
packages = filterPackages(packages, options.filter);
|
|
288
|
+
}
|
|
289
|
+
if (!isJson && !isTable) logger.info(`Monorepo detected \u2014 checking ${packages.length} package(s)`);
|
|
290
|
+
results = [];
|
|
291
|
+
for (const wp of packages) {
|
|
292
|
+
if (!isJson && !isTable) logger.info(`[${wp.name}] Checking...`);
|
|
293
|
+
const inheritedConfig = await loadConfigWithInheritance(wp.dir, dir);
|
|
294
|
+
const mergedOverrides = {
|
|
295
|
+
...inheritedConfig?.check?.severityOverrides,
|
|
296
|
+
...severityOverrides
|
|
297
|
+
};
|
|
298
|
+
const pkgResults = await check({
|
|
299
|
+
dir: wp.dir,
|
|
300
|
+
fix: options.fix === true || dryRun,
|
|
301
|
+
unsafe: options.unsafe === true,
|
|
302
|
+
strict: options.strict === true || options.profile === "strict",
|
|
303
|
+
dryRun,
|
|
304
|
+
fixTypes,
|
|
305
|
+
interactive: options.interactive === true,
|
|
306
|
+
severityOverrides: mergedOverrides
|
|
307
|
+
});
|
|
308
|
+
for (const r of pkgResults) {
|
|
309
|
+
results.push({
|
|
310
|
+
...r,
|
|
311
|
+
message: `[${wp.name}] ${r.message}`
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
} else {
|
|
316
|
+
results = await check({
|
|
317
|
+
dir,
|
|
318
|
+
fix: options.fix === true || dryRun,
|
|
319
|
+
unsafe: options.unsafe === true,
|
|
320
|
+
strict: options.strict === true || options.profile === "strict",
|
|
321
|
+
dryRun,
|
|
322
|
+
fixTypes,
|
|
323
|
+
interactive: options.interactive === true,
|
|
324
|
+
severityOverrides
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
if (isJson) {
|
|
328
|
+
let errors2 = 0;
|
|
329
|
+
let warnings2 = 0;
|
|
330
|
+
let passed2 = 0;
|
|
331
|
+
for (const r of results) {
|
|
332
|
+
if (r.severity === "error") errors2++;
|
|
333
|
+
else if (r.severity === "warning") warnings2++;
|
|
334
|
+
else if (r.severity === "ok") passed2++;
|
|
335
|
+
}
|
|
336
|
+
console.log(
|
|
337
|
+
JSON.stringify({ results, summary: { errors: errors2, warnings: warnings2, passed: passed2, total: allRules.length } }, null, 2)
|
|
338
|
+
);
|
|
339
|
+
if (errors2 > 0) process.exitCode = 1;
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (isTable) {
|
|
343
|
+
printResolutionTable(results);
|
|
344
|
+
}
|
|
345
|
+
const isStrict = options.strict === true || options.profile === "strict";
|
|
346
|
+
const { errors, warnings, passed } = printGroupedResults(results, isStrict, options.compare === true);
|
|
347
|
+
console.log();
|
|
348
|
+
const parts = [];
|
|
349
|
+
if (passed > 0) parts.push(chalk.green(`\u2713 ${passed} passed`));
|
|
350
|
+
if (errors > 0) parts.push(chalk.red(`\u2717 ${errors} error(s)`));
|
|
351
|
+
if (warnings > 0) parts.push(chalk.yellow(`\u26A0 ${warnings} warning(s)`));
|
|
352
|
+
if (parts.length > 0) {
|
|
353
|
+
console.log(parts.join(chalk.dim(" \xB7 ")));
|
|
354
|
+
}
|
|
355
|
+
if (errors > 0) {
|
|
356
|
+
process.exitCode = 1;
|
|
357
|
+
} else if (warnings === 0 && errors === 0) {
|
|
358
|
+
logger.success("All checks passed!");
|
|
359
|
+
}
|
|
360
|
+
} catch (err) {
|
|
361
|
+
logger.error(
|
|
362
|
+
`Check failed: ${err instanceof Error ? err.message : String(err)}`
|
|
363
|
+
);
|
|
364
|
+
process.exitCode = 1;
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
function collect(value, prev) {
|
|
369
|
+
return [...prev, value];
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// src/cli/publish.ts
|
|
373
|
+
var VALID_BUMPS = /* @__PURE__ */ new Set(["major", "minor", "patch"]);
|
|
374
|
+
function registerPublish(program) {
|
|
375
|
+
program.command("publish [bump]").description("Build + check + version + changelog + npm publish").option("--dry-run", "Preview without publishing").option("--tag <tag>", "npm dist-tag", "latest").option("--otp <code>", "npm OTP for 2FA").option("--access <level>", "public or restricted").option("--no-changelog", "Skip changelog generation").option("--no-git", "Skip git tag + commit").option("--prerelease <tag>", "Create prerelease version (e.g. beta, alpha)").option("--provenance", "Publish with provenance attestation").option("--registry <url>", "npm registry URL").option("--changelog-style <style>", "Changelog style: simple, conventional, auto", "auto").option("--ci", "CI mode: auto-detect version bump from commits").option("--filter <pattern>", "Filter workspace packages by name pattern").option("--github-release", "Create a GitHub release (default: auto when GITHUB_TOKEN is set)").option("--no-github-release", "Skip GitHub release creation").option("-y, --yes", "Skip confirmation prompt").action(async (bump, options) => {
|
|
376
|
+
const dir = process.cwd();
|
|
377
|
+
const config = await loadConfig(dir);
|
|
378
|
+
logger.heading("tspub publish");
|
|
379
|
+
if (bump && !VALID_BUMPS.has(bump) && !/^\d+\.\d+\.\d+(-[\w.]+)?$/.test(bump)) {
|
|
380
|
+
logger.error(`Invalid bump "${bump}". Use: major, minor, patch, or an explicit version (e.g. 1.2.3)`);
|
|
381
|
+
process.exitCode = 1;
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const isCi = options.ci === true || config?.publish?.ci?.enabled === true;
|
|
385
|
+
const registry = options.registry ?? config?.publish?.registry;
|
|
386
|
+
const registryArgs = registry ? ["--registry", registry] : [];
|
|
387
|
+
const hooks = createHooksFromConfig(config?.publish);
|
|
388
|
+
if (await isMonorepoRoot(dir)) {
|
|
389
|
+
const results = await publishMonorepo({
|
|
390
|
+
dir,
|
|
391
|
+
bump,
|
|
392
|
+
options,
|
|
393
|
+
hooks
|
|
394
|
+
});
|
|
395
|
+
if (results.some((r) => !r.success)) {
|
|
396
|
+
process.exitCode = 1;
|
|
397
|
+
}
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
const result = await publishPackage({
|
|
401
|
+
dir,
|
|
402
|
+
bump,
|
|
403
|
+
options,
|
|
404
|
+
config,
|
|
405
|
+
isCi,
|
|
406
|
+
registry,
|
|
407
|
+
registryArgs,
|
|
408
|
+
hooks
|
|
409
|
+
});
|
|
410
|
+
if (!result.success) {
|
|
411
|
+
for (const d of result.prereqDiagnostics) {
|
|
412
|
+
if (d.severity === "error") logger.error(d.message);
|
|
413
|
+
else if (d.severity === "warning") logger.warn(d.message);
|
|
414
|
+
}
|
|
415
|
+
process.exitCode = 1;
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
if (options.git !== false && !options.dryRun) {
|
|
419
|
+
if (!isCi || config?.publish?.ci?.skipPush === false) {
|
|
420
|
+
const { ok } = pushWithTags(dir);
|
|
421
|
+
if (ok) {
|
|
422
|
+
logger.info("Pushed to remote");
|
|
423
|
+
} else {
|
|
424
|
+
logger.warn("Git push failed \u2014 push manually");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// src/doctor/formatter.ts
|
|
432
|
+
import chalk2 from "chalk";
|
|
433
|
+
var CATEGORY_ORDER = ["environment", "typescript", "build", "dependencies"];
|
|
434
|
+
function formatDoctorResults(results, format = "text") {
|
|
435
|
+
if (format === "json") {
|
|
436
|
+
console.log(JSON.stringify(results, null, 2));
|
|
437
|
+
return countSeverities(results);
|
|
438
|
+
}
|
|
439
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
440
|
+
for (const cat of CATEGORY_ORDER) {
|
|
441
|
+
grouped.set(cat, []);
|
|
442
|
+
}
|
|
443
|
+
for (const r of results) {
|
|
444
|
+
const cat = r.ruleId.split("/")[0] ?? "other";
|
|
445
|
+
if (!grouped.has(cat)) grouped.set(cat, []);
|
|
446
|
+
grouped.get(cat).push(r);
|
|
447
|
+
}
|
|
448
|
+
for (const [category, catResults] of grouped) {
|
|
449
|
+
if (catResults.length === 0) continue;
|
|
450
|
+
console.log();
|
|
451
|
+
console.log(chalk2.bold.cyan(`\u2500\u2500 ${category} \u2500\u2500`));
|
|
452
|
+
for (const result of catResults) {
|
|
453
|
+
const fixHint = result.fixable ? chalk2.dim(` [fixable: ${result.fixable}]`) : "";
|
|
454
|
+
if (result.severity === "error") {
|
|
455
|
+
logger.error(result.message + fixHint);
|
|
456
|
+
} else if (result.severity === "warning") {
|
|
457
|
+
logger.warn(result.message + fixHint);
|
|
458
|
+
} else {
|
|
459
|
+
logger.info(result.message + fixHint);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return countSeverities(results);
|
|
464
|
+
}
|
|
465
|
+
function countSeverities(results) {
|
|
466
|
+
let errors = 0;
|
|
467
|
+
let warnings = 0;
|
|
468
|
+
for (const r of results) {
|
|
469
|
+
if (r.severity === "error") errors++;
|
|
470
|
+
else if (r.severity === "warning") warnings++;
|
|
471
|
+
}
|
|
472
|
+
return { errors, warnings };
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// src/cli/doctor.ts
|
|
476
|
+
function registerDoctor(program) {
|
|
477
|
+
program.command("doctor").description("Diagnose environment, dependencies, and package health").option("--check <subpath>", "Debug resolution of a specific subpath export").option("--fix", "Apply auto-fixes").option("--unsafe", "Allow unsafe fixes").option("--dry-run", "Preview fixes without applying").option("--profile <profile>", "Use preset profile (strict, quick)").option("--rule <id=severity>", "Override rule severity", collect2, []).option("--format <format>", "Output format: text or json", "text").action(async (options) => {
|
|
478
|
+
const dir = process.cwd();
|
|
479
|
+
const format = options.format === "json" ? "json" : "text";
|
|
480
|
+
if (format === "text") {
|
|
481
|
+
logger.heading("tspub doctor \u2014 scanning your package...");
|
|
482
|
+
}
|
|
483
|
+
try {
|
|
484
|
+
if (options.check) {
|
|
485
|
+
const pkg = await readPackageJson(dir);
|
|
486
|
+
const diags = debugResolution(pkg, options.check);
|
|
487
|
+
if (format === "json") {
|
|
488
|
+
console.log(JSON.stringify(diags, null, 2));
|
|
489
|
+
} else {
|
|
490
|
+
for (const d of diags) {
|
|
491
|
+
if (d.severity === "error") logger.error(d.message);
|
|
492
|
+
else if (d.severity === "warning") logger.warn(d.message);
|
|
493
|
+
else logger.info(d.message);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if (diags.some((d) => d.severity === "error")) {
|
|
497
|
+
process.exitCode = 1;
|
|
498
|
+
}
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
const severityOverrides = options.rule && options.rule.length > 0 ? parseSeverityOverrides(options.rule) : void 0;
|
|
502
|
+
const envResults = await doctor({
|
|
503
|
+
dir,
|
|
504
|
+
fix: options.fix ?? false,
|
|
505
|
+
unsafe: options.unsafe,
|
|
506
|
+
dryRun: options.dryRun,
|
|
507
|
+
severityOverrides,
|
|
508
|
+
profile: options.profile,
|
|
509
|
+
format
|
|
510
|
+
});
|
|
511
|
+
if (format === "json") {
|
|
512
|
+
const checkResults = await check({ dir, fix: false, strict: false });
|
|
513
|
+
console.log(JSON.stringify({ doctor: envResults, check: checkResults }, null, 2));
|
|
514
|
+
const hasErrors = envResults.some((r) => r.severity === "error") || checkResults.some((r) => r.severity === "error");
|
|
515
|
+
if (hasErrors) process.exitCode = 1;
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
const formatted = envResults.map((r) => ({
|
|
519
|
+
ruleId: r.ruleId ?? r.category,
|
|
520
|
+
severity: r.severity,
|
|
521
|
+
message: r.message,
|
|
522
|
+
fixable: r.fixable
|
|
523
|
+
}));
|
|
524
|
+
const { errors: doctorErrors, warnings: doctorWarnings } = formatDoctorResults(formatted);
|
|
525
|
+
const results = await check({ dir, fix: false, strict: false });
|
|
526
|
+
let errors = doctorErrors;
|
|
527
|
+
let warnings = doctorWarnings;
|
|
528
|
+
for (const result of results) {
|
|
529
|
+
if (result.severity === "error") {
|
|
530
|
+
logger.error(result.message);
|
|
531
|
+
errors++;
|
|
532
|
+
} else if (result.severity === "warning") {
|
|
533
|
+
logger.warn(result.message);
|
|
534
|
+
warnings++;
|
|
535
|
+
} else if (result.severity === "ok") {
|
|
536
|
+
logger.ok(result.message);
|
|
537
|
+
} else {
|
|
538
|
+
logger.info(result.message);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
console.log();
|
|
542
|
+
if (errors > 0 || warnings > 0) {
|
|
543
|
+
logger.info(
|
|
544
|
+
`Found ${errors} error(s), ${warnings} warning(s).`
|
|
545
|
+
);
|
|
546
|
+
} else {
|
|
547
|
+
logger.success("Your package looks great!");
|
|
548
|
+
}
|
|
549
|
+
if (errors > 0) process.exitCode = 1;
|
|
550
|
+
} catch (err) {
|
|
551
|
+
logger.error(
|
|
552
|
+
`Doctor failed: ${err instanceof Error ? err.message : String(err)}`
|
|
553
|
+
);
|
|
554
|
+
process.exitCode = 1;
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
function collect2(value, previous) {
|
|
559
|
+
return [...previous, value];
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// src/cli/scan.ts
|
|
563
|
+
import { writeFileSync } from "node:fs";
|
|
564
|
+
function registerScan(program) {
|
|
565
|
+
program.command("scan [url]").description("Scan GitHub repos for TypeScript packaging issues").option("--top <n>", "Discover and scan top N TypeScript npm packages", parseInt).option("--json", "Output results as JSON", false).option("--fix", "Report what --fix would change in each package", false).option("--concurrency <n>", "Parallel clone concurrency", parseInt).option("--min-stars <n>", "Minimum GitHub stars", parseInt).option("--query <q>", "Custom GitHub search query").option("--profile <p>", "Check profile (strict, exports-only, types-only)").option("--report <path>", "Save markdown report to file").option("--rule <id=severity>", "Override rule severity", collect3, []).action(async (url, options) => {
|
|
566
|
+
if (!url && !options.top) {
|
|
567
|
+
logger.error("Provide a GitHub URL or use --top <n>");
|
|
568
|
+
process.exitCode = 1;
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
if (!options.json) {
|
|
572
|
+
const fixLabel = options.fix ? " (with fix preview)" : "";
|
|
573
|
+
logger.heading(
|
|
574
|
+
`tspub scan \u2014 scanning ${url ? url : `top ${options.top} repos`}${fixLabel}...`
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
try {
|
|
578
|
+
const severityOverrides = options.rule && options.rule.length > 0 ? parseSeverityOverrides(options.rule) : void 0;
|
|
579
|
+
const results = await scan(
|
|
580
|
+
{
|
|
581
|
+
url,
|
|
582
|
+
top: options.top,
|
|
583
|
+
json: options.json,
|
|
584
|
+
fix: options.fix,
|
|
585
|
+
concurrency: options.concurrency,
|
|
586
|
+
minStars: options.minStars,
|
|
587
|
+
query: options.query,
|
|
588
|
+
severityOverrides,
|
|
589
|
+
profile: options.profile
|
|
590
|
+
},
|
|
591
|
+
options.json ? void 0 : (msg) => logger.dim(msg)
|
|
592
|
+
);
|
|
593
|
+
if (options.json) {
|
|
594
|
+
console.log(JSON.stringify(results, null, 2));
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
for (const result of results) {
|
|
598
|
+
if (result.errors) {
|
|
599
|
+
for (const err of result.errors) {
|
|
600
|
+
logger.error(`[${err.repo}] ${err.phase}: ${err.message}`);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
for (const pkg of result.packages) {
|
|
604
|
+
for (const r of pkg.results) {
|
|
605
|
+
if (r.severity === "error") {
|
|
606
|
+
logger.error(`${pkg.name}: ${r.message}`);
|
|
607
|
+
} else if (r.severity === "warning") {
|
|
608
|
+
logger.warn(`${pkg.name}: ${r.message}`);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
if (pkg.fixChanges && pkg.fixChanges.length > 0) {
|
|
612
|
+
logger.info(`${pkg.name}: --fix would change:`);
|
|
613
|
+
for (const change of pkg.fixChanges) {
|
|
614
|
+
if (change.before === null || change.before === void 0) {
|
|
615
|
+
logger.dim(` + ${change.field}: ${JSON.stringify(change.after)}`);
|
|
616
|
+
} else {
|
|
617
|
+
logger.dim(` ~ ${change.field}: ${JSON.stringify(change.before)} \u2192 ${JSON.stringify(change.after)}`);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
const totalRepos = results.length;
|
|
624
|
+
const totalPackages = results.reduce((sum, r) => sum + r.packages.length, 0);
|
|
625
|
+
const withErrors = results.filter(
|
|
626
|
+
(r) => r.packages.some((p) => p.errors > 0)
|
|
627
|
+
).length;
|
|
628
|
+
const withWarningsOnly = results.filter(
|
|
629
|
+
(r) => r.packages.some((p) => p.warnings > 0) && !r.packages.some((p) => p.errors > 0)
|
|
630
|
+
).length;
|
|
631
|
+
const clean = totalRepos - withErrors - withWarningsOnly;
|
|
632
|
+
console.log();
|
|
633
|
+
logger.heading("=== RESULTS ===");
|
|
634
|
+
logger.info(`${totalRepos} repos scanned, ${totalPackages} packages checked`);
|
|
635
|
+
if (clean > 0) logger.ok(`${clean} clean`);
|
|
636
|
+
if (withWarningsOnly > 0) logger.warn(`${withWarningsOnly} with warnings only`);
|
|
637
|
+
if (withErrors > 0) logger.error(`${withErrors} with errors`);
|
|
638
|
+
if (options.fix) {
|
|
639
|
+
const fixablePackages = results.flatMap((r) => r.packages).filter(
|
|
640
|
+
(p) => p.fixChanges && p.fixChanges.length > 0
|
|
641
|
+
);
|
|
642
|
+
const totalFixFields = fixablePackages.reduce(
|
|
643
|
+
(sum, p) => sum + (p.fixChanges?.length ?? 0),
|
|
644
|
+
0
|
|
645
|
+
);
|
|
646
|
+
if (fixablePackages.length > 0) {
|
|
647
|
+
console.log();
|
|
648
|
+
logger.info(
|
|
649
|
+
`${fixablePackages.length} package(s) fixable, ${totalFixFields} field(s) would change`
|
|
650
|
+
);
|
|
651
|
+
const fieldCounts = /* @__PURE__ */ new Map();
|
|
652
|
+
for (const pkg of fixablePackages) {
|
|
653
|
+
for (const change of pkg.fixChanges) {
|
|
654
|
+
fieldCounts.set(change.field, (fieldCounts.get(change.field) ?? 0) + 1);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
const sortedFields = [...fieldCounts.entries()].sort((a, b) => b[1] - a[1]);
|
|
658
|
+
for (const [field, count] of sortedFields) {
|
|
659
|
+
logger.dim(` ${count}x ${field}`);
|
|
660
|
+
}
|
|
661
|
+
} else {
|
|
662
|
+
logger.ok("Nothing to fix");
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
const issueCounts = /* @__PURE__ */ new Map();
|
|
666
|
+
for (const result of results) {
|
|
667
|
+
for (const pkg of result.packages) {
|
|
668
|
+
for (const r of pkg.results) {
|
|
669
|
+
if (r.severity === "error" || r.severity === "warning") {
|
|
670
|
+
issueCounts.set(r.message, (issueCounts.get(r.message) ?? 0) + 1);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
if (issueCounts.size > 0) {
|
|
676
|
+
console.log();
|
|
677
|
+
logger.info("Top issues:");
|
|
678
|
+
const sorted = [...issueCounts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10);
|
|
679
|
+
for (const [msg, count] of sorted) {
|
|
680
|
+
logger.dim(` ${count}x ${msg}`);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
if (options.report) {
|
|
684
|
+
const report = generateMarkdownReport(results);
|
|
685
|
+
writeFileSync(options.report, report);
|
|
686
|
+
logger.info(`Report saved to ${options.report}`);
|
|
687
|
+
}
|
|
688
|
+
if (withErrors > 0) {
|
|
689
|
+
process.exitCode = 1;
|
|
690
|
+
}
|
|
691
|
+
} catch (err) {
|
|
692
|
+
logger.error(
|
|
693
|
+
`Scan failed: ${err instanceof Error ? err.message : String(err)}`
|
|
694
|
+
);
|
|
695
|
+
process.exitCode = 1;
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
function collect3(value, previous) {
|
|
700
|
+
return [...previous, value];
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// src/cli/test-types.ts
|
|
704
|
+
function registerTestTypes(program) {
|
|
705
|
+
program.command("test-types").description("Run type declaration tests (.test-d.ts files)").option("--dir <directory>", "Directory containing .test-d.ts files", "test-d").action(async (options) => {
|
|
706
|
+
const dir = process.cwd();
|
|
707
|
+
logger.heading("tspub test-types");
|
|
708
|
+
try {
|
|
709
|
+
const result = await runTypeTests({
|
|
710
|
+
dir,
|
|
711
|
+
directory: options.dir
|
|
712
|
+
});
|
|
713
|
+
if (result.fileCount === 0) {
|
|
714
|
+
logger.info("No .test-d.ts files found");
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
logger.info(`Found ${result.fileCount} type test file(s)`);
|
|
718
|
+
if (result.passed) {
|
|
719
|
+
logger.success("All type tests passed!");
|
|
720
|
+
} else {
|
|
721
|
+
for (const err of result.errors) {
|
|
722
|
+
logger.error(`${err.file}:${err.line} \u2014 ${err.message}`);
|
|
723
|
+
}
|
|
724
|
+
logger.error(`${result.errors.length} type error(s) found`);
|
|
725
|
+
process.exitCode = 1;
|
|
726
|
+
}
|
|
727
|
+
} catch (err) {
|
|
728
|
+
logger.error(
|
|
729
|
+
`Type test failed: ${err instanceof Error ? err.message : String(err)}`
|
|
730
|
+
);
|
|
731
|
+
process.exitCode = 1;
|
|
732
|
+
}
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// src/changeset/writer.ts
|
|
737
|
+
import { randomUUID } from "node:crypto";
|
|
738
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
739
|
+
import { join } from "node:path";
|
|
740
|
+
async function writeChangeset(dir, entries, summary) {
|
|
741
|
+
const id = randomUUID().slice(0, 8);
|
|
742
|
+
const changesetDir = join(dir, ".changeset");
|
|
743
|
+
await mkdir(changesetDir, { recursive: true });
|
|
744
|
+
const frontmatter = entries.map((e) => `"${e.packageName}": ${e.bump}`).join("\n");
|
|
745
|
+
const content = `---
|
|
746
|
+
${frontmatter}
|
|
747
|
+
---
|
|
748
|
+
|
|
749
|
+
${summary}
|
|
750
|
+
`;
|
|
751
|
+
const filePath = join(changesetDir, `${id}.md`);
|
|
752
|
+
await writeFile(filePath, content, "utf-8");
|
|
753
|
+
return filePath;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
// src/changeset/version.ts
|
|
757
|
+
import { readFile as readFile2, writeFile as writeFile2, readdir, unlink } from "node:fs/promises";
|
|
758
|
+
import { join as join2 } from "node:path";
|
|
759
|
+
|
|
760
|
+
// src/changeset/parser.ts
|
|
761
|
+
import { readFile } from "node:fs/promises";
|
|
762
|
+
import { basename } from "node:path";
|
|
763
|
+
function parseChangesetContent(content, id) {
|
|
764
|
+
const lines = content.split("\n");
|
|
765
|
+
let firstDash = -1;
|
|
766
|
+
let secondDash = -1;
|
|
767
|
+
for (let i = 0; i < lines.length; i++) {
|
|
768
|
+
if (lines[i].trim() === "---") {
|
|
769
|
+
if (firstDash === -1) {
|
|
770
|
+
firstDash = i;
|
|
771
|
+
} else {
|
|
772
|
+
secondDash = i;
|
|
773
|
+
break;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
if (firstDash === -1 || secondDash === -1) {
|
|
778
|
+
throw new Error(`Invalid changeset format in "${id}": missing --- delimiters`);
|
|
779
|
+
}
|
|
780
|
+
const entries = [];
|
|
781
|
+
for (let i = firstDash + 1; i < secondDash; i++) {
|
|
782
|
+
const line = lines[i].trim();
|
|
783
|
+
if (!line) continue;
|
|
784
|
+
const match = line.match(/^"([^"]+)":\s*(major|minor|patch)$/);
|
|
785
|
+
if (!match) {
|
|
786
|
+
throw new Error(`Invalid changeset entry in "${id}": ${line}`);
|
|
787
|
+
}
|
|
788
|
+
entries.push({
|
|
789
|
+
packageName: match[1],
|
|
790
|
+
bump: match[2]
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
const summary = lines.slice(secondDash + 1).join("\n").trim();
|
|
794
|
+
return { id, entries, summary };
|
|
795
|
+
}
|
|
796
|
+
async function parseChangeset(filePath) {
|
|
797
|
+
const content = await readFile(filePath, "utf-8");
|
|
798
|
+
const id = basename(filePath, ".md");
|
|
799
|
+
return parseChangesetContent(content, id);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// src/changeset/dependent-bumping.ts
|
|
803
|
+
var BUMP_ORDER = {
|
|
804
|
+
patch: 0,
|
|
805
|
+
minor: 1,
|
|
806
|
+
major: 2
|
|
807
|
+
};
|
|
808
|
+
function higherBump(a, b) {
|
|
809
|
+
return BUMP_ORDER[a] >= BUMP_ORDER[b] ? a : b;
|
|
810
|
+
}
|
|
811
|
+
function computeDependentBumps(packages, initialBumps, mode) {
|
|
812
|
+
const bumps = new Map(initialBumps);
|
|
813
|
+
if (mode === "none") {
|
|
814
|
+
return bumps;
|
|
815
|
+
}
|
|
816
|
+
const dependents = /* @__PURE__ */ new Map();
|
|
817
|
+
for (const pkg of packages) {
|
|
818
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
819
|
+
for (const dep of Object.keys(allDeps)) {
|
|
820
|
+
let list = dependents.get(dep);
|
|
821
|
+
if (!list) {
|
|
822
|
+
list = [];
|
|
823
|
+
dependents.set(dep, list);
|
|
824
|
+
}
|
|
825
|
+
list.push(pkg.name);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
const queue = [...bumps.keys()];
|
|
829
|
+
const inQueue = new Set(queue);
|
|
830
|
+
while (queue.length > 0) {
|
|
831
|
+
const name = queue.shift();
|
|
832
|
+
inQueue.delete(name);
|
|
833
|
+
const bump = bumps.get(name);
|
|
834
|
+
if (mode === "major" && bump !== "major") continue;
|
|
835
|
+
const deps = dependents.get(name);
|
|
836
|
+
if (!deps) continue;
|
|
837
|
+
for (const dep of deps) {
|
|
838
|
+
const existing = bumps.get(dep);
|
|
839
|
+
if (!existing) {
|
|
840
|
+
bumps.set(dep, "patch");
|
|
841
|
+
if (!inQueue.has(dep)) {
|
|
842
|
+
queue.push(dep);
|
|
843
|
+
inQueue.add(dep);
|
|
844
|
+
}
|
|
845
|
+
} else {
|
|
846
|
+
const higher = higherBump(existing, "patch");
|
|
847
|
+
if (higher !== existing) {
|
|
848
|
+
bumps.set(dep, higher);
|
|
849
|
+
if (!inQueue.has(dep)) {
|
|
850
|
+
queue.push(dep);
|
|
851
|
+
inQueue.add(dep);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
return bumps;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// src/changeset/version.ts
|
|
861
|
+
function bumpVersion(version, bump) {
|
|
862
|
+
const base = version.split("-")[0];
|
|
863
|
+
const parts = base.split(".").map(Number);
|
|
864
|
+
const [major = 0, minor = 0, patch = 0] = parts;
|
|
865
|
+
switch (bump) {
|
|
866
|
+
case "major":
|
|
867
|
+
return `${major + 1}.0.0`;
|
|
868
|
+
case "minor":
|
|
869
|
+
return `${major}.${minor + 1}.0`;
|
|
870
|
+
case "patch":
|
|
871
|
+
return `${major}.${minor}.${patch + 1}`;
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
var BUMP_ORDER2 = {
|
|
875
|
+
patch: 0,
|
|
876
|
+
minor: 1,
|
|
877
|
+
major: 2
|
|
878
|
+
};
|
|
879
|
+
function semverGt(a, b) {
|
|
880
|
+
const [aBase = "", aPre] = a.split("-", 2);
|
|
881
|
+
const [bBase = "", bPre] = b.split("-", 2);
|
|
882
|
+
const [aMaj = 0, aMin = 0, aPat = 0] = aBase.split(".").map(Number);
|
|
883
|
+
const [bMaj = 0, bMin = 0, bPat = 0] = bBase.split(".").map(Number);
|
|
884
|
+
if (aMaj !== bMaj) return aMaj > bMaj;
|
|
885
|
+
if (aMin !== bMin) return aMin > bMin;
|
|
886
|
+
if (aPat !== bPat) return aPat > bPat;
|
|
887
|
+
if (!aPre && bPre) return true;
|
|
888
|
+
if (aPre && !bPre) return false;
|
|
889
|
+
if (!aPre && !bPre) return false;
|
|
890
|
+
const aIds = aPre.split(".");
|
|
891
|
+
const bIds = bPre.split(".");
|
|
892
|
+
const len = Math.max(aIds.length, bIds.length);
|
|
893
|
+
for (let i = 0; i < len; i++) {
|
|
894
|
+
const aId = aIds[i];
|
|
895
|
+
const bId = bIds[i];
|
|
896
|
+
if (aId === void 0) return false;
|
|
897
|
+
if (bId === void 0) return true;
|
|
898
|
+
const aNum = /^\d+$/.test(aId) ? Number(aId) : NaN;
|
|
899
|
+
const bNum = /^\d+$/.test(bId) ? Number(bId) : NaN;
|
|
900
|
+
if (!isNaN(aNum) && !isNaN(bNum)) {
|
|
901
|
+
if (aNum !== bNum) return aNum > bNum;
|
|
902
|
+
} else {
|
|
903
|
+
if (!isNaN(aNum)) return false;
|
|
904
|
+
if (!isNaN(bNum)) return true;
|
|
905
|
+
if (aId !== bId) return aId > bId;
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
return false;
|
|
909
|
+
}
|
|
910
|
+
function applyLinkedGroups(aggregated, linked) {
|
|
911
|
+
for (const group of linked) {
|
|
912
|
+
let highestBump = null;
|
|
913
|
+
for (const name of group) {
|
|
914
|
+
const entry = aggregated.get(name);
|
|
915
|
+
if (entry && (!highestBump || BUMP_ORDER2[entry.bump] > BUMP_ORDER2[highestBump])) {
|
|
916
|
+
highestBump = entry.bump;
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
if (highestBump) {
|
|
920
|
+
for (const name of group) {
|
|
921
|
+
if (!aggregated.has(name)) {
|
|
922
|
+
aggregated.set(name, { bump: highestBump, summaries: ["Linked version bump"] });
|
|
923
|
+
} else {
|
|
924
|
+
aggregated.get(name).bump = highestBump;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
function applyFixedGroups(aggregated, fixed, packageVersions) {
|
|
931
|
+
for (const group of fixed) {
|
|
932
|
+
let highestVersion = "0.0.0";
|
|
933
|
+
let highestBump = null;
|
|
934
|
+
for (const name of group) {
|
|
935
|
+
const version = packageVersions.get(name) ?? "0.0.0";
|
|
936
|
+
if (semverGt(version, highestVersion)) highestVersion = version;
|
|
937
|
+
const entry = aggregated.get(name);
|
|
938
|
+
if (entry && (!highestBump || BUMP_ORDER2[entry.bump] > BUMP_ORDER2[highestBump])) {
|
|
939
|
+
highestBump = entry.bump;
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
if (highestBump) {
|
|
943
|
+
const targetVersion = bumpVersion(highestVersion, highestBump);
|
|
944
|
+
for (const name of group) {
|
|
945
|
+
const existing = aggregated.get(name);
|
|
946
|
+
if (!existing) {
|
|
947
|
+
aggregated.set(name, { bump: highestBump, summaries: ["Fixed group version bump"], targetVersion });
|
|
948
|
+
} else {
|
|
949
|
+
existing.bump = highestBump;
|
|
950
|
+
existing.targetVersion = targetVersion;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
async function consumeChangesets(rootDir, packageDirs, options) {
|
|
957
|
+
const changesetDir = join2(rootDir, ".changeset");
|
|
958
|
+
const files = await readdir(changesetDir);
|
|
959
|
+
const mdFiles = files.filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
960
|
+
if (mdFiles.length === 0) return { updates: [], cleanup: async () => {
|
|
961
|
+
} };
|
|
962
|
+
const aggregated = /* @__PURE__ */ new Map();
|
|
963
|
+
for (const file of mdFiles) {
|
|
964
|
+
const changeset = await parseChangeset(join2(changesetDir, file));
|
|
965
|
+
for (const entry of changeset.entries) {
|
|
966
|
+
const existing = aggregated.get(entry.packageName);
|
|
967
|
+
if (existing) {
|
|
968
|
+
if (BUMP_ORDER2[entry.bump] > BUMP_ORDER2[existing.bump]) {
|
|
969
|
+
existing.bump = entry.bump;
|
|
970
|
+
}
|
|
971
|
+
existing.summaries.push(changeset.summary);
|
|
972
|
+
} else {
|
|
973
|
+
aggregated.set(entry.packageName, {
|
|
974
|
+
bump: entry.bump,
|
|
975
|
+
summaries: [changeset.summary]
|
|
976
|
+
});
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
const packageVersions = /* @__PURE__ */ new Map();
|
|
981
|
+
const allPackageNames = new Set(aggregated.keys());
|
|
982
|
+
for (const group of options?.linked ?? []) {
|
|
983
|
+
for (const name of group) allPackageNames.add(name);
|
|
984
|
+
}
|
|
985
|
+
for (const group of options?.fixed ?? []) {
|
|
986
|
+
for (const name of group) allPackageNames.add(name);
|
|
987
|
+
}
|
|
988
|
+
for (const pkgName of allPackageNames) {
|
|
989
|
+
const pkgDir = packageDirs?.get(pkgName) ?? rootDir;
|
|
990
|
+
const pkgJson = await readPackageJson(pkgDir);
|
|
991
|
+
packageVersions.set(pkgName, pkgJson.version ?? "0.0.0");
|
|
992
|
+
}
|
|
993
|
+
if (options?.linked?.length) {
|
|
994
|
+
applyLinkedGroups(aggregated, options.linked);
|
|
995
|
+
}
|
|
996
|
+
if (options?.fixed?.length && packageDirs) {
|
|
997
|
+
applyFixedGroups(aggregated, options.fixed, packageVersions);
|
|
998
|
+
}
|
|
999
|
+
if (packageDirs && packageDirs.size > 0) {
|
|
1000
|
+
const mode = options?.dependentBumping ?? "none";
|
|
1001
|
+
if (mode !== "none") {
|
|
1002
|
+
const packageInfos = [];
|
|
1003
|
+
for (const [name, dir] of packageDirs) {
|
|
1004
|
+
const pkg = await readPackageJson(dir);
|
|
1005
|
+
packageInfos.push({
|
|
1006
|
+
name,
|
|
1007
|
+
dependencies: pkg.dependencies ?? {},
|
|
1008
|
+
devDependencies: pkg.devDependencies ?? {}
|
|
1009
|
+
});
|
|
1010
|
+
}
|
|
1011
|
+
const initialBumps = /* @__PURE__ */ new Map();
|
|
1012
|
+
for (const [name, { bump }] of aggregated) {
|
|
1013
|
+
initialBumps.set(name, bump);
|
|
1014
|
+
}
|
|
1015
|
+
const allBumps = computeDependentBumps(packageInfos, initialBumps, mode);
|
|
1016
|
+
for (const [name, bump] of allBumps) {
|
|
1017
|
+
if (!aggregated.has(name)) {
|
|
1018
|
+
aggregated.set(name, { bump, summaries: ["Dependency version bump"] });
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
const updates = [];
|
|
1024
|
+
for (const [pkgName, { bump, summaries, targetVersion }] of aggregated) {
|
|
1025
|
+
const pkgDir = packageDirs?.get(pkgName) ?? rootDir;
|
|
1026
|
+
const pkgJson = await readPackageJson(pkgDir);
|
|
1027
|
+
const oldVersion = pkgJson.version ?? "0.0.0";
|
|
1028
|
+
const newVersion = targetVersion ?? bumpVersion(oldVersion, bump);
|
|
1029
|
+
const changelogEntry = summaries.map((s) => `- ${s}`).join("\n");
|
|
1030
|
+
const changelog = `## ${newVersion}
|
|
1031
|
+
|
|
1032
|
+
${changelogEntry}`;
|
|
1033
|
+
pkgJson.version = newVersion;
|
|
1034
|
+
await writePackageJson(pkgDir, pkgJson);
|
|
1035
|
+
const changelogPath = join2(pkgDir, "CHANGELOG.md");
|
|
1036
|
+
let existingChangelog = "";
|
|
1037
|
+
if (await fileExists(changelogPath)) {
|
|
1038
|
+
existingChangelog = await readFile2(changelogPath, "utf-8");
|
|
1039
|
+
}
|
|
1040
|
+
const newChangelog = existingChangelog ? `${changelog}
|
|
1041
|
+
|
|
1042
|
+
${existingChangelog}` : `# Changelog
|
|
1043
|
+
|
|
1044
|
+
${changelog}
|
|
1045
|
+
`;
|
|
1046
|
+
await writeFile2(changelogPath, newChangelog, "utf-8");
|
|
1047
|
+
updates.push({
|
|
1048
|
+
packageName: pkgName,
|
|
1049
|
+
oldVersion,
|
|
1050
|
+
newVersion,
|
|
1051
|
+
bump,
|
|
1052
|
+
changelog
|
|
1053
|
+
});
|
|
1054
|
+
}
|
|
1055
|
+
const cleanup = async () => {
|
|
1056
|
+
for (const file of mdFiles) {
|
|
1057
|
+
await unlink(join2(changesetDir, file));
|
|
1058
|
+
}
|
|
1059
|
+
};
|
|
1060
|
+
return { updates, cleanup };
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
// src/changeset/snapshot.ts
|
|
1064
|
+
import { readdir as readdir2 } from "node:fs/promises";
|
|
1065
|
+
import { join as join3 } from "node:path";
|
|
1066
|
+
async function createSnapshot(rootDir, tag, packageDirs) {
|
|
1067
|
+
const changesetDir = join3(rootDir, ".changeset");
|
|
1068
|
+
const files = await readdir2(changesetDir);
|
|
1069
|
+
const mdFiles = files.filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
1070
|
+
const packages = /* @__PURE__ */ new Set();
|
|
1071
|
+
for (const file of mdFiles) {
|
|
1072
|
+
const changeset = await parseChangeset(join3(changesetDir, file));
|
|
1073
|
+
for (const entry of changeset.entries) {
|
|
1074
|
+
packages.add(entry.packageName);
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
const timestamp = Date.now();
|
|
1078
|
+
const suffix = tag ? `${tag}-${timestamp}` : `snapshot-${timestamp}`;
|
|
1079
|
+
const snapshotVersion = `0.0.0-${suffix}`;
|
|
1080
|
+
const versions = [];
|
|
1081
|
+
for (const pkgName of packages) {
|
|
1082
|
+
const pkgDir = packageDirs?.get(pkgName) ?? rootDir;
|
|
1083
|
+
const pkgJson = await readPackageJson(pkgDir);
|
|
1084
|
+
pkgJson.version = snapshotVersion;
|
|
1085
|
+
await writePackageJson(pkgDir, pkgJson);
|
|
1086
|
+
versions.push(`${pkgName}@${snapshotVersion}`);
|
|
1087
|
+
}
|
|
1088
|
+
return versions;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
// src/cli/changeset.ts
|
|
1092
|
+
import { readdir as readdir3 } from "node:fs/promises";
|
|
1093
|
+
import { join as join4, basename as basename2 } from "node:path";
|
|
1094
|
+
function registerChangeset(program) {
|
|
1095
|
+
const cmd = program.command("changeset").description("Manage changesets for versioning");
|
|
1096
|
+
cmd.action(async () => {
|
|
1097
|
+
await addChangeset();
|
|
1098
|
+
});
|
|
1099
|
+
cmd.command("add").description("Create a new changeset").action(async () => {
|
|
1100
|
+
await addChangeset();
|
|
1101
|
+
});
|
|
1102
|
+
cmd.command("version").description("Consume changesets and update versions").option("--dry-run", "Preview without making changes").action(async (options) => {
|
|
1103
|
+
const dir = process.cwd();
|
|
1104
|
+
logger.heading("tspub changeset version");
|
|
1105
|
+
if (options.dryRun) {
|
|
1106
|
+
const changesetDir = join4(dir, ".changeset");
|
|
1107
|
+
try {
|
|
1108
|
+
const files = (await readdir3(changesetDir)).filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
1109
|
+
if (files.length === 0) {
|
|
1110
|
+
logger.info("No pending changesets");
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1113
|
+
const bumps = /* @__PURE__ */ new Map();
|
|
1114
|
+
for (const file of files) {
|
|
1115
|
+
const cs = await parseChangeset(join4(changesetDir, file));
|
|
1116
|
+
for (const entry of cs.entries) {
|
|
1117
|
+
const current = bumps.get(entry.packageName);
|
|
1118
|
+
if (!current || bumpRank(entry.bump) > bumpRank(current)) {
|
|
1119
|
+
bumps.set(entry.packageName, entry.bump);
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
for (const [name, bump] of bumps) {
|
|
1124
|
+
logger.info(`${name}: ${bump}`);
|
|
1125
|
+
}
|
|
1126
|
+
} catch {
|
|
1127
|
+
logger.info("No .changeset directory found");
|
|
1128
|
+
}
|
|
1129
|
+
return;
|
|
1130
|
+
}
|
|
1131
|
+
let packageDirs;
|
|
1132
|
+
if (await isMonorepoRoot(dir)) {
|
|
1133
|
+
const workspaces = await discoverWorkspaces(dir);
|
|
1134
|
+
packageDirs = new Map(workspaces.map((w) => [w.name, w.dir]));
|
|
1135
|
+
}
|
|
1136
|
+
const config = await loadConfig(dir);
|
|
1137
|
+
const csConfig = config?.changeset;
|
|
1138
|
+
const { updates, cleanup } = await consumeChangesets(dir, packageDirs, {
|
|
1139
|
+
dependentBumping: csConfig?.dependentBumping,
|
|
1140
|
+
linked: csConfig?.linked,
|
|
1141
|
+
fixed: csConfig?.fixed
|
|
1142
|
+
});
|
|
1143
|
+
if (updates.length === 0) {
|
|
1144
|
+
logger.info("No changesets to consume");
|
|
1145
|
+
return;
|
|
1146
|
+
}
|
|
1147
|
+
for (const u of updates) {
|
|
1148
|
+
logger.success(`${u.packageName}: ${u.oldVersion} \u2192 ${u.newVersion} (${u.bump})`);
|
|
1149
|
+
}
|
|
1150
|
+
await cleanup();
|
|
1151
|
+
});
|
|
1152
|
+
cmd.command("status").description("Show pending changesets").action(async () => {
|
|
1153
|
+
const dir = process.cwd();
|
|
1154
|
+
const changesetDir = join4(dir, ".changeset");
|
|
1155
|
+
try {
|
|
1156
|
+
const files = (await readdir3(changesetDir)).filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
1157
|
+
if (files.length === 0) {
|
|
1158
|
+
logger.info("No pending changesets");
|
|
1159
|
+
return;
|
|
1160
|
+
}
|
|
1161
|
+
logger.heading("Pending changesets");
|
|
1162
|
+
for (const file of files) {
|
|
1163
|
+
const cs = await parseChangeset(join4(changesetDir, file));
|
|
1164
|
+
const pkgs = cs.entries.map((e) => `${e.packageName}:${e.bump}`).join(", ");
|
|
1165
|
+
logger.info(`${basename2(file, ".md")}: ${pkgs} \u2014 ${cs.summary.slice(0, 60)}`);
|
|
1166
|
+
}
|
|
1167
|
+
} catch {
|
|
1168
|
+
logger.info("No .changeset directory found");
|
|
1169
|
+
}
|
|
1170
|
+
});
|
|
1171
|
+
cmd.command("snapshot").description("Publish snapshot versions").option("--tag <tag>", "Snapshot tag", "snapshot").action(async (options) => {
|
|
1172
|
+
const dir = process.cwd();
|
|
1173
|
+
logger.heading("tspub changeset snapshot");
|
|
1174
|
+
const versions = await createSnapshot(dir, options.tag);
|
|
1175
|
+
if (versions.length === 0) {
|
|
1176
|
+
logger.info("No changesets found for snapshot");
|
|
1177
|
+
return;
|
|
1178
|
+
}
|
|
1179
|
+
for (const v of versions) {
|
|
1180
|
+
logger.success(`Snapshot: ${v}`);
|
|
1181
|
+
}
|
|
1182
|
+
});
|
|
1183
|
+
}
|
|
1184
|
+
function bumpRank(bump) {
|
|
1185
|
+
switch (bump) {
|
|
1186
|
+
case "major":
|
|
1187
|
+
return 3;
|
|
1188
|
+
case "minor":
|
|
1189
|
+
return 2;
|
|
1190
|
+
case "patch":
|
|
1191
|
+
return 1;
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
async function addChangeset() {
|
|
1195
|
+
const dir = process.cwd();
|
|
1196
|
+
logger.heading("tspub changeset add");
|
|
1197
|
+
let packageName;
|
|
1198
|
+
const prompts2 = (await import("prompts")).default;
|
|
1199
|
+
if (await isMonorepoRoot(dir)) {
|
|
1200
|
+
const workspaces = await discoverWorkspaces(dir);
|
|
1201
|
+
const { selected } = await prompts2({
|
|
1202
|
+
type: "multiselect",
|
|
1203
|
+
name: "selected",
|
|
1204
|
+
message: "Select packages",
|
|
1205
|
+
choices: workspaces.map((w) => ({ title: w.name, value: w.name }))
|
|
1206
|
+
});
|
|
1207
|
+
if (!selected || selected.length === 0) {
|
|
1208
|
+
logger.info("No packages selected");
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
const { bump } = await prompts2({
|
|
1212
|
+
type: "select",
|
|
1213
|
+
name: "bump",
|
|
1214
|
+
message: "Bump type",
|
|
1215
|
+
choices: [
|
|
1216
|
+
{ title: "patch", value: "patch" },
|
|
1217
|
+
{ title: "minor", value: "minor" },
|
|
1218
|
+
{ title: "major", value: "major" }
|
|
1219
|
+
]
|
|
1220
|
+
});
|
|
1221
|
+
const { summary } = await prompts2({
|
|
1222
|
+
type: "text",
|
|
1223
|
+
name: "summary",
|
|
1224
|
+
message: "Summary"
|
|
1225
|
+
});
|
|
1226
|
+
if (!summary) {
|
|
1227
|
+
logger.info("Cancelled");
|
|
1228
|
+
return;
|
|
1229
|
+
}
|
|
1230
|
+
const entries = selected.map((name) => ({ packageName: name, bump }));
|
|
1231
|
+
const filePath = await writeChangeset(dir, entries, summary);
|
|
1232
|
+
logger.success(`Created changeset: ${filePath}`);
|
|
1233
|
+
} else {
|
|
1234
|
+
const pkg = await readPackageJson(dir);
|
|
1235
|
+
packageName = pkg.name ?? basename2(dir);
|
|
1236
|
+
const { bump } = await prompts2({
|
|
1237
|
+
type: "select",
|
|
1238
|
+
name: "bump",
|
|
1239
|
+
message: "Bump type",
|
|
1240
|
+
choices: [
|
|
1241
|
+
{ title: "patch", value: "patch" },
|
|
1242
|
+
{ title: "minor", value: "minor" },
|
|
1243
|
+
{ title: "major", value: "major" }
|
|
1244
|
+
]
|
|
1245
|
+
});
|
|
1246
|
+
const { summary } = await prompts2({
|
|
1247
|
+
type: "text",
|
|
1248
|
+
name: "summary",
|
|
1249
|
+
message: "Summary"
|
|
1250
|
+
});
|
|
1251
|
+
if (!summary) {
|
|
1252
|
+
logger.info("Cancelled");
|
|
1253
|
+
return;
|
|
1254
|
+
}
|
|
1255
|
+
const filePath = await writeChangeset(dir, [{ packageName, bump }], summary);
|
|
1256
|
+
logger.success(`Created changeset: ${filePath}`);
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
// src/cli/index.ts
|
|
1261
|
+
function getVersion() {
|
|
1262
|
+
try {
|
|
1263
|
+
const require2 = createRequire(import.meta.url);
|
|
1264
|
+
const pkg = require2("../../package.json");
|
|
1265
|
+
return pkg.version;
|
|
1266
|
+
} catch {
|
|
1267
|
+
return "0.0.0";
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
function createProgram() {
|
|
1271
|
+
const program = new Command();
|
|
1272
|
+
program.name("tspub").description(
|
|
1273
|
+
"The unified TypeScript package toolkit \u2014 init, build, check, publish in one tool"
|
|
1274
|
+
).version(getVersion()).option("--verbose", "Enable verbose logging").option("--silent", "Suppress all output except errors").hook("preAction", (_thisCommand, actionCommand) => {
|
|
1275
|
+
const opts = actionCommand.optsWithGlobals();
|
|
1276
|
+
if (opts["verbose"]) {
|
|
1277
|
+
logger.setLevel("verbose");
|
|
1278
|
+
} else if (opts["silent"]) {
|
|
1279
|
+
logger.setLevel("silent");
|
|
1280
|
+
}
|
|
1281
|
+
});
|
|
1282
|
+
registerInit(program);
|
|
1283
|
+
registerBuild(program);
|
|
1284
|
+
registerCheck(program);
|
|
1285
|
+
registerPublish(program);
|
|
1286
|
+
registerDoctor(program);
|
|
1287
|
+
registerScan(program);
|
|
1288
|
+
registerTestTypes(program);
|
|
1289
|
+
registerChangeset(program);
|
|
1290
|
+
program.command("pack").description("Preview what gets published").action(async () => {
|
|
1291
|
+
try {
|
|
1292
|
+
const { execFileSync } = await import("node:child_process");
|
|
1293
|
+
console.log(execFileSync("npm", ["pack", "--dry-run"], { encoding: "utf-8" }));
|
|
1294
|
+
} catch (err) {
|
|
1295
|
+
logger.error(`Pack failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1296
|
+
process.exitCode = 1;
|
|
1297
|
+
}
|
|
1298
|
+
});
|
|
1299
|
+
return program;
|
|
1300
|
+
}
|
|
1301
|
+
function run(argv) {
|
|
1302
|
+
const program = createProgram();
|
|
1303
|
+
program.parse(argv);
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
// bin/tspub.ts
|
|
1307
|
+
run(process.argv);
|
|
1308
|
+
//# sourceMappingURL=tspub.js.map
|