@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
|
@@ -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
|
|
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
|
|
@@ -51,4 +248,4 @@ function definePluginFeatures(descriptor) {
|
|
|
51
248
|
validatePluginFeatureDescriptor(descriptor);
|
|
52
249
|
return descriptor;
|
|
53
250
|
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wdWJsaWMvZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdCQSwwRUE0Q0M7QUFNRCxvREFLQztBQXZFRCxxREFBdUQ7QUFJdkQsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUE7QUFFNUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxTQUFpQixFQUFFLE9BQWUsRUFBZSxFQUFFLENBQ2xFLElBQUksbUJBQVcsQ0FDYixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDJDQUEyQyxTQUFTLE1BQU0sT0FBTyxFQUFFLENBQ3BFLENBQUE7QUFFSDs7O0dBR0c7QUFDSCxTQUFnQiwrQkFBK0IsQ0FDN0MsVUFBbUM7SUFFbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUUvQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sT0FBTyxDQUFDLFNBQVMsRUFBRSx1Q0FBdUMsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFDRCxJQUFJLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDckUsTUFBTSxPQUFPLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBdUQsQ0FBQTtJQUM1RSxLQUFLLE1BQU0sT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLE9BQU8sQ0FBQyxHQUFHLDhCQUE4QixDQUFDLENBQUE7UUFDckYsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLE9BQU8sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUE7UUFDdkUsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMvRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsWUFBWSxPQUFPLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDakMsQ0FBQztJQUVELEtBQUssTUFBTSxPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxTQUFRO1FBQ1YsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzVDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUMsTUFBTSxPQUFPLENBQ1gsU0FBUyxFQUNULFdBQVcsT0FBTyxDQUFDLFVBQVUsa0JBQWtCLE9BQU8sQ0FBQyxHQUFHLG9CQUFvQixDQUMvRSxDQUFBO1FBQ0gsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxNQUFNLE9BQU8sQ0FDWCxTQUFTLEVBQ1QsWUFBWSxPQUFPLENBQUMsR0FBRyxzREFBc0QsQ0FDOUUsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxVQUFzQztJQUV0QywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMzQyxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDIn0=
|
|
251
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wdWJsaWMvZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWtRQSwwRUF5RUM7QUFNRCxvREFTQztBQTFWRCxxREFBdUQ7QUFRdkQsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUE7QUFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDNUIsUUFBUTtJQUNSLEtBQUs7SUFDTCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0NBQ1QsQ0FBQyxDQUFBO0FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUNwRCxNQUFNLGlCQUFpQixHQUFHLDJCQUEyQixDQUFBO0FBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsa0NBQWtDLENBQUE7QUFDM0QsTUFBTSxrQkFBa0IsR0FBRyxzREFBc0QsQ0FBQTtBQUVqRixNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQWEsRUFBVyxFQUFFO0lBQzNDLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzFCLE9BQU8sR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUE7SUFDOUQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQWUsRUFBRSxDQUNsRSxJQUFJLG1CQUFXLENBQ2IsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QiwyQ0FBMkMsU0FBUyxNQUFNLE9BQU8sRUFBRSxDQUNwRSxDQUFBO0FBRUgsTUFBTSxPQUFPLEdBQUcsQ0FB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
|
|
@@ -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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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];
|
|
@@ -71,4 +75,4 @@ function validateFeatureUpdate(descriptor, features) {
|
|
|
71
75
|
}
|
|
72
76
|
return result;
|
|
73
77
|
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0aXZlLWZlYXR1cmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3B1YmxpYy9lZmZlY3RpdmUtZmVhdHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsZ0VBd0NDO0FBR0Qsd0VBZUM7QUFPRCxzREFzQkM7QUFySEQscURBQXVEO0FBdUJ2RDs7Ozs7O0dBTUc7QUFDSCxTQUFnQiwwQkFBMEIsQ0FDeEMsVUFBbUMsRUFDbkMsTUFBbUM7SUFFbkMseUVBQXlFO0lBQ3pFLE1BQU0sYUFBYSxHQUNqQixVQUFVLENBQUMsVUFBVSxLQUFLLEtBQUs7UUFDN0IsQ0FBQyxDQUFDLElBQUk7UUFDTixDQUFDLENBQUMsTUFBTTtZQUNOLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTztZQUNoQixDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUE7SUFFMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUE7SUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0MsVUFBVSxDQUFDLEdBQUcsQ0FDWixPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUM3RCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBZ0MsRUFBVyxFQUFFO1FBQzlELElBQUksQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0QsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUNELDBFQUEwRTtRQUMxRSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQTtJQUNwRCxDQUFDLENBQUE7SUFFRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLGFBQWE7UUFDdEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELFVBQVU7WUFDVixPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSTtZQUNoRCxpQkFBaUIsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDO1NBQ3pDLENBQUMsQ0FBQztLQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQWdCLDhCQUE4QixDQUM1QyxVQUFtQyxFQUNuQyxNQUFtQztJQUVuQyxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDN0QsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQTtJQUM1QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUE7SUFDMUQsQ0FBQztJQUVELE9BQU87UUFDTCxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVU7UUFDakMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLFFBQVE7S0FDVCxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FDbkMsVUFBbUMsRUFDbkMsUUFBaUM7SUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzNFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUV6RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qiw0Q0FBNEMsVUFBVSxDQUFDLFVBQVUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQzdGLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQTtJQUMxQyxLQUFLLE1BQU0sT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25DLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMifQ==
|
|
@@ -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
|
|
7
|
-
const
|
|
8
|
-
|
|
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();
|
|
@@ -48,4 +58,4 @@ function requirePluginFeature(descriptor, ...keys) {
|
|
|
48
58
|
next();
|
|
49
59
|
};
|
|
50
60
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHVibGljL2VuZm9yY2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUNBLHdEQVFDO0FBUUQsa0VBVUM7QUErQkQsb0RBb0JDO0FBdkdELHFEQUF1RDtBQUV2RCxnRkFBK0U7QUFDL0UsbURBQW1EO0FBVW5ELE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBMEIsRUFBdUIsRUFBRSxDQUN4RSxJQUFBLGlDQUFpQixFQUFzQixTQUFTLENBQUMsQ0FBQTtBQUVuRCxNQUFNLFVBQVUsR0FBRyxDQUNqQixTQUFrQyxFQUNsQyxJQUF1QixFQUNkLEVBQUUsQ0FDWCxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUE7QUFFNUU7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxTQUEwQixFQUMxQixVQUFzQyxFQUN0QyxHQUFHLElBQVM7SUFFWixNQUFNLFNBQVMsR0FDYixNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN0RSxPQUFPLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDcEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxTQUEwQixFQUMxQixTQUFpQixFQUNqQixHQUFHLFdBQXFCO0lBRXhCLE1BQU0sVUFBVSxHQUFHLElBQUEsc0RBQTJCLEVBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3BFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxPQUFPLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLCtDQUErQztBQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLE9BQU8sRUFHNUIsQ0FBQTtBQUVILE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsR0FBa0IsRUFDbEIsVUFBbUMsRUFDRCxFQUFFO0lBQ3BDLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNuRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RSxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMsQ0FBQTtBQUVEOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxVQUFzQyxFQUN0QyxHQUFHLElBQVM7SUFFWixPQUFPLEtBQUssRUFDVixHQUFrQixFQUNsQixJQUFvQixFQUNwQixJQUF3QixFQUNULEVBQUU7UUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixvREFBb0QsQ0FDckQsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQTtJQUNSLENBQUMsQ0FBQTtBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
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);
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wdWJsaWMvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0ZBQWdGO0FBQ2hGLG1EQUFnQyJ9
|
|
@@ -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,5 +9,13 @@ 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; } });
|
|
13
|
-
|
|
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; } });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHVibGljL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFvRDtBQUEzQyxtSEFBQSxzQkFBc0IsT0FBQTtBQUMvQiwyQ0FBbUQ7QUFBMUMsa0hBQUEsb0JBQW9CLE9BQUE7QUFDN0IsMkRBQXFFO0FBQTVELG9JQUFBLDhCQUE4QixPQUFBO0FBQ3ZDLDZDQUlzQjtBQUhwQixxSEFBQSxzQkFBc0IsT0FBQTtBQUN0QiwwSEFBQSwyQkFBMkIsT0FBQTtBQUMzQixtSEFBQSxvQkFBb0IsT0FBQTtBQUV0Qix1Q0FBOEM7QUFBckMsNkdBQUEsaUJBQWlCLE9BQUE7QUFDMUIsdURBTTJCO0FBTHpCLHFIQUFBLGlCQUFpQixPQUFBO0FBQ2pCLDRIQUFBLHdCQUF3QixPQUFBO0FBSzFCLHFEQUcwQjtBQUZ4Qiw2SEFBQSwwQkFBMEIsT0FBQSJ9
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3B1YmxpYy9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhQSw0QkFNQztBQW5CRCxxREFBc0M7QUFFdEM7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLFFBQVE7SUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNWLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVU7UUFDM0IsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO1FBQ25FLGdCQUFnQixFQUFFLENBQUM7S0FDcEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
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;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLWFjY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wdWJsaWMvbW9kdWxlLWFjY2Vzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFFdkQsMkNBQW9EO0FBRXBELHlFQUF5RTtBQUNsRSxNQUFNLGlCQUFpQixHQUFHLENBQUksU0FBMEIsRUFBSyxFQUFFO0lBQ3BFLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLGtDQUFzQixDQUFDLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLHFFQUFxRSxDQUN0RSxDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBSSxrQ0FBc0IsQ0FBQyxDQUFBO0FBQ3JELENBQUMsQ0FBQTtBQVJZLFFBQUEsaUJBQWlCLHFCQVE3QiJ9
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHVibGljL3NldHRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUJBLDhDQWdCQztBQXZDRCxtREFBbUQ7QUFlbkQ7Ozs7Ozs7R0FPRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FLckMsU0FBMEIsRUFDMUIsVUFBNEMsRUFDNUMsUUFBb0M7SUFFcEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLGlDQUFpQixFQUN0QyxTQUFTLENBQ1YsQ0FBQyxxQkFBcUIsQ0FDckIsVUFBVSxFQUNWLFFBQThDLENBQy9DLENBQUE7SUFDRCxPQUFPLFFBQXFDLENBQUE7QUFDOUMsQ0FBQyJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
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; } });
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHVibGljL3Nob3AtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7O0dBSUc7QUFDSCxnRkFHOEM7QUFGNUMsNkhBQUEsbUJBQW1CLE9BQUE7QUFDbkIsOEhBQUEsb0JBQW9CLE9BQUEifQ==
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcC1tYXN0ZXItZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wdWJsaWMvc2hvcC1tYXN0ZXItZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4R0EsOENBb0JDO0FBaElELDZDQUFtRDtBQUNuRCx5Q0FBOEM7QUFHOUM7Ozs7R0FJRztBQUNVLFFBQUEsd0JBQXdCLEdBQUcsSUFBQSxpQ0FBb0IsRUFBQztJQUMzRCxVQUFVLEVBQUUsTUFBTTtJQUNsQixLQUFLLEVBQUUsaUJBQWlCO0lBQ3hCLFdBQVcsRUFDVCx3RUFBd0U7SUFDMUUsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLEVBQUU7SUFDWixRQUFRLEVBQUU7UUFDUixFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDMUUsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQzFFLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7UUFDL0QsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQzdFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtRQUM3RDtZQUNFLEdBQUcsRUFBRSxjQUFjO1lBQ25CLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUUsSUFBSTtZQUNkLGlFQUFpRTtZQUNqRSwwQkFB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
|