react-email 6.0.3 → 6.0.4
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/CHANGELOG.md +9 -0
- package/dist/cli/index.mjs +58 -40
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# react-email
|
|
2
2
|
|
|
3
|
+
## 6.0.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 96af3a7: Replace ora with picospinner for CLI and preview spinner output.
|
|
8
|
+
- 5cf57ae: unpin esbuild
|
|
9
|
+
- Updated dependencies [e0e896f]
|
|
10
|
+
- @react-email/render@2.0.8
|
|
11
|
+
|
|
3
12
|
## 6.0.3
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/dist/cli/index.mjs
CHANGED
|
@@ -17,9 +17,9 @@ import { fileURLToPath as fileURLToPath$1 } from "url";
|
|
|
17
17
|
import { createRequire as createRequire$1 } from "module";
|
|
18
18
|
import logSymbols from "log-symbols";
|
|
19
19
|
import { addDevDependency, installDependencies, runScript } from "nypm";
|
|
20
|
-
import ora from "ora";
|
|
21
20
|
import { createJiti } from "jiti";
|
|
22
21
|
import prompts from "prompts";
|
|
22
|
+
import { Spinner } from "picospinner";
|
|
23
23
|
import { watch } from "chokidar";
|
|
24
24
|
import debounce from "debounce";
|
|
25
25
|
import { Server } from "socket.io";
|
|
@@ -6522,7 +6522,7 @@ const getEmailsDirectoryMetadata = async (absolutePathToEmailsDirectory, keepFil
|
|
|
6522
6522
|
//#region package.json
|
|
6523
6523
|
var package_default = {
|
|
6524
6524
|
name: "react-email",
|
|
6525
|
-
version: "6.0.
|
|
6525
|
+
version: "6.0.4",
|
|
6526
6526
|
description: "A live preview of your emails right in your browser.",
|
|
6527
6527
|
bin: { "email": "./dist/cli/index.mjs" },
|
|
6528
6528
|
type: "module",
|
|
@@ -6561,13 +6561,13 @@ var package_default = {
|
|
|
6561
6561
|
dependencies: {
|
|
6562
6562
|
"@babel/parser": "catalog:",
|
|
6563
6563
|
"@babel/traverse": "catalog:",
|
|
6564
|
-
"@react-email/render": "workspace:>=2.0.
|
|
6564
|
+
"@react-email/render": "workspace:>=2.0.8",
|
|
6565
6565
|
"chokidar": "^4.0.3",
|
|
6566
6566
|
"commander": "catalog:",
|
|
6567
6567
|
"conf": "^15.0.2",
|
|
6568
6568
|
"css-tree": "3.2.1",
|
|
6569
6569
|
"debounce": "^2.0.0",
|
|
6570
|
-
"esbuild": "
|
|
6570
|
+
"esbuild": "^0.28.0",
|
|
6571
6571
|
"glob": "^13.0.6",
|
|
6572
6572
|
"jiti": "2.4.2",
|
|
6573
6573
|
"log-symbols": "catalog:",
|
|
@@ -6575,7 +6575,7 @@ var package_default = {
|
|
|
6575
6575
|
"mime-types": "^3.0.0",
|
|
6576
6576
|
"normalize-path": "^3.0.0",
|
|
6577
6577
|
"nypm": "catalog:",
|
|
6578
|
-
"
|
|
6578
|
+
"picospinner": "catalog:",
|
|
6579
6579
|
"prismjs": "^1.30.0",
|
|
6580
6580
|
"prompts": "2.4.2",
|
|
6581
6581
|
"socket.io": "^4.8.1",
|
|
@@ -6632,18 +6632,36 @@ const getUiLocation = async () => {
|
|
|
6632
6632
|
const spinners = /* @__PURE__ */ new Set();
|
|
6633
6633
|
process.on("SIGINT", () => {
|
|
6634
6634
|
spinners.forEach((spinner) => {
|
|
6635
|
-
if (spinner.
|
|
6635
|
+
if (spinner.running) spinner.stop();
|
|
6636
6636
|
});
|
|
6637
6637
|
});
|
|
6638
6638
|
process.on("exit", (code) => {
|
|
6639
6639
|
if (code !== 0) spinners.forEach((spinner) => {
|
|
6640
|
-
if (spinner.
|
|
6640
|
+
if (spinner.running) spinner.fail();
|
|
6641
6641
|
});
|
|
6642
6642
|
});
|
|
6643
6643
|
const registerSpinnerAutostopping = (spinner) => {
|
|
6644
6644
|
spinners.add(spinner);
|
|
6645
6645
|
};
|
|
6646
6646
|
//#endregion
|
|
6647
|
+
//#region src/cli/utils/spinner.ts
|
|
6648
|
+
const withPrefixText = (prefixText, symbolFormatter) => {
|
|
6649
|
+
if (typeof prefixText === "undefined") return symbolFormatter;
|
|
6650
|
+
return (symbol) => `${prefixText}${symbolFormatter?.(symbol) ?? symbol}`;
|
|
6651
|
+
};
|
|
6652
|
+
const normalizeDisplay = (display) => {
|
|
6653
|
+
if (typeof display === "string") return display;
|
|
6654
|
+
const { prefixText, stream, symbolFormatter, ...spinnerDisplay } = display;
|
|
6655
|
+
return {
|
|
6656
|
+
...spinnerDisplay,
|
|
6657
|
+
symbolFormatter: withPrefixText(prefixText, symbolFormatter)
|
|
6658
|
+
};
|
|
6659
|
+
};
|
|
6660
|
+
const createSpinner = (display, options) => new Spinner(normalizeDisplay(display), options);
|
|
6661
|
+
const stopSpinnerAndPersist = (spinner, display) => {
|
|
6662
|
+
spinner?.setDisplay(display);
|
|
6663
|
+
};
|
|
6664
|
+
//#endregion
|
|
6647
6665
|
//#region src/cli/commands/build.ts
|
|
6648
6666
|
const isInReactEmailMonorepo = !path.dirname(fileURLToPath(import.meta.url)).includes("node_modules");
|
|
6649
6667
|
const setNextEnvironmentVariablesForBuild = async (emailsDirRelativePath, builtPreviewAppPath, usersProjectLocation) => {
|
|
@@ -6715,21 +6733,22 @@ const build$1 = async ({ dir: emailsDirRelativePath, packageManager }) => {
|
|
|
6715
6733
|
try {
|
|
6716
6734
|
const usersProjectLocation = process.cwd();
|
|
6717
6735
|
const previewServerLocation = await getUiLocation();
|
|
6718
|
-
const spinner =
|
|
6736
|
+
const spinner = createSpinner({
|
|
6719
6737
|
text: "Starting build process...",
|
|
6720
6738
|
prefixText: " "
|
|
6721
|
-
})
|
|
6739
|
+
});
|
|
6740
|
+
spinner.start();
|
|
6722
6741
|
registerSpinnerAutostopping(spinner);
|
|
6723
|
-
spinner.
|
|
6742
|
+
spinner.setText(`Checking if ${emailsDirRelativePath} folder exists`);
|
|
6724
6743
|
if (!fs.existsSync(emailsDirRelativePath)) process.exit(1);
|
|
6725
6744
|
const emailsDirPath = path.join(usersProjectLocation, emailsDirRelativePath);
|
|
6726
6745
|
const staticPath = path.join(emailsDirPath, "static");
|
|
6727
6746
|
const builtPreviewAppPath = path.join(usersProjectLocation, ".react-email");
|
|
6728
6747
|
if (fs.existsSync(builtPreviewAppPath)) {
|
|
6729
|
-
spinner.
|
|
6748
|
+
spinner.setText("Deleting pre-existing `.react-email` folder");
|
|
6730
6749
|
await fs.promises.rm(builtPreviewAppPath, { recursive: true });
|
|
6731
6750
|
}
|
|
6732
|
-
spinner.
|
|
6751
|
+
spinner.setText("Copying preview app from CLI to `.react-email`");
|
|
6733
6752
|
await fs.promises.cp(previewServerLocation, builtPreviewAppPath, {
|
|
6734
6753
|
recursive: true,
|
|
6735
6754
|
filter: (source) => {
|
|
@@ -6738,25 +6757,25 @@ const build$1 = async ({ dir: emailsDirRelativePath, packageManager }) => {
|
|
|
6738
6757
|
}
|
|
6739
6758
|
});
|
|
6740
6759
|
if (fs.existsSync(staticPath)) {
|
|
6741
|
-
spinner.
|
|
6760
|
+
spinner.setText("Copying `static` folder into `.react-email/public/static`");
|
|
6742
6761
|
const builtStaticDirectory = path.resolve(builtPreviewAppPath, "./public/static");
|
|
6743
6762
|
await fs.promises.cp(staticPath, builtStaticDirectory, { recursive: true });
|
|
6744
6763
|
}
|
|
6745
|
-
spinner.
|
|
6764
|
+
spinner.setText("Setting Next environment variables for preview app to work properly");
|
|
6746
6765
|
await setNextEnvironmentVariablesForBuild(emailsDirRelativePath, builtPreviewAppPath, usersProjectLocation);
|
|
6747
|
-
spinner.
|
|
6766
|
+
spinner.setText("Setting server side generation for the email preview pages");
|
|
6748
6767
|
await forceSSGForEmailPreviews(emailsDirPath, builtPreviewAppPath);
|
|
6749
|
-
spinner.
|
|
6768
|
+
spinner.setText("Updating package.json's build and start scripts");
|
|
6750
6769
|
await updatePackageJson(builtPreviewAppPath);
|
|
6751
6770
|
if (!isInReactEmailMonorepo) {
|
|
6752
|
-
spinner.
|
|
6771
|
+
spinner.setText("Installing dependencies on `.react-email`");
|
|
6753
6772
|
await installDependencies({
|
|
6754
6773
|
cwd: builtPreviewAppPath,
|
|
6755
6774
|
silent: true,
|
|
6756
6775
|
packageManager
|
|
6757
6776
|
});
|
|
6758
6777
|
}
|
|
6759
|
-
spinner
|
|
6778
|
+
stopSpinnerAndPersist(spinner, {
|
|
6760
6779
|
text: "Successfully prepared `.react-email` for `next build`",
|
|
6761
6780
|
symbol: logSymbols.success
|
|
6762
6781
|
});
|
|
@@ -7133,16 +7152,17 @@ const startDevServer = async (emailsDirRelativePath, staticBaseDirRelativePath,
|
|
|
7133
7152
|
await app.close();
|
|
7134
7153
|
});
|
|
7135
7154
|
devServer.on("error", (e) => {
|
|
7136
|
-
spinner
|
|
7155
|
+
stopSpinnerAndPersist(spinner, {
|
|
7137
7156
|
symbol: logSymbols.error,
|
|
7138
7157
|
text: `Preview Server had an error: ${e}`
|
|
7139
7158
|
});
|
|
7140
7159
|
process.exit(1);
|
|
7141
7160
|
});
|
|
7142
|
-
const spinner =
|
|
7161
|
+
const spinner = createSpinner({
|
|
7143
7162
|
text: "Getting react-email preview server ready...\n",
|
|
7144
7163
|
prefixText: " "
|
|
7145
|
-
})
|
|
7164
|
+
});
|
|
7165
|
+
spinner.start();
|
|
7146
7166
|
registerSpinnerAutostopping(spinner);
|
|
7147
7167
|
const timeBeforeNextReady = performance.now();
|
|
7148
7168
|
process.env = {
|
|
@@ -7168,7 +7188,7 @@ const startDevServer = async (emailsDirRelativePath, staticBaseDirRelativePath,
|
|
|
7168
7188
|
try {
|
|
7169
7189
|
await nextReadyPromise;
|
|
7170
7190
|
} catch (exception) {
|
|
7171
|
-
spinner
|
|
7191
|
+
stopSpinnerAndPersist(spinner, {
|
|
7172
7192
|
symbol: logSymbols.error,
|
|
7173
7193
|
text: ` Preview Server had an error: ${exception}`
|
|
7174
7194
|
});
|
|
@@ -7176,9 +7196,8 @@ const startDevServer = async (emailsDirRelativePath, staticBaseDirRelativePath,
|
|
|
7176
7196
|
}
|
|
7177
7197
|
isNextReady = true;
|
|
7178
7198
|
const nextHandleRequest = app.getRequestHandler();
|
|
7179
|
-
|
|
7180
|
-
|
|
7181
|
-
text: `Ready in ${secondsToNextReady}s\n`,
|
|
7199
|
+
stopSpinnerAndPersist(spinner, {
|
|
7200
|
+
text: `Ready in ${((performance.now() - timeBeforeNextReady) / 1e3).toFixed(1)}s\n`,
|
|
7182
7201
|
symbol: logSymbols.success
|
|
7183
7202
|
});
|
|
7184
7203
|
return devServer;
|
|
@@ -7317,12 +7336,13 @@ const require$1 = createRequire(url.fileURLToPath(import.meta.url));
|
|
|
7317
7336
|
const exportTemplates = async (pathToWhereEmailMarkupShouldBeDumped, emailsDirectoryPath, options) => {
|
|
7318
7337
|
let spinner;
|
|
7319
7338
|
if (!options.silent) {
|
|
7320
|
-
spinner =
|
|
7339
|
+
spinner = createSpinner("Preparing files...\n");
|
|
7340
|
+
spinner.start();
|
|
7321
7341
|
registerSpinnerAutostopping(spinner);
|
|
7322
7342
|
}
|
|
7323
7343
|
const emailsDirectoryMetadata = await getEmailsDirectoryMetadata(path.resolve(process.cwd(), emailsDirectoryPath), true);
|
|
7324
7344
|
if (typeof emailsDirectoryMetadata === "undefined") {
|
|
7325
|
-
if (spinner) spinner
|
|
7345
|
+
if (spinner) stopSpinnerAndPersist(spinner, {
|
|
7326
7346
|
symbol: logSymbols.error,
|
|
7327
7347
|
text: `Could not find the directory at ${emailsDirectoryPath}`
|
|
7328
7348
|
});
|
|
@@ -7347,7 +7367,7 @@ const exportTemplates = async (pathToWhereEmailMarkupShouldBeDumped, emailsDirec
|
|
|
7347
7367
|
write: true
|
|
7348
7368
|
});
|
|
7349
7369
|
} catch (exception) {
|
|
7350
|
-
if (spinner) spinner
|
|
7370
|
+
if (spinner) stopSpinnerAndPersist(spinner, {
|
|
7351
7371
|
symbol: logSymbols.error,
|
|
7352
7372
|
text: "Failed to build emails"
|
|
7353
7373
|
});
|
|
@@ -7356,18 +7376,19 @@ const exportTemplates = async (pathToWhereEmailMarkupShouldBeDumped, emailsDirec
|
|
|
7356
7376
|
}
|
|
7357
7377
|
if (spinner) spinner.succeed();
|
|
7358
7378
|
const allBuiltTemplates = glob.sync(normalize$1(`${pathToWhereEmailMarkupShouldBeDumped}/**/*.cjs`), { absolute: true });
|
|
7379
|
+
if (spinner && allBuiltTemplates.length > 0) {
|
|
7380
|
+
spinner.setText(`rendering ${allBuiltTemplates[0]?.split("/").pop()}`);
|
|
7381
|
+
spinner.start();
|
|
7382
|
+
}
|
|
7359
7383
|
for await (const template of allBuiltTemplates) try {
|
|
7360
|
-
if (spinner) {
|
|
7361
|
-
spinner.text = `rendering ${template.split("/").pop()}`;
|
|
7362
|
-
spinner.render();
|
|
7363
|
-
}
|
|
7384
|
+
if (spinner) spinner.setText(`rendering ${template.split("/").pop()}`);
|
|
7364
7385
|
delete require$1.cache[template];
|
|
7365
7386
|
const emailModule = require$1(template);
|
|
7366
7387
|
const rendered = await emailModule.render(emailModule.reactEmailCreateReactElement(emailModule.default, {}), options);
|
|
7367
7388
|
writeFileSync(template.replace(".cjs", options.plainText ? ".txt" : ".html"), rendered);
|
|
7368
7389
|
unlinkSync(template);
|
|
7369
7390
|
} catch (exception) {
|
|
7370
|
-
if (spinner) spinner
|
|
7391
|
+
if (spinner) stopSpinnerAndPersist(spinner, {
|
|
7371
7392
|
symbol: logSymbols.error,
|
|
7372
7393
|
text: `failed when rendering ${template.split("/").pop()}`
|
|
7373
7394
|
});
|
|
@@ -7376,8 +7397,8 @@ const exportTemplates = async (pathToWhereEmailMarkupShouldBeDumped, emailsDirec
|
|
|
7376
7397
|
}
|
|
7377
7398
|
if (spinner) {
|
|
7378
7399
|
spinner.succeed("Rendered all files");
|
|
7379
|
-
spinner.
|
|
7380
|
-
spinner.
|
|
7400
|
+
spinner.setText("Copying static files");
|
|
7401
|
+
spinner.start();
|
|
7381
7402
|
}
|
|
7382
7403
|
const staticDirectoryPath = path.join(emailsDirectoryPath, "static");
|
|
7383
7404
|
if (fs.existsSync(staticDirectoryPath)) {
|
|
@@ -7387,7 +7408,7 @@ const exportTemplates = async (pathToWhereEmailMarkupShouldBeDumped, emailsDirec
|
|
|
7387
7408
|
await fs.promises.cp(staticDirectoryPath, pathToDumpStaticFilesInto, { recursive: true });
|
|
7388
7409
|
} catch (exception) {
|
|
7389
7410
|
console.error(exception);
|
|
7390
|
-
if (spinner) spinner
|
|
7411
|
+
if (spinner) stopSpinnerAndPersist(spinner, {
|
|
7391
7412
|
symbol: logSymbols.error,
|
|
7392
7413
|
text: "Failed to copy static files"
|
|
7393
7414
|
});
|
|
@@ -7399,10 +7420,7 @@ const exportTemplates = async (pathToWhereEmailMarkupShouldBeDumped, emailsDirec
|
|
|
7399
7420
|
spinner.succeed();
|
|
7400
7421
|
const fileTree = await tree(pathToWhereEmailMarkupShouldBeDumped, 4);
|
|
7401
7422
|
console.log(fileTree);
|
|
7402
|
-
|
|
7403
|
-
symbol: logSymbols.success,
|
|
7404
|
-
text: "Successfully exported emails"
|
|
7405
|
-
});
|
|
7423
|
+
console.log(`${logSymbols.success} Successfully exported emails`);
|
|
7406
7424
|
}
|
|
7407
7425
|
};
|
|
7408
7426
|
//#endregion
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-email",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.4",
|
|
4
4
|
"description": "A live preview of your emails right in your browser.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"email": "./dist/cli/index.mjs"
|
|
@@ -37,13 +37,13 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@babel/parser": "7.27.0",
|
|
39
39
|
"@babel/traverse": "7.27.0",
|
|
40
|
-
"@react-email/render": ">=2.0.
|
|
40
|
+
"@react-email/render": ">=2.0.8",
|
|
41
41
|
"chokidar": "^4.0.3",
|
|
42
42
|
"commander": "^13.0.0",
|
|
43
43
|
"conf": "^15.0.2",
|
|
44
44
|
"css-tree": "3.2.1",
|
|
45
45
|
"debounce": "^2.0.0",
|
|
46
|
-
"esbuild": "0.28.0",
|
|
46
|
+
"esbuild": "^0.28.0",
|
|
47
47
|
"glob": "^13.0.6",
|
|
48
48
|
"jiti": "2.4.2",
|
|
49
49
|
"log-symbols": "^7.0.0",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"mime-types": "^3.0.0",
|
|
52
52
|
"normalize-path": "^3.0.0",
|
|
53
53
|
"nypm": "0.6.6",
|
|
54
|
-
"
|
|
54
|
+
"picospinner": "^3.0.0",
|
|
55
55
|
"prismjs": "^1.30.0",
|
|
56
56
|
"prompts": "2.4.2",
|
|
57
57
|
"socket.io": "^4.8.1",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"tsx": "4.21.0",
|
|
75
75
|
"typescript": "5.9.3",
|
|
76
76
|
"yalc": "1.0.0-pre.53",
|
|
77
|
-
"@react-email/render": "2.0.
|
|
77
|
+
"@react-email/render": "2.0.8"
|
|
78
78
|
},
|
|
79
79
|
"scripts": {
|
|
80
80
|
"build": "tsdown",
|