@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,766 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { createMap } from '../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/map/index.esm.js';
|
|
3
|
+
import { createSet } from '../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/set/index.esm.js';
|
|
4
|
+
import { readFileContent, readDirectory, join, exists, ensureDir, writeFileContent, relativePath } from '../../_dependencies/@hyperfrontend/project-scope/core/index.esm.js';
|
|
5
|
+
import { from } from '../../_dependencies/@hyperfrontend/immutable-api-utils/built-in-copy/array/index.esm.js';
|
|
6
|
+
import { logger } from '../../_dependencies/@hyperfrontend/logging/index.esm.js';
|
|
7
|
+
import { entryDirOf } from '../../_shared/bundle/fs/entry-dir/index.esm.js';
|
|
8
|
+
import { parseChunk, getRequireSpecifier } from '../../_shared/bundle/dependencies/prune/ast-utils/index.esm.js';
|
|
9
|
+
|
|
10
|
+
/** Per-format output chunk file name, mirroring the bundler's entry naming. */
|
|
11
|
+
const CHUNK_FILE = { esm: 'index.esm.js', cjs: 'index.cjs.js' };
|
|
12
|
+
/**
|
|
13
|
+
* Strips rollup's `$N` collision-rename suffix from a local name, yielding the
|
|
14
|
+
* canonical source symbol name.
|
|
15
|
+
*
|
|
16
|
+
* @param name - A local identifier from an emitted bundle.
|
|
17
|
+
* @returns The base name with any trailing `$digits` removed.
|
|
18
|
+
*
|
|
19
|
+
* @example Undoing a collision rename
|
|
20
|
+
* ```typescript
|
|
21
|
+
* baseName('Store$1') // => 'Store'
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
const baseName = (name) => name.replace(/\$\d+$/, '');
|
|
25
|
+
/**
|
|
26
|
+
* Computes a rename-insensitive identity key for a top-level statement.
|
|
27
|
+
*
|
|
28
|
+
* Two copies of the same source that differ only in rollup's per-entry `$N`
|
|
29
|
+
* collision suffixes compare equal, while genuinely different code never
|
|
30
|
+
* collides: `$N` is stripped from identifier nodes only, so string literals,
|
|
31
|
+
* comments, numeric tokens, and discriminating member names stay intact.
|
|
32
|
+
*
|
|
33
|
+
* @param statement - The top-level statement to fingerprint.
|
|
34
|
+
* @param sourceFile - The source file the statement belongs to.
|
|
35
|
+
* @returns The statement's text with `$N` stripped from every identifier node.
|
|
36
|
+
*
|
|
37
|
+
* @example Stripping a dep-namespace local's collision suffix
|
|
38
|
+
* ```typescript
|
|
39
|
+
* fingerprintOf(statement, sourceFile) // 'const x = index_cjs_js.getType();' for both `$1` and `$2` copies
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
const fingerprintOf = (statement, sourceFile) => {
|
|
43
|
+
const start = statement.getStart(sourceFile);
|
|
44
|
+
const text = statement.getText(sourceFile);
|
|
45
|
+
const edits = [];
|
|
46
|
+
const visit = (node) => {
|
|
47
|
+
if (ts.isIdentifier(node)) {
|
|
48
|
+
const base = baseName(node.text);
|
|
49
|
+
if (base !== node.text)
|
|
50
|
+
edits.push([node.getStart(sourceFile) - start, node.getEnd() - start, base]);
|
|
51
|
+
}
|
|
52
|
+
ts.forEachChild(node, visit);
|
|
53
|
+
};
|
|
54
|
+
visit(statement);
|
|
55
|
+
let out = text;
|
|
56
|
+
for (const [s, e, replacement] of edits.sort((a, b) => b[0] - a[0]))
|
|
57
|
+
out = `${out.slice(0, s)}${replacement}${out.slice(e)}`;
|
|
58
|
+
return out;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Resolves a hoisted module's chunk file name for a format.
|
|
62
|
+
*
|
|
63
|
+
* @param format - Output module format.
|
|
64
|
+
* @returns The per-entry chunk file name (`index.esm.js` / `index.cjs.js`).
|
|
65
|
+
*
|
|
66
|
+
* @example Naming the CJS chunk
|
|
67
|
+
* ```typescript
|
|
68
|
+
* chunkFileName('cjs') // => 'index.cjs.js'
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
const chunkFileName = (format) => CHUNK_FILE[format];
|
|
72
|
+
/**
|
|
73
|
+
* Computes the `_shared/` directory (relative to the output root) that holds a
|
|
74
|
+
* module's hoisted chunk.
|
|
75
|
+
*
|
|
76
|
+
* @param moduleKey - The owning module's key.
|
|
77
|
+
* @returns The forward-slashed `_shared/<moduleKey>` directory.
|
|
78
|
+
*
|
|
79
|
+
* @example Locating a module's shared directory
|
|
80
|
+
* ```typescript
|
|
81
|
+
* sharedDirFor('events/events') // => '_shared/events/events'
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
const sharedDirFor = (moduleKey) => `_shared/${moduleKey}`;
|
|
85
|
+
const isExported = (statement) => ts.canHaveModifiers(statement) && (ts.getModifiers(statement) ?? []).some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword);
|
|
86
|
+
const declaredNames = (statement) => {
|
|
87
|
+
if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement) || ts.isEnumDeclaration(statement)) && statement.name)
|
|
88
|
+
return [statement.name.text];
|
|
89
|
+
if (!ts.isVariableStatement(statement))
|
|
90
|
+
return [];
|
|
91
|
+
const names = [];
|
|
92
|
+
for (const decl of statement.declarationList.declarations)
|
|
93
|
+
if (ts.isIdentifier(decl.name))
|
|
94
|
+
names.push(decl.name.text);
|
|
95
|
+
return names;
|
|
96
|
+
};
|
|
97
|
+
const requireSpecifierOf = (initializer) => {
|
|
98
|
+
if (initializer === undefined)
|
|
99
|
+
return null;
|
|
100
|
+
if (ts.isPropertyAccessExpression(initializer))
|
|
101
|
+
return getRequireSpecifier(initializer.expression);
|
|
102
|
+
return getRequireSpecifier(initializer);
|
|
103
|
+
};
|
|
104
|
+
const isRequireVarStatement = (statement) => ts.isVariableStatement(statement) &&
|
|
105
|
+
statement.declarationList.declarations.length > 0 &&
|
|
106
|
+
statement.declarationList.declarations.every((decl) => requireSpecifierOf(decl.initializer) !== null);
|
|
107
|
+
const collectCjsBindings = (statement, bindings) => {
|
|
108
|
+
for (const decl of statement.declarationList.declarations) {
|
|
109
|
+
const specifier = requireSpecifierOf(decl.initializer);
|
|
110
|
+
if (specifier === null)
|
|
111
|
+
continue;
|
|
112
|
+
if (ts.isIdentifier(decl.name)) {
|
|
113
|
+
// why: `var x = require('s').foo` binds a single named export; the bare `var ns = require('s')` binds the whole namespace.
|
|
114
|
+
const imported = decl.initializer && ts.isPropertyAccessExpression(decl.initializer) ? decl.initializer.name.text : undefined;
|
|
115
|
+
bindings.set(decl.name.text, imported ? { specifier, kind: 'cjs-named', imported } : { specifier, kind: 'cjs-namespace' });
|
|
116
|
+
}
|
|
117
|
+
else if (ts.isObjectBindingPattern(decl.name)) {
|
|
118
|
+
for (const element of decl.name.elements)
|
|
119
|
+
if (ts.isIdentifier(element.name))
|
|
120
|
+
bindings.set(element.name.text, { specifier, kind: 'cjs-named', imported: (element.propertyName ?? element.name).getText() });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const collectEsmBindings = (statement, bindings) => {
|
|
125
|
+
const specifier = statement.moduleSpecifier.text;
|
|
126
|
+
const clause = statement.importClause;
|
|
127
|
+
if (!clause)
|
|
128
|
+
return;
|
|
129
|
+
if (clause.name)
|
|
130
|
+
bindings.set(clause.name.text, { specifier, kind: 'default' });
|
|
131
|
+
if (!clause.namedBindings)
|
|
132
|
+
return;
|
|
133
|
+
if (ts.isNamespaceImport(clause.namedBindings)) {
|
|
134
|
+
bindings.set(clause.namedBindings.name.text, { specifier, kind: 'namespace' });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
for (const element of clause.namedBindings.elements)
|
|
138
|
+
bindings.set(element.name.text, { specifier, kind: 'named', imported: (element.propertyName ?? element.name).text });
|
|
139
|
+
};
|
|
140
|
+
const isUseStrict = (statement) => ts.isExpressionStatement(statement) && ts.isStringLiteral(statement.expression) && statement.expression.text === 'use strict';
|
|
141
|
+
const isHeaderStatement = (statement, format) => isUseStrict(statement) || (format === 'esm' ? ts.isImportDeclaration(statement) : isRequireVarStatement(statement));
|
|
142
|
+
const isExportSurface = (statement, format) => {
|
|
143
|
+
if (format === 'esm')
|
|
144
|
+
return ts.isExportDeclaration(statement) && !statement.moduleSpecifier;
|
|
145
|
+
// why: CJS export surface is a chain of `exports.x = y` assignment statements emitted at the bundle tail.
|
|
146
|
+
if (!ts.isExpressionStatement(statement) || !ts.isBinaryExpression(statement.expression))
|
|
147
|
+
return false;
|
|
148
|
+
const { left, operatorToken } = statement.expression;
|
|
149
|
+
return (operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
150
|
+
ts.isPropertyAccessExpression(left) &&
|
|
151
|
+
ts.isIdentifier(left.expression) &&
|
|
152
|
+
left.expression.text === 'exports');
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Parses one entry bundle into the structural model the hoist pass consumes.
|
|
156
|
+
*
|
|
157
|
+
* Classifies every top-level statement as an import binding, a removable
|
|
158
|
+
* runtime declaration, the export surface, or an opaque bare statement. Inline
|
|
159
|
+
* `export`-modified declarations are treated as part of the export surface
|
|
160
|
+
* (never removable), so the bundle's published API is never disturbed.
|
|
161
|
+
*
|
|
162
|
+
* @param source - Raw entry bundle source text.
|
|
163
|
+
* @param format - Module format selecting ESM vs CJS import/export shapes.
|
|
164
|
+
* @returns The parsed entry model.
|
|
165
|
+
*
|
|
166
|
+
* @example Modeling an ESM entry bundle
|
|
167
|
+
* ```typescript
|
|
168
|
+
* const parsed = parseEntry("import { x } from './_dependencies/a/index.esm.js'\nclass C {}", 'esm')
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
const parseEntry = (source, format) => {
|
|
172
|
+
const sourceFile = parseChunk(source);
|
|
173
|
+
const decls = [];
|
|
174
|
+
const importBindings = createMap();
|
|
175
|
+
const bareStatements = [];
|
|
176
|
+
const declNames = createSet([]);
|
|
177
|
+
let headerEnd = 0;
|
|
178
|
+
let inHeader = true;
|
|
179
|
+
for (const statement of sourceFile.statements) {
|
|
180
|
+
if (inHeader && isHeaderStatement(statement, format))
|
|
181
|
+
headerEnd = statement.getEnd();
|
|
182
|
+
else
|
|
183
|
+
inHeader = false;
|
|
184
|
+
if (format === 'esm' && ts.isImportDeclaration(statement)) {
|
|
185
|
+
collectEsmBindings(statement, importBindings);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (format === 'cjs' && isRequireVarStatement(statement)) {
|
|
189
|
+
collectCjsBindings(statement, importBindings);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (isUseStrict(statement) || isExportSurface(statement, format))
|
|
193
|
+
continue;
|
|
194
|
+
const names = isExported(statement) ? [] : declaredNames(statement);
|
|
195
|
+
for (const name of names)
|
|
196
|
+
declNames.add(name);
|
|
197
|
+
// why: only a single-name, non-exported declaration can be cleanly lifted; multi-declarator and inline-exported statements stay put (and may entangle their module out of the plan).
|
|
198
|
+
if (names.length !== 1) {
|
|
199
|
+
bareStatements.push(statement);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
decls.push({
|
|
203
|
+
base: baseName(names[0]),
|
|
204
|
+
localName: names[0],
|
|
205
|
+
statement,
|
|
206
|
+
text: statement.getText(sourceFile),
|
|
207
|
+
fingerprint: fingerprintOf(statement, sourceFile),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return { sourceFile, decls, importBindings, bareStatements, declNames, headerEnd };
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Groups an entry's attributable declarations by their owning module.
|
|
214
|
+
*
|
|
215
|
+
* Declarations whose base name is unowned (a dependency or unexported helper
|
|
216
|
+
* inlined into the bundle) are skipped, leaving them in place.
|
|
217
|
+
*
|
|
218
|
+
* @param parsed - A parsed entry bundle.
|
|
219
|
+
* @param owners - The first-party ownership index.
|
|
220
|
+
* @returns Map from module key to that module's declarations in source order.
|
|
221
|
+
*
|
|
222
|
+
* @example Attributing an entry's declarations
|
|
223
|
+
* ```typescript
|
|
224
|
+
* const byModule = attribute(parseEntry(source, 'esm'), owners)
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
const attribute = (parsed, owners) => {
|
|
228
|
+
const byModule = createMap();
|
|
229
|
+
for (const decl of parsed.decls) {
|
|
230
|
+
const moduleKey = owners.ownerOf.get(decl.base);
|
|
231
|
+
if (moduleKey === undefined)
|
|
232
|
+
continue;
|
|
233
|
+
const group = byModule.get(moduleKey) ?? [];
|
|
234
|
+
group.push(decl);
|
|
235
|
+
byModule.set(moduleKey, group);
|
|
236
|
+
}
|
|
237
|
+
return byModule;
|
|
238
|
+
};
|
|
239
|
+
const toModuleKey = (srcRoot, file) => file
|
|
240
|
+
.slice(srcRoot.length + 1)
|
|
241
|
+
.replace(/\.ts$/, '')
|
|
242
|
+
.split(/[\\/]/)
|
|
243
|
+
.join('/');
|
|
244
|
+
// why: private top-level helpers (e.g. a reducer's `handlers` map) are inlined alongside the exported symbols that use them; attributing them too lets the whole module hoist instead of bailing on the "unresolved" private reference. Collisions across modules are dropped as ambiguous by indexOwners, preserving safety.
|
|
245
|
+
const ownersFromSource = (source) => {
|
|
246
|
+
const sourceFile = ts.createSourceFile('module.ts', source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
247
|
+
const names = [];
|
|
248
|
+
for (const statement of sourceFile.statements)
|
|
249
|
+
names.push(...declaredNames(statement));
|
|
250
|
+
return names;
|
|
251
|
+
};
|
|
252
|
+
const walkTsFiles = (dir, acc) => {
|
|
253
|
+
for (const entry of readDirectory(dir)) {
|
|
254
|
+
if (entry.isDirectory)
|
|
255
|
+
walkTsFiles(entry.path, acc);
|
|
256
|
+
else if (entry.name.endsWith('.ts') && !entry.name.endsWith('.d.ts') && !entry.name.endsWith('.spec.ts'))
|
|
257
|
+
acc.push(entry.path);
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
/**
|
|
261
|
+
* Builds the first-party ownership index by scanning `<srcRoot>/**` for the
|
|
262
|
+
* runtime symbols each module exports.
|
|
263
|
+
*
|
|
264
|
+
* Both exported and private top-level runtime declarations are indexed, so a
|
|
265
|
+
* module's private helpers hoist alongside the exports that use them. Types-only
|
|
266
|
+
* modules declare no runtime symbols and contribute nothing. A name declared by
|
|
267
|
+
* two different modules is ambiguous and dropped from the index, so the pass can
|
|
268
|
+
* never misattribute it.
|
|
269
|
+
*
|
|
270
|
+
* @param srcRoot - Absolute path to the project's `src/` directory.
|
|
271
|
+
* @returns The ownership index.
|
|
272
|
+
*
|
|
273
|
+
* @example Indexing a library's source tree
|
|
274
|
+
* ```typescript
|
|
275
|
+
* const owners = indexOwners('/abs/libs/foo/src')
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
const indexOwners = (srcRoot) => {
|
|
279
|
+
const files = [];
|
|
280
|
+
walkTsFiles(srcRoot, files);
|
|
281
|
+
const firstOwner = createMap();
|
|
282
|
+
const ambiguous = createSet([]);
|
|
283
|
+
const ownerOf = createMap();
|
|
284
|
+
for (const file of files) {
|
|
285
|
+
const moduleKey = toModuleKey(srcRoot, file);
|
|
286
|
+
for (const name of ownersFromSource(readFileContent(file))) {
|
|
287
|
+
if (ambiguous.has(name))
|
|
288
|
+
continue;
|
|
289
|
+
const prior = firstOwner.get(name);
|
|
290
|
+
if (prior !== undefined && prior !== moduleKey) {
|
|
291
|
+
ambiguous.add(name);
|
|
292
|
+
ownerOf.delete(name);
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
firstOwner.set(name, moduleKey);
|
|
296
|
+
ownerOf.set(name, moduleKey);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return { ownerOf };
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
createSet([
|
|
303
|
+
ts.SyntaxKind.CallExpression,
|
|
304
|
+
ts.SyntaxKind.NewExpression,
|
|
305
|
+
ts.SyntaxKind.AwaitExpression,
|
|
306
|
+
ts.SyntaxKind.YieldExpression,
|
|
307
|
+
ts.SyntaxKind.TaggedTemplateExpression,
|
|
308
|
+
]);
|
|
309
|
+
/**
|
|
310
|
+
* Globals whose call observably only mutates-then-returns its (fresh-literal)
|
|
311
|
+
* argument and is therefore side-effect-free — `freeze`/`seal`/`preventExtensions`
|
|
312
|
+
* all behave this way on a freshly-built object/array literal.
|
|
313
|
+
*/
|
|
314
|
+
createSet(['Object.freeze', 'Object.seal', 'Object.preventExtensions']);
|
|
315
|
+
/**
|
|
316
|
+
* Collects the identifier names referenced within a node, excluding identifiers
|
|
317
|
+
* that sit in a property-name position (`obj.name`, `{ name: … }`, `{ name: x }`
|
|
318
|
+
* binding keys) since those never refer to a top-level declaration.
|
|
319
|
+
*
|
|
320
|
+
* Deliberately over-approximates: a name captured that is not actually a
|
|
321
|
+
* top-level declaration is harmless, and capturing more only keeps more code.
|
|
322
|
+
*
|
|
323
|
+
* @param node - The subtree to scan.
|
|
324
|
+
* @param sink - Set that receives every referenced identifier name.
|
|
325
|
+
*
|
|
326
|
+
* @example Collecting references inside a function body
|
|
327
|
+
* ```typescript
|
|
328
|
+
* const refs = createSet<string>([])
|
|
329
|
+
* collectRefs(functionDeclaration, refs)
|
|
330
|
+
* ```
|
|
331
|
+
*/
|
|
332
|
+
const collectRefs = (node, sink) => {
|
|
333
|
+
const visit = (current) => {
|
|
334
|
+
if (ts.isIdentifier(current)) {
|
|
335
|
+
const parent = current.parent;
|
|
336
|
+
if (ts.isPropertyAccessExpression(parent) && parent.name === current)
|
|
337
|
+
return;
|
|
338
|
+
if (ts.isPropertyAssignment(parent) && parent.name === current)
|
|
339
|
+
return;
|
|
340
|
+
if (ts.isBindingElement(parent) && parent.propertyName === current)
|
|
341
|
+
return;
|
|
342
|
+
sink.add(current.text);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
ts.forEachChild(current, visit);
|
|
346
|
+
};
|
|
347
|
+
visit(node);
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Classifies every free identifier referenced by a module's declarations,
|
|
352
|
+
* partitioning them into cross-module edges, dependency edges, and hard
|
|
353
|
+
* blockers.
|
|
354
|
+
*
|
|
355
|
+
* Identifiers the module declares itself are intra-chunk and ignored. A name
|
|
356
|
+
* that is neither owned, nor a dependency binding, nor a top-level entry
|
|
357
|
+
* declaration is a runtime global and needs no import. Cross-module references
|
|
358
|
+
* are always safe to lift because {@link planHoists} only keeps an acyclic
|
|
359
|
+
* subset, so every dependency chunk is fully evaluated before its dependent.
|
|
360
|
+
*
|
|
361
|
+
* @param decls - The module's canonical declarations.
|
|
362
|
+
* @param owners - First-party ownership index.
|
|
363
|
+
* @param importBindings - The consuming entry's import bindings.
|
|
364
|
+
* @param entryDeclNames - Every top-level declaration name in the entry.
|
|
365
|
+
* @param selfModuleKey - The module being resolved.
|
|
366
|
+
* @returns The reference resolution.
|
|
367
|
+
*
|
|
368
|
+
* @example Resolving a module's references
|
|
369
|
+
* ```typescript
|
|
370
|
+
* const resolution = resolveModuleRefs(decls, owners, parsed.importBindings, parsed.declNames, 'events/events')
|
|
371
|
+
* ```
|
|
372
|
+
*/
|
|
373
|
+
const resolveModuleRefs = (decls, owners, importBindings, entryDeclNames, selfModuleKey) => {
|
|
374
|
+
const selfLocals = createSet(decls.map((decl) => decl.localName));
|
|
375
|
+
const allRefs = createSet([]);
|
|
376
|
+
for (const decl of decls)
|
|
377
|
+
collectRefs(decl.statement, allRefs);
|
|
378
|
+
const crossModule = [];
|
|
379
|
+
const depImports = [];
|
|
380
|
+
const unresolved = [];
|
|
381
|
+
for (const ref of allRefs) {
|
|
382
|
+
if (selfLocals.has(ref))
|
|
383
|
+
continue;
|
|
384
|
+
const base = baseName(ref);
|
|
385
|
+
const owner = owners.ownerOf.get(base);
|
|
386
|
+
if (owner !== undefined) {
|
|
387
|
+
if (owner !== selfModuleKey)
|
|
388
|
+
crossModule.push({ ref, base, moduleKey: owner });
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
const binding = importBindings.get(ref);
|
|
392
|
+
if (binding !== undefined) {
|
|
393
|
+
depImports.push({ ref, binding });
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
if (entryDeclNames.has(ref))
|
|
397
|
+
unresolved.push(ref);
|
|
398
|
+
}
|
|
399
|
+
return { crossModule, depImports, unresolved };
|
|
400
|
+
};
|
|
401
|
+
const namedBinding = (local, imported) => (imported === local ? local : `${imported} as ${local}`);
|
|
402
|
+
const cjsBinding$1 = (local, imported) => (imported === local ? local : `${imported}: ${local}`);
|
|
403
|
+
const groupBySpecifier = (items, specifierOf) => {
|
|
404
|
+
const groups = createMap();
|
|
405
|
+
for (const item of items) {
|
|
406
|
+
const group = groups.get(specifierOf(item)) ?? [];
|
|
407
|
+
group.push(item);
|
|
408
|
+
groups.set(specifierOf(item), group);
|
|
409
|
+
}
|
|
410
|
+
return from(groups.entries()).sort(([a], [b]) => (a < b ? -1 : 1));
|
|
411
|
+
};
|
|
412
|
+
const renderEsmImports = (crossImports, depImports) => {
|
|
413
|
+
const lines = [];
|
|
414
|
+
for (const [specifier, group] of groupBySpecifier(crossImports, (c) => c.specifier))
|
|
415
|
+
lines.push(`import { ${group.map((c) => namedBinding(c.ref, c.exported)).join(', ')} } from '${specifier}';`);
|
|
416
|
+
for (const dep of depImports.filter((d) => d.kind === 'namespace'))
|
|
417
|
+
lines.push(`import * as ${dep.ref} from '${dep.specifier}';`);
|
|
418
|
+
for (const dep of depImports.filter((d) => d.kind === 'default'))
|
|
419
|
+
lines.push(`import ${dep.ref} from '${dep.specifier}';`);
|
|
420
|
+
for (const [specifier, group] of groupBySpecifier(depImports.filter((d) => d.kind === 'named'), (d) => d.specifier))
|
|
421
|
+
lines.push(`import { ${group.map((d) => namedBinding(d.ref, d.imported ?? d.ref)).join(', ')} } from '${specifier}';`);
|
|
422
|
+
return lines;
|
|
423
|
+
};
|
|
424
|
+
const renderCjsRequires = (crossImports, depImports) => {
|
|
425
|
+
const lines = [];
|
|
426
|
+
for (const [specifier, group] of groupBySpecifier(crossImports, (c) => c.specifier))
|
|
427
|
+
lines.push(`const { ${group.map((c) => cjsBinding$1(c.ref, c.exported)).join(', ')} } = require('${specifier}');`);
|
|
428
|
+
for (const dep of depImports.filter((d) => d.kind === 'cjs-namespace'))
|
|
429
|
+
lines.push(`const ${dep.ref} = require('${dep.specifier}');`);
|
|
430
|
+
for (const [specifier, group] of groupBySpecifier(depImports.filter((d) => d.kind === 'cjs-named'), (d) => d.specifier))
|
|
431
|
+
lines.push(`const { ${group.map((d) => cjsBinding$1(d.ref, d.imported ?? d.ref)).join(', ')} } = require('${specifier}');`);
|
|
432
|
+
return lines;
|
|
433
|
+
};
|
|
434
|
+
const renderEsmExports = (decls) => `export { ${decls.map((decl) => (decl.localName === decl.base ? decl.base : `${decl.localName} as ${decl.base}`)).join(', ')} };`;
|
|
435
|
+
const renderCjsExports = (decls) => decls.map((decl) => `exports.${decl.base} = ${decl.localName};`).join('\n');
|
|
436
|
+
/**
|
|
437
|
+
* Renders a hoisted module chunk: its resolved imports, the union of its
|
|
438
|
+
* declarations, and an export surface naming each declaration by its base name.
|
|
439
|
+
*
|
|
440
|
+
* @param plan - The module's declarations plus resolved import edges.
|
|
441
|
+
* @param format - Output module format.
|
|
442
|
+
* @returns The chunk source text.
|
|
443
|
+
*
|
|
444
|
+
* @example Rendering an ESM chunk
|
|
445
|
+
* ```typescript
|
|
446
|
+
* const source = renderChunk({ decls, crossImports: [], depImports: [] }, 'esm')
|
|
447
|
+
* ```
|
|
448
|
+
*/
|
|
449
|
+
const renderChunk = (plan, format) => {
|
|
450
|
+
const body = plan.decls.map((decl) => decl.text).join('\n');
|
|
451
|
+
if (format === 'esm') {
|
|
452
|
+
const imports = renderEsmImports(plan.crossImports, plan.depImports);
|
|
453
|
+
const blocks = imports.length > 0 ? [imports.join('\n'), body, renderEsmExports(plan.decls)] : [body, renderEsmExports(plan.decls)];
|
|
454
|
+
return `${blocks.join('\n\n')}\n`;
|
|
455
|
+
}
|
|
456
|
+
const requires = renderCjsRequires(plan.crossImports, plan.depImports);
|
|
457
|
+
const blocks = requires.length > 0
|
|
458
|
+
? ["'use strict';", requires.join('\n'), body, renderCjsExports(plan.decls)]
|
|
459
|
+
: ["'use strict';", body, renderCjsExports(plan.decls)];
|
|
460
|
+
return `${blocks.join('\n\n')}\n`;
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
const invertOwners = (owners) => {
|
|
464
|
+
const byModule = createMap();
|
|
465
|
+
for (const [base, moduleKey] of owners.ownerOf) {
|
|
466
|
+
const names = byModule.get(moduleKey) ?? createSet([]);
|
|
467
|
+
names.add(base);
|
|
468
|
+
byModule.set(moduleKey, names);
|
|
469
|
+
}
|
|
470
|
+
return byModule;
|
|
471
|
+
};
|
|
472
|
+
const collectAppearances = (entries) => {
|
|
473
|
+
const appearances = createMap();
|
|
474
|
+
for (const [index, entry] of entries.entries())
|
|
475
|
+
for (const moduleKey of entry.byModule.keys()) {
|
|
476
|
+
const list = appearances.get(moduleKey) ?? [];
|
|
477
|
+
list.push(index);
|
|
478
|
+
appearances.set(moduleKey, list);
|
|
479
|
+
}
|
|
480
|
+
return appearances;
|
|
481
|
+
};
|
|
482
|
+
// why: a bare statement (multi-declarator var, enum IIFE, side-effecting init) that names one of the module's symbols cannot be cleanly split out — its symbol would vanish from the chunk; leave the whole module inlined.
|
|
483
|
+
const isEntangled = (entries, indexes, ownedNames) => indexes.some((index) => entries[index].parsed.bareStatements.some((statement) => {
|
|
484
|
+
const refs = createSet([]);
|
|
485
|
+
collectRefs(statement, refs);
|
|
486
|
+
return from(refs).some((ref) => ownedNames.has(baseName(ref)));
|
|
487
|
+
}));
|
|
488
|
+
const pickCanonical = (entries, moduleKey, indexes) => indexes.reduce((best, index) => (entries[index].byModule.get(moduleKey) ?? []).length > (entries[best].byModule.get(moduleKey) ?? []).length ? index : best);
|
|
489
|
+
const isConsistentCopy = (canonicalFingerprint, order, decls) => {
|
|
490
|
+
let previous = -1;
|
|
491
|
+
for (const decl of decls) {
|
|
492
|
+
const index = order.get(decl.base);
|
|
493
|
+
// why: a copy that names a declaration absent from the canonical superset, reorders it, or differs structurally (rename-insensitive fingerprint) is not provably the same code.
|
|
494
|
+
if (index === undefined || index <= previous || canonicalFingerprint.get(decl.base) !== decl.fingerprint)
|
|
495
|
+
return false;
|
|
496
|
+
previous = index;
|
|
497
|
+
}
|
|
498
|
+
return true;
|
|
499
|
+
};
|
|
500
|
+
const planCandidate = (entries, owners, moduleKey, indexes, ownedNames) => {
|
|
501
|
+
if (isEntangled(entries, indexes, ownedNames))
|
|
502
|
+
return null;
|
|
503
|
+
const canonicalEntryIndex = pickCanonical(entries, moduleKey, indexes);
|
|
504
|
+
const canonicalDecls = entries[canonicalEntryIndex].byModule.get(moduleKey) ?? [];
|
|
505
|
+
// why: identity gates on the rename-insensitive fingerprint, but chunk rendering still uses each decl's raw `text` via canonicalDecls.
|
|
506
|
+
const canonicalFingerprint = createMap();
|
|
507
|
+
const order = createMap();
|
|
508
|
+
for (const [index, decl] of canonicalDecls.entries()) {
|
|
509
|
+
canonicalFingerprint.set(decl.base, decl.fingerprint);
|
|
510
|
+
order.set(decl.base, index);
|
|
511
|
+
}
|
|
512
|
+
for (const index of indexes)
|
|
513
|
+
if (!isConsistentCopy(canonicalFingerprint, order, entries[index].byModule.get(moduleKey) ?? []))
|
|
514
|
+
return null;
|
|
515
|
+
const canonical = entries[canonicalEntryIndex].parsed;
|
|
516
|
+
const resolution = resolveModuleRefs(canonicalDecls, owners, canonical.importBindings, canonical.declNames, moduleKey);
|
|
517
|
+
if (resolution.unresolved.length > 0)
|
|
518
|
+
return null;
|
|
519
|
+
return { canonicalEntryIndex, decls: canonicalDecls, resolution, consumingEntryIndexes: indexes };
|
|
520
|
+
};
|
|
521
|
+
const closeOverDependencies = (candidates) => {
|
|
522
|
+
let changed = true;
|
|
523
|
+
while (changed) {
|
|
524
|
+
changed = false;
|
|
525
|
+
for (const [moduleKey, planned] of candidates)
|
|
526
|
+
if (planned.resolution.crossModule.some((ref) => !candidates.has(ref.moduleKey))) {
|
|
527
|
+
candidates.delete(moduleKey);
|
|
528
|
+
changed = true;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return candidates;
|
|
532
|
+
};
|
|
533
|
+
// why: shared chunks load topologically, so an acyclic dependency graph guarantees every chunk is fully evaluated before its dependents — no cross-chunk temporal-dead-zone. Modules in (or feeding) a cycle cannot be ordered safely, so they are peeled off and left inlined.
|
|
534
|
+
const keepAcyclic = (candidates) => {
|
|
535
|
+
const depsOf = createMap();
|
|
536
|
+
for (const [moduleKey, planned] of candidates)
|
|
537
|
+
depsOf.set(moduleKey, planned.resolution.crossModule.map((ref) => ref.moduleKey));
|
|
538
|
+
const pending = createSet(candidates.keys());
|
|
539
|
+
let changed = true;
|
|
540
|
+
while (changed) {
|
|
541
|
+
changed = false;
|
|
542
|
+
for (const [moduleKey, deps] of depsOf)
|
|
543
|
+
if (pending.has(moduleKey) && deps.every((dep) => !pending.has(dep))) {
|
|
544
|
+
pending.delete(moduleKey);
|
|
545
|
+
changed = true;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
for (const moduleKey of pending)
|
|
549
|
+
candidates.delete(moduleKey);
|
|
550
|
+
return candidates;
|
|
551
|
+
};
|
|
552
|
+
/**
|
|
553
|
+
* Plans which first-party modules can be hoisted into shared chunks.
|
|
554
|
+
*
|
|
555
|
+
* A module qualifies only when it is inlined into at least two entries, is not
|
|
556
|
+
* entangled with a bare statement, presents structurally identical declarations
|
|
557
|
+
* (rename-insensitive) in a consistent order across every copy, references
|
|
558
|
+
* nothing unresolvable, and —
|
|
559
|
+
* after closure and acyclic peeling — depends only on other hoisted modules
|
|
560
|
+
* through a cycle-free graph. Anything failing these is left inlined, so the
|
|
561
|
+
* worst case equals the unmodified output.
|
|
562
|
+
*
|
|
563
|
+
* @param entries - Parsed entries with their per-module attribution.
|
|
564
|
+
* @param owners - First-party ownership index.
|
|
565
|
+
* @returns Map from module key to its hoist plan.
|
|
566
|
+
*
|
|
567
|
+
* @example Planning hoists for a set of entries
|
|
568
|
+
* ```typescript
|
|
569
|
+
* const plan = planHoists(entries, owners)
|
|
570
|
+
* ```
|
|
571
|
+
*/
|
|
572
|
+
const planHoists = (entries, owners) => {
|
|
573
|
+
const ownedNames = invertOwners(owners);
|
|
574
|
+
const candidates = createMap();
|
|
575
|
+
for (const [moduleKey, indexes] of collectAppearances(entries)) {
|
|
576
|
+
if (indexes.length < 2)
|
|
577
|
+
continue;
|
|
578
|
+
const planned = planCandidate(entries, owners, moduleKey, indexes, ownedNames.get(moduleKey) ?? createSet([]));
|
|
579
|
+
if (planned)
|
|
580
|
+
candidates.set(moduleKey, planned);
|
|
581
|
+
}
|
|
582
|
+
return keepAcyclic(closeOverDependencies(candidates));
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
const esmBinding = (decl) => (decl.base === decl.localName ? decl.base : `${decl.base} as ${decl.localName}`);
|
|
586
|
+
const cjsBinding = (decl) => (decl.base === decl.localName ? decl.base : `${decl.base}: ${decl.localName}`);
|
|
587
|
+
const renderImport = (hoist, format) => format === 'esm'
|
|
588
|
+
? `import { ${hoist.decls.map(esmBinding).join(', ')} } from '${hoist.specifier}';`
|
|
589
|
+
: `const { ${hoist.decls.map(cjsBinding).join(', ')} } = require('${hoist.specifier}');`;
|
|
590
|
+
const applyEdits = (source, edits) => {
|
|
591
|
+
let code = source;
|
|
592
|
+
for (const edit of from(edits).sort((a, b) => b.start - a.start))
|
|
593
|
+
code = `${code.slice(0, edit.start)}${edit.text}${code.slice(edit.end)}`;
|
|
594
|
+
// why: splicing whole statements leaves runs of blank lines; collapse them so the trimmed entry stays readable.
|
|
595
|
+
return code.replace(/\n{3,}/g, '\n\n');
|
|
596
|
+
};
|
|
597
|
+
// why: liveness over-approximates — every identifier node (property names included) counts as a use, so trimming an import can only drop a name nothing references, never one that survives.
|
|
598
|
+
const collectIdentifierNames = (source) => {
|
|
599
|
+
const names = createSet([]);
|
|
600
|
+
const visit = (node) => {
|
|
601
|
+
if (ts.isIdentifier(node))
|
|
602
|
+
names.add(node.text);
|
|
603
|
+
ts.forEachChild(node, visit);
|
|
604
|
+
};
|
|
605
|
+
visit(parseChunk(source));
|
|
606
|
+
return names;
|
|
607
|
+
};
|
|
608
|
+
/**
|
|
609
|
+
* Rewrites an entry bundle to consume hoisted modules from `_shared/` chunks
|
|
610
|
+
* instead of inlining them.
|
|
611
|
+
*
|
|
612
|
+
* Splices every hoisted declaration (and its leading comments) out of the entry
|
|
613
|
+
* and prepends an import/`require` binding the chunk's base export to the
|
|
614
|
+
* entry's local name — aliasing when rollup renamed the local (`foo as foo$1`).
|
|
615
|
+
* Only the hoisted symbols the entry still references after splicing are
|
|
616
|
+
* re-imported: a private helper used solely by another hoisted export (e.g. a
|
|
617
|
+
* reducer's `handlers`, used only by the hoisted `rootReducer`) is seen as dead
|
|
618
|
+
* against the spliced body and omitted from the import, while the chunk it lives
|
|
619
|
+
* in keeps it. The bundle's export surface is left untouched: surviving spliced
|
|
620
|
+
* names are now supplied by the inserted imports, so the published API is
|
|
621
|
+
* byte-for-byte identical to before.
|
|
622
|
+
*
|
|
623
|
+
* @param parsed - The parsed entry bundle.
|
|
624
|
+
* @param hoists - The modules hoisted out of this entry, each with its chunk specifier.
|
|
625
|
+
* @param format - Output module format.
|
|
626
|
+
* @returns The rewritten entry source, or the original source when `hoists` is empty.
|
|
627
|
+
*
|
|
628
|
+
* @example Rewriting an entry to import a shared module
|
|
629
|
+
* ```typescript
|
|
630
|
+
* const rewritten = rewriteEntry(parseEntry(source, 'esm'), [{ decls, specifier: './_shared/state/index.esm.js' }], 'esm')
|
|
631
|
+
* ```
|
|
632
|
+
*/
|
|
633
|
+
const rewriteEntry = (parsed, hoists, format) => {
|
|
634
|
+
if (hoists.length === 0)
|
|
635
|
+
return parsed.sourceFile.text;
|
|
636
|
+
const deletions = [];
|
|
637
|
+
for (const hoist of hoists)
|
|
638
|
+
for (const decl of hoist.decls)
|
|
639
|
+
deletions.push({ start: decl.statement.getFullStart(), end: decl.statement.getEnd(), text: '' });
|
|
640
|
+
// why: liveness is measured on the body WITHOUT the hoisted decls (and before re-inserting imports), so a private symbol used only by another hoisted decl (e.g. `handlers`, used only by the hoisted `rootReducer`) is correctly seen as dead and never re-imported.
|
|
641
|
+
const spliced = applyEdits(parsed.sourceFile.text, deletions);
|
|
642
|
+
const live = collectIdentifierNames(spliced);
|
|
643
|
+
const liveHoists = hoists
|
|
644
|
+
.map((hoist) => ({ ...hoist, decls: hoist.decls.filter((decl) => live.has(decl.localName)) }))
|
|
645
|
+
.filter((hoist) => hoist.decls.length > 0);
|
|
646
|
+
if (liveHoists.length === 0)
|
|
647
|
+
return spliced;
|
|
648
|
+
const block = liveHoists.map((hoist) => renderImport(hoist, format)).join('\n');
|
|
649
|
+
const insertion = parsed.headerEnd > 0 ? `\n${block}` : `${block}\n`;
|
|
650
|
+
return applyEdits(parsed.sourceFile.text, [...deletions, { start: parsed.headerEnd, end: parsed.headerEnd, text: insertion }]);
|
|
651
|
+
};
|
|
652
|
+
|
|
653
|
+
const log = logger.channel('builder:bundle:dedupe');
|
|
654
|
+
const FORMATS = ['esm', 'cjs'];
|
|
655
|
+
const toSpecifier = (relative) => (relative.startsWith('.') ? relative : `./${relative}`);
|
|
656
|
+
const recomputeSpecifier = (specifier, fromDir, baseDir) =>
|
|
657
|
+
// why: relative `_dependencies`/`_shared` edges move with the chunk; bare and node-builtin specifiers resolve identically from anywhere, so they pass through verbatim.
|
|
658
|
+
specifier.startsWith('.') ? toSpecifier(relativePath(fromDir, join(baseDir, specifier))) : specifier;
|
|
659
|
+
const locateEntries = (context, format) => {
|
|
660
|
+
const locations = [];
|
|
661
|
+
for (const entry of context.entryPointDiscovery.entryPoints) {
|
|
662
|
+
const dir = entryDirOf(entry, context);
|
|
663
|
+
const file = join(dir, chunkFileName(format));
|
|
664
|
+
if (exists(file))
|
|
665
|
+
locations.push({ dir, file });
|
|
666
|
+
}
|
|
667
|
+
return locations;
|
|
668
|
+
};
|
|
669
|
+
const chunkFileFor = (context, moduleKey, format) => join(context.outputPath, sharedDirFor(moduleKey), chunkFileName(format));
|
|
670
|
+
const buildChunkPlan = (planned, context, chunkDir, canonicalDir, format) => {
|
|
671
|
+
const crossImports = planned.resolution.crossModule.map((ref) => ({
|
|
672
|
+
ref: ref.ref,
|
|
673
|
+
exported: ref.base,
|
|
674
|
+
specifier: toSpecifier(relativePath(chunkDir, chunkFileFor(context, ref.moduleKey, format))),
|
|
675
|
+
}));
|
|
676
|
+
const depImports = planned.resolution.depImports.map((dep) => ({
|
|
677
|
+
ref: dep.ref,
|
|
678
|
+
kind: dep.binding.kind,
|
|
679
|
+
imported: dep.binding.imported,
|
|
680
|
+
specifier: recomputeSpecifier(dep.binding.specifier, chunkDir, canonicalDir),
|
|
681
|
+
}));
|
|
682
|
+
return { decls: planned.decls, crossImports, depImports };
|
|
683
|
+
};
|
|
684
|
+
const writeChunks = (context, plan, locations, format, report) => {
|
|
685
|
+
for (const [moduleKey, planned] of plan) {
|
|
686
|
+
const chunkDir = join(context.outputPath, sharedDirFor(moduleKey));
|
|
687
|
+
const chunkPlan = buildChunkPlan(planned, context, chunkDir, locations[planned.canonicalEntryIndex].dir, format);
|
|
688
|
+
const source = renderChunk(chunkPlan, format);
|
|
689
|
+
ensureDir(chunkDir);
|
|
690
|
+
writeFileContent(chunkFileFor(context, moduleKey, format), source);
|
|
691
|
+
report.chunksWritten += 1;
|
|
692
|
+
report.bytesReclaimed -= Buffer.byteLength(source);
|
|
693
|
+
}
|
|
694
|
+
};
|
|
695
|
+
const rewriteEntries = (context, plan, entries, locations, format, report) => {
|
|
696
|
+
for (const [index, entry] of entries.entries()) {
|
|
697
|
+
const hoists = [];
|
|
698
|
+
for (const [moduleKey] of plan) {
|
|
699
|
+
const decls = entry.byModule.get(moduleKey);
|
|
700
|
+
if (decls === undefined)
|
|
701
|
+
continue;
|
|
702
|
+
hoists.push({
|
|
703
|
+
decls,
|
|
704
|
+
specifier: toSpecifier(relativePath(locations[index].dir, chunkFileFor(context, moduleKey, format))),
|
|
705
|
+
});
|
|
706
|
+
for (const decl of decls)
|
|
707
|
+
report.bytesReclaimed += Buffer.byteLength(decl.text);
|
|
708
|
+
}
|
|
709
|
+
if (hoists.length > 0)
|
|
710
|
+
writeFileContent(locations[index].file, rewriteEntry(entry.parsed, hoists, format));
|
|
711
|
+
}
|
|
712
|
+
};
|
|
713
|
+
const processFormat = (context, owners, format, report) => {
|
|
714
|
+
const locations = locateEntries(context, format);
|
|
715
|
+
if (locations.length < 2)
|
|
716
|
+
return;
|
|
717
|
+
const entries = locations.map((location) => {
|
|
718
|
+
const parsed = parseEntry(readFileContent(location.file), format);
|
|
719
|
+
return { parsed, byModule: attribute(parsed, owners) };
|
|
720
|
+
});
|
|
721
|
+
const plan = planHoists(entries, owners);
|
|
722
|
+
if (plan.size === 0)
|
|
723
|
+
return;
|
|
724
|
+
writeChunks(context, plan, locations, format, report);
|
|
725
|
+
rewriteEntries(context, plan, entries, locations, format, report);
|
|
726
|
+
};
|
|
727
|
+
/**
|
|
728
|
+
* Lifts first-party modules that are inlined into multiple entry bundles into
|
|
729
|
+
* shared `_shared/<srcPath>/index.<fmt>.js` chunks and rewrites every consuming
|
|
730
|
+
* entry to import them.
|
|
731
|
+
*
|
|
732
|
+
* Runs as an additive post-emit pass over the already-bundled `esm` and `cjs`
|
|
733
|
+
* outputs, each processed independently; `iife`/`umd`/`bin` and `.d.ts` outputs
|
|
734
|
+
* are never read. Per-entry isolated bundling is untouched. Every hoist is
|
|
735
|
+
* proven safe by {@link planHoists} before it happens — structurally identical
|
|
736
|
+
* copies, resolvable references, and cycle-free module-initialization — so any module
|
|
737
|
+
* that cannot be proven safe is left inlined and the output is, worst case,
|
|
738
|
+
* identical to the input.
|
|
739
|
+
*
|
|
740
|
+
* @param context - Resolved build context. `outputPath` locates the bundles and
|
|
741
|
+
* `projectRoot/src` drives ownership attribution.
|
|
742
|
+
* @param monitor - Optional memory monitor; a checkpoint is captured after each
|
|
743
|
+
* format so the pass is observable.
|
|
744
|
+
* @returns Counts of chunks written and net bytes reclaimed.
|
|
745
|
+
*
|
|
746
|
+
* @example Hoisting after the dependency prune
|
|
747
|
+
* ```typescript
|
|
748
|
+
* const report = hoistSharedFirstParty(context, monitor)
|
|
749
|
+
* ```
|
|
750
|
+
*/
|
|
751
|
+
const hoistSharedFirstParty = (context, monitor) => {
|
|
752
|
+
const report = { chunksWritten: 0, bytesReclaimed: 0 };
|
|
753
|
+
const srcRoot = join(context.projectRoot, 'src');
|
|
754
|
+
if (!exists(srcRoot))
|
|
755
|
+
return report;
|
|
756
|
+
const owners = indexOwners(srcRoot);
|
|
757
|
+
for (const format of FORMATS) {
|
|
758
|
+
processFormat(context, owners, format, report);
|
|
759
|
+
monitor?.check(`bundle:dedupe:shared-first-party:${format}:end`);
|
|
760
|
+
}
|
|
761
|
+
if (report.chunksWritten > 0)
|
|
762
|
+
log.info(`hoisted ${report.chunksWritten} shared chunk(s), reclaimed ${report.bytesReclaimed} byte(s)`);
|
|
763
|
+
return report;
|
|
764
|
+
};
|
|
765
|
+
|
|
766
|
+
export { attribute, baseName, chunkFileName, fingerprintOf, hoistSharedFirstParty, indexOwners, parseEntry, planHoists, renderChunk, resolveModuleRefs, rewriteEntry, sharedDirFor };
|