react-email 1.7.15 → 1.8.0-canary.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 (95) hide show
  1. package/dist/package.json +4 -1
  2. package/dist/source/commands/dev.js +7 -175
  3. package/dist/source/commands/export.js +4 -3
  4. package/dist/source/utils/constants.d.ts +1 -2
  5. package/dist/source/utils/constants.js +3 -4
  6. package/dist/source/utils/convert-to-absolute-path.d.ts +1 -0
  7. package/dist/source/utils/convert-to-absolute-path.js +9 -0
  8. package/dist/source/utils/download-client.d.ts +1 -0
  9. package/dist/source/utils/download-client.js +26 -0
  10. package/dist/source/utils/generate-email-preview.d.ts +1 -0
  11. package/dist/source/utils/generate-email-preview.js +65 -0
  12. package/dist/source/utils/index.d.ts +6 -4
  13. package/dist/source/utils/index.js +6 -4
  14. package/dist/source/utils/install-dependencies.d.ts +2 -0
  15. package/dist/source/utils/install-dependencies.js +21 -0
  16. package/dist/source/utils/run-server.d.ts +1 -0
  17. package/dist/source/utils/run-server.js +23 -0
  18. package/dist/source/utils/start-server-command.d.ts +1 -0
  19. package/dist/source/utils/start-server-command.js +11 -0
  20. package/dist/source/utils/sync-package.d.ts +1 -0
  21. package/dist/source/utils/sync-package.js +23 -0
  22. package/package.json +4 -1
  23. package/source/commands/dev.ts +8 -234
  24. package/source/commands/export.ts +2 -2
  25. package/source/utils/constants.ts +2 -6
  26. package/source/utils/convert-to-absolute-path.ts +4 -0
  27. package/source/utils/download-client.ts +28 -0
  28. package/source/utils/generate-email-preview.ts +78 -0
  29. package/source/utils/index.ts +6 -4
  30. package/source/utils/install-dependencies.ts +18 -0
  31. package/source/utils/run-server.ts +28 -0
  32. package/source/utils/start-server-command.ts +5 -0
  33. package/source/utils/sync-package.ts +20 -0
  34. package/dist/source/_preview/components.d.ts +0 -4
  35. package/dist/source/_preview/components.js +0 -77
  36. package/dist/source/_preview/pages.d.ts +0 -9
  37. package/dist/source/_preview/pages.js +0 -22
  38. package/dist/source/_preview/root.d.ts +0 -4
  39. package/dist/source/_preview/root.js +0 -29
  40. package/dist/source/_preview/styles.d.ts +0 -4
  41. package/dist/source/_preview/styles.js +0 -9
  42. package/dist/source/_preview/utils.d.ts +0 -4
  43. package/dist/source/_preview/utils.js +0 -25
  44. package/dist/source/utils/check-directory-exist.d.ts +0 -1
  45. package/dist/source/utils/check-directory-exist.js +0 -9
  46. package/dist/source/utils/check-empty-directory.d.ts +0 -1
  47. package/dist/source/utils/check-empty-directory.js +0 -12
  48. package/dist/source/utils/check-is-up-to-date.d.ts +0 -2
  49. package/dist/source/utils/check-is-up-to-date.js +0 -26
  50. package/dist/source/utils/create-directory.d.ts +0 -1
  51. package/dist/source/utils/create-directory.js +0 -9
  52. package/preview/next-env.d.ts +0 -5
  53. package/preview/next.config.js +0 -9
  54. package/preview/package.json +0 -43
  55. package/preview/postcss.config.js +0 -6
  56. package/preview/src/components/button.tsx +0 -85
  57. package/preview/src/components/code-container.tsx +0 -135
  58. package/preview/src/components/code.tsx +0 -112
  59. package/preview/src/components/heading.tsx +0 -114
  60. package/preview/src/components/icon-base.tsx +0 -26
  61. package/preview/src/components/icon-button.tsx +0 -23
  62. package/preview/src/components/icon-check.tsx +0 -18
  63. package/preview/src/components/icon-clipboard.tsx +0 -39
  64. package/preview/src/components/icon-download.tsx +0 -18
  65. package/preview/src/components/index.ts +0 -7
  66. package/preview/src/components/layout.tsx +0 -52
  67. package/preview/src/components/logo.tsx +0 -71
  68. package/preview/src/components/send.tsx +0 -118
  69. package/preview/src/components/sidebar.tsx +0 -164
  70. package/preview/src/components/text.tsx +0 -100
  71. package/preview/src/components/tooltip-content.tsx +0 -32
  72. package/preview/src/components/tooltip.tsx +0 -19
  73. package/preview/src/components/topbar.tsx +0 -117
  74. package/preview/src/pages/_app.tsx +0 -26
  75. package/preview/src/pages/_document.tsx +0 -13
  76. package/preview/src/pages/index.tsx +0 -54
  77. package/preview/src/pages/preview/[slug].tsx +0 -127
  78. package/preview/src/styles/globals.css +0 -3
  79. package/preview/src/utils/as.ts +0 -26
  80. package/preview/src/utils/copy-text-to-clipboard.ts +0 -7
  81. package/preview/src/utils/index.ts +0 -3
  82. package/preview/src/utils/language-map.ts +0 -7
  83. package/preview/src/utils/unreachable.ts +0 -6
  84. package/preview/tailwind.config.js +0 -90
  85. package/preview/tsconfig.json +0 -31
  86. package/scripts/prepare-preview.ts +0 -178
  87. package/source/_preview/components.ts +0 -92
  88. package/source/_preview/pages.ts +0 -23
  89. package/source/_preview/root.ts +0 -32
  90. package/source/_preview/styles.ts +0 -6
  91. package/source/_preview/utils.ts +0 -27
  92. package/source/utils/check-directory-exist.ts +0 -4
  93. package/source/utils/check-empty-directory.ts +0 -6
  94. package/source/utils/check-is-up-to-date.ts +0 -23
  95. package/source/utils/create-directory.ts +0 -4
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-email",
3
- "version": "1.7.15",
3
+ "version": "1.8.0-canary.1",
4
4
  "description": "A live preview of your emails right in your browser.",
5
5
  "bin": {
6
6
  "email": "./dist/source/index.js"
@@ -31,11 +31,13 @@
31
31
  "dependencies": {
32
32
  "@commander-js/extra-typings": "9.4.1",
33
33
  "@manypkg/find-root": "2.1.0",
34
+ "@octokit/rest": "19.0.7",
34
35
  "@react-email/render": "0.0.6",
35
36
  "chokidar": "3.5.3",
36
37
  "commander": "9.4.1",
37
38
  "detect-package-manager": "2.0.1",
38
39
  "esbuild": "0.16.4",
40
+ "fs-extra": "11.1.0",
39
41
  "glob": "8.0.3",
40
42
  "log-symbols": "4.1.0",
41
43
  "normalize-path": "3.0.0",
@@ -45,6 +47,7 @@
45
47
  "tree-node-cli": "1.6.0"
46
48
  },
47
49
  "devDependencies": {
50
+ "@types/fs-extra": "11.0.1",
48
51
  "@types/node": "18.11.9",
49
52
  "@types/normalize-path": "3.0.0",
50
53
  "@types/shelljs": "0.8.11",
@@ -5,189 +5,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.dev = void 0;
7
7
  const utils_1 = require("../utils");
8
- const path_1 = __importDefault(require("path"));
9
8
  const fs_1 = __importDefault(require("fs"));
10
- const components_1 = require("../_preview/components");
11
- const utils_2 = require("../_preview/utils");
12
- const root_1 = require("../_preview/root");
13
- const pages_1 = require("../_preview/pages");
14
- const detect_package_manager_1 = require("detect-package-manager");
15
- const log_symbols_1 = __importDefault(require("log-symbols"));
16
- const find_root_1 = require("@manypkg/find-root");
17
- const ora_1 = __importDefault(require("ora"));
18
- const read_pkg_1 = __importDefault(require("read-pkg"));
19
9
  const shelljs_1 = __importDefault(require("shelljs"));
20
- const styles_1 = require("../_preview/styles");
10
+ const run_server_1 = require("../utils/run-server");
21
11
  const dev = async ({ dir, port }) => {
22
- const emailDir = convertToAbsolutePath(dir);
23
- const watcherInstance = (0, utils_1.createWatcherInstance)(emailDir);
24
12
  try {
25
- const hasReactEmailDirectory = (0, utils_1.checkDirectoryExist)(utils_1.REACT_EMAIL_ROOT);
26
- const cwd = await (0, find_root_1.findRoot)(utils_1.CURRENT_PATH).catch(() => ({
27
- rootDir: utils_1.CURRENT_PATH,
28
- }));
29
- const packageManager = await (0, detect_package_manager_1.detect)({
30
- cwd: cwd.rootDir,
31
- }).catch(() => 'npm');
32
- if (hasReactEmailDirectory) {
33
- const isUpToDate = await (0, utils_1.checkPackageIsUpToDate)();
34
- if (isUpToDate) {
35
- await Promise.all([generateEmailsPreview(emailDir), syncPkg()]);
36
- await installDependencies(packageManager);
37
- startDevServer(packageManager, port);
38
- (0, utils_1.watcher)(watcherInstance, emailDir);
39
- return;
40
- }
41
- await fs_1.default.promises.rm(utils_1.REACT_EMAIL_ROOT, { recursive: true });
13
+ if (fs_1.default.existsSync(utils_1.REACT_EMAIL_ROOT)) {
14
+ await (0, run_server_1.runServer)(dir, port);
15
+ return;
42
16
  }
43
- await createBasicStructure();
44
- await createAppDirectories();
45
- await createAppFiles();
46
- await Promise.all([generateEmailsPreview(emailDir), syncPkg()]);
47
- await installDependencies(packageManager);
48
- startDevServer(packageManager, port);
49
- (0, utils_1.watcher)(watcherInstance, emailDir);
17
+ await (0, utils_1.downloadClient)();
18
+ await (0, run_server_1.runServer)(dir, port);
50
19
  }
51
20
  catch (error) {
52
- await watcherInstance.close();
21
+ console.log(error);
53
22
  shelljs_1.default.exit(1);
54
23
  }
55
24
  };
56
25
  exports.dev = dev;
57
- const startDevServer = (packageManager, port) => {
58
- shelljs_1.default.exec(`${packageManager} run dev -- -p ${port}`, { async: true });
59
- };
60
- const convertToAbsolutePath = (dir) => path_1.default.isAbsolute(dir) ? dir : path_1.default.join(process.cwd(), dir);
61
- const createBasicStructure = async () => {
62
- try {
63
- // Create `.react-email` directory
64
- await (0, utils_1.createDirectory)(utils_1.REACT_EMAIL_ROOT);
65
- // Create `src` and `public` directories
66
- await Promise.all([
67
- (0, utils_1.createDirectory)(utils_1.SRC_PATH),
68
- (0, utils_1.createDirectory)(utils_1.PUBLIC_PATH),
69
- ]);
70
- }
71
- catch (error) {
72
- throw new Error('Error creating the basic structure');
73
- }
74
- };
75
- const createAppDirectories = async () => {
76
- try {
77
- await Promise.all([
78
- (0, utils_1.createDirectory)(path_1.default.join(utils_1.SRC_PATH, 'components')),
79
- (0, utils_1.createDirectory)(path_1.default.join(utils_1.SRC_PATH, 'utils')),
80
- (0, utils_1.createDirectory)(path_1.default.join(utils_1.SRC_PATH, 'pages')),
81
- (0, utils_1.createDirectory)(path_1.default.join(utils_1.SRC_PATH, 'styles')),
82
- ]);
83
- }
84
- catch (error) {
85
- throw new Error('Error creating app directories');
86
- }
87
- };
88
- const createAppFiles = async () => {
89
- try {
90
- const creation = (appFiles, name) => {
91
- return appFiles.map((file) => {
92
- const location = name
93
- ? `${utils_1.SRC_PATH}/${name}/${file.title}`
94
- : `${utils_1.REACT_EMAIL_ROOT}/${file.title}`;
95
- return fs_1.default.promises.writeFile(location, file.content);
96
- });
97
- };
98
- const pageCreation = pages_1.pages.map(async (page) => {
99
- const location = page.dir
100
- ? `${utils_1.SRC_PATH}/pages/${page.dir}/${page.title}`
101
- : `${utils_1.SRC_PATH}/pages/${page.title}`;
102
- if (page.dir) {
103
- await (0, utils_1.createDirectory)(`${utils_1.SRC_PATH}/pages/${page.dir}`);
104
- }
105
- return fs_1.default.promises.writeFile(location, page.content);
106
- });
107
- await Promise.all([
108
- ...creation(utils_2.utils, 'utils'),
109
- ...creation(components_1.components, 'components'),
110
- ...creation(styles_1.styles, 'styles'),
111
- ...creation(root_1.root),
112
- ...pageCreation,
113
- ]);
114
- }
115
- catch (error) {
116
- throw new Error('Error creating app files');
117
- }
118
- };
119
- const generateEmailsPreview = async (emailDir) => {
120
- try {
121
- const spinner = (0, ora_1.default)('Generating emails preview').start();
122
- await createEmailPreviews(emailDir);
123
- await createStaticFiles(emailDir);
124
- spinner.stopAndPersist({
125
- symbol: log_symbols_1.default.success,
126
- text: 'Emails preview generated',
127
- });
128
- }
129
- catch (error) {
130
- console.log({ error });
131
- }
132
- };
133
- const createEmailPreviews = async (emailDir) => {
134
- const hasEmailsDirectory = (0, utils_1.checkDirectoryExist)(emailDir);
135
- if (hasEmailsDirectory) {
136
- await (0, utils_1.checkEmptyDirectory)(emailDir);
137
- }
138
- const hasPackageEmailsDirectory = (0, utils_1.checkDirectoryExist)(utils_1.PACKAGE_EMAILS_PATH);
139
- if (hasPackageEmailsDirectory) {
140
- await fs_1.default.promises.rm(utils_1.PACKAGE_EMAILS_PATH, { recursive: true });
141
- }
142
- const result = shelljs_1.default.cp('-r', emailDir, utils_1.PACKAGE_EMAILS_PATH);
143
- if (result.code > 0) {
144
- throw new Error(`Something went wrong while copying the file to ${utils_1.PACKAGE_EMAILS_PATH}, ${result.cat()}`);
145
- }
146
- };
147
- const createStaticFiles = async (emailDir) => {
148
- const reactEmailPublicFolder = path_1.default.join(utils_1.REACT_EMAIL_ROOT, 'public', 'static');
149
- const hasPackageStaticDirectory = (0, utils_1.checkDirectoryExist)(reactEmailPublicFolder);
150
- if (hasPackageStaticDirectory) {
151
- await fs_1.default.promises.rm(reactEmailPublicFolder, {
152
- recursive: true,
153
- });
154
- }
155
- // Make sure that the "static" folder does not exists in .react-email/emails
156
- // since it should only exists in .react-email/public, but the "createEmailPreviews"-function will blindly copy the complete emails folder
157
- const reactEmailEmailStaticFolder = path_1.default.join(utils_1.REACT_EMAIL_ROOT, 'emails', 'static');
158
- const hasPackageStaticDirectoryInEmails = (0, utils_1.checkDirectoryExist)(reactEmailEmailStaticFolder);
159
- if (hasPackageStaticDirectoryInEmails) {
160
- await fs_1.default.promises.rm(reactEmailEmailStaticFolder, {
161
- recursive: true,
162
- });
163
- }
164
- const staticDir = path_1.default.join(emailDir, 'static');
165
- const hasStaticDirectory = (0, utils_1.checkDirectoryExist)(staticDir);
166
- if (hasStaticDirectory) {
167
- const result = shelljs_1.default.cp('-r', staticDir, reactEmailPublicFolder);
168
- if (result.code > 0) {
169
- throw new Error(`Something went wrong while copying the file to ${reactEmailPublicFolder}, ${result.cat()}`);
170
- }
171
- }
172
- };
173
- const syncPkg = async () => {
174
- const previewPkg = (0, utils_1.getPreviewPkg)();
175
- const clientPkg = await (0, read_pkg_1.default)();
176
- const pkg = {
177
- ...previewPkg,
178
- dependencies: {
179
- ...previewPkg.dependencies,
180
- ...clientPkg.dependencies,
181
- },
182
- };
183
- await fs_1.default.promises.writeFile(path_1.default.join(utils_1.REACT_EMAIL_ROOT, 'package.json'), JSON.stringify(pkg));
184
- };
185
- const installDependencies = async (packageManager) => {
186
- const spinner = (0, ora_1.default)('Installing dependencies...\n').start();
187
- shelljs_1.default.cd(path_1.default.join(utils_1.REACT_EMAIL_ROOT));
188
- shelljs_1.default.exec(`${packageManager} install`);
189
- spinner.stopAndPersist({
190
- symbol: log_symbols_1.default.success,
191
- text: 'Dependencies installed',
192
- });
193
- };
@@ -35,15 +35,16 @@ const log_symbols_1 = __importDefault(require("log-symbols"));
35
35
  const render_1 = require("@react-email/render");
36
36
  const fs_1 = require("fs");
37
37
  const normalize_path_1 = __importDefault(require("normalize-path"));
38
- const utils_1 = require("../utils");
39
38
  const path_1 = __importDefault(require("path"));
40
39
  const shelljs_1 = __importDefault(require("shelljs"));
40
+ const fs_2 = __importDefault(require("fs"));
41
41
  /*
42
42
  This first builds all the templates using esbuild and then puts the output in the `.js`
43
43
  files. Then these `.js` files are imported dynamically and rendered to `.html` files
44
44
  using the `render` function.
45
45
  */
46
46
  const exportTemplates = async (outDir, srcDir, options) => {
47
+ var _a;
47
48
  const spinner = (0, ora_1.default)('Preparing files...\n').start();
48
49
  const allTemplates = glob_1.glob.sync((0, normalize_path_1.default)(path_1.default.join(srcDir, '*.{tsx,jsx}')));
49
50
  esbuild_1.default.buildSync({
@@ -57,14 +58,14 @@ const exportTemplates = async (outDir, srcDir, options) => {
57
58
  absolute: true,
58
59
  });
59
60
  for (const template of allBuiltTemplates) {
60
- const component = await Promise.resolve().then(() => __importStar(require(template)));
61
+ const component = await (_a = template, Promise.resolve().then(() => __importStar(require(_a))));
61
62
  const rendered = (0, render_1.render)(component.default(), options);
62
63
  const htmlPath = template.replace('.js', options.plainText ? '.txt' : '.html');
63
64
  (0, fs_1.writeFileSync)(htmlPath, rendered);
64
65
  (0, fs_1.unlinkSync)(template);
65
66
  }
66
67
  const staticDir = path_1.default.join(srcDir, 'static');
67
- const hasStaticDirectory = (0, utils_1.checkDirectoryExist)(staticDir);
68
+ const hasStaticDirectory = fs_2.default.existsSync(staticDir);
68
69
  if (hasStaticDirectory) {
69
70
  const result = shelljs_1.default.cp('-r', staticDir, path_1.default.join(outDir, 'static'));
70
71
  if (result.code > 0) {
@@ -1,10 +1,9 @@
1
1
  export declare const DEFAULT_EMAILS_DIRECTORY = "emails";
2
2
  export declare const PACKAGE_NAME = "react-email";
3
3
  export declare const CURRENT_PATH: string;
4
- export declare const CLIENT_PACKAGE_JSON: string;
4
+ export declare const USER_PACKAGE_JSON: string;
5
5
  export declare const REACT_EMAIL_ROOT: string;
6
6
  export declare const SRC_PATH: string;
7
7
  export declare const PUBLIC_PATH: string;
8
8
  export declare const EVENT_FILE_DELETED = "unlink";
9
- export declare const CLIENT_EMAILS_PATH: string;
10
9
  export declare const PACKAGE_EMAILS_PATH: string;
@@ -3,20 +3,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PACKAGE_EMAILS_PATH = exports.CLIENT_EMAILS_PATH = exports.EVENT_FILE_DELETED = exports.PUBLIC_PATH = exports.SRC_PATH = exports.REACT_EMAIL_ROOT = exports.CLIENT_PACKAGE_JSON = exports.CURRENT_PATH = exports.PACKAGE_NAME = exports.DEFAULT_EMAILS_DIRECTORY = void 0;
6
+ exports.PACKAGE_EMAILS_PATH = exports.EVENT_FILE_DELETED = exports.PUBLIC_PATH = exports.SRC_PATH = exports.REACT_EMAIL_ROOT = exports.USER_PACKAGE_JSON = exports.CURRENT_PATH = exports.PACKAGE_NAME = exports.DEFAULT_EMAILS_DIRECTORY = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  // Package variables
9
9
  exports.DEFAULT_EMAILS_DIRECTORY = 'emails';
10
10
  exports.PACKAGE_NAME = 'react-email';
11
11
  // Default paths
12
12
  exports.CURRENT_PATH = process.cwd();
13
- // Client paths
14
- exports.CLIENT_PACKAGE_JSON = path_1.default.join(exports.CURRENT_PATH, 'package.json');
13
+ // User paths
14
+ exports.USER_PACKAGE_JSON = path_1.default.join(exports.CURRENT_PATH, 'package.json');
15
15
  // React Email paths
16
16
  exports.REACT_EMAIL_ROOT = path_1.default.join(exports.CURRENT_PATH, '.react-email');
17
17
  exports.SRC_PATH = path_1.default.join(exports.REACT_EMAIL_ROOT, 'src');
18
18
  exports.PUBLIC_PATH = path_1.default.join(exports.REACT_EMAIL_ROOT, 'public');
19
19
  // Events
20
20
  exports.EVENT_FILE_DELETED = 'unlink';
21
- exports.CLIENT_EMAILS_PATH = path_1.default.join(exports.CURRENT_PATH, exports.DEFAULT_EMAILS_DIRECTORY);
22
21
  exports.PACKAGE_EMAILS_PATH = path_1.default.join(exports.REACT_EMAIL_ROOT, exports.DEFAULT_EMAILS_DIRECTORY);
@@ -0,0 +1 @@
1
+ export declare const convertToAbsolutePath: (dir: string) => string;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.convertToAbsolutePath = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const convertToAbsolutePath = (dir) => path_1.default.isAbsolute(dir) ? dir : path_1.default.join(process.cwd(), dir);
9
+ exports.convertToAbsolutePath = convertToAbsolutePath;
@@ -0,0 +1 @@
1
+ export declare const downloadClient: () => Promise<void>;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.downloadClient = void 0;
7
+ const rest_1 = require("@octokit/rest");
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const shelljs_1 = __importDefault(require("shelljs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const downloadClient = async () => {
13
+ const octokit = new rest_1.Octokit();
14
+ const downloadRes = await octokit.repos.downloadTarballArchive({
15
+ owner: 'resendlabs',
16
+ repo: 'react-email',
17
+ ref: 'v0.0.11',
18
+ });
19
+ fs_1.default.mkdirSync('.react-email-temp');
20
+ const TAR_PATH = path_1.default.join('.react-email-temp', 'react-email.tar.gz');
21
+ fs_1.default.writeFileSync(TAR_PATH, Buffer.from(downloadRes.data));
22
+ shelljs_1.default.exec(`tar -xzvf .react-email-temp/react-email.tar.gz -C .react-email-temp --strip-components 1`, { silent: true });
23
+ fs_extra_1.default.moveSync(path_1.default.join('.react-email-temp', 'client'), path_1.default.join('.react-email'));
24
+ fs_extra_1.default.removeSync('.react-email-temp');
25
+ };
26
+ exports.downloadClient = downloadClient;
@@ -0,0 +1 @@
1
+ export declare const generateEmailsPreview: (emailDir: string) => Promise<void>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateEmailsPreview = void 0;
7
+ const log_symbols_1 = __importDefault(require("log-symbols"));
8
+ const constants_1 = require("./constants");
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const ora_1 = __importDefault(require("ora"));
11
+ const shelljs_1 = __importDefault(require("shelljs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const fs_extra_1 = __importDefault(require("fs-extra"));
14
+ const generateEmailsPreview = async (emailDir) => {
15
+ try {
16
+ const spinner = (0, ora_1.default)('Generating emails preview').start();
17
+ await createEmailPreviews(emailDir);
18
+ await createStaticFiles(emailDir);
19
+ spinner.stopAndPersist({
20
+ symbol: log_symbols_1.default.success,
21
+ text: 'Emails preview generated',
22
+ });
23
+ }
24
+ catch (error) {
25
+ console.log({ error });
26
+ }
27
+ };
28
+ exports.generateEmailsPreview = generateEmailsPreview;
29
+ const createEmailPreviews = async (emailDir) => {
30
+ const hasPackageEmailsDirectory = fs_1.default.existsSync(constants_1.PACKAGE_EMAILS_PATH);
31
+ if (hasPackageEmailsDirectory) {
32
+ await fs_1.default.promises.rm(constants_1.PACKAGE_EMAILS_PATH, { recursive: true });
33
+ }
34
+ const result = shelljs_1.default.cp('-r', emailDir, constants_1.PACKAGE_EMAILS_PATH);
35
+ if (result.code > 0) {
36
+ throw new Error(`Something went wrong while copying the file to ${constants_1.PACKAGE_EMAILS_PATH}, ${result.cat()}`);
37
+ }
38
+ };
39
+ const createStaticFiles = async (emailDir) => {
40
+ const reactEmailPublicFolder = path_1.default.join(constants_1.REACT_EMAIL_ROOT, 'public');
41
+ fs_extra_1.default.ensureDir(reactEmailPublicFolder);
42
+ const hasPackageStaticDirectory = fs_1.default.existsSync(reactEmailPublicFolder);
43
+ if (hasPackageStaticDirectory) {
44
+ await fs_1.default.promises.rm(reactEmailPublicFolder, {
45
+ recursive: true,
46
+ });
47
+ }
48
+ // Make sure that the "static" folder does not exists in .react-email/emails
49
+ // since it should only exists in .react-email/public, but the "createEmailPreviews"-function will blindly copy the complete emails folder
50
+ const reactEmailEmailStaticFolder = path_1.default.join(constants_1.REACT_EMAIL_ROOT, 'emails', 'static');
51
+ const hasPackageStaticDirectoryInEmails = fs_1.default.existsSync(reactEmailEmailStaticFolder);
52
+ if (hasPackageStaticDirectoryInEmails) {
53
+ await fs_1.default.promises.rm(reactEmailEmailStaticFolder, {
54
+ recursive: true,
55
+ });
56
+ }
57
+ const staticDir = path_1.default.join(emailDir, 'static');
58
+ const hasStaticDirectory = fs_1.default.existsSync(staticDir);
59
+ if (hasStaticDirectory) {
60
+ const result = shelljs_1.default.cp('-r', staticDir, reactEmailPublicFolder);
61
+ if (result.code > 0) {
62
+ throw new Error(`Something went wrong while copying the file to ${reactEmailPublicFolder}, ${result.cat()}`);
63
+ }
64
+ }
65
+ };
@@ -1,6 +1,8 @@
1
- export * from './check-directory-exist';
2
- export * from './check-empty-directory';
3
- export * from './check-is-up-to-date';
4
1
  export * from './constants';
5
- export * from './create-directory';
2
+ export * from './convert-to-absolute-path';
3
+ export * from './download-client';
4
+ export * from './generate-email-preview';
5
+ export * from './install-dependencies';
6
+ export * from './start-server-command';
7
+ export * from './sync-package';
6
8
  export * from './watcher';
@@ -14,9 +14,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./check-directory-exist"), exports);
18
- __exportStar(require("./check-empty-directory"), exports);
19
- __exportStar(require("./check-is-up-to-date"), exports);
20
17
  __exportStar(require("./constants"), exports);
21
- __exportStar(require("./create-directory"), exports);
18
+ __exportStar(require("./convert-to-absolute-path"), exports);
19
+ __exportStar(require("./download-client"), exports);
20
+ __exportStar(require("./generate-email-preview"), exports);
21
+ __exportStar(require("./install-dependencies"), exports);
22
+ __exportStar(require("./start-server-command"), exports);
23
+ __exportStar(require("./sync-package"), exports);
22
24
  __exportStar(require("./watcher"), exports);
@@ -0,0 +1,2 @@
1
+ export type PackageManager = 'yarn' | 'npm' | 'pnpm';
2
+ export declare const installDependencies: (packageManager: PackageManager) => Promise<void>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.installDependencies = void 0;
7
+ const shelljs_1 = __importDefault(require("shelljs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const constants_1 = require("./constants");
10
+ const ora_1 = __importDefault(require("ora"));
11
+ const log_symbols_1 = __importDefault(require("log-symbols"));
12
+ const installDependencies = async (packageManager) => {
13
+ const spinner = (0, ora_1.default)('Installing dependencies...\n').start();
14
+ shelljs_1.default.cd(path_1.default.join(constants_1.REACT_EMAIL_ROOT));
15
+ shelljs_1.default.exec(`${packageManager} install`);
16
+ spinner.stopAndPersist({
17
+ symbol: log_symbols_1.default.success,
18
+ text: 'Dependencies installed',
19
+ });
20
+ };
21
+ exports.installDependencies = installDependencies;
@@ -0,0 +1 @@
1
+ export declare const runServer: (dir: string, port: string) => Promise<void>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runServer = void 0;
4
+ const watcher_1 = require("./watcher");
5
+ const detect_package_manager_1 = require("detect-package-manager");
6
+ const find_root_1 = require("@manypkg/find-root");
7
+ const _1 = require(".");
8
+ const runServer = async (dir, port) => {
9
+ const emailDir = (0, _1.convertToAbsolutePath)(dir);
10
+ const watcherInstance = (0, watcher_1.createWatcherInstance)(emailDir);
11
+ const cwd = await (0, find_root_1.findRoot)(_1.CURRENT_PATH).catch(() => ({
12
+ rootDir: _1.CURRENT_PATH,
13
+ }));
14
+ const packageManager = await (0, detect_package_manager_1.detect)({
15
+ cwd: cwd.rootDir,
16
+ }).catch(() => 'npm');
17
+ await (0, _1.generateEmailsPreview)(emailDir);
18
+ await (0, _1.syncPkg)();
19
+ await (0, _1.installDependencies)(packageManager);
20
+ (0, _1.startDevServer)(packageManager, port);
21
+ (0, watcher_1.watcher)(watcherInstance, emailDir);
22
+ };
23
+ exports.runServer = runServer;
@@ -0,0 +1 @@
1
+ export declare const startDevServer: (packageManager: string, port: string) => void;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.startDevServer = void 0;
7
+ const shelljs_1 = __importDefault(require("shelljs"));
8
+ const startDevServer = (packageManager, port) => {
9
+ shelljs_1.default.exec(`${packageManager} run dev -p ${port}`, { async: true });
10
+ };
11
+ exports.startDevServer = startDevServer;
@@ -0,0 +1 @@
1
+ export declare const syncPkg: () => Promise<void>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.syncPkg = void 0;
7
+ const read_pkg_1 = __importDefault(require("read-pkg"));
8
+ const constants_1 = require("./constants");
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const syncPkg = async () => {
12
+ const clientPkg = await (0, read_pkg_1.default)({ cwd: constants_1.REACT_EMAIL_ROOT });
13
+ const userPkg = await (0, read_pkg_1.default)();
14
+ const pkg = {
15
+ ...clientPkg,
16
+ dependencies: {
17
+ ...clientPkg.dependencies,
18
+ ...userPkg.dependencies,
19
+ },
20
+ };
21
+ await fs_1.default.promises.writeFile(path_1.default.join(constants_1.REACT_EMAIL_ROOT, 'package.json'), JSON.stringify(pkg));
22
+ };
23
+ exports.syncPkg = syncPkg;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-email",
3
- "version": "1.7.15",
3
+ "version": "1.8.0-canary.1",
4
4
  "description": "A live preview of your emails right in your browser.",
5
5
  "bin": {
6
6
  "email": "./dist/source/index.js"
@@ -31,11 +31,13 @@
31
31
  "dependencies": {
32
32
  "@commander-js/extra-typings": "9.4.1",
33
33
  "@manypkg/find-root": "2.1.0",
34
+ "@octokit/rest": "19.0.7",
34
35
  "@react-email/render": "0.0.6",
35
36
  "chokidar": "3.5.3",
36
37
  "commander": "9.4.1",
37
38
  "detect-package-manager": "2.0.1",
38
39
  "esbuild": "0.16.4",
40
+ "fs-extra": "11.1.0",
39
41
  "glob": "8.0.3",
40
42
  "log-symbols": "4.1.0",
41
43
  "normalize-path": "3.0.0",
@@ -45,6 +47,7 @@
45
47
  "tree-node-cli": "1.6.0"
46
48
  },
47
49
  "devDependencies": {
50
+ "@types/fs-extra": "11.0.1",
48
51
  "@types/node": "18.11.9",
49
52
  "@types/normalize-path": "3.0.0",
50
53
  "@types/shelljs": "0.8.11",