@hartl-services/medusa-base 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/.medusa/server/src/admin/index.js +741 -36
  2. package/.medusa/server/src/admin/index.mjs +743 -38
  3. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/route.js +31 -0
  4. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/runs/route.js +16 -0
  5. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/route.js +14 -0
  6. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/settings/route.js +22 -0
  7. package/.medusa/server/src/api/admin/plugin-features/route.js +6 -4
  8. package/.medusa/server/src/api/middlewares.js +22 -8
  9. package/.medusa/server/src/api/plugin-actions.js +221 -0
  10. package/.medusa/server/src/api/plugin-features-http.js +67 -8
  11. package/.medusa/server/src/modules/plugin-features/domain/plugin-action-runs.js +92 -0
  12. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +213 -0
  13. package/.medusa/server/src/modules/plugin-features/domain/secret-box.js +56 -0
  14. package/.medusa/server/src/modules/plugin-features/migrations/Migration20260928205031.js +16 -0
  15. package/.medusa/server/src/modules/plugin-features/migrations/Migration20260928215428.js +17 -0
  16. package/.medusa/server/src/modules/plugin-features/models/plugin-action-run.js +43 -0
  17. package/.medusa/server/src/modules/plugin-features/models/plugin-setting-state.js +32 -0
  18. package/.medusa/server/src/modules/plugin-features/service.js +419 -17
  19. package/.medusa/server/src/public/action-progress.js +67 -0
  20. package/.medusa/server/src/public/descriptor.js +199 -2
  21. package/.medusa/server/src/public/effective-features.js +9 -5
  22. package/.medusa/server/src/public/enforcement.js +18 -8
  23. package/.medusa/server/src/public/index.js +10 -2
  24. package/.medusa/server/src/public/module-access.js +14 -0
  25. package/.medusa/server/src/public/sentry-logger.js +82 -0
  26. package/.medusa/server/src/public/settings.js +17 -0
  27. package/.medusa/server/src/public/shop-master-data.js +95 -0
  28. package/.medusa/server/src/utils/discover-complete-cart-participants.js +9 -2
  29. package/.medusa/server/src/utils/discover-plugin-features.js +47 -9
  30. package/.medusa/server/src/workflows/hooks/complete-cart-participants.js +28 -16
  31. package/README.md +416 -12
  32. package/dist/admin-components/features/plugin-features/components/PluginActionsSection.d.ts +6 -0
  33. package/dist/admin-components/features/plugin-features/components/PluginActionsSection.js +66 -0
  34. package/dist/admin-components/features/plugin-features/components/PluginDetailPage.d.ts +2 -0
  35. package/dist/admin-components/features/plugin-features/components/PluginDetailPage.js +9 -0
  36. package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.d.ts +22 -0
  37. package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.js +18 -0
  38. package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.d.ts +11 -0
  39. package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.js +19 -0
  40. package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +12 -0
  41. package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.js +34 -0
  42. package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.d.ts +5 -0
  43. package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +16 -0
  44. package/dist/admin-components/features/plugin-features/components/PluginHubCard.d.ts +7 -0
  45. package/dist/admin-components/features/plugin-features/components/PluginHubCard.js +21 -0
  46. package/dist/admin-components/features/plugin-features/components/PluginPageShell.d.ts +13 -0
  47. package/dist/admin-components/features/plugin-features/components/PluginPageShell.js +20 -0
  48. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +7 -0
  49. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +39 -0
  50. package/dist/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +5 -0
  51. package/dist/admin-components/features/plugin-features/components/PluginStatusChips.js +8 -0
  52. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +114 -0
  53. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.js +40 -0
  54. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +392 -0
  55. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.js +128 -0
  56. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +93 -0
  57. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.js +44 -0
  58. package/dist/admin-components/features/plugin-features/lib/action-runs.d.ts +19 -0
  59. package/dist/admin-components/features/plugin-features/lib/action-runs.js +74 -0
  60. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +363 -0
  61. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.js +9 -0
  62. package/dist/admin-components/features/plugin-features/lib/plugin-paths.d.ts +4 -0
  63. package/dist/admin-components/features/plugin-features/lib/plugin-paths.js +4 -0
  64. package/dist/admin-components/features/plugin-features/lib/settings-draft.d.ts +28 -0
  65. package/dist/admin-components/features/plugin-features/lib/settings-draft.js +86 -0
  66. package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.d.ts +7 -0
  67. package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.js +7 -0
  68. package/dist/admin-components/i18n/texts.d.ts +90 -0
  69. package/dist/admin-components/i18n/texts.js +90 -0
  70. package/dist/admin-components/index.d.ts +14 -0
  71. package/dist/admin-components/index.js +14 -0
  72. package/dist/admin-components/lib/errors.d.ts +6 -0
  73. package/dist/admin-components/lib/errors.js +27 -0
  74. package/dist/admin-components/lib/sdk.d.ts +2 -0
  75. package/dist/admin-components/lib/sdk.js +13 -0
  76. package/dist/public/action-progress.d.ts +25 -0
  77. package/dist/public/action-progress.js +66 -0
  78. package/dist/public/descriptor.d.ts +3 -2
  79. package/dist/public/descriptor.js +198 -1
  80. package/dist/public/effective-features.d.ts +2 -1
  81. package/dist/public/effective-features.js +8 -4
  82. package/dist/public/enforcement.d.ts +7 -0
  83. package/dist/public/enforcement.js +17 -7
  84. package/dist/public/index.d.ts +5 -2
  85. package/dist/public/index.js +9 -1
  86. package/dist/public/module-access.d.ts +3 -0
  87. package/dist/public/module-access.js +13 -0
  88. package/dist/public/sentry-logger.d.ts +11 -0
  89. package/dist/public/sentry-logger.js +81 -0
  90. package/dist/public/settings.d.ts +11 -0
  91. package/dist/public/settings.js +16 -0
  92. package/dist/public/shop-master-data.d.ts +25 -0
  93. package/dist/public/shop-master-data.js +94 -0
  94. package/dist/public/types.d.ts +97 -1
  95. package/dist/utils/discover-plugin-features.d.ts +28 -0
  96. package/dist/utils/discover-plugin-features.js +96 -0
  97. package/package.json +20 -4
