@wyw-in-js/transform 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/esm/babel.js +2 -0
- package/esm/babel.js.map +1 -0
- package/esm/cache.js +80 -0
- package/esm/cache.js.map +1 -0
- package/esm/debug/fileReporter.js +144 -0
- package/esm/debug/fileReporter.js.map +1 -0
- package/esm/evaluators/index.js +14 -0
- package/esm/evaluators/index.js.map +1 -0
- package/esm/index.js +24 -0
- package/esm/index.js.map +1 -0
- package/esm/module.js +316 -0
- package/esm/module.js.map +1 -0
- package/esm/options/babel-merge.d.js +2 -0
- package/esm/options/babel-merge.d.js.map +1 -0
- package/esm/options/buildOptions.js +28 -0
- package/esm/options/buildOptions.js.map +1 -0
- package/esm/options/loadBabelOptions.js +24 -0
- package/esm/options/loadBabelOptions.js.map +1 -0
- package/esm/plugins/babel-transform.js +53 -0
- package/esm/plugins/babel-transform.js.map +1 -0
- package/esm/plugins/collector.js +66 -0
- package/esm/plugins/collector.js.map +1 -0
- package/esm/plugins/dynamic-import.js +28 -0
- package/esm/plugins/dynamic-import.js.map +1 -0
- package/esm/plugins/preeval.js +75 -0
- package/esm/plugins/preeval.js.map +1 -0
- package/esm/plugins/shaker.js +296 -0
- package/esm/plugins/shaker.js.map +1 -0
- package/esm/shaker.js +50 -0
- package/esm/shaker.js.map +1 -0
- package/esm/transform/BaseEntrypoint.js +164 -0
- package/esm/transform/BaseEntrypoint.js.map +1 -0
- package/esm/transform/Entrypoint.helpers.js +168 -0
- package/esm/transform/Entrypoint.helpers.js.map +1 -0
- package/esm/transform/Entrypoint.js +212 -0
- package/esm/transform/Entrypoint.js.map +1 -0
- package/esm/transform/Entrypoint.types.js +2 -0
- package/esm/transform/Entrypoint.types.js.map +1 -0
- package/esm/transform/EvaluatedEntrypoint.js +6 -0
- package/esm/transform/EvaluatedEntrypoint.js.map +1 -0
- package/esm/transform/actions/AbortError.js +8 -0
- package/esm/transform/actions/AbortError.js.map +1 -0
- package/esm/transform/actions/BaseAction.js +134 -0
- package/esm/transform/actions/BaseAction.js.map +1 -0
- package/esm/transform/actions/UnprocessedEntrypointError.js +8 -0
- package/esm/transform/actions/UnprocessedEntrypointError.js.map +1 -0
- package/esm/transform/actions/actionRunner.js +73 -0
- package/esm/transform/actions/actionRunner.js.map +1 -0
- package/esm/transform/actions/types.js +2 -0
- package/esm/transform/actions/types.js.map +1 -0
- package/esm/transform/generators/baseProcessingHandlers.js +22 -0
- package/esm/transform/generators/baseProcessingHandlers.js.map +1 -0
- package/esm/transform/generators/collect.js +58 -0
- package/esm/transform/generators/collect.js.map +1 -0
- package/esm/transform/generators/evalFile.js +50 -0
- package/esm/transform/generators/evalFile.js.map +1 -0
- package/esm/transform/generators/explodeReexports.js +63 -0
- package/esm/transform/generators/explodeReexports.js.map +1 -0
- package/esm/transform/generators/extract.js +120 -0
- package/esm/transform/generators/extract.js.map +1 -0
- package/esm/transform/generators/getExports.js +73 -0
- package/esm/transform/generators/getExports.js.map +1 -0
- package/esm/transform/generators/index.js +13 -0
- package/esm/transform/generators/index.js.map +1 -0
- package/esm/transform/generators/processEntrypoint.js +43 -0
- package/esm/transform/generators/processEntrypoint.js.map +1 -0
- package/esm/transform/generators/processImports.js +23 -0
- package/esm/transform/generators/processImports.js.map +1 -0
- package/esm/transform/generators/resolveImports.js +148 -0
- package/esm/transform/generators/resolveImports.js.map +1 -0
- package/esm/transform/generators/transform.js +117 -0
- package/esm/transform/generators/transform.js.map +1 -0
- package/esm/transform/generators/workflow.js +82 -0
- package/esm/transform/generators/workflow.js.map +1 -0
- package/esm/transform/helpers/loadLinariaOptions.js +66 -0
- package/esm/transform/helpers/loadLinariaOptions.js.map +1 -0
- package/esm/transform/helpers/withDefaultServices.js +21 -0
- package/esm/transform/helpers/withDefaultServices.js.map +1 -0
- package/esm/transform/rootLog.js +3 -0
- package/esm/transform/rootLog.js.map +1 -0
- package/esm/transform/types.js +2 -0
- package/esm/transform/types.js.map +1 -0
- package/esm/transform.js +121 -0
- package/esm/transform.js.map +1 -0
- package/esm/types.js +2 -0
- package/esm/types.js.map +1 -0
- package/esm/utils/EventEmitter.js +52 -0
- package/esm/utils/EventEmitter.js.map +1 -0
- package/esm/utils/ShakerMetadata.js +2 -0
- package/esm/utils/ShakerMetadata.js.map +1 -0
- package/esm/utils/TransformMetadata.js +11 -0
- package/esm/utils/TransformMetadata.js.map +1 -0
- package/esm/utils/addIdentifierToLinariaPreval.js +68 -0
- package/esm/utils/addIdentifierToLinariaPreval.js.map +1 -0
- package/esm/utils/collectExportsAndImports.js +974 -0
- package/esm/utils/collectExportsAndImports.js.map +1 -0
- package/esm/utils/collectTemplateDependencies.js +219 -0
- package/esm/utils/collectTemplateDependencies.js.map +1 -0
- package/esm/utils/createId.js +6 -0
- package/esm/utils/createId.js.map +1 -0
- package/esm/utils/dispose-polyfill.js +6 -0
- package/esm/utils/dispose-polyfill.js.map +1 -0
- package/esm/utils/findIdentifiers.js +62 -0
- package/esm/utils/findIdentifiers.js.map +1 -0
- package/esm/utils/findPackageJSON.js +22 -0
- package/esm/utils/findPackageJSON.js.map +1 -0
- package/esm/utils/getFileIdx.js +10 -0
- package/esm/utils/getFileIdx.js.map +1 -0
- package/esm/utils/getPluginKey.js +13 -0
- package/esm/utils/getPluginKey.js.map +1 -0
- package/esm/utils/getScope.js +6 -0
- package/esm/utils/getScope.js.map +1 -0
- package/esm/utils/getSource.js +15 -0
- package/esm/utils/getSource.js.map +1 -0
- package/esm/utils/getTagProcessor.js +304 -0
- package/esm/utils/getTagProcessor.js.map +1 -0
- package/esm/utils/getVisitorKeys.js +5 -0
- package/esm/utils/getVisitorKeys.js.map +1 -0
- package/esm/utils/hasLinariaPreval.js +7 -0
- package/esm/utils/hasLinariaPreval.js.map +1 -0
- package/esm/utils/isExports.js +22 -0
- package/esm/utils/isExports.js.map +1 -0
- package/esm/utils/isGlobal.js +6 -0
- package/esm/utils/isGlobal.js.map +1 -0
- package/esm/utils/isNode.js +2 -0
- package/esm/utils/isNode.js.map +1 -0
- package/esm/utils/isNodePath.js +4 -0
- package/esm/utils/isNodePath.js.map +1 -0
- package/esm/utils/isNotNull.js +4 -0
- package/esm/utils/isNotNull.js.map +1 -0
- package/esm/utils/isRemoved.js +46 -0
- package/esm/utils/isRemoved.js.map +1 -0
- package/esm/utils/isRequire.js +13 -0
- package/esm/utils/isRequire.js.map +1 -0
- package/esm/utils/isSerializable.js +13 -0
- package/esm/utils/isSerializable.js.map +1 -0
- package/esm/utils/isTypedNode.js +6 -0
- package/esm/utils/isTypedNode.js.map +1 -0
- package/esm/utils/isUnnecessaryReactCall.js +72 -0
- package/esm/utils/isUnnecessaryReactCall.js.map +1 -0
- package/esm/utils/peek.js +2 -0
- package/esm/utils/peek.js.map +1 -0
- package/esm/utils/processTemplateExpression.js +11 -0
- package/esm/utils/processTemplateExpression.js.map +1 -0
- package/esm/utils/removeDangerousCode.js +127 -0
- package/esm/utils/removeDangerousCode.js.map +1 -0
- package/esm/utils/scopeHelpers.js +514 -0
- package/esm/utils/scopeHelpers.js.map +1 -0
- package/esm/utils/traversalCache.js +28 -0
- package/esm/utils/traversalCache.js.map +1 -0
- package/esm/utils/unwrapSequence.js +14 -0
- package/esm/utils/unwrapSequence.js.map +1 -0
- package/esm/utils/valueToLiteral.js +59 -0
- package/esm/utils/valueToLiteral.js.map +1 -0
- package/esm/utils/visitors/JSXElementsRemover.js +51 -0
- package/esm/utils/visitors/JSXElementsRemover.js.map +1 -0
- package/esm/vm/createVmContext.js +72 -0
- package/esm/vm/createVmContext.js.map +1 -0
- package/esm/vm/process.js +29 -0
- package/esm/vm/process.js.map +1 -0
- package/lib/babel.js +2 -0
- package/lib/babel.js.map +1 -0
- package/lib/cache.js +87 -0
- package/lib/cache.js.map +1 -0
- package/lib/debug/fileReporter.js +153 -0
- package/lib/debug/fileReporter.js.map +1 -0
- package/lib/evaluators/index.js +20 -0
- package/lib/evaluators/index.js.map +1 -0
- package/lib/index.js +225 -0
- package/lib/index.js.map +1 -0
- package/lib/module.js +327 -0
- package/lib/module.js.map +1 -0
- package/lib/options/babel-merge.d.js +2 -0
- package/lib/options/babel-merge.d.js.map +1 -0
- package/lib/options/buildOptions.js +35 -0
- package/lib/options/buildOptions.js.map +1 -0
- package/lib/options/loadBabelOptions.js +31 -0
- package/lib/options/loadBabelOptions.js.map +1 -0
- package/lib/plugins/babel-transform.js +60 -0
- package/lib/plugins/babel-transform.js.map +1 -0
- package/lib/plugins/collector.js +76 -0
- package/lib/plugins/collector.js.map +1 -0
- package/lib/plugins/dynamic-import.js +34 -0
- package/lib/plugins/dynamic-import.js.map +1 -0
- package/lib/plugins/preeval.js +82 -0
- package/lib/plugins/preeval.js.map +1 -0
- package/lib/plugins/shaker.js +303 -0
- package/lib/plugins/shaker.js.map +1 -0
- package/lib/shaker.js +58 -0
- package/lib/shaker.js.map +1 -0
- package/lib/transform/BaseEntrypoint.js +175 -0
- package/lib/transform/BaseEntrypoint.js.map +1 -0
- package/lib/transform/Entrypoint.helpers.js +182 -0
- package/lib/transform/Entrypoint.helpers.js.map +1 -0
- package/lib/transform/Entrypoint.js +226 -0
- package/lib/transform/Entrypoint.js.map +1 -0
- package/lib/transform/Entrypoint.types.js +2 -0
- package/lib/transform/Entrypoint.types.js.map +1 -0
- package/lib/transform/EvaluatedEntrypoint.js +13 -0
- package/lib/transform/EvaluatedEntrypoint.js.map +1 -0
- package/lib/transform/actions/AbortError.js +16 -0
- package/lib/transform/actions/AbortError.js.map +1 -0
- package/lib/transform/actions/BaseAction.js +144 -0
- package/lib/transform/actions/BaseAction.js.map +1 -0
- package/lib/transform/actions/UnprocessedEntrypointError.js +16 -0
- package/lib/transform/actions/UnprocessedEntrypointError.js.map +1 -0
- package/lib/transform/actions/actionRunner.js +82 -0
- package/lib/transform/actions/actionRunner.js.map +1 -0
- package/lib/transform/actions/types.js +2 -0
- package/lib/transform/actions/types.js.map +1 -0
- package/lib/transform/generators/baseProcessingHandlers.js +27 -0
- package/lib/transform/generators/baseProcessingHandlers.js.map +1 -0
- package/lib/transform/generators/collect.js +66 -0
- package/lib/transform/generators/collect.js.map +1 -0
- package/lib/transform/generators/evalFile.js +57 -0
- package/lib/transform/generators/evalFile.js.map +1 -0
- package/lib/transform/generators/explodeReexports.js +70 -0
- package/lib/transform/generators/explodeReexports.js.map +1 -0
- package/lib/transform/generators/extract.js +128 -0
- package/lib/transform/generators/extract.js.map +1 -0
- package/lib/transform/generators/getExports.js +80 -0
- package/lib/transform/generators/getExports.js.map +1 -0
- package/lib/transform/generators/index.js +19 -0
- package/lib/transform/generators/index.js.map +1 -0
- package/lib/transform/generators/processEntrypoint.js +49 -0
- package/lib/transform/generators/processEntrypoint.js.map +1 -0
- package/lib/transform/generators/processImports.js +29 -0
- package/lib/transform/generators/processImports.js.map +1 -0
- package/lib/transform/generators/resolveImports.js +158 -0
- package/lib/transform/generators/resolveImports.js.map +1 -0
- package/lib/transform/generators/transform.js +130 -0
- package/lib/transform/generators/transform.js.map +1 -0
- package/lib/transform/generators/workflow.js +90 -0
- package/lib/transform/generators/workflow.js.map +1 -0
- package/lib/transform/helpers/loadLinariaOptions.js +73 -0
- package/lib/transform/helpers/loadLinariaOptions.js.map +1 -0
- package/lib/transform/helpers/withDefaultServices.js +30 -0
- package/lib/transform/helpers/withDefaultServices.js.map +1 -0
- package/lib/transform/rootLog.js +9 -0
- package/lib/transform/rootLog.js.map +1 -0
- package/lib/transform/types.js +8 -0
- package/lib/transform/types.js.map +1 -0
- package/lib/transform.js +128 -0
- package/lib/transform.js.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/EventEmitter.js +61 -0
- package/lib/utils/EventEmitter.js.map +1 -0
- package/lib/utils/ShakerMetadata.js +9 -0
- package/lib/utils/ShakerMetadata.js.map +1 -0
- package/lib/utils/TransformMetadata.js +19 -0
- package/lib/utils/TransformMetadata.js.map +1 -0
- package/lib/utils/addIdentifierToLinariaPreval.js +75 -0
- package/lib/utils/addIdentifierToLinariaPreval.js.map +1 -0
- package/lib/utils/collectExportsAndImports.js +990 -0
- package/lib/utils/collectExportsAndImports.js.map +1 -0
- package/lib/utils/collectTemplateDependencies.js +233 -0
- package/lib/utils/collectTemplateDependencies.js.map +1 -0
- package/lib/utils/createId.js +13 -0
- package/lib/utils/createId.js.map +1 -0
- package/lib/utils/dispose-polyfill.js +9 -0
- package/lib/utils/dispose-polyfill.js.map +1 -0
- package/lib/utils/findIdentifiers.js +73 -0
- package/lib/utils/findIdentifiers.js.map +1 -0
- package/lib/utils/findPackageJSON.js +29 -0
- package/lib/utils/findPackageJSON.js.map +1 -0
- package/lib/utils/getFileIdx.js +16 -0
- package/lib/utils/getFileIdx.js.map +1 -0
- package/lib/utils/getPluginKey.js +21 -0
- package/lib/utils/getPluginKey.js.map +1 -0
- package/lib/utils/getScope.js +12 -0
- package/lib/utils/getScope.js.map +1 -0
- package/lib/utils/getSource.js +24 -0
- package/lib/utils/getSource.js.map +1 -0
- package/lib/utils/getTagProcessor.js +318 -0
- package/lib/utils/getTagProcessor.js.map +1 -0
- package/lib/utils/getVisitorKeys.js +11 -0
- package/lib/utils/getVisitorKeys.js.map +1 -0
- package/lib/utils/hasLinariaPreval.js +13 -0
- package/lib/utils/hasLinariaPreval.js.map +1 -0
- package/lib/utils/isExports.js +27 -0
- package/lib/utils/isExports.js.map +1 -0
- package/lib/utils/isGlobal.js +13 -0
- package/lib/utils/isGlobal.js.map +1 -0
- package/lib/utils/isNode.js +9 -0
- package/lib/utils/isNode.js.map +1 -0
- package/lib/utils/isNodePath.js +10 -0
- package/lib/utils/isNodePath.js.map +1 -0
- package/lib/utils/isNotNull.js +10 -0
- package/lib/utils/isNotNull.js.map +1 -0
- package/lib/utils/isRemoved.js +52 -0
- package/lib/utils/isRemoved.js.map +1 -0
- package/lib/utils/isRequire.js +18 -0
- package/lib/utils/isRequire.js.map +1 -0
- package/lib/utils/isSerializable.js +19 -0
- package/lib/utils/isSerializable.js.map +1 -0
- package/lib/utils/isTypedNode.js +13 -0
- package/lib/utils/isTypedNode.js.map +1 -0
- package/lib/utils/isUnnecessaryReactCall.js +81 -0
- package/lib/utils/isUnnecessaryReactCall.js.map +1 -0
- package/lib/utils/peek.js +9 -0
- package/lib/utils/peek.js.map +1 -0
- package/lib/utils/processTemplateExpression.js +18 -0
- package/lib/utils/processTemplateExpression.js.map +1 -0
- package/lib/utils/removeDangerousCode.js +134 -0
- package/lib/utils/removeDangerousCode.js.map +1 -0
- package/lib/utils/scopeHelpers.js +544 -0
- package/lib/utils/scopeHelpers.js.map +1 -0
- package/lib/utils/traversalCache.js +38 -0
- package/lib/utils/traversalCache.js.map +1 -0
- package/lib/utils/unwrapSequence.js +20 -0
- package/lib/utils/unwrapSequence.js.map +1 -0
- package/lib/utils/valueToLiteral.js +65 -0
- package/lib/utils/valueToLiteral.js.map +1 -0
- package/lib/utils/visitors/JSXElementsRemover.js +57 -0
- package/lib/utils/visitors/JSXElementsRemover.js.map +1 -0
- package/lib/vm/createVmContext.js +80 -0
- package/lib/vm/createVmContext.js.map +1 -0
- package/lib/vm/process.js +38 -0
- package/lib/vm/process.js.map +1 -0
- package/package.json +63 -0
- package/types/babel.d.ts +2 -0
- package/types/babel.js +2 -0
- package/types/cache.d.ts +24 -0
- package/types/cache.js +85 -0
- package/types/debug/fileReporter.d.ts +27 -0
- package/types/debug/fileReporter.js +151 -0
- package/types/evaluators/index.d.ts +10 -0
- package/types/evaluators/index.js +15 -0
- package/types/index.d.ts +30 -0
- package/types/index.js +69 -0
- package/types/module.d.ts +62 -0
- package/types/module.js +318 -0
- package/types/options/buildOptions.d.ts +7 -0
- package/types/options/buildOptions.js +35 -0
- package/types/options/loadBabelOptions.d.ts +3 -0
- package/types/options/loadBabelOptions.js +27 -0
- package/types/plugins/babel-transform.d.ts +4 -0
- package/types/plugins/babel-transform.js +49 -0
- package/types/plugins/collector.d.ts +16 -0
- package/types/plugins/collector.js +67 -0
- package/types/plugins/dynamic-import.d.ts +6 -0
- package/types/plugins/dynamic-import.js +32 -0
- package/types/plugins/preeval.d.ts +16 -0
- package/types/plugins/preeval.js +69 -0
- package/types/plugins/shaker.d.ts +11 -0
- package/types/plugins/shaker.js +299 -0
- package/types/shaker.d.ts +3 -0
- package/types/shaker.js +64 -0
- package/types/transform/BaseEntrypoint.d.ts +23 -0
- package/types/transform/BaseEntrypoint.js +182 -0
- package/types/transform/Entrypoint.d.ts +50 -0
- package/types/transform/Entrypoint.helpers.d.ts +14 -0
- package/types/transform/Entrypoint.helpers.js +169 -0
- package/types/transform/Entrypoint.js +223 -0
- package/types/transform/Entrypoint.types.d.ts +23 -0
- package/types/transform/Entrypoint.types.js +2 -0
- package/types/transform/EvaluatedEntrypoint.d.ts +16 -0
- package/types/transform/EvaluatedEntrypoint.js +9 -0
- package/types/transform/actions/AbortError.d.ts +4 -0
- package/types/transform/actions/AbortError.js +12 -0
- package/types/transform/actions/BaseAction.d.ts +40 -0
- package/types/transform/actions/BaseAction.js +149 -0
- package/types/transform/actions/UnprocessedEntrypointError.d.ts +6 -0
- package/types/transform/actions/UnprocessedEntrypointError.js +13 -0
- package/types/transform/actions/actionRunner.d.ts +4 -0
- package/types/transform/actions/actionRunner.js +86 -0
- package/types/transform/actions/types.d.ts +15 -0
- package/types/transform/actions/types.js +2 -0
- package/types/transform/generators/baseProcessingHandlers.d.ts +17 -0
- package/types/transform/generators/baseProcessingHandlers.js +23 -0
- package/types/transform/generators/collect.d.ts +6 -0
- package/types/transform/generators/collect.js +57 -0
- package/types/transform/generators/evalFile.d.ts +6 -0
- package/types/transform/generators/evalFile.js +56 -0
- package/types/transform/generators/explodeReexports.d.ts +7 -0
- package/types/transform/generators/explodeReexports.js +67 -0
- package/types/transform/generators/extract.d.ts +8 -0
- package/types/transform/generators/extract.js +116 -0
- package/types/transform/generators/getExports.d.ts +8 -0
- package/types/transform/generators/getExports.js +65 -0
- package/types/transform/generators/index.d.ts +15 -0
- package/types/transform/generators/index.js +15 -0
- package/types/transform/generators/processEntrypoint.d.ts +9 -0
- package/types/transform/generators/processEntrypoint.js +88 -0
- package/types/transform/generators/processImports.d.ts +5 -0
- package/types/transform/generators/processImports.js +21 -0
- package/types/transform/generators/resolveImports.d.ts +9 -0
- package/types/transform/generators/resolveImports.js +124 -0
- package/types/transform/generators/transform.d.ts +17 -0
- package/types/transform/generators/transform.js +115 -0
- package/types/transform/generators/workflow.d.ts +7 -0
- package/types/transform/generators/workflow.js +77 -0
- package/types/transform/helpers/loadLinariaOptions.d.ts +6 -0
- package/types/transform/helpers/loadLinariaOptions.js +86 -0
- package/types/transform/helpers/withDefaultServices.d.ts +5 -0
- package/types/transform/helpers/withDefaultServices.js +40 -0
- package/types/transform/rootLog.d.ts +3 -0
- package/types/transform/rootLog.js +5 -0
- package/types/transform/types.d.ts +137 -0
- package/types/transform/types.js +4 -0
- package/types/transform.d.ts +20 -0
- package/types/transform.js +121 -0
- package/types/types.d.ts +72 -0
- package/types/types.js +5 -0
- package/types/utils/EventEmitter.d.ts +58 -0
- package/types/utils/EventEmitter.js +61 -0
- package/types/utils/ShakerMetadata.d.ts +7 -0
- package/types/utils/ShakerMetadata.js +5 -0
- package/types/utils/TransformMetadata.d.ts +13 -0
- package/types/utils/TransformMetadata.js +17 -0
- package/types/utils/addIdentifierToLinariaPreval.d.ts +4 -0
- package/types/utils/addIdentifierToLinariaPreval.js +75 -0
- package/types/utils/collectExportsAndImports.d.ts +31 -0
- package/types/utils/collectExportsAndImports.js +962 -0
- package/types/utils/collectTemplateDependencies.d.ts +17 -0
- package/types/utils/collectTemplateDependencies.js +212 -0
- package/types/utils/createId.d.ts +2 -0
- package/types/utils/createId.js +9 -0
- package/types/utils/dispose-polyfill.d.ts +0 -0
- package/types/utils/dispose-polyfill.js +5 -0
- package/types/utils/findIdentifiers.d.ts +6 -0
- package/types/utils/findIdentifiers.js +68 -0
- package/types/utils/findPackageJSON.d.ts +1 -0
- package/types/utils/findPackageJSON.js +29 -0
- package/types/utils/getFileIdx.d.ts +1 -0
- package/types/utils/getFileIdx.js +13 -0
- package/types/utils/getPluginKey.d.ts +2 -0
- package/types/utils/getPluginKey.js +16 -0
- package/types/utils/getScope.d.ts +2 -0
- package/types/utils/getScope.js +11 -0
- package/types/utils/getSource.d.ts +2 -0
- package/types/utils/getSource.js +22 -0
- package/types/utils/getTagProcessor.d.ts +6 -0
- package/types/utils/getTagProcessor.js +315 -0
- package/types/utils/getVisitorKeys.d.ts +5 -0
- package/types/utils/getVisitorKeys.js +8 -0
- package/types/utils/hasLinariaPreval.d.ts +4 -0
- package/types/utils/hasLinariaPreval.js +9 -0
- package/types/utils/isExports.d.ts +6 -0
- package/types/utils/isExports.js +20 -0
- package/types/utils/isGlobal.d.ts +2 -0
- package/types/utils/isGlobal.js +9 -0
- package/types/utils/isNode.d.ts +2 -0
- package/types/utils/isNode.js +7 -0
- package/types/utils/isNodePath.d.ts +3 -0
- package/types/utils/isNodePath.js +7 -0
- package/types/utils/isNotNull.d.ts +1 -0
- package/types/utils/isNotNull.js +7 -0
- package/types/utils/isRemoved.d.ts +5 -0
- package/types/utils/isRemoved.js +42 -0
- package/types/utils/isRequire.d.ts +6 -0
- package/types/utils/isRequire.js +15 -0
- package/types/utils/isSerializable.d.ts +2 -0
- package/types/utils/isSerializable.js +18 -0
- package/types/utils/isTypedNode.d.ts +5 -0
- package/types/utils/isTypedNode.js +9 -0
- package/types/utils/isUnnecessaryReactCall.d.ts +3 -0
- package/types/utils/isUnnecessaryReactCall.js +76 -0
- package/types/utils/peek.d.ts +1 -0
- package/types/utils/peek.js +5 -0
- package/types/utils/processTemplateExpression.d.ts +5 -0
- package/types/utils/processTemplateExpression.js +17 -0
- package/types/utils/removeDangerousCode.d.ts +3 -0
- package/types/utils/removeDangerousCode.js +144 -0
- package/types/utils/scopeHelpers.d.ts +12 -0
- package/types/utils/scopeHelpers.js +568 -0
- package/types/utils/traversalCache.d.ts +5 -0
- package/types/utils/traversalCache.js +36 -0
- package/types/utils/unwrapSequence.d.ts +8 -0
- package/types/utils/unwrapSequence.js +17 -0
- package/types/utils/valueToLiteral.d.ts +3 -0
- package/types/utils/valueToLiteral.js +64 -0
- package/types/utils/visitors/JSXElementsRemover.d.ts +3 -0
- package/types/utils/visitors/JSXElementsRemover.js +52 -0
- package/types/vm/createVmContext.d.ts +7 -0
- package/types/vm/createVmContext.js +92 -0
- package/types/vm/process.d.ts +25 -0
- package/types/vm/process.js +32 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
|
3
|
+
/// <reference path="./babel-merge.d.ts" />
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.buildOptions = void 0;
|
|
9
|
+
const babel_merge_1 = __importDefault(require("babel-merge"));
|
|
10
|
+
const isNotNull_1 = require("../utils/isNotNull");
|
|
11
|
+
const cache = new WeakMap();
|
|
12
|
+
const merge = (a, b) => {
|
|
13
|
+
if (!cache.has(a)) {
|
|
14
|
+
cache.set(a, new WeakMap());
|
|
15
|
+
}
|
|
16
|
+
const cacheForA = cache.get(a);
|
|
17
|
+
if (cacheForA.has(b)) {
|
|
18
|
+
return cacheForA.get(b);
|
|
19
|
+
}
|
|
20
|
+
const result = (0, babel_merge_1.default)(a, b);
|
|
21
|
+
cacheForA.set(b, result);
|
|
22
|
+
return result;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Merges babel configs together. If a pair of configs were merged before,
|
|
26
|
+
* it will return the cached result.
|
|
27
|
+
*/
|
|
28
|
+
function buildOptions(...configs) {
|
|
29
|
+
// Merge all configs together
|
|
30
|
+
return configs
|
|
31
|
+
.map((i) => i ?? null)
|
|
32
|
+
.filter(isNotNull_1.isNotNull)
|
|
33
|
+
.reduce(merge);
|
|
34
|
+
}
|
|
35
|
+
exports.buildOptions = buildOptions;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadBabelOptions = void 0;
|
|
4
|
+
const cache = new WeakMap();
|
|
5
|
+
const empty = {};
|
|
6
|
+
function loadBabelOptions(babel, filename, overrides = empty) {
|
|
7
|
+
const fileCache = cache.get(overrides) ?? new Map();
|
|
8
|
+
if (fileCache.has(filename)) {
|
|
9
|
+
return fileCache.get(filename);
|
|
10
|
+
}
|
|
11
|
+
const babelOptions = babel.loadOptions({
|
|
12
|
+
...overrides,
|
|
13
|
+
filename,
|
|
14
|
+
caller: {
|
|
15
|
+
name: 'linaria',
|
|
16
|
+
// Indicates for @babel/preset-env to support all ESM syntax and avoid transforms before it's needed
|
|
17
|
+
supportsStaticESM: true,
|
|
18
|
+
supportsDynamicImport: true,
|
|
19
|
+
supportsTopLevelAwait: true,
|
|
20
|
+
supportsExportNamespaceFrom: true,
|
|
21
|
+
},
|
|
22
|
+
}) ?? {};
|
|
23
|
+
fileCache.set(filename, babelOptions);
|
|
24
|
+
cache.set(overrides, fileCache);
|
|
25
|
+
return babelOptions;
|
|
26
|
+
}
|
|
27
|
+
exports.loadBabelOptions = loadBabelOptions;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const shared_1 = require("@wyw-in-js/shared");
|
|
4
|
+
const cache_1 = require("../cache");
|
|
5
|
+
const transform_1 = require("../transform");
|
|
6
|
+
const loadLinariaOptions_1 = require("../transform/helpers/loadLinariaOptions");
|
|
7
|
+
const collector_1 = require("./collector");
|
|
8
|
+
function babelTransform(babel, options) {
|
|
9
|
+
const cache = new cache_1.TransformCacheCollection();
|
|
10
|
+
const debug = shared_1.logger.extend('babel-transform');
|
|
11
|
+
return {
|
|
12
|
+
name: '@wyw-in-js/transform/babel-transform',
|
|
13
|
+
pre(file) {
|
|
14
|
+
// eslint-disable-next-line require-yield
|
|
15
|
+
function* collect() {
|
|
16
|
+
const { valueCache } = this.data;
|
|
17
|
+
const { loadedAndParsed } = this.entrypoint;
|
|
18
|
+
const { pluginOptions } = this.services.options;
|
|
19
|
+
if (loadedAndParsed.evaluator === 'ignored') {
|
|
20
|
+
throw new Error('entrypoint was ignored');
|
|
21
|
+
}
|
|
22
|
+
(0, collector_1.collector)(file, pluginOptions, valueCache);
|
|
23
|
+
return {
|
|
24
|
+
ast: loadedAndParsed.ast,
|
|
25
|
+
code: loadedAndParsed.code,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
debug('start %s', file.opts.filename);
|
|
29
|
+
const pluginOptions = (0, loadLinariaOptions_1.loadLinariaOptions)(options);
|
|
30
|
+
(0, transform_1.transformSync)({
|
|
31
|
+
babel,
|
|
32
|
+
cache,
|
|
33
|
+
options: {
|
|
34
|
+
filename: file.opts.filename,
|
|
35
|
+
root: file.opts.root ?? undefined,
|
|
36
|
+
inputSourceMap: file.opts.inputSourceMap ?? undefined,
|
|
37
|
+
pluginOptions,
|
|
38
|
+
},
|
|
39
|
+
}, file.code, shared_1.syncResolve, {
|
|
40
|
+
collect,
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
visitor: {},
|
|
44
|
+
post(file) {
|
|
45
|
+
debug('end %s', file.opts.filename);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
exports.default = babelTransform;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collector traverses the AST and collects information about imports and
|
|
3
|
+
* all usages of WYW-processors.
|
|
4
|
+
*/
|
|
5
|
+
import type { BabelFile, PluginObj } from '@babel/core';
|
|
6
|
+
import type { ValueCache } from '@wyw-in-js/processor-utils';
|
|
7
|
+
import type { StrictOptions } from '@wyw-in-js/shared';
|
|
8
|
+
import type { Core } from '../babel';
|
|
9
|
+
import type { IPluginState } from '../types';
|
|
10
|
+
export declare const filename: string;
|
|
11
|
+
export declare function collector(file: BabelFile, options: Pick<StrictOptions, 'classNameSlug' | 'displayName' | 'evaluate' | 'tagResolver'>, values: ValueCache): {
|
|
12
|
+
artifacts: import("@wyw-in-js/shared").Artifact[];
|
|
13
|
+
}[];
|
|
14
|
+
export default function collectorPlugin(babel: Core, options: StrictOptions & {
|
|
15
|
+
values?: ValueCache;
|
|
16
|
+
}): PluginObj<IPluginState>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Collector traverses the AST and collects information about imports and
|
|
4
|
+
* all usages of WYW-processors.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.collector = exports.filename = void 0;
|
|
8
|
+
const shared_1 = require("@wyw-in-js/shared");
|
|
9
|
+
const processTemplateExpression_1 = require("../utils/processTemplateExpression");
|
|
10
|
+
const scopeHelpers_1 = require("../utils/scopeHelpers");
|
|
11
|
+
const traversalCache_1 = require("../utils/traversalCache");
|
|
12
|
+
exports.filename = __filename;
|
|
13
|
+
function collector(file, options, values) {
|
|
14
|
+
const processors = [];
|
|
15
|
+
const identifiers = [];
|
|
16
|
+
file.path.traverse({
|
|
17
|
+
Identifier: (p) => {
|
|
18
|
+
identifiers.push(p);
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
// TODO: process transformed literals
|
|
22
|
+
identifiers.forEach((p) => {
|
|
23
|
+
(0, processTemplateExpression_1.processTemplateExpression)(p, file.opts, options, (processor) => {
|
|
24
|
+
processor.build(values);
|
|
25
|
+
processor.doRuntimeReplacement();
|
|
26
|
+
processors.push(processor);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
if (processors.length === 0) {
|
|
30
|
+
// We didn't find any processors.
|
|
31
|
+
return processors;
|
|
32
|
+
}
|
|
33
|
+
// We can remove __linariaPreval export and all related code
|
|
34
|
+
const prevalExport = file.path.scope.getData('__linariaPreval')?.findParent((p) => p.isExpressionStatement());
|
|
35
|
+
if (prevalExport) {
|
|
36
|
+
(0, scopeHelpers_1.removeWithRelated)([prevalExport]);
|
|
37
|
+
}
|
|
38
|
+
return processors;
|
|
39
|
+
}
|
|
40
|
+
exports.collector = collector;
|
|
41
|
+
function collectorPlugin(babel, options) {
|
|
42
|
+
const values = options.values ?? new Map();
|
|
43
|
+
const debug = shared_1.logger.extend('collector');
|
|
44
|
+
return {
|
|
45
|
+
name: '@wyw-in-js/transform/collector',
|
|
46
|
+
pre(file) {
|
|
47
|
+
debug('start %s', file.opts.filename);
|
|
48
|
+
const processors = collector(file, options, values);
|
|
49
|
+
if (processors.length === 0) {
|
|
50
|
+
// We didn't find any Linaria template literals.
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.file.metadata.linaria = {
|
|
54
|
+
processors,
|
|
55
|
+
replacements: [],
|
|
56
|
+
rules: {},
|
|
57
|
+
dependencies: [],
|
|
58
|
+
};
|
|
59
|
+
debug('end %s', file.opts.filename);
|
|
60
|
+
},
|
|
61
|
+
visitor: {},
|
|
62
|
+
post(file) {
|
|
63
|
+
(0, traversalCache_1.invalidateTraversalCache)(file.path);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
exports.default = collectorPlugin;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PluginObj } from '@babel/core';
|
|
2
|
+
import type { Core } from '../babel';
|
|
3
|
+
/**
|
|
4
|
+
* The plugin that replaces `import()` with `__wyw_dynamic_import` as Node VM does not support dynamic imports yet.
|
|
5
|
+
*/
|
|
6
|
+
export default function dynamicImport(babel: Core): PluginObj;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* The plugin that replaces `import()` with `__wyw_dynamic_import` as Node VM does not support dynamic imports yet.
|
|
5
|
+
*/
|
|
6
|
+
function dynamicImport(babel) {
|
|
7
|
+
const { types: t } = babel;
|
|
8
|
+
return {
|
|
9
|
+
name: '@wyw-in-js/transform/dynamic-import',
|
|
10
|
+
visitor: {
|
|
11
|
+
CallExpression(path) {
|
|
12
|
+
if (path.get('callee').isImport()) {
|
|
13
|
+
const moduleName = path.get('arguments.0');
|
|
14
|
+
if (moduleName.isStringLiteral()) {
|
|
15
|
+
path.replaceWith(t.callExpression(t.identifier('__wyw_dynamic_import'), [
|
|
16
|
+
t.stringLiteral(moduleName.node.value),
|
|
17
|
+
]));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (moduleName.isTemplateLiteral()) {
|
|
21
|
+
path.replaceWith(t.callExpression(t.identifier('__wyw_dynamic_import'), [
|
|
22
|
+
t.cloneNode(moduleName.node, true, true),
|
|
23
|
+
]));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
throw new Error('Dynamic import argument must be a string or a template literal');
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
exports.default = dynamicImport;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is a babel preset used to transform files inside evaluators.
|
|
3
|
+
* It works the same as main `babel/extract` preset, but do not evaluate lazy dependencies.
|
|
4
|
+
*/
|
|
5
|
+
import type { PluginObj } from '@babel/core';
|
|
6
|
+
import type { StrictOptions } from '@wyw-in-js/shared';
|
|
7
|
+
import type { Core } from '../babel';
|
|
8
|
+
import type { IPluginState } from '../types';
|
|
9
|
+
import { EventEmitter } from '../utils/EventEmitter';
|
|
10
|
+
export type PreevalOptions = Pick<StrictOptions, 'classNameSlug' | 'displayName' | 'evaluate' | 'features'> & {
|
|
11
|
+
eventEmitter: EventEmitter;
|
|
12
|
+
};
|
|
13
|
+
export declare function preeval(babel: Core, { eventEmitter, ...options }: PreevalOptions): PluginObj<IPluginState & {
|
|
14
|
+
onFinish: () => void;
|
|
15
|
+
}>;
|
|
16
|
+
export default preeval;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.preeval = void 0;
|
|
4
|
+
const shared_1 = require("@wyw-in-js/shared");
|
|
5
|
+
const EventEmitter_1 = require("../utils/EventEmitter");
|
|
6
|
+
const addIdentifierToLinariaPreval_1 = require("../utils/addIdentifierToLinariaPreval");
|
|
7
|
+
const getFileIdx_1 = require("../utils/getFileIdx");
|
|
8
|
+
const processTemplateExpression_1 = require("../utils/processTemplateExpression");
|
|
9
|
+
const removeDangerousCode_1 = require("../utils/removeDangerousCode");
|
|
10
|
+
const traversalCache_1 = require("../utils/traversalCache");
|
|
11
|
+
function preeval(babel, { eventEmitter = EventEmitter_1.EventEmitter.dummy, ...options }) {
|
|
12
|
+
const { types: t } = babel;
|
|
13
|
+
return {
|
|
14
|
+
name: '@wyw-in-js/transform/preeval',
|
|
15
|
+
pre(file) {
|
|
16
|
+
const filename = file.opts.filename;
|
|
17
|
+
const log = shared_1.logger.extend('preeval').extend((0, getFileIdx_1.getFileIdx)(filename));
|
|
18
|
+
log('start', 'Looking for template literals…');
|
|
19
|
+
const rootScope = file.scope;
|
|
20
|
+
this.processors = [];
|
|
21
|
+
eventEmitter.perf('transform:preeval:processTemplate', () => {
|
|
22
|
+
file.path.traverse({
|
|
23
|
+
Identifier: (p) => {
|
|
24
|
+
(0, processTemplateExpression_1.processTemplateExpression)(p, file.opts, options, (processor) => {
|
|
25
|
+
processor.dependencies.forEach((dependency) => {
|
|
26
|
+
if (dependency.ex.type === 'Identifier') {
|
|
27
|
+
(0, addIdentifierToLinariaPreval_1.addIdentifierToLinariaPreval)(rootScope, dependency.ex.name);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
processor.doEvaltimeReplacement();
|
|
31
|
+
this.processors.push(processor);
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
if ((0, shared_1.isFeatureEnabled)(options.features, 'dangerousCodeRemover', filename)) {
|
|
37
|
+
log('start', 'Strip all JSX and browser related stuff');
|
|
38
|
+
eventEmitter.perf('transform:preeval:removeDangerousCode', () => (0, removeDangerousCode_1.removeDangerousCode)(file.path));
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
visitor: {},
|
|
42
|
+
post(file) {
|
|
43
|
+
const log = shared_1.logger
|
|
44
|
+
.extend('preeval')
|
|
45
|
+
.extend((0, getFileIdx_1.getFileIdx)(file.opts.filename));
|
|
46
|
+
(0, traversalCache_1.invalidateTraversalCache)(file.path);
|
|
47
|
+
if (this.processors.length === 0) {
|
|
48
|
+
log('end', "We didn't find any Linaria template literals");
|
|
49
|
+
// We didn't find any Linaria template literals.
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.file.metadata.linaria = {
|
|
53
|
+
processors: this.processors,
|
|
54
|
+
replacements: [],
|
|
55
|
+
rules: {},
|
|
56
|
+
dependencies: [],
|
|
57
|
+
};
|
|
58
|
+
const linariaPreval = file.path.getData('__linariaPreval');
|
|
59
|
+
if (!linariaPreval) {
|
|
60
|
+
// Event if there is no dependencies, we still need to add __linariaPreval
|
|
61
|
+
const linariaExport = t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('exports'), t.identifier('__linariaPreval')), t.objectExpression([])));
|
|
62
|
+
file.path.pushContainer('body', linariaExport);
|
|
63
|
+
}
|
|
64
|
+
log('end', '__linariaPreval has been added');
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
exports.preeval = preeval;
|
|
69
|
+
exports.default = preeval;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PluginObj } from '@babel/core';
|
|
2
|
+
import type { Core } from '../babel';
|
|
3
|
+
import type { IState } from '../utils/collectExportsAndImports';
|
|
4
|
+
export interface IShakerOptions {
|
|
5
|
+
ifUnknownExport?: 'error' | 'ignore' | 'reexport-all' | 'skip-shaking';
|
|
6
|
+
keepSideEffects?: boolean;
|
|
7
|
+
onlyExports: string[];
|
|
8
|
+
}
|
|
9
|
+
export default function shakerPlugin(babel: Core, { keepSideEffects, ifUnknownExport, onlyExports, }: IShakerOptions): PluginObj<IState & {
|
|
10
|
+
filename: string;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const shared_1 = require("@wyw-in-js/shared");
|
|
4
|
+
const collectExportsAndImports_1 = require("../utils/collectExportsAndImports");
|
|
5
|
+
const getFileIdx_1 = require("../utils/getFileIdx");
|
|
6
|
+
const isRemoved_1 = require("../utils/isRemoved");
|
|
7
|
+
const scopeHelpers_1 = require("../utils/scopeHelpers");
|
|
8
|
+
const traversalCache_1 = require("../utils/traversalCache");
|
|
9
|
+
const EXT_REGEX = /\.[0-9a-z]+$/;
|
|
10
|
+
const ALLOWED_EXTENSIONS = ['.js', '.cjs', '.mjs'];
|
|
11
|
+
function shouldKeepSideEffect(importPath) {
|
|
12
|
+
const [ext] = importPath.match(EXT_REGEX) || [''];
|
|
13
|
+
return ext === '' || ALLOWED_EXTENSIONS.includes(ext);
|
|
14
|
+
}
|
|
15
|
+
function getBindingForExport(exportPath) {
|
|
16
|
+
if (exportPath.isIdentifier()) {
|
|
17
|
+
return exportPath.scope.getBinding(exportPath.node.name);
|
|
18
|
+
}
|
|
19
|
+
const variableDeclarator = exportPath.findParent((p) => p.isVariableDeclarator());
|
|
20
|
+
if (variableDeclarator) {
|
|
21
|
+
const id = variableDeclarator.get('id');
|
|
22
|
+
if (id.isIdentifier()) {
|
|
23
|
+
return variableDeclarator.scope.getBinding(id.node.name);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (exportPath.isAssignmentExpression()) {
|
|
27
|
+
const left = exportPath.get('left');
|
|
28
|
+
if (left.isIdentifier()) {
|
|
29
|
+
return exportPath.scope.getBinding(left.node.name);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (exportPath.isFunctionDeclaration() || exportPath.isClassDeclaration()) {
|
|
33
|
+
return exportPath.scope.getBinding(exportPath.node.id.name);
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const withoutRemoved = (items) => items.filter(({ local }) => !(0, isRemoved_1.isRemoved)(local));
|
|
38
|
+
function rearrangeExports({ types: t }, root, exportRefs, exports) {
|
|
39
|
+
const rearranged = {
|
|
40
|
+
...exports,
|
|
41
|
+
};
|
|
42
|
+
const rootScope = root.scope;
|
|
43
|
+
exportRefs.forEach((refs, name) => {
|
|
44
|
+
if (refs.length <= 1) {
|
|
45
|
+
if (refs.length === 1) {
|
|
46
|
+
// Maybe exports is assigned to another variable?
|
|
47
|
+
const declarator = refs[0].findParent((p) => p.isVariableDeclarator());
|
|
48
|
+
if (!declarator) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const uid = rootScope.generateUid(name);
|
|
57
|
+
// Define variable in the beginning
|
|
58
|
+
const [declaration] = root.unshiftContainer('body', [
|
|
59
|
+
t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))]),
|
|
60
|
+
]);
|
|
61
|
+
rootScope.registerDeclaration(declaration);
|
|
62
|
+
// Replace every reference with defined variable
|
|
63
|
+
refs.forEach((ref) => {
|
|
64
|
+
const [replaced] = ref.replaceWith(t.identifier(uid));
|
|
65
|
+
if (replaced.isBindingIdentifier()) {
|
|
66
|
+
rootScope.registerConstantViolation(replaced);
|
|
67
|
+
if (replaced.parentPath?.parentPath?.isVariableDeclarator()) {
|
|
68
|
+
// This is `const foo = exports.foo = "value"` case
|
|
69
|
+
(0, scopeHelpers_1.reference)(replaced, replaced, true);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
(0, scopeHelpers_1.reference)(replaced);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// Assign defined variable to the export
|
|
77
|
+
const [pushed] = root.pushContainer('body', [
|
|
78
|
+
t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('exports'), t.identifier(name)), t.identifier(uid))),
|
|
79
|
+
]);
|
|
80
|
+
const local = pushed.get('expression.right');
|
|
81
|
+
(0, scopeHelpers_1.reference)(local);
|
|
82
|
+
rearranged[name] = local;
|
|
83
|
+
});
|
|
84
|
+
return rearranged;
|
|
85
|
+
}
|
|
86
|
+
function shakerPlugin(babel, { keepSideEffects = false, ifUnknownExport = 'skip-shaking', onlyExports, }) {
|
|
87
|
+
const shakerLogger = shared_1.logger.extend('shaker');
|
|
88
|
+
return {
|
|
89
|
+
name: '@wyw-in-js/transform/shaker',
|
|
90
|
+
pre(file) {
|
|
91
|
+
this.filename = file.opts.filename;
|
|
92
|
+
const log = shakerLogger.extend((0, getFileIdx_1.getFileIdx)(this.filename));
|
|
93
|
+
log('start', `${this.filename}, onlyExports: ${onlyExports.join(',')}`);
|
|
94
|
+
const onlyExportsSet = new Set(onlyExports);
|
|
95
|
+
const collected = (0, collectExportsAndImports_1.collectExportsAndImports)(file.path);
|
|
96
|
+
const sideEffectImports = collected.imports.filter(collectExportsAndImports_1.sideEffectImport);
|
|
97
|
+
log('import-and-exports', [
|
|
98
|
+
`imports: ${collected.imports.length} (side-effects: ${sideEffectImports.length})`,
|
|
99
|
+
`exports: ${Object.values(collected.exports).length}`,
|
|
100
|
+
`reexports: ${collected.reexports.length}`,
|
|
101
|
+
].join(', '));
|
|
102
|
+
// We cannot just throw out exports if they are referred in the code
|
|
103
|
+
// Let's dome some replacements
|
|
104
|
+
const exports = rearrangeExports(babel, file.path, collected.exportRefs, collected.exports);
|
|
105
|
+
Object.values(exports).forEach((local) => {
|
|
106
|
+
if (local.isAssignmentExpression()) {
|
|
107
|
+
const left = local.get('left');
|
|
108
|
+
if (left.isIdentifier()) {
|
|
109
|
+
// For some reason babel does not mark id in AssignmentExpression as a reference
|
|
110
|
+
// So we need to do it manually
|
|
111
|
+
(0, scopeHelpers_1.reference)(left, left, true);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
const hasLinariaPreval = exports.__linariaPreval !== undefined;
|
|
116
|
+
const hasDefault = exports.default !== undefined;
|
|
117
|
+
// If __linariaPreval is not exported, we can remove it from onlyExports
|
|
118
|
+
if (onlyExportsSet.has('__linariaPreval') && !hasLinariaPreval) {
|
|
119
|
+
onlyExportsSet.delete('__linariaPreval');
|
|
120
|
+
}
|
|
121
|
+
if (onlyExportsSet.size === 0) {
|
|
122
|
+
// Fast-lane: if there are no exports to keep, we can just shake out the whole file
|
|
123
|
+
this.imports = [];
|
|
124
|
+
this.exports = {};
|
|
125
|
+
this.reexports = [];
|
|
126
|
+
this.deadExports = Object.keys(exports);
|
|
127
|
+
file.path.get('body').forEach((p) => {
|
|
128
|
+
p.remove();
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const importedAsSideEffect = onlyExportsSet.has('side-effect');
|
|
133
|
+
onlyExportsSet.delete('side-effect');
|
|
134
|
+
// Hackaround for packages which include a 'default' export without specifying __esModule; such packages cannot be
|
|
135
|
+
// shaken as they will break interopRequireDefault babel helper
|
|
136
|
+
// See example in shaker-plugin.test.ts
|
|
137
|
+
// Real-world example was found in preact/compat npm package
|
|
138
|
+
if (onlyExportsSet.has('default') &&
|
|
139
|
+
hasDefault &&
|
|
140
|
+
!collected.isEsModule) {
|
|
141
|
+
this.imports = collected.imports;
|
|
142
|
+
this.exports = exports;
|
|
143
|
+
this.reexports = collected.reexports;
|
|
144
|
+
this.deadExports = [];
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (!onlyExportsSet.has('*')) {
|
|
148
|
+
// __esModule should be kept alive
|
|
149
|
+
onlyExportsSet.add('__esModule');
|
|
150
|
+
const aliveExports = new Set();
|
|
151
|
+
const importNames = collected.imports.map(({ imported }) => imported);
|
|
152
|
+
Object.entries(exports).forEach(([exported, local]) => {
|
|
153
|
+
if (onlyExportsSet.has(exported)) {
|
|
154
|
+
aliveExports.add(local);
|
|
155
|
+
}
|
|
156
|
+
else if (importNames.includes(local.node.name || '')) {
|
|
157
|
+
aliveExports.add(local);
|
|
158
|
+
}
|
|
159
|
+
else if ([...aliveExports].some((alive) => alive === local)) {
|
|
160
|
+
// It's possible to export multiple values from a single variable initializer, e.g
|
|
161
|
+
// export const { foo, bar } = baz();
|
|
162
|
+
// We need to treat all of them as used if any of them are used, since otherwise
|
|
163
|
+
// we'll attempt to delete the baz() call
|
|
164
|
+
aliveExports.add(local);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
collected.reexports.forEach((exp) => {
|
|
168
|
+
if (onlyExportsSet.has(exp.exported)) {
|
|
169
|
+
aliveExports.add(exp.local);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
const exportToPath = new Map();
|
|
173
|
+
Object.entries(exports).forEach(([exported, local]) => {
|
|
174
|
+
exportToPath.set(exported, local);
|
|
175
|
+
});
|
|
176
|
+
collected.reexports.forEach((exp) => {
|
|
177
|
+
exportToPath.set(exp.exported, exp.local);
|
|
178
|
+
});
|
|
179
|
+
const notFoundExports = [...onlyExportsSet].filter((exp) => exp !== '__esModule' && !aliveExports.has(exportToPath.get(exp)));
|
|
180
|
+
exportToPath.clear();
|
|
181
|
+
const isAllExportsFound = notFoundExports.length === 0;
|
|
182
|
+
if (!isAllExportsFound && ifUnknownExport !== 'ignore') {
|
|
183
|
+
if (ifUnknownExport === 'error') {
|
|
184
|
+
throw new Error(`Unknown export(s) requested: ${onlyExports.join(',')}`);
|
|
185
|
+
}
|
|
186
|
+
if (ifUnknownExport === 'reexport-all') {
|
|
187
|
+
// If there are unknown exports, we have keep alive all re-exports.
|
|
188
|
+
if (exports['*'] !== undefined) {
|
|
189
|
+
aliveExports.add(exports['*']);
|
|
190
|
+
}
|
|
191
|
+
collected.reexports.forEach((exp) => {
|
|
192
|
+
if (exp.exported === '*') {
|
|
193
|
+
aliveExports.add(exp.local);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
if (ifUnknownExport === 'skip-shaking') {
|
|
198
|
+
this.imports = collected.imports;
|
|
199
|
+
this.exports = exports;
|
|
200
|
+
this.reexports = collected.reexports;
|
|
201
|
+
this.deadExports = [];
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const forDeleting = [
|
|
206
|
+
...Object.values(exports),
|
|
207
|
+
...collected.reexports.map((i) => i.local),
|
|
208
|
+
].filter((exp) => !aliveExports.has(exp));
|
|
209
|
+
if (!keepSideEffects && !importedAsSideEffect) {
|
|
210
|
+
// Remove all imports that don't import something explicitly and should not be kept
|
|
211
|
+
sideEffectImports.forEach((i) => {
|
|
212
|
+
if (!shouldKeepSideEffect(i.source)) {
|
|
213
|
+
forDeleting.push(i.local);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
const deleted = new Set();
|
|
218
|
+
let dereferenced = [];
|
|
219
|
+
let changed = true;
|
|
220
|
+
while (changed && deleted.size < forDeleting.length) {
|
|
221
|
+
changed = false;
|
|
222
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
223
|
+
for (const path of forDeleting) {
|
|
224
|
+
if (deleted.has(path)) {
|
|
225
|
+
// eslint-disable-next-line no-continue
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const binding = getBindingForExport(path);
|
|
229
|
+
const action = (0, scopeHelpers_1.findActionForNode)(path);
|
|
230
|
+
const parent = action?.[1];
|
|
231
|
+
const outerReferences = (binding?.referencePaths || []).filter((ref) => ref !== parent && !parent?.isAncestor(ref));
|
|
232
|
+
if (outerReferences.length > 0 && path.isIdentifier()) {
|
|
233
|
+
// Temporary deref it in order to simplify further checks.
|
|
234
|
+
(0, scopeHelpers_1.dereference)(path);
|
|
235
|
+
dereferenced.push(path);
|
|
236
|
+
}
|
|
237
|
+
if (!deleted.has(path) &&
|
|
238
|
+
(!binding || outerReferences.length === 0)) {
|
|
239
|
+
if (action) {
|
|
240
|
+
(0, scopeHelpers_1.applyAction)(action);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
(0, scopeHelpers_1.removeWithRelated)([path]);
|
|
244
|
+
}
|
|
245
|
+
deleted.add(path);
|
|
246
|
+
changed = true;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
dereferenced.forEach((path) => {
|
|
250
|
+
// If path is still alive, we need to reference it back
|
|
251
|
+
if (!(0, isRemoved_1.isRemoved)(path)) {
|
|
252
|
+
(0, scopeHelpers_1.reference)(path);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
dereferenced = [];
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
this.imports = withoutRemoved(collected.imports);
|
|
259
|
+
this.exports = {};
|
|
260
|
+
this.deadExports = [];
|
|
261
|
+
Object.entries(exports).forEach(([exported, local]) => {
|
|
262
|
+
if ((0, isRemoved_1.isRemoved)(local)) {
|
|
263
|
+
this.deadExports.push(exported);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
this.exports[exported] = local;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
this.reexports = withoutRemoved(collected.reexports);
|
|
270
|
+
},
|
|
271
|
+
visitor: {},
|
|
272
|
+
post(file) {
|
|
273
|
+
const log = shakerLogger.extend((0, getFileIdx_1.getFileIdx)(file.opts.filename));
|
|
274
|
+
const processedImports = new Set();
|
|
275
|
+
const imports = new Map();
|
|
276
|
+
const addImport = ({ imported, source, }) => {
|
|
277
|
+
if (processedImports.has(`${source}:${imported}`)) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (!imports.has(source)) {
|
|
281
|
+
imports.set(source, []);
|
|
282
|
+
}
|
|
283
|
+
if (imported) {
|
|
284
|
+
imports.get(source).push(imported);
|
|
285
|
+
}
|
|
286
|
+
processedImports.add(`${source}:${imported}`);
|
|
287
|
+
};
|
|
288
|
+
this.imports.forEach(addImport);
|
|
289
|
+
this.reexports.forEach(addImport);
|
|
290
|
+
log('end', `remaining imports: %O`, imports);
|
|
291
|
+
// eslint-disable-next-line no-param-reassign
|
|
292
|
+
file.metadata.linariaEvaluator = {
|
|
293
|
+
imports,
|
|
294
|
+
};
|
|
295
|
+
(0, traversalCache_1.invalidateTraversalCache)(file.path);
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
exports.default = shakerPlugin;
|