@mantajs/dashboard 0.1.12 → 0.1.14

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +253 -0
  3. package/dist/{api-key-management-detail-TM6K63HF.mjs → api-key-management-detail-SZR6LLZY.mjs} +16 -16
  4. package/dist/{api-key-management-sales-channels-4GOYD6BF.mjs → api-key-management-sales-channels-WZAGFYC5.mjs} +6 -6
  5. package/dist/app.css +0 -20
  6. package/dist/app.js +11156 -11279
  7. package/dist/app.mjs +9 -9
  8. package/dist/campaign-create-FJOECKGT.mjs +1 -1
  9. package/dist/{chunk-LISLAU2F.mjs → chunk-FBYTX6K7.mjs} +7 -7
  10. package/dist/{chunk-VHUQFKRO.mjs → chunk-M5AMBSF6.mjs} +188 -181
  11. package/dist/{collection-list-KLL2VLDE.mjs → collection-list-EFER73U6.mjs} +10 -10
  12. package/dist/{customer-detail-DN46Z4Z7.mjs → customer-detail-NCPDOSIN.mjs} +15 -15
  13. package/dist/{customer-group-list-UW5KXNKV.mjs → customer-group-list-KZHWADWX.mjs} +17 -17
  14. package/dist/{home-524EFXYO.mjs → home-KFQGXKRT.mjs} +1 -1
  15. package/dist/{inventory-detail-42PY5NFS.mjs → inventory-detail-2MFCIKDT.mjs} +16 -16
  16. package/dist/{inventory-stock-MCURFEYD.mjs → inventory-stock-3PPGJ2JD.mjs} +8 -9
  17. package/dist/{location-fulfillment-providers-KQUDIYAF.mjs → location-fulfillment-providers-TXNXNHRD.mjs} +16 -16
  18. package/dist/{location-list-YDMTR5QM.mjs → location-list-KVBA6J47.mjs} +4 -4
  19. package/dist/{location-sales-channels-WGVKHV3B.mjs → location-sales-channels-P6O7KJAO.mjs} +6 -6
  20. package/dist/{location-service-zone-shipping-option-create-5XHKSHIS.mjs → location-service-zone-shipping-option-create-XXHX5DWG.mjs} +15 -15
  21. package/dist/{location-service-zone-shipping-option-pricing-VTD5YQ7X.mjs → location-service-zone-shipping-option-pricing-5HN2Z5RB.mjs} +2 -2
  22. package/dist/{order-export-Z7RZH5EX.mjs → order-export-IFN234IN.mjs} +12 -12
  23. package/dist/{order-list-BXZST6UW.mjs → order-list-57XK2DRD.mjs} +10 -10
  24. package/dist/{product-attributes-NT25DQN6.mjs → product-attributes-TGLEKV7Y.mjs} +8 -8
  25. package/dist/{product-create-GZANVK54.mjs → product-create-IGJXOMQN.mjs} +28 -28
  26. package/dist/{product-detail-P3LEJNTC.mjs → product-detail-ZZMHLWWL.mjs} +19 -19
  27. package/dist/{product-edit-ZWEDI4DK.mjs → product-edit-AH2FVEYF.mjs} +8 -8
  28. package/dist/{product-export-TJYITBFD.mjs → product-export-TX7U6SYH.mjs} +10 -10
  29. package/dist/{product-list-7EB54CNP.mjs → product-list-RZNYCKTQ.mjs} +13 -13
  30. package/dist/{product-media-WN2GYSM3.mjs → product-media-CG4RFOTX.mjs} +2 -2
  31. package/dist/{product-organization-3PJP3Y43.mjs → product-organization-C4LU2WFS.mjs} +8 -8
  32. package/dist/{product-sales-channels-KZMXJISB.mjs → product-sales-channels-XBALPVAL.mjs} +6 -6
  33. package/dist/{product-tag-detail-JPH3QX6V.mjs → product-tag-detail-JPNWE5QK.mjs} +12 -12
  34. package/dist/{product-tag-list-AOR3RSJW.mjs → product-tag-list-KOYJZMGY.mjs} +12 -12
  35. package/dist/promotion-add-campaign-DO67QK6M.mjs +1 -1
  36. package/dist/{refund-reason-list-GKHO2WDS.mjs → refund-reason-list-YROTDEQW.mjs} +12 -12
  37. package/dist/{sales-channel-list-SWDVR3IS.mjs → sales-channel-list-BHMHTVP5.mjs} +13 -13
  38. package/dist/{tax-region-detail-D22AOV54.mjs → tax-region-detail-JDWO7JFL.mjs} +17 -17
  39. package/dist/{tax-region-province-detail-B5FBOF3U.mjs → tax-region-province-detail-NEYURIVX.mjs} +17 -17
  40. package/dist/{tax-region-tax-override-create-XDO7RON2.mjs → tax-region-tax-override-create-EBTFIY7C.mjs} +19 -19
  41. package/dist/{tax-region-tax-override-edit-3RTRDVDI.mjs → tax-region-tax-override-edit-UUKEKERW.mjs} +15 -15
  42. package/dist/{user-list-XFW3SHWQ.mjs → user-list-YTZQNYSO.mjs} +5 -5
  43. package/dist/vite-plugin/index.js +79 -21
  44. package/dist/vite-plugin/index.mjs +79 -21
  45. package/package.json +29 -3
  46. package/src/app.tsx +1 -1
  47. package/src/components/layout/main-layout/main-layout.tsx +2 -2
  48. package/src/dashboard-app/dashboard-app.tsx +2 -1
  49. package/src/dashboard-app/forms/hooks.tsx +1 -1
  50. package/src/dashboard-app/links/utils.ts +1 -1
  51. package/src/dashboard-app/routes/get-route.map.tsx +0 -8
  52. package/src/dashboard-app/routes/merge-extension-routes.ts +13 -4
  53. package/src/dashboard-app/routes/utils.ts +1 -1
  54. package/src/dashboard-app/utils/sort-menu-items-by-rank.ts +9 -7
  55. package/src/index.css +2 -8
  56. package/src/routes/home/home.tsx +1 -1
  57. package/src/routes/inventory/inventory-stock/components/inventory-stock-form/inventory-stock-form.tsx +1 -1
  58. package/src/vite-env.d.ts +4 -4
  59. package/src/vite-plugin/index.ts +91 -21
  60. package/dist/dashboard-C2M5PQNL.mjs +0 -135
  61. package/src/routes/dashboard/dashboard.tsx +0 -174
  62. package/src/routes/dashboard/index.ts +0 -1
  63. package/dist/{add-campaign-promotions-H7C2TJIH.mjs → add-campaign-promotions-OYPGISTF.mjs} +6 -6
  64. package/dist/{add-locales-47HF5EWF.mjs → add-locales-F4BOSZNU.mjs} +10 -10
  65. package/dist/{api-key-management-list-DPFW5U7B.mjs → api-key-management-list-2T35G3KT.mjs} +4 -4
  66. package/dist/{campaign-budget-edit-NLP7CWGC.mjs → campaign-budget-edit-B5MSE26J.mjs} +3 -3
  67. package/dist/{campaign-detail-JWCA2BOR.mjs → campaign-detail-2SHJIBIS.mjs} +9 -9
  68. package/dist/{campaign-list-CXECHCH4.mjs → campaign-list-PEOTTWBA.mjs} +2 -2
  69. package/dist/{categories-metadata-WYRXRAIH.mjs → categories-metadata-4OV6MKAD.mjs} +7 -7
  70. package/dist/{category-create-RCWOWE4W.mjs → category-create-G2JK5KDF.mjs} +3 -3
  71. package/dist/{category-detail-3GT2DMFA.mjs → category-detail-2TPOPANL.mjs} +9 -9
  72. package/dist/{category-list-C3JVQYQF.mjs → category-list-WHGMREI2.mjs} +4 -4
  73. package/dist/{category-products-KHRVHYTY.mjs → category-products-LKS7U7MI.mjs} +13 -13
  74. package/dist/{chunk-RCTRYC7L.mjs → chunk-5FMYPGTX.mjs} +3 -3
  75. package/dist/{chunk-5WXY5NFW.mjs → chunk-DODQ3KJT.mjs} +3 -3
  76. package/dist/{chunk-QV7RN52R.mjs → chunk-JUZ754L2.mjs} +3 -3
  77. package/dist/{chunk-5YS7C2IA.mjs → chunk-KCWP7RF5.mjs} +3 -3
  78. package/dist/{chunk-K737PKHV.mjs → chunk-KSDXSKJ7.mjs} +3 -3
  79. package/dist/{collection-add-products-5U6UXZO5.mjs → collection-add-products-KTACHFJO.mjs} +12 -12
  80. package/dist/{collection-detail-62PCW5E4.mjs → collection-detail-7GFJ3MAT.mjs} +9 -9
  81. package/dist/{collection-metadata-72WIRMTB.mjs → collection-metadata-EVPJGU6A.mjs} +7 -7
  82. package/dist/{customer-group-add-customers-OHFJCJAX.mjs → customer-group-add-customers-XMR2WBXX.mjs} +6 -6
  83. package/dist/{customer-group-detail-W2JHFS5S.mjs → customer-group-detail-GWTXNJ3C.mjs} +13 -13
  84. package/dist/{customer-list-RRV4GEKX.mjs → customer-list-UI5EQDII.mjs} +2 -2
  85. package/dist/{customers-add-customer-group-CG24Z4SE.mjs → customers-add-customer-group-3XYEAGX4.mjs} +16 -16
  86. package/dist/{edit-rules-IMAV7O5S.mjs → edit-rules-OOIFNR4Z.mjs} +7 -7
  87. package/dist/{inventory-create-PUU6JZLV.mjs → inventory-create-HQNGRBCA.mjs} +16 -16
  88. package/dist/{inventory-list-R5DC2CUH.mjs → inventory-list-IPORNDO4.mjs} +4 -4
  89. package/dist/{inventory-metadata-S66XTCLQ.mjs → inventory-metadata-RC7I7WAH.mjs} +7 -7
  90. package/dist/{location-detail-ULAMYS5R.mjs → location-detail-POZVJTS7.mjs} +8 -8
  91. package/dist/{location-service-zone-create-QINLHG5Y.mjs → location-service-zone-create-J43WN6G4.mjs} +3 -3
  92. package/dist/{location-service-zone-manage-areas-T5DBC22A.mjs → location-service-zone-manage-areas-6ZPMKMSX.mjs} +3 -3
  93. package/dist/{location-service-zone-shipping-option-edit-GGMKFUXK.mjs → location-service-zone-shipping-option-edit-4CGPQ3VT.mjs} +3 -3
  94. package/dist/{login-WK4YY6KQ.mjs → login-IMDOL4BZ.mjs} +7 -7
  95. package/dist/{order-create-claim-AB33KP6F.mjs → order-create-claim-H75RPNWI.mjs} +20 -20
  96. package/dist/{order-create-edit-QKGYBXVY.mjs → order-create-edit-6ZOYALA6.mjs} +15 -15
  97. package/dist/{order-create-exchange-YYNNY3HT.mjs → order-create-exchange-BUZTV7O7.mjs} +20 -20
  98. package/dist/{order-create-fulfillment-B4UKJX5F.mjs → order-create-fulfillment-YJS27E6Y.mjs} +9 -9
  99. package/dist/{order-create-refund-7MWFY4N3.mjs → order-create-refund-MY2VRRFA.mjs} +15 -15
  100. package/dist/{order-create-return-UZ2BDDH5.mjs → order-create-return-W3KT5LKU.mjs} +8 -8
  101. package/dist/{order-create-shipment-626Z6TQY.mjs → order-create-shipment-QMFZC6ZM.mjs} +9 -9
  102. package/dist/{order-detail-HISCRCUI.mjs → order-detail-VYLTG5MG.mjs} +20 -20
  103. package/dist/{order-edit-billing-address-3KER7QBF.mjs → order-edit-billing-address-ZZ4KK47F.mjs} +9 -9
  104. package/dist/{order-edit-email-4VZBU7P3.mjs → order-edit-email-TCRXOK3W.mjs} +9 -9
  105. package/dist/{order-edit-shipping-address-RKSV6BV6.mjs → order-edit-shipping-address-C3K5IZRG.mjs} +9 -9
  106. package/dist/{order-metadata-3F3KZ3GQ.mjs → order-metadata-5ESVMAPY.mjs} +9 -9
  107. package/dist/{order-receive-return-DA7KQHSO.mjs → order-receive-return-7N3532LA.mjs} +10 -10
  108. package/dist/{order-request-transfer-FP4FQQXG.mjs → order-request-transfer-VUPJ2FET.mjs} +9 -9
  109. package/dist/{price-list-configuration-MTUTPHQE.mjs → price-list-configuration-OH3KGRDN.mjs} +5 -5
  110. package/dist/{price-list-create-6TE264GD.mjs → price-list-create-77TLF2P2.mjs} +14 -14
  111. package/dist/{price-list-detail-ZML6WEJG.mjs → price-list-detail-KDMHC6V4.mjs} +12 -12
  112. package/dist/{price-list-list-P4O3ONES.mjs → price-list-list-JJXWBCTJ.mjs} +5 -5
  113. package/dist/{price-list-prices-add-BZIVC7QO.mjs → price-list-prices-add-RWB7WFOE.mjs} +14 -14
  114. package/dist/{price-list-prices-edit-42U6MFTL.mjs → price-list-prices-edit-ICTQBHHM.mjs} +2 -2
  115. package/dist/{product-create-variant-5HSS43Z7.mjs → product-create-variant-7EIWI54C.mjs} +13 -13
  116. package/dist/{product-image-variants-edit-S336246K.mjs → product-image-variants-edit-DWZWPK64.mjs} +12 -12
  117. package/dist/{product-import-72B4A7NT.mjs → product-import-NPPDYH7E.mjs} +7 -7
  118. package/dist/{product-metadata-QC3M4MYP.mjs → product-metadata-YNSTB5IC.mjs} +7 -7
  119. package/dist/{product-prices-WEGXAXQO.mjs → product-prices-LAVS64HJ.mjs} +1 -1
  120. package/dist/{product-stock-C5XB6GSY.mjs → product-stock-PEGYC4J5.mjs} +11 -11
  121. package/dist/{product-tag-create-TBICZVLL.mjs → product-tag-create-DJQIEWOF.mjs} +7 -7
  122. package/dist/{product-tag-edit-3DQJQ5YE.mjs → product-tag-edit-76EA7NLB.mjs} +7 -7
  123. package/dist/{product-tag-metadata-MQ5SCB3J.mjs → product-tag-metadata-HMCF2W4C.mjs} +7 -7
  124. package/dist/{product-type-detail-N2MDJT6X.mjs → product-type-detail-IJ6FGSB2.mjs} +9 -9
  125. package/dist/{product-type-list-BZDXJ2HH.mjs → product-type-list-MQ2PW2IE.mjs} +2 -2
  126. package/dist/{product-type-metadata-WPX7ZGF4.mjs → product-type-metadata-5Y5M2IQP.mjs} +7 -7
  127. package/dist/{product-variant-detail-PR4HNZ5A.mjs → product-variant-detail-N7YAKUOH.mjs} +8 -8
  128. package/dist/{product-variant-edit-UZBA2SBV.mjs → product-variant-edit-L2T5V2HJ.mjs} +11 -11
  129. package/dist/{product-variant-metadata-3YFLI23Q.mjs → product-variant-metadata-VTAPSZ24.mjs} +7 -7
  130. package/dist/{promotion-create-QDNLZXBY.mjs → promotion-create-I7OYJO55.mjs} +11 -11
  131. package/dist/{promotion-detail-P2C5XMVT.mjs → promotion-detail-Q7MMF7CC.mjs} +8 -8
  132. package/dist/{promotion-edit-details-DDT7MQVJ.mjs → promotion-edit-details-6BSOOWQN.mjs} +4 -4
  133. package/dist/{promotion-list-JFBYPMYZ.mjs → promotion-list-L22GJE3P.mjs} +2 -2
  134. package/dist/{refund-reason-create-DY22FUI4.mjs → refund-reason-create-UFAJFFFX.mjs} +7 -7
  135. package/dist/{refund-reason-edit-GLTVSOTD.mjs → refund-reason-edit-HM42SYVK.mjs} +7 -7
  136. package/dist/{region-add-countries-7P7MDPO2.mjs → region-add-countries-2VAVXMJQ.mjs} +3 -3
  137. package/dist/{region-create-DIZZS7HR.mjs → region-create-NA7Y2LN4.mjs} +6 -6
  138. package/dist/{region-detail-PL2IAQ4V.mjs → region-detail-3BARMXUE.mjs} +2 -2
  139. package/dist/{region-edit-2XQSSCPV.mjs → region-edit-WAU347DP.mjs} +3 -3
  140. package/dist/{region-list-J7R4D635.mjs → region-list-V4R2REMH.mjs} +2 -2
  141. package/dist/{region-metadata-ISC23DPY.mjs → region-metadata-UZXRJHUJ.mjs} +7 -7
  142. package/dist/{reservation-detail-7HTLPUEY.mjs → reservation-detail-JRY5S7TS.mjs} +9 -9
  143. package/dist/{reservation-list-IQ7T3RF2.mjs → reservation-list-HSF22GFZ.mjs} +4 -4
  144. package/dist/{reservation-metadata-E55IGDZR.mjs → reservation-metadata-UQZXHUCV.mjs} +9 -9
  145. package/dist/{return-reason-list-EGGZ7O6G.mjs → return-reason-list-EYLIXARO.mjs} +4 -4
  146. package/dist/{sales-channel-add-products-M37VZP3G.mjs → sales-channel-add-products-WNHRWOZS.mjs} +14 -14
  147. package/dist/{sales-channel-detail-4E2NPXYK.mjs → sales-channel-detail-GKI35W5H.mjs} +10 -10
  148. package/dist/{sales-channel-metadata-TXFO5GWM.mjs → sales-channel-metadata-GY2GM5OH.mjs} +8 -8
  149. package/dist/{shipping-option-type-create-Q47KBJCI.mjs → shipping-option-type-create-WKI3RSYP.mjs} +7 -7
  150. package/dist/{shipping-option-type-detail-UM6CAZRM.mjs → shipping-option-type-detail-RJ75KMFI.mjs} +7 -7
  151. package/dist/{shipping-option-type-edit-UB3ORRBC.mjs → shipping-option-type-edit-4KGCJFG3.mjs} +7 -7
  152. package/dist/{shipping-option-type-list-H3VQNXL7.mjs → shipping-option-type-list-NAT6DIHR.mjs} +11 -11
  153. package/dist/{shipping-profile-metadata-3VGQN6KZ.mjs → shipping-profile-metadata-6D3FYDC4.mjs} +7 -7
  154. package/dist/{shipping-profiles-list-RCSILIP5.mjs → shipping-profiles-list-WRPIJBZZ.mjs} +4 -4
  155. package/dist/{store-add-currencies-JCQAADSP.mjs → store-add-currencies-OX2WXFMS.mjs} +3 -3
  156. package/dist/{store-add-locales-S2HKXAPY.mjs → store-add-locales-37443R2E.mjs} +10 -10
  157. package/dist/{store-detail-LRVBWDU5.mjs → store-detail-IIKGTBWO.mjs} +11 -11
  158. package/dist/{store-metadata-X7X7J26V.mjs → store-metadata-3P5YI3YQ.mjs} +7 -7
  159. package/dist/{tax-region-create-BH4AS4OU.mjs → tax-region-create-BFOF2UVZ.mjs} +7 -7
  160. package/dist/{tax-region-edit-AGUULZKA.mjs → tax-region-edit-I2DTFHH4.mjs} +7 -7
  161. package/dist/{tax-region-list-ZYTJG7HC.mjs → tax-region-list-P4LDOPZD.mjs} +1 -1
  162. package/dist/{translation-list-3EGUQC7L.mjs → translation-list-2QIA5IZ4.mjs} +7 -7
  163. package/dist/{translations-edit-IWXQCTSI.mjs → translations-edit-K7EMV5N3.mjs} +8 -8
  164. package/dist/{user-invite-AQQMVG4K.mjs → user-invite-GAGIM5DO.mjs} +5 -5
  165. package/dist/{user-metadata-CGFMJKPT.mjs → user-metadata-WQ57HEMA.mjs} +7 -7
  166. package/dist/{workflow-execution-detail-QKA2H2VA.mjs → workflow-execution-detail-RRZJQZV6.mjs} +7 -7
  167. package/dist/{workflow-execution-list-N6YFMSXW.mjs → workflow-execution-list-C3EJMVSZ.mjs} +4 -4