@@ -4,10 +4,190 @@ exports.validatePluginFeatureDescriptor = validatePluginFeatureDescriptor;
4
4
  exports.definePluginFeatures = definePluginFeatures;
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
6
  const KEY_PATTERN = /^[a-z][a-z0-9_]{0,62}$/;
7
+ const SETTING_TYPES = new Set([
8
+ "string",
9
+ "url",
10
+ "number",
11
+ "boolean",
12
+ "secret",
13
+ "select",
14
+ ]);
15
+ const ACTION_MODES = new Set(["sync", "background"]);
16
+ const ADMIN_PAGE_PREFIX = "/settings/hartl-services/";
17
+ const BASE_PAGE_PREFIX = "/settings/hartl-services/plugin/";
18
+ const ADMIN_PAGE_PATTERN = /^\/settings\/hartl-services(\/[a-z0-9][a-z0-9_-]*)+$/;
19
+ const isHttpUrl = (value) => {
20
+ try {
21
+ const url = new URL(value);
22
+ return url.protocol === "http:" || url.protocol === "https:";
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ };
7
28
  const invalid = (pluginKey, message) => new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Ungültige Funktionsschalter für Plugin "${pluginKey}": ${message}`);
29
+ const hasText = (value) => typeof value === "string" && value.trim().length > 0;
30
+ const defaultMatchesType = (setting) => {
31
+ const value = setting.default;
32
+ switch (setting.type) {
33
+ case "string":
34
+ return hasText(value);
35
+ case "url":
36
+ return typeof value === "string" && isHttpUrl(value);
37
+ case "number":
38
+ return typeof value === "number" && Number.isFinite(value);
39
+ case "boolean":
40
+ return typeof value === "boolean";
41
+ case "select":
42
+ return (typeof value === "string" &&
43
+ (setting.options ?? []).some((option) => option.value === value));
44
+ default:
45
+ return false;
46
+ }
47
+ };
48
+ const withinBounds = (setting) => typeof setting.default !== "number" ||
49
+ ((setting.min === undefined || setting.default >= setting.min) &&
50
+ (setting.max === undefined || setting.default <= setting.max));
51
+ const isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
52
+ /** `options` only (and required) for select, `min`/`max` only for number. */
53
+ const validateTypeExtras = (pluginKey, setting) => {
54
+ if (setting.type === "select") {
55
+ const options = setting.options;
56
+ if (!Array.isArray(options) || options.length === 0) {
57
+ throw invalid(pluginKey, `Auswahl "${setting.key}" braucht mindestens eine Option.`);
58
+ }
59
+ const values = new Set();
60
+ for (const option of options) {
61
+ if (!hasText(option?.value) || !hasText(option?.label)) {
62
+ throw invalid(pluginKey, `Auswahl "${setting.key}" hat eine Option ohne value oder label.`);
63
+ }
64
+ if (values.has(option.value)) {
65
+ throw invalid(pluginKey, `Auswahl "${setting.key}" hat die Option "${option.value}" doppelt.`);
66
+ }
67
+ values.add(option.value);
68
+ }
69
+ }
70
+ else if (setting.options !== undefined) {
71
+ throw invalid(pluginKey, `Einstellung "${setting.key}": options gibt es nur bei "select".`);
72
+ }
73
+ if (setting.type !== "number") {
74
+ if (setting.min !== undefined || setting.max !== undefined) {
75
+ throw invalid(pluginKey, `Einstellung "${setting.key}": min/max gibt es nur bei "number".`);
76
+ }
77
+ return;
78
+ }
79
+ for (const [name, bound] of [
80
+ ["min", setting.min],
81
+ ["max", setting.max],
82
+ ]) {
83
+ if (bound !== undefined && !isFiniteNumber(bound)) {
84
+ throw invalid(pluginKey, `Einstellung "${setting.key}": ${name} muss eine endliche Zahl sein.`);
85
+ }
86
+ }
87
+ if (setting.min !== undefined &&
88
+ setting.max !== undefined &&
89
+ setting.min > setting.max) {
90
+ throw invalid(pluginKey, `Einstellung "${setting.key}": min ist größer als max.`);
91
+ }
92
+ };
93
+ /**
94
+ * `invalidates` lists secrets of the same plugin that a change of this
95
+ * setting deletes (e.g. an API key that must not go to a new URL).
96
+ */
97
+ const validateInvalidates = (pluginKey, setting, settings) => {
98
+ const invalidates = setting.invalidates;
99
+ if (invalidates === undefined) {
100
+ return;
101
+ }
102
+ if (!Array.isArray(invalidates) || invalidates.length === 0) {
103
+ throw invalid(pluginKey, `Einstellung "${setting.key}": invalidates muss eine nicht-leere Liste sein.`);
104
+ }
105
+ const seen = new Set();
106
+ for (const key of invalidates) {
107
+ const target = settings.find((candidate) => candidate.key === key);
108
+ if (typeof key !== "string" || !target || target.type !== "secret") {
109
+ throw invalid(pluginKey, `Einstellung "${setting.key}": invalidates nennt "${String(key)}", das keine geheime Einstellung dieses Plugins ist.`);
110
+ }
111
+ if (key === setting.key || seen.has(key)) {
112
+ throw invalid(pluginKey, `Einstellung "${setting.key}": invalidates nennt "${key}" doppelt oder sich selbst.`);
113
+ }
114
+ seen.add(key);
115
+ }
116
+ };
117
+ const validateSettings = (pluginKey, settings) => {
118
+ const seen = new Set();
119
+ for (const setting of settings) {
120
+ if (!KEY_PATTERN.test(setting.key)) {
121
+ throw invalid(pluginKey, `Einstellungs-Key "${setting.key}" hat ein ungültiges Format.`);
122
+ }
123
+ if (seen.has(setting.key)) {
124
+ throw invalid(pluginKey, `Einstellungs-Key "${setting.key}" ist doppelt.`);
125
+ }
126
+ seen.add(setting.key);
127
+ if (!hasText(setting.label)) {
128
+ throw invalid(pluginKey, `Einstellung "${setting.key}" hat kein label.`);
129
+ }
130
+ if (!SETTING_TYPES.has(setting.type)) {
131
+ throw invalid(pluginKey, `Einstellung "${setting.key}" hat einen unbekannten Typ.`);
132
+ }
133
+ if (setting.required !== undefined && typeof setting.required !== "boolean") {
134
+ throw invalid(pluginKey, `Einstellung "${setting.key}": required muss boolean sein.`);
135
+ }
136
+ validateTypeExtras(pluginKey, setting);
137
+ validateInvalidates(pluginKey, setting, settings);
138
+ if (setting.default === undefined) {
139
+ continue;
140
+ }
141
+ if (setting.type === "secret") {
142
+ throw invalid(pluginKey, `Geheime Einstellung "${setting.key}" darf keinen Standardwert haben.`);
143
+ }
144
+ if (!defaultMatchesType(setting)) {
145
+ throw invalid(pluginKey, `Standardwert von Einstellung "${setting.key}" passt nicht zum Typ "${setting.type}".`);
146
+ }
147
+ if (!withinBounds(setting)) {
148
+ throw invalid(pluginKey, `Standardwert von Einstellung "${setting.key}" liegt außerhalb von min/max.`);
149
+ }
150
+ }
151
+ };
152
+ const validateActions = (pluginKey, actions) => {
153
+ const seen = new Set();
154
+ for (const action of actions) {
155
+ if (!KEY_PATTERN.test(action.key)) {
156
+ throw invalid(pluginKey, `Aktions-Key "${action.key}" hat ein ungültiges Format.`);
157
+ }
158
+ if (seen.has(action.key)) {
159
+ throw invalid(pluginKey, `Aktions-Key "${action.key}" ist doppelt.`);
160
+ }
161
+ seen.add(action.key);
162
+ if (!hasText(action.label)) {
163
+ throw invalid(pluginKey, `Aktion "${action.key}" hat kein label.`);
164
+ }
165
+ if (!hasText(action.workflow_id)) {
166
+ throw invalid(pluginKey, `Aktion "${action.key}" hat keine workflow_id.`);
167
+ }
168
+ if (!ACTION_MODES.has(action.mode)) {
169
+ throw invalid(pluginKey, `Aktion "${action.key}" hat einen unbekannten Modus.`);
170
+ }
171
+ if (action.confirm !== undefined && !hasText(action.confirm)) {
172
+ throw invalid(pluginKey, `Aktion "${action.key}": confirm ist leer.`);
173
+ }
174
+ }
175
+ };
176
+ const validateAdminPage = (pluginKey, path) => {
177
+ if (path === undefined) {
178
+ return;
179
+ }
180
+ if (typeof path !== "string" ||
181
+ !path.startsWith(ADMIN_PAGE_PREFIX) ||
182
+ path.startsWith(BASE_PAGE_PREFIX) ||
183
+ !ADMIN_PAGE_PATTERN.test(path)) {
184
+ throw invalid(pluginKey, `admin_page "${String(path)}" muss unter "${ADMIN_PAGE_PREFIX}<plugin>" liegen und darf nicht mit "${BASE_PAGE_PREFIX}" beginnen.`);
185
+ }
186
+ };
8
187
  /**
9
188
  * Checks key format, unique feature keys, existing parents and the single
10
- * allowed nesting level. Throws `INVALID_DATA`.
189
+ * allowed nesting level, plus the optional settings, actions and Admin page.
190
+ * Throws `INVALID_DATA`.
11
191
  */
12
192
  function validatePluginFeatureDescriptor(descriptor) {
13
193
  const pluginKey = String(descriptor.plugin_key);
@@ -17,6 +197,17 @@ function validatePluginFeatureDescriptor(descriptor) {
17
197
  if (typeof descriptor.label !== "string" || !descriptor.label.trim()) {
18
198
  throw invalid(pluginKey, "label fehlt.");
19
199
  }
200
+ if (descriptor.switchable !== undefined &&
201
+ typeof descriptor.switchable !== "boolean") {
202
+ throw invalid(pluginKey, "switchable muss boolean sein.");
203
+ }
204
+ if (descriptor.default_enabled !== undefined &&
205
+ typeof descriptor.default_enabled !== "boolean") {
206
+ throw invalid(pluginKey, "default_enabled muss boolean sein.");
207
+ }
208
+ if (descriptor.switchable === false && descriptor.default_enabled === false) {
209
+ throw invalid(pluginKey, "Ein nicht abschaltbares Plugin (switchable: false) kann nicht default_enabled: false haben.");
210
+ }
20
211
  const byKey = new Map();
21
212
  for (const feature of descriptor.features) {
22
213
  if (!KEY_PATTERN.test(feature.key)) {
@@ -28,6 +219,9 @@ function validatePluginFeatureDescriptor(descriptor) {
28
219
  if (typeof feature.label !== "string" || !feature.label.trim()) {
29
220
  throw invalid(pluginKey, `Feature "${feature.key}" hat kein label.`);
30
221
  }
222
+ if (typeof feature.default_enabled !== "boolean") {
223
+ throw invalid(pluginKey, `Feature "${feature.key}": default_enabled muss boolean sein.`);
224
+ }
31
225
  byKey.set(feature.key, feature);
32
226
  }
33
227
  for (const feature of descriptor.features) {
@@ -42,6 +236,9 @@ function validatePluginFeatureDescriptor(descriptor) {
42
236
  throw invalid(pluginKey, `Feature "${feature.key}" ist zu tief verschachtelt; erlaubt ist eine Ebene.`);
43
237
  }
44
238
  }
239
+ validateSettings(pluginKey, descriptor.settings ?? []);
240
+ validateActions(pluginKey, descriptor.actions ?? []);
241
+ validateAdminPage(pluginKey, descriptor.admin_page);
45
242
  }
46
243
  /**
47
244
  * Declares a plugin's feature switches. Validates at import time so a broken
@@ -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
- const pluginEnabled = stored
15
- ? stored.enabled
16
- : descriptor.default_enabled ?? true;
15
+ // A plugin that cannot be switched off is always on, whatever is stored.
16
+ const pluginEnabled = descriptor.switchable === false
17
+ ? true
18
+ : stored
19
+ ? stored.enabled
20
+ : descriptor.default_enabled ?? true;
17
21
  const configured = new Map();
18
22
  for (const feature of descriptor.features) {
19
23
  const value = stored?.features[feature.key];
@@ -71,4 +75,4 @@ function validateFeatureUpdate(descriptor, features) {
71
75
  }
72
76
  return result;
73
77
  }
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0aXZlLWZlYXR1cmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3B1YmxpYy9lZmZlY3RpdmUtZmVhdHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2QkEsZ0VBb0NDO0FBR0Qsd0VBZUM7QUFPRCxzREFzQkM7QUFoSEQscURBQXVEO0FBdUJ2RDs7Ozs7R0FLRztBQUNILFNBQWdCLDBCQUEwQixDQUN4QyxVQUFtQyxFQUNuQyxNQUFtQztJQUVuQyxNQUFNLGFBQWEsR0FBRyxNQUFNO1FBQzFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTztRQUNoQixDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUE7SUFFdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUE7SUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0MsVUFBVSxDQUFDLEdBQUcsQ0FDWixPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUM3RCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBZ0MsRUFBVyxFQUFFO1FBQzlELElBQUksQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0QsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUNELDBFQUEwRTtRQUMxRSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQTtJQUNwRCxDQUFDLENBQUE7SUFFRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLGFBQWE7UUFDdEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELFVBQVU7WUFDVixPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSTtZQUNoRCxpQkFBaUIsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDO1NBQ3pDLENBQUMsQ0FBQztLQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQWdCLDhCQUE4QixDQUM1QyxVQUFtQyxFQUNuQyxNQUFtQztJQUVuQyxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDN0QsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQTtJQUM1QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUE7SUFDMUQsQ0FBQztJQUVELE9BQU87UUFDTCxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVU7UUFDakMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLFFBQVE7S0FDVCxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FDbkMsVUFBbUMsRUFDbkMsUUFBaUM7SUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzNFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUV6RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qiw0Q0FBNEMsVUFBVSxDQUFDLFVBQVUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQzdGLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQTtJQUMxQyxLQUFLLE1BQU0sT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25DLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMifQ==
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0aXZlLWZlYXR1cmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3B1YmxpYy9lZmZlY3RpdmUtZmVhdHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsZ0VBd0NDO0FBR0Qsd0VBZUM7QUFPRCxzREFzQkM7QUFySEQscURBQXVEO0FBdUJ2RDs7Ozs7O0dBTUc7QUFDSCxTQUFnQiwwQkFBMEIsQ0FDeEMsVUFBbUMsRUFDbkMsTUFBbUM7SUFFbkMseUVBQXlFO0lBQ3pFLE1BQU0sYUFBYSxHQUNqQixVQUFVLENBQUMsVUFBVSxLQUFLLEtBQUs7UUFDN0IsQ0FBQyxDQUFDLElBQUk7UUFDTixDQUFDLENBQUMsTUFBTTtZQUNOLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTztZQUNoQixDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUE7SUFFMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUE7SUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0MsVUFBVSxDQUFDLEdBQUcsQ0FDWixPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUM3RCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBZ0MsRUFBVyxFQUFFO1FBQzlELElBQUksQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0QsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENB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
@@ -1,15 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isPluginFeatureEnabled = isPluginFeatureEnabled;
4
+ exports.isPluginFeatureEnabledByKey = isPluginFeatureEnabledByKey;
4
5
  exports.requirePluginFeature = requirePluginFeature;
5
6
  const utils_1 = require("@medusajs/framework/utils");
6
- const constants_1 = require("./constants");
7
- const resolveReader = (container) => {
8
- if (!container.hasRegistration(constants_1.PLUGIN_FEATURES_MODULE)) {
9
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "@hartl-services/medusa-base ist nicht in medusa-config registriert.");
10
- }
11
- return container.resolve(constants_1.PLUGIN_FEATURES_MODULE);
12
- };
7
+ const discover_plugin_features_1 = require("../utils/discover-plugin-features");
8
+ const module_access_1 = require("./module-access");
9
+ const resolveReader = (container) => (0, module_access_1.resolveBaseModule)(container);
13
10
  const allEnabled = (effective, keys) => effective.enabled && keys.every((key) => effective.features[key] === true);
14
11
  /**
15
12
  * For subscribers, jobs and workflow steps. No keys = plugin switch only;
@@ -19,6 +16,19 @@ async function isPluginFeatureEnabled(container, descriptor, ...keys) {
19
16
  const effective = await resolveReader(container).retrieveEffectiveFeatures(descriptor);
20
17
  return allEnabled(effective, keys);
21
18
  }
19
+ /**
20
+ * Like `isPluginFeatureEnabled`, for another plugin known only by its key
21
+ * (no import of that plugin): finds its descriptor among the registered
22
+ * modules. An unknown or uninstalled plugin key is `false`, as is an
23
+ * undeclared feature key. Read failures propagate.
24
+ */
25
+ async function isPluginFeatureEnabledByKey(container, pluginKey, ...featureKeys) {
26
+ const descriptor = (0, discover_plugin_features_1.findPluginFeatureDescriptor)(container, pluginKey);
27
+ if (!descriptor) {
28
+ return false;
29
+ }
30
+ return isPluginFeatureEnabled(container, descriptor, ...featureKeys);
31
+ }
22
32
  // Keyed by the request object, so one request reads each plugin's toggles once
23
33
  // even when several gate middlewares match it.
24
34
  const requestMemo = new WeakMap();
@@ -48,4 +58,4 @@ function requirePluginFeature(descriptor, ...keys) {
48
58
  next();
49
59
  };
50
60
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHVibGljL2VuZm9yY2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUNBLHdEQVFDO0FBK0JELG9EQW9CQztBQTNGRCxxREFBdUQ7QUFFdkQsMkNBQW9EO0FBVXBELE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBMEIsRUFBdUIsRUFBRTtJQUN4RSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxrQ0FBc0IsQ0FBQyxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyxxRUFBcUUsQ0FDdEUsQ0FBQTtJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQXNCLGtDQUFzQixDQUFDLENBQUE7QUFDdkUsQ0FBQyxDQUFBO0FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FDakIsU0FBa0MsRUFDbEMsSUFBdUIsRUFDZCxFQUFFLENBQ1gsU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFBO0FBRTVFOzs7R0FHRztBQUNJLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsU0FBMEIsRUFDMUIsVUFBc0MsRUFDdEMsR0FBRyxJQUFTO0lBRVosTUFBTSxTQUFTLEdBQ2IsTUFBTSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDdEUsT0FBTyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQ3BDLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsK0NBQStDO0FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksT0FBTyxFQUc1QixDQUFBO0FBRUgsTUFBTSxtQkFBbUIsR0FBRyxDQUMxQixHQUFrQixFQUNsQixVQUFtQyxFQUNELEVBQUU7SUFDcEMsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDdEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ25ELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3hFLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQ2xDLFVBQXNDLEVBQ3RDLEdBQUcsSUFBUztJQUVaLE9BQU8sS0FBSyxFQUNWLEdBQWtCLEVBQ2xCLElBQW9CLEVBQ3BCLElBQXdCLEVBQ1QsRUFBRTtRQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUU1RCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLG9EQUFvRCxDQUNyRCxDQUFBO1FBQ0gsQ0FBQztRQUVELElBQUksRUFBRSxDQUFBO0lBQ1IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyJ9
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHVibGljL2VuZm9yY2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUNBLHdEQVFDO0FBUUQsa0VBVUM7QUErQkQsb0RBb0JDO0FBdkdELHFEQUF1RDtBQUV2RCxnRkFBK0U7QUFDL0UsbURBQW1EO0FBVW5ELE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBMEIsRUFBdUIsRUFBRSxDQUN4RSxJQUFBLGlDQUFpQixFQUFzQixTQUFTLENBQUMsQ0FBQTtBQUVuRCxNQUFNLFVBQVUsR0FBRyxDQUNqQixTQUFrQyxFQUNsQyxJQUF1QixFQUNkLEVBQUUsQ0FDWCxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUE7QUFFNUU7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxTQUEwQixFQUMxQixVQUFzQyxFQUN0QyxHQUFHLElBQVM7SUFFWixNQUFNLFNBQVMsR0FDYixNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN0RSxPQUFPLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDcEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxTQUEwQixFQUMxQixTQUFpQixFQUNqQixHQUFHLFdBQXFCO0lBRXhCLE1BQU0sVUFBVSxHQUFHLElBQUEsc0RBQTJCLEVBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3BFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxPQUFPLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLCtDQUErQztBQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLE9BQU8sRUFHNUIsQ0FBQTtBQUVILE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsR0FBa0IsRUFDbEIsVUFBbUMsRUFDRCxFQUFFO0lBQ3BDLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNuRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RSxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMsQ0FBQTtBQUVEOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxVQUFzQyxFQUN0QyxHQUFHLElBQVM7SUFFWixPQUFPLEtBQUssRUFDVixHQUFrQixFQUNsQixJQUFvQixFQUNwQixJQUF3QixFQUNULEVBQUU7UUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixvREFBb0QsQ0FDckQsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQTtJQUNSLENBQUMsQ0FBQTtBQUNILENBQUMifQ==
@@ -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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHVibGljL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFvRDtBQUEzQyxtSEFBQSxzQkFBc0IsT0FBQTtBQUMvQiwyQ0FBbUQ7QUFBMUMsa0hBQUEsb0JBQW9CLE9BQUE7QUFDN0IsMkRBQXFFO0FBQTVELG9JQUFBLDhCQUE4QixPQUFBO0FBQ3ZDLDZDQUE0RTtBQUFuRSxxSEFBQSxzQkFBc0IsT0FBQTtBQUFFLG1IQUFBLG9CQUFvQixPQUFBIn0=
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,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,82 @@
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.withSentryErrorReporting = withSentryErrorReporting;
37
+ const Sentry = __importStar(require("@sentry/node"));
38
+ /**
39
+ * Medusa's own HTTP error-handler middleware fully "handles" every thrown
40
+ * route/workflow error via logger.error(...) before it can ever reach an
41
+ * uncaught-exception process hook, so Sentry's default Node integrations
42
+ * never see it. Bridging logger.error(...) itself is the only place that
43
+ * reliably captures every error Medusa's framework already logs internally.
44
+ * Errors that Medusa logs through logger.warn(err) (failing event
45
+ * subscribers) are reported too, at warning level.
46
+ */
47
+ function withSentryErrorReporting(logger) {
48
+ const originalError = logger.error.bind(logger);
49
+ const originalWarn = logger.warn.bind(logger);
50
+ return {
51
+ panic: logger.panic.bind(logger),
52
+ shouldLog: logger.shouldLog.bind(logger),
53
+ setLogLevel: logger.setLogLevel.bind(logger),
54
+ unsetLogLevel: logger.unsetLogLevel.bind(logger),
55
+ activity: logger.activity.bind(logger),
56
+ progress: logger.progress.bind(logger),
57
+ failure: logger.failure.bind(logger),
58
+ success: logger.success.bind(logger),
59
+ silly: logger.silly.bind(logger),
60
+ debug: logger.debug.bind(logger),
61
+ verbose: logger.verbose.bind(logger),
62
+ http: logger.http.bind(logger),
63
+ info: logger.info.bind(logger),
64
+ // Medusa's Redis Event Bus logs a failing subscriber's exception with
65
+ // warn(err), even on the final retry, so an Error passed to warn is a real
66
+ // failure too. Plain warning messages stay out of Sentry.
67
+ warn: (message) => {
68
+ if (message instanceof Error) {
69
+ Sentry.captureException(message, { level: "warning" });
70
+ }
71
+ return originalWarn(message);
72
+ },
73
+ log: logger.log.bind(logger),
74
+ error: (messageOrError, error) => {
75
+ const exception = error ?? (messageOrError instanceof Error ? messageOrError : new Error(messageOrError));
76
+ const loggerMessage = error && typeof messageOrError === "string" ? messageOrError : undefined;
77
+ Sentry.captureException(exception, loggerMessage ? { extra: { loggerMessage } } : undefined);
78
+ return originalError(messageOrError, error);
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudHJ5LWxvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wdWJsaWMvc2VudHJ5LWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVlBLDREQTBDQztBQXRERCxxREFBc0M7QUFHdEM7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFjO0lBQ3JELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQy9DLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdDLE9BQU87UUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2hDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDeEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1QyxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2hELFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNoQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM5QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLHNFQUFzRTtRQUN0RSwyRUFBMkU7UUFDM0UsMERBQTBEO1FBQzFELElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hCLElBQUssT0FBbUIsWUFBWSxLQUFLLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBQ3hELENBQUM7WUFDRCxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM5QixDQUFDO1FBQ0QsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1QixLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDL0IsTUFBTSxTQUFTLEdBQ2IsS0FBSyxJQUFJLENBQUMsY0FBYyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO1lBQ3pGLE1BQU0sYUFBYSxHQUNqQixLQUFLLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtZQUUxRSxNQUFNLENBQUMsZ0JBQWdCLENBQ3JCLFNBQVMsRUFDVCxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUN6RCxDQUFBO1lBRUQsT0FBTyxhQUFhLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzdDLENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQyJ9
@@ -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,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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