@vendure/dashboard 3.4.0-minor-202506250934 → 3.4.0

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 (523) hide show
  1. package/README.md +102 -3
  2. package/dist/plugin/api/api-extensions.d.ts +1 -0
  3. package/dist/plugin/api/api-extensions.js +38 -0
  4. package/dist/plugin/api/metrics.resolver.d.ts +8 -0
  5. package/dist/plugin/api/metrics.resolver.js +40 -0
  6. package/dist/plugin/config/metrics-strategies.d.ts +39 -0
  7. package/dist/plugin/config/metrics-strategies.js +74 -0
  8. package/dist/plugin/constants.d.ts +4 -3
  9. package/dist/plugin/constants.js +10 -277
  10. package/dist/plugin/dashboard.plugin.d.ts +95 -0
  11. package/dist/plugin/dashboard.plugin.js +168 -0
  12. package/dist/plugin/index.d.ts +2 -1
  13. package/dist/plugin/index.js +18 -1
  14. package/dist/plugin/package.json +3 -0
  15. package/dist/plugin/service/metrics.service.d.ts +15 -0
  16. package/dist/plugin/service/metrics.service.js +145 -0
  17. package/dist/plugin/types.d.ts +23 -0
  18. package/dist/plugin/types.js +13 -0
  19. package/dist/vite/constants.d.ts +5 -0
  20. package/dist/vite/constants.js +277 -0
  21. package/dist/vite/index.d.ts +1 -0
  22. package/dist/vite/index.js +1 -0
  23. package/dist/vite/types.d.ts +40 -0
  24. package/dist/{plugin → vite}/utils/ast-utils.d.ts +0 -5
  25. package/dist/vite/utils/ast-utils.js +29 -0
  26. package/dist/vite/utils/ast-utils.spec.d.ts +1 -0
  27. package/dist/vite/utils/ast-utils.spec.js +45 -0
  28. package/dist/vite/utils/compiler.d.ts +22 -0
  29. package/dist/vite/utils/compiler.js +162 -0
  30. package/dist/vite/utils/config-loader.d.ts +1 -0
  31. package/dist/vite/utils/config-loader.js +1 -0
  32. package/dist/vite/utils/logger.d.ts +3 -0
  33. package/dist/vite/utils/logger.js +39 -0
  34. package/dist/vite/utils/plugin-discovery.d.ts +27 -0
  35. package/dist/vite/utils/plugin-discovery.js +387 -0
  36. package/dist/vite/utils/tsconfig-utils.d.ts +9 -0
  37. package/dist/vite/utils/tsconfig-utils.js +50 -0
  38. package/dist/vite/utils/ui-config.d.ts +3 -0
  39. package/dist/vite/utils/ui-config.js +30 -0
  40. package/dist/{plugin → vite}/vite-plugin-config-loader.d.ts +3 -3
  41. package/dist/{plugin → vite}/vite-plugin-config-loader.js +18 -13
  42. package/dist/{plugin → vite}/vite-plugin-config.js +6 -7
  43. package/dist/{plugin → vite}/vite-plugin-dashboard-metadata.d.ts +1 -3
  44. package/dist/{plugin → vite}/vite-plugin-dashboard-metadata.js +20 -10
  45. package/dist/vite/vite-plugin-tailwind-source.d.ts +7 -0
  46. package/dist/vite/vite-plugin-tailwind-source.js +61 -0
  47. package/dist/vite/vite-plugin-theme.js +130 -0
  48. package/dist/vite/vite-plugin-ui-config.d.ts +123 -0
  49. package/dist/{plugin → vite}/vite-plugin-ui-config.js +3 -11
  50. package/dist/vite/vite-plugin-vendure-dashboard.d.ts +85 -0
  51. package/dist/{plugin → vite}/vite-plugin-vendure-dashboard.js +10 -7
  52. package/index.html +1 -1
  53. package/package.json +56 -31
  54. package/src/app/app-providers.tsx +7 -7
  55. package/src/app/common/delete-bulk-action.tsx +148 -0
  56. package/src/app/common/duplicate-bulk-action.tsx +134 -0
  57. package/src/app/main.tsx +9 -9
  58. package/src/app/routes/__root.tsx +1 -2
  59. package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +10 -1
  60. package/src/app/routes/_authenticated/_administrators/administrators.tsx +15 -8
  61. package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +16 -12
  62. package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +15 -0
  63. package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +16 -16
  64. package/src/app/routes/_authenticated/_assets/assets.graphql.ts +13 -2
  65. package/src/app/routes/_authenticated/_assets/assets.tsx +16 -4
  66. package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +52 -38
  67. package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +45 -0
  68. package/src/app/routes/_authenticated/_channels/channels.graphql.ts +10 -1
  69. package/src/app/routes/_authenticated/_channels/channels.tsx +17 -10
  70. package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +21 -17
  71. package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +15 -0
  72. package/src/app/routes/_authenticated/_collections/collections.graphql.ts +60 -3
  73. package/src/app/routes/_authenticated/_collections/collections.tsx +168 -124
  74. package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +21 -17
  75. package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +123 -0
  76. package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +8 -9
  77. package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +9 -5
  78. package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +10 -9
  79. package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +12 -79
  80. package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +430 -0
  81. package/src/app/routes/_authenticated/_collections/components/move-single-collection.tsx +33 -0
  82. package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +15 -0
  83. package/src/app/routes/_authenticated/_countries/countries.graphql.ts +11 -2
  84. package/src/app/routes/_authenticated/_countries/countries.tsx +13 -6
  85. package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +21 -17
  86. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +15 -0
  87. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +12 -5
  88. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +22 -17
  89. package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +11 -2
  90. package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +13 -6
  91. package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +18 -15
  92. package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +19 -19
  93. package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +10 -10
  94. package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +15 -0
  95. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +5 -5
  96. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +11 -7
  97. package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +4 -4
  98. package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +75 -73
  99. package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +4 -4
  100. package/src/app/routes/_authenticated/_customers/customers.graphql.ts +10 -2
  101. package/src/app/routes/_authenticated/_customers/customers.tsx +13 -6
  102. package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +19 -15
  103. package/src/app/routes/_authenticated/_facets/components/edit-facet-value.tsx +9 -9
  104. package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +104 -0
  105. package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +4 -4
  106. package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +76 -65
  107. package/src/app/routes/_authenticated/_facets/facets.graphql.ts +80 -1
  108. package/src/app/routes/_authenticated/_facets/facets.tsx +31 -7
  109. package/src/app/routes/_authenticated/_facets/facets_.$facetId.values_.$id.tsx +147 -0
  110. package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +17 -13
  111. package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +1 -1
  112. package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +26 -18
  113. package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +191 -0
  114. package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +11 -15
  115. package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +111 -80
  116. package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +320 -0
  117. package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +153 -0
  118. package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +11 -9
  119. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +19 -13
  120. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +67 -62
  121. package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +391 -39
  122. package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +9 -5
  123. package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +28 -13
  124. package/src/app/routes/_authenticated/_orders/components/order-modification-preview-dialog.tsx +364 -0
  125. package/src/app/routes/_authenticated/_orders/components/order-modification-summary.tsx +222 -0
  126. package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +39 -22
  127. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +148 -87
  128. package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +37 -36
  129. package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +274 -48
  130. package/src/app/routes/_authenticated/_orders/components/settle-refund-dialog.tsx +80 -0
  131. package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +43 -44
  132. package/src/app/routes/_authenticated/_orders/components/state-transition-control.tsx +102 -0
  133. package/src/app/routes/_authenticated/_orders/components/use-transition-order-to-state.tsx +144 -0
  134. package/src/app/routes/_authenticated/_orders/orders.graphql.ts +219 -5
  135. package/src/app/routes/_authenticated/_orders/orders.tsx +23 -22
  136. package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +190 -42
  137. package/src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx +550 -0
  138. package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +187 -107
  139. package/src/app/routes/_authenticated/_orders/utils/order-types.ts +10 -0
  140. package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +78 -0
  141. package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +12 -79
  142. package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +12 -79
  143. package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +58 -0
  144. package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +29 -2
  145. package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +36 -14
  146. package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +22 -15
  147. package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +110 -0
  148. package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +7 -6
  149. package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +64 -3
  150. package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +39 -9
  151. package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +33 -22
  152. package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +10 -10
  153. package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +281 -0
  154. package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +57 -41
  155. package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +11 -11
  156. package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +18 -14
  157. package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +23 -17
  158. package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +123 -0
  159. package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +28 -34
  160. package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +84 -53
  161. package/src/app/routes/_authenticated/_products/products.graphql.ts +70 -2
  162. package/src/app/routes/_authenticated/_products/products.tsx +36 -7
  163. package/src/app/routes/_authenticated/_products/products_.$id.tsx +34 -26
  164. package/src/app/routes/_authenticated/_profile/profile.graphql.ts +1 -1
  165. package/src/app/routes/_authenticated/_profile/profile.tsx +8 -8
  166. package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +14 -86
  167. package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +82 -0
  168. package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +14 -86
  169. package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +27 -2
  170. package/src/app/routes/_authenticated/_promotions/promotions.tsx +31 -7
  171. package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +20 -16
  172. package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +5 -5
  173. package/src/app/routes/_authenticated/_roles/components/permissions-grid.tsx +21 -17
  174. package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +15 -0
  175. package/src/app/routes/_authenticated/_roles/roles.graphql.ts +10 -1
  176. package/src/app/routes/_authenticated/_roles/roles.tsx +17 -10
  177. package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +16 -12
  178. package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +15 -0
  179. package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +10 -1
  180. package/src/app/routes/_authenticated/_sellers/sellers.tsx +13 -6
  181. package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +17 -13
  182. package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +6 -6
  183. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +12 -80
  184. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +15 -80
  185. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +61 -0
  186. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-method-dialog.tsx +3 -3
  187. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +29 -2
  188. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +25 -6
  189. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +25 -19
  190. package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +58 -0
  191. package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +26 -1
  192. package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +25 -6
  193. package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +16 -12
  194. package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +5 -5
  195. package/src/app/routes/_authenticated/_system/healthchecks.tsx +5 -5
  196. package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +12 -1
  197. package/src/app/routes/_authenticated/_system/job-queue.tsx +110 -11
  198. package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +34 -28
  199. package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +15 -0
  200. package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +11 -2
  201. package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +14 -7
  202. package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +20 -16
  203. package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +15 -0
  204. package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +11 -2
  205. package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +15 -8
  206. package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +22 -18
  207. package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +15 -0
  208. package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +4 -4
  209. package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +12 -15
  210. package/src/app/routes/_authenticated/_zones/zones.graphql.ts +11 -2
  211. package/src/app/routes/_authenticated/_zones/zones.tsx +13 -6
  212. package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +18 -14
  213. package/src/app/routes/_authenticated/index.tsx +6 -6
  214. package/src/app/routes/_authenticated.tsx +4 -4
  215. package/src/app/routes/login.tsx +2 -2
  216. package/src/app/styles.css +5 -2
  217. package/src/lib/components/data-display/boolean.tsx +1 -1
  218. package/src/lib/components/data-display/date-time.tsx +9 -3
  219. package/src/lib/components/data-display/json.tsx +1 -1
  220. package/src/lib/components/data-display/money.tsx +2 -3
  221. package/src/lib/components/data-input/affixed-input.tsx +3 -8
  222. package/src/lib/components/data-input/combination-mode-input.tsx +52 -0
  223. package/src/lib/components/data-input/configurable-operation-list-input.tsx +433 -0
  224. package/src/lib/components/data-input/custom-field-list-input.tsx +297 -0
  225. package/src/lib/components/data-input/customer-group-input.tsx +2 -2
  226. package/src/lib/components/data-input/datetime-input.tsx +132 -146
  227. package/src/lib/components/data-input/default-relation-input.tsx +599 -0
  228. package/src/lib/components/data-input/facet-value-input.tsx +30 -22
  229. package/src/lib/components/data-input/index.ts +17 -0
  230. package/src/lib/components/data-input/money-input.tsx +5 -12
  231. package/src/lib/components/data-input/product-multi-selector.tsx +426 -0
  232. package/src/lib/components/data-input/relation-input.tsx +164 -0
  233. package/src/lib/components/data-input/relation-selector.tsx +476 -0
  234. package/src/lib/components/data-input/{richt-text-input.tsx → rich-text-input.tsx} +15 -9
  235. package/src/lib/components/data-input/select-with-options.tsx +84 -0
  236. package/src/lib/components/data-input/struct-form-input.tsx +324 -0
  237. package/src/lib/components/data-table/add-filter-menu.tsx +9 -18
  238. package/src/lib/components/data-table/data-table-bulk-action-item.tsx +101 -0
  239. package/src/lib/components/data-table/data-table-bulk-actions.tsx +108 -0
  240. package/src/lib/components/data-table/data-table-column-header.tsx +4 -22
  241. package/src/lib/components/data-table/data-table-faceted-filter.tsx +8 -8
  242. package/src/lib/components/data-table/data-table-filter-badge.tsx +16 -8
  243. package/src/lib/components/data-table/data-table-filter-dialog.tsx +8 -8
  244. package/src/lib/components/data-table/data-table-pagination.tsx +4 -4
  245. package/src/lib/components/data-table/data-table-utils.ts +34 -0
  246. package/src/lib/components/data-table/data-table-view-options.tsx +27 -23
  247. package/src/lib/components/data-table/data-table.tsx +90 -43
  248. package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +11 -8
  249. package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +14 -23
  250. package/src/lib/components/data-table/filters/data-table-id-filter.tsx +15 -10
  251. package/src/lib/components/data-table/filters/data-table-number-filter.tsx +18 -17
  252. package/src/lib/components/data-table/filters/data-table-string-filter.tsx +29 -12
  253. package/src/lib/components/data-table/human-readable-operator.tsx +3 -3
  254. package/src/lib/components/data-table/refresh-button.tsx +30 -15
  255. package/src/lib/components/data-table/use-generated-columns.tsx +322 -0
  256. package/src/lib/components/labeled-data.tsx +21 -0
  257. package/src/lib/components/layout/app-layout.tsx +8 -13
  258. package/src/lib/components/layout/app-sidebar.tsx +5 -5
  259. package/src/lib/components/layout/channel-switcher.tsx +171 -62
  260. package/src/lib/components/layout/content-language-selector.tsx +16 -10
  261. package/src/lib/components/layout/dev-mode-indicator.tsx +18 -0
  262. package/src/lib/components/layout/generated-breadcrumbs.tsx +1 -1
  263. package/src/lib/components/layout/language-dialog.tsx +7 -12
  264. package/src/lib/components/layout/manage-languages-dialog.tsx +405 -0
  265. package/src/lib/components/layout/nav-item-wrapper.tsx +107 -0
  266. package/src/lib/components/layout/nav-main.tsx +200 -111
  267. package/src/lib/components/layout/nav-projects.tsx +2 -2
  268. package/src/lib/components/layout/nav-user.tsx +7 -7
  269. package/src/lib/components/layout/prerelease-popup.tsx +1 -1
  270. package/src/lib/components/login/login-form.tsx +85 -50
  271. package/src/lib/components/shared/alerts.tsx +3 -3
  272. package/src/lib/components/shared/animated-number.tsx +2 -2
  273. package/src/lib/components/shared/asset/asset-bulk-actions.tsx +109 -0
  274. package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +29 -19
  275. package/src/lib/components/shared/asset/asset-gallery.tsx +25 -20
  276. package/src/lib/components/shared/asset/asset-picker-dialog.tsx +63 -66
  277. package/src/lib/components/shared/asset/asset-preview-dialog.tsx +3 -7
  278. package/src/lib/components/shared/asset/asset-preview-selector.tsx +4 -6
  279. package/src/lib/components/shared/asset/asset-preview.tsx +7 -21
  280. package/src/lib/components/shared/asset/asset-properties.tsx +7 -9
  281. package/src/lib/components/shared/asset/focal-point-control.tsx +5 -13
  282. package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +71 -0
  283. package/src/lib/components/shared/assign-to-channel-dialog.tsx +155 -0
  284. package/src/lib/components/shared/assigned-facet-values.tsx +1 -5
  285. package/src/lib/components/shared/channel-code-label.tsx +3 -4
  286. package/src/lib/components/shared/channel-selector.tsx +6 -6
  287. package/src/lib/components/shared/configurable-operation-arg-input.tsx +367 -23
  288. package/src/lib/components/shared/configurable-operation-input.tsx +87 -48
  289. package/src/lib/components/shared/configurable-operation-multi-selector.tsx +260 -0
  290. package/src/lib/components/shared/configurable-operation-selector.tsx +156 -0
  291. package/src/lib/components/shared/confirmation-dialog.tsx +2 -2
  292. package/src/lib/components/shared/copyable-text.tsx +3 -4
  293. package/src/lib/components/shared/country-selector.tsx +21 -18
  294. package/src/lib/components/shared/currency-selector.tsx +5 -5
  295. package/src/lib/components/shared/custom-fields-form.tsx +423 -50
  296. package/src/lib/components/shared/customer-address-form.tsx +18 -13
  297. package/src/lib/components/shared/customer-group-selector.tsx +6 -6
  298. package/src/lib/components/shared/customer-selector.tsx +24 -18
  299. package/src/lib/components/shared/detail-page-button.tsx +45 -1
  300. package/src/lib/components/shared/entity-assets.tsx +33 -34
  301. package/src/lib/components/shared/error-page.tsx +6 -6
  302. package/src/lib/components/shared/facet-value-chip.tsx +12 -5
  303. package/src/lib/components/shared/facet-value-selector.tsx +64 -63
  304. package/src/lib/components/shared/form-field-wrapper.tsx +47 -24
  305. package/src/lib/components/shared/history-timeline/history-entry-date.tsx +37 -0
  306. package/src/lib/components/shared/history-timeline/history-entry.tsx +146 -70
  307. package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +3 -3
  308. package/src/lib/components/shared/history-timeline/history-note-editor.tsx +4 -4
  309. package/src/lib/components/shared/history-timeline/history-note-input.tsx +7 -7
  310. package/src/lib/components/shared/history-timeline/history-timeline.tsx +8 -48
  311. package/src/lib/components/shared/language-selector.tsx +5 -5
  312. package/src/lib/components/shared/logo-mark.tsx +2 -2
  313. package/src/lib/components/shared/multi-select.tsx +6 -6
  314. package/src/lib/components/shared/navigation-confirmation.tsx +24 -9
  315. package/src/lib/components/shared/option-value-input.tsx +18 -16
  316. package/src/lib/components/shared/paginated-list-data-table.tsx +35 -230
  317. package/src/lib/components/shared/permission-guard.tsx +4 -4
  318. package/src/lib/components/shared/product-variant-selector.tsx +59 -34
  319. package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +90 -0
  320. package/src/lib/components/shared/role-code-label.tsx +10 -6
  321. package/src/lib/components/shared/role-selector.tsx +4 -4
  322. package/src/lib/components/shared/seller-selector.tsx +21 -17
  323. package/src/lib/components/shared/stock-level-label.tsx +5 -5
  324. package/src/lib/components/shared/tax-category-selector.tsx +5 -5
  325. package/src/lib/components/shared/translatable-form-field.tsx +46 -23
  326. package/src/lib/components/shared/vendure-image.tsx +31 -2
  327. package/src/lib/components/shared/zone-selector.tsx +5 -6
  328. package/src/lib/components/ui/accordion.tsx +3 -3
  329. package/src/lib/components/ui/alert-dialog.tsx +10 -10
  330. package/src/lib/components/ui/alert.tsx +3 -3
  331. package/src/lib/components/ui/aspect-ratio.tsx +9 -0
  332. package/src/lib/components/ui/badge.tsx +2 -2
  333. package/src/lib/components/ui/breadcrumb.tsx +4 -4
  334. package/src/lib/components/ui/button.tsx +10 -3
  335. package/src/lib/components/ui/calendar.tsx +392 -459
  336. package/src/lib/components/ui/card.tsx +2 -2
  337. package/src/lib/components/ui/carousel.tsx +241 -0
  338. package/src/lib/components/ui/chart.tsx +351 -0
  339. package/src/lib/components/ui/checkbox.tsx +2 -2
  340. package/src/lib/components/ui/command.tsx +12 -6
  341. package/src/lib/components/ui/context-menu.tsx +252 -0
  342. package/src/lib/components/ui/dialog.tsx +2 -2
  343. package/src/lib/components/ui/drawer.tsx +133 -0
  344. package/src/lib/components/ui/dropdown-menu.tsx +7 -7
  345. package/src/lib/components/ui/form.tsx +8 -8
  346. package/src/lib/components/ui/hover-card.tsx +3 -3
  347. package/src/lib/components/ui/input-otp.tsx +77 -0
  348. package/src/lib/components/ui/input.tsx +1 -1
  349. package/src/lib/components/ui/label.tsx +2 -2
  350. package/src/lib/components/ui/menubar.tsx +274 -0
  351. package/src/lib/components/ui/navigation-menu.tsx +168 -0
  352. package/src/lib/components/ui/pagination.tsx +87 -108
  353. package/src/lib/components/ui/popover.tsx +3 -3
  354. package/src/lib/components/ui/progress.tsx +29 -0
  355. package/src/lib/components/ui/radio-group.tsx +45 -0
  356. package/src/lib/components/ui/resizable.tsx +54 -0
  357. package/src/lib/components/ui/scroll-area.tsx +2 -2
  358. package/src/lib/components/ui/select.tsx +151 -129
  359. package/src/lib/components/ui/separator.tsx +2 -2
  360. package/src/lib/components/ui/sheet.tsx +5 -5
  361. package/src/lib/components/ui/sidebar.tsx +10 -10
  362. package/src/lib/components/ui/skeleton.tsx +1 -1
  363. package/src/lib/components/ui/slider.tsx +63 -0
  364. package/src/lib/components/ui/switch.tsx +2 -2
  365. package/src/lib/components/ui/table.tsx +2 -2
  366. package/src/lib/components/ui/tabs.tsx +3 -3
  367. package/src/lib/components/ui/textarea.tsx +1 -1
  368. package/src/lib/components/ui/toggle-group.tsx +73 -0
  369. package/src/lib/components/ui/toggle.tsx +45 -0
  370. package/src/lib/components/ui/tooltip.tsx +3 -3
  371. package/src/lib/framework/alert/alert-extensions.tsx +2 -3
  372. package/src/lib/framework/alert/alert-item.tsx +5 -3
  373. package/src/lib/framework/component-registry/component-registry.tsx +33 -47
  374. package/src/lib/framework/component-registry/dynamic-component.tsx +3 -3
  375. package/src/lib/framework/dashboard-widget/base-widget.tsx +5 -13
  376. package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +8 -8
  377. package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +1 -1
  378. package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +7 -8
  379. package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +1 -1
  380. package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +7 -8
  381. package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +1 -1
  382. package/src/lib/framework/dashboard-widget/widget-extensions.tsx +1 -1
  383. package/src/lib/framework/data-table/data-table-extensions.ts +35 -0
  384. package/src/lib/framework/defaults.ts +5 -11
  385. package/src/lib/framework/document-extension/extend-detail-form-query.ts +50 -0
  386. package/src/lib/framework/document-extension/extend-document.spec.ts +884 -0
  387. package/src/lib/framework/document-extension/extend-document.ts +159 -0
  388. package/src/lib/framework/document-introspection/add-custom-fields.ts +50 -2
  389. package/src/lib/framework/document-introspection/get-document-structure.spec.ts +321 -2
  390. package/src/lib/framework/document-introspection/get-document-structure.ts +187 -36
  391. package/src/lib/framework/document-introspection/hooks.ts +4 -1
  392. package/src/lib/framework/extension-api/define-dashboard-extension.ts +35 -49
  393. package/src/lib/framework/extension-api/display-component-extensions.tsx +69 -0
  394. package/src/lib/framework/extension-api/extension-api-types.ts +34 -98
  395. package/src/lib/framework/extension-api/input-component-extensions.tsx +73 -0
  396. package/src/lib/framework/extension-api/logic/alerts.ts +10 -0
  397. package/src/lib/framework/extension-api/logic/data-table.ts +60 -0
  398. package/src/lib/framework/extension-api/logic/detail-forms.ts +48 -0
  399. package/src/lib/framework/extension-api/logic/form-components.ts +13 -0
  400. package/src/lib/framework/extension-api/logic/index.ts +9 -0
  401. package/src/lib/framework/extension-api/logic/layout.ts +22 -0
  402. package/src/lib/framework/extension-api/logic/login.ts +17 -0
  403. package/src/lib/framework/extension-api/logic/navigation.ts +38 -0
  404. package/src/lib/framework/extension-api/logic/widgets.ts +10 -0
  405. package/src/lib/framework/extension-api/types/alerts.ts +54 -0
  406. package/src/lib/framework/extension-api/types/data-table.ts +96 -0
  407. package/src/lib/framework/extension-api/types/detail-forms.ts +94 -0
  408. package/src/lib/framework/extension-api/types/form-components.ts +43 -0
  409. package/src/lib/framework/extension-api/types/index.ts +9 -0
  410. package/src/lib/framework/extension-api/types/layout.ts +90 -0
  411. package/src/lib/framework/extension-api/types/login.ts +96 -0
  412. package/src/lib/framework/extension-api/types/navigation.ts +76 -0
  413. package/src/lib/framework/extension-api/types/widgets.ts +93 -0
  414. package/src/lib/framework/extension-api/use-dashboard-extensions.ts +2 -1
  415. package/src/lib/framework/extension-api/use-login-extensions.ts +26 -0
  416. package/src/lib/framework/form-engine/custom-form-component-extensions.ts +38 -0
  417. package/src/lib/framework/form-engine/custom-form-component.tsx +33 -0
  418. package/src/lib/framework/form-engine/form-schema-tools.spec.ts +472 -0
  419. package/src/lib/framework/form-engine/form-schema-tools.ts +341 -6
  420. package/src/lib/framework/form-engine/overridden-form-component.tsx +51 -0
  421. package/src/lib/framework/form-engine/use-generated-form.tsx +82 -24
  422. package/src/lib/framework/form-engine/utils.spec.ts +37 -0
  423. package/src/lib/framework/form-engine/utils.ts +99 -0
  424. package/src/lib/framework/layout-engine/dev-mode-button.tsx +24 -0
  425. package/src/lib/framework/layout-engine/layout-extensions.ts +1 -4
  426. package/src/lib/framework/layout-engine/location-wrapper.tsx +98 -72
  427. package/src/lib/framework/layout-engine/page-block-provider.tsx +6 -0
  428. package/src/lib/framework/layout-engine/page-layout.tsx +135 -58
  429. package/src/lib/framework/page/detail-page-route-loader.tsx +26 -7
  430. package/src/lib/framework/page/detail-page.tsx +94 -37
  431. package/src/lib/framework/page/list-page.tsx +18 -11
  432. package/src/lib/framework/page/use-detail-page.ts +47 -13
  433. package/src/lib/framework/page/use-extended-router.tsx +4 -5
  434. package/src/lib/framework/registry/global-registry.ts +4 -0
  435. package/src/lib/framework/registry/registry-types.ts +17 -5
  436. package/src/lib/graphql/api.ts +25 -3
  437. package/src/lib/graphql/common-operations.ts +18 -0
  438. package/src/lib/graphql/{fragments.tsx → fragments.ts} +1 -2
  439. package/src/lib/graphql/graphql-env.d.ts +27 -24
  440. package/src/lib/graphql/settings-store-operations.ts +17 -0
  441. package/src/lib/hooks/use-auth.tsx +1 -1
  442. package/src/lib/hooks/use-channel.ts +1 -1
  443. package/src/lib/hooks/use-extended-detail-query.ts +37 -0
  444. package/src/lib/hooks/use-extended-list-query.ts +75 -0
  445. package/src/lib/hooks/use-floating-bulk-actions.ts +82 -0
  446. package/src/lib/hooks/use-grouped-permissions.ts +3 -2
  447. package/src/lib/hooks/use-local-format.ts +20 -5
  448. package/src/lib/hooks/use-page-block.tsx +18 -0
  449. package/src/lib/hooks/use-page.tsx +2 -2
  450. package/src/lib/hooks/use-permissions.ts +3 -2
  451. package/src/lib/hooks/use-server-config.ts +1 -1
  452. package/src/lib/hooks/use-theme.ts +1 -1
  453. package/src/lib/hooks/use-user-settings.tsx +1 -1
  454. package/src/lib/index.ts +85 -7
  455. package/src/lib/lib/trans.tsx +3 -3
  456. package/src/lib/lib/utils.ts +52 -1
  457. package/src/lib/providers/auth.tsx +37 -14
  458. package/src/lib/providers/channel-provider.tsx +17 -15
  459. package/src/lib/providers/server-config.tsx +13 -11
  460. package/src/lib/providers/theme-provider.tsx +2 -3
  461. package/src/lib/providers/user-settings.tsx +78 -3
  462. package/src/lib/virtual.d.ts +26 -2
  463. package/src/vite-env.d.ts +2 -0
  464. package/vite/tests/barrel-exports.spec.ts +30 -0
  465. package/vite/tests/fixtures-barrel-exports/my-plugin/index.ts +1 -0
  466. package/vite/tests/fixtures-barrel-exports/my-plugin/src/my.plugin.ts +8 -0
  467. package/vite/tests/fixtures-barrel-exports/package.json +6 -0
  468. package/vite/tests/fixtures-barrel-exports/vendure-config.ts +19 -0
  469. package/vite/tests/fixtures-npm-plugin/fake_node_modules/test-plugin/index.js +20 -0
  470. package/vite/tests/fixtures-npm-plugin/fake_node_modules/test-plugin/package.json +8 -0
  471. package/vite/tests/fixtures-npm-plugin/package.json +6 -0
  472. package/vite/tests/fixtures-npm-plugin/vendure-config.ts +18 -0
  473. package/vite/tests/fixtures-path-alias/js-aliased/index.ts +1 -0
  474. package/vite/tests/fixtures-path-alias/js-aliased/src/js-aliased.plugin.ts +8 -0
  475. package/vite/tests/fixtures-path-alias/package.json +6 -0
  476. package/vite/tests/fixtures-path-alias/star-aliased/index.ts +1 -0
  477. package/vite/tests/fixtures-path-alias/star-aliased/src/star-aliased.plugin.ts +8 -0
  478. package/vite/tests/fixtures-path-alias/ts-aliased/index.ts +1 -0
  479. package/vite/tests/fixtures-path-alias/ts-aliased/src/ts-aliased.plugin.ts +8 -0
  480. package/vite/tests/fixtures-path-alias/vendure-config.ts +20 -0
  481. package/vite/tests/npm-plugin.spec.ts +46 -0
  482. package/vite/tests/path-alias.spec.ts +61 -0
  483. package/vite/tests/tsconfig.json +21 -0
  484. package/vite/types.ts +44 -0
  485. package/vite/utils/ast-utils.spec.ts +1 -80
  486. package/vite/utils/ast-utils.ts +0 -86
  487. package/vite/utils/compiler.ts +244 -0
  488. package/vite/utils/config-loader.ts +0 -445
  489. package/vite/utils/logger.ts +43 -0
  490. package/vite/utils/plugin-discovery.ts +494 -0
  491. package/vite/utils/tsconfig-utils.ts +79 -0
  492. package/vite/utils/ui-config.ts +30 -42
  493. package/vite/vite-plugin-config-loader.ts +25 -17
  494. package/vite/vite-plugin-config.ts +6 -7
  495. package/vite/vite-plugin-dashboard-metadata.ts +27 -16
  496. package/vite/vite-plugin-tailwind-source.ts +81 -0
  497. package/vite/vite-plugin-theme.ts +69 -69
  498. package/vite/vite-plugin-ui-config.ts +119 -17
  499. package/vite/vite-plugin-vendure-dashboard.ts +60 -16
  500. package/dist/plugin/utils/ast-utils.js +0 -96
  501. package/dist/plugin/utils/ast-utils.spec.js +0 -120
  502. package/dist/plugin/utils/config-loader.d.ts +0 -52
  503. package/dist/plugin/utils/config-loader.js +0 -343
  504. package/dist/plugin/utils/ui-config.d.ts +0 -3
  505. package/dist/plugin/utils/ui-config.js +0 -34
  506. package/dist/plugin/vite-plugin-theme.js +0 -130
  507. package/dist/plugin/vite-plugin-ui-config.d.ts +0 -15
  508. package/dist/plugin/vite-plugin-vendure-dashboard.d.ts +0 -44
  509. package/src/lib/components/shared/rich-text-editor.tsx +0 -0
  510. package/src/lib/framework/alert/types.ts +0 -13
  511. package/src/lib/framework/dashboard-widget/types.ts +0 -22
  512. /package/dist/{plugin/utils/ast-utils.spec.d.ts → vite/types.js} +0 -0
  513. /package/dist/{plugin → vite}/utils/schema-generator.d.ts +0 -0
  514. /package/dist/{plugin → vite}/utils/schema-generator.js +0 -0
  515. /package/dist/{plugin → vite}/vite-plugin-admin-api-schema.d.ts +0 -0
  516. /package/dist/{plugin → vite}/vite-plugin-admin-api-schema.js +0 -0
  517. /package/dist/{plugin → vite}/vite-plugin-config.d.ts +0 -0
  518. /package/dist/{plugin → vite}/vite-plugin-gql-tada.d.ts +0 -0
  519. /package/dist/{plugin → vite}/vite-plugin-gql-tada.js +0 -0
  520. /package/dist/{plugin → vite}/vite-plugin-theme.d.ts +0 -0
  521. /package/dist/{plugin → vite}/vite-plugin-transform-index.d.ts +0 -0
  522. /package/dist/{plugin → vite}/vite-plugin-transform-index.js +0 -0
  523. /package/src/lib/components/data-table/{data-table-types.ts → types.ts} +0 -0
