@hyperfrontend/builder 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/CHANGELOG.md +63 -0
- package/FUNDING.md +141 -0
- package/LICENSE.md +21 -0
- package/README.md +162 -0
- package/SECURITY.md +82 -0
- package/THIRD_PARTY_LICENSES.md +13 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/array/index.cjs.js +7 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/array/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/console/index.cjs.js +13 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/console/index.esm.js +8 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/date/index.cjs.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/date/index.esm.js +4 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/encoding/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/encoding/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/error/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/error/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/function/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/function/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/json/index.cjs.js +7 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/json/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/map/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/map/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/math/index.cjs.js +7 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/math/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/messaging/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/messaging/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/number/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/number/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/object/index.cjs.js +13 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/object/index.esm.js +8 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/promise/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/promise/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/reflect/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/reflect/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/regexp/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/regexp/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/set/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/set/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/string/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/string/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/symbol/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/symbol/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/timers/index.cjs.js +13 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/timers/index.esm.js +10 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/typed-arrays/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/typed-arrays/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/url/index.cjs.js +6 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/url/index.esm.js +5 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/weak-map/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/weak-map/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/weak-set/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/weak-set/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/websocket/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/websocket/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/locked/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/locked/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/locked-prop-descriptors/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/locked-prop-descriptors/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/locked-props/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/immutable-api-utils/locked-props/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/logging/index.cjs.js +191 -0
- package/_dependencies/@hyperfrontend/logging/index.esm.js +186 -0
- package/_dependencies/@hyperfrontend/project-scope/cli/index.cjs.js +196 -0
- package/_dependencies/@hyperfrontend/project-scope/cli/index.esm.js +196 -0
- package/_dependencies/@hyperfrontend/project-scope/core/encoding/index.cjs.js +82 -0
- package/_dependencies/@hyperfrontend/project-scope/core/encoding/index.esm.js +82 -0
- package/_dependencies/@hyperfrontend/project-scope/core/fs/index.cjs.js +154 -0
- package/_dependencies/@hyperfrontend/project-scope/core/fs/index.esm.js +149 -0
- package/_dependencies/@hyperfrontend/project-scope/core/index.cjs.js +459 -0
- package/_dependencies/@hyperfrontend/project-scope/core/index.esm.js +440 -0
- package/_dependencies/@hyperfrontend/project-scope/core/logger/index.cjs.js +84 -0
- package/_dependencies/@hyperfrontend/project-scope/core/logger/index.esm.js +80 -0
- package/_dependencies/@hyperfrontend/project-scope/core/path/index.cjs.js +26 -0
- package/_dependencies/@hyperfrontend/project-scope/core/path/index.esm.js +22 -0
- package/_dependencies/@hyperfrontend/project-scope/core/platform/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/project-scope/core/platform/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/dependencies/index.cjs.js +90 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/dependencies/index.esm.js +90 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/entry-points/index.cjs.js +174 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/entry-points/index.esm.js +174 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/framework/index.cjs.js +174 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/framework/index.esm.js +172 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/index.cjs.js +184 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/index.esm.js +184 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/project-type/index.cjs.js +172 -0
- package/_dependencies/@hyperfrontend/project-scope/heuristics/project-type/index.esm.js +172 -0
- package/_dependencies/@hyperfrontend/project-scope/index.cjs.js +222 -0
- package/_dependencies/@hyperfrontend/project-scope/index.esm.js +219 -0
- package/_dependencies/@hyperfrontend/project-scope/models/index.cjs.js +2 -0
- package/_dependencies/@hyperfrontend/project-scope/models/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/project-scope/nx/index.cjs.js +94 -0
- package/_dependencies/@hyperfrontend/project-scope/nx/index.esm.js +94 -0
- package/_dependencies/@hyperfrontend/project-scope/project/config/index.cjs.js +172 -0
- package/_dependencies/@hyperfrontend/project-scope/project/config/index.esm.js +172 -0
- package/_dependencies/@hyperfrontend/project-scope/project/index.cjs.js +176 -0
- package/_dependencies/@hyperfrontend/project-scope/project/index.esm.js +176 -0
- package/_dependencies/@hyperfrontend/project-scope/project/package/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/project/package/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/project/root/index.cjs.js +154 -0
- package/_dependencies/@hyperfrontend/project-scope/project/root/index.esm.js +153 -0
- package/_dependencies/@hyperfrontend/project-scope/project/traversal/index.cjs.js +91 -0
- package/_dependencies/@hyperfrontend/project-scope/project/traversal/index.esm.js +89 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/backend/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/backend/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/build/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/build/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/frontend/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/frontend/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/index.cjs.js +171 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/index.esm.js +169 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/legacy/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/legacy/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/linting/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/linting/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/monorepo/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/monorepo/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/testing/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/testing/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/types/index.cjs.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/tech/types/index.esm.js +88 -0
- package/_dependencies/@hyperfrontend/project-scope/vfs/index.cjs.js +102 -0
- package/_dependencies/@hyperfrontend/project-scope/vfs/index.esm.js +102 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/compare/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/compare/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/models/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/models/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/operations/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/operations/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/parse/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/parse/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/serialize/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/changelog/serialize/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/commits/author/index.cjs.js +2403 -0
- package/_dependencies/@hyperfrontend/versioning/commits/author/index.esm.js +2381 -0
- package/_dependencies/@hyperfrontend/versioning/commits/classify/index.cjs.js +38 -0
- package/_dependencies/@hyperfrontend/versioning/commits/classify/index.esm.js +30 -0
- package/_dependencies/@hyperfrontend/versioning/commits/format/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/commits/format/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/commits/index.cjs.js +2457 -0
- package/_dependencies/@hyperfrontend/versioning/commits/index.esm.js +2407 -0
- package/_dependencies/@hyperfrontend/versioning/commits/models/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/commits/models/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/commits/parse/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/commits/parse/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/commits/validate/index.cjs.js +27 -0
- package/_dependencies/@hyperfrontend/versioning/commits/validate/index.esm.js +25 -0
- package/_dependencies/@hyperfrontend/versioning/flow/executor/index.cjs.js +36 -0
- package/_dependencies/@hyperfrontend/versioning/flow/executor/index.esm.js +36 -0
- package/_dependencies/@hyperfrontend/versioning/flow/index.cjs.js +51 -0
- package/_dependencies/@hyperfrontend/versioning/flow/index.esm.js +51 -0
- package/_dependencies/@hyperfrontend/versioning/flow/models/index.cjs.js +30 -0
- package/_dependencies/@hyperfrontend/versioning/flow/models/index.esm.js +28 -0
- package/_dependencies/@hyperfrontend/versioning/flow/presets/index.cjs.js +47 -0
- package/_dependencies/@hyperfrontend/versioning/flow/presets/index.esm.js +45 -0
- package/_dependencies/@hyperfrontend/versioning/flow/steps/index.cjs.js +47 -0
- package/_dependencies/@hyperfrontend/versioning/flow/steps/index.esm.js +45 -0
- package/_dependencies/@hyperfrontend/versioning/git/index.cjs.js +8 -0
- package/_dependencies/@hyperfrontend/versioning/git/index.esm.js +9 -0
- package/_dependencies/@hyperfrontend/versioning/git/models/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/git/models/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/git/operations/index.cjs.js +3 -0
- package/_dependencies/@hyperfrontend/versioning/git/operations/index.esm.js +3 -0
- package/_dependencies/@hyperfrontend/versioning/index.cjs.js +2481 -0
- package/_dependencies/@hyperfrontend/versioning/index.esm.js +2423 -0
- package/_dependencies/@hyperfrontend/versioning/registry/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/registry/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/registry/models/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/registry/models/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/registry/npm/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/registry/npm/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/repository/index.cjs.js +18 -0
- package/_dependencies/@hyperfrontend/versioning/repository/index.esm.js +17 -0
- package/_dependencies/@hyperfrontend/versioning/repository/models/index.cjs.js +11 -0
- package/_dependencies/@hyperfrontend/versioning/repository/models/index.esm.js +10 -0
- package/_dependencies/@hyperfrontend/versioning/repository/parse/index.cjs.js +184 -0
- package/_dependencies/@hyperfrontend/versioning/repository/parse/index.esm.js +185 -0
- package/_dependencies/@hyperfrontend/versioning/repository/url/index.cjs.js +10 -0
- package/_dependencies/@hyperfrontend/versioning/repository/url/index.esm.js +8 -0
- package/_dependencies/@hyperfrontend/versioning/semver/compare/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/compare/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/format/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/format/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/increment/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/increment/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/models/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/models/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/parse/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/semver/parse/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/workspace/discovery/index.cjs.js +29 -0
- package/_dependencies/@hyperfrontend/versioning/workspace/discovery/index.esm.js +29 -0
- package/_dependencies/@hyperfrontend/versioning/workspace/index.cjs.js +29 -0
- package/_dependencies/@hyperfrontend/versioning/workspace/index.esm.js +29 -0
- package/_dependencies/@hyperfrontend/versioning/workspace/models/index.cjs.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/workspace/models/index.esm.js +1 -0
- package/_dependencies/@hyperfrontend/versioning/workspace/operations/index.cjs.js +2 -0
- package/_dependencies/@hyperfrontend/versioning/workspace/operations/index.esm.js +2 -0
- package/_dependencies/@rollup/plugin-commonjs/index.cjs.js +6629 -0
- package/_dependencies/@rollup/plugin-commonjs/index.esm.js +6608 -0
- package/_dependencies/@rollup/plugin-json/index.cjs.js +2324 -0
- package/_dependencies/@rollup/plugin-json/index.esm.js +2322 -0
- package/_dependencies/@rollup/plugin-node-resolve/index.cjs.js +5430 -0
- package/_dependencies/@rollup/plugin-node-resolve/index.esm.js +5424 -0
- package/_dependencies/@rollup/plugin-terser/index.cjs.js +33220 -0
- package/_dependencies/@rollup/plugin-terser/index.esm.js +33217 -0
- package/_dependencies/@rollup/plugin-typescript/index.cjs.js +4840 -0
- package/_dependencies/@rollup/plugin-typescript/index.esm.js +4819 -0
- package/_dependencies/postject/index.cjs.js +5140 -0
- package/_dependencies/postject/index.esm.js +5131 -0
- package/_dependencies/rollup/index.cjs.js +24668 -0
- package/_dependencies/rollup/index.d.ts +1921 -0
- package/_dependencies/rollup/index.esm.js +24652 -0
- package/_dependencies/rollup-plugin-dts/index.cjs.js +6547 -0
- package/_dependencies/rollup-plugin-dts/index.esm.js +6537 -0
- package/_shared/bin/format/index.cjs.js +7 -0
- package/_shared/bin/format/index.esm.js +5 -0
- package/_shared/bin/native/codesign/index.cjs.js +30 -0
- package/_shared/bin/native/codesign/index.esm.js +26 -0
- package/_shared/bin/native/host-binary/index.cjs.js +13 -0
- package/_shared/bin/native/host-binary/index.esm.js +11 -0
- package/_shared/bin/native/inject/index.cjs.js +25 -0
- package/_shared/bin/native/inject/index.esm.js +18 -0
- package/_shared/bin/native/platform-check/index.cjs.js +13 -0
- package/_shared/bin/native/platform-check/index.esm.js +10 -0
- package/_shared/bin/native/sea-blob/index.cjs.js +21 -0
- package/_shared/bin/native/sea-blob/index.esm.js +19 -0
- package/_shared/bin/native/sea-config/index.cjs.js +9 -0
- package/_shared/bin/native/sea-config/index.esm.js +7 -0
- package/_shared/bin/script/bootstrap-footer/index.cjs.js +22 -0
- package/_shared/bin/script/bootstrap-footer/index.esm.js +19 -0
- package/_shared/bundle/declarations/flatten-paths/index.cjs.js +34 -0
- package/_shared/bundle/declarations/flatten-paths/index.esm.js +29 -0
- package/_shared/bundle/dependencies/collect-workspace-deps/index.cjs.js +24 -0
- package/_shared/bundle/dependencies/collect-workspace-deps/index.esm.js +21 -0
- package/_shared/bundle/dependencies/externalize-plugin/index.cjs.js +93 -0
- package/_shared/bundle/dependencies/externalize-plugin/index.esm.js +86 -0
- package/_shared/bundle/dependencies/prune/ast-utils/index.esm.js +31 -0
- package/_shared/bundle/dependencies/prune/namespace-usage/index.esm.js +208 -0
- package/_shared/bundle/dependencies/prune/specifiers/index.cjs.js +62 -0
- package/_shared/bundle/dependencies/prune/specifiers/index.esm.js +53 -0
- package/_shared/bundle/entries/discover-entries/index.cjs.js +87 -0
- package/_shared/bundle/entries/discover-entries/index.esm.js +80 -0
- package/_shared/bundle/entries/resolve-entries/index.cjs.js +38 -0
- package/_shared/bundle/entries/resolve-entries/index.esm.js +34 -0
- package/_shared/bundle/externals/validate-globals/index.cjs.js +14 -0
- package/_shared/bundle/externals/validate-globals/index.esm.js +12 -0
- package/_shared/bundle/fs/deps-root/index.cjs.js +7 -0
- package/_shared/bundle/fs/deps-root/index.esm.js +5 -0
- package/_shared/bundle/fs/empty-dirs/index.cjs.js +23 -0
- package/_shared/bundle/fs/empty-dirs/index.esm.js +21 -0
- package/_shared/bundle/fs/entry-dir/index.cjs.js +7 -0
- package/_shared/bundle/fs/entry-dir/index.esm.js +5 -0
- package/_shared/bundle/fs/posix-path/index.cjs.js +9 -0
- package/_shared/bundle/fs/posix-path/index.esm.js +4 -0
- package/_shared/bundle/fs/under-dir/index.cjs.js +5 -0
- package/_shared/bundle/fs/under-dir/index.esm.js +3 -0
- package/_shared/memory/recover/index.cjs.js +15 -0
- package/_shared/memory/recover/index.esm.js +14 -0
- package/_shared/package/finalize-files/index.cjs.js +16 -0
- package/_shared/package/finalize-files/index.esm.js +15 -0
- package/_shared/package/json/cdn-paths/index.cjs.js +13 -0
- package/_shared/package/json/cdn-paths/index.esm.js +11 -0
- package/_shared/package/json/filter-deps/index.cjs.js +37 -0
- package/_shared/package/json/filter-deps/index.esm.js +34 -0
- package/_shared/package/json/generate-exports/index.cjs.js +56 -0
- package/_shared/package/json/generate-exports/index.esm.js +52 -0
- package/_shared/package/json/inherit-fields/index.cjs.js +19 -0
- package/_shared/package/json/inherit-fields/index.esm.js +17 -0
- package/_shared/package/json/read-package-json/index.cjs.js +7 -0
- package/_shared/package/json/read-package-json/index.esm.js +6 -0
- package/_shared/package/json/reflect-files-allowlist/index.cjs.js +39 -0
- package/_shared/package/json/reflect-files-allowlist/index.esm.js +33 -0
- package/_shared/package/json/synthesize/index.cjs.js +72 -0
- package/_shared/package/json/synthesize/index.esm.js +68 -0
- package/_shared/package/json/write/index.cjs.js +9 -0
- package/_shared/package/json/write/index.esm.js +8 -0
- package/_shared/package/licenses/generate-content/index.cjs.js +17 -0
- package/_shared/package/licenses/generate-content/index.esm.js +17 -0
- package/_shared/package/licenses/license-url/index.esm.js +29 -0
- package/_shared/package/licenses/write/index.cjs.js +9 -0
- package/_shared/package/licenses/write/index.esm.js +8 -0
- package/_shared/presets/by-names/index.cjs.js +10 -0
- package/_shared/presets/by-names/index.esm.js +8 -0
- package/_shared/presets/by-prefix/index.cjs.js +7 -0
- package/_shared/presets/by-prefix/index.esm.js +5 -0
- package/bin/format.d.ts +18 -0
- package/bin/format.d.ts.map +1 -0
- package/bin/hf-build.d.ts +81 -0
- package/bin/hf-build.d.ts.map +1 -0
- package/bin/hf-build.js +208533 -0
- package/bin/hf-build.linux-x64 +0 -0
- package/bin/index.cjs.js +548 -0
- package/bin/index.d.ts +26 -0
- package/bin/index.d.ts.map +1 -0
- package/bin/index.esm.js +546 -0
- package/bin/native/build-native.d.ts +44 -0
- package/bin/native/build-native.d.ts.map +1 -0
- package/bin/native/codesign.d.ts +65 -0
- package/bin/native/codesign.d.ts.map +1 -0
- package/bin/native/dispatch.d.ts +75 -0
- package/bin/native/dispatch.d.ts.map +1 -0
- package/bin/native/host-binary.d.ts +36 -0
- package/bin/native/host-binary.d.ts.map +1 -0
- package/bin/native/index.cjs.js +264 -0
- package/bin/native/index.d.ts +407 -0
- package/bin/native/index.d.ts.map +1 -0
- package/bin/native/index.esm.js +249 -0
- package/bin/native/inject.d.ts +61 -0
- package/bin/native/inject.d.ts.map +1 -0
- package/bin/native/platform-check.d.ts +39 -0
- package/bin/native/platform-check.d.ts.map +1 -0
- package/bin/native/sea-blob.d.ts +40 -0
- package/bin/native/sea-blob.d.ts.map +1 -0
- package/bin/native/sea-config.d.ts +45 -0
- package/bin/native/sea-config.d.ts.map +1 -0
- package/bin/native/worker/index.cjs.js +88 -0
- package/bin/native/worker/index.d.ts +68 -0
- package/bin/native/worker/index.d.ts.map +1 -0
- package/bin/native/worker/index.esm.js +86 -0
- package/bin/native/worker/job-runner.d.ts +29 -0
- package/bin/native/worker/job-runner.d.ts.map +1 -0
- package/bin/native/worker/types.d.ts +38 -0
- package/bin/native/worker/types.d.ts.map +1 -0
- package/bin/run-bin-phase.d.ts +24 -0
- package/bin/run-bin-phase.d.ts.map +1 -0
- package/bin/script/bootstrap-footer.d.ts +41 -0
- package/bin/script/bootstrap-footer.d.ts.map +1 -0
- package/bin/script/build-bin.d.ts +36 -0
- package/bin/script/build-bin.d.ts.map +1 -0
- package/bin/script/index.cjs.js +265 -0
- package/bin/script/index.d.ts +79 -0
- package/bin/script/index.d.ts.map +1 -0
- package/bin/script/index.esm.js +262 -0
- package/build.d.ts +56 -0
- package/build.d.ts.map +1 -0
- package/bundle/declarations/dts-per-entry.d.ts +27 -0
- package/bundle/declarations/dts-per-entry.d.ts.map +1 -0
- package/bundle/declarations/dts-pre-pass.d.ts +18 -0
- package/bundle/declarations/dts-pre-pass.d.ts.map +1 -0
- package/bundle/declarations/flatten-paths.d.ts +28 -0
- package/bundle/declarations/flatten-paths.d.ts.map +1 -0
- package/bundle/declarations/generate-declarations.d.ts +33 -0
- package/bundle/declarations/generate-declarations.d.ts.map +1 -0
- package/bundle/declarations/index.cjs.js +868 -0
- package/bundle/declarations/index.d.ts +262 -0
- package/bundle/declarations/index.d.ts.map +1 -0
- package/bundle/declarations/index.esm.js +857 -0
- package/bundle/declarations/prune-orphan-dts.d.ts +33 -0
- package/bundle/declarations/prune-orphan-dts.d.ts.map +1 -0
- package/bundle/declarations/sibling-resolver.d.ts +125 -0
- package/bundle/declarations/sibling-resolver.d.ts.map +1 -0
- package/bundle/dedupe/attribute-modules.d.ts +178 -0
- package/bundle/dedupe/attribute-modules.d.ts.map +1 -0
- package/bundle/dedupe/extract-chunk.d.ts +103 -0
- package/bundle/dedupe/extract-chunk.d.ts.map +1 -0
- package/bundle/dedupe/hoist-shared.d.ts +37 -0
- package/bundle/dedupe/hoist-shared.d.ts.map +1 -0
- package/bundle/dedupe/index.cjs.js +818 -0
- package/bundle/dedupe/index.d.ts +400 -0
- package/bundle/dedupe/index.d.ts.map +1 -0
- package/bundle/dedupe/index.esm.js +766 -0
- package/bundle/dedupe/plan-hoists.d.ts +46 -0
- package/bundle/dedupe/plan-hoists.d.ts.map +1 -0
- package/bundle/dedupe/rewrite-entry.d.ts +39 -0
- package/bundle/dedupe/rewrite-entry.d.ts.map +1 -0
- package/bundle/dependencies/collect-workspace-deps.d.ts +34 -0
- package/bundle/dependencies/collect-workspace-deps.d.ts.map +1 -0
- package/bundle/dependencies/externalize-plugin.d.ts +100 -0
- package/bundle/dependencies/externalize-plugin.d.ts.map +1 -0
- package/bundle/dependencies/index.cjs.js +964 -0
- package/bundle/dependencies/index.d.ts +388 -0
- package/bundle/dependencies/index.d.ts.map +1 -0
- package/bundle/dependencies/index.esm.js +947 -0
- package/bundle/dependencies/pre-pass.d.ts +154 -0
- package/bundle/dependencies/pre-pass.d.ts.map +1 -0
- package/bundle/dependencies/prune/ast-utils.d.ts +121 -0
- package/bundle/dependencies/prune/ast-utils.d.ts.map +1 -0
- package/bundle/dependencies/prune/chunk-graph.d.ts +175 -0
- package/bundle/dependencies/prune/chunk-graph.d.ts.map +1 -0
- package/bundle/dependencies/prune/dead-export-pass.d.ts +32 -0
- package/bundle/dependencies/prune/dead-export-pass.d.ts.map +1 -0
- package/bundle/dependencies/prune/dead-exports.d.ts +36 -0
- package/bundle/dependencies/prune/dead-exports.d.ts.map +1 -0
- package/bundle/dependencies/prune/destructure-requires-pass.d.ts +31 -0
- package/bundle/dependencies/prune/destructure-requires-pass.d.ts.map +1 -0
- package/bundle/dependencies/prune/destructure-requires.d.ts +42 -0
- package/bundle/dependencies/prune/destructure-requires.d.ts.map +1 -0
- package/bundle/dependencies/prune/edits.d.ts +30 -0
- package/bundle/dependencies/prune/edits.d.ts.map +1 -0
- package/bundle/dependencies/prune/namespace-usage.d.ts +104 -0
- package/bundle/dependencies/prune/namespace-usage.d.ts.map +1 -0
- package/bundle/dependencies/prune/orphan-chunks.d.ts +69 -0
- package/bundle/dependencies/prune/orphan-chunks.d.ts.map +1 -0
- package/bundle/dependencies/prune/property-strip-pass.d.ts +38 -0
- package/bundle/dependencies/prune/property-strip-pass.d.ts.map +1 -0
- package/bundle/dependencies/prune/property-strip.d.ts +69 -0
- package/bundle/dependencies/prune/property-strip.d.ts.map +1 -0
- package/bundle/dependencies/prune/prune-dependencies.d.ts +52 -0
- package/bundle/dependencies/prune/prune-dependencies.d.ts.map +1 -0
- package/bundle/dependencies/prune/reachability.d.ts +36 -0
- package/bundle/dependencies/prune/reachability.d.ts.map +1 -0
- package/bundle/dependencies/prune/specifiers.d.ts +39 -0
- package/bundle/dependencies/prune/specifiers.d.ts.map +1 -0
- package/bundle/dependencies/prune/strip-comments.d.ts +47 -0
- package/bundle/dependencies/prune/strip-comments.d.ts.map +1 -0
- package/bundle/dependencies/prune/used-exports.d.ts +32 -0
- package/bundle/dependencies/prune/used-exports.d.ts.map +1 -0
- package/bundle/dependencies/resolve-bundled-deps.d.ts +37 -0
- package/bundle/dependencies/resolve-bundled-deps.d.ts.map +1 -0
- package/bundle/dependencies/resolve-dep-entry.d.ts +38 -0
- package/bundle/dependencies/resolve-dep-entry.d.ts.map +1 -0
- package/bundle/dependencies/resolve-workspace-bundled-deps.d.ts +96 -0
- package/bundle/dependencies/resolve-workspace-bundled-deps.d.ts.map +1 -0
- package/bundle/dependencies/worker/index.cjs.js +524 -0
- package/bundle/dependencies/worker/index.d.ts +102 -0
- package/bundle/dependencies/worker/index.d.ts.map +1 -0
- package/bundle/dependencies/worker/index.esm.js +515 -0
- package/bundle/dependencies/worker/job-runner.d.ts +115 -0
- package/bundle/dependencies/worker/job-runner.d.ts.map +1 -0
- package/bundle/entries/by-platform.d.ts +27 -0
- package/bundle/entries/by-platform.d.ts.map +1 -0
- package/bundle/entries/discover-entries.d.ts +24 -0
- package/bundle/entries/discover-entries.d.ts.map +1 -0
- package/bundle/entries/index.cjs.js +38 -0
- package/bundle/entries/index.d.ts +70 -0
- package/bundle/entries/index.d.ts.map +1 -0
- package/bundle/entries/index.esm.js +33 -0
- package/bundle/entries/resolve-entries.d.ts +19 -0
- package/bundle/entries/resolve-entries.d.ts.map +1 -0
- package/bundle/externals/index.cjs.js +54 -0
- package/bundle/externals/index.d.ts +74 -0
- package/bundle/externals/index.d.ts.map +1 -0
- package/bundle/externals/index.esm.js +51 -0
- package/bundle/externals/resolve-externals.d.ts +52 -0
- package/bundle/externals/resolve-externals.d.ts.map +1 -0
- package/bundle/externals/validate-globals.d.ts +19 -0
- package/bundle/externals/validate-globals.d.ts.map +1 -0
- package/bundle/fs/deps-root.d.ts +17 -0
- package/bundle/fs/deps-root.d.ts.map +1 -0
- package/bundle/fs/empty-dirs.d.ts +18 -0
- package/bundle/fs/empty-dirs.d.ts.map +1 -0
- package/bundle/fs/entry-dir.d.ts +21 -0
- package/bundle/fs/entry-dir.d.ts.map +1 -0
- package/bundle/fs/posix-path.d.ts +30 -0
- package/bundle/fs/posix-path.d.ts.map +1 -0
- package/bundle/fs/under-dir.d.ts +19 -0
- package/bundle/fs/under-dir.d.ts.map +1 -0
- package/bundle/index.cjs.js +4046 -0
- package/bundle/index.d.ts +25 -0
- package/bundle/index.d.ts.map +1 -0
- package/bundle/index.esm.js +3689 -0
- package/bundle/rollup/descriptor.d.ts +99 -0
- package/bundle/rollup/descriptor.d.ts.map +1 -0
- package/bundle/rollup/dispatch.d.ts +72 -0
- package/bundle/rollup/dispatch.d.ts.map +1 -0
- package/bundle/rollup/index.cjs.js +715 -0
- package/bundle/rollup/index.d.ts +174 -0
- package/bundle/rollup/index.d.ts.map +1 -0
- package/bundle/rollup/index.esm.js +698 -0
- package/bundle/rollup/worker/index.cjs.js +290 -0
- package/bundle/rollup/worker/index.d.ts +131 -0
- package/bundle/rollup/worker/index.d.ts.map +1 -0
- package/bundle/rollup/worker/index.esm.js +280 -0
- package/bundle/rollup/worker/job-runner.d.ts +18 -0
- package/bundle/rollup/worker/job-runner.d.ts.map +1 -0
- package/bundle/rollup/worker/types.d.ts +111 -0
- package/bundle/rollup/worker/types.d.ts.map +1 -0
- package/bundle/run-bundle-phase.d.ts +23 -0
- package/bundle/run-bundle-phase.d.ts.map +1 -0
- package/clean-output.d.ts +26 -0
- package/clean-output.d.ts.map +1 -0
- package/index.cjs.js +5317 -0
- package/index.d.ts +64 -0
- package/index.d.ts.map +1 -0
- package/index.esm.js +4910 -0
- package/memory/index.cjs.js +101 -0
- package/memory/index.d.ts +81 -0
- package/memory/index.d.ts.map +1 -0
- package/memory/index.esm.js +98 -0
- package/memory/monitor.d.ts +59 -0
- package/memory/monitor.d.ts.map +1 -0
- package/memory/recover.d.ts +19 -0
- package/memory/recover.d.ts.map +1 -0
- package/models/build-config.d.ts +266 -0
- package/models/build-config.d.ts.map +1 -0
- package/models/build-context.d.ts +68 -0
- package/models/build-context.d.ts.map +1 -0
- package/models/build-result.d.ts +43 -0
- package/models/build-result.d.ts.map +1 -0
- package/models/entry-point.d.ts +45 -0
- package/models/entry-point.d.ts.map +1 -0
- package/models/format-output.d.ts +34 -0
- package/models/format-output.d.ts.map +1 -0
- package/models/index.cjs.js +2 -0
- package/models/index.d.ts +581 -0
- package/models/index.d.ts.map +1 -0
- package/models/index.esm.js +1 -0
- package/models/package-json.d.ts +130 -0
- package/models/package-json.d.ts.map +1 -0
- package/package/assets/copy-assets.d.ts +31 -0
- package/package/assets/copy-assets.d.ts.map +1 -0
- package/package/assets/index.cjs.js +84 -0
- package/package/assets/index.d.ts +33 -0
- package/package/assets/index.d.ts.map +1 -0
- package/package/assets/index.esm.js +82 -0
- package/package/finalize-files.d.ts +25 -0
- package/package/finalize-files.d.ts.map +1 -0
- package/package/index.cjs.js +276 -0
- package/package/index.d.ts +56 -0
- package/package/index.d.ts.map +1 -0
- package/package/index.esm.js +231 -0
- package/package/json/cdn-paths.d.ts +41 -0
- package/package/json/cdn-paths.d.ts.map +1 -0
- package/package/json/filter-deps.d.ts +39 -0
- package/package/json/filter-deps.d.ts.map +1 -0
- package/package/json/generate-exports.d.ts +29 -0
- package/package/json/generate-exports.d.ts.map +1 -0
- package/package/json/index.cjs.js +24 -0
- package/package/json/index.d.ts +252 -0
- package/package/json/index.d.ts.map +1 -0
- package/package/json/index.esm.js +14 -0
- package/package/json/inherit-fields.d.ts +25 -0
- package/package/json/inherit-fields.d.ts.map +1 -0
- package/package/json/read-package-json.d.ts +18 -0
- package/package/json/read-package-json.d.ts.map +1 -0
- package/package/json/reflect-files-allowlist.d.ts +32 -0
- package/package/json/reflect-files-allowlist.d.ts.map +1 -0
- package/package/json/synthesize.d.ts +53 -0
- package/package/json/synthesize.d.ts.map +1 -0
- package/package/json/write.d.ts +18 -0
- package/package/json/write.d.ts.map +1 -0
- package/package/licenses/collect.d.ts +25 -0
- package/package/licenses/collect.d.ts.map +1 -0
- package/package/licenses/generate-content.d.ts +20 -0
- package/package/licenses/generate-content.d.ts.map +1 -0
- package/package/licenses/index.cjs.js +135 -0
- package/package/licenses/index.d.ts +73 -0
- package/package/licenses/index.d.ts.map +1 -0
- package/package/licenses/index.esm.js +89 -0
- package/package/licenses/license-url.d.ts +20 -0
- package/package/licenses/license-url.d.ts.map +1 -0
- package/package/licenses/types.d.ts +12 -0
- package/package/licenses/types.d.ts.map +1 -0
- package/package/licenses/write.d.ts +16 -0
- package/package/licenses/write.d.ts.map +1 -0
- package/package/run-package-phase.d.ts +30 -0
- package/package/run-package-phase.d.ts.map +1 -0
- package/package.json +347 -0
- package/presets/by-names.d.ts +20 -0
- package/presets/by-names.d.ts.map +1 -0
- package/presets/by-prefix.d.ts +22 -0
- package/presets/by-prefix.d.ts.map +1 -0
- package/presets/index.cjs.js +8 -0
- package/presets/index.d.ts +43 -0
- package/presets/index.d.ts.map +1 -0
- package/presets/index.esm.js +5 -0
|
@@ -0,0 +1,2457 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const node_path = require('node:path');
|
|
3
|
+
const index_cjs_js = require('../../immutable-api-utils/built-in-copy/error/index.cjs.js');
|
|
4
|
+
const index_cjs_js$2 = require('../../immutable-api-utils/built-in-copy/object/index.cjs.js');
|
|
5
|
+
const node_readline = require('node:readline');
|
|
6
|
+
const index_cjs_js$3 = require('../../immutable-api-utils/built-in-copy/promise/index.cjs.js');
|
|
7
|
+
const index_cjs_js$4 = require('../../immutable-api-utils/built-in-copy/math/index.cjs.js');
|
|
8
|
+
const index_cjs_js$5 = require('../../immutable-api-utils/built-in-copy/set/index.cjs.js');
|
|
9
|
+
const node_child_process = require('node:child_process');
|
|
10
|
+
require('../../immutable-api-utils/built-in-copy/date/index.cjs.js');
|
|
11
|
+
require('../../immutable-api-utils/built-in-copy/number/index.cjs.js');
|
|
12
|
+
const index_cjs_js$8 = require('../../immutable-api-utils/built-in-copy/json/index.cjs.js');
|
|
13
|
+
const index_cjs_js$7 = require('../../project-scope/core/fs/index.cjs.js');
|
|
14
|
+
const index_cjs_js$6 = require('../../project-scope/project/root/index.cjs.js');
|
|
15
|
+
|
|
16
|
+
function typeToChoice(type) {
|
|
17
|
+
return {
|
|
18
|
+
label: type.name,
|
|
19
|
+
value: type.name,
|
|
20
|
+
...(type.description && { hint: type.description }),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const SessionStatus = index_cjs_js$2.freeze({
|
|
25
|
+
Committed: 'committed',
|
|
26
|
+
Cancelled: 'cancelled',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const StepStatus = index_cjs_js$2.freeze({
|
|
30
|
+
Done: 'done',
|
|
31
|
+
Cancelled: 'cancelled',
|
|
32
|
+
Goto: 'goto',
|
|
33
|
+
});
|
|
34
|
+
function done() {
|
|
35
|
+
return { status: StepStatus.Done };
|
|
36
|
+
}
|
|
37
|
+
function cancelled(error) {
|
|
38
|
+
return error ? { status: StepStatus.Cancelled, error } : { status: StepStatus.Cancelled };
|
|
39
|
+
}
|
|
40
|
+
function goto(stepId) {
|
|
41
|
+
return { status: StepStatus.Goto, gotoStepId: stepId };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const Key = index_cjs_js$2.freeze({
|
|
45
|
+
Up: '\x1B[A',
|
|
46
|
+
Down: '\x1B[B',
|
|
47
|
+
Left: '\x1B[D',
|
|
48
|
+
Right: '\x1B[C',
|
|
49
|
+
Enter: '\r',
|
|
50
|
+
Space: ' ',
|
|
51
|
+
Tab: '\t',
|
|
52
|
+
Escape: '\x1B',
|
|
53
|
+
Backspace: '\x7F',
|
|
54
|
+
Delete: '\x1B[3~',
|
|
55
|
+
CtrlC: '\x03',
|
|
56
|
+
});
|
|
57
|
+
const Ansi = index_cjs_js$2.freeze({
|
|
58
|
+
ClearLine: '\x1B[2K',
|
|
59
|
+
CursorStart: '\r',
|
|
60
|
+
cursorUp: (n) => `\x1B[${n}A`,
|
|
61
|
+
cursorDown: (n) => `\x1B[${n}B`,
|
|
62
|
+
cursorLeft: (n) => `\x1B[${n}D`,
|
|
63
|
+
HideCursor: '\x1B[?25l',
|
|
64
|
+
ShowCursor: '\x1B[?25h',
|
|
65
|
+
SaveCursor: '\x1B7',
|
|
66
|
+
RestoreCursor: '\x1B8',
|
|
67
|
+
ClearToEnd: '\x1B[J',
|
|
68
|
+
Bold: '\x1B[1m',
|
|
69
|
+
Dim: '\x1B[2m',
|
|
70
|
+
Reset: '\x1B[0m',
|
|
71
|
+
Cyan: '\x1B[36m',
|
|
72
|
+
Green: '\x1B[32m',
|
|
73
|
+
Yellow: '\x1B[33m',
|
|
74
|
+
Red: '\x1B[31m',
|
|
75
|
+
Gray: '\x1B[90m',
|
|
76
|
+
});
|
|
77
|
+
function createTerminal(config = {}) {
|
|
78
|
+
const input = config.input ?? process.stdin;
|
|
79
|
+
const output = config.output ?? process.stdout;
|
|
80
|
+
let cancelled = false;
|
|
81
|
+
let rl;
|
|
82
|
+
const getReadline = () => {
|
|
83
|
+
if (!rl) {
|
|
84
|
+
rl = node_readline.createInterface({ input, output, terminal: true });
|
|
85
|
+
}
|
|
86
|
+
return rl;
|
|
87
|
+
};
|
|
88
|
+
const write = (text) => {
|
|
89
|
+
output.write(text);
|
|
90
|
+
};
|
|
91
|
+
const readKey = () => index_cjs_js$3.createPromise((resolve) => {
|
|
92
|
+
const wasRaw = input.isRaw;
|
|
93
|
+
if (input.setRawMode) {
|
|
94
|
+
input.setRawMode(true);
|
|
95
|
+
}
|
|
96
|
+
const onData = (data) => {
|
|
97
|
+
input.removeListener('data', onData);
|
|
98
|
+
if (input.setRawMode) {
|
|
99
|
+
input.setRawMode(wasRaw);
|
|
100
|
+
}
|
|
101
|
+
const key = data.toString();
|
|
102
|
+
if (key === Key.CtrlC) {
|
|
103
|
+
cancelled = true;
|
|
104
|
+
}
|
|
105
|
+
resolve(key);
|
|
106
|
+
};
|
|
107
|
+
input.once('data', onData);
|
|
108
|
+
});
|
|
109
|
+
const readLine = () => index_cjs_js$3.createPromise((resolve) => {
|
|
110
|
+
const readline = getReadline();
|
|
111
|
+
readline.once('line', (line) => {
|
|
112
|
+
resolve(line);
|
|
113
|
+
});
|
|
114
|
+
readline.once('close', () => {
|
|
115
|
+
cancelled = true;
|
|
116
|
+
resolve('');
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
const clearLines = (count) => {
|
|
120
|
+
if (count <= 0)
|
|
121
|
+
return;
|
|
122
|
+
for (let i = 0; i < count; i++) {
|
|
123
|
+
write(Ansi.CursorStart + Ansi.ClearLine);
|
|
124
|
+
if (i < count - 1) {
|
|
125
|
+
write(Ansi.cursorUp(1));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const close = () => {
|
|
130
|
+
if (rl) {
|
|
131
|
+
rl.close();
|
|
132
|
+
rl = undefined;
|
|
133
|
+
}
|
|
134
|
+
write(Ansi.ShowCursor);
|
|
135
|
+
};
|
|
136
|
+
return index_cjs_js$2.freeze({
|
|
137
|
+
write,
|
|
138
|
+
readKey,
|
|
139
|
+
readLine,
|
|
140
|
+
clearLines,
|
|
141
|
+
close,
|
|
142
|
+
isCancelled: () => cancelled,
|
|
143
|
+
cancel: () => {
|
|
144
|
+
cancelled = true;
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const Symbol = index_cjs_js$2.freeze({
|
|
150
|
+
Pointer: '❯',
|
|
151
|
+
Radio: '◯',
|
|
152
|
+
RadioSelected: '◉',
|
|
153
|
+
Checkbox: '☐',
|
|
154
|
+
CheckboxSelected: '☑',
|
|
155
|
+
Check: '✔',
|
|
156
|
+
Cross: '✖',
|
|
157
|
+
Question: '?',
|
|
158
|
+
Ellipsis: '…',
|
|
159
|
+
});
|
|
160
|
+
const style = index_cjs_js$2.freeze({
|
|
161
|
+
bold: (text) => `${Ansi.Bold}${text}${Ansi.Reset}`,
|
|
162
|
+
dim: (text) => `${Ansi.Dim}${text}${Ansi.Reset}`,
|
|
163
|
+
cyan: (text) => `${Ansi.Cyan}${text}${Ansi.Reset}`,
|
|
164
|
+
green: (text) => `${Ansi.Green}${text}${Ansi.Reset}`,
|
|
165
|
+
yellow: (text) => `${Ansi.Yellow}${text}${Ansi.Reset}`,
|
|
166
|
+
red: (text) => `${Ansi.Red}${text}${Ansi.Reset}`,
|
|
167
|
+
gray: (text) => `${Ansi.Gray}${text}${Ansi.Reset}`,
|
|
168
|
+
});
|
|
169
|
+
function renderMessage(message) {
|
|
170
|
+
return `${style.cyan(Symbol.Question)} ${style.bold(message)} `;
|
|
171
|
+
}
|
|
172
|
+
function renderSubmitted(value) {
|
|
173
|
+
return style.cyan(value);
|
|
174
|
+
}
|
|
175
|
+
function renderCancelled() {
|
|
176
|
+
return style.dim('(cancelled)');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const PromptResult = index_cjs_js$2.freeze({
|
|
180
|
+
Submitted: 'submitted',
|
|
181
|
+
Cancelled: 'cancelled',
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
function renderOptions(initial) {
|
|
185
|
+
if (initial === true) {
|
|
186
|
+
return style.dim('(Y/n)');
|
|
187
|
+
}
|
|
188
|
+
if (initial === false) {
|
|
189
|
+
return style.dim('(y/N)');
|
|
190
|
+
}
|
|
191
|
+
return style.dim('(y/n)');
|
|
192
|
+
}
|
|
193
|
+
async function confirm(config) {
|
|
194
|
+
const term = createTerminal({ input: config.input, output: config.output });
|
|
195
|
+
const drawPrompt = () => {
|
|
196
|
+
term.write(Ansi.CursorStart + Ansi.ClearLine);
|
|
197
|
+
term.write(renderMessage(config.message) + renderOptions(config.initial) + ' ');
|
|
198
|
+
};
|
|
199
|
+
const drawResult = (value) => {
|
|
200
|
+
term.write(Ansi.CursorStart + Ansi.ClearLine);
|
|
201
|
+
term.write(renderMessage(config.message) + renderSubmitted(value ? 'Yes' : 'No') + '\n');
|
|
202
|
+
};
|
|
203
|
+
drawPrompt();
|
|
204
|
+
while (true) {
|
|
205
|
+
const key = await term.readKey();
|
|
206
|
+
const lowerKey = key.toLowerCase();
|
|
207
|
+
if (term.isCancelled()) {
|
|
208
|
+
term.write(Ansi.CursorStart + Ansi.ClearLine);
|
|
209
|
+
term.write(renderMessage(config.message) + renderCancelled() + '\n');
|
|
210
|
+
term.close();
|
|
211
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Cancelled, value: undefined });
|
|
212
|
+
}
|
|
213
|
+
if (lowerKey === 'y') {
|
|
214
|
+
drawResult(true);
|
|
215
|
+
term.close();
|
|
216
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Submitted, value: true });
|
|
217
|
+
}
|
|
218
|
+
if (lowerKey === 'n') {
|
|
219
|
+
drawResult(false);
|
|
220
|
+
term.close();
|
|
221
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Submitted, value: false });
|
|
222
|
+
}
|
|
223
|
+
if (key === Key.Enter && config.initial !== undefined) {
|
|
224
|
+
drawResult(config.initial);
|
|
225
|
+
term.close();
|
|
226
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Submitted, value: config.initial });
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function arrayIncludes(arr, value) {
|
|
232
|
+
for (let i = 0; i < arr.length; i++) {
|
|
233
|
+
if (arr[i] === value)
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
function filterChoices$1(choices, query) {
|
|
239
|
+
if (!query) {
|
|
240
|
+
return choices.map((_, i) => i);
|
|
241
|
+
}
|
|
242
|
+
const lowerQuery = query.toLowerCase();
|
|
243
|
+
const indices = [];
|
|
244
|
+
choices.forEach((choice, i) => {
|
|
245
|
+
if (choice.label.toLowerCase().includes(lowerQuery)) {
|
|
246
|
+
indices.push(i);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
return index_cjs_js$2.freeze(indices);
|
|
250
|
+
}
|
|
251
|
+
function createInitialState$2(config) {
|
|
252
|
+
return index_cjs_js$2.freeze({
|
|
253
|
+
cursor: 0,
|
|
254
|
+
selected: config.initial ? [...config.initial] : [],
|
|
255
|
+
choices: config.choices,
|
|
256
|
+
filteredIndices: config.choices.map((_, i) => i),
|
|
257
|
+
searchQuery: '',
|
|
258
|
+
scrollOffset: 0,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
function getVisibleChoices$1(state, maxVisible) {
|
|
262
|
+
const total = state.filteredIndices.length;
|
|
263
|
+
if (total <= maxVisible) {
|
|
264
|
+
return { indices: state.filteredIndices, startIndex: 0 };
|
|
265
|
+
}
|
|
266
|
+
let startIndex = state.scrollOffset;
|
|
267
|
+
if (state.cursor < startIndex) {
|
|
268
|
+
startIndex = state.cursor;
|
|
269
|
+
}
|
|
270
|
+
else if (state.cursor >= startIndex + maxVisible) {
|
|
271
|
+
startIndex = state.cursor - maxVisible + 1;
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
indices: state.filteredIndices.slice(startIndex, startIndex + maxVisible),
|
|
275
|
+
startIndex,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function renderChoice$1(choice, isSelected, isFocused) {
|
|
279
|
+
const pointer = isFocused ? style.cyan(Symbol.Pointer) : ' ';
|
|
280
|
+
const checkbox = isSelected ? style.green(Symbol.CheckboxSelected) : style.dim(Symbol.Checkbox);
|
|
281
|
+
let label = choice.label;
|
|
282
|
+
if (choice.disabled) {
|
|
283
|
+
label = style.dim(label + ' (disabled)');
|
|
284
|
+
}
|
|
285
|
+
else if (isFocused) {
|
|
286
|
+
label = isSelected ? style.green(label) : style.cyan(label);
|
|
287
|
+
}
|
|
288
|
+
else if (isSelected) {
|
|
289
|
+
label = style.green(label);
|
|
290
|
+
}
|
|
291
|
+
const hint = choice.hint ? style.dim(` — ${choice.hint}`) : '';
|
|
292
|
+
return `${pointer} ${checkbox} ${label}${hint}`;
|
|
293
|
+
}
|
|
294
|
+
function render$2(term, config, state, submitted) {
|
|
295
|
+
const maxVisible = config.maxVisible ?? 10;
|
|
296
|
+
const { indices: visibleIndices, startIndex } = getVisibleChoices$1(state, maxVisible);
|
|
297
|
+
let output = Ansi.CursorStart + Ansi.ClearLine + renderMessage(config.message);
|
|
298
|
+
if (submitted) {
|
|
299
|
+
const selectedLabels = state.selected.map((i) => state.choices[i]?.label ?? '').join(', ');
|
|
300
|
+
output += renderSubmitted(selectedLabels || 'none');
|
|
301
|
+
term.write(output);
|
|
302
|
+
return 1;
|
|
303
|
+
}
|
|
304
|
+
if (config.searchable && state.searchQuery) {
|
|
305
|
+
output += style.cyan(state.searchQuery) + style.dim(' (type to filter)');
|
|
306
|
+
}
|
|
307
|
+
else if (config.searchable) {
|
|
308
|
+
output += style.dim('(type to filter, space to toggle, enter to submit)');
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
output += style.dim('(space to toggle, enter to submit)');
|
|
312
|
+
}
|
|
313
|
+
term.write(output + '\n');
|
|
314
|
+
let lineCount = 1;
|
|
315
|
+
const minMax = [];
|
|
316
|
+
if (config.min !== undefined)
|
|
317
|
+
minMax.push(`min: ${config.min}`);
|
|
318
|
+
if (config.max !== undefined)
|
|
319
|
+
minMax.push(`max: ${config.max}`);
|
|
320
|
+
const countHint = minMax.length > 0 ? ` (${minMax.join(', ')})` : '';
|
|
321
|
+
term.write(Ansi.ClearLine + style.dim(` ${state.selected.length} selected${countHint}`) + '\n');
|
|
322
|
+
lineCount++;
|
|
323
|
+
const showScrollUp = startIndex > 0;
|
|
324
|
+
const showScrollDown = startIndex + maxVisible < state.filteredIndices.length;
|
|
325
|
+
if (showScrollUp) {
|
|
326
|
+
term.write(Ansi.ClearLine + style.dim(` ${Symbol.Ellipsis} (${startIndex} more above)`) + '\n');
|
|
327
|
+
lineCount++;
|
|
328
|
+
}
|
|
329
|
+
visibleIndices.forEach((actualIndex, i) => {
|
|
330
|
+
const choice = state.choices[actualIndex];
|
|
331
|
+
/* istanbul ignore if -- @preserve defensive: actualIndex always valid from filteredIndices */
|
|
332
|
+
if (!choice)
|
|
333
|
+
return;
|
|
334
|
+
const viewIndex = startIndex + i;
|
|
335
|
+
const isFocused = viewIndex === state.cursor;
|
|
336
|
+
const isSelected = arrayIncludes(state.selected, actualIndex);
|
|
337
|
+
const line = renderChoice$1(choice, isSelected, isFocused);
|
|
338
|
+
term.write(Ansi.ClearLine + line + '\n');
|
|
339
|
+
lineCount++;
|
|
340
|
+
});
|
|
341
|
+
if (showScrollDown) {
|
|
342
|
+
const remaining = state.filteredIndices.length - (startIndex + maxVisible);
|
|
343
|
+
term.write(Ansi.ClearLine + style.dim(` ${Symbol.Ellipsis} (${remaining} more below)`) + '\n');
|
|
344
|
+
lineCount++;
|
|
345
|
+
}
|
|
346
|
+
if (state.filteredIndices.length === 0 && config.searchable) {
|
|
347
|
+
term.write(Ansi.ClearLine + style.dim(' No matches found') + '\n');
|
|
348
|
+
lineCount++;
|
|
349
|
+
}
|
|
350
|
+
return lineCount;
|
|
351
|
+
}
|
|
352
|
+
function processKey$2(key, state, config) {
|
|
353
|
+
const maxVisible = config.maxVisible ?? 10;
|
|
354
|
+
const total = state.filteredIndices.length;
|
|
355
|
+
if (total === 0 && key !== Key.Backspace && key !== '\b')
|
|
356
|
+
return state;
|
|
357
|
+
if (key === Key.Up) {
|
|
358
|
+
let newCursor = state.cursor - 1;
|
|
359
|
+
while (newCursor >= 0 && state.choices[state.filteredIndices[newCursor] ?? -1]?.disabled) {
|
|
360
|
+
newCursor--;
|
|
361
|
+
}
|
|
362
|
+
if (newCursor < 0)
|
|
363
|
+
return state;
|
|
364
|
+
let newScrollOffset = state.scrollOffset;
|
|
365
|
+
if (newCursor < state.scrollOffset) {
|
|
366
|
+
newScrollOffset = newCursor;
|
|
367
|
+
}
|
|
368
|
+
return index_cjs_js$2.freeze({ ...state, cursor: newCursor, scrollOffset: newScrollOffset });
|
|
369
|
+
}
|
|
370
|
+
if (key === Key.Down) {
|
|
371
|
+
let newCursor = state.cursor + 1;
|
|
372
|
+
while (newCursor < total && state.choices[state.filteredIndices[newCursor] ?? -1]?.disabled) {
|
|
373
|
+
newCursor++;
|
|
374
|
+
}
|
|
375
|
+
if (newCursor >= total)
|
|
376
|
+
return state;
|
|
377
|
+
let newScrollOffset = state.scrollOffset;
|
|
378
|
+
if (newCursor >= state.scrollOffset + maxVisible) {
|
|
379
|
+
newScrollOffset = newCursor - maxVisible + 1;
|
|
380
|
+
}
|
|
381
|
+
return index_cjs_js$2.freeze({ ...state, cursor: newCursor, scrollOffset: newScrollOffset });
|
|
382
|
+
}
|
|
383
|
+
if (key === Key.Space) {
|
|
384
|
+
const actualIndex = state.filteredIndices[state.cursor];
|
|
385
|
+
if (actualIndex === undefined)
|
|
386
|
+
return state;
|
|
387
|
+
const choice = state.choices[actualIndex];
|
|
388
|
+
/* istanbul ignore if -- @preserve defensive: actualIndex validated above */
|
|
389
|
+
if (!choice || choice.disabled)
|
|
390
|
+
return state;
|
|
391
|
+
const isSelected = arrayIncludes(state.selected, actualIndex);
|
|
392
|
+
if (isSelected) {
|
|
393
|
+
const newSelected = state.selected.filter((i) => i !== actualIndex);
|
|
394
|
+
return index_cjs_js$2.freeze({ ...state, selected: newSelected });
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
if (config.max !== undefined && state.selected.length >= config.max) {
|
|
398
|
+
return state;
|
|
399
|
+
}
|
|
400
|
+
const newSelected = [...state.selected, actualIndex];
|
|
401
|
+
return index_cjs_js$2.freeze({ ...state, selected: newSelected });
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (config.searchable) {
|
|
405
|
+
if (key === Key.Backspace || key === '\b') {
|
|
406
|
+
if (state.searchQuery.length > 0) {
|
|
407
|
+
const newQuery = state.searchQuery.slice(0, -1);
|
|
408
|
+
const newFiltered = filterChoices$1(state.choices, newQuery);
|
|
409
|
+
return index_cjs_js$2.freeze({
|
|
410
|
+
...state,
|
|
411
|
+
searchQuery: newQuery,
|
|
412
|
+
filteredIndices: newFiltered,
|
|
413
|
+
cursor: 0,
|
|
414
|
+
scrollOffset: 0,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
return state;
|
|
418
|
+
}
|
|
419
|
+
if (key.length === 1 && key >= ' ' && key !== Key.Space) {
|
|
420
|
+
const newQuery = state.searchQuery + key;
|
|
421
|
+
const newFiltered = filterChoices$1(state.choices, newQuery);
|
|
422
|
+
return index_cjs_js$2.freeze({
|
|
423
|
+
...state,
|
|
424
|
+
searchQuery: newQuery,
|
|
425
|
+
filteredIndices: newFiltered,
|
|
426
|
+
cursor: 0,
|
|
427
|
+
scrollOffset: 0,
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return state;
|
|
432
|
+
}
|
|
433
|
+
function validateSelection(state, config) {
|
|
434
|
+
if (config.min !== undefined && state.selected.length < config.min) {
|
|
435
|
+
return `Select at least ${config.min} option${config.min === 1 ? '' : 's'}`;
|
|
436
|
+
}
|
|
437
|
+
if (config.max !== undefined && state.selected.length > config.max) {
|
|
438
|
+
return `Select at most ${config.max} option${config.max === 1 ? '' : 's'}`;
|
|
439
|
+
}
|
|
440
|
+
return undefined;
|
|
441
|
+
}
|
|
442
|
+
async function multiselect(config) {
|
|
443
|
+
const term = createTerminal({ input: config.input, output: config.output });
|
|
444
|
+
let state = createInitialState$2(config);
|
|
445
|
+
let lineCount = 0;
|
|
446
|
+
let errorMessage;
|
|
447
|
+
term.write(Ansi.HideCursor);
|
|
448
|
+
const redraw = (submitted = false) => {
|
|
449
|
+
if (lineCount > 0) {
|
|
450
|
+
term.write(Ansi.cursorUp(lineCount) + Ansi.CursorStart);
|
|
451
|
+
}
|
|
452
|
+
term.write(Ansi.ClearToEnd);
|
|
453
|
+
lineCount = render$2(term, config, state, submitted);
|
|
454
|
+
if (errorMessage && !submitted) {
|
|
455
|
+
term.write(Ansi.ClearLine + style.yellow(` ${errorMessage}`) + '\n');
|
|
456
|
+
lineCount++;
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
redraw();
|
|
460
|
+
while (true) {
|
|
461
|
+
const key = await term.readKey();
|
|
462
|
+
if (term.isCancelled()) {
|
|
463
|
+
if (lineCount > 0) {
|
|
464
|
+
term.write(Ansi.cursorUp(lineCount) + Ansi.CursorStart);
|
|
465
|
+
}
|
|
466
|
+
term.write(Ansi.ClearToEnd);
|
|
467
|
+
term.write(renderMessage(config.message) + renderCancelled() + '\n');
|
|
468
|
+
term.write(Ansi.ShowCursor);
|
|
469
|
+
term.close();
|
|
470
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Cancelled, value: undefined });
|
|
471
|
+
}
|
|
472
|
+
if (key === Key.Enter) {
|
|
473
|
+
const validationError = validateSelection(state, config);
|
|
474
|
+
if (validationError) {
|
|
475
|
+
errorMessage = validationError;
|
|
476
|
+
redraw();
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
const selectedValues = state.selected.map((i) => state.choices[i]?.value).filter((v) => v !== undefined);
|
|
480
|
+
if (lineCount > 0) {
|
|
481
|
+
term.write(Ansi.cursorUp(lineCount) + Ansi.CursorStart);
|
|
482
|
+
}
|
|
483
|
+
term.write(Ansi.ClearToEnd);
|
|
484
|
+
render$2(term, config, state, true);
|
|
485
|
+
term.write('\n');
|
|
486
|
+
term.write(Ansi.ShowCursor);
|
|
487
|
+
term.close();
|
|
488
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Submitted, value: index_cjs_js$2.freeze(selectedValues) });
|
|
489
|
+
}
|
|
490
|
+
errorMessage = undefined;
|
|
491
|
+
state = processKey$2(key, state, config);
|
|
492
|
+
redraw();
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function filterChoices(choices, query) {
|
|
497
|
+
if (!query) {
|
|
498
|
+
return choices.map((_, i) => i);
|
|
499
|
+
}
|
|
500
|
+
const lowerQuery = query.toLowerCase();
|
|
501
|
+
const indices = [];
|
|
502
|
+
choices.forEach((choice, i) => {
|
|
503
|
+
if (choice.label.toLowerCase().includes(lowerQuery)) {
|
|
504
|
+
indices.push(i);
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
return index_cjs_js$2.freeze(indices);
|
|
508
|
+
}
|
|
509
|
+
function createInitialState$1(config) {
|
|
510
|
+
return index_cjs_js$2.freeze({
|
|
511
|
+
cursor: config.initial ?? 0,
|
|
512
|
+
choices: config.choices,
|
|
513
|
+
filteredIndices: config.choices.map((_, i) => i),
|
|
514
|
+
searchQuery: '',
|
|
515
|
+
scrollOffset: 0,
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
function getVisibleChoices(state, maxVisible) {
|
|
519
|
+
const total = state.filteredIndices.length;
|
|
520
|
+
if (total <= maxVisible) {
|
|
521
|
+
return { indices: state.filteredIndices, startIndex: 0 };
|
|
522
|
+
}
|
|
523
|
+
let startIndex = state.scrollOffset;
|
|
524
|
+
if (state.cursor < startIndex) {
|
|
525
|
+
startIndex = state.cursor;
|
|
526
|
+
}
|
|
527
|
+
else if (state.cursor >= startIndex + maxVisible) {
|
|
528
|
+
startIndex = state.cursor - maxVisible + 1;
|
|
529
|
+
}
|
|
530
|
+
return {
|
|
531
|
+
indices: state.filteredIndices.slice(startIndex, startIndex + maxVisible),
|
|
532
|
+
startIndex,
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
function renderChoice(choice, isFocused) {
|
|
536
|
+
const pointer = isFocused ? style.cyan(Symbol.Pointer) : ' ';
|
|
537
|
+
let label = choice.label;
|
|
538
|
+
if (choice.disabled) {
|
|
539
|
+
label = style.dim(label + ' (disabled)');
|
|
540
|
+
}
|
|
541
|
+
else if (isFocused) {
|
|
542
|
+
label = style.cyan(label);
|
|
543
|
+
}
|
|
544
|
+
const hint = choice.hint ? style.dim(` — ${choice.hint}`) : '';
|
|
545
|
+
return `${pointer} ${label}${hint}`;
|
|
546
|
+
}
|
|
547
|
+
function render$1(term, config, state, submitted) {
|
|
548
|
+
const maxVisible = config.maxVisible ?? 10;
|
|
549
|
+
const { indices: visibleIndices, startIndex } = getVisibleChoices(state, maxVisible);
|
|
550
|
+
let output = Ansi.CursorStart + Ansi.ClearLine + renderMessage(config.message);
|
|
551
|
+
if (submitted) {
|
|
552
|
+
const actualIndex = state.filteredIndices[state.cursor];
|
|
553
|
+
const selectedChoice = actualIndex !== undefined ? state.choices[actualIndex] : undefined;
|
|
554
|
+
/* istanbul ignore next -- @preserve defensive: cursor always within bounds */
|
|
555
|
+
output += renderSubmitted(selectedChoice?.label ?? '');
|
|
556
|
+
term.write(output);
|
|
557
|
+
return 1;
|
|
558
|
+
}
|
|
559
|
+
if (config.searchable && state.searchQuery) {
|
|
560
|
+
output += style.cyan(state.searchQuery) + style.dim(' (type to filter)');
|
|
561
|
+
}
|
|
562
|
+
else if (config.searchable) {
|
|
563
|
+
output += style.dim('(type to filter, enter to select)');
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
output += style.dim('(use arrows, enter to select)');
|
|
567
|
+
}
|
|
568
|
+
term.write(output + '\n');
|
|
569
|
+
let lineCount = 1;
|
|
570
|
+
const showScrollUp = startIndex > 0;
|
|
571
|
+
const showScrollDown = startIndex + maxVisible < state.filteredIndices.length;
|
|
572
|
+
if (showScrollUp) {
|
|
573
|
+
term.write(Ansi.ClearLine + style.dim(` ${Symbol.Ellipsis} (${startIndex} more above)`) + '\n');
|
|
574
|
+
lineCount++;
|
|
575
|
+
}
|
|
576
|
+
visibleIndices.forEach((actualIndex, i) => {
|
|
577
|
+
const choice = state.choices[actualIndex];
|
|
578
|
+
/* istanbul ignore if -- @preserve defensive: actualIndex always valid from filteredIndices */
|
|
579
|
+
if (!choice)
|
|
580
|
+
return;
|
|
581
|
+
const viewIndex = startIndex + i;
|
|
582
|
+
const isFocused = viewIndex === state.cursor;
|
|
583
|
+
const line = renderChoice(choice, isFocused);
|
|
584
|
+
term.write(Ansi.ClearLine + line + '\n');
|
|
585
|
+
lineCount++;
|
|
586
|
+
});
|
|
587
|
+
if (showScrollDown) {
|
|
588
|
+
const remaining = state.filteredIndices.length - (startIndex + maxVisible);
|
|
589
|
+
term.write(Ansi.ClearLine + style.dim(` ${Symbol.Ellipsis} (${remaining} more below)`) + '\n');
|
|
590
|
+
lineCount++;
|
|
591
|
+
}
|
|
592
|
+
if (state.filteredIndices.length === 0 && config.searchable) {
|
|
593
|
+
term.write(Ansi.ClearLine + style.dim(' No matches found') + '\n');
|
|
594
|
+
lineCount++;
|
|
595
|
+
}
|
|
596
|
+
return lineCount;
|
|
597
|
+
}
|
|
598
|
+
function processKey$1(key, state, config) {
|
|
599
|
+
const maxVisible = config.maxVisible ?? 10;
|
|
600
|
+
const total = state.filteredIndices.length;
|
|
601
|
+
if (total === 0 && key !== Key.Backspace && key !== '\b')
|
|
602
|
+
return state;
|
|
603
|
+
if (key === Key.Up) {
|
|
604
|
+
let newCursor = state.cursor - 1;
|
|
605
|
+
while (newCursor >= 0 && state.choices[state.filteredIndices[newCursor] ?? -1]?.disabled) {
|
|
606
|
+
newCursor--;
|
|
607
|
+
}
|
|
608
|
+
if (newCursor < 0)
|
|
609
|
+
return state;
|
|
610
|
+
let newScrollOffset = state.scrollOffset;
|
|
611
|
+
if (newCursor < state.scrollOffset) {
|
|
612
|
+
newScrollOffset = newCursor;
|
|
613
|
+
}
|
|
614
|
+
return index_cjs_js$2.freeze({ ...state, cursor: newCursor, scrollOffset: newScrollOffset });
|
|
615
|
+
}
|
|
616
|
+
if (key === Key.Down) {
|
|
617
|
+
let newCursor = state.cursor + 1;
|
|
618
|
+
while (newCursor < total && state.choices[state.filteredIndices[newCursor] ?? -1]?.disabled) {
|
|
619
|
+
newCursor++;
|
|
620
|
+
}
|
|
621
|
+
if (newCursor >= total)
|
|
622
|
+
return state;
|
|
623
|
+
let newScrollOffset = state.scrollOffset;
|
|
624
|
+
if (newCursor >= state.scrollOffset + maxVisible) {
|
|
625
|
+
newScrollOffset = newCursor - maxVisible + 1;
|
|
626
|
+
}
|
|
627
|
+
return index_cjs_js$2.freeze({ ...state, cursor: newCursor, scrollOffset: newScrollOffset });
|
|
628
|
+
}
|
|
629
|
+
if (config.searchable) {
|
|
630
|
+
if (key === Key.Backspace || key === '\b') {
|
|
631
|
+
if (state.searchQuery.length > 0) {
|
|
632
|
+
const newQuery = state.searchQuery.slice(0, -1);
|
|
633
|
+
const newFiltered = filterChoices(state.choices, newQuery);
|
|
634
|
+
return index_cjs_js$2.freeze({
|
|
635
|
+
...state,
|
|
636
|
+
searchQuery: newQuery,
|
|
637
|
+
filteredIndices: newFiltered,
|
|
638
|
+
cursor: 0,
|
|
639
|
+
scrollOffset: 0,
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
return state;
|
|
643
|
+
}
|
|
644
|
+
if (key.length === 1 && key >= ' ') {
|
|
645
|
+
const newQuery = state.searchQuery + key;
|
|
646
|
+
const newFiltered = filterChoices(state.choices, newQuery);
|
|
647
|
+
return index_cjs_js$2.freeze({
|
|
648
|
+
...state,
|
|
649
|
+
searchQuery: newQuery,
|
|
650
|
+
filteredIndices: newFiltered,
|
|
651
|
+
cursor: 0,
|
|
652
|
+
scrollOffset: 0,
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
return state;
|
|
657
|
+
}
|
|
658
|
+
async function select(config) {
|
|
659
|
+
const term = createTerminal({ input: config.input, output: config.output });
|
|
660
|
+
let state = createInitialState$1(config);
|
|
661
|
+
let lineCount = 0;
|
|
662
|
+
term.write(Ansi.HideCursor);
|
|
663
|
+
const redraw = (submitted = false) => {
|
|
664
|
+
if (lineCount > 0) {
|
|
665
|
+
term.write(Ansi.cursorUp(lineCount) + Ansi.CursorStart);
|
|
666
|
+
}
|
|
667
|
+
term.write(Ansi.ClearToEnd);
|
|
668
|
+
lineCount = render$1(term, config, state, submitted);
|
|
669
|
+
};
|
|
670
|
+
redraw();
|
|
671
|
+
while (true) {
|
|
672
|
+
const key = await term.readKey();
|
|
673
|
+
if (term.isCancelled()) {
|
|
674
|
+
if (lineCount > 0) {
|
|
675
|
+
term.write(Ansi.cursorUp(lineCount) + Ansi.CursorStart);
|
|
676
|
+
}
|
|
677
|
+
term.write(Ansi.ClearToEnd);
|
|
678
|
+
term.write(renderMessage(config.message) + renderCancelled() + '\n');
|
|
679
|
+
term.write(Ansi.ShowCursor);
|
|
680
|
+
term.close();
|
|
681
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Cancelled, value: undefined });
|
|
682
|
+
}
|
|
683
|
+
if (key === Key.Enter) {
|
|
684
|
+
const actualIndex = state.filteredIndices[state.cursor];
|
|
685
|
+
if (actualIndex === undefined) {
|
|
686
|
+
continue;
|
|
687
|
+
}
|
|
688
|
+
const selectedChoice = state.choices[actualIndex];
|
|
689
|
+
if (!selectedChoice || selectedChoice.disabled) {
|
|
690
|
+
continue;
|
|
691
|
+
}
|
|
692
|
+
if (lineCount > 0) {
|
|
693
|
+
term.write(Ansi.cursorUp(lineCount) + Ansi.CursorStart);
|
|
694
|
+
}
|
|
695
|
+
term.write(Ansi.ClearToEnd);
|
|
696
|
+
render$1(term, config, state, true);
|
|
697
|
+
term.write('\n');
|
|
698
|
+
term.write(Ansi.ShowCursor);
|
|
699
|
+
term.close();
|
|
700
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Submitted, value: selectedChoice.value });
|
|
701
|
+
}
|
|
702
|
+
state = processKey$1(key, state, config);
|
|
703
|
+
redraw();
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
function createInitialState(config) {
|
|
708
|
+
return {
|
|
709
|
+
value: config.initial ?? '',
|
|
710
|
+
cursorPos: (config.initial ?? '').length,
|
|
711
|
+
error: undefined,
|
|
712
|
+
};
|
|
713
|
+
}
|
|
714
|
+
function render(term, config, state, submitted) {
|
|
715
|
+
const displayValue = config.format ? config.format(state.value) : state.value;
|
|
716
|
+
const messageText = config.renderMessage ? config.renderMessage(state.value) : config.message;
|
|
717
|
+
let output = renderMessage(messageText);
|
|
718
|
+
let trailingChars = 0;
|
|
719
|
+
if (submitted) {
|
|
720
|
+
output += renderSubmitted(displayValue || config.initial || '');
|
|
721
|
+
}
|
|
722
|
+
else {
|
|
723
|
+
output += displayValue;
|
|
724
|
+
trailingChars = displayValue.length - state.cursorPos;
|
|
725
|
+
if (config.initial && !state.value) {
|
|
726
|
+
output += style.dim(config.initial);
|
|
727
|
+
trailingChars += config.initial.length;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
term.write(Ansi.CursorStart + Ansi.ClearLine + output);
|
|
731
|
+
if (state.error) {
|
|
732
|
+
term.write('\n' + style.yellow(` ${state.error}`));
|
|
733
|
+
return 2;
|
|
734
|
+
}
|
|
735
|
+
if (!submitted && trailingChars > 0) {
|
|
736
|
+
term.write(Ansi.cursorLeft(trailingChars));
|
|
737
|
+
}
|
|
738
|
+
return 1;
|
|
739
|
+
}
|
|
740
|
+
function processKey(key, state) {
|
|
741
|
+
if (key.length === 1 && key >= ' ' && key !== Key.Backspace) {
|
|
742
|
+
const before = state.value.slice(0, state.cursorPos);
|
|
743
|
+
const after = state.value.slice(state.cursorPos);
|
|
744
|
+
return {
|
|
745
|
+
...state,
|
|
746
|
+
value: before + key + after,
|
|
747
|
+
cursorPos: state.cursorPos + 1,
|
|
748
|
+
error: undefined,
|
|
749
|
+
};
|
|
750
|
+
}
|
|
751
|
+
if (key === Key.Backspace || key === '\b') {
|
|
752
|
+
if (state.cursorPos > 0) {
|
|
753
|
+
const before = state.value.slice(0, state.cursorPos - 1);
|
|
754
|
+
const after = state.value.slice(state.cursorPos);
|
|
755
|
+
return {
|
|
756
|
+
...state,
|
|
757
|
+
value: before + after,
|
|
758
|
+
cursorPos: state.cursorPos - 1,
|
|
759
|
+
error: undefined,
|
|
760
|
+
};
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
if (key === Key.Left) {
|
|
764
|
+
return {
|
|
765
|
+
...state,
|
|
766
|
+
cursorPos: index_cjs_js$4.max(0, state.cursorPos - 1),
|
|
767
|
+
};
|
|
768
|
+
}
|
|
769
|
+
if (key === Key.Right) {
|
|
770
|
+
return {
|
|
771
|
+
...state,
|
|
772
|
+
cursorPos: index_cjs_js$4.min(state.value.length, state.cursorPos + 1),
|
|
773
|
+
};
|
|
774
|
+
}
|
|
775
|
+
return state;
|
|
776
|
+
}
|
|
777
|
+
async function text(config) {
|
|
778
|
+
const term = createTerminal({ input: config.input, output: config.output });
|
|
779
|
+
let state = createInitialState(config);
|
|
780
|
+
let lineCount = 0;
|
|
781
|
+
const redraw = (submitted = false) => {
|
|
782
|
+
if (lineCount > 0) {
|
|
783
|
+
term.clearLines(lineCount);
|
|
784
|
+
}
|
|
785
|
+
lineCount = render(term, config, state, submitted);
|
|
786
|
+
};
|
|
787
|
+
redraw();
|
|
788
|
+
while (true) {
|
|
789
|
+
const key = await term.readKey();
|
|
790
|
+
if (term.isCancelled()) {
|
|
791
|
+
redraw();
|
|
792
|
+
term.write(renderCancelled() + '\n');
|
|
793
|
+
term.close();
|
|
794
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Cancelled, value: undefined });
|
|
795
|
+
}
|
|
796
|
+
if (key === Key.Enter) {
|
|
797
|
+
const value = state.value || config.initial || '';
|
|
798
|
+
if (config.validate) {
|
|
799
|
+
const errorMessage = config.validate(value);
|
|
800
|
+
if (errorMessage) {
|
|
801
|
+
state = { ...state, error: errorMessage };
|
|
802
|
+
redraw();
|
|
803
|
+
continue;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
redraw(true);
|
|
807
|
+
term.write('\n');
|
|
808
|
+
term.close();
|
|
809
|
+
return index_cjs_js$2.freeze({ result: PromptResult.Submitted, value });
|
|
810
|
+
}
|
|
811
|
+
state = processKey(key, state);
|
|
812
|
+
redraw();
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
function omitKeys(source, keys) {
|
|
817
|
+
const dropSet = index_cjs_js$5.createSet(keys);
|
|
818
|
+
return index_cjs_js$2.fromEntries(index_cjs_js$2.entries(source).filter(([key]) => !dropSet.has(key)));
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
const bodyStep = {
|
|
822
|
+
id: 'body',
|
|
823
|
+
async run(ctx) {
|
|
824
|
+
const outcome = await text({
|
|
825
|
+
message: 'Body (optional, press Enter to skip):',
|
|
826
|
+
...(ctx.draft.body && { initial: ctx.draft.body }),
|
|
827
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
828
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
829
|
+
});
|
|
830
|
+
if (outcome.result === PromptResult.Cancelled) {
|
|
831
|
+
return cancelled();
|
|
832
|
+
}
|
|
833
|
+
const trimmed = outcome.value.trim();
|
|
834
|
+
ctx.draft = trimmed === '' ? omitBody(ctx) : { ...ctx.draft, body: trimmed };
|
|
835
|
+
return done();
|
|
836
|
+
},
|
|
837
|
+
};
|
|
838
|
+
function omitBody(ctx) {
|
|
839
|
+
return omitKeys(ctx.draft, ['body']);
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
function replaceChar(input, target, replacement) {
|
|
843
|
+
const result = [];
|
|
844
|
+
for (let i = 0; i < input.length; i++) {
|
|
845
|
+
const char = input[i];
|
|
846
|
+
if (char !== undefined)
|
|
847
|
+
result.push(char === target ? replacement : char);
|
|
848
|
+
}
|
|
849
|
+
return result.join('');
|
|
850
|
+
}
|
|
851
|
+
function hyphenToSpace(input) {
|
|
852
|
+
return replaceChar(input, '-', ' ');
|
|
853
|
+
}
|
|
854
|
+
function isBreakingFooterKey(key) {
|
|
855
|
+
const normalized = hyphenToSpace(key.toUpperCase());
|
|
856
|
+
return normalized === 'BREAKING CHANGE';
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
const breakingStep = {
|
|
860
|
+
id: 'breaking',
|
|
861
|
+
async run(ctx) {
|
|
862
|
+
const confirmOutcome = await confirm({
|
|
863
|
+
message: 'Is this a breaking change?',
|
|
864
|
+
initial: ctx.draft.breaking ?? false,
|
|
865
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
866
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
867
|
+
});
|
|
868
|
+
if (confirmOutcome.result === PromptResult.Cancelled) {
|
|
869
|
+
return cancelled();
|
|
870
|
+
}
|
|
871
|
+
if (!confirmOutcome.value) {
|
|
872
|
+
ctx.draft = clearBreaking(ctx.draft);
|
|
873
|
+
return done();
|
|
874
|
+
}
|
|
875
|
+
const descriptionOutcome = await text({
|
|
876
|
+
message: 'Describe the breaking change:',
|
|
877
|
+
...(ctx.draft.breakingDescription && { initial: ctx.draft.breakingDescription }),
|
|
878
|
+
validate: (value) => (value.trim() === '' ? 'Description must not be empty' : undefined),
|
|
879
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
880
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
881
|
+
});
|
|
882
|
+
if (descriptionOutcome.result === PromptResult.Cancelled) {
|
|
883
|
+
return cancelled();
|
|
884
|
+
}
|
|
885
|
+
ctx.draft = {
|
|
886
|
+
...ctx.draft,
|
|
887
|
+
breaking: true,
|
|
888
|
+
breakingDescription: descriptionOutcome.value.trim(),
|
|
889
|
+
};
|
|
890
|
+
return done();
|
|
891
|
+
},
|
|
892
|
+
};
|
|
893
|
+
function clearBreaking(draft) {
|
|
894
|
+
const rest = omitKeys(draft, ['breaking', 'breakingDescription', 'footers']);
|
|
895
|
+
if (!draft.footers)
|
|
896
|
+
return { ...rest, breaking: false };
|
|
897
|
+
const filtered = draft.footers.filter((footer) => !isBreakingFooterKey(footer.key));
|
|
898
|
+
return {
|
|
899
|
+
...rest,
|
|
900
|
+
breaking: false,
|
|
901
|
+
...(filtered.length > 0 && { footers: filtered }),
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
function createGitCommit(options) {
|
|
906
|
+
const body = options.body ?? '';
|
|
907
|
+
const subject = options.subject;
|
|
908
|
+
return {
|
|
909
|
+
hash: options.hash,
|
|
910
|
+
shortHash: getShortHash(options.hash),
|
|
911
|
+
authorName: options.authorName,
|
|
912
|
+
authorEmail: options.authorEmail,
|
|
913
|
+
authorDate: options.authorDate,
|
|
914
|
+
committerName: options.committerName ?? options.authorName,
|
|
915
|
+
committerEmail: options.committerEmail ?? options.authorEmail,
|
|
916
|
+
commitDate: options.commitDate ?? options.authorDate,
|
|
917
|
+
subject,
|
|
918
|
+
body,
|
|
919
|
+
message: body ? `${subject}\n\n${body}` : subject,
|
|
920
|
+
parents: options.parents ?? [],
|
|
921
|
+
refs: options.refs ?? [],
|
|
922
|
+
};
|
|
923
|
+
}
|
|
924
|
+
function getShortHash(hash) {
|
|
925
|
+
return hash.slice(0, 7);
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
const DEFAULT_LOG_OPTIONS = {
|
|
929
|
+
maxCount: 100,
|
|
930
|
+
includeMerges: true,
|
|
931
|
+
timeout: 30000,
|
|
932
|
+
};
|
|
933
|
+
const LOG_FORMAT = ['%H', '%an', '%ae', '%aI', '%cn', '%ce', '%cI', '%s', '%b', '%P', '%D'].join('%x00');
|
|
934
|
+
const RECORD_SEPARATOR = '\x1e';
|
|
935
|
+
function getCommitLog(options = {}) {
|
|
936
|
+
const opts = { ...DEFAULT_LOG_OPTIONS, ...options };
|
|
937
|
+
const args = ['log', `--format=${RECORD_SEPARATOR}${LOG_FORMAT}`];
|
|
938
|
+
if (opts.maxCount !== undefined && opts.maxCount > 0) {
|
|
939
|
+
args.push(`-n${opts.maxCount}`);
|
|
940
|
+
}
|
|
941
|
+
if (!opts.includeMerges) {
|
|
942
|
+
args.push('--no-merges');
|
|
943
|
+
}
|
|
944
|
+
if (opts.author) {
|
|
945
|
+
const safeAuthor = escapeGitArg(opts.author);
|
|
946
|
+
args.push(`--author=${safeAuthor}`);
|
|
947
|
+
}
|
|
948
|
+
if (opts.from && opts.to) {
|
|
949
|
+
const safeFrom = escapeGitRef(opts.from);
|
|
950
|
+
const safeTo = escapeGitRef(opts.to);
|
|
951
|
+
args.push(`${safeFrom}..${safeTo}`);
|
|
952
|
+
}
|
|
953
|
+
else if (opts.from) {
|
|
954
|
+
const safeFrom = escapeGitRef(opts.from);
|
|
955
|
+
args.push(`${safeFrom}..HEAD`);
|
|
956
|
+
}
|
|
957
|
+
else if (opts.to) {
|
|
958
|
+
const safeTo = escapeGitRef(opts.to);
|
|
959
|
+
args.push(safeTo);
|
|
960
|
+
}
|
|
961
|
+
if (opts.path) {
|
|
962
|
+
const safePath = escapeGitPath(opts.path);
|
|
963
|
+
args.push('--', safePath);
|
|
964
|
+
}
|
|
965
|
+
try {
|
|
966
|
+
const output = node_child_process.execFileSync('git', args, {
|
|
967
|
+
encoding: 'utf-8',
|
|
968
|
+
cwd: opts.cwd,
|
|
969
|
+
timeout: opts.timeout,
|
|
970
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
971
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
972
|
+
});
|
|
973
|
+
return parseCommitLog(output);
|
|
974
|
+
}
|
|
975
|
+
catch (error) {
|
|
976
|
+
if (error instanceof Error && error.message.includes('does not have any commits')) {
|
|
977
|
+
return [];
|
|
978
|
+
}
|
|
979
|
+
throw error;
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
function getCommit(hash, options = {}) {
|
|
983
|
+
const safeHash = escapeGitRef(hash);
|
|
984
|
+
try {
|
|
985
|
+
const commits = getCommitLog({
|
|
986
|
+
...options,
|
|
987
|
+
to: safeHash,
|
|
988
|
+
maxCount: 1,
|
|
989
|
+
});
|
|
990
|
+
return commits[0] ?? null;
|
|
991
|
+
}
|
|
992
|
+
catch {
|
|
993
|
+
return null;
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
function parseCommitLog(output) {
|
|
997
|
+
const commits = [];
|
|
998
|
+
if (!output.trim()) {
|
|
999
|
+
return commits;
|
|
1000
|
+
}
|
|
1001
|
+
const records = splitByDelimiter(output, RECORD_SEPARATOR);
|
|
1002
|
+
for (const record of records) {
|
|
1003
|
+
const trimmed = record.trim();
|
|
1004
|
+
if (!trimmed)
|
|
1005
|
+
continue;
|
|
1006
|
+
const fields = splitByDelimiter(trimmed, '\x00');
|
|
1007
|
+
if (fields.length < 10)
|
|
1008
|
+
continue;
|
|
1009
|
+
const [hash, authorName, authorEmail, authorDate, committerName, committerEmail, commitDate, subject, body, parentsStr, refsStr] = fields;
|
|
1010
|
+
const parents = parentsStr ? splitByDelimiter(parentsStr, ' ').filter((p) => p.trim()) : [];
|
|
1011
|
+
const refs = parseRefs(refsStr || '');
|
|
1012
|
+
commits.push(createGitCommit({
|
|
1013
|
+
hash,
|
|
1014
|
+
authorName,
|
|
1015
|
+
authorEmail,
|
|
1016
|
+
authorDate,
|
|
1017
|
+
committerName,
|
|
1018
|
+
committerEmail,
|
|
1019
|
+
commitDate,
|
|
1020
|
+
subject,
|
|
1021
|
+
body: body || undefined,
|
|
1022
|
+
parents,
|
|
1023
|
+
refs,
|
|
1024
|
+
}));
|
|
1025
|
+
}
|
|
1026
|
+
return commits;
|
|
1027
|
+
}
|
|
1028
|
+
function parseRefs(refsStr) {
|
|
1029
|
+
if (!refsStr.trim()) {
|
|
1030
|
+
return [];
|
|
1031
|
+
}
|
|
1032
|
+
const refs = [];
|
|
1033
|
+
const parts = splitByDelimiter(refsStr, ',');
|
|
1034
|
+
for (const part of parts) {
|
|
1035
|
+
let ref = part.trim();
|
|
1036
|
+
const arrowIndex = findSubstring(ref, ' -> ');
|
|
1037
|
+
if (arrowIndex !== -1) {
|
|
1038
|
+
refs.push('HEAD');
|
|
1039
|
+
ref = ref.slice(arrowIndex + 4);
|
|
1040
|
+
}
|
|
1041
|
+
if (startsWithPrefix(ref, 'tag: ')) {
|
|
1042
|
+
ref = ref.slice(5);
|
|
1043
|
+
}
|
|
1044
|
+
if (ref) {
|
|
1045
|
+
refs.push(ref);
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
return refs;
|
|
1049
|
+
}
|
|
1050
|
+
function splitByDelimiter(str, delimiter) {
|
|
1051
|
+
const parts = [];
|
|
1052
|
+
let current = '';
|
|
1053
|
+
let i = 0;
|
|
1054
|
+
while (i < str.length) {
|
|
1055
|
+
if (matchesAt(str, i, delimiter)) {
|
|
1056
|
+
parts.push(current);
|
|
1057
|
+
current = '';
|
|
1058
|
+
i += delimiter.length;
|
|
1059
|
+
}
|
|
1060
|
+
else {
|
|
1061
|
+
current += str[i];
|
|
1062
|
+
i++;
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
parts.push(current);
|
|
1066
|
+
return parts;
|
|
1067
|
+
}
|
|
1068
|
+
function matchesAt(str, pos, pattern) {
|
|
1069
|
+
if (pos + pattern.length > str.length)
|
|
1070
|
+
return false;
|
|
1071
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
1072
|
+
if (str[pos + i] !== pattern[i])
|
|
1073
|
+
return false;
|
|
1074
|
+
}
|
|
1075
|
+
return true;
|
|
1076
|
+
}
|
|
1077
|
+
function findSubstring(str, pattern) {
|
|
1078
|
+
for (let i = 0; i <= str.length - pattern.length; i++) {
|
|
1079
|
+
if (matchesAt(str, i, pattern)) {
|
|
1080
|
+
return i;
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
return -1;
|
|
1084
|
+
}
|
|
1085
|
+
function startsWithPrefix(str, prefix) {
|
|
1086
|
+
return matchesAt(str, 0, prefix);
|
|
1087
|
+
}
|
|
1088
|
+
const MAX_REF_LENGTH = 256;
|
|
1089
|
+
function escapeGitRef(ref) {
|
|
1090
|
+
if (!ref || typeof ref !== 'string') {
|
|
1091
|
+
throw index_cjs_js.createError('Git reference is required');
|
|
1092
|
+
}
|
|
1093
|
+
if (ref.length > MAX_REF_LENGTH) {
|
|
1094
|
+
throw index_cjs_js.createError(`Git reference exceeds maximum length of ${MAX_REF_LENGTH}`);
|
|
1095
|
+
}
|
|
1096
|
+
const safe = [];
|
|
1097
|
+
for (let i = 0; i < ref.length; i++) {
|
|
1098
|
+
const code = ref.charCodeAt(i);
|
|
1099
|
+
if ((code >= 97 && code <= 122) ||
|
|
1100
|
+
(code >= 65 && code <= 90) ||
|
|
1101
|
+
(code >= 48 && code <= 57) ||
|
|
1102
|
+
code === 47 ||
|
|
1103
|
+
code === 45 ||
|
|
1104
|
+
code === 95 ||
|
|
1105
|
+
code === 46 ||
|
|
1106
|
+
code === 126 ||
|
|
1107
|
+
code === 94 ||
|
|
1108
|
+
code === 64 ||
|
|
1109
|
+
code === 123 ||
|
|
1110
|
+
code === 125) {
|
|
1111
|
+
safe.push(ref[i]);
|
|
1112
|
+
}
|
|
1113
|
+
else {
|
|
1114
|
+
throw index_cjs_js.createError(`Invalid character in git reference at position ${i}: "${ref[i]}"`);
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
return safe.join('');
|
|
1118
|
+
}
|
|
1119
|
+
const MAX_PATH_LENGTH$1 = 4096;
|
|
1120
|
+
function escapeGitPath(path) {
|
|
1121
|
+
if (!path || typeof path !== 'string') {
|
|
1122
|
+
throw index_cjs_js.createError('Path is required');
|
|
1123
|
+
}
|
|
1124
|
+
if (path.length > MAX_PATH_LENGTH$1) {
|
|
1125
|
+
throw index_cjs_js.createError(`Path exceeds maximum length of ${MAX_PATH_LENGTH$1}`);
|
|
1126
|
+
}
|
|
1127
|
+
const safe = [];
|
|
1128
|
+
for (let i = 0; i < path.length; i++) {
|
|
1129
|
+
const code = path.charCodeAt(i);
|
|
1130
|
+
if ((code >= 97 && code <= 122) ||
|
|
1131
|
+
(code >= 65 && code <= 90) ||
|
|
1132
|
+
(code >= 48 && code <= 57) ||
|
|
1133
|
+
code === 47 ||
|
|
1134
|
+
code === 92 ||
|
|
1135
|
+
code === 45 ||
|
|
1136
|
+
code === 95 ||
|
|
1137
|
+
code === 46 ||
|
|
1138
|
+
code === 32) {
|
|
1139
|
+
safe.push(path[i]);
|
|
1140
|
+
}
|
|
1141
|
+
else {
|
|
1142
|
+
throw index_cjs_js.createError(`Invalid character in path at position ${i}: "${path[i]}"`);
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
return safe.join('');
|
|
1146
|
+
}
|
|
1147
|
+
const MAX_ARG_LENGTH = 1000;
|
|
1148
|
+
function escapeGitArg(arg) {
|
|
1149
|
+
if (!arg || typeof arg !== 'string') {
|
|
1150
|
+
throw index_cjs_js.createError('Argument is required');
|
|
1151
|
+
}
|
|
1152
|
+
if (arg.length > MAX_ARG_LENGTH) {
|
|
1153
|
+
throw index_cjs_js.createError(`Argument exceeds maximum length of ${MAX_ARG_LENGTH}`);
|
|
1154
|
+
}
|
|
1155
|
+
const safe = [];
|
|
1156
|
+
for (let i = 0; i < arg.length; i++) {
|
|
1157
|
+
const code = arg.charCodeAt(i);
|
|
1158
|
+
if ((code >= 97 && code <= 122) ||
|
|
1159
|
+
(code >= 65 && code <= 90) ||
|
|
1160
|
+
(code >= 48 && code <= 57) ||
|
|
1161
|
+
code === 32 ||
|
|
1162
|
+
code === 64 ||
|
|
1163
|
+
code === 46 ||
|
|
1164
|
+
code === 45 ||
|
|
1165
|
+
code === 95 ||
|
|
1166
|
+
code === 60 ||
|
|
1167
|
+
code === 62 ||
|
|
1168
|
+
code === 43) {
|
|
1169
|
+
safe.push(arg[i]);
|
|
1170
|
+
}
|
|
1171
|
+
else {
|
|
1172
|
+
throw index_cjs_js.createError(`Invalid character in argument at position ${i}: "${arg[i]}"`);
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
return safe.join('');
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
const MAX_MESSAGE_LENGTH$1 = 10000;
|
|
1179
|
+
function escapeGitMessage(message) {
|
|
1180
|
+
if (!message || typeof message !== 'string') {
|
|
1181
|
+
throw index_cjs_js.createError('Message is required');
|
|
1182
|
+
}
|
|
1183
|
+
if (message.length > MAX_MESSAGE_LENGTH$1) {
|
|
1184
|
+
throw index_cjs_js.createError(`Message exceeds maximum length of ${MAX_MESSAGE_LENGTH$1}`);
|
|
1185
|
+
}
|
|
1186
|
+
const safe = [];
|
|
1187
|
+
for (let i = 0; i < message.length; i++) {
|
|
1188
|
+
const char = message[i];
|
|
1189
|
+
const code = message.charCodeAt(i);
|
|
1190
|
+
if (char === '"' || char === '\\') {
|
|
1191
|
+
safe.push('\\');
|
|
1192
|
+
safe.push(char);
|
|
1193
|
+
}
|
|
1194
|
+
else if ((code >= 32 && code <= 126) || code === 10 || code === 13 || code === 9) {
|
|
1195
|
+
safe.push(char);
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
return safe.join('');
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
const DEFAULT_COMMIT_OPTIONS = {
|
|
1202
|
+
timeout: 30000,
|
|
1203
|
+
};
|
|
1204
|
+
function commit(message, options = {}) {
|
|
1205
|
+
const opts = { ...DEFAULT_COMMIT_OPTIONS, ...options };
|
|
1206
|
+
const isNoEditAmend = opts.amend && opts.noEdit;
|
|
1207
|
+
if (!isNoEditAmend && (!message || typeof message !== 'string')) {
|
|
1208
|
+
throw index_cjs_js.createError('Commit message is required');
|
|
1209
|
+
}
|
|
1210
|
+
const args = ['commit'];
|
|
1211
|
+
if (isNoEditAmend) {
|
|
1212
|
+
args.push('--amend', '--no-edit');
|
|
1213
|
+
}
|
|
1214
|
+
else {
|
|
1215
|
+
const safeMessage = escapeGitMessage(message);
|
|
1216
|
+
let fullMessage = safeMessage;
|
|
1217
|
+
if (opts.body) {
|
|
1218
|
+
const safeBody = escapeGitMessage(opts.body);
|
|
1219
|
+
fullMessage = `${safeMessage}\n\n${safeBody}`;
|
|
1220
|
+
}
|
|
1221
|
+
args.push('-m', fullMessage);
|
|
1222
|
+
if (opts.amend) {
|
|
1223
|
+
args.push('--amend');
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
if (opts.allowEmpty) {
|
|
1227
|
+
args.push('--allow-empty');
|
|
1228
|
+
}
|
|
1229
|
+
if (opts.sign) {
|
|
1230
|
+
args.push('-S');
|
|
1231
|
+
}
|
|
1232
|
+
if (opts.noVerify) {
|
|
1233
|
+
args.push('--no-verify');
|
|
1234
|
+
}
|
|
1235
|
+
if (opts.author) {
|
|
1236
|
+
const safeAuthor = escapeAuthor(opts.author);
|
|
1237
|
+
args.push('--author', safeAuthor);
|
|
1238
|
+
}
|
|
1239
|
+
if (opts.files && opts.files.length > 0) {
|
|
1240
|
+
args.push('--');
|
|
1241
|
+
for (const file of opts.files) {
|
|
1242
|
+
args.push(escapeFilePath(file));
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
try {
|
|
1246
|
+
node_child_process.execFileSync('git', args, {
|
|
1247
|
+
encoding: 'utf-8',
|
|
1248
|
+
cwd: opts.cwd,
|
|
1249
|
+
timeout: opts.timeout,
|
|
1250
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
1251
|
+
});
|
|
1252
|
+
const commit = getCommit('HEAD', opts);
|
|
1253
|
+
if (!commit) {
|
|
1254
|
+
throw index_cjs_js.createError('Failed to retrieve created commit');
|
|
1255
|
+
}
|
|
1256
|
+
return commit;
|
|
1257
|
+
}
|
|
1258
|
+
catch (error) {
|
|
1259
|
+
if (error instanceof Error) {
|
|
1260
|
+
throw index_cjs_js.createError(`Failed to create commit: ${error.message}`);
|
|
1261
|
+
}
|
|
1262
|
+
throw error;
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
const MAX_PATH_LENGTH = 4096;
|
|
1266
|
+
function escapeFilePath(path) {
|
|
1267
|
+
if (!path || typeof path !== 'string') {
|
|
1268
|
+
throw index_cjs_js.createError('File path is required');
|
|
1269
|
+
}
|
|
1270
|
+
if (path.length > MAX_PATH_LENGTH) {
|
|
1271
|
+
throw index_cjs_js.createError(`Path exceeds maximum length of ${MAX_PATH_LENGTH}`);
|
|
1272
|
+
}
|
|
1273
|
+
const safe = [];
|
|
1274
|
+
for (let i = 0; i < path.length; i++) {
|
|
1275
|
+
const code = path.charCodeAt(i);
|
|
1276
|
+
if ((code >= 97 && code <= 122) ||
|
|
1277
|
+
(code >= 65 && code <= 90) ||
|
|
1278
|
+
(code >= 48 && code <= 57) ||
|
|
1279
|
+
code === 47 ||
|
|
1280
|
+
code === 92 ||
|
|
1281
|
+
code === 45 ||
|
|
1282
|
+
code === 95 ||
|
|
1283
|
+
code === 46 ||
|
|
1284
|
+
code === 32) {
|
|
1285
|
+
const char = path[i];
|
|
1286
|
+
if (char !== undefined)
|
|
1287
|
+
safe.push(char);
|
|
1288
|
+
}
|
|
1289
|
+
else {
|
|
1290
|
+
throw index_cjs_js.createError(`Invalid character in path at position ${i}: "${path[i]}"`);
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
return safe.join('');
|
|
1294
|
+
}
|
|
1295
|
+
const MAX_AUTHOR_LENGTH = 500;
|
|
1296
|
+
function escapeAuthor(author) {
|
|
1297
|
+
if (!author || typeof author !== 'string') {
|
|
1298
|
+
throw index_cjs_js.createError('Author is required');
|
|
1299
|
+
}
|
|
1300
|
+
if (author.length > MAX_AUTHOR_LENGTH) {
|
|
1301
|
+
throw index_cjs_js.createError(`Author exceeds maximum length of ${MAX_AUTHOR_LENGTH}`);
|
|
1302
|
+
}
|
|
1303
|
+
const safe = [];
|
|
1304
|
+
for (let i = 0; i < author.length; i++) {
|
|
1305
|
+
const code = author.charCodeAt(i);
|
|
1306
|
+
if ((code >= 97 && code <= 122) ||
|
|
1307
|
+
(code >= 65 && code <= 90) ||
|
|
1308
|
+
(code >= 48 && code <= 57) ||
|
|
1309
|
+
code === 32 ||
|
|
1310
|
+
code === 64 ||
|
|
1311
|
+
code === 46 ||
|
|
1312
|
+
code === 45 ||
|
|
1313
|
+
code === 95 ||
|
|
1314
|
+
code === 60 ||
|
|
1315
|
+
code === 62) {
|
|
1316
|
+
const char = author[i];
|
|
1317
|
+
if (char !== undefined)
|
|
1318
|
+
safe.push(char);
|
|
1319
|
+
}
|
|
1320
|
+
else {
|
|
1321
|
+
throw index_cjs_js.createError(`Invalid character in author at position ${i}: "${author[i]}"`);
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
return safe.join('');
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
function formatHeader(draft) {
|
|
1328
|
+
let header = draft.type ?? '';
|
|
1329
|
+
if (draft.scope && draft.scope.length > 0) {
|
|
1330
|
+
header += `(${draft.scope.join(',')})`;
|
|
1331
|
+
}
|
|
1332
|
+
if (draft.breaking) {
|
|
1333
|
+
header += '!';
|
|
1334
|
+
}
|
|
1335
|
+
header += `: ${draft.subject ?? ''}`;
|
|
1336
|
+
return header;
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
function formatCommitMessage(draft) {
|
|
1340
|
+
const parts = [formatHeader(draft)];
|
|
1341
|
+
if (draft.body && draft.body.length > 0) {
|
|
1342
|
+
parts.push('');
|
|
1343
|
+
parts.push(draft.body);
|
|
1344
|
+
}
|
|
1345
|
+
const footers = resolveFooters(draft);
|
|
1346
|
+
if (footers.length > 0) {
|
|
1347
|
+
parts.push('');
|
|
1348
|
+
for (const footer of footers) {
|
|
1349
|
+
parts.push(renderFooter(footer));
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
return parts.join('\n');
|
|
1353
|
+
}
|
|
1354
|
+
function resolveFooters(draft) {
|
|
1355
|
+
const existing = draft.footers ?? [];
|
|
1356
|
+
if (!draft.breaking || !draft.breakingDescription)
|
|
1357
|
+
return existing;
|
|
1358
|
+
if (existing.some((footer) => isBreakingFooterKey(footer.key)))
|
|
1359
|
+
return existing;
|
|
1360
|
+
const synthesized = {
|
|
1361
|
+
key: 'BREAKING CHANGE',
|
|
1362
|
+
value: draft.breakingDescription,
|
|
1363
|
+
separator: ':',
|
|
1364
|
+
};
|
|
1365
|
+
return [synthesized, ...existing];
|
|
1366
|
+
}
|
|
1367
|
+
function renderFooter(footer) {
|
|
1368
|
+
const joiner = footer.separator === ':' ? ' ' : '';
|
|
1369
|
+
return `${footer.key}${footer.separator}${joiner}${footer.value}`;
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
const commitStep = {
|
|
1373
|
+
id: 'commit',
|
|
1374
|
+
async run(ctx) {
|
|
1375
|
+
if (ctx.config.skipCommit)
|
|
1376
|
+
return done();
|
|
1377
|
+
const message = formatCommitMessage(ctx.draft);
|
|
1378
|
+
const executor = ctx.config.commitExecutor ?? defaultCommitExecutor(ctx.config.cwd);
|
|
1379
|
+
try {
|
|
1380
|
+
await executor(message);
|
|
1381
|
+
}
|
|
1382
|
+
catch (unknown) {
|
|
1383
|
+
const error = unknown instanceof Error ? unknown : index_cjs_js.createError(String(unknown));
|
|
1384
|
+
return cancelled(error);
|
|
1385
|
+
}
|
|
1386
|
+
return done();
|
|
1387
|
+
},
|
|
1388
|
+
};
|
|
1389
|
+
function defaultCommitExecutor(cwd) {
|
|
1390
|
+
return (message) => {
|
|
1391
|
+
commit(message, { cwd });
|
|
1392
|
+
};
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
const issuesStep = {
|
|
1396
|
+
id: 'issues',
|
|
1397
|
+
async run(ctx) {
|
|
1398
|
+
const confirmOutcome = await confirm({
|
|
1399
|
+
message: 'Does this change reference any issues?',
|
|
1400
|
+
initial: hasIssueFooter(ctx.draft.footers),
|
|
1401
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
1402
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
1403
|
+
});
|
|
1404
|
+
if (confirmOutcome.result === PromptResult.Cancelled) {
|
|
1405
|
+
return cancelled();
|
|
1406
|
+
}
|
|
1407
|
+
if (!confirmOutcome.value) {
|
|
1408
|
+
ctx.draft = stripIssueFooters(ctx.draft);
|
|
1409
|
+
return done();
|
|
1410
|
+
}
|
|
1411
|
+
const textOutcome = await text({
|
|
1412
|
+
message: 'Issue references (e.g. fixes #123, re #456):',
|
|
1413
|
+
validate: (value) => (parseReferences(value).length === 0 ? 'Enter at least one reference like "fixes #123"' : undefined),
|
|
1414
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
1415
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
1416
|
+
});
|
|
1417
|
+
if (textOutcome.result === PromptResult.Cancelled) {
|
|
1418
|
+
return cancelled();
|
|
1419
|
+
}
|
|
1420
|
+
ctx.draft = applyIssueFooters(ctx.draft, parseReferences(textOutcome.value));
|
|
1421
|
+
return done();
|
|
1422
|
+
},
|
|
1423
|
+
};
|
|
1424
|
+
function parseReferences(raw) {
|
|
1425
|
+
const footers = [];
|
|
1426
|
+
const length = raw.length;
|
|
1427
|
+
let pos = 0;
|
|
1428
|
+
while (pos < length) {
|
|
1429
|
+
const code = raw.charCodeAt(pos);
|
|
1430
|
+
if (!isLetter(code)) {
|
|
1431
|
+
pos++;
|
|
1432
|
+
continue;
|
|
1433
|
+
}
|
|
1434
|
+
const keywordStart = pos;
|
|
1435
|
+
pos++;
|
|
1436
|
+
while (pos < length && (isLetter(raw.charCodeAt(pos)) || raw.charCodeAt(pos) === HYPHEN)) {
|
|
1437
|
+
pos++;
|
|
1438
|
+
}
|
|
1439
|
+
const keyword = raw.slice(keywordStart, pos);
|
|
1440
|
+
while (pos < length && isWhitespace(raw.charCodeAt(pos))) {
|
|
1441
|
+
pos++;
|
|
1442
|
+
}
|
|
1443
|
+
if (pos >= length || raw.charCodeAt(pos) !== HASH)
|
|
1444
|
+
continue;
|
|
1445
|
+
pos++;
|
|
1446
|
+
const numberStart = pos;
|
|
1447
|
+
while (pos < length && isDigit$1(raw.charCodeAt(pos))) {
|
|
1448
|
+
pos++;
|
|
1449
|
+
}
|
|
1450
|
+
if (pos === numberStart)
|
|
1451
|
+
continue;
|
|
1452
|
+
footers.push({ key: capitalize(keyword), value: raw.slice(numberStart, pos), separator: ' #' });
|
|
1453
|
+
}
|
|
1454
|
+
return footers;
|
|
1455
|
+
}
|
|
1456
|
+
const HASH = 35;
|
|
1457
|
+
const HYPHEN = 45;
|
|
1458
|
+
function isDigit$1(code) {
|
|
1459
|
+
return code >= 48 && code <= 57;
|
|
1460
|
+
}
|
|
1461
|
+
function isLetter(code) {
|
|
1462
|
+
return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
|
|
1463
|
+
}
|
|
1464
|
+
function isWhitespace(code) {
|
|
1465
|
+
return code === 32 || code === 9 || code === 10 || code === 13;
|
|
1466
|
+
}
|
|
1467
|
+
function hasIssueFooter(footers) {
|
|
1468
|
+
if (!footers)
|
|
1469
|
+
return false;
|
|
1470
|
+
return footers.some((footer) => footer.separator === ' #');
|
|
1471
|
+
}
|
|
1472
|
+
function applyIssueFooters(draft, newIssueFooters) {
|
|
1473
|
+
const preserved = (draft.footers ?? []).filter((footer) => footer.separator !== ' #');
|
|
1474
|
+
return { ...draft, footers: [...preserved, ...newIssueFooters] };
|
|
1475
|
+
}
|
|
1476
|
+
function stripIssueFooters(draft) {
|
|
1477
|
+
if (!draft.footers)
|
|
1478
|
+
return draft;
|
|
1479
|
+
const preserved = draft.footers.filter((footer) => footer.separator !== ' #');
|
|
1480
|
+
if (preserved.length === draft.footers.length)
|
|
1481
|
+
return draft;
|
|
1482
|
+
if (preserved.length === 0)
|
|
1483
|
+
return omitKeys(draft, ['footers']);
|
|
1484
|
+
return { ...draft, footers: preserved };
|
|
1485
|
+
}
|
|
1486
|
+
function capitalize(keyword) {
|
|
1487
|
+
const first = keyword.charAt(0).toUpperCase();
|
|
1488
|
+
return first + keyword.slice(1).toLowerCase();
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1491
|
+
function parseBody(lines, startIndex) {
|
|
1492
|
+
let pos = startIndex;
|
|
1493
|
+
while (pos < lines.length) {
|
|
1494
|
+
const currentLine = lines[pos];
|
|
1495
|
+
if (currentLine === undefined || currentLine.trim() !== '')
|
|
1496
|
+
break;
|
|
1497
|
+
pos++;
|
|
1498
|
+
}
|
|
1499
|
+
if (pos >= lines.length) {
|
|
1500
|
+
return undefined;
|
|
1501
|
+
}
|
|
1502
|
+
const firstLine = lines[pos];
|
|
1503
|
+
if (firstLine === undefined || isFooterLine(firstLine)) {
|
|
1504
|
+
return undefined;
|
|
1505
|
+
}
|
|
1506
|
+
const bodyLines = [];
|
|
1507
|
+
while (pos < lines.length) {
|
|
1508
|
+
const line = lines[pos];
|
|
1509
|
+
if (line === undefined)
|
|
1510
|
+
break;
|
|
1511
|
+
if (isFooterLine(line)) {
|
|
1512
|
+
break;
|
|
1513
|
+
}
|
|
1514
|
+
const nextLine = lines[pos + 1];
|
|
1515
|
+
if (line.trim() === '' && pos + 1 < lines.length && nextLine !== undefined && isFooterLine(nextLine)) {
|
|
1516
|
+
break;
|
|
1517
|
+
}
|
|
1518
|
+
bodyLines.push(line);
|
|
1519
|
+
pos++;
|
|
1520
|
+
}
|
|
1521
|
+
while (bodyLines.length > 0 && bodyLines[bodyLines.length - 1]?.trim() === '') {
|
|
1522
|
+
bodyLines.pop();
|
|
1523
|
+
}
|
|
1524
|
+
if (bodyLines.length === 0) {
|
|
1525
|
+
return undefined;
|
|
1526
|
+
}
|
|
1527
|
+
return {
|
|
1528
|
+
body: bodyLines.join('\n'),
|
|
1529
|
+
endIndex: pos,
|
|
1530
|
+
};
|
|
1531
|
+
}
|
|
1532
|
+
function isFooterLine(line) {
|
|
1533
|
+
if (!line)
|
|
1534
|
+
return false;
|
|
1535
|
+
const trimmed = line.trim();
|
|
1536
|
+
if (trimmed === '')
|
|
1537
|
+
return false;
|
|
1538
|
+
if (trimmed.startsWith('BREAKING CHANGE:') || trimmed.startsWith('BREAKING-CHANGE:')) {
|
|
1539
|
+
return true;
|
|
1540
|
+
}
|
|
1541
|
+
let pos = 0;
|
|
1542
|
+
while (pos < trimmed.length && trimmed[pos] === ' ') {
|
|
1543
|
+
pos++;
|
|
1544
|
+
}
|
|
1545
|
+
const tokenStart = pos;
|
|
1546
|
+
while (pos < trimmed.length) {
|
|
1547
|
+
const code = trimmed.charCodeAt(pos);
|
|
1548
|
+
if ((code >= 97 && code <= 122) || (code >= 65 && code <= 90) || (code >= 48 && code <= 57) || code === 45) {
|
|
1549
|
+
pos++;
|
|
1550
|
+
}
|
|
1551
|
+
else {
|
|
1552
|
+
break;
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
if (pos === tokenStart)
|
|
1556
|
+
return false;
|
|
1557
|
+
if (trimmed[pos] === ':') {
|
|
1558
|
+
return true;
|
|
1559
|
+
}
|
|
1560
|
+
if (trimmed[pos] === ' ' && trimmed[pos + 1] === '#') {
|
|
1561
|
+
return true;
|
|
1562
|
+
}
|
|
1563
|
+
return false;
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1566
|
+
function parseFooters(lines, startIndex) {
|
|
1567
|
+
const footers = [];
|
|
1568
|
+
let breakingDescription;
|
|
1569
|
+
let pos = startIndex;
|
|
1570
|
+
while (pos < lines.length) {
|
|
1571
|
+
const currentLine = lines[pos];
|
|
1572
|
+
if (currentLine === undefined || currentLine.trim() !== '')
|
|
1573
|
+
break;
|
|
1574
|
+
pos++;
|
|
1575
|
+
}
|
|
1576
|
+
while (pos < lines.length) {
|
|
1577
|
+
const line = lines[pos];
|
|
1578
|
+
if (line === undefined) {
|
|
1579
|
+
pos++;
|
|
1580
|
+
continue;
|
|
1581
|
+
}
|
|
1582
|
+
const footer = parseFooterLine(line);
|
|
1583
|
+
if (footer) {
|
|
1584
|
+
footers.push(footer);
|
|
1585
|
+
if (isBreakingFooterKey(footer.key)) {
|
|
1586
|
+
breakingDescription = footer.value;
|
|
1587
|
+
pos++;
|
|
1588
|
+
while (pos < lines.length) {
|
|
1589
|
+
const nextLineCheck = lines[pos];
|
|
1590
|
+
if (nextLineCheck === undefined || isNewFooter(nextLineCheck))
|
|
1591
|
+
break;
|
|
1592
|
+
const nextLine = nextLineCheck;
|
|
1593
|
+
if (nextLine.trim() !== '') {
|
|
1594
|
+
breakingDescription += '\n' + nextLine;
|
|
1595
|
+
}
|
|
1596
|
+
pos++;
|
|
1597
|
+
}
|
|
1598
|
+
continue;
|
|
1599
|
+
}
|
|
1600
|
+
}
|
|
1601
|
+
pos++;
|
|
1602
|
+
}
|
|
1603
|
+
return { footers, breakingDescription };
|
|
1604
|
+
}
|
|
1605
|
+
function parseFooterLine(line) {
|
|
1606
|
+
if (!line)
|
|
1607
|
+
return null;
|
|
1608
|
+
const trimmed = line.trim();
|
|
1609
|
+
if (trimmed === '')
|
|
1610
|
+
return null;
|
|
1611
|
+
if (trimmed.startsWith('BREAKING CHANGE:')) {
|
|
1612
|
+
return {
|
|
1613
|
+
key: 'BREAKING CHANGE',
|
|
1614
|
+
value: trimmed.slice(16).trim(),
|
|
1615
|
+
separator: ':',
|
|
1616
|
+
};
|
|
1617
|
+
}
|
|
1618
|
+
if (trimmed.startsWith('BREAKING-CHANGE:')) {
|
|
1619
|
+
return {
|
|
1620
|
+
key: 'BREAKING-CHANGE',
|
|
1621
|
+
value: trimmed.slice(16).trim(),
|
|
1622
|
+
separator: ':',
|
|
1623
|
+
};
|
|
1624
|
+
}
|
|
1625
|
+
let pos = 0;
|
|
1626
|
+
const tokenStart = pos;
|
|
1627
|
+
while (pos < trimmed.length) {
|
|
1628
|
+
const code = trimmed.charCodeAt(pos);
|
|
1629
|
+
if ((code >= 97 && code <= 122) || (code >= 65 && code <= 90) || (code >= 48 && code <= 57) || code === 45) {
|
|
1630
|
+
pos++;
|
|
1631
|
+
}
|
|
1632
|
+
else {
|
|
1633
|
+
break;
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
if (pos === tokenStart)
|
|
1637
|
+
return null;
|
|
1638
|
+
const key = trimmed.slice(tokenStart, pos);
|
|
1639
|
+
let separator;
|
|
1640
|
+
let valueStart;
|
|
1641
|
+
if (trimmed[pos] === ':') {
|
|
1642
|
+
separator = ':';
|
|
1643
|
+
valueStart = pos + 1;
|
|
1644
|
+
}
|
|
1645
|
+
else if (trimmed[pos] === ' ' && trimmed[pos + 1] === '#') {
|
|
1646
|
+
separator = ' #';
|
|
1647
|
+
valueStart = pos + 2;
|
|
1648
|
+
}
|
|
1649
|
+
else {
|
|
1650
|
+
return null;
|
|
1651
|
+
}
|
|
1652
|
+
if (separator === ':') {
|
|
1653
|
+
while (valueStart < trimmed.length && trimmed[valueStart] === ' ') {
|
|
1654
|
+
valueStart++;
|
|
1655
|
+
}
|
|
1656
|
+
}
|
|
1657
|
+
const value = trimmed.slice(valueStart);
|
|
1658
|
+
return { key, value, separator };
|
|
1659
|
+
}
|
|
1660
|
+
function isNewFooter(line) {
|
|
1661
|
+
if (!line)
|
|
1662
|
+
return false;
|
|
1663
|
+
return parseFooterLine(line) !== null;
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
function parseHeader(line) {
|
|
1667
|
+
let pos = 0;
|
|
1668
|
+
const len = line.length;
|
|
1669
|
+
const typeStart = pos;
|
|
1670
|
+
while (pos < len) {
|
|
1671
|
+
const code = line.charCodeAt(pos);
|
|
1672
|
+
if ((code >= 97 && code <= 122) || (code >= 65 && code <= 90) || (code >= 48 && code <= 57)) {
|
|
1673
|
+
pos++;
|
|
1674
|
+
}
|
|
1675
|
+
else {
|
|
1676
|
+
break;
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
const type = line.slice(typeStart, pos).toLowerCase();
|
|
1680
|
+
let scope = [];
|
|
1681
|
+
if (line[pos] === '(') {
|
|
1682
|
+
pos++;
|
|
1683
|
+
const scopeStart = pos;
|
|
1684
|
+
while (pos < len && line[pos] !== ')') {
|
|
1685
|
+
pos++;
|
|
1686
|
+
}
|
|
1687
|
+
scope = splitScopes(line.slice(scopeStart, pos));
|
|
1688
|
+
if (line[pos] === ')') {
|
|
1689
|
+
pos++;
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
const breaking = line[pos] === '!';
|
|
1693
|
+
if (breaking) {
|
|
1694
|
+
pos++;
|
|
1695
|
+
}
|
|
1696
|
+
if (line[pos] === ':') {
|
|
1697
|
+
pos++;
|
|
1698
|
+
}
|
|
1699
|
+
while (pos < len && line[pos] === ' ') {
|
|
1700
|
+
pos++;
|
|
1701
|
+
}
|
|
1702
|
+
const subject = line.slice(pos).trim();
|
|
1703
|
+
return {
|
|
1704
|
+
type,
|
|
1705
|
+
scope,
|
|
1706
|
+
subject,
|
|
1707
|
+
breaking,
|
|
1708
|
+
};
|
|
1709
|
+
}
|
|
1710
|
+
function splitScopes(raw) {
|
|
1711
|
+
if (raw === '') {
|
|
1712
|
+
return [''];
|
|
1713
|
+
}
|
|
1714
|
+
return raw.split(',').map((s) => s.trim());
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
const MAX_MESSAGE_LENGTH = 10 * 1024;
|
|
1718
|
+
function parseConventionalCommit(message) {
|
|
1719
|
+
if (message.length > MAX_MESSAGE_LENGTH) {
|
|
1720
|
+
throw index_cjs_js.createError(`Commit message exceeds maximum length of ${MAX_MESSAGE_LENGTH} characters`);
|
|
1721
|
+
}
|
|
1722
|
+
const lines = splitLines(message);
|
|
1723
|
+
if (lines.length === 0) {
|
|
1724
|
+
return {
|
|
1725
|
+
type: '',
|
|
1726
|
+
scope: [],
|
|
1727
|
+
subject: '',
|
|
1728
|
+
footers: [],
|
|
1729
|
+
breaking: false,
|
|
1730
|
+
raw: message,
|
|
1731
|
+
};
|
|
1732
|
+
}
|
|
1733
|
+
const firstLine = lines[0];
|
|
1734
|
+
if (firstLine === undefined) {
|
|
1735
|
+
return {
|
|
1736
|
+
type: '',
|
|
1737
|
+
scope: [],
|
|
1738
|
+
subject: '',
|
|
1739
|
+
footers: [],
|
|
1740
|
+
breaking: false,
|
|
1741
|
+
raw: message,
|
|
1742
|
+
};
|
|
1743
|
+
}
|
|
1744
|
+
const header = parseHeader(firstLine);
|
|
1745
|
+
let body;
|
|
1746
|
+
let footersStartIndex = 1;
|
|
1747
|
+
if (lines.length > 1) {
|
|
1748
|
+
const bodyResult = parseBody(lines, 1);
|
|
1749
|
+
if (bodyResult) {
|
|
1750
|
+
body = bodyResult.body;
|
|
1751
|
+
footersStartIndex = bodyResult.endIndex;
|
|
1752
|
+
}
|
|
1753
|
+
}
|
|
1754
|
+
const footersResult = parseFooters(lines, footersStartIndex);
|
|
1755
|
+
const breakingDescriptionFromFooter = footersResult.breakingDescription;
|
|
1756
|
+
const breaking = header.breaking || footersResult.footers.some((f) => hyphenToSpace(f.key.toUpperCase()) === 'BREAKING CHANGE');
|
|
1757
|
+
let breakingDescription;
|
|
1758
|
+
if (header.breaking && header.subject) {
|
|
1759
|
+
breakingDescription = header.subject;
|
|
1760
|
+
}
|
|
1761
|
+
if (breakingDescriptionFromFooter) {
|
|
1762
|
+
breakingDescription = breakingDescriptionFromFooter;
|
|
1763
|
+
}
|
|
1764
|
+
return {
|
|
1765
|
+
type: header.type,
|
|
1766
|
+
scope: header.scope,
|
|
1767
|
+
subject: header.subject,
|
|
1768
|
+
body,
|
|
1769
|
+
footers: footersResult.footers,
|
|
1770
|
+
breaking,
|
|
1771
|
+
breakingDescription,
|
|
1772
|
+
raw: message,
|
|
1773
|
+
};
|
|
1774
|
+
}
|
|
1775
|
+
function splitLines(message) {
|
|
1776
|
+
const lines = [];
|
|
1777
|
+
let currentLine = '';
|
|
1778
|
+
let i = 0;
|
|
1779
|
+
while (i < message.length) {
|
|
1780
|
+
const char = message[i];
|
|
1781
|
+
if (char === '\r') {
|
|
1782
|
+
lines.push(currentLine);
|
|
1783
|
+
currentLine = '';
|
|
1784
|
+
if (message[i + 1] === '\n') {
|
|
1785
|
+
i++;
|
|
1786
|
+
}
|
|
1787
|
+
}
|
|
1788
|
+
else if (char === '\n') {
|
|
1789
|
+
lines.push(currentLine);
|
|
1790
|
+
currentLine = '';
|
|
1791
|
+
}
|
|
1792
|
+
else {
|
|
1793
|
+
currentLine += char;
|
|
1794
|
+
}
|
|
1795
|
+
i++;
|
|
1796
|
+
}
|
|
1797
|
+
if (currentLine || message.endsWith('\n') || message.endsWith('\r')) {
|
|
1798
|
+
lines.push(currentLine);
|
|
1799
|
+
}
|
|
1800
|
+
return lines;
|
|
1801
|
+
}
|
|
1802
|
+
|
|
1803
|
+
const headerMaxLengthRule = {
|
|
1804
|
+
name: 'header-max-length',
|
|
1805
|
+
check(commit, context) {
|
|
1806
|
+
const maxLength = context.options?.maxLength;
|
|
1807
|
+
if (maxLength === null || maxLength === undefined)
|
|
1808
|
+
return [];
|
|
1809
|
+
const header = reconstructHeader(commit);
|
|
1810
|
+
if (header.length <= maxLength)
|
|
1811
|
+
return [];
|
|
1812
|
+
return [`header must be ≤ ${maxLength} characters but was ${header.length}: "${header}"`];
|
|
1813
|
+
},
|
|
1814
|
+
};
|
|
1815
|
+
function reconstructHeader(commit) {
|
|
1816
|
+
let header = commit.type;
|
|
1817
|
+
if (commit.scope.length > 0) {
|
|
1818
|
+
header += `(${commit.scope.join(',')})`;
|
|
1819
|
+
}
|
|
1820
|
+
if (commit.breaking) {
|
|
1821
|
+
header += '!';
|
|
1822
|
+
}
|
|
1823
|
+
header += `: ${commit.subject}`;
|
|
1824
|
+
return header;
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
const DEFAULT_IMPERATIVE_WORDLIST = {
|
|
1828
|
+
added: 'add',
|
|
1829
|
+
updated: 'update',
|
|
1830
|
+
fixed: 'fix',
|
|
1831
|
+
removed: 'remove',
|
|
1832
|
+
changed: 'change',
|
|
1833
|
+
modified: 'modify',
|
|
1834
|
+
created: 'create',
|
|
1835
|
+
deleted: 'delete',
|
|
1836
|
+
improved: 'improve',
|
|
1837
|
+
refactored: 'refactor',
|
|
1838
|
+
implemented: 'implement',
|
|
1839
|
+
renamed: 'rename',
|
|
1840
|
+
moved: 'move',
|
|
1841
|
+
};
|
|
1842
|
+
const imperativeMoodRule = {
|
|
1843
|
+
name: 'imperative-mood',
|
|
1844
|
+
check(commit, context) {
|
|
1845
|
+
const subject = commit.subject.trim();
|
|
1846
|
+
if (subject === '')
|
|
1847
|
+
return [];
|
|
1848
|
+
const wordlist = context.options?.wordlist ?? DEFAULT_IMPERATIVE_WORDLIST;
|
|
1849
|
+
const firstWord = extractFirstWord(subject).toLowerCase();
|
|
1850
|
+
if (firstWord === '')
|
|
1851
|
+
return [];
|
|
1852
|
+
const imperative = wordlist[firstWord];
|
|
1853
|
+
if (imperative === undefined)
|
|
1854
|
+
return [];
|
|
1855
|
+
return [`subject should use imperative mood: use "${imperative}" instead of "${firstWord}"`];
|
|
1856
|
+
},
|
|
1857
|
+
};
|
|
1858
|
+
function extractFirstWord(subject) {
|
|
1859
|
+
let end = 0;
|
|
1860
|
+
while (end < subject.length && subject[end] !== ' ' && subject[end] !== '\t') {
|
|
1861
|
+
end++;
|
|
1862
|
+
}
|
|
1863
|
+
return subject.slice(0, end);
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
const scopeEnumRule = {
|
|
1867
|
+
name: 'scope-enum',
|
|
1868
|
+
check(commit, context) {
|
|
1869
|
+
const allowed = context.options?.scopes ?? [];
|
|
1870
|
+
if (allowed.length === 0)
|
|
1871
|
+
return [];
|
|
1872
|
+
if (commit.scope.length === 0)
|
|
1873
|
+
return [];
|
|
1874
|
+
const violations = [];
|
|
1875
|
+
for (const scope of commit.scope) {
|
|
1876
|
+
if (!allowed.includes(scope)) {
|
|
1877
|
+
violations.push(`scope must be one of [${allowed.join(', ')}] but found "${scope}"`);
|
|
1878
|
+
}
|
|
1879
|
+
}
|
|
1880
|
+
return violations;
|
|
1881
|
+
},
|
|
1882
|
+
};
|
|
1883
|
+
|
|
1884
|
+
const subjectCaseRule = {
|
|
1885
|
+
name: 'subject-case',
|
|
1886
|
+
check(commit, context) {
|
|
1887
|
+
const cases = context.options?.cases ?? [];
|
|
1888
|
+
if (cases.length === 0)
|
|
1889
|
+
return [];
|
|
1890
|
+
const subject = commit.subject;
|
|
1891
|
+
if (subject.trim() === '')
|
|
1892
|
+
return [];
|
|
1893
|
+
for (const form of cases) {
|
|
1894
|
+
if (matchesCase(subject, form))
|
|
1895
|
+
return [];
|
|
1896
|
+
}
|
|
1897
|
+
return [`subject must be one of [${cases.join(', ')}] but was "${subject}"`];
|
|
1898
|
+
},
|
|
1899
|
+
};
|
|
1900
|
+
function matchesCase(subject, form) {
|
|
1901
|
+
switch (form) {
|
|
1902
|
+
case 'sentence-case':
|
|
1903
|
+
return isSentenceCase(subject);
|
|
1904
|
+
case 'lower-case':
|
|
1905
|
+
return isLowerCase(subject);
|
|
1906
|
+
case 'upper-case':
|
|
1907
|
+
return isUpperCase(subject);
|
|
1908
|
+
case 'kebab-case':
|
|
1909
|
+
return isKebabCase(subject);
|
|
1910
|
+
case 'snake-case':
|
|
1911
|
+
return isSnakeCase(subject);
|
|
1912
|
+
case 'start-case':
|
|
1913
|
+
return isStartCase(subject);
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
function isSentenceCase(subject) {
|
|
1917
|
+
for (const char of subject) {
|
|
1918
|
+
if (isAlpha(char))
|
|
1919
|
+
return isUpperChar(char);
|
|
1920
|
+
}
|
|
1921
|
+
return true;
|
|
1922
|
+
}
|
|
1923
|
+
function isLowerCase(subject) {
|
|
1924
|
+
for (const char of subject) {
|
|
1925
|
+
if (isAlpha(char) && isUpperChar(char))
|
|
1926
|
+
return false;
|
|
1927
|
+
}
|
|
1928
|
+
return true;
|
|
1929
|
+
}
|
|
1930
|
+
function isUpperCase(subject) {
|
|
1931
|
+
for (const char of subject) {
|
|
1932
|
+
if (isAlpha(char) && isLowerChar(char))
|
|
1933
|
+
return false;
|
|
1934
|
+
}
|
|
1935
|
+
return true;
|
|
1936
|
+
}
|
|
1937
|
+
function isKebabCase(subject) {
|
|
1938
|
+
for (const char of subject) {
|
|
1939
|
+
if (char === '-')
|
|
1940
|
+
continue;
|
|
1941
|
+
if (isAlpha(char) && isLowerChar(char))
|
|
1942
|
+
continue;
|
|
1943
|
+
if (isDigit(char))
|
|
1944
|
+
continue;
|
|
1945
|
+
return false;
|
|
1946
|
+
}
|
|
1947
|
+
return true;
|
|
1948
|
+
}
|
|
1949
|
+
function isSnakeCase(subject) {
|
|
1950
|
+
for (const char of subject) {
|
|
1951
|
+
if (char === '_')
|
|
1952
|
+
continue;
|
|
1953
|
+
if (isAlpha(char) && isLowerChar(char))
|
|
1954
|
+
continue;
|
|
1955
|
+
if (isDigit(char))
|
|
1956
|
+
continue;
|
|
1957
|
+
return false;
|
|
1958
|
+
}
|
|
1959
|
+
return true;
|
|
1960
|
+
}
|
|
1961
|
+
function isStartCase(subject) {
|
|
1962
|
+
let expectUpper = true;
|
|
1963
|
+
for (const char of subject) {
|
|
1964
|
+
if (char === ' ') {
|
|
1965
|
+
expectUpper = true;
|
|
1966
|
+
continue;
|
|
1967
|
+
}
|
|
1968
|
+
if (expectUpper) {
|
|
1969
|
+
if (isAlpha(char) && !isUpperChar(char))
|
|
1970
|
+
return false;
|
|
1971
|
+
expectUpper = false;
|
|
1972
|
+
}
|
|
1973
|
+
}
|
|
1974
|
+
return true;
|
|
1975
|
+
}
|
|
1976
|
+
function isAlpha(char) {
|
|
1977
|
+
const code = char.charCodeAt(0);
|
|
1978
|
+
return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
|
|
1979
|
+
}
|
|
1980
|
+
function isDigit(char) {
|
|
1981
|
+
const code = char.charCodeAt(0);
|
|
1982
|
+
return code >= 48 && code <= 57;
|
|
1983
|
+
}
|
|
1984
|
+
function isUpperChar(char) {
|
|
1985
|
+
const code = char.charCodeAt(0);
|
|
1986
|
+
return code >= 65 && code <= 90;
|
|
1987
|
+
}
|
|
1988
|
+
function isLowerChar(char) {
|
|
1989
|
+
const code = char.charCodeAt(0);
|
|
1990
|
+
return code >= 97 && code <= 122;
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
const subjectEmptyRule = {
|
|
1994
|
+
name: 'subject-empty',
|
|
1995
|
+
check(commit) {
|
|
1996
|
+
if (commit.subject.trim() === '') {
|
|
1997
|
+
return ['subject must not be empty'];
|
|
1998
|
+
}
|
|
1999
|
+
return [];
|
|
2000
|
+
},
|
|
2001
|
+
};
|
|
2002
|
+
|
|
2003
|
+
const typeEnumRule = {
|
|
2004
|
+
name: 'type-enum',
|
|
2005
|
+
check(commit, context) {
|
|
2006
|
+
const allowed = context.options?.types ?? [];
|
|
2007
|
+
if (allowed.length === 0)
|
|
2008
|
+
return [];
|
|
2009
|
+
if (commit.type === '') {
|
|
2010
|
+
return [`type must be one of [${allowed.join(', ')}] but was empty`];
|
|
2011
|
+
}
|
|
2012
|
+
if (!allowed.includes(commit.type)) {
|
|
2013
|
+
return [`type must be one of [${allowed.join(', ')}] but was "${commit.type}"`];
|
|
2014
|
+
}
|
|
2015
|
+
return [];
|
|
2016
|
+
},
|
|
2017
|
+
};
|
|
2018
|
+
|
|
2019
|
+
const BUILT_IN_RULES = {
|
|
2020
|
+
[typeEnumRule.name]: typeEnumRule,
|
|
2021
|
+
[scopeEnumRule.name]: scopeEnumRule,
|
|
2022
|
+
[subjectCaseRule.name]: subjectCaseRule,
|
|
2023
|
+
[subjectEmptyRule.name]: subjectEmptyRule,
|
|
2024
|
+
[headerMaxLengthRule.name]: headerMaxLengthRule,
|
|
2025
|
+
[imperativeMoodRule.name]: imperativeMoodRule,
|
|
2026
|
+
};
|
|
2027
|
+
function validateCommit(commit, ruleset) {
|
|
2028
|
+
return validateCommitWithRules(commit, ruleset, BUILT_IN_RULES);
|
|
2029
|
+
}
|
|
2030
|
+
function validateCommitWithRules(commit, ruleset, rules) {
|
|
2031
|
+
const warnings = [];
|
|
2032
|
+
const errors = [];
|
|
2033
|
+
for (const [ruleName, config] of index_cjs_js$2.entries(ruleset)) {
|
|
2034
|
+
const level = config[0];
|
|
2035
|
+
if (level === 'off')
|
|
2036
|
+
continue;
|
|
2037
|
+
const rule = rules[ruleName];
|
|
2038
|
+
if (rule === undefined)
|
|
2039
|
+
continue;
|
|
2040
|
+
const options = config.length > 1 ? config[1] : undefined;
|
|
2041
|
+
const violations = rule.check(commit, { level, options: options });
|
|
2042
|
+
for (const message of violations) {
|
|
2043
|
+
const entry = { level, message, ruleName };
|
|
2044
|
+
if (level === 'error') {
|
|
2045
|
+
errors.push(entry);
|
|
2046
|
+
}
|
|
2047
|
+
else {
|
|
2048
|
+
warnings.push(entry);
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
}
|
|
2052
|
+
return {
|
|
2053
|
+
valid: errors.length === 0,
|
|
2054
|
+
warnings,
|
|
2055
|
+
errors,
|
|
2056
|
+
};
|
|
2057
|
+
}
|
|
2058
|
+
|
|
2059
|
+
const PREVIEW_RESTART_STEP_ID = 'type';
|
|
2060
|
+
const previewStep = {
|
|
2061
|
+
id: 'preview',
|
|
2062
|
+
async run(ctx) {
|
|
2063
|
+
const message = formatCommitMessage(ctx.draft);
|
|
2064
|
+
writePreview(ctx, message);
|
|
2065
|
+
const outcome = await confirm({
|
|
2066
|
+
message: 'Commit this message?',
|
|
2067
|
+
initial: true,
|
|
2068
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
2069
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
2070
|
+
});
|
|
2071
|
+
if (outcome.result === PromptResult.Cancelled) {
|
|
2072
|
+
return cancelled();
|
|
2073
|
+
}
|
|
2074
|
+
if (!outcome.value) {
|
|
2075
|
+
return goto(PREVIEW_RESTART_STEP_ID);
|
|
2076
|
+
}
|
|
2077
|
+
return done();
|
|
2078
|
+
},
|
|
2079
|
+
};
|
|
2080
|
+
function writePreview(ctx, message) {
|
|
2081
|
+
const out = ctx.config.output ?? process.stdout;
|
|
2082
|
+
const lines = ['', message];
|
|
2083
|
+
const validation = validateCommit(parseConventionalCommit(message), ctx.config.validateRuleset);
|
|
2084
|
+
for (const warning of validation.warnings) {
|
|
2085
|
+
lines.push(`warn(${warning.ruleName}): ${warning.message}`);
|
|
2086
|
+
}
|
|
2087
|
+
for (const error of validation.errors) {
|
|
2088
|
+
lines.push(`error(${error.ruleName}): ${error.message}`);
|
|
2089
|
+
}
|
|
2090
|
+
lines.push('');
|
|
2091
|
+
out.write(lines.join('\n') + '\n');
|
|
2092
|
+
}
|
|
2093
|
+
|
|
2094
|
+
function defaultScope(candidates) {
|
|
2095
|
+
if (candidates.length === 0)
|
|
2096
|
+
return undefined;
|
|
2097
|
+
if (candidates.length === 1)
|
|
2098
|
+
return candidates[0]?.name;
|
|
2099
|
+
for (const candidate of candidates) {
|
|
2100
|
+
if (isAncestorOfAll(candidate, candidates)) {
|
|
2101
|
+
return candidate.name;
|
|
2102
|
+
}
|
|
2103
|
+
}
|
|
2104
|
+
return undefined;
|
|
2105
|
+
}
|
|
2106
|
+
function isAncestorOfAll(candidate, all) {
|
|
2107
|
+
const prefix = candidate.path.endsWith('/') ? candidate.path : `${candidate.path}/`;
|
|
2108
|
+
for (const other of all) {
|
|
2109
|
+
if (other === candidate)
|
|
2110
|
+
continue;
|
|
2111
|
+
if (!other.path.startsWith(prefix))
|
|
2112
|
+
return false;
|
|
2113
|
+
}
|
|
2114
|
+
return true;
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
const EXCLUDED_PATH_SEGMENTS = ['/node_modules/', '/.git/'];
|
|
2118
|
+
function discoverScopes(stagedPaths, options) {
|
|
2119
|
+
const seenPaths = index_cjs_js$5.createSet();
|
|
2120
|
+
const discovered = [];
|
|
2121
|
+
for (const stagedPath of stagedPaths) {
|
|
2122
|
+
if (isExcluded(stagedPath))
|
|
2123
|
+
continue;
|
|
2124
|
+
const absolutePath = node_path.isAbsolute(stagedPath) ? stagedPath : node_path.join(options.cwd, stagedPath);
|
|
2125
|
+
const projectRoot = index_cjs_js$6.findProjectRoot(absolutePath);
|
|
2126
|
+
if (projectRoot === null)
|
|
2127
|
+
continue;
|
|
2128
|
+
if (seenPaths.has(projectRoot))
|
|
2129
|
+
continue;
|
|
2130
|
+
seenPaths.add(projectRoot);
|
|
2131
|
+
const name = readProjectName(projectRoot);
|
|
2132
|
+
if (name === null)
|
|
2133
|
+
continue;
|
|
2134
|
+
if (options.scopeFilter && !options.scopeFilter({ path: projectRoot, name }))
|
|
2135
|
+
continue;
|
|
2136
|
+
discovered.push({ name, path: projectRoot });
|
|
2137
|
+
}
|
|
2138
|
+
return discovered;
|
|
2139
|
+
}
|
|
2140
|
+
function readProjectName(projectRoot) {
|
|
2141
|
+
const fromProjectJson = readManifestName(node_path.join(projectRoot, 'project.json'));
|
|
2142
|
+
if (fromProjectJson !== null)
|
|
2143
|
+
return fromProjectJson;
|
|
2144
|
+
return readManifestName(node_path.join(projectRoot, 'package.json'));
|
|
2145
|
+
}
|
|
2146
|
+
function readManifestName(manifestPath) {
|
|
2147
|
+
const content = index_cjs_js$7.readFileIfExists(manifestPath);
|
|
2148
|
+
if (content === null)
|
|
2149
|
+
return null;
|
|
2150
|
+
try {
|
|
2151
|
+
const manifest = index_cjs_js$8.parse(content);
|
|
2152
|
+
return manifest.name ?? null;
|
|
2153
|
+
}
|
|
2154
|
+
catch {
|
|
2155
|
+
return null;
|
|
2156
|
+
}
|
|
2157
|
+
}
|
|
2158
|
+
function isExcluded(stagedPath) {
|
|
2159
|
+
const normalized = `/${stagedPath}/`;
|
|
2160
|
+
for (const segment of EXCLUDED_PATH_SEGMENTS) {
|
|
2161
|
+
if (normalized.includes(segment))
|
|
2162
|
+
return true;
|
|
2163
|
+
}
|
|
2164
|
+
return false;
|
|
2165
|
+
}
|
|
2166
|
+
|
|
2167
|
+
const EMPTY_STAGING_MESSAGE = 'No staged changes; stage something first.';
|
|
2168
|
+
const resolveScopeStep = {
|
|
2169
|
+
id: 'resolve-scope',
|
|
2170
|
+
async run(ctx) {
|
|
2171
|
+
return runResolveScope(ctx);
|
|
2172
|
+
},
|
|
2173
|
+
};
|
|
2174
|
+
function runResolveScope(ctx) {
|
|
2175
|
+
const stagedPaths = ctx.config.stagedPathsProvider({ cwd: ctx.config.cwd });
|
|
2176
|
+
if (stagedPaths.length === 0) {
|
|
2177
|
+
return cancelled(index_cjs_js.createError(EMPTY_STAGING_MESSAGE));
|
|
2178
|
+
}
|
|
2179
|
+
const scopeFilter = ctx.config.scopeFilter;
|
|
2180
|
+
const discovered = discoverScopes(stagedPaths, {
|
|
2181
|
+
cwd: ctx.config.cwd,
|
|
2182
|
+
...(scopeFilter && { scopeFilter }),
|
|
2183
|
+
});
|
|
2184
|
+
ctx.candidateScopes = discovered.map((entry) => entry.name);
|
|
2185
|
+
ctx.defaultScope = defaultScope(discovered);
|
|
2186
|
+
return done();
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
const NO_SCOPE_CANDIDATES_MESSAGE = 'No scope candidates were discovered. Either stage a file under a project or set scopeOptional: true.';
|
|
2190
|
+
const scopeStep = {
|
|
2191
|
+
id: 'scope',
|
|
2192
|
+
async run(ctx) {
|
|
2193
|
+
if (ctx.candidateScopes.length === 0) {
|
|
2194
|
+
if (ctx.config.scopeOptional) {
|
|
2195
|
+
ctx.draft = { ...ctx.draft, scope: [] };
|
|
2196
|
+
return done();
|
|
2197
|
+
}
|
|
2198
|
+
return cancelled(index_cjs_js.createError(NO_SCOPE_CANDIDATES_MESSAGE));
|
|
2199
|
+
}
|
|
2200
|
+
if (ctx.config.scopeMulti) {
|
|
2201
|
+
return runMultiselect(ctx);
|
|
2202
|
+
}
|
|
2203
|
+
return runSingleSelect(ctx);
|
|
2204
|
+
},
|
|
2205
|
+
};
|
|
2206
|
+
async function runSingleSelect(ctx) {
|
|
2207
|
+
const choices = ctx.candidateScopes.map((name) => ({ label: name, value: name }));
|
|
2208
|
+
const initialIndex = resolveInitialIndex(ctx.candidateScopes, ctx.draft.scope, ctx.defaultScope);
|
|
2209
|
+
const outcome = await select({
|
|
2210
|
+
message: 'Select the scope of change:',
|
|
2211
|
+
choices,
|
|
2212
|
+
searchable: true,
|
|
2213
|
+
...(initialIndex >= 0 && { initial: initialIndex }),
|
|
2214
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
2215
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
2216
|
+
});
|
|
2217
|
+
if (outcome.result === PromptResult.Cancelled) {
|
|
2218
|
+
return cancelled();
|
|
2219
|
+
}
|
|
2220
|
+
ctx.draft = { ...ctx.draft, scope: [outcome.value] };
|
|
2221
|
+
return done();
|
|
2222
|
+
}
|
|
2223
|
+
async function runMultiselect(ctx) {
|
|
2224
|
+
const choices = ctx.candidateScopes.map((name) => ({ label: name, value: name }));
|
|
2225
|
+
const draftScopes = ctx.draft.scope ?? [];
|
|
2226
|
+
const initialIndices = ctx.candidateScopes.map((name, index) => (draftScopes.includes(name) ? index : -1)).filter((index) => index >= 0);
|
|
2227
|
+
const outcome = await multiselect({
|
|
2228
|
+
message: 'Select the scopes of change:',
|
|
2229
|
+
choices,
|
|
2230
|
+
searchable: true,
|
|
2231
|
+
...(initialIndices.length > 0 && { initial: initialIndices }),
|
|
2232
|
+
...(ctx.config.scopeOptional ? { min: 0 } : { min: 1 }),
|
|
2233
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
2234
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
2235
|
+
});
|
|
2236
|
+
if (outcome.result === PromptResult.Cancelled) {
|
|
2237
|
+
return cancelled();
|
|
2238
|
+
}
|
|
2239
|
+
ctx.draft = { ...ctx.draft, scope: outcome.value };
|
|
2240
|
+
return done();
|
|
2241
|
+
}
|
|
2242
|
+
function resolveInitialIndex(candidates, draftScope, defaultScope) {
|
|
2243
|
+
const firstDraftScope = draftScope?.[0];
|
|
2244
|
+
if (firstDraftScope !== undefined) {
|
|
2245
|
+
const index = candidates.indexOf(firstDraftScope);
|
|
2246
|
+
if (index >= 0)
|
|
2247
|
+
return index;
|
|
2248
|
+
}
|
|
2249
|
+
if (defaultScope !== undefined) {
|
|
2250
|
+
const index = candidates.indexOf(defaultScope);
|
|
2251
|
+
if (index >= 0)
|
|
2252
|
+
return index;
|
|
2253
|
+
}
|
|
2254
|
+
return -1;
|
|
2255
|
+
}
|
|
2256
|
+
|
|
2257
|
+
function countHeaderLength(draft, subject) {
|
|
2258
|
+
return formatHeader({ ...draft, subject }).length;
|
|
2259
|
+
}
|
|
2260
|
+
|
|
2261
|
+
const subjectStep = {
|
|
2262
|
+
id: 'subject',
|
|
2263
|
+
async run(ctx) {
|
|
2264
|
+
const outcome = await text({
|
|
2265
|
+
message: renderSubjectMessage(ctx, ''),
|
|
2266
|
+
renderMessage: (value) => renderSubjectMessage(ctx, value),
|
|
2267
|
+
...(ctx.draft.subject && { initial: ctx.draft.subject }),
|
|
2268
|
+
validate: (value) => {
|
|
2269
|
+
const normalized = normalizeSubject(value);
|
|
2270
|
+
if (normalized === '')
|
|
2271
|
+
return 'Subject must not be empty';
|
|
2272
|
+
return undefined;
|
|
2273
|
+
},
|
|
2274
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
2275
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
2276
|
+
});
|
|
2277
|
+
if (outcome.result === PromptResult.Cancelled) {
|
|
2278
|
+
return cancelled();
|
|
2279
|
+
}
|
|
2280
|
+
ctx.draft = { ...ctx.draft, subject: normalizeSubject(outcome.value) };
|
|
2281
|
+
return done();
|
|
2282
|
+
},
|
|
2283
|
+
};
|
|
2284
|
+
function normalizeSubject(raw) {
|
|
2285
|
+
const trimmed = raw.trim();
|
|
2286
|
+
if (trimmed.endsWith('.'))
|
|
2287
|
+
return trimmed.slice(0, -1).trimEnd();
|
|
2288
|
+
return trimmed;
|
|
2289
|
+
}
|
|
2290
|
+
function renderSubjectMessage(ctx, subject) {
|
|
2291
|
+
const budget = ctx.config.headerMaxLength;
|
|
2292
|
+
if (budget === null)
|
|
2293
|
+
return 'Subject:';
|
|
2294
|
+
const used = countHeaderLength({ type: ctx.draft.type, scope: ctx.draft.scope }, subject);
|
|
2295
|
+
const remaining = budget - used;
|
|
2296
|
+
const countText = remaining < 0 ? `${-remaining} over ${budget}-char header` : `${remaining} chars left in ${budget}-char header`;
|
|
2297
|
+
return `Subject (${colorize(remaining, countText)}):`;
|
|
2298
|
+
}
|
|
2299
|
+
function colorize(remaining, text) {
|
|
2300
|
+
if (remaining < 0)
|
|
2301
|
+
return style.red(text);
|
|
2302
|
+
if (remaining <= 10)
|
|
2303
|
+
return style.yellow(text);
|
|
2304
|
+
return style.green(text);
|
|
2305
|
+
}
|
|
2306
|
+
|
|
2307
|
+
const typeStep = {
|
|
2308
|
+
id: 'type',
|
|
2309
|
+
async run(ctx) {
|
|
2310
|
+
const choices = ctx.config.types.map(typeToChoice);
|
|
2311
|
+
const initialIndex = ctx.draft.type ? choices.findIndex((choice) => choice.value === ctx.draft.type) : -1;
|
|
2312
|
+
const outcome = await select({
|
|
2313
|
+
message: 'Select the type of change:',
|
|
2314
|
+
choices,
|
|
2315
|
+
searchable: true,
|
|
2316
|
+
...(initialIndex >= 0 && { initial: initialIndex }),
|
|
2317
|
+
...(ctx.config.input && { input: ctx.config.input }),
|
|
2318
|
+
...(ctx.config.output && { output: ctx.config.output }),
|
|
2319
|
+
});
|
|
2320
|
+
if (outcome.result === PromptResult.Cancelled) {
|
|
2321
|
+
return cancelled();
|
|
2322
|
+
}
|
|
2323
|
+
ctx.draft = { ...ctx.draft, type: outcome.value };
|
|
2324
|
+
return done();
|
|
2325
|
+
},
|
|
2326
|
+
};
|
|
2327
|
+
|
|
2328
|
+
const conventionalPreset$1 = index_cjs_js$2.freeze([
|
|
2329
|
+
resolveScopeStep,
|
|
2330
|
+
typeStep,
|
|
2331
|
+
scopeStep,
|
|
2332
|
+
subjectStep,
|
|
2333
|
+
bodyStep,
|
|
2334
|
+
breakingStep,
|
|
2335
|
+
issuesStep,
|
|
2336
|
+
previewStep,
|
|
2337
|
+
commitStep,
|
|
2338
|
+
]);
|
|
2339
|
+
|
|
2340
|
+
const CONVENTIONAL_TYPES = index_cjs_js$2.freeze([
|
|
2341
|
+
'feat',
|
|
2342
|
+
'fix',
|
|
2343
|
+
'docs',
|
|
2344
|
+
'style',
|
|
2345
|
+
'refactor',
|
|
2346
|
+
'perf',
|
|
2347
|
+
'test',
|
|
2348
|
+
'build',
|
|
2349
|
+
'ci',
|
|
2350
|
+
'chore',
|
|
2351
|
+
'revert',
|
|
2352
|
+
]);
|
|
2353
|
+
const conventionalPreset = index_cjs_js$2.freeze({
|
|
2354
|
+
'type-enum': ['error', { types: CONVENTIONAL_TYPES }],
|
|
2355
|
+
'subject-empty': ['error'],
|
|
2356
|
+
'scope-enum': ['off'],
|
|
2357
|
+
'subject-case': ['off'],
|
|
2358
|
+
'header-max-length': ['warn', { maxLength: 72 }],
|
|
2359
|
+
'imperative-mood': ['warn'],
|
|
2360
|
+
});
|
|
2361
|
+
|
|
2362
|
+
const TYPE_DESCRIPTIONS = {
|
|
2363
|
+
feat: 'A new feature',
|
|
2364
|
+
fix: 'A bug fix',
|
|
2365
|
+
docs: 'Documentation only changes',
|
|
2366
|
+
style: 'Changes that do not affect meaning (white-space, formatting, etc.)',
|
|
2367
|
+
refactor: 'A code change that neither fixes a bug nor adds a feature',
|
|
2368
|
+
perf: 'A code change that improves performance',
|
|
2369
|
+
test: 'Adding missing tests or correcting existing tests',
|
|
2370
|
+
build: 'Changes that affect the build system or external dependencies',
|
|
2371
|
+
ci: 'Changes to our CI configuration files and scripts',
|
|
2372
|
+
chore: 'Other changes that do not modify src or test files',
|
|
2373
|
+
revert: 'Reverts a previous commit',
|
|
2374
|
+
};
|
|
2375
|
+
const DEFAULT_SESSION_TYPES = index_cjs_js$2.freeze(CONVENTIONAL_TYPES.map((name) => ({ name, description: describeType(name) })));
|
|
2376
|
+
function describeType(name) {
|
|
2377
|
+
return TYPE_DESCRIPTIONS[name] ?? '';
|
|
2378
|
+
}
|
|
2379
|
+
|
|
2380
|
+
function scopeMatcher(scopes) {
|
|
2381
|
+
const normalizedScopes = index_cjs_js$5.createSet(scopes.map((s) => s.toLowerCase()));
|
|
2382
|
+
return (ctx) => {
|
|
2383
|
+
if (ctx.scope.length === 0)
|
|
2384
|
+
return false;
|
|
2385
|
+
return ctx.scope.some((s) => normalizedScopes.has(s.toLowerCase()));
|
|
2386
|
+
};
|
|
2387
|
+
}
|
|
2388
|
+
function scopePrefixMatcher(prefixes) {
|
|
2389
|
+
const normalizedPrefixes = prefixes.map((p) => p.toLowerCase());
|
|
2390
|
+
return (ctx) => {
|
|
2391
|
+
if (ctx.scope.length === 0)
|
|
2392
|
+
return false;
|
|
2393
|
+
return ctx.scope.some((s) => {
|
|
2394
|
+
const normalized = s.toLowerCase();
|
|
2395
|
+
return normalizedPrefixes.some((prefix) => normalized.startsWith(prefix));
|
|
2396
|
+
});
|
|
2397
|
+
};
|
|
2398
|
+
}
|
|
2399
|
+
function anyOf(...matchers) {
|
|
2400
|
+
return (ctx) => matchers.some((matcher) => matcher(ctx));
|
|
2401
|
+
}
|
|
2402
|
+
const CI_SCOPE_MATCHER = scopeMatcher(['ci', 'cd', 'build', 'pipeline', 'workflow', 'actions']);
|
|
2403
|
+
const TOOLING_SCOPE_MATCHER = scopeMatcher(['tooling', 'workspace', 'monorepo', 'nx', 'root']);
|
|
2404
|
+
const TOOL_PREFIX_MATCHER = scopePrefixMatcher(['tool-']);
|
|
2405
|
+
const DEFAULT_INFRA_SCOPE_MATCHER = anyOf(CI_SCOPE_MATCHER, TOOLING_SCOPE_MATCHER, TOOL_PREFIX_MATCHER);
|
|
2406
|
+
|
|
2407
|
+
exports.BUILT_IN_RULES = BUILT_IN_RULES;
|
|
2408
|
+
exports.CI_SCOPE_MATCHER = CI_SCOPE_MATCHER;
|
|
2409
|
+
exports.CONVENTIONAL_TYPES = CONVENTIONAL_TYPES;
|
|
2410
|
+
exports.DEFAULT_IMPERATIVE_WORDLIST = DEFAULT_IMPERATIVE_WORDLIST;
|
|
2411
|
+
exports.DEFAULT_INFRA_SCOPE_MATCHER = DEFAULT_INFRA_SCOPE_MATCHER;
|
|
2412
|
+
exports.DEFAULT_SESSION_TYPES = DEFAULT_SESSION_TYPES;
|
|
2413
|
+
exports.EMPTY_STAGING_MESSAGE = EMPTY_STAGING_MESSAGE;
|
|
2414
|
+
exports.NO_SCOPE_CANDIDATES_MESSAGE = NO_SCOPE_CANDIDATES_MESSAGE;
|
|
2415
|
+
exports.PREVIEW_RESTART_STEP_ID = PREVIEW_RESTART_STEP_ID;
|
|
2416
|
+
exports.SessionStatusValues = SessionStatus;
|
|
2417
|
+
exports.StepStatusValues = StepStatus;
|
|
2418
|
+
exports.TOOLING_SCOPE_MATCHER = TOOLING_SCOPE_MATCHER;
|
|
2419
|
+
exports.TOOL_PREFIX_MATCHER = TOOL_PREFIX_MATCHER;
|
|
2420
|
+
exports.anyOf = anyOf;
|
|
2421
|
+
exports.bodyStep = bodyStep;
|
|
2422
|
+
exports.breakingStep = breakingStep;
|
|
2423
|
+
exports.cancelled = cancelled;
|
|
2424
|
+
exports.commitStep = commitStep;
|
|
2425
|
+
exports.conventionalPreset = conventionalPreset;
|
|
2426
|
+
exports.conventionalStepPreset = conventionalPreset$1;
|
|
2427
|
+
exports.countHeaderLength = countHeaderLength;
|
|
2428
|
+
exports.defaultScope = defaultScope;
|
|
2429
|
+
exports.discoverScopes = discoverScopes;
|
|
2430
|
+
exports.done = done;
|
|
2431
|
+
exports.formatCommitMessage = formatCommitMessage;
|
|
2432
|
+
exports.formatHeader = formatHeader;
|
|
2433
|
+
exports.goto = goto;
|
|
2434
|
+
exports.headerMaxLengthRule = headerMaxLengthRule;
|
|
2435
|
+
exports.imperativeMoodRule = imperativeMoodRule;
|
|
2436
|
+
exports.isBreakingFooterKey = isBreakingFooterKey;
|
|
2437
|
+
exports.issuesStep = issuesStep;
|
|
2438
|
+
exports.normalizeSubject = normalizeSubject;
|
|
2439
|
+
exports.parseBody = parseBody;
|
|
2440
|
+
exports.parseConventionalCommit = parseConventionalCommit;
|
|
2441
|
+
exports.parseFooters = parseFooters;
|
|
2442
|
+
exports.parseHeader = parseHeader;
|
|
2443
|
+
exports.parseReferences = parseReferences;
|
|
2444
|
+
exports.previewStep = previewStep;
|
|
2445
|
+
exports.resolveScopeStep = resolveScopeStep;
|
|
2446
|
+
exports.scopeEnumRule = scopeEnumRule;
|
|
2447
|
+
exports.scopeMatcher = scopeMatcher;
|
|
2448
|
+
exports.scopePrefixMatcher = scopePrefixMatcher;
|
|
2449
|
+
exports.scopeStep = scopeStep;
|
|
2450
|
+
exports.subjectCaseRule = subjectCaseRule;
|
|
2451
|
+
exports.subjectEmptyRule = subjectEmptyRule;
|
|
2452
|
+
exports.subjectStep = subjectStep;
|
|
2453
|
+
exports.typeEnumRule = typeEnumRule;
|
|
2454
|
+
exports.typeStep = typeStep;
|
|
2455
|
+
exports.typeToChoice = typeToChoice;
|
|
2456
|
+
exports.validateCommit = validateCommit;
|
|
2457
|
+
exports.validateCommitWithRules = validateCommitWithRules;
|