@@ -39,13 +39,47 @@ var import_fs = __toESM(require("fs"));
39
39
  var MENU_VIRTUAL_ID = "virtual:dashboard/menu-config";
40
40
  var MENU_RESOLVED_ID = "\0" + MENU_VIRTUAL_ID;
41
41
  var COMPONENT_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mts", ".mjs"];
42
+ var COMPONENT_EXT_SET = new Set(COMPONENT_EXTENSIONS);
43
+ var VALID_LOADERS = {
44
+ tsx: "tsx",
45
+ ts: "ts",
46
+ jsx: "jsx",
47
+ js: "js",
48
+ mts: "ts",
49
+ mjs: "js"
50
+ };
51
+ function collectComponentFiles(dir, depth = 0) {
52
+ if (depth > 20) return [];
53
+ const results = [];
54
+ let entries;
55
+ try {
56
+ entries = import_fs.default.readdirSync(dir, { withFileTypes: true });
57
+ } catch {
58
+ return results;
59
+ }
60
+ for (const entry of entries) {
61
+ if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
62
+ const fullPath = import_path.default.resolve(dir, entry.name);
63
+ if (entry.isDirectory()) {
64
+ results.push(...collectComponentFiles(fullPath, depth + 1));
65
+ } else if (entry.isFile()) {
66
+ const ext = import_path.default.extname(entry.name);
67
+ if (COMPONENT_EXT_SET.has(ext)) {
68
+ results.push(fullPath);
69
+ }
70
+ }
71
+ }
72
+ return results;
73
+ }
42
74
  function getComponentName(filePath) {
43
75
  const normalized = filePath.replace(/\\/g, "/");
44
- const parts = normalized.split("/");
76
+ const parts = normalized.split("/").filter(Boolean);
77
+ if (parts.length === 0) return null;
45
78
  const fileName = parts[parts.length - 1];
46
79
  const baseName = fileName.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
80
+ if (!baseName) return null;
47
81
  if (baseName === "index") {
48
- return parts.length >= 2 ? parts[parts.length - 2] : null;
82
+ return parts.length >= 2 ? parts[parts.length - 2] || null : null;
49
83
  }
50
84
  if (parts.length >= 2 && baseName === parts[parts.length - 2]) {
51
85
  return baseName;
@@ -56,15 +90,22 @@ function customDashboardPlugin() {
56
90
  const componentsDir = import_path.default.resolve(process.cwd(), "src/admin/components");
57
91
  const overridesByName = /* @__PURE__ */ new Map();
58
92
  if (import_fs.default.existsSync(componentsDir)) {
59
- for (const file of import_fs.default.readdirSync(componentsDir)) {
60
- const fullPath = import_path.default.resolve(componentsDir, file);
61
- if (!import_fs.default.statSync(fullPath).isFile()) continue;
62
- const name = file.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
63
- overridesByName.set(name, fullPath);
93
+ const collectedFiles = collectComponentFiles(componentsDir).sort();
94
+ for (const fullPath of collectedFiles) {
95
+ const fileName = import_path.default.basename(fullPath);
96
+ const name = fileName.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
97
+ if (name && name !== "index") {
98
+ if (overridesByName.has(name) && process.env.NODE_ENV === "development") {
99
+ console.warn(
100
+ `[custom-dashboard] Duplicate override "${name}": ${overridesByName.get(name)} will be replaced by ${fullPath}`
101
+ );
102
+ }
103
+ overridesByName.set(name, fullPath);
104
+ }
64
105
  }
65
106
  }
66
107
  const hasOverrides = overridesByName.size > 0;
67
- if (hasOverrides) {
108
+ if (hasOverrides && process.env.NODE_ENV === "development") {
68
109
  console.log("[custom-dashboard] overrides:", [...overridesByName.keys()]);
69
110
  }
70
111
  return {
@@ -84,13 +125,20 @@ function customDashboardPlugin() {
84
125
  build.onLoad({ filter: /app\.(mjs|js)$/ }, (args) => {
85
126
  const normalized = args.path.replace(/\\/g, "/");
86
127
  if (!normalized.includes("/dashboard/dist/")) return void 0;
87
- const srcEntry = args.path.replace(/\/dist\/app\.(mjs|js)$/, "/src/app.tsx");
88
- if (!import_fs.default.existsSync(srcEntry)) return void 0;
89
- console.log(
90
- `[custom-dashboard] Redirecting entry: ${args.path} \u2192 ${srcEntry}`
91
- );
128
+ const srcEntry = normalized.replace(/\/dist\/app\.(mjs|js)$/, "/src/app.tsx");
129
+ let contents;
130
+ try {
131
+ contents = import_fs.default.readFileSync(srcEntry, "utf-8");
132
+ } catch {
133
+ return void 0;
134
+ }
135
+ if (process.env.NODE_ENV === "development") {
136
+ console.log(
137
+ `[custom-dashboard] Redirecting entry: ${args.path} \u2192 ${srcEntry}`
138
+ );
139
+ }
92
140
  return {
93
- contents: import_fs.default.readFileSync(srcEntry, "utf-8"),
141
+ contents,
94
142
  loader: "tsx",
95
143
  resolveDir: import_path.default.dirname(srcEntry)
96
144
  };
@@ -104,12 +152,21 @@ function customDashboardPlugin() {
104
152
  if (componentName && overrides.has(componentName)) {
105
153
  const overridePath = overrides.get(componentName);
106
154
  const ext = import_path.default.extname(overridePath).slice(1);
107
- console.log(
108
- `[custom-dashboard] Override: ${componentName} \u2192 ${overridePath}`
109
- );
155
+ const loader = VALID_LOADERS[ext] || "tsx";
156
+ let contents;
157
+ try {
158
+ contents = import_fs.default.readFileSync(overridePath, "utf-8");
159
+ } catch {
160
+ return void 0;
161
+ }
162
+ if (process.env.NODE_ENV === "development") {
163
+ console.log(
164
+ `[custom-dashboard] Override: ${componentName} \u2192 ${overridePath}`
165
+ );
166
+ }
110
167
  return {
111
- contents: import_fs.default.readFileSync(overridePath, "utf-8"),
112
- loader: ext,
168
+ contents,
169
+ loader,
113
170
  resolveDir: import_path.default.dirname(overridePath)
114
171
  };
115
172
  }
@@ -128,8 +185,9 @@ function customDashboardPlugin() {
128
185
  if (id !== MENU_RESOLVED_ID) return;
129
186
  const basePath = import_path.default.resolve(process.cwd(), "src/admin/menu.config");
130
187
  for (const ext of COMPONENT_EXTENSIONS) {
131
- if (import_fs.default.existsSync(basePath + ext)) {
132
- return `export { default } from "${basePath + ext}"`;
188
+ const fullPath = (basePath + ext).replace(/\\/g, "/");
189
+ if (import_fs.default.existsSync(fullPath)) {
190
+ return `export { default } from "${fullPath}"`;
133
191
  }
134
192
  }
135
193
  return "export default null";
@@ -4,13 +4,47 @@ import fs from "fs";
4
4
  var MENU_VIRTUAL_ID = "virtual:dashboard/menu-config";
5
5
  var MENU_RESOLVED_ID = "\0" + MENU_VIRTUAL_ID;
6
6
  var COMPONENT_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mts", ".mjs"];
7
+ var COMPONENT_EXT_SET = new Set(COMPONENT_EXTENSIONS);
8
+ var VALID_LOADERS = {
9
+ tsx: "tsx",
10
+ ts: "ts",
11
+ jsx: "jsx",
12
+ js: "js",
13
+ mts: "ts",
14
+ mjs: "js"
15
+ };
16
+ function collectComponentFiles(dir, depth = 0) {
17
+ if (depth > 20) return [];
18
+ const results = [];
19
+ let entries;
20
+ try {
21
+ entries = fs.readdirSync(dir, { withFileTypes: true });
22
+ } catch {
23
+ return results;
24
+ }
25
+ for (const entry of entries) {
26
+ if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
27
+ const fullPath = path.resolve(dir, entry.name);
28
+ if (entry.isDirectory()) {
29
+ results.push(...collectComponentFiles(fullPath, depth + 1));
30
+ } else if (entry.isFile()) {
31
+ const ext = path.extname(entry.name);
32
+ if (COMPONENT_EXT_SET.has(ext)) {
33
+ results.push(fullPath);
34
+ }
35
+ }
36
+ }
37
+ return results;
38
+ }
7
39
  function getComponentName(filePath) {
8
40
  const normalized = filePath.replace(/\\/g, "/");
9
- const parts = normalized.split("/");
41
+ const parts = normalized.split("/").filter(Boolean);
42
+ if (parts.length === 0) return null;
10
43
  const fileName = parts[parts.length - 1];
11
44
  const baseName = fileName.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
45
+ if (!baseName) return null;
12
46
  if (baseName === "index") {
13
- return parts.length >= 2 ? parts[parts.length - 2] : null;
47
+ return parts.length >= 2 ? parts[parts.length - 2] || null : null;
14
48
  }
15
49
  if (parts.length >= 2 && baseName === parts[parts.length - 2]) {
16
50
  return baseName;
@@ -21,15 +55,22 @@ function customDashboardPlugin() {
21
55
  const componentsDir = path.resolve(process.cwd(), "src/admin/components");
22
56
  const overridesByName = /* @__PURE__ */ new Map();
23
57
  if (fs.existsSync(componentsDir)) {
24
- for (const file of fs.readdirSync(componentsDir)) {
25
- const fullPath = path.resolve(componentsDir, file);
26
- if (!fs.statSync(fullPath).isFile()) continue;
27
- const name = file.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
28
- overridesByName.set(name, fullPath);
58
+ const collectedFiles = collectComponentFiles(componentsDir).sort();
59
+ for (const fullPath of collectedFiles) {
60
+ const fileName = path.basename(fullPath);
61
+ const name = fileName.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
62
+ if (name && name !== "index") {
63
+ if (overridesByName.has(name) && process.env.NODE_ENV === "development") {
64
+ console.warn(
65
+ `[custom-dashboard] Duplicate override "${name}": ${overridesByName.get(name)} will be replaced by ${fullPath}`
66
+ );
67
+ }
68
+ overridesByName.set(name, fullPath);
69
+ }
29
70
  }
30
71
  }
31
72
  const hasOverrides = overridesByName.size > 0;
32
- if (hasOverrides) {
73
+ if (hasOverrides && process.env.NODE_ENV === "development") {
33
74
  console.log("[custom-dashboard] overrides:", [...overridesByName.keys()]);
34
75
  }
35
76
  return {
@@ -49,13 +90,20 @@ function customDashboardPlugin() {
49
90
  build.onLoad({ filter: /app\.(mjs|js)$/ }, (args) => {
50
91
  const normalized = args.path.replace(/\\/g, "/");
51
92
  if (!normalized.includes("/dashboard/dist/")) return void 0;
52
- const srcEntry = args.path.replace(/\/dist\/app\.(mjs|js)$/, "/src/app.tsx");
53
- if (!fs.existsSync(srcEntry)) return void 0;
54
- console.log(
55
- `[custom-dashboard] Redirecting entry: ${args.path} \u2192 ${srcEntry}`
56
- );
93
+ const srcEntry = normalized.replace(/\/dist\/app\.(mjs|js)$/, "/src/app.tsx");
94
+ let contents;
95
+ try {
96
+ contents = fs.readFileSync(srcEntry, "utf-8");
97
+ } catch {
98
+ return void 0;
99
+ }
100
+ if (process.env.NODE_ENV === "development") {
101
+ console.log(
102
+ `[custom-dashboard] Redirecting entry: ${args.path} \u2192 ${srcEntry}`
103
+ );
104
+ }
57
105
  return {
58
- contents: fs.readFileSync(srcEntry, "utf-8"),
106
+ contents,
59
107
  loader: "tsx",
60
108
  resolveDir: path.dirname(srcEntry)
61
109
  };
@@ -69,12 +117,21 @@ function customDashboardPlugin() {
69
117
  if (componentName && overrides.has(componentName)) {
70
118
  const overridePath = overrides.get(componentName);
71
119
  const ext = path.extname(overridePath).slice(1);
72
- console.log(
73
- `[custom-dashboard] Override: ${componentName} \u2192 ${overridePath}`
74
- );
120
+ const loader = VALID_LOADERS[ext] || "tsx";
121
+ let contents;
122
+ try {
123
+ contents = fs.readFileSync(overridePath, "utf-8");
124
+ } catch {
125
+ return void 0;
126
+ }
127
+ if (process.env.NODE_ENV === "development") {
128
+ console.log(
129
+ `[custom-dashboard] Override: ${componentName} \u2192 ${overridePath}`
130
+ );
131
+ }
75
132
  return {
76
- contents: fs.readFileSync(overridePath, "utf-8"),
77
- loader: ext,
133
+ contents,
134
+ loader,
78
135
  resolveDir: path.dirname(overridePath)
79
136
  };
80
137
  }
@@ -93,8 +150,9 @@ function customDashboardPlugin() {
93
150
  if (id !== MENU_RESOLVED_ID) return;
94
151
  const basePath = path.resolve(process.cwd(), "src/admin/menu.config");
95
152
  for (const ext of COMPONENT_EXTENSIONS) {
96
- if (fs.existsSync(basePath + ext)) {
97
- return `export { default } from "${basePath + ext}"`;
153
+ const fullPath = (basePath + ext).replace(/\\/g, "/");
154
+ if (fs.existsSync(fullPath)) {
155
+ return `export { default } from "${fullPath}"`;
98
156
  }
99
157
  }
100
158
  return "export default null";
package/package.json CHANGED
@@ -1,7 +1,32 @@
1
1
  {
2
2
  "name": "@mantajs/dashboard",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "description": "B2B Admin Dashboard for Medusa - Fork of @medusajs/dashboard",
5
+ "license": "MIT",
6
+ "author": {
7
+ "name": "Olivier Belaud",
8
+ "url": "https://github.com/OlivierBelaud"
9
+ },
10
+ "homepage": "https://github.com/manta-js/dashboard#readme",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/manta-js/dashboard"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/manta-js/dashboard/issues"
17
+ },
18
+ "publishConfig": {
19
+ "access": "public",
20
+ "provenance": true
21
+ },
22
+ "keywords": [
23
+ "medusa",
24
+ "dashboard",
25
+ "admin",
26
+ "b2b",
27
+ "ecommerce",
28
+ "vite-plugin"
29
+ ],
5
30
  "scripts": {
6
31
  "dev": "vite",
7
32
  "build": "tsup && node ./scripts/generate-types.js",
@@ -34,6 +59,8 @@
34
59
  },
35
60
  "files": [
36
61
  "package.json",
62
+ "LICENSE",
63
+ "README.md",
37
64
  "src",
38
65
  "dist"
39
66
  ],
@@ -79,12 +106,11 @@
79
106
  "zod": "3.25.76"
80
107
  },
81
108
  "devDependencies": {
82
- "@medusajs/admin-shared": "2.13.1",
83
109
  "@medusajs/admin-vite-plugin": "2.13.1",
84
110
  "@medusajs/types": "2.13.1",
85
111
  "@medusajs/ui-preset": "2.13.1",
86
112
  "@types/node": "^20.0.0",
87
- "@types/react": "^19.2.13",
113
+ "@types/react": "^18.2.0",
88
114
  "@vitejs/plugin-react": "^4.0.0",
89
115
  "autoprefixer": "^10.4.16",
90
116
  "postcss": "^8.4.31",
package/src/app.tsx CHANGED
@@ -25,7 +25,7 @@ interface AppProps {
25
25
 
26
26
  function App({ plugins = [] }: AppProps) {
27
27
  const app = new DashboardApp({
28
- plugins: [localPlugin, ...plugins],
28
+ plugins: [...plugins, localPlugin],
29
29
  })
30
30
 
31
31
  return <div>{app.render()}</div>
@@ -200,7 +200,7 @@ const getDefaultMedusaRoutes = (t: (key: string) => string): Omit<INavItem, "pat
200
200
  const useCoreRoutes = (): Omit<INavItem, "pathname">[] => {
201
201
  const { t } = useTranslation()
202
202
 
203
- if (!menuConfig) {
203
+ if (!menuConfig || !Array.isArray((menuConfig as MenuConfig).items)) {
204
204
  return getDefaultMedusaRoutes(t)
205
205
  }
206
206
 
@@ -271,7 +271,7 @@ const CoreRouteSection = () => {
271
271
 
272
272
  // Derived from config: avoids duplication between custom menu and extensions
273
273
  const getMainMenuPaths = (): string[] => {
274
- if (!menuConfig) return []
274
+ if (!menuConfig || !Array.isArray((menuConfig as MenuConfig).items)) return []
275
275
  const config = menuConfig as MenuConfig
276
276
  const paths: string[] = []
277
277
  config.items.forEach((item) => {
@@ -137,7 +137,8 @@ export class DashboardApp {
137
137
  allMenuItems.sort((a, b) => a.path.length - b.path.length)
138
138
 
139
139
  allMenuItems.forEach((item) => {
140
- item.path = item.path.replace(OPTIONAL_LAST_SEGMENT_MATCH, "")
140
+ const normalizedPath = item.path.replace(OPTIONAL_LAST_SEGMENT_MATCH, "")
141
+ item.path = normalizedPath
141
142
  if (item.path.includes("/:") || item.path.endsWith("/*")) {
142
143
  if (process.env.NODE_ENV === "development") {
143
144
  console.warn(
@@ -56,7 +56,7 @@ function createExtendedDefaultValues<TData>(
56
56
  return acc
57
57
  }, {} as Record<string, any>)
58
58
 
59
- return Object.assign(baseDefaultValues, { additional_data })
59
+ return { ...baseDefaultValues, additional_data }
60
60
  }
61
61
 
62
62
  export const useExtendableForm = <
@@ -11,7 +11,7 @@ function appendLinkableFields(
11
11
  : link.map((l) => `+${l}.*`)
12
12
  })
13
13
 
14
- return [fields, ...linkableFields].join(",")
14
+ return [fields, ...linkableFields].filter(Boolean).join(",")
15
15
  }
16
16
 
17
17
  export function getLinkedFields(model: CustomFieldModel, fields: string = "") {
@@ -30,14 +30,6 @@ export function getRouteMap({
30
30
  errorElement: <ErrorBoundary />,
31
31
  lazy: () => import("../../routes/home"),
32
32
  },
33
- {
34
- path: "/dashboard",
35
- errorElement: <ErrorBoundary />,
36
- handle: {
37
- breadcrumb: () => "Dashboard",
38
- },
39
- lazy: () => import("../../routes/dashboard"),
40
- },
41
33
  {
42
34
  path: "/products",
43
35
  errorElement: <ErrorBoundary />,
@@ -28,10 +28,19 @@ export function mergeExtensionRoutes(
28
28
  const merged = { ...existing }
29
29
 
30
30
  // Extension component takes priority
31
- if (ext.lazy) {
32
- merged.lazy = ext.lazy
33
- delete (merged as any).Component
34
- delete (merged as any).loader
31
+ if (ext.lazy || ext.Component) {
32
+ if (ext.lazy) {
33
+ merged.lazy = ext.lazy
34
+ delete (merged as any).Component
35
+ } else if (ext.Component) {
36
+ ;(merged as any).Component = ext.Component
37
+ delete (merged as any).lazy
38
+ }
39
+ if (ext.loader) {
40
+ ;(merged as any).loader = ext.loader
41
+ } else {
42
+ delete (merged as any).loader
43
+ }
35
44
  }
36
45
 
37
46
  // Recursively merge children — static children not redefined by the
@@ -166,7 +166,7 @@ const addRoute = (
166
166
  leaf.children = processParallelRoutes(parallelRoutes, currentFullPath)
167
167
  Object.assign(route, leaf)
168
168
  } else {
169
- const leaf = createLeafRoute(Component, loader)
169
+ const leaf = createLeafRoute(Component, loader, handle)
170
170
  leaf.children = processParallelRoutes(parallelRoutes, currentFullPath)
171
171
  route.children.push(leaf)
172
172
  }
@@ -12,7 +12,7 @@ export function sortMenuItemsByRank(
12
12
  // Sort items by rank (ascending order)
13
13
  // Items with rank come first, sorted by rank value
14
14
  // Items without rank come last, maintaining their original order
15
- const sortedItems = items.sort((a, b) => {
15
+ const sortedItems = [...items].sort((a, b) => {
16
16
  // If both have rank, sort by rank value
17
17
  if (a.rank !== undefined && b.rank !== undefined) {
18
18
  return a.rank - b.rank
@@ -30,14 +30,16 @@ export function sortMenuItemsByRank(
30
30
  })
31
31
 
32
32
  // Recursively sort nested items
33
- sortedItems.forEach((item) => {
33
+ return sortedItems.map((item) => {
34
34
  if (item.items && item.items.length > 0) {
35
- item.items = sortMenuItemsByRank(
36
- item.items as (INavItem & { rank?: number })[]
37
- )
35
+ return {
36
+ ...item,
37
+ items: sortMenuItemsByRank(
38
+ item.items as (INavItem & { rank?: number })[]
39
+ ),
40
+ }
38
41
  }
42
+ return item
39
43
  })
40
-
41
- return sortedItems
42
44
  }
43
45
 
package/src/index.css CHANGED
@@ -34,15 +34,9 @@
34
34
  }
35
35
 
36
36
  @layer components {
37
- .worfklow-grid {
37
+ .workflow-grid {
38
38
  background-image: radial-gradient(black 1px, transparent 0);
39
39
  background-size: 40px 40px;
40
- background: repeat;
40
+ background-repeat: repeat;
41
41
  }
42
42
  }
43
-
44
- .worfklow-grid {
45
- background-image: radial-gradient(black 1px, transparent 0);
46
- background-size: 40px 40px;
47
- background: repeat;
48
- }
@@ -5,7 +5,7 @@ export const Home = () => {
5
5
  const navigate = useNavigate()
6
6
 
7
7
  useEffect(() => {
8
- navigate("/dashboard", { replace: true })
8
+ navigate("/orders", { replace: true })
9
9
  }, [navigate])
10
10
 
11
11
  return <div />
@@ -32,7 +32,7 @@ export const InventoryStockForm = ({
32
32
  const { setCloseOnEscape, handleSuccess } = useRouteModal()
33
33
 
34
34
  const initialValues = useRef(getDefaultValues(items, locations))
35
- console.log("initialValues", initialValues.current)
35
+
36
36
 
37
37
  const form = useForm<InventoryStockSchema>({
38
38
  defaultValues: getDefaultValues(items, locations),
package/src/vite-env.d.ts CHANGED
@@ -1,8 +1,10 @@
1
- // / <reference types="vite/client" />
1
+ /// <reference types="vite/client" />
2
2
 
3
3
  interface ImportMetaEnv {
4
- readonly VITE_MEDUSA_ADMIN_BACKEND_URL: string
4
+ readonly VITE_MEDUSA_BACKEND_URL: string
5
5
  readonly VITE_MEDUSA_STOREFRONT_URL: string
6
+ readonly VITE_MEDUSA_BASE?: string
7
+ readonly VITE_MEDUSA_PROJECT?: string
6
8
  readonly VITE_MEDUSA_V2: "true" | "false"
7
9
  }
8
10
 
@@ -16,5 +18,3 @@ interface ImportMeta {
16
18
  declare const __BACKEND_URL__: string | undefined
17
19
  declare const __STOREFRONT_URL__: string | undefined
18
20
  declare const __BASE__: string
19
- declare const __AUTH_TYPE__: "session" | "jwt" | undefined
20
- declare const __JWT_TOKEN_STORAGE_KEY__: string | undefined