@vercel/microfrontends 2.2.0 → 2.2.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @vercel/microfrontends
2
2
 
3
+ ## 2.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - d1e7cf7: Improve debug logging when inferring the microfrontends.json configuration when the MFE_DEBUG env var is set.
8
+
3
9
  ## 2.2.0
4
10
 
5
11
  ### Minor Changes
package/dist/bin/cli.cjs CHANGED
@@ -30,7 +30,7 @@ var import_env = require("@next/env");
30
30
  // package.json
31
31
  var package_default = {
32
32
  name: "@vercel/microfrontends",
33
- version: "2.2.0",
33
+ version: "2.2.1",
34
34
  private: false,
35
35
  description: "Defines configuration and utilities for microfrontends development",
36
36
  keywords: [
@@ -1117,6 +1117,28 @@ var import_node_fs2 = require("fs");
1117
1117
  var import_jsonc_parser2 = require("jsonc-parser");
1118
1118
  var import_fast_glob = __toESM(require("fast-glob"), 1);
1119
1119
 
1120
+ // src/bin/logger.ts
1121
+ function debug(...args) {
1122
+ if (process.env.MFE_DEBUG) {
1123
+ console.log(...args);
1124
+ }
1125
+ }
1126
+ function info(...args) {
1127
+ console.log(...args);
1128
+ }
1129
+ function warn(...args) {
1130
+ console.warn(...args);
1131
+ }
1132
+ function error(...args) {
1133
+ console.error(...args);
1134
+ }
1135
+ var logger = {
1136
+ debug,
1137
+ info,
1138
+ warn,
1139
+ error
1140
+ };
1141
+
1120
1142
  // src/config/microfrontends/utils/get-config-file-name.ts
1121
1143
  var DEFAULT_CONFIGURATION_FILENAMES = [
1122
1144
  "microfrontends.json",
@@ -1146,6 +1168,10 @@ function findPackageWithMicrofrontendsConfig({
1146
1168
  customConfigFilename
1147
1169
  }) {
1148
1170
  const applicationName = applicationContext.name;
1171
+ logger.debug(
1172
+ "[MFE Config] Searching repository for configs containing application:",
1173
+ applicationName
1174
+ );
1149
1175
  try {
1150
1176
  const microfrontendsJsonPaths = import_fast_glob.default.globSync(
1151
1177
  `**/{${getPossibleConfigurationFilenames({ customConfigFilename }).join(",")}}`,
@@ -1157,6 +1183,11 @@ function findPackageWithMicrofrontendsConfig({
1157
1183
  ignore: ["**/node_modules/**", "**/.git/**"]
1158
1184
  }
1159
1185
  );
1186
+ logger.debug(
1187
+ "[MFE Config] Found",
1188
+ microfrontendsJsonPaths.length,
1189
+ "config file(s) in repository"
1190
+ );
1160
1191
  const matchingPaths = [];
1161
1192
  for (const microfrontendsJsonPath of microfrontendsJsonPaths) {
1162
1193
  try {
@@ -1166,12 +1197,20 @@ function findPackageWithMicrofrontendsConfig({
1166
1197
  );
1167
1198
  const microfrontendsJson = (0, import_jsonc_parser2.parse)(microfrontendsJsonContent);
1168
1199
  if (microfrontendsJson.applications[applicationName]) {
1200
+ logger.debug(
1201
+ "[MFE Config] Found application in config:",
1202
+ microfrontendsJsonPath
1203
+ );
1169
1204
  matchingPaths.push(microfrontendsJsonPath);
1170
1205
  } else {
1171
1206
  for (const [_, app] of Object.entries(
1172
1207
  microfrontendsJson.applications
1173
1208
  )) {
1174
1209
  if (app.packageName === applicationName) {
1210
+ logger.debug(
1211
+ "[MFE Config] Found application via packageName in config:",
1212
+ microfrontendsJsonPath
1213
+ );
1175
1214
  matchingPaths.push(microfrontendsJsonPath);
1176
1215
  }
1177
1216
  }
@@ -1179,6 +1218,10 @@ function findPackageWithMicrofrontendsConfig({
1179
1218
  } catch (error2) {
1180
1219
  }
1181
1220
  }
1221
+ logger.debug(
1222
+ "[MFE Config] Total matching config files:",
1223
+ matchingPaths.length
1224
+ );
1182
1225
  if (matchingPaths.length > 1) {
1183
1226
  throw new MicrofrontendError(
1184
1227
  `Found multiple \`microfrontends.json\` files in the repository referencing the application "${applicationName}", but only one is allowed.
@@ -1238,30 +1281,6 @@ function inferMicrofrontendsLocation(opts) {
1238
1281
  // src/config/microfrontends/utils/is-monorepo.ts
1239
1282
  var import_node_fs3 = __toESM(require("fs"), 1);
1240
1283
  var import_node_path3 = __toESM(require("path"), 1);
1241
-
1242
- // src/bin/logger.ts
1243
- function debug(...args) {
1244
- if (process.env.MFE_DEBUG) {
1245
- console.log(...args);
1246
- }
1247
- }
1248
- function info(...args) {
1249
- console.log(...args);
1250
- }
1251
- function warn(...args) {
1252
- console.warn(...args);
1253
- }
1254
- function error(...args) {
1255
- console.error(...args);
1256
- }
1257
- var logger = {
1258
- debug,
1259
- info,
1260
- warn,
1261
- error
1262
- };
1263
-
1264
- // src/config/microfrontends/utils/is-monorepo.ts
1265
1284
  function isMonorepo({
1266
1285
  repositoryRoot
1267
1286
  }) {
@@ -1330,15 +1349,18 @@ var import_node_fs6 = __toESM(require("fs"), 1);
1330
1349
  var import_node_path6 = __toESM(require("path"), 1);
1331
1350
  function getApplicationContext(opts) {
1332
1351
  if (opts?.appName) {
1352
+ logger.debug("[MFE Config] Application name from appName parameter:", opts.appName);
1333
1353
  return { name: opts.appName };
1334
1354
  }
1335
1355
  if (process.env.VERCEL_PROJECT_NAME) {
1356
+ logger.debug("[MFE Config] Application name from VERCEL_PROJECT_NAME:", process.env.VERCEL_PROJECT_NAME);
1336
1357
  return {
1337
1358
  name: process.env.VERCEL_PROJECT_NAME,
1338
1359
  projectName: process.env.VERCEL_PROJECT_NAME
1339
1360
  };
1340
1361
  }
1341
1362
  if (process.env.NX_TASK_TARGET_PROJECT) {
1363
+ logger.debug("[MFE Config] Application name from NX_TASK_TARGET_PROJECT:", process.env.NX_TASK_TARGET_PROJECT);
1342
1364
  return {
1343
1365
  name: process.env.NX_TASK_TARGET_PROJECT,
1344
1366
  packageJsonName: process.env.NX_TASK_TARGET_PROJECT
@@ -1351,6 +1373,7 @@ function getApplicationContext(opts) {
1351
1373
  );
1352
1374
  const projectJson = JSON.parse(vercelProjectJsonPath);
1353
1375
  if (projectJson.projectName) {
1376
+ logger.debug("[MFE Config] Application name from .vercel/project.json:", projectJson.projectName);
1354
1377
  return {
1355
1378
  name: projectJson.projectName,
1356
1379
  projectName: projectJson.projectName
@@ -1374,6 +1397,7 @@ function getApplicationContext(opts) {
1374
1397
  }
1375
1398
  );
1376
1399
  }
1400
+ logger.debug("[MFE Config] Application name from package.json:", packageJson.name);
1377
1401
  return { name: packageJson.name, packageJsonName: packageJson.name };
1378
1402
  } catch (err) {
1379
1403
  throw MicrofrontendError.handle(err, {
@@ -1745,7 +1769,13 @@ var MicrofrontendsServer = class {
1745
1769
  filePath,
1746
1770
  cookies
1747
1771
  } = {}) {
1772
+ logger.debug("[MFE Config] Starting config inference", {
1773
+ appName,
1774
+ directory: directory || process.cwd(),
1775
+ filePath
1776
+ });
1748
1777
  if (filePath) {
1778
+ logger.debug("[MFE Config] Using explicit filePath:", filePath);
1749
1779
  return MicrofrontendsServer.fromFile({
1750
1780
  filePath,
1751
1781
  cookies
@@ -1753,16 +1783,25 @@ var MicrofrontendsServer = class {
1753
1783
  }
1754
1784
  try {
1755
1785
  const packageRoot = findPackageRoot(directory);
1786
+ logger.debug("[MFE Config] Package root:", packageRoot);
1756
1787
  const applicationContext = getApplicationContext({
1757
1788
  appName,
1758
1789
  packageRoot
1759
1790
  });
1791
+ logger.debug("[MFE Config] Application context:", applicationContext);
1760
1792
  const customConfigFilename = process.env.VC_MICROFRONTENDS_CONFIG_FILE_NAME;
1793
+ if (customConfigFilename) {
1794
+ logger.debug(
1795
+ "[MFE Config] Custom config filename from VC_MICROFRONTENDS_CONFIG_FILE_NAME:",
1796
+ customConfigFilename
1797
+ );
1798
+ }
1761
1799
  const maybeConfig = findConfig({
1762
1800
  dir: packageRoot,
1763
1801
  customConfigFilename
1764
1802
  });
1765
1803
  if (maybeConfig) {
1804
+ logger.debug("[MFE Config] Config found at package root:", maybeConfig);
1766
1805
  return MicrofrontendsServer.fromFile({
1767
1806
  filePath: maybeConfig,
1768
1807
  cookies
@@ -1770,42 +1809,78 @@ var MicrofrontendsServer = class {
1770
1809
  }
1771
1810
  const repositoryRoot = findRepositoryRoot();
1772
1811
  const isMonorepo2 = isMonorepo({ repositoryRoot });
1812
+ logger.debug(
1813
+ "[MFE Config] Repository root:",
1814
+ repositoryRoot,
1815
+ "Is monorepo:",
1816
+ isMonorepo2
1817
+ );
1773
1818
  const configFromEnv = process.env.VC_MICROFRONTENDS_CONFIG;
1774
1819
  if (typeof configFromEnv === "string") {
1820
+ logger.debug(
1821
+ "[MFE Config] Checking VC_MICROFRONTENDS_CONFIG:",
1822
+ configFromEnv
1823
+ );
1775
1824
  const maybeConfigFromEnv = (0, import_node_path8.resolve)(packageRoot, configFromEnv);
1776
1825
  if (maybeConfigFromEnv) {
1826
+ logger.debug(
1827
+ "[MFE Config] Config loaded from VC_MICROFRONTENDS_CONFIG:",
1828
+ maybeConfigFromEnv
1829
+ );
1777
1830
  return MicrofrontendsServer.fromFile({
1778
1831
  filePath: maybeConfigFromEnv,
1779
1832
  cookies
1780
1833
  });
1781
1834
  }
1782
1835
  } else {
1836
+ const vercelDir = (0, import_node_path8.join)(packageRoot, ".vercel");
1837
+ logger.debug(
1838
+ "[MFE Config] Searching for config in .vercel directory:",
1839
+ vercelDir
1840
+ );
1783
1841
  const maybeConfigFromVercel = findConfig({
1784
- dir: (0, import_node_path8.join)(packageRoot, ".vercel"),
1842
+ dir: vercelDir,
1785
1843
  customConfigFilename
1786
1844
  });
1787
1845
  if (maybeConfigFromVercel) {
1846
+ logger.debug(
1847
+ "[MFE Config] Config found in .vercel directory:",
1848
+ maybeConfigFromVercel
1849
+ );
1788
1850
  return MicrofrontendsServer.fromFile({
1789
1851
  filePath: maybeConfigFromVercel,
1790
1852
  cookies
1791
1853
  });
1792
1854
  }
1793
1855
  if (isMonorepo2) {
1856
+ logger.debug(
1857
+ "[MFE Config] Inferring microfrontends location in monorepo for application:",
1858
+ applicationContext.name
1859
+ );
1794
1860
  const defaultPackage = inferMicrofrontendsLocation({
1795
1861
  repositoryRoot,
1796
1862
  applicationContext,
1797
1863
  customConfigFilename
1798
1864
  });
1865
+ logger.debug(
1866
+ "[MFE Config] Inferred package location:",
1867
+ defaultPackage
1868
+ );
1799
1869
  const maybeConfigFromDefault = findConfig({
1800
1870
  dir: defaultPackage,
1801
1871
  customConfigFilename
1802
1872
  });
1803
1873
  if (maybeConfigFromDefault) {
1874
+ logger.debug(
1875
+ "[MFE Config] Config found in inferred package:",
1876
+ maybeConfigFromDefault
1877
+ );
1804
1878
  return MicrofrontendsServer.fromFile({
1805
1879
  filePath: maybeConfigFromDefault,
1806
1880
  cookies
1807
1881
  });
1808
1882
  }
1883
+ logger.debug("[MFE Config] No config found in inferred package");
1809
1884
  }
1810
1885
  }
1811
1886
  throw new MicrofrontendError(
@@ -1831,8 +1906,13 @@ var MicrofrontendsServer = class {
1831
1906
  cookies
1832
1907
  }) {
1833
1908
  try {
1909
+ logger.debug("[MFE Config] Reading config from file:", filePath);
1834
1910
  const configJson = import_node_fs7.default.readFileSync(filePath, "utf-8");
1835
1911
  const config = MicrofrontendsServer.validate(configJson);
1912
+ logger.debug(
1913
+ "[MFE Config] Config loaded with applications:",
1914
+ Object.keys(config.applications)
1915
+ );
1836
1916
  return new MicrofrontendsServer({
1837
1917
  config,
1838
1918
  overrides: cookies ? parseOverrides(cookies) : void 0
@@ -2890,6 +2970,7 @@ function loadConfig({
2890
2970
 
2891
2971
  // src/bin/port.ts
2892
2972
  function displayPort() {
2973
+ delete process.env.MFE_DEBUG;
2893
2974
  const portInfo = mfePort((0, import_node_process.cwd)());
2894
2975
  header(portInfo);
2895
2976
  logger.info(portInfo.port);
@@ -287,6 +287,10 @@ function findPackageWithMicrofrontendsConfig({
287
287
  customConfigFilename
288
288
  }) {
289
289
  const applicationName = applicationContext.name;
290
+ logger.debug(
291
+ "[MFE Config] Searching repository for configs containing application:",
292
+ applicationName
293
+ );
290
294
  try {
291
295
  const microfrontendsJsonPaths = import_fast_glob.default.globSync(
292
296
  `**/{${getPossibleConfigurationFilenames({ customConfigFilename }).join(",")}}`,
@@ -298,6 +302,11 @@ function findPackageWithMicrofrontendsConfig({
298
302
  ignore: ["**/node_modules/**", "**/.git/**"]
299
303
  }
300
304
  );
305
+ logger.debug(
306
+ "[MFE Config] Found",
307
+ microfrontendsJsonPaths.length,
308
+ "config file(s) in repository"
309
+ );
301
310
  const matchingPaths = [];
302
311
  for (const microfrontendsJsonPath of microfrontendsJsonPaths) {
303
312
  try {
@@ -307,12 +316,20 @@ function findPackageWithMicrofrontendsConfig({
307
316
  );
308
317
  const microfrontendsJson = (0, import_jsonc_parser.parse)(microfrontendsJsonContent);
309
318
  if (microfrontendsJson.applications[applicationName]) {
319
+ logger.debug(
320
+ "[MFE Config] Found application in config:",
321
+ microfrontendsJsonPath
322
+ );
310
323
  matchingPaths.push(microfrontendsJsonPath);
311
324
  } else {
312
325
  for (const [_, app] of Object.entries(
313
326
  microfrontendsJson.applications
314
327
  )) {
315
328
  if (app.packageName === applicationName) {
329
+ logger.debug(
330
+ "[MFE Config] Found application via packageName in config:",
331
+ microfrontendsJsonPath
332
+ );
316
333
  matchingPaths.push(microfrontendsJsonPath);
317
334
  }
318
335
  }
@@ -320,6 +337,10 @@ function findPackageWithMicrofrontendsConfig({
320
337
  } catch (error2) {
321
338
  }
322
339
  }
340
+ logger.debug(
341
+ "[MFE Config] Total matching config files:",
342
+ matchingPaths.length
343
+ );
323
344
  if (matchingPaths.length > 1) {
324
345
  throw new MicrofrontendError(
325
346
  `Found multiple \`microfrontends.json\` files in the repository referencing the application "${applicationName}", but only one is allowed.
@@ -1118,15 +1139,18 @@ var import_node_fs6 = __toESM(require("fs"), 1);
1118
1139
  var import_node_path6 = __toESM(require("path"), 1);
1119
1140
  function getApplicationContext(opts) {
1120
1141
  if (opts?.appName) {
1142
+ logger.debug("[MFE Config] Application name from appName parameter:", opts.appName);
1121
1143
  return { name: opts.appName };
1122
1144
  }
1123
1145
  if (process.env.VERCEL_PROJECT_NAME) {
1146
+ logger.debug("[MFE Config] Application name from VERCEL_PROJECT_NAME:", process.env.VERCEL_PROJECT_NAME);
1124
1147
  return {
1125
1148
  name: process.env.VERCEL_PROJECT_NAME,
1126
1149
  projectName: process.env.VERCEL_PROJECT_NAME
1127
1150
  };
1128
1151
  }
1129
1152
  if (process.env.NX_TASK_TARGET_PROJECT) {
1153
+ logger.debug("[MFE Config] Application name from NX_TASK_TARGET_PROJECT:", process.env.NX_TASK_TARGET_PROJECT);
1130
1154
  return {
1131
1155
  name: process.env.NX_TASK_TARGET_PROJECT,
1132
1156
  packageJsonName: process.env.NX_TASK_TARGET_PROJECT
@@ -1139,6 +1163,7 @@ function getApplicationContext(opts) {
1139
1163
  );
1140
1164
  const projectJson = JSON.parse(vercelProjectJsonPath);
1141
1165
  if (projectJson.projectName) {
1166
+ logger.debug("[MFE Config] Application name from .vercel/project.json:", projectJson.projectName);
1142
1167
  return {
1143
1168
  name: projectJson.projectName,
1144
1169
  projectName: projectJson.projectName
@@ -1162,6 +1187,7 @@ function getApplicationContext(opts) {
1162
1187
  }
1163
1188
  );
1164
1189
  }
1190
+ logger.debug("[MFE Config] Application name from package.json:", packageJson.name);
1165
1191
  return { name: packageJson.name, packageJsonName: packageJson.name };
1166
1192
  } catch (err) {
1167
1193
  throw MicrofrontendError.handle(err, {
@@ -1533,7 +1559,13 @@ var MicrofrontendsServer = class {
1533
1559
  filePath,
1534
1560
  cookies
1535
1561
  } = {}) {
1562
+ logger.debug("[MFE Config] Starting config inference", {
1563
+ appName,
1564
+ directory: directory || process.cwd(),
1565
+ filePath
1566
+ });
1536
1567
  if (filePath) {
1568
+ logger.debug("[MFE Config] Using explicit filePath:", filePath);
1537
1569
  return MicrofrontendsServer.fromFile({
1538
1570
  filePath,
1539
1571
  cookies
@@ -1541,16 +1573,25 @@ var MicrofrontendsServer = class {
1541
1573
  }
1542
1574
  try {
1543
1575
  const packageRoot = findPackageRoot(directory);
1576
+ logger.debug("[MFE Config] Package root:", packageRoot);
1544
1577
  const applicationContext = getApplicationContext({
1545
1578
  appName,
1546
1579
  packageRoot
1547
1580
  });
1581
+ logger.debug("[MFE Config] Application context:", applicationContext);
1548
1582
  const customConfigFilename = process.env.VC_MICROFRONTENDS_CONFIG_FILE_NAME;
1583
+ if (customConfigFilename) {
1584
+ logger.debug(
1585
+ "[MFE Config] Custom config filename from VC_MICROFRONTENDS_CONFIG_FILE_NAME:",
1586
+ customConfigFilename
1587
+ );
1588
+ }
1549
1589
  const maybeConfig = findConfig({
1550
1590
  dir: packageRoot,
1551
1591
  customConfigFilename
1552
1592
  });
1553
1593
  if (maybeConfig) {
1594
+ logger.debug("[MFE Config] Config found at package root:", maybeConfig);
1554
1595
  return MicrofrontendsServer.fromFile({
1555
1596
  filePath: maybeConfig,
1556
1597
  cookies
@@ -1558,42 +1599,78 @@ var MicrofrontendsServer = class {
1558
1599
  }
1559
1600
  const repositoryRoot = findRepositoryRoot();
1560
1601
  const isMonorepo2 = isMonorepo({ repositoryRoot });
1602
+ logger.debug(
1603
+ "[MFE Config] Repository root:",
1604
+ repositoryRoot,
1605
+ "Is monorepo:",
1606
+ isMonorepo2
1607
+ );
1561
1608
  const configFromEnv = process.env.VC_MICROFRONTENDS_CONFIG;
1562
1609
  if (typeof configFromEnv === "string") {
1610
+ logger.debug(
1611
+ "[MFE Config] Checking VC_MICROFRONTENDS_CONFIG:",
1612
+ configFromEnv
1613
+ );
1563
1614
  const maybeConfigFromEnv = (0, import_node_path8.resolve)(packageRoot, configFromEnv);
1564
1615
  if (maybeConfigFromEnv) {
1616
+ logger.debug(
1617
+ "[MFE Config] Config loaded from VC_MICROFRONTENDS_CONFIG:",
1618
+ maybeConfigFromEnv
1619
+ );
1565
1620
  return MicrofrontendsServer.fromFile({
1566
1621
  filePath: maybeConfigFromEnv,
1567
1622
  cookies
1568
1623
  });
1569
1624
  }
1570
1625
  } else {
1626
+ const vercelDir = (0, import_node_path8.join)(packageRoot, ".vercel");
1627
+ logger.debug(
1628
+ "[MFE Config] Searching for config in .vercel directory:",
1629
+ vercelDir
1630
+ );
1571
1631
  const maybeConfigFromVercel = findConfig({
1572
- dir: (0, import_node_path8.join)(packageRoot, ".vercel"),
1632
+ dir: vercelDir,
1573
1633
  customConfigFilename
1574
1634
  });
1575
1635
  if (maybeConfigFromVercel) {
1636
+ logger.debug(
1637
+ "[MFE Config] Config found in .vercel directory:",
1638
+ maybeConfigFromVercel
1639
+ );
1576
1640
  return MicrofrontendsServer.fromFile({
1577
1641
  filePath: maybeConfigFromVercel,
1578
1642
  cookies
1579
1643
  });
1580
1644
  }
1581
1645
  if (isMonorepo2) {
1646
+ logger.debug(
1647
+ "[MFE Config] Inferring microfrontends location in monorepo for application:",
1648
+ applicationContext.name
1649
+ );
1582
1650
  const defaultPackage = inferMicrofrontendsLocation({
1583
1651
  repositoryRoot,
1584
1652
  applicationContext,
1585
1653
  customConfigFilename
1586
1654
  });
1655
+ logger.debug(
1656
+ "[MFE Config] Inferred package location:",
1657
+ defaultPackage
1658
+ );
1587
1659
  const maybeConfigFromDefault = findConfig({
1588
1660
  dir: defaultPackage,
1589
1661
  customConfigFilename
1590
1662
  });
1591
1663
  if (maybeConfigFromDefault) {
1664
+ logger.debug(
1665
+ "[MFE Config] Config found in inferred package:",
1666
+ maybeConfigFromDefault
1667
+ );
1592
1668
  return MicrofrontendsServer.fromFile({
1593
1669
  filePath: maybeConfigFromDefault,
1594
1670
  cookies
1595
1671
  });
1596
1672
  }
1673
+ logger.debug("[MFE Config] No config found in inferred package");
1597
1674
  }
1598
1675
  }
1599
1676
  throw new MicrofrontendError(
@@ -1619,8 +1696,13 @@ var MicrofrontendsServer = class {
1619
1696
  cookies
1620
1697
  }) {
1621
1698
  try {
1699
+ logger.debug("[MFE Config] Reading config from file:", filePath);
1622
1700
  const configJson = import_node_fs7.default.readFileSync(filePath, "utf-8");
1623
1701
  const config = MicrofrontendsServer.validate(configJson);
1702
+ logger.debug(
1703
+ "[MFE Config] Config loaded with applications:",
1704
+ Object.keys(config.applications)
1705
+ );
1624
1706
  return new MicrofrontendsServer({
1625
1707
  config,
1626
1708
  overrides: cookies ? parseOverrides(cookies) : void 0