react-email 2.1.5 → 2.1.6

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 ADDED
@@ -0,0 +1,15 @@
1
+ # react-email
2
+
3
+ ## 2.1.6
4
+
5
+ ### Patch changes
6
+
7
+ - Fixes live refresh not working with files outside `emails` directory
8
+ - Fixes export failing when templates have different suffixes
9
+
10
+ ## 2.1.6-canary.0
11
+
12
+ ### Patch changes
13
+
14
+ - Fixes live refresh not working with files outside `emails` directory
15
+ - Fixes export failing when templates have different suffixes
package/cli/index.js CHANGED
@@ -340,7 +340,7 @@ var import_commander = require("commander");
340
340
  // package.json
341
341
  var package_default = {
342
342
  name: "react-email",
343
- version: "2.1.5",
343
+ version: "2.1.6",
344
344
  description: "A live preview of your emails right in your browser.",
345
345
  bin: {
346
346
  email: "./cli/index.js"
@@ -409,8 +409,8 @@ var package_default = {
409
409
  typescript: "5.1.6"
410
410
  },
411
411
  devDependencies: {
412
- "@react-email/components": "0.0.19",
413
- "@react-email/render": "0.0.15",
412
+ "@react-email/components": "workspace:*",
413
+ "@react-email/render": "workspace:*",
414
414
  "@types/babel__core": "7.20.5",
415
415
  "@types/fs-extra": "11.0.1",
416
416
  "@types/mime-types": "2.1.4",
@@ -711,15 +711,15 @@ var getEnvVariablesForPreviewApp = function(relativePathToEmailsDirectory, cliPa
711
711
  // src/cli/utils/preview/start-dev-server.ts
712
712
  var devServer;
713
713
  var safeAsyncServerListen = function(server, port) {
714
- return new Promise(function(resolve) {
714
+ return new Promise(function(resolve2) {
715
715
  server.listen(port, function() {
716
- resolve({
716
+ resolve2({
717
717
  portAlreadyInUse: false
718
718
  });
719
719
  });
720
720
  server.on("error", function(e) {
721
721
  if (e.code === "EADDRINUSE") {
722
- resolve({
722
+ resolve2({
723
723
  portAlreadyInUse: true
724
724
  });
725
725
  }
@@ -1291,9 +1291,7 @@ var createDependencyGraph = function() {
1291
1291
  [
1292
1292
  graph,
1293
1293
  function() {
1294
- var _ref = /**
1295
- * @param pathToModified - A path relative to the previosuly provided {@link directory}.
1296
- */ _async_to_generator(function(event, pathToModified) {
1294
+ var _ref = _async_to_generator(function(event, pathToModified) {
1297
1295
  var filesInsideAddedDirectory, modulesInsideAddedDirectory, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, filePath, err, filesInsideDeletedDirectory, modulesInsideDeletedDirectory, _iteratorAbruptCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _value1, filePath1, err1;
1298
1296
  return _ts_generator(this, function(_state) {
1299
1297
  switch(_state.label){
@@ -1568,7 +1566,39 @@ var createDependencyGraph = function() {
1568
1566
  return function(event, pathToModified) {
1569
1567
  return _ref.apply(this, arguments);
1570
1568
  };
1571
- }()
1569
+ }(),
1570
+ {
1571
+ resolveDependentsOf: function resolveDependentsOf(pathToModule) {
1572
+ var moduleEntry = graph[pathToModule];
1573
+ var dependentPaths = [];
1574
+ if (moduleEntry) {
1575
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1576
+ try {
1577
+ for(var _iterator = moduleEntry.dependentPaths[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1578
+ var dependentPath = _step.value;
1579
+ var _dependentPaths;
1580
+ var dependentsOfDependent = resolveDependentsOf(dependentPath);
1581
+ (_dependentPaths = dependentPaths).push.apply(_dependentPaths, _to_consumable_array(dependentsOfDependent));
1582
+ dependentPaths.push(dependentPath);
1583
+ }
1584
+ } catch (err) {
1585
+ _didIteratorError = true;
1586
+ _iteratorError = err;
1587
+ } finally{
1588
+ try {
1589
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
1590
+ _iterator.return();
1591
+ }
1592
+ } finally{
1593
+ if (_didIteratorError) {
1594
+ throw _iteratorError;
1595
+ }
1596
+ }
1597
+ }
1598
+ }
1599
+ return dependentPaths;
1600
+ }
1601
+ }
1572
1602
  ]
1573
1603
  ];
1574
1604
  }
@@ -1581,7 +1611,7 @@ var createDependencyGraph = function() {
1581
1611
  // src/cli/utils/preview/hot-reloading/setup-hot-reloading.ts
1582
1612
  var setupHotreloading = function() {
1583
1613
  var _ref = _async_to_generator(function(devServer2, emailDirRelativePath) {
1584
- var clients, io, watcher, exit, changes, reload, absolutePathToEmailsDirectory, _ref, dependencyGraph, updateDependencyGraph, resolveDependentsOf;
1614
+ var clients, io, changes, reload, absolutePathToEmailsDirectory, _ref, dependencyGraph, updateDependencyGraph, resolveDependentsOf, watcher, getFilesOutsideEmailsDirectory, filesOutsideEmailsDirectory, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, p, exit;
1585
1615
  return _ts_generator(this, function(_state) {
1586
1616
  switch(_state.label){
1587
1617
  case 0:
@@ -1595,17 +1625,6 @@ var setupHotreloading = function() {
1595
1625
  });
1596
1626
  });
1597
1627
  });
1598
- watcher = (0, import_chokidar.watch)(emailDirRelativePath, {
1599
- ignoreInitial: true,
1600
- cwd: import_node_path5.default.resolve(process.cwd()),
1601
- // eslint-disable-next-line prefer-named-capture-group
1602
- ignored: /(^|[/\\])\../
1603
- });
1604
- exit = function() {
1605
- void watcher.close();
1606
- };
1607
- process.on("SIGINT", exit);
1608
- process.on("uncaughtException", exit);
1609
1628
  changes = [];
1610
1629
  reload = (0, import_debounce.default)(function() {
1611
1630
  clients.forEach(function(client) {
@@ -1621,41 +1640,66 @@ var setupHotreloading = function() {
1621
1640
  case 1:
1622
1641
  _ref = _sliced_to_array.apply(void 0, [
1623
1642
  _state.sent(),
1624
- 2
1625
- ]), dependencyGraph = _ref[0], updateDependencyGraph = _ref[1];
1626
- resolveDependentsOf = function(pathToChangeTarget) {
1627
- var moduleEntry = dependencyGraph[pathToChangeTarget];
1628
- var dependentPaths = [];
1629
- if (moduleEntry) {
1630
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1631
- try {
1632
- for(var _iterator = moduleEntry.dependentPaths[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1633
- var dependentPath = _step.value;
1634
- var _dependentPaths;
1635
- var dependentsOfDependent = resolveDependentsOf(dependentPath);
1636
- (_dependentPaths = dependentPaths).push.apply(_dependentPaths, _to_consumable_array(dependentsOfDependent));
1637
- dependentPaths.push(dependentPath);
1638
- }
1639
- } catch (err) {
1640
- _didIteratorError = true;
1641
- _iteratorError = err;
1642
- } finally{
1643
- try {
1644
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1645
- _iterator.return();
1646
- }
1647
- } finally{
1648
- if (_didIteratorError) {
1649
- throw _iteratorError;
1650
- }
1651
- }
1643
+ 3
1644
+ ]), dependencyGraph = _ref[0], updateDependencyGraph = _ref[1], resolveDependentsOf = _ref[2].resolveDependentsOf;
1645
+ watcher = (0, import_chokidar.watch)(emailDirRelativePath, {
1646
+ ignoreInitial: true,
1647
+ cwd: process.cwd(),
1648
+ // eslint-disable-next-line prefer-named-capture-group
1649
+ ignored: /(^|[/\\])\../
1650
+ });
1651
+ getFilesOutsideEmailsDirectory = function() {
1652
+ return Object.keys(dependencyGraph).filter(function(p) {
1653
+ return import_node_path5.default.relative(absolutePathToEmailsDirectory, p).startsWith("..");
1654
+ });
1655
+ };
1656
+ filesOutsideEmailsDirectory = getFilesOutsideEmailsDirectory();
1657
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1658
+ try {
1659
+ for(_iterator = filesOutsideEmailsDirectory[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1660
+ p = _step.value;
1661
+ watcher.add(p);
1662
+ }
1663
+ } catch (err) {
1664
+ _didIteratorError = true;
1665
+ _iteratorError = err;
1666
+ } finally{
1667
+ try {
1668
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
1669
+ _iterator.return();
1670
+ }
1671
+ } finally{
1672
+ if (_didIteratorError) {
1673
+ throw _iteratorError;
1652
1674
  }
1653
1675
  }
1654
- return dependentPaths;
1655
- };
1676
+ }
1677
+ exit = function() {
1678
+ var _ref = _async_to_generator(function() {
1679
+ return _ts_generator(this, function(_state) {
1680
+ switch(_state.label){
1681
+ case 0:
1682
+ return [
1683
+ 4,
1684
+ watcher.close()
1685
+ ];
1686
+ case 1:
1687
+ _state.sent();
1688
+ return [
1689
+ 2
1690
+ ];
1691
+ }
1692
+ });
1693
+ });
1694
+ return function exit() {
1695
+ return _ref.apply(this, arguments);
1696
+ };
1697
+ }();
1698
+ process.on("SIGINT", exit);
1699
+ process.on("uncaughtException", exit);
1656
1700
  watcher.on("all", function() {
1657
1701
  var _ref = _async_to_generator(function(event, relativePathToChangeTarget) {
1658
- var file, pathToChangeTarget, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, dependentPath;
1702
+ var file, pathToChangeTarget, newFilesOutsideEmailsDirectory, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, p, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, p1, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, dependentPath;
1659
1703
  return _ts_generator(this, function(_state) {
1660
1704
  switch(_state.label){
1661
1705
  case 0:
@@ -1672,30 +1716,76 @@ var setupHotreloading = function() {
1672
1716
  ];
1673
1717
  case 1:
1674
1718
  _state.sent();
1719
+ newFilesOutsideEmailsDirectory = getFilesOutsideEmailsDirectory();
1720
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1721
+ try {
1722
+ for(_iterator = filesOutsideEmailsDirectory[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1723
+ p = _step.value;
1724
+ if (!newFilesOutsideEmailsDirectory.includes(p)) {
1725
+ watcher.unwatch(p);
1726
+ }
1727
+ }
1728
+ } catch (err) {
1729
+ _didIteratorError = true;
1730
+ _iteratorError = err;
1731
+ } finally{
1732
+ try {
1733
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
1734
+ _iterator.return();
1735
+ }
1736
+ } finally{
1737
+ if (_didIteratorError) {
1738
+ throw _iteratorError;
1739
+ }
1740
+ }
1741
+ }
1742
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1743
+ try {
1744
+ for(_iterator1 = newFilesOutsideEmailsDirectory[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1745
+ p1 = _step1.value;
1746
+ if (!filesOutsideEmailsDirectory.includes(p1)) {
1747
+ watcher.add(p1);
1748
+ }
1749
+ }
1750
+ } catch (err) {
1751
+ _didIteratorError1 = true;
1752
+ _iteratorError1 = err;
1753
+ } finally{
1754
+ try {
1755
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1756
+ _iterator1.return();
1757
+ }
1758
+ } finally{
1759
+ if (_didIteratorError1) {
1760
+ throw _iteratorError1;
1761
+ }
1762
+ }
1763
+ }
1764
+ filesOutsideEmailsDirectory = newFilesOutsideEmailsDirectory;
1675
1765
  changes.push({
1676
1766
  event: event,
1677
1767
  filename: relativePathToChangeTarget
1678
1768
  });
1679
- _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1769
+ _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
1680
1770
  try {
1681
- for(_iterator = resolveDependentsOf(pathToChangeTarget)[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1682
- dependentPath = _step.value;
1771
+ for(_iterator2 = resolveDependentsOf(pathToChangeTarget)[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
1772
+ dependentPath = _step2.value;
1683
1773
  changes.push({
1684
1774
  event: "change",
1685
1775
  filename: import_node_path5.default.relative(absolutePathToEmailsDirectory, dependentPath)
1686
1776
  });
1687
1777
  }
1688
1778
  } catch (err) {
1689
- _didIteratorError = true;
1690
- _iteratorError = err;
1779
+ _didIteratorError2 = true;
1780
+ _iteratorError2 = err;
1691
1781
  } finally{
1692
1782
  try {
1693
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1694
- _iterator.return();
1783
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
1784
+ _iterator2.return();
1695
1785
  }
1696
1786
  } finally{
1697
- if (_didIteratorError) {
1698
- throw _iteratorError;
1787
+ if (_didIteratorError2) {
1788
+ throw _iteratorError2;
1699
1789
  }
1700
1790
  }
1701
1791
  }
@@ -1817,10 +1907,12 @@ var mergeDirectoriesWithSubDirectories = function(emailsDirectoryMetadata) {
1817
1907
  };
1818
1908
  var getEmailsDirectoryMetadata = function() {
1819
1909
  var _ref = _async_to_generator(function(absolutePathToEmailsDirectory) {
1820
- var dirents, emailFilenames, subDirectories;
1910
+ var keepFileExtensions, dirents, emailFilenames, subDirectories;
1911
+ var _arguments = arguments;
1821
1912
  return _ts_generator(this, function(_state) {
1822
1913
  switch(_state.label){
1823
1914
  case 0:
1915
+ keepFileExtensions = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : false;
1824
1916
  if (!import_node_fs5.default.existsSync(absolutePathToEmailsDirectory)) return [
1825
1917
  2
1826
1918
  ];
@@ -1835,7 +1927,7 @@ var getEmailsDirectoryMetadata = function() {
1835
1927
  emailFilenames = dirents.filter(function(dirent) {
1836
1928
  return isFileAnEmail(import_node_path6.default.join(absolutePathToEmailsDirectory, dirent.name));
1837
1929
  }).map(function(dirent) {
1838
- return dirent.name.replace(import_node_path6.default.extname(dirent.name), "");
1930
+ return keepFileExtensions ? dirent.name : dirent.name.replace(import_node_path6.default.extname(dirent.name), "");
1839
1931
  });
1840
1932
  return [
1841
1933
  4,
@@ -1984,7 +2076,7 @@ var exportTemplates = function() {
1984
2076
  }
1985
2077
  return [
1986
2078
  4,
1987
- getEmailsDirectoryMetadata(import_node_path8.default.resolve(process.cwd(), emailsDirectoryPath))
2079
+ getEmailsDirectoryMetadata(import_node_path8.default.resolve(process.cwd(), emailsDirectoryPath), true)
1988
2080
  ];
1989
2081
  case 1:
1990
2082
  emailsDirectoryMetadata = _state.sent();
@@ -2232,7 +2324,7 @@ var import_ora3 = __toESM(require("ora"));
2232
2324
  var import_node_child_process = require("child_process");
2233
2325
  var import_log_symbols3 = __toESM(require("log-symbols"));
2234
2326
  var buildPreviewApp = function(absoluteDirectory) {
2235
- return new Promise(function(resolve, reject) {
2327
+ return new Promise(function(resolve2, reject) {
2236
2328
  var nextBuild = (0, import_node_child_process.spawn)("npm", [
2237
2329
  "run",
2238
2330
  "build"
@@ -2244,7 +2336,7 @@ var buildPreviewApp = function(absoluteDirectory) {
2244
2336
  nextBuild.stderr.pipe(process.stderr);
2245
2337
  nextBuild.on("close", function(code) {
2246
2338
  if (code === 0) {
2247
- resolve();
2339
+ resolve2();
2248
2340
  } else {
2249
2341
  reject(new Error("Unable to build the Next app and it exited with code: ".concat(code)));
2250
2342
  }
@@ -2370,7 +2462,7 @@ var npmInstall = function() {
2370
2462
  return [
2371
2463
  2,
2372
2464
  new Promise(function() {
2373
- var _ref = _async_to_generator(function(resolve, reject) {
2465
+ var _ref = _async_to_generator(function(resolve2, reject) {
2374
2466
  var childProc;
2375
2467
  return _ts_generator(this, function(_state) {
2376
2468
  childProc = (0, import_node_child_process.spawn)(packageManager, [
@@ -2384,7 +2476,7 @@ var npmInstall = function() {
2384
2476
  childProc.stderr.pipe(process.stderr);
2385
2477
  childProc.on("close", function(code) {
2386
2478
  if (code === 0) {
2387
- resolve();
2479
+ resolve2();
2388
2480
  } else {
2389
2481
  reject(new Error("Unable to install the dependencies and it exited with code: ".concat(code)));
2390
2482
  }
@@ -2394,7 +2486,7 @@ var npmInstall = function() {
2394
2486
  ];
2395
2487
  });
2396
2488
  });
2397
- return function(resolve, reject) {
2489
+ return function(resolve2, reject) {
2398
2490
  return _ref.apply(this, arguments);
2399
2491
  };
2400
2492
  }())
package/cli/index.mjs CHANGED
@@ -13,7 +13,7 @@ import { program } from "commander";
13
13
  // package.json
14
14
  var package_default = {
15
15
  name: "react-email",
16
- version: "2.1.5",
16
+ version: "2.1.6",
17
17
  description: "A live preview of your emails right in your browser.",
18
18
  bin: {
19
19
  email: "./cli/index.js"
@@ -82,8 +82,8 @@ var package_default = {
82
82
  typescript: "5.1.6"
83
83
  },
84
84
  devDependencies: {
85
- "@react-email/components": "0.0.19",
86
- "@react-email/render": "0.0.15",
85
+ "@react-email/components": "workspace:*",
86
+ "@react-email/render": "workspace:*",
87
87
  "@types/babel__core": "7.20.5",
88
88
  "@types/fs-extra": "11.0.1",
89
89
  "@types/mime-types": "2.1.4",
@@ -261,13 +261,13 @@ var getEnvVariablesForPreviewApp = (relativePathToEmailsDirectory, cliPackageLoc
261
261
  // src/cli/utils/preview/start-dev-server.ts
262
262
  var devServer;
263
263
  var safeAsyncServerListen = (server, port) => {
264
- return new Promise((resolve) => {
264
+ return new Promise((resolve2) => {
265
265
  server.listen(port, () => {
266
- resolve({ portAlreadyInUse: false });
266
+ resolve2({ portAlreadyInUse: false });
267
267
  });
268
268
  server.on("error", (e) => {
269
269
  if (e.code === "EADDRINUSE") {
270
- resolve({ portAlreadyInUse: true });
270
+ resolve2({ portAlreadyInUse: true });
271
271
  }
272
272
  });
273
273
  });
@@ -559,9 +559,6 @@ var createDependencyGraph = async (directory) => {
559
559
  };
560
560
  return [
561
561
  graph,
562
- /**
563
- * @param pathToModified - A path relative to the previosuly provided {@link directory}.
564
- */
565
562
  async (event, pathToModified) => {
566
563
  switch (event) {
567
564
  case "change":
@@ -594,6 +591,20 @@ var createDependencyGraph = async (directory) => {
594
591
  }
595
592
  break;
596
593
  }
594
+ },
595
+ {
596
+ resolveDependentsOf: function resolveDependentsOf(pathToModule) {
597
+ const moduleEntry = graph[pathToModule];
598
+ const dependentPaths = [];
599
+ if (moduleEntry) {
600
+ for (const dependentPath of moduleEntry.dependentPaths) {
601
+ const dependentsOfDependent = resolveDependentsOf(dependentPath);
602
+ dependentPaths.push(...dependentsOfDependent);
603
+ dependentPaths.push(dependentPath);
604
+ }
605
+ }
606
+ return dependentPaths;
607
+ }
597
608
  }
598
609
  ];
599
610
  };
@@ -608,17 +619,6 @@ var setupHotreloading = async (devServer2, emailDirRelativePath) => {
608
619
  clients = clients.filter((item) => item !== client);
609
620
  });
610
621
  });
611
- const watcher = watch(emailDirRelativePath, {
612
- ignoreInitial: true,
613
- cwd: path6.resolve(process.cwd()),
614
- // eslint-disable-next-line prefer-named-capture-group
615
- ignored: /(^|[/\\])\../
616
- });
617
- const exit = () => {
618
- void watcher.close();
619
- };
620
- process.on("SIGINT", exit);
621
- process.on("uncaughtException", exit);
622
622
  let changes = [];
623
623
  const reload = debounce(() => {
624
624
  clients.forEach((client) => {
@@ -630,21 +630,26 @@ var setupHotreloading = async (devServer2, emailDirRelativePath) => {
630
630
  process.cwd(),
631
631
  emailDirRelativePath
632
632
  );
633
- const [dependencyGraph, updateDependencyGraph] = await createDependencyGraph(
634
- absolutePathToEmailsDirectory
633
+ const [dependencyGraph, updateDependencyGraph, { resolveDependentsOf }] = await createDependencyGraph(absolutePathToEmailsDirectory);
634
+ const watcher = watch(emailDirRelativePath, {
635
+ ignoreInitial: true,
636
+ cwd: process.cwd(),
637
+ // eslint-disable-next-line prefer-named-capture-group
638
+ ignored: /(^|[/\\])\../
639
+ // ignore dotfiles
640
+ });
641
+ const getFilesOutsideEmailsDirectory = () => Object.keys(dependencyGraph).filter(
642
+ (p) => path6.relative(absolutePathToEmailsDirectory, p).startsWith("..")
635
643
  );
636
- const resolveDependentsOf = (pathToChangeTarget) => {
637
- const moduleEntry = dependencyGraph[pathToChangeTarget];
638
- const dependentPaths = [];
639
- if (moduleEntry) {
640
- for (const dependentPath of moduleEntry.dependentPaths) {
641
- const dependentsOfDependent = resolveDependentsOf(dependentPath);
642
- dependentPaths.push(...dependentsOfDependent);
643
- dependentPaths.push(dependentPath);
644
- }
645
- }
646
- return dependentPaths;
644
+ let filesOutsideEmailsDirectory = getFilesOutsideEmailsDirectory();
645
+ for (const p of filesOutsideEmailsDirectory) {
646
+ watcher.add(p);
647
+ }
648
+ const exit = async () => {
649
+ await watcher.close();
647
650
  };
651
+ process.on("SIGINT", exit);
652
+ process.on("uncaughtException", exit);
648
653
  watcher.on("all", async (event, relativePathToChangeTarget) => {
649
654
  const file = relativePathToChangeTarget.split(path6.sep);
650
655
  if (file.length === 0) {
@@ -655,6 +660,18 @@ var setupHotreloading = async (devServer2, emailDirRelativePath) => {
655
660
  relativePathToChangeTarget
656
661
  );
657
662
  await updateDependencyGraph(event, pathToChangeTarget);
663
+ const newFilesOutsideEmailsDirectory = getFilesOutsideEmailsDirectory();
664
+ for (const p of filesOutsideEmailsDirectory) {
665
+ if (!newFilesOutsideEmailsDirectory.includes(p)) {
666
+ watcher.unwatch(p);
667
+ }
668
+ }
669
+ for (const p of newFilesOutsideEmailsDirectory) {
670
+ if (!filesOutsideEmailsDirectory.includes(p)) {
671
+ watcher.add(p);
672
+ }
673
+ }
674
+ filesOutsideEmailsDirectory = newFilesOutsideEmailsDirectory;
658
675
  changes.push({
659
676
  event,
660
677
  filename: relativePathToChangeTarget
@@ -730,7 +747,7 @@ var mergeDirectoriesWithSubDirectories = (emailsDirectoryMetadata) => {
730
747
  }
731
748
  return currentResultingMergedDirectory;
732
749
  };
733
- var getEmailsDirectoryMetadata = async (absolutePathToEmailsDirectory) => {
750
+ var getEmailsDirectoryMetadata = async (absolutePathToEmailsDirectory, keepFileExtensions = false) => {
734
751
  if (!fs5.existsSync(absolutePathToEmailsDirectory))
735
752
  return;
736
753
  const dirents = await fs5.promises.readdir(absolutePathToEmailsDirectory, {
@@ -738,7 +755,9 @@ var getEmailsDirectoryMetadata = async (absolutePathToEmailsDirectory) => {
738
755
  });
739
756
  const emailFilenames = dirents.filter(
740
757
  (dirent) => isFileAnEmail(path7.join(absolutePathToEmailsDirectory, dirent.name))
741
- ).map((dirent) => dirent.name.replace(path7.extname(dirent.name), ""));
758
+ ).map(
759
+ (dirent) => keepFileExtensions ? dirent.name : dirent.name.replace(path7.extname(dirent.name), "")
760
+ );
742
761
  const subDirectories = await Promise.all(
743
762
  dirents.filter(
744
763
  (dirent) => dirent.isDirectory() && !dirent.name.startsWith("_") && dirent.name !== "static"
@@ -825,7 +844,8 @@ var exportTemplates = async (pathToWhereEmailMarkupShouldBeDumped, emailsDirecto
825
844
  closeOraOnSIGNIT(spinner);
826
845
  }
827
846
  const emailsDirectoryMetadata = await getEmailsDirectoryMetadata(
828
- path9.resolve(process.cwd(), emailsDirectoryPath)
847
+ path9.resolve(process.cwd(), emailsDirectoryPath),
848
+ true
829
849
  );
830
850
  if (typeof emailsDirectoryMetadata === "undefined") {
831
851
  if (spinner) {
@@ -951,7 +971,7 @@ import ora3 from "ora";
951
971
  import { spawn } from "child_process";
952
972
  import logSymbols3 from "log-symbols";
953
973
  var buildPreviewApp = (absoluteDirectory) => {
954
- return new Promise((resolve, reject) => {
974
+ return new Promise((resolve2, reject) => {
955
975
  const nextBuild = spawn("npm", ["run", "build"], {
956
976
  cwd: absoluteDirectory,
957
977
  shell: true
@@ -960,7 +980,7 @@ var buildPreviewApp = (absoluteDirectory) => {
960
980
  nextBuild.stderr.pipe(process.stderr);
961
981
  nextBuild.on("close", (code) => {
962
982
  if (code === 0) {
963
- resolve();
983
+ resolve2();
964
984
  } else {
965
985
  reject(
966
986
  new Error(
@@ -1075,7 +1095,7 @@ var updatePackageJson = async (builtPreviewAppPath) => {
1075
1095
  );
1076
1096
  };
1077
1097
  var npmInstall = async (builtPreviewAppPath, packageManager) => {
1078
- return new Promise(async (resolve, reject) => {
1098
+ return new Promise(async (resolve2, reject) => {
1079
1099
  const childProc = spawn(packageManager, ["install", "--silent"], {
1080
1100
  cwd: builtPreviewAppPath,
1081
1101
  shell: true
@@ -1084,7 +1104,7 @@ var npmInstall = async (builtPreviewAppPath, packageManager) => {
1084
1104
  childProc.stderr.pipe(process.stderr);
1085
1105
  childProc.on("close", (code) => {
1086
1106
  if (code === 0) {
1087
- resolve();
1107
+ resolve2();
1088
1108
  } else {
1089
1109
  reject(
1090
1110
  new Error(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-email",
3
- "version": "2.1.5",
3
+ "version": "2.1.6",
4
4
  "description": "A live preview of your emails right in your browser.",
5
5
  "bin": {
6
6
  "email": "./cli/index.js"
@@ -61,8 +61,6 @@
61
61
  "typescript": "5.1.6"
62
62
  },
63
63
  "devDependencies": {
64
- "@react-email/components": "0.0.19",
65
- "@react-email/render": "0.0.15",
66
64
  "@types/babel__core": "7.20.5",
67
65
  "@types/fs-extra": "11.0.1",
68
66
  "@types/mime-types": "2.1.4",
@@ -72,7 +70,9 @@
72
70
  "eslint": "8.50.0",
73
71
  "tsup": "7.2.0",
74
72
  "tsx": "4.9.0",
75
- "vitest": "1.1.3"
73
+ "vitest": "1.1.3",
74
+ "@react-email/components": "0.0.22",
75
+ "@react-email/render": "0.0.17"
76
76
  },
77
77
  "scripts": {
78
78
  "build": "tsup",
@@ -60,6 +60,7 @@ const mergeDirectoriesWithSubDirectories = (
60
60
 
61
61
  export const getEmailsDirectoryMetadata = async (
62
62
  absolutePathToEmailsDirectory: string,
63
+ keepFileExtensions = false,
63
64
  ): Promise<EmailsDirectory | undefined> => {
64
65
  if (!fs.existsSync(absolutePathToEmailsDirectory)) return;
65
66
 
@@ -71,7 +72,11 @@ export const getEmailsDirectoryMetadata = async (
71
72
  .filter((dirent) =>
72
73
  isFileAnEmail(path.join(absolutePathToEmailsDirectory, dirent.name)),
73
74
  )
74
- .map((dirent) => dirent.name.replace(path.extname(dirent.name), ''));
75
+ .map((dirent) =>
76
+ keepFileExtensions
77
+ ? dirent.name
78
+ : dirent.name.replace(path.extname(dirent.name), ''),
79
+ );
75
80
 
76
81
  const subDirectories = await Promise.all(
77
82
  dirents