@hartl-services/medusa-base 0.3.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 (94) 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/settings.js +17 -0
  26. package/.medusa/server/src/public/shop-master-data.js +95 -0
  27. package/.medusa/server/src/utils/discover-complete-cart-participants.js +9 -2
  28. package/.medusa/server/src/utils/discover-plugin-features.js +47 -9
  29. package/.medusa/server/src/workflows/hooks/complete-cart-participants.js +28 -16
  30. package/README.md +393 -12
  31. package/dist/admin-components/features/plugin-features/components/PluginActionsSection.d.ts +6 -0
  32. package/dist/admin-components/features/plugin-features/components/PluginActionsSection.js +66 -0
  33. package/dist/admin-components/features/plugin-features/components/PluginDetailPage.d.ts +2 -0
  34. package/dist/admin-components/features/plugin-features/components/PluginDetailPage.js +9 -0
  35. package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.d.ts +22 -0
  36. package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.js +18 -0
  37. package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.d.ts +11 -0
  38. package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.js +19 -0
  39. package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +12 -0
  40. package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.js +34 -0
  41. package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.d.ts +5 -0
  42. package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +16 -0
  43. package/dist/admin-components/features/plugin-features/components/PluginHubCard.d.ts +7 -0
  44. package/dist/admin-components/features/plugin-features/components/PluginHubCard.js +21 -0
  45. package/dist/admin-components/features/plugin-features/components/PluginPageShell.d.ts +13 -0
  46. package/dist/admin-components/features/plugin-features/components/PluginPageShell.js +20 -0
  47. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +7 -0
  48. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +39 -0
  49. package/dist/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +5 -0
  50. package/dist/admin-components/features/plugin-features/components/PluginStatusChips.js +8 -0
  51. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +114 -0
  52. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.js +40 -0
  53. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +392 -0
  54. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.js +128 -0
  55. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +93 -0
  56. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.js +44 -0
  57. package/dist/admin-components/features/plugin-features/lib/action-runs.d.ts +19 -0
  58. package/dist/admin-components/features/plugin-features/lib/action-runs.js +74 -0
  59. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +363 -0
  60. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.js +9 -0
  61. package/dist/admin-components/features/plugin-features/lib/plugin-paths.d.ts +4 -0
  62. package/dist/admin-components/features/plugin-features/lib/plugin-paths.js +4 -0
  63. package/dist/admin-components/features/plugin-features/lib/settings-draft.d.ts +28 -0
  64. package/dist/admin-components/features/plugin-features/lib/settings-draft.js +86 -0
  65. package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.d.ts +7 -0
  66. package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.js +7 -0
  67. package/dist/admin-components/i18n/texts.d.ts +90 -0
  68. package/dist/admin-components/i18n/texts.js +90 -0
  69. package/dist/admin-components/index.d.ts +14 -0
  70. package/dist/admin-components/index.js +14 -0
  71. package/dist/admin-components/lib/errors.d.ts +6 -0
  72. package/dist/admin-components/lib/errors.js +27 -0
  73. package/dist/admin-components/lib/sdk.d.ts +2 -0
  74. package/dist/admin-components/lib/sdk.js +13 -0
  75. package/dist/public/action-progress.d.ts +25 -0
  76. package/dist/public/action-progress.js +66 -0
  77. package/dist/public/descriptor.d.ts +3 -2
  78. package/dist/public/descriptor.js +198 -1
  79. package/dist/public/effective-features.d.ts +2 -1
  80. package/dist/public/effective-features.js +8 -4
  81. package/dist/public/enforcement.d.ts +7 -0
  82. package/dist/public/enforcement.js +17 -7
  83. package/dist/public/index.d.ts +5 -2
  84. package/dist/public/index.js +9 -1
  85. package/dist/public/module-access.d.ts +3 -0
  86. package/dist/public/module-access.js +13 -0
  87. package/dist/public/settings.d.ts +11 -0
  88. package/dist/public/settings.js +16 -0
  89. package/dist/public/shop-master-data.d.ts +25 -0
  90. package/dist/public/shop-master-data.js +94 -0
  91. package/dist/public/types.d.ts +97 -1
  92. package/dist/utils/discover-plugin-features.d.ts +28 -0
  93. package/dist/utils/discover-plugin-features.js +96 -0
  94. package/package.json +7 -3
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toStoredSettingValues = exports.missingSettingKeys = exports.isSealed = void 0;
4
+ exports.normalizeSettingValue = normalizeSettingValue;
5
+ exports.validateSettingsUpdate = validateSettingsUpdate;
6
+ exports.mergeStoredSettings = mergeStoredSettings;
7
+ exports.resolveSettingValues = resolveSettingValues;
8
+ const utils_1 = require("@medusajs/framework/utils");
9
+ const isHttpUrl = (value) => {
10
+ try {
11
+ const url = new URL(value);
12
+ return url.protocol === "http:" || url.protocol === "https:";
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ };
18
+ const isSealed = (value) => typeof value === "object" &&
19
+ value !== null &&
20
+ typeof value.enc === "string";
21
+ exports.isSealed = isSealed;
22
+ /**
23
+ * Normalizes `value` for `definition` or returns why it is invalid. Strings
24
+ * and URLs are trimmed; secrets are kept exactly as entered.
25
+ */
26
+ function normalizeSettingValue(definition, value) {
27
+ switch (definition.type) {
28
+ case "string":
29
+ case "url": {
30
+ if (typeof value !== "string" || !value.trim()) {
31
+ return { ok: false, message: "muss ein nicht-leerer Text sein" };
32
+ }
33
+ const trimmed = value.trim();
34
+ if (definition.type === "url" && !isHttpUrl(trimmed)) {
35
+ return { ok: false, message: "muss eine http(s)-URL sein" };
36
+ }
37
+ return { ok: true, value: trimmed };
38
+ }
39
+ case "secret":
40
+ return typeof value === "string" && value.trim()
41
+ ? { ok: true, value }
42
+ : { ok: false, message: "muss ein nicht-leerer Text sein" };
43
+ case "number": {
44
+ if (typeof value !== "number" || !Number.isFinite(value)) {
45
+ return { ok: false, message: "muss eine endliche Zahl sein" };
46
+ }
47
+ if (definition.min !== undefined && value < definition.min) {
48
+ return { ok: false, message: `muss mindestens ${definition.min} sein` };
49
+ }
50
+ if (definition.max !== undefined && value > definition.max) {
51
+ return { ok: false, message: `darf höchstens ${definition.max} sein` };
52
+ }
53
+ return { ok: true, value };
54
+ }
55
+ case "select": {
56
+ const options = definition.options ?? [];
57
+ return typeof value === "string" &&
58
+ options.some((option) => option.value === value)
59
+ ? { ok: true, value }
60
+ : {
61
+ ok: false,
62
+ message: `muss einer der Werte ${options
63
+ .map((option) => `"${option.value}"`)
64
+ .join(", ")} sein`,
65
+ };
66
+ }
67
+ case "boolean":
68
+ return typeof value === "boolean"
69
+ ? { ok: true, value }
70
+ : { ok: false, message: "muss true oder false sein" };
71
+ default:
72
+ return { ok: false, message: "hat einen unbekannten Typ" };
73
+ }
74
+ }
75
+ const invalid = (pluginKey, message) => new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Ungültige Einstellungen für Plugin "${pluginKey}": ${message}`);
76
+ /**
77
+ * Validates an Admin update against the declared settings. `null` clears a
78
+ * key; any other value is normalized. Throws `INVALID_DATA` naming the key.
79
+ */
80
+ function validateSettingsUpdate(descriptor, values) {
81
+ const declared = new Map((descriptor.settings ?? []).map((setting) => [setting.key, setting]));
82
+ const unknown = Object.keys(values).filter((key) => !declared.has(key));
83
+ if (unknown.length) {
84
+ throw invalid(descriptor.plugin_key, `unbekannte Einstellungen ${unknown.map((key) => `"${key}"`).join(", ")}.`);
85
+ }
86
+ const result = {};
87
+ for (const [key, value] of Object.entries(values)) {
88
+ if (value === null) {
89
+ result[key] = null;
90
+ continue;
91
+ }
92
+ const checked = normalizeSettingValue(declared.get(key), value);
93
+ if (!checked.ok) {
94
+ throw invalid(descriptor.plugin_key, `"${key}" ${checked.message}.`);
95
+ }
96
+ result[key] = checked.value;
97
+ }
98
+ return result;
99
+ }
100
+ const sameStored = (left, right) => (0, exports.isSealed)(left) || (0, exports.isSealed)(right) ? false : left === right;
101
+ /**
102
+ * Applies a validated update to the stored values: `null` deletes, secrets
103
+ * are sealed, secrets not sent keep their stored value, keys the descriptor
104
+ * no longer declares are dropped. When a setting with `invalidates` changed,
105
+ * the stored values of the listed secrets are deleted too, unless the same
106
+ * update sets them anew. `changed_keys` lists every declared key whose
107
+ * stored value was set, replaced or removed (a re-sent secret counts), in
108
+ * declaration order.
109
+ */
110
+ function mergeStoredSettings(descriptor, current, update, seal) {
111
+ const values = {};
112
+ const changed = [];
113
+ for (const definition of descriptor.settings ?? []) {
114
+ const key = definition.key;
115
+ const before = current[key];
116
+ if (!(key in update)) {
117
+ if (before !== undefined) {
118
+ values[key] = before;
119
+ }
120
+ continue;
121
+ }
122
+ const next = update[key];
123
+ if (next === null || next === undefined) {
124
+ if (before !== undefined) {
125
+ changed.push(key);
126
+ }
127
+ continue;
128
+ }
129
+ const stored = definition.type === "secret" ? { enc: seal(String(next), key) } : next;
130
+ values[key] = stored;
131
+ if (!sameStored(before, stored)) {
132
+ changed.push(key);
133
+ }
134
+ }
135
+ const invalidated = new Set();
136
+ for (const definition of descriptor.settings ?? []) {
137
+ if (!changed.includes(definition.key)) {
138
+ continue;
139
+ }
140
+ for (const target of definition.invalidates ?? []) {
141
+ const resent = update[target] !== null && update[target] !== undefined;
142
+ if (!resent && values[target] !== undefined) {
143
+ delete values[target];
144
+ invalidated.add(target);
145
+ }
146
+ }
147
+ }
148
+ const changedKeys = (descriptor.settings ?? [])
149
+ .map(({ key }) => key)
150
+ .filter((key) => changed.includes(key) || invalidated.has(key));
151
+ return { values, changed_keys: changedKeys };
152
+ }
153
+ /**
154
+ * Current value and source of every declared setting. Precedence:
155
+ * stored > config fallback > default > none. A stored or fallback value that
156
+ * no longer fits the declared type is skipped; `open` returns `undefined` for
157
+ * a stored secret that cannot be decrypted, which is then skipped as well.
158
+ */
159
+ function resolveSettingValues(descriptor, stored, fallback, open) {
160
+ return (descriptor.settings ?? []).map((definition) => {
161
+ const key = definition.key;
162
+ const raw = stored[key];
163
+ if (raw !== undefined) {
164
+ const candidate = definition.type === "secret"
165
+ ? (0, exports.isSealed)(raw)
166
+ ? open(key, raw.enc)
167
+ : undefined
168
+ : (0, exports.isSealed)(raw)
169
+ ? undefined
170
+ : raw;
171
+ const checked = candidate === undefined
172
+ ? undefined
173
+ : normalizeSettingValue(definition, candidate);
174
+ if (checked?.ok) {
175
+ return { definition, source: "stored", value: checked.value };
176
+ }
177
+ }
178
+ const configured = fallback?.[key];
179
+ if (configured !== undefined && configured !== null && configured !== "") {
180
+ const checked = normalizeSettingValue(definition, configured);
181
+ if (checked.ok) {
182
+ return { definition, source: "config", value: checked.value };
183
+ }
184
+ }
185
+ if (definition.default !== undefined && definition.type !== "secret") {
186
+ return { definition, source: "default", value: definition.default };
187
+ }
188
+ return { definition, source: "none" };
189
+ });
190
+ }
191
+ /** Required settings without a value. */
192
+ const missingSettingKeys = (resolved) => resolved
193
+ .filter((setting) => setting.definition.required === true && setting.source === "none")
194
+ .map((setting) => setting.definition.key);
195
+ exports.missingSettingKeys = missingSettingKeys;
196
+ /** Reads a persisted `values` column defensively. */
197
+ const toStoredSettingValues = (raw) => {
198
+ const values = {};
199
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
200
+ return values;
201
+ }
202
+ for (const [key, value] of Object.entries(raw)) {
203
+ if (typeof value === "string" ||
204
+ typeof value === "boolean" ||
205
+ (typeof value === "number" && Number.isFinite(value)) ||
206
+ (0, exports.isSealed)(value)) {
207
+ values[key] = (0, exports.isSealed)(value) ? { enc: value.enc } : value;
208
+ }
209
+ }
210
+ return values;
211
+ };
212
+ exports.toStoredSettingValues = toStoredSettingValues;
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNldHRpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGx1Z2luLWZlYXR1cmVzL2RvbWFpbi9wbHVnaW4tc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMkNBLHNEQW1EQztBQVlELHdEQTRCQztBQWlCRCxrREFxREM7QUFRRCxvREF5Q0M7QUE3UEQscURBQXVEO0FBeUJ2RCxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQWEsRUFBVyxFQUFFO0lBQzNDLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzFCLE9BQU8sR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUE7SUFDOUQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVNLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBYyxFQUErQixFQUFFLENBQ3RFLE9BQU8sS0FBSyxLQUFLLFFBQVE7SUFDekIsS0FBSyxLQUFLLElBQUk7SUFDZCxPQUFRLEtBQTJCLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQTtBQUh6QyxRQUFBLFFBQVEsWUFHaUM7QUFFdEQ7OztHQUdHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLFVBQW1DLEVBQ25DLEtBQWM7SUFFZCxRQUFRLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNYLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxpQ0FBaUMsRUFB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
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.secretBinding = void 0;
4
+ exports.sealSecret = sealSecret;
5
+ exports.openSecret = openSecret;
6
+ const node_crypto_1 = require("node:crypto");
7
+ const HKDF_INFO = "hartl-base-plugin-settings";
8
+ const IV_BYTES = 12;
9
+ const TAG_BYTES = 16;
10
+ const KEY_BYTES = 32;
11
+ const deriveKey = (keyMaterial) => {
12
+ if (!keyMaterial) {
13
+ throw new Error("Schlüsselmaterial für geheime Einstellungen fehlt.");
14
+ }
15
+ return Buffer.from((0, node_crypto_1.hkdfSync)("sha256", keyMaterial, Buffer.alloc(0), HKDF_INFO, KEY_BYTES));
16
+ };
17
+ /**
18
+ * Additional authenticated data of one stored secret: binds the ciphertext to
19
+ * its plugin and setting key, so it cannot be moved to another key or plugin.
20
+ */
21
+ const secretBinding = (pluginKey, settingKey) => `${pluginKey}:${settingKey}`;
22
+ exports.secretBinding = secretBinding;
23
+ /**
24
+ * AES-256-GCM with a key derived by HKDF-SHA256 from `keyMaterial` and
25
+ * `binding` (see `secretBinding`) as additional authenticated data. Returns
26
+ * base64 of `iv (12) | tag (16) | ciphertext`.
27
+ */
28
+ function sealSecret(plaintext, keyMaterial, binding) {
29
+ const iv = (0, node_crypto_1.randomBytes)(IV_BYTES);
30
+ const cipher = (0, node_crypto_1.createCipheriv)("aes-256-gcm", deriveKey(keyMaterial), iv);
31
+ cipher.setAAD(Buffer.from(binding, "utf8"));
32
+ const ciphertext = Buffer.concat([
33
+ cipher.update(plaintext, "utf8"),
34
+ cipher.final(),
35
+ ]);
36
+ return Buffer.concat([iv, cipher.getAuthTag(), ciphertext]).toString("base64");
37
+ }
38
+ /**
39
+ * Reverses `sealSecret`. Throws when the value was tampered with, is
40
+ * malformed, or was sealed with different key material or another binding
41
+ * (including values sealed without one).
42
+ */
43
+ function openSecret(sealed, keyMaterial, binding) {
44
+ const raw = Buffer.from(sealed, "base64");
45
+ if (raw.length < IV_BYTES + TAG_BYTES) {
46
+ throw new Error("Verschlüsselter Wert ist unvollständig.");
47
+ }
48
+ const decipher = (0, node_crypto_1.createDecipheriv)("aes-256-gcm", deriveKey(keyMaterial), raw.subarray(0, IV_BYTES));
49
+ decipher.setAAD(Buffer.from(binding, "utf8"));
50
+ decipher.setAuthTag(raw.subarray(IV_BYTES, IV_BYTES + TAG_BYTES));
51
+ return Buffer.concat([
52
+ decipher.update(raw.subarray(IV_BYTES + TAG_BYTES)),
53
+ decipher.final(),
54
+ ]).toString("utf8");
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LWJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3BsdWdpbi1mZWF0dXJlcy9kb21haW4vc2VjcmV0LWJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpQ0EsZ0NBYUM7QUFPRCxnQ0FvQkM7QUF6RUQsNkNBS29CO0FBRXBCLE1BQU0sU0FBUyxHQUFHLDRCQUE0QixDQUFBO0FBQzlDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQTtBQUNuQixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7QUFDcEIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFBO0FBRXBCLE1BQU0sU0FBUyxHQUFHLENBQUMsV0FBbUIsRUFBVSxFQUFFO0lBQ2hELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FDaEIsSUFBQSxzQkFBUSxFQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQ3ZFLENBQUE7QUFDSCxDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGFBQWEsR0FBRyxDQUFDLFNBQWlCLEVBQUUsVUFBa0IsRUFBVSxFQUFFLENBQzdFLEdBQUcsU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFBO0FBRGpCLFFBQUEsYUFBYSxpQkFDSTtBQUU5Qjs7OztHQUlHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixTQUFpQixFQUNqQixXQUFtQixFQUNuQixPQUFlO0lBRWYsTUFBTSxFQUFFLEdBQUcsSUFBQSx5QkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2hDLE1BQU0sTUFBTSxHQUFHLElBQUEsNEJBQWMsRUFBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUMzQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQztRQUNoQyxNQUFNLENBQUMsS0FBSyxFQUFFO0tBQ2YsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNoRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsTUFBYyxFQUNkLFdBQW1CLEVBQ25CLE9BQWU7SUFFZixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN6QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsUUFBUSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBQSw4QkFBZ0IsRUFDL0IsYUFBYSxFQUNiLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQzFCLENBQUE7SUFDRCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0MsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUNqRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNuRCxRQUFRLENBQUMsS0FBSyxFQUFFO0tBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDckIsQ0FBQyJ9
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260928205031 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260928205031 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "plugin_setting_state" ("id" text not null, "plugin_key" text not null, "values" jsonb not null, "version" integer not null default 1, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "plugin_setting_state_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_plugin_setting_state_deleted_at" ON "plugin_setting_state" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_plugin_setting_state_plugin_key" ON "plugin_setting_state" ("plugin_key") WHERE deleted_at IS NULL;`);
10
+ }
11
+ async down() {
12
+ this.addSql(`drop table if exists "plugin_setting_state" cascade;`);
13
+ }
14
+ }
15
+ exports.Migration20260928205031 = Migration20260928205031;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA5MjgyMDUwMzEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wbHVnaW4tZmVhdHVyZXMvbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MDkyODIwNTAzMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBcUU7QUFFckUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUUzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsZ1dBQWdXLENBQUMsQ0FBQztRQUM5VyxJQUFJLENBQUMsTUFBTSxDQUFDLHFJQUFxSSxDQUFDLENBQUM7UUFDbkosSUFBSSxDQUFDLE1BQU0sQ0FBQyw0SUFBNEksQ0FBQyxDQUFDO0lBQzVKLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztDQUVGO0FBWkQsMERBWUMifQ==
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260928215428 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260928215428 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "plugin_action_run" ("id" text not null, "plugin_key" text not null, "action_key" text not null, "status" text check ("status" in ('running', 'completed', 'failed')) not null, "started_at" timestamptz not null, "finished_at" timestamptz null, "triggered_by" text null, "message" text null, "progress" jsonb null, "result" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "plugin_action_run_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_plugin_action_run_deleted_at" ON "plugin_action_run" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_plugin_action_run_plugin_action_status" ON "plugin_action_run" ("plugin_key", "action_key", "status") WHERE deleted_at IS NULL;`);
10
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_plugin_action_run_single_running" ON "plugin_action_run" ("plugin_key", "action_key") WHERE status = 'running' AND deleted_at IS NULL;`);
11
+ }
12
+ async down() {
13
+ this.addSql(`drop table if exists "plugin_action_run" cascade;`);
14
+ }
15
+ }
16
+ exports.Migration20260928215428 = Migration20260928215428;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA5MjgyMTU0MjguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wbHVnaW4tZmVhdHVyZXMvbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MDkyODIxNTQyOC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBcUU7QUFFckUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUUzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsb2lCQUFvaUIsQ0FBQyxDQUFDO1FBQ2xqQixJQUFJLENBQUMsTUFBTSxDQUFDLCtIQUErSCxDQUFDLENBQUM7UUFDN0ksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpS0FBaUssQ0FBQyxDQUFDO1FBQy9LLElBQUksQ0FBQyxNQUFNLENBQUMsK0tBQStLLENBQUMsQ0FBQztJQUMvTCxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ25FLENBQUM7Q0FFRjtBQWJELDBEQWFDIn0=
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ /**
5
+ * One run of a plugin action started through the base (sync or background).
6
+ * At most one `running` row per plugin action (partial unique index), which
7
+ * is what rejects a second start.
8
+ */
9
+ const PluginActionRun = utils_1.model
10
+ .define({
11
+ name: "plugin_action_run",
12
+ tableName: "plugin_action_run",
13
+ }, {
14
+ id: utils_1.model.id({ prefix: "plgrun" }).primaryKey(),
15
+ plugin_key: utils_1.model.text(),
16
+ action_key: utils_1.model.text(),
17
+ status: utils_1.model.enum(["running", "completed", "failed"]),
18
+ started_at: utils_1.model.dateTime(),
19
+ finished_at: utils_1.model.dateTime().nullable(),
20
+ /** Admin user id that started the run. */
21
+ triggered_by: utils_1.model.text().nullable(),
22
+ /** Error message of a failed run. */
23
+ message: utils_1.model.text().nullable(),
24
+ /** `{ current, total, label }` reported by the running workflow. */
25
+ progress: utils_1.model.json().nullable(),
26
+ /** Workflow result when it is JSON and at most 4 KB. */
27
+ result: utils_1.model.json().nullable(),
28
+ })
29
+ .indexes([
30
+ {
31
+ name: "IDX_plugin_action_run_plugin_action_status",
32
+ on: ["plugin_key", "action_key", "status"],
33
+ where: "deleted_at IS NULL",
34
+ },
35
+ {
36
+ name: "IDX_plugin_action_run_single_running",
37
+ on: ["plugin_key", "action_key"],
38
+ unique: true,
39
+ where: "status = 'running' AND deleted_at IS NULL",
40
+ },
41
+ ]);
42
+ exports.default = PluginActionRun;
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWFjdGlvbi1ydW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wbHVnaW4tZmVhdHVyZXMvbW9kZWxzL3BsdWdpbi1hY3Rpb24tcnVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQWlEO0FBRWpEOzs7O0dBSUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxhQUFLO0tBQzFCLE1BQU0sQ0FDTDtJQUNFLElBQUksRUFBRSxtQkFBbUI7SUFDekIsU0FBUyxFQUFFLG1CQUFtQjtDQUMvQixFQUNEO0lBQ0UsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFDL0MsVUFBVSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDeEIsVUFBVSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDeEIsTUFBTSxFQUFFLGFBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELFVBQVUsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFO0lBQzVCLFdBQVcsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3hDLDBDQUEwQztJQUMxQyxZQUFZLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNyQyxxQ0FBcUM7SUFDckMsT0FBTyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDaEMsb0VBQW9FO0lBQ3BFLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2pDLHdEQUF3RDtJQUN4RCxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNoQyxDQUNGO0tBQ0EsT0FBTyxDQUFDO0lBQ1A7UUFDRSxJQUFJLEVBQUUsNENBQTRDO1FBQ2xELEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDO1FBQzFDLEtBQUssRUFBRSxvQkFBb0I7S0FDNUI7SUFDRDtRQUNFLElBQUksRUFBRSxzQ0FBc0M7UUFDNUMsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQztRQUNoQyxNQUFNLEVBQUUsSUFBSTtRQUNaLEtBQUssRUFBRSwyQ0FBMkM7S0FDbkQ7Q0FDRixDQUFDLENBQUE7QUFFSixrQkFBZSxlQUFlLENBQUEifQ==
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ /**
5
+ * One row per plugin with the settings stored through the Admin. No row (or
6
+ * a missing key) means the setting falls back to medusa-config or its
7
+ * declared default.
8
+ */
9
+ const PluginSettingState = utils_1.model
10
+ .define({
11
+ name: "plugin_setting_state",
12
+ tableName: "plugin_setting_state",
13
+ }, {
14
+ id: utils_1.model.id({ prefix: "plgset" }).primaryKey(),
15
+ plugin_key: utils_1.model.text(),
16
+ /**
17
+ * `{ [settingKey]: string | number | boolean }`; a secret is stored as
18
+ * `{ enc: "<base64 iv|tag|ciphertext>" }`.
19
+ */
20
+ values: utils_1.model.json(),
21
+ version: utils_1.model.number().default(1),
22
+ })
23
+ .indexes([
24
+ {
25
+ name: "IDX_plugin_setting_state_plugin_key",
26
+ on: ["plugin_key"],
27
+ unique: true,
28
+ where: "deleted_at IS NULL",
29
+ },
30
+ ]);
31
+ exports.default = PluginSettingState;
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNldHRpbmctc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wbHVnaW4tZmVhdHVyZXMvbW9kZWxzL3BsdWdpbi1zZXR0aW5nLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQWlEO0FBRWpEOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLGFBQUs7S0FDN0IsTUFBTSxDQUNMO0lBQ0UsSUFBSSxFQUFFLHNCQUFzQjtJQUM1QixTQUFTLEVBQUUsc0JBQXNCO0NBQ2xDLEVBQ0Q7SUFDRSxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRTtJQUMvQyxVQUFVLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUN4Qjs7O09BR0c7SUFDSCxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUNwQixPQUFPLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Q0FDbkMsQ0FDRjtLQUNBLE9BQU8sQ0FBQztJQUNQO1FBQ0UsSUFBSSxFQUFFLHFDQUFxQztRQUMzQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDbEIsTUFBTSxFQUFFLElBQUk7UUFDWixLQUFLLEVBQUUsb0JBQW9CO0tBQzVCO0NBQ0YsQ0FBQyxDQUFBO0FBRUosa0JBQWUsa0JBQWtCLENBQUEifQ==