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 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
@@ -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.3",
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.7",
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": "catalog:",
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
- "ora": "catalog:",
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.isSpinning) spinner.stop();
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.isSpinning) spinner.stopAndPersist({ symbol: logSymbols.error });
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 = ora({
6736
+ const spinner = createSpinner({
6719
6737
  text: "Starting build process...",
6720
6738
  prefixText: " "
6721
- }).start();
6739
+ });
6740
+ spinner.start();
6722
6741
  registerSpinnerAutostopping(spinner);
6723
- spinner.text = `Checking if ${emailsDirRelativePath} folder exists`;
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.text = "Deleting pre-existing `.react-email` folder";
6748
+ spinner.setText("Deleting pre-existing `.react-email` folder");
6730
6749
  await fs.promises.rm(builtPreviewAppPath, { recursive: true });
6731
6750
  }
6732
- spinner.text = "Copying preview app from CLI to `.react-email`";
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.text = "Copying `static` folder into `.react-email/public/static`";
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.text = "Setting Next environment variables for preview app to work properly";
6764
+ spinner.setText("Setting Next environment variables for preview app to work properly");
6746
6765
  await setNextEnvironmentVariablesForBuild(emailsDirRelativePath, builtPreviewAppPath, usersProjectLocation);
6747
- spinner.text = "Setting server side generation for the email preview pages";
6766
+ spinner.setText("Setting server side generation for the email preview pages");
6748
6767
  await forceSSGForEmailPreviews(emailsDirPath, builtPreviewAppPath);
6749
- spinner.text = "Updating package.json's build and start scripts";
6768
+ spinner.setText("Updating package.json's build and start scripts");
6750
6769
  await updatePackageJson(builtPreviewAppPath);
6751
6770
  if (!isInReactEmailMonorepo) {
6752
- spinner.text = "Installing dependencies on `.react-email`";
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.stopAndPersist({
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.stopAndPersist({
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 = ora({
7161
+ const spinner = createSpinner({
7143
7162
  text: "Getting react-email preview server ready...\n",
7144
7163
  prefixText: " "
7145
- }).start();
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.stopAndPersist({
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
- const secondsToNextReady = ((performance.now() - timeBeforeNextReady) / 1e3).toFixed(1);
7180
- spinner.stopAndPersist({
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 = ora("Preparing files...\n").start();
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.stopAndPersist({
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.stopAndPersist({
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.stopAndPersist({
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.text = "Copying static files";
7380
- spinner.render();
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.stopAndPersist({
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
- spinner.stopAndPersist({
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",
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.7",
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
- "ora": "^8.0.0",
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.7"
77
+ "@react-email/render": "2.0.8"
78
78
  },
79
79
  "scripts": {
80
80
  "build": "tsdown",