@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
@@ -1,445 +0,0 @@
1
- import { VendureConfig } from '@vendure/core';
2
- import fs from 'fs-extra';
3
- import path from 'path';
4
- import tsConfigPaths from 'tsconfig-paths';
5
- import * as ts from 'typescript';
6
- import { pathToFileURL } from 'url';
7
-
8
- import { findConfigExport, getPluginInfo } from './ast-utils.js';
9
-
10
- type Logger = {
11
- info: (message: string) => void;
12
- warn: (message: string) => void;
13
- debug: (message: string) => void;
14
- };
15
-
16
- export type PluginInfo = {
17
- name: string;
18
- pluginPath: string;
19
- dashboardEntryPath: string | undefined;
20
- };
21
-
22
- const defaultLogger: Logger = {
23
- info: (message: string) => {
24
- /* noop */
25
- },
26
- warn: (message: string) => {
27
- /* noop */
28
- },
29
- debug: (message: string) => {
30
- /* noop */
31
- },
32
- };
33
-
34
- export interface ConfigLoaderOptions {
35
- vendureConfigPath: string;
36
- tempDir: string;
37
- vendureConfigExport?: string;
38
- logger?: Logger;
39
- reportCompilationErrors?: boolean;
40
- }
41
-
42
- export interface LoadVendureConfigResult {
43
- vendureConfig: VendureConfig;
44
- exportedSymbolName: string;
45
- pluginInfo: PluginInfo[];
46
- }
47
-
48
- /**
49
- * @description
50
- * This function compiles the given Vendure config file and any imported relative files (i.e.
51
- * project files, not npm packages) into a temporary directory, and returns the compiled config.
52
- *
53
- * The reason we need to do this is that Vendure code makes use of TypeScript experimental decorators
54
- * (e.g. for NestJS decorators and TypeORM column decorators) which are not supported by esbuild.
55
- *
56
- * In Vite, when we load some TypeScript into the top-level Vite config file (in the end-user project), Vite
57
- * internally uses esbuild to temporarily compile that TypeScript code. Unfortunately, esbuild does not support
58
- * these experimental decorators, errors will be thrown as soon as e.g. a TypeORM column decorator is encountered.
59
- *
60
- * To work around this, we compile the Vendure config file and all its imports using the TypeScript compiler,
61
- * which fully supports these experimental decorators. The compiled files are then loaded by Vite, which is able
62
- * to handle the compiled JavaScript output.
63
- */
64
- export async function loadVendureConfig(options: ConfigLoaderOptions): Promise<LoadVendureConfigResult> {
65
- const { vendureConfigPath, vendureConfigExport, tempDir } = options;
66
- const logger = options.logger || defaultLogger;
67
- const outputPath = tempDir;
68
- const configFileName = path.basename(vendureConfigPath);
69
- const inputRootDir = path.dirname(vendureConfigPath);
70
- await fs.remove(outputPath);
71
- const pluginInfo = await compileFile({
72
- inputRootDir,
73
- inputPath: vendureConfigPath,
74
- outputDir: outputPath,
75
- logger,
76
- });
77
- const compiledConfigFilePath = pathToFileURL(path.join(outputPath, configFileName)).href.replace(
78
- /.ts$/,
79
- '.js',
80
- );
81
- // create package.json with type commonjs and save it to the output dir
82
- await fs.writeFile(path.join(outputPath, 'package.json'), JSON.stringify({ type: 'commonjs' }, null, 2));
83
-
84
- // We need to figure out the symbol exported by the config file by
85
- // analyzing the AST and finding an export with the type "VendureConfig"
86
- const sourceFile = ts.createSourceFile(
87
- vendureConfigPath,
88
- await fs.readFile(vendureConfigPath, 'utf-8'),
89
- ts.ScriptTarget.Latest,
90
- true,
91
- );
92
- const detectedExportedSymbolName = findConfigExport(sourceFile);
93
- const configExportedSymbolName = detectedExportedSymbolName || vendureConfigExport;
94
- if (!configExportedSymbolName) {
95
- throw new Error(
96
- `Could not find a variable exported as VendureConfig. Please specify the name of the exported variable using the "vendureConfigExport" option.`,
97
- );
98
- }
99
-
100
- // Register path aliases from tsconfig before importing
101
- const tsConfigInfo = await findTsConfigPaths(vendureConfigPath, logger);
102
- if (tsConfigInfo) {
103
- tsConfigPaths.register({
104
- baseUrl: outputPath,
105
- paths: tsConfigInfo.paths,
106
- });
107
- }
108
-
109
- const config = await import(compiledConfigFilePath).then(m => m[configExportedSymbolName]);
110
- if (!config) {
111
- throw new Error(
112
- `Could not find a variable exported as VendureConfig with the name "${configExportedSymbolName}".`,
113
- );
114
- }
115
- return { vendureConfig: config, exportedSymbolName: configExportedSymbolName, pluginInfo };
116
- }
117
-
118
- /**
119
- * Finds and parses tsconfig files in the given directory and its parent directories.
120
- * Returns the paths configuration if found.
121
- */
122
- async function findTsConfigPaths(
123
- configPath: string,
124
- logger: Logger,
125
- ): Promise<{ baseUrl: string; paths: Record<string, string[]> } | undefined> {
126
- const configDir = path.dirname(configPath);
127
- let currentDir = configDir;
128
-
129
- while (currentDir !== path.parse(currentDir).root) {
130
- try {
131
- const files = await fs.readdir(currentDir);
132
- const tsConfigFiles = files.filter(file => /^tsconfig(\..*)?\.json$/.test(file));
133
-
134
- for (const fileName of tsConfigFiles) {
135
- const tsConfigPath = path.join(currentDir, fileName);
136
- try {
137
- const tsConfigContent = await fs.readFile(tsConfigPath, 'utf-8');
138
- // Use JSON5 or similar parser if comments are expected in tsconfig.json
139
- // For simplicity, assuming standard JSON here. Handle parse errors.
140
- const tsConfig = JSON.parse(tsConfigContent);
141
- const compilerOptions = tsConfig.compilerOptions || {};
142
-
143
- if (compilerOptions.paths) {
144
- // Determine the effective baseUrl: explicitly set or the directory of tsconfig.json
145
- const tsConfigBaseUrl = path.resolve(currentDir, compilerOptions.baseUrl || '.');
146
- const paths: Record<string, string[]> = {};
147
-
148
- for (const [alias, patterns] of Object.entries(compilerOptions.paths)) {
149
- // Store paths as defined in tsconfig, they will be relative to baseUrl
150
- paths[alias] = (patterns as string[]).map(pattern =>
151
- // Normalize slashes for consistency, keep relative
152
- pattern.replace(/\\/g, '/'),
153
- );
154
- }
155
- logger.debug(
156
- `Found tsconfig paths in ${tsConfigPath}: ${JSON.stringify(
157
- {
158
- baseUrl: tsConfigBaseUrl,
159
- paths,
160
- },
161
- null,
162
- 2,
163
- )}`,
164
- );
165
- return { baseUrl: tsConfigBaseUrl, paths };
166
- }
167
- } catch (e: any) {
168
- logger.warn(
169
- `Could not read or parse tsconfig file ${tsConfigPath}: ${e.message as string}`,
170
- );
171
- }
172
- }
173
- } catch (e: any) {
174
- // If we can't read the directory, just continue to the parent
175
- logger.warn(`Could not read directory ${currentDir}: ${e.message as string}`);
176
- }
177
- currentDir = path.dirname(currentDir);
178
- }
179
- logger.debug(`No tsconfig paths found traversing up from ${configDir}`);
180
- return undefined;
181
- }
182
-
183
- type CompileFileOptions = {
184
- inputRootDir: string;
185
- inputPath: string;
186
- outputDir: string;
187
- logger?: Logger;
188
- compiledFiles?: Set<string>;
189
- isRoot?: boolean;
190
- pluginInfo?: PluginInfo[];
191
- reportCompilationErrors?: boolean;
192
- };
193
-
194
- export async function compileFile({
195
- inputRootDir,
196
- inputPath,
197
- outputDir,
198
- logger = defaultLogger,
199
- compiledFiles = new Set<string>(),
200
- isRoot = true,
201
- pluginInfo = [],
202
- reportCompilationErrors = false,
203
- }: CompileFileOptions): Promise<PluginInfo[]> {
204
- const absoluteInputPath = path.resolve(inputPath);
205
- if (compiledFiles.has(absoluteInputPath)) {
206
- return pluginInfo;
207
- }
208
- compiledFiles.add(absoluteInputPath);
209
-
210
- // Ensure output directory exists
211
- await fs.ensureDir(outputDir);
212
-
213
- // Read the source file
214
- const source = await fs.readFile(inputPath, 'utf-8');
215
-
216
- // Parse the source to find relative imports
217
- const sourceFile = ts.createSourceFile(absoluteInputPath, source, ts.ScriptTarget.Latest, true);
218
-
219
- const importPaths = new Set<string>();
220
- let tsConfigInfo: { baseUrl: string; paths: Record<string, string[]> } | undefined;
221
-
222
- if (isRoot) {
223
- tsConfigInfo = await findTsConfigPaths(absoluteInputPath, logger);
224
- if (tsConfigInfo) {
225
- logger?.debug(`Using TypeScript configuration: ${JSON.stringify(tsConfigInfo, null, 2)}`);
226
- }
227
- }
228
-
229
- async function collectImports(node: ts.Node) {
230
- if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) {
231
- const importPath = node.moduleSpecifier.text;
232
-
233
- // Handle relative imports
234
- if (importPath.startsWith('.')) {
235
- const resolvedPath = path.resolve(path.dirname(absoluteInputPath), importPath);
236
- let resolvedTsPath = resolvedPath + '.ts';
237
- // Also check for .tsx if .ts doesn't exist
238
- if (!(await fs.pathExists(resolvedTsPath))) {
239
- const resolvedTsxPath = resolvedPath + '.tsx';
240
- if (await fs.pathExists(resolvedTsxPath)) {
241
- resolvedTsPath = resolvedTsxPath;
242
- } else {
243
- // If neither exists, maybe it's an index file?
244
- const resolvedIndexPath = path.join(resolvedPath, 'index.ts');
245
- if (await fs.pathExists(resolvedIndexPath)) {
246
- resolvedTsPath = resolvedIndexPath;
247
- } else {
248
- const resolvedIndexTsxPath = path.join(resolvedPath, 'index.tsx');
249
- if (await fs.pathExists(resolvedIndexTsxPath)) {
250
- resolvedTsPath = resolvedIndexTsxPath;
251
- } else {
252
- // If still not found, log a warning or let TS handle it later
253
- logger?.warn(
254
- `Could not resolve relative import "${importPath}" from "${absoluteInputPath}" to an existing .ts/.tsx file.`,
255
- );
256
- // Do not add to importPaths if we can't verify existence
257
- return;
258
- }
259
- }
260
- }
261
- }
262
- importPaths.add(resolvedTsPath);
263
- }
264
- // Handle path aliases if tsConfigInfo exists
265
- else if (tsConfigInfo) {
266
- // Attempt to resolve using path aliases
267
- let resolved = false;
268
- for (const [alias, patterns] of Object.entries(tsConfigInfo.paths)) {
269
- const aliasPrefix = alias.replace('*', '');
270
- const aliasSuffix = alias.endsWith('*') ? '*' : '';
271
-
272
- if (
273
- importPath.startsWith(aliasPrefix) &&
274
- (aliasSuffix === '*' || importPath === aliasPrefix)
275
- ) {
276
- const remainingImportPath = importPath.slice(aliasPrefix.length);
277
- for (const pattern of patterns) {
278
- const patternPrefix = pattern.replace('*', '');
279
- const patternSuffix = pattern.endsWith('*') ? '*' : '';
280
- // Ensure suffix match consistency (* vs exact)
281
- if (aliasSuffix !== patternSuffix) continue;
282
-
283
- const potentialPathBase = path.resolve(tsConfigInfo.baseUrl, patternPrefix);
284
- const resolvedPath = path.join(potentialPathBase, remainingImportPath);
285
-
286
- let resolvedTsPath = resolvedPath + '.ts';
287
- // Similar existence checks as relative paths
288
- if (!(await fs.pathExists(resolvedTsPath))) {
289
- const resolvedTsxPath = resolvedPath + '.tsx';
290
- if (await fs.pathExists(resolvedTsxPath)) {
291
- resolvedTsPath = resolvedTsxPath;
292
- } else {
293
- const resolvedIndexPath = path.join(resolvedPath, 'index.ts');
294
- if (await fs.pathExists(resolvedIndexPath)) {
295
- resolvedTsPath = resolvedIndexPath;
296
- } else {
297
- const resolvedIndexTsxPath = path.join(resolvedPath, 'index.tsx');
298
- if (await fs.pathExists(resolvedIndexTsxPath)) {
299
- resolvedTsPath = resolvedIndexTsxPath;
300
- } else {
301
- // Path doesn't resolve to a file for this pattern
302
- continue;
303
- }
304
- }
305
- }
306
- }
307
- // Add the first successful resolution for this alias
308
- importPaths.add(resolvedTsPath);
309
- resolved = true;
310
- break; // Stop checking patterns for this alias
311
- }
312
- }
313
- if (resolved) break; // Stop checking other aliases if resolved
314
- }
315
- }
316
- // For all other imports (node_modules, etc), we should still add them to be processed
317
- // by the TypeScript compiler, even if we can't resolve them to a file
318
- else {
319
- // Add the import path as is - TypeScript will handle resolution
320
- // importPaths.add(importPath);
321
- }
322
- } else {
323
- const children = node.getChildren();
324
- for (const child of children) {
325
- // Only process nodes that could contain import statements
326
- if (
327
- ts.isSourceFile(child) ||
328
- ts.isModuleBlock(child) ||
329
- ts.isModuleDeclaration(child) ||
330
- ts.isImportDeclaration(child) ||
331
- child.kind === ts.SyntaxKind.SyntaxList
332
- ) {
333
- await collectImports(child);
334
- }
335
- }
336
- }
337
- }
338
-
339
- // Start collecting imports from the source file
340
- await collectImports(sourceFile);
341
-
342
- const extractedPluginInfo = getPluginInfo(sourceFile);
343
- if (extractedPluginInfo) {
344
- pluginInfo.push(extractedPluginInfo);
345
- }
346
-
347
- // Store the tsConfigInfo on the first call if found
348
- const rootTsConfigInfo = isRoot ? tsConfigInfo : undefined;
349
-
350
- // Recursively collect all files that need to be compiled
351
- for (const importPath of importPaths) {
352
- // Pass rootTsConfigInfo down, but set isRoot to false
353
- await compileFile({
354
- inputRootDir,
355
- inputPath: importPath,
356
- outputDir,
357
- logger,
358
- compiledFiles,
359
- isRoot: false,
360
- pluginInfo,
361
- });
362
- }
363
-
364
- // If this is the root file (the one that started the compilation),
365
- // use the TypeScript compiler API to compile all files together
366
- if (isRoot) {
367
- logger.info(`Starting compilation for ${compiledFiles.size} files...`);
368
- const allFiles = Array.from(compiledFiles);
369
- const compilerOptions: ts.CompilerOptions = {
370
- // Base options
371
- target: ts.ScriptTarget.ES2020,
372
- module: ts.ModuleKind.CommonJS, // Output CommonJS for Node compatibility
373
- experimentalDecorators: true,
374
- emitDecoratorMetadata: true,
375
- esModuleInterop: true,
376
- skipLibCheck: true, // Faster compilation
377
- forceConsistentCasingInFileNames: true,
378
- moduleResolution: ts.ModuleResolutionKind.NodeJs, // Use Node.js module resolution
379
- incremental: false, // No need for incremental compilation
380
- noEmitOnError: false, // Continue emitting even with errors
381
- isolatedModules: true, // Treat files as separate modules
382
- strict: false, // Disable strict type checking for speed
383
- noUnusedLocals: false, // Skip unused locals check
384
- noUnusedParameters: false, // Skip unused parameters check
385
-
386
- // Output options
387
- outDir: outputDir, // Output directory for all compiled files
388
- sourceMap: false, // Generate source maps
389
- declaration: false, // Don't generate .d.ts files
390
-
391
- // Path resolution options - use info found from tsconfig
392
- baseUrl: rootTsConfigInfo ? rootTsConfigInfo.baseUrl : undefined, // Let TS handle resolution if no baseUrl
393
- paths: rootTsConfigInfo ? rootTsConfigInfo.paths : undefined,
394
- // rootDir: inputRootDir, // Often inferred correctly, can cause issues if set explicitly sometimes
395
- allowJs: true, // Allow JS files if needed, though we primarily collect TS
396
- resolveJsonModule: true, // Allow importing JSON
397
- };
398
-
399
- logger.debug(`compilerOptions: ${JSON.stringify(compilerOptions, null, 2)}`);
400
-
401
- // Create a Program to represent the compilation context
402
- const program = ts.createProgram(allFiles, compilerOptions);
403
- logger.info(`Emitting compiled files to ${outputDir}`);
404
- const emitResult = program.emit();
405
-
406
- if (reportCompilationErrors) {
407
- const hasEmitErrors = reportDiagnostics(program, emitResult, logger);
408
-
409
- if (hasEmitErrors) {
410
- throw new Error('TypeScript compilation failed with errors.');
411
- }
412
- }
413
-
414
- logger.info(`Successfully compiled ${allFiles.length} files to ${outputDir}`);
415
- }
416
- return pluginInfo;
417
- }
418
-
419
- function reportDiagnostics(program: ts.Program, emitResult: ts.EmitResult, logger: Logger) {
420
- const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
421
- let hasEmitErrors = emitResult.emitSkipped;
422
- allDiagnostics.forEach(diagnostic => {
423
- if (diagnostic.file && diagnostic.start) {
424
- const { line, character } = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
425
- const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
426
- const logFn = diagnostic.category === ts.DiagnosticCategory.Error ? logger.warn : logger.info;
427
- // eslint-disable-next-line no-console
428
- console.log(
429
- `TS${diagnostic.code} ${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`,
430
- );
431
- if (diagnostic.category === ts.DiagnosticCategory.Error) {
432
- hasEmitErrors = true;
433
- }
434
- } else {
435
- const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
436
- const logFn = diagnostic.category === ts.DiagnosticCategory.Error ? logger.warn : logger.info;
437
- // eslint-disable-next-line no-console
438
- console.log(`TS${diagnostic.code}: ${message}`);
439
- if (diagnostic.category === ts.DiagnosticCategory.Error) {
440
- hasEmitErrors = true;
441
- }
442
- }
443
- });
444
- return hasEmitErrors;
445
- }
@@ -0,0 +1,43 @@
1
+ import { Logger } from '../types.js';
2
+
3
+ // ANSI color codes
4
+ const colors = {
5
+ grey: '\x1b[90m',
6
+ red: '\x1b[31m',
7
+ yellow: '\x1b[33m',
8
+ reset: '\x1b[0m',
9
+ } as const;
10
+
11
+ export const debugLogger: Logger = {
12
+ info: (message: string) => {
13
+ // eslint-disable-next-line no-console
14
+ console.log(`[INFO] ${message}`);
15
+ },
16
+ warn: (message: string) => {
17
+ // eslint-disable-next-line no-console
18
+ console.warn(`${colors.yellow}[WARN] ${message}${colors.reset}`);
19
+ },
20
+ debug: (message: string) => {
21
+ // eslint-disable-next-line no-console
22
+ console.debug(`${colors.grey}[DEBUG] ${message}${colors.reset}`);
23
+ },
24
+ error: (message: string) => {
25
+ // eslint-disable-next-line no-console
26
+ console.error(`${colors.red}[ERROR] ${message}${colors.reset}`);
27
+ },
28
+ };
29
+
30
+ export const noopLogger: Logger = {
31
+ info: () => {
32
+ /* noop */
33
+ },
34
+ warn: () => {
35
+ /* noop */
36
+ },
37
+ debug: () => {
38
+ /* noop */
39
+ },
40
+ error: () => {
41
+ /* noop */
42
+ },
43
+ };