@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
@@ -0,0 +1,102 @@
1
+ type MarginType = string | number | undefined;
2
+
3
+ interface MarginProperties {
4
+ margin?: MarginType;
5
+ marginTop?: MarginType;
6
+ marginRight?: MarginType;
7
+ marginBottom?: MarginType;
8
+ marginLeft?: MarginType;
9
+ }
10
+
11
+ interface MarginResult {
12
+ marginTop: MarginType;
13
+ marginRight: MarginType;
14
+ marginBottom: MarginType;
15
+ marginLeft: MarginType;
16
+ }
17
+
18
+ function parseMarginValue(value: MarginType): MarginResult {
19
+ if (typeof value === 'number')
20
+ return {
21
+ marginTop: value,
22
+ marginBottom: value,
23
+ marginLeft: value,
24
+ marginRight: value,
25
+ };
26
+
27
+ if (typeof value === 'string') {
28
+ const values = value.toString().trim().split(/\s+/);
29
+
30
+ if (values.length === 1) {
31
+ return {
32
+ marginTop: values[0],
33
+ marginBottom: values[0],
34
+ marginLeft: values[0],
35
+ marginRight: values[0],
36
+ };
37
+ }
38
+
39
+ if (values.length === 2) {
40
+ return {
41
+ marginTop: values[0],
42
+ marginRight: values[1],
43
+ marginBottom: values[0],
44
+ marginLeft: values[1],
45
+ };
46
+ }
47
+
48
+ if (values.length === 3) {
49
+ return {
50
+ marginTop: values[0],
51
+ marginRight: values[1],
52
+ marginBottom: values[2],
53
+ marginLeft: values[1],
54
+ };
55
+ }
56
+
57
+ if (values.length === 4) {
58
+ return {
59
+ marginTop: values[0],
60
+ marginRight: values[1],
61
+ marginBottom: values[2],
62
+ marginLeft: values[3],
63
+ };
64
+ }
65
+ }
66
+
67
+ return {
68
+ marginTop: undefined,
69
+ marginBottom: undefined,
70
+ marginLeft: undefined,
71
+ marginRight: undefined,
72
+ };
73
+ }
74
+
75
+ /**
76
+ * Parses all the values out of a margin string to get the value for all margin props in the four margin properties
77
+ * @example e.g. "10px" =\> mt: "10px", mr: "10px", mb: "10px", ml: "10px"
78
+ */
79
+ export function computeMargins(properties: MarginProperties): MarginResult {
80
+ let result: MarginResult = {
81
+ marginTop: undefined,
82
+ marginRight: undefined,
83
+ marginBottom: undefined,
84
+ marginLeft: undefined,
85
+ };
86
+
87
+ for (const [key, value] of Object.entries(properties)) {
88
+ if (key === 'margin') {
89
+ result = parseMarginValue(value);
90
+ } else if (key === 'marginTop') {
91
+ result.marginTop = value;
92
+ } else if (key === 'marginRight') {
93
+ result.marginRight = value;
94
+ } else if (key === 'marginBottom') {
95
+ result.marginBottom = value;
96
+ } else if (key === 'marginLeft') {
97
+ result.marginLeft = value;
98
+ }
99
+ }
100
+
101
+ return result;
102
+ }
package/src/index.ts CHANGED
@@ -1,110 +1,2 @@
1
- #!/usr/bin/env node
2
- import { spawn } from 'node:child_process';
3
- import { program } from 'commander';
4
- import { build } from './commands/build.js';
5
- import { dev } from './commands/dev.js';
6
- import { exportTemplates } from './commands/export.js';
7
- import { resendReset } from './commands/resend/reset.js';
8
- import { resendSetup } from './commands/resend/setup.js';
9
- import { start } from './commands/start.js';
10
- import { packageJson } from './utils/packageJson.js';
11
-
12
- const requiredFlags = [
13
- '--experimental-vm-modules',
14
- '--disable-warning=ExperimentalWarning',
15
- ];
16
-
17
- const hasRequiredFlags = requiredFlags.every((flag) =>
18
- process.execArgv.includes(flag),
19
- );
20
-
21
- if (!hasRequiredFlags) {
22
- const child = spawn(
23
- process.execPath,
24
- [
25
- ...requiredFlags,
26
- ...process.execArgv,
27
- process.argv[1] ?? '',
28
- ...process.argv.slice(2),
29
- ],
30
- { stdio: 'inherit' },
31
- );
32
-
33
- child.on('exit', (code) => {
34
- process.exit(code ?? 0);
35
- });
36
- } else {
37
- const PACKAGE_NAME = 'react-email';
38
-
39
- program
40
- .name(PACKAGE_NAME)
41
- .description('A live preview of your emails right in your browser')
42
- .version(packageJson.version);
43
-
44
- program
45
- .command('dev')
46
- .description('Starts the preview email development app')
47
- .option(
48
- '-d, --dir <path>',
49
- 'Directory with your email templates',
50
- './emails',
51
- )
52
- .option('-p --port <port>', 'Port to run dev server on', '3000')
53
- .action(dev);
54
-
55
- program
56
- .command('build')
57
- .description('Copies the preview app for onto .react-email and builds it')
58
- .option(
59
- '-d, --dir <path>',
60
- 'Directory with your email templates',
61
- './emails',
62
- )
63
- .option(
64
- '-p --packageManager <name>',
65
- 'Package name to use on installation on `.react-email`',
66
- 'npm',
67
- )
68
- .action(build);
69
-
70
- program
71
- .command('start')
72
- .description('Runs the built preview app that is inside of ".react-email"')
73
- .action(start);
74
-
75
- program
76
- .command('export')
77
- .description('Build the templates to the `out` directory')
78
- .option('--outDir <path>', 'Output directory', 'out')
79
- .option('-p, --pretty', 'Pretty print the output', false)
80
- .option('-t, --plainText', 'Set output format as plain text', false)
81
- .option(
82
- '-d, --dir <path>',
83
- 'Directory with your email templates',
84
- './emails',
85
- )
86
- .option(
87
- '-s, --silent',
88
- 'To, or not to show a spinner with process information',
89
- false,
90
- )
91
- .action(({ outDir, pretty, plainText, silent, dir: srcDir }) =>
92
- exportTemplates(outDir, srcDir, { silent, plainText, pretty }),
93
- );
94
-
95
- const resend = program.command('resend');
96
-
97
- resend
98
- .command('setup')
99
- .description(
100
- 'Sets up the integration between the React Email CLI, and your Resend account through an API Key',
101
- )
102
- .action(resendSetup);
103
-
104
- resend
105
- .command('reset')
106
- .description('Deletes your API Key from the React Email configuration')
107
- .action(resendReset);
108
-
109
- program.parse();
110
- }
1
+ export * from '@react-email/render';
2
+ export * from './components/index.js';
package/tsconfig.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "forceConsistentCasingInFileNames": true,
9
9
  "inlineSources": false,
10
10
  "isolatedModules": true,
11
- "moduleResolution": "nodenext",
11
+ "moduleResolution": "bundler",
12
12
  "noUnusedLocals": false,
13
13
  "noUnusedParameters": false,
14
14
  "preserveWatchOutput": true,
@@ -28,12 +28,17 @@
28
28
  "noEmit": true,
29
29
  "strict": false,
30
30
  "target": "ESNext",
31
- "module": "NodeNext",
31
+ "module": "ESNext",
32
32
  "noUncheckedIndexedAccess": true,
33
33
  "resolveJsonModule": true,
34
34
  "types": ["vitest/globals"],
35
35
  "outDir": "dist"
36
36
  },
37
- "include": ["src/**/*.ts"],
38
- "exclude": ["dist", "node_modules"]
37
+ "include": ["src/**/*.ts", "src/**/*.tsx"],
38
+ "exclude": [
39
+ "dist",
40
+ "node_modules",
41
+ "src/cli/utils/preview/hot-reloading/test",
42
+ "src/components/tailwind/e2e"
43
+ ]
39
44
  }
package/tsdown.config.ts CHANGED
@@ -1,8 +1,53 @@
1
1
  import { defineConfig } from 'tsdown';
2
2
 
3
- export default defineConfig({
4
- dts: false,
5
- entry: ['./src/index.ts'],
6
- format: ['esm'],
7
- outDir: 'dist',
8
- });
3
+ // css-tree's ESM files load .json data through createRequire(), which breaks
4
+ // once a consumer's bundler inlines them. Its dist bundle is self-contained,
5
+ // so the emitted ESM points there; the CJS output keeps plain 'css-tree',
6
+ // whose CJS build only uses static require() calls that bundlers handle.
7
+ // Only .mjs chunks are rewritten: declaration files must keep the bare
8
+ // specifier, the only module @types/css-tree declares.
9
+ const selfContainedCssTreeEsm = {
10
+ name: 'self-contained-css-tree-esm',
11
+ renderChunk(code: string, chunk: { fileName: string }) {
12
+ if (!chunk.fileName.endsWith('.mjs') || !code.includes('"css-tree"')) {
13
+ return null;
14
+ }
15
+ return {
16
+ code: code.replaceAll(
17
+ ' from "css-tree"',
18
+ ' from "css-tree/dist/csstree.esm"',
19
+ ),
20
+ map: null,
21
+ };
22
+ },
23
+ };
24
+
25
+ export default defineConfig([
26
+ {
27
+ dts: false,
28
+ entry: ['./src/cli/index.ts'],
29
+ format: ['esm'],
30
+ outDir: 'dist/cli',
31
+ },
32
+ {
33
+ dts: true,
34
+ entry: ['./src/index.ts'],
35
+ format: ['esm'],
36
+ outDir: 'dist',
37
+ unbundle: true,
38
+ deps: {
39
+ neverBundle: [/^react($|\/)/, /^react-dom($|\/)/],
40
+ },
41
+ plugins: [selfContainedCssTreeEsm],
42
+ },
43
+ {
44
+ dts: true,
45
+ entry: ['./src/index.ts'],
46
+ format: ['cjs'],
47
+ outDir: 'dist',
48
+ unbundle: true,
49
+ deps: {
50
+ neverBundle: [/^react($|\/)/, /^react-dom($|\/)/],
51
+ },
52
+ },
53
+ ]);
package/vitest.config.ts CHANGED
@@ -4,6 +4,7 @@ export default defineConfig({
4
4
  test: {
5
5
  globals: true,
6
6
  environment: 'happy-dom',
7
+ exclude: ['**/e2e/**', '**/node_modules/**'],
7
8
  },
8
9
  esbuild: {
9
10
  tsconfigRaw: {
@@ -0,0 +1,17 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ globals: true,
6
+ environment: 'happy-dom',
7
+ include: ['**/e2e/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
8
+ exclude: ['**/node_modules/**'],
9
+ },
10
+ esbuild: {
11
+ tsconfigRaw: {
12
+ compilerOptions: {
13
+ jsx: 'react-jsx',
14
+ },
15
+ },
16
+ },
17
+ });
@@ -1,269 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { getPackages } from '@manypkg/get-packages';
5
- import logSymbols from 'log-symbols';
6
- import { installDependencies, type PackageManagerName, runScript } from 'nypm';
7
- import ora from 'ora';
8
- import {
9
- type EmailsDirectory,
10
- getEmailsDirectoryMetadata,
11
- } from '../utils/get-emails-directory-metadata.js';
12
- import { getPreviewServerLocation } from '../utils/get-preview-server-location.js';
13
- import { registerSpinnerAutostopping } from '../utils/register-spinner-autostopping.js';
14
-
15
- interface Args {
16
- dir: string;
17
- packageManager: PackageManagerName;
18
- }
19
-
20
- const dirname = path.dirname(fileURLToPath(import.meta.url));
21
- const isInReactEmailMonorepo = !dirname.includes('node_modules');
22
-
23
- const setNextEnvironmentVariablesForBuild = async (
24
- emailsDirRelativePath: string,
25
- builtPreviewAppPath: string,
26
- usersProjectLocation: string,
27
- ) => {
28
- let rootDir = 'previewServerLocation';
29
- if (isInReactEmailMonorepo) {
30
- rootDir = `'${await getPackages(usersProjectLocation).then((p) => p.rootDir.replaceAll('\\', '/'))}'`;
31
- }
32
- const nextConfigContents = `
33
- import path from 'path';
34
- const emailsDirRelativePath = path.normalize('${emailsDirRelativePath}');
35
- const userProjectLocation = '${process.cwd().replaceAll('\\', '/')}';
36
- const previewServerLocation = '${builtPreviewAppPath.replaceAll('\\', '/')}';
37
- const rootDir = ${rootDir};
38
- /** @type {import('next').NextConfig} */
39
- const nextConfig = {
40
- env: {
41
- NEXT_PUBLIC_IS_BUILDING: 'true',
42
- REACT_EMAIL_INTERNAL_EMAILS_DIR_RELATIVE_PATH: emailsDirRelativePath,
43
- REACT_EMAIL_INTERNAL_EMAILS_DIR_ABSOLUTE_PATH: path.resolve(userProjectLocation, emailsDirRelativePath),
44
- REACT_EMAIL_INTERNAL_PREVIEW_SERVER_LOCATION: previewServerLocation,
45
- REACT_EMAIL_INTERNAL_USER_PROJECT_LOCATION: userProjectLocation
46
- },
47
- turbopack: {
48
- root: rootDir,
49
- },
50
- outputFileTracingRoot: rootDir,
51
- serverExternalPackages: ['esbuild'],
52
- typescript: {
53
- ignoreBuildErrors: true
54
- },
55
- staticPageGenerationTimeout: 600,
56
- }
57
-
58
- export default nextConfig`;
59
-
60
- await fs.promises.writeFile(
61
- path.resolve(builtPreviewAppPath, './next.config.mjs'),
62
- nextConfigContents,
63
- 'utf8',
64
- );
65
- };
66
-
67
- const getEmailSlugsFromEmailDirectory = (
68
- emailDirectory: EmailsDirectory,
69
- emailsDirectoryAbsolutePath: string,
70
- ) => {
71
- const directoryPathRelativeToEmailsDirectory = emailDirectory.absolutePath
72
- .replace(emailsDirectoryAbsolutePath, '')
73
- .trim();
74
-
75
- const slugs = [] as Array<string>[];
76
- for (const filename of emailDirectory.emailFilenames) {
77
- slugs.push(
78
- path
79
- .join(directoryPathRelativeToEmailsDirectory, filename)
80
- .split(path.sep)
81
- // sometimes it gets empty segments due to trailing slashes
82
- .filter((segment) => segment.length > 0),
83
- );
84
- }
85
- for (const directory of emailDirectory.subDirectories) {
86
- slugs.push(
87
- ...getEmailSlugsFromEmailDirectory(
88
- directory,
89
- emailsDirectoryAbsolutePath,
90
- ),
91
- );
92
- }
93
-
94
- return slugs;
95
- };
96
-
97
- // we do this because otherwise it won't be able to find the emails
98
- // after build
99
- const forceSSGForEmailPreviews = async (
100
- emailsDirPath: string,
101
- builtPreviewAppPath: string,
102
- ) => {
103
- const emailDirectoryMetadata = (await getEmailsDirectoryMetadata(
104
- emailsDirPath,
105
- ))!;
106
-
107
- const parameters = getEmailSlugsFromEmailDirectory(
108
- emailDirectoryMetadata,
109
- emailsDirPath,
110
- ).map((slug) => ({ slug }));
111
-
112
- const removeForceDynamic = async (filePath: string) => {
113
- const contents = await fs.promises.readFile(filePath, 'utf8');
114
-
115
- await fs.promises.writeFile(
116
- filePath,
117
- contents.replace("export const dynamic = 'force-dynamic';", ''),
118
- 'utf8',
119
- );
120
- };
121
- await removeForceDynamic(
122
- path.resolve(builtPreviewAppPath, './src/app/layout.tsx'),
123
- );
124
- await removeForceDynamic(
125
- path.resolve(builtPreviewAppPath, './src/app/preview/[...slug]/page.tsx'),
126
- );
127
-
128
- await fs.promises.appendFile(
129
- path.resolve(builtPreviewAppPath, './src/app/preview/[...slug]/page.tsx'),
130
- `
131
-
132
- export function generateStaticParams() {
133
- return Promise.resolve(
134
- ${JSON.stringify(parameters)}
135
- );
136
- }`,
137
- 'utf8',
138
- );
139
- };
140
-
141
- const updatePackageJson = async (builtPreviewAppPath: string) => {
142
- const packageJsonPath = path.resolve(builtPreviewAppPath, './package.json');
143
- const packageJson = JSON.parse(
144
- await fs.promises.readFile(packageJsonPath, 'utf8'),
145
- ) as {
146
- name: string;
147
- scripts: Record<string, string>;
148
- dependencies: Record<string, string>;
149
- devDependencies: Record<string, string>;
150
- };
151
- // Turbopack has some errors with the imports in @react-email/tailwind
152
- packageJson.scripts.build =
153
- 'cross-env NODE_OPTIONS="--experimental-vm-modules --disable-warning=ExperimentalWarning" next build';
154
- packageJson.scripts.start =
155
- 'cross-env NODE_OPTIONS="--experimental-vm-modules --disable-warning=ExperimentalWarning" next start';
156
- delete packageJson.scripts.postbuild;
157
-
158
- packageJson.name = 'preview-server';
159
-
160
- for (const [dependency, version] of Object.entries(
161
- packageJson.devDependencies,
162
- )) {
163
- packageJson.devDependencies[dependency] = version.replace('workspace:', '');
164
- }
165
-
166
- delete packageJson.devDependencies['@react-email/components'];
167
- delete packageJson.scripts.prepare;
168
-
169
- await fs.promises.writeFile(
170
- packageJsonPath,
171
- JSON.stringify(packageJson),
172
- 'utf8',
173
- );
174
- };
175
-
176
- export const build = async ({
177
- dir: emailsDirRelativePath,
178
- packageManager,
179
- }: Args) => {
180
- try {
181
- const usersProjectLocation = process.cwd();
182
- const previewServerLocation = await getPreviewServerLocation();
183
-
184
- const spinner = ora({
185
- text: 'Starting build process...',
186
- prefixText: ' ',
187
- }).start();
188
- registerSpinnerAutostopping(spinner);
189
-
190
- spinner.text = `Checking if ${emailsDirRelativePath} folder exists`;
191
- if (!fs.existsSync(emailsDirRelativePath)) {
192
- process.exit(1);
193
- }
194
-
195
- const emailsDirPath = path.join(
196
- usersProjectLocation,
197
- emailsDirRelativePath,
198
- );
199
- const staticPath = path.join(emailsDirPath, 'static');
200
-
201
- const builtPreviewAppPath = path.join(usersProjectLocation, '.react-email');
202
-
203
- if (fs.existsSync(builtPreviewAppPath)) {
204
- spinner.text = 'Deleting pre-existing `.react-email` folder';
205
- await fs.promises.rm(builtPreviewAppPath, { recursive: true });
206
- }
207
-
208
- spinner.text = 'Copying preview app from CLI to `.react-email`';
209
- await fs.promises.cp(previewServerLocation, builtPreviewAppPath, {
210
- recursive: true,
211
- filter: (source: string) => {
212
- const relativeSource = path.relative(previewServerLocation, source);
213
- return (
214
- !/\.next/.test(relativeSource) &&
215
- !/\.turbo/.test(relativeSource) &&
216
- (isInReactEmailMonorepo || !/node_modules/.test(relativeSource))
217
- );
218
- },
219
- });
220
-
221
- if (fs.existsSync(staticPath)) {
222
- spinner.text =
223
- 'Copying `static` folder into `.react-email/public/static`';
224
- const builtStaticDirectory = path.resolve(
225
- builtPreviewAppPath,
226
- './public/static',
227
- );
228
- await fs.promises.cp(staticPath, builtStaticDirectory, {
229
- recursive: true,
230
- });
231
- }
232
-
233
- spinner.text =
234
- 'Setting Next environment variables for preview app to work properly';
235
- await setNextEnvironmentVariablesForBuild(
236
- emailsDirRelativePath,
237
- builtPreviewAppPath,
238
- usersProjectLocation,
239
- );
240
-
241
- spinner.text = 'Setting server side generation for the email preview pages';
242
- await forceSSGForEmailPreviews(emailsDirPath, builtPreviewAppPath);
243
-
244
- spinner.text = "Updating package.json's build and start scripts";
245
- await updatePackageJson(builtPreviewAppPath);
246
-
247
- if (!isInReactEmailMonorepo) {
248
- spinner.text = 'Installing dependencies on `.react-email`';
249
- await installDependencies({
250
- cwd: builtPreviewAppPath,
251
- silent: true,
252
- packageManager,
253
- });
254
- }
255
-
256
- spinner.stopAndPersist({
257
- text: 'Successfully prepared `.react-email` for `next build`',
258
- symbol: logSymbols.success,
259
- });
260
-
261
- await runScript('build', {
262
- packageManager,
263
- cwd: builtPreviewAppPath,
264
- });
265
- } catch (error) {
266
- console.log(error);
267
- process.exit(1);
268
- }
269
- };
@@ -1,27 +0,0 @@
1
- import fs from 'node:fs';
2
- import { setupHotreloading, startDevServer } from '../utils/index.js';
3
-
4
- interface Args {
5
- dir: string;
6
- port: string;
7
- }
8
-
9
- export const dev = async ({ dir: emailsDirRelativePath, port }: Args) => {
10
- try {
11
- if (!fs.existsSync(emailsDirRelativePath)) {
12
- console.error(`Missing ${emailsDirRelativePath} folder`);
13
- process.exit(1);
14
- }
15
-
16
- const devServer = await startDevServer(
17
- emailsDirRelativePath,
18
- emailsDirRelativePath, // defaults to ./emails/static for the static files that are served to the preview
19
- Number.parseInt(port, 10),
20
- );
21
-
22
- await setupHotreloading(devServer, emailsDirRelativePath);
23
- } catch (error) {
24
- console.log(error);
25
- process.exit(1);
26
- }
27
- };