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.
- package/dist/package.json +4 -1
- package/dist/source/commands/dev.js +7 -175
- package/dist/source/commands/export.js +4 -3
- package/dist/source/utils/constants.d.ts +1 -2
- package/dist/source/utils/constants.js +3 -4
- package/dist/source/utils/convert-to-absolute-path.d.ts +1 -0
- package/dist/source/utils/convert-to-absolute-path.js +9 -0
- package/dist/source/utils/download-client.d.ts +1 -0
- package/dist/source/utils/download-client.js +26 -0
- package/dist/source/utils/generate-email-preview.d.ts +1 -0
- package/dist/source/utils/generate-email-preview.js +65 -0
- package/dist/source/utils/index.d.ts +6 -4
- package/dist/source/utils/index.js +6 -4
- package/dist/source/utils/install-dependencies.d.ts +2 -0
- package/dist/source/utils/install-dependencies.js +21 -0
- package/dist/source/utils/run-server.d.ts +1 -0
- package/dist/source/utils/run-server.js +23 -0
- package/dist/source/utils/start-server-command.d.ts +1 -0
- package/dist/source/utils/start-server-command.js +11 -0
- package/dist/source/utils/sync-package.d.ts +1 -0
- package/dist/source/utils/sync-package.js +23 -0
- package/package.json +4 -1
- package/source/commands/dev.ts +8 -234
- package/source/commands/export.ts +2 -2
- package/source/utils/constants.ts +2 -6
- package/source/utils/convert-to-absolute-path.ts +4 -0
- package/source/utils/download-client.ts +28 -0
- package/source/utils/generate-email-preview.ts +78 -0
- package/source/utils/index.ts +6 -4
- package/source/utils/install-dependencies.ts +18 -0
- package/source/utils/run-server.ts +28 -0
- package/source/utils/start-server-command.ts +5 -0
- package/source/utils/sync-package.ts +20 -0
- package/dist/source/_preview/components.d.ts +0 -4
- package/dist/source/_preview/components.js +0 -77
- package/dist/source/_preview/pages.d.ts +0 -9
- package/dist/source/_preview/pages.js +0 -22
- package/dist/source/_preview/root.d.ts +0 -4
- package/dist/source/_preview/root.js +0 -29
- package/dist/source/_preview/styles.d.ts +0 -4
- package/dist/source/_preview/styles.js +0 -9
- package/dist/source/_preview/utils.d.ts +0 -4
- package/dist/source/_preview/utils.js +0 -25
- package/dist/source/utils/check-directory-exist.d.ts +0 -1
- package/dist/source/utils/check-directory-exist.js +0 -9
- package/dist/source/utils/check-empty-directory.d.ts +0 -1
- package/dist/source/utils/check-empty-directory.js +0 -12
- package/dist/source/utils/check-is-up-to-date.d.ts +0 -2
- package/dist/source/utils/check-is-up-to-date.js +0 -26
- package/dist/source/utils/create-directory.d.ts +0 -1
- package/dist/source/utils/create-directory.js +0 -9
- package/preview/next-env.d.ts +0 -5
- package/preview/next.config.js +0 -9
- package/preview/package.json +0 -43
- package/preview/postcss.config.js +0 -6
- package/preview/src/components/button.tsx +0 -85
- package/preview/src/components/code-container.tsx +0 -135
- package/preview/src/components/code.tsx +0 -112
- package/preview/src/components/heading.tsx +0 -114
- package/preview/src/components/icon-base.tsx +0 -26
- package/preview/src/components/icon-button.tsx +0 -23
- package/preview/src/components/icon-check.tsx +0 -18
- package/preview/src/components/icon-clipboard.tsx +0 -39
- package/preview/src/components/icon-download.tsx +0 -18
- package/preview/src/components/index.ts +0 -7
- package/preview/src/components/layout.tsx +0 -52
- package/preview/src/components/logo.tsx +0 -71
- package/preview/src/components/send.tsx +0 -118
- package/preview/src/components/sidebar.tsx +0 -164
- package/preview/src/components/text.tsx +0 -100
- package/preview/src/components/tooltip-content.tsx +0 -32
- package/preview/src/components/tooltip.tsx +0 -19
- package/preview/src/components/topbar.tsx +0 -117
- package/preview/src/pages/_app.tsx +0 -26
- package/preview/src/pages/_document.tsx +0 -13
- package/preview/src/pages/index.tsx +0 -54
- package/preview/src/pages/preview/[slug].tsx +0 -127
- package/preview/src/styles/globals.css +0 -3
- package/preview/src/utils/as.ts +0 -26
- package/preview/src/utils/copy-text-to-clipboard.ts +0 -7
- package/preview/src/utils/index.ts +0 -3
- package/preview/src/utils/language-map.ts +0 -7
- package/preview/src/utils/unreachable.ts +0 -6
- package/preview/tailwind.config.js +0 -90
- package/preview/tsconfig.json +0 -31
- package/scripts/prepare-preview.ts +0 -178
- package/source/_preview/components.ts +0 -92
- package/source/_preview/pages.ts +0 -23
- package/source/_preview/root.ts +0 -32
- package/source/_preview/styles.ts +0 -6
- package/source/_preview/utils.ts +0 -27
- package/source/utils/check-directory-exist.ts +0 -4
- package/source/utils/check-empty-directory.ts +0 -6
- package/source/utils/check-is-up-to-date.ts +0 -23
- 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.
|
|
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
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
44
|
-
await
|
|
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
|
-
|
|
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(
|
|
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 =
|
|
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
|
|
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.
|
|
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
|
-
//
|
|
14
|
-
exports.
|
|
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 './
|
|
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("./
|
|
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,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.
|
|
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",
|