@depup/react-email 5.2.10-depup.0 → 6.9.0-depup.1

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 (404) hide show
  1. package/CHANGELOG.md +313 -0
  2. package/README.md +11 -10
  3. package/changes.json +21 -17
  4. package/dev/CHANGELOG.md +2 -0
  5. package/dev/index.js +1 -1
  6. package/dev/package.json +1 -1
  7. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  8. package/dist/cli/index.mjs +7801 -0
  9. package/dist/components/body/body.cjs +39 -0
  10. package/dist/components/body/body.d.cts +7 -0
  11. package/dist/components/body/body.d.mts +7 -0
  12. package/dist/components/body/body.mjs +37 -0
  13. package/dist/components/body/index.d.cts +1 -0
  14. package/dist/components/body/index.d.mts +1 -0
  15. package/dist/components/body/margin-properties.cjs +30 -0
  16. package/dist/components/body/margin-properties.mjs +29 -0
  17. package/dist/components/button/button.cjs +64 -0
  18. package/dist/components/button/button.d.cts +13 -0
  19. package/dist/components/button/button.d.mts +13 -0
  20. package/dist/components/button/button.mjs +62 -0
  21. package/dist/components/button/index.d.cts +1 -0
  22. package/dist/components/button/index.d.mts +1 -0
  23. package/dist/components/button/utils/parse-padding.cjs +90 -0
  24. package/dist/components/button/utils/parse-padding.mjs +90 -0
  25. package/dist/components/button/utils/px-to-pt.cjs +4 -0
  26. package/dist/components/button/utils/px-to-pt.mjs +4 -0
  27. package/dist/components/code-block/code-block.cjs +79 -0
  28. package/dist/components/code-block/code-block.d.cts +20 -0
  29. package/dist/components/code-block/code-block.d.mts +20 -0
  30. package/dist/components/code-block/code-block.mjs +77 -0
  31. package/dist/components/code-block/index.d.cts +3 -0
  32. package/dist/components/code-block/index.d.mts +3 -0
  33. package/dist/components/code-block/languages-available.d.cts +4 -0
  34. package/dist/components/code-block/languages-available.d.mts +4 -0
  35. package/dist/components/code-block/prism.cjs +14564 -0
  36. package/dist/components/code-block/prism.mjs +14562 -0
  37. package/dist/components/code-block/themes.cjs +2578 -0
  38. package/dist/components/code-block/themes.d.cts +4877 -0
  39. package/dist/components/code-block/themes.d.mts +4877 -0
  40. package/dist/components/code-block/themes.mjs +2541 -0
  41. package/dist/components/code-inline/code-inline.cjs +43 -0
  42. package/dist/components/code-inline/code-inline.d.cts +12 -0
  43. package/dist/components/code-inline/code-inline.d.mts +12 -0
  44. package/dist/components/code-inline/code-inline.mjs +41 -0
  45. package/dist/components/code-inline/index.d.cts +1 -0
  46. package/dist/components/code-inline/index.d.mts +1 -0
  47. package/dist/components/column/column.cjs +19 -0
  48. package/dist/components/column/column.d.cts +7 -0
  49. package/dist/components/column/column.d.mts +7 -0
  50. package/dist/components/column/column.mjs +17 -0
  51. package/dist/components/column/index.d.cts +1 -0
  52. package/dist/components/column/index.d.mts +1 -0
  53. package/dist/components/container/container.cjs +42 -0
  54. package/dist/components/container/container.d.cts +7 -0
  55. package/dist/components/container/container.d.mts +7 -0
  56. package/dist/components/container/container.mjs +40 -0
  57. package/dist/components/container/index.d.cts +1 -0
  58. package/dist/components/container/index.d.mts +1 -0
  59. package/dist/components/element-marker.cjs +8 -0
  60. package/dist/components/element-marker.mjs +7 -0
  61. package/dist/components/font/font.cjs +22 -0
  62. package/dist/components/font/font.d.cts +26 -0
  63. package/dist/components/font/font.d.mts +26 -0
  64. package/dist/components/font/font.mjs +21 -0
  65. package/dist/components/font/index.d.cts +1 -0
  66. package/dist/components/font/index.d.mts +1 -0
  67. package/dist/components/head/head.cjs +20 -0
  68. package/dist/components/head/head.d.cts +7 -0
  69. package/dist/components/head/head.d.mts +7 -0
  70. package/dist/components/head/head.mjs +18 -0
  71. package/dist/components/head/index.d.cts +1 -0
  72. package/dist/components/head/index.d.mts +1 -0
  73. package/dist/components/heading/heading.cjs +30 -0
  74. package/dist/components/heading/heading.d.cts +22 -0
  75. package/dist/components/heading/heading.d.mts +22 -0
  76. package/dist/components/heading/heading.mjs +28 -0
  77. package/dist/components/heading/index.d.cts +1 -0
  78. package/dist/components/heading/index.d.mts +1 -0
  79. package/dist/components/heading/utils/as.d.cts +16 -0
  80. package/dist/components/heading/utils/as.d.mts +16 -0
  81. package/dist/components/heading/utils/spaces.cjs +24 -0
  82. package/dist/components/heading/utils/spaces.d.cts +14 -0
  83. package/dist/components/heading/utils/spaces.d.mts +14 -0
  84. package/dist/components/heading/utils/spaces.mjs +24 -0
  85. package/dist/components/hr/hr.cjs +21 -0
  86. package/dist/components/hr/hr.d.cts +7 -0
  87. package/dist/components/hr/hr.d.mts +7 -0
  88. package/dist/components/hr/hr.mjs +19 -0
  89. package/dist/components/hr/index.d.cts +1 -0
  90. package/dist/components/hr/index.d.mts +1 -0
  91. package/dist/components/html/html.cjs +15 -0
  92. package/dist/components/html/html.d.cts +7 -0
  93. package/dist/components/html/html.d.mts +7 -0
  94. package/dist/components/html/html.mjs +13 -0
  95. package/dist/components/html/index.d.cts +1 -0
  96. package/dist/components/html/index.d.mts +1 -0
  97. package/dist/components/img/img.cjs +25 -0
  98. package/dist/components/img/img.d.cts +7 -0
  99. package/dist/components/img/img.d.mts +7 -0
  100. package/dist/components/img/img.mjs +23 -0
  101. package/dist/components/img/index.d.cts +1 -0
  102. package/dist/components/img/index.d.mts +1 -0
  103. package/dist/components/index.d.cts +24 -0
  104. package/dist/components/index.d.mts +24 -0
  105. package/dist/components/link/index.d.cts +1 -0
  106. package/dist/components/link/index.d.mts +1 -0
  107. package/dist/components/link/link.cjs +21 -0
  108. package/dist/components/link/link.d.cts +7 -0
  109. package/dist/components/link/link.d.mts +7 -0
  110. package/dist/components/link/link.mjs +19 -0
  111. package/dist/components/markdown/index.d.cts +1 -0
  112. package/dist/components/markdown/index.d.mts +1 -0
  113. package/dist/components/markdown/markdown.cjs +101 -0
  114. package/dist/components/markdown/markdown.d.cts +16 -0
  115. package/dist/components/markdown/markdown.d.mts +16 -0
  116. package/dist/components/markdown/markdown.mjs +99 -0
  117. package/dist/components/markdown/styles.cjs +92 -0
  118. package/dist/components/markdown/styles.d.cts +31 -0
  119. package/dist/components/markdown/styles.d.mts +31 -0
  120. package/dist/components/markdown/styles.mjs +92 -0
  121. package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.cjs +60 -0
  122. package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.mjs +60 -0
  123. package/dist/components/preview/index.d.cts +1 -0
  124. package/dist/components/preview/index.d.mts +1 -0
  125. package/dist/components/preview/preview.cjs +34 -0
  126. package/dist/components/preview/preview.d.cts +21 -0
  127. package/dist/components/preview/preview.d.mts +21 -0
  128. package/dist/components/preview/preview.mjs +31 -0
  129. package/dist/components/row/index.d.cts +1 -0
  130. package/dist/components/row/index.d.mts +1 -0
  131. package/dist/components/row/row.cjs +30 -0
  132. package/dist/components/row/row.d.cts +11 -0
  133. package/dist/components/row/row.d.mts +11 -0
  134. package/dist/components/row/row.mjs +28 -0
  135. package/dist/components/section/index.d.cts +1 -0
  136. package/dist/components/section/index.d.mts +1 -0
  137. package/dist/components/section/section.cjs +36 -0
  138. package/dist/components/section/section.d.cts +7 -0
  139. package/dist/components/section/section.d.mts +7 -0
  140. package/dist/components/section/section.mjs +34 -0
  141. package/dist/components/tailwind/hooks/use-suspended-promise.cjs +15 -0
  142. package/dist/components/tailwind/hooks/use-suspended-promise.mjs +15 -0
  143. package/dist/components/tailwind/index.d.cts +4 -0
  144. package/dist/components/tailwind/index.d.mts +4 -0
  145. package/dist/components/tailwind/inline-styles.cjs +11 -0
  146. package/dist/components/tailwind/inline-styles.d.cts +6 -0
  147. package/dist/components/tailwind/inline-styles.d.mts +6 -0
  148. package/dist/components/tailwind/inline-styles.mjs +11 -0
  149. package/dist/components/tailwind/sanitize-stylesheet.cjs +11 -0
  150. package/dist/components/tailwind/sanitize-stylesheet.d.cts +6 -0
  151. package/dist/components/tailwind/sanitize-stylesheet.d.mts +6 -0
  152. package/dist/components/tailwind/sanitize-stylesheet.mjs +11 -0
  153. package/dist/components/tailwind/tailwind.cjs +120 -0
  154. package/dist/components/tailwind/tailwind.d.cts +25 -0
  155. package/dist/components/tailwind/tailwind.d.mts +25 -0
  156. package/dist/components/tailwind/tailwind.mjs +117 -0
  157. package/dist/components/tailwind/utils/compatibility/get-react-property.cjs +10 -0
  158. package/dist/components/tailwind/utils/compatibility/get-react-property.mjs +10 -0
  159. package/dist/components/tailwind/utils/compatibility/sanitize-class-name.cjs +26 -0
  160. package/dist/components/tailwind/utils/compatibility/sanitize-class-name.mjs +26 -0
  161. package/dist/components/tailwind/utils/css/downlevel-for-email-clients.cjs +126 -0
  162. package/dist/components/tailwind/utils/css/downlevel-for-email-clients.mjs +125 -0
  163. package/dist/components/tailwind/utils/css/extract-rules-per-class.cjs +45 -0
  164. package/dist/components/tailwind/utils/css/extract-rules-per-class.mjs +44 -0
  165. package/dist/components/tailwind/utils/css/get-custom-properties.cjs +35 -0
  166. package/dist/components/tailwind/utils/css/get-custom-properties.mjs +34 -0
  167. package/dist/components/tailwind/utils/css/is-part-inlinable.cjs +10 -0
  168. package/dist/components/tailwind/utils/css/is-part-inlinable.mjs +9 -0
  169. package/dist/components/tailwind/utils/css/is-rule-inlinable.cjs +10 -0
  170. package/dist/components/tailwind/utils/css/is-rule-inlinable.mjs +9 -0
  171. package/dist/components/tailwind/utils/css/make-inline-styles-for.cjs +52 -0
  172. package/dist/components/tailwind/utils/css/make-inline-styles-for.mjs +51 -0
  173. package/dist/components/tailwind/utils/css/resolve-all-css-variables.cjs +89 -0
  174. package/dist/components/tailwind/utils/css/resolve-all-css-variables.mjs +88 -0
  175. package/dist/components/tailwind/utils/css/resolve-calc-expressions.cjs +92 -0
  176. package/dist/components/tailwind/utils/css/resolve-calc-expressions.mjs +91 -0
  177. package/dist/components/tailwind/utils/css/sanitize-declarations.cjs +310 -0
  178. package/dist/components/tailwind/utils/css/sanitize-declarations.mjs +309 -0
  179. package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.cjs +46 -0
  180. package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.mjs +45 -0
  181. package/dist/components/tailwind/utils/css/split-mixed-rule.cjs +41 -0
  182. package/dist/components/tailwind/utils/css/split-mixed-rule.mjs +40 -0
  183. package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.cjs +52 -0
  184. package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.mjs +51 -0
  185. package/dist/components/tailwind/utils/css/unwrap-value.cjs +7 -0
  186. package/dist/components/tailwind/utils/css/unwrap-value.mjs +7 -0
  187. package/dist/components/tailwind/utils/react/is-component.cjs +7 -0
  188. package/dist/components/tailwind/utils/react/is-component.mjs +7 -0
  189. package/dist/components/tailwind/utils/react/map-react-tree.cjs +32 -0
  190. package/dist/components/tailwind/utils/react/map-react-tree.mjs +30 -0
  191. package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.cjs +37 -0
  192. package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.mjs +35 -0
  193. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.cjs +77 -0
  194. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.cts +19 -0
  195. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.mts +19 -0
  196. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.mjs +76 -0
  197. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.cjs +901 -0
  198. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.mjs +901 -0
  199. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.cjs +398 -0
  200. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.mjs +398 -0
  201. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.cjs +467 -0
  202. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.mjs +467 -0
  203. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.cjs +6 -0
  204. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.mjs +6 -0
  205. package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.cjs +6 -0
  206. package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.mjs +6 -0
  207. package/dist/components/text/index.d.cts +1 -0
  208. package/dist/components/text/index.d.mts +1 -0
  209. package/dist/components/text/text.cjs +43 -0
  210. package/dist/components/text/text.d.cts +7 -0
  211. package/dist/components/text/text.d.mts +7 -0
  212. package/dist/components/text/text.mjs +41 -0
  213. package/dist/components/text/utils/compute-margins.cjs +62 -0
  214. package/dist/components/text/utils/compute-margins.mjs +62 -0
  215. package/dist/index.cjs +95 -0
  216. package/dist/index.d.cts +26 -0
  217. package/dist/index.d.mts +26 -0
  218. package/dist/index.mjs +25 -7326
  219. package/package.json +64 -32
  220. package/src/components/body/__snapshots__/body.spec.tsx.snap +23 -0
  221. package/src/components/body/body.spec.tsx +78 -0
  222. package/src/components/body/body.tsx +62 -0
  223. package/src/components/body/index.ts +1 -0
  224. package/src/components/body/margin-properties.ts +27 -0
  225. package/src/components/button/button.spec.tsx +53 -0
  226. package/src/components/button/button.tsx +114 -0
  227. package/src/components/button/index.ts +1 -0
  228. package/src/components/button/utils/parse-padding.ts +137 -0
  229. package/src/components/button/utils/px-to-pt.ts +4 -0
  230. package/src/components/button/utils/utils.spec.ts +153 -0
  231. package/src/components/code-block/code-block.tsx +136 -0
  232. package/src/components/code-block/index.ts +3 -0
  233. package/src/components/code-block/languages-available.ts +402 -0
  234. package/src/components/code-block/prism.ts +15618 -0
  235. package/src/components/code-block/themes.ts +4929 -0
  236. package/src/components/code-inline/code-inline.tsx +60 -0
  237. package/src/components/code-inline/index.ts +1 -0
  238. package/src/components/column/column.spec.tsx +28 -0
  239. package/src/components/column/column.tsx +17 -0
  240. package/src/components/column/index.ts +1 -0
  241. package/src/components/container/container.spec.tsx +33 -0
  242. package/src/components/container/container.tsx +59 -0
  243. package/src/components/container/index.ts +1 -0
  244. package/src/components/element-marker.ts +5 -0
  245. package/src/components/font/font.spec.tsx +63 -0
  246. package/src/components/font/font.tsx +76 -0
  247. package/src/components/font/index.ts +1 -0
  248. package/src/components/head/head.spec.tsx +34 -0
  249. package/src/components/head/head.tsx +15 -0
  250. package/src/components/head/index.ts +1 -0
  251. package/src/components/heading/heading.spec.tsx +32 -0
  252. package/src/components/heading/heading.tsx +31 -0
  253. package/src/components/heading/index.ts +1 -0
  254. package/src/components/heading/utils/as.ts +26 -0
  255. package/src/components/heading/utils/spaces.ts +64 -0
  256. package/src/components/heading/utils/utils.spec.ts +70 -0
  257. package/src/components/hr/hr.spec.tsx +22 -0
  258. package/src/components/hr/hr.tsx +23 -0
  259. package/src/components/hr/index.ts +1 -0
  260. package/src/components/html/html.spec.tsx +26 -0
  261. package/src/components/html/html.tsx +13 -0
  262. package/src/components/html/index.ts +1 -0
  263. package/src/components/img/img.spec.tsx +30 -0
  264. package/src/components/img/img.tsx +27 -0
  265. package/src/components/img/index.ts +1 -0
  266. package/src/components/index.ts +19 -0
  267. package/src/components/link/index.ts +1 -0
  268. package/src/components/link/link.spec.tsx +37 -0
  269. package/src/components/link/link.tsx +24 -0
  270. package/src/components/markdown/index.ts +1 -0
  271. package/src/components/markdown/markdown.spec.tsx +221 -0
  272. package/src/components/markdown/markdown.tsx +239 -0
  273. package/src/components/markdown/styles.ts +130 -0
  274. package/src/components/markdown/utils/parse-css-in-js-to-inline-css.spec.ts +42 -0
  275. package/src/components/markdown/utils/parse-css-in-js-to-inline-css.ts +73 -0
  276. package/src/components/preview/index.ts +1 -0
  277. package/src/components/preview/preview.spec.tsx +49 -0
  278. package/src/components/preview/preview.tsx +56 -0
  279. package/src/components/row/index.ts +1 -0
  280. package/src/components/row/row.spec.tsx +28 -0
  281. package/src/components/row/row.tsx +33 -0
  282. package/src/components/section/index.ts +1 -0
  283. package/src/components/section/section.spec.tsx +58 -0
  284. package/src/components/section/section.tsx +59 -0
  285. package/src/components/tailwind/e2e/integrations.spec.ts +44 -0
  286. package/src/components/tailwind/e2e/nextjs/README.md +9 -0
  287. package/src/components/tailwind/e2e/nextjs/emails/vercel-invite-user.tsx +151 -0
  288. package/src/components/tailwind/e2e/nextjs/next.config.mjs +6 -0
  289. package/src/components/tailwind/e2e/nextjs/package.json +24 -0
  290. package/src/components/tailwind/e2e/nextjs/src/app/favicon.ico +0 -0
  291. package/src/components/tailwind/e2e/nextjs/src/app/layout.tsx +23 -0
  292. package/src/components/tailwind/e2e/nextjs/src/app/page.tsx +7 -0
  293. package/src/components/tailwind/e2e/nextjs/tsconfig.json +27 -0
  294. package/src/components/tailwind/e2e/vite/README.md +9 -0
  295. package/src/components/tailwind/e2e/vite/emails/vercel-invite-user.tsx +151 -0
  296. package/src/components/tailwind/e2e/vite/index.html +13 -0
  297. package/src/components/tailwind/e2e/vite/package.json +25 -0
  298. package/src/components/tailwind/e2e/vite/public/vite.svg +1 -0
  299. package/src/components/tailwind/e2e/vite/src/App.tsx +10 -0
  300. package/src/components/tailwind/e2e/vite/src/main.tsx +9 -0
  301. package/src/components/tailwind/e2e/vite/src/vite-env.d.ts +1 -0
  302. package/src/components/tailwind/e2e/vite/tsconfig.json +25 -0
  303. package/src/components/tailwind/e2e/vite/tsconfig.node.json +11 -0
  304. package/src/components/tailwind/e2e/vite/vite.config.ts +7 -0
  305. package/src/components/tailwind/hooks/use-suspended-promise.ts +34 -0
  306. package/src/components/tailwind/hooks/use-suspensed-promise.spec.ts +263 -0
  307. package/src/components/tailwind/index.ts +4 -0
  308. package/src/components/tailwind/inline-styles.spec.ts +49 -0
  309. package/src/components/tailwind/inline-styles.ts +21 -0
  310. package/src/components/tailwind/sanitize-stylesheet.ts +10 -0
  311. package/src/components/tailwind/tailwind.spec.tsx +1390 -0
  312. package/src/components/tailwind/tailwind.tsx +178 -0
  313. package/src/components/tailwind/utils/__snapshots__/quick-safe-render-to-string.spec.tsx.snap +3 -0
  314. package/src/components/tailwind/utils/compatibility/escape-class-name.spec.ts +17 -0
  315. package/src/components/tailwind/utils/compatibility/escape-class-name.ts +18 -0
  316. package/src/components/tailwind/utils/compatibility/get-react-property.ts +15 -0
  317. package/src/components/tailwind/utils/compatibility/sanitize-class-name.spec.ts +7 -0
  318. package/src/components/tailwind/utils/compatibility/sanitize-class-name.ts +36 -0
  319. package/src/components/tailwind/utils/compatibility/unescape-class.ts +3 -0
  320. package/src/components/tailwind/utils/css/__snapshots__/extract-rules-matching-classes.spec.ts.snap +23 -0
  321. package/src/components/tailwind/utils/css/__snapshots__/remove-rule-duplicates-from-root.spec.ts.snap +3 -0
  322. package/src/components/tailwind/utils/css/__snapshots__/sanitize-non-inlinable-classes.spec.ts.snap +7 -0
  323. package/src/components/tailwind/utils/css/downlevel-for-email-clients.spec.ts +119 -0
  324. package/src/components/tailwind/utils/css/downlevel-for-email-clients.ts +244 -0
  325. package/src/components/tailwind/utils/css/extract-rules-per-class.spec.ts +232 -0
  326. package/src/components/tailwind/utils/css/extract-rules-per-class.ts +76 -0
  327. package/src/components/tailwind/utils/css/get-custom-properties.ts +49 -0
  328. package/src/components/tailwind/utils/css/is-part-inlinable.ts +15 -0
  329. package/src/components/tailwind/utils/css/is-rule-inlinable.ts +15 -0
  330. package/src/components/tailwind/utils/css/make-inline-styles-for.spec.ts +124 -0
  331. package/src/components/tailwind/utils/css/make-inline-styles-for.ts +73 -0
  332. package/src/components/tailwind/utils/css/resolve-all-css-variables.spec.ts +296 -0
  333. package/src/components/tailwind/utils/css/resolve-all-css-variables.ts +236 -0
  334. package/src/components/tailwind/utils/css/resolve-calc-expressions.spec.ts +36 -0
  335. package/src/components/tailwind/utils/css/resolve-calc-expressions.ts +147 -0
  336. package/src/components/tailwind/utils/css/sanitize-declarations.spec.ts +491 -0
  337. package/src/components/tailwind/utils/css/sanitize-declarations.ts +443 -0
  338. package/src/components/tailwind/utils/css/sanitize-non-inlinable-rules.spec.ts +72 -0
  339. package/src/components/tailwind/utils/css/sanitize-non-inlinable-rules.ts +48 -0
  340. package/src/components/tailwind/utils/css/split-mixed-rule.ts +68 -0
  341. package/src/components/tailwind/utils/css/strip-empty-tailwind-vars.spec.ts +128 -0
  342. package/src/components/tailwind/utils/css/strip-empty-tailwind-vars.ts +70 -0
  343. package/src/components/tailwind/utils/css/unwrap-value.ts +9 -0
  344. package/src/components/tailwind/utils/react/is-component.ts +12 -0
  345. package/src/components/tailwind/utils/react/map-react-tree.spec.tsx +58 -0
  346. package/src/components/tailwind/utils/react/map-react-tree.ts +58 -0
  347. package/src/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.ts +61 -0
  348. package/src/components/tailwind/utils/tailwindcss/setup-tailwind.spec.ts +25 -0
  349. package/src/components/tailwind/utils/tailwindcss/setup-tailwind.ts +121 -0
  350. package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.ts +900 -0
  351. package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.ts +397 -0
  352. package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.ts +466 -0
  353. package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.ts +5 -0
  354. package/src/components/tailwind/utils/text/from-dash-case-to-camel-case.ts +3 -0
  355. package/src/components/text/index.ts +1 -0
  356. package/src/components/text/text.spec.tsx +35 -0
  357. package/src/components/text/text.tsx +50 -0
  358. package/src/components/text/utils/compute-margins.spec.ts +67 -0
  359. package/src/components/text/utils/compute-margins.ts +102 -0
  360. package/src/index.ts +2 -110
  361. package/tsconfig.json +9 -4
  362. package/tsdown.config.ts +51 -6
  363. package/vitest.config.ts +1 -0
  364. package/vitest.e2e.config.ts +17 -0
  365. package/src/commands/build.ts +0 -269
  366. package/src/commands/dev.ts +0 -27
  367. package/src/commands/export.ts +0 -204
  368. package/src/commands/resend/reset.ts +0 -8
  369. package/src/commands/resend/setup.ts +0 -29
  370. package/src/commands/start.ts +0 -38
  371. package/src/utils/conf.ts +0 -9
  372. package/src/utils/esbuild/escape-string-for-regex.ts +0 -3
  373. package/src/utils/esbuild/renderring-utilities-exporter.ts +0 -63
  374. package/src/utils/get-emails-directory-metadata.spec.ts +0 -82
  375. package/src/utils/get-emails-directory-metadata.ts +0 -140
  376. package/src/utils/get-preview-server-location.ts +0 -50
  377. package/src/utils/index.ts +0 -2
  378. package/src/utils/packageJson.ts +0 -4
  379. package/src/utils/preview/get-env-variables-for-preview-app.ts +0 -20
  380. package/src/utils/preview/hot-reloading/create-dependency-graph.spec.ts +0 -226
  381. package/src/utils/preview/hot-reloading/create-dependency-graph.ts +0 -343
  382. package/src/utils/preview/hot-reloading/get-imported-modules.spec.ts +0 -151
  383. package/src/utils/preview/hot-reloading/get-imported-modules.ts +0 -49
  384. package/src/utils/preview/hot-reloading/resolve-path-aliases.spec.ts +0 -11
  385. package/src/utils/preview/hot-reloading/resolve-path-aliases.ts +0 -32
  386. package/src/utils/preview/hot-reloading/setup-hot-reloading.ts +0 -121
  387. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/data-to-import.json +0 -1
  388. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/file-a.ts +0 -5
  389. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/file-b.ts +0 -5
  390. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/general-importing-file.ts +0 -9
  391. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/outer-dependency.ts +0 -3
  392. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/path-aliases.ts +0 -1
  393. package/src/utils/preview/hot-reloading/test/dependency-graph/outer.ts +0 -5
  394. package/src/utils/preview/hot-reloading/test/some-file.ts +0 -0
  395. package/src/utils/preview/hot-reloading/test/tsconfig.json +0 -8
  396. package/src/utils/preview/index.ts +0 -2
  397. package/src/utils/preview/serve-static-file.ts +0 -51
  398. package/src/utils/preview/start-dev-server.ts +0 -252
  399. package/src/utils/register-spinner-autostopping.ts +0 -28
  400. package/src/utils/style-text.ts +0 -11
  401. package/src/utils/tree.spec.ts +0 -29
  402. package/src/utils/tree.ts +0 -76
  403. package/src/utils/types/hot-reload-change.ts +0 -6
  404. package/src/utils/types/hot-reload-event.ts +0 -3
@@ -1,226 +0,0 @@
1
- import { existsSync, promises as fs } from 'node:fs';
2
- import path from 'node:path';
3
- import {
4
- createDependencyGraph,
5
- type DependencyGraph,
6
- } from './create-dependency-graph.js';
7
-
8
- const testingDiretctory = path.join(
9
- import.meta.dirname,
10
- './test/dependency-graph/inner',
11
- );
12
-
13
- const pathToTemporaryFile = path.join(
14
- testingDiretctory,
15
- './.temporary-file.ts',
16
- );
17
-
18
- vi.mock('@babel/traverse', async () => {
19
- const traverse = await vi.importActual('@babel/traverse');
20
- return { default: traverse };
21
- });
22
-
23
- describe('createDependencyGraph()', async () => {
24
- if (existsSync(pathToTemporaryFile)) {
25
- await fs.rm(pathToTemporaryFile);
26
- }
27
-
28
- const [dependencyGraph, updateDependencyGraph, { resolveDependentsOf }] =
29
- await createDependencyGraph(testingDiretctory);
30
-
31
- const toAbsolute = (relativePath: string) => {
32
- return path.resolve(testingDiretctory, relativePath);
33
- };
34
-
35
- it.sequential('should resolve dependents when there are circular dependencies', async () => {
36
- expect(resolveDependentsOf(toAbsolute('file-a.ts'))).toEqual([
37
- toAbsolute('file-b.ts'),
38
- toAbsolute('general-importing-file.ts'),
39
- ]);
40
- });
41
-
42
- it.sequential('should have the right initial value for the dependency graph', () => {
43
- const relativePathDependencyGraph = Object.fromEntries(
44
- Object.entries(dependencyGraph).map(([key, value]) => {
45
- return [
46
- path.relative(testingDiretctory, key).replace(/\\/g, '/'),
47
- {
48
- path: path
49
- .relative(testingDiretctory, value.path)
50
- .replace(/\\/g, '/'),
51
- dependentPaths: value.dependentPaths.map((p) =>
52
- path.relative(testingDiretctory, p).replace(/\\/g, '/'),
53
- ),
54
- dependencyPaths: value.dependencyPaths.map((p) =>
55
- path.relative(testingDiretctory, p).replace(/\\/g, '/'),
56
- ),
57
- moduleDependencies: value.moduleDependencies,
58
- },
59
- ];
60
- }),
61
- );
62
- expect(relativePathDependencyGraph).toMatchInlineSnapshot(`
63
- {
64
- "../../some-file.ts": {
65
- "dependencyPaths": [],
66
- "dependentPaths": [
67
- "path-aliases.ts",
68
- ],
69
- "moduleDependencies": [],
70
- "path": "../../some-file.ts",
71
- },
72
- "../outer.ts": {
73
- "dependencyPaths": [
74
- "outer-dependency.ts",
75
- ],
76
- "dependentPaths": [
77
- "general-importing-file.ts",
78
- ],
79
- "moduleDependencies": [],
80
- "path": "../outer.ts",
81
- },
82
- "data-to-import.json": {
83
- "dependencyPaths": [],
84
- "dependentPaths": [
85
- "general-importing-file.ts",
86
- ],
87
- "moduleDependencies": [],
88
- "path": "data-to-import.json",
89
- },
90
- "file-a.ts": {
91
- "dependencyPaths": [
92
- "file-b.ts",
93
- ],
94
- "dependentPaths": [
95
- "file-b.ts",
96
- "general-importing-file.ts",
97
- ],
98
- "moduleDependencies": [],
99
- "path": "file-a.ts",
100
- },
101
- "file-b.ts": {
102
- "dependencyPaths": [
103
- "file-a.ts",
104
- ],
105
- "dependentPaths": [
106
- "file-a.ts",
107
- "general-importing-file.ts",
108
- ],
109
- "moduleDependencies": [],
110
- "path": "file-b.ts",
111
- },
112
- "general-importing-file.ts": {
113
- "dependencyPaths": [
114
- "../outer.ts",
115
- "data-to-import.json",
116
- "file-a.ts",
117
- "file-b.ts",
118
- ],
119
- "dependentPaths": [],
120
- "moduleDependencies": [
121
- "node:os",
122
- "node:path",
123
- ],
124
- "path": "general-importing-file.ts",
125
- },
126
- "outer-dependency.ts": {
127
- "dependencyPaths": [],
128
- "dependentPaths": [
129
- "../outer.ts",
130
- ],
131
- "moduleDependencies": [],
132
- "path": "outer-dependency.ts",
133
- },
134
- "path-aliases.ts": {
135
- "dependencyPaths": [
136
- "../../some-file.ts",
137
- ],
138
- "dependentPaths": [],
139
- "moduleDependencies": [],
140
- "path": "path-aliases.ts",
141
- },
142
- }
143
- `);
144
- });
145
-
146
- it.sequential('should work when adding a new file', async () => {
147
- await fs.writeFile(
148
- pathToTemporaryFile,
149
- `
150
- import {} from './file-a';
151
- import {} from './file-b';
152
- import {} from './general-importing-file';
153
- `,
154
- 'utf8',
155
- );
156
- await updateDependencyGraph('add', pathToTemporaryFile);
157
- expect(dependencyGraph[pathToTemporaryFile]).toEqual({
158
- path: pathToTemporaryFile,
159
- dependentPaths: [],
160
- dependencyPaths: [
161
- toAbsolute('file-a.ts'),
162
- toAbsolute('file-b.ts'),
163
- toAbsolute('general-importing-file.ts'),
164
- ],
165
- moduleDependencies: [],
166
- } satisfies DependencyGraph[number]);
167
- expect(dependencyGraph[toAbsolute('file-a.ts')]?.dependentPaths).toContain(
168
- pathToTemporaryFile,
169
- );
170
- expect(dependencyGraph[toAbsolute('file-b.ts')]?.dependentPaths).toContain(
171
- pathToTemporaryFile,
172
- );
173
- expect(
174
- dependencyGraph[toAbsolute('general-importing-file.ts')]?.dependentPaths,
175
- ).toContain(pathToTemporaryFile);
176
- });
177
-
178
- it.sequential('should work when updating a file', async () => {
179
- await fs.writeFile(
180
- pathToTemporaryFile,
181
- `
182
- import {} from './file-a';
183
- import {} from './file-b';
184
- `,
185
- 'utf8',
186
- );
187
- await updateDependencyGraph('change', pathToTemporaryFile);
188
- expect(
189
- dependencyGraph[pathToTemporaryFile],
190
- 'changed file to have updated dependencyPaths',
191
- ).toEqual({
192
- path: pathToTemporaryFile,
193
- dependentPaths: [],
194
- dependencyPaths: [toAbsolute('file-a.ts'), toAbsolute('file-b.ts')],
195
- moduleDependencies: [],
196
- } satisfies DependencyGraph[number]);
197
- expect(dependencyGraph[toAbsolute('file-a.ts')]?.dependentPaths).toContain(
198
- pathToTemporaryFile,
199
- );
200
- expect(dependencyGraph[toAbsolute('file-b.ts')]?.dependentPaths).toContain(
201
- pathToTemporaryFile,
202
- );
203
- expect(
204
- dependencyGraph[toAbsolute('general-importing-file.ts')]?.dependentPaths,
205
- 'when removing dependency on a file, the dependency should have its dependents updated to not have the testing file again',
206
- ).not.toContain(pathToTemporaryFile);
207
- });
208
-
209
- it.sequential('should work when unlinking a file', async () => {
210
- await fs.rm(pathToTemporaryFile);
211
- await updateDependencyGraph('unlink', pathToTemporaryFile);
212
- expect(dependencyGraph[pathToTemporaryFile]).toBeUndefined();
213
- expect(
214
- dependencyGraph[toAbsolute('file-a.ts')]?.dependentPaths,
215
- "should remove itself from dependents once it's unlinked",
216
- ).not.toContain(pathToTemporaryFile);
217
- expect(
218
- dependencyGraph[toAbsolute('file-b.ts')]?.dependentPaths,
219
- "should remove itself from dependents once it's unlinked",
220
- ).not.toContain(pathToTemporaryFile);
221
- expect(
222
- dependencyGraph[toAbsolute('general-importing-file.ts')]?.dependentPaths,
223
- "should remove itself from dependents once it's unlinked",
224
- ).not.toContain(pathToTemporaryFile);
225
- });
226
- });
@@ -1,343 +0,0 @@
1
- import { existsSync, promises as fs, statSync } from 'node:fs';
2
- import path from 'node:path';
3
- import type { EventName } from 'chokidar/handler.js';
4
- import { getImportedModules } from './get-imported-modules.js';
5
- import { resolvePathAliases } from './resolve-path-aliases.js';
6
-
7
- interface Module {
8
- path: string;
9
-
10
- dependencyPaths: string[];
11
- dependentPaths: string[];
12
-
13
- moduleDependencies: string[];
14
- }
15
-
16
- export type DependencyGraph = Record</* path to module */ string, Module>;
17
-
18
- const readAllFilesInsideDirectory = async (directory: string) => {
19
- let allFilePaths: string[] = [];
20
-
21
- const topLevelDirents = await fs.readdir(directory, { withFileTypes: true });
22
-
23
- for await (const dirent of topLevelDirents) {
24
- const pathToDirent = path.join(directory, dirent.name);
25
- if (dirent.isDirectory()) {
26
- allFilePaths = allFilePaths.concat(
27
- await readAllFilesInsideDirectory(pathToDirent),
28
- );
29
- } else {
30
- allFilePaths.push(pathToDirent);
31
- }
32
- }
33
-
34
- return allFilePaths;
35
- };
36
-
37
- const javascriptExtensions = ['.js', '.ts', '.jsx', '.tsx', '.mjs', '.cjs'];
38
-
39
- const isJavascriptModule = (filePath: string) => {
40
- const extensionName = path.extname(filePath);
41
-
42
- return javascriptExtensions.includes(extensionName);
43
- };
44
-
45
- const checkFileExtensionsUntilItExists = (
46
- pathWithoutExtension: string,
47
- ): string | undefined => {
48
- if (existsSync(`${pathWithoutExtension}.ts`)) {
49
- return `${pathWithoutExtension}.ts`;
50
- }
51
-
52
- if (existsSync(`${pathWithoutExtension}.tsx`)) {
53
- return `${pathWithoutExtension}.tsx`;
54
- }
55
-
56
- if (existsSync(`${pathWithoutExtension}.js`)) {
57
- return `${pathWithoutExtension}.js`;
58
- }
59
-
60
- if (existsSync(`${pathWithoutExtension}.jsx`)) {
61
- return `${pathWithoutExtension}.jsx`;
62
- }
63
-
64
- if (existsSync(`${pathWithoutExtension}.mjs`)) {
65
- return `${pathWithoutExtension}.mjs`;
66
- }
67
-
68
- if (existsSync(`${pathWithoutExtension}.cjs`)) {
69
- return `${pathWithoutExtension}.cjs`;
70
- }
71
- };
72
-
73
- /**
74
- * Creates a stateful dependency graph that is structured in a way that you can get
75
- * the dependents of a module from its path.
76
- *
77
- * Stateful in the sense that it provides a `getter` and an "`updater`". The updater
78
- * will receive changes to the files, that can be perceived through some file watching mechanism,
79
- * so that it doesn't need to recompute the entire dependency graph but only the parts changed.
80
- */
81
- export const createDependencyGraph = async (directory: string) => {
82
- const filePaths = await readAllFilesInsideDirectory(directory);
83
- const modulePaths = filePaths.filter(isJavascriptModule);
84
- const graph: DependencyGraph = Object.fromEntries(
85
- modulePaths.map((path) => [
86
- path,
87
- {
88
- path,
89
- dependencyPaths: [],
90
- dependentPaths: [],
91
- moduleDependencies: [],
92
- },
93
- ]),
94
- );
95
-
96
- const getDependencyPaths = async (filePath: string) => {
97
- const contents = await fs.readFile(filePath, 'utf8');
98
- const importedPaths = isJavascriptModule(filePath)
99
- ? resolvePathAliases(getImportedModules(contents), path.dirname(filePath))
100
- : [];
101
- const importedPathsRelativeToDirectory = importedPaths.map(
102
- (dependencyPath) => {
103
- const isModulePath = !dependencyPath.startsWith('.');
104
-
105
- /*
106
- path.isAbsolute will return false if the path looks like JavaScript module imports
107
- e.g. path.isAbsolute('react-dom/server') will return false, but for our purposes this
108
- path is not a relative one.
109
- */
110
- if (isModulePath || path.isAbsolute(dependencyPath)) {
111
- return dependencyPath;
112
- }
113
-
114
- let pathToDependencyFromDirectory = path.resolve(
115
- /*
116
- path.resolve resolves paths differently from what imports on javascript do.
117
-
118
- So if we wouldn't do this, for an email at "/path/to/email.tsx" with a dependency path of "./other-email"
119
- would end up going into /path/to/email.tsx/other-email instead of /path/to/other-email which is the
120
- one the import is meant to go to
121
- */
122
- path.dirname(filePath),
123
- dependencyPath,
124
- );
125
-
126
- let isDirectory = false;
127
- try {
128
- // will throw if the the file is not existent
129
- isDirectory = statSync(pathToDependencyFromDirectory).isDirectory();
130
- } catch (_) {}
131
- if (isDirectory) {
132
- const pathToSubDirectory = pathToDependencyFromDirectory;
133
- const pathWithExtension = checkFileExtensionsUntilItExists(
134
- `${pathToSubDirectory}/index`,
135
- );
136
- if (pathWithExtension) {
137
- pathToDependencyFromDirectory = pathWithExtension;
138
- } else {
139
- console.warn(
140
- `Could not find index file for directory at ${pathToDependencyFromDirectory}. This is probably going to cause issues with both hot reloading and your code.`,
141
- );
142
- }
143
- }
144
-
145
- const extension = path.extname(pathToDependencyFromDirectory);
146
- const pathWithEnsuredExtension = (() => {
147
- if (
148
- extension.length > 0 &&
149
- existsSync(pathToDependencyFromDirectory)
150
- ) {
151
- return pathToDependencyFromDirectory;
152
- }
153
- if (javascriptExtensions.includes(extension)) {
154
- return checkFileExtensionsUntilItExists(
155
- pathToDependencyFromDirectory.replace(extension, ''),
156
- );
157
- }
158
- return checkFileExtensionsUntilItExists(
159
- pathToDependencyFromDirectory,
160
- );
161
- })();
162
-
163
- if (pathWithEnsuredExtension) {
164
- pathToDependencyFromDirectory = pathWithEnsuredExtension;
165
- } else {
166
- console.warn(
167
- `Could not find file at ${pathToDependencyFromDirectory}`,
168
- );
169
- }
170
-
171
- return pathToDependencyFromDirectory;
172
- },
173
- );
174
-
175
- const moduleDependencies = importedPathsRelativeToDirectory.filter(
176
- (dependencyPath) =>
177
- !dependencyPath.startsWith('.') && !path.isAbsolute(dependencyPath),
178
- );
179
-
180
- const nonNodeModuleImportPathsRelativeToDirectory =
181
- importedPathsRelativeToDirectory.filter(
182
- (dependencyPath) =>
183
- dependencyPath.startsWith('.') || path.isAbsolute(dependencyPath),
184
- );
185
-
186
- return {
187
- dependencyPaths: nonNodeModuleImportPathsRelativeToDirectory,
188
- moduleDependencies,
189
- };
190
- };
191
-
192
- const updateModuleDependenciesInGraph = async (moduleFilePath: string) => {
193
- if (graph[moduleFilePath] === undefined) {
194
- graph[moduleFilePath] = {
195
- path: moduleFilePath,
196
- dependencyPaths: [],
197
- dependentPaths: [],
198
- moduleDependencies: [],
199
- };
200
- }
201
-
202
- const { moduleDependencies, dependencyPaths: newDependencyPaths } =
203
- await getDependencyPaths(moduleFilePath);
204
-
205
- graph[moduleFilePath].moduleDependencies = moduleDependencies;
206
-
207
- // we go through these to remove the ones that don't exist anymore
208
- for (const dependencyPath of graph[moduleFilePath].dependencyPaths) {
209
- // Looping through only the ones that were on the dependencyPaths but are not
210
- // in the newDependencyPaths
211
- if (newDependencyPaths.includes(dependencyPath)) continue;
212
-
213
- const dependencyModule = graph[dependencyPath];
214
- if (dependencyModule !== undefined) {
215
- dependencyModule.dependentPaths =
216
- dependencyModule.dependentPaths.filter(
217
- (dependentPath) => dependentPath !== moduleFilePath,
218
- );
219
- }
220
- }
221
-
222
- graph[moduleFilePath].dependencyPaths = newDependencyPaths;
223
-
224
- for await (const dependencyPath of newDependencyPaths) {
225
- if (graph[dependencyPath] === undefined) {
226
- /*
227
- This import path might have not been initialized as it can be outside
228
- of the original directory we looked into.
229
- */
230
- await updateModuleDependenciesInGraph(dependencyPath);
231
- }
232
-
233
- const dependencyModule = graph[dependencyPath];
234
-
235
- if (dependencyModule === undefined) {
236
- throw new Error(
237
- `Loading the dependency path ${dependencyPath} did not initialize it at all. This is a bug in React Email.`,
238
- );
239
- }
240
-
241
- if (!dependencyModule.dependentPaths.includes(moduleFilePath)) {
242
- dependencyModule.dependentPaths.push(moduleFilePath);
243
- }
244
- }
245
- };
246
-
247
- for (const filePath of modulePaths) {
248
- await updateModuleDependenciesInGraph(filePath);
249
- }
250
-
251
- const removeModuleFromGraph = (filePath: string) => {
252
- const module = graph[filePath];
253
- if (module) {
254
- for (const dependencyPath of module.dependencyPaths) {
255
- if (graph[dependencyPath]) {
256
- graph[dependencyPath]!.dependentPaths = graph[
257
- dependencyPath
258
- ]!.dependentPaths.filter(
259
- (dependentPath) => dependentPath !== filePath,
260
- );
261
- }
262
- }
263
- delete graph[filePath];
264
- }
265
- };
266
-
267
- return [
268
- graph,
269
- async (event: EventName, pathToModified: string) => {
270
- switch (event) {
271
- case 'change':
272
- if (isJavascriptModule(pathToModified)) {
273
- await updateModuleDependenciesInGraph(pathToModified);
274
- }
275
- break;
276
- case 'add':
277
- if (isJavascriptModule(pathToModified)) {
278
- await updateModuleDependenciesInGraph(pathToModified);
279
- }
280
- break;
281
- case 'addDir': {
282
- const filesInsideAddedDirectory =
283
- await readAllFilesInsideDirectory(pathToModified);
284
- const modulesInsideAddedDirectory =
285
- filesInsideAddedDirectory.filter(isJavascriptModule);
286
- for await (const filePath of modulesInsideAddedDirectory) {
287
- await updateModuleDependenciesInGraph(filePath);
288
- }
289
- break;
290
- }
291
- case 'unlink':
292
- if (isJavascriptModule(pathToModified)) {
293
- removeModuleFromGraph(pathToModified);
294
- }
295
- break;
296
- case 'unlinkDir': {
297
- const filesInsideDeletedDirectory =
298
- await readAllFilesInsideDirectory(pathToModified);
299
- const modulesInsideDeletedDirectory =
300
- filesInsideDeletedDirectory.filter(isJavascriptModule);
301
- for await (const filePath of modulesInsideDeletedDirectory) {
302
- removeModuleFromGraph(filePath);
303
- }
304
- break;
305
- }
306
- }
307
- },
308
- {
309
- /**
310
- * Resolves all modules that depend on the specified module, directly or indirectly.
311
- *
312
- * @param pathToModule - The path to the module whose dependents we want to find
313
- * @returns An array of paths to all modules that depend on the specified module
314
- */
315
- resolveDependentsOf: function resolveDependentsOf(
316
- pathToModule: string,
317
- ): string[] {
318
- const dependentPaths = new Set<string>();
319
- const stack: string[] = [pathToModule];
320
-
321
- while (stack.length > 0) {
322
- const currentPath = stack.pop()!;
323
- const moduleEntry = graph[currentPath];
324
-
325
- if (!moduleEntry) continue;
326
-
327
- for (const dependentPath of moduleEntry.dependentPaths) {
328
- if (
329
- dependentPaths.has(dependentPath) ||
330
- dependentPath === pathToModule
331
- )
332
- continue;
333
-
334
- dependentPaths.add(dependentPath);
335
- stack.push(dependentPath);
336
- }
337
- }
338
-
339
- return [...dependentPaths.values()];
340
- },
341
- },
342
- ] as const;
343
- };