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 +15 -0
- package/cli/index.js +162 -70
- package/cli/index.mjs +60 -40
- package/package.json +4 -4
- package/src/actions/get-emails-directory-metadata.ts +6 -1
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.
|
|
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": "
|
|
413
|
-
"@react-email/render": "
|
|
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(
|
|
714
|
+
return new Promise(function(resolve2) {
|
|
715
715
|
server.listen(port, function() {
|
|
716
|
-
|
|
716
|
+
resolve2({
|
|
717
717
|
portAlreadyInUse: false
|
|
718
718
|
});
|
|
719
719
|
});
|
|
720
720
|
server.on("error", function(e) {
|
|
721
721
|
if (e.code === "EADDRINUSE") {
|
|
722
|
-
|
|
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,
|
|
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
|
-
|
|
1625
|
-
]), dependencyGraph = _ref[0], updateDependencyGraph = _ref[1];
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1769
|
+
_iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
|
|
1680
1770
|
try {
|
|
1681
|
-
for(
|
|
1682
|
-
dependentPath =
|
|
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
|
-
|
|
1690
|
-
|
|
1779
|
+
_didIteratorError2 = true;
|
|
1780
|
+
_iteratorError2 = err;
|
|
1691
1781
|
} finally{
|
|
1692
1782
|
try {
|
|
1693
|
-
if (!
|
|
1694
|
-
|
|
1783
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
1784
|
+
_iterator2.return();
|
|
1695
1785
|
}
|
|
1696
1786
|
} finally{
|
|
1697
|
-
if (
|
|
1698
|
-
throw
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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": "
|
|
86
|
-
"@react-email/render": "
|
|
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((
|
|
264
|
+
return new Promise((resolve2) => {
|
|
265
265
|
server.listen(port, () => {
|
|
266
|
-
|
|
266
|
+
resolve2({ portAlreadyInUse: false });
|
|
267
267
|
});
|
|
268
268
|
server.on("error", (e) => {
|
|
269
269
|
if (e.code === "EADDRINUSE") {
|
|
270
|
-
|
|
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
|
-
|
|
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
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
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(
|
|
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((
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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.
|
|
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) =>
|
|
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
|