@hartl-services/medusa-base 2.5.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ImageSettingInput.js +48 -0
  2. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginActionsSection.js +3 -2
  3. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +17 -0
  4. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginPageShell.js +20 -0
  5. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginSettingsForm.js +16 -3
  6. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +5 -1
  7. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +20 -4
  8. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/hooks/usePluginFeatures.js +1 -1
  9. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +5 -1
  10. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/lib/action-runs.d.ts +1 -1
  11. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/lib/action-runs.js +3 -2
  12. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +20 -4
  13. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/lib/plugin-features-admin-client.js +1 -1
  14. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/lib/settings-draft.d.ts +17 -2
  15. package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/lib/settings-draft.js +33 -1
  16. package/{dist → .medusa/server/src/admin}/admin-components/i18n/texts.d.ts +3 -0
  17. package/{dist → .medusa/server/src/admin}/admin-components/i18n/texts.js +3 -0
  18. package/.medusa/server/src/admin/admin-components/index.d.ts +36 -0
  19. package/.medusa/server/src/admin/admin-components/index.js +37 -0
  20. package/.medusa/server/src/admin/admin-components/shared/lib/date-input.d.ts +8 -0
  21. package/.medusa/server/src/admin/admin-components/shared/lib/date-input.js +43 -0
  22. package/.medusa/server/src/admin/admin-components/shared/lib/errors.d.ts +9 -0
  23. package/{dist/admin-components → .medusa/server/src/admin/admin-components/shared}/lib/errors.js +4 -6
  24. package/.medusa/server/src/admin/admin-components/shared/lib/file-validation.d.ts +24 -0
  25. package/.medusa/server/src/admin/admin-components/shared/lib/file-validation.js +18 -0
  26. package/.medusa/server/src/admin/admin-components/shared/lib/format.d.ts +32 -0
  27. package/.medusa/server/src/admin/admin-components/shared/lib/format.js +77 -0
  28. package/.medusa/server/src/admin/admin-components/shared/lib/pdf-preview.d.ts +16 -0
  29. package/.medusa/server/src/admin/admin-components/shared/lib/pdf-preview.js +31 -0
  30. package/.medusa/server/src/admin/admin-components/shared/lib/pdf.d.ts +6 -0
  31. package/.medusa/server/src/admin/admin-components/shared/lib/pdf.js +13 -0
  32. package/.medusa/server/src/admin/admin-components/shared/lib/use-debounced-value.d.ts +2 -0
  33. package/.medusa/server/src/admin/admin-components/shared/lib/use-debounced-value.js +10 -0
  34. package/.medusa/server/src/admin/admin-components/shared/lib/use-pdf-preview.d.ts +24 -0
  35. package/.medusa/server/src/admin/admin-components/shared/lib/use-pdf-preview.js +47 -0
  36. package/.medusa/server/src/admin/admin-components/shared/ui/AdminDatePicker.d.ts +8 -0
  37. package/.medusa/server/src/admin/admin-components/shared/ui/AdminDatePicker.js +9 -0
  38. package/.medusa/server/src/admin/admin-components/shared/ui/BackLink.d.ts +8 -0
  39. package/.medusa/server/src/admin/admin-components/shared/ui/BackLink.js +5 -0
  40. package/.medusa/server/src/admin/admin-components/shared/ui/DateRangeFilter.d.ts +20 -0
  41. package/.medusa/server/src/admin/admin-components/shared/ui/DateRangeFilter.js +17 -0
  42. package/.medusa/server/src/admin/admin-components/shared/ui/FilePickerButton.d.ts +14 -0
  43. package/.medusa/server/src/admin/admin-components/shared/ui/FilePickerButton.js +14 -0
  44. package/.medusa/server/src/admin/admin-components/shared/ui/MappedStatusBadge.d.ts +17 -0
  45. package/.medusa/server/src/admin/admin-components/shared/ui/MappedStatusBadge.js +12 -0
  46. package/.medusa/server/src/admin/admin-components/shared/ui/OffsetTablePagination.d.ts +15 -0
  47. package/.medusa/server/src/admin/admin-components/shared/ui/OffsetTablePagination.js +19 -0
  48. package/.medusa/server/src/admin/admin-components/shared/ui/PdfPreviewModal.d.ts +20 -0
  49. package/.medusa/server/src/admin/admin-components/shared/ui/PdfPreviewModal.js +7 -0
  50. package/.medusa/server/src/admin/admin-components/shared/ui/PluginFeatureRoute.d.ts +19 -0
  51. package/.medusa/server/src/admin/admin-components/shared/ui/PluginFeatureRoute.js +16 -0
  52. package/.medusa/server/src/admin/admin-components/shared/ui/QueryState.d.ts +24 -0
  53. package/.medusa/server/src/admin/admin-components/shared/ui/QueryState.js +23 -0
  54. package/.medusa/server/src/admin/admin-components/shared/ui/SearchableReferenceField.d.ts +63 -0
  55. package/.medusa/server/src/admin/admin-components/shared/ui/SearchableReferenceField.js +84 -0
  56. package/.medusa/server/src/admin/admin-components/shared/ui/SectionHeader.d.ts +15 -0
  57. package/.medusa/server/src/admin/admin-components/shared/ui/SectionHeader.js +13 -0
  58. package/.medusa/server/src/admin/admin-components/shared/ui/mapped-status.d.ts +6 -0
  59. package/.medusa/server/src/admin/admin-components/shared/ui/mapped-status.js +10 -0
  60. package/.medusa/server/src/admin/admin-components/shared/ui/offset-pagination.d.ts +17 -0
  61. package/.medusa/server/src/admin/admin-components/shared/ui/offset-pagination.js +15 -0
  62. package/.medusa/server/src/admin/admin-components/shared/ui/reference-results-state.d.ts +16 -0
  63. package/.medusa/server/src/admin/admin-components/shared/ui/reference-results-state.js +13 -0
  64. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/InsertMenu.d.ts +8 -0
  65. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/InsertMenu.js +10 -0
  66. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/LinkPrompt.d.ts +14 -0
  67. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/LinkPrompt.js +26 -0
  68. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/RichTextEditor.d.ts +15 -0
  69. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/RichTextEditor.js +8 -0
  70. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/RichTextToolbar.d.ts +10 -0
  71. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/RichTextToolbar.js +49 -0
  72. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/SlashMenu.d.ts +11 -0
  73. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/SlashMenu.js +44 -0
  74. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/build-extensions.d.ts +8 -0
  75. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/build-extensions.js +43 -0
  76. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/drag-handle.d.ts +15 -0
  77. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/drag-handle.js +161 -0
  78. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/drag-target.d.ts +30 -0
  79. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/drag-target.js +47 -0
  80. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/editor-styles.d.ts +6 -0
  81. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/editor-styles.js +46 -0
  82. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/index.d.ts +9 -0
  83. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/index.js +6 -0
  84. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/link-href.d.ts +8 -0
  85. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/link-href.js +21 -0
  86. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/link-policy.d.ts +13 -0
  87. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/link-policy.js +20 -0
  88. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/slash-command.d.ts +13 -0
  89. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/slash-command.js +60 -0
  90. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/slash-items.d.ts +25 -0
  91. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/slash-items.js +10 -0
  92. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/tiptap.d.ts +7 -0
  93. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/tiptap.js +7 -0
  94. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/use-rich-text-editor.d.ts +44 -0
  95. package/.medusa/server/src/admin/admin-components/shared/ui/rich-text-editor/use-rich-text-editor.js +37 -0
  96. package/.medusa/server/src/admin/index.js +4519 -1447
  97. package/.medusa/server/src/admin/index.mjs +4521 -1452
  98. package/.medusa/server/src/api/admin/email/attachments/[id]/mail-kinds/route.js +16 -0
  99. package/.medusa/server/src/api/admin/email/attachments/[id]/route.js +15 -0
  100. package/.medusa/server/src/api/admin/email/attachments/[id]/versions/[version_id]/download/route.js +16 -0
  101. package/.medusa/server/src/api/admin/email/attachments/[id]/versions/route.js +41 -0
  102. package/.medusa/server/src/api/admin/email/attachments/route.js +21 -0
  103. package/.medusa/server/src/api/admin/email/templates/[kind]/preview/route.js +31 -0
  104. package/.medusa/server/src/api/admin/email/templates/[kind]/route.js +28 -0
  105. package/.medusa/server/src/api/admin/email/templates/[kind]/send-test/route.js +179 -0
  106. package/.medusa/server/src/api/admin/email/templates/[kind]/test-sources/route.js +19 -0
  107. package/.medusa/server/src/api/admin/email/templates/route.js +15 -0
  108. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/route.js +2 -2
  109. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/runs/route.js +2 -2
  110. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/route.js +2 -2
  111. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/settings/route.js +2 -2
  112. package/.medusa/server/src/api/admin/plugin-features/route.js +2 -2
  113. package/.medusa/server/src/api/attachment-download-response.js +12 -0
  114. package/.medusa/server/src/api/email-template-response.js +43 -0
  115. package/.medusa/server/src/api/middlewares.js +75 -17
  116. package/.medusa/server/src/api/plugin-actions.js +6 -5
  117. package/.medusa/server/src/api/plugin-features-http.js +4 -9
  118. package/.medusa/server/src/api/store/carts/[id]/completion-check/route.js +2 -2
  119. package/.medusa/server/src/api/store/plugin-features/[plugin_key]/route.js +2 -2
  120. package/.medusa/server/src/api/store/plugin-features/route.js +2 -2
  121. package/.medusa/server/src/documents/plugin-features.js +1 -7
  122. package/.medusa/server/src/documents/templates/financial-document.js +12 -11
  123. package/.medusa/server/src/documents/templates/html-factory.js +1 -1
  124. package/.medusa/server/src/documents/templates/html-utils.js +4 -10
  125. package/.medusa/server/src/documents/templates/layout.js +30 -11
  126. package/.medusa/server/src/documents/templates/packing-list.js +8 -7
  127. package/.medusa/server/src/documents/utils/document-render-settings.js +9 -6
  128. package/.medusa/server/src/email/application/handle-customer-verification-event.js +8 -3
  129. package/.medusa/server/src/email/application/handle-invite-event.js +8 -3
  130. package/.medusa/server/src/email/application/handle-password-reset-event.js +8 -3
  131. package/.medusa/server/src/email/application/notification-attachments.js +86 -0
  132. package/.medusa/server/src/email/application/template-data-from-order.js +339 -0
  133. package/.medusa/server/src/email/config/index.js +5 -29
  134. package/.medusa/server/src/email/domain/business-keys.js +5 -5
  135. package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +3 -3
  136. package/.medusa/server/src/email/domain/order-summary.js +21 -27
  137. package/.medusa/server/src/email/domain/refund-summary.js +7 -12
  138. package/.medusa/server/src/email/domain/return-summary.js +32 -38
  139. package/.medusa/server/src/email/domain/shipment-summary.js +22 -28
  140. package/.medusa/server/src/email/plugin-features.js +2 -10
  141. package/.medusa/server/src/email/rendering/calendar-dates.js +19 -0
  142. package/.medusa/server/src/email/rendering/default-templates.js +99 -682
  143. package/.medusa/server/src/email/rendering/email-html.js +189 -0
  144. package/.medusa/server/src/email/rendering/load-email-shop-details.js +14 -12
  145. package/.medusa/server/src/email/rendering/render-email.js +46 -13
  146. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +3 -14
  147. package/.medusa/server/src/email/templates/blocks/dynamic-blocks.js +427 -0
  148. package/.medusa/server/src/email/templates/blocks/placeholders.js +71 -0
  149. package/.medusa/server/src/email/templates/blocks/render-document.js +137 -0
  150. package/.medusa/server/src/email/templates/code-override.js +18 -0
  151. package/.medusa/server/src/email/templates/defaults/documents.js +129 -0
  152. package/.medusa/server/src/email/templates/defaults/subjects.js +62 -0
  153. package/.medusa/server/src/email/templates/defaults/texts.js +42 -0
  154. package/.medusa/server/src/email/templates/index.js +22 -0
  155. package/.medusa/server/src/email/templates/load-template.js +39 -0
  156. package/.medusa/server/src/email/templates/preview.js +33 -0
  157. package/.medusa/server/src/email/templates/render.js +70 -0
  158. package/.medusa/server/src/email/templates/sample-data.js +165 -0
  159. package/.medusa/server/src/email/templates/types.js +3 -0
  160. package/.medusa/server/src/email/templates/validate.js +113 -0
  161. package/.medusa/server/src/files/config/index.js +6 -9
  162. package/.medusa/server/src/migration-scripts/move-logo-to-shop-appearance.js +53 -0
  163. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +4 -3
  164. package/.medusa/server/src/modules/documents/domain/merchant.js +4 -3
  165. package/.medusa/server/src/modules/documents/domain/options.js +3 -5
  166. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +4 -7
  167. package/.medusa/server/src/modules/documents/service.js +12 -33
  168. package/.medusa/server/src/modules/email/domain/attachment.js +22 -8
  169. package/.medusa/server/src/modules/email/migrations/Migration20261009083539.js +80 -0
  170. package/.medusa/server/src/modules/email/migrations/Migration20261009100654.js +17 -0
  171. package/.medusa/server/src/modules/email/models/email-attachment-document-version.js +39 -0
  172. package/.medusa/server/src/modules/email/models/email-attachment-document.js +27 -0
  173. package/.medusa/server/src/modules/email/models/email-template.js +25 -0
  174. package/.medusa/server/src/modules/email/service.js +370 -93
  175. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +9 -11
  176. package/.medusa/server/src/modules/plugin-features/service.js +2 -1
  177. package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +3 -3
  178. package/.medusa/server/src/providers/s3-cache/s3-object-store.js +3 -9
  179. package/.medusa/server/src/providers/smtp/service.js +13 -13
  180. package/.medusa/server/src/public/descriptor.js +16 -18
  181. package/.medusa/server/src/public/enforcement.js +29 -1
  182. package/.medusa/server/src/public/index.js +8 -2
  183. package/.medusa/server/src/public/module-access.js +9 -2
  184. package/.medusa/server/src/public/shop-master-data.js +109 -18
  185. package/.medusa/server/src/shared/lib/coerce.js +26 -0
  186. package/.medusa/server/src/shared/lib/collections.js +19 -0
  187. package/.medusa/server/src/shared/lib/dates.js +43 -0
  188. package/.medusa/server/src/shared/lib/errors.js +11 -0
  189. package/.medusa/server/src/shared/lib/hash.js +8 -0
  190. package/.medusa/server/src/shared/lib/index.js +29 -0
  191. package/.medusa/server/src/shared/lib/logging.js +61 -0
  192. package/.medusa/server/src/shared/lib/money.js +47 -0
  193. package/.medusa/server/src/shared/lib/text.js +53 -0
  194. package/.medusa/server/src/shared/lib/transaction.js +58 -0
  195. package/.medusa/server/src/{api → shared/lib}/wire-response.js +1 -1
  196. package/.medusa/server/src/shop-config/options.js +3 -5
  197. package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +4 -6
  198. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +10 -12
  199. package/.medusa/server/src/workflows/documents/issue-packing-list.js +5 -6
  200. package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +6 -8
  201. package/.medusa/server/src/workflows/email/dispatch-email-message.js +11 -41
  202. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +2 -2
  203. package/.medusa/server/src/workflows/hooks/complete-cart-participants.js +4 -8
  204. package/README.md +427 -54
  205. package/dist/documents/templates/financial-document.js +11 -10
  206. package/dist/documents/templates/html-factory.d.ts +1 -1
  207. package/dist/documents/templates/html-factory.js +1 -1
  208. package/dist/documents/templates/html-utils.d.ts +0 -1
  209. package/dist/documents/templates/html-utils.js +3 -9
  210. package/dist/documents/templates/layout.js +29 -10
  211. package/dist/documents/templates/packing-list.js +7 -6
  212. package/dist/documents/types/documents.d.ts +7 -1
  213. package/dist/email/config/index.js +4 -28
  214. package/dist/email/types/shop-configuration.d.ts +6 -5
  215. package/dist/files/config/index.js +5 -8
  216. package/dist/modules/documents/domain/options.js +2 -4
  217. package/dist/public/descriptor.js +15 -17
  218. package/dist/public/enforcement.d.ts +21 -1
  219. package/dist/public/enforcement.js +28 -0
  220. package/dist/public/index.d.ts +3 -2
  221. package/dist/public/index.js +7 -1
  222. package/dist/public/module-access.d.ts +8 -0
  223. package/dist/public/module-access.js +8 -1
  224. package/dist/public/shop-master-data.d.ts +22 -5
  225. package/dist/public/shop-master-data.js +108 -17
  226. package/dist/public/types.d.ts +10 -2
  227. package/dist/shared/lib/coerce.d.ts +19 -0
  228. package/dist/shared/lib/coerce.js +25 -0
  229. package/dist/shared/lib/collections.d.ts +3 -0
  230. package/dist/shared/lib/collections.js +18 -0
  231. package/dist/shared/lib/dates.d.ts +12 -0
  232. package/dist/shared/lib/dates.js +42 -0
  233. package/dist/shared/lib/errors.d.ts +2 -0
  234. package/dist/shared/lib/errors.js +10 -0
  235. package/dist/shared/lib/hash.d.ts +2 -0
  236. package/dist/shared/lib/hash.js +7 -0
  237. package/dist/shared/lib/index.d.ts +10 -0
  238. package/dist/shared/lib/index.js +28 -0
  239. package/dist/shared/lib/logging.d.ts +26 -0
  240. package/dist/shared/lib/logging.js +60 -0
  241. package/dist/shared/lib/money.d.ts +13 -0
  242. package/dist/shared/lib/money.js +46 -0
  243. package/dist/shared/lib/text.d.ts +19 -0
  244. package/dist/shared/lib/text.js +52 -0
  245. package/dist/shared/lib/transaction.d.ts +26 -0
  246. package/dist/shared/lib/transaction.js +57 -0
  247. package/dist/shared/lib/wire-response.d.ts +6 -0
  248. package/dist/shared/lib/wire-response.js +9 -0
  249. package/dist/shop-config/options.js +2 -4
  250. package/package.json +19 -4
  251. package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +0 -16
  252. package/.medusa/server/src/api/admin/email/terms-versions/route.js +0 -47
  253. package/.medusa/server/src/api/terms-download-response.js +0 -12
  254. package/.medusa/server/src/modules/email/models/email-terms-version.js +0 -37
  255. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +0 -42
  256. package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +0 -16
  257. package/dist/admin-components/features/plugin-features/components/PluginPageShell.js +0 -20
  258. package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +0 -6
  259. package/dist/admin-components/features/plugin-features/lib/image-upload.js +0 -17
  260. package/dist/admin-components/index.d.ts +0 -14
  261. package/dist/admin-components/index.js +0 -14
  262. package/dist/admin-components/lib/errors.d.ts +0 -6
  263. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +0 -0
  264. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginActionsSection.d.ts +0 -0
  265. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginDetailPage.d.ts +0 -0
  266. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginDetailPage.js +0 -0
  267. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginFeatureGate.d.ts +0 -0
  268. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginFeatureGate.js +0 -0
  269. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginFeatureSections.d.ts +0 -0
  270. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginFeatureSections.js +0 -0
  271. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +0 -0
  272. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginFeaturesCard.js +0 -0
  273. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.d.ts +0 -0
  274. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginHubCard.d.ts +0 -0
  275. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginHubCard.js +0 -0
  276. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginPageShell.d.ts +0 -0
  277. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +0 -0
  278. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +0 -0
  279. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/components/PluginStatusChips.js +0 -0
  280. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.js +0 -0
  281. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/hooks/usePluginSettingsForm.js +0 -0
  282. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/lib/plugin-paths.d.ts +0 -0
  283. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/lib/plugin-paths.js +0 -0
  284. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/queries/pluginFeatureKeys.d.ts +0 -0
  285. /package/{dist → .medusa/server/src/admin}/admin-components/features/plugin-features/queries/pluginFeatureKeys.js +0 -0
  286. /package/{dist/admin-components → .medusa/server/src/admin/admin-components/shared}/lib/sdk.d.ts +0 -0
  287. /package/{dist/admin-components → .medusa/server/src/admin/admin-components/shared}/lib/sdk.js +0 -0
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderFinancialDocument = void 0;
4
4
  const format_1 = require("./format");
5
+ const lib_1 = require("../../shared/lib");
5
6
  const html_utils_1 = require("./html-utils");
6
7
  const layout_1 = require("./layout");
7
8
  const labelsByKind = {
@@ -21,7 +22,7 @@ const labelsByKind = {
21
22
  const renderAddress = (input) => {
22
23
  const address = input.order.billing_address;
23
24
  if (!address) {
24
- return (0, html_utils_1.escapeHtml)(input.order.email);
25
+ return (0, lib_1.escapeHtml)(input.order.email);
25
26
  }
26
27
  return [
27
28
  address.company,
@@ -36,7 +37,7 @@ const renderAddress = (input) => {
36
37
  address.country_code ? (0, layout_1.formatCountryName)(address.country_code) : null,
37
38
  ]
38
39
  .filter((part) => Boolean(part))
39
- .map(html_utils_1.escapeHtml)
40
+ .map(lib_1.escapeHtml)
40
41
  .join("<br />");
41
42
  };
42
43
  /** "Charge: L-1, MHD: 30.06.2027"; the quantity only when a line has several batches. */
@@ -49,18 +50,18 @@ const renderBatchDetails = (line, timeZone) => {
49
50
  `MHD: ${(0, format_1.formatDocumentDate)(allocation.expiry_date, timeZone)}`,
50
51
  showQuantity ? `Menge: ${allocation.quantity}` : null,
51
52
  ].filter((part) => Boolean(part));
52
- return `<div class="batch">${(0, html_utils_1.escapeHtml)(parts.join(", "))}</div>`;
53
+ return `<div class="batch">${(0, lib_1.escapeHtml)(parts.join(", "))}</div>`;
53
54
  })
54
55
  .join("");
55
56
  };
56
57
  const renderLines = (input, timeZone) => input.lines
57
58
  .map((line) => `<tr>
58
59
  <td class="item">
59
- <div class="item-title">${(0, html_utils_1.escapeHtml)(line.title)}</div>
60
- ${line.sku ? `<div class="sku">SKU: ${(0, html_utils_1.escapeHtml)(line.sku)}</div>` : ""}
60
+ <div class="item-title">${(0, lib_1.escapeHtml)(line.title)}</div>
61
+ ${line.sku ? `<div class="sku">SKU: ${(0, lib_1.escapeHtml)(line.sku)}</div>` : ""}
61
62
  ${renderBatchDetails(line, timeZone)}
62
63
  </td>
63
- <td class="number quantity">${(0, html_utils_1.escapeHtml)(line.quantity)}</td>
64
+ <td class="number quantity">${(0, lib_1.escapeHtml)(line.quantity)}</td>
64
65
  <td class="number">${(0, html_utils_1.renderMoney)(line.unit_price)}</td>
65
66
  <td class="number">${(0, html_utils_1.renderMoney)(line.total)}</td>
66
67
  </tr>`)
@@ -74,8 +75,8 @@ const renderTaxCompliance = (input) => {
74
75
  }
75
76
  return `<section class="tax-compliance">
76
77
  <h2>Steuerliche Angaben</h2>
77
- <strong>${(0, html_utils_1.escapeHtml)(evidence.customer_company_name)}</strong><br />
78
- UID des Kunden: ${(0, html_utils_1.escapeHtml)(evidence.customer_vat_number)}<br />
78
+ <strong>${(0, lib_1.escapeHtml)(evidence.customer_company_name)}</strong><br />
79
+ UID des Kunden: ${(0, lib_1.escapeHtml)(evidence.customer_vat_number)}<br />
79
80
  Steuerfreie innergemeinschaftliche Lieferung
80
81
  </section>`;
81
82
  };
@@ -91,7 +92,7 @@ const formatTaxRate = (rate) => new Intl.NumberFormat(format_1.DEFAULT_FORMAT_LO
91
92
  style: "percent",
92
93
  }).format(rate / 100);
93
94
  /** One totals row below the Menge/Einzelpreis columns; the amount sits under "Summe". */
94
- const renderTotalRow = (label, value, className) => `<tr${className ? ` class="${className}"` : ""}><td class="spacer"></td><td class="label" colspan="2">${(0, html_utils_1.escapeHtml)(label)}</td><td class="number">${value}</td></tr>`;
95
+ const renderTotalRow = (label, value, className) => `<tr${className ? ` class="${className}"` : ""}><td class="spacer"></td><td class="label" colspan="2">${(0, lib_1.escapeHtml)(label)}</td><td class="number">${value}</td></tr>`;
95
96
  const renderTaxRows = (input) => {
96
97
  const { tax_breakdown: breakdown, tax_total: taxTotal } = input.totals;
97
98
  const rows = breakdown.length > 0
@@ -106,7 +107,7 @@ const renderTaxRows = (input) => {
106
107
  };
107
108
  /** Only invoices ask for payment; cancellations and credit notes do not. */
108
109
  const renderPaymentTerms = (input) => input.document.kind === "invoice" && input.settings.payment_terms
109
- ? `<section class="payment-terms">${(0, html_utils_1.escapeHtml)(input.settings.payment_terms)}</section>`
110
+ ? `<section class="payment-terms">${(0, lib_1.escapeHtml)(input.settings.payment_terms)}</section>`
110
111
  : "";
111
112
  const renderFinancialDocument = (input, layout, timeZone) => {
112
113
  const labels = labelsByKind[input.document.kind];
@@ -7,7 +7,7 @@ import { type DocumentTheme } from "./layout";
7
7
  * are shown; the plugin passes its resolved `numbering.timeZone` so the date
8
8
  * on a document matches the period its number was allocated in. `theme`
9
9
  * adds a project's CSS and page background (watermark) on top of the default
10
- * look; the logo comes from the Documents settings (`input.settings`).
10
+ * look; logo and colors come from the shop appearance (`input.settings`).
11
11
  */
12
12
  export declare const createDefaultDocumentHtmlFactory: ({ timeZone, theme, }: {
13
13
  timeZone: string;
@@ -12,7 +12,7 @@ const packing_list_1 = require("./packing-list");
12
12
  * are shown; the plugin passes its resolved `numbering.timeZone` so the date
13
13
  * on a document matches the period its number was allocated in. `theme`
14
14
  * adds a project's CSS and page background (watermark) on top of the default
15
- * look; the logo comes from the Documents settings (`input.settings`).
15
+ * look; logo and colors come from the shop appearance (`input.settings`).
16
16
  */
17
17
  const createDefaultDocumentHtmlFactory = ({ timeZone, theme, }) => {
18
18
  return (input) => {
@@ -1,5 +1,4 @@
1
1
  import type { DocumentMoney } from "../types";
2
- export declare const escapeHtml: (value: string | number | null | undefined) => string;
3
2
  export declare const formatOrderReference: (displayId: number | null) => string;
4
3
  /**
5
4
  * An amount as `<span class="money">` with separate currency and amount
@@ -1,14 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderMoney = exports.formatOrderReference = exports.escapeHtml = void 0;
3
+ exports.renderMoney = exports.formatOrderReference = void 0;
4
+ const lib_1 = require("../../shared/lib");
4
5
  const format_1 = require("./format");
5
- const escapeHtml = (value) => String(value ?? "")
6
- .replaceAll("&", "&amp;")
7
- .replaceAll("<", "&lt;")
8
- .replaceAll(">", "&gt;")
9
- .replaceAll('"', "&quot;")
10
- .replaceAll("'", "&#039;");
11
- exports.escapeHtml = escapeHtml;
12
6
  const formatOrderReference = (displayId) => displayId === null ? "-" : `#${displayId}`;
13
7
  exports.formatOrderReference = formatOrderReference;
14
8
  /**
@@ -17,6 +11,6 @@ exports.formatOrderReference = formatOrderReference;
17
11
  */
18
12
  const renderMoney = (money, amount = money.amount) => {
19
13
  const parts = (0, format_1.formatMoneyParts)({ amount, currencyCode: money.currency_code });
20
- return `<span class="money"><span class="currency">${(0, exports.escapeHtml)(parts.currency)}</span> <span class="amount">${(0, exports.escapeHtml)(parts.amount)}</span></span>`;
14
+ return `<span class="money"><span class="currency">${(0, lib_1.escapeHtml)(parts.currency)}</span> <span class="amount">${(0, lib_1.escapeHtml)(parts.amount)}</span></span>`;
21
15
  };
22
16
  exports.renderMoney = renderMoney;
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createDocumentLayout = exports.formatCountryName = void 0;
4
- const html_utils_1 = require("./html-utils");
4
+ const lib_1 = require("../../shared/lib");
5
5
  const formatCountryName = (countryCode) => new Intl.DisplayNames("de", { type: "region" }).of(countryCode.toUpperCase()) ?? countryCode.toUpperCase();
6
6
  exports.formatCountryName = formatCountryName;
7
7
  const joinLines = (lines) => lines
8
8
  .filter((line) => Boolean(line))
9
- .map(html_utils_1.escapeHtml)
9
+ .map(lib_1.escapeHtml)
10
10
  .join("<br />");
11
11
  const renderFooterColumn = (heading, lines) => {
12
12
  const content = joinLines(lines);
@@ -14,7 +14,7 @@ const renderFooterColumn = (heading, lines) => {
14
14
  return "";
15
15
  }
16
16
  const title = heading
17
- ? `<div class="footer-heading">${(0, html_utils_1.escapeHtml)(heading)}</div>`
17
+ ? `<div class="footer-heading">${(0, lib_1.escapeHtml)(heading)}</div>`
18
18
  : "";
19
19
  return `<div class="footer-column">${title}${content}</div>`;
20
20
  };
@@ -24,7 +24,7 @@ const renderFooterColumn = (heading, lines) => {
24
24
  * sender's name and address.
25
25
  */
26
26
  const renderMerchantFooter = (merchant, includeLegalDetails) => {
27
- const sender = `<div class="footer-column"><strong>${(0, html_utils_1.escapeHtml)(merchant.legal_name)}</strong><br />${joinLines([
27
+ const sender = `<div class="footer-column"><strong>${(0, lib_1.escapeHtml)(merchant.legal_name)}</strong><br />${joinLines([
28
28
  merchant.address_line1,
29
29
  merchant.address_line2,
30
30
  `${merchant.postal_code} ${merchant.city}`,
@@ -59,10 +59,10 @@ const renderMerchantFooter = (merchant, includeLegalDetails) => {
59
59
  ].join("");
60
60
  };
61
61
  const renderLetterhead = (merchant, settings) => settings.logo_src
62
- ? `<img class="logo" src="${(0, html_utils_1.escapeHtml)(settings.logo_src)}" alt="${(0, html_utils_1.escapeHtml)(merchant.legal_name)}" />`
63
- : `<div class="logo-text">${(0, html_utils_1.escapeHtml)(merchant.legal_name)}</div>`;
62
+ ? `<img class="logo" src="${(0, lib_1.escapeHtml)(settings.logo_src)}" alt="${(0, lib_1.escapeHtml)(merchant.legal_name)}" />`
63
+ : `<div class="logo-text">${(0, lib_1.escapeHtml)(merchant.legal_name)}</div>`;
64
64
  const renderMetadata = (metadata) => metadata
65
- .map(({ label, value }) => `<tr><th scope="row">${(0, html_utils_1.escapeHtml)(label)}</th><td>${(0, html_utils_1.escapeHtml)(value)}</td></tr>`)
65
+ .map(({ label, value }) => `<tr><th scope="row">${(0, lib_1.escapeHtml)(label)}</th><td>${(0, lib_1.escapeHtml)(value)}</td></tr>`)
66
66
  .join("");
67
67
  /**
68
68
  * A4 with only a bottom page margin, which holds the page number
@@ -112,6 +112,25 @@ const DEFAULT_STYLESHEET = `
112
112
  .footer-column { flex: 1 1 0; }
113
113
  .footer-heading { color: var(--muted); }
114
114
  `;
115
+ const COLOR_TOKENS = {
116
+ accent: "--accent",
117
+ text: "--text",
118
+ muted: "--muted",
119
+ line: "--line",
120
+ surface: "--table-head",
121
+ };
122
+ const HEX_COLOR = /^#[0-9a-f]{6}$/;
123
+ /**
124
+ * The shop's appearance colors as a `:root` block that overrides the default
125
+ * tokens; only set, well-formed values are emitted (empty = no block, so the
126
+ * stylesheet stays the default).
127
+ */
128
+ const renderColorTokens = (colors) => {
129
+ const declarations = Object.keys(COLOR_TOKENS)
130
+ .filter((token) => HEX_COLOR.test(colors[token] ?? ""))
131
+ .map((token) => `${COLOR_TOKENS[token]}: ${colors[token]};`);
132
+ return declarations.length ? `\n :root { ${declarations.join(" ")} }\n` : "";
133
+ };
115
134
  /**
116
135
  * `includeLegalDetails` adds UID, company register, contact and bank details
117
136
  * to the footer (financial documents); packing lists show only the sender.
@@ -120,8 +139,8 @@ const createDocumentLayout = (merchant, settings, includeLegalDetails, theme = {
120
139
  <html lang="de">
121
140
  <head>
122
141
  <meta charset="utf-8" />
123
- <title>${(0, html_utils_1.escapeHtml)(pageTitle)} ${(0, html_utils_1.escapeHtml)(number)}</title>
124
- <style>${DEFAULT_STYLESHEET}${theme.stylesheet ?? ""}</style>
142
+ <title>${(0, lib_1.escapeHtml)(pageTitle)} ${(0, lib_1.escapeHtml)(number)}</title>
143
+ <style>${DEFAULT_STYLESHEET}${renderColorTokens(settings.colors)}${theme.stylesheet ?? ""}</style>
125
144
  </head>
126
145
  <body>
127
146
  <footer class="page-footer">${renderMerchantFooter(merchant, includeLegalDetails)}</footer>
@@ -130,7 +149,7 @@ const createDocumentLayout = (merchant, settings, includeLegalDetails, theme = {
130
149
  <section class="document-head">
131
150
  <address class="recipient">${recipient ?? ""}</address>
132
151
  <div class="document-info">
133
- <h1>${(0, html_utils_1.escapeHtml)(documentTitle)}</h1>
152
+ <h1>${(0, lib_1.escapeHtml)(documentTitle)}</h1>
134
153
  <table class="document-metadata"><tbody>${renderMetadata(metadata)}</tbody></table>
135
154
  </div>
136
155
  </section>
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderPackingList = void 0;
4
4
  const format_1 = require("./format");
5
+ const lib_1 = require("../../shared/lib");
5
6
  const html_utils_1 = require("./html-utils");
6
7
  const renderBatchAllocations = (line, timeZone) => {
7
8
  if (line.batch_allocations.length === 0) {
@@ -9,20 +10,20 @@ const renderBatchAllocations = (line, timeZone) => {
9
10
  }
10
11
  return line.batch_allocations
11
12
  .map((allocation) => `<div class="packing-batch">
12
- <strong>${(0, html_utils_1.escapeHtml)(allocation.lot_number)}</strong>
13
- <span>MHD: ${(0, html_utils_1.escapeHtml)((0, format_1.formatDocumentDate)(allocation.expiry_date, timeZone))}</span>
14
- <span>Menge: ${(0, html_utils_1.escapeHtml)(allocation.quantity)}</span>
13
+ <strong>${(0, lib_1.escapeHtml)(allocation.lot_number)}</strong>
14
+ <span>MHD: ${(0, lib_1.escapeHtml)((0, format_1.formatDocumentDate)(allocation.expiry_date, timeZone))}</span>
15
+ <span>Menge: ${(0, lib_1.escapeHtml)(allocation.quantity)}</span>
15
16
  </div>`)
16
17
  .join("");
17
18
  };
18
19
  const renderLines = (input, timeZone) => input.lines
19
20
  .map((line) => `<tr>
20
21
  <td class="item">
21
- <div class="item-title">${(0, html_utils_1.escapeHtml)(line.title)}</div>
22
- ${line.sku ? `<div class="sku">SKU: ${(0, html_utils_1.escapeHtml)(line.sku)}</div>` : ""}
22
+ <div class="item-title">${(0, lib_1.escapeHtml)(line.title)}</div>
23
+ ${line.sku ? `<div class="sku">SKU: ${(0, lib_1.escapeHtml)(line.sku)}</div>` : ""}
23
24
  </td>
24
25
  <td>${renderBatchAllocations(line, timeZone)}</td>
25
- <td class="number">${(0, html_utils_1.escapeHtml)(line.quantity)}</td>
26
+ <td class="number">${(0, lib_1.escapeHtml)(line.quantity)}</td>
26
27
  </tr>`)
27
28
  .join("");
28
29
  const renderPackingList = (input, layout, timeZone) => layout({
@@ -1,3 +1,4 @@
1
+ import type { ShopAppearanceColors } from "../../public";
1
2
  export type DocumentKind = "invoice" | "cancellation" | "credit_note";
2
3
  export type DocumentStatus = "processing" | "issued" | "failed";
3
4
  export type ShipmentInvoiceDecision = "pending" | "carrier" | "non_carrier";
@@ -146,13 +147,18 @@ export type DocumentMerchant = {
146
147
  };
147
148
  export type DocumentRenderSettings = {
148
149
  /**
149
- * The uploaded logo as a `data:` URL, ready for `<img src>`; `null` when no
150
+ * The shop's logo (Shop-Stammdaten, Erscheinungsbild) as a `data:` URL, ready for `<img src>`; `null` when no
150
151
  * logo is set or it could not be loaded (the document then shows the
151
152
  * merchant's legal name instead).
152
153
  */
153
154
  logo_src: string | null;
154
155
  /** Payment terms printed below the totals of an invoice; `null` = none. */
155
156
  payment_terms: string | null;
157
+ /**
158
+ * The shop's appearance colors (`#rrggbb`); only the set ones. A color that
159
+ * is missing keeps the default stylesheet's value.
160
+ */
161
+ colors: ShopAppearanceColors;
156
162
  };
157
163
  export type FinancialDocumentRenderInput = DocumentTemplateInput & {
158
164
  merchant: DocumentMerchant;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveSmtp = exports.SMTP_BUILD_PLACEHOLDERS = exports.SMTP_ENVIRONMENT_VARIABLES = exports.defineShopEmailConfiguration = exports.createSmtpNotificationModuleConfig = void 0;
4
+ const config_1 = require("../../public/config");
4
5
  const sender_1 = require("../domain/sender");
5
6
  var notification_module_1 = require("./notification-module");
6
7
  Object.defineProperty(exports, "createSmtpNotificationModuleConfig", { enumerable: true, get: function () { return notification_module_1.createSmtpNotificationModuleConfig; } });
@@ -29,38 +30,13 @@ exports.SMTP_BUILD_PLACEHOLDERS = {
29
30
  SMTP_SECURE: "false",
30
31
  SMTP_USER: "build-user",
31
32
  };
32
- const optionalValue = (values, name) => {
33
- const value = values[name]?.trim();
34
- return value ? value : undefined;
35
- };
36
- const integerValue = (values, name, minimum, maximum) => {
37
- const value = optionalValue(values, name);
38
- if (value === undefined) {
39
- return undefined;
40
- }
41
- const parsed = Number(value);
42
- if (!Number.isInteger(parsed) || parsed < minimum || parsed > maximum) {
43
- throw new TypeError(`${name} must be an integer from ${minimum} through ${maximum}.`);
44
- }
45
- return parsed;
46
- };
47
- const booleanValue = (values, name, defaultValue) => {
48
- const value = optionalValue(values, name);
49
- if (value === undefined) {
50
- return defaultValue;
51
- }
52
- if (value !== "true" && value !== "false") {
53
- throw new TypeError(`${name} must be either "true" or "false".`);
54
- }
55
- return value === "true";
56
- };
57
33
  /**
58
34
  * Validates the SMTP environment values and returns the transport
59
35
  * configuration. `allowInsecure` permits plain SMTP for development, tests
60
36
  * and builds; otherwise `SMTP_SECURE` or `SMTP_REQUIRE_TLS` must be `true`.
61
37
  */
62
38
  const resolveSmtp = (values, allowInsecure) => {
63
- const port = integerValue(values, "SMTP_PORT", 1, 65535);
39
+ const port = (0, config_1.integerEnvironment)(values, "SMTP_PORT", 1, 65535);
64
40
  if (port === undefined) {
65
41
  throw new TypeError("SMTP_PORT is required.");
66
42
  }
@@ -74,8 +50,8 @@ const resolveSmtp = (values, allowInsecure) => {
74
50
  host: values.SMTP_HOST,
75
51
  password: values.SMTP_PASSWORD,
76
52
  port,
77
- requireTls: booleanValue(values, "SMTP_REQUIRE_TLS", false),
78
- secure: booleanValue(values, "SMTP_SECURE", false),
53
+ requireTls: (0, config_1.booleanEnvironment)(values, "SMTP_REQUIRE_TLS", false),
54
+ secure: (0, config_1.booleanEnvironment)(values, "SMTP_SECURE", false),
79
55
  user: values.SMTP_USER,
80
56
  };
81
57
  if (!smtp.secure && !smtp.requireTls && !allowInsecure) {
@@ -1,4 +1,4 @@
1
- import type { ShopMasterData } from "../../public";
1
+ import type { ShopAppearanceColors, ShopMasterData } from "../../public";
2
2
  import type { EmailKind } from "./email-kinds";
3
3
  import type { EmailRenderDataMap } from "./template-data";
4
4
  export type EmailTemplateContent = Readonly<{
@@ -7,12 +7,13 @@ export type EmailTemplateContent = Readonly<{
7
7
  text: string;
8
8
  }>;
9
9
  /**
10
- * The shop's master data ("Shop-Stammdaten") plus the `logo` URL of the
11
- * E-Mail settings, read when the mail is sent. Every field may be missing; a
12
- * layout shows what is there instead of failing.
10
+ * The shop's master data ("Shop-Stammdaten") plus its appearance
11
+ * ("Erscheinungsbild": `logo` URL and `colors`), read when the mail is sent.
12
+ * Every field may be missing; a layout shows what is there instead of failing.
13
13
  */
14
14
  export type EmailShopDetails = Readonly<ShopMasterData & {
15
15
  logo?: string;
16
+ colors: ShopAppearanceColors;
16
17
  }>;
17
18
  /** Who reads a mail: a customer or the shop's own team. */
18
19
  export type EmailAudience = "customer" | "shop";
@@ -24,7 +25,7 @@ export type EmailLayout = (input: Readonly<{
24
25
  shop: EmailShopDetails;
25
26
  }>) => string;
26
27
  export type EmailRendererMap = {
27
- readonly [Kind in EmailKind]: (data: EmailRenderDataMap[Kind]) => EmailTemplateContent;
28
+ readonly [Kind in EmailKind]: (data: EmailRenderDataMap[Kind], shop: EmailShopDetails) => EmailTemplateContent;
28
29
  };
29
30
  /**
30
31
  * What a shop configures. `layout` and `renderers` are optional overrides of
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveExpirationStrategy = exports.resolveS3Credentials = exports.S3_BUILD_PLACEHOLDERS = exports.createS3CacheStorageConfig = exports.createS3CacheFileModuleConfig = exports.validateS3CacheProviderOptions = void 0;
4
+ const config_1 = require("../../public/config");
4
5
  const PACKAGE_NAME = "medusa-s3-cache-storage";
5
6
  const DEFAULT_CACHE = {
6
7
  cleanupIntervalMs: 900_000,
@@ -205,10 +206,6 @@ exports.S3_BUILD_PLACEHOLDERS = {
205
206
  S3_CACHE_STORAGE_BUCKET: "build-bucket",
206
207
  S3_CACHE_STORAGE_REGION: "build-placeholder",
207
208
  };
208
- const optionalEnvironment = (environment, name) => {
209
- const value = environment[name]?.trim();
210
- return value ? value : undefined;
211
- };
212
209
  /**
213
210
  * Static S3 credentials are optional (the AWS credential chain applies
214
211
  * otherwise) but must be complete when present. They are never read during
@@ -218,9 +215,9 @@ const resolveS3Credentials = (environment, phase) => {
218
215
  if (phase === "build") {
219
216
  return undefined;
220
217
  }
221
- const accessKeyId = optionalEnvironment(environment, "S3_CACHE_STORAGE_ACCESS_KEY_ID");
222
- const secretAccessKey = optionalEnvironment(environment, "S3_CACHE_STORAGE_SECRET_ACCESS_KEY");
223
- const sessionToken = optionalEnvironment(environment, "S3_CACHE_STORAGE_SESSION_TOKEN");
218
+ const accessKeyId = (0, config_1.optionalEnvironment)(environment, "S3_CACHE_STORAGE_ACCESS_KEY_ID");
219
+ const secretAccessKey = (0, config_1.optionalEnvironment)(environment, "S3_CACHE_STORAGE_SECRET_ACCESS_KEY");
220
+ const sessionToken = (0, config_1.optionalEnvironment)(environment, "S3_CACHE_STORAGE_SESSION_TOKEN");
224
221
  // A declared but blank key still counts: it signals intended static
225
222
  // credentials, which must then be complete.
226
223
  if (!("S3_CACHE_STORAGE_ACCESS_KEY_ID" in environment) &&
@@ -243,7 +240,7 @@ const resolveS3Credentials = (environment, phase) => {
243
240
  };
244
241
  exports.resolveS3Credentials = resolveS3Credentials;
245
242
  const resolveExpirationStrategy = (environment, defaultValue) => {
246
- const value = optionalEnvironment(environment, "S3_CACHE_STORAGE_EXPIRATION_STRATEGY");
243
+ const value = (0, config_1.optionalEnvironment)(environment, "S3_CACHE_STORAGE_EXPIRATION_STRATEGY");
247
244
  if (value === undefined) {
248
245
  return defaultValue;
249
246
  }
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveDocumentPluginOptions = exports.DEFAULT_NUMBERING_TIME_ZONE = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
+ const lib_1 = require("../../../shared/lib");
5
6
  const html_factory_1 = require("../../../documents/templates/html-factory");
6
7
  /** Used when the `documents.numbering.timeZone` option is not given. */
7
8
  exports.DEFAULT_NUMBERING_TIME_ZONE = "Europe/Vienna";
@@ -13,10 +14,7 @@ const resolveDocumentPluginOptions = (options) => {
13
14
  if (!timeZone) {
14
15
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The documents plugin requires a numbering time zone.");
15
16
  }
16
- try {
17
- new Intl.DateTimeFormat("en", { timeZone }).format();
18
- }
19
- catch {
17
+ if (!(0, lib_1.isValidTimeZone)(timeZone)) {
20
18
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `The documents numbering time zone '${timeZone}' is invalid.`);
21
19
  }
22
20
  if (options?.htmlFactory !== undefined &&
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validatePluginFeatureDescriptor = validatePluginFeatureDescriptor;
4
4
  exports.definePluginFeatures = definePluginFeatures;
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
+ const lib_1 = require("../shared/lib");
6
7
  const KEY_PATTERN = /^[a-z][a-z0-9_]{0,62}$/;
7
8
  const SETTING_TYPES = new Set([
8
9
  "string",
@@ -12,30 +13,24 @@ const SETTING_TYPES = new Set([
12
13
  "secret",
13
14
  "select",
14
15
  "image",
16
+ "color",
15
17
  ]);
18
+ const HEX_COLOR_PATTERN = /^#[0-9a-f]{6}$/;
16
19
  const ACTION_MODES = new Set(["sync", "background"]);
17
20
  const ADMIN_PAGE_PREFIX = "/settings/hartl-services/";
18
21
  const BASE_PAGE_PREFIX = "/settings/hartl-services/plugin/";
19
22
  const ADMIN_PAGE_PATTERN = /^\/settings\/hartl-services(\/[a-z0-9][a-z0-9_-]*)+$/;
20
- const isHttpUrl = (value) => {
21
- try {
22
- const url = new URL(value);
23
- return url.protocol === "http:" || url.protocol === "https:";
24
- }
25
- catch {
26
- return false;
27
- }
28
- };
29
23
  const invalid = (pluginKey, message) => new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Ungültige Funktionsschalter für Plugin "${pluginKey}": ${message}`);
30
- const hasText = (value) => typeof value === "string" && value.trim().length > 0;
31
24
  const defaultMatchesType = (setting) => {
32
25
  const value = setting.default;
33
26
  switch (setting.type) {
34
27
  case "string":
35
- return hasText(value);
28
+ return (0, lib_1.isNonEmptyString)(value);
36
29
  case "url":
37
30
  case "image":
38
- return typeof value === "string" && isHttpUrl(value);
31
+ return typeof value === "string" && (0, lib_1.isHttpUrl)(value);
32
+ case "color":
33
+ return typeof value === "string" && HEX_COLOR_PATTERN.test(value);
39
34
  case "number":
40
35
  return typeof value === "number" && Number.isFinite(value);
41
36
  case "boolean":
@@ -60,7 +55,7 @@ const validateTypeExtras = (pluginKey, setting) => {
60
55
  }
61
56
  const values = new Set();
62
57
  for (const option of options) {
63
- if (!hasText(option?.value) || !hasText(option?.label)) {
58
+ if (!(0, lib_1.isNonEmptyString)(option?.value) || !(0, lib_1.isNonEmptyString)(option?.label)) {
64
59
  throw invalid(pluginKey, `Auswahl "${setting.key}" hat eine Option ohne value oder label.`);
65
60
  }
66
61
  if (values.has(option.value)) {
@@ -126,9 +121,12 @@ const validateSettings = (pluginKey, settings) => {
126
121
  throw invalid(pluginKey, `Einstellungs-Key "${setting.key}" ist doppelt.`);
127
122
  }
128
123
  seen.add(setting.key);
129
- if (!hasText(setting.label)) {
124
+ if (!(0, lib_1.isNonEmptyString)(setting.label)) {
130
125
  throw invalid(pluginKey, `Einstellung "${setting.key}" hat kein label.`);
131
126
  }
127
+ if (setting.group !== undefined && !(0, lib_1.isNonEmptyString)(setting.group)) {
128
+ throw invalid(pluginKey, `Einstellung "${setting.key}": group muss ein nicht-leerer Text sein.`);
129
+ }
132
130
  if (!SETTING_TYPES.has(setting.type)) {
133
131
  throw invalid(pluginKey, `Einstellung "${setting.key}" hat einen unbekannten Typ.`);
134
132
  }
@@ -161,16 +159,16 @@ const validateActions = (pluginKey, actions) => {
161
159
  throw invalid(pluginKey, `Aktions-Key "${action.key}" ist doppelt.`);
162
160
  }
163
161
  seen.add(action.key);
164
- if (!hasText(action.label)) {
162
+ if (!(0, lib_1.isNonEmptyString)(action.label)) {
165
163
  throw invalid(pluginKey, `Aktion "${action.key}" hat kein label.`);
166
164
  }
167
- if (!hasText(action.workflow_id)) {
165
+ if (!(0, lib_1.isNonEmptyString)(action.workflow_id)) {
168
166
  throw invalid(pluginKey, `Aktion "${action.key}" hat keine workflow_id.`);
169
167
  }
170
168
  if (!ACTION_MODES.has(action.mode)) {
171
169
  throw invalid(pluginKey, `Aktion "${action.key}" hat einen unbekannten Modus.`);
172
170
  }
173
- if (action.confirm !== undefined && !hasText(action.confirm)) {
171
+ if (action.confirm !== undefined && !(0, lib_1.isNonEmptyString)(action.confirm)) {
174
172
  throw invalid(pluginKey, `Aktion "${action.key}": confirm ist leer.`);
175
173
  }
176
174
  }
@@ -1,4 +1,4 @@
1
- import type { MedusaRequestHandler } from "@medusajs/framework/http";
1
+ import type { MiddlewareRoute, MedusaRequestHandler } from "@medusajs/framework/http";
2
2
  import type { MedusaContainer } from "@medusajs/framework/types";
3
3
  import type { PluginFeatureDescriptor } from "./types";
4
4
  /**
@@ -18,3 +18,23 @@ export declare function isPluginFeatureEnabledByKey(container: MedusaContainer,
18
18
  * with `NOT_FOUND` (404); all given keys must be enabled.
19
19
  */
20
20
  export declare function requirePluginFeature<K extends string>(descriptor: PluginFeatureDescriptor<K>, ...keys: K[]): MedusaRequestHandler;
21
+ /**
22
+ * Route-gate factory for a plugin's `api/middlewares.ts`: bind the descriptor
23
+ * once, then declare one entry per matcher. Without `methods` Medusa
24
+ * registers the entry with `app.use`, i.e. as a prefix match that runs before
25
+ * every method-specific middleware (authentication included), so a disabled
26
+ * feature answers 404 for the route and everything below it. Without keys
27
+ * only the plugin switch is checked; several keys must all be enabled.
28
+ *
29
+ * ```ts
30
+ * const gate = pluginFeatureGate(affiliatePluginFeatures)
31
+ * routes: [gate("/store/affiliates"), gate("/admin/consignment-reports", "consignment")]
32
+ * ```
33
+ */
34
+ export declare const pluginFeatureGate: <K extends string>(descriptor: PluginFeatureDescriptor<K>) => (matcher: string, ...keys: K[]) => MiddlewareRoute;
35
+ /**
36
+ * Filter for subscribers of `plugin-features.updated.v1`,
37
+ * `plugin-settings.updated.v1` and the like: whether the event concerns the
38
+ * given plugin. Never throws; a malformed payload is not "own".
39
+ */
40
+ export declare const isOwnPluginEvent: (data: unknown, pluginKey: string) => boolean;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isOwnPluginEvent = exports.pluginFeatureGate = void 0;
3
4
  exports.isPluginFeatureEnabled = isPluginFeatureEnabled;
4
5
  exports.isPluginFeatureEnabledByKey = isPluginFeatureEnabledByKey;
5
6
  exports.requirePluginFeature = requirePluginFeature;
@@ -58,3 +59,30 @@ function requirePluginFeature(descriptor, ...keys) {
58
59
  next();
59
60
  };
60
61
  }
62
+ /**
63
+ * Route-gate factory for a plugin's `api/middlewares.ts`: bind the descriptor
64
+ * once, then declare one entry per matcher. Without `methods` Medusa
65
+ * registers the entry with `app.use`, i.e. as a prefix match that runs before
66
+ * every method-specific middleware (authentication included), so a disabled
67
+ * feature answers 404 for the route and everything below it. Without keys
68
+ * only the plugin switch is checked; several keys must all be enabled.
69
+ *
70
+ * ```ts
71
+ * const gate = pluginFeatureGate(affiliatePluginFeatures)
72
+ * routes: [gate("/store/affiliates"), gate("/admin/consignment-reports", "consignment")]
73
+ * ```
74
+ */
75
+ const pluginFeatureGate = (descriptor) => (matcher, ...keys) => ({
76
+ matcher,
77
+ middlewares: [requirePluginFeature(descriptor, ...keys)],
78
+ });
79
+ exports.pluginFeatureGate = pluginFeatureGate;
80
+ /**
81
+ * Filter for subscribers of `plugin-features.updated.v1`,
82
+ * `plugin-settings.updated.v1` and the like: whether the event concerns the
83
+ * given plugin. Never throws; a malformed payload is not "own".
84
+ */
85
+ const isOwnPluginEvent = (data, pluginKey) => typeof data === "object" &&
86
+ data !== null &&
87
+ data.plugin_key === pluginKey;
88
+ exports.isOwnPluginEvent = isOwnPluginEvent;
@@ -1,9 +1,10 @@
1
1
  export { PLUGIN_FEATURES_MODULE } from "./constants";
2
2
  export { definePluginFeatures } from "./descriptor";
3
3
  export { resolveEffectivePluginFeatures } from "./effective-features";
4
- export { isPluginFeatureEnabled, isPluginFeatureEnabledByKey, requirePluginFeature, } from "./enforcement";
4
+ export { isOwnPluginEvent, isPluginFeatureEnabled, isPluginFeatureEnabledByKey, pluginFeatureGate, requirePluginFeature, } from "./enforcement";
5
+ export { isBasePluginRegistered, resolveBaseModule } from "./module-access";
5
6
  export { getPluginSettings } from "./settings";
6
- export { getShopMasterData, shopMasterDataDescriptor, type ResolvedShopMasterData, type ShopMasterData, type ShopMasterDataKey, } from "./shop-master-data";
7
+ export { getShopAppearance, getShopMasterData, shopMasterDataDescriptor, type ResolvedShopMasterData, type ShopAppearance, type ShopAppearanceColors, type ShopMasterData, type ShopMasterDataKey, } from "./shop-master-data";
7
8
  export { reportPluginActionProgress, type PluginActionProgress, } from "./action-progress";
8
9
  export type { BasePluginOptions, EffectivePluginFeatures, PluginActionDefinition, PluginActionMode, PluginActionProgressInput, PluginActionWorkflowInput, PluginFeatureDefinition, PluginFeatureDescriptor, PluginFeatureProvider, PluginSettingDefinition, PluginSettingOption, PluginSettingsFallback, PluginSettingType, PluginSettingValue, ResolvedPluginSettings, } from "./types";
9
10
  export type { CompleteCartHookDeclarations, CompleteCartHookName, CompleteCartOrderCreatedInput, CompleteCartParticipant, CompleteCartParticipantStep, CompleteCartValidateInput, } from "./complete-cart";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.reportPluginActionProgress = exports.shopMasterDataDescriptor = exports.getShopMasterData = exports.getPluginSettings = exports.requirePluginFeature = exports.isPluginFeatureEnabledByKey = exports.isPluginFeatureEnabled = exports.resolveEffectivePluginFeatures = exports.definePluginFeatures = exports.PLUGIN_FEATURES_MODULE = void 0;
3
+ exports.reportPluginActionProgress = exports.shopMasterDataDescriptor = exports.getShopMasterData = exports.getShopAppearance = exports.getPluginSettings = exports.resolveBaseModule = exports.isBasePluginRegistered = exports.requirePluginFeature = exports.pluginFeatureGate = exports.isPluginFeatureEnabledByKey = exports.isPluginFeatureEnabled = exports.isOwnPluginEvent = exports.resolveEffectivePluginFeatures = exports.definePluginFeatures = exports.PLUGIN_FEATURES_MODULE = void 0;
4
4
  var constants_1 = require("./constants");
5
5
  Object.defineProperty(exports, "PLUGIN_FEATURES_MODULE", { enumerable: true, get: function () { return constants_1.PLUGIN_FEATURES_MODULE; } });
6
6
  var descriptor_1 = require("./descriptor");
@@ -8,12 +8,18 @@ Object.defineProperty(exports, "definePluginFeatures", { enumerable: true, get:
8
8
  var effective_features_1 = require("./effective-features");
9
9
  Object.defineProperty(exports, "resolveEffectivePluginFeatures", { enumerable: true, get: function () { return effective_features_1.resolveEffectivePluginFeatures; } });
10
10
  var enforcement_1 = require("./enforcement");
11
+ Object.defineProperty(exports, "isOwnPluginEvent", { enumerable: true, get: function () { return enforcement_1.isOwnPluginEvent; } });
11
12
  Object.defineProperty(exports, "isPluginFeatureEnabled", { enumerable: true, get: function () { return enforcement_1.isPluginFeatureEnabled; } });
12
13
  Object.defineProperty(exports, "isPluginFeatureEnabledByKey", { enumerable: true, get: function () { return enforcement_1.isPluginFeatureEnabledByKey; } });
14
+ Object.defineProperty(exports, "pluginFeatureGate", { enumerable: true, get: function () { return enforcement_1.pluginFeatureGate; } });
13
15
  Object.defineProperty(exports, "requirePluginFeature", { enumerable: true, get: function () { return enforcement_1.requirePluginFeature; } });
16
+ var module_access_1 = require("./module-access");
17
+ Object.defineProperty(exports, "isBasePluginRegistered", { enumerable: true, get: function () { return module_access_1.isBasePluginRegistered; } });
18
+ Object.defineProperty(exports, "resolveBaseModule", { enumerable: true, get: function () { return module_access_1.resolveBaseModule; } });
14
19
  var settings_1 = require("./settings");
15
20
  Object.defineProperty(exports, "getPluginSettings", { enumerable: true, get: function () { return settings_1.getPluginSettings; } });
16
21
  var shop_master_data_1 = require("./shop-master-data");
22
+ Object.defineProperty(exports, "getShopAppearance", { enumerable: true, get: function () { return shop_master_data_1.getShopAppearance; } });
17
23
  Object.defineProperty(exports, "getShopMasterData", { enumerable: true, get: function () { return shop_master_data_1.getShopMasterData; } });
18
24
  Object.defineProperty(exports, "shopMasterDataDescriptor", { enumerable: true, get: function () { return shop_master_data_1.shopMasterDataDescriptor; } });
19
25
  var action_progress_1 = require("./action-progress");