@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.
Files changed (480) hide show
  1. package/LICENSE +21 -0
  2. package/esm/babel.js +2 -0
  3. package/esm/babel.js.map +1 -0
  4. package/esm/cache.js +80 -0
  5. package/esm/cache.js.map +1 -0
  6. package/esm/debug/fileReporter.js +144 -0
  7. package/esm/debug/fileReporter.js.map +1 -0
  8. package/esm/evaluators/index.js +14 -0
  9. package/esm/evaluators/index.js.map +1 -0
  10. package/esm/index.js +24 -0
  11. package/esm/index.js.map +1 -0
  12. package/esm/module.js +316 -0
  13. package/esm/module.js.map +1 -0
  14. package/esm/options/babel-merge.d.js +2 -0
  15. package/esm/options/babel-merge.d.js.map +1 -0
  16. package/esm/options/buildOptions.js +28 -0
  17. package/esm/options/buildOptions.js.map +1 -0
  18. package/esm/options/loadBabelOptions.js +24 -0
  19. package/esm/options/loadBabelOptions.js.map +1 -0
  20. package/esm/plugins/babel-transform.js +53 -0
  21. package/esm/plugins/babel-transform.js.map +1 -0
  22. package/esm/plugins/collector.js +66 -0
  23. package/esm/plugins/collector.js.map +1 -0
  24. package/esm/plugins/dynamic-import.js +28 -0
  25. package/esm/plugins/dynamic-import.js.map +1 -0
  26. package/esm/plugins/preeval.js +75 -0
  27. package/esm/plugins/preeval.js.map +1 -0
  28. package/esm/plugins/shaker.js +296 -0
  29. package/esm/plugins/shaker.js.map +1 -0
  30. package/esm/shaker.js +50 -0
  31. package/esm/shaker.js.map +1 -0
  32. package/esm/transform/BaseEntrypoint.js +164 -0
  33. package/esm/transform/BaseEntrypoint.js.map +1 -0
  34. package/esm/transform/Entrypoint.helpers.js +168 -0
  35. package/esm/transform/Entrypoint.helpers.js.map +1 -0
  36. package/esm/transform/Entrypoint.js +212 -0
  37. package/esm/transform/Entrypoint.js.map +1 -0
  38. package/esm/transform/Entrypoint.types.js +2 -0
  39. package/esm/transform/Entrypoint.types.js.map +1 -0
  40. package/esm/transform/EvaluatedEntrypoint.js +6 -0
  41. package/esm/transform/EvaluatedEntrypoint.js.map +1 -0
  42. package/esm/transform/actions/AbortError.js +8 -0
  43. package/esm/transform/actions/AbortError.js.map +1 -0
  44. package/esm/transform/actions/BaseAction.js +134 -0
  45. package/esm/transform/actions/BaseAction.js.map +1 -0
  46. package/esm/transform/actions/UnprocessedEntrypointError.js +8 -0
  47. package/esm/transform/actions/UnprocessedEntrypointError.js.map +1 -0
  48. package/esm/transform/actions/actionRunner.js +73 -0
  49. package/esm/transform/actions/actionRunner.js.map +1 -0
  50. package/esm/transform/actions/types.js +2 -0
  51. package/esm/transform/actions/types.js.map +1 -0
  52. package/esm/transform/generators/baseProcessingHandlers.js +22 -0
  53. package/esm/transform/generators/baseProcessingHandlers.js.map +1 -0
  54. package/esm/transform/generators/collect.js +58 -0
  55. package/esm/transform/generators/collect.js.map +1 -0
  56. package/esm/transform/generators/evalFile.js +50 -0
  57. package/esm/transform/generators/evalFile.js.map +1 -0
  58. package/esm/transform/generators/explodeReexports.js +63 -0
  59. package/esm/transform/generators/explodeReexports.js.map +1 -0
  60. package/esm/transform/generators/extract.js +120 -0
  61. package/esm/transform/generators/extract.js.map +1 -0
  62. package/esm/transform/generators/getExports.js +73 -0
  63. package/esm/transform/generators/getExports.js.map +1 -0
  64. package/esm/transform/generators/index.js +13 -0
  65. package/esm/transform/generators/index.js.map +1 -0
  66. package/esm/transform/generators/processEntrypoint.js +43 -0
  67. package/esm/transform/generators/processEntrypoint.js.map +1 -0
  68. package/esm/transform/generators/processImports.js +23 -0
  69. package/esm/transform/generators/processImports.js.map +1 -0
  70. package/esm/transform/generators/resolveImports.js +148 -0
  71. package/esm/transform/generators/resolveImports.js.map +1 -0
  72. package/esm/transform/generators/transform.js +117 -0
  73. package/esm/transform/generators/transform.js.map +1 -0
  74. package/esm/transform/generators/workflow.js +82 -0
  75. package/esm/transform/generators/workflow.js.map +1 -0
  76. package/esm/transform/helpers/loadLinariaOptions.js +66 -0
  77. package/esm/transform/helpers/loadLinariaOptions.js.map +1 -0
  78. package/esm/transform/helpers/withDefaultServices.js +21 -0
  79. package/esm/transform/helpers/withDefaultServices.js.map +1 -0
  80. package/esm/transform/rootLog.js +3 -0
  81. package/esm/transform/rootLog.js.map +1 -0
  82. package/esm/transform/types.js +2 -0
  83. package/esm/transform/types.js.map +1 -0
  84. package/esm/transform.js +121 -0
  85. package/esm/transform.js.map +1 -0
  86. package/esm/types.js +2 -0
  87. package/esm/types.js.map +1 -0
  88. package/esm/utils/EventEmitter.js +52 -0
  89. package/esm/utils/EventEmitter.js.map +1 -0
  90. package/esm/utils/ShakerMetadata.js +2 -0
  91. package/esm/utils/ShakerMetadata.js.map +1 -0
  92. package/esm/utils/TransformMetadata.js +11 -0
  93. package/esm/utils/TransformMetadata.js.map +1 -0
  94. package/esm/utils/addIdentifierToLinariaPreval.js +68 -0
  95. package/esm/utils/addIdentifierToLinariaPreval.js.map +1 -0
  96. package/esm/utils/collectExportsAndImports.js +974 -0
  97. package/esm/utils/collectExportsAndImports.js.map +1 -0
  98. package/esm/utils/collectTemplateDependencies.js +219 -0
  99. package/esm/utils/collectTemplateDependencies.js.map +1 -0
  100. package/esm/utils/createId.js +6 -0
  101. package/esm/utils/createId.js.map +1 -0
  102. package/esm/utils/dispose-polyfill.js +6 -0
  103. package/esm/utils/dispose-polyfill.js.map +1 -0
  104. package/esm/utils/findIdentifiers.js +62 -0
  105. package/esm/utils/findIdentifiers.js.map +1 -0
  106. package/esm/utils/findPackageJSON.js +22 -0
  107. package/esm/utils/findPackageJSON.js.map +1 -0
  108. package/esm/utils/getFileIdx.js +10 -0
  109. package/esm/utils/getFileIdx.js.map +1 -0
  110. package/esm/utils/getPluginKey.js +13 -0
  111. package/esm/utils/getPluginKey.js.map +1 -0
  112. package/esm/utils/getScope.js +6 -0
  113. package/esm/utils/getScope.js.map +1 -0
  114. package/esm/utils/getSource.js +15 -0
  115. package/esm/utils/getSource.js.map +1 -0
  116. package/esm/utils/getTagProcessor.js +304 -0
  117. package/esm/utils/getTagProcessor.js.map +1 -0
  118. package/esm/utils/getVisitorKeys.js +5 -0
  119. package/esm/utils/getVisitorKeys.js.map +1 -0
  120. package/esm/utils/hasLinariaPreval.js +7 -0
  121. package/esm/utils/hasLinariaPreval.js.map +1 -0
  122. package/esm/utils/isExports.js +22 -0
  123. package/esm/utils/isExports.js.map +1 -0
  124. package/esm/utils/isGlobal.js +6 -0
  125. package/esm/utils/isGlobal.js.map +1 -0
  126. package/esm/utils/isNode.js +2 -0
  127. package/esm/utils/isNode.js.map +1 -0
  128. package/esm/utils/isNodePath.js +4 -0
  129. package/esm/utils/isNodePath.js.map +1 -0
  130. package/esm/utils/isNotNull.js +4 -0
  131. package/esm/utils/isNotNull.js.map +1 -0
  132. package/esm/utils/isRemoved.js +46 -0
  133. package/esm/utils/isRemoved.js.map +1 -0
  134. package/esm/utils/isRequire.js +13 -0
  135. package/esm/utils/isRequire.js.map +1 -0
  136. package/esm/utils/isSerializable.js +13 -0
  137. package/esm/utils/isSerializable.js.map +1 -0
  138. package/esm/utils/isTypedNode.js +6 -0
  139. package/esm/utils/isTypedNode.js.map +1 -0
  140. package/esm/utils/isUnnecessaryReactCall.js +72 -0
  141. package/esm/utils/isUnnecessaryReactCall.js.map +1 -0
  142. package/esm/utils/peek.js +2 -0
  143. package/esm/utils/peek.js.map +1 -0
  144. package/esm/utils/processTemplateExpression.js +11 -0
  145. package/esm/utils/processTemplateExpression.js.map +1 -0
  146. package/esm/utils/removeDangerousCode.js +127 -0
  147. package/esm/utils/removeDangerousCode.js.map +1 -0
  148. package/esm/utils/scopeHelpers.js +514 -0
  149. package/esm/utils/scopeHelpers.js.map +1 -0
  150. package/esm/utils/traversalCache.js +28 -0
  151. package/esm/utils/traversalCache.js.map +1 -0
  152. package/esm/utils/unwrapSequence.js +14 -0
  153. package/esm/utils/unwrapSequence.js.map +1 -0
  154. package/esm/utils/valueToLiteral.js +59 -0
  155. package/esm/utils/valueToLiteral.js.map +1 -0
  156. package/esm/utils/visitors/JSXElementsRemover.js +51 -0
  157. package/esm/utils/visitors/JSXElementsRemover.js.map +1 -0
  158. package/esm/vm/createVmContext.js +72 -0
  159. package/esm/vm/createVmContext.js.map +1 -0
  160. package/esm/vm/process.js +29 -0
  161. package/esm/vm/process.js.map +1 -0
  162. package/lib/babel.js +2 -0
  163. package/lib/babel.js.map +1 -0
  164. package/lib/cache.js +87 -0
  165. package/lib/cache.js.map +1 -0
  166. package/lib/debug/fileReporter.js +153 -0
  167. package/lib/debug/fileReporter.js.map +1 -0
  168. package/lib/evaluators/index.js +20 -0
  169. package/lib/evaluators/index.js.map +1 -0
  170. package/lib/index.js +225 -0
  171. package/lib/index.js.map +1 -0
  172. package/lib/module.js +327 -0
  173. package/lib/module.js.map +1 -0
  174. package/lib/options/babel-merge.d.js +2 -0
  175. package/lib/options/babel-merge.d.js.map +1 -0
  176. package/lib/options/buildOptions.js +35 -0
  177. package/lib/options/buildOptions.js.map +1 -0
  178. package/lib/options/loadBabelOptions.js +31 -0
  179. package/lib/options/loadBabelOptions.js.map +1 -0
  180. package/lib/plugins/babel-transform.js +60 -0
  181. package/lib/plugins/babel-transform.js.map +1 -0
  182. package/lib/plugins/collector.js +76 -0
  183. package/lib/plugins/collector.js.map +1 -0
  184. package/lib/plugins/dynamic-import.js +34 -0
  185. package/lib/plugins/dynamic-import.js.map +1 -0
  186. package/lib/plugins/preeval.js +82 -0
  187. package/lib/plugins/preeval.js.map +1 -0
  188. package/lib/plugins/shaker.js +303 -0
  189. package/lib/plugins/shaker.js.map +1 -0
  190. package/lib/shaker.js +58 -0
  191. package/lib/shaker.js.map +1 -0
  192. package/lib/transform/BaseEntrypoint.js +175 -0
  193. package/lib/transform/BaseEntrypoint.js.map +1 -0
  194. package/lib/transform/Entrypoint.helpers.js +182 -0
  195. package/lib/transform/Entrypoint.helpers.js.map +1 -0
  196. package/lib/transform/Entrypoint.js +226 -0
  197. package/lib/transform/Entrypoint.js.map +1 -0
  198. package/lib/transform/Entrypoint.types.js +2 -0
  199. package/lib/transform/Entrypoint.types.js.map +1 -0
  200. package/lib/transform/EvaluatedEntrypoint.js +13 -0
  201. package/lib/transform/EvaluatedEntrypoint.js.map +1 -0
  202. package/lib/transform/actions/AbortError.js +16 -0
  203. package/lib/transform/actions/AbortError.js.map +1 -0
  204. package/lib/transform/actions/BaseAction.js +144 -0
  205. package/lib/transform/actions/BaseAction.js.map +1 -0
  206. package/lib/transform/actions/UnprocessedEntrypointError.js +16 -0
  207. package/lib/transform/actions/UnprocessedEntrypointError.js.map +1 -0
  208. package/lib/transform/actions/actionRunner.js +82 -0
  209. package/lib/transform/actions/actionRunner.js.map +1 -0
  210. package/lib/transform/actions/types.js +2 -0
  211. package/lib/transform/actions/types.js.map +1 -0
  212. package/lib/transform/generators/baseProcessingHandlers.js +27 -0
  213. package/lib/transform/generators/baseProcessingHandlers.js.map +1 -0
  214. package/lib/transform/generators/collect.js +66 -0
  215. package/lib/transform/generators/collect.js.map +1 -0
  216. package/lib/transform/generators/evalFile.js +57 -0
  217. package/lib/transform/generators/evalFile.js.map +1 -0
  218. package/lib/transform/generators/explodeReexports.js +70 -0
  219. package/lib/transform/generators/explodeReexports.js.map +1 -0
  220. package/lib/transform/generators/extract.js +128 -0
  221. package/lib/transform/generators/extract.js.map +1 -0
  222. package/lib/transform/generators/getExports.js +80 -0
  223. package/lib/transform/generators/getExports.js.map +1 -0
  224. package/lib/transform/generators/index.js +19 -0
  225. package/lib/transform/generators/index.js.map +1 -0
  226. package/lib/transform/generators/processEntrypoint.js +49 -0
  227. package/lib/transform/generators/processEntrypoint.js.map +1 -0
  228. package/lib/transform/generators/processImports.js +29 -0
  229. package/lib/transform/generators/processImports.js.map +1 -0
  230. package/lib/transform/generators/resolveImports.js +158 -0
  231. package/lib/transform/generators/resolveImports.js.map +1 -0
  232. package/lib/transform/generators/transform.js +130 -0
  233. package/lib/transform/generators/transform.js.map +1 -0
  234. package/lib/transform/generators/workflow.js +90 -0
  235. package/lib/transform/generators/workflow.js.map +1 -0
  236. package/lib/transform/helpers/loadLinariaOptions.js +73 -0
  237. package/lib/transform/helpers/loadLinariaOptions.js.map +1 -0
  238. package/lib/transform/helpers/withDefaultServices.js +30 -0
  239. package/lib/transform/helpers/withDefaultServices.js.map +1 -0
  240. package/lib/transform/rootLog.js +9 -0
  241. package/lib/transform/rootLog.js.map +1 -0
  242. package/lib/transform/types.js +8 -0
  243. package/lib/transform/types.js.map +1 -0
  244. package/lib/transform.js +128 -0
  245. package/lib/transform.js.map +1 -0
  246. package/lib/types.js +2 -0
  247. package/lib/types.js.map +1 -0
  248. package/lib/utils/EventEmitter.js +61 -0
  249. package/lib/utils/EventEmitter.js.map +1 -0
  250. package/lib/utils/ShakerMetadata.js +9 -0
  251. package/lib/utils/ShakerMetadata.js.map +1 -0
  252. package/lib/utils/TransformMetadata.js +19 -0
  253. package/lib/utils/TransformMetadata.js.map +1 -0
  254. package/lib/utils/addIdentifierToLinariaPreval.js +75 -0
  255. package/lib/utils/addIdentifierToLinariaPreval.js.map +1 -0
  256. package/lib/utils/collectExportsAndImports.js +990 -0
  257. package/lib/utils/collectExportsAndImports.js.map +1 -0
  258. package/lib/utils/collectTemplateDependencies.js +233 -0
  259. package/lib/utils/collectTemplateDependencies.js.map +1 -0
  260. package/lib/utils/createId.js +13 -0
  261. package/lib/utils/createId.js.map +1 -0
  262. package/lib/utils/dispose-polyfill.js +9 -0
  263. package/lib/utils/dispose-polyfill.js.map +1 -0
  264. package/lib/utils/findIdentifiers.js +73 -0
  265. package/lib/utils/findIdentifiers.js.map +1 -0
  266. package/lib/utils/findPackageJSON.js +29 -0
  267. package/lib/utils/findPackageJSON.js.map +1 -0
  268. package/lib/utils/getFileIdx.js +16 -0
  269. package/lib/utils/getFileIdx.js.map +1 -0
  270. package/lib/utils/getPluginKey.js +21 -0
  271. package/lib/utils/getPluginKey.js.map +1 -0
  272. package/lib/utils/getScope.js +12 -0
  273. package/lib/utils/getScope.js.map +1 -0
  274. package/lib/utils/getSource.js +24 -0
  275. package/lib/utils/getSource.js.map +1 -0
  276. package/lib/utils/getTagProcessor.js +318 -0
  277. package/lib/utils/getTagProcessor.js.map +1 -0
  278. package/lib/utils/getVisitorKeys.js +11 -0
  279. package/lib/utils/getVisitorKeys.js.map +1 -0
  280. package/lib/utils/hasLinariaPreval.js +13 -0
  281. package/lib/utils/hasLinariaPreval.js.map +1 -0
  282. package/lib/utils/isExports.js +27 -0
  283. package/lib/utils/isExports.js.map +1 -0
  284. package/lib/utils/isGlobal.js +13 -0
  285. package/lib/utils/isGlobal.js.map +1 -0
  286. package/lib/utils/isNode.js +9 -0
  287. package/lib/utils/isNode.js.map +1 -0
  288. package/lib/utils/isNodePath.js +10 -0
  289. package/lib/utils/isNodePath.js.map +1 -0
  290. package/lib/utils/isNotNull.js +10 -0
  291. package/lib/utils/isNotNull.js.map +1 -0
  292. package/lib/utils/isRemoved.js +52 -0
  293. package/lib/utils/isRemoved.js.map +1 -0
  294. package/lib/utils/isRequire.js +18 -0
  295. package/lib/utils/isRequire.js.map +1 -0
  296. package/lib/utils/isSerializable.js +19 -0
  297. package/lib/utils/isSerializable.js.map +1 -0
  298. package/lib/utils/isTypedNode.js +13 -0
  299. package/lib/utils/isTypedNode.js.map +1 -0
  300. package/lib/utils/isUnnecessaryReactCall.js +81 -0
  301. package/lib/utils/isUnnecessaryReactCall.js.map +1 -0
  302. package/lib/utils/peek.js +9 -0
  303. package/lib/utils/peek.js.map +1 -0
  304. package/lib/utils/processTemplateExpression.js +18 -0
  305. package/lib/utils/processTemplateExpression.js.map +1 -0
  306. package/lib/utils/removeDangerousCode.js +134 -0
  307. package/lib/utils/removeDangerousCode.js.map +1 -0
  308. package/lib/utils/scopeHelpers.js +544 -0
  309. package/lib/utils/scopeHelpers.js.map +1 -0
  310. package/lib/utils/traversalCache.js +38 -0
  311. package/lib/utils/traversalCache.js.map +1 -0
  312. package/lib/utils/unwrapSequence.js +20 -0
  313. package/lib/utils/unwrapSequence.js.map +1 -0
  314. package/lib/utils/valueToLiteral.js +65 -0
  315. package/lib/utils/valueToLiteral.js.map +1 -0
  316. package/lib/utils/visitors/JSXElementsRemover.js +57 -0
  317. package/lib/utils/visitors/JSXElementsRemover.js.map +1 -0
  318. package/lib/vm/createVmContext.js +80 -0
  319. package/lib/vm/createVmContext.js.map +1 -0
  320. package/lib/vm/process.js +38 -0
  321. package/lib/vm/process.js.map +1 -0
  322. package/package.json +63 -0
  323. package/types/babel.d.ts +2 -0
  324. package/types/babel.js +2 -0
  325. package/types/cache.d.ts +24 -0
  326. package/types/cache.js +85 -0
  327. package/types/debug/fileReporter.d.ts +27 -0
  328. package/types/debug/fileReporter.js +151 -0
  329. package/types/evaluators/index.d.ts +10 -0
  330. package/types/evaluators/index.js +15 -0
  331. package/types/index.d.ts +30 -0
  332. package/types/index.js +69 -0
  333. package/types/module.d.ts +62 -0
  334. package/types/module.js +318 -0
  335. package/types/options/buildOptions.d.ts +7 -0
  336. package/types/options/buildOptions.js +35 -0
  337. package/types/options/loadBabelOptions.d.ts +3 -0
  338. package/types/options/loadBabelOptions.js +27 -0
  339. package/types/plugins/babel-transform.d.ts +4 -0
  340. package/types/plugins/babel-transform.js +49 -0
  341. package/types/plugins/collector.d.ts +16 -0
  342. package/types/plugins/collector.js +67 -0
  343. package/types/plugins/dynamic-import.d.ts +6 -0
  344. package/types/plugins/dynamic-import.js +32 -0
  345. package/types/plugins/preeval.d.ts +16 -0
  346. package/types/plugins/preeval.js +69 -0
  347. package/types/plugins/shaker.d.ts +11 -0
  348. package/types/plugins/shaker.js +299 -0
  349. package/types/shaker.d.ts +3 -0
  350. package/types/shaker.js +64 -0
  351. package/types/transform/BaseEntrypoint.d.ts +23 -0
  352. package/types/transform/BaseEntrypoint.js +182 -0
  353. package/types/transform/Entrypoint.d.ts +50 -0
  354. package/types/transform/Entrypoint.helpers.d.ts +14 -0
  355. package/types/transform/Entrypoint.helpers.js +169 -0
  356. package/types/transform/Entrypoint.js +223 -0
  357. package/types/transform/Entrypoint.types.d.ts +23 -0
  358. package/types/transform/Entrypoint.types.js +2 -0
  359. package/types/transform/EvaluatedEntrypoint.d.ts +16 -0
  360. package/types/transform/EvaluatedEntrypoint.js +9 -0
  361. package/types/transform/actions/AbortError.d.ts +4 -0
  362. package/types/transform/actions/AbortError.js +12 -0
  363. package/types/transform/actions/BaseAction.d.ts +40 -0
  364. package/types/transform/actions/BaseAction.js +149 -0
  365. package/types/transform/actions/UnprocessedEntrypointError.d.ts +6 -0
  366. package/types/transform/actions/UnprocessedEntrypointError.js +13 -0
  367. package/types/transform/actions/actionRunner.d.ts +4 -0
  368. package/types/transform/actions/actionRunner.js +86 -0
  369. package/types/transform/actions/types.d.ts +15 -0
  370. package/types/transform/actions/types.js +2 -0
  371. package/types/transform/generators/baseProcessingHandlers.d.ts +17 -0
  372. package/types/transform/generators/baseProcessingHandlers.js +23 -0
  373. package/types/transform/generators/collect.d.ts +6 -0
  374. package/types/transform/generators/collect.js +57 -0
  375. package/types/transform/generators/evalFile.d.ts +6 -0
  376. package/types/transform/generators/evalFile.js +56 -0
  377. package/types/transform/generators/explodeReexports.d.ts +7 -0
  378. package/types/transform/generators/explodeReexports.js +67 -0
  379. package/types/transform/generators/extract.d.ts +8 -0
  380. package/types/transform/generators/extract.js +116 -0
  381. package/types/transform/generators/getExports.d.ts +8 -0
  382. package/types/transform/generators/getExports.js +65 -0
  383. package/types/transform/generators/index.d.ts +15 -0
  384. package/types/transform/generators/index.js +15 -0
  385. package/types/transform/generators/processEntrypoint.d.ts +9 -0
  386. package/types/transform/generators/processEntrypoint.js +88 -0
  387. package/types/transform/generators/processImports.d.ts +5 -0
  388. package/types/transform/generators/processImports.js +21 -0
  389. package/types/transform/generators/resolveImports.d.ts +9 -0
  390. package/types/transform/generators/resolveImports.js +124 -0
  391. package/types/transform/generators/transform.d.ts +17 -0
  392. package/types/transform/generators/transform.js +115 -0
  393. package/types/transform/generators/workflow.d.ts +7 -0
  394. package/types/transform/generators/workflow.js +77 -0
  395. package/types/transform/helpers/loadLinariaOptions.d.ts +6 -0
  396. package/types/transform/helpers/loadLinariaOptions.js +86 -0
  397. package/types/transform/helpers/withDefaultServices.d.ts +5 -0
  398. package/types/transform/helpers/withDefaultServices.js +40 -0
  399. package/types/transform/rootLog.d.ts +3 -0
  400. package/types/transform/rootLog.js +5 -0
  401. package/types/transform/types.d.ts +137 -0
  402. package/types/transform/types.js +4 -0
  403. package/types/transform.d.ts +20 -0
  404. package/types/transform.js +121 -0
  405. package/types/types.d.ts +72 -0
  406. package/types/types.js +5 -0
  407. package/types/utils/EventEmitter.d.ts +58 -0
  408. package/types/utils/EventEmitter.js +61 -0
  409. package/types/utils/ShakerMetadata.d.ts +7 -0
  410. package/types/utils/ShakerMetadata.js +5 -0
  411. package/types/utils/TransformMetadata.d.ts +13 -0
  412. package/types/utils/TransformMetadata.js +17 -0
  413. package/types/utils/addIdentifierToLinariaPreval.d.ts +4 -0
  414. package/types/utils/addIdentifierToLinariaPreval.js +75 -0
  415. package/types/utils/collectExportsAndImports.d.ts +31 -0
  416. package/types/utils/collectExportsAndImports.js +962 -0
  417. package/types/utils/collectTemplateDependencies.d.ts +17 -0
  418. package/types/utils/collectTemplateDependencies.js +212 -0
  419. package/types/utils/createId.d.ts +2 -0
  420. package/types/utils/createId.js +9 -0
  421. package/types/utils/dispose-polyfill.d.ts +0 -0
  422. package/types/utils/dispose-polyfill.js +5 -0
  423. package/types/utils/findIdentifiers.d.ts +6 -0
  424. package/types/utils/findIdentifiers.js +68 -0
  425. package/types/utils/findPackageJSON.d.ts +1 -0
  426. package/types/utils/findPackageJSON.js +29 -0
  427. package/types/utils/getFileIdx.d.ts +1 -0
  428. package/types/utils/getFileIdx.js +13 -0
  429. package/types/utils/getPluginKey.d.ts +2 -0
  430. package/types/utils/getPluginKey.js +16 -0
  431. package/types/utils/getScope.d.ts +2 -0
  432. package/types/utils/getScope.js +11 -0
  433. package/types/utils/getSource.d.ts +2 -0
  434. package/types/utils/getSource.js +22 -0
  435. package/types/utils/getTagProcessor.d.ts +6 -0
  436. package/types/utils/getTagProcessor.js +315 -0
  437. package/types/utils/getVisitorKeys.d.ts +5 -0
  438. package/types/utils/getVisitorKeys.js +8 -0
  439. package/types/utils/hasLinariaPreval.d.ts +4 -0
  440. package/types/utils/hasLinariaPreval.js +9 -0
  441. package/types/utils/isExports.d.ts +6 -0
  442. package/types/utils/isExports.js +20 -0
  443. package/types/utils/isGlobal.d.ts +2 -0
  444. package/types/utils/isGlobal.js +9 -0
  445. package/types/utils/isNode.d.ts +2 -0
  446. package/types/utils/isNode.js +7 -0
  447. package/types/utils/isNodePath.d.ts +3 -0
  448. package/types/utils/isNodePath.js +7 -0
  449. package/types/utils/isNotNull.d.ts +1 -0
  450. package/types/utils/isNotNull.js +7 -0
  451. package/types/utils/isRemoved.d.ts +5 -0
  452. package/types/utils/isRemoved.js +42 -0
  453. package/types/utils/isRequire.d.ts +6 -0
  454. package/types/utils/isRequire.js +15 -0
  455. package/types/utils/isSerializable.d.ts +2 -0
  456. package/types/utils/isSerializable.js +18 -0
  457. package/types/utils/isTypedNode.d.ts +5 -0
  458. package/types/utils/isTypedNode.js +9 -0
  459. package/types/utils/isUnnecessaryReactCall.d.ts +3 -0
  460. package/types/utils/isUnnecessaryReactCall.js +76 -0
  461. package/types/utils/peek.d.ts +1 -0
  462. package/types/utils/peek.js +5 -0
  463. package/types/utils/processTemplateExpression.d.ts +5 -0
  464. package/types/utils/processTemplateExpression.js +17 -0
  465. package/types/utils/removeDangerousCode.d.ts +3 -0
  466. package/types/utils/removeDangerousCode.js +144 -0
  467. package/types/utils/scopeHelpers.d.ts +12 -0
  468. package/types/utils/scopeHelpers.js +568 -0
  469. package/types/utils/traversalCache.d.ts +5 -0
  470. package/types/utils/traversalCache.js +36 -0
  471. package/types/utils/unwrapSequence.d.ts +8 -0
  472. package/types/utils/unwrapSequence.js +17 -0
  473. package/types/utils/valueToLiteral.d.ts +3 -0
  474. package/types/utils/valueToLiteral.js +64 -0
  475. package/types/utils/visitors/JSXElementsRemover.d.ts +3 -0
  476. package/types/utils/visitors/JSXElementsRemover.js +52 -0
  477. package/types/vm/createVmContext.d.ts +7 -0
  478. package/types/vm/createVmContext.js +92 -0
  479. package/types/vm/process.d.ts +25 -0
  480. 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,3 @@
1
+ import type { TransformOptions } from '@babel/core';
2
+ import type { Core } from '../babel';
3
+ export declare function loadBabelOptions(babel: Core, filename: string, overrides?: TransformOptions): TransformOptions;
@@ -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,4 @@
1
+ import type { PluginObj } from '@babel/core';
2
+ import type { Core } from '../babel';
3
+ import type { IPluginState, PluginOptions } from '../types';
4
+ export default function babelTransform(babel: Core, options: Partial<PluginOptions>): PluginObj<IPluginState>;
@@ -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;
@@ -0,0 +1,3 @@
1
+ import type { Evaluator } from '@wyw-in-js/shared';
2
+ declare const shaker: Evaluator;
3
+ export default shaker;