@depup/react-email 5.2.10-depup.1 → 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,204 +0,0 @@
1
- import fs, { unlinkSync, writeFileSync } from 'node:fs';
2
- import { createRequire } from 'node:module';
3
- import path from 'node:path';
4
- import url from 'node:url';
5
- import type { Options } from '@react-email/components';
6
- import { type BuildFailure, build } from 'esbuild';
7
- import { glob } from 'glob';
8
- import logSymbols from 'log-symbols';
9
- import normalize from 'normalize-path';
10
- import ora, { type Ora } from 'ora';
11
- import type React from 'react';
12
- import { renderingUtilitiesExporter } from '../utils/esbuild/renderring-utilities-exporter.js';
13
- import {
14
- type EmailsDirectory,
15
- getEmailsDirectoryMetadata,
16
- } from '../utils/get-emails-directory-metadata.js';
17
- import { tree } from '../utils/index.js';
18
- import { registerSpinnerAutostopping } from '../utils/register-spinner-autostopping.js';
19
-
20
- const getEmailTemplatesFromDirectory = (emailDirectory: EmailsDirectory) => {
21
- const templatePaths = [] as string[];
22
- for (const filename of emailDirectory.emailFilenames) {
23
- templatePaths.push(path.join(emailDirectory.absolutePath, filename));
24
- }
25
- for (const directory of emailDirectory.subDirectories) {
26
- templatePaths.push(...getEmailTemplatesFromDirectory(directory));
27
- }
28
-
29
- return templatePaths;
30
- };
31
-
32
- type ExportTemplatesOptions = Options & {
33
- silent?: boolean;
34
- pretty?: boolean;
35
- };
36
-
37
- const filename = url.fileURLToPath(import.meta.url);
38
-
39
- const require = createRequire(filename);
40
-
41
- /*
42
- This first builds all the templates using esbuild and then puts the output in the `.js`
43
- files. Then these `.js` files are imported dynamically and rendered to `.html` files
44
- using the `render` function.
45
- */
46
- export const exportTemplates = async (
47
- pathToWhereEmailMarkupShouldBeDumped: string,
48
- emailsDirectoryPath: string,
49
- options: ExportTemplatesOptions,
50
- ) => {
51
- /* Delete the out directory if it already exists */
52
- if (fs.existsSync(pathToWhereEmailMarkupShouldBeDumped)) {
53
- fs.rmSync(pathToWhereEmailMarkupShouldBeDumped, { recursive: true });
54
- }
55
-
56
- let spinner: Ora | undefined;
57
- if (!options.silent) {
58
- spinner = ora('Preparing files...\n').start();
59
- registerSpinnerAutostopping(spinner);
60
- }
61
-
62
- const emailsDirectoryMetadata = await getEmailsDirectoryMetadata(
63
- path.resolve(process.cwd(), emailsDirectoryPath),
64
- true,
65
- );
66
-
67
- if (typeof emailsDirectoryMetadata === 'undefined') {
68
- if (spinner) {
69
- spinner.stopAndPersist({
70
- symbol: logSymbols.error,
71
- text: `Could not find the directory at ${emailsDirectoryPath}`,
72
- });
73
- }
74
- return;
75
- }
76
-
77
- const allTemplates = getEmailTemplatesFromDirectory(emailsDirectoryMetadata);
78
-
79
- try {
80
- await build({
81
- bundle: true,
82
- entryPoints: allTemplates,
83
- format: 'cjs',
84
- jsx: 'automatic',
85
- loader: { '.js': 'jsx' },
86
- logLevel: 'silent',
87
- outExtension: { '.js': '.cjs' },
88
- outdir: pathToWhereEmailMarkupShouldBeDumped,
89
- platform: 'node',
90
- plugins: [renderingUtilitiesExporter(allTemplates)],
91
- write: true,
92
- });
93
- } catch (exception) {
94
- if (spinner) {
95
- spinner.stopAndPersist({
96
- symbol: logSymbols.error,
97
- text: 'Failed to build emails',
98
- });
99
- }
100
-
101
- const buildFailure = exception as BuildFailure;
102
- console.error(`\n${buildFailure.message}`);
103
-
104
- process.exit(1);
105
- }
106
-
107
- if (spinner) {
108
- spinner.succeed();
109
- }
110
-
111
- const allBuiltTemplates = glob.sync(
112
- normalize(`${pathToWhereEmailMarkupShouldBeDumped}/**/*.cjs`),
113
- {
114
- absolute: true,
115
- },
116
- );
117
-
118
- for await (const template of allBuiltTemplates) {
119
- try {
120
- if (spinner) {
121
- spinner.text = `rendering ${template.split('/').pop()}`;
122
- spinner.render();
123
- }
124
- delete require.cache[template];
125
- const emailModule = require(template) as {
126
- default: React.FC;
127
- render: (
128
- element: React.ReactElement,
129
- options: Record<string, unknown>,
130
- ) => Promise<string>;
131
- reactEmailCreateReactElement: typeof React.createElement;
132
- };
133
- const rendered = await emailModule.render(
134
- emailModule.reactEmailCreateReactElement(emailModule.default, {}),
135
- options,
136
- );
137
- const htmlPath = template.replace(
138
- '.cjs',
139
- options.plainText ? '.txt' : '.html',
140
- );
141
- writeFileSync(htmlPath, rendered);
142
- unlinkSync(template);
143
- } catch (exception) {
144
- if (spinner) {
145
- spinner.stopAndPersist({
146
- symbol: logSymbols.error,
147
- text: `failed when rendering ${template.split('/').pop()}`,
148
- });
149
- }
150
- console.error(exception);
151
- process.exit(1);
152
- }
153
- }
154
- if (spinner) {
155
- spinner.succeed('Rendered all files');
156
- spinner.text = 'Copying static files';
157
- spinner.render();
158
- }
159
-
160
- // ex: emails/static
161
- const staticDirectoryPath = path.join(emailsDirectoryPath, 'static');
162
-
163
- if (fs.existsSync(staticDirectoryPath)) {
164
- const pathToDumpStaticFilesInto = path.join(
165
- pathToWhereEmailMarkupShouldBeDumped,
166
- 'static',
167
- );
168
- // cp('-r', ...) will copy *inside* of the static directory if it exists
169
- // causing a duplication of static files, so we need to delete ir first
170
- if (fs.existsSync(pathToDumpStaticFilesInto))
171
- await fs.promises.rm(pathToDumpStaticFilesInto, { recursive: true });
172
-
173
- try {
174
- await fs.promises.cp(staticDirectoryPath, pathToDumpStaticFilesInto, {
175
- recursive: true,
176
- });
177
- } catch (exception) {
178
- console.error(exception);
179
- if (spinner) {
180
- spinner.stopAndPersist({
181
- symbol: logSymbols.error,
182
- text: 'Failed to copy static files',
183
- });
184
- }
185
- console.error(
186
- `Something went wrong while copying the file to ${pathToWhereEmailMarkupShouldBeDumped}/static, ${exception}`,
187
- );
188
- process.exit(1);
189
- }
190
- }
191
-
192
- if (spinner && !options.silent) {
193
- spinner.succeed();
194
-
195
- const fileTree = await tree(pathToWhereEmailMarkupShouldBeDumped, 4);
196
-
197
- console.log(fileTree);
198
-
199
- spinner.stopAndPersist({
200
- symbol: logSymbols.success,
201
- text: 'Successfully exported emails',
202
- });
203
- }
204
- };
@@ -1,8 +0,0 @@
1
- import logSymbols from 'log-symbols';
2
- import { conf } from '../../utils/conf.js';
3
-
4
- export async function resendReset() {
5
- conf.delete('resendApiKey');
6
-
7
- console.info(`${logSymbols.success} Resend API Key successfully deleted`);
8
- }
@@ -1,29 +0,0 @@
1
- import logSymbols from 'log-symbols';
2
- import prompts from 'prompts';
3
- import { conf } from '../../utils/conf.js';
4
- import { styleText } from '../../utils/style-text.js';
5
-
6
- export async function resendSetup() {
7
- const previousValue = conf.get('resendApiKey');
8
- if (typeof previousValue === 'string' && previousValue.length > 0) {
9
- console.info(
10
- `You already have a Resend API Key configured (${styleText('grey', previousValue.slice(0, 11))}...), continuing will replace it.`,
11
- );
12
- }
13
-
14
- const { apiKey } = await prompts({
15
- type: 'password',
16
- name: 'apiKey',
17
- message: 'Enter your API Key (make sure it has "Full Access")',
18
- });
19
-
20
- if (apiKey?.trim().length > 0) {
21
- conf.set('resendApiKey', apiKey);
22
- console.info(
23
- `${logSymbols.success} Resend integration successfully set up`,
24
- );
25
- console.info(
26
- `You can always remove it with ${styleText('green', 'npx react-email@latest resend reset')}`,
27
- );
28
- }
29
- }
@@ -1,38 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import { getPreviewServerLocation } from '../utils/get-preview-server-location.js';
5
-
6
- export const start = async () => {
7
- try {
8
- const previewServerLocation = await getPreviewServerLocation();
9
-
10
- const usersProjectLocation = process.cwd();
11
- const builtPreviewPath = path.resolve(
12
- usersProjectLocation,
13
- './.react-email',
14
- );
15
- if (!fs.existsSync(builtPreviewPath)) {
16
- console.error(
17
- "Could not find .react-email, maybe you haven't ran email build?",
18
- );
19
- process.exit(1);
20
- }
21
-
22
- const nextStart = spawn('npx', ['next', 'start', builtPreviewPath], {
23
- cwd: previewServerLocation,
24
- stdio: 'inherit',
25
- });
26
-
27
- process.on('SIGINT', () => {
28
- nextStart.kill('SIGINT');
29
- });
30
-
31
- nextStart.on('exit', (code) => {
32
- process.exit(code ?? 0);
33
- });
34
- } catch (error) {
35
- console.log(error);
36
- process.exit(1);
37
- }
38
- };
package/src/utils/conf.ts DELETED
@@ -1,9 +0,0 @@
1
- import Conf from 'conf';
2
-
3
- // Just simple encryption. This isn't completely safe
4
- // because anyone can find this key here
5
- const encryptionKey = 'h2#x658}1#qY(@!:7,BD1J)q12$[tM25';
6
-
7
- export const conf = new Conf<{
8
- resendApiKey?: string;
9
- }>({ projectName: 'react-email', encryptionKey });
@@ -1,3 +0,0 @@
1
- export function escapeStringForRegex(string: string) {
2
- return string.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d');
3
- }
@@ -1,63 +0,0 @@
1
- import { promises as fs } from 'node:fs';
2
- import path from 'node:path';
3
- import type { Loader, PluginBuild, ResolveOptions } from 'esbuild';
4
- import { escapeStringForRegex } from './escape-string-for-regex.js';
5
-
6
- /**
7
- * Made to export the `render` function out of the user's email template
8
- * so that issues like https://github.com/resend/react-email/issues/649 don't
9
- * happen.
10
- *
11
- * This also exports the `createElement` from the user's React version as well
12
- * to avoid mismatches.
13
- *
14
- * This avoids multiple versions of React being involved, i.e., the version
15
- * in the CLI vs. the version the user has on their emails.
16
- */
17
- export const renderingUtilitiesExporter = (emailTemplates: string[]) => ({
18
- name: 'rendering-utilities-exporter',
19
- setup: (b: PluginBuild) => {
20
- b.onLoad(
21
- {
22
- filter: new RegExp(
23
- emailTemplates
24
- .map((emailPath) => escapeStringForRegex(emailPath))
25
- .join('|'),
26
- ),
27
- },
28
- async ({ path: pathToFile }) => {
29
- return {
30
- contents: `${await fs.readFile(pathToFile, 'utf8')};
31
- export { render } from 'react-email-module-that-will-export-render'
32
- export { createElement as reactEmailCreateReactElement } from 'react';
33
- `,
34
- loader: path.extname(pathToFile).slice(1) as Loader,
35
- };
36
- },
37
- );
38
-
39
- b.onResolve(
40
- { filter: /^react-email-module-that-will-export-render$/ },
41
- async (args) => {
42
- const options: ResolveOptions = {
43
- kind: 'import-statement',
44
- importer: args.importer,
45
- resolveDir: args.resolveDir,
46
- namespace: args.namespace,
47
- };
48
- let result = await b.resolve('@react-email/render', options);
49
- if (result.errors.length === 0) {
50
- return result;
51
- }
52
-
53
- // If @react-email/render does not exist, resolve to @react-email/components
54
- result = await b.resolve('@react-email/components', options);
55
- if (result.errors.length > 0 && result.errors[0]) {
56
- result.errors[0].text =
57
- "Failed trying to import `render` from either `@react-email/render` or `@react-email/components` to be able to render your email template.\n Maybe you don't have either of them installed?";
58
- }
59
- return result;
60
- },
61
- );
62
- },
63
- });
@@ -1,82 +0,0 @@
1
- import path from 'node:path';
2
- import { getEmailsDirectoryMetadata } from './get-emails-directory-metadata';
3
-
4
- test('getEmailsDirectoryMetadata on demo emails', async () => {
5
- const emailsDirectoryPath = path.resolve(
6
- __dirname,
7
- '../../../../apps/demo/emails',
8
- );
9
- expect(await getEmailsDirectoryMetadata(emailsDirectoryPath)).toEqual({
10
- absolutePath: emailsDirectoryPath,
11
- directoryName: 'emails',
12
- relativePath: '',
13
- emailFilenames: [],
14
- subDirectories: [
15
- {
16
- absolutePath: path.join(emailsDirectoryPath, 'magic-links'),
17
- directoryName: 'magic-links',
18
- relativePath: 'magic-links',
19
- emailFilenames: [
20
- 'aws-verify-email',
21
- 'linear-login-code',
22
- 'notion-magic-link',
23
- 'plaid-verify-identity',
24
- 'raycast-magic-link',
25
- 'slack-confirm',
26
- ],
27
- subDirectories: [],
28
- },
29
- {
30
- absolutePath: path.join(emailsDirectoryPath, 'newsletters'),
31
- directoryName: 'newsletters',
32
- relativePath: 'newsletters',
33
- emailFilenames: [
34
- 'codepen-challengers',
35
- 'google-play-policy-update',
36
- 'stack-overflow-tips',
37
- ],
38
- subDirectories: [],
39
- },
40
- {
41
- absolutePath: path.join(emailsDirectoryPath, 'notifications'),
42
- directoryName: 'notifications',
43
- relativePath: 'notifications',
44
- emailFilenames: [
45
- 'github-access-token',
46
- 'papermark-year-in-review',
47
- 'vercel-invite-user',
48
- 'yelp-recent-login',
49
- ],
50
- subDirectories: [],
51
- },
52
- {
53
- absolutePath: path.join(emailsDirectoryPath, 'receipts'),
54
- directoryName: 'receipts',
55
- relativePath: 'receipts',
56
- emailFilenames: ['apple-receipt', 'nike-receipt'],
57
- subDirectories: [],
58
- },
59
- {
60
- absolutePath: path.join(emailsDirectoryPath, 'reset-password'),
61
- directoryName: 'reset-password',
62
- relativePath: 'reset-password',
63
- emailFilenames: ['dropbox-reset-password', 'twitch-reset-password'],
64
- subDirectories: [],
65
- },
66
- {
67
- absolutePath: path.join(emailsDirectoryPath, 'reviews'),
68
- directoryName: 'reviews',
69
- relativePath: 'reviews',
70
- emailFilenames: ['airbnb-review', 'amazon-review'],
71
- subDirectories: [],
72
- },
73
- {
74
- absolutePath: path.join(emailsDirectoryPath, 'welcome'),
75
- directoryName: 'welcome',
76
- relativePath: 'welcome',
77
- emailFilenames: ['koala-welcome', 'netlify-welcome', 'stripe-welcome'],
78
- subDirectories: [],
79
- },
80
- ],
81
- });
82
- });
@@ -1,140 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
-
4
- const isFileAnEmail = async (fullPath: string): Promise<boolean> => {
5
- let fileHandle: fs.promises.FileHandle;
6
- try {
7
- fileHandle = await fs.promises.open(fullPath, 'r');
8
- } catch (exception) {
9
- console.warn(exception);
10
- return false;
11
- }
12
- const stat = await fileHandle.stat();
13
-
14
- if (stat.isDirectory()) {
15
- await fileHandle.close();
16
- return false;
17
- }
18
-
19
- const { ext } = path.parse(fullPath);
20
-
21
- if (!['.js', '.tsx', '.jsx'].includes(ext)) {
22
- await fileHandle.close();
23
- return false;
24
- }
25
-
26
- // check with a heuristic to see if the file has at least
27
- // a default export (ES6) or module.exports (CommonJS) or named exports (MDX)
28
- const fileContents = await fileHandle.readFile('utf8');
29
-
30
- await fileHandle.close();
31
-
32
- // Check for ES6 export default syntax
33
- const hasES6DefaultExport = /\bexport\s+default\b/gm.test(fileContents);
34
-
35
- // Check for CommonJS module.exports syntax
36
- const hasCommonJSExport = /\bmodule\.exports\s*=/gm.test(fileContents);
37
-
38
- // Check for named exports (used in MDX files) and ensure at least one is marked as default
39
- const hasNamedExport = /\bexport\s+\{[^}]*\bdefault\b[^}]*\}/gm.test(
40
- fileContents,
41
- );
42
-
43
- return hasES6DefaultExport || hasCommonJSExport || hasNamedExport;
44
- };
45
-
46
- export interface EmailsDirectory {
47
- absolutePath: string;
48
- relativePath: string;
49
- directoryName: string;
50
- emailFilenames: string[];
51
- subDirectories: EmailsDirectory[];
52
- }
53
-
54
- const mergeDirectoriesWithSubDirectories = (
55
- emailsDirectoryMetadata: EmailsDirectory,
56
- ): EmailsDirectory => {
57
- let currentResultingMergedDirectory: EmailsDirectory =
58
- emailsDirectoryMetadata;
59
-
60
- while (
61
- currentResultingMergedDirectory.emailFilenames.length === 0 &&
62
- currentResultingMergedDirectory.subDirectories.length === 1
63
- ) {
64
- const onlySubDirectory = currentResultingMergedDirectory.subDirectories[0]!;
65
- currentResultingMergedDirectory = {
66
- ...onlySubDirectory,
67
- directoryName: path.join(
68
- currentResultingMergedDirectory.directoryName,
69
- onlySubDirectory.directoryName,
70
- ),
71
- };
72
- }
73
-
74
- return currentResultingMergedDirectory;
75
- };
76
-
77
- export const getEmailsDirectoryMetadata = async (
78
- absolutePathToEmailsDirectory: string,
79
- keepFileExtensions = false,
80
- isSubDirectory = false,
81
-
82
- baseDirectoryPath = absolutePathToEmailsDirectory,
83
- ): Promise<EmailsDirectory | undefined> => {
84
- if (!fs.existsSync(absolutePathToEmailsDirectory)) return;
85
-
86
- const dirents = await fs.promises.readdir(absolutePathToEmailsDirectory, {
87
- withFileTypes: true,
88
- });
89
-
90
- const isEmailPredicates = await Promise.all(
91
- dirents.map((dirent) =>
92
- isFileAnEmail(path.join(absolutePathToEmailsDirectory, dirent.name)),
93
- ),
94
- );
95
- const emailFilenames = dirents
96
- .filter((_, i) => isEmailPredicates[i])
97
- .map((dirent) =>
98
- keepFileExtensions
99
- ? dirent.name
100
- : dirent.name.replace(path.extname(dirent.name), ''),
101
- );
102
-
103
- const subDirectories = await Promise.all(
104
- dirents
105
- .filter(
106
- (dirent) =>
107
- dirent.isDirectory() &&
108
- !dirent.name.startsWith('_') &&
109
- dirent.name !== 'static',
110
- )
111
- .map((dirent) => {
112
- const direntAbsolutePath = path.join(
113
- absolutePathToEmailsDirectory,
114
- dirent.name,
115
- );
116
-
117
- return getEmailsDirectoryMetadata(
118
- direntAbsolutePath,
119
- keepFileExtensions,
120
- true,
121
- baseDirectoryPath,
122
- ) as Promise<EmailsDirectory>;
123
- }),
124
- );
125
-
126
- const emailsMetadata = {
127
- absolutePath: absolutePathToEmailsDirectory,
128
- relativePath: path.relative(
129
- baseDirectoryPath,
130
- absolutePathToEmailsDirectory,
131
- ),
132
- directoryName: absolutePathToEmailsDirectory.split(path.sep).pop()!,
133
- emailFilenames,
134
- subDirectories,
135
- } satisfies EmailsDirectory;
136
-
137
- return isSubDirectory
138
- ? mergeDirectoriesWithSubDirectories(emailsMetadata)
139
- : emailsMetadata;
140
- };
@@ -1,50 +0,0 @@
1
- import path from 'node:path';
2
- import url from 'node:url';
3
- import { createJiti } from 'jiti';
4
- import { addDevDependency } from 'nypm';
5
- import prompts from 'prompts';
6
- import { packageJson } from './packageJson.js';
7
-
8
- const ensurePreviewServerInstalled = async (
9
- message: string,
10
- ): Promise<never> => {
11
- const response = await prompts({
12
- type: 'confirm',
13
- name: 'installPreviewServer',
14
- message,
15
- initial: true,
16
- });
17
- if (response.installPreviewServer) {
18
- console.log('Installing "@react-email/preview-server"');
19
- await addDevDependency(
20
- `@react-email/preview-server@${packageJson.version}`,
21
- );
22
- process.exit(0);
23
- } else {
24
- process.exit(0);
25
- }
26
- };
27
-
28
- export const getPreviewServerLocation = async () => {
29
- const usersProject = createJiti(process.cwd());
30
- let previewServerLocation!: string;
31
- try {
32
- previewServerLocation = path.dirname(
33
- url.fileURLToPath(usersProject.esmResolve('@react-email/preview-server')),
34
- );
35
- } catch (_exception) {
36
- await ensurePreviewServerInstalled(
37
- 'To run the preview server, the package "@react-email/preview-server" must be installed. Would you like to install it?',
38
- );
39
- }
40
- const { version } = await usersProject.import<{
41
- version: string;
42
- }>('@react-email/preview-server');
43
- if (version !== packageJson.version) {
44
- await ensurePreviewServerInstalled(
45
- `To run the preview server, the version of "@react-email/preview-server" must match the version of "react-email" (${packageJson.version}). Would you like to install it?`,
46
- );
47
- }
48
-
49
- return previewServerLocation;
50
- };
@@ -1,2 +0,0 @@
1
- export * from './preview/index.js';
2
- export * from './tree.js';
@@ -1,4 +0,0 @@
1
- // @ts-expect-error Typescript doesn't want to allow this, but it's fine since we're using tsup
2
- import packageJson from '../../package.json';
3
-
4
- export { packageJson };
@@ -1,20 +0,0 @@
1
- import path from 'node:path';
2
-
3
- export const getEnvVariablesForPreviewApp = (
4
- relativePathToEmailsDirectory: string,
5
- previewServerLocation: string,
6
- cwd: string,
7
- resendApiKey?: string,
8
- ) => {
9
- return {
10
- REACT_EMAIL_INTERNAL_EMAILS_DIR_RELATIVE_PATH:
11
- relativePathToEmailsDirectory,
12
- REACT_EMAIL_INTERNAL_EMAILS_DIR_ABSOLUTE_PATH: path.resolve(
13
- cwd,
14
- relativePathToEmailsDirectory,
15
- ),
16
- REACT_EMAIL_INTERNAL_PREVIEW_SERVER_LOCATION: previewServerLocation,
17
- REACT_EMAIL_INTERNAL_USER_PROJECT_LOCATION: cwd,
18
- REACT_EMAIL_INTERNAL_RESEND_API_KEY: resendApiKey,
19
- } as const;
20
- };