@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.
- package/.medusa/server/src/admin/index.js +2164 -29
- package/.medusa/server/src/admin/index.mjs +2166 -31
- package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
- package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
- package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
- package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
- package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/route.js +31 -0
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/runs/route.js +16 -0
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/route.js +14 -0
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/settings/route.js +22 -0
- package/.medusa/server/src/api/admin/plugin-features/route.js +6 -4
- package/.medusa/server/src/api/document-download-response.js +16 -0
- package/.medusa/server/src/api/document-response.js +23 -0
- package/.medusa/server/src/api/files/[asset]/route.js +24 -0
- package/.medusa/server/src/api/files/file-response.js +43 -0
- package/.medusa/server/src/api/files/gateway-options.js +31 -0
- package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
- package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
- package/.medusa/server/src/api/middlewares.js +186 -5
- package/.medusa/server/src/api/packing-list-response.js +22 -0
- package/.medusa/server/src/api/plugin-actions.js +221 -0
- package/.medusa/server/src/api/plugin-features-http.js +67 -8
- package/.medusa/server/src/api/route.js +27 -0
- package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
- package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
- package/.medusa/server/src/api/store/documents/route.js +11 -0
- package/.medusa/server/src/api/terms-download-response.js +12 -0
- package/.medusa/server/src/documents/config/index.js +18 -0
- package/.medusa/server/src/documents/paths/documents.js +6 -0
- package/.medusa/server/src/documents/paths/index.js +18 -0
- package/.medusa/server/src/documents/plugin-features.js +24 -0
- package/.medusa/server/src/documents/schemas/documents.js +18 -0
- package/.medusa/server/src/documents/schemas/index.js +18 -0
- package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
- package/.medusa/server/src/documents/templates/financial-document.js +142 -0
- package/.medusa/server/src/documents/templates/format.js +31 -0
- package/.medusa/server/src/documents/templates/html-factory.js +40 -0
- package/.medusa/server/src/documents/templates/html-utils.js +13 -0
- package/.medusa/server/src/documents/templates/layout.js +97 -0
- package/.medusa/server/src/documents/templates/packing-list.js +50 -0
- package/.medusa/server/src/documents/types/admin-api.js +3 -0
- package/.medusa/server/src/documents/types/document-summary.js +3 -0
- package/.medusa/server/src/documents/types/documents.js +3 -0
- package/.medusa/server/src/documents/types/html-factory.js +6 -0
- package/.medusa/server/src/documents/types/index.js +22 -0
- package/.medusa/server/src/documents/types/store-api.js +3 -0
- package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
- package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
- package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
- package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
- package/.medusa/server/src/email/application/handle-invite-event.js +312 -0
- package/.medusa/server/src/email/application/handle-password-reset-event.js +354 -0
- package/.medusa/server/src/email/config/index.js +84 -0
- package/.medusa/server/src/email/config/notification-module.js +20 -0
- package/.medusa/server/src/email/domain/business-keys.js +50 -0
- package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
- package/.medusa/server/src/email/domain/event-schemas.js +36 -0
- package/.medusa/server/src/email/domain/failure-classification.js +53 -0
- package/.medusa/server/src/email/plugin-features.js +31 -0
- package/.medusa/server/src/email/rendering/default-templates.js +91 -0
- package/.medusa/server/src/email/rendering/render-email.js +37 -0
- package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +48 -0
- package/.medusa/server/src/email/types/email-kinds.js +18 -0
- package/.medusa/server/src/email/types/index.js +21 -0
- package/.medusa/server/src/email/types/shop-configuration.js +3 -0
- package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
- package/.medusa/server/src/email/types/template-data.js +79 -0
- package/.medusa/server/src/files/config/index.js +256 -0
- package/.medusa/server/src/files/gateway/index.js +115 -0
- package/.medusa/server/src/files/types/index.js +6 -0
- package/.medusa/server/src/files/types/public.js +6 -0
- package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
- package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
- package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
- package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
- package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
- package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
- package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
- package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
- package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
- package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
- package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
- package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
- package/.medusa/server/src/modules/documents/domain/options.js +40 -0
- package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
- package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
- package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
- package/.medusa/server/src/modules/documents/index.js +15 -0
- package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
- package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
- package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
- package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
- package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
- package/.medusa/server/src/modules/documents/models/document.js +82 -0
- package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
- package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
- package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
- package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
- package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
- package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
- package/.medusa/server/src/modules/documents/service.js +1701 -0
- package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
- package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
- package/.medusa/server/src/modules/email/index.js +13 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
- package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
- package/.medusa/server/src/modules/email/models/email-message.js +71 -0
- package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
- package/.medusa/server/src/modules/email/service.js +1285 -0
- package/.medusa/server/src/modules/plugin-features/domain/plugin-action-runs.js +92 -0
- package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +213 -0
- package/.medusa/server/src/modules/plugin-features/domain/secret-box.js +56 -0
- package/.medusa/server/src/modules/plugin-features/migrations/Migration20260928205031.js +16 -0
- package/.medusa/server/src/modules/plugin-features/migrations/Migration20260928215428.js +17 -0
- package/.medusa/server/src/modules/plugin-features/models/plugin-action-run.js +43 -0
- package/.medusa/server/src/modules/plugin-features/models/plugin-setting-state.js +32 -0
- package/.medusa/server/src/modules/plugin-features/service.js +419 -17
- package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
- package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
- package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
- package/.medusa/server/src/providers/s3-cache/index.js +8 -0
- package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
- package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
- package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
- package/.medusa/server/src/providers/smtp/index.js +8 -0
- package/.medusa/server/src/providers/smtp/service.js +236 -0
- package/.medusa/server/src/providers/smtp/types.js +11 -0
- package/.medusa/server/src/public/action-progress.js +67 -0
- package/.medusa/server/src/public/config.js +186 -0
- package/.medusa/server/src/public/descriptor.js +199 -2
- package/.medusa/server/src/public/effective-features.js +9 -5
- package/.medusa/server/src/public/enforcement.js +18 -8
- package/.medusa/server/src/public/gateway.js +19 -0
- package/.medusa/server/src/public/index.js +10 -2
- package/.medusa/server/src/public/instrumentation.js +56 -0
- package/.medusa/server/src/public/module-access.js +14 -0
- package/.medusa/server/src/public/settings.js +17 -0
- package/.medusa/server/src/public/shop-config.js +12 -0
- package/.medusa/server/src/public/shop-master-data.js +95 -0
- package/.medusa/server/src/public/shop-types.js +24 -0
- package/.medusa/server/src/shop-config/build-food-shop-config.js +248 -0
- package/.medusa/server/src/shop-config/options.js +71 -0
- package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
- package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
- package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
- package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
- package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
- package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
- package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
- package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
- package/.medusa/server/src/subscribers/order-placed.js +27 -0
- package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
- package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
- package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
- package/.medusa/server/src/subscribers/password-reset.js +23 -0
- package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
- package/.medusa/server/src/subscribers/return-received.js +27 -0
- package/.medusa/server/src/subscribers/return-requested.js +27 -0
- package/.medusa/server/src/subscribers/user-invite.js +23 -0
- package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
- package/.medusa/server/src/utils/discover-complete-cart-participants.js +9 -2
- package/.medusa/server/src/utils/discover-plugin-features.js +47 -9
- package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
- package/.medusa/server/src/workflows/documents/issue-document.js +163 -0
- package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
- package/.medusa/server/src/workflows/documents/issue-packing-list.js +384 -0
- package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
- package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
- package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
- package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
- package/.medusa/server/src/workflows/email/dispatch-email-message.js +299 -0
- package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
- package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
- package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +64 -0
- package/.medusa/server/src/workflows/email/prepare-order-received-email.js +56 -0
- package/.medusa/server/src/workflows/email/prepare-refund-email.js +47 -0
- package/.medusa/server/src/workflows/email/prepare-return-email.js +75 -0
- package/.medusa/server/src/workflows/email/prepare-shipment-email.js +82 -0
- package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
- package/.medusa/server/src/workflows/hooks/complete-cart-participants.js +28 -16
- package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
- package/README.md +2004 -11
- package/dist/admin-components/features/plugin-features/components/PluginActionsSection.d.ts +6 -0
- package/dist/admin-components/features/plugin-features/components/PluginActionsSection.js +66 -0
- package/dist/admin-components/features/plugin-features/components/PluginDetailPage.d.ts +2 -0
- package/dist/admin-components/features/plugin-features/components/PluginDetailPage.js +9 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.d.ts +22 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.js +18 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.d.ts +11 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.js +19 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +12 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.js +34 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.d.ts +5 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +16 -0
- package/dist/admin-components/features/plugin-features/components/PluginHubCard.d.ts +7 -0
- package/dist/admin-components/features/plugin-features/components/PluginHubCard.js +21 -0
- package/dist/admin-components/features/plugin-features/components/PluginPageShell.d.ts +13 -0
- package/dist/admin-components/features/plugin-features/components/PluginPageShell.js +20 -0
- package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +7 -0
- package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +39 -0
- package/dist/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +5 -0
- package/dist/admin-components/features/plugin-features/components/PluginStatusChips.js +8 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +114 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.js +40 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +392 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.js +128 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +93 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.js +44 -0
- package/dist/admin-components/features/plugin-features/lib/action-runs.d.ts +19 -0
- package/dist/admin-components/features/plugin-features/lib/action-runs.js +74 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +363 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.js +9 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-paths.d.ts +4 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-paths.js +4 -0
- package/dist/admin-components/features/plugin-features/lib/settings-draft.d.ts +28 -0
- package/dist/admin-components/features/plugin-features/lib/settings-draft.js +86 -0
- package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.d.ts +7 -0
- package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.js +7 -0
- package/dist/admin-components/i18n/texts.d.ts +90 -0
- package/dist/admin-components/i18n/texts.js +90 -0
- package/dist/admin-components/index.d.ts +14 -0
- package/dist/admin-components/index.js +14 -0
- package/dist/admin-components/lib/errors.d.ts +6 -0
- package/dist/admin-components/lib/errors.js +27 -0
- package/dist/admin-components/lib/sdk.d.ts +2 -0
- package/dist/admin-components/lib/sdk.js +13 -0
- package/dist/documents/config/index.d.ts +11 -0
- package/dist/documents/config/index.js +17 -0
- package/dist/documents/templates/financial-document.d.ts +3 -0
- package/dist/documents/templates/financial-document.js +141 -0
- package/dist/documents/templates/format.d.ts +16 -0
- package/dist/documents/templates/format.js +30 -0
- package/dist/documents/templates/html-factory.d.ts +11 -0
- package/dist/documents/templates/html-factory.js +39 -0
- package/dist/documents/templates/html-utils.d.ts +2 -0
- package/dist/documents/templates/html-utils.js +12 -0
- package/dist/documents/templates/layout.d.ts +17 -0
- package/dist/documents/templates/layout.js +96 -0
- package/dist/documents/templates/packing-list.d.ts +3 -0
- package/dist/documents/templates/packing-list.js +49 -0
- package/dist/documents/types/admin-api.d.ts +1 -0
- package/dist/documents/types/admin-api.js +2 -0
- package/dist/documents/types/document-summary.d.ts +1 -0
- package/dist/documents/types/document-summary.js +2 -0
- package/dist/documents/types/documents.d.ts +174 -0
- package/dist/documents/types/documents.js +2 -0
- package/dist/documents/types/html-factory.d.ts +7 -0
- package/dist/documents/types/html-factory.js +5 -0
- package/dist/documents/types/index.d.ts +5 -0
- package/dist/documents/types/index.js +21 -0
- package/dist/documents/types/store-api.d.ts +1 -0
- package/dist/documents/types/store-api.js +2 -0
- package/dist/email/config/index.d.ts +17 -0
- package/dist/email/config/index.js +83 -0
- package/dist/email/config/notification-module.d.ts +22 -0
- package/dist/email/config/notification-module.js +19 -0
- package/dist/email/types/email-kinds.d.ts +15 -0
- package/dist/email/types/email-kinds.js +17 -0
- package/dist/email/types/index.d.ts +4 -0
- package/dist/email/types/index.js +20 -0
- package/dist/email/types/shop-configuration.d.ts +43 -0
- package/dist/email/types/shop-configuration.js +2 -0
- package/dist/email/types/smtp-configuration.d.ts +9 -0
- package/dist/email/types/smtp-configuration.js +2 -0
- package/dist/email/types/template-data.d.ts +100 -0
- package/dist/email/types/template-data.js +78 -0
- package/dist/files/config/index.d.ts +32 -0
- package/dist/files/config/index.js +255 -0
- package/dist/files/gateway/index.d.ts +30 -0
- package/dist/files/gateway/index.js +114 -0
- package/dist/files/types/index.d.ts +2 -0
- package/dist/files/types/index.js +5 -0
- package/dist/files/types/public.d.ts +90 -0
- package/dist/files/types/public.js +5 -0
- package/dist/modules/documents/domain/merchant.d.ts +22 -0
- package/dist/modules/documents/domain/merchant.js +85 -0
- package/dist/modules/documents/domain/options.d.ts +34 -0
- package/dist/modules/documents/domain/options.js +39 -0
- package/dist/public/action-progress.d.ts +25 -0
- package/dist/public/action-progress.js +66 -0
- package/dist/public/config.d.ts +59 -0
- package/dist/public/config.js +185 -0
- package/dist/public/descriptor.d.ts +3 -2
- package/dist/public/descriptor.js +198 -1
- package/dist/public/effective-features.d.ts +2 -1
- package/dist/public/effective-features.js +8 -4
- package/dist/public/enforcement.d.ts +7 -0
- package/dist/public/enforcement.js +17 -7
- package/dist/public/gateway.d.ts +2 -0
- package/dist/public/gateway.js +18 -0
- package/dist/public/index.d.ts +5 -2
- package/dist/public/index.js +9 -1
- package/dist/public/instrumentation.d.ts +12 -0
- package/dist/public/instrumentation.js +55 -0
- package/dist/public/module-access.d.ts +3 -0
- package/dist/public/module-access.js +13 -0
- package/dist/public/settings.d.ts +11 -0
- package/dist/public/settings.js +16 -0
- package/dist/public/shop-config.d.ts +8 -0
- package/dist/public/shop-config.js +11 -0
- package/dist/public/shop-master-data.d.ts +25 -0
- package/dist/public/shop-master-data.js +94 -0
- package/dist/public/shop-types.d.ts +7 -0
- package/dist/public/shop-types.js +23 -0
- package/dist/public/types.d.ts +113 -1
- package/dist/shop-config/build-food-shop-config.d.ts +44 -0
- package/dist/shop-config/build-food-shop-config.js +247 -0
- package/dist/shop-config/options.d.ts +41 -0
- package/dist/shop-config/options.js +70 -0
- package/dist/utils/discover-plugin-features.d.ts +28 -0
- package/dist/utils/discover-plugin-features.js +96 -0
- package/package.json +53 -6
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emailPluginFeatures = void 0;
|
|
4
|
+
const public_1 = require("../public");
|
|
5
|
+
exports.emailPluginFeatures = (0, public_1.definePluginFeatures)({
|
|
6
|
+
plugin_key: "email",
|
|
7
|
+
label: "E-Mail",
|
|
8
|
+
description: "Transaktionale E-Mails und das E-Mail-Protokoll im Admin. Aus: Für neue Ereignisse wird keine Mail erzeugt (Ereignisse werden später nicht nachgeholt), das E-Mail-Protokoll und die AGB-Versionen im Admin sind nicht erreichbar und die Versand-, Wiederholungs- und Abgleichsjobs laufen nicht; bereits eingereihte Mails bleiben liegen, bis das Plugin wieder eingeschaltet wird. Checkout und Bestellungen laufen unverändert weiter.",
|
|
9
|
+
features: [
|
|
10
|
+
{
|
|
11
|
+
key: "order_mails",
|
|
12
|
+
label: "Bestell-Mails",
|
|
13
|
+
description: "Bestelleingang, Versand, Stornierung, Retoure und Erstattung (inklusive der Mails zu Belegen aus dem Dokumente-Plugin). Sind im Dokumente-Plugin die Rechnungen & Stornos aus, gehen Versand- und Storno-Mails ohne Beleg hinaus; Erstattungs-Mails entstehen nur aus einem Erstattungsbeleg und werden dann nicht verschickt. Aus: Für diese Ereignisse wird keine Mail erzeugt und später auch nicht nachgeholt.",
|
|
14
|
+
default_enabled: true,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
key: "account_mails",
|
|
18
|
+
label: "Konto-Mails",
|
|
19
|
+
description: "Passwort-Zurücksetzen für Kunden und Einladungen neuer Admin-Benutzer. Aus: Für diese Ereignisse wird keine Mail erzeugt.",
|
|
20
|
+
default_enabled: true,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
key: "affiliate_reminders",
|
|
24
|
+
label: "Affiliate-Erinnerungen",
|
|
25
|
+
description: "Erinnerungsmails an Affiliates zur fälligen Konsignationsmeldung. Aus: Für diese Ereignisse wird keine Mail erzeugt.",
|
|
26
|
+
default_enabled: true,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
admin_page: "/settings/hartl-services/email",
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWZlYXR1cmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2VtYWlsL3BsdWdpbi1mZWF0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzQ0FBaUQ7QUFFcEMsUUFBQSxtQkFBbUIsR0FBRyxJQUFBLDZCQUFvQixFQUFDO0lBQ3RELFVBQVUsRUFBRSxPQUFPO0lBQ25CLEtBQUssRUFBRSxRQUFRO0lBQ2YsV0FBVyxFQUNULDZhQUE2YTtJQUMvYSxRQUFRLEVBQUU7UUFDUjtZQUNFLEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEtBQUssRUFBRSxlQUFlO1lBQ3RCLFdBQVcsRUFDVCxvWkFBb1o7WUFDdFosZUFBZSxFQUFFLElBQUk7U0FDdEI7UUFDRDtZQUNFLEdBQUcsRUFBRSxlQUFlO1lBQ3BCLEtBQUssRUFBRSxhQUFhO1lBQ3BCLFdBQVcsRUFDVCwySEFBMkg7WUFDN0gsZUFBZSxFQUFFLElBQUk7U0FDdEI7UUFDRDtZQUNFLEdBQUcsRUFBRSxxQkFBcUI7WUFDMUIsS0FBSyxFQUFFLHdCQUF3QjtZQUMvQixXQUFXLEVBQ1Qsc0hBQXNIO1lBQ3hILGVBQWUsRUFBRSxJQUFJO1NBQ3RCO0tBQ0Y7SUFDRCxVQUFVLEVBQUUsZ0NBQWdDO0NBQzdDLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDefaultEmailRenderers = exports.createDefaultEmailLayout = void 0;
|
|
4
|
+
const escapeHtml = (value) => value
|
|
5
|
+
.replaceAll("&", "&")
|
|
6
|
+
.replaceAll("<", "<")
|
|
7
|
+
.replaceAll(">", ">")
|
|
8
|
+
.replaceAll('"', """)
|
|
9
|
+
.replaceAll("'", "'");
|
|
10
|
+
/** Neutral default layout; the shop appears only as `displayName`. */
|
|
11
|
+
const createDefaultEmailLayout = (displayName) => {
|
|
12
|
+
const shop = escapeHtml(displayName);
|
|
13
|
+
return ({ bodyHtml, preheader, subject }) => `<!doctype html>
|
|
14
|
+
<html lang="de">
|
|
15
|
+
<head>
|
|
16
|
+
<meta charset="utf-8" />
|
|
17
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
18
|
+
<title>${escapeHtml(subject)}</title>
|
|
19
|
+
</head>
|
|
20
|
+
<body style="background: #f2f2f5; color: #24242b; font-family: Arial, sans-serif; margin: 0; padding: 24px 12px;">
|
|
21
|
+
<div style="display: none; max-height: 0; overflow: hidden; opacity: 0;">${escapeHtml(preheader)}</div>
|
|
22
|
+
<main style="background: #ffffff; margin: 0 auto; max-width: 600px; padding: 32px;">
|
|
23
|
+
<header>
|
|
24
|
+
<h1 style="color: #1f1f2e; margin: 0;">${shop}</h1>
|
|
25
|
+
<div style="background: #6b5bff; height: 2px; margin: 16px 0 24px;"></div>
|
|
26
|
+
</header>
|
|
27
|
+
${bodyHtml}
|
|
28
|
+
<footer style="border-top: 1px solid #6b5bff; color: #6b6b74; font-size: 12px; margin-top: 28px; padding-top: 16px;">${shop}</footer>
|
|
29
|
+
</main>
|
|
30
|
+
</body>
|
|
31
|
+
</html>`;
|
|
32
|
+
};
|
|
33
|
+
exports.createDefaultEmailLayout = createDefaultEmailLayout;
|
|
34
|
+
/** Neutral German default renderers, one per accepted email kind. */
|
|
35
|
+
const createDefaultEmailRenderers = ({ affiliatePortalUrl, displayName, }) => {
|
|
36
|
+
const shop = escapeHtml(displayName);
|
|
37
|
+
return {
|
|
38
|
+
"order.received": ({ order_id }) => ({
|
|
39
|
+
bodyHtml: `<p>Vielen Dank für deine Bestellung <strong>${escapeHtml(order_id)}</strong>. Wir haben sie erhalten und bearbeiten sie jetzt.</p>`,
|
|
40
|
+
subject: "Wir haben deine Bestellung erhalten",
|
|
41
|
+
text: `Vielen Dank für deine Bestellung ${order_id}. Wir haben sie erhalten und bearbeiten sie jetzt.`,
|
|
42
|
+
}),
|
|
43
|
+
"order.received.admin": ({ order_id }) => ({
|
|
44
|
+
bodyHtml: `<p>Die neue Bestellung <strong>${escapeHtml(order_id)}</strong> ist eingegangen und kann jetzt bearbeitet werden.</p>`,
|
|
45
|
+
subject: "Neue Bestellung eingegangen",
|
|
46
|
+
text: `Die neue Bestellung ${order_id} ist eingegangen und kann jetzt bearbeitet werden.`,
|
|
47
|
+
}),
|
|
48
|
+
"order.shipped": ({ order_id, fulfillment_id }) => ({
|
|
49
|
+
bodyHtml: `<p>Deine Bestellung <strong>${escapeHtml(order_id)}</strong> ist unterwegs.</p><p>Versandreferenz: ${escapeHtml(fulfillment_id)}</p>`,
|
|
50
|
+
subject: "Deine Bestellung ist unterwegs",
|
|
51
|
+
text: `Deine Bestellung ${order_id} ist unterwegs. Versandreferenz: ${fulfillment_id}.`,
|
|
52
|
+
}),
|
|
53
|
+
"order.canceled": ({ order_id }) => ({
|
|
54
|
+
bodyHtml: `<p>Deine Bestellung <strong>${escapeHtml(order_id)}</strong> wurde storniert.</p>`,
|
|
55
|
+
subject: "Deine Bestellung wurde storniert",
|
|
56
|
+
text: `Deine Bestellung ${order_id} wurde storniert.`,
|
|
57
|
+
}),
|
|
58
|
+
"order.return_requested": ({ order_id, return_id }) => ({
|
|
59
|
+
bodyHtml: `<p>Wir haben deine Rücksendeanfrage <strong>${escapeHtml(return_id)}</strong> zur Bestellung ${escapeHtml(order_id)} erhalten.</p>`,
|
|
60
|
+
subject: "Wir haben deine Rücksendeanfrage erhalten",
|
|
61
|
+
text: `Wir haben deine Rücksendeanfrage ${return_id} zur Bestellung ${order_id} erhalten.`,
|
|
62
|
+
}),
|
|
63
|
+
"order.return_received": ({ order_id, return_id }) => ({
|
|
64
|
+
bodyHtml: `<p>Deine Rücksendung <strong>${escapeHtml(return_id)}</strong> zur Bestellung ${escapeHtml(order_id)} ist bei uns eingetroffen.</p>`,
|
|
65
|
+
subject: "Deine Rücksendung ist eingetroffen",
|
|
66
|
+
text: `Deine Rücksendung ${return_id} zur Bestellung ${order_id} ist bei uns eingetroffen.`,
|
|
67
|
+
}),
|
|
68
|
+
"order.refunded": ({ order_id, refund_id }) => ({
|
|
69
|
+
bodyHtml: `<p>Die Erstattung <strong>${escapeHtml(refund_id)}</strong> zur Bestellung ${escapeHtml(order_id)} wurde veranlasst.</p>`,
|
|
70
|
+
subject: "Deine Erstattung wurde veranlasst",
|
|
71
|
+
text: `Die Erstattung ${refund_id} zur Bestellung ${order_id} wurde veranlasst.`,
|
|
72
|
+
}),
|
|
73
|
+
"auth.password_reset": ({ reset_url }) => ({
|
|
74
|
+
bodyHtml: `<p>Du hast ein neues Passwort angefordert.</p><p><a href="${escapeHtml(reset_url)}">Passwort sicher zurücksetzen</a></p>`,
|
|
75
|
+
subject: `Setze dein ${displayName} Passwort zurück`,
|
|
76
|
+
text: `Du hast ein neues Passwort angefordert. Setze es hier zurück: ${reset_url}`,
|
|
77
|
+
}),
|
|
78
|
+
"affiliate.consignment_report_due": ({ affiliate_display_name, due_date, period_start, }) => ({
|
|
79
|
+
bodyHtml: `<p>Hallo ${escapeHtml(affiliate_display_name)}, bitte reiche deine Monatsmeldung für ${escapeHtml(period_start)} bis ${escapeHtml(due_date)} ein.</p><p><a href="${escapeHtml(affiliatePortalUrl)}">Zum Partnerbereich</a></p>`,
|
|
80
|
+
subject: "Erinnerung: Monatsmeldung einreichen",
|
|
81
|
+
text: `Hallo ${affiliate_display_name}, bitte reiche deine Monatsmeldung für ${period_start} bis ${due_date} ein: ${affiliatePortalUrl}`,
|
|
82
|
+
}),
|
|
83
|
+
"user.invite": ({ invite_url }) => ({
|
|
84
|
+
bodyHtml: `<p>Du wurdest eingeladen, dem ${shop}-Adminteam beizutreten.</p><p><a href="${escapeHtml(invite_url)}">Einladung annehmen</a></p>`,
|
|
85
|
+
subject: `Du wurdest zu ${displayName} eingeladen`,
|
|
86
|
+
text: `Du wurdest eingeladen, dem ${displayName}-Adminteam beizutreten. Einladung annehmen: ${invite_url}`,
|
|
87
|
+
}),
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
exports.createDefaultEmailRenderers = createDefaultEmailRenderers;
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10ZW1wbGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvcmVuZGVyaW5nL2RlZmF1bHQtdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FDM0MsS0FBSztLQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0tBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0tBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFFL0Isc0VBQXNFO0FBQy9ELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxXQUFtQixFQUFlLEVBQUU7SUFDM0UsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXJDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDOzs7OzthQUtsQyxVQUFVLENBQUMsT0FBTyxDQUFDOzs7K0VBRytDLFVBQVUsQ0FBQyxTQUFTLENBQUM7OztpREFHbkQsSUFBSTs7O1FBRzdDLFFBQVE7NkhBQzZHLElBQUk7OztRQUd6SCxDQUFDO0FBQ1QsQ0FBQyxDQUFDO0FBdEJXLFFBQUEsd0JBQXdCLDRCQXNCbkM7QUFFRixxRUFBcUU7QUFDOUQsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEVBQzFDLGtCQUFrQixFQUNsQixXQUFXLEdBSVosRUFBb0IsRUFBRTtJQUNyQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFckMsT0FBTztRQUNMLGdCQUFnQixFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMs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
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderEmail = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
const invalidRenderInput = () => {
|
|
7
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid email render input.");
|
|
8
|
+
};
|
|
9
|
+
const requireContent = (value) => {
|
|
10
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
11
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Email renderer returned empty content.");
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
};
|
|
15
|
+
const renderEmail = (configuration, input) => {
|
|
16
|
+
const kindResult = types_1.EmailKindSchema.safeParse(input.kind);
|
|
17
|
+
if (!kindResult.success) {
|
|
18
|
+
return invalidRenderInput();
|
|
19
|
+
}
|
|
20
|
+
const kind = kindResult.data;
|
|
21
|
+
const dataResult = types_1.EmailRenderDataSchemas[kind].safeParse(input.data);
|
|
22
|
+
if (!dataResult.success) {
|
|
23
|
+
return invalidRenderInput();
|
|
24
|
+
}
|
|
25
|
+
const renderer = configuration.renderers[kind];
|
|
26
|
+
if (typeof renderer !== "function") {
|
|
27
|
+
return invalidRenderInput();
|
|
28
|
+
}
|
|
29
|
+
const rendered = renderer(dataResult.data);
|
|
30
|
+
const bodyHtml = requireContent(rendered?.bodyHtml);
|
|
31
|
+
const subject = requireContent(rendered?.subject);
|
|
32
|
+
const text = requireContent(rendered?.text);
|
|
33
|
+
const html = requireContent(configuration.layout({ bodyHtml, preheader: text, subject }));
|
|
34
|
+
return { bodyHtml, html, subject, text };
|
|
35
|
+
};
|
|
36
|
+
exports.renderEmail = renderEmail;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWVtYWlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL3JlbmRlcmluZy9yZW5kZXItZW1haWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXdEO0FBRXhELG9DQU1rQjtBQWdCbEIsTUFBTSxrQkFBa0IsR0FBRyxHQUFVLEVBQUU7SUFDckMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsNkJBQTZCLENBQzlCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWMsRUFBVSxFQUFFO0lBQ2hELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyx3Q0FBd0MsQ0FDekMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVLLE1BQU0sV0FBVyxHQUFHLENBQ3pCLGFBQTZDLEVBQzdDLEtBQXVCLEVBQ1IsRUFBRTtJQUNqQixNQUFNLFVBQVUsR0FBRyx1QkFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QixPQUFPLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDN0IsTUFBTSxVQUFVLEdBQUcsOEJBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE9BQU8sa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBRWpDLENBQUM7SUFDYixJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE9BQU8sa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQTRCLENBQUM7SUFDdEUsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUN6QixhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDN0QsQ0FBQztJQUVGLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMzQyxDQUFDLENBQUM7QUE1QlcsUUFBQSxXQUFXLGVBNEJ0QiJ9
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveShopEmailConfiguration = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
const default_templates_1 = require("./default-templates");
|
|
7
|
+
const invalidConfiguration = (message) => {
|
|
8
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid email shop configuration: ${message}`);
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Validates the shop configuration and merges the default layout and
|
|
12
|
+
* renderers into it. Runs once when the Email module boots, so a bad
|
|
13
|
+
* configuration fails at startup and not at the first send.
|
|
14
|
+
*/
|
|
15
|
+
const resolveShopEmailConfiguration = (shop) => {
|
|
16
|
+
if (typeof shop?.displayName !== "string" || !shop.displayName.trim()) {
|
|
17
|
+
invalidConfiguration("displayName must be a non-empty string.");
|
|
18
|
+
}
|
|
19
|
+
if (shop.layout !== undefined && typeof shop.layout !== "function") {
|
|
20
|
+
invalidConfiguration("layout must be a function.");
|
|
21
|
+
}
|
|
22
|
+
if (shop.renderers !== undefined &&
|
|
23
|
+
(typeof shop.renderers !== "object" || shop.renderers === null)) {
|
|
24
|
+
invalidConfiguration("renderers must be an object.");
|
|
25
|
+
}
|
|
26
|
+
const overrides = { ...shop.renderers };
|
|
27
|
+
for (const kind of Object.keys(overrides)) {
|
|
28
|
+
if (!types_1.EMAIL_KINDS.includes(kind)) {
|
|
29
|
+
invalidConfiguration(`renderers contains the unknown kind "${kind}".`);
|
|
30
|
+
}
|
|
31
|
+
if (overrides[kind] === undefined) {
|
|
32
|
+
delete overrides[kind];
|
|
33
|
+
}
|
|
34
|
+
else if (typeof overrides[kind] !== "function") {
|
|
35
|
+
invalidConfiguration(`renderers["${kind}"] must be a function.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
...shop,
|
|
40
|
+
layout: shop.layout ?? (0, default_templates_1.createDefaultEmailLayout)(shop.displayName),
|
|
41
|
+
renderers: {
|
|
42
|
+
...(0, default_templates_1.createDefaultEmailRenderers)(shop),
|
|
43
|
+
...overrides,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
exports.resolveShopEmailConfiguration = resolveShopEmailConfiguration;
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1zaG9wLWNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvcmVuZGVyaW5nL3Jlc29sdmUtc2hvcC1jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF3RDtBQUV4RCxvQ0FJa0I7QUFDbEIsMkRBRzZCO0FBRTdCLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFlLEVBQVMsRUFBRTtJQUN0RCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxQ0FBcUMsT0FBTyxFQUFFLENBQy9DLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0ksTUFBTSw2QkFBNkIsR0FBRyxDQUMzQyxJQUE0QixFQUNJLEVBQUU7SUFDbEMsSUFBSSxPQUFPLElBQUksRUFBRSxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3RFLG9CQUFvQixDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ25FLG9CQUFvQixDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELElBQ0UsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTO1FBQzVCLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxFQUMvRCxDQUFDO1FBQ0Qsb0JBQW9CLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQTRCLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakUsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFFLG1CQUFpQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZELG9CQUFvQixDQUFDLHdDQUF3QyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNqRCxvQkFBb0IsQ0FBQyxjQUFjLElBQUksd0JBQXdCLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxHQUFHLElBQUk7UUFDUCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFBLDRDQUF3QixFQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDakUsU0FBUyxFQUFFO1lBQ1QsR0FBRyxJQUFBLCtDQUEyQixFQUFDLElBQUksQ0FBQztZQUNwQyxHQUFHLFNBQVM7U0FDYjtLQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFwQ1csUUFBQSw2QkFBNkIsaUNBb0N4QyJ9
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EmailKindSchema = exports.EMAIL_KINDS = void 0;
|
|
4
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
5
|
+
exports.EMAIL_KINDS = [
|
|
6
|
+
"order.received",
|
|
7
|
+
"order.received.admin",
|
|
8
|
+
"order.shipped",
|
|
9
|
+
"order.canceled",
|
|
10
|
+
"order.return_requested",
|
|
11
|
+
"order.return_received",
|
|
12
|
+
"order.refunded",
|
|
13
|
+
"auth.password_reset",
|
|
14
|
+
"affiliate.consignment_report_due",
|
|
15
|
+
"user.invite",
|
|
16
|
+
];
|
|
17
|
+
exports.EmailKindSchema = zod_1.z.enum(exports.EMAIL_KINDS);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwta2luZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvdHlwZXMvZW1haWwta2luZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQTRDO0FBRS9CLFFBQUEsV0FBVyxHQUFHO0lBQ3pCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQix3QkFBd0I7SUFDeEIsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsa0NBQWtDO0lBQ2xDLGFBQWE7Q0FDTCxDQUFDO0FBRUUsUUFBQSxlQUFlLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBVyxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
__exportStar(require("./email-kinds"), exports);
|
|
18
|
+
__exportStar(require("./shop-configuration"), exports);
|
|
19
|
+
__exportStar(require("./smtp-configuration"), exports);
|
|
20
|
+
__exportStar(require("./template-data"), exports);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUE4QjtBQUM5Qix1REFBcUM7QUFDckMsdURBQXFDO0FBQ3JDLGtEQUFnQyJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcC1jb25maWd1cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL3R5cGVzL3Nob3AtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic210cC1jb25maWd1cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL3R5cGVzL3NtdHAtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EmailRenderDataSchemas = exports.EmailPersistedDataSchemas = void 0;
|
|
4
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
5
|
+
const affiliate_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/affiliate");
|
|
6
|
+
const NonEmptyStringSchema = zod_1.z.string().trim().min(1);
|
|
7
|
+
const NullableLocaleSchema = NonEmptyStringSchema.max(35).nullable();
|
|
8
|
+
const DocumentsFactFingerprintSchema = zod_1.z
|
|
9
|
+
.string()
|
|
10
|
+
.regex(/^[a-f0-9]{64}$/)
|
|
11
|
+
.optional();
|
|
12
|
+
exports.EmailPersistedDataSchemas = {
|
|
13
|
+
"order.received": zod_1.z
|
|
14
|
+
.object({
|
|
15
|
+
order_id: NonEmptyStringSchema,
|
|
16
|
+
})
|
|
17
|
+
.strict(),
|
|
18
|
+
"order.received.admin": zod_1.z
|
|
19
|
+
.object({
|
|
20
|
+
order_id: NonEmptyStringSchema,
|
|
21
|
+
})
|
|
22
|
+
.strict(),
|
|
23
|
+
"order.shipped": zod_1.z
|
|
24
|
+
.object({
|
|
25
|
+
order_id: NonEmptyStringSchema,
|
|
26
|
+
fulfillment_id: NonEmptyStringSchema,
|
|
27
|
+
documents_fact_fingerprint: DocumentsFactFingerprintSchema,
|
|
28
|
+
})
|
|
29
|
+
.strict(),
|
|
30
|
+
"order.canceled": zod_1.z
|
|
31
|
+
.object({
|
|
32
|
+
order_id: NonEmptyStringSchema,
|
|
33
|
+
documents_fact_fingerprint: DocumentsFactFingerprintSchema,
|
|
34
|
+
})
|
|
35
|
+
.strict(),
|
|
36
|
+
"order.return_requested": zod_1.z
|
|
37
|
+
.object({
|
|
38
|
+
order_id: NonEmptyStringSchema,
|
|
39
|
+
return_id: NonEmptyStringSchema,
|
|
40
|
+
})
|
|
41
|
+
.strict(),
|
|
42
|
+
"order.return_received": zod_1.z
|
|
43
|
+
.object({
|
|
44
|
+
order_id: NonEmptyStringSchema,
|
|
45
|
+
return_id: NonEmptyStringSchema,
|
|
46
|
+
})
|
|
47
|
+
.strict(),
|
|
48
|
+
"order.refunded": zod_1.z
|
|
49
|
+
.object({
|
|
50
|
+
order_id: NonEmptyStringSchema,
|
|
51
|
+
refund_id: NonEmptyStringSchema,
|
|
52
|
+
documents_fact_fingerprint: DocumentsFactFingerprintSchema,
|
|
53
|
+
})
|
|
54
|
+
.strict(),
|
|
55
|
+
"auth.password_reset": zod_1.z
|
|
56
|
+
.object({
|
|
57
|
+
locale: NullableLocaleSchema,
|
|
58
|
+
})
|
|
59
|
+
.strict(),
|
|
60
|
+
"affiliate.consignment_report_due": zod_1.z
|
|
61
|
+
.object({
|
|
62
|
+
affiliate_display_name: NonEmptyStringSchema,
|
|
63
|
+
period_start: affiliate_1.CalendarMonthSchema,
|
|
64
|
+
due_date: affiliate_1.CalendarDateSchema,
|
|
65
|
+
locale: NullableLocaleSchema,
|
|
66
|
+
})
|
|
67
|
+
.strict(),
|
|
68
|
+
"user.invite": zod_1.z.object({}).strict(),
|
|
69
|
+
};
|
|
70
|
+
exports.EmailRenderDataSchemas = {
|
|
71
|
+
...exports.EmailPersistedDataSchemas,
|
|
72
|
+
"auth.password_reset": exports.EmailPersistedDataSchemas["auth.password_reset"].extend({
|
|
73
|
+
reset_url: zod_1.z.string().url(),
|
|
74
|
+
}),
|
|
75
|
+
"user.invite": exports.EmailPersistedDataSchemas["user.invite"].extend({
|
|
76
|
+
invite_url: zod_1.z.string().url(),
|
|
77
|
+
}),
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC90eXBlcy90ZW1wbGF0ZS1kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUE0QztBQUM1QyxtR0FHNkU7QUFJN0UsTUFBTSxvQkFBb0IsR0FBRyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3JFLE1BQU0sOEJBQThCLEdBQUcsT0FBQztLQUNyQyxNQUFNLEVBQUU7S0FDUixLQUFLLENBQUMsZ0JBQWdCLENBQUM7S0FDdkIsUUFBUSxFQUFFLENBQUM7QUFFRCxRQUFBLHlCQUF5QixHQUFHO0lBQ3ZDLGdCQUFnQixFQUFFLE9BQUM7U0FDaEIsTUFBTSxDQUFDO1FBQ04sUUFBUSxFQUFFLG9CQUFvQjtLQUMvQixDQUFDO1NBQ0QsTUFBTSxFQUFFO0lBQ1gsc0JBQXNCLEVBQUUsT0FBQztTQUN0QixNQUFNLENBQUM7UUFDTixRQUFRLEVBQUUsb0JBQW9CO0tBQy9CLENBQUM7U0FDRCxNQUFNLEVBQUU7SUFDWCxlQUFlLEVBQUUsT0FBQztTQUNmLE1BQU0sQ0FBQztRQUNOLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsY0FBYyxFQUFFLG9CQUFvQjtRQUNwQywwQkFBMEIsRUFBRSw4QkFBOEI7S0FDM0QsQ0FBQztTQUNELE1BQU0sRUFBRTtJQUNYLGdCQUFnQixFQUFFLE9BQUM7U0FDaEIsTUFBTSxDQUFDO1FBQ04sUUFBUSxFQUFFLG9CQUFvQjtRQUM5QiwwQkFBMEIsRUFBRSw4QkFBOEI7S0FDM0QsQ0FBQztTQUNELE1BQU0sRUFBRTtJQUNYLHdCQUF3QixFQUFFLE9BQUM7U0FDeEIsTUFBTSxDQUFDO1FBQ04sUUFBUSxFQUFFLG9CQUFvQjtRQUM5QixTQUFTLEVBQUUsb0JBQW9CO0tBQ2hDLENBQUM7U0FDRCxNQUFNLEVBQUU7SUFDWCx1QkFBdUIsRUFBRSxPQUFDO1NBQ3ZCLE1BQU0sQ0FBQztRQUNOLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsU0FBUyxFQUFFLG9CQUFvQjtLQUNoQyxDQUFDO1NBQ0QsTUFBTSxFQUFFO0lBQ1gsZ0JBQWdCLEVBQUUsT0FBQztTQUNoQixNQUFNLENBQUM7UUFDTixRQUFRLEVBQUUsb0JBQW9CO1FBQzlCLFNBQVMsRUFBRSxvQkFBb0I7UUFDL0IsMEJBQTBCLEVBQUUsOEJBQThCO0tBQzNELENBQUM7U0FDRCxNQUFNLEVBQUU7SUFDWCxxQkFBcUIsRUFBRSxPQUFDO1NBQ3JCLE1BQU0sQ0FBQztRQUNOLE1BQU0sRUFBRSxvQkFBb0I7S0FDN0IsQ0FBQztTQUNELE1BQU0sRUFBRTtJQUNYLGtDQUFrQyxFQUFFLE9BQUM7U0FDbEMsTUFBTSxDQUFDO1FBQ04sc0JBQXNCLEVBQUUsb0JBQW9CO1FBQzVDLFlBQVksRUFBRSwrQkFBbUI7UUFDakMsUUFBUSxFQUFFLDhCQUFrQjtRQUM1QixNQUFNLEVBQUUsb0JBQW9CO0tBQzdCLENBQUM7U0FDRCxNQUFNLEVBQUU7SUFDWCxhQUFhLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7Q0FDYyxDQUFDO0FBRXhDLFFBQUEsc0JBQXNCLEdBQUc7SUFDcEMsR0FBRyxpQ0FBeUI7SUFDNUIscUJBQXFCLEVBQUUsaUNBQXlCLENBQzlDLHFCQUFxQixDQUN0QixDQUFDLE1BQU0sQ0FBQztRQUNQLFNBQVMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO0tBQzVCLENBQUM7SUFDRixhQUFhLEVBQUUsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzdELFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO0tBQzdCLENBQUM7Q0FDZ0QsQ0FBQyJ9
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveExpirationStrategy = exports.resolveS3Credentials = exports.S3_BUILD_PLACEHOLDERS = exports.createS3CacheStorageConfig = exports.createS3CacheFileModuleConfig = exports.validateS3CacheProviderOptions = void 0;
|
|
4
|
+
const PACKAGE_NAME = "medusa-s3-cache-storage";
|
|
5
|
+
const DEFAULT_CACHE = {
|
|
6
|
+
cleanupIntervalMs: 900_000,
|
|
7
|
+
dir: "./.medusa-s3-cache",
|
|
8
|
+
expirationStrategy: "absolute",
|
|
9
|
+
ttlMs: 3_600_000,
|
|
10
|
+
};
|
|
11
|
+
const DEFAULT_PRIVATE_DOWNLOAD_DURATION_SECONDS = 3_600;
|
|
12
|
+
const invalid = (message) => {
|
|
13
|
+
throw new TypeError(`${PACKAGE_NAME}: ${message}`);
|
|
14
|
+
};
|
|
15
|
+
const requireNonBlankString = (value, field) => {
|
|
16
|
+
if (typeof value === "string") {
|
|
17
|
+
const trimmed = value.trim();
|
|
18
|
+
if (trimmed) {
|
|
19
|
+
return trimmed;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return invalid(`${field} must be a non-blank string`);
|
|
23
|
+
};
|
|
24
|
+
const validateHttpUrl = (value, field) => {
|
|
25
|
+
const url = requireNonBlankString(value, field);
|
|
26
|
+
try {
|
|
27
|
+
const parsed = new URL(url);
|
|
28
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
29
|
+
invalid(`${field} must be an HTTP(S) URL`);
|
|
30
|
+
}
|
|
31
|
+
if (parsed.username || parsed.password || parsed.search || parsed.hash) {
|
|
32
|
+
invalid(`${field} must not include credentials, a query, or a fragment`);
|
|
33
|
+
}
|
|
34
|
+
return parsed.toString().replace(/\/$/u, "");
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error instanceof TypeError && error.message.startsWith(PACKAGE_NAME)) {
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
return invalid(`${field} must be an HTTP(S) URL`);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const validateSafePrefix = (value, field) => {
|
|
44
|
+
if (value === undefined) {
|
|
45
|
+
return "";
|
|
46
|
+
}
|
|
47
|
+
const prefix = requireNonBlankString(value, field).replaceAll("\\", "/");
|
|
48
|
+
const segments = prefix.split("/");
|
|
49
|
+
if (segments.some((segment) => !segment ||
|
|
50
|
+
segment === "." ||
|
|
51
|
+
segment === ".." ||
|
|
52
|
+
/[\u0000-\u001F\u007F]/u.test(segment))) {
|
|
53
|
+
invalid(`${field} must contain only safe path segments`);
|
|
54
|
+
}
|
|
55
|
+
return segments.join("/");
|
|
56
|
+
};
|
|
57
|
+
const validateFiniteNumber = (value, field, minimum, maximum, defaultValue) => {
|
|
58
|
+
if (value === undefined) {
|
|
59
|
+
return defaultValue;
|
|
60
|
+
}
|
|
61
|
+
if (typeof value !== "number") {
|
|
62
|
+
return invalid(`${field} must be an integer from ${minimum} through ${maximum}`);
|
|
63
|
+
}
|
|
64
|
+
if (!Number.isFinite(value) ||
|
|
65
|
+
!Number.isInteger(value) ||
|
|
66
|
+
value < minimum ||
|
|
67
|
+
value > maximum) {
|
|
68
|
+
return invalid(`${field} must be an integer from ${minimum} through ${maximum}`);
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
};
|
|
72
|
+
const validateCacheOptions = (cache) => {
|
|
73
|
+
const expirationStrategy = cache?.expirationStrategy ?? DEFAULT_CACHE.expirationStrategy;
|
|
74
|
+
if (expirationStrategy !== "absolute" && expirationStrategy !== "sliding") {
|
|
75
|
+
invalid("cache.expirationStrategy must be 'absolute' or 'sliding'");
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
cleanupIntervalMs: validateFiniteNumber(cache?.cleanupIntervalMs, "cache.cleanupIntervalMs", 1, 86_400_000, DEFAULT_CACHE.cleanupIntervalMs),
|
|
79
|
+
dir: cache?.dir
|
|
80
|
+
? requireNonBlankString(cache.dir, "cache.dir")
|
|
81
|
+
: DEFAULT_CACHE.dir,
|
|
82
|
+
expirationStrategy,
|
|
83
|
+
ttlMs: validateFiniteNumber(cache?.ttlMs, "cache.ttlMs", 0, 604_800_000, DEFAULT_CACHE.ttlMs),
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
const validateCredentials = (credentials) => {
|
|
87
|
+
if (!credentials) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
const accessKeyId = credentials.accessKeyId;
|
|
91
|
+
const secretAccessKey = credentials.secretAccessKey;
|
|
92
|
+
if (!accessKeyId && !secretAccessKey && !credentials.sessionToken) {
|
|
93
|
+
invalid("s3.credentials must contain accessKeyId and secretAccessKey");
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
accessKeyId: requireNonBlankString(accessKeyId, "s3.credentials.accessKeyId"),
|
|
97
|
+
secretAccessKey: requireNonBlankString(secretAccessKey, "s3.credentials.secretAccessKey"),
|
|
98
|
+
...(credentials.sessionToken
|
|
99
|
+
? {
|
|
100
|
+
sessionToken: requireNonBlankString(credentials.sessionToken, "s3.credentials.sessionToken"),
|
|
101
|
+
}
|
|
102
|
+
: {}),
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
const validateGatewayOptions = (gateway) => {
|
|
106
|
+
if (!gateway) {
|
|
107
|
+
return invalid("gateway options are required when enabled is true");
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
baseUrl: validateHttpUrl(gateway.baseUrl, "gateway.baseUrl"),
|
|
111
|
+
privateDownloadDurationSeconds: validateFiniteNumber(gateway.privateDownloadDurationSeconds, "gateway.privateDownloadDurationSeconds", 1, 604_800, DEFAULT_PRIVATE_DOWNLOAD_DURATION_SECONDS),
|
|
112
|
+
signingSecret: requireNonBlankString(gateway.signingSecret, "gateway.signingSecret"),
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
const validateS3CacheProviderOptions = (input) => {
|
|
116
|
+
const s3 = input.s3;
|
|
117
|
+
if (!s3) {
|
|
118
|
+
return invalid("s3 options are required when enabled is true");
|
|
119
|
+
}
|
|
120
|
+
if (s3.forcePathStyle !== undefined &&
|
|
121
|
+
typeof s3.forcePathStyle !== "boolean") {
|
|
122
|
+
invalid("s3.forcePathStyle must be a boolean");
|
|
123
|
+
}
|
|
124
|
+
if (s3.endpoint !== undefined) {
|
|
125
|
+
validateHttpUrl(s3.endpoint, "s3.endpoint");
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
cache: validateCacheOptions(input.cache),
|
|
129
|
+
gateway: validateGatewayOptions(input.gateway),
|
|
130
|
+
s3: {
|
|
131
|
+
bucket: requireNonBlankString(s3.bucket, "s3.bucket"),
|
|
132
|
+
credentials: validateCredentials(s3.credentials),
|
|
133
|
+
endpoint: s3.endpoint === undefined
|
|
134
|
+
? undefined
|
|
135
|
+
: validateHttpUrl(s3.endpoint, "s3.endpoint"),
|
|
136
|
+
forcePathStyle: s3.forcePathStyle ?? false,
|
|
137
|
+
region: requireNonBlankString(s3.region, "s3.region"),
|
|
138
|
+
storagePrefix: validateSafePrefix(s3.storagePrefix, "s3.storagePrefix"),
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
exports.validateS3CacheProviderOptions = validateS3CacheProviderOptions;
|
|
143
|
+
const buildLocalProviderOptions = (options) => ({
|
|
144
|
+
...(options?.backendUrl ? { backend_url: options.backendUrl } : {}),
|
|
145
|
+
...(options?.privateUploadDir
|
|
146
|
+
? { private_upload_dir: options.privateUploadDir }
|
|
147
|
+
: {}),
|
|
148
|
+
...(options?.uploadDir ? { upload_dir: options.uploadDir } : {}),
|
|
149
|
+
});
|
|
150
|
+
const createS3CacheFileModuleConfig = (options = {}) => {
|
|
151
|
+
if (options.enabled !== true) {
|
|
152
|
+
return {
|
|
153
|
+
options: {
|
|
154
|
+
providers: [
|
|
155
|
+
{
|
|
156
|
+
id: "local",
|
|
157
|
+
options: buildLocalProviderOptions(options.local),
|
|
158
|
+
resolve: "@medusajs/medusa/file-local",
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
resolve: "@medusajs/medusa/file",
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return s3FileModule((0, exports.validateS3CacheProviderOptions)(options));
|
|
166
|
+
};
|
|
167
|
+
exports.createS3CacheFileModuleConfig = createS3CacheFileModuleConfig;
|
|
168
|
+
const s3FileModule = (validated) => ({
|
|
169
|
+
options: {
|
|
170
|
+
providers: [
|
|
171
|
+
{
|
|
172
|
+
id: "s3-cache",
|
|
173
|
+
options: {
|
|
174
|
+
cache: validated.cache,
|
|
175
|
+
gateway: validated.gateway,
|
|
176
|
+
s3: validated.s3,
|
|
177
|
+
},
|
|
178
|
+
resolve: "@hartl-services/medusa-base/providers/s3-cache",
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
resolve: "@medusajs/medusa/file",
|
|
183
|
+
});
|
|
184
|
+
/**
|
|
185
|
+
* Validates the options once and returns both parts S3 Cache Storage needs:
|
|
186
|
+
* the File Module with the S3 provider (under `modules`) and the `gateway`
|
|
187
|
+
* part of the base plugin's `files` option that serves its `/files` routes.
|
|
188
|
+
* Both carry the same signing secret, so every URL the provider signs is one
|
|
189
|
+
* the routes accept.
|
|
190
|
+
*/
|
|
191
|
+
const createS3CacheStorageConfig = (options) => {
|
|
192
|
+
const validated = (0, exports.validateS3CacheProviderOptions)(options);
|
|
193
|
+
return {
|
|
194
|
+
fileModule: s3FileModule(validated),
|
|
195
|
+
gateway: { signingSecret: validated.gateway.signingSecret },
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
exports.createS3CacheStorageConfig = createS3CacheStorageConfig;
|
|
199
|
+
/**
|
|
200
|
+
* `medusa build` loads the configuration without deployment secrets. These
|
|
201
|
+
* placeholders only satisfy the required-variable checks of a build; they
|
|
202
|
+
* never reach a running server.
|
|
203
|
+
*/
|
|
204
|
+
exports.S3_BUILD_PLACEHOLDERS = {
|
|
205
|
+
S3_CACHE_STORAGE_BUCKET: "build-bucket",
|
|
206
|
+
S3_CACHE_STORAGE_REGION: "build-placeholder",
|
|
207
|
+
};
|
|
208
|
+
const optionalEnvironment = (environment, name) => {
|
|
209
|
+
const value = environment[name]?.trim();
|
|
210
|
+
return value ? value : undefined;
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Static S3 credentials are optional (the AWS credential chain applies
|
|
214
|
+
* otherwise) but must be complete when present. They are never read during
|
|
215
|
+
* a build.
|
|
216
|
+
*/
|
|
217
|
+
const resolveS3Credentials = (environment, phase) => {
|
|
218
|
+
if (phase === "build") {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
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");
|
|
224
|
+
// A declared but blank key still counts: it signals intended static
|
|
225
|
+
// credentials, which must then be complete.
|
|
226
|
+
if (!("S3_CACHE_STORAGE_ACCESS_KEY_ID" in environment) &&
|
|
227
|
+
!("S3_CACHE_STORAGE_SECRET_ACCESS_KEY" in environment) &&
|
|
228
|
+
!sessionToken) {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
const missing = [
|
|
232
|
+
accessKeyId ? undefined : "S3_CACHE_STORAGE_ACCESS_KEY_ID",
|
|
233
|
+
secretAccessKey ? undefined : "S3_CACHE_STORAGE_SECRET_ACCESS_KEY",
|
|
234
|
+
].filter((name) => name !== undefined);
|
|
235
|
+
if (missing.length > 0) {
|
|
236
|
+
throw new TypeError(`Missing required environment variables: ${missing.join(", ")}.`);
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
accessKeyId: accessKeyId,
|
|
240
|
+
secretAccessKey: secretAccessKey,
|
|
241
|
+
...(sessionToken ? { sessionToken } : {}),
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
exports.resolveS3Credentials = resolveS3Credentials;
|
|
245
|
+
const resolveExpirationStrategy = (environment, defaultValue) => {
|
|
246
|
+
const value = optionalEnvironment(environment, "S3_CACHE_STORAGE_EXPIRATION_STRATEGY");
|
|
247
|
+
if (value === undefined) {
|
|
248
|
+
return defaultValue;
|
|
249
|
+
}
|
|
250
|
+
if (value !== "absolute" && value !== "sliding") {
|
|
251
|
+
throw new TypeError('S3_CACHE_STORAGE_EXPIRATION_STRATEGY must be either "absolute" or "sliding".');
|
|
252
|
+
}
|
|
253
|
+
return value;
|
|
254
|
+
};
|
|
255
|
+
exports.resolveExpirationStrategy = resolveExpirationStrategy;
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZmlsZXMvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVlBLE1BQU0sWUFBWSxHQUFHLHlCQUF5QixDQUFDO0FBRS9DLE1BQU0sYUFBYSxHQUFrQztJQUNuRCxpQkFBaUIsRUFBRSxPQUFPO0lBQzFCLEdBQUcsRUFBRSxvQkFBb0I7SUFDekIsa0JBQWtCLEVBQUUsVUFBVTtJQUM5QixLQUFLLEVBQUUsU0FBUztDQUNqQixDQUFDO0FBRUYsTUFBTSx5Q0FBeUMsR0FBRyxLQUFLLENBQUM7QUFFeEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFlLEVBQVMsRUFBRTtJQUN6QyxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsWUFBWSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQWMsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUN0RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEtBQUssNkJBQTZCLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWMsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUNoRSxNQUFNLEdBQUcsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFaEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxNQUFNLENBQUMsUUFB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
|