@medusajs/admin-vite-plugin 3.0.0-snapshot-20250410105645 → 3.0.0-snapshot-20251104004624

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.
Files changed (3) hide show
  1. package/dist/index.js +132 -43
  2. package/dist/index.mjs +127 -37
  3. package/package.json +11 -15
package/dist/index.js CHANGED
@@ -28,14 +28,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
30
  // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- default: () => src_default
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ default: () => index_default
34
34
  });
35
- module.exports = __toCommonJS(src_exports);
35
+ module.exports = __toCommonJS(index_exports);
36
36
 
37
37
  // src/plugin.ts
38
- var import_promises10 = require("fs/promises");
38
+ var import_promises11 = require("fs/promises");
39
39
  var import_node_path = __toESM(require("path"));
40
40
 
41
41
  // src/custom-fields/generate-custom-field-displays.ts
@@ -122,7 +122,7 @@ function generateModule(code) {
122
122
  map: magicString.generateMap({ hires: true })
123
123
  };
124
124
  }
125
- var VALID_FILE_EXTENSIONS = [".tsx", ".jsx", ".js"];
125
+ var VALID_FILE_EXTENSIONS = [".tsx", ".jsx", ".js", ".ts"];
126
126
  async function crawl(dir, file, depth) {
127
127
  const dirDepth = dir.split(import_path.default.sep).length;
128
128
  const crawler = new import_fdir.fdir().withBasePath().exclude((dirName) => dirName.startsWith("_")).filter((path3) => {
@@ -1098,10 +1098,57 @@ function getLink(path3, index, file) {
1098
1098
  return `${import_}.link`;
1099
1099
  }
1100
1100
 
1101
- // src/routes/generate-menu-items.ts
1102
- var import_admin_shared4 = require("@medusajs/admin-shared");
1101
+ // src/i18n/generate-i18n-hash.ts
1103
1102
  var import_promises5 = __toESM(require("fs/promises"));
1103
+
1104
+ // src/i18n/helpers.ts
1105
+ async function getI18nIndexFilesFromSources(sources) {
1106
+ return (await Promise.all(
1107
+ Array.from(sources).map(
1108
+ async (source) => crawl(`${source}/i18n`, "index", { min: 0, max: 0 })
1109
+ )
1110
+ )).flat();
1111
+ }
1112
+
1113
+ // src/i18n/generate-i18n-hash.ts
1114
+ async function generateI18nHash(sources) {
1115
+ const indexFiles = await getI18nIndexFilesFromSources(sources);
1116
+ const contents = await Promise.all(
1117
+ indexFiles.map((file) => import_promises5.default.readFile(file, "utf-8"))
1118
+ );
1119
+ const totalContent = contents.join("");
1120
+ return generateHash(totalContent);
1121
+ }
1122
+
1123
+ // src/i18n/generate-i18n.ts
1104
1124
  var import_outdent2 = require("outdent");
1125
+ async function generateI18n(sources) {
1126
+ const indexFiles = await getI18nIndexFilesFromSources(sources);
1127
+ const imports = indexFiles.map((file, index) => {
1128
+ const normalizedPath = normalizePath(file);
1129
+ return `import i18nTranslations${index} from "${normalizedPath}"`;
1130
+ });
1131
+ let mergeCode = "{}";
1132
+ if (indexFiles.length === 1) {
1133
+ mergeCode = "i18nTranslations0";
1134
+ } else if (indexFiles.length > 1) {
1135
+ mergeCode = indexFiles.slice(1).reduce((acc, _, index) => {
1136
+ return `deepMerge(${acc}, i18nTranslations${index + 1})`;
1137
+ }, "i18nTranslations0");
1138
+ }
1139
+ const code = import_outdent2.outdent`
1140
+ resources: ${mergeCode}
1141
+ `;
1142
+ return {
1143
+ imports,
1144
+ code
1145
+ };
1146
+ }
1147
+
1148
+ // src/routes/generate-menu-items.ts
1149
+ var import_admin_shared4 = require("@medusajs/admin-shared");
1150
+ var import_promises6 = __toESM(require("fs/promises"));
1151
+ var import_outdent3 = require("outdent");
1105
1152
 
1106
1153
  // src/routes/helpers.ts
1107
1154
  function getRoute(file) {
@@ -1125,7 +1172,7 @@ async function generateMenuItems(sources) {
1125
1172
  return { imports, code };
1126
1173
  }
1127
1174
  function generateCode3(results) {
1128
- return import_outdent2.outdent`
1175
+ return import_outdent3.outdent`
1129
1176
  menuItems: [
1130
1177
  ${results.map((result) => formatMenuItem(result.menuItem)).join(",\n")}
1131
1178
  ]
@@ -1184,7 +1231,7 @@ function generateMenuItem(config, file, index) {
1184
1231
  };
1185
1232
  }
1186
1233
  async function getRouteConfig(file) {
1187
- const code = await import_promises5.default.readFile(file, "utf-8");
1234
+ const code = await import_promises6.default.readFile(file, "utf-8");
1188
1235
  let ast = null;
1189
1236
  try {
1190
1237
  ast = (0, import_parser.parse)(code, getParserOptions(file));
@@ -1276,7 +1323,7 @@ function generateRouteConfigName(index) {
1276
1323
  }
1277
1324
 
1278
1325
  // src/routes/generate-route-hashes.ts
1279
- var import_promises6 = __toESM(require("fs/promises"));
1326
+ var import_promises7 = __toESM(require("fs/promises"));
1280
1327
  async function generateRouteHashes(sources) {
1281
1328
  const files = await getFilesFromSources6(sources);
1282
1329
  const contents = await Promise.all(files.map(getRouteContents));
@@ -1297,7 +1344,7 @@ async function getFilesFromSources6(sources) {
1297
1344
  )).flat();
1298
1345
  }
1299
1346
  async function getRouteContents(file) {
1300
- const code = await import_promises6.default.readFile(file, "utf-8");
1347
+ const code = await import_promises7.default.readFile(file, "utf-8");
1301
1348
  let ast = null;
1302
1349
  try {
1303
1350
  ast = (0, import_parser.parse)(code, getParserOptions(file));
@@ -1334,8 +1381,8 @@ ${e}`,
1334
1381
  }
1335
1382
 
1336
1383
  // src/routes/generate-routes.ts
1337
- var import_promises7 = __toESM(require("fs/promises"));
1338
- var import_outdent3 = require("outdent");
1384
+ var import_promises8 = __toESM(require("fs/promises"));
1385
+ var import_outdent4 = require("outdent");
1339
1386
  async function generateRoutes(sources) {
1340
1387
  const files = await getFilesFromSources7(sources);
1341
1388
  const results = await getRouteResults(files);
@@ -1347,7 +1394,7 @@ async function generateRoutes(sources) {
1347
1394
  };
1348
1395
  }
1349
1396
  function generateCode4(results) {
1350
- return import_outdent3.outdent`
1397
+ return import_outdent4.outdent`
1351
1398
  routes: [
1352
1399
  ${results.map((result) => formatRoute(result.route)).join(",\n")}
1353
1400
  ]
@@ -1411,7 +1458,7 @@ async function getRouteResults(files) {
1411
1458
  return Array.from(routeMap.values());
1412
1459
  }
1413
1460
  async function parseFile4(file, index) {
1414
- const code = await import_promises7.default.readFile(file, "utf-8");
1461
+ const code = await import_promises8.default.readFile(file, "utf-8");
1415
1462
  let ast = null;
1416
1463
  try {
1417
1464
  ast = (0, import_parser.parse)(code, getParserOptions(file));
@@ -1509,10 +1556,10 @@ async function hasNamedExports(ast, file) {
1509
1556
  }
1510
1557
 
1511
1558
  // src/virtual-modules/generate-virtual-display-module.ts
1512
- var import_outdent4 = require("outdent");
1559
+ var import_outdent5 = require("outdent");
1513
1560
  async function generateVirtualDisplayModule(sources, pluginMode = false) {
1514
1561
  const displays = await generateCustomFieldDisplays(sources);
1515
- const code = import_outdent4.outdent`
1562
+ const code = import_outdent5.outdent`
1516
1563
  ${displays.imports.join("\n")}
1517
1564
 
1518
1565
  ${pluginMode ? `const displayModule = { ${displays.code} }` : `export default { ${displays.code} }`}
@@ -1521,11 +1568,11 @@ async function generateVirtualDisplayModule(sources, pluginMode = false) {
1521
1568
  }
1522
1569
 
1523
1570
  // src/virtual-modules/generate-virtual-form-module.ts
1524
- var import_outdent5 = __toESM(require("outdent"));
1571
+ var import_outdent6 = __toESM(require("outdent"));
1525
1572
  async function generateVirtualFormModule(sources, pluginMode = false) {
1526
1573
  const customFields = await generateCustomFieldForms(sources);
1527
1574
  const imports = [...customFields.imports];
1528
- const code = import_outdent5.default`
1575
+ const code = import_outdent6.default`
1529
1576
  ${imports.join("\n")}
1530
1577
 
1531
1578
  ${pluginMode ? `const formModule = { ${customFields.code} }` : `export default { ${customFields.code} }`}
@@ -1534,10 +1581,10 @@ async function generateVirtualFormModule(sources, pluginMode = false) {
1534
1581
  }
1535
1582
 
1536
1583
  // src/virtual-modules/generate-virtual-link-module.ts
1537
- var import_outdent6 = require("outdent");
1584
+ var import_outdent7 = require("outdent");
1538
1585
  async function generateVirtualLinkModule(sources, pluginMode = false) {
1539
1586
  const links = await generateCustomFieldLinks(sources);
1540
- const code = import_outdent6.outdent`
1587
+ const code = import_outdent7.outdent`
1541
1588
  ${links.imports.join("\n")}
1542
1589
 
1543
1590
  ${pluginMode ? `const linkModule = { ${links.code} }` : `export default { ${links.code} }`}
@@ -1546,10 +1593,10 @@ async function generateVirtualLinkModule(sources, pluginMode = false) {
1546
1593
  }
1547
1594
 
1548
1595
  // src/virtual-modules/generate-virtual-menu-item-module.ts
1549
- var import_outdent7 = __toESM(require("outdent"));
1596
+ var import_outdent8 = __toESM(require("outdent"));
1550
1597
  async function generateVirtualMenuItemModule(sources, pluginMode = false) {
1551
1598
  const menuItems = await generateMenuItems(sources);
1552
- const code = import_outdent7.default`
1599
+ const code = import_outdent8.default`
1553
1600
  ${menuItems.imports.join("\n")}
1554
1601
 
1555
1602
  ${pluginMode ? `const menuItemModule = { ${menuItems.code} }` : `export default { ${menuItems.code} }`}
@@ -1558,11 +1605,11 @@ async function generateVirtualMenuItemModule(sources, pluginMode = false) {
1558
1605
  }
1559
1606
 
1560
1607
  // src/virtual-modules/generate-virtual-route-module.ts
1561
- var import_outdent8 = require("outdent");
1608
+ var import_outdent9 = require("outdent");
1562
1609
  async function generateVirtualRouteModule(sources, pluginMode = false) {
1563
1610
  const routes = await generateRoutes(sources);
1564
1611
  const imports = [...routes.imports];
1565
- const code = import_outdent8.outdent`
1612
+ const code = import_outdent9.outdent`
1566
1613
  ${imports.join("\n")}
1567
1614
 
1568
1615
  ${pluginMode ? `const routeModule = { ${routes.code} }` : `export default { ${routes.code} }`}
@@ -1571,10 +1618,10 @@ async function generateVirtualRouteModule(sources, pluginMode = false) {
1571
1618
  }
1572
1619
 
1573
1620
  // src/virtual-modules/generate-virtual-widget-module.ts
1574
- var import_outdent10 = __toESM(require("outdent"));
1621
+ var import_outdent11 = __toESM(require("outdent"));
1575
1622
 
1576
1623
  // src/widgets/generate-widget-hash.ts
1577
- var import_promises8 = __toESM(require("fs/promises"));
1624
+ var import_promises9 = __toESM(require("fs/promises"));
1578
1625
 
1579
1626
  // src/widgets/helpers.ts
1580
1627
  async function getWidgetFilesFromSources(sources) {
@@ -1591,7 +1638,7 @@ async function generateWidgetHash(sources) {
1591
1638
  return generateHash(totalContent);
1592
1639
  }
1593
1640
  async function getWidgetContents(file) {
1594
- const code = await import_promises8.default.readFile(file, "utf-8");
1641
+ const code = await import_promises9.default.readFile(file, "utf-8");
1595
1642
  let ast;
1596
1643
  try {
1597
1644
  ast = (0, import_parser.parse)(code, getParserOptions(file));
@@ -1623,8 +1670,8 @@ async function getWidgetContents(file) {
1623
1670
 
1624
1671
  // src/widgets/generate-widgets.ts
1625
1672
  var import_admin_shared5 = require("@medusajs/admin-shared");
1626
- var import_promises9 = __toESM(require("fs/promises"));
1627
- var import_outdent9 = __toESM(require("outdent"));
1673
+ var import_promises10 = __toESM(require("fs/promises"));
1674
+ var import_outdent10 = __toESM(require("outdent"));
1628
1675
  async function generateWidgets(sources) {
1629
1676
  const files = await getWidgetFilesFromSources(sources);
1630
1677
  const results = await getWidgetResults(files);
@@ -1641,14 +1688,14 @@ async function getWidgetResults(files) {
1641
1688
  );
1642
1689
  }
1643
1690
  function generateCode5(results) {
1644
- return import_outdent9.default`
1691
+ return import_outdent10.default`
1645
1692
  widgets: [
1646
1693
  ${results.map((r) => formatWidget(r.widget)).join(",\n")}
1647
1694
  ]
1648
1695
  `;
1649
1696
  }
1650
1697
  function formatWidget(widget) {
1651
- return import_outdent9.default`
1698
+ return import_outdent10.default`
1652
1699
  {
1653
1700
  Component: ${widget.Component},
1654
1701
  zone: [${widget.zone.map((z) => `"${z}"`).join(", ")}]
@@ -1656,7 +1703,7 @@ function formatWidget(widget) {
1656
1703
  `;
1657
1704
  }
1658
1705
  async function parseFile5(file, index) {
1659
- const code = await import_promises9.default.readFile(file, "utf-8");
1706
+ const code = await import_promises10.default.readFile(file, "utf-8");
1660
1707
  let ast;
1661
1708
  try {
1662
1709
  ast = (0, import_parser.parse)(code, getParserOptions(file));
@@ -1803,7 +1850,7 @@ function extractZoneValues(value, zones, file) {
1803
1850
  async function generateVirtualWidgetModule(sources, pluginMode = false) {
1804
1851
  const widgets = await generateWidgets(sources);
1805
1852
  const imports = [...widgets.imports];
1806
- const code = import_outdent10.default`
1853
+ const code = import_outdent11.default`
1807
1854
  ${imports.join("\n")}
1808
1855
 
1809
1856
  ${pluginMode ? `const widgetModule = { ${widgets.code} }` : `export default { ${widgets.code} }`}
@@ -1811,6 +1858,22 @@ async function generateVirtualWidgetModule(sources, pluginMode = false) {
1811
1858
  return generateModule(code);
1812
1859
  }
1813
1860
 
1861
+ // src/virtual-modules/generate-virtual-i18n-module.ts
1862
+ var import_outdent12 = __toESM(require("outdent"));
1863
+ async function generateVirtualI18nModule(sources, pluginMode = false) {
1864
+ const i18n = await generateI18n(sources);
1865
+ const imports = [
1866
+ 'import { deepMerge } from "@medusajs/admin-shared"',
1867
+ ...i18n.imports
1868
+ ];
1869
+ const code = import_outdent12.default`
1870
+ ${imports.join("\n")}
1871
+
1872
+ ${pluginMode ? `const i18nModule = { ${i18n.code} }` : `export default { ${i18n.code} }`}
1873
+ `;
1874
+ return generateModule(code);
1875
+ }
1876
+
1814
1877
  // src/vmod.ts
1815
1878
  var import_admin_shared6 = require("@medusajs/admin-shared");
1816
1879
  var RESOLVED_LINK_VIRTUAL_MODULE = `\0${import_admin_shared6.LINK_VIRTUAL_MODULE}`;
@@ -1819,13 +1882,15 @@ var RESOLVED_DISPLAY_VIRTUAL_MODULE = `\0${import_admin_shared6.DISPLAY_VIRTUAL_
1819
1882
  var RESOLVED_ROUTE_VIRTUAL_MODULE = `\0${import_admin_shared6.ROUTE_VIRTUAL_MODULE}`;
1820
1883
  var RESOLVED_MENU_ITEM_VIRTUAL_MODULE = `\0${import_admin_shared6.MENU_ITEM_VIRTUAL_MODULE}`;
1821
1884
  var RESOLVED_WIDGET_VIRTUAL_MODULE = `\0${import_admin_shared6.WIDGET_VIRTUAL_MODULE}`;
1885
+ var RESOLVED_I18N_VIRTUAL_MODULE = `\0${import_admin_shared6.I18N_VIRTUAL_MODULE}`;
1822
1886
  var VIRTUAL_MODULES = [
1823
1887
  import_admin_shared6.LINK_VIRTUAL_MODULE,
1824
1888
  import_admin_shared6.FORM_VIRTUAL_MODULE,
1825
1889
  import_admin_shared6.DISPLAY_VIRTUAL_MODULE,
1826
1890
  import_admin_shared6.ROUTE_VIRTUAL_MODULE,
1827
1891
  import_admin_shared6.MENU_ITEM_VIRTUAL_MODULE,
1828
- import_admin_shared6.WIDGET_VIRTUAL_MODULE
1892
+ import_admin_shared6.WIDGET_VIRTUAL_MODULE,
1893
+ import_admin_shared6.I18N_VIRTUAL_MODULE
1829
1894
  ];
1830
1895
  var RESOLVED_VIRTUAL_MODULES = [
1831
1896
  RESOLVED_LINK_VIRTUAL_MODULE,
@@ -1833,7 +1898,8 @@ var RESOLVED_VIRTUAL_MODULES = [
1833
1898
  RESOLVED_DISPLAY_VIRTUAL_MODULE,
1834
1899
  RESOLVED_ROUTE_VIRTUAL_MODULE,
1835
1900
  RESOLVED_MENU_ITEM_VIRTUAL_MODULE,
1836
- RESOLVED_WIDGET_VIRTUAL_MODULE
1901
+ RESOLVED_WIDGET_VIRTUAL_MODULE,
1902
+ RESOLVED_I18N_VIRTUAL_MODULE
1837
1903
  ];
1838
1904
  function resolveVirtualId(id) {
1839
1905
  return `\0${id}`;
@@ -1852,7 +1918,8 @@ var resolvedVirtualModuleIds = {
1852
1918
  display: RESOLVED_DISPLAY_VIRTUAL_MODULE,
1853
1919
  route: RESOLVED_ROUTE_VIRTUAL_MODULE,
1854
1920
  menuItem: RESOLVED_MENU_ITEM_VIRTUAL_MODULE,
1855
- widget: RESOLVED_WIDGET_VIRTUAL_MODULE
1921
+ widget: RESOLVED_WIDGET_VIRTUAL_MODULE,
1922
+ i18n: RESOLVED_I18N_VIRTUAL_MODULE
1856
1923
  };
1857
1924
  var virtualModuleIds = {
1858
1925
  link: import_admin_shared6.LINK_VIRTUAL_MODULE,
@@ -1860,7 +1927,8 @@ var virtualModuleIds = {
1860
1927
  display: import_admin_shared6.DISPLAY_VIRTUAL_MODULE,
1861
1928
  route: import_admin_shared6.ROUTE_VIRTUAL_MODULE,
1862
1929
  menuItem: import_admin_shared6.MENU_ITEM_VIRTUAL_MODULE,
1863
- widget: import_admin_shared6.WIDGET_VIRTUAL_MODULE
1930
+ widget: import_admin_shared6.WIDGET_VIRTUAL_MODULE,
1931
+ i18n: import_admin_shared6.I18N_VIRTUAL_MODULE
1864
1932
  };
1865
1933
  var vmod = {
1866
1934
  resolved: resolvedVirtualModuleIds,
@@ -1907,6 +1975,7 @@ var medusaVitePlugin = (options) => {
1907
1975
  const menuItemModule = await generateVirtualMenuItemModule(sources, true);
1908
1976
  const formModule = await generateVirtualFormModule(sources, true);
1909
1977
  const displayModule = await generateVirtualDisplayModule(sources, true);
1978
+ const i18nModule = await generateVirtualI18nModule(sources, true);
1910
1979
  return `
1911
1980
  // Auto-generated index file for Medusa Admin UI extensions
1912
1981
  ${widgetModule.code}
@@ -1914,13 +1983,15 @@ var medusaVitePlugin = (options) => {
1914
1983
  ${menuItemModule.code}
1915
1984
  ${formModule.code}
1916
1985
  ${displayModule.code}
1986
+ ${i18nModule.code}
1917
1987
 
1918
1988
  const plugin = {
1919
1989
  widgetModule,
1920
1990
  routeModule,
1921
1991
  menuItemModule,
1922
1992
  formModule,
1923
- displayModule
1993
+ displayModule,
1994
+ i18nModule
1924
1995
  }
1925
1996
 
1926
1997
  export default plugin
@@ -1937,7 +2008,7 @@ var medusaVitePlugin = (options) => {
1937
2008
  switch (mode) {
1938
2009
  case "plugin" /* PLUGIN */: {
1939
2010
  const code = await generatePluginEntryModule(_sources);
1940
- await (0, import_promises10.writeFile)(pluginEntryFile, code, "utf-8");
2011
+ await (0, import_promises11.writeFile)(pluginEntryFile, code, "utf-8");
1941
2012
  break;
1942
2013
  }
1943
2014
  case "application" /* APPLICATION */: {
@@ -1949,7 +2020,7 @@ var medusaVitePlugin = (options) => {
1949
2020
  switch (mode) {
1950
2021
  case "plugin" /* PLUGIN */: {
1951
2022
  try {
1952
- await (0, import_promises10.rm)(pluginEntryFile, { force: true });
2023
+ await (0, import_promises11.rm)(pluginEntryFile, { force: true });
1953
2024
  } catch (error) {
1954
2025
  }
1955
2026
  break;
@@ -2026,6 +2097,11 @@ var loadConfigs = {
2026
2097
  hashGenerator: async (sources) => (await generateRouteHashes(sources)).configHash,
2027
2098
  moduleGenerator: async (sources) => generateVirtualMenuItemModule(sources),
2028
2099
  hashKey: vmod.virtual.menuItem
2100
+ },
2101
+ [vmod.resolved.i18n]: {
2102
+ hashGenerator: async (sources) => generateI18nHash(sources),
2103
+ moduleGenerator: async (sources) => generateVirtualI18nModule(sources),
2104
+ hashKey: vmod.virtual.i18n
2029
2105
  }
2030
2106
  };
2031
2107
  var watcherConfigs = [
@@ -2078,8 +2154,21 @@ var watcherConfigs = [
2078
2154
  hashKey: "displayHash"
2079
2155
  }
2080
2156
  ]
2157
+ },
2158
+ {
2159
+ subdirectory: "i18n",
2160
+ hashGenerator: async (sources) => ({
2161
+ i18nHash: await generateI18nHash(sources)
2162
+ }),
2163
+ modules: [
2164
+ {
2165
+ virtualModule: vmod.virtual.i18n,
2166
+ resolvedModule: vmod.resolved.i18n,
2167
+ hashKey: "i18nHash"
2168
+ }
2169
+ ]
2081
2170
  }
2082
2171
  ];
2083
2172
 
2084
2173
  // src/index.ts
2085
- var src_default = medusaVitePlugin;
2174
+ var index_default = medusaVitePlugin;
package/dist/index.mjs CHANGED
@@ -103,7 +103,7 @@ function generateModule(code) {
103
103
  map: magicString.generateMap({ hires: true })
104
104
  };
105
105
  }
106
- var VALID_FILE_EXTENSIONS = [".tsx", ".jsx", ".js"];
106
+ var VALID_FILE_EXTENSIONS = [".tsx", ".jsx", ".js", ".ts"];
107
107
  async function crawl(dir, file, depth) {
108
108
  const dirDepth = dir.split(path.sep).length;
109
109
  const crawler = new fdir().withBasePath().exclude((dirName) => dirName.startsWith("_")).filter((path3) => {
@@ -1086,12 +1086,59 @@ function getLink(path3, index, file) {
1086
1086
  return `${import_}.link`;
1087
1087
  }
1088
1088
 
1089
+ // src/i18n/generate-i18n-hash.ts
1090
+ import fs5 from "fs/promises";
1091
+
1092
+ // src/i18n/helpers.ts
1093
+ async function getI18nIndexFilesFromSources(sources) {
1094
+ return (await Promise.all(
1095
+ Array.from(sources).map(
1096
+ async (source) => crawl(`${source}/i18n`, "index", { min: 0, max: 0 })
1097
+ )
1098
+ )).flat();
1099
+ }
1100
+
1101
+ // src/i18n/generate-i18n-hash.ts
1102
+ async function generateI18nHash(sources) {
1103
+ const indexFiles = await getI18nIndexFilesFromSources(sources);
1104
+ const contents = await Promise.all(
1105
+ indexFiles.map((file) => fs5.readFile(file, "utf-8"))
1106
+ );
1107
+ const totalContent = contents.join("");
1108
+ return generateHash(totalContent);
1109
+ }
1110
+
1111
+ // src/i18n/generate-i18n.ts
1112
+ import { outdent as outdent2 } from "outdent";
1113
+ async function generateI18n(sources) {
1114
+ const indexFiles = await getI18nIndexFilesFromSources(sources);
1115
+ const imports = indexFiles.map((file, index) => {
1116
+ const normalizedPath = normalizePath(file);
1117
+ return `import i18nTranslations${index} from "${normalizedPath}"`;
1118
+ });
1119
+ let mergeCode = "{}";
1120
+ if (indexFiles.length === 1) {
1121
+ mergeCode = "i18nTranslations0";
1122
+ } else if (indexFiles.length > 1) {
1123
+ mergeCode = indexFiles.slice(1).reduce((acc, _, index) => {
1124
+ return `deepMerge(${acc}, i18nTranslations${index + 1})`;
1125
+ }, "i18nTranslations0");
1126
+ }
1127
+ const code = outdent2`
1128
+ resources: ${mergeCode}
1129
+ `;
1130
+ return {
1131
+ imports,
1132
+ code
1133
+ };
1134
+ }
1135
+
1089
1136
  // src/routes/generate-menu-items.ts
1090
1137
  import {
1091
1138
  NESTED_ROUTE_POSITIONS
1092
1139
  } from "@medusajs/admin-shared";
1093
- import fs5 from "fs/promises";
1094
- import { outdent as outdent2 } from "outdent";
1140
+ import fs6 from "fs/promises";
1141
+ import { outdent as outdent3 } from "outdent";
1095
1142
 
1096
1143
  // src/routes/helpers.ts
1097
1144
  function getRoute(file) {
@@ -1115,7 +1162,7 @@ async function generateMenuItems(sources) {
1115
1162
  return { imports, code };
1116
1163
  }
1117
1164
  function generateCode3(results) {
1118
- return outdent2`
1165
+ return outdent3`
1119
1166
  menuItems: [
1120
1167
  ${results.map((result) => formatMenuItem(result.menuItem)).join(",\n")}
1121
1168
  ]
@@ -1174,7 +1221,7 @@ function generateMenuItem(config, file, index) {
1174
1221
  };
1175
1222
  }
1176
1223
  async function getRouteConfig(file) {
1177
- const code = await fs5.readFile(file, "utf-8");
1224
+ const code = await fs6.readFile(file, "utf-8");
1178
1225
  let ast = null;
1179
1226
  try {
1180
1227
  ast = parse(code, getParserOptions(file));
@@ -1266,7 +1313,7 @@ function generateRouteConfigName(index) {
1266
1313
  }
1267
1314
 
1268
1315
  // src/routes/generate-route-hashes.ts
1269
- import fs6 from "fs/promises";
1316
+ import fs7 from "fs/promises";
1270
1317
  async function generateRouteHashes(sources) {
1271
1318
  const files = await getFilesFromSources6(sources);
1272
1319
  const contents = await Promise.all(files.map(getRouteContents));
@@ -1287,7 +1334,7 @@ async function getFilesFromSources6(sources) {
1287
1334
  )).flat();
1288
1335
  }
1289
1336
  async function getRouteContents(file) {
1290
- const code = await fs6.readFile(file, "utf-8");
1337
+ const code = await fs7.readFile(file, "utf-8");
1291
1338
  let ast = null;
1292
1339
  try {
1293
1340
  ast = parse(code, getParserOptions(file));
@@ -1324,8 +1371,8 @@ ${e}`,
1324
1371
  }
1325
1372
 
1326
1373
  // src/routes/generate-routes.ts
1327
- import fs7 from "fs/promises";
1328
- import { outdent as outdent3 } from "outdent";
1374
+ import fs8 from "fs/promises";
1375
+ import { outdent as outdent4 } from "outdent";
1329
1376
  async function generateRoutes(sources) {
1330
1377
  const files = await getFilesFromSources7(sources);
1331
1378
  const results = await getRouteResults(files);
@@ -1337,7 +1384,7 @@ async function generateRoutes(sources) {
1337
1384
  };
1338
1385
  }
1339
1386
  function generateCode4(results) {
1340
- return outdent3`
1387
+ return outdent4`
1341
1388
  routes: [
1342
1389
  ${results.map((result) => formatRoute(result.route)).join(",\n")}
1343
1390
  ]
@@ -1401,7 +1448,7 @@ async function getRouteResults(files) {
1401
1448
  return Array.from(routeMap.values());
1402
1449
  }
1403
1450
  async function parseFile4(file, index) {
1404
- const code = await fs7.readFile(file, "utf-8");
1451
+ const code = await fs8.readFile(file, "utf-8");
1405
1452
  let ast = null;
1406
1453
  try {
1407
1454
  ast = parse(code, getParserOptions(file));
@@ -1499,10 +1546,10 @@ async function hasNamedExports(ast, file) {
1499
1546
  }
1500
1547
 
1501
1548
  // src/virtual-modules/generate-virtual-display-module.ts
1502
- import { outdent as outdent4 } from "outdent";
1549
+ import { outdent as outdent5 } from "outdent";
1503
1550
  async function generateVirtualDisplayModule(sources, pluginMode = false) {
1504
1551
  const displays = await generateCustomFieldDisplays(sources);
1505
- const code = outdent4`
1552
+ const code = outdent5`
1506
1553
  ${displays.imports.join("\n")}
1507
1554
 
1508
1555
  ${pluginMode ? `const displayModule = { ${displays.code} }` : `export default { ${displays.code} }`}
@@ -1511,11 +1558,11 @@ async function generateVirtualDisplayModule(sources, pluginMode = false) {
1511
1558
  }
1512
1559
 
1513
1560
  // src/virtual-modules/generate-virtual-form-module.ts
1514
- import outdent5 from "outdent";
1561
+ import outdent6 from "outdent";
1515
1562
  async function generateVirtualFormModule(sources, pluginMode = false) {
1516
1563
  const customFields = await generateCustomFieldForms(sources);
1517
1564
  const imports = [...customFields.imports];
1518
- const code = outdent5`
1565
+ const code = outdent6`
1519
1566
  ${imports.join("\n")}
1520
1567
 
1521
1568
  ${pluginMode ? `const formModule = { ${customFields.code} }` : `export default { ${customFields.code} }`}
@@ -1524,10 +1571,10 @@ async function generateVirtualFormModule(sources, pluginMode = false) {
1524
1571
  }
1525
1572
 
1526
1573
  // src/virtual-modules/generate-virtual-link-module.ts
1527
- import { outdent as outdent6 } from "outdent";
1574
+ import { outdent as outdent7 } from "outdent";
1528
1575
  async function generateVirtualLinkModule(sources, pluginMode = false) {
1529
1576
  const links = await generateCustomFieldLinks(sources);
1530
- const code = outdent6`
1577
+ const code = outdent7`
1531
1578
  ${links.imports.join("\n")}
1532
1579
 
1533
1580
  ${pluginMode ? `const linkModule = { ${links.code} }` : `export default { ${links.code} }`}
@@ -1536,10 +1583,10 @@ async function generateVirtualLinkModule(sources, pluginMode = false) {
1536
1583
  }
1537
1584
 
1538
1585
  // src/virtual-modules/generate-virtual-menu-item-module.ts
1539
- import outdent7 from "outdent";
1586
+ import outdent8 from "outdent";
1540
1587
  async function generateVirtualMenuItemModule(sources, pluginMode = false) {
1541
1588
  const menuItems = await generateMenuItems(sources);
1542
- const code = outdent7`
1589
+ const code = outdent8`
1543
1590
  ${menuItems.imports.join("\n")}
1544
1591
 
1545
1592
  ${pluginMode ? `const menuItemModule = { ${menuItems.code} }` : `export default { ${menuItems.code} }`}
@@ -1548,11 +1595,11 @@ async function generateVirtualMenuItemModule(sources, pluginMode = false) {
1548
1595
  }
1549
1596
 
1550
1597
  // src/virtual-modules/generate-virtual-route-module.ts
1551
- import { outdent as outdent8 } from "outdent";
1598
+ import { outdent as outdent9 } from "outdent";
1552
1599
  async function generateVirtualRouteModule(sources, pluginMode = false) {
1553
1600
  const routes = await generateRoutes(sources);
1554
1601
  const imports = [...routes.imports];
1555
- const code = outdent8`
1602
+ const code = outdent9`
1556
1603
  ${imports.join("\n")}
1557
1604
 
1558
1605
  ${pluginMode ? `const routeModule = { ${routes.code} }` : `export default { ${routes.code} }`}
@@ -1561,10 +1608,10 @@ async function generateVirtualRouteModule(sources, pluginMode = false) {
1561
1608
  }
1562
1609
 
1563
1610
  // src/virtual-modules/generate-virtual-widget-module.ts
1564
- import outdent10 from "outdent";
1611
+ import outdent11 from "outdent";
1565
1612
 
1566
1613
  // src/widgets/generate-widget-hash.ts
1567
- import fs8 from "fs/promises";
1614
+ import fs9 from "fs/promises";
1568
1615
 
1569
1616
  // src/widgets/helpers.ts
1570
1617
  async function getWidgetFilesFromSources(sources) {
@@ -1581,7 +1628,7 @@ async function generateWidgetHash(sources) {
1581
1628
  return generateHash(totalContent);
1582
1629
  }
1583
1630
  async function getWidgetContents(file) {
1584
- const code = await fs8.readFile(file, "utf-8");
1631
+ const code = await fs9.readFile(file, "utf-8");
1585
1632
  let ast;
1586
1633
  try {
1587
1634
  ast = parse(code, getParserOptions(file));
@@ -1613,8 +1660,8 @@ async function getWidgetContents(file) {
1613
1660
 
1614
1661
  // src/widgets/generate-widgets.ts
1615
1662
  import { isValidInjectionZone } from "@medusajs/admin-shared";
1616
- import fs9 from "fs/promises";
1617
- import outdent9 from "outdent";
1663
+ import fs10 from "fs/promises";
1664
+ import outdent10 from "outdent";
1618
1665
  async function generateWidgets(sources) {
1619
1666
  const files = await getWidgetFilesFromSources(sources);
1620
1667
  const results = await getWidgetResults(files);
@@ -1631,14 +1678,14 @@ async function getWidgetResults(files) {
1631
1678
  );
1632
1679
  }
1633
1680
  function generateCode5(results) {
1634
- return outdent9`
1681
+ return outdent10`
1635
1682
  widgets: [
1636
1683
  ${results.map((r) => formatWidget(r.widget)).join(",\n")}
1637
1684
  ]
1638
1685
  `;
1639
1686
  }
1640
1687
  function formatWidget(widget) {
1641
- return outdent9`
1688
+ return outdent10`
1642
1689
  {
1643
1690
  Component: ${widget.Component},
1644
1691
  zone: [${widget.zone.map((z) => `"${z}"`).join(", ")}]
@@ -1646,7 +1693,7 @@ function formatWidget(widget) {
1646
1693
  `;
1647
1694
  }
1648
1695
  async function parseFile5(file, index) {
1649
- const code = await fs9.readFile(file, "utf-8");
1696
+ const code = await fs10.readFile(file, "utf-8");
1650
1697
  let ast;
1651
1698
  try {
1652
1699
  ast = parse(code, getParserOptions(file));
@@ -1793,7 +1840,7 @@ function extractZoneValues(value, zones, file) {
1793
1840
  async function generateVirtualWidgetModule(sources, pluginMode = false) {
1794
1841
  const widgets = await generateWidgets(sources);
1795
1842
  const imports = [...widgets.imports];
1796
- const code = outdent10`
1843
+ const code = outdent11`
1797
1844
  ${imports.join("\n")}
1798
1845
 
1799
1846
  ${pluginMode ? `const widgetModule = { ${widgets.code} }` : `export default { ${widgets.code} }`}
@@ -1801,10 +1848,27 @@ async function generateVirtualWidgetModule(sources, pluginMode = false) {
1801
1848
  return generateModule(code);
1802
1849
  }
1803
1850
 
1851
+ // src/virtual-modules/generate-virtual-i18n-module.ts
1852
+ import outdent12 from "outdent";
1853
+ async function generateVirtualI18nModule(sources, pluginMode = false) {
1854
+ const i18n = await generateI18n(sources);
1855
+ const imports = [
1856
+ 'import { deepMerge } from "@medusajs/admin-shared"',
1857
+ ...i18n.imports
1858
+ ];
1859
+ const code = outdent12`
1860
+ ${imports.join("\n")}
1861
+
1862
+ ${pluginMode ? `const i18nModule = { ${i18n.code} }` : `export default { ${i18n.code} }`}
1863
+ `;
1864
+ return generateModule(code);
1865
+ }
1866
+
1804
1867
  // src/vmod.ts
1805
1868
  import {
1806
1869
  DISPLAY_VIRTUAL_MODULE,
1807
1870
  FORM_VIRTUAL_MODULE,
1871
+ I18N_VIRTUAL_MODULE,
1808
1872
  LINK_VIRTUAL_MODULE,
1809
1873
  MENU_ITEM_VIRTUAL_MODULE,
1810
1874
  ROUTE_VIRTUAL_MODULE,
@@ -1816,13 +1880,15 @@ var RESOLVED_DISPLAY_VIRTUAL_MODULE = `\0${DISPLAY_VIRTUAL_MODULE}`;
1816
1880
  var RESOLVED_ROUTE_VIRTUAL_MODULE = `\0${ROUTE_VIRTUAL_MODULE}`;
1817
1881
  var RESOLVED_MENU_ITEM_VIRTUAL_MODULE = `\0${MENU_ITEM_VIRTUAL_MODULE}`;
1818
1882
  var RESOLVED_WIDGET_VIRTUAL_MODULE = `\0${WIDGET_VIRTUAL_MODULE}`;
1883
+ var RESOLVED_I18N_VIRTUAL_MODULE = `\0${I18N_VIRTUAL_MODULE}`;
1819
1884
  var VIRTUAL_MODULES = [
1820
1885
  LINK_VIRTUAL_MODULE,
1821
1886
  FORM_VIRTUAL_MODULE,
1822
1887
  DISPLAY_VIRTUAL_MODULE,
1823
1888
  ROUTE_VIRTUAL_MODULE,
1824
1889
  MENU_ITEM_VIRTUAL_MODULE,
1825
- WIDGET_VIRTUAL_MODULE
1890
+ WIDGET_VIRTUAL_MODULE,
1891
+ I18N_VIRTUAL_MODULE
1826
1892
  ];
1827
1893
  var RESOLVED_VIRTUAL_MODULES = [
1828
1894
  RESOLVED_LINK_VIRTUAL_MODULE,
@@ -1830,7 +1896,8 @@ var RESOLVED_VIRTUAL_MODULES = [
1830
1896
  RESOLVED_DISPLAY_VIRTUAL_MODULE,
1831
1897
  RESOLVED_ROUTE_VIRTUAL_MODULE,
1832
1898
  RESOLVED_MENU_ITEM_VIRTUAL_MODULE,
1833
- RESOLVED_WIDGET_VIRTUAL_MODULE
1899
+ RESOLVED_WIDGET_VIRTUAL_MODULE,
1900
+ RESOLVED_I18N_VIRTUAL_MODULE
1834
1901
  ];
1835
1902
  function resolveVirtualId(id) {
1836
1903
  return `\0${id}`;
@@ -1849,7 +1916,8 @@ var resolvedVirtualModuleIds = {
1849
1916
  display: RESOLVED_DISPLAY_VIRTUAL_MODULE,
1850
1917
  route: RESOLVED_ROUTE_VIRTUAL_MODULE,
1851
1918
  menuItem: RESOLVED_MENU_ITEM_VIRTUAL_MODULE,
1852
- widget: RESOLVED_WIDGET_VIRTUAL_MODULE
1919
+ widget: RESOLVED_WIDGET_VIRTUAL_MODULE,
1920
+ i18n: RESOLVED_I18N_VIRTUAL_MODULE
1853
1921
  };
1854
1922
  var virtualModuleIds = {
1855
1923
  link: LINK_VIRTUAL_MODULE,
@@ -1857,7 +1925,8 @@ var virtualModuleIds = {
1857
1925
  display: DISPLAY_VIRTUAL_MODULE,
1858
1926
  route: ROUTE_VIRTUAL_MODULE,
1859
1927
  menuItem: MENU_ITEM_VIRTUAL_MODULE,
1860
- widget: WIDGET_VIRTUAL_MODULE
1928
+ widget: WIDGET_VIRTUAL_MODULE,
1929
+ i18n: I18N_VIRTUAL_MODULE
1861
1930
  };
1862
1931
  var vmod = {
1863
1932
  resolved: resolvedVirtualModuleIds,
@@ -1904,6 +1973,7 @@ var medusaVitePlugin = (options) => {
1904
1973
  const menuItemModule = await generateVirtualMenuItemModule(sources, true);
1905
1974
  const formModule = await generateVirtualFormModule(sources, true);
1906
1975
  const displayModule = await generateVirtualDisplayModule(sources, true);
1976
+ const i18nModule = await generateVirtualI18nModule(sources, true);
1907
1977
  return `
1908
1978
  // Auto-generated index file for Medusa Admin UI extensions
1909
1979
  ${widgetModule.code}
@@ -1911,13 +1981,15 @@ var medusaVitePlugin = (options) => {
1911
1981
  ${menuItemModule.code}
1912
1982
  ${formModule.code}
1913
1983
  ${displayModule.code}
1984
+ ${i18nModule.code}
1914
1985
 
1915
1986
  const plugin = {
1916
1987
  widgetModule,
1917
1988
  routeModule,
1918
1989
  menuItemModule,
1919
1990
  formModule,
1920
- displayModule
1991
+ displayModule,
1992
+ i18nModule
1921
1993
  }
1922
1994
 
1923
1995
  export default plugin
@@ -2023,6 +2095,11 @@ var loadConfigs = {
2023
2095
  hashGenerator: async (sources) => (await generateRouteHashes(sources)).configHash,
2024
2096
  moduleGenerator: async (sources) => generateVirtualMenuItemModule(sources),
2025
2097
  hashKey: vmod.virtual.menuItem
2098
+ },
2099
+ [vmod.resolved.i18n]: {
2100
+ hashGenerator: async (sources) => generateI18nHash(sources),
2101
+ moduleGenerator: async (sources) => generateVirtualI18nModule(sources),
2102
+ hashKey: vmod.virtual.i18n
2026
2103
  }
2027
2104
  };
2028
2105
  var watcherConfigs = [
@@ -2075,11 +2152,24 @@ var watcherConfigs = [
2075
2152
  hashKey: "displayHash"
2076
2153
  }
2077
2154
  ]
2155
+ },
2156
+ {
2157
+ subdirectory: "i18n",
2158
+ hashGenerator: async (sources) => ({
2159
+ i18nHash: await generateI18nHash(sources)
2160
+ }),
2161
+ modules: [
2162
+ {
2163
+ virtualModule: vmod.virtual.i18n,
2164
+ resolvedModule: vmod.resolved.i18n,
2165
+ hashKey: "i18nHash"
2166
+ }
2167
+ ]
2078
2168
  }
2079
2169
  ];
2080
2170
 
2081
2171
  // src/index.ts
2082
- var src_default = medusaVitePlugin;
2172
+ var index_default = medusaVitePlugin;
2083
2173
  export {
2084
- src_default as default
2174
+ index_default as default
2085
2175
  };
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@medusajs/admin-vite-plugin",
3
- "version": "3.0.0-snapshot-20250410105645",
3
+ "version": "3.0.0-snapshot-20251104004624",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
7
7
  "exports": {
8
8
  ".": {
9
+ "types": "./dist/index.d.ts",
9
10
  "import": "./dist/index.mjs",
10
- "require": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
11
+ "require": "./dist/index.js"
12
12
  }
13
13
  },
14
14
  "repository": {
@@ -21,27 +21,23 @@
21
21
  "package.json"
22
22
  ],
23
23
  "scripts": {
24
- "build": "tsup",
25
- "watch": "tsup --watch",
26
- "test": "vitest --run",
27
- "test:watch": "vitest"
24
+ "build": "yarn run -T tsup",
25
+ "watch": "yarn run -T tsup --watch",
26
+ "test": "../../../node_modules/.bin/vitest --run",
27
+ "test:watch": "../../../node_modules/.bin/vitest"
28
28
  },
29
29
  "devDependencies": {
30
- "@types/node": "^20.10.4",
31
- "tsup": "8.0.1",
32
- "typescript": "5.3.3",
33
- "vite": "^5.4.14",
34
- "vitest": "^3.0.5"
30
+ "vite": "^5.4.14"
35
31
  },
36
32
  "peerDependencies": {
37
- "vite": "^5.0.0"
33
+ "vite": "^5.4.14"
38
34
  },
39
35
  "dependencies": {
40
36
  "@babel/parser": "7.25.6",
41
37
  "@babel/traverse": "7.25.6",
42
38
  "@babel/types": "7.25.6",
43
- "@medusajs/admin-shared": "3.0.0-snapshot-20250410105645",
44
- "chokidar": "3.5.3",
39
+ "@medusajs/admin-shared": "3.0.0-snapshot-20251104004624",
40
+ "chokidar": "^3.5.3",
45
41
  "fdir": "6.1.1",
46
42
  "magic-string": "0.30.5",
47
43
  "outdent": "^0.8.0",