@wyw-in-js/transform 0.8.0 → 1.0.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.
Files changed (327) hide show
  1. package/esm/babel.js.map +1 -1
  2. package/esm/cache.js +15 -4
  3. package/esm/cache.js.map +1 -1
  4. package/esm/debug/fileReporter.js.map +1 -1
  5. package/esm/evaluators/index.js.map +1 -1
  6. package/esm/index.js.map +1 -1
  7. package/esm/module.js +174 -15
  8. package/esm/module.js.map +1 -1
  9. package/esm/options/buildOptions.js +123 -4
  10. package/esm/options/buildOptions.js.map +1 -1
  11. package/esm/options/buildOptions.test.js +41 -0
  12. package/esm/options/buildOptions.test.js.map +1 -0
  13. package/esm/options/loadBabelOptions.js.map +1 -1
  14. package/esm/plugins/babel-transform.js.map +1 -1
  15. package/esm/plugins/collector.js.map +1 -1
  16. package/esm/plugins/dynamic-import.js +35 -12
  17. package/esm/plugins/dynamic-import.js.map +1 -1
  18. package/esm/plugins/preeval.js +4 -0
  19. package/esm/plugins/preeval.js.map +1 -1
  20. package/esm/plugins/shaker.js +170 -23
  21. package/esm/plugins/shaker.js.map +1 -1
  22. package/esm/shaker.js +6 -3
  23. package/esm/shaker.js.map +1 -1
  24. package/esm/transform/BaseEntrypoint.js.map +1 -1
  25. package/esm/transform/Entrypoint.helpers.js +105 -15
  26. package/esm/transform/Entrypoint.helpers.js.map +1 -1
  27. package/esm/transform/Entrypoint.js +13 -2
  28. package/esm/transform/Entrypoint.js.map +1 -1
  29. package/esm/transform/Entrypoint.types.js.map +1 -1
  30. package/esm/transform/EvaluatedEntrypoint.js.map +1 -1
  31. package/esm/transform/actions/AbortError.js.map +1 -1
  32. package/esm/transform/actions/BaseAction.js +5 -0
  33. package/esm/transform/actions/BaseAction.js.map +1 -1
  34. package/esm/transform/actions/UnprocessedEntrypointError.js.map +1 -1
  35. package/esm/transform/actions/actionRunner.js.map +1 -1
  36. package/esm/transform/actions/types.js.map +1 -1
  37. package/esm/transform/generators/baseProcessingHandlers.js.map +1 -1
  38. package/esm/transform/generators/collect.js.map +1 -1
  39. package/esm/transform/generators/createStylisPreprocessor.js +118 -2
  40. package/esm/transform/generators/createStylisPreprocessor.js.map +1 -1
  41. package/esm/transform/generators/evalFile.js.map +1 -1
  42. package/esm/transform/generators/explodeReexports.js +10 -10
  43. package/esm/transform/generators/explodeReexports.js.map +1 -1
  44. package/esm/transform/generators/extract.js.map +1 -1
  45. package/esm/transform/generators/getExports.js.map +1 -1
  46. package/esm/transform/generators/index.js.map +1 -1
  47. package/esm/transform/generators/processEntrypoint.js +5 -8
  48. package/esm/transform/generators/processEntrypoint.js.map +1 -1
  49. package/esm/transform/generators/processImports.js.map +1 -1
  50. package/esm/transform/generators/resolveImports.js +41 -2
  51. package/esm/transform/generators/resolveImports.js.map +1 -1
  52. package/esm/transform/generators/transform.js +7 -3
  53. package/esm/transform/generators/transform.js.map +1 -1
  54. package/esm/transform/generators/workflow.js.map +1 -1
  55. package/esm/transform/helpers/loadWywOptions.js +15 -2
  56. package/esm/transform/helpers/loadWywOptions.js.map +1 -1
  57. package/esm/transform/helpers/withDefaultServices.js +2 -0
  58. package/esm/transform/helpers/withDefaultServices.js.map +1 -1
  59. package/esm/transform/isStaticallyEvaluatableModule.js +153 -0
  60. package/esm/transform/isStaticallyEvaluatableModule.js.map +1 -0
  61. package/esm/transform/rootLog.js.map +1 -1
  62. package/esm/transform/types.js.map +1 -1
  63. package/esm/transform.js +15 -6
  64. package/esm/transform.js.map +1 -1
  65. package/esm/types.js.map +1 -1
  66. package/esm/utils/EventEmitter.js.map +1 -1
  67. package/esm/utils/ShakerMetadata.js.map +1 -1
  68. package/esm/utils/TransformMetadata.js.map +1 -1
  69. package/esm/utils/addIdentifierToWywPreval.js.map +1 -1
  70. package/esm/utils/collectExportsAndImports.js +97 -6
  71. package/esm/utils/collectExportsAndImports.js.map +1 -1
  72. package/esm/utils/collectTemplateDependencies.js +1 -1
  73. package/esm/utils/collectTemplateDependencies.js.map +1 -1
  74. package/esm/utils/createId.js.map +1 -1
  75. package/esm/utils/dispose-polyfill.js.map +1 -1
  76. package/esm/utils/findIdentifiers.js.map +1 -1
  77. package/esm/utils/getConstantStringValue.js +58 -0
  78. package/esm/utils/getConstantStringValue.js.map +1 -0
  79. package/esm/utils/getFileIdx.js.map +1 -1
  80. package/esm/utils/getMemberExpressionPropertyName.js +11 -0
  81. package/esm/utils/getMemberExpressionPropertyName.js.map +1 -0
  82. package/esm/utils/getPluginKey.js.map +1 -1
  83. package/esm/utils/getScope.js.map +1 -1
  84. package/esm/utils/getSource.js.map +1 -1
  85. package/esm/utils/getTagProcessor.js +34 -6
  86. package/esm/utils/getTagProcessor.js.map +1 -1
  87. package/esm/utils/getVisitorKeys.js.map +1 -1
  88. package/esm/utils/hasWywPreval.js.map +1 -1
  89. package/esm/utils/importOverrides.js +47 -0
  90. package/esm/utils/importOverrides.js.map +1 -0
  91. package/esm/utils/isExports.js.map +1 -1
  92. package/esm/utils/isGlobal.js.map +1 -1
  93. package/esm/utils/isNode.js.map +1 -1
  94. package/esm/utils/isNodePath.js.map +1 -1
  95. package/esm/utils/isNotNull.js.map +1 -1
  96. package/esm/utils/isRemoved.js.map +1 -1
  97. package/esm/utils/isRequire.js.map +1 -1
  98. package/esm/utils/isSerializable.js.map +1 -1
  99. package/esm/utils/isTypedNode.js.map +1 -1
  100. package/esm/utils/isUnnecessaryReactCall.js.map +1 -1
  101. package/esm/utils/parseRequest.js +29 -0
  102. package/esm/utils/parseRequest.js.map +1 -0
  103. package/esm/utils/peek.js.map +1 -1
  104. package/esm/utils/removeDangerousCode.js +32 -2
  105. package/esm/utils/removeDangerousCode.js.map +1 -1
  106. package/esm/utils/replaceImportMetaEnv.js +44 -0
  107. package/esm/utils/replaceImportMetaEnv.js.map +1 -0
  108. package/esm/utils/scopeHelpers.js.map +1 -1
  109. package/esm/utils/traversalCache.js.map +1 -1
  110. package/esm/utils/unwrapExpression.js +18 -0
  111. package/esm/utils/unwrapExpression.js.map +1 -0
  112. package/esm/utils/unwrapSequence.js.map +1 -1
  113. package/esm/utils/valueToLiteral.js.map +1 -1
  114. package/esm/utils/visitors/JSXElementsRemover.js.map +1 -1
  115. package/esm/vm/createVmContext.js +44 -0
  116. package/esm/vm/createVmContext.js.map +1 -1
  117. package/esm/vm/process.js.map +1 -1
  118. package/lib/babel.js.map +1 -1
  119. package/lib/cache.js +16 -5
  120. package/lib/cache.js.map +1 -1
  121. package/lib/debug/fileReporter.js +1 -1
  122. package/lib/debug/fileReporter.js.map +1 -1
  123. package/lib/evaluators/index.js.map +1 -1
  124. package/lib/index.js +1 -1
  125. package/lib/index.js.map +1 -1
  126. package/lib/module.js +177 -16
  127. package/lib/module.js.map +1 -1
  128. package/lib/options/buildOptions.js +127 -6
  129. package/lib/options/buildOptions.js.map +1 -1
  130. package/lib/options/buildOptions.test.js +44 -0
  131. package/lib/options/buildOptions.test.js.map +1 -0
  132. package/lib/options/loadBabelOptions.js.map +1 -1
  133. package/lib/plugins/babel-transform.js.map +1 -1
  134. package/lib/plugins/collector.js.map +1 -1
  135. package/lib/plugins/dynamic-import.js +34 -12
  136. package/lib/plugins/dynamic-import.js.map +1 -1
  137. package/lib/plugins/preeval.js +4 -0
  138. package/lib/plugins/preeval.js.map +1 -1
  139. package/lib/plugins/shaker.js +172 -22
  140. package/lib/plugins/shaker.js.map +1 -1
  141. package/lib/shaker.js +8 -4
  142. package/lib/shaker.js.map +1 -1
  143. package/lib/transform/BaseEntrypoint.js.map +1 -1
  144. package/lib/transform/Entrypoint.helpers.js +106 -15
  145. package/lib/transform/Entrypoint.helpers.js.map +1 -1
  146. package/lib/transform/Entrypoint.js +13 -2
  147. package/lib/transform/Entrypoint.js.map +1 -1
  148. package/lib/transform/Entrypoint.types.js.map +1 -1
  149. package/lib/transform/EvaluatedEntrypoint.js.map +1 -1
  150. package/lib/transform/actions/AbortError.js.map +1 -1
  151. package/lib/transform/actions/BaseAction.js +5 -0
  152. package/lib/transform/actions/BaseAction.js.map +1 -1
  153. package/lib/transform/actions/UnprocessedEntrypointError.js.map +1 -1
  154. package/lib/transform/actions/actionRunner.js.map +1 -1
  155. package/lib/transform/actions/types.js.map +1 -1
  156. package/lib/transform/generators/baseProcessingHandlers.js.map +1 -1
  157. package/lib/transform/generators/collect.js.map +1 -1
  158. package/lib/transform/generators/createStylisPreprocessor.js +119 -3
  159. package/lib/transform/generators/createStylisPreprocessor.js.map +1 -1
  160. package/lib/transform/generators/evalFile.js +1 -1
  161. package/lib/transform/generators/evalFile.js.map +1 -1
  162. package/lib/transform/generators/explodeReexports.js +11 -11
  163. package/lib/transform/generators/explodeReexports.js.map +1 -1
  164. package/lib/transform/generators/extract.js.map +1 -1
  165. package/lib/transform/generators/getExports.js.map +1 -1
  166. package/lib/transform/generators/index.js.map +1 -1
  167. package/lib/transform/generators/processEntrypoint.js +5 -8
  168. package/lib/transform/generators/processEntrypoint.js.map +1 -1
  169. package/lib/transform/generators/processImports.js.map +1 -1
  170. package/lib/transform/generators/resolveImports.js +41 -2
  171. package/lib/transform/generators/resolveImports.js.map +1 -1
  172. package/lib/transform/generators/transform.js +8 -3
  173. package/lib/transform/generators/transform.js.map +1 -1
  174. package/lib/transform/generators/workflow.js.map +1 -1
  175. package/lib/transform/helpers/loadWywOptions.js +16 -2
  176. package/lib/transform/helpers/loadWywOptions.js.map +1 -1
  177. package/lib/transform/helpers/withDefaultServices.js +3 -2
  178. package/lib/transform/helpers/withDefaultServices.js.map +1 -1
  179. package/lib/transform/isStaticallyEvaluatableModule.js +159 -0
  180. package/lib/transform/isStaticallyEvaluatableModule.js.map +1 -0
  181. package/lib/transform/rootLog.js.map +1 -1
  182. package/lib/transform/types.js.map +1 -1
  183. package/lib/transform.js +15 -6
  184. package/lib/transform.js.map +1 -1
  185. package/lib/types.js.map +1 -1
  186. package/lib/utils/EventEmitter.js.map +1 -1
  187. package/lib/utils/ShakerMetadata.js.map +1 -1
  188. package/lib/utils/TransformMetadata.js.map +1 -1
  189. package/lib/utils/addIdentifierToWywPreval.js.map +1 -1
  190. package/lib/utils/collectExportsAndImports.js +97 -6
  191. package/lib/utils/collectExportsAndImports.js.map +1 -1
  192. package/lib/utils/collectTemplateDependencies.js +1 -1
  193. package/lib/utils/collectTemplateDependencies.js.map +1 -1
  194. package/lib/utils/createId.js.map +1 -1
  195. package/lib/utils/dispose-polyfill.js.map +1 -1
  196. package/lib/utils/findIdentifiers.js.map +1 -1
  197. package/lib/utils/getConstantStringValue.js +66 -0
  198. package/lib/utils/getConstantStringValue.js.map +1 -0
  199. package/lib/utils/getFileIdx.js.map +1 -1
  200. package/lib/utils/getMemberExpressionPropertyName.js +18 -0
  201. package/lib/utils/getMemberExpressionPropertyName.js.map +1 -0
  202. package/lib/utils/getPluginKey.js.map +1 -1
  203. package/lib/utils/getScope.js.map +1 -1
  204. package/lib/utils/getSource.js +1 -1
  205. package/lib/utils/getSource.js.map +1 -1
  206. package/lib/utils/getTagProcessor.js +33 -6
  207. package/lib/utils/getTagProcessor.js.map +1 -1
  208. package/lib/utils/getVisitorKeys.js.map +1 -1
  209. package/lib/utils/hasWywPreval.js.map +1 -1
  210. package/lib/utils/importOverrides.js +57 -0
  211. package/lib/utils/importOverrides.js.map +1 -0
  212. package/lib/utils/isExports.js.map +1 -1
  213. package/lib/utils/isGlobal.js.map +1 -1
  214. package/lib/utils/isNode.js.map +1 -1
  215. package/lib/utils/isNodePath.js.map +1 -1
  216. package/lib/utils/isNotNull.js.map +1 -1
  217. package/lib/utils/isRemoved.js.map +1 -1
  218. package/lib/utils/isRequire.js.map +1 -1
  219. package/lib/utils/isSerializable.js.map +1 -1
  220. package/lib/utils/isTypedNode.js.map +1 -1
  221. package/lib/utils/isUnnecessaryReactCall.js.map +1 -1
  222. package/lib/utils/parseRequest.js +37 -0
  223. package/lib/utils/parseRequest.js.map +1 -0
  224. package/lib/utils/peek.js.map +1 -1
  225. package/lib/utils/removeDangerousCode.js +32 -2
  226. package/lib/utils/removeDangerousCode.js.map +1 -1
  227. package/lib/utils/replaceImportMetaEnv.js +50 -0
  228. package/lib/utils/replaceImportMetaEnv.js.map +1 -0
  229. package/lib/utils/scopeHelpers.js.map +1 -1
  230. package/lib/utils/traversalCache.js.map +1 -1
  231. package/lib/utils/unwrapExpression.js +25 -0
  232. package/lib/utils/unwrapExpression.js.map +1 -0
  233. package/lib/utils/unwrapSequence.js.map +1 -1
  234. package/lib/utils/valueToLiteral.js.map +1 -1
  235. package/lib/utils/visitors/JSXElementsRemover.js.map +1 -1
  236. package/lib/vm/createVmContext.js +45 -2
  237. package/lib/vm/createVmContext.js.map +1 -1
  238. package/lib/vm/process.js.map +1 -1
  239. package/package.json +13 -15
  240. package/types/cache.d.ts +1 -1
  241. package/types/cache.js +15 -4
  242. package/types/evaluators/index.js +1 -1
  243. package/types/module.d.ts +1 -2
  244. package/types/module.js +189 -11
  245. package/types/options/buildOptions.d.ts +0 -1
  246. package/types/options/buildOptions.js +125 -9
  247. package/types/options/loadBabelOptions.js +1 -2
  248. package/types/plugins/babel-transform.js +1 -1
  249. package/types/plugins/collector.js +3 -3
  250. package/types/plugins/dynamic-import.js +38 -18
  251. package/types/plugins/preeval.js +5 -2
  252. package/types/plugins/shaker.d.ts +4 -1
  253. package/types/plugins/shaker.js +189 -24
  254. package/types/shaker.js +9 -3
  255. package/types/transform/BaseEntrypoint.d.ts +0 -1
  256. package/types/transform/Entrypoint.helpers.d.ts +0 -1
  257. package/types/transform/Entrypoint.helpers.js +122 -25
  258. package/types/transform/Entrypoint.js +14 -2
  259. package/types/transform/Entrypoint.types.d.ts +0 -1
  260. package/types/transform/EvaluatedEntrypoint.d.ts +0 -1
  261. package/types/transform/actions/BaseAction.d.ts +1 -1
  262. package/types/transform/actions/BaseAction.js +5 -0
  263. package/types/transform/actions/actionRunner.js +2 -3
  264. package/types/transform/generators/collect.js +1 -2
  265. package/types/transform/generators/createStylisPreprocessor.d.ts +0 -1
  266. package/types/transform/generators/createStylisPreprocessor.js +168 -13
  267. package/types/transform/generators/evalFile.js +1 -2
  268. package/types/transform/generators/explodeReexports.js +12 -15
  269. package/types/transform/generators/extract.js +1 -2
  270. package/types/transform/generators/getExports.js +2 -3
  271. package/types/transform/generators/processEntrypoint.js +13 -7
  272. package/types/transform/generators/processImports.js +1 -2
  273. package/types/transform/generators/resolveImports.js +41 -5
  274. package/types/transform/generators/transform.d.ts +1 -1
  275. package/types/transform/generators/transform.js +16 -6
  276. package/types/transform/generators/workflow.js +1 -2
  277. package/types/transform/helpers/loadWywOptions.js +16 -5
  278. package/types/transform/helpers/withDefaultServices.d.ts +1 -1
  279. package/types/transform/helpers/withDefaultServices.js +19 -8
  280. package/types/transform/isStaticallyEvaluatableModule.d.ts +2 -0
  281. package/types/transform/isStaticallyEvaluatableModule.js +177 -0
  282. package/types/transform/rootLog.d.ts +0 -1
  283. package/types/transform/types.d.ts +1 -1
  284. package/types/transform.js +17 -9
  285. package/types/types.d.ts +1 -1
  286. package/types/utils/addIdentifierToWywPreval.js +2 -3
  287. package/types/utils/collectExportsAndImports.js +102 -20
  288. package/types/utils/collectTemplateDependencies.js +3 -4
  289. package/types/utils/findIdentifiers.js +2 -3
  290. package/types/utils/getConstantStringValue.d.ts +2 -0
  291. package/types/utils/getConstantStringValue.js +94 -0
  292. package/types/utils/getFileIdx.js +1 -2
  293. package/types/utils/getMemberExpressionPropertyName.d.ts +2 -0
  294. package/types/utils/getMemberExpressionPropertyName.js +46 -0
  295. package/types/utils/getScope.js +1 -2
  296. package/types/utils/getTagProcessor.js +35 -9
  297. package/types/utils/getVisitorKeys.js +1 -2
  298. package/types/utils/hasWywPreval.js +1 -1
  299. package/types/utils/importOverrides.d.ts +19 -0
  300. package/types/utils/importOverrides.js +40 -0
  301. package/types/utils/isExports.js +1 -2
  302. package/types/utils/isNodePath.js +1 -2
  303. package/types/utils/isNotNull.js +1 -2
  304. package/types/utils/isRemoved.js +1 -2
  305. package/types/utils/isRequire.js +1 -2
  306. package/types/utils/isSerializable.js +1 -2
  307. package/types/utils/isUnnecessaryReactCall.js +1 -2
  308. package/types/utils/parseRequest.d.ts +7 -0
  309. package/types/utils/parseRequest.js +29 -0
  310. package/types/utils/removeDangerousCode.js +37 -2
  311. package/types/utils/replaceImportMetaEnv.d.ts +3 -0
  312. package/types/utils/replaceImportMetaEnv.js +39 -0
  313. package/types/utils/scopeHelpers.js +7 -8
  314. package/types/utils/traversalCache.d.ts +1 -1
  315. package/types/utils/unwrapExpression.d.ts +2 -0
  316. package/types/utils/unwrapExpression.js +57 -0
  317. package/types/utils/unwrapSequence.js +1 -2
  318. package/types/utils/valueToLiteral.js +1 -2
  319. package/types/utils/visitors/JSXElementsRemover.js +1 -2
  320. package/types/vm/createVmContext.d.ts +0 -1
  321. package/types/vm/createVmContext.js +68 -9
  322. package/types/vm/process.d.ts +0 -2
  323. package/LICENSE +0 -21
  324. package/esm/options/babel-merge.d.js +0 -2
  325. package/esm/options/babel-merge.d.js.map +0 -1
  326. package/lib/options/babel-merge.d.js +0 -2
  327. package/lib/options/babel-merge.d.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"preeval.js","names":["_shared","require","_getTagProcessor","_EventEmitter","_addIdentifierToWywPreval","_getFileIdx","_removeDangerousCode","_traversalCache","preeval","babel","options","_options$eventEmitter","types","t","eventEmitter","EventEmitter","dummy","name","pre","file","filename","opts","log","logger","extend","getFileIdx","rootScope","scope","processors","perf","applyProcessors","path","processor","dependencies","forEach","dependency","ex","type","addIdentifierToWywPreval","doEvaltimeReplacement","push","isFeatureEnabled","features","removeDangerousCode","codeRemover","visitor","post","invalidateTraversalCache","length","metadata","wywInJS","replacements","rules","wywPreval","getData","wywExport","expressionStatement","assignmentExpression","memberExpression","identifier","objectExpression","pushContainer","_default","exports","default"],"sources":["../../src/plugins/preeval.ts"],"sourcesContent":["/**\n * This file is a babel preset used to transform files inside evaluators.\n * It works the same as main `babel/extract` preset, but do not evaluate lazy dependencies.\n */\nimport type { BabelFile, PluginObj } from '@babel/core';\n\nimport type { StrictOptions } from '@wyw-in-js/shared';\nimport { isFeatureEnabled, logger } from '@wyw-in-js/shared';\n\nimport { applyProcessors } from '../utils/getTagProcessor';\nimport type { Core } from '../babel';\nimport type { IPluginState } from '../types';\nimport { EventEmitter } from '../utils/EventEmitter';\nimport { addIdentifierToWywPreval } from '../utils/addIdentifierToWywPreval';\nimport { getFileIdx } from '../utils/getFileIdx';\nimport { removeDangerousCode } from '../utils/removeDangerousCode';\nimport { invalidateTraversalCache } from '../utils/traversalCache';\n\nexport type PreevalOptions = Pick<\n StrictOptions,\n | 'classNameSlug'\n | 'codeRemover'\n | 'displayName'\n | 'extensions'\n | 'evaluate'\n | 'features'\n | 'tagResolver'\n> & { eventEmitter?: EventEmitter };\n\nexport function preeval(\n babel: Core,\n options: PreevalOptions\n): PluginObj<IPluginState & { onFinish: () => void }> {\n const { types: t } = babel;\n const eventEmitter = options.eventEmitter ?? EventEmitter.dummy;\n return {\n name: '@wyw-in-js/transform/preeval',\n pre(file: BabelFile) {\n const filename = file.opts.filename!;\n const log = logger.extend('preeval').extend(getFileIdx(filename));\n\n log('start', 'Looking for template literals…');\n\n const rootScope = file.scope;\n this.processors = [];\n\n eventEmitter.perf('transform:preeval:processTemplate', () => {\n applyProcessors(file.path, file.opts, options, (processor) => {\n processor.dependencies.forEach((dependency) => {\n if (dependency.ex.type === 'Identifier') {\n addIdentifierToWywPreval(rootScope, dependency.ex.name);\n }\n });\n\n processor.doEvaltimeReplacement();\n this.processors.push(processor);\n });\n });\n\n if (\n isFeatureEnabled(options.features, 'dangerousCodeRemover', filename)\n ) {\n log('start', 'Strip all JSX and browser related stuff');\n eventEmitter.perf('transform:preeval:removeDangerousCode', () =>\n removeDangerousCode(file.path, options.codeRemover)\n );\n }\n },\n visitor: {},\n post(file: BabelFile) {\n const log = logger\n .extend('preeval')\n .extend(getFileIdx(file.opts.filename!));\n\n invalidateTraversalCache(file.path);\n\n if (this.processors.length === 0) {\n log('end', \"We didn't find any wyw-in-js template literals\");\n\n // We didn't find any wyw-in-js template literals.\n return;\n }\n\n this.file.metadata.wywInJS = {\n processors: this.processors,\n replacements: [],\n rules: {},\n dependencies: [],\n };\n\n const wywPreval = file.path.getData('__wywPreval');\n if (!wywPreval) {\n // Event if there is no dependencies, we still need to add __wywPreval\n const wywExport = t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.memberExpression(\n t.identifier('exports'),\n t.identifier('__wywPreval')\n ),\n t.objectExpression([])\n )\n );\n\n file.path.pushContainer('body', wywExport);\n }\n\n log('end', '__wywPreval has been added');\n },\n };\n}\n\nexport default preeval;\n"],"mappings":"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"}
1
+ {"version":3,"file":"preeval.js","names":["_shared","require","_getTagProcessor","_EventEmitter","_addIdentifierToWywPreval","_getFileIdx","_removeDangerousCode","_replaceImportMetaEnv","_traversalCache","preeval","babel","options","_options$eventEmitter","types","t","eventEmitter","EventEmitter","dummy","name","pre","file","filename","opts","log","logger","extend","getFileIdx","rootScope","scope","processors","perf","applyProcessors","path","processor","dependencies","forEach","dependency","ex","type","addIdentifierToWywPreval","doEvaltimeReplacement","push","replaceImportMetaEnv","isFeatureEnabled","features","removeDangerousCode","codeRemover","visitor","post","invalidateTraversalCache","length","metadata","wywInJS","replacements","rules","wywPreval","getData","wywExport","expressionStatement","assignmentExpression","memberExpression","identifier","objectExpression","pushContainer","_default","exports","default"],"sources":["../../src/plugins/preeval.ts"],"sourcesContent":["/**\n * This file is a babel preset used to transform files inside evaluators.\n * It works the same as main `babel/extract` preset, but do not evaluate lazy dependencies.\n */\nimport type { BabelFile, PluginObj } from '@babel/core';\n\nimport type { StrictOptions } from '@wyw-in-js/shared';\nimport { isFeatureEnabled, logger } from '@wyw-in-js/shared';\n\nimport { applyProcessors } from '../utils/getTagProcessor';\nimport type { Core } from '../babel';\nimport type { IPluginState } from '../types';\nimport { EventEmitter } from '../utils/EventEmitter';\nimport { addIdentifierToWywPreval } from '../utils/addIdentifierToWywPreval';\nimport { getFileIdx } from '../utils/getFileIdx';\nimport { removeDangerousCode } from '../utils/removeDangerousCode';\nimport { replaceImportMetaEnv } from '../utils/replaceImportMetaEnv';\nimport { invalidateTraversalCache } from '../utils/traversalCache';\n\nexport type PreevalOptions = Pick<\n StrictOptions,\n | 'classNameSlug'\n | 'codeRemover'\n | 'displayName'\n | 'extensions'\n | 'evaluate'\n | 'features'\n | 'tagResolver'\n> & { eventEmitter?: EventEmitter };\n\nexport function preeval(\n babel: Core,\n options: PreevalOptions\n): PluginObj<IPluginState & { onFinish: () => void }> {\n const { types: t } = babel;\n const eventEmitter = options.eventEmitter ?? EventEmitter.dummy;\n return {\n name: '@wyw-in-js/transform/preeval',\n pre(file: BabelFile) {\n const filename = file.opts.filename!;\n const log = logger.extend('preeval').extend(getFileIdx(filename));\n\n log('start', 'Looking for template literals…');\n\n const rootScope = file.scope;\n this.processors = [];\n\n eventEmitter.perf('transform:preeval:processTemplate', () => {\n applyProcessors(file.path, file.opts, options, (processor) => {\n processor.dependencies.forEach((dependency) => {\n if (dependency.ex.type === 'Identifier') {\n addIdentifierToWywPreval(rootScope, dependency.ex.name);\n }\n });\n\n processor.doEvaltimeReplacement();\n this.processors.push(processor);\n });\n });\n\n eventEmitter.perf('transform:preeval:importMetaEnv', () => {\n replaceImportMetaEnv(file.path, t);\n });\n\n if (\n isFeatureEnabled(options.features, 'dangerousCodeRemover', filename)\n ) {\n log('start', 'Strip all JSX and browser related stuff');\n eventEmitter.perf('transform:preeval:removeDangerousCode', () =>\n removeDangerousCode(file.path, options.codeRemover)\n );\n }\n },\n visitor: {},\n post(file: BabelFile) {\n const log = logger\n .extend('preeval')\n .extend(getFileIdx(file.opts.filename!));\n\n invalidateTraversalCache(file.path);\n\n if (this.processors.length === 0) {\n log('end', \"We didn't find any wyw-in-js template literals\");\n\n // We didn't find any wyw-in-js template literals.\n return;\n }\n\n this.file.metadata.wywInJS = {\n processors: this.processors,\n replacements: [],\n rules: {},\n dependencies: [],\n };\n\n const wywPreval = file.path.getData('__wywPreval');\n if (!wywPreval) {\n // Event if there is no dependencies, we still need to add __wywPreval\n const wywExport = t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.memberExpression(\n t.identifier('exports'),\n t.identifier('__wywPreval')\n ),\n t.objectExpression([])\n )\n );\n\n file.path.pushContainer('body', wywExport);\n }\n\n log('end', '__wywPreval has been added');\n },\n };\n}\n\nexport default preeval;\n"],"mappings":"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","ignoreList":[]}
@@ -4,21 +4,31 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = shakerPlugin;
7
+ var _path = _interopRequireDefault(require("path"));
7
8
  var _shared = require("@wyw-in-js/shared");
8
9
  var _collectExportsAndImports = require("../utils/collectExportsAndImports");
9
10
  var _getFileIdx = require("../utils/getFileIdx");
10
11
  var _isRemoved = require("../utils/isRemoved");
11
12
  var _scopeHelpers = require("../utils/scopeHelpers");
12
13
  var _traversalCache = require("../utils/traversalCache");
13
- const EXT_REGEX = /\.[0-9a-z]+$/;
14
- const ALLOWED_EXTENSIONS = ['.js', '.cjs', '.mjs'];
15
- function shouldKeepSideEffect(importPath) {
16
- const [ext] = importPath.match(EXT_REGEX) || [''];
17
- return ext === '' || ALLOWED_EXTENSIONS.includes(ext);
14
+ var _parseRequest = require("../utils/parseRequest");
15
+ var _importOverrides = require("../utils/importOverrides");
16
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
+ function getNonParamBinding(exportPath, name) {
18
+ var _exportPath$scope$par, _exportPath$scope$par2;
19
+ const binding = exportPath.scope.getBinding(name);
20
+ if (binding && binding.kind !== 'param') {
21
+ return binding;
22
+ }
23
+
24
+ // When `exportPath` is inside a function scope, a parameter can shadow
25
+ // the actual export binding (e.g. `export function fallback(fallback) {}`).
26
+ // In such cases we need the binding from the declaration scope.
27
+ return (_exportPath$scope$par = (_exportPath$scope$par2 = exportPath.scope.parent) === null || _exportPath$scope$par2 === void 0 ? void 0 : _exportPath$scope$par2.getBinding(name)) !== null && _exportPath$scope$par !== void 0 ? _exportPath$scope$par : binding;
18
28
  }
19
29
  function getBindingForExport(exportPath) {
20
30
  if (exportPath.isIdentifier()) {
21
- return exportPath.scope.getBinding(exportPath.node.name);
31
+ return getNonParamBinding(exportPath, exportPath.node.name);
22
32
  }
23
33
  const variableDeclarator = exportPath.findParent(p => p.isVariableDeclarator());
24
34
  if (variableDeclarator) {
@@ -30,11 +40,11 @@ function getBindingForExport(exportPath) {
30
40
  if (exportPath.isAssignmentExpression()) {
31
41
  const left = exportPath.get('left');
32
42
  if (left.isIdentifier()) {
33
- return exportPath.scope.getBinding(left.node.name);
43
+ return getNonParamBinding(exportPath, left.node.name);
34
44
  }
35
45
  }
36
46
  if (exportPath.isFunctionDeclaration() || exportPath.isClassDeclaration()) {
37
- return exportPath.scope.getBinding(exportPath.node.id.name);
47
+ return getNonParamBinding(exportPath, exportPath.node.id.name);
38
48
  }
39
49
  return undefined;
40
50
  }
@@ -91,10 +101,44 @@ function rearrangeExports({
91
101
  });
92
102
  return rearranged;
93
103
  }
104
+ const getPropertyAssignmentStatement = (ref, bindingName) => {
105
+ const assignment = ref.findParent(parent => parent.isAssignmentExpression());
106
+ if (!(assignment !== null && assignment !== void 0 && assignment.isAssignmentExpression())) return null;
107
+ const left = assignment.get('left');
108
+ if (!left.isMemberExpression()) return null;
109
+ const object = left.get('object');
110
+ if (!object.isIdentifier({
111
+ name: bindingName
112
+ })) return null;
113
+ const statement = assignment.parentPath;
114
+ return statement !== null && statement !== void 0 && statement.isExpressionStatement() ? statement : null;
115
+ };
116
+ const isWithinAliveExport = (ref, aliveExports) => [...aliveExports].some(alive => alive === ref || alive.isAncestor(ref));
117
+ function stripExportKeepDeclaration(path) {
118
+ const exportDeclaration = path.findParent(p => p.isExportNamedDeclaration());
119
+ if (!exportDeclaration) return false;
120
+ const declaration = exportDeclaration.get('declaration');
121
+ if (!declaration.node) return false;
122
+ if (declaration.isFunctionDeclaration() || declaration.isClassDeclaration() || declaration.isTSEnumDeclaration()) {
123
+ exportDeclaration.replaceWith(declaration.node);
124
+ return true;
125
+ }
126
+ if (declaration.isVariableDeclaration()) {
127
+ const declarators = declaration.get('declarations');
128
+ if (declarators.length !== 1) {
129
+ return false;
130
+ }
131
+ exportDeclaration.replaceWith(declaration.node);
132
+ return true;
133
+ }
134
+ return false;
135
+ }
94
136
  function shakerPlugin(babel, {
95
137
  keepSideEffects = false,
96
138
  ifUnknownExport = 'skip-shaking',
97
- onlyExports
139
+ importOverrides,
140
+ onlyExports,
141
+ root
98
142
  }) {
99
143
  const shakerLogger = _shared.logger.extend('shaker');
100
144
  return {
@@ -104,6 +148,49 @@ function shakerPlugin(babel, {
104
148
  const log = shakerLogger.extend((0, _getFileIdx.getFileIdx)(this.filename));
105
149
  log('start', `${this.filename}, onlyExports: ${onlyExports.join(',')}`);
106
150
  const onlyExportsSet = new Set(onlyExports);
151
+ const shouldKeepOverride = override => !!override && ('mock' in override || 'noShake' in override);
152
+ const hasImportOverride = (() => {
153
+ if (!importOverrides || Object.keys(importOverrides).length === 0) {
154
+ return () => false;
155
+ }
156
+ const cache = new Map();
157
+ return source => {
158
+ var _importOverrides$sour;
159
+ const cached = cache.get(source);
160
+ if (cached !== undefined) {
161
+ return cached;
162
+ }
163
+ const strippedSource = (0, _parseRequest.stripQueryAndHash)(source);
164
+ const direct = (_importOverrides$sour = importOverrides[source]) !== null && _importOverrides$sour !== void 0 ? _importOverrides$sour : strippedSource !== source ? importOverrides[strippedSource] : null;
165
+ if (direct) {
166
+ const result = shouldKeepOverride(direct);
167
+ cache.set(source, result);
168
+ return result;
169
+ }
170
+ const isFileImport = strippedSource.startsWith('.') || _path.default.isAbsolute(strippedSource);
171
+ if (!isFileImport) {
172
+ cache.set(source, false);
173
+ return false;
174
+ }
175
+ try {
176
+ const resolved = (0, _shared.syncResolve)(strippedSource, this.filename, []);
177
+ const {
178
+ key
179
+ } = (0, _importOverrides.toImportKey)({
180
+ source: strippedSource,
181
+ resolved,
182
+ root
183
+ });
184
+ const override = importOverrides[key];
185
+ const result = shouldKeepOverride(override);
186
+ cache.set(source, result);
187
+ return result;
188
+ } catch {
189
+ cache.set(source, false);
190
+ return false;
191
+ }
192
+ };
193
+ })();
107
194
  const collected = (0, _collectExportsAndImports.collectExportsAndImports)(file.path);
108
195
  const sideEffectImports = collected.imports.filter(_collectExportsAndImports.sideEffectImport);
109
196
  log('import-and-exports', [`imports: ${collected.imports.length} (side-effects: ${sideEffectImports.length})`, `exports: ${Object.values(collected.exports).length}`, `reexports: ${collected.reexports.length}`].join(', '));
@@ -163,9 +250,14 @@ function shakerPlugin(babel, {
163
250
  Object.entries(exports).forEach(([exported, local]) => {
164
251
  if (onlyExportsSet.has(exported)) {
165
252
  aliveExports.add(local);
166
- } else if (importNames.includes(local.node.name || '')) {
253
+ return;
254
+ }
255
+ const binding = local.isIdentifier() && local.scope.getBinding(local.node.name);
256
+ if (binding && (binding.path.isImportSpecifier() || binding.path.isImportDefaultSpecifier() || binding.path.isImportNamespaceSpecifier()) && importNames.includes(local.node.name || '')) {
167
257
  aliveExports.add(local);
168
- } else if ([...aliveExports].some(alive => alive === local)) {
258
+ return;
259
+ }
260
+ if ([...aliveExports].some(alive => alive === local)) {
169
261
  // It's possible to export multiple values from a single variable initializer, e.g
170
262
  // export const { foo, bar } = baz();
171
263
  // We need to treat all of them as used if any of them are used, since otherwise
@@ -212,18 +304,29 @@ function shakerPlugin(babel, {
212
304
  }
213
305
  }
214
306
  const forDeleting = [...Object.values(exports), ...collected.reexports.map(i => i.local)].filter(exp => !aliveExports.has(exp));
307
+ const forDeletingSet = new Set(forDeleting);
308
+ const queueForDeleting = path => {
309
+ if ((0, _isRemoved.isRemoved)(path) || forDeletingSet.has(path)) {
310
+ return false;
311
+ }
312
+ forDeletingSet.add(path);
313
+ forDeleting.push(path);
314
+ return true;
315
+ };
215
316
  if (!keepSideEffects && !importedAsSideEffect) {
216
- // Remove all imports that don't import something explicitly and should not be kept
317
+ // Drop side-effect imports for eval-only builds unless they were explicitly requested.
318
+ // This prevents evaluating unrelated runtime code (e.g. Radix) during __wywPreval eval.
217
319
  sideEffectImports.forEach(i => {
218
- if (!shouldKeepSideEffect(i.source)) {
219
- forDeleting.push(i.local);
320
+ if (hasImportOverride(i.source)) {
321
+ return;
220
322
  }
323
+ queueForDeleting(i.local);
221
324
  });
222
325
  }
223
326
  const deleted = new Set();
224
327
  let dereferenced = [];
225
328
  let changed = true;
226
- while (changed && deleted.size < forDeleting.length) {
329
+ while (changed) {
227
330
  changed = false;
228
331
  // eslint-disable-next-line no-restricted-syntax
229
332
  for (const path of forDeleting) {
@@ -234,13 +337,43 @@ function shakerPlugin(babel, {
234
337
  const binding = getBindingForExport(path);
235
338
  const action = (0, _scopeHelpers.findActionForNode)(path);
236
339
  const parent = action === null || action === void 0 ? void 0 : action[1];
237
- const outerReferences = ((binding === null || binding === void 0 ? void 0 : binding.referencePaths) || []).filter(ref => ref !== parent && !(parent !== null && parent !== void 0 && parent.isAncestor(ref)));
238
- if (outerReferences.length > 0 && path.isIdentifier()) {
340
+ const outerReferences = ((binding === null || binding === void 0 ? void 0 : binding.referencePaths) || []).filter(ref => {
341
+ if (ref === parent || parent !== null && parent !== void 0 && parent.isAncestor(ref)) {
342
+ return false;
343
+ }
344
+ return !forDeleting.some(candidate => candidate !== path && !(0, _isRemoved.isRemoved)(candidate) && (candidate === ref || candidate.isAncestor(ref)));
345
+ });
346
+ const bindingName = binding === null || binding === void 0 ? void 0 : binding.identifier.name;
347
+ const removableAssignmentStatements = new Set();
348
+ const removableOuterReferences = outerReferences.filter(ref => {
349
+ if (!bindingName) return false;
350
+ const statement = getPropertyAssignmentStatement(ref, bindingName);
351
+ if (!statement || isWithinAliveExport(statement, aliveExports)) {
352
+ return false;
353
+ }
354
+ removableAssignmentStatements.add(statement);
355
+ return true;
356
+ });
357
+ const blockingReferences = outerReferences.filter(ref => !removableOuterReferences.includes(ref));
358
+ if (blockingReferences.length > 0 && path.isIdentifier()) {
239
359
  // Temporary deref it in order to simplify further checks.
240
360
  (0, _scopeHelpers.dereference)(path);
241
361
  dereferenced.push(path);
242
362
  }
243
- if (!deleted.has(path) && (!binding || outerReferences.length === 0)) {
363
+ if (!deleted.has(path) && binding && blockingReferences.length > 0 && stripExportKeepDeclaration(path)) {
364
+ deleted.add(path);
365
+ changed = true;
366
+ // eslint-disable-next-line no-continue
367
+ continue;
368
+ }
369
+ if (!deleted.has(path) && (!binding || blockingReferences.length === 0)) {
370
+ if (removableAssignmentStatements.size > 0) {
371
+ for (const statement of removableAssignmentStatements) {
372
+ if (queueForDeleting(statement)) {
373
+ changed = true;
374
+ }
375
+ }
376
+ }
244
377
  if (action) {
245
378
  (0, _scopeHelpers.applyAction)(action);
246
379
  } else {
@@ -261,10 +394,27 @@ function shakerPlugin(babel, {
261
394
  // Find and mark for deleting all unreferenced variables
262
395
  const unreferenced = Object.values(file.scope.getAllBindings()).filter(i => !i.referenced);
263
396
  for (const binding of unreferenced) {
264
- if (binding.path.isVariableDeclarator() && !forDeleting.includes(binding.path.get('id'))) {
265
- forDeleting.push(...binding.constantViolations);
266
- forDeleting.push(binding.path.get('id'));
267
- changed = true;
397
+ if (binding.path.isVariableDeclarator()) {
398
+ const id = binding.path.get('id');
399
+ if (!(0, _isRemoved.isRemoved)(id) && !forDeletingSet.has(id)) {
400
+ // Drop dead variable declarations, e.g. `const foo = make();` when `foo` is no longer referenced.
401
+ for (const violation of binding.constantViolations) {
402
+ if (queueForDeleting(violation)) {
403
+ changed = true;
404
+ }
405
+ }
406
+ if (queueForDeleting(id)) {
407
+ changed = true;
408
+ }
409
+ }
410
+ }
411
+
412
+ // Drop import specifiers whose bindings lost all references during shaking
413
+ // (e.g. when we keep only __wywPreval and the rest of the module is removed).
414
+ if ((binding.path.isImportSpecifier() || binding.path.isImportDefaultSpecifier() || binding.path.isImportNamespaceSpecifier()) && !(0, _isRemoved.isRemoved)(binding.path) && !forDeletingSet.has(binding.path)) {
415
+ if (queueForDeleting(binding.path)) {
416
+ changed = true;
417
+ }
268
418
  }
269
419
  }
270
420
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shaker.js","names":["_shared","require","_collectExportsAndImports","_getFileIdx","_isRemoved","_scopeHelpers","_traversalCache","EXT_REGEX","ALLOWED_EXTENSIONS","shouldKeepSideEffect","importPath","ext","match","includes","getBindingForExport","exportPath","isIdentifier","scope","getBinding","node","name","variableDeclarator","findParent","p","isVariableDeclarator","id","get","isAssignmentExpression","left","isFunctionDeclaration","isClassDeclaration","undefined","withoutRemoved","items","filter","local","isRemoved","rearrangeExports","types","t","root","exportRefs","exports","rearranged","rootScope","forEach","refs","_constantViolations","length","declarator","uid","generateUid","declaration","unshiftContainer","variableDeclaration","identifier","registerDeclaration","constantViolations","ref","replaced","replaceWith","isBindingIdentifier","push","reference","registerConstantViolation","assigmentToExport","expressionStatement","assignmentExpression","memberExpression","body","lastViolation","pathInRoot","find","n","isDescendant","pushed","insertAfter","shakerPlugin","babel","keepSideEffects","ifUnknownExport","onlyExports","shakerLogger","logger","extend","pre","file","filename","opts","log","getFileIdx","join","onlyExportsSet","Set","collected","collectExportsAndImports","path","sideEffectImports","imports","sideEffectImport","Object","values","reexports","hasWywPreval","__wywPreval","hasDefault","default","has","delete","size","deadExports","keys","remove","importedAsSideEffect","isEsModule","add","aliveExports","importNames","map","imported","entries","exported","some","alive","exp","exportToPath","Map","set","notFoundExports","clear","isAllExportsFound","Error","forDeleting","i","source","deleted","dereferenced","changed","binding","action","findActionForNode","parent","outerReferences","referencePaths","isAncestor","dereference","applyAction","removeWithRelated","unreferenced","getAllBindings","referenced","visitor","post","processedImports","addImport","metadata","wywEvaluator","invalidateTraversalCache"],"sources":["../../src/plugins/shaker.ts"],"sourcesContent":["import type { BabelFile, PluginObj, NodePath } from '@babel/core';\nimport type { Binding } from '@babel/traverse';\nimport type {\n Identifier,\n MemberExpression,\n Program,\n VariableDeclarator,\n} from '@babel/types';\n\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { Core } from '../babel';\nimport type { IMetadata } from '../utils/ShakerMetadata';\nimport type { Exports, IState } from '../utils/collectExportsAndImports';\nimport {\n collectExportsAndImports,\n sideEffectImport,\n} from '../utils/collectExportsAndImports';\nimport { getFileIdx } from '../utils/getFileIdx';\nimport { isRemoved } from '../utils/isRemoved';\nimport {\n applyAction,\n dereference,\n findActionForNode,\n reference,\n removeWithRelated,\n} from '../utils/scopeHelpers';\nimport { invalidateTraversalCache } from '../utils/traversalCache';\n\nconst EXT_REGEX = /\\.[0-9a-z]+$/;\nconst ALLOWED_EXTENSIONS = ['.js', '.cjs', '.mjs'];\n\nfunction shouldKeepSideEffect(importPath: string) {\n const [ext] = importPath.match(EXT_REGEX) || [''];\n\n return ext === '' || ALLOWED_EXTENSIONS.includes(ext);\n}\n\nexport interface IShakerOptions {\n ifUnknownExport?: 'error' | 'ignore' | 'reexport-all' | 'skip-shaking';\n keepSideEffects?: boolean;\n onlyExports: string[];\n}\n\ninterface NodeWithName {\n name: string;\n}\n\nfunction getBindingForExport(exportPath: NodePath): Binding | undefined {\n if (exportPath.isIdentifier()) {\n return exportPath.scope.getBinding(exportPath.node.name);\n }\n\n const variableDeclarator = exportPath.findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n if (variableDeclarator) {\n const id = variableDeclarator.get('id');\n if (id.isIdentifier()) {\n return variableDeclarator.scope.getBinding(id.node.name);\n }\n }\n\n if (exportPath.isAssignmentExpression()) {\n const left = exportPath.get('left');\n if (left.isIdentifier()) {\n return exportPath.scope.getBinding(left.node.name);\n }\n }\n\n if (exportPath.isFunctionDeclaration() || exportPath.isClassDeclaration()) {\n return exportPath.scope.getBinding(exportPath.node.id!.name);\n }\n\n return undefined;\n}\n\nconst withoutRemoved = <T extends { local: NodePath }>(items: T[]): T[] =>\n items.filter(({ local }) => !isRemoved(local));\n\nfunction rearrangeExports(\n { types: t }: Core,\n root: NodePath<Program>,\n exportRefs: Map<string, NodePath<MemberExpression>[]>,\n exports: Exports\n): Exports {\n const rearranged = {\n ...exports,\n };\n\n const rootScope = root.scope;\n exportRefs.forEach((refs, name) => {\n if (refs.length <= 1) {\n if (refs.length === 1) {\n // Maybe exports is assigned to another variable?\n const declarator = refs[0].findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n\n if (!declarator) {\n return;\n }\n } else {\n return;\n }\n }\n\n const uid = rootScope.generateUid(name);\n // Define variable in the beginning\n const [declaration] = root.unshiftContainer('body', [\n t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))]),\n ]);\n\n rootScope.registerDeclaration(declaration);\n\n const constantViolations: NodePath<Identifier>[] = [];\n // Replace every reference with defined variable\n refs.forEach((ref) => {\n const [replaced] = ref.replaceWith(t.identifier(uid));\n if (replaced.isBindingIdentifier()) {\n constantViolations.push(replaced);\n } else {\n reference(replaced);\n }\n });\n\n constantViolations.forEach((id) => {\n rootScope.registerConstantViolation(id);\n });\n\n const assigmentToExport = t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.memberExpression(t.identifier('exports'), t.identifier(name)),\n t.identifier(uid)\n )\n );\n\n // export.foo = _foo will be inserted either after the last _foo assigment or in the end of the file\n const body = root.get('body');\n const lastViolation =\n constantViolations[constantViolations.length - 1] ??\n body[body.length - 1];\n const pathInRoot = root\n .get('body')\n .find((n) => lastViolation.isDescendant(n))!;\n\n const [pushed] = pathInRoot.insertAfter(assigmentToExport);\n\n const local = pushed.get('expression.right') as NodePath<Identifier>;\n reference(local);\n\n rearranged[name] = local;\n });\n\n return rearranged;\n}\n\nexport default function shakerPlugin(\n babel: Core,\n {\n keepSideEffects = false,\n ifUnknownExport = 'skip-shaking',\n onlyExports,\n }: IShakerOptions\n): PluginObj<IState & { filename: string }> {\n const shakerLogger = logger.extend('shaker');\n\n return {\n name: '@wyw-in-js/transform/shaker',\n pre(file: BabelFile) {\n this.filename = file.opts.filename!;\n const log = shakerLogger.extend(getFileIdx(this.filename));\n\n log('start', `${this.filename}, onlyExports: ${onlyExports.join(',')}`);\n const onlyExportsSet = new Set(onlyExports);\n\n const collected = collectExportsAndImports(file.path);\n const sideEffectImports = collected.imports.filter(sideEffectImport);\n log(\n 'import-and-exports',\n [\n `imports: ${collected.imports.length} (side-effects: ${sideEffectImports.length})`,\n `exports: ${Object.values(collected.exports).length}`,\n `reexports: ${collected.reexports.length}`,\n ].join(', ')\n );\n\n // We cannot just throw out exports if they are referred in the code\n // Let's dome some replacements\n const exports = rearrangeExports(\n babel,\n file.path,\n collected.exportRefs,\n collected.exports\n );\n\n Object.values(exports).forEach((local) => {\n if (local.isAssignmentExpression()) {\n const left = local.get('left');\n if (left.isIdentifier()) {\n // For some reason babel does not mark id in AssignmentExpression as a reference\n // So we need to do it manually\n reference(left, left, true);\n }\n }\n });\n\n const hasWywPreval = exports.__wywPreval !== undefined;\n const hasDefault = exports.default !== undefined;\n\n // If __wywPreval is not exported, we can remove it from onlyExports\n if (onlyExportsSet.has('__wywPreval') && !hasWywPreval) {\n onlyExportsSet.delete('__wywPreval');\n }\n\n if (onlyExportsSet.size === 0) {\n // Fast-lane: if there are no exports to keep, we can just shake out the whole file\n this.imports = [];\n this.exports = {};\n this.reexports = [];\n this.deadExports = Object.keys(exports);\n\n file.path.get('body').forEach((p) => {\n p.remove();\n });\n\n return;\n }\n\n const importedAsSideEffect = onlyExportsSet.has('side-effect');\n onlyExportsSet.delete('side-effect');\n\n // Hackaround for packages which include a 'default' export without specifying __esModule; such packages cannot be\n // shaken as they will break interopRequireDefault babel helper\n // See example in shaker-plugin.test.ts\n // Real-world example was found in preact/compat npm package\n if (\n onlyExportsSet.has('default') &&\n hasDefault &&\n !collected.isEsModule\n ) {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n return;\n }\n\n if (!onlyExportsSet.has('*')) {\n // __esModule should be kept alive\n onlyExportsSet.add('__esModule');\n\n const aliveExports = new Set<NodePath>();\n const importNames = collected.imports.map(({ imported }) => imported);\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (onlyExportsSet.has(exported)) {\n aliveExports.add(local);\n } else if (\n importNames.includes((local.node as NodeWithName).name || '')\n ) {\n aliveExports.add(local);\n } else if ([...aliveExports].some((alive) => alive === local)) {\n // It's possible to export multiple values from a single variable initializer, e.g\n // export const { foo, bar } = baz();\n // We need to treat all of them as used if any of them are used, since otherwise\n // we'll attempt to delete the baz() call\n aliveExports.add(local);\n }\n });\n\n collected.reexports.forEach((exp) => {\n if (onlyExportsSet.has(exp.exported)) {\n aliveExports.add(exp.local);\n }\n });\n\n const exportToPath = new Map<string, NodePath>();\n Object.entries(exports).forEach(([exported, local]) => {\n exportToPath.set(exported, local);\n });\n\n collected.reexports.forEach((exp) => {\n exportToPath.set(exp.exported, exp.local);\n });\n\n const notFoundExports = [...onlyExportsSet].filter(\n (exp) =>\n exp !== '__esModule' && !aliveExports.has(exportToPath.get(exp)!)\n );\n exportToPath.clear();\n\n const isAllExportsFound = notFoundExports.length === 0;\n if (!isAllExportsFound && ifUnknownExport !== 'ignore') {\n if (ifUnknownExport === 'error') {\n throw new Error(\n `Unknown export(s) requested: ${onlyExports.join(',')}`\n );\n }\n\n if (ifUnknownExport === 'reexport-all') {\n // If there are unknown exports, we have keep alive all re-exports.\n if (exports['*'] !== undefined) {\n aliveExports.add(exports['*']);\n }\n\n collected.reexports.forEach((exp) => {\n if (exp.exported === '*') {\n aliveExports.add(exp.local);\n }\n });\n }\n\n if (ifUnknownExport === 'skip-shaking') {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n\n return;\n }\n }\n\n const forDeleting = [\n ...Object.values(exports),\n ...collected.reexports.map((i) => i.local),\n ].filter((exp) => !aliveExports.has(exp));\n\n if (!keepSideEffects && !importedAsSideEffect) {\n // Remove all imports that don't import something explicitly and should not be kept\n sideEffectImports.forEach((i) => {\n if (!shouldKeepSideEffect(i.source)) {\n forDeleting.push(i.local);\n }\n });\n }\n\n const deleted = new Set<NodePath>();\n\n let dereferenced: NodePath<Identifier>[] = [];\n let changed = true;\n while (changed && deleted.size < forDeleting.length) {\n changed = false;\n // eslint-disable-next-line no-restricted-syntax\n for (const path of forDeleting) {\n if (deleted.has(path)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const binding = getBindingForExport(path);\n const action = findActionForNode(path);\n const parent = action?.[1];\n const outerReferences = (binding?.referencePaths || []).filter(\n (ref) => ref !== parent && !parent?.isAncestor(ref)\n );\n if (outerReferences.length > 0 && path.isIdentifier()) {\n // Temporary deref it in order to simplify further checks.\n dereference(path);\n dereferenced.push(path);\n }\n\n if (\n !deleted.has(path) &&\n (!binding || outerReferences.length === 0)\n ) {\n if (action) {\n applyAction(action);\n } else {\n removeWithRelated([path]);\n }\n\n deleted.add(path);\n changed = true;\n }\n }\n\n dereferenced.forEach((path) => {\n // If path is still alive, we need to reference it back\n if (!isRemoved(path)) {\n reference(path);\n }\n });\n\n dereferenced = [];\n\n // Find and mark for deleting all unreferenced variables\n const unreferenced = Object.values(\n file.scope.getAllBindings()\n ).filter((i) => !i.referenced);\n\n for (const binding of unreferenced) {\n if (\n binding.path.isVariableDeclarator() &&\n !forDeleting.includes(binding.path.get('id'))\n ) {\n forDeleting.push(...binding.constantViolations);\n forDeleting.push(binding.path.get('id'));\n changed = true;\n }\n }\n }\n }\n\n this.imports = withoutRemoved(collected.imports);\n this.exports = {};\n this.deadExports = [];\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (isRemoved(local)) {\n this.deadExports.push(exported);\n } else {\n this.exports[exported] = local;\n }\n });\n\n this.reexports = withoutRemoved(collected.reexports);\n },\n visitor: {},\n post(file: BabelFile) {\n const log = shakerLogger.extend(getFileIdx(file.opts.filename!));\n\n const processedImports = new Set<string>();\n const imports = new Map<string, string[]>();\n const addImport = ({\n imported,\n source,\n }: {\n imported: string;\n source: string;\n }) => {\n if (processedImports.has(`${source}:${imported}`)) {\n return;\n }\n\n if (!imports.has(source)) {\n imports.set(source, []);\n }\n\n if (imported) {\n imports.get(source)!.push(imported);\n }\n\n processedImports.add(`${source}:${imported}`);\n };\n\n this.imports.forEach(addImport);\n this.reexports.forEach(addImport);\n\n log('end', `remaining imports: %O`, imports);\n\n // eslint-disable-next-line no-param-reassign\n (file.metadata as IMetadata).wywEvaluator = {\n imports,\n };\n\n invalidateTraversalCache(file.path);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shaker.js","names":["_path","_interopRequireDefault","require","_shared","_collectExportsAndImports","_getFileIdx","_isRemoved","_scopeHelpers","_traversalCache","_parseRequest","_importOverrides","e","__esModule","default","getNonParamBinding","exportPath","name","_exportPath$scope$par","_exportPath$scope$par2","binding","scope","getBinding","kind","parent","getBindingForExport","isIdentifier","node","variableDeclarator","findParent","p","isVariableDeclarator","id","get","isAssignmentExpression","left","isFunctionDeclaration","isClassDeclaration","undefined","withoutRemoved","items","filter","local","isRemoved","rearrangeExports","types","t","root","exportRefs","exports","rearranged","rootScope","forEach","refs","_constantViolations","length","declarator","uid","generateUid","declaration","unshiftContainer","variableDeclaration","identifier","registerDeclaration","constantViolations","ref","replaced","replaceWith","isBindingIdentifier","push","reference","registerConstantViolation","assigmentToExport","expressionStatement","assignmentExpression","memberExpression","body","lastViolation","pathInRoot","find","n","isDescendant","pushed","insertAfter","getPropertyAssignmentStatement","bindingName","assignment","isMemberExpression","object","statement","parentPath","isExpressionStatement","isWithinAliveExport","aliveExports","some","alive","isAncestor","stripExportKeepDeclaration","path","exportDeclaration","isExportNamedDeclaration","isTSEnumDeclaration","isVariableDeclaration","declarators","shakerPlugin","babel","keepSideEffects","ifUnknownExport","importOverrides","onlyExports","shakerLogger","logger","extend","pre","file","filename","opts","log","getFileIdx","join","onlyExportsSet","Set","shouldKeepOverride","override","hasImportOverride","Object","keys","cache","Map","source","_importOverrides$sour","cached","strippedSource","stripQueryAndHash","direct","result","set","isFileImport","startsWith","pathLib","isAbsolute","resolved","syncResolve","key","toImportKey","collected","collectExportsAndImports","sideEffectImports","imports","sideEffectImport","values","reexports","hasWywPreval","__wywPreval","hasDefault","has","delete","size","deadExports","remove","importedAsSideEffect","isEsModule","add","importNames","map","imported","entries","exported","isImportSpecifier","isImportDefaultSpecifier","isImportNamespaceSpecifier","includes","exp","exportToPath","notFoundExports","clear","isAllExportsFound","Error","forDeleting","i","forDeletingSet","queueForDeleting","deleted","dereferenced","changed","action","findActionForNode","outerReferences","referencePaths","candidate","removableAssignmentStatements","removableOuterReferences","blockingReferences","dereference","applyAction","removeWithRelated","unreferenced","getAllBindings","referenced","violation","visitor","post","processedImports","addImport","metadata","wywEvaluator","invalidateTraversalCache"],"sources":["../../src/plugins/shaker.ts"],"sourcesContent":["import pathLib from 'path';\n\nimport type { BabelFile, PluginObj, NodePath } from '@babel/core';\nimport type { Binding } from '@babel/traverse';\nimport type {\n ExportNamedDeclaration,\n Identifier,\n MemberExpression,\n Program,\n VariableDeclarator,\n} from '@babel/types';\n\nimport { logger, syncResolve } from '@wyw-in-js/shared';\nimport type { ImportOverride, ImportOverrides } from '@wyw-in-js/shared';\n\nimport type { Core } from '../babel';\nimport type { IMetadata } from '../utils/ShakerMetadata';\nimport type { Exports, IState } from '../utils/collectExportsAndImports';\nimport {\n collectExportsAndImports,\n sideEffectImport,\n} from '../utils/collectExportsAndImports';\nimport { getFileIdx } from '../utils/getFileIdx';\nimport { isRemoved } from '../utils/isRemoved';\nimport {\n applyAction,\n dereference,\n findActionForNode,\n reference,\n removeWithRelated,\n} from '../utils/scopeHelpers';\nimport { invalidateTraversalCache } from '../utils/traversalCache';\nimport { stripQueryAndHash } from '../utils/parseRequest';\nimport { toImportKey } from '../utils/importOverrides';\n\nexport interface IShakerOptions {\n ifUnknownExport?: 'error' | 'ignore' | 'reexport-all' | 'skip-shaking';\n importOverrides?: ImportOverrides;\n keepSideEffects?: boolean;\n onlyExports: string[];\n root?: string;\n}\n\ninterface NodeWithName {\n name: string;\n}\n\nfunction getNonParamBinding(\n exportPath: NodePath,\n name: string\n): Binding | undefined {\n const binding = exportPath.scope.getBinding(name);\n if (binding && (binding.kind as string) !== 'param') {\n return binding;\n }\n\n // When `exportPath` is inside a function scope, a parameter can shadow\n // the actual export binding (e.g. `export function fallback(fallback) {}`).\n // In such cases we need the binding from the declaration scope.\n return exportPath.scope.parent?.getBinding(name) ?? binding;\n}\n\nfunction getBindingForExport(exportPath: NodePath): Binding | undefined {\n if (exportPath.isIdentifier()) {\n return getNonParamBinding(exportPath, exportPath.node.name);\n }\n\n const variableDeclarator = exportPath.findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n if (variableDeclarator) {\n const id = variableDeclarator.get('id');\n if (id.isIdentifier()) {\n return variableDeclarator.scope.getBinding(id.node.name);\n }\n }\n\n if (exportPath.isAssignmentExpression()) {\n const left = exportPath.get('left');\n if (left.isIdentifier()) {\n return getNonParamBinding(exportPath, left.node.name);\n }\n }\n\n if (exportPath.isFunctionDeclaration() || exportPath.isClassDeclaration()) {\n return getNonParamBinding(exportPath, exportPath.node.id!.name);\n }\n\n return undefined;\n}\n\nconst withoutRemoved = <T extends { local: NodePath }>(items: T[]): T[] =>\n items.filter(({ local }) => !isRemoved(local));\n\nfunction rearrangeExports(\n { types: t }: Core,\n root: NodePath<Program>,\n exportRefs: Map<string, NodePath<MemberExpression>[]>,\n exports: Exports\n): Exports {\n const rearranged = {\n ...exports,\n };\n\n const rootScope = root.scope;\n exportRefs.forEach((refs, name) => {\n if (refs.length <= 1) {\n if (refs.length === 1) {\n // Maybe exports is assigned to another variable?\n const declarator = refs[0].findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n\n if (!declarator) {\n return;\n }\n } else {\n return;\n }\n }\n\n const uid = rootScope.generateUid(name);\n // Define variable in the beginning\n const [declaration] = root.unshiftContainer('body', [\n t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))]),\n ]);\n\n rootScope.registerDeclaration(declaration);\n\n const constantViolations: NodePath<Identifier>[] = [];\n // Replace every reference with defined variable\n refs.forEach((ref) => {\n const [replaced] = ref.replaceWith(t.identifier(uid));\n if (replaced.isBindingIdentifier()) {\n constantViolations.push(replaced);\n } else {\n reference(replaced);\n }\n });\n\n constantViolations.forEach((id) => {\n rootScope.registerConstantViolation(id);\n });\n\n const assigmentToExport = t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.memberExpression(t.identifier('exports'), t.identifier(name)),\n t.identifier(uid)\n )\n );\n\n // export.foo = _foo will be inserted either after the last _foo assigment or in the end of the file\n const body = root.get('body');\n const lastViolation =\n constantViolations[constantViolations.length - 1] ??\n body[body.length - 1];\n const pathInRoot = root\n .get('body')\n .find((n) => lastViolation.isDescendant(n))!;\n\n const [pushed] = pathInRoot.insertAfter(assigmentToExport);\n\n const local = pushed.get('expression.right') as NodePath<Identifier>;\n reference(local);\n\n rearranged[name] = local;\n });\n\n return rearranged;\n}\n\nconst getPropertyAssignmentStatement = (\n ref: NodePath,\n bindingName: string\n): NodePath | null => {\n const assignment = ref.findParent((parent) =>\n parent.isAssignmentExpression()\n );\n if (!assignment?.isAssignmentExpression()) return null;\n\n const left = assignment.get('left');\n if (!left.isMemberExpression()) return null;\n\n const object = left.get('object');\n if (!object.isIdentifier({ name: bindingName })) return null;\n\n const statement = assignment.parentPath;\n return statement?.isExpressionStatement() ? statement : null;\n};\n\nconst isWithinAliveExport = (\n ref: NodePath,\n aliveExports: Set<NodePath>\n): boolean =>\n [...aliveExports].some((alive) => alive === ref || alive.isAncestor(ref));\n\nfunction stripExportKeepDeclaration(path: NodePath): boolean {\n const exportDeclaration = path.findParent((p) =>\n p.isExportNamedDeclaration()\n ) as NodePath<ExportNamedDeclaration> | null;\n if (!exportDeclaration) return false;\n\n const declaration = exportDeclaration.get('declaration');\n if (!declaration.node) return false;\n\n if (\n declaration.isFunctionDeclaration() ||\n declaration.isClassDeclaration() ||\n declaration.isTSEnumDeclaration()\n ) {\n exportDeclaration.replaceWith(declaration.node);\n return true;\n }\n\n if (declaration.isVariableDeclaration()) {\n const declarators = declaration.get('declarations');\n if (declarators.length !== 1) {\n return false;\n }\n\n exportDeclaration.replaceWith(declaration.node);\n return true;\n }\n\n return false;\n}\n\nexport default function shakerPlugin(\n babel: Core,\n {\n keepSideEffects = false,\n ifUnknownExport = 'skip-shaking',\n importOverrides,\n onlyExports,\n root,\n }: IShakerOptions\n): PluginObj<IState & { filename: string }> {\n const shakerLogger = logger.extend('shaker');\n\n return {\n name: '@wyw-in-js/transform/shaker',\n pre(file: BabelFile) {\n this.filename = file.opts.filename!;\n const log = shakerLogger.extend(getFileIdx(this.filename));\n\n log('start', `${this.filename}, onlyExports: ${onlyExports.join(',')}`);\n const onlyExportsSet = new Set(onlyExports);\n\n const shouldKeepOverride = (\n override: ImportOverride | undefined\n ): boolean => !!override && ('mock' in override || 'noShake' in override);\n\n const hasImportOverride = (() => {\n if (!importOverrides || Object.keys(importOverrides).length === 0) {\n return () => false;\n }\n\n const cache = new Map<string, boolean>();\n\n return (source: string): boolean => {\n const cached = cache.get(source);\n if (cached !== undefined) {\n return cached;\n }\n\n const strippedSource = stripQueryAndHash(source);\n\n const direct =\n importOverrides[source] ??\n (strippedSource !== source\n ? importOverrides[strippedSource]\n : null);\n if (direct) {\n const result = shouldKeepOverride(direct);\n cache.set(source, result);\n return result;\n }\n\n const isFileImport =\n strippedSource.startsWith('.') ||\n pathLib.isAbsolute(strippedSource);\n if (!isFileImport) {\n cache.set(source, false);\n return false;\n }\n\n try {\n const resolved = syncResolve(strippedSource, this.filename, []);\n const { key } = toImportKey({\n source: strippedSource,\n resolved,\n root,\n });\n const override = importOverrides[key];\n const result = shouldKeepOverride(override);\n cache.set(source, result);\n return result;\n } catch {\n cache.set(source, false);\n return false;\n }\n };\n })();\n\n const collected = collectExportsAndImports(file.path);\n const sideEffectImports = collected.imports.filter(sideEffectImport);\n log(\n 'import-and-exports',\n [\n `imports: ${collected.imports.length} (side-effects: ${sideEffectImports.length})`,\n `exports: ${Object.values(collected.exports).length}`,\n `reexports: ${collected.reexports.length}`,\n ].join(', ')\n );\n\n // We cannot just throw out exports if they are referred in the code\n // Let's dome some replacements\n const exports = rearrangeExports(\n babel,\n file.path,\n collected.exportRefs,\n collected.exports\n );\n\n Object.values(exports).forEach((local) => {\n if (local.isAssignmentExpression()) {\n const left = local.get('left');\n if (left.isIdentifier()) {\n // For some reason babel does not mark id in AssignmentExpression as a reference\n // So we need to do it manually\n reference(left, left, true);\n }\n }\n });\n\n const hasWywPreval = exports.__wywPreval !== undefined;\n const hasDefault = exports.default !== undefined;\n\n // If __wywPreval is not exported, we can remove it from onlyExports\n if (onlyExportsSet.has('__wywPreval') && !hasWywPreval) {\n onlyExportsSet.delete('__wywPreval');\n }\n\n if (onlyExportsSet.size === 0) {\n // Fast-lane: if there are no exports to keep, we can just shake out the whole file\n this.imports = [];\n this.exports = {};\n this.reexports = [];\n this.deadExports = Object.keys(exports);\n\n file.path.get('body').forEach((p) => {\n p.remove();\n });\n\n return;\n }\n\n const importedAsSideEffect = onlyExportsSet.has('side-effect');\n onlyExportsSet.delete('side-effect');\n\n // Hackaround for packages which include a 'default' export without specifying __esModule; such packages cannot be\n // shaken as they will break interopRequireDefault babel helper\n // See example in shaker-plugin.test.ts\n // Real-world example was found in preact/compat npm package\n if (\n onlyExportsSet.has('default') &&\n hasDefault &&\n !collected.isEsModule\n ) {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n return;\n }\n\n if (!onlyExportsSet.has('*')) {\n // __esModule should be kept alive\n onlyExportsSet.add('__esModule');\n\n const aliveExports = new Set<NodePath>();\n const importNames = collected.imports.map(({ imported }) => imported);\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (onlyExportsSet.has(exported)) {\n aliveExports.add(local);\n return;\n }\n\n const binding =\n local.isIdentifier() && local.scope.getBinding(local.node.name);\n\n if (\n binding &&\n (binding.path.isImportSpecifier() ||\n binding.path.isImportDefaultSpecifier() ||\n binding.path.isImportNamespaceSpecifier()) &&\n importNames.includes((local.node as NodeWithName).name || '')\n ) {\n aliveExports.add(local);\n return;\n }\n\n if ([...aliveExports].some((alive) => alive === local)) {\n // It's possible to export multiple values from a single variable initializer, e.g\n // export const { foo, bar } = baz();\n // We need to treat all of them as used if any of them are used, since otherwise\n // we'll attempt to delete the baz() call\n aliveExports.add(local);\n }\n });\n\n collected.reexports.forEach((exp) => {\n if (onlyExportsSet.has(exp.exported)) {\n aliveExports.add(exp.local);\n }\n });\n\n const exportToPath = new Map<string, NodePath>();\n Object.entries(exports).forEach(([exported, local]) => {\n exportToPath.set(exported, local);\n });\n\n collected.reexports.forEach((exp) => {\n exportToPath.set(exp.exported, exp.local);\n });\n\n const notFoundExports = [...onlyExportsSet].filter(\n (exp) =>\n exp !== '__esModule' && !aliveExports.has(exportToPath.get(exp)!)\n );\n exportToPath.clear();\n\n const isAllExportsFound = notFoundExports.length === 0;\n if (!isAllExportsFound && ifUnknownExport !== 'ignore') {\n if (ifUnknownExport === 'error') {\n throw new Error(\n `Unknown export(s) requested: ${onlyExports.join(',')}`\n );\n }\n\n if (ifUnknownExport === 'reexport-all') {\n // If there are unknown exports, we have keep alive all re-exports.\n if (exports['*'] !== undefined) {\n aliveExports.add(exports['*']);\n }\n\n collected.reexports.forEach((exp) => {\n if (exp.exported === '*') {\n aliveExports.add(exp.local);\n }\n });\n }\n\n if (ifUnknownExport === 'skip-shaking') {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n\n return;\n }\n }\n\n const forDeleting = [\n ...Object.values(exports),\n ...collected.reexports.map((i) => i.local),\n ].filter((exp) => !aliveExports.has(exp));\n\n const forDeletingSet = new Set<NodePath>(forDeleting);\n const queueForDeleting = (path: NodePath): boolean => {\n if (isRemoved(path) || forDeletingSet.has(path)) {\n return false;\n }\n\n forDeletingSet.add(path);\n forDeleting.push(path);\n return true;\n };\n\n if (!keepSideEffects && !importedAsSideEffect) {\n // Drop side-effect imports for eval-only builds unless they were explicitly requested.\n // This prevents evaluating unrelated runtime code (e.g. Radix) during __wywPreval eval.\n sideEffectImports.forEach((i) => {\n if (hasImportOverride(i.source)) {\n return;\n }\n\n queueForDeleting(i.local);\n });\n }\n\n const deleted = new Set<NodePath>();\n\n let dereferenced: NodePath<Identifier>[] = [];\n let changed = true;\n while (changed) {\n changed = false;\n // eslint-disable-next-line no-restricted-syntax\n for (const path of forDeleting) {\n if (deleted.has(path)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const binding = getBindingForExport(path);\n const action = findActionForNode(path);\n const parent = action?.[1];\n const outerReferences = (binding?.referencePaths || []).filter(\n (ref) => {\n if (ref === parent || parent?.isAncestor(ref)) {\n return false;\n }\n\n return !forDeleting.some(\n (candidate) =>\n candidate !== path &&\n !isRemoved(candidate) &&\n (candidate === ref || candidate.isAncestor(ref))\n );\n }\n );\n const bindingName = binding?.identifier.name;\n const removableAssignmentStatements = new Set<NodePath>();\n const removableOuterReferences = outerReferences.filter((ref) => {\n if (!bindingName) return false;\n const statement = getPropertyAssignmentStatement(\n ref,\n bindingName\n );\n if (!statement || isWithinAliveExport(statement, aliveExports)) {\n return false;\n }\n\n removableAssignmentStatements.add(statement);\n return true;\n });\n\n const blockingReferences = outerReferences.filter(\n (ref) => !removableOuterReferences.includes(ref)\n );\n\n if (blockingReferences.length > 0 && path.isIdentifier()) {\n // Temporary deref it in order to simplify further checks.\n dereference(path);\n dereferenced.push(path);\n }\n\n if (\n !deleted.has(path) &&\n binding &&\n blockingReferences.length > 0 &&\n stripExportKeepDeclaration(path)\n ) {\n deleted.add(path);\n changed = true;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (\n !deleted.has(path) &&\n (!binding || blockingReferences.length === 0)\n ) {\n if (removableAssignmentStatements.size > 0) {\n for (const statement of removableAssignmentStatements) {\n if (queueForDeleting(statement)) {\n changed = true;\n }\n }\n }\n\n if (action) {\n applyAction(action);\n } else {\n removeWithRelated([path]);\n }\n\n deleted.add(path);\n changed = true;\n }\n }\n\n dereferenced.forEach((path) => {\n // If path is still alive, we need to reference it back\n if (!isRemoved(path)) {\n reference(path);\n }\n });\n\n dereferenced = [];\n\n // Find and mark for deleting all unreferenced variables\n const unreferenced = Object.values(\n file.scope.getAllBindings()\n ).filter((i) => !i.referenced);\n\n for (const binding of unreferenced) {\n if (binding.path.isVariableDeclarator()) {\n const id = binding.path.get('id');\n if (!isRemoved(id) && !forDeletingSet.has(id)) {\n // Drop dead variable declarations, e.g. `const foo = make();` when `foo` is no longer referenced.\n for (const violation of binding.constantViolations) {\n if (queueForDeleting(violation)) {\n changed = true;\n }\n }\n\n if (queueForDeleting(id)) {\n changed = true;\n }\n }\n }\n\n // Drop import specifiers whose bindings lost all references during shaking\n // (e.g. when we keep only __wywPreval and the rest of the module is removed).\n if (\n (binding.path.isImportSpecifier() ||\n binding.path.isImportDefaultSpecifier() ||\n binding.path.isImportNamespaceSpecifier()) &&\n !isRemoved(binding.path) &&\n !forDeletingSet.has(binding.path)\n ) {\n if (queueForDeleting(binding.path)) {\n changed = true;\n }\n }\n }\n }\n }\n\n this.imports = withoutRemoved(collected.imports);\n this.exports = {};\n this.deadExports = [];\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (isRemoved(local)) {\n this.deadExports.push(exported);\n } else {\n this.exports[exported] = local;\n }\n });\n\n this.reexports = withoutRemoved(collected.reexports);\n },\n visitor: {},\n post(file: BabelFile) {\n const log = shakerLogger.extend(getFileIdx(file.opts.filename!));\n\n const processedImports = new Set<string>();\n const imports = new Map<string, string[]>();\n const addImport = ({\n imported,\n source,\n }: {\n imported: string;\n source: string;\n }) => {\n if (processedImports.has(`${source}:${imported}`)) {\n return;\n }\n\n if (!imports.has(source)) {\n imports.set(source, []);\n }\n\n if (imported) {\n imports.get(source)!.push(imported);\n }\n\n processedImports.add(`${source}:${imported}`);\n };\n\n this.imports.forEach(addImport);\n this.reexports.forEach(addImport);\n\n log('end', `remaining imports: %O`, imports);\n\n // eslint-disable-next-line no-param-reassign\n (file.metadata as IMetadata).wywEvaluator = {\n imports,\n };\n\n invalidateTraversalCache(file.path);\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
package/lib/shaker.js CHANGED
@@ -4,8 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.shaker = exports.default = void 0;
7
+ var _shaker = _interopRequireDefault(require("./plugins/shaker"));
7
8
  var _ShakerMetadata = require("./utils/ShakerMetadata");
8
9
  var _getPluginKey = require("./utils/getPluginKey");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
11
  const hasKeyInList = (plugin, list) => {
10
12
  const pluginKey = (0, _getPluginKey.getPluginKey)(plugin);
11
13
  return pluginKey ? list.some(i => pluginKey.includes(i)) : false;
@@ -23,21 +25,23 @@ const shaker = (evalConfig, ast, code, {
23
25
  highPriorityPlugins,
24
26
  ...config
25
27
  }, babel) => {
26
- var _evalConfig$plugins$f, _evalConfig$plugins, _evalConfig$plugins2, _evalConfig$plugins3, _evalConfig$filename, _evalConfig$filename2, _transformed$code;
28
+ var _evalConfig$plugins$f, _evalConfig$plugins, _evalConfig$plugins2, _evalConfig$plugins3, _evalConfig$filename, _evalConfig$filename2, _evalConfig$filename3, _evalConfig$filename4, _transformed$code;
27
29
  const preShakePlugins = (_evalConfig$plugins$f = (_evalConfig$plugins = evalConfig.plugins) === null || _evalConfig$plugins === void 0 ? void 0 : _evalConfig$plugins.filter(i => hasKeyInList(i, highPriorityPlugins))) !== null && _evalConfig$plugins$f !== void 0 ? _evalConfig$plugins$f : [];
28
- const plugins = [...preShakePlugins, [require.resolve('./plugins/shaker'), config], ...((_evalConfig$plugins2 = evalConfig.plugins) !== null && _evalConfig$plugins2 !== void 0 ? _evalConfig$plugins2 : []).filter(i => !hasKeyInList(i, highPriorityPlugins))];
30
+ const plugins = [...preShakePlugins, [_shaker.default, config], ...((_evalConfig$plugins2 = evalConfig.plugins) !== null && _evalConfig$plugins2 !== void 0 ? _evalConfig$plugins2 : []).filter(i => !hasKeyInList(i, highPriorityPlugins))];
29
31
  const hasCommonjsPlugin = (_evalConfig$plugins3 = evalConfig.plugins) === null || _evalConfig$plugins3 === void 0 ? void 0 : _evalConfig$plugins3.some(i => (0, _getPluginKey.getPluginKey)(i) === 'transform-modules-commonjs');
30
32
  if (!hasCommonjsPlugin) {
31
33
  plugins.push(require.resolve('@babel/plugin-transform-modules-commonjs'));
32
34
  }
33
- if ((_evalConfig$filename = evalConfig.filename) !== null && _evalConfig$filename !== void 0 && _evalConfig$filename.endsWith('.ts') || (_evalConfig$filename2 = evalConfig.filename) !== null && _evalConfig$filename2 !== void 0 && _evalConfig$filename2.endsWith('.tsx')) {
35
+ if ((_evalConfig$filename = evalConfig.filename) !== null && _evalConfig$filename !== void 0 && _evalConfig$filename.endsWith('.ts') || (_evalConfig$filename2 = evalConfig.filename) !== null && _evalConfig$filename2 !== void 0 && _evalConfig$filename2.endsWith('.tsx') || (_evalConfig$filename3 = evalConfig.filename) !== null && _evalConfig$filename3 !== void 0 && _evalConfig$filename3.endsWith('.mts') || (_evalConfig$filename4 = evalConfig.filename) !== null && _evalConfig$filename4 !== void 0 && _evalConfig$filename4.endsWith('.cts')) {
34
36
  var _evalConfig$plugins4;
35
37
  const hasTypescriptPlugin = (_evalConfig$plugins4 = evalConfig.plugins) === null || _evalConfig$plugins4 === void 0 ? void 0 : _evalConfig$plugins4.some(i => (0, _getPluginKey.getPluginKey)(i) === 'transform-typescript');
36
38
  if (!hasTypescriptPlugin) {
37
39
  const preset = safeResolve('@babel/preset-typescript', [evalConfig.filename]);
38
40
  const plugin = safeResolve('@babel/plugin-transform-typescript', [evalConfig.filename, preset]);
39
41
  if (plugin) {
40
- plugins.push(plugin);
42
+ plugins.push([plugin, {
43
+ allowDeclareFields: true
44
+ }]);
41
45
  }
42
46
  }
43
47
  }
package/lib/shaker.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shaker.js","names":["_ShakerMetadata","require","_getPluginKey","hasKeyInList","plugin","list","pluginKey","getPluginKey","some","i","includes","safeResolve","id","paths","resolve","filter","shaker","evalConfig","ast","code","highPriorityPlugins","config","babel","_evalConfig$plugins$f","_evalConfig$plugins","_evalConfig$plugins2","_evalConfig$plugins3","_evalConfig$filename","_evalConfig$filename2","_transformed$code","preShakePlugins","plugins","hasCommonjsPlugin","push","filename","endsWith","_evalConfig$plugins4","hasTypescriptPlugin","preset","transformOptions","caller","name","transformed","transformFromAstSync","hasShakerMetadata","metadata","Error","wywEvaluator","imports","exports","_default","default"],"sources":["../src/shaker.ts"],"sourcesContent":["import type { TransformOptions, PluginItem } from '@babel/core';\n\nimport type { Evaluator } from '@wyw-in-js/shared';\n\nimport { hasShakerMetadata } from './utils/ShakerMetadata';\nimport { getPluginKey } from './utils/getPluginKey';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nconst safeResolve = (id: string, paths: (string | null)[]): string | null => {\n try {\n return require.resolve(id, {\n paths: paths.filter((i) => i !== null) as string[],\n });\n } catch {\n return null;\n }\n};\n\nexport const shaker: Evaluator = (\n evalConfig,\n ast,\n code,\n { highPriorityPlugins, ...config },\n babel\n) => {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) => hasKeyInList(i, highPriorityPlugins)) ??\n [];\n\n const plugins = [\n ...preShakePlugins,\n [require.resolve('./plugins/shaker'), config],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, highPriorityPlugins)\n ),\n ];\n\n const hasCommonjsPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-modules-commonjs'\n );\n\n if (!hasCommonjsPlugin) {\n plugins.push(require.resolve('@babel/plugin-transform-modules-commonjs'));\n }\n\n if (\n evalConfig.filename?.endsWith('.ts') ||\n evalConfig.filename?.endsWith('.tsx')\n ) {\n const hasTypescriptPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-typescript'\n );\n\n if (!hasTypescriptPlugin) {\n const preset = safeResolve('@babel/preset-typescript', [\n evalConfig.filename,\n ]);\n const plugin = safeResolve('@babel/plugin-transform-typescript', [\n evalConfig.filename,\n preset,\n ]);\n\n if (plugin) {\n plugins.push(plugin);\n }\n }\n }\n\n const transformOptions: TransformOptions = {\n ...evalConfig,\n caller: {\n name: 'wyw-in-js',\n },\n plugins,\n };\n\n const transformed = babel.transformFromAstSync(ast, code, transformOptions);\n\n if (!transformed || !hasShakerMetadata(transformed.metadata)) {\n throw new Error(`${evalConfig.filename} has no shaker metadata`);\n }\n\n return [\n transformed.ast!,\n transformed.code ?? '',\n transformed.metadata.wywEvaluator.imports,\n ];\n};\n\nexport default shaker;\n"],"mappings":";;;;;;AAIA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AAEA,MAAME,YAAY,GAAGA,CAACC,MAAkB,EAAEC,IAAc,KAAc;EACpE,MAAMC,SAAS,GAAG,IAAAC,0BAAY,EAACH,MAAM,CAAC;EACtC,OAAOE,SAAS,GAAGD,IAAI,CAACG,IAAI,CAAEC,CAAC,IAAKH,SAAS,CAACI,QAAQ,CAACD,CAAC,CAAC,CAAC,GAAG,KAAK;AACpE,CAAC;AAED,MAAME,WAAW,GAAGA,CAACC,EAAU,EAAEC,KAAwB,KAAoB;EAC3E,IAAI;IACF,OAAOZ,OAAO,CAACa,OAAO,CAACF,EAAE,EAAE;MACzBC,KAAK,EAAEA,KAAK,CAACE,MAAM,CAAEN,CAAC,IAAKA,CAAC,KAAK,IAAI;IACvC,CAAC,CAAC;EACJ,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF,CAAC;AAEM,MAAMO,MAAiB,GAAGA,CAC/BC,UAAU,EACVC,GAAG,EACHC,IAAI,EACJ;EAAEC,mBAAmB;EAAE,GAAGC;AAAO,CAAC,EAClCC,KAAK,KACF;EAAA,IAAAC,qBAAA,EAAAC,mBAAA,EAAAC,oBAAA,EAAAC,oBAAA,EAAAC,oBAAA,EAAAC,qBAAA,EAAAC,iBAAA;EACH,MAAMC,eAAe,IAAAP,qBAAA,IAAAC,mBAAA,GACnBP,UAAU,CAACc,OAAO,cAAAP,mBAAA,uBAAlBA,mBAAA,CAAoBT,MAAM,CAAEN,CAAC,IAAKN,YAAY,CAACM,CAAC,EAAEW,mBAAmB,CAAC,CAAC,cAAAG,qBAAA,cAAAA,qBAAA,GACvE,EAAE;EAEJ,MAAMQ,OAAO,GAAG,CACd,GAAGD,eAAe,EAClB,CAAC7B,OAAO,CAACa,OAAO,CAAC,kBAAkB,CAAC,EAAEO,MAAM,CAAC,EAC7C,GAAG,EAAAI,oBAAA,GAACR,UAAU,CAACc,OAAO,cAAAN,oBAAA,cAAAA,oBAAA,GAAI,EAAE,EAAEV,MAAM,CACjCN,CAAC,IAAK,CAACN,YAAY,CAACM,CAAC,EAAEW,mBAAmB,CAC7C,CAAC,CACF;EAED,MAAMY,iBAAiB,IAAAN,oBAAA,GAAGT,UAAU,CAACc,OAAO,cAAAL,oBAAA,uBAAlBA,oBAAA,CAAoBlB,IAAI,CAC/CC,CAAC,IAAK,IAAAF,0BAAY,EAACE,CAAC,CAAC,KAAK,4BAC7B,CAAC;EAED,IAAI,CAACuB,iBAAiB,EAAE;IACtBD,OAAO,CAACE,IAAI,CAAChC,OAAO,CAACa,OAAO,CAAC,0CAA0C,CAAC,CAAC;EAC3E;EAEA,IACE,CAAAa,oBAAA,GAAAV,UAAU,CAACiB,QAAQ,cAAAP,oBAAA,eAAnBA,oBAAA,CAAqBQ,QAAQ,CAAC,KAAK,CAAC,KAAAP,qBAAA,GACpCX,UAAU,CAACiB,QAAQ,cAAAN,qBAAA,eAAnBA,qBAAA,CAAqBO,QAAQ,CAAC,MAAM,CAAC,EACrC;IAAA,IAAAC,oBAAA;IACA,MAAMC,mBAAmB,IAAAD,oBAAA,GAAGnB,UAAU,CAACc,OAAO,cAAAK,oBAAA,uBAAlBA,oBAAA,CAAoB5B,IAAI,CACjDC,CAAC,IAAK,IAAAF,0BAAY,EAACE,CAAC,CAAC,KAAK,sBAC7B,CAAC;IAED,IAAI,CAAC4B,mBAAmB,EAAE;MACxB,MAAMC,MAAM,GAAG3B,WAAW,CAAC,0BAA0B,EAAE,CACrDM,UAAU,CAACiB,QAAQ,CACpB,CAAC;MACF,MAAM9B,MAAM,GAAGO,WAAW,CAAC,oCAAoC,EAAE,CAC/DM,UAAU,CAACiB,QAAQ,EACnBI,MAAM,CACP,CAAC;MAEF,IAAIlC,MAAM,EAAE;QACV2B,OAAO,CAACE,IAAI,CAAC7B,MAAM,CAAC;MACtB;IACF;EACF;EAEA,MAAMmC,gBAAkC,GAAG;IACzC,GAAGtB,UAAU;IACbuB,MAAM,EAAE;MACNC,IAAI,EAAE;IACR,CAAC;IACDV;EACF,CAAC;EAED,MAAMW,WAAW,GAAGpB,KAAK,CAACqB,oBAAoB,CAACzB,GAAG,EAAEC,IAAI,EAAEoB,gBAAgB,CAAC;EAE3E,IAAI,CAACG,WAAW,IAAI,CAAC,IAAAE,iCAAiB,EAACF,WAAW,CAACG,QAAQ,CAAC,EAAE;IAC5D,MAAM,IAAIC,KAAK,CAAE,GAAE7B,UAAU,CAACiB,QAAS,yBAAwB,CAAC;EAClE;EAEA,OAAO,CACLQ,WAAW,CAACxB,GAAG,GAAAW,iBAAA,GACfa,WAAW,CAACvB,IAAI,cAAAU,iBAAA,cAAAA,iBAAA,GAAI,EAAE,EACtBa,WAAW,CAACG,QAAQ,CAACE,YAAY,CAACC,OAAO,CAC1C;AACH,CAAC;AAACC,OAAA,CAAAjC,MAAA,GAAAA,MAAA;AAAA,IAAAkC,QAAA,GAAAD,OAAA,CAAAE,OAAA,GAEanC,MAAM"}
1
+ {"version":3,"file":"shaker.js","names":["_shaker","_interopRequireDefault","require","_ShakerMetadata","_getPluginKey","e","__esModule","default","hasKeyInList","plugin","list","pluginKey","getPluginKey","some","i","includes","safeResolve","id","paths","resolve","filter","shaker","evalConfig","ast","code","highPriorityPlugins","config","babel","_evalConfig$plugins$f","_evalConfig$plugins","_evalConfig$plugins2","_evalConfig$plugins3","_evalConfig$filename","_evalConfig$filename2","_evalConfig$filename3","_evalConfig$filename4","_transformed$code","preShakePlugins","plugins","shakerPlugin","hasCommonjsPlugin","push","filename","endsWith","_evalConfig$plugins4","hasTypescriptPlugin","preset","allowDeclareFields","transformOptions","caller","name","transformed","transformFromAstSync","hasShakerMetadata","metadata","Error","wywEvaluator","imports","exports","_default"],"sources":["../src/shaker.ts"],"sourcesContent":["import type { TransformOptions, PluginItem } from '@babel/core';\n\nimport type { Evaluator } from '@wyw-in-js/shared';\n\nimport shakerPlugin from './plugins/shaker';\nimport { hasShakerMetadata } from './utils/ShakerMetadata';\nimport { getPluginKey } from './utils/getPluginKey';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nconst safeResolve = (id: string, paths: (string | null)[]): string | null => {\n try {\n return require.resolve(id, {\n paths: paths.filter((i) => i !== null) as string[],\n });\n } catch {\n return null;\n }\n};\n\nexport const shaker: Evaluator = (\n evalConfig,\n ast,\n code,\n { highPriorityPlugins, ...config },\n babel\n) => {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) => hasKeyInList(i, highPriorityPlugins)) ??\n [];\n\n const plugins = [\n ...preShakePlugins,\n [shakerPlugin, config],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, highPriorityPlugins)\n ),\n ];\n\n const hasCommonjsPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-modules-commonjs'\n );\n\n if (!hasCommonjsPlugin) {\n plugins.push(require.resolve('@babel/plugin-transform-modules-commonjs'));\n }\n\n if (\n evalConfig.filename?.endsWith('.ts') ||\n evalConfig.filename?.endsWith('.tsx') ||\n evalConfig.filename?.endsWith('.mts') ||\n evalConfig.filename?.endsWith('.cts')\n ) {\n const hasTypescriptPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-typescript'\n );\n\n if (!hasTypescriptPlugin) {\n const preset = safeResolve('@babel/preset-typescript', [\n evalConfig.filename,\n ]);\n const plugin = safeResolve('@babel/plugin-transform-typescript', [\n evalConfig.filename,\n preset,\n ]);\n\n if (plugin) {\n plugins.push([plugin, { allowDeclareFields: true }]);\n }\n }\n }\n\n const transformOptions: TransformOptions = {\n ...evalConfig,\n caller: {\n name: 'wyw-in-js',\n },\n plugins,\n };\n\n const transformed = babel.transformFromAstSync(ast, code, transformOptions);\n\n if (!transformed || !hasShakerMetadata(transformed.metadata)) {\n throw new Error(`${evalConfig.filename} has no shaker metadata`);\n }\n\n return [\n transformed.ast!,\n transformed.code ?? '',\n transformed.metadata.wywEvaluator.imports,\n ];\n};\n\nexport default shaker;\n"],"mappings":"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","ignoreList":[]}