@@ -0,0 +1,387 @@
1
+ import { parse } from 'acorn';
2
+ import { simple as walkSimple } from 'acorn-walk';
3
+ import glob from 'fast-glob';
4
+ import fs from 'fs-extra';
5
+ import { open } from 'fs/promises';
6
+ import path from 'path';
7
+ import * as ts from 'typescript';
8
+ import { fileURLToPath } from 'url';
9
+ import { findTsConfigPaths } from './tsconfig-utils.js';
10
+ export async function discoverPlugins({ vendureConfigPath, transformTsConfigPathMappings, logger, outputPath, pluginPackageScanner, }) {
11
+ var _a;
12
+ const plugins = [];
13
+ // Analyze source files to find local plugins and package imports
14
+ const { localPluginLocations, packageImports } = await analyzeSourceFiles(vendureConfigPath, (_a = pluginPackageScanner === null || pluginPackageScanner === void 0 ? void 0 : pluginPackageScanner.nodeModulesRoot) !== null && _a !== void 0 ? _a : guessNodeModulesRoot(vendureConfigPath, logger), logger, transformTsConfigPathMappings);
15
+ logger.debug(`[discoverPlugins] Found ${localPluginLocations.size} local plugins: ${JSON.stringify([...localPluginLocations.entries()], null, 2)}`);
16
+ logger.debug(`[discoverPlugins] Found ${packageImports.length} package imports: ${JSON.stringify(packageImports, null, 2)}`);
17
+ const filePaths = await findVendurePluginFiles({
18
+ logger,
19
+ nodeModulesRoot: pluginPackageScanner === null || pluginPackageScanner === void 0 ? void 0 : pluginPackageScanner.nodeModulesRoot,
20
+ packageGlobs: packageImports.map(pkg => pkg + '/**/*.js'),
21
+ outputPath,
22
+ vendureConfigPath,
23
+ });
24
+ for (const filePath of filePaths) {
25
+ const content = await fs.readFile(filePath, 'utf-8');
26
+ logger.debug(`[discoverPlugins] Checking file ${filePath}`);
27
+ // First check if this file imports from @vendure/core
28
+ if (!content.includes('@vendure/core')) {
29
+ continue;
30
+ }
31
+ try {
32
+ const ast = parse(content, {
33
+ ecmaVersion: 'latest',
34
+ sourceType: 'module',
35
+ });
36
+ let hasVendurePlugin = false;
37
+ let pluginName;
38
+ let dashboardPath;
39
+ // Walk the AST to find the plugin class and its decorator
40
+ walkSimple(ast, {
41
+ CallExpression(node) {
42
+ // Look for __decorate calls
43
+ const calleeName = node.callee.name;
44
+ const nodeArgs = node.arguments;
45
+ const isDecoratorWithArgs = calleeName === '__decorate' && nodeArgs.length >= 2;
46
+ if (isDecoratorWithArgs) {
47
+ // Check the decorators array (first argument)
48
+ const decorators = nodeArgs[0];
49
+ if (decorators.type === 'ArrayExpression') {
50
+ for (const decorator of decorators.elements) {
51
+ const props = getDecoratorObjectProps(decorator);
52
+ for (const prop of props) {
53
+ const isDashboardProd = prop.key.name === 'dashboard' && prop.value.type === 'Literal';
54
+ if (isDashboardProd) {
55
+ dashboardPath = prop.value.value;
56
+ hasVendurePlugin = true;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ // Get the plugin class name (second argument)
62
+ const targetClass = nodeArgs[1];
63
+ if (targetClass.type === 'Identifier') {
64
+ pluginName = targetClass.name;
65
+ }
66
+ }
67
+ },
68
+ });
69
+ if (hasVendurePlugin && pluginName && dashboardPath) {
70
+ logger.debug(`[discoverPlugins] Found plugin "${pluginName}" in file: ${filePath}`);
71
+ // Keep the dashboard path relative to the plugin file
72
+ const resolvedDashboardPath = dashboardPath.startsWith('.')
73
+ ? dashboardPath // Keep the relative path as-is
74
+ : './' + path.relative(path.dirname(filePath), dashboardPath); // Make absolute path relative
75
+ // Check if this is a local plugin we found earlier
76
+ const sourcePluginPath = localPluginLocations.get(pluginName);
77
+ plugins.push(Object.assign({ name: pluginName, pluginPath: filePath, dashboardEntryPath: resolvedDashboardPath }, (sourcePluginPath && { sourcePluginPath })));
78
+ }
79
+ }
80
+ catch (e) {
81
+ logger.error(`Failed to parse ${filePath}: ${e instanceof Error ? e.message : String(e)}`);
82
+ }
83
+ }
84
+ return plugins;
85
+ }
86
+ function getDecoratorObjectProps(decorator) {
87
+ var _a;
88
+ if (decorator.type === 'CallExpression' &&
89
+ decorator.arguments.length === 1 &&
90
+ decorator.arguments[0].type === 'ObjectExpression') {
91
+ // Look for the dashboard property in the decorator config
92
+ return (_a = decorator.arguments[0].properties) !== null && _a !== void 0 ? _a : [];
93
+ }
94
+ return [];
95
+ }
96
+ async function isSymlinkedLocalPackage(packageName, nodeModulesRoot) {
97
+ try {
98
+ const packagePath = path.join(nodeModulesRoot, packageName);
99
+ const stats = await fs.lstat(packagePath);
100
+ if (stats.isSymbolicLink()) {
101
+ // Get the real path that the symlink points to
102
+ const realPath = await fs.realpath(packagePath);
103
+ // If the real path is within the project directory (i.e. not in some other node_modules),
104
+ // then it's a local package
105
+ if (!realPath.includes('node_modules')) {
106
+ return realPath;
107
+ }
108
+ }
109
+ }
110
+ catch (e) {
111
+ // Package doesn't exist or other error - not a local package
112
+ return undefined;
113
+ }
114
+ return undefined;
115
+ }
116
+ /**
117
+ * Analyzes TypeScript source files starting from the config file to discover:
118
+ * 1. Local Vendure plugins
119
+ * 2. All non-local package imports that could contain plugins
120
+ */
121
+ export async function analyzeSourceFiles(vendureConfigPath, nodeModulesRoot, logger, transformTsConfigPathMappings) {
122
+ const localPluginLocations = new Map();
123
+ const visitedFiles = new Set();
124
+ const packageImportsSet = new Set();
125
+ // Get tsconfig paths for resolving aliases
126
+ const tsConfigInfo = await findTsConfigPaths(vendureConfigPath, logger, 'compiling', transformTsConfigPathMappings);
127
+ async function processFile(filePath) {
128
+ if (visitedFiles.has(filePath)) {
129
+ return;
130
+ }
131
+ visitedFiles.add(filePath);
132
+ try {
133
+ // First check if this is a directory
134
+ const stat = await fs.stat(filePath);
135
+ if (stat.isDirectory()) {
136
+ // If it's a directory, try to find the plugin file
137
+ const indexFilePath = path.join(filePath, 'index.ts');
138
+ if (await fs.pathExists(indexFilePath)) {
139
+ await processFile(indexFilePath);
140
+ }
141
+ return;
142
+ }
143
+ const content = await fs.readFile(filePath, 'utf-8');
144
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
145
+ // Track imports to follow
146
+ const importsToFollow = [];
147
+ async function visit(node) {
148
+ // Look for VendurePlugin decorator
149
+ const vendurePluginClassName = getVendurePluginClassName(node);
150
+ if (vendurePluginClassName) {
151
+ localPluginLocations.set(vendurePluginClassName, filePath);
152
+ logger.debug(`Found plugin "${vendurePluginClassName}" at ${filePath}`);
153
+ }
154
+ // Handle both imports and exports
155
+ const isImportOrExport = ts.isImportDeclaration(node) || ts.isExportDeclaration(node);
156
+ if (isImportOrExport) {
157
+ const moduleSpecifier = node.moduleSpecifier;
158
+ if (moduleSpecifier && ts.isStringLiteral(moduleSpecifier)) {
159
+ const importPath = moduleSpecifier.text;
160
+ // Track non-local imports (packages)
161
+ const npmPackageName = getNpmPackageNameFromImport(importPath);
162
+ if (npmPackageName) {
163
+ // Check if this is actually a symlinked local package
164
+ const localPackagePath = await isSymlinkedLocalPackage(npmPackageName, nodeModulesRoot);
165
+ if (localPackagePath) {
166
+ // If it is local, follow it like a local import
167
+ importsToFollow.push(localPackagePath);
168
+ logger.debug(`Found symlinked local package "${npmPackageName}" at ${localPackagePath}`);
169
+ }
170
+ else {
171
+ packageImportsSet.add(npmPackageName);
172
+ }
173
+ }
174
+ // Handle path aliases and local imports
175
+ const pathAliasImports = getPotentialPathAliasImportPaths(importPath, tsConfigInfo);
176
+ if (pathAliasImports.length) {
177
+ importsToFollow.push(...pathAliasImports);
178
+ }
179
+ // Also handle local imports
180
+ if (importPath.startsWith('.')) {
181
+ const resolvedPath = path.resolve(path.dirname(filePath), importPath);
182
+ importsToFollow.push(resolvedPath);
183
+ }
184
+ }
185
+ }
186
+ // Visit children
187
+ const promises = [];
188
+ ts.forEachChild(node, child => {
189
+ promises.push(visit(child));
190
+ });
191
+ await Promise.all(promises);
192
+ }
193
+ await visit(sourceFile);
194
+ // Follow imports
195
+ for (const importPath of importsToFollow) {
196
+ // Try all possible file paths
197
+ const possiblePaths = [
198
+ importPath + '.ts',
199
+ importPath + '.js',
200
+ path.join(importPath, 'index.ts'),
201
+ path.join(importPath, 'index.js'),
202
+ importPath,
203
+ ];
204
+ if (importPath.endsWith('.js')) {
205
+ possiblePaths.push(importPath.replace(/.js$/, '.ts'));
206
+ }
207
+ // Try each possible path
208
+ let found = false;
209
+ for (const possiblePath of possiblePaths) {
210
+ const possiblePathExists = await fs.pathExists(possiblePath);
211
+ if (possiblePathExists) {
212
+ await processFile(possiblePath);
213
+ found = true;
214
+ break;
215
+ }
216
+ }
217
+ // If none of the file paths worked, try the raw import path
218
+ // (it might be a directory)
219
+ const tryRawPath = !found && (await fs.pathExists(importPath));
220
+ if (tryRawPath) {
221
+ await processFile(importPath);
222
+ }
223
+ }
224
+ }
225
+ catch (e) {
226
+ const message = e instanceof Error ? e.message : String(e);
227
+ logger.error(`Failed to process ${filePath}: ${message}`);
228
+ }
229
+ }
230
+ await processFile(vendureConfigPath);
231
+ return {
232
+ localPluginLocations,
233
+ packageImports: Array.from(packageImportsSet),
234
+ };
235
+ }
236
+ /**
237
+ * If this is a class declaration that is decorated with the `VendurePlugin` decorator,
238
+ * we want to return that class name, as we have found a local Vendure plugin.
239
+ */
240
+ function getVendurePluginClassName(node) {
241
+ var _a;
242
+ if (ts.isClassDeclaration(node)) {
243
+ const decorators = ts.canHaveDecorators(node) ? ts.getDecorators(node) : undefined;
244
+ if (decorators === null || decorators === void 0 ? void 0 : decorators.length) {
245
+ for (const decorator of decorators) {
246
+ const decoratorName = getDecoratorName(decorator);
247
+ if (decoratorName === 'VendurePlugin') {
248
+ const className = (_a = node.name) === null || _a === void 0 ? void 0 : _a.text;
249
+ if (className) {
250
+ return className;
251
+ }
252
+ }
253
+ }
254
+ }
255
+ }
256
+ }
257
+ function getNpmPackageNameFromImport(importPath) {
258
+ if (!importPath.startsWith('.') && !importPath.startsWith('/')) {
259
+ // Get the root package name (e.g. '@scope/package/subpath' -> '@scope/package')
260
+ const packageName = importPath.startsWith('@')
261
+ ? importPath.split('/').slice(0, 2).join('/')
262
+ : importPath.split('/')[0];
263
+ return packageName;
264
+ }
265
+ }
266
+ function getPotentialPathAliasImportPaths(importPath, tsConfigInfo) {
267
+ const importsToFollow = [];
268
+ if (!tsConfigInfo) {
269
+ return importsToFollow;
270
+ }
271
+ for (const [alias, patterns] of Object.entries(tsConfigInfo.paths)) {
272
+ const aliasPattern = alias.replace(/\*$/, '');
273
+ if (importPath.startsWith(aliasPattern)) {
274
+ const relativePart = importPath.slice(aliasPattern.length);
275
+ // Try each pattern
276
+ for (const pattern of patterns) {
277
+ const resolvedPattern = pattern.replace(/\*$/, '');
278
+ const resolvedPath = path.resolve(tsConfigInfo.baseUrl, resolvedPattern, relativePart);
279
+ importsToFollow.push(resolvedPath);
280
+ }
281
+ }
282
+ }
283
+ return importsToFollow;
284
+ }
285
+ function getDecoratorName(decorator) {
286
+ if (ts.isCallExpression(decorator.expression)) {
287
+ const expression = decorator.expression.expression;
288
+ // Handle both direct usage and imported usage
289
+ if (ts.isIdentifier(expression)) {
290
+ return expression.text;
291
+ }
292
+ // Handle property access like `Decorators.VendurePlugin`
293
+ if (ts.isPropertyAccessExpression(expression)) {
294
+ return expression.name.text;
295
+ }
296
+ }
297
+ return undefined;
298
+ }
299
+ export async function findVendurePluginFiles({ outputPath, vendureConfigPath, logger, nodeModulesRoot: providedNodeModulesRoot, packageGlobs, }) {
300
+ let nodeModulesRoot = providedNodeModulesRoot;
301
+ const readStart = Date.now();
302
+ if (!nodeModulesRoot) {
303
+ nodeModulesRoot = guessNodeModulesRoot(vendureConfigPath, logger);
304
+ }
305
+ const patterns = [
306
+ // Local compiled plugins in temp dir
307
+ path.join(outputPath, '**/*.js'),
308
+ // Node modules patterns
309
+ ...packageGlobs.map(pattern => path.join(nodeModulesRoot, pattern)),
310
+ ].map(p => p.replace(/\\/g, '/'));
311
+ logger.debug(`Finding Vendure plugins using patterns: ${patterns.join('\n')}`);
312
+ const globStart = Date.now();
313
+ const files = await glob(patterns, {
314
+ ignore: [
315
+ // Standard test & doc files
316
+ '**/node_modules/**/node_modules/**',
317
+ '**/*.spec.js',
318
+ '**/*.test.js',
319
+ ],
320
+ onlyFiles: true,
321
+ absolute: true,
322
+ followSymbolicLinks: false,
323
+ stats: false,
324
+ });
325
+ logger.debug(`Glob found ${files.length} files in ${Date.now() - globStart}ms`);
326
+ // Read files in larger parallel batches
327
+ const batchSize = 100; // Increased batch size
328
+ const potentialPluginFiles = [];
329
+ for (let i = 0; i < files.length; i += batchSize) {
330
+ const batch = files.slice(i, i + batchSize);
331
+ const results = await Promise.all(batch.map(async (file) => {
332
+ try {
333
+ // Try reading just first 3000 bytes first - most imports are at the top
334
+ const fileHandle = await open(file, 'r');
335
+ try {
336
+ const buffer = Buffer.alloc(3000);
337
+ const { bytesRead } = await fileHandle.read(buffer, 0, 3000, 0);
338
+ let content = buffer.toString('utf8', 0, bytesRead);
339
+ // Quick check for common indicators
340
+ if (content.includes('@vendure/core')) {
341
+ return file;
342
+ }
343
+ // If we find a promising indicator but no definitive match,
344
+ // read more of the file
345
+ if (content.includes('@vendure') || content.includes('VendurePlugin')) {
346
+ const largerBuffer = Buffer.alloc(5000);
347
+ const { bytesRead: moreBytes } = await fileHandle.read(largerBuffer, 0, 5000, 0);
348
+ content = largerBuffer.toString('utf8', 0, moreBytes);
349
+ if (content.includes('@vendure/core')) {
350
+ return file;
351
+ }
352
+ }
353
+ }
354
+ finally {
355
+ await fileHandle.close();
356
+ }
357
+ }
358
+ catch (e) {
359
+ logger.warn(`Failed to read file ${file}: ${e instanceof Error ? e.message : String(e)}`);
360
+ }
361
+ return null;
362
+ }));
363
+ const validResults = results.filter((f) => f !== null);
364
+ potentialPluginFiles.push(...validResults);
365
+ }
366
+ logger.info(`Found ${potentialPluginFiles.length} potential plugin files in ${Date.now() - readStart}ms ` +
367
+ `(scanned ${files.length} files)`);
368
+ return potentialPluginFiles;
369
+ }
370
+ function guessNodeModulesRoot(vendureConfigPath, logger) {
371
+ let nodeModulesRoot;
372
+ // If the node_modules root path has not been explicitly
373
+ // specified, we will try to guess it by resolving the
374
+ // `@vendure/core` package.
375
+ try {
376
+ const coreUrl = import.meta.resolve('@vendure/core');
377
+ logger.debug(`Found core URL: ${coreUrl}`);
378
+ const corePath = fileURLToPath(coreUrl);
379
+ logger.debug(`Found core path: ${corePath}`);
380
+ nodeModulesRoot = path.join(path.dirname(corePath), '..', '..', '..');
381
+ }
382
+ catch (e) {
383
+ logger.warn(`Failed to resolve @vendure/core: ${e instanceof Error ? e.message : String(e)}`);
384
+ nodeModulesRoot = path.dirname(vendureConfigPath);
385
+ }
386
+ return nodeModulesRoot;
387
+ }
@@ -0,0 +1,9 @@
1
+ import { Logger, TransformTsConfigPathMappingsFn } from '../types.js';
2
+ export interface TsConfigPathsConfig {
3
+ baseUrl: string;
4
+ paths: Record<string, string[]>;
5
+ }
6
+ /**
7
+ * Finds and parses tsconfig files in the given directory and its parent directories.
8
+ */
9
+ export declare function findTsConfigPaths(configPath: string, logger: Logger, phase: 'compiling' | 'loading', transformTsConfigPathMappings: TransformTsConfigPathMappingsFn): Promise<TsConfigPathsConfig | undefined>;
@@ -0,0 +1,50 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ /**
4
+ * Finds and parses tsconfig files in the given directory and its parent directories.
5
+ */
6
+ export async function findTsConfigPaths(configPath, logger, phase, transformTsConfigPathMappings) {
7
+ let currentDir = path.dirname(configPath);
8
+ while (currentDir !== path.parse(currentDir).root) {
9
+ try {
10
+ const files = await fs.readdir(currentDir);
11
+ const tsConfigFiles = files.filter(file => /^tsconfig(\..*)?\.json$/.test(file));
12
+ for (const fileName of tsConfigFiles) {
13
+ const tsConfigFilePath = path.join(currentDir, fileName);
14
+ try {
15
+ const { paths, baseUrl } = await getCompilerOptionsFromFile(tsConfigFilePath);
16
+ if (paths) {
17
+ const tsConfigBaseUrl = path.resolve(currentDir, baseUrl || '.');
18
+ const pathMappings = getTransformedPathMappings(paths, phase, transformTsConfigPathMappings);
19
+ return { baseUrl: tsConfigBaseUrl, paths: pathMappings };
20
+ }
21
+ }
22
+ catch (e) {
23
+ logger.warn(`Could not read or parse tsconfig file ${tsConfigFilePath}: ${e instanceof Error ? e.message : String(e)}`);
24
+ }
25
+ }
26
+ }
27
+ catch (e) {
28
+ logger.warn(`Could not read directory ${currentDir}: ${e instanceof Error ? e.message : String(e)}`);
29
+ }
30
+ currentDir = path.dirname(currentDir);
31
+ }
32
+ return undefined;
33
+ }
34
+ async function getCompilerOptionsFromFile(tsConfigFilePath) {
35
+ const tsConfigContent = await fs.readFile(tsConfigFilePath, 'utf-8');
36
+ const tsConfig = JSON.parse(tsConfigContent);
37
+ return tsConfig.compilerOptions || {};
38
+ }
39
+ function getTransformedPathMappings(paths, phase, transformTsConfigPathMappings) {
40
+ const pathMappings = {};
41
+ for (const [alias, patterns] of Object.entries(paths)) {
42
+ const normalizedPatterns = patterns.map(pattern => pattern.replace(/\\/g, '/'));
43
+ pathMappings[alias] = transformTsConfigPathMappings({
44
+ phase,
45
+ alias,
46
+ patterns: normalizedPatterns,
47
+ });
48
+ }
49
+ return pathMappings;
50
+ }
@@ -0,0 +1,3 @@
1
+ import { VendureConfig } from '@vendure/core';
2
+ import { ResolvedUiConfig, UiConfigPluginOptions } from '../vite-plugin-ui-config.js';
3
+ export declare function getUiConfig(config: VendureConfig, pluginOptions: UiConfigPluginOptions): ResolvedUiConfig;
@@ -0,0 +1,30 @@
1
+ import { ADMIN_API_PATH, DEFAULT_AUTH_TOKEN_HEADER_KEY, DEFAULT_CHANNEL_TOKEN_KEY, } from '@vendure/common/lib/shared-constants';
2
+ import { defaultAvailableLanguages, defaultAvailableLocales, defaultLanguage, defaultLocale, } from '../constants.js';
3
+ export function getUiConfig(config, pluginOptions) {
4
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
5
+ const { authOptions, apiOptions } = config;
6
+ // Merge API configuration with defaults
7
+ const api = {
8
+ adminApiPath: (_c = (_b = (_a = pluginOptions.api) === null || _a === void 0 ? void 0 : _a.adminApiPath) !== null && _b !== void 0 ? _b : apiOptions.adminApiPath) !== null && _c !== void 0 ? _c : ADMIN_API_PATH,
9
+ host: (_e = (_d = pluginOptions.api) === null || _d === void 0 ? void 0 : _d.host) !== null && _e !== void 0 ? _e : 'auto',
10
+ port: (_g = (_f = pluginOptions.api) === null || _f === void 0 ? void 0 : _f.port) !== null && _g !== void 0 ? _g : 'auto',
11
+ tokenMethod: (_j = (_h = pluginOptions.api) === null || _h === void 0 ? void 0 : _h.tokenMethod) !== null && _j !== void 0 ? _j : (authOptions.tokenMethod === 'bearer' ? 'bearer' : 'cookie'),
12
+ authTokenHeaderKey: (_m = (_l = (_k = pluginOptions.api) === null || _k === void 0 ? void 0 : _k.authTokenHeaderKey) !== null && _l !== void 0 ? _l : authOptions.authTokenHeaderKey) !== null && _m !== void 0 ? _m : DEFAULT_AUTH_TOKEN_HEADER_KEY,
13
+ channelTokenKey: (_q = (_p = (_o = pluginOptions.api) === null || _o === void 0 ? void 0 : _o.channelTokenKey) !== null && _p !== void 0 ? _p : apiOptions.channelTokenKey) !== null && _q !== void 0 ? _q : DEFAULT_CHANNEL_TOKEN_KEY,
14
+ };
15
+ // Merge i18n configuration with defaults
16
+ const i18n = {
17
+ defaultLanguage: (_s = (_r = pluginOptions.i18n) === null || _r === void 0 ? void 0 : _r.defaultLanguage) !== null && _s !== void 0 ? _s : defaultLanguage,
18
+ defaultLocale: (_u = (_t = pluginOptions.i18n) === null || _t === void 0 ? void 0 : _t.defaultLocale) !== null && _u !== void 0 ? _u : defaultLocale,
19
+ availableLanguages: ((_v = pluginOptions.i18n) === null || _v === void 0 ? void 0 : _v.availableLanguages) && pluginOptions.i18n.availableLanguages.length > 0
20
+ ? pluginOptions.i18n.availableLanguages
21
+ : defaultAvailableLanguages,
22
+ availableLocales: ((_w = pluginOptions.i18n) === null || _w === void 0 ? void 0 : _w.availableLocales) && pluginOptions.i18n.availableLocales.length > 0
23
+ ? pluginOptions.i18n.availableLocales
24
+ : defaultAvailableLocales,
25
+ };
26
+ return {
27
+ api,
28
+ i18n,
29
+ };
30
+ }
@@ -1,14 +1,14 @@
1
1
  import { Plugin } from 'vite';
2
- import { ConfigLoaderOptions, LoadVendureConfigResult } from './utils/config-loader.js';
2
+ import { CompileResult, CompilerOptions } from './utils/compiler.js';
3
3
  export interface ConfigLoaderApi {
4
- getVendureConfig(): Promise<LoadVendureConfigResult>;
4
+ getVendureConfig(): Promise<CompileResult>;
5
5
  }
6
6
  export declare const configLoaderName = "vendure:config-loader";
7
7
  /**
8
8
  * This Vite plugin loads the VendureConfig from the specified file path, and
9
9
  * makes it available to other plugins via the `ConfigLoaderApi`.
10
10
  */
11
- export declare function configLoaderPlugin(options: ConfigLoaderOptions): Plugin;
11
+ export declare function configLoaderPlugin(options: CompilerOptions): Plugin;
12
12
  /**
13
13
  * Inter-plugin dependencies implemented following the pattern given here:
14
14
  * https://rollupjs.org/plugin-development/#direct-plugin-communication
@@ -1,4 +1,5 @@
1
- import { loadVendureConfig } from './utils/config-loader.js';
1
+ import { compile } from './utils/compiler.js';
2
+ import { debugLogger } from './utils/logger.js';
2
3
  export const configLoaderName = 'vendure:config-loader';
3
4
  /**
4
5
  * This Vite plugin loads the VendureConfig from the specified file path, and
@@ -13,25 +14,29 @@ export function configLoaderPlugin(options) {
13
14
  this.info(`Loading Vendure config. This can take a short while depending on the size of your project...`);
14
15
  try {
15
16
  const startTime = Date.now();
16
- result = await loadVendureConfig({
17
- tempDir: options.tempDir,
18
- vendureConfigPath: options.vendureConfigPath,
19
- vendureConfigExport: options.vendureConfigExport,
20
- logger: {
21
- info: (message) => this.info(message),
22
- warn: (message) => this.warn(message),
23
- debug: (message) => this.debug(message),
24
- },
25
- });
17
+ result = await compile(Object.assign(Object.assign({}, options), { logger: process.env.LOG
18
+ ? debugLogger
19
+ : {
20
+ info: (message) => this.info(message),
21
+ warn: (message) => this.warn(message),
22
+ debug: (message) => this.debug(message),
23
+ error: (message) => this.error(message),
24
+ } }));
26
25
  const endTime = Date.now();
27
26
  const duration = endTime - startTime;
28
- const pluginNames = result.pluginInfo.map(p => p.name).join(', ');
27
+ const pluginNames = result.pluginInfo
28
+ .map(p => `${p.name} ${p.sourcePluginPath ? '(local)' : '(npm)'}`)
29
+ .join(', ');
29
30
  this.info(`Found ${result.pluginInfo.length} plugins: ${pluginNames}`);
30
31
  this.info(`Vendure config loaded (using export "${result.exportedSymbolName}") in ${duration}ms`);
31
32
  }
32
33
  catch (e) {
33
34
  if (e instanceof Error) {
34
- this.error(`Error loading Vendure config: ${e.message}`);
35
+ const message = [
36
+ e.message,
37
+ `If you are using a monorepo, you may need to provide a custom pathAdapter to resolve the paths correctly.`,
38
+ ].join('\n');
39
+ this.error(`Error loading Vendure config: ${message}`);
35
40
  }
36
41
  }
37
42
  onConfigLoaded.forEach(fn => fn());
@@ -7,7 +7,7 @@ export function viteConfigPlugin({ packageRoot }) {
7
7
  // Only set the vite `root` to the dashboard package when running the dev server.
8
8
  // During a production build we still need to reference the dashboard source which
9
9
  // lives in `node_modules`, but we don't want the build output to be emitted in there.
10
- // Therefore we set `root` only for `serve` and, for `build`, we instead make sure that
10
+ // Therefore, we set `root` only for `serve` and, for `build`, we instead make sure that
11
11
  // an `outDir` **outside** of `node_modules` is used (defaulting to the current working
12
12
  // directory if the user did not provide one already).
13
13
  config.root = packageRoot;
@@ -26,18 +26,16 @@ export function viteConfigPlugin({ packageRoot }) {
26
26
  config.build = Object.assign(Object.assign({}, buildConfig), { outDir: normalizedOutDir });
27
27
  }
28
28
  config.resolve = {
29
- alias: Object.assign(Object.assign({}, ((_c = (_b = config.resolve) === null || _b === void 0 ? void 0 : _b.alias) !== null && _c !== void 0 ? _c : {})), { '@': path.resolve(packageRoot, './src/lib') }),
29
+ alias: Object.assign(Object.assign({}, ((_c = (_b = config.resolve) === null || _b === void 0 ? void 0 : _b.alias) !== null && _c !== void 0 ? _c : {})), {
30
+ // See the readme for an explanation of this alias.
31
+ '@/vdb': path.resolve(packageRoot, './src/lib'), '@/graphql': path.resolve(packageRoot, './src/lib/graphql') }),
30
32
  };
31
33
  // This is required to prevent Vite from pre-bundling the
32
34
  // dashboard source when it resides in node_modules.
33
35
  config.optimizeDeps = Object.assign(Object.assign({}, config.optimizeDeps), { exclude: [
34
36
  ...(((_d = config.optimizeDeps) === null || _d === void 0 ? void 0 : _d.exclude) || []),
35
37
  '@vendure/dashboard',
36
- '@/providers',
37
- '@/framework',
38
- '@/lib',
39
- '@/components',
40
- '@/hooks',
38
+ '@/vdb',
41
39
  'virtual:vendure-ui-config',
42
40
  'virtual:admin-api-schema',
43
41
  'virtual:dashboard-extensions',
@@ -49,6 +47,7 @@ export function viteConfigPlugin({ packageRoot }) {
49
47
  ...(((_e = config.optimizeDeps) === null || _e === void 0 ? void 0 : _e.include) || []),
50
48
  '@/components > recharts',
51
49
  '@/components > react-dropzone',
50
+ '@vendure/common/lib/generated-types',
52
51
  ] });
53
52
  return config;
54
53
  },
@@ -4,6 +4,4 @@ import { Plugin } from 'vite';
4
4
  * generates an import statement for each one, wrapped up in a `runDashboardExtensions()`
5
5
  * function which can then be imported and executed in the Dashboard app.
6
6
  */
7
- export declare function dashboardMetadataPlugin(options: {
8
- rootDir: string;
9
- }): Plugin;
7
+ export declare function dashboardMetadataPlugin(): Plugin;
@@ -7,7 +7,7 @@ const resolvedVirtualModuleId = `\0${virtualModuleId}`;
7
7
  * generates an import statement for each one, wrapped up in a `runDashboardExtensions()`
8
8
  * function which can then be imported and executed in the Dashboard app.
9
9
  */
10
- export function dashboardMetadataPlugin(options) {
10
+ export function dashboardMetadataPlugin() {
11
11
  let configLoaderApi;
12
12
  let loadVendureConfigResult;
13
13
  return {
@@ -23,12 +23,29 @@ export function dashboardMetadataPlugin(options) {
23
23
  async load(id) {
24
24
  var _a;
25
25
  if (id === resolvedVirtualModuleId) {
26
+ const startTime = Date.now();
27
+ this.debug('Loading dashboard extensions...');
26
28
  if (!loadVendureConfigResult) {
29
+ const configStart = Date.now();
27
30
  loadVendureConfigResult = await configLoaderApi.getVendureConfig();
31
+ this.debug(`Loaded Vendure config in ${Date.now() - configStart}ms`);
28
32
  }
29
33
  const { pluginInfo } = loadVendureConfigResult;
30
- const pluginsWithExtensions = (_a = pluginInfo === null || pluginInfo === void 0 ? void 0 : pluginInfo.map(({ dashboardEntryPath, pluginPath }) => dashboardEntryPath && path.join(pluginPath, dashboardEntryPath)).filter(x => x != null)) !== null && _a !== void 0 ? _a : [];
31
- this.info(`Found ${pluginsWithExtensions.length} Dashboard extensions`);
34
+ const resolveStart = Date.now();
35
+ const pluginsWithExtensions = (_a = pluginInfo === null || pluginInfo === void 0 ? void 0 : pluginInfo.map(({ dashboardEntryPath, pluginPath, sourcePluginPath }) => {
36
+ if (!dashboardEntryPath) {
37
+ return null;
38
+ }
39
+ // For local plugins, use the sourcePluginPath to resolve the dashboard extension
40
+ const basePath = sourcePluginPath
41
+ ? path.dirname(sourcePluginPath)
42
+ : path.dirname(pluginPath);
43
+ const resolved = path.resolve(basePath, dashboardEntryPath);
44
+ this.debug(`Resolved extension path: ${resolved}`);
45
+ return resolved;
46
+ }).filter(x => x != null)) !== null && _a !== void 0 ? _a : [];
47
+ this.info(`Found ${pluginsWithExtensions.length} Dashboard extensions in ${Date.now() - resolveStart}ms`);
48
+ this.debug(`Total dashboard extension loading completed in ${Date.now() - startTime}ms`);
32
49
  return `
33
50
  export async function runDashboardExtensions() {
34
51
  ${pluginsWithExtensions
@@ -41,10 +58,3 @@ export function dashboardMetadataPlugin(options) {
41
58
  },
42
59
  };
43
60
  }
44
- /**
45
- * Converts an import path to a normalized path relative to the rootDir.
46
- */
47
- function normalizeImportPath(rootDir, importPath) {
48
- const relativePath = path.relative(rootDir, importPath).replace(/\\/g, '/');
49
- return relativePath.replace(/\.tsx?$/, '.js');
50
- }