@hartl-services/medusa-base 0.3.0 → 1.0.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 (323) hide show
  1. package/.medusa/server/src/admin/index.js +2164 -29
  2. package/.medusa/server/src/admin/index.mjs +2166 -31
  3. package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
  4. package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
  5. package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
  6. package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
  7. package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
  8. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
  9. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
  10. package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
  11. package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
  12. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
  13. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
  14. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
  15. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/route.js +31 -0
  16. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/runs/route.js +16 -0
  17. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/route.js +14 -0
  18. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/settings/route.js +22 -0
  19. package/.medusa/server/src/api/admin/plugin-features/route.js +6 -4
  20. package/.medusa/server/src/api/document-download-response.js +16 -0
  21. package/.medusa/server/src/api/document-response.js +23 -0
  22. package/.medusa/server/src/api/files/[asset]/route.js +24 -0
  23. package/.medusa/server/src/api/files/file-response.js +43 -0
  24. package/.medusa/server/src/api/files/gateway-options.js +31 -0
  25. package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
  26. package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
  27. package/.medusa/server/src/api/middlewares.js +186 -5
  28. package/.medusa/server/src/api/packing-list-response.js +22 -0
  29. package/.medusa/server/src/api/plugin-actions.js +221 -0
  30. package/.medusa/server/src/api/plugin-features-http.js +67 -8
  31. package/.medusa/server/src/api/route.js +27 -0
  32. package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
  33. package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
  34. package/.medusa/server/src/api/store/documents/route.js +11 -0
  35. package/.medusa/server/src/api/terms-download-response.js +12 -0
  36. package/.medusa/server/src/documents/config/index.js +18 -0
  37. package/.medusa/server/src/documents/paths/documents.js +6 -0
  38. package/.medusa/server/src/documents/paths/index.js +18 -0
  39. package/.medusa/server/src/documents/plugin-features.js +24 -0
  40. package/.medusa/server/src/documents/schemas/documents.js +18 -0
  41. package/.medusa/server/src/documents/schemas/index.js +18 -0
  42. package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
  43. package/.medusa/server/src/documents/templates/financial-document.js +142 -0
  44. package/.medusa/server/src/documents/templates/format.js +31 -0
  45. package/.medusa/server/src/documents/templates/html-factory.js +40 -0
  46. package/.medusa/server/src/documents/templates/html-utils.js +13 -0
  47. package/.medusa/server/src/documents/templates/layout.js +97 -0
  48. package/.medusa/server/src/documents/templates/packing-list.js +50 -0
  49. package/.medusa/server/src/documents/types/admin-api.js +3 -0
  50. package/.medusa/server/src/documents/types/document-summary.js +3 -0
  51. package/.medusa/server/src/documents/types/documents.js +3 -0
  52. package/.medusa/server/src/documents/types/html-factory.js +6 -0
  53. package/.medusa/server/src/documents/types/index.js +22 -0
  54. package/.medusa/server/src/documents/types/store-api.js +3 -0
  55. package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
  56. package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
  57. package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
  58. package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
  59. package/.medusa/server/src/email/application/handle-invite-event.js +312 -0
  60. package/.medusa/server/src/email/application/handle-password-reset-event.js +354 -0
  61. package/.medusa/server/src/email/config/index.js +84 -0
  62. package/.medusa/server/src/email/config/notification-module.js +20 -0
  63. package/.medusa/server/src/email/domain/business-keys.js +50 -0
  64. package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
  65. package/.medusa/server/src/email/domain/event-schemas.js +36 -0
  66. package/.medusa/server/src/email/domain/failure-classification.js +53 -0
  67. package/.medusa/server/src/email/plugin-features.js +31 -0
  68. package/.medusa/server/src/email/rendering/default-templates.js +91 -0
  69. package/.medusa/server/src/email/rendering/render-email.js +37 -0
  70. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +48 -0
  71. package/.medusa/server/src/email/types/email-kinds.js +18 -0
  72. package/.medusa/server/src/email/types/index.js +21 -0
  73. package/.medusa/server/src/email/types/shop-configuration.js +3 -0
  74. package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
  75. package/.medusa/server/src/email/types/template-data.js +79 -0
  76. package/.medusa/server/src/files/config/index.js +256 -0
  77. package/.medusa/server/src/files/gateway/index.js +115 -0
  78. package/.medusa/server/src/files/types/index.js +6 -0
  79. package/.medusa/server/src/files/types/public.js +6 -0
  80. package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
  81. package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
  82. package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
  83. package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
  84. package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
  85. package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
  86. package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
  87. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
  88. package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
  89. package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
  90. package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
  91. package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
  92. package/.medusa/server/src/modules/documents/domain/options.js +40 -0
  93. package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
  94. package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
  95. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
  96. package/.medusa/server/src/modules/documents/index.js +15 -0
  97. package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
  98. package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
  99. package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
  100. package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
  101. package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
  102. package/.medusa/server/src/modules/documents/models/document.js +82 -0
  103. package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
  104. package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
  105. package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
  106. package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
  107. package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
  108. package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
  109. package/.medusa/server/src/modules/documents/service.js +1701 -0
  110. package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
  111. package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
  112. package/.medusa/server/src/modules/email/index.js +13 -0
  113. package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
  114. package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
  115. package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
  116. package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
  117. package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
  118. package/.medusa/server/src/modules/email/models/email-message.js +71 -0
  119. package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
  120. package/.medusa/server/src/modules/email/service.js +1285 -0
  121. package/.medusa/server/src/modules/plugin-features/domain/plugin-action-runs.js +92 -0
  122. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +213 -0
  123. package/.medusa/server/src/modules/plugin-features/domain/secret-box.js +56 -0
  124. package/.medusa/server/src/modules/plugin-features/migrations/Migration20260928205031.js +16 -0
  125. package/.medusa/server/src/modules/plugin-features/migrations/Migration20260928215428.js +17 -0
  126. package/.medusa/server/src/modules/plugin-features/models/plugin-action-run.js +43 -0
  127. package/.medusa/server/src/modules/plugin-features/models/plugin-setting-state.js +32 -0
  128. package/.medusa/server/src/modules/plugin-features/service.js +419 -17
  129. package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
  130. package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
  131. package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
  132. package/.medusa/server/src/providers/s3-cache/index.js +8 -0
  133. package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
  134. package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
  135. package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
  136. package/.medusa/server/src/providers/smtp/index.js +8 -0
  137. package/.medusa/server/src/providers/smtp/service.js +236 -0
  138. package/.medusa/server/src/providers/smtp/types.js +11 -0
  139. package/.medusa/server/src/public/action-progress.js +67 -0
  140. package/.medusa/server/src/public/config.js +186 -0
  141. package/.medusa/server/src/public/descriptor.js +199 -2
  142. package/.medusa/server/src/public/effective-features.js +9 -5
  143. package/.medusa/server/src/public/enforcement.js +18 -8
  144. package/.medusa/server/src/public/gateway.js +19 -0
  145. package/.medusa/server/src/public/index.js +10 -2
  146. package/.medusa/server/src/public/instrumentation.js +56 -0
  147. package/.medusa/server/src/public/module-access.js +14 -0
  148. package/.medusa/server/src/public/settings.js +17 -0
  149. package/.medusa/server/src/public/shop-config.js +12 -0
  150. package/.medusa/server/src/public/shop-master-data.js +95 -0
  151. package/.medusa/server/src/public/shop-types.js +24 -0
  152. package/.medusa/server/src/shop-config/build-food-shop-config.js +248 -0
  153. package/.medusa/server/src/shop-config/options.js +71 -0
  154. package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
  155. package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
  156. package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
  157. package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
  158. package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
  159. package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
  160. package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
  161. package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
  162. package/.medusa/server/src/subscribers/order-placed.js +27 -0
  163. package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
  164. package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
  165. package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
  166. package/.medusa/server/src/subscribers/password-reset.js +23 -0
  167. package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
  168. package/.medusa/server/src/subscribers/return-received.js +27 -0
  169. package/.medusa/server/src/subscribers/return-requested.js +27 -0
  170. package/.medusa/server/src/subscribers/user-invite.js +23 -0
  171. package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
  172. package/.medusa/server/src/utils/discover-complete-cart-participants.js +9 -2
  173. package/.medusa/server/src/utils/discover-plugin-features.js +47 -9
  174. package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
  175. package/.medusa/server/src/workflows/documents/issue-document.js +163 -0
  176. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
  177. package/.medusa/server/src/workflows/documents/issue-packing-list.js +384 -0
  178. package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
  179. package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
  180. package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
  181. package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
  182. package/.medusa/server/src/workflows/email/dispatch-email-message.js +299 -0
  183. package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
  184. package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
  185. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +64 -0
  186. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +56 -0
  187. package/.medusa/server/src/workflows/email/prepare-refund-email.js +47 -0
  188. package/.medusa/server/src/workflows/email/prepare-return-email.js +75 -0
  189. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +82 -0
  190. package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
  191. package/.medusa/server/src/workflows/hooks/complete-cart-participants.js +28 -16
  192. package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
  193. package/README.md +2004 -11
  194. package/dist/admin-components/features/plugin-features/components/PluginActionsSection.d.ts +6 -0
  195. package/dist/admin-components/features/plugin-features/components/PluginActionsSection.js +66 -0
  196. package/dist/admin-components/features/plugin-features/components/PluginDetailPage.d.ts +2 -0
  197. package/dist/admin-components/features/plugin-features/components/PluginDetailPage.js +9 -0
  198. package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.d.ts +22 -0
  199. package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.js +18 -0
  200. package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.d.ts +11 -0
  201. package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.js +19 -0
  202. package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +12 -0
  203. package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.js +34 -0
  204. package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.d.ts +5 -0
  205. package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +16 -0
  206. package/dist/admin-components/features/plugin-features/components/PluginHubCard.d.ts +7 -0
  207. package/dist/admin-components/features/plugin-features/components/PluginHubCard.js +21 -0
  208. package/dist/admin-components/features/plugin-features/components/PluginPageShell.d.ts +13 -0
  209. package/dist/admin-components/features/plugin-features/components/PluginPageShell.js +20 -0
  210. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +7 -0
  211. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +39 -0
  212. package/dist/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +5 -0
  213. package/dist/admin-components/features/plugin-features/components/PluginStatusChips.js +8 -0
  214. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +114 -0
  215. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.js +40 -0
  216. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +392 -0
  217. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.js +128 -0
  218. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +93 -0
  219. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.js +44 -0
  220. package/dist/admin-components/features/plugin-features/lib/action-runs.d.ts +19 -0
  221. package/dist/admin-components/features/plugin-features/lib/action-runs.js +74 -0
  222. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +363 -0
  223. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.js +9 -0
  224. package/dist/admin-components/features/plugin-features/lib/plugin-paths.d.ts +4 -0
  225. package/dist/admin-components/features/plugin-features/lib/plugin-paths.js +4 -0
  226. package/dist/admin-components/features/plugin-features/lib/settings-draft.d.ts +28 -0
  227. package/dist/admin-components/features/plugin-features/lib/settings-draft.js +86 -0
  228. package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.d.ts +7 -0
  229. package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.js +7 -0
  230. package/dist/admin-components/i18n/texts.d.ts +90 -0
  231. package/dist/admin-components/i18n/texts.js +90 -0
  232. package/dist/admin-components/index.d.ts +14 -0
  233. package/dist/admin-components/index.js +14 -0
  234. package/dist/admin-components/lib/errors.d.ts +6 -0
  235. package/dist/admin-components/lib/errors.js +27 -0
  236. package/dist/admin-components/lib/sdk.d.ts +2 -0
  237. package/dist/admin-components/lib/sdk.js +13 -0
  238. package/dist/documents/config/index.d.ts +11 -0
  239. package/dist/documents/config/index.js +17 -0
  240. package/dist/documents/templates/financial-document.d.ts +3 -0
  241. package/dist/documents/templates/financial-document.js +141 -0
  242. package/dist/documents/templates/format.d.ts +16 -0
  243. package/dist/documents/templates/format.js +30 -0
  244. package/dist/documents/templates/html-factory.d.ts +11 -0
  245. package/dist/documents/templates/html-factory.js +39 -0
  246. package/dist/documents/templates/html-utils.d.ts +2 -0
  247. package/dist/documents/templates/html-utils.js +12 -0
  248. package/dist/documents/templates/layout.d.ts +17 -0
  249. package/dist/documents/templates/layout.js +96 -0
  250. package/dist/documents/templates/packing-list.d.ts +3 -0
  251. package/dist/documents/templates/packing-list.js +49 -0
  252. package/dist/documents/types/admin-api.d.ts +1 -0
  253. package/dist/documents/types/admin-api.js +2 -0
  254. package/dist/documents/types/document-summary.d.ts +1 -0
  255. package/dist/documents/types/document-summary.js +2 -0
  256. package/dist/documents/types/documents.d.ts +174 -0
  257. package/dist/documents/types/documents.js +2 -0
  258. package/dist/documents/types/html-factory.d.ts +7 -0
  259. package/dist/documents/types/html-factory.js +5 -0
  260. package/dist/documents/types/index.d.ts +5 -0
  261. package/dist/documents/types/index.js +21 -0
  262. package/dist/documents/types/store-api.d.ts +1 -0
  263. package/dist/documents/types/store-api.js +2 -0
  264. package/dist/email/config/index.d.ts +17 -0
  265. package/dist/email/config/index.js +83 -0
  266. package/dist/email/config/notification-module.d.ts +22 -0
  267. package/dist/email/config/notification-module.js +19 -0
  268. package/dist/email/types/email-kinds.d.ts +15 -0
  269. package/dist/email/types/email-kinds.js +17 -0
  270. package/dist/email/types/index.d.ts +4 -0
  271. package/dist/email/types/index.js +20 -0
  272. package/dist/email/types/shop-configuration.d.ts +43 -0
  273. package/dist/email/types/shop-configuration.js +2 -0
  274. package/dist/email/types/smtp-configuration.d.ts +9 -0
  275. package/dist/email/types/smtp-configuration.js +2 -0
  276. package/dist/email/types/template-data.d.ts +100 -0
  277. package/dist/email/types/template-data.js +78 -0
  278. package/dist/files/config/index.d.ts +32 -0
  279. package/dist/files/config/index.js +255 -0
  280. package/dist/files/gateway/index.d.ts +30 -0
  281. package/dist/files/gateway/index.js +114 -0
  282. package/dist/files/types/index.d.ts +2 -0
  283. package/dist/files/types/index.js +5 -0
  284. package/dist/files/types/public.d.ts +90 -0
  285. package/dist/files/types/public.js +5 -0
  286. package/dist/modules/documents/domain/merchant.d.ts +22 -0
  287. package/dist/modules/documents/domain/merchant.js +85 -0
  288. package/dist/modules/documents/domain/options.d.ts +34 -0
  289. package/dist/modules/documents/domain/options.js +39 -0
  290. package/dist/public/action-progress.d.ts +25 -0
  291. package/dist/public/action-progress.js +66 -0
  292. package/dist/public/config.d.ts +59 -0
  293. package/dist/public/config.js +185 -0
  294. package/dist/public/descriptor.d.ts +3 -2
  295. package/dist/public/descriptor.js +198 -1
  296. package/dist/public/effective-features.d.ts +2 -1
  297. package/dist/public/effective-features.js +8 -4
  298. package/dist/public/enforcement.d.ts +7 -0
  299. package/dist/public/enforcement.js +17 -7
  300. package/dist/public/gateway.d.ts +2 -0
  301. package/dist/public/gateway.js +18 -0
  302. package/dist/public/index.d.ts +5 -2
  303. package/dist/public/index.js +9 -1
  304. package/dist/public/instrumentation.d.ts +12 -0
  305. package/dist/public/instrumentation.js +55 -0
  306. package/dist/public/module-access.d.ts +3 -0
  307. package/dist/public/module-access.js +13 -0
  308. package/dist/public/settings.d.ts +11 -0
  309. package/dist/public/settings.js +16 -0
  310. package/dist/public/shop-config.d.ts +8 -0
  311. package/dist/public/shop-config.js +11 -0
  312. package/dist/public/shop-master-data.d.ts +25 -0
  313. package/dist/public/shop-master-data.js +94 -0
  314. package/dist/public/shop-types.d.ts +7 -0
  315. package/dist/public/shop-types.js +23 -0
  316. package/dist/public/types.d.ts +113 -1
  317. package/dist/shop-config/build-food-shop-config.d.ts +44 -0
  318. package/dist/shop-config/build-food-shop-config.js +247 -0
  319. package/dist/shop-config/options.d.ts +41 -0
  320. package/dist/shop-config/options.js +70 -0
  321. package/dist/utils/discover-plugin-features.d.ts +28 -0
  322. package/dist/utils/discover-plugin-features.js +96 -0
  323. package/package.json +53 -6
@@ -4,10 +4,190 @@ exports.validatePluginFeatureDescriptor = validatePluginFeatureDescriptor;
4
4
  exports.definePluginFeatures = definePluginFeatures;
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
6
  const KEY_PATTERN = /^[a-z][a-z0-9_]{0,62}$/;
7
+ const SETTING_TYPES = new Set([
8
+ "string",
9
+ "url",
10
+ "number",
11
+ "boolean",
12
+ "secret",
13
+ "select",
14
+ ]);
15
+ const ACTION_MODES = new Set(["sync", "background"]);
16
+ const ADMIN_PAGE_PREFIX = "/settings/hartl-services/";
17
+ const BASE_PAGE_PREFIX = "/settings/hartl-services/plugin/";
18
+ const ADMIN_PAGE_PATTERN = /^\/settings\/hartl-services(\/[a-z0-9][a-z0-9_-]*)+$/;
19
+ const isHttpUrl = (value) => {
20
+ try {
21
+ const url = new URL(value);
22
+ return url.protocol === "http:" || url.protocol === "https:";
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ };
7
28
  const invalid = (pluginKey, message) => new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Ungültige Funktionsschalter für Plugin "${pluginKey}": ${message}`);
29
+ const hasText = (value) => typeof value === "string" && value.trim().length > 0;
30
+ const defaultMatchesType = (setting) => {
31
+ const value = setting.default;
32
+ switch (setting.type) {
33
+ case "string":
34
+ return hasText(value);
35
+ case "url":
36
+ return typeof value === "string" && isHttpUrl(value);
37
+ case "number":
38
+ return typeof value === "number" && Number.isFinite(value);
39
+ case "boolean":
40
+ return typeof value === "boolean";
41
+ case "select":
42
+ return (typeof value === "string" &&
43
+ (setting.options ?? []).some((option) => option.value === value));
44
+ default:
45
+ return false;
46
+ }
47
+ };
48
+ const withinBounds = (setting) => typeof setting.default !== "number" ||
49
+ ((setting.min === undefined || setting.default >= setting.min) &&
50
+ (setting.max === undefined || setting.default <= setting.max));
51
+ const isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
52
+ /** `options` only (and required) for select, `min`/`max` only for number. */
53
+ const validateTypeExtras = (pluginKey, setting) => {
54
+ if (setting.type === "select") {
55
+ const options = setting.options;
56
+ if (!Array.isArray(options) || options.length === 0) {
57
+ throw invalid(pluginKey, `Auswahl "${setting.key}" braucht mindestens eine Option.`);
58
+ }
59
+ const values = new Set();
60
+ for (const option of options) {
61
+ if (!hasText(option?.value) || !hasText(option?.label)) {
62
+ throw invalid(pluginKey, `Auswahl "${setting.key}" hat eine Option ohne value oder label.`);
63
+ }
64
+ if (values.has(option.value)) {
65
+ throw invalid(pluginKey, `Auswahl "${setting.key}" hat die Option "${option.value}" doppelt.`);
66
+ }
67
+ values.add(option.value);
68
+ }
69
+ }
70
+ else if (setting.options !== undefined) {
71
+ throw invalid(pluginKey, `Einstellung "${setting.key}": options gibt es nur bei "select".`);
72
+ }
73
+ if (setting.type !== "number") {
74
+ if (setting.min !== undefined || setting.max !== undefined) {
75
+ throw invalid(pluginKey, `Einstellung "${setting.key}": min/max gibt es nur bei "number".`);
76
+ }
77
+ return;
78
+ }
79
+ for (const [name, bound] of [
80
+ ["min", setting.min],
81
+ ["max", setting.max],
82
+ ]) {
83
+ if (bound !== undefined && !isFiniteNumber(bound)) {
84
+ throw invalid(pluginKey, `Einstellung "${setting.key}": ${name} muss eine endliche Zahl sein.`);
85
+ }
86
+ }
87
+ if (setting.min !== undefined &&
88
+ setting.max !== undefined &&
89
+ setting.min > setting.max) {
90
+ throw invalid(pluginKey, `Einstellung "${setting.key}": min ist größer als max.`);
91
+ }
92
+ };
93
+ /**
94
+ * `invalidates` lists secrets of the same plugin that a change of this
95
+ * setting deletes (e.g. an API key that must not go to a new URL).
96
+ */
97
+ const validateInvalidates = (pluginKey, setting, settings) => {
98
+ const invalidates = setting.invalidates;
99
+ if (invalidates === undefined) {
100
+ return;
101
+ }
102
+ if (!Array.isArray(invalidates) || invalidates.length === 0) {
103
+ throw invalid(pluginKey, `Einstellung "${setting.key}": invalidates muss eine nicht-leere Liste sein.`);
104
+ }
105
+ const seen = new Set();
106
+ for (const key of invalidates) {
107
+ const target = settings.find((candidate) => candidate.key === key);
108
+ if (typeof key !== "string" || !target || target.type !== "secret") {
109
+ throw invalid(pluginKey, `Einstellung "${setting.key}": invalidates nennt "${String(key)}", das keine geheime Einstellung dieses Plugins ist.`);
110
+ }
111
+ if (key === setting.key || seen.has(key)) {
112
+ throw invalid(pluginKey, `Einstellung "${setting.key}": invalidates nennt "${key}" doppelt oder sich selbst.`);
113
+ }
114
+ seen.add(key);
115
+ }
116
+ };
117
+ const validateSettings = (pluginKey, settings) => {
118
+ const seen = new Set();
119
+ for (const setting of settings) {
120
+ if (!KEY_PATTERN.test(setting.key)) {
121
+ throw invalid(pluginKey, `Einstellungs-Key "${setting.key}" hat ein ungültiges Format.`);
122
+ }
123
+ if (seen.has(setting.key)) {
124
+ throw invalid(pluginKey, `Einstellungs-Key "${setting.key}" ist doppelt.`);
125
+ }
126
+ seen.add(setting.key);
127
+ if (!hasText(setting.label)) {
128
+ throw invalid(pluginKey, `Einstellung "${setting.key}" hat kein label.`);
129
+ }
130
+ if (!SETTING_TYPES.has(setting.type)) {
131
+ throw invalid(pluginKey, `Einstellung "${setting.key}" hat einen unbekannten Typ.`);
132
+ }
133
+ if (setting.required !== undefined && typeof setting.required !== "boolean") {
134
+ throw invalid(pluginKey, `Einstellung "${setting.key}": required muss boolean sein.`);
135
+ }
136
+ validateTypeExtras(pluginKey, setting);
137
+ validateInvalidates(pluginKey, setting, settings);
138
+ if (setting.default === undefined) {
139
+ continue;
140
+ }
141
+ if (setting.type === "secret") {
142
+ throw invalid(pluginKey, `Geheime Einstellung "${setting.key}" darf keinen Standardwert haben.`);
143
+ }
144
+ if (!defaultMatchesType(setting)) {
145
+ throw invalid(pluginKey, `Standardwert von Einstellung "${setting.key}" passt nicht zum Typ "${setting.type}".`);
146
+ }
147
+ if (!withinBounds(setting)) {
148
+ throw invalid(pluginKey, `Standardwert von Einstellung "${setting.key}" liegt außerhalb von min/max.`);
149
+ }
150
+ }
151
+ };
152
+ const validateActions = (pluginKey, actions) => {
153
+ const seen = new Set();
154
+ for (const action of actions) {
155
+ if (!KEY_PATTERN.test(action.key)) {
156
+ throw invalid(pluginKey, `Aktions-Key "${action.key}" hat ein ungültiges Format.`);
157
+ }
158
+ if (seen.has(action.key)) {
159
+ throw invalid(pluginKey, `Aktions-Key "${action.key}" ist doppelt.`);
160
+ }
161
+ seen.add(action.key);
162
+ if (!hasText(action.label)) {
163
+ throw invalid(pluginKey, `Aktion "${action.key}" hat kein label.`);
164
+ }
165
+ if (!hasText(action.workflow_id)) {
166
+ throw invalid(pluginKey, `Aktion "${action.key}" hat keine workflow_id.`);
167
+ }
168
+ if (!ACTION_MODES.has(action.mode)) {
169
+ throw invalid(pluginKey, `Aktion "${action.key}" hat einen unbekannten Modus.`);
170
+ }
171
+ if (action.confirm !== undefined && !hasText(action.confirm)) {
172
+ throw invalid(pluginKey, `Aktion "${action.key}": confirm ist leer.`);
173
+ }
174
+ }
175
+ };
176
+ const validateAdminPage = (pluginKey, path) => {
177
+ if (path === undefined) {
178
+ return;
179
+ }
180
+ if (typeof path !== "string" ||
181
+ !path.startsWith(ADMIN_PAGE_PREFIX) ||
182
+ path.startsWith(BASE_PAGE_PREFIX) ||
183
+ !ADMIN_PAGE_PATTERN.test(path)) {
184
+ throw invalid(pluginKey, `admin_page "${String(path)}" muss unter "${ADMIN_PAGE_PREFIX}<plugin>" liegen und darf nicht mit "${BASE_PAGE_PREFIX}" beginnen.`);
185
+ }
186
+ };
8
187
  /**
9
188
  * Checks key format, unique feature keys, existing parents and the single
10
- * allowed nesting level. Throws `INVALID_DATA`.
189
+ * allowed nesting level, plus the optional settings, actions and Admin page.
190
+ * Throws `INVALID_DATA`.
11
191
  */
12
192
  function validatePluginFeatureDescriptor(descriptor) {
13
193
  const pluginKey = String(descriptor.plugin_key);
@@ -17,6 +197,17 @@ function validatePluginFeatureDescriptor(descriptor) {
17
197
  if (typeof descriptor.label !== "string" || !descriptor.label.trim()) {
18
198
  throw invalid(pluginKey, "label fehlt.");
19
199
  }
200
+ if (descriptor.switchable !== undefined &&
201
+ typeof descriptor.switchable !== "boolean") {
202
+ throw invalid(pluginKey, "switchable muss boolean sein.");
203
+ }
204
+ if (descriptor.default_enabled !== undefined &&
205
+ typeof descriptor.default_enabled !== "boolean") {
206
+ throw invalid(pluginKey, "default_enabled muss boolean sein.");
207
+ }
208
+ if (descriptor.switchable === false && descriptor.default_enabled === false) {
209
+ throw invalid(pluginKey, "Ein nicht abschaltbares Plugin (switchable: false) kann nicht default_enabled: false haben.");
210
+ }
20
211
  const byKey = new Map();
21
212
  for (const feature of descriptor.features) {
22
213
  if (!KEY_PATTERN.test(feature.key)) {
@@ -28,6 +219,9 @@ function validatePluginFeatureDescriptor(descriptor) {
28
219
  if (typeof feature.label !== "string" || !feature.label.trim()) {
29
220
  throw invalid(pluginKey, `Feature "${feature.key}" hat kein label.`);
30
221
  }
222
+ if (typeof feature.default_enabled !== "boolean") {
223
+ throw invalid(pluginKey, `Feature "${feature.key}": default_enabled muss boolean sein.`);
224
+ }
31
225
  byKey.set(feature.key, feature);
32
226
  }
33
227
  for (const feature of descriptor.features) {
@@ -42,6 +236,9 @@ function validatePluginFeatureDescriptor(descriptor) {
42
236
  throw invalid(pluginKey, `Feature "${feature.key}" ist zu tief verschachtelt; erlaubt ist eine Ebene.`);
43
237
  }
44
238
  }
239
+ validateSettings(pluginKey, descriptor.settings ?? []);
240
+ validateActions(pluginKey, descriptor.actions ?? []);
241
+ validateAdminPage(pluginKey, descriptor.admin_page);
45
242
  }
46
243
  /**
47
244
  * Declares a plugin's feature switches. Validates at import time so a broken
@@ -12,7 +12,8 @@ export type PluginFeatureStates = {
12
12
  features: PluginFeatureState[];
13
13
  };
14
14
  /**
15
- * Configured and effective values of every declared feature.
15
+ * Configured and effective values of every declared feature. A descriptor
16
+ * with `switchable: false` is always enabled.
16
17
  * `effective(f) = pluginEnabled && configured(f) && effective(parent(f))`.
17
18
  * Stored keys the descriptor no longer declares are ignored; declared keys
18
19
  * without a stored value fall back to their default.
@@ -5,15 +5,19 @@ exports.resolveEffectivePluginFeatures = resolveEffectivePluginFeatures;
5
5
  exports.validateFeatureUpdate = validateFeatureUpdate;
6
6
  const utils_1 = require("@medusajs/framework/utils");
7
7
  /**
8
- * Configured and effective values of every declared feature.
8
+ * Configured and effective values of every declared feature. A descriptor
9
+ * with `switchable: false` is always enabled.
9
10
  * `effective(f) = pluginEnabled && configured(f) && effective(parent(f))`.
10
11
  * Stored keys the descriptor no longer declares are ignored; declared keys
11
12
  * without a stored value fall back to their default.
12
13
  */
13
14
  function resolvePluginFeatureStates(descriptor, stored) {
14
- const pluginEnabled = stored
15
- ? stored.enabled
16
- : descriptor.default_enabled ?? true;
15
+ // A plugin that cannot be switched off is always on, whatever is stored.
16
+ const pluginEnabled = descriptor.switchable === false
17
+ ? true
18
+ : stored
19
+ ? stored.enabled
20
+ : descriptor.default_enabled ?? true;
17
21
  const configured = new Map();
18
22
  for (const feature of descriptor.features) {
19
23
  const value = stored?.features[feature.key];
@@ -6,6 +6,13 @@ import type { PluginFeatureDescriptor } from "./types";
6
6
  * several keys = all must be enabled. Read failures propagate.
7
7
  */
8
8
  export declare function isPluginFeatureEnabled<K extends string>(container: MedusaContainer, descriptor: PluginFeatureDescriptor<K>, ...keys: K[]): Promise<boolean>;
9
+ /**
10
+ * Like `isPluginFeatureEnabled`, for another plugin known only by its key
11
+ * (no import of that plugin): finds its descriptor among the registered
12
+ * modules. An unknown or uninstalled plugin key is `false`, as is an
13
+ * undeclared feature key. Read failures propagate.
14
+ */
15
+ export declare function isPluginFeatureEnabledByKey(container: MedusaContainer, pluginKey: string, ...featureKeys: string[]): Promise<boolean>;
9
16
  /**
10
17
  * Middleware for `defineMiddlewares`. A disabled plugin or feature answers
11
18
  * with `NOT_FOUND` (404); all given keys must be enabled.
@@ -1,15 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isPluginFeatureEnabled = isPluginFeatureEnabled;
4
+ exports.isPluginFeatureEnabledByKey = isPluginFeatureEnabledByKey;
4
5
  exports.requirePluginFeature = requirePluginFeature;
5
6
  const utils_1 = require("@medusajs/framework/utils");
6
- const constants_1 = require("./constants");
7
- const resolveReader = (container) => {
8
- if (!container.hasRegistration(constants_1.PLUGIN_FEATURES_MODULE)) {
9
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "@hartl-services/medusa-base ist nicht in medusa-config registriert.");
10
- }
11
- return container.resolve(constants_1.PLUGIN_FEATURES_MODULE);
12
- };
7
+ const discover_plugin_features_1 = require("../utils/discover-plugin-features");
8
+ const module_access_1 = require("./module-access");
9
+ const resolveReader = (container) => (0, module_access_1.resolveBaseModule)(container);
13
10
  const allEnabled = (effective, keys) => effective.enabled && keys.every((key) => effective.features[key] === true);
14
11
  /**
15
12
  * For subscribers, jobs and workflow steps. No keys = plugin switch only;
@@ -19,6 +16,19 @@ async function isPluginFeatureEnabled(container, descriptor, ...keys) {
19
16
  const effective = await resolveReader(container).retrieveEffectiveFeatures(descriptor);
20
17
  return allEnabled(effective, keys);
21
18
  }
19
+ /**
20
+ * Like `isPluginFeatureEnabled`, for another plugin known only by its key
21
+ * (no import of that plugin): finds its descriptor among the registered
22
+ * modules. An unknown or uninstalled plugin key is `false`, as is an
23
+ * undeclared feature key. Read failures propagate.
24
+ */
25
+ async function isPluginFeatureEnabledByKey(container, pluginKey, ...featureKeys) {
26
+ const descriptor = (0, discover_plugin_features_1.findPluginFeatureDescriptor)(container, pluginKey);
27
+ if (!descriptor) {
28
+ return false;
29
+ }
30
+ return isPluginFeatureEnabled(container, descriptor, ...featureKeys);
31
+ }
22
32
  // Keyed by the request object, so one request reads each plugin's toggles once
23
33
  // even when several gate middlewares match it.
24
34
  const requestMemo = new WeakMap();
@@ -0,0 +1,2 @@
1
+ /** Entry of `@hartl-services/medusa-base/gateway`: `/files` signing helpers. */
2
+ export * from "../files/gateway";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /** Entry of `@hartl-services/medusa-base/gateway`: `/files` signing helpers. */
18
+ __exportStar(require("../files/gateway"), exports);
@@ -1,6 +1,9 @@
1
1
  export { PLUGIN_FEATURES_MODULE } from "./constants";
2
2
  export { definePluginFeatures } from "./descriptor";
3
3
  export { resolveEffectivePluginFeatures } from "./effective-features";
4
- export { isPluginFeatureEnabled, requirePluginFeature } from "./enforcement";
5
- export type { EffectivePluginFeatures, PluginFeatureDefinition, PluginFeatureDescriptor, PluginFeatureProvider, } from "./types";
4
+ export { isPluginFeatureEnabled, isPluginFeatureEnabledByKey, requirePluginFeature, } from "./enforcement";
5
+ export { getPluginSettings } from "./settings";
6
+ export { getShopMasterData, shopMasterDataDescriptor, type ResolvedShopMasterData, type ShopMasterData, type ShopMasterDataKey, } from "./shop-master-data";
7
+ export { reportPluginActionProgress, type PluginActionProgress, } from "./action-progress";
8
+ export type { BasePluginOptions, EffectivePluginFeatures, PluginActionDefinition, PluginActionMode, PluginActionProgressInput, PluginActionWorkflowInput, PluginFeatureDefinition, PluginFeatureDescriptor, PluginFeatureProvider, PluginSettingDefinition, PluginSettingOption, PluginSettingsFallback, PluginSettingType, PluginSettingValue, ResolvedPluginSettings, } from "./types";
6
9
  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.requirePluginFeature = exports.isPluginFeatureEnabled = exports.resolveEffectivePluginFeatures = exports.definePluginFeatures = exports.PLUGIN_FEATURES_MODULE = void 0;
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;
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");
@@ -9,4 +9,12 @@ 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
11
  Object.defineProperty(exports, "isPluginFeatureEnabled", { enumerable: true, get: function () { return enforcement_1.isPluginFeatureEnabled; } });
12
+ Object.defineProperty(exports, "isPluginFeatureEnabledByKey", { enumerable: true, get: function () { return enforcement_1.isPluginFeatureEnabledByKey; } });
12
13
  Object.defineProperty(exports, "requirePluginFeature", { enumerable: true, get: function () { return enforcement_1.requirePluginFeature; } });
14
+ var settings_1 = require("./settings");
15
+ Object.defineProperty(exports, "getPluginSettings", { enumerable: true, get: function () { return settings_1.getPluginSettings; } });
16
+ var shop_master_data_1 = require("./shop-master-data");
17
+ Object.defineProperty(exports, "getShopMasterData", { enumerable: true, get: function () { return shop_master_data_1.getShopMasterData; } });
18
+ Object.defineProperty(exports, "shopMasterDataDescriptor", { enumerable: true, get: function () { return shop_master_data_1.shopMasterDataDescriptor; } });
19
+ var action_progress_1 = require("./action-progress");
20
+ Object.defineProperty(exports, "reportPluginActionProgress", { enumerable: true, get: function () { return action_progress_1.reportPluginActionProgress; } });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Medusa's start command only calls a function named exactly `register` from
3
+ * the shop's `instrumentation.ts` (see @medusajs/medusa/dist/commands/start.js),
4
+ * so the shop re-exports it:
5
+ *
6
+ * export { register } from "@hartl-services/medusa-base/instrumentation"
7
+ *
8
+ * SENTRY_DSN is optional: unset means "no error tracking", not "the app
9
+ * won't start". Needs `@sentry/node` (optional peer dependency of the base,
10
+ * installed by the shop).
11
+ */
12
+ export declare function register(): void;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.register = register;
37
+ const Sentry = __importStar(require("@sentry/node"));
38
+ /**
39
+ * Medusa's start command only calls a function named exactly `register` from
40
+ * the shop's `instrumentation.ts` (see @medusajs/medusa/dist/commands/start.js),
41
+ * so the shop re-exports it:
42
+ *
43
+ * export { register } from "@hartl-services/medusa-base/instrumentation"
44
+ *
45
+ * SENTRY_DSN is optional: unset means "no error tracking", not "the app
46
+ * won't start". Needs `@sentry/node` (optional peer dependency of the base,
47
+ * installed by the shop).
48
+ */
49
+ function register() {
50
+ Sentry.init({
51
+ dsn: process.env.SENTRY_DSN,
52
+ environment: process.env.SENTRY_ENVIRONMENT || process.env.NODE_ENV,
53
+ tracesSampleRate: 0,
54
+ });
55
+ }
@@ -0,0 +1,3 @@
1
+ import type { MedusaContainer } from "@medusajs/framework/types";
2
+ /** Resolves the base module or fails with a clear `UNEXPECTED_STATE`. */
3
+ export declare const resolveBaseModule: <T>(container: MedusaContainer) => T;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveBaseModule = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const constants_1 = require("./constants");
6
+ /** Resolves the base module or fails with a clear `UNEXPECTED_STATE`. */
7
+ const resolveBaseModule = (container) => {
8
+ if (!container.hasRegistration(constants_1.PLUGIN_FEATURES_MODULE)) {
9
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "@hartl-services/medusa-base ist nicht in medusa-config registriert.");
10
+ }
11
+ return container.resolve(constants_1.PLUGIN_FEATURES_MODULE);
12
+ };
13
+ exports.resolveBaseModule = resolveBaseModule;
@@ -0,0 +1,11 @@
1
+ import type { MedusaContainer } from "@medusajs/framework/types";
2
+ import type { PluginFeatureDescriptor, PluginSettingsFallback, ResolvedPluginSettings } from "./types";
3
+ /**
4
+ * Current settings of a plugin for server-side code (subscribers, workflow
5
+ * steps, jobs, scripts, module services via the global container). Secrets
6
+ * are DECRYPTED; never send the result to a client. Precedence per key:
7
+ * stored in the Admin > `fallback` (medusa-config) > declared default.
8
+ * A missing base plugin fails with `UNEXPECTED_STATE`; read failures
9
+ * propagate.
10
+ */
11
+ export declare function getPluginSettings<K extends string, S extends string, A extends string>(container: MedusaContainer, descriptor: PluginFeatureDescriptor<K, S, A>, fallback?: PluginSettingsFallback<S>): Promise<ResolvedPluginSettings<S>>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPluginSettings = getPluginSettings;
4
+ const module_access_1 = require("./module-access");
5
+ /**
6
+ * Current settings of a plugin for server-side code (subscribers, workflow
7
+ * steps, jobs, scripts, module services via the global container). Secrets
8
+ * are DECRYPTED; never send the result to a client. Precedence per key:
9
+ * stored in the Admin > `fallback` (medusa-config) > declared default.
10
+ * A missing base plugin fails with `UNEXPECTED_STATE`; read failures
11
+ * propagate.
12
+ */
13
+ async function getPluginSettings(container, descriptor, fallback) {
14
+ const resolved = await (0, module_access_1.resolveBaseModule)(container).resolvePluginSettings(descriptor, fallback);
15
+ return resolved;
16
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Entry of `@hartl-services/medusa-base/shop-config`: the turnkey
3
+ * `medusa-config.ts` of a food shop. Separate from `./config` because it loads
4
+ * the Sentry logger wrapper and with it `@sentry/node`.
5
+ */
6
+ export { buildFoodShopConfig, defineFoodShopConfig, } from "../shop-config/build-food-shop-config";
7
+ export type { FoodShopConfigInput, FoodShopModule, FoodShopPlugin, } from "../shop-config/build-food-shop-config";
8
+ export type { FoodShopConfigOptions } from "../shop-config/options";
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineFoodShopConfig = exports.buildFoodShopConfig = void 0;
4
+ /**
5
+ * Entry of `@hartl-services/medusa-base/shop-config`: the turnkey
6
+ * `medusa-config.ts` of a food shop. Separate from `./config` because it loads
7
+ * the Sentry logger wrapper and with it `@sentry/node`.
8
+ */
9
+ var build_food_shop_config_1 = require("../shop-config/build-food-shop-config");
10
+ Object.defineProperty(exports, "buildFoodShopConfig", { enumerable: true, get: function () { return build_food_shop_config_1.buildFoodShopConfig; } });
11
+ Object.defineProperty(exports, "defineFoodShopConfig", { enumerable: true, get: function () { return build_food_shop_config_1.defineFoodShopConfig; } });
@@ -0,0 +1,25 @@
1
+ import type { MedusaContainer } from "@medusajs/framework/types";
2
+ import type { PluginSettingsFallback } from "./types";
3
+ /**
4
+ * The base's own descriptor: the shop's master data (Firmenangaben), edited
5
+ * on the generic plugin page like any plugin's settings. It cannot be
6
+ * switched off and declares no features.
7
+ */
8
+ export declare const shopMasterDataDescriptor: import("./types").PluginFeatureDescriptor<string, "legal_name" | "address_line1" | "address_line2" | "postal_code" | "city" | "country_code" | "vat_number" | "email" | "phone" | "website" | "iban" | "bic" | "company_register_number" | "company_register_court", never>;
9
+ /** Keys of the shop master data settings. */
10
+ export type ShopMasterDataKey = "legal_name" | "address_line1" | "address_line2" | "postal_code" | "city" | "country_code" | "vat_number" | "email" | "phone" | "website" | "iban" | "bic" | "company_register_number" | "company_register_court";
11
+ /** Every key that has a value (stored > fallback). All values are strings. */
12
+ export type ShopMasterData = Partial<Record<ShopMasterDataKey, string>>;
13
+ export type ResolvedShopMasterData = {
14
+ values: ShopMasterData;
15
+ /** Every required field has a value. */
16
+ configured: boolean;
17
+ /** Required keys without a value. */
18
+ missing: ShopMasterDataKey[];
19
+ };
20
+ /**
21
+ * The shop's master data for server-side code. Precedence per key: stored in
22
+ * the Admin > `fallback` (e.g. a plugin's own medusa-config option). A
23
+ * missing base plugin fails with `UNEXPECTED_STATE`; read failures propagate.
24
+ */
25
+ export declare function getShopMasterData(container: MedusaContainer, fallback?: PluginSettingsFallback<ShopMasterDataKey>): Promise<ResolvedShopMasterData>;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shopMasterDataDescriptor = void 0;
4
+ exports.getShopMasterData = getShopMasterData;
5
+ const descriptor_1 = require("./descriptor");
6
+ const settings_1 = require("./settings");
7
+ /**
8
+ * The base's own descriptor: the shop's master data (Firmenangaben), edited
9
+ * on the generic plugin page like any plugin's settings. It cannot be
10
+ * switched off and declares no features.
11
+ */
12
+ exports.shopMasterDataDescriptor = (0, descriptor_1.definePluginFeatures)({
13
+ plugin_key: "shop",
14
+ label: "Shop-Stammdaten",
15
+ description: "Firmenangaben des Shops für Rechnungen, Dokumente und Steuerprüfungen.",
16
+ switchable: false,
17
+ features: [],
18
+ settings: [
19
+ { key: "legal_name", label: "Firmenname", type: "string", required: true },
20
+ { key: "address_line1", label: "Adresse", type: "string", required: true },
21
+ { key: "address_line2", label: "Adresszusatz", type: "string" },
22
+ { key: "postal_code", label: "Postleitzahl", type: "string", required: true },
23
+ { key: "city", label: "Ort", type: "string", required: true },
24
+ {
25
+ key: "country_code",
26
+ label: "Land",
27
+ type: "select",
28
+ required: true,
29
+ // EU-27 plus CH, GB, NO, IS, LI (ISO 3166-1 alpha-2, lowercase),
30
+ // sorted by German label.
31
+ options: [
32
+ { value: "be", label: "Belgien" },
33
+ { value: "bg", label: "Bulgarien" },
34
+ { value: "dk", label: "Dänemark" },
35
+ { value: "de", label: "Deutschland" },
36
+ { value: "ee", label: "Estland" },
37
+ { value: "fi", label: "Finnland" },
38
+ { value: "fr", label: "Frankreich" },
39
+ { value: "gr", label: "Griechenland" },
40
+ { value: "ie", label: "Irland" },
41
+ { value: "is", label: "Island" },
42
+ { value: "it", label: "Italien" },
43
+ { value: "hr", label: "Kroatien" },
44
+ { value: "lv", label: "Lettland" },
45
+ { value: "li", label: "Liechtenstein" },
46
+ { value: "lt", label: "Litauen" },
47
+ { value: "lu", label: "Luxemburg" },
48
+ { value: "mt", label: "Malta" },
49
+ { value: "nl", label: "Niederlande" },
50
+ { value: "no", label: "Norwegen" },
51
+ { value: "at", label: "Österreich" },
52
+ { value: "pl", label: "Polen" },
53
+ { value: "pt", label: "Portugal" },
54
+ { value: "ro", label: "Rumänien" },
55
+ { value: "se", label: "Schweden" },
56
+ { value: "ch", label: "Schweiz" },
57
+ { value: "sk", label: "Slowakei" },
58
+ { value: "si", label: "Slowenien" },
59
+ { value: "es", label: "Spanien" },
60
+ { value: "cz", label: "Tschechien" },
61
+ { value: "hu", label: "Ungarn" },
62
+ { value: "gb", label: "Vereinigtes Königreich" },
63
+ { value: "cy", label: "Zypern" },
64
+ ],
65
+ },
66
+ { key: "vat_number", label: "UID-Nummer", type: "string", required: true },
67
+ { key: "email", label: "E-Mail", type: "string" },
68
+ { key: "phone", label: "Telefon", type: "string" },
69
+ { key: "website", label: "Website", type: "url" },
70
+ { key: "iban", label: "IBAN", type: "string" },
71
+ { key: "bic", label: "BIC", type: "string" },
72
+ { key: "company_register_number", label: "Firmenbuchnummer", type: "string" },
73
+ { key: "company_register_court", label: "Firmenbuchgericht", type: "string" },
74
+ ],
75
+ });
76
+ /**
77
+ * The shop's master data for server-side code. Precedence per key: stored in
78
+ * the Admin > `fallback` (e.g. a plugin's own medusa-config option). A
79
+ * missing base plugin fails with `UNEXPECTED_STATE`; read failures propagate.
80
+ */
81
+ async function getShopMasterData(container, fallback) {
82
+ const resolved = await (0, settings_1.getPluginSettings)(container, exports.shopMasterDataDescriptor, fallback);
83
+ const values = {};
84
+ for (const [key, value] of Object.entries(resolved.values)) {
85
+ if (typeof value === "string") {
86
+ values[key] = value;
87
+ }
88
+ }
89
+ return {
90
+ values,
91
+ configured: resolved.configured,
92
+ missing: resolved.missing,
93
+ };
94
+ }