├── .eslintrc.json ├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug.md │ ├── config.yml │ ├── documentation.md │ ├── feature_request.md │ └── question.md └── workflows │ └── workflow.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── documentation ├── asset │ ├── plugin-output-example-code-splitting.png │ ├── plugin-output-example.png │ ├── rollup-plugin-ts-logo.png │ ├── rollup-plugin-ts-logo.svg │ └── tsc-output-example.png └── explainer │ └── why_is_babel-plugin-transform-runtime_and_tslib_included_by_default.md ├── package.json ├── pnpm-lock.yaml ├── rollup.config.ts ├── sandhog.config.js ├── src ├── constant │ └── constant.ts ├── diagnostic │ └── extended-diagnostic.ts ├── index.ts ├── lib │ └── regenerator │ │ └── regenerator.ts ├── plugin │ ├── typescript-plugin-options.ts │ └── typescript-plugin.ts ├── service │ ├── cache │ │ ├── cached-fs.ts │ │ ├── cached-worker.ts │ │ └── resolve-cache │ │ │ ├── extended-resolved-module.ts │ │ │ ├── get-resolved-id-with-caching-options.ts │ │ │ └── resolve-cache.ts │ ├── compiler-host │ │ ├── compiler-host-options.ts │ │ └── compiler-host.ts │ ├── emit │ │ ├── declaration │ │ │ ├── bundle-declarations-for-chunk.ts │ │ │ └── emit-declarations.ts │ │ ├── diagnostics │ │ │ └── emit-diagnostics.ts │ │ └── tsbuildinfo │ │ │ └── emit-build-info.ts │ ├── module-resolution-host │ │ ├── module-resolution-host-options.ts │ │ ├── module-resolution-host.ts │ │ └── virtual-file.ts │ └── transformer │ │ ├── declaration-bundler │ │ ├── declaration-bundler-options.ts │ │ ├── declaration-bundler.ts │ │ ├── transformers │ │ │ ├── deconflicter │ │ │ │ ├── deconflicter-options.ts │ │ │ │ ├── deconflicter-visitor-options.ts │ │ │ │ ├── deconflicter.ts │ │ │ │ └── visitor │ │ │ │ │ ├── deconflict-binding-element.ts │ │ │ │ │ ├── deconflict-call-signature-declaration.ts │ │ │ │ │ ├── deconflict-class-declaration.ts │ │ │ │ │ ├── deconflict-class-expression.ts │ │ │ │ │ ├── deconflict-constructor-declaration.ts │ │ │ │ │ ├── deconflict-enum-declaration.ts │ │ │ │ │ ├── deconflict-enum-member.ts │ │ │ │ │ ├── deconflict-export-specifier.ts │ │ │ │ │ ├── deconflict-function-declaration.ts │ │ │ │ │ ├── deconflict-function-expression.ts │ │ │ │ │ ├── deconflict-function-type.ts │ │ │ │ │ ├── deconflict-get-accessor-declaration.ts │ │ │ │ │ ├── deconflict-identifier.ts │ │ │ │ │ ├── deconflict-import-clause.ts │ │ │ │ │ ├── deconflict-import-equals-declaration.ts │ │ │ │ │ ├── deconflict-import-specifier.ts │ │ │ │ │ ├── deconflict-import-type-node.ts │ │ │ │ │ ├── deconflict-index-signature-declaration.ts │ │ │ │ │ ├── deconflict-interface-declaration.ts │ │ │ │ │ ├── deconflict-mapped-type-node.ts │ │ │ │ │ ├── deconflict-method-declaration.ts │ │ │ │ │ ├── deconflict-method-signature.ts │ │ │ │ │ ├── deconflict-module-declaration.ts │ │ │ │ │ ├── deconflict-namespace-import.ts │ │ │ │ │ ├── deconflict-parameter-declaration.ts │ │ │ │ │ ├── deconflict-property-assignment.ts │ │ │ │ │ ├── deconflict-property-declaration.ts │ │ │ │ │ ├── deconflict-property-signature.ts │ │ │ │ │ ├── deconflict-qualified-name.ts │ │ │ │ │ ├── deconflict-set-accessor-declaration.ts │ │ │ │ │ ├── deconflict-type-alias-declaration.ts │ │ │ │ │ ├── deconflict-type-parameter-declaration.ts │ │ │ │ │ └── deconflict-variable-declaration.ts │ │ │ ├── ensure-declare-modifier-transformer │ │ │ │ ├── ensure-declare-modifier-transformer-visitor-options.ts │ │ │ │ ├── ensure-declare-modifier-transformer.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-class-declaration.ts │ │ │ │ │ ├── visit-class-expression.ts │ │ │ │ │ ├── visit-enum-declaration.ts │ │ │ │ │ ├── visit-function-declaration.ts │ │ │ │ │ ├── visit-function-expression.ts │ │ │ │ │ ├── visit-interface-declaration.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ ├── visit-node.ts │ │ │ │ │ ├── visit-type-alias-declaration.ts │ │ │ │ │ └── visit-variable-statement.ts │ │ │ ├── ensure-no-declare-modifier-transformer │ │ │ │ ├── ensure-no-declare-modifier-transformer-visitor-options.ts │ │ │ │ ├── ensure-no-declare-modifier-transformer.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-class-declaration.ts │ │ │ │ │ ├── visit-class-expression.ts │ │ │ │ │ ├── visit-enum-declaration.ts │ │ │ │ │ ├── visit-function-declaration.ts │ │ │ │ │ ├── visit-function-expression.ts │ │ │ │ │ ├── visit-interface-declaration.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ ├── visit-node.ts │ │ │ │ │ ├── visit-type-alias-declaration.ts │ │ │ │ │ └── visit-variable-statement.ts │ │ │ ├── ensure-no-export-modifier-transformer │ │ │ │ ├── ensure-no-export-modifier-transformer-visitor-options.ts │ │ │ │ ├── ensure-no-export-modifier-transformer.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-class-declaration.ts │ │ │ │ │ ├── visit-class-expression.ts │ │ │ │ │ ├── visit-enum-declaration.ts │ │ │ │ │ ├── visit-function-declaration.ts │ │ │ │ │ ├── visit-function-expression.ts │ │ │ │ │ ├── visit-interface-declaration.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ ├── visit-node.ts │ │ │ │ │ ├── visit-type-alias-declaration.ts │ │ │ │ │ └── visit-variable-statement.ts │ │ │ ├── inline-namespace-module-block-transformer │ │ │ │ ├── inline-namespace-module-block-options.ts │ │ │ │ ├── inline-namespace-module-block-transformer.ts │ │ │ │ ├── inline-namespace-module-block-visitor-options.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-export-declaration.ts │ │ │ │ │ ├── visit-import-declaration.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ └── visit-node.ts │ │ │ ├── module-block-extractor │ │ │ │ ├── module-block-extractor-options.ts │ │ │ │ ├── module-block-extractor-visitor-options.ts │ │ │ │ ├── module-block-extractor.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ └── visit-node.ts │ │ │ ├── module-merger │ │ │ │ ├── module-merger-visitor-options.ts │ │ │ │ ├── module-merger.ts │ │ │ │ ├── util │ │ │ │ │ └── is-root-level-node.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-export-declaration.ts │ │ │ │ │ ├── visit-export-specifier.ts │ │ │ │ │ ├── visit-import-clause.ts │ │ │ │ │ ├── visit-import-declaration.ts │ │ │ │ │ ├── visit-import-specifier.ts │ │ │ │ │ ├── visit-import-type-node.ts │ │ │ │ │ ├── visit-namespace-import.ts │ │ │ │ │ ├── visit-node.ts │ │ │ │ │ └── visit-source-file.ts │ │ │ ├── no-export-declaration-transformer │ │ │ │ ├── no-export-declaration-transformer-options.ts │ │ │ │ ├── no-export-declaration-transformer-visitor-options.ts │ │ │ │ ├── no-export-declaration-transformer.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-export-assignment.ts │ │ │ │ │ ├── visit-export-declaration.ts │ │ │ │ │ └── visit-node.ts │ │ │ ├── reference │ │ │ │ ├── cache │ │ │ │ │ └── reference-cache.ts │ │ │ │ └── is-referenced │ │ │ │ │ ├── is-referenced-options.ts │ │ │ │ │ ├── is-referenced.ts │ │ │ │ │ ├── reference-visitor-options.ts │ │ │ │ │ ├── visitor-options.ts │ │ │ │ │ └── visitor │ │ │ │ │ ├── check-array-binding-pattern.ts │ │ │ │ │ ├── check-binding-element.ts │ │ │ │ │ ├── check-class-declaration.ts │ │ │ │ │ ├── check-class-expression.ts │ │ │ │ │ ├── check-enum-declaration.ts │ │ │ │ │ ├── check-export-assignment.ts │ │ │ │ │ ├── check-export-declaration.ts │ │ │ │ │ ├── check-export-specifier.ts │ │ │ │ │ ├── check-function-declaration.ts │ │ │ │ │ ├── check-function-expression.ts │ │ │ │ │ ├── check-get-accessor-declaration.ts │ │ │ │ │ ├── check-identifier.ts │ │ │ │ │ ├── check-import-equals-declaration.ts │ │ │ │ │ ├── check-indexed-access-type-node.ts │ │ │ │ │ ├── check-interface-declaration.ts │ │ │ │ │ ├── check-method-declaration.ts │ │ │ │ │ ├── check-method-signature.ts │ │ │ │ │ ├── check-module-declaration.ts │ │ │ │ │ ├── check-object-binding-pattern.ts │ │ │ │ │ ├── check-parameter-declaration.ts │ │ │ │ │ ├── check-property-access-expression.ts │ │ │ │ │ ├── check-property-declaration.ts │ │ │ │ │ ├── check-property-signature.ts │ │ │ │ │ ├── check-qualified-name.ts │ │ │ │ │ ├── check-set-accessor-declaration.ts │ │ │ │ │ ├── check-template-literal-type-node.ts │ │ │ │ │ ├── check-template-literal-type-span.ts │ │ │ │ │ ├── check-type-alias-declaration.ts │ │ │ │ │ ├── check-type-reference-node.ts │ │ │ │ │ ├── check-variable-declaration-list.ts │ │ │ │ │ ├── check-variable-declaration.ts │ │ │ │ │ └── check-variable-statement.ts │ │ │ ├── source-file-bundler │ │ │ │ ├── source-file-bundler-visitor-options.ts │ │ │ │ └── source-file-bundler.ts │ │ │ ├── statement-merger │ │ │ │ ├── statement-merger-options.ts │ │ │ │ ├── statement-merger-visitor-options.ts │ │ │ │ ├── statement-merger.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-export-assignment.ts │ │ │ │ │ ├── visit-export-declaration.ts │ │ │ │ │ ├── visit-import-declaration.ts │ │ │ │ │ └── visit-node.ts │ │ │ ├── stats-collector │ │ │ │ ├── stats-collector-options.ts │ │ │ │ ├── stats-collector-visitor-options.ts │ │ │ │ └── stats-collector.ts │ │ │ ├── to-export-declaration-transformer │ │ │ │ ├── to-export-declaration-transformer-visitor-options.ts │ │ │ │ ├── to-export-declaration-transformer.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-class-declaration.ts │ │ │ │ │ ├── visit-class-expression.ts │ │ │ │ │ ├── visit-enum-declaration.ts │ │ │ │ │ ├── visit-function-declaration.ts │ │ │ │ │ ├── visit-function-expression.ts │ │ │ │ │ ├── visit-interface-declaration.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ ├── visit-node.ts │ │ │ │ │ ├── visit-type-alias-declaration.ts │ │ │ │ │ └── visit-variable-statement.ts │ │ │ ├── trace-identifiers │ │ │ │ ├── trace-identifiers-visitor-options.ts │ │ │ │ ├── trace-identifiers.ts │ │ │ │ └── visitor │ │ │ │ │ ├── trace-identifiers-for-binding-element.ts │ │ │ │ │ ├── trace-identifiers-for-call-expression.ts │ │ │ │ │ ├── trace-identifiers-for-class-declaration.ts │ │ │ │ │ ├── trace-identifiers-for-enum-declaration.ts │ │ │ │ │ ├── trace-identifiers-for-export-assignment.ts │ │ │ │ │ ├── trace-identifiers-for-export-specifier.ts │ │ │ │ │ ├── trace-identifiers-for-function-declaration.ts │ │ │ │ │ ├── trace-identifiers-for-identifier.ts │ │ │ │ │ ├── trace-identifiers-for-import-clause.ts │ │ │ │ │ ├── trace-identifiers-for-import-equals-declaration.ts │ │ │ │ │ ├── trace-identifiers-for-import-specifier.ts │ │ │ │ │ ├── trace-identifiers-for-interface-declaration.ts │ │ │ │ │ ├── trace-identifiers-for-namespace-import.ts │ │ │ │ │ ├── trace-identifiers-for-new-expression.ts │ │ │ │ │ ├── trace-identifiers-for-node.ts │ │ │ │ │ ├── trace-identifiers-for-type-alias-declaration.ts │ │ │ │ │ └── trace-identifiers-for-variable-declaration.ts │ │ │ ├── track-dependencies-transformer │ │ │ │ ├── track-dependencies-transformer-visitor-options.ts │ │ │ │ ├── track-dependencies-transformer.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-export-declaration.ts │ │ │ │ │ ├── visit-import-declaration.ts │ │ │ │ │ ├── visit-import-type-node.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ └── visit-node.ts │ │ │ ├── track-exports-transformer │ │ │ │ ├── track-exports-transformer-visitor-options.ts │ │ │ │ ├── track-exports-transformer.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-class-declaration.ts │ │ │ │ │ ├── visit-class-expression.ts │ │ │ │ │ ├── visit-enum-declaration.ts │ │ │ │ │ ├── visit-export-assignment.ts │ │ │ │ │ ├── visit-export-declaration.ts │ │ │ │ │ ├── visit-function-declaration.ts │ │ │ │ │ ├── visit-function-expression.ts │ │ │ │ │ ├── visit-interface-declaration.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ ├── visit-node.ts │ │ │ │ │ ├── visit-type-alias-declaration.ts │ │ │ │ │ └── visit-variable-statement.ts │ │ │ ├── track-imports-transformer │ │ │ │ ├── track-imports-transformer-visitor-options.ts │ │ │ │ ├── track-imports-transformer.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-import-declaration.ts │ │ │ │ │ ├── visit-import-type-node.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ └── visit-node.ts │ │ │ ├── transformer-base-options.ts │ │ │ ├── tree-shaker │ │ │ │ ├── tree-shaker-visitor-options.ts │ │ │ │ ├── tree-shaker.ts │ │ │ │ └── visitor │ │ │ │ │ ├── visit-array-binding-pattern.ts │ │ │ │ │ ├── visit-binding-element.ts │ │ │ │ │ ├── visit-class-declaration.ts │ │ │ │ │ ├── visit-class-expression.ts │ │ │ │ │ ├── visit-enum-declaration.ts │ │ │ │ │ ├── visit-export-assignment.ts │ │ │ │ │ ├── visit-export-declaration.ts │ │ │ │ │ ├── visit-function-declaration.ts │ │ │ │ │ ├── visit-function-expression.ts │ │ │ │ │ ├── visit-identifier.ts │ │ │ │ │ ├── visit-import-clause.ts │ │ │ │ │ ├── visit-import-declaration.ts │ │ │ │ │ ├── visit-import-equals-declaration.ts │ │ │ │ │ ├── visit-import-specifier.ts │ │ │ │ │ ├── visit-interface-declaration.ts │ │ │ │ │ ├── visit-module-declaration.ts │ │ │ │ │ ├── visit-named-imports.ts │ │ │ │ │ ├── visit-namespace-import.ts │ │ │ │ │ ├── visit-node.ts │ │ │ │ │ ├── visit-object-binding-pattern.ts │ │ │ │ │ ├── visit-type-alias-declaration.ts │ │ │ │ │ ├── visit-variable-declaration-list.ts │ │ │ │ │ ├── visit-variable-declaration.ts │ │ │ │ │ └── visit-variable-statement.ts │ │ │ └── type-reference-collector │ │ │ │ ├── type-reference-collector-visitor-options.ts │ │ │ │ ├── type-reference-collector.ts │ │ │ │ └── visitor │ │ │ │ ├── visit-identifier.ts │ │ │ │ └── visit-node.ts │ │ └── util │ │ │ ├── add-binding-to-lexical-environment.ts │ │ │ ├── apply-transformers.ts │ │ │ ├── clone-lexical-environment.ts │ │ │ ├── clone-node-with-meta.ts │ │ │ ├── create-aliased-binding.ts │ │ │ ├── create-export-specifier-from-name-and-modifiers.ts │ │ │ ├── find-matching-imported-symbol.ts │ │ │ ├── format-lib-reference-directive.ts │ │ │ ├── format-type-reference-directive.ts │ │ │ ├── generate-identifier-name.ts │ │ │ ├── generate-module-specifier.ts │ │ │ ├── generate-unique-binding.ts │ │ │ ├── get-aliased-declaration.ts │ │ │ ├── get-binding-from-lexical-environment.ts │ │ │ ├── get-chunk-filename.ts │ │ │ ├── get-id-for-node.ts │ │ │ ├── get-merged-export-declarations-for-modules.ts │ │ │ ├── get-merged-import-declarations-for-modules.ts │ │ │ ├── get-node-placement-queue.ts │ │ │ ├── get-original-node.ts │ │ │ ├── get-original-source-file.ts │ │ │ ├── get-parent-node.ts │ │ │ ├── get-symbol-at-location.ts │ │ │ ├── get-symbol-flags-for-node.ts │ │ │ ├── get-type-reference-module-from-file-name.ts │ │ │ ├── get-type-reference-module-from-node.ts │ │ │ ├── is-identifier-free.ts │ │ │ ├── is-statement.ts │ │ │ ├── is-symbol-identifier.ts │ │ │ ├── locate-exported-symbol.ts │ │ │ ├── modifier-util.ts │ │ │ ├── node-arrays-are-equal.ts │ │ │ ├── node-contains-child.ts │ │ │ ├── node-has-supported-extension.ts │ │ │ ├── node-util.ts │ │ │ ├── prepare-paths │ │ │ └── prepare-paths.ts │ │ │ └── type-module-reference-is-allowed.ts │ │ └── ensure-module │ │ └── ensure-module-transformer.ts ├── transpiler │ ├── babel.ts │ └── swc.ts ├── type │ ├── babel.ts │ ├── declaration-stats.ts │ ├── safe-node.ts │ ├── swc.ts │ └── ts.ts └── util │ ├── chunk │ ├── merge-chunks-with-ambient-dependencies.ts │ └── normalize-chunk.ts │ ├── ensure-array │ └── ensure-array.ts │ ├── file-system │ └── file-system.ts │ ├── finalize-parsed-command-line │ └── finalize-parsed-command-line.ts │ ├── get-browserslist │ ├── get-browserslist-options.ts │ └── get-browserslist.ts │ ├── get-declaration-out-dir │ └── get-declaration-out-dir.ts │ ├── get-forced-compiler-options │ ├── get-forced-compiler-options-options.ts │ └── get-forced-compiler-options.ts │ ├── get-module-dependencies │ └── get-module-dependencies.ts │ ├── get-module-kind-from-rollup-format │ └── get-module-kind-from-rollup-format.ts │ ├── get-new-line-character │ └── get-new-line-character.ts │ ├── get-out-dir │ └── get-out-dir.ts │ ├── get-parsed-command-line │ ├── get-parsed-command-line.ts │ └── parsed-command-line-result.ts │ ├── get-script-kind-from-path │ └── get-script-kind-from-path.ts │ ├── get-script-target-from-browserslist │ └── get-script-target-from-browserslist.ts │ ├── get-source-description-from-emit-output │ └── get-source-description-from-emit-output.ts │ ├── get-supported-extensions │ └── get-supported-extensions.ts │ ├── hash │ └── generate-random-hash.ts │ ├── inspect │ └── inspect.ts │ ├── is-build-info-output-file │ └── is-build-info-output-file.ts │ ├── is-code-output-file │ └── is-code-output-file.ts │ ├── is-debug │ └── should-debug.ts │ ├── is-defined │ └── is-defined.ts │ ├── is-json-like │ └── is-json-like.ts │ ├── is-map-output-file │ └── is-map-output-file.ts │ ├── is-output-chunk │ └── is-output-chunk.ts │ ├── list-format.ts │ ├── logging │ ├── get-formatted-date-time-prefix.ts │ ├── log-emit.ts │ ├── log-metrics.ts │ ├── log-transformer.ts │ ├── log-tsconfig.ts │ └── log-virtual-files.ts │ ├── merge-transformers │ ├── custom-transformer-options.ts │ └── merge-transformers.ts │ ├── module-resolution │ └── module-resolution-util.ts │ ├── object │ └── object-util.ts │ ├── os │ └── os.ts │ ├── path │ └── path-util.ts │ ├── pick-resolved-module.ts │ ├── plugin-options │ └── get-plugin-options.ts │ ├── predicates │ └── predicates.ts │ ├── resolve-id │ ├── resolve-id.ts │ └── resolve-module-options.ts │ ├── rollup │ └── rollup-util.ts │ ├── similarity-util.ts │ ├── take-browserslist-or-compute-based-on-compiler-options │ └── take-browserslist-or-compute-based-on-compiler-options.ts │ ├── take-bundled-filenames │ └── take-bundled-filenames.ts │ └── transpiler-loader.ts ├── test ├── allow-importing-ts-extensions.test.ts ├── allowjs.test.ts ├── babel.test.ts ├── build-info.test.ts ├── cache.test.ts ├── cjs.test.ts ├── code-splitting.test.ts ├── comment.test.ts ├── custom-transformers.test.ts ├── declaration-map.test.ts ├── declaration.test.ts ├── deconflict.test.ts ├── deferred-assets.test.ts ├── diagnostic.test.ts ├── entry-file-names.test.ts ├── exclude.test.ts ├── export-circular.test.ts ├── export-default.test.ts ├── external.test.ts ├── global-definition.test.ts ├── hook.test.ts ├── integration.test.ts ├── json.test.ts ├── mjs.test.ts ├── module-merge.test.ts ├── module.test.ts ├── multi-entry.test.ts ├── namespace-export.test.ts ├── parse-tsconfig.test.ts ├── path-mapping.test.ts ├── rebuild.test.ts ├── setup │ ├── create-virtual-file-system.ts │ ├── setup-rollup.ts │ ├── test-context.ts │ ├── test-file.ts │ ├── test-result.ts │ └── test-setup.ts ├── statement-merge.test.ts ├── swc.test.ts ├── tree-shake.test.ts ├── tslib.test.ts ├── type-only-import-export.test.ts ├── type-reference-directive.test.ts └── util │ ├── create-temporary-file.ts │ ├── create-typescript-system.ts │ ├── format-code.ts │ └── test-runner.ts ├── tsconfig.build.json └── tsconfig.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es2020": true, 4 | "shared-node-browser": true, 5 | "node": true 6 | }, 7 | "extends": "./node_modules/@wessberg/ts-config/.eslintrc.json", 8 | "plugins": ["deprecation"], 9 | "rules": { 10 | "deprecation/deprecation": ["error"] 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: wessberg 2 | patreon: wessberg 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | blank_issues_enabled: true 3 | contact_links: 4 | - about: "Please check the FAQ before filing new issues" 5 | name: "FAQ" 6 | url: "https://github.com/wessberg/rollup-plugin-ts#faq" 7 | - about: "Please read the Rollup documentation to ensure that the issue isn't related to the way Rollup works" 8 | name: "Rollup documentation" 9 | url: "http://rollupjs.org/guide/en/" 10 | - about: "Please read the TypeScript documentation to ensure that the issue isn't related to the way TypeScript works" 11 | name: "TypeScript documentation" 12 | url: "https://www.typescriptlang.org/docs/home.html" 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/documentation.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Documentation 3 | about: Are the documentation missing something? Do they need something to be clarified? 4 | labels: documentation 5 | --- 6 | 7 | 11 | 12 | ### Your Proposal for Changes 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Request 3 | about: You would like to propose a new feature, or you would like something to work differently. 4 | labels: feature request 5 | --- 6 | 7 | 11 | 12 | ### Feature Use Case 13 | 14 | ### Feature Proposal 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: You have a question that is not covered by the documentation 4 | labels: question 5 | --- 6 | 7 | 11 | 12 | ### Question 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /compiled/ 2 | /.idea/ 3 | /.cache/ 4 | /.vscode/ 5 | *.log 6 | /test-app/ 7 | /test-app_old/ 8 | /logs/ 9 | npm-debug.log* 10 | /lib-cov/ 11 | /coverage/ 12 | /.nyc_output/ 13 | /.grunt/ 14 | *.7z 15 | *.dmg 16 | *.gz 17 | *.iso 18 | *.jar 19 | *.rar 20 | *.tar 21 | *.zip 22 | .tgz 23 | .env 24 | .DS_Store 25 | .DS_Store? 26 | ._* 27 | .Spotlight-V100 28 | .Trashes 29 | ehthumbs.db 30 | Thumbs.db 31 | *.pem 32 | *.p12 33 | *.crt 34 | *.csr 35 | /node_modules/ 36 | /dist/ 37 | /tsconfig.build.tsbuildinfo -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged --quiet -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | You are more than welcome to contribute to `rollup-plugin-ts` in any way you please, including: 2 | 3 | - Updating documentation. 4 | - Fixing spelling and grammar 5 | - Adding tests 6 | - Fixing issues and suggesting new features 7 | - Blogging, tweeting, and creating tutorials about `rollup-plugin-ts` 8 | - Reaching out to [@FredWessberg](https://twitter.com/FredWessberg) on Twitter 9 | - Submit an issue or a Pull Request 10 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright © 2023 [Frederik Wessberg](mailto:frederikwessberg@hotmail.com) ([@FredWessberg](https://twitter.com/FredWessberg)) ([Website](https://github.com/wessberg)) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /documentation/asset/plugin-output-example-code-splitting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wessberg/rollup-plugin-ts/b37a459bfb5dcf740a1319748574147c55276cb7/documentation/asset/plugin-output-example-code-splitting.png -------------------------------------------------------------------------------- /documentation/asset/plugin-output-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wessberg/rollup-plugin-ts/b37a459bfb5dcf740a1319748574147c55276cb7/documentation/asset/plugin-output-example.png -------------------------------------------------------------------------------- /documentation/asset/rollup-plugin-ts-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wessberg/rollup-plugin-ts/b37a459bfb5dcf740a1319748574147c55276cb7/documentation/asset/rollup-plugin-ts-logo.png -------------------------------------------------------------------------------- /documentation/asset/tsc-output-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wessberg/rollup-plugin-ts/b37a459bfb5dcf740a1319748574147c55276cb7/documentation/asset/tsc-output-example.png -------------------------------------------------------------------------------- /rollup.config.ts: -------------------------------------------------------------------------------- 1 | import ts from "./src/index.js"; 2 | import {rollup} from "rollup"; 3 | import pkg from "./package.json" assert {type: "json"}; 4 | import {builtinModules} from "module"; 5 | 6 | const SHARED_OUTPUT_OPTIONS = { 7 | sourcemap: true, 8 | hoistTransitiveImports: false, 9 | generatedCode: "es2015", 10 | compact: false, 11 | minifyInternalExports: false 12 | } as const; 13 | 14 | (async () => { 15 | const bundle = await rollup({ 16 | input: "src/index.ts", 17 | plugins: [ 18 | ts({ 19 | tsconfig: "tsconfig.build.json" 20 | }) 21 | ], 22 | external: [...builtinModules, ...Object.keys(pkg.dependencies ?? {}), ...Object.keys(pkg.devDependencies ?? {}), ...Object.keys(pkg.peerDependencies ?? {})] 23 | }); 24 | 25 | await Promise.all( 26 | ( 27 | [ 28 | { 29 | file: pkg.exports.require, 30 | format: "cjs", 31 | exports: "default", 32 | dynamicImportInCjs: false, 33 | ...SHARED_OUTPUT_OPTIONS 34 | }, 35 | { 36 | file: pkg.exports.import, 37 | format: "esm", 38 | ...SHARED_OUTPUT_OPTIONS 39 | } 40 | ] as const 41 | ).map(bundle.write) 42 | ); 43 | })().catch(ex => { 44 | console.error(ex); 45 | process.exit(1); 46 | }); 47 | -------------------------------------------------------------------------------- /sandhog.config.js: -------------------------------------------------------------------------------- 1 | import baseConfig from "@wessberg/ts-config/sandhog.config.js"; 2 | 3 | export default { 4 | ...baseConfig, 5 | isDevelopmentPackage: true, 6 | logo: { 7 | url: "https://raw.githubusercontent.com/wessberg/rollup-plugin-ts/master/documentation/asset/rollup-plugin-ts-logo.png", 8 | height: 150 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /src/diagnostic/extended-diagnostic.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../type/ts.js"; 2 | 3 | export interface ExtendedDiagnostic extends TS.Diagnostic { 4 | scope?: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export type * from "./util/merge-transformers/custom-transformer-options.js"; 2 | export type * from "./type/declaration-stats.js"; 3 | 4 | export type {TypescriptPluginOptions, BrowserslistConfig, BrowserslistPathConfig, BrowserslistQueryConfig} from "./plugin/typescript-plugin-options.js"; 5 | 6 | export {default} from "./plugin/typescript-plugin.js"; 7 | -------------------------------------------------------------------------------- /src/service/cache/cached-fs.ts: -------------------------------------------------------------------------------- 1 | import type {CachedWorkerOptions} from "./cached-worker.js"; 2 | import {CachedWorker} from "./cached-worker.js"; 3 | import type {TS} from "../../type/ts.js"; 4 | import type {FileSystem} from "../../util/file-system/file-system.js"; 5 | 6 | export interface CachedFsWorkerOptions extends CachedWorkerOptions { 7 | fs: TS.System | FileSystem; 8 | } 9 | 10 | export class CachedFs extends CachedWorker { 11 | readFile(file: string): string | undefined { 12 | return this.work(file, () => { 13 | if ("readFileSync" in this.options.fs) { 14 | try { 15 | return this.options.fs.readFileSync(file, "utf8"); 16 | } catch { 17 | return undefined; 18 | } 19 | } else { 20 | return this.options.fs.readFile(file); 21 | } 22 | }); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/service/cache/cached-worker.ts: -------------------------------------------------------------------------------- 1 | export interface CachedWorkerOptions {} 2 | 3 | export class CachedWorker { 4 | private readonly cache = new Map(); 5 | 6 | constructor(protected readonly options: Options) {} 7 | 8 | work(key: string, job: () => T): T { 9 | if (this.cache.has(key)) { 10 | return this.cache.get(key) as T; 11 | } 12 | const result = job(); 13 | this.cache.set(key, result); 14 | return result; 15 | } 16 | 17 | delete(key: string): boolean { 18 | return this.cache.delete(key); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/service/cache/resolve-cache/extended-resolved-module.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../type/ts.js"; 2 | 3 | export interface ExtendedResolvedModule extends Omit { 4 | resolvedFileName: string | undefined; 5 | resolvedAmbientFileName: string | undefined; 6 | } 7 | -------------------------------------------------------------------------------- /src/service/cache/resolve-cache/get-resolved-id-with-caching-options.ts: -------------------------------------------------------------------------------- 1 | import type {ModuleResolutionHost} from "../../module-resolution-host/module-resolution-host.js"; 2 | 3 | export interface GetResolvedIdWithCachingOptions { 4 | id: string; 5 | parent: string; 6 | moduleResolutionHost: ModuleResolutionHost; 7 | } 8 | -------------------------------------------------------------------------------- /src/service/compiler-host/compiler-host-options.ts: -------------------------------------------------------------------------------- 1 | import type {ModuleResolutionHostOptions} from "../module-resolution-host/module-resolution-host-options.js"; 2 | import type {CustomTransformersFunction} from "../../util/merge-transformers/custom-transformer-options.js"; 3 | import type {TS} from "../../type/ts.js"; 4 | import type {ResolveCache} from "../cache/resolve-cache/resolve-cache.js"; 5 | 6 | export type CustomTransformersInput = CustomTransformersFunction | TS.CustomTransformers | undefined; 7 | 8 | export interface CompilerHostOptions extends ModuleResolutionHostOptions { 9 | filter(id: string): boolean; 10 | resolveCache: ResolveCache; 11 | transformers?: CustomTransformersInput; 12 | allowTransformingDeclarations?: boolean; 13 | } 14 | -------------------------------------------------------------------------------- /src/service/module-resolution-host/module-resolution-host-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../type/ts.js"; 2 | import type {SupportedExtensions} from "../../util/get-supported-extensions/get-supported-extensions.js"; 3 | import type {ParsedCommandLineResult} from "../../util/get-parsed-command-line/parsed-command-line-result.js"; 4 | import type {ExternalOption} from "rollup"; 5 | 6 | export interface ModuleResolutionHostOptions { 7 | typescript: typeof TS; 8 | parsedCommandLineResult: ParsedCommandLineResult; 9 | extensions: SupportedExtensions; 10 | externalOption: ExternalOption | undefined; 11 | fileSystem: TS.System; 12 | cwd: string; 13 | } 14 | -------------------------------------------------------------------------------- /src/service/module-resolution-host/virtual-file.ts: -------------------------------------------------------------------------------- 1 | export interface VirtualFileInput { 2 | fileName: string; 3 | text: string; 4 | fromRollup: boolean; 5 | } 6 | 7 | export interface VirtualFile extends VirtualFileInput { 8 | transformedText: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/deconflicter/deconflicter-options.ts: -------------------------------------------------------------------------------- 1 | export interface ContinuationOptions { 2 | lexicalEnvironment: LexicalEnvironment; 3 | } 4 | 5 | export interface LexicalEnvironmentBinding { 6 | value: string; 7 | originalSourceFileName: string; 8 | } 9 | 10 | export interface LexicalEnvironment { 11 | parent: LexicalEnvironment | undefined; 12 | bindings: Map; 13 | } 14 | 15 | export interface DeconflicterOptions extends ContinuationOptions {} 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/deconflicter/deconflicter-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {ContinuationOptions, DeconflicterOptions} from "./deconflicter-options.js"; 3 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 4 | 5 | export interface DeconflicterVisitorOptions extends SourceFileBundlerVisitorOptions, DeconflicterOptions { 6 | typescript: typeof TS; 7 | node: T; 8 | 9 | childContinuation(node: U, options: ContinuationOptions): U; 10 | continuation(node: U, options: ContinuationOptions): U; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/deconflicter/visitor/deconflict-enum-member.ts: -------------------------------------------------------------------------------- 1 | import type {DeconflicterVisitorOptions} from "../deconflicter-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | 5 | /** 6 | * Deconflicts the given EnumMember. 7 | */ 8 | export function deconflictEnumMember(options: DeconflicterVisitorOptions): TS.EnumMember | undefined { 9 | const {node, continuation, lexicalEnvironment, typescript, factory} = options; 10 | const nameContResult = typescript.isIdentifier(node.name) ? node.name : continuation(node.name, {lexicalEnvironment}); 11 | const initializerContResult = node.initializer == null ? undefined : continuation(node.initializer, {lexicalEnvironment}); 12 | 13 | const isIdentical = nameContResult === node.name && initializerContResult === node.initializer; 14 | 15 | if (isIdentical) { 16 | return node; 17 | } 18 | 19 | return preserveMeta(factory.updateEnumMember(node, nameContResult, initializerContResult), node, options); 20 | } 21 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/deconflicter/visitor/deconflict-export-specifier.ts: -------------------------------------------------------------------------------- 1 | import type {DeconflicterVisitorOptions} from "../deconflicter-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | 5 | /** 6 | * Deconflicts the given ExportSpecifier. 7 | */ 8 | export function deconflictExportSpecifier(options: DeconflicterVisitorOptions): TS.ExportSpecifier | undefined { 9 | const {node, continuation, lexicalEnvironment, factory} = options; 10 | const propertyName = node.propertyName ?? node.name; 11 | const propertyNameContResult = continuation(propertyName, {lexicalEnvironment}); 12 | 13 | // If the ExportSpecifier is something like '{Foo}' but 'Foo' has been deconflicted in this SourceFile to something else, 14 | // we should re-write it to something like '{Foo$0 as Foo}' 15 | if (propertyNameContResult !== propertyName) { 16 | return preserveMeta(factory.updateExportSpecifier(node, false, propertyNameContResult.text === node.name.text ? undefined : propertyNameContResult, node.name), node, options); 17 | } 18 | 19 | return node; 20 | } 21 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/deconflicter/visitor/deconflict-property-assignment.ts: -------------------------------------------------------------------------------- 1 | import type {DeconflicterVisitorOptions} from "../deconflicter-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | 5 | /** 6 | * Deconflicts the given PropertyAssignment. 7 | */ 8 | export function deconflictPropertyAssignment(options: DeconflicterVisitorOptions): TS.PropertyAssignment | undefined { 9 | const {node, continuation, lexicalEnvironment, factory, typescript} = options; 10 | const nameContResult = typescript.isIdentifier(node.name) ? node.name : continuation(node.name, {lexicalEnvironment}); 11 | const initializerContResult = node.initializer == null ? undefined : continuation(node.initializer, {lexicalEnvironment}); 12 | 13 | const isIdentical = nameContResult === node.name && initializerContResult === node.initializer; 14 | 15 | if (isIdentical) { 16 | return node; 17 | } 18 | 19 | return preserveMeta(factory.updatePropertyAssignment(node, nameContResult, initializerContResult!), node, options); 20 | } 21 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/deconflicter/visitor/deconflict-property-signature.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable deprecation/deprecation */ 2 | import type {DeconflicterVisitorOptions} from "../deconflicter-visitor-options.js"; 3 | import type {TS} from "../../../../../../type/ts.js"; 4 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 5 | 6 | /** 7 | * Deconflicts the given PropertySignature. 8 | */ 9 | export function deconflictPropertySignature(options: DeconflicterVisitorOptions): TS.PropertySignature | undefined { 10 | const {node, continuation, lexicalEnvironment, factory, typescript} = options; 11 | const nameContResult = typescript.isIdentifier(node.name) ? node.name : continuation(node.name, {lexicalEnvironment}); 12 | 13 | const typeContResult = node.type == null ? undefined : continuation(node.type, {lexicalEnvironment}); 14 | const isIdentical = nameContResult === node.name && typeContResult === node.type; 15 | 16 | if (isIdentical) { 17 | return node; 18 | } 19 | 20 | return preserveMeta(factory.updatePropertySignature(node, node.modifiers, nameContResult, node.questionToken, typeContResult), node, options); 21 | } 22 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/deconflicter/visitor/deconflict-qualified-name.ts: -------------------------------------------------------------------------------- 1 | import type {DeconflicterVisitorOptions} from "../deconflicter-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | 5 | /** 6 | * Deconflicts the given QualifiedName. 7 | */ 8 | export function deconflictQualifiedName(options: DeconflicterVisitorOptions): TS.QualifiedName | undefined { 9 | const {node, continuation, lexicalEnvironment, factory} = options; 10 | const leftContResult = continuation(node.left, {lexicalEnvironment}); 11 | 12 | const isIdentical = leftContResult === node.left; 13 | 14 | if (isIdentical) { 15 | return node; 16 | } 17 | 18 | return preserveMeta(factory.updateQualifiedName(node, leftContResult, node.right), node, options); 19 | } 20 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/ensure-declare-modifier-transformer-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | 4 | export interface EnsureDeclareModifierTransformerVisitorOptions extends SourceFileBundlerVisitorOptions { 5 | typescript: typeof TS; 6 | node: T; 7 | 8 | childContinuation(node: U): U; 9 | continuation(node: U): U; 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-class-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {ensureHasDeclareModifier, hasDeclareModifier} from "../../../util/modifier-util.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitClassDeclaration(options: EnsureDeclareModifierTransformerVisitorOptions): TS.ClassDeclaration { 8 | const {node, typescript, factory} = options; 9 | if (hasDeclareModifier(node, typescript)) return node; 10 | 11 | const modifierLikes = ensureHasDeclareModifier(getModifierLikes(node), factory, typescript); 12 | 13 | return preserveMeta(factory.updateClassDeclaration(node, modifierLikes, node.name, node.typeParameters, node.heritageClauses, node.members), node, options); 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-class-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {ensureHasDeclareModifier, hasDeclareModifier} from "../../../util/modifier-util.js"; 4 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitClassExpression(options: EnsureDeclareModifierTransformerVisitorOptions): TS.ClassExpression { 8 | const {node, typescript, factory} = options; 9 | if (hasDeclareModifier(node, typescript)) return node; 10 | 11 | const modifierLikes = ensureHasDeclareModifier(getModifierLikes(node), factory, typescript); 12 | 13 | return preserveMeta(factory.updateClassExpression(node, modifierLikes, node.name, node.typeParameters, node.heritageClauses, node.members), node, options); 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-enum-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {ensureHasDeclareModifier, hasDeclareModifier} from "../../../util/modifier-util.js"; 4 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 5 | 6 | export function visitEnumDeclaration(options: EnsureDeclareModifierTransformerVisitorOptions): TS.EnumDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateEnumDeclaration(node, ensureHasDeclareModifier(node.modifiers, factory, typescript), node.name, node.members), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-function-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {ensureHasDeclareModifier, hasDeclareModifier} from "../../../util/modifier-util.js"; 4 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitFunctionDeclaration(options: EnsureDeclareModifierTransformerVisitorOptions): TS.FunctionDeclaration { 8 | const {node, factory, typescript} = options; 9 | if (hasDeclareModifier(node, typescript)) return node; 10 | 11 | const modifierLikes = ensureHasDeclareModifier(getModifierLikes(node), factory, typescript); 12 | 13 | return preserveMeta( 14 | factory.updateFunctionDeclaration(node, modifierLikes, node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, node.body), 15 | node, 16 | options 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-function-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {ensureHasDeclareModifier, hasDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitFunctionExpression(options: EnsureDeclareModifierTransformerVisitorOptions): TS.FunctionExpression { 7 | const {node, factory, typescript} = options; 8 | if (hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta( 11 | factory.updateFunctionExpression( 12 | node, 13 | ensureHasDeclareModifier(node.modifiers, factory, typescript), 14 | node.asteriskToken, 15 | node.name, 16 | node.typeParameters, 17 | node.parameters, 18 | node.type, 19 | node.body 20 | ), 21 | node, 22 | options 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-interface-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitInterfaceDeclaration(options: EnsureDeclareModifierTransformerVisitorOptions): TS.InterfaceDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta( 11 | factory.updateInterfaceDeclaration(node, removeDeclareModifier(node.modifiers, typescript), node.name, node.typeParameters, node.heritageClauses, node.members), 12 | node, 13 | options 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {ensureHasDeclareModifier, hasDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitModuleDeclaration(options: EnsureDeclareModifierTransformerVisitorOptions): TS.ModuleDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateModuleDeclaration(node, ensureHasDeclareModifier(node.modifiers, factory, typescript), node.name, node.body), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-type-alias-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitTypeAliasDeclaration(options: EnsureDeclareModifierTransformerVisitorOptions): TS.TypeAliasDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateTypeAliasDeclaration(node, removeDeclareModifier(node.modifiers, typescript), node.name, node.typeParameters, node.type), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-declare-modifier-transformer/visitor/visit-variable-statement.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureDeclareModifierTransformerVisitorOptions} from "../ensure-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {ensureHasDeclareModifier, hasDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitVariableStatement(options: EnsureDeclareModifierTransformerVisitorOptions): TS.VariableStatement { 7 | const {node, factory, typescript} = options; 8 | if (hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateVariableStatement(node, ensureHasDeclareModifier(node.modifiers, factory, typescript), node.declarationList), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/ensure-no-declare-modifier-transformer-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | 4 | export interface EnsureNoDeclareModifierTransformerVisitorOptions extends SourceFileBundlerVisitorOptions { 5 | typescript: typeof TS; 6 | node: T; 7 | 8 | childContinuation(node: U): U; 9 | continuation(node: U): U; 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-class-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitClassDeclaration(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.ClassDeclaration { 8 | const {node, factory, typescript} = options; 9 | if (!hasDeclareModifier(node, typescript)) return node; 10 | 11 | const modifierLikes = removeDeclareModifier(getModifierLikes(node), typescript); 12 | 13 | return preserveMeta(factory.updateClassDeclaration(node, modifierLikes, node.name, node.typeParameters, node.heritageClauses, node.members), node, options); 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-class-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitClassExpression(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.ClassExpression { 8 | const {node, factory, typescript} = options; 9 | if (!hasDeclareModifier(node, typescript)) return node; 10 | 11 | const modifierLikes = removeDeclareModifier(getModifierLikes(node), typescript); 12 | 13 | return preserveMeta(factory.updateClassExpression(node, modifierLikes, node.name, node.typeParameters, node.heritageClauses, node.members), node, options); 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-enum-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitEnumDeclaration(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.EnumDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateEnumDeclaration(node, removeDeclareModifier(node.modifiers, typescript), node.name, node.members), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-function-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitFunctionDeclaration(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.FunctionDeclaration { 8 | const {node, factory, typescript} = options; 9 | if (!hasDeclareModifier(node, typescript)) return node; 10 | 11 | const modifierLikes = removeDeclareModifier(getModifierLikes(node), typescript); 12 | 13 | return preserveMeta( 14 | factory.updateFunctionDeclaration(node, modifierLikes, node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, node.body), 15 | node, 16 | options 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-function-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitFunctionExpression(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.FunctionExpression { 7 | const {node, factory, typescript} = options; 8 | if (!hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta( 11 | factory.updateFunctionExpression( 12 | node, 13 | removeDeclareModifier(node.modifiers, typescript), 14 | node.asteriskToken, 15 | node.name, 16 | node.typeParameters, 17 | node.parameters, 18 | node.type, 19 | node.body 20 | ), 21 | node, 22 | options 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-interface-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitInterfaceDeclaration(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.InterfaceDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta( 11 | factory.updateInterfaceDeclaration(node, removeDeclareModifier(node.modifiers, typescript), node.name, node.typeParameters, node.heritageClauses, node.members), 12 | node, 13 | options 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitModuleDeclaration(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.ModuleDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateModuleDeclaration(node, removeDeclareModifier(node.modifiers, typescript), node.name, node.body), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-type-alias-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitTypeAliasDeclaration(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.TypeAliasDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateTypeAliasDeclaration(node, removeDeclareModifier(node.modifiers, typescript), node.name, node.typeParameters, node.type), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-declare-modifier-transformer/visitor/visit-variable-statement.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoDeclareModifierTransformerVisitorOptions} from "../ensure-no-declare-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasDeclareModifier, removeDeclareModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitVariableStatement(options: EnsureNoDeclareModifierTransformerVisitorOptions): TS.VariableStatement { 7 | const {node, factory, typescript} = options; 8 | if (!hasDeclareModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateVariableStatement(node, removeDeclareModifier(node.modifiers, typescript), node.declarationList), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/ensure-no-export-modifier-transformer-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | 4 | export interface EnsureNoExportModifierTransformerVisitorOptions extends SourceFileBundlerVisitorOptions { 5 | typescript: typeof TS; 6 | node: T; 7 | 8 | childContinuation(node: U): U; 9 | continuation(node: U): U; 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-class-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitClassDeclaration(options: EnsureNoExportModifierTransformerVisitorOptions): TS.ClassDeclaration { 8 | const {node, factory, typescript} = options; 9 | if (!hasExportModifier(node, typescript)) return node; 10 | const modifierLikes = removeExportModifier(getModifierLikes(node), typescript); 11 | return preserveMeta(factory.updateClassDeclaration(node, modifierLikes, node.name, node.typeParameters, node.heritageClauses, node.members), node, options); 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-class-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitClassExpression(options: EnsureNoExportModifierTransformerVisitorOptions): TS.ClassExpression { 8 | const {node, factory, typescript} = options; 9 | if (!hasExportModifier(node, typescript)) return node; 10 | 11 | const modifierLikes = removeExportModifier(getModifierLikes(node), typescript); 12 | 13 | return preserveMeta(factory.updateClassExpression(node, modifierLikes, node.name, node.typeParameters, node.heritageClauses, node.members), node, options); 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-enum-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitEnumDeclaration(options: EnsureNoExportModifierTransformerVisitorOptions): TS.EnumDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasExportModifier(node, typescript)) return node; 9 | return preserveMeta(factory.updateEnumDeclaration(node, removeExportModifier(node.modifiers, typescript), node.name, node.members), node, options); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-function-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | import {getModifierLikes} from "../../../util/node-util.js"; 6 | 7 | export function visitFunctionDeclaration(options: EnsureNoExportModifierTransformerVisitorOptions): TS.FunctionDeclaration { 8 | const {node, factory, typescript} = options; 9 | if (!hasExportModifier(node, typescript)) return node; 10 | 11 | const modifierLikes = removeExportModifier(getModifierLikes(node), typescript); 12 | 13 | return preserveMeta( 14 | factory.updateFunctionDeclaration(node, modifierLikes, node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, node.body), 15 | node, 16 | options 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-function-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitFunctionExpression(options: EnsureNoExportModifierTransformerVisitorOptions): TS.FunctionExpression { 7 | const {node, factory, typescript} = options; 8 | if (!hasExportModifier(node, typescript)) return node; 9 | 10 | return preserveMeta( 11 | factory.updateFunctionExpression( 12 | node, 13 | removeExportModifier(node.modifiers, typescript), 14 | node.asteriskToken, 15 | node.name, 16 | node.typeParameters, 17 | node.parameters, 18 | node.type, 19 | node.body 20 | ), 21 | node, 22 | options 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-interface-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitInterfaceDeclaration(options: EnsureNoExportModifierTransformerVisitorOptions): TS.InterfaceDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasExportModifier(node, typescript)) return node; 9 | 10 | return preserveMeta( 11 | factory.updateInterfaceDeclaration(node, removeExportModifier(node.modifiers, typescript), node.name, node.typeParameters, node.heritageClauses, node.members), 12 | node, 13 | options 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitModuleDeclaration(options: EnsureNoExportModifierTransformerVisitorOptions): TS.ModuleDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasExportModifier(node, typescript)) return node; 9 | return preserveMeta(factory.updateModuleDeclaration(node, removeExportModifier(node.modifiers, typescript), node.name, node.body), node, options); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-type-alias-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitTypeAliasDeclaration(options: EnsureNoExportModifierTransformerVisitorOptions): TS.TypeAliasDeclaration { 7 | const {node, factory, typescript} = options; 8 | if (!hasExportModifier(node, typescript)) return node; 9 | return preserveMeta(factory.updateTypeAliasDeclaration(node, removeExportModifier(node.modifiers, typescript), node.name, node.typeParameters, node.type), node, options); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/ensure-no-export-modifier-transformer/visitor/visit-variable-statement.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {EnsureNoExportModifierTransformerVisitorOptions} from "../ensure-no-export-modifier-transformer-visitor-options.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | import {hasExportModifier, removeExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitVariableStatement(options: EnsureNoExportModifierTransformerVisitorOptions): TS.VariableStatement { 7 | const {node, factory, typescript} = options; 8 | if (!hasExportModifier(node, typescript)) return node; 9 | 10 | return preserveMeta(factory.updateVariableStatement(node, removeExportModifier(node.modifiers, typescript), node.declarationList), node, options); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/inline-namespace-module-block-transformer/inline-namespace-module-block-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | 3 | export interface InlineNamespaceModuleBlockOptions { 4 | intentToAddImportDeclaration(importDeclaration: TS.ImportDeclaration): void; 5 | intentToAddModuleDeclaration(moduleDeclaration: TS.ModuleDeclaration): void; 6 | } 7 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/inline-namespace-module-block-transformer/inline-namespace-module-block-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | import type {InlineNamespaceModuleBlockOptions} from "./inline-namespace-module-block-options.js"; 4 | 5 | export interface InlineNamespaceModuleBlockVisitorOptions extends SourceFileBundlerVisitorOptions, InlineNamespaceModuleBlockOptions { 6 | typescript: typeof TS; 7 | node: T; 8 | 9 | childContinuation(node: U): U; 10 | continuation(node: U): U; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/inline-namespace-module-block-transformer/visitor/visit-import-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {InlineNamespaceModuleBlockVisitorOptions} from "../inline-namespace-module-block-visitor-options.js"; 3 | import {cloneNodeWithMeta} from "../../../util/clone-node-with-meta.js"; 4 | 5 | export function visitImportDeclaration(options: InlineNamespaceModuleBlockVisitorOptions): undefined { 6 | const {node, intentToAddImportDeclaration} = options; 7 | intentToAddImportDeclaration(cloneNodeWithMeta(node, options)); 8 | 9 | return undefined; 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/inline-namespace-module-block-transformer/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {InlineNamespaceModuleBlockVisitorOptions} from "../inline-namespace-module-block-visitor-options.js"; 3 | import {cloneNodeWithMeta} from "../../../util/clone-node-with-meta.js"; 4 | 5 | export function visitModuleDeclaration(options: InlineNamespaceModuleBlockVisitorOptions): undefined { 6 | const {node, intentToAddModuleDeclaration} = options; 7 | intentToAddModuleDeclaration(cloneNodeWithMeta(node, options)); 8 | 9 | return undefined; 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/inline-namespace-module-block-transformer/visitor/visit-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {InlineNamespaceModuleBlockVisitorOptions} from "../inline-namespace-module-block-visitor-options.js"; 3 | import {visitImportDeclaration} from "./visit-import-declaration.js"; 4 | import {visitExportDeclaration} from "./visit-export-declaration.js"; 5 | import {visitModuleDeclaration} from "./visit-module-declaration.js"; 6 | 7 | export function visitNode({node, ...options}: InlineNamespaceModuleBlockVisitorOptions): TS.Node | undefined { 8 | if (options.typescript.isImportDeclaration(node)) { 9 | return visitImportDeclaration({...options, node}); 10 | } else if (options.typescript.isExportDeclaration(node)) { 11 | return visitExportDeclaration({...options, node}); 12 | } else if (options.typescript.isModuleDeclaration(node)) { 13 | return visitModuleDeclaration({...options, node}); 14 | } else { 15 | // Only consider root-level statements here 16 | return node; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/module-block-extractor/module-block-extractor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {TypescriptPluginOptions} from "../../../../../plugin/typescript-plugin-options.js"; 3 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 4 | 5 | export interface ModuleBlockExtractorOptions extends SourceFileBundlerVisitorOptions { 6 | typescript: typeof TS; 7 | context: TS.TransformationContext; 8 | pluginOptions: TypescriptPluginOptions; 9 | printer: TS.Printer; 10 | sourceFile: TS.SourceFile; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/module-block-extractor/module-block-extractor-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | 4 | export interface ModuleBlockExtractorVisitorOptions extends SourceFileBundlerVisitorOptions { 5 | typescript: typeof TS; 6 | node: T; 7 | context: TS.TransformationContext; 8 | 9 | continuation(node: U): TS.VisitResult | undefined; 10 | childContinuation(node: U): TS.VisitResult; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/module-block-extractor/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ModuleBlockExtractorVisitorOptions} from "../module-block-extractor-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitModuleDeclaration({node, typescript}: ModuleBlockExtractorVisitorOptions): TS.VisitResult | undefined { 5 | if (node.body == null) return undefined; 6 | if (typescript.isModuleBlock(node.body) && typescript.isStringLiteralLike(node.name)) { 7 | return [...node.body.statements]; 8 | } 9 | 10 | return node; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/module-block-extractor/visitor/visit-node.ts: -------------------------------------------------------------------------------- 1 | import {visitModuleDeclaration} from "./visit-module-declaration.js"; 2 | import type {ModuleBlockExtractorVisitorOptions} from "../module-block-extractor-visitor-options.js"; 3 | import type {TS} from "../../../../../../type/ts.js"; 4 | 5 | export function visitNode({node, ...options}: ModuleBlockExtractorVisitorOptions): TS.Node | TS.Node[] | readonly TS.Node[] | undefined { 6 | if (options.typescript.isModuleDeclaration(node)) { 7 | return visitModuleDeclaration({...options, node}); 8 | } else { 9 | return options.childContinuation(node); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/module-merger/util/is-root-level-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import {isArray} from "../../../../../../util/object/object-util.js"; 3 | import {isStatement} from "../../../util/is-statement.js"; 4 | 5 | export function isRootLevelNode(node: TS.VisitResult, typescript: typeof TS): node is TS.Statement { 6 | return ( 7 | node != null && 8 | !isArray(node) && 9 | (typescript.isClassDeclaration(node) || 10 | typescript.isClassExpression(node) || 11 | typescript.isEnumDeclaration(node) || 12 | typescript.isExportDeclaration(node) || 13 | typescript.isExportAssignment(node) || 14 | typescript.isFunctionDeclaration(node) || 15 | typescript.isFunctionExpression(node) || 16 | typescript.isExpressionStatement(node) || 17 | typescript.isImportDeclaration(node) || 18 | typescript.isImportEqualsDeclaration(node) || 19 | typescript.isInterfaceDeclaration(node) || 20 | typescript.isModuleDeclaration(node) || 21 | typescript.isTypeAliasDeclaration(node) || 22 | typescript.isVariableStatement(node) || 23 | isStatement(node, typescript)) 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/module-merger/visitor/visit-source-file.ts: -------------------------------------------------------------------------------- 1 | import type {ModuleMergerVisitorOptions, VisitResult} from "../module-merger-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitSourceFile(options: ModuleMergerVisitorOptions): VisitResult { 5 | for (const otherEntrySourceFileForChunk of options.otherEntrySourceFilesForChunk) { 6 | options.prependNodes(...options.includeSourceFile(otherEntrySourceFileForChunk, {allowExports: true})); 7 | } 8 | 9 | return options.childContinuation(options.node, undefined); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/no-export-declaration-transformer/no-export-declaration-transformer-options.ts: -------------------------------------------------------------------------------- 1 | export interface NoExportDeclarationTransformerOptions { 2 | preserveAliasedExports: boolean; 3 | preserveExportsWithModuleSpecifiers: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/no-export-declaration-transformer/no-export-declaration-transformer-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {NodePlacementQueue} from "../../util/get-node-placement-queue.js"; 3 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 4 | import type {NoExportDeclarationTransformerOptions} from "./no-export-declaration-transformer-options.js"; 5 | 6 | export interface NoExportDeclarationTransformerVisitorOptions 7 | extends NoExportDeclarationTransformerOptions, 8 | SourceFileBundlerVisitorOptions, 9 | NodePlacementQueue { 10 | typescript: typeof TS; 11 | node: T; 12 | 13 | childContinuation(node: U): U; 14 | continuation(node: U): U; 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/no-export-declaration-transformer/visitor/visit-export-assignment.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {NoExportDeclarationTransformerVisitorOptions} from "../no-export-declaration-transformer-visitor-options.js"; 3 | 4 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 5 | export function visitExportAssignment(_options: NoExportDeclarationTransformerVisitorOptions): undefined { 6 | return undefined; 7 | } 8 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/no-export-declaration-transformer/visitor/visit-export-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {NoExportDeclarationTransformerVisitorOptions} from "../no-export-declaration-transformer-visitor-options.js"; 3 | 4 | export function visitExportDeclaration(options: NoExportDeclarationTransformerVisitorOptions): TS.ExportDeclaration | undefined { 5 | const {node, typescript, preserveExportsWithModuleSpecifiers, preserveAliasedExports} = options; 6 | if (preserveExportsWithModuleSpecifiers && node.moduleSpecifier != null) { 7 | return node; 8 | } 9 | const isNamespaceExport = typescript.isNamespaceExport == null ? (_: TS.Node): _ is TS.NamespaceExport => false : typescript.isNamespaceExport; 10 | 11 | if (preserveAliasedExports && node.exportClause != null && (isNamespaceExport(node.exportClause) || node.exportClause.elements.some(element => element.propertyName != null))) { 12 | return node; 13 | } 14 | 15 | return undefined; 16 | } 17 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/no-export-declaration-transformer/visitor/visit-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {NoExportDeclarationTransformerVisitorOptions} from "../no-export-declaration-transformer-visitor-options.js"; 3 | import {visitExportDeclaration} from "./visit-export-declaration.js"; 4 | import {visitExportAssignment} from "./visit-export-assignment.js"; 5 | 6 | export function visitNode({node, ...options}: NoExportDeclarationTransformerVisitorOptions): TS.Node | undefined { 7 | if (options.typescript.isExportDeclaration(node)) { 8 | return visitExportDeclaration({...options, node}); 9 | } else if (options.typescript.isExportAssignment(node)) { 10 | return visitExportAssignment({...options, node}); 11 | } else { 12 | // Preserve the node 13 | return node; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/cache/reference-cache.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | 3 | export type ReferenceCache = WeakMap; 4 | export type NodeToReferencedIdentifiersCache = Map>; 5 | export type SourceFileToNodeToReferencedIdentifiersCache = Map; 6 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/is-referenced-options.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceCache, SourceFileToNodeToReferencedIdentifiersCache} from "../cache/reference-cache.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import type {GetIdentifiersWithCacheOptions} from "../../trace-identifiers/trace-identifiers.js"; 4 | 5 | export interface IsReferencedOptions extends GetIdentifiersWithCacheOptions { 6 | referenceCache: ReferenceCache; 7 | sourceFileToNodeToReferencedIdentifiersCache: SourceFileToNodeToReferencedIdentifiersCache; 8 | seenNodes?: Set; 9 | node: T; 10 | referencedNode?: TS.Node; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/reference-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {VisitorOptions} from "./visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export interface ReferenceVisitorOptions extends VisitorOptions { 5 | continuation(node: U): string[]; 6 | childContinuation(node: U): string[]; 7 | markIdentifiersAsReferenced(fromNode: TS.Node, ...identifiers: string[]): void; 8 | } 9 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {IsReferencedOptions} from "./is-referenced-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export interface VisitorOptions extends IsReferencedOptions { 5 | originalNode: TS.Node; 6 | } 7 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-array-binding-pattern.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkArrayBindingPattern({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | for (const element of node.elements) { 8 | referencedIdentifiers.push(...continuation(element)); 9 | } 10 | 11 | return referencedIdentifiers; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-binding-element.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkBindingElement({node, continuation, typescript}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (!typescript.isIdentifier(node.name)) { 8 | referencedIdentifiers.push(...continuation(node.name)); 9 | } 10 | 11 | if (node.initializer != null) { 12 | referencedIdentifiers.push(...continuation(node.initializer)); 13 | } 14 | 15 | if (node.propertyName != null && !typescript.isIdentifier(node.propertyName)) { 16 | referencedIdentifiers.push(...continuation(node.propertyName)); 17 | } 18 | return referencedIdentifiers; 19 | } 20 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-class-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkClassDeclaration({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | if (node.heritageClauses != null) { 7 | for (const heritageClause of node.heritageClauses) { 8 | referencedIdentifiers.push(...continuation(heritageClause)); 9 | } 10 | } 11 | 12 | if (node.typeParameters != null) { 13 | for (const typeParameter of node.typeParameters) { 14 | referencedIdentifiers.push(...continuation(typeParameter)); 15 | } 16 | } 17 | 18 | for (const member of node.members) { 19 | referencedIdentifiers.push(...continuation(member)); 20 | } 21 | 22 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 23 | return referencedIdentifiers; 24 | } 25 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-class-expression.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkClassExpression({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | if (node.heritageClauses != null) { 7 | for (const heritageClause of node.heritageClauses) { 8 | referencedIdentifiers.push(...continuation(heritageClause)); 9 | } 10 | } 11 | 12 | if (node.typeParameters != null) { 13 | for (const typeParameter of node.typeParameters) { 14 | referencedIdentifiers.push(...continuation(typeParameter)); 15 | } 16 | } 17 | 18 | for (const member of node.members) { 19 | referencedIdentifiers.push(...continuation(member)); 20 | } 21 | 22 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 23 | return referencedIdentifiers; 24 | } 25 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-enum-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkEnumDeclaration({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | for (const member of node.members) { 8 | referencedIdentifiers.push(...continuation(member)); 9 | } 10 | 11 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 12 | return referencedIdentifiers; 13 | } 14 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-export-assignment.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkExportAssignment({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers = continuation(node.expression); 6 | 7 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 8 | return referencedIdentifiers; 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-export-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkExportDeclaration({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | if (node.exportClause != null) { 7 | referencedIdentifiers.push(...continuation(node.exportClause)); 8 | } 9 | 10 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 11 | return referencedIdentifiers; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-export-specifier.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkExportSpecifier({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | if (node.propertyName != null) { 7 | referencedIdentifiers.push(...continuation(node.propertyName)); 8 | } else if (node.propertyName == null) { 9 | referencedIdentifiers.push(...continuation(node.name)); 10 | } 11 | 12 | return referencedIdentifiers; 13 | } 14 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-function-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkFunctionDeclaration({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | for (const parameter of node.parameters) { 7 | referencedIdentifiers.push(...continuation(parameter)); 8 | } 9 | 10 | if (node.typeParameters != null) { 11 | for (const typeParameter of node.typeParameters) { 12 | referencedIdentifiers.push(...continuation(typeParameter)); 13 | } 14 | } 15 | 16 | if (node.body != null) { 17 | referencedIdentifiers.push(...continuation(node.body)); 18 | } 19 | 20 | if (node.type != null) { 21 | referencedIdentifiers.push(...continuation(node.type)); 22 | } 23 | 24 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 25 | return referencedIdentifiers; 26 | } 27 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-function-expression.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkFunctionExpression({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | for (const parameter of node.parameters) { 7 | referencedIdentifiers.push(...continuation(parameter)); 8 | } 9 | 10 | if (node.typeParameters != null) { 11 | for (const typeParameter of node.typeParameters) { 12 | referencedIdentifiers.push(...continuation(typeParameter)); 13 | } 14 | } 15 | 16 | if (node.body != null) { 17 | referencedIdentifiers.push(...continuation(node.body)); 18 | } 19 | 20 | if (node.type != null) { 21 | referencedIdentifiers.push(...continuation(node.type)); 22 | } 23 | 24 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 25 | return referencedIdentifiers; 26 | } 27 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-get-accessor-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkGetAccessorDeclaration({node, continuation, typescript}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (!typescript.isIdentifier(node.name)) { 8 | referencedIdentifiers.push(...continuation(node.name)); 9 | } 10 | for (const parameter of node.parameters) { 11 | referencedIdentifiers.push(...continuation(parameter)); 12 | } 13 | 14 | if (node.typeParameters != null) { 15 | for (const typeParameter of node.typeParameters) { 16 | referencedIdentifiers.push(...continuation(typeParameter)); 17 | } 18 | } 19 | 20 | if (node.type != null) { 21 | referencedIdentifiers.push(...continuation(node.type)); 22 | } 23 | 24 | if (node.body != null) { 25 | referencedIdentifiers.push(...continuation(node.body)); 26 | } 27 | return referencedIdentifiers; 28 | } 29 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-identifier.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | import {isSymbolIdentifier} from "../../../../util/is-symbol-identifier.js"; 4 | 5 | export function checkIdentifier({node, typescript}: ReferenceVisitorOptions): string[] { 6 | return isSymbolIdentifier(node, typescript) ? [node.text.slice(1, -1)] : [(node as TS.Identifier).text]; 7 | } 8 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-import-equals-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkImportEqualsDeclaration({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | if (node.moduleReference != null) { 7 | referencedIdentifiers.push(...continuation(node.moduleReference)); 8 | } 9 | 10 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 11 | return referencedIdentifiers; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-indexed-access-type-node.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkIndexedAccessTypeNode({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | referencedIdentifiers.push(...continuation(node.indexType)); 8 | referencedIdentifiers.push(...continuation(node.objectType)); 9 | return referencedIdentifiers; 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-interface-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkInterfaceDeclaration({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | if (node.heritageClauses != null) { 7 | for (const heritageClause of node.heritageClauses) { 8 | referencedIdentifiers.push(...continuation(heritageClause)); 9 | } 10 | } 11 | 12 | if (node.typeParameters != null) { 13 | for (const typeParameter of node.typeParameters) { 14 | referencedIdentifiers.push(...continuation(typeParameter)); 15 | } 16 | } 17 | 18 | for (const member of node.members) { 19 | referencedIdentifiers.push(...continuation(member)); 20 | } 21 | 22 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 23 | return referencedIdentifiers; 24 | } 25 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-method-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkMethodDeclaration({node, continuation, typescript}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (!typescript.isIdentifier(node.name)) { 8 | referencedIdentifiers.push(...continuation(node.name)); 9 | } 10 | for (const parameter of node.parameters) { 11 | referencedIdentifiers.push(...continuation(parameter)); 12 | } 13 | 14 | if (node.typeParameters != null) { 15 | for (const typeParameter of node.typeParameters) { 16 | referencedIdentifiers.push(...continuation(typeParameter)); 17 | } 18 | } 19 | 20 | if (node.type != null) { 21 | referencedIdentifiers.push(...continuation(node.type)); 22 | } 23 | 24 | if (node.body != null) { 25 | referencedIdentifiers.push(...continuation(node.body)); 26 | } 27 | 28 | return referencedIdentifiers; 29 | } 30 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-method-signature.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | import {isSymbolIdentifier} from "../../../../util/is-symbol-identifier.js"; 4 | 5 | export function checkMethodSignature({node, continuation, typescript}: ReferenceVisitorOptions): string[] { 6 | const referencedIdentifiers: string[] = []; 7 | 8 | if (!typescript.isIdentifier(node.name) || isSymbolIdentifier(node.name, typescript)) { 9 | referencedIdentifiers.push(...continuation(node.name)); 10 | } 11 | for (const parameter of node.parameters) { 12 | referencedIdentifiers.push(...continuation(parameter)); 13 | } 14 | 15 | if (node.typeParameters != null) { 16 | for (const typeParameter of node.typeParameters) { 17 | referencedIdentifiers.push(...continuation(typeParameter)); 18 | } 19 | } 20 | 21 | if (node.type != null) { 22 | referencedIdentifiers.push(...continuation(node.type)); 23 | } 24 | 25 | return referencedIdentifiers; 26 | } 27 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkModuleDeclaration({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | if (node.body != null) { 7 | referencedIdentifiers.push(...continuation(node.body)); 8 | } 9 | 10 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 11 | return referencedIdentifiers; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-object-binding-pattern.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkObjectBindingPattern({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | for (const element of node.elements) { 8 | referencedIdentifiers.push(...continuation(element)); 9 | } 10 | 11 | return referencedIdentifiers; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-parameter-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkParameterDeclaration({node, continuation, typescript}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (!typescript.isIdentifier(node.name)) { 8 | referencedIdentifiers.push(...continuation(node.name)); 9 | } 10 | 11 | if (node.type != null) { 12 | referencedIdentifiers.push(...continuation(node.type)); 13 | } 14 | 15 | if (node.initializer != null) { 16 | referencedIdentifiers.push(...continuation(node.initializer)); 17 | } 18 | 19 | return referencedIdentifiers; 20 | } 21 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-property-access-expression.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkPropertyAccessExpression({node, continuation}: ReferenceVisitorOptions): string[] { 5 | return continuation(node.expression); 6 | } 7 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-property-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkPropertyDeclaration({node, continuation, typescript}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (!typescript.isIdentifier(node.name)) { 8 | referencedIdentifiers.push(...continuation(node.name)); 9 | } 10 | 11 | if (node.type != null) { 12 | referencedIdentifiers.push(...continuation(node.type)); 13 | } 14 | 15 | if (node.initializer != null) { 16 | referencedIdentifiers.push(...continuation(node.initializer)); 17 | } 18 | 19 | return referencedIdentifiers; 20 | } 21 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-property-signature.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable deprecation/deprecation */ 2 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 3 | import type {TS} from "../../../../../../../type/ts.js"; 4 | import {isSymbolIdentifier} from "../../../../util/is-symbol-identifier.js"; 5 | 6 | export function checkPropertySignature({node, continuation, typescript}: ReferenceVisitorOptions): string[] { 7 | const referencedIdentifiers: string[] = []; 8 | 9 | if (!typescript.isIdentifier(node.name) || isSymbolIdentifier(node.name, typescript)) { 10 | referencedIdentifiers.push(...continuation(node.name)); 11 | } 12 | 13 | if (node.type != null) { 14 | referencedIdentifiers.push(...continuation(node.type)); 15 | } 16 | return referencedIdentifiers; 17 | } 18 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-qualified-name.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkQualifiedName({node, continuation}: ReferenceVisitorOptions): string[] { 5 | return continuation(node.left); 6 | } 7 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-set-accessor-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkSetAccessorDeclaration({node, continuation, typescript}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (!typescript.isIdentifier(node.name)) { 8 | referencedIdentifiers.push(...continuation(node.name)); 9 | } 10 | for (const parameter of node.parameters) { 11 | referencedIdentifiers.push(...continuation(parameter)); 12 | } 13 | 14 | if (node.typeParameters != null) { 15 | for (const typeParameter of node.typeParameters) { 16 | referencedIdentifiers.push(...continuation(typeParameter)); 17 | } 18 | } 19 | 20 | if (node.type != null) { 21 | referencedIdentifiers.push(...continuation(node.type)); 22 | } 23 | 24 | if (node.body != null) { 25 | referencedIdentifiers.push(...continuation(node.body)); 26 | } 27 | 28 | return referencedIdentifiers; 29 | } 30 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-template-literal-type-node.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkTemplateLiteralTypeNode({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (node.head != null) { 8 | referencedIdentifiers.push(...continuation(node.head)); 9 | } 10 | 11 | if (node.templateSpans != null) { 12 | for (const templateSpan of node.templateSpans) { 13 | referencedIdentifiers.push(...continuation(templateSpan)); 14 | } 15 | } 16 | 17 | return referencedIdentifiers; 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-template-literal-type-span.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkTemplateLiteralTypeSpan({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (node.type != null) { 8 | referencedIdentifiers.push(...continuation(node.type)); 9 | } 10 | 11 | return referencedIdentifiers; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-type-alias-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkTypeAliasDeclaration({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (node.typeParameters != null) { 8 | for (const typeParameter of node.typeParameters) { 9 | referencedIdentifiers.push(...continuation(typeParameter)); 10 | } 11 | } 12 | 13 | referencedIdentifiers.push(...continuation(node.type)); 14 | 15 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 16 | return referencedIdentifiers; 17 | } 18 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-type-reference-node.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkTypeReferenceNode({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | if (node.typeName != null) { 8 | referencedIdentifiers.push(...continuation(node.typeName)); 9 | } 10 | 11 | if (node.typeArguments != null) { 12 | for (const typeArgument of node.typeArguments) { 13 | referencedIdentifiers.push(...continuation(typeArgument)); 14 | } 15 | } 16 | 17 | return referencedIdentifiers; 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-variable-declaration-list.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkVariableDeclarationList({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | 7 | for (const declaration of node.declarations) { 8 | referencedIdentifiers.push(...continuation(declaration)); 9 | } 10 | 11 | return referencedIdentifiers; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-variable-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkVariableDeclaration({node, continuation}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers: string[] = []; 6 | if (node.initializer != null) { 7 | referencedIdentifiers.push(...continuation(node.initializer)); 8 | } 9 | 10 | if (node.type != null) { 11 | referencedIdentifiers.push(...continuation(node.type)); 12 | } 13 | 14 | return referencedIdentifiers; 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/reference/is-referenced/visitor/check-variable-statement.ts: -------------------------------------------------------------------------------- 1 | import type {ReferenceVisitorOptions} from "../reference-visitor-options.js"; 2 | import type {TS} from "../../../../../../../type/ts.js"; 3 | 4 | export function checkVariableStatement({node, continuation, markIdentifiersAsReferenced}: ReferenceVisitorOptions): string[] { 5 | const referencedIdentifiers = continuation(node.declarationList); 6 | markIdentifiersAsReferenced(node, ...referencedIdentifiers); 7 | 8 | return referencedIdentifiers; 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/source-file-bundler/source-file-bundler-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {DeclarationBundlerOptions} from "../../declaration-bundler-options.js"; 3 | import type {LexicalEnvironment} from "../deconflicter/deconflicter-options.js"; 4 | import type {ImportedSymbol} from "../track-imports-transformer/track-imports-transformer-visitor-options.js"; 5 | import type {TransformerBaseOptions} from "../transformer-base-options.js"; 6 | 7 | export type SourceFileResolver = (fileName: string, from: string) => TS.SourceFile | undefined; 8 | 9 | export interface SourceFileBundlerVisitorOptions extends DeclarationBundlerOptions, TransformerBaseOptions { 10 | allowExports?: boolean | "skip-optional"; 11 | resolveSourceFile: SourceFileResolver; 12 | context: TS.TransformationContext; 13 | entrySourceFilesForChunk: TS.SourceFile[]; 14 | otherEntrySourceFilesForChunk: TS.SourceFile[]; 15 | lexicalEnvironment: LexicalEnvironment; 16 | includedSourceFiles: Set; 17 | 18 | // Declarations are represented by IDs which are mapped a string, indicating the deconflicted names for them 19 | declarationToDeconflictedBindingMap: Map; 20 | preservedImports: Map>; 21 | inlinedModules: Map; 22 | } 23 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/statement-merger/statement-merger-options.ts: -------------------------------------------------------------------------------- 1 | export interface StatementMergerOptions { 2 | // For files with no imports and exports, an empty 'export {}' can be added to mark the file as a module. 3 | // Setting this property to 'false' disables that behavior 4 | markAsModuleIfNeeded: boolean; 5 | } 6 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/statement-merger/statement-merger-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | 4 | export interface StatementMergerVisitorOptions extends SourceFileBundlerVisitorOptions { 5 | typescript: typeof TS; 6 | node: T; 7 | 8 | preserveImportedModuleIfNeeded(module: string): TS.ImportDeclaration[] | undefined; 9 | preserveExportedModuleIfNeeded(module: string | undefined, typeOnly: boolean): TS.ExportDeclaration[] | undefined; 10 | childContinuation(node: U): U | undefined; 11 | continuation(node: U): U | undefined; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/statement-merger/visitor/visit-export-assignment.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {StatementMergerVisitorOptions} from "../statement-merger-visitor-options.js"; 3 | 4 | export function visitExportAssignment( 5 | options: StatementMergerVisitorOptions 6 | ): TS.ExportDeclaration[] | TS.ExportDeclaration | TS.ExportAssignment | undefined { 7 | const {node, typescript} = options; 8 | 9 | // If the Expression isn't an identifier, leave the node as it is 10 | if (!typescript.isIdentifier(node.expression)) { 11 | return node; 12 | } 13 | 14 | // Otherwise, replace this ExportDeclaration with merged exports from the module 15 | return options.preserveExportedModuleIfNeeded(undefined, false); 16 | } 17 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/statement-merger/visitor/visit-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {StatementMergerVisitorOptions} from "../statement-merger-visitor-options.js"; 3 | import {visitImportDeclaration} from "./visit-import-declaration.js"; 4 | import {visitExportDeclaration} from "./visit-export-declaration.js"; 5 | import {visitExportAssignment} from "./visit-export-assignment.js"; 6 | 7 | export function visitNode({node, ...options}: StatementMergerVisitorOptions): TS.Node | TS.Node[] | undefined { 8 | if (options.typescript.isImportDeclaration(node)) { 9 | return visitImportDeclaration({...options, node}); 10 | } else if (options.typescript.isExportDeclaration(node)) { 11 | return visitExportDeclaration({...options, node}); 12 | } else if (options.typescript.isExportAssignment(node)) { 13 | return visitExportAssignment({...options, node}); 14 | } else { 15 | // Only consider root-level statements here 16 | return node; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/stats-collector/stats-collector-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {CompilerHost} from "../../../../compiler-host/compiler-host.js"; 3 | import type {PathsResult} from "../../util/prepare-paths/prepare-paths.js"; 4 | import type {TypeReference} from "../../util/get-type-reference-module-from-file-name.js"; 5 | 6 | export interface StatsCollectorOptions { 7 | typescript: typeof TS; 8 | sourceFile: TS.SourceFile; 9 | host: CompilerHost; 10 | declarationPaths: PathsResult; 11 | sourceFileToTypeReferencesSet: Map>; 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/stats-collector/stats-collector-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | 4 | export interface StatsCollectorVisitorOptions extends SourceFileBundlerVisitorOptions { 5 | typescript: typeof TS; 6 | node: T; 7 | 8 | trackImport(moduleSpecifier: string): void; 9 | childContinuation(node: U): void; 10 | continuation(node: U): U | void; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/to-export-declaration-transformer/to-export-declaration-transformer-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {NodePlacementQueue} from "../../util/get-node-placement-queue.js"; 3 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 4 | 5 | export interface ToExportDeclarationTransformerVisitorOptions extends SourceFileBundlerVisitorOptions, NodePlacementQueue { 6 | typescript: typeof TS; 7 | node: T; 8 | 9 | childContinuation(node: U): U; 10 | continuation(node: U): U; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/trace-identifiers-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | 3 | export interface TraceIdentifiersVisitorOptions { 4 | typescript: typeof TS; 5 | node: T; 6 | sourceFile: TS.SourceFile; 7 | 8 | addIdentifier(name: string): void; 9 | childContinuation(node: U): void; 10 | continuation(node: U): void; 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/trace-identifiers.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import {traceIdentifiersForNode} from "./visitor/trace-identifiers-for-node.js"; 3 | 4 | export interface GetIdentifiersWithCacheOptions { 5 | typescript: typeof TS; 6 | node: TS.Node; 7 | sourceFile: TS.SourceFile; 8 | } 9 | 10 | export function traceIdentifiers({node, ...rest}: GetIdentifiersWithCacheOptions, identifiers: Set = new Set()): Set { 11 | return getIdentifiers({...rest, node}, identifiers); 12 | } 13 | 14 | function getIdentifiers({node, ...rest}: GetIdentifiersWithCacheOptions, identifiers: Set): Set { 15 | traceIdentifiersForNode({ 16 | ...rest, 17 | node, 18 | continuation: nextNode => getIdentifiers({...rest, node: nextNode}, identifiers), 19 | childContinuation: nextNode => 20 | rest.typescript.forEachChild(nextNode, nextNextNode => { 21 | getIdentifiers({...rest, node: nextNextNode}, identifiers); 22 | }), 23 | addIdentifier(name: string): void { 24 | identifiers.add(name); 25 | } 26 | }); 27 | return identifiers; 28 | } 29 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-binding-element.ts: -------------------------------------------------------------------------------- 1 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | /** 5 | * Deconflicts the given BindingElement. 6 | */ 7 | export function traceIdentifiersForBindingElement({node, continuation}: TraceIdentifiersVisitorOptions): void { 8 | return continuation(node.name); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-call-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given CallExpression. 6 | */ 7 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 8 | export function traceIdentifiersForCallExpression(_options: TraceIdentifiersVisitorOptions): void { 9 | // Do nothing 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-class-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given ClassDeclaration. 6 | */ 7 | export function traceIdentifiersForClassDeclaration({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | if (node.name == null) return; 9 | addIdentifier(node.name.text); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-enum-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given EnumDeclaration. 6 | */ 7 | export function traceIdentifiersForEnumDeclaration({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | addIdentifier(node.name.text); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-export-assignment.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given ExportAssignment. 6 | */ 7 | export function traceIdentifiersForExportAssignment({node, continuation}: TraceIdentifiersVisitorOptions): void { 8 | continuation(node.expression); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-export-specifier.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given ExportSpecifier. 6 | */ 7 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 8 | export function traceIdentifiersForExportSpecifier(_options: TraceIdentifiersVisitorOptions): void { 9 | // An ExportSpecifier doesn't produce any local module bindings 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-function-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given FunctionDeclaration. 6 | */ 7 | export function traceIdentifiersForFunctionDeclaration({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | if (node.name == null) return; 9 | addIdentifier(node.name.text); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-identifier.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Deconflicts the given Identifier. 6 | */ 7 | export function traceIdentifiersForIdentifier({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | addIdentifier(node.text); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-import-clause.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given ImportClause. 6 | */ 7 | export function traceIdentifiersForImportClause({node, addIdentifier, continuation}: TraceIdentifiersVisitorOptions): void { 8 | if (node.name != null) { 9 | addIdentifier(node.name.text); 10 | } 11 | 12 | if (node.namedBindings != null) { 13 | return continuation(node.namedBindings); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-import-equals-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given ImportEqualsDeclaration. 6 | */ 7 | export function traceIdentifiersForImportEqualsDeclaration({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | addIdentifier(node.name.text); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-import-specifier.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given ImportSpecifier. 6 | */ 7 | export function traceIdentifiersForImportSpecifier({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | addIdentifier(node.name.text); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-interface-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given InterfaceDeclaration. 6 | */ 7 | export function traceIdentifiersForInterfaceDeclaration({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | addIdentifier(node.name.text); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-namespace-import.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given NamespaceImport. 6 | */ 7 | export function traceIdentifiersForNamespaceImport({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | if (node.name != null) { 9 | addIdentifier(node.name.text); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-new-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given NewExpression. 6 | */ 7 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 8 | export function traceIdentifiersForNewExpression(_options: TraceIdentifiersVisitorOptions): void { 9 | // Do nothing 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-type-alias-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Traces identifiers for the given TypeAliasDeclaration. 6 | */ 7 | export function traceIdentifiersForTypeAliasDeclaration({node, addIdentifier}: TraceIdentifiersVisitorOptions): void { 8 | if (node.name == null) return; 9 | 10 | addIdentifier(node.name.text); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/trace-identifiers/visitor/trace-identifiers-for-variable-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TraceIdentifiersVisitorOptions} from "../trace-identifiers-visitor-options.js"; 3 | 4 | /** 5 | * Deconflicts the given VariableDeclaration. 6 | */ 7 | export function traceIdentifiersForVariableDeclaration({node, continuation}: TraceIdentifiersVisitorOptions): void { 8 | continuation(node.name); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-dependencies-transformer/track-dependencies-transformer-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {CompilerHost} from "../../../../compiler-host/compiler-host.js"; 3 | import type {ModuleDependency} from "../../../../../util/get-module-dependencies/get-module-dependencies.js"; 4 | 5 | export interface TrackDependenciesOptions { 6 | host: CompilerHost; 7 | sourceFile: TS.SourceFile; 8 | } 9 | 10 | export interface TrackDependenciesTransformerVisitorOptions extends TrackDependenciesOptions { 11 | node: T; 12 | shouldDeepTraverse: boolean; 13 | typescript: typeof TS; 14 | 15 | childContinuation(node: U): void; 16 | continuation(node: U): void; 17 | addDependency(module: ModuleDependency): void; 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-dependencies-transformer/visitor/visit-export-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackDependenciesTransformerVisitorOptions} from "../track-dependencies-transformer-visitor-options.js"; 3 | 4 | export function visitExportDeclaration({node, typescript, host, sourceFile, addDependency}: TrackDependenciesTransformerVisitorOptions): void { 5 | if (node.moduleSpecifier == null || !typescript.isStringLiteralLike(node.moduleSpecifier)) return; 6 | 7 | const resolvedModule = host.resolve(node.moduleSpecifier.text, sourceFile.fileName); 8 | if (resolvedModule != null) { 9 | addDependency({ 10 | ...resolvedModule, 11 | moduleSpecifier: node.moduleSpecifier.text 12 | }); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-dependencies-transformer/visitor/visit-import-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackDependenciesTransformerVisitorOptions} from "../track-dependencies-transformer-visitor-options.js"; 3 | 4 | export function visitImportDeclaration({node, typescript, host, sourceFile, addDependency}: TrackDependenciesTransformerVisitorOptions): void { 5 | if (!typescript.isStringLiteralLike(node.moduleSpecifier)) return; 6 | const resolvedModule = host.resolve(node.moduleSpecifier.text, sourceFile.fileName); 7 | if (resolvedModule != null) { 8 | addDependency({ 9 | ...resolvedModule, 10 | moduleSpecifier: node.moduleSpecifier.text 11 | }); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-dependencies-transformer/visitor/visit-import-type-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackDependenciesTransformerVisitorOptions} from "../track-dependencies-transformer-visitor-options.js"; 3 | 4 | export function visitImportTypeNode({node, typescript, host, sourceFile, addDependency, continuation}: TrackDependenciesTransformerVisitorOptions): void { 5 | if (!typescript.isLiteralTypeNode(node.argument) || !typescript.isStringLiteralLike(node.argument.literal)) return; 6 | const moduleSpecifier = node.argument.literal.text; 7 | 8 | const resolvedModule = host.resolve(moduleSpecifier, sourceFile.fileName); 9 | 10 | if (resolvedModule != null) { 11 | addDependency({ 12 | ...resolvedModule, 13 | moduleSpecifier 14 | }); 15 | } 16 | 17 | if (node.qualifier != null) { 18 | continuation(node.qualifier); 19 | } 20 | 21 | if (node.typeArguments != null) { 22 | for (const typeArgument of node.typeArguments) { 23 | continuation(typeArgument); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-dependencies-transformer/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackDependenciesTransformerVisitorOptions} from "../track-dependencies-transformer-visitor-options.js"; 3 | 4 | export function visitModuleDeclaration({node, ...options}: TrackDependenciesTransformerVisitorOptions): void { 5 | if (node.body == null) return; 6 | return options.childContinuation(node.body); 7 | } 8 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-dependencies-transformer/visitor/visit-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackDependenciesTransformerVisitorOptions} from "../track-dependencies-transformer-visitor-options.js"; 3 | import {visitImportDeclaration} from "./visit-import-declaration.js"; 4 | import {visitImportTypeNode} from "./visit-import-type-node.js"; 5 | import {visitModuleDeclaration} from "./visit-module-declaration.js"; 6 | import {visitExportDeclaration} from "./visit-export-declaration.js"; 7 | 8 | export function visitNode({node, ...options}: TrackDependenciesTransformerVisitorOptions): void { 9 | if (options.typescript.isImportDeclaration(node)) { 10 | return visitImportDeclaration({...options, node}); 11 | } else if (options.typescript.isImportTypeNode(node)) { 12 | return visitImportTypeNode({...options, node}); 13 | } else if (options.typescript.isExportDeclaration(node)) { 14 | return visitExportDeclaration({...options, node}); 15 | } else if (options.typescript.isModuleDeclaration(node)) { 16 | return visitModuleDeclaration({...options, node}); 17 | } else if (options.shouldDeepTraverse) { 18 | return options.childContinuation(node); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/track-exports-transformer.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import {visitNode} from "./visitor/visit-node.js"; 3 | import type {ExportedSymbol, ExportedSymbolSet, TrackExportsOptions, TrackExportsTransformerVisitorOptions} from "./track-exports-transformer-visitor-options.js"; 4 | 5 | export function trackExportsTransformer(options: TrackExportsOptions): ExportedSymbolSet { 6 | const {typescript} = options; 7 | const exportedSymbolSet: ExportedSymbolSet = new Set(); 8 | 9 | // Prepare some VisitorOptions 10 | const visitorOptions: Omit, "node"> = { 11 | ...options, 12 | 13 | markAsExported(symbol: ExportedSymbol): void { 14 | exportedSymbolSet.add(symbol); 15 | }, 16 | 17 | childContinuation: (node: U): void => 18 | typescript.forEachChild(node, nextNode => { 19 | visitNode({ 20 | ...visitorOptions, 21 | node: nextNode 22 | }); 23 | }), 24 | 25 | continuation: (node: U): void => { 26 | visitNode({ 27 | ...visitorOptions, 28 | node 29 | }); 30 | } 31 | }; 32 | 33 | typescript.forEachChild(options.sourceFile, nextNode => { 34 | visitorOptions.continuation(nextNode); 35 | }); 36 | return exportedSymbolSet; 37 | } 38 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-class-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | import {getModifiers} from "../../../util/node-util.js"; 6 | 7 | export function visitClassDeclaration({node, typescript, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 8 | // If the node has no export modifier, leave it as it is 9 | if (!hasExportModifier(node, typescript) || node.name == null) return; 10 | 11 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 12 | ...options, 13 | name: node.name.text, 14 | modifiers: getModifiers(node, typescript), 15 | typescript 16 | }); 17 | 18 | // Also mark the node as exported so that we can track it later 19 | markAsExported(exportedSymbol); 20 | } 21 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-class-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | import {getModifiers} from "../../../util/node-util.js"; 6 | 7 | export function visitClassExpression({node, typescript, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 8 | // If the node has no export modifier, leave it as it is 9 | if (!hasExportModifier(node, typescript) || node.name == null) return; 10 | 11 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 12 | ...options, 13 | name: node.name.text, 14 | modifiers: getModifiers(node, typescript), 15 | typescript 16 | }); 17 | 18 | // Also mark the node as exported so that we can track it later 19 | markAsExported(exportedSymbol); 20 | } 21 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-enum-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitEnumDeclaration({node, typescript, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 7 | // If the node has no export modifier, leave it as it is 8 | if (!hasExportModifier(node, typescript)) return; 9 | 10 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 11 | ...options, 12 | name: node.name.text, 13 | modifiers: node.modifiers, 14 | typescript 15 | }); 16 | 17 | // Also mark the node as exported so that we can track it later 18 | markAsExported(exportedSymbol); 19 | } 20 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-export-assignment.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | 4 | export function visitExportAssignment(options: TrackExportsTransformerVisitorOptions): void { 5 | const {node, typescript, markAsExported} = options; 6 | const identifier = typescript.isIdentifier(node.expression) ? node.expression : undefined; 7 | 8 | if (identifier != null) { 9 | markAsExported({ 10 | isDefaultExport: true, 11 | isTypeOnly: false, 12 | moduleSpecifier: undefined, 13 | name: identifier, 14 | propertyName: identifier 15 | }); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-function-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitFunctionDeclaration({node, typescript, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 7 | // If the node has no export modifier, leave it as it is 8 | if (!hasExportModifier(node, typescript) || node.name == null) return; 9 | 10 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 11 | ...options, 12 | name: node.name.text, 13 | modifiers: node.modifiers, 14 | typescript 15 | }); 16 | 17 | // Also mark the node as exported so that we can track it later 18 | markAsExported(exportedSymbol); 19 | } 20 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-function-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitFunctionExpression({node, typescript, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 7 | // If the node has no export modifier, leave it as it is 8 | if (!hasExportModifier(node, typescript) || node.name == null) return; 9 | 10 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 11 | ...options, 12 | name: node.name.text, 13 | modifiers: node.modifiers, 14 | typescript 15 | }); 16 | 17 | // Also mark the node as exported so that we can track it later 18 | markAsExported(exportedSymbol); 19 | } 20 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-interface-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitInterfaceDeclaration({node, typescript, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 7 | // If the node has no export modifier, leave it as it is 8 | if (!hasExportModifier(node, typescript)) return; 9 | 10 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 11 | ...options, 12 | name: node.name.text, 13 | modifiers: node.modifiers, 14 | typescript 15 | }); 16 | 17 | // Also mark the node as exported so that we can track it later 18 | markAsExported(exportedSymbol); 19 | } 20 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitModuleDeclaration({node, typescript, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 7 | // If the node has no export modifier, leave it as it is 8 | if (!hasExportModifier(node, typescript)) { 9 | if (node.body != null) return options.childContinuation(node.body); 10 | else return; 11 | } 12 | 13 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 14 | ...options, 15 | name: node.name.text, 16 | modifiers: node.modifiers, 17 | typescript 18 | }); 19 | 20 | // Also mark the node as exported so that we can track it later 21 | markAsExported(exportedSymbol); 22 | } 23 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-type-alias-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | 6 | export function visitTypeAliasDeclaration({node, typescript, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 7 | // If the node has no export modifier, leave it as it is 8 | if (!hasExportModifier(node, typescript)) return; 9 | 10 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 11 | ...options, 12 | name: node.name.text, 13 | modifiers: node.modifiers, 14 | typescript 15 | }); 16 | 17 | // Also mark the node as exported so that we can track it later 18 | markAsExported(exportedSymbol); 19 | } 20 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-exports-transformer/visitor/visit-variable-statement.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackExportsTransformerVisitorOptions} from "../track-exports-transformer-visitor-options.js"; 3 | import {createExportSpecifierFromNameAndModifiers} from "../../../util/create-export-specifier-from-name-and-modifiers.js"; 4 | import {hasExportModifier} from "../../../util/modifier-util.js"; 5 | import {traceIdentifiers} from "../../trace-identifiers/trace-identifiers.js"; 6 | 7 | export function visitVariableStatement({node, typescript, sourceFile, markAsExported, ...options}: TrackExportsTransformerVisitorOptions): void { 8 | // If the node has no export modifier, leave it as it is 9 | if (!hasExportModifier(node, typescript)) return; 10 | 11 | const identifiers = traceIdentifiers({node, sourceFile, typescript}); 12 | 13 | for (const identifier of identifiers) { 14 | const {exportedSymbol} = createExportSpecifierFromNameAndModifiers({ 15 | ...options, 16 | name: identifier, 17 | modifiers: node.modifiers, 18 | typescript 19 | }); 20 | 21 | // Also mark the node as exported so that we can track it later 22 | markAsExported(exportedSymbol); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-imports-transformer/visitor/visit-import-type-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackImportsTransformerVisitorOptions} from "../track-imports-transformer-visitor-options.js"; 3 | 4 | export function visitImportTypeNode({node, typescript, markAsImported, continuation}: TrackImportsTransformerVisitorOptions): void { 5 | if (!typescript.isLiteralTypeNode(node.argument) || !typescript.isStringLiteralLike(node.argument.literal)) return; 6 | const moduleSpecifier = node.argument.literal.text; 7 | 8 | const name = 9 | node.qualifier == null ? undefined : typescript.isIdentifier(node.qualifier) ? node.qualifier : typescript.isIdentifier(node.qualifier.left) ? node.qualifier.left : undefined; 10 | if (name != null) { 11 | markAsImported({ 12 | name, 13 | moduleSpecifier, 14 | isDefaultImport: false, 15 | propertyName: name 16 | }); 17 | } else { 18 | markAsImported({ 19 | moduleSpecifier, 20 | isClauseLessImport: true 21 | }); 22 | } 23 | 24 | if (node.typeArguments != null) { 25 | for (const typeArgument of node.typeArguments) { 26 | continuation(typeArgument); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-imports-transformer/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackImportsTransformerVisitorOptions} from "../track-imports-transformer-visitor-options.js"; 3 | 4 | export function visitModuleDeclaration({node, ...options}: TrackImportsTransformerVisitorOptions): void { 5 | if (node.body == null) return; 6 | return options.childContinuation(node.body); 7 | } 8 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/track-imports-transformer/visitor/visit-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TrackImportsTransformerVisitorOptions} from "../track-imports-transformer-visitor-options.js"; 3 | import {visitImportDeclaration} from "./visit-import-declaration.js"; 4 | import {visitImportTypeNode} from "./visit-import-type-node.js"; 5 | import {visitModuleDeclaration} from "./visit-module-declaration.js"; 6 | 7 | export function visitNode({node, ...options}: TrackImportsTransformerVisitorOptions): void { 8 | if (options.typescript.isImportDeclaration(node)) { 9 | return visitImportDeclaration({...options, node}); 10 | } else if (options.typescript.isImportTypeNode(node)) { 11 | return visitImportTypeNode({...options, node}); 12 | } else if (options.typescript.isModuleDeclaration(node)) { 13 | return visitModuleDeclaration({...options, node}); 14 | } else if (options.shouldDeepTraverse) { 15 | return options.childContinuation(node); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/transformer-base-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../type/ts.js"; 2 | import type {SupportedExtensions} from "../../../../util/get-supported-extensions/get-supported-extensions.js"; 3 | 4 | export interface TransformerBaseOptions { 5 | sourceFile: TS.SourceFile; 6 | typescript: typeof TS; 7 | factory: TS.NodeFactory; 8 | extensions: SupportedExtensions; 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/tree-shaker-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | 4 | export interface TreeShakerVisitorOptions extends SourceFileBundlerVisitorOptions { 5 | typescript: typeof TS; 6 | node: T; 7 | sourceFile: TS.SourceFile; 8 | continuation(node: U): U | undefined; 9 | isReferenced(node: TS.Node): boolean; 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-array-binding-pattern.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitArrayBindingPattern({node, continuation, factory}: TreeShakerVisitorOptions): TS.ArrayBindingPattern | undefined { 5 | const filteredArrayBindingElements: TS.ArrayBindingElement[] = []; 6 | for (const arrayBindingElement of node.elements) { 7 | const arrayBindingElementContinuationResult = continuation(arrayBindingElement); 8 | 9 | if (arrayBindingElementContinuationResult != null) { 10 | filteredArrayBindingElements.push(arrayBindingElementContinuationResult); 11 | } 12 | } 13 | if (filteredArrayBindingElements.length < 1) { 14 | return undefined; 15 | } 16 | 17 | return factory.updateArrayBindingPattern(node, filteredArrayBindingElements); 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-binding-element.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitBindingElement({node, continuation, factory}: TreeShakerVisitorOptions): TS.BindingElement | undefined { 5 | const nameContinuationResult = continuation(node.name); 6 | if (nameContinuationResult == null) { 7 | return undefined; 8 | } 9 | 10 | return node.name === nameContinuationResult ? node : factory.updateBindingElement(node, node.dotDotDotToken, node.propertyName, nameContinuationResult, node.initializer); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-class-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {getModifierLikes} from "../../../util/node-util.js"; 4 | 5 | export function visitClassDeclaration({node, continuation, factory}: TreeShakerVisitorOptions): TS.ClassDeclaration | undefined { 6 | const nameContinuationResult = node.name == null ? undefined : continuation(node.name); 7 | if (nameContinuationResult == null) { 8 | return undefined; 9 | } 10 | 11 | const modifierLikes = getModifierLikes(node); 12 | return node.name === nameContinuationResult 13 | ? node 14 | : factory.updateClassDeclaration(node, modifierLikes, nameContinuationResult, node.typeParameters, node.heritageClauses, node.members); 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-class-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {getModifierLikes} from "../../../util/node-util.js"; 4 | 5 | export function visitClassExpression({node, continuation, factory}: TreeShakerVisitorOptions): TS.ClassExpression | undefined { 6 | const nameContinuationResult = node.name == null ? undefined : continuation(node.name); 7 | if (nameContinuationResult == null) { 8 | return undefined; 9 | } 10 | const modifierLikes = getModifierLikes(node); 11 | 12 | return node.name === nameContinuationResult 13 | ? node 14 | : factory.updateClassExpression(node, modifierLikes, nameContinuationResult, node.typeParameters, node.heritageClauses, node.members); 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-enum-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitEnumDeclaration({node, continuation, factory}: TreeShakerVisitorOptions): TS.EnumDeclaration | undefined { 5 | const nameContinuationResult = continuation(node.name); 6 | if (nameContinuationResult == null) { 7 | return undefined; 8 | } 9 | return node.name === nameContinuationResult ? node : factory.updateEnumDeclaration(node, node.modifiers, nameContinuationResult, node.members); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-export-assignment.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitExportAssignment({node}: TreeShakerVisitorOptions): TS.ExportAssignment | undefined { 5 | return node; 6 | } 7 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-export-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitExportDeclaration({node}: TreeShakerVisitorOptions): TS.ExportDeclaration | undefined { 5 | return node; 6 | } 7 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-function-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {getModifierLikes} from "../../../util/node-util.js"; 4 | 5 | export function visitFunctionDeclaration({node, continuation, factory}: TreeShakerVisitorOptions): TS.FunctionDeclaration | undefined { 6 | const nameContinuationResult = node.name == null ? undefined : continuation(node.name); 7 | if (nameContinuationResult == null) { 8 | return undefined; 9 | } 10 | return node.name === nameContinuationResult 11 | ? node 12 | : factory.updateFunctionDeclaration(node, getModifierLikes(node), node.asteriskToken, nameContinuationResult, node.typeParameters, node.parameters, node.type, node.body); 13 | } 14 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-function-expression.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitFunctionExpression({node, continuation, factory}: TreeShakerVisitorOptions): TS.FunctionExpression | undefined { 5 | const nameContinuationResult = node.name == null ? undefined : continuation(node.name); 6 | if (nameContinuationResult == null) { 7 | return undefined; 8 | } 9 | return node.name === nameContinuationResult 10 | ? node 11 | : factory.updateFunctionExpression(node, node.modifiers, node.asteriskToken, nameContinuationResult, node.typeParameters, node.parameters, node.type, node.body); 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-identifier.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitIdentifier({node, isReferenced}: TreeShakerVisitorOptions): TS.Identifier | undefined { 5 | if (node != null && isReferenced(node)) { 6 | return node; 7 | } 8 | return undefined; 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-import-clause.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitImportClause({node, continuation, factory}: TreeShakerVisitorOptions): TS.ImportClause | undefined { 5 | const namedBindingsContinuationResult = node.namedBindings == null ? undefined : continuation(node.namedBindings); 6 | const nameContinuationResult = node.name == null ? undefined : continuation(node.name); 7 | 8 | const removeNamedBindings = namedBindingsContinuationResult == null; 9 | const removeName = nameContinuationResult == null; 10 | 11 | if (removeNamedBindings && removeName) { 12 | return undefined; 13 | } 14 | 15 | return factory.updateImportClause(node, node.isTypeOnly, removeName ? undefined : node.name, removeNamedBindings ? undefined : namedBindingsContinuationResult); 16 | } 17 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-import-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitImportDeclaration({node, continuation, factory}: TreeShakerVisitorOptions): TS.ImportDeclaration | undefined { 5 | if (node.importClause == null) return undefined; 6 | const importClauseContinuationResult = continuation(node.importClause); 7 | 8 | if (importClauseContinuationResult == null) { 9 | return undefined; 10 | } 11 | 12 | return importClauseContinuationResult === node.importClause 13 | ? node 14 | : factory.updateImportDeclaration(node, node.modifiers, importClauseContinuationResult, node.moduleSpecifier, node.assertClause); 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-import-equals-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | 5 | export function visitImportEqualsDeclaration(options: TreeShakerVisitorOptions): TS.ImportEqualsDeclaration | undefined { 6 | const {node, continuation, factory} = options; 7 | const nameContinuationResult = node.name == null ? undefined : continuation(node.name); 8 | 9 | if (nameContinuationResult == null) { 10 | return undefined; 11 | } 12 | return node.name === nameContinuationResult 13 | ? node 14 | : preserveMeta(factory.updateImportEqualsDeclaration(node, node.modifiers, node.isTypeOnly, nameContinuationResult, node.moduleReference), node, options); 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-import-specifier.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitImportSpecifier({node, continuation, factory}: TreeShakerVisitorOptions): TS.ImportSpecifier | undefined { 5 | const nameContinuationResult = continuation(node.name); 6 | if (nameContinuationResult == null) { 7 | return undefined; 8 | } 9 | 10 | return node.name === nameContinuationResult ? node : factory.updateImportSpecifier(node, false, node.propertyName, nameContinuationResult); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-interface-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 4 | 5 | export function visitInterfaceDeclaration(options: TreeShakerVisitorOptions): TS.InterfaceDeclaration | undefined { 6 | const {node, continuation, factory} = options; 7 | const nameContinuationResult = continuation(node.name); 8 | if (nameContinuationResult == null) { 9 | return undefined; 10 | } 11 | return node.name === nameContinuationResult 12 | ? node 13 | : preserveMeta(factory.updateInterfaceDeclaration(node, node.modifiers, nameContinuationResult, node.typeParameters, node.heritageClauses, node.members), node, options); 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-module-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | import {isNodeInternalAlias} from "../../../util/node-util.js"; 4 | import {preserveMeta} from "../../../util/clone-node-with-meta.js"; 5 | 6 | export function visitModuleDeclaration(options: TreeShakerVisitorOptions): TS.ModuleDeclaration | undefined { 7 | const {node, continuation, factory, typescript} = options; 8 | 9 | if (!isNodeInternalAlias(node, typescript)) { 10 | return node; 11 | } 12 | 13 | const nameContinuationResult = continuation(node.name); 14 | if (nameContinuationResult == null) { 15 | return undefined; 16 | } 17 | return node.name === nameContinuationResult ? node : preserveMeta(factory.updateModuleDeclaration(node, node.modifiers, nameContinuationResult, node.body), node, options); 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-named-imports.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitNamedImports({node, continuation, factory}: TreeShakerVisitorOptions): TS.NamedImports | undefined { 5 | const filteredSpecifiers: TS.ImportSpecifier[] = []; 6 | for (const importSpecifier of node.elements) { 7 | const importSpecifierContinuationResult = continuation(importSpecifier); 8 | 9 | if (importSpecifierContinuationResult != null) { 10 | filteredSpecifiers.push(importSpecifierContinuationResult); 11 | } 12 | } 13 | if (filteredSpecifiers.length < 1) { 14 | return undefined; 15 | } 16 | 17 | return factory.updateNamedImports(node, filteredSpecifiers); 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-namespace-import.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitNamespaceImport({node, continuation, factory}: TreeShakerVisitorOptions): TS.NamespaceImport | undefined { 5 | const nameContinuationResult = continuation(node.name); 6 | if (nameContinuationResult == null) { 7 | return undefined; 8 | } 9 | return node.name === nameContinuationResult ? node : factory.updateNamespaceImport(node, nameContinuationResult); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-object-binding-pattern.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitObjectBindingPattern({node, continuation, factory}: TreeShakerVisitorOptions): TS.ObjectBindingPattern | undefined { 5 | const filteredObjectBindingElements: TS.BindingElement[] = []; 6 | for (const objectBindingElement of node.elements) { 7 | const objectBindingElementContinuationResult = continuation(objectBindingElement); 8 | 9 | if (objectBindingElementContinuationResult != null) { 10 | filteredObjectBindingElements.push(objectBindingElementContinuationResult); 11 | } 12 | } 13 | if (filteredObjectBindingElements.length < 1) { 14 | return undefined; 15 | } 16 | 17 | return factory.updateObjectBindingPattern(node, filteredObjectBindingElements); 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-type-alias-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitTypeAliasDeclaration({node, continuation, factory}: TreeShakerVisitorOptions): TS.TypeAliasDeclaration | undefined { 5 | const nameContinuationResult = continuation(node.name); 6 | if (nameContinuationResult == null) { 7 | return undefined; 8 | } 9 | return node.name === nameContinuationResult ? node : factory.updateTypeAliasDeclaration(node, node.modifiers, nameContinuationResult, node.typeParameters, node.type); 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-variable-declaration-list.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitVariableDeclarationList({node, continuation, factory}: TreeShakerVisitorOptions): TS.VariableDeclarationList | undefined { 5 | const filteredVariableDeclarations: TS.VariableDeclaration[] = []; 6 | for (const variableDeclaration of node.declarations) { 7 | const variableDeclarationContinuationResult = continuation(variableDeclaration); 8 | 9 | if (variableDeclarationContinuationResult != null) { 10 | filteredVariableDeclarations.push(variableDeclarationContinuationResult); 11 | } 12 | } 13 | if (filteredVariableDeclarations.length < 1) { 14 | return undefined; 15 | } 16 | 17 | return factory.updateVariableDeclarationList(node, filteredVariableDeclarations); 18 | } 19 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-variable-declaration.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitVariableDeclaration({node, continuation, factory}: TreeShakerVisitorOptions): TS.VariableDeclaration | undefined { 5 | const nameContinuationResult = continuation(node.name); 6 | if (nameContinuationResult == null) { 7 | return undefined; 8 | } 9 | 10 | return node.name === nameContinuationResult ? node : factory.updateVariableDeclaration(node, nameContinuationResult, node.exclamationToken, node.type, node.initializer); 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/tree-shaker/visitor/visit-variable-statement.ts: -------------------------------------------------------------------------------- 1 | import type {TreeShakerVisitorOptions} from "../tree-shaker-visitor-options.js"; 2 | import type {TS} from "../../../../../../type/ts.js"; 3 | 4 | export function visitVariableStatement({node, continuation, factory}: TreeShakerVisitorOptions): TS.VariableStatement | undefined { 5 | const variableDeclarationListContinuationResult = continuation(node.declarationList); 6 | 7 | if (variableDeclarationListContinuationResult == null) { 8 | return undefined; 9 | } 10 | 11 | return factory.updateVariableStatement(node, node.modifiers, variableDeclarationListContinuationResult); 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/type-reference-collector/type-reference-collector-visitor-options.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../source-file-bundler/source-file-bundler-visitor-options.js"; 3 | import type {TypeReference} from "../../util/get-type-reference-module-from-file-name.js"; 4 | 5 | export interface TypeReferenceCollectorVisitorOptions extends SourceFileBundlerVisitorOptions { 6 | typescript: typeof TS; 7 | node: T; 8 | importDeclarations: TS.ImportDeclaration[]; 9 | 10 | addTypeReference(typeReference: TypeReference): void; 11 | childContinuation(node: U): void; 12 | continuation(node: U): U | void; 13 | } 14 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/type-reference-collector/visitor/visit-identifier.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TypeReferenceCollectorVisitorOptions} from "../type-reference-collector-visitor-options.js"; 3 | import {getTypeReferenceModuleFromNode} from "../../../util/get-type-reference-module-from-node.js"; 4 | 5 | export function visitIdentifier(options: TypeReferenceCollectorVisitorOptions): void { 6 | const {node, addTypeReference} = options; 7 | 8 | const typeReferenceModule = getTypeReferenceModuleFromNode({...options, node}); 9 | if (typeReferenceModule != null) { 10 | addTypeReference(typeReferenceModule); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/transformers/type-reference-collector/visitor/visit-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../../../type/ts.js"; 2 | import type {TypeReferenceCollectorVisitorOptions} from "../type-reference-collector-visitor-options.js"; 3 | import {visitIdentifier} from "./visit-identifier.js"; 4 | 5 | export function visitNode({node, ...options}: TypeReferenceCollectorVisitorOptions): void { 6 | if (options.typescript.isIdentifier(node)) { 7 | return visitIdentifier({...options, node}); 8 | } else { 9 | // Only consider root-level statements here 10 | return options.childContinuation(node); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/add-binding-to-lexical-environment.ts: -------------------------------------------------------------------------------- 1 | import type {LexicalEnvironment} from "../transformers/deconflicter/deconflicter-options.js"; 2 | 3 | export function addBindingToLexicalEnvironment(lexicalEnvironment: LexicalEnvironment, originalSourceFileName: string, value: string, oldValue: string = value): void { 4 | lexicalEnvironment.bindings.set(oldValue, {originalSourceFileName, value}); 5 | } 6 | 7 | export function removeBindingFromLexicalEnvironment(lexicalEnvironment: LexicalEnvironment, key: string): void { 8 | lexicalEnvironment.bindings.delete(key); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/apply-transformers.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../type/ts.js"; 2 | import type {SourceFileBundlerVisitorOptions} from "../transformers/source-file-bundler/source-file-bundler-visitor-options.js"; 3 | import type {DeclarationTransformer} from "../declaration-bundler-options.js"; 4 | 5 | export interface ApplyTransformersOptions { 6 | transformers: DeclarationTransformer[]; 7 | visitorOptions: SourceFileBundlerVisitorOptions; 8 | } 9 | 10 | export function applyTransformers({transformers, visitorOptions}: ApplyTransformersOptions): TS.SourceFile { 11 | for (const transformer of transformers) { 12 | visitorOptions.sourceFile = transformer(visitorOptions); 13 | } 14 | return visitorOptions.sourceFile; 15 | } 16 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/clone-lexical-environment.ts: -------------------------------------------------------------------------------- 1 | import type {LexicalEnvironment, LexicalEnvironmentBinding} from "../transformers/deconflicter/deconflicter-options.js"; 2 | 3 | export function cloneLexicalEnvironment(lexicalEnvironment?: LexicalEnvironment | undefined, ...entries: [string, LexicalEnvironmentBinding][]): LexicalEnvironment { 4 | return { 5 | parent: lexicalEnvironment, 6 | bindings: new Map(entries) 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/clone-node-with-meta.ts: -------------------------------------------------------------------------------- 1 | import type {SourceFileBundlerVisitorOptions} from "../transformers/source-file-bundler/source-file-bundler-visitor-options.js"; 2 | import type {TS} from "../../../../type/ts.js"; 3 | import {cloneNode, preserveNode, setParentNodes} from "ts-clone-node"; 4 | import {getSymbolAtLocation} from "./get-symbol-at-location.js"; 5 | import type {SafeNode} from "../../../../type/safe-node.js"; 6 | 7 | export interface PreserveMetaOptions extends SourceFileBundlerVisitorOptions {} 8 | 9 | export function preserveSymbols(node: T, otherNode: TS.Node, options: PreserveMetaOptions): T { 10 | if (node === otherNode) return node; 11 | 12 | (node as SafeNode)._symbol = getSymbolAtLocation({...options, node: otherNode}); 13 | return node; 14 | } 15 | 16 | export function preserveMeta(newNode: T, oldNode: T, options: PreserveMetaOptions): T { 17 | return preserveNode(newNode, oldNode, options); 18 | } 19 | 20 | export function preserveParents(node: T, options: Pick): T { 21 | return setParentNodes(node, {typescript: options.typescript, propertyName: "_parent", deep: true}); 22 | } 23 | 24 | export function cloneNodeWithMeta(node: T, options: PreserveMetaOptions): T { 25 | return cloneNode(node, options); 26 | } 27 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/format-lib-reference-directive.ts: -------------------------------------------------------------------------------- 1 | export function formatLibReferenceDirective(libName: string): string { 2 | return `/// `; 3 | } 4 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/format-type-reference-directive.ts: -------------------------------------------------------------------------------- 1 | export function formatTypeReferenceDirective(fileName: string): string { 2 | return `/// `; 3 | } 4 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/generate-identifier-name.ts: -------------------------------------------------------------------------------- 1 | import {stripKnownExtension} from "../../../../util/path/path-util.js"; 2 | import {camelCase} from "@wessberg/stringutil"; 3 | import path from "crosspath"; 4 | 5 | export type GenerateIdentifierNameHint = "class" | "namespace" | "function"; 6 | 7 | function generateHintSuffix(hint: GenerateIdentifierNameHint): string { 8 | switch (hint) { 9 | case "class": 10 | return "Class"; 11 | case "function": 12 | return "Func"; 13 | case "namespace": 14 | return "NS"; 15 | } 16 | } 17 | 18 | /** 19 | * Generates an identifier based on the given module name 20 | */ 21 | export function generateIdentifierName(module: string, hint: GenerateIdentifierNameHint): string { 22 | return `${camelCase(stripKnownExtension(path.basename(module)))}${generateHintSuffix(hint)}`; 23 | } 24 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/generate-unique-binding.ts: -------------------------------------------------------------------------------- 1 | import type {LexicalEnvironment} from "../transformers/deconflicter/deconflicter-options.js"; 2 | 3 | export const DECONFLICT_SUFFIX = "$"; 4 | const RESERVED_WORDS = new Set(["default"]); 5 | 6 | export function ensureNonreservedWord(word: string): string { 7 | if (RESERVED_WORDS.has(word)) { 8 | return `__${word}`; 9 | } 10 | return word; 11 | } 12 | 13 | export function generateUniqueBinding(lexicalEnvironment: LexicalEnvironment, candidate: string): string { 14 | let counter = -1; 15 | 16 | if (lexicalEnvironment.bindings.has(candidate)) { 17 | const {value} = lexicalEnvironment.bindings.get(candidate)!; 18 | 19 | // If the bound value isn't identical to the candidate, it has been deconflicted previously. 20 | // Start from this value instead 21 | if (value !== candidate) { 22 | counter = parseInt(value.slice(candidate.length + DECONFLICT_SUFFIX.length)); 23 | } 24 | 25 | return `${candidate}${DECONFLICT_SUFFIX}${counter + 1}`; 26 | } 27 | 28 | if (lexicalEnvironment.parent == null) { 29 | return candidate; 30 | } 31 | 32 | return generateUniqueBinding(lexicalEnvironment.parent, candidate); 33 | } 34 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/get-binding-from-lexical-environment.ts: -------------------------------------------------------------------------------- 1 | import type {LexicalEnvironment} from "../transformers/deconflicter/deconflicter-options.js"; 2 | 3 | export function getBindingFromLexicalEnvironment(lexicalEnvironment: LexicalEnvironment, key: string): string | undefined { 4 | if (lexicalEnvironment.bindings.has(key)) { 5 | return lexicalEnvironment.bindings.get(key)!.value; 6 | } else if (lexicalEnvironment.parent != null) { 7 | return getBindingFromLexicalEnvironment(lexicalEnvironment.parent, key); 8 | } else { 9 | return undefined; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/get-chunk-filename.ts: -------------------------------------------------------------------------------- 1 | import type {NormalizedChunk, PreNormalizedChunk} from "../../../../util/chunk/normalize-chunk.js"; 2 | 3 | /** 4 | * Gets the chunk filename that matches the given filename. It may be the same. 5 | */ 6 | export function getChunkFilename(module: string, chunks: NormalizedChunk[]): string | undefined { 7 | return getChunkForModule(module, chunks)?.paths.absolute; 8 | } 9 | 10 | export function getChunkForModule(module: string, chunks: NormalizedChunk[]): NormalizedChunk | undefined; 11 | export function getChunkForModule(module: string, chunks: PreNormalizedChunk[]): PreNormalizedChunk | undefined; 12 | export function getChunkForModule(module: string, chunks: PreNormalizedChunk[] | NormalizedChunk[]): NormalizedChunk | PreNormalizedChunk | undefined { 13 | for (const chunk of chunks) { 14 | if ("has" in chunk.modules && chunk.modules.has(module)) { 15 | return chunk; 16 | } else if ("includes" in chunk.modules && chunk.modules.includes(module)) { 17 | return chunk; 18 | } 19 | } 20 | 21 | return undefined; 22 | } 23 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/get-original-node.ts: -------------------------------------------------------------------------------- 1 | import type {SafeNode} from "../../../../type/safe-node.js"; 2 | import type {TS} from "../../../../type/ts.js"; 3 | 4 | export function getOriginalNode(node: T, typescript: typeof TS): T { 5 | if (node._original != null) { 6 | return getOriginalNode(node._original as T, typescript); 7 | } 8 | 9 | return (typescript.getOriginalNode(node) as T) ?? node; 10 | } 11 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/get-original-source-file.ts: -------------------------------------------------------------------------------- 1 | import type {SafeNode} from "../../../../type/safe-node.js"; 2 | import type {TS} from "../../../../type/ts.js"; 3 | import {getOriginalNode} from "./get-original-node.js"; 4 | 5 | export function getOriginalSourceFile(node: T, currentSourceFile: TS.SourceFile, typescript: typeof TS): TS.SourceFile { 6 | const originalNode = getOriginalNode(node, typescript); 7 | let sourceFile: TS.SourceFile | undefined = originalNode.getSourceFile(); 8 | if (sourceFile != null) return sourceFile; 9 | 10 | if (originalNode._parent != null) { 11 | if (originalNode._parent.kind === typescript.SyntaxKind.SourceFile) { 12 | return originalNode._parent as TS.SourceFile; 13 | } 14 | sourceFile = originalNode._parent?.getSourceFile(); 15 | } 16 | return sourceFile ?? currentSourceFile; 17 | } 18 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/get-parent-node.ts: -------------------------------------------------------------------------------- 1 | import type {SafeNode} from "../../../../type/safe-node.js"; 2 | 3 | export function getParentNode(node: T): T["parent"] { 4 | if (node._parent != null) { 5 | return node._parent as T["parent"]; 6 | } 7 | 8 | return node.parent; 9 | } 10 | 11 | export function setParentNode(node: T, parentNode: T["parent"]): T { 12 | node._parent = parentNode; 13 | return node; 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/get-symbol-at-location.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../type/ts.js"; 2 | import {getSymbolFlagsForNode} from "./get-symbol-flags-for-node.js"; 3 | import type {SafeNode} from "../../../../type/safe-node.js"; 4 | import {getOriginalNode} from "./get-original-node.js"; 5 | 6 | export interface GetSymbolAtLocationOptions { 7 | node: SafeNode; 8 | typeChecker: TS.TypeChecker; 9 | typescript: typeof TS; 10 | } 11 | 12 | export function getSymbolAtLocation({node, typescript, typeChecker}: GetSymbolAtLocationOptions): TS.Symbol { 13 | const originalNode = getOriginalNode(node, typescript); 14 | 15 | return ( 16 | originalNode._symbol ?? 17 | originalNode.symbol ?? 18 | typeChecker.getSymbolAtLocation(originalNode) ?? 19 | typeChecker.getSymbolsInScope(originalNode, getSymbolFlagsForNode(originalNode, typescript))[0] 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/get-type-reference-module-from-file-name.ts: -------------------------------------------------------------------------------- 1 | import {typeModuleReferenceIsAllowed} from "./type-module-reference-is-allowed.js"; 2 | import type {CompilerHost} from "../../../compiler-host/compiler-host.js"; 3 | import path from "crosspath"; 4 | 5 | export interface GetTypeReferenceModuleFromFileNameOptions { 6 | host: CompilerHost; 7 | fileName: string; 8 | } 9 | 10 | export interface TypeReference { 11 | moduleSpecifier: string; 12 | fileName: string; 13 | } 14 | 15 | export function getTypeReferenceModuleFromFileName({host, fileName}: GetTypeReferenceModuleFromFileNameOptions): TypeReference | undefined { 16 | for (const typeRoot of host.getTypeRoots()) { 17 | const typeRootIndex = fileName.indexOf(typeRoot); 18 | if (typeRootIndex < 0) continue; 19 | 20 | const base = path.normalize(fileName.slice(typeRootIndex + typeRoot.length + 1)); 21 | const moduleSpecifier = base.includes("/") ? base.slice(0, base.indexOf("/")) : base; 22 | 23 | if (typeModuleReferenceIsAllowed({host, moduleSpecifier})) { 24 | return { 25 | moduleSpecifier, 26 | fileName 27 | }; 28 | } 29 | } 30 | 31 | return undefined; 32 | } 33 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/is-identifier-free.ts: -------------------------------------------------------------------------------- 1 | import type {LexicalEnvironment} from "../transformers/deconflicter/deconflicter-options.js"; 2 | 3 | export function isIdentifierFree(lexicalEnvironment: LexicalEnvironment, identifier: string, originalSourceFileName: string, isInternalAlias = false): boolean { 4 | // So long as the current lexical environment doesn't already define the provided identifier, 5 | // it can be declared, even if it may shadow an existing identifier from the parent chain of Lexical environments 6 | const binding = lexicalEnvironment.bindings.get(identifier); 7 | 8 | // if there is no binding, the identifier is free 9 | if (binding == null) return true; 10 | 11 | // Otherwise, the identifier is free if and only if it was originally declared in the same SourceFile (in which case it follows the 12 | // declaration merging rules outlined here: https://www.typescriptlang.org/docs/handbook/declaration-merging.html 13 | return !isInternalAlias && binding.originalSourceFileName === originalSourceFileName; 14 | } 15 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/is-statement.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../type/ts.js"; 2 | 3 | /** 4 | * Returns true if the given Node is a Statement 5 | * Uses an internal non-exposed Typescript helper to decide whether or not the Node is a Statement 6 | */ 7 | export function isStatement(node: TS.Node, typescript: typeof TS): node is TS.Statement { 8 | return (typescript as unknown as {isStatementButNotDeclaration(node: TS.Node): boolean}).isStatementButNotDeclaration(node); 9 | } 10 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/is-symbol-identifier.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../type/ts.js"; 2 | 3 | export function isSymbolIdentifier(node: TS.Node, typescript: typeof TS): node is TS.Identifier { 4 | return typescript.isIdentifier(node) && node.text.startsWith("[") && node.text.endsWith("]"); 5 | } 6 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/node-arrays-are-equal.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../type/ts.js"; 2 | 3 | export function nodeArraysAreEqual(a: TS.NodeArray | TS.Node[] | undefined, b: TS.NodeArray | TS.Node[] | undefined): boolean { 4 | if (a == null && b == null) return true; 5 | return a != null && b != null && a.length === b.length && a.every((element, index) => element === b[index]); 6 | } 7 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/node-contains-child.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../../../type/ts.js"; 2 | import {getParentNode} from "./get-parent-node.js"; 3 | 4 | /** 5 | * Returns true if the given Node contains the given Child Node 6 | */ 7 | export function nodeContainsChild(parent: TS.Node, potentialChild: TS.Node): boolean { 8 | if (parent === potentialChild) return false; 9 | 10 | let candidate = potentialChild; 11 | while (candidate != null) { 12 | candidate = getParentNode(candidate); 13 | if (candidate === parent) return true; 14 | } 15 | 16 | return false; 17 | } 18 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/node-has-supported-extension.ts: -------------------------------------------------------------------------------- 1 | import path from "crosspath"; 2 | import type {KnownExtension} from "../../../../constant/constant.js"; 3 | import type {TS} from "../../../../type/ts.js"; 4 | import type {SupportedExtensions} from "../../../../util/get-supported-extensions/get-supported-extensions.js"; 5 | 6 | export function nodeHasSupportedExtension( 7 | node: T, 8 | typescript: typeof TS, 9 | extensions: SupportedExtensions 10 | ): boolean { 11 | // Allow nodes for which there are no module specifiers or in case they aren't string literals for some reason. 12 | if (!("moduleSpecifier" in node)) return true; 13 | if (node.moduleSpecifier == null || !typescript.isStringLiteralLike(node.moduleSpecifier)) return true; 14 | 15 | return path.extname(node.moduleSpecifier.text) === "" || extensions.has(path.extname(node.moduleSpecifier.text) as KnownExtension); 16 | } 17 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/prepare-paths/prepare-paths.ts: -------------------------------------------------------------------------------- 1 | import path from "crosspath"; 2 | 3 | export interface PreparePathsOptions { 4 | fileName: string; 5 | relativeOutDir: string; 6 | absoluteOutDir: string; 7 | } 8 | 9 | export interface PathsResult { 10 | fileName: string; 11 | relative: string; 12 | absolute: string; 13 | } 14 | 15 | export function preparePaths({relativeOutDir, absoluteOutDir, fileName}: PreparePathsOptions): PathsResult { 16 | const absolutePath = path.join(absoluteOutDir, fileName); 17 | const relativePath = path.join(relativeOutDir, fileName); 18 | 19 | return { 20 | fileName, 21 | absolute: absolutePath, 22 | relative: relativePath 23 | }; 24 | } 25 | -------------------------------------------------------------------------------- /src/service/transformer/declaration-bundler/util/type-module-reference-is-allowed.ts: -------------------------------------------------------------------------------- 1 | import type {CompilerHost} from "../../../compiler-host/compiler-host.js"; 2 | 3 | export interface TypeModuleReferenceIsAllowedOptions { 4 | host: CompilerHost; 5 | moduleSpecifier: string; 6 | } 7 | 8 | export function typeModuleReferenceIsAllowed({host, moduleSpecifier}: TypeModuleReferenceIsAllowedOptions): boolean { 9 | const compilerOptions = host.getCompilationSettings(); 10 | if (compilerOptions.types == null || compilerOptions.types.length < 1) return true; 11 | return compilerOptions.types.includes(moduleSpecifier); 12 | } 13 | -------------------------------------------------------------------------------- /src/type/babel.ts: -------------------------------------------------------------------------------- 1 | import type * as Babel from "@babel/core"; 2 | export type {Babel}; 3 | 4 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 5 | export type BabelConfig = Record; 6 | -------------------------------------------------------------------------------- /src/type/declaration-stats.ts: -------------------------------------------------------------------------------- 1 | // A Record from chunk file names to their stats 2 | export type DeclarationStats = Record; 3 | 4 | export interface DeclarationChunkStats { 5 | // An array of the external type dependencies for a declaration chunk 6 | externalTypes: ExternalType[]; 7 | } 8 | 9 | export interface ExternalType { 10 | // The name of the external library that provides the typings. For example, "typescript" or "@types/node" 11 | library: string; 12 | // The version of the referenced external library 13 | version: string; 14 | } 15 | -------------------------------------------------------------------------------- /src/type/safe-node.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "./ts.js"; 2 | 3 | export interface SafeNode extends TS.Node { 4 | // eslint-disable-next-line @typescript-eslint/naming-convention 5 | _symbol?: TS.Symbol; 6 | symbol?: TS.Symbol; 7 | 8 | // eslint-disable-next-line @typescript-eslint/naming-convention 9 | _original?: SafeNode; 10 | original?: SafeNode; 11 | 12 | // eslint-disable-next-line @typescript-eslint/naming-convention 13 | _parent?: SafeNode; 14 | 15 | // eslint-disable-next-line @typescript-eslint/naming-convention 16 | _internalAlias?: boolean; 17 | } 18 | -------------------------------------------------------------------------------- /src/type/swc.ts: -------------------------------------------------------------------------------- 1 | import type * as Swc from "@swc/core"; 2 | export type {Swc}; 3 | 4 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 5 | export type SwcConfig = Record; 6 | -------------------------------------------------------------------------------- /src/type/ts.ts: -------------------------------------------------------------------------------- 1 | import type * as TS from "typescript"; 2 | export type {TS}; 3 | -------------------------------------------------------------------------------- /src/util/ensure-array/ensure-array.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Ensures that the given item is in fact an array 3 | */ 4 | export function ensureArray(item: T | T[]): T[] { 5 | return Array.isArray(item) ? item : [item]; 6 | } 7 | -------------------------------------------------------------------------------- /src/util/file-system/file-system.ts: -------------------------------------------------------------------------------- 1 | import type fsModule from "fs"; 2 | 3 | export type ReadonlyFileSystem = Pick; 4 | export type FileSystem = ReadonlyFileSystem & Pick; 5 | -------------------------------------------------------------------------------- /src/util/get-browserslist/get-browserslist-options.ts: -------------------------------------------------------------------------------- 1 | import type {TypescriptPluginOptions} from "../../plugin/typescript-plugin-options.js"; 2 | import type {TS} from "../../type/ts.js"; 3 | 4 | export interface GetBrowserslistOptions { 5 | cwd: string; 6 | browserslist?: TypescriptPluginOptions["browserslist"]; 7 | fileSystem: TS.System; 8 | } 9 | -------------------------------------------------------------------------------- /src/util/get-forced-compiler-options/get-forced-compiler-options-options.ts: -------------------------------------------------------------------------------- 1 | import type {InputOptions} from "rollup"; 2 | import type {TypescriptPluginOptions} from "../../plugin/typescript-plugin-options.js"; 3 | 4 | export interface GetForcedCompilerOptionsOptions { 5 | pluginOptions: TypescriptPluginOptions; 6 | browserslist: string[] | undefined | false; 7 | rollupInputOptions: InputOptions; 8 | } 9 | -------------------------------------------------------------------------------- /src/util/get-module-kind-from-rollup-format/get-module-kind-from-rollup-format.ts: -------------------------------------------------------------------------------- 1 | import type {ModuleFormat} from "rollup"; 2 | import type {TS} from "../../type/ts.js"; 3 | 4 | /** 5 | * Gets a proper ModuleKind for Typescript based on the format given from the Rollup options 6 | */ 7 | export function getModuleKindFromRollupFormat(format: ModuleFormat, typescript: typeof TS): TS.ModuleKind { 8 | switch (format) { 9 | case "amd": 10 | return typescript.ModuleKind.AMD; 11 | case "cjs": 12 | case "commonjs": 13 | return typescript.ModuleKind.CommonJS; 14 | case "system": 15 | case "systemjs": 16 | return typescript.ModuleKind.System; 17 | case "es": 18 | case "esm": 19 | case "module": 20 | return typescript.ModuleKind.ESNext; 21 | case "umd": 22 | return typescript.ModuleKind.UMD; 23 | case "iife": 24 | return typescript.ModuleKind.None; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/util/get-new-line-character/get-new-line-character.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../type/ts.js"; 2 | 3 | /** 4 | * Gets the NewLineCharacter to use for a NewLineKind 5 | */ 6 | export function getNewLineCharacter(newLine: TS.NewLineKind, typescript: typeof TS): string { 7 | switch (newLine) { 8 | case typescript.NewLineKind.CarriageReturnLineFeed: 9 | return "\r\n"; 10 | case typescript.NewLineKind.LineFeed: 11 | return "\n"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/util/get-out-dir/get-out-dir.ts: -------------------------------------------------------------------------------- 1 | import type {OutputOptions} from "rollup"; 2 | import {ensureRelative} from "../path/path-util.js"; 3 | import path from "crosspath"; 4 | import {generateRandomHash} from "../hash/generate-random-hash.js"; 5 | 6 | /** 7 | * Gets the destination directory to use based on the given Rollup output options 8 | */ 9 | export function getOutDir(cwd: string, options?: Partial): string { 10 | let outDir: string | undefined; 11 | if (options == null) { 12 | // Generate a random output directory. The idea is that this will never match any existing files on disk. 13 | // The reason being that Typescript may erroneously think that input files may be overwritten if 'allowJs' is true 14 | // and 'outDir' is '.' 15 | outDir = path.join(cwd, generateRandomHash()); 16 | } else if (options.dir != null) { 17 | outDir = options.dir; 18 | } else if (options.file != null) { 19 | outDir = path.dirname(options.file); 20 | } else { 21 | outDir = cwd; 22 | } 23 | 24 | // Return the relative output directory. Default to "." if it should be equal to cwd 25 | const relativeToCwd = ensureRelative(cwd, outDir); 26 | return relativeToCwd === "" ? "." : relativeToCwd; 27 | } 28 | -------------------------------------------------------------------------------- /src/util/get-parsed-command-line/parsed-command-line-result.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../type/ts.js"; 2 | 3 | export interface ParsedCommandLineResult { 4 | parsedCommandLine: TS.ParsedCommandLine; 5 | originalCompilerOptions: TS.CompilerOptions; 6 | tsconfigPath: string; 7 | } 8 | -------------------------------------------------------------------------------- /src/util/get-script-kind-from-path/get-script-kind-from-path.ts: -------------------------------------------------------------------------------- 1 | import {JS_EXTENSION, JSON_EXTENSION, JSX_EXTENSION, TS_EXTENSION, TSX_EXTENSION} from "../../constant/constant.js"; 2 | import type {TS} from "../../type/ts.js"; 3 | 4 | /** 5 | * Gets a ScriptKind from the given path 6 | */ 7 | export function getScriptKindFromPath(path: string, typescript: typeof TS): TS.ScriptKind { 8 | if (path.endsWith(JS_EXTENSION)) { 9 | return typescript.ScriptKind.JS; 10 | } else if (path.endsWith(TS_EXTENSION)) { 11 | return typescript.ScriptKind.TS; 12 | } else if (path.endsWith(TSX_EXTENSION)) { 13 | return typescript.ScriptKind.TSX; 14 | } else if (path.endsWith(JSX_EXTENSION)) { 15 | return typescript.ScriptKind.JSX; 16 | } else if (path.endsWith(JSON_EXTENSION)) { 17 | return typescript.ScriptKind.JSON; 18 | } else { 19 | return typescript.ScriptKind.Unknown; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/util/get-source-description-from-emit-output/get-source-description-from-emit-output.ts: -------------------------------------------------------------------------------- 1 | import type {SourceDescription} from "rollup"; 2 | import {SOURCE_MAP_COMMENT} from "../../constant/constant.js"; 3 | import {isCodeOutputFile} from "../is-code-output-file/is-code-output-file.js"; 4 | import {isMapOutputFile} from "../is-map-output-file/is-map-output-file.js"; 5 | import type {TS} from "../../type/ts.js"; 6 | 7 | /** 8 | * Gets a SourceDescription from the given EmitOutput 9 | */ 10 | export function getSourceDescriptionFromEmitOutput(output: TS.EmitOutput): SourceDescription | undefined { 11 | const code = output.outputFiles.find(isCodeOutputFile); 12 | if (code == null) return undefined; 13 | 14 | const map = output.outputFiles.find(isMapOutputFile); 15 | 16 | // Remove the SourceMap comment from the code if it is given. Rollup is the decider of whether or not to emit SourceMaps and if they should be inlined 17 | const inlinedSourcemapIndex = code.text.indexOf(`\n${SOURCE_MAP_COMMENT}`); 18 | 19 | if (inlinedSourcemapIndex >= 0) { 20 | code.text = code.text.slice(0, inlinedSourcemapIndex); 21 | } 22 | 23 | return { 24 | code: code.text, 25 | ...(map == null ? {} : {map: map.text}) 26 | }; 27 | } 28 | -------------------------------------------------------------------------------- /src/util/hash/generate-random-hash.ts: -------------------------------------------------------------------------------- 1 | import {createHmac, randomBytes} from "crypto"; 2 | 3 | export interface GenerateRandomHashOptions { 4 | key: string; 5 | length: number; 6 | } 7 | 8 | /** 9 | * Generates a random hash 10 | */ 11 | export function generateRandomHash({length = 8, key}: Partial = {}): string { 12 | return key == null ? randomBytes(length / 2).toString("hex") : createHmac("sha1", key).digest("hex").slice(0, length); 13 | } 14 | 15 | export function generateRandomIntegerHash(options?: Partial, offset = 1000000): number { 16 | const str = generateRandomHash(options); 17 | 18 | let result = 0; 19 | for (let i = 0; i < str.length; i++) { 20 | result = result + str.charCodeAt(i); 21 | } 22 | 23 | return result + offset; 24 | } 25 | 26 | export interface RandomPathOptions { 27 | extension: string; 28 | prefix: string; 29 | suffix: string; 30 | } 31 | export function generateRandomPath({extension = "", prefix = "__#auto-generated-", suffix = String(Math.floor(Math.random() * 100000))}: Partial = {}) { 32 | return `${prefix}${suffix}${extension}`; 33 | } 34 | -------------------------------------------------------------------------------- /src/util/inspect/inspect.ts: -------------------------------------------------------------------------------- 1 | import {inspect as _inspect} from "util"; 2 | 3 | export function inspect(item: T, depth = 4): void { 4 | console.log(_inspect(item, {colors: true, depth, maxArrayLength: 1000})); 5 | } 6 | -------------------------------------------------------------------------------- /src/util/is-build-info-output-file/is-build-info-output-file.ts: -------------------------------------------------------------------------------- 1 | import {TSBUILDINFO_EXTENSION} from "../../constant/constant.js"; 2 | import {getExtension} from "../path/path-util.js"; 3 | import type {TS} from "../../type/ts.js"; 4 | 5 | /** 6 | * Returns true if the given OutputFile represents .tsbuildinfo 7 | */ 8 | export function isBuildInfoOutputFile({name}: TS.OutputFile): boolean { 9 | return getExtension(name) === TSBUILDINFO_EXTENSION; 10 | } 11 | -------------------------------------------------------------------------------- /src/util/is-code-output-file/is-code-output-file.ts: -------------------------------------------------------------------------------- 1 | import {D_TS_EXTENSION, D_TS_MAP_EXTENSION, SOURCE_MAP_EXTENSION} from "../../constant/constant.js"; 2 | import {getExtension} from "../path/path-util.js"; 3 | import type {TS} from "../../type/ts.js"; 4 | 5 | /** 6 | * Returns true if the given OutputFile represents code 7 | */ 8 | export function isCodeOutputFile({name}: TS.OutputFile): boolean { 9 | const extension = getExtension(name); 10 | return [SOURCE_MAP_EXTENSION, D_TS_EXTENSION, D_TS_MAP_EXTENSION].every(otherExtension => extension !== otherExtension); 11 | } 12 | -------------------------------------------------------------------------------- /src/util/is-defined/is-defined.ts: -------------------------------------------------------------------------------- 1 | export function isDefined(item: T | undefined | null): item is T { 2 | return item != null; 3 | } 4 | -------------------------------------------------------------------------------- /src/util/is-json-like/is-json-like.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Checks if the given piece of code is JSON-like 3 | */ 4 | export function isJsonLike(code: string): boolean { 5 | try { 6 | return JSON.parse(code) != null; 7 | } catch { 8 | return false; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/util/is-map-output-file/is-map-output-file.ts: -------------------------------------------------------------------------------- 1 | import {D_TS_MAP_EXTENSION, SOURCE_MAP_EXTENSION} from "../../constant/constant.js"; 2 | import {getExtension} from "../path/path-util.js"; 3 | import type {TS} from "../../type/ts.js"; 4 | 5 | /** 6 | * Returns true if the given OutputFile represents a SourceMap 7 | */ 8 | export function isMapOutputFile({name}: TS.OutputFile): boolean { 9 | const extension = getExtension(name); 10 | return [SOURCE_MAP_EXTENSION, D_TS_MAP_EXTENSION].some(otherExtension => extension === otherExtension); 11 | } 12 | -------------------------------------------------------------------------------- /src/util/is-output-chunk/is-output-chunk.ts: -------------------------------------------------------------------------------- 1 | import type {OutputChunk, OutputAsset} from "rollup"; 2 | 3 | /** 4 | * Returns true if the given asset is an OutputChunk 5 | */ 6 | export function isOutputChunk(thing: OutputChunk | OutputAsset): thing is OutputChunk { 7 | return thing.type === "chunk"; 8 | } 9 | 10 | /** 11 | * Returns true if the given asset is an OutputChunk 12 | */ 13 | export function isOutputAssetOrOutputChunk(thing: OutputChunk | OutputAsset): thing is OutputChunk | OutputAsset { 14 | return thing.type === "chunk" || thing.type === "asset"; 15 | } 16 | -------------------------------------------------------------------------------- /src/util/list-format.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Formats the given iterable of strings in a list format (in the English locale) 3 | */ 4 | export function listFormat(elements: Iterable, andOrOr: "and" | "or" = "and", mapper: (element: string) => string = element => element): string { 5 | const arr = [...elements]; 6 | if (arr.length === 0) return ""; 7 | else if (arr.length === 1) return mapper(arr[0]); 8 | else if (arr.length === 2) { 9 | const [first, last] = arr; 10 | return `${mapper(first)} ${andOrOr} ${mapper(last)}`; 11 | } else { 12 | const head = arr.slice(0, arr.length - 1).map(mapper); 13 | const last = mapper(arr.slice(-1)[0]); 14 | return `${head.join(", ")}, ${andOrOr} ${last}`; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/util/logging/get-formatted-date-time-prefix.ts: -------------------------------------------------------------------------------- 1 | import color from "ansi-colors"; 2 | 3 | export function getFormattedDateTimePrefix(): string { 4 | const currentDate = new Date(); 5 | const currentDateTime = `(${currentDate.getHours().toString().padStart(2, "0")}:${currentDate.getMinutes().toString().padStart(2, "0")}:${currentDate 6 | .getSeconds() 7 | .toString() 8 | .padStart(2, "0")})`; 9 | return `${color.gray(currentDateTime)} `; 10 | } 11 | -------------------------------------------------------------------------------- /src/util/logging/log-emit.ts: -------------------------------------------------------------------------------- 1 | import color from "ansi-colors"; 2 | import {getFormattedDateTimePrefix} from "./get-formatted-date-time-prefix.js"; 3 | 4 | export function logEmit(fileName: string, text: string): void { 5 | console.log(`${getFormattedDateTimePrefix()}${color.blue(`emit: ${fileName}`)}`); 6 | console.log(color.white(text)); 7 | } 8 | -------------------------------------------------------------------------------- /src/util/logging/log-metrics.ts: -------------------------------------------------------------------------------- 1 | import color from "ansi-colors"; 2 | import {getFormattedDateTimePrefix} from "./get-formatted-date-time-prefix.js"; 3 | 4 | export interface LogMetrics { 5 | finish(): void; 6 | } 7 | export function logMetrics(message: string, fileName?: string): LogMetrics { 8 | const uniqueMessage = `${getFormattedDateTimePrefix()}${color.green(`metrics: ${message}`)}${fileName == null ? "" : ` ${color.gray(`(${fileName})`)}`}`; 9 | console.time(uniqueMessage); 10 | 11 | return { 12 | finish: () => console.timeEnd(uniqueMessage) 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /src/util/logging/log-transformer.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../type/ts.js"; 2 | import color from "ansi-colors"; 3 | import {getFormattedDateTimePrefix} from "./get-formatted-date-time-prefix.js"; 4 | 5 | export interface LogTransformationResult { 6 | finish(sourceFile: TS.SourceFile): void; 7 | } 8 | 9 | function logTransformationStep(leadingText: string, name: string, sourceFile: TS.SourceFile, printer: TS.Printer): void { 10 | const sourceFileWithoutRoot = sourceFile.fileName.replace(process.cwd(), ""); 11 | console.log(`${getFormattedDateTimePrefix()}${color.magenta(`transformer: ${leadingText} ${name}`)} ${color.gray(`(${sourceFileWithoutRoot})`)}`); 12 | console.log(color.white(printer.printFile(sourceFile))); 13 | } 14 | 15 | export function logTransformer(name: string, sourceFile: TS.SourceFile, printer: TS.Printer): LogTransformationResult { 16 | logTransformationStep("Before", name, sourceFile, printer); 17 | return { 18 | finish: nextSourceFile => logTransformationStep("After", name, nextSourceFile, printer) 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /src/util/logging/log-tsconfig.ts: -------------------------------------------------------------------------------- 1 | import color from "ansi-colors"; 2 | import {getFormattedDateTimePrefix} from "./get-formatted-date-time-prefix.js"; 3 | import type {TS} from "../../type/ts.js"; 4 | import {inspect} from "../inspect/inspect.js"; 5 | 6 | export function logTsconfig(config: TS.ParsedCommandLine): void { 7 | console.log(`${getFormattedDateTimePrefix()}${color.red(`tsconfig`)}`); 8 | inspect(config); 9 | } 10 | -------------------------------------------------------------------------------- /src/util/logging/log-virtual-files.ts: -------------------------------------------------------------------------------- 1 | import color from "ansi-colors"; 2 | import {getFormattedDateTimePrefix} from "./get-formatted-date-time-prefix.js"; 3 | import {inspect} from "../inspect/inspect.js"; 4 | 5 | export function logVirtualFiles(files: string[]): void { 6 | console.log(`${getFormattedDateTimePrefix()}${color.gray(`Virtual Files`)}`); 7 | inspect(files); 8 | } 9 | -------------------------------------------------------------------------------- /src/util/merge-transformers/custom-transformer-options.ts: -------------------------------------------------------------------------------- 1 | import type {ExtendedDiagnostic} from "../../diagnostic/extended-diagnostic.js"; 2 | import type {TS} from "../../type/ts.js"; 3 | 4 | export interface CustomTransformerOptions { 5 | program: TS.Program | undefined; 6 | printer: TS.Printer; 7 | typescript: typeof TS; 8 | addDiagnostics(...diagnostics: ExtendedDiagnostic[]): void; 9 | } 10 | 11 | export type CustomTransformersFunction = (options: CustomTransformerOptions) => TS.CustomTransformers; 12 | -------------------------------------------------------------------------------- /src/util/module-resolution/module-resolution-util.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../type/ts.js"; 2 | 3 | /** 4 | * On TypeScript versions 4.5 and 4.6, nodenext is available as a Compiler Option, but selecting it 5 | * will throw. 6 | */ 7 | export function allowsNodeNextModuleResolution(typescript: typeof TS): boolean { 8 | // If 'Node16' module resolution is available, NodeNext is allowed to be selected as a ModuleResolutionKind. 9 | // This happened in v4.7 10 | return typescript.ModuleResolutionKind.Node16 != null; 11 | } 12 | -------------------------------------------------------------------------------- /src/util/object/object-util.ts: -------------------------------------------------------------------------------- 1 | import type {IgnoredLookupValue} from "helpertypes"; 2 | 3 | // eslint-disable-next-line @typescript-eslint/ban-types 4 | export function isRecord(value: T): value is Exclude & {} { 5 | return ( 6 | !Array.isArray(value) && 7 | typeof value === "object" && 8 | value != null && 9 | !(value instanceof Date) && 10 | !(value instanceof Set) && 11 | !(value instanceof WeakSet) && 12 | !(value instanceof Map) && 13 | !(value instanceof WeakMap) 14 | ); 15 | } 16 | 17 | export function isPromise(value: unknown | Promise): value is Promise { 18 | return typeof value === "object" && value != null && "then" in value; 19 | } 20 | 21 | export function isArray(value: unknown | readonly T[]): value is readonly T[]; 22 | export function isArray(value: unknown | T[]): value is T[]; 23 | export function isArray(value: unknown | T[] | readonly T[]): value is T[] | readonly T[]; 24 | export function isArray(value: unknown | T[] | readonly T[]): value is T[] | readonly T[] { 25 | return Array.isArray(value); 26 | } 27 | -------------------------------------------------------------------------------- /src/util/os/os.ts: -------------------------------------------------------------------------------- 1 | import type osModule from "os"; 2 | 3 | export type OS = Pick; 4 | -------------------------------------------------------------------------------- /src/util/pick-resolved-module.ts: -------------------------------------------------------------------------------- 1 | import type {ExtendedResolvedModule} from "../service/cache/resolve-cache/extended-resolved-module.js"; 2 | 3 | export function pickResolvedModule(resolvedModule: ExtendedResolvedModule, preferAmbient: true): string; 4 | export function pickResolvedModule(resolvedModule: ExtendedResolvedModule, preferAmbient: false): string | undefined; 5 | export function pickResolvedModule(resolvedModule: ExtendedResolvedModule, preferAmbient: boolean): string | undefined; 6 | export function pickResolvedModule(resolvedModule: ExtendedResolvedModule, preferAmbient: boolean): string | undefined { 7 | if (preferAmbient) { 8 | return resolvedModule.resolvedAmbientFileName ?? resolvedModule.resolvedFileName!; 9 | } else { 10 | return resolvedModule.resolvedFileName; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/util/predicates/predicates.ts: -------------------------------------------------------------------------------- 1 | import type {TS} from "../../type/ts.js"; 2 | 3 | /** 4 | * Returns true if the given Node is a TemplateLiteralTypeNode 5 | */ 6 | export function isTemplateLiteralTypeNode(node: TS.Node, typescript: typeof TS): node is TS.TemplateLiteralTypeNode { 7 | return typescript.SyntaxKind.TemplateLiteralType != null && node.kind === typescript.SyntaxKind.TemplateLiteralType; 8 | } 9 | -------------------------------------------------------------------------------- /src/util/resolve-id/resolve-id.ts: -------------------------------------------------------------------------------- 1 | import type {ResolveModuleOptions} from "./resolve-module-options.js"; 2 | import type {ExtendedResolvedModule} from "../../service/cache/resolve-cache/extended-resolved-module.js"; 3 | 4 | /** 5 | * Resolves an id from the given parent 6 | */ 7 | export function resolveId({resolveCache, ...options}: ResolveModuleOptions): ExtendedResolvedModule | null { 8 | // Don't proceed if there is no parent (in which case this is an entry module) 9 | if (options.parent == null) return null; 10 | 11 | return resolveCache.get(options); 12 | } 13 | -------------------------------------------------------------------------------- /src/util/resolve-id/resolve-module-options.ts: -------------------------------------------------------------------------------- 1 | import type {GetResolvedIdWithCachingOptions} from "../../service/cache/resolve-cache/get-resolved-id-with-caching-options.js"; 2 | import type {ResolveCache} from "../../service/cache/resolve-cache/resolve-cache.js"; 3 | 4 | export interface ResolveModuleOptions extends GetResolvedIdWithCachingOptions { 5 | resolveCache: ResolveCache; 6 | } 7 | -------------------------------------------------------------------------------- /src/util/similarity-util.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Calculates Levenshtein distance 3 | */ 4 | export function similarity(a: string, b: string): number { 5 | let tmp: number | string | undefined; 6 | if (a.length === 0) { 7 | return b.length; 8 | } 9 | if (b.length === 0) { 10 | return a.length; 11 | } 12 | 13 | if (a.length > b.length) { 14 | tmp = a; 15 | a = b; 16 | b = tmp; 17 | } 18 | 19 | let i = 0; 20 | let j = 0; 21 | let res = 0; 22 | const alen = a.length; 23 | const blen = b.length; 24 | const row: number[] = Array(alen); 25 | for (i = 0; i <= alen; i++) { 26 | row[i] = i; 27 | } 28 | 29 | for (i = 1; i <= blen; i++) { 30 | res = i; 31 | for (j = 1; j <= alen; j++) { 32 | tmp = row[j - 1]; 33 | row[j - 1] = res; 34 | res = b[i - 1] === a[j - 1] ? tmp : Math.min(tmp + 1, Math.min(res + 1, row[j] + 1)); 35 | } 36 | } 37 | return res; 38 | } 39 | -------------------------------------------------------------------------------- /src/util/take-browserslist-or-compute-based-on-compiler-options/take-browserslist-or-compute-based-on-compiler-options.ts: -------------------------------------------------------------------------------- 1 | import {browsersWithSupportForEcmaVersion} from "browserslist-generator"; 2 | import {getEcmaVersionForScriptTarget} from "../get-script-target-from-browserslist/get-script-target-from-browserslist.js"; 3 | import type {TS} from "../../type/ts.js"; 4 | 5 | /** 6 | * If a browserslist is given, that one will be used. Otherwise, if the given CompilerOptions has a 'target' property, a Browserslist 7 | * will be computed based on the targeted Ecma version 8 | */ 9 | export function takeBrowserslistOrComputeBasedOnCompilerOptions( 10 | browserslist: string[] | undefined | false, 11 | compilerOptions: TS.CompilerOptions, 12 | typescript: typeof TS 13 | ): string[] | undefined { 14 | if (browserslist != null && browserslist !== false) { 15 | // If a browserslist is given, use it 16 | return browserslist; 17 | } else if (browserslist === false) { 18 | return undefined; 19 | } else { 20 | // Otherwise, generate a browserslist based on the tsconfig target if given 21 | return compilerOptions.target == null ? undefined : browsersWithSupportForEcmaVersion(getEcmaVersionForScriptTarget(compilerOptions.target, typescript)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/util/take-bundled-filenames/take-bundled-filenames.ts: -------------------------------------------------------------------------------- 1 | import type {OutputBundle} from "rollup"; 2 | import {isOutputChunk} from "../is-output-chunk/is-output-chunk.js"; 3 | import path from "crosspath"; 4 | 5 | /** 6 | * Takes all filenames that has been included in the given bundle 7 | */ 8 | export function takeBundledFilesNames(bundle: OutputBundle): Set { 9 | const bundledFilenames: Set = new Set(); 10 | Object.values(bundle).forEach(value => { 11 | if (isOutputChunk(value)) { 12 | Object.keys(value.modules).forEach(fileName => bundledFilenames.add(path.normalize(fileName))); 13 | } else if ("fileName" in value) { 14 | bundledFilenames.add(path.normalize(value.fileName)); 15 | } 16 | }); 17 | return bundledFilenames; 18 | } 19 | -------------------------------------------------------------------------------- /test/allow-importing-ts-extensions.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {formatCode} from "./util/format-code.js"; 3 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 4 | 5 | test.serial( 6 | "Supports importing files by referencing their .ts extensions when the 'allowImportingTsExtensions' CompilerOption is set. #1", 7 | {ts: ">=5.0"}, 8 | async (t, {typescript, rollup}) => { 9 | const bundle = await generateRollupBundle( 10 | [ 11 | { 12 | entry: true, 13 | fileName: "index.ts", 14 | text: `\ 15 | import {foo} from "./a.ts"; 16 | console.log(foo); 17 | export {foo}; 18 | ` 19 | }, 20 | { 21 | entry: false, 22 | fileName: "a.ts", 23 | text: `\ 24 | export const foo = 2; 25 | ` 26 | } 27 | ], 28 | { 29 | typescript, 30 | rollup, 31 | tsconfig: { 32 | allowImportingTsExtensions: true 33 | } 34 | } 35 | ); 36 | const { 37 | declarations: [file] 38 | } = bundle; 39 | 40 | t.deepEqual( 41 | formatCode(file.code), 42 | formatCode(`\ 43 | declare const foo = 2; 44 | export { foo } 45 | `) 46 | ); 47 | } 48 | ); 49 | -------------------------------------------------------------------------------- /test/cache.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {formatCode} from "./util/format-code.js"; 3 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 4 | 5 | test.serial("Declaration bundling works properly when Rollup is using a cache. #1", "*", async (t, {typescript, rollup}) => { 6 | const bundle = await generateRollupBundle( 7 | [ 8 | { 9 | entry: true, 10 | fileName: "index.ts", 11 | text: `\ 12 | export default () => 42 13 | ` 14 | } 15 | ], 16 | {typescript, rollup, runCachedBuild: true, debug: false} 17 | ); 18 | const { 19 | declarations: [file] 20 | } = bundle; 21 | 22 | t.deepEqual( 23 | formatCode(file.code), 24 | formatCode(`\ 25 | declare const _default: () => number; 26 | export { _default as default }; 27 | `) 28 | ); 29 | }); 30 | -------------------------------------------------------------------------------- /test/deferred-assets.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 3 | import {formatCode} from "./util/format-code.js"; 4 | 5 | test.serial("Won't break when other plugins declare deferred assets. #1", "*", async (t, {typescript, rollup}) => { 6 | let asset: string | undefined; 7 | 8 | const bundle = await generateRollupBundle( 9 | [ 10 | { 11 | entry: true, 12 | fileName: "index.ts", 13 | text: `\ 14 | console.log('whatever');` 15 | } 16 | ], 17 | { 18 | typescript, 19 | rollup, 20 | postPlugins: [ 21 | { 22 | name: "my-plugin", 23 | buildStart() { 24 | asset = this.emitFile({ 25 | type: "asset", 26 | fileName: "test.txt" 27 | }); 28 | }, 29 | generateBundle() { 30 | this.setAssetSource(asset!, "whatever"); 31 | } 32 | } 33 | ] 34 | } 35 | ); 36 | const { 37 | declarations: [file] 38 | } = bundle; 39 | 40 | t.deepEqual( 41 | formatCode(file.code), 42 | formatCode(`\ 43 | export {}; 44 | `) 45 | ); 46 | }); 47 | -------------------------------------------------------------------------------- /test/diagnostic.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 3 | 4 | test.serial("Will report diagnostics from the ParsedCommandLine. #1", "*", async (t, {typescript, rollup}) => { 5 | let hasReportedDiagnostic = false; 6 | await generateRollupBundle( 7 | [ 8 | { 9 | entry: true, 10 | fileName: "index.ts", 11 | text: `\ 12 | ` 13 | } 14 | ], 15 | { 16 | typescript, 17 | rollup, 18 | debug: false, 19 | hook: { 20 | diagnostics: diagnostics => { 21 | hasReportedDiagnostic = diagnostics.length > 0; 22 | return []; 23 | } 24 | }, 25 | tsconfig: { 26 | unsupportedOption: "foo" 27 | } 28 | } 29 | ); 30 | 31 | t.true(hasReportedDiagnostic); 32 | }); 33 | -------------------------------------------------------------------------------- /test/exclude.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {formatCode} from "./util/format-code.js"; 3 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 4 | import {createBuiltInModuleTestFiles} from "./setup/test-file.js"; 5 | 6 | test.serial("Is still capable of resolving SourceFiles when needed for when a file path is matched by the 'exclude' glob. #1", "*", async (t, {typescript, rollup}) => { 7 | const bundle = await generateRollupBundle( 8 | [ 9 | ...createBuiltInModuleTestFiles("buffer"), 10 | { 11 | entry: true, 12 | fileName: "index.ts", 13 | text: `\ 14 | export function foo (arg: Buffer): Buffer { 15 | return arg; 16 | } 17 | ` 18 | } 19 | ], 20 | { 21 | typescript, 22 | rollup, 23 | debug: false, 24 | exclude: ["node_modules/**/*.*"] 25 | } 26 | ); 27 | const { 28 | declarations: [file] 29 | } = bundle; 30 | 31 | t.deepEqual( 32 | formatCode(file.code), 33 | formatCode(`\ 34 | /// 35 | declare function foo(arg: Buffer): Buffer; 36 | export { foo }; 37 | `) 38 | ); 39 | }); 40 | -------------------------------------------------------------------------------- /test/json.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 3 | import json from "@rollup/plugin-json"; 4 | import {formatCode} from "./util/format-code.js"; 5 | 6 | test.serial("Handles .JSON files that has been pre-transformed by other plugins. #1", "*", async (t, {typescript, rollup}) => { 7 | const bundle = await generateRollupBundle( 8 | [ 9 | { 10 | entry: true, 11 | fileName: "index.ts", 12 | text: `\ 13 | import {name} from "./foo.json"; 14 | console.log(name); 15 | ` 16 | }, 17 | { 18 | entry: false, 19 | fileName: "foo.json", 20 | text: `\ 21 | { 22 | "name": "Foo" 23 | } 24 | ` 25 | } 26 | ], 27 | { 28 | typescript, 29 | rollup, 30 | debug: false, 31 | // eslint-disable-next-line @typescript-eslint/ban-ts-comment 32 | // @ts-ignore 33 | prePlugins: [json()], 34 | tsconfig: { 35 | resolveJsonModule: true 36 | } 37 | } 38 | ); 39 | const { 40 | js: [file] 41 | } = bundle; 42 | t.deepEqual( 43 | formatCode(file.code), 44 | formatCode(`\ 45 | var name = "Foo"; 46 | 47 | console.log(name); 48 | `) 49 | ); 50 | }); 51 | -------------------------------------------------------------------------------- /test/module.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {formatCode} from "./util/format-code.js"; 3 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 4 | 5 | test.serial("Files are always treated as modules when generating declarations. #1", "*", async (t, {typescript, rollup}) => { 6 | const bundle = await generateRollupBundle( 7 | [ 8 | { 9 | entry: true, 10 | fileName: "index.ts", 11 | text: `\ 12 | console.log(true); 13 | ` 14 | } 15 | ], 16 | { 17 | typescript, 18 | rollup, 19 | debug: false 20 | } 21 | ); 22 | const { 23 | declarations: [file] 24 | } = bundle; 25 | t.deepEqual( 26 | formatCode(file.code), 27 | formatCode(`\ 28 | export {}; 29 | `) 30 | ); 31 | }); 32 | 33 | test.serial("Files are always treated as modules when generating declarations. #2", "*", async (t, {typescript, rollup}) => { 34 | const bundle = await generateRollupBundle( 35 | [ 36 | { 37 | entry: true, 38 | fileName: "index.ts", 39 | text: `\ 40 | (async () => {})(); 41 | ` 42 | } 43 | ], 44 | { 45 | typescript, 46 | rollup, 47 | debug: false 48 | } 49 | ); 50 | const { 51 | declarations: [file] 52 | } = bundle; 53 | 54 | t.deepEqual( 55 | formatCode(file.code), 56 | formatCode(`\ 57 | export {}; 58 | `) 59 | ); 60 | }); 61 | -------------------------------------------------------------------------------- /test/setup/create-virtual-file-system.ts: -------------------------------------------------------------------------------- 1 | import path from "crosspath"; 2 | import type {TestFileRecord} from "./test-file.js"; 3 | import {createFsFromVolume, Volume} from "memfs"; 4 | import type {FileSystem} from "../../src/util/file-system/file-system.js"; 5 | 6 | export function createVirtualFileSystem(files: TestFileRecord[]): FileSystem { 7 | const vol = new Volume(); 8 | for (const file of files) { 9 | vol.mkdirSync(path.native.normalize(path.dirname(file.fileName)), {recursive: true}); 10 | vol.writeFileSync(path.native.normalize(file.fileName), file.text); 11 | } 12 | 13 | return createFsFromVolume(vol) as unknown as FileSystem; 14 | } 15 | -------------------------------------------------------------------------------- /test/setup/test-result.ts: -------------------------------------------------------------------------------- 1 | export interface FileResult { 2 | fileName: string; 3 | code: string; 4 | } 5 | -------------------------------------------------------------------------------- /test/setup/test-setup.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | import type {TestContext} from "./test-context.js"; 3 | import {createTestContext} from "./test-context.js"; 4 | import type {TestFile, TestFileStructure} from "./test-file.js"; 5 | import {createTestFileStructure} from "./test-file.js"; 6 | import {createVirtualFileSystem} from "./create-virtual-file-system.js"; 7 | import type {MaybeArray, PartialExcept} from "helpertypes"; 8 | import type {TS} from "../../src/type/ts.js"; 9 | import {createTypeScriptSystem} from "../util/create-typescript-system.js"; 10 | 11 | export interface TestSetup { 12 | context: TestContext; 13 | fileSystem: TS.System; 14 | fileStructure: TestFileStructure; 15 | } 16 | 17 | export function createTestSetup(inputFiles: MaybeArray, options: PartialExcept): TestSetup { 18 | const context = createTestContext(options); 19 | const fileStructure = createTestFileStructure(inputFiles, context); 20 | const fileSystem = createVirtualFileSystem(fileStructure.files); 21 | 22 | const {typescript, cwd} = context; 23 | 24 | return { 25 | context, 26 | fileStructure, 27 | fileSystem: createTypeScriptSystem({typescript, cwd, fs: fileSystem}) 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /test/tslib.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 3 | import {formatCode} from "./util/format-code.js"; 4 | 5 | test.serial("Will treat every file as a module with tslib. #1", {ts: ">=3.6"}, async (t, {typescript, rollup}) => { 6 | const bundle = await generateRollupBundle( 7 | [ 8 | { 9 | entry: true, 10 | fileName: "index.ts", 11 | text: `\ 12 | (async () => {})(); 13 | ` 14 | } 15 | ], 16 | { 17 | typescript, 18 | rollup, 19 | rollupOptions: { 20 | external: ["tslib"] 21 | }, 22 | 23 | tsconfig: { 24 | target: "es3", 25 | lib: ["esnext"] 26 | } 27 | } 28 | ); 29 | const { 30 | bundle: { 31 | output: [file] 32 | } 33 | } = bundle; 34 | 35 | t.deepEqual( 36 | formatCode(file.code), 37 | formatCode(`\ 38 | import { __awaiter, __generator } from 'tslib'; 39 | 40 | (function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { 41 | return [2 /*return*/]; 42 | }); }); })(); 43 | `) 44 | ); 45 | }); 46 | -------------------------------------------------------------------------------- /test/type-only-import-export.test.ts: -------------------------------------------------------------------------------- 1 | import {test} from "./util/test-runner.js"; 2 | import {generateRollupBundle} from "./setup/setup-rollup.js"; 3 | import {formatCode} from "./util/format-code.js"; 4 | 5 | test.serial("Handles type-only imports and exports. #1", {ts: ">=3.8"}, async (t, {typescript, rollup}) => { 6 | const bundle = await generateRollupBundle( 7 | [ 8 | { 9 | entry: true, 10 | fileName: "index.ts", 11 | text: `\ 12 | import type { Foo } from "./foo"; 13 | export type { Foo }; 14 | ` 15 | }, 16 | { 17 | entry: false, 18 | fileName: "foo.ts", 19 | text: `\ 20 | interface Foo {} 21 | export type {Foo}; 22 | ` 23 | } 24 | ], 25 | { 26 | typescript, 27 | rollup, 28 | debug: false 29 | } 30 | ); 31 | const { 32 | declarations: [file] 33 | } = bundle; 34 | t.deepEqual( 35 | formatCode(file.code), 36 | formatCode(`\ 37 | interface Foo {} 38 | export type {Foo}; 39 | `) 40 | ); 41 | }); 42 | -------------------------------------------------------------------------------- /test/util/format-code.ts: -------------------------------------------------------------------------------- 1 | import prettier from "@prettier/sync"; 2 | 3 | export function formatCode(code: string, parser: "typescript" | "json" = "typescript"): string { 4 | return prettier.format(code, {parser, endOfLine: "lf"}); 5 | } 6 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.*"], 4 | "compilerOptions": { 5 | "declaration": true, 6 | "declarationMap": false 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src/**/*.*", "test/**/*.*", "rollup.config.ts"], 3 | "extends": "@wessberg/ts-config", 4 | "compilerOptions": { 5 | "target": "es2019", 6 | "downlevelIteration": false 7 | } 8 | } 9 | --------------------------------------------------------------------------------