@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
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
5
+ const plugin_actions_1 = require("../../../../../plugin-actions");
6
+ const plugin_features_http_1 = require("../../../../../plugin-features-http");
7
+ const wire_response_1 = require("../../../../../wire-response");
8
+ /**
9
+ * Runs a declared action. `sync` answers 200 after the workflow finished
10
+ * (202 when it is still running on async steps), `background` answers 202
11
+ * right after starting it; both carry the recorded
12
+ * run. 409 with the running run when the same action is still running.
13
+ */
14
+ const POST = async (req, res) => {
15
+ const descriptor = (0, plugin_features_http_1.requirePluginFeatureDescriptor)(req.scope, String(req.params.plugin_key));
16
+ const action = (0, plugin_actions_1.requirePluginAction)(descriptor, String(req.params.action_key));
17
+ const outcome = await (0, plugin_actions_1.runPluginAction)(req.scope, descriptor, action, req.auth_context.actor_id);
18
+ if (outcome.status === "already_running") {
19
+ res.status(409).json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginActionConflictResponseSchema, {
20
+ type: "conflict",
21
+ message: plugin_actions_1.PLUGIN_ACTION_ALREADY_RUNNING_MESSAGE,
22
+ run: outcome.run,
23
+ }));
24
+ return;
25
+ }
26
+ res
27
+ .status(outcome.status === "started" ? 202 : 200)
28
+ .json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginActionRunResponseSchema, { action: outcome }));
29
+ };
30
+ exports.POST = POST;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9bcGx1Z2luX2tleV0vYWN0aW9ucy9bYWN0aW9uX2tleV0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsK0dBR2tGO0FBTWxGLGtFQUlzQztBQUN0Qyw4RUFBb0Y7QUFDcEYsZ0VBQTZEO0FBRTdEOzs7OztHQUtHO0FBQ0ksTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN2QixHQUErQixFQUMvQixHQUVDLEVBQ0QsRUFBRTtJQUNGLE1BQU0sVUFBVSxHQUFHLElBQUEscURBQThCLEVBQy9DLEdBQUcsQ0FBQyxLQUFLLEVBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFBLG9DQUFtQixFQUNoQyxVQUFVLEVBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEsZ0NBQWUsRUFDbkMsR0FBRyxDQUFDLEtBQUssRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUMxQixDQUFBO0lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLGlCQUFpQixFQUFFLENBQUM7UUFDekMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ2xCLElBQUEsOEJBQWMsRUFBQyx5REFBdUMsRUFBRTtZQUN0RCxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsc0RBQXFDO1lBQzlDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztTQUNqQixDQUFDLENBQ0gsQ0FBQTtRQUNELE9BQU07SUFDUixDQUFDO0lBQ0QsR0FBRztTQUNBLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDaEQsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxvREFBa0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDbEYsQ0FBQyxDQUFBO0FBakNZLFFBQUEsSUFBSSxRQWlDaEIifQ==
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
5
+ const plugin_actions_1 = require("../../../../../../plugin-actions");
6
+ const plugin_features_http_1 = require("../../../../../../plugin-features-http");
7
+ const wire_response_1 = require("../../../../../../wire-response");
8
+ /** Latest runs of a declared action, newest first (`?limit=`, default 1). */
9
+ const GET = async (req, res) => {
10
+ const descriptor = (0, plugin_features_http_1.requirePluginFeatureDescriptor)(req.scope, String(req.params.plugin_key));
11
+ const action = (0, plugin_actions_1.requirePluginAction)(descriptor, String(req.params.action_key));
12
+ const runs = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).listRecentPluginActionRuns(descriptor.plugin_key, action.key, req.validatedQuery.limit);
13
+ res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginActionRunsResponseSchema, { runs }));
14
+ };
15
+ exports.GET = GET;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9bcGx1Z2luX2tleV0vYWN0aW9ucy9bYWN0aW9uX2tleV0vcnVucy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSwrR0FHa0Y7QUFHbEYscUVBQXNFO0FBQ3RFLGlGQUcrQztBQUMvQyxtRUFBZ0U7QUFJaEUsNkVBQTZFO0FBQ3RFLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBbUQsRUFDbkQsR0FBa0QsRUFDbEQsRUFBRTtJQUNGLE1BQU0sVUFBVSxHQUFHLElBQUEscURBQThCLEVBQy9DLEdBQUcsQ0FBQyxLQUFLLEVBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFBLG9DQUFtQixFQUNoQyxVQUFVLEVBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsbURBQTRCLEVBQzdDLEdBQUcsQ0FBQyxLQUFLLENBQ1YsQ0FBQywwQkFBMEIsQ0FDMUIsVUFBVSxDQUFDLFVBQVUsRUFDckIsTUFBTSxDQUFDLEdBQUcsRUFDVixHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FDekIsQ0FBQTtJQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSw4QkFBYyxFQUFDLHFEQUFtQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3pFLENBQUMsQ0FBQTtBQXBCWSxRQUFBLEdBQUcsT0FvQmYifQ==
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
5
+ const plugin_features_http_1 = require("../../../plugin-features-http");
6
+ const wire_response_1 = require("../../../wire-response");
7
+ /** One plugin like in the list; 404 for an unknown plugin key. */
8
+ const GET = async (req, res) => {
9
+ const { descriptor, fallback } = (0, plugin_features_http_1.requireDiscoveredPlugin)(req.scope, String(req.params.plugin_key));
10
+ const plugin = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).describePluginFeatures(descriptor, fallback);
11
+ res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginFeaturesResponseSchema, { plugin }));
12
+ };
13
+ exports.GET = GET;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9bcGx1Z2luX2tleV0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsK0dBQTZIO0FBRzdILHdFQUdzQztBQUN0QywwREFBdUQ7QUFFdkQsa0VBQWtFO0FBQzNELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBZ0QsRUFDaEQsRUFBRTtJQUNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBQSw4Q0FBdUIsRUFDdEQsR0FBRyxDQUFDLEtBQUssRUFDVCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FDOUIsQ0FBQTtJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxtREFBNEIsRUFDL0MsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM5QyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxtREFBaUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN6RSxDQUFDLENBQUE7QUFaWSxRQUFBLEdBQUcsT0FZZiJ9
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = exports.GET = void 0;
4
+ const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
5
+ const plugin_features_http_1 = require("../../../../plugin-features-http");
6
+ const wire_response_1 = require("../../../../wire-response");
7
+ /** Settings with their source; secret values are never returned. */
8
+ const GET = async (req, res) => {
9
+ const { descriptor, fallback } = (0, plugin_features_http_1.requireDiscoveredPlugin)(req.scope, String(req.params.plugin_key));
10
+ const settings = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).describePluginSettings(descriptor, fallback);
11
+ res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginSettingsResponseSchema, { settings }));
12
+ };
13
+ exports.GET = GET;
14
+ /** Merges `values` (`null` clears); stale `expected_version` is 409. */
15
+ const POST = async (req, res) => {
16
+ const { descriptor, fallback } = (0, plugin_features_http_1.requireDiscoveredPlugin)(req.scope, String(req.params.plugin_key));
17
+ const { plugin, changed_keys } = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).updatePluginSettings(descriptor, req.validatedBody, fallback);
18
+ await (0, plugin_features_http_1.emitPluginSettingsUpdated)(req.scope, plugin, changed_keys);
19
+ res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginFeaturesResponseSchema, { plugin }));
20
+ };
21
+ exports.POST = POST;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9bcGx1Z2luX2tleV0vc2V0dGluZ3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsK0dBSWtGO0FBTWxGLDJFQUl5QztBQUN6Qyw2REFBMEQ7QUFJMUQsb0VBQW9FO0FBQzdELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBZ0QsRUFDaEQsRUFBRTtJQUNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBQSw4Q0FBdUIsRUFDdEQsR0FBRyxDQUFDLEtBQUssRUFDVCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FDOUIsQ0FBQTtJQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxtREFBNEIsRUFDakQsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM5QyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxtREFBaUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUMzRSxDQUFDLENBQUE7QUFaWSxRQUFBLEdBQUcsT0FZZjtBQUVELHdFQUF3RTtBQUNqRSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQTJDLEVBQzNDLEdBQWdELEVBQ2hELEVBQUU7SUFDRixNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUEsOENBQXVCLEVBQ3RELEdBQUcsQ0FBQyxLQUFLLEVBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sSUFBQSxtREFBNEIsRUFDakUsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sSUFBQSxnREFBeUIsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUNoRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxtREFBaUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN6RSxDQUFDLENBQUE7QUFiWSxRQUFBLElBQUksUUFhaEIifQ==
@@ -4,17 +4,19 @@ exports.POST = exports.GET = void 0;
4
4
  const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
5
5
  const plugin_features_http_1 = require("../../plugin-features-http");
6
6
  const wire_response_1 = require("../../wire-response");
7
+ /** Toggles, settings (no secret values), actions and pages of every plugin. */
7
8
  const GET = async (req, res) => {
8
9
  const service = (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope);
9
- const plugins = await Promise.all((0, plugin_features_http_1.listPluginFeatureDescriptors)(req.scope).map((descriptor) => service.describePluginFeatures(descriptor)));
10
+ const plugins = await Promise.all((0, plugin_features_http_1.listDiscoveredPlugins)(req.scope).map(({ descriptor, fallback }) => service.describePluginFeatures(descriptor, fallback)));
10
11
  res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginFeaturesListResponseSchema, { plugins }));
11
12
  };
12
13
  exports.GET = GET;
13
14
  const POST = async (req, res) => {
14
15
  const { plugin_key, ...input } = req.validatedBody;
15
- const descriptor = (0, plugin_features_http_1.requirePluginFeatureDescriptor)(req.scope, plugin_key);
16
- const plugin = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).updatePluginFeatures(descriptor, input);
16
+ const { descriptor, fallback } = (0, plugin_features_http_1.requireDiscoveredPlugin)(req.scope, plugin_key);
17
+ const plugin = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).updatePluginFeatures(descriptor, input, fallback);
18
+ await (0, plugin_features_http_1.emitPluginFeaturesUpdated)(req.scope, plugin);
17
19
  res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginFeaturesResponseSchema, { plugin }));
18
20
  };
19
21
  exports.POST = POST;
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSwrR0FJa0Y7QUFNbEYscUVBSW1DO0FBQ25DLHVEQUFvRDtBQUk3QyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQStCLEVBQy9CLEdBQW9ELEVBQ3BELEVBQUU7SUFDRixNQUFNLE9BQU8sR0FBRyxJQUFBLG1EQUE0QixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2RCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQy9CLElBQUEsbURBQTRCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQ3pELE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FDM0MsQ0FDRixDQUFBO0lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBLDhCQUFjLEVBQUMsdURBQXFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDOUUsQ0FBQyxDQUFBO0FBWFksUUFBQSxHQUFHLE9BV2Y7QUFFTSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQTJDLEVBQzNDLEdBQWdELEVBQ2hELEVBQUU7SUFDRixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFBLHFEQUE4QixFQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG1EQUE0QixFQUMvQyxHQUFHLENBQUMsS0FBSyxDQUNWLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSw4QkFBYyxFQUFDLG1EQUFpQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3pFLENBQUMsQ0FBQTtBQVZZLFFBQUEsSUFBSSxRQVVoQiJ9
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSwrR0FJa0Y7QUFNbEYscUVBS21DO0FBQ25DLHVEQUFvRDtBQUlwRCwrRUFBK0U7QUFDeEUsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUErQixFQUMvQixHQUFvRCxFQUNwRCxFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBQSxtREFBNEIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixJQUFBLDRDQUFxQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQ2hFLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQ3JELENBQ0YsQ0FBQTtJQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSw4QkFBYyxFQUFDLHVEQUFxQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQzlFLENBQUMsQ0FBQTtBQVhZLFFBQUEsR0FBRyxPQVdmO0FBRU0sTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN2QixHQUEyQyxFQUMzQyxHQUFnRCxFQUNoRCxFQUFFO0lBQ0YsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUE7SUFDbEQsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFBLDhDQUF1QixFQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDL0UsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG1EQUE0QixFQUMvQyxHQUFHLENBQUMsS0FBSyxDQUNWLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNuRCxNQUFNLElBQUEsZ0RBQXlCLEVBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUNsRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxtREFBaUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN6RSxDQUFDLENBQUE7QUFYWSxRQUFBLElBQUksUUFXaEIifQ==
@@ -2,24 +2,38 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const http_1 = require("@medusajs/framework/http");
4
4
  const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
5
+ // Authentication: Medusa authenticates every /admin route (actor "user";
6
+ // bearer, session or secret API key) before plugin middlewares run
7
+ // (framework 2.19.0 http/router.js), so no second `authenticate` here.
5
8
  // Store GETs need nothing beyond Medusa's publishable-key check on /store.
6
- // Every authenticated Admin user may read and change the toggles (no RBAC by
7
- // design).
9
+ // Every authenticated Admin user may read and change toggles and settings
10
+ // and run actions (no RBAC by design).
8
11
  exports.default = (0, http_1.defineMiddlewares)({
9
12
  routes: [
10
13
  {
11
14
  matcher: "/admin/plugin-features",
12
- methods: ["GET"],
13
- middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
15
+ methods: ["POST"],
16
+ middlewares: [(0, http_1.validateAndTransformBody)(plugin_features_1.UpdatePluginFeaturesSchema)],
14
17
  },
15
18
  {
16
- matcher: "/admin/plugin-features",
19
+ matcher: "/admin/plugin-features/:plugin_key/settings",
17
20
  methods: ["POST"],
21
+ middlewares: [(0, http_1.validateAndTransformBody)(plugin_features_1.UpdatePluginSettingsSchema)],
22
+ },
23
+ {
24
+ matcher: "/admin/plugin-features/:plugin_key/actions/:action_key",
25
+ methods: ["POST"],
26
+ middlewares: [(0, http_1.validateAndTransformBody)(plugin_features_1.RunPluginActionSchema)],
27
+ },
28
+ {
29
+ matcher: "/admin/plugin-features/:plugin_key/actions/:action_key/runs",
30
+ methods: ["GET"],
18
31
  middlewares: [
19
- (0, http_1.authenticate)("user", ["session", "bearer"]),
20
- (0, http_1.validateAndTransformBody)(plugin_features_1.UpdatePluginFeaturesSchema),
32
+ (0, http_1.validateAndTransformQuery)(plugin_features_1.ListPluginActionRunsQuerySchema, {
33
+ isList: false,
34
+ }),
21
35
  ],
22
36
  },
23
37
  ],
24
38
  });
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBSWlDO0FBQ2pDLCtHQUFzSDtBQUV0SCwyRUFBMkU7QUFDM0UsNkVBQTZFO0FBQzdFLFdBQVc7QUFDWCxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEIsV0FBVyxFQUFFLENBQUMsSUFBQSxtQkFBWSxFQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQzNEO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUU7Z0JBQ1gsSUFBQSxtQkFBWSxFQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDM0MsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQzthQUNyRDtTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQUEifQ==
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBSWlDO0FBQ2pDLCtHQUtrRjtBQUVsRix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHVDQUF1QztBQUN2QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsNkNBQTZDO1lBQ3RELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsdUNBQXFCLENBQUMsQ0FBQztTQUMvRDtRQUNEO1lBQ0UsT0FBTyxFQUFFLDZEQUE2RDtZQUN0RSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEIsV0FBVyxFQUFFO2dCQUNYLElBQUEsZ0NBQXlCLEVBQUMsaURBQStCLEVBQUU7b0JBQ3pELE1BQU0sRUFBRSxLQUFLO2lCQUNkLENBQUM7YUFDSDtTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQUEifQ==
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runPluginAction = exports.requirePluginAction = exports.PLUGIN_ACTION_ALREADY_RUNNING_MESSAGE = void 0;
4
+ const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/events/plugin-features");
5
+ const framework_1 = require("@medusajs/framework");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
8
+ const plugin_action_runs_1 = require("../modules/plugin-features/domain/plugin-action-runs");
9
+ const plugin_features_http_1 = require("./plugin-features-http");
10
+ const MESSAGE_MAX_LENGTH = 1000;
11
+ exports.PLUGIN_ACTION_ALREADY_RUNNING_MESSAGE = "Diese Aktion läuft bereits.";
12
+ /** The declared action; `NOT_FOUND` ("Aktion unbekannt") otherwise. */
13
+ const requirePluginAction = (descriptor, actionKey) => {
14
+ const action = descriptor.actions?.find((entry) => entry.key === actionKey);
15
+ if (!action) {
16
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Aktion unbekannt: "${actionKey}" (Plugin "${descriptor.plugin_key}").`);
17
+ }
18
+ return action;
19
+ };
20
+ exports.requirePluginAction = requirePluginAction;
21
+ const emitFinished = (container, input, outcome) => (0, plugin_features_http_1.emitAfterCommit)(container, plugin_features_1.PLUGIN_ACTION_FINISHED_EVENT, () => plugin_features_1.PluginActionFinishedEventSchema.parse({
22
+ plugin_key: input.plugin_key,
23
+ action_key: input.action_key,
24
+ run_id: input.run_id,
25
+ status: outcome.status,
26
+ ...(outcome.status === "failed"
27
+ ? {
28
+ message: (0, plugin_features_http_1.describeError)(outcome.error).slice(0, MESSAGE_MAX_LENGTH),
29
+ }
30
+ : {}),
31
+ }), input.plugin_key);
32
+ /**
33
+ * Records the outcome on the run row; a failed write is logged and never
34
+ * hides the action's own outcome.
35
+ */
36
+ const finishRun = async (container, input, outcome) => {
37
+ try {
38
+ return await (0, plugin_features_http_1.resolvePluginFeaturesService)(container).finishPluginActionRun(input.run_id, outcome);
39
+ }
40
+ catch (error) {
41
+ try {
42
+ container
43
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
44
+ .error(`Aktionslauf "${input.run_id}" (Plugin "${input.plugin_key}", Aktion "${input.action_key}") konnte nicht abgeschlossen werden: ${(0, plugin_features_http_1.describeError)(error)}`);
45
+ }
46
+ catch {
47
+ // Logging must not replace the original outcome.
48
+ }
49
+ return null;
50
+ }
51
+ };
52
+ const failureMessage = (error) => (0, plugin_features_http_1.describeError)(error).slice(0, MESSAGE_MAX_LENGTH);
53
+ const FAILED_STATES = [
54
+ utils_1.TransactionState.FAILED,
55
+ utils_1.TransactionState.REVERTED,
56
+ ];
57
+ /**
58
+ * Starts the workflow under the run id as transaction id. A workflow with
59
+ * async steps returns from `run()` with `acknowledgement.hasFinished: false`;
60
+ * its outcome then arrives through the engine's `onFinish` notification.
61
+ * The subscription is registered before `run()`, so an early finish is not
62
+ * missed, and removed again when `run()` already finished or threw.
63
+ */
64
+ const startWorkflow = async (engine, workflowId, input) => {
65
+ const transactionId = input.run_id;
66
+ let settle = () => undefined;
67
+ const outcome = new Promise((resolve) => {
68
+ settle = resolve;
69
+ });
70
+ const subscriber = (event) => {
71
+ if (event.eventType !== "onFinish") {
72
+ return;
73
+ }
74
+ if (event.state && FAILED_STATES.includes(event.state)) {
75
+ settle({
76
+ status: "failed",
77
+ error: event.errors?.find((entry) => entry?.error !== undefined)?.error ??
78
+ new Error(`Workflow "${workflowId}" endete im Zustand "${event.state}".`),
79
+ });
80
+ return;
81
+ }
82
+ settle({ status: "completed", result: event.result });
83
+ };
84
+ const unsubscribe = async () => {
85
+ try {
86
+ await engine.unsubscribe({
87
+ workflowId,
88
+ transactionId,
89
+ subscriberOrId: subscriber,
90
+ });
91
+ }
92
+ catch {
93
+ // A leftover subscription is dropped by the engine on finish.
94
+ }
95
+ };
96
+ await engine.subscribe({ workflowId, transactionId, subscriber });
97
+ let ret;
98
+ try {
99
+ // The engine JSON-clones its options, so the container is never passed
100
+ // to run(); the engine uses the shared app container.
101
+ ret = await engine.run(workflowId, {
102
+ input,
103
+ transactionId,
104
+ throwOnError: true,
105
+ });
106
+ }
107
+ catch (error) {
108
+ await unsubscribe();
109
+ throw error;
110
+ }
111
+ if (ret.acknowledgement?.hasFinished === false) {
112
+ return { finished: false, outcome };
113
+ }
114
+ await unsubscribe();
115
+ return { finished: true, result: ret.result };
116
+ };
117
+ /**
118
+ * Records the outcome of a run that ended outside the request: through the
119
+ * global framework container, because the request scope may be gone.
120
+ */
121
+ const recordOutcomeLater = async (descriptor, action, input, outcome) => {
122
+ if (outcome.status === "completed") {
123
+ await finishRun(framework_1.container, input, {
124
+ status: "completed",
125
+ result: outcome.result,
126
+ });
127
+ await emitFinished(framework_1.container, input, { status: "completed" });
128
+ return;
129
+ }
130
+ try {
131
+ framework_1.container
132
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
133
+ .error(`Hintergrund-Aktion "${action.key}" von Plugin "${descriptor.plugin_key}" (Workflow "${action.workflow_id}", ausgelöst von ${input.triggered_by}) ist fehlgeschlagen: ${(0, plugin_features_http_1.describeError)(outcome.error)}`);
134
+ }
135
+ catch {
136
+ // Logging must not hide the finished event.
137
+ }
138
+ await finishRun(framework_1.container, input, {
139
+ status: "failed",
140
+ message: failureMessage(outcome.error),
141
+ });
142
+ await emitFinished(framework_1.container, input, {
143
+ status: "failed",
144
+ error: outcome.error,
145
+ });
146
+ };
147
+ /**
148
+ * Runs an action's workflow through the workflow engine and records the run
149
+ * in `plugin_action_run`. A second start while the same action is running
150
+ * returns `already_running` (nothing is started). `sync` awaits the workflow
151
+ * (a failure propagates to the MedusaError pipeline); `background` starts it
152
+ * without awaiting and records the outcome through the global container.
153
+ * A workflow that is still running when `run()` returns (async steps) keeps
154
+ * its run row `running`, which keeps the 409 slot taken, until the engine
155
+ * reports its finish; a `sync` action then answers `started`. Every path
156
+ * emits `plugin-action.finished.v1` when the run ends.
157
+ */
158
+ const runPluginAction = async (container, descriptor, action, triggeredBy) => {
159
+ if (!workflows_sdk_1.MedusaWorkflow.getWorkflow(action.workflow_id)) {
160
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Workflow "${action.workflow_id}" der Aktion "${action.key}" (Plugin "${descriptor.plugin_key}") ist nicht registriert.`);
161
+ }
162
+ const started = await (0, plugin_features_http_1.resolvePluginFeaturesService)(container).startPluginActionRun({
163
+ plugin_key: descriptor.plugin_key,
164
+ action_key: action.key,
165
+ triggered_by: triggeredBy,
166
+ });
167
+ if (!started.started) {
168
+ return { key: action.key, status: "already_running", run: started.run };
169
+ }
170
+ const input = {
171
+ plugin_key: descriptor.plugin_key,
172
+ action_key: action.key,
173
+ triggered_by: triggeredBy,
174
+ run_id: started.run.id,
175
+ };
176
+ const engine = container.resolve(utils_1.Modules.WORKFLOW_ENGINE);
177
+ const finishLater = (outcome) => {
178
+ void outcome
179
+ .then((settled) => recordOutcomeLater(descriptor, action, input, settled))
180
+ .catch(() => {
181
+ // finishRun and emitAfterCommit already log their own failures.
182
+ });
183
+ };
184
+ if (action.mode === "sync") {
185
+ let start;
186
+ try {
187
+ start = await startWorkflow(engine, action.workflow_id, input);
188
+ }
189
+ catch (error) {
190
+ await finishRun(container, input, {
191
+ status: "failed",
192
+ message: failureMessage(error),
193
+ });
194
+ await emitFinished(container, input, { status: "failed", error });
195
+ throw error;
196
+ }
197
+ if (!start.finished) {
198
+ finishLater(start.outcome);
199
+ return { key: action.key, status: "started", run: started.run };
200
+ }
201
+ const { result } = start;
202
+ const finished = await finishRun(container, input, {
203
+ status: "completed",
204
+ result,
205
+ });
206
+ await emitFinished(container, input, { status: "completed" });
207
+ const compact = (0, plugin_action_runs_1.compactActionResult)(result);
208
+ const record = finished ?? started.run;
209
+ return compact === undefined
210
+ ? { key: action.key, status: "completed", run: record }
211
+ : { key: action.key, status: "completed", result: compact, run: record };
212
+ }
213
+ // Background: the request scope may be gone when the run ends, so the
214
+ // outcome is recorded and reported through the global framework container.
215
+ finishLater(startWorkflow(engine, action.workflow_id, input).then((start) => start.finished
216
+ ? { status: "completed", result: start.result }
217
+ : start.outcome, (error) => ({ status: "failed", error })));
218
+ return { key: action.key, status: "started", run: started.run };
219
+ };
220
+ exports.runPluginAction = runPluginAction;
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWFjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3BsdWdpbi1hY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhHQUdpRjtBQUNqRixtREFBcUU7QUFNckUscURBS2tDO0FBQ2xDLHFFQUFrRTtBQU9sRSw2RkFJNkQ7QUFDN0QsaUVBSStCO0FBRS9CLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFBO0FBa0JsQixRQUFBLHFDQUFxQyxHQUFHLDZCQUE2QixDQUFBO0FBRWxGLHVFQUF1RTtBQUNoRSxNQUFNLG1CQUFtQixHQUFHLENBQ2pDLFVBQW1DLEVBQ25DLFNBQWlCLEVBQ08sRUFBRTtJQUMxQixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQTtJQUMzRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixzQkFBc0IsU0FBUyxjQUFjLFVBQVUsQ0FBQyxVQUFVLEtBQUssQ0FDeEUsQ0FBQTtJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQTtBQVpZLFFBQUEsbUJBQW1CLHVCQVkvQjtBQUVELE1BQU0sWUFBWSxHQUFHLENBQ25CLFNBQTBCLEVBQzFCLEtBQWdDLEVBQ2hDLE9BQXVFLEVBQ3hELEVBQUUsQ0FDakIsSUFBQSxzQ0FBZSxFQUNiLFNBQVMsRUFDVCw4Q0FBNEIsRUFDNUIsR0FBRyxFQUFFLENBQ0gsaURBQStCLENBQUMsS0FBSyxDQUFDO0lBQ3BDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtJQUM1QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7SUFDNUIsTUFBTSxFQUFFLEtBQUss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
@@ -1,20 +1,79 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.requirePluginFeatureDescriptor = exports.listPluginFeatureDescriptors = exports.resolvePluginFeaturesService = void 0;
3
+ exports.emitPluginSettingsUpdated = exports.emitPluginFeaturesUpdated = exports.emitAfterCommit = exports.describeError = exports.requirePluginFeatureDescriptor = exports.requireDiscoveredPlugin = exports.listDiscoveredPlugins = exports.listPluginFeatureDescriptors = exports.resolvePluginFeaturesService = void 0;
4
+ const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/events/plugin-features");
4
5
  const utils_1 = require("@medusajs/framework/utils");
5
6
  const constants_1 = require("../public/constants");
6
7
  const discover_plugin_features_1 = require("../utils/discover-plugin-features");
7
8
  const resolvePluginFeaturesService = (container) => container.resolve(constants_1.PLUGIN_FEATURES_MODULE);
8
9
  exports.resolvePluginFeaturesService = resolvePluginFeaturesService;
9
- const listPluginFeatureDescriptors = (container) => (0, discover_plugin_features_1.discoverPluginFeatureDescriptors)(container);
10
+ const listPluginFeatureDescriptors = (container) => (0, discover_plugin_features_1.discoverPluginFeatureProviders)(container).map((provider) => provider.descriptor);
10
11
  exports.listPluginFeatureDescriptors = listPluginFeatureDescriptors;
11
- /** Descriptor of an installed plugin; `NOT_FOUND` for an unknown key. */
12
- const requirePluginFeatureDescriptor = (container, pluginKey) => {
13
- const descriptor = (0, discover_plugin_features_1.findPluginFeatureDescriptor)(container, pluginKey);
14
- if (!descriptor) {
12
+ const listDiscoveredPlugins = (container) => (0, discover_plugin_features_1.discoverPluginFeatureProviders)(container).map((provider) => ({
13
+ descriptor: provider.descriptor,
14
+ fallback: (0, discover_plugin_features_1.readPluginSettingsFallback)(provider),
15
+ }));
16
+ exports.listDiscoveredPlugins = listDiscoveredPlugins;
17
+ /** Descriptor and fallback of an installed plugin; `NOT_FOUND` otherwise. */
18
+ const requireDiscoveredPlugin = (container, pluginKey) => {
19
+ const provider = (0, discover_plugin_features_1.findPluginFeatureProvider)(container, pluginKey);
20
+ if (!provider) {
15
21
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Plugin "${pluginKey}" hat keine Funktionsschalter.`);
16
22
  }
17
- return descriptor;
23
+ return {
24
+ descriptor: provider.descriptor,
25
+ fallback: (0, discover_plugin_features_1.readPluginSettingsFallback)(provider),
26
+ };
18
27
  };
28
+ exports.requireDiscoveredPlugin = requireDiscoveredPlugin;
29
+ /** Descriptor of an installed plugin; `NOT_FOUND` for an unknown key. */
30
+ const requirePluginFeatureDescriptor = (container, pluginKey) => (0, exports.requireDiscoveredPlugin)(container, pluginKey).descriptor;
19
31
  exports.requirePluginFeatureDescriptor = requirePluginFeatureDescriptor;
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWZlYXR1cmVzLWh0dHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3BsdWdpbi1mZWF0dXJlcy1odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUF1RDtBQUV2RCxtREFBNEQ7QUFHNUQsZ0ZBRzBDO0FBRW5DLE1BQU0sNEJBQTRCLEdBQUcsQ0FDMUMsU0FBMEIsRUFDRyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBc0IsQ0FBQyxDQUFBO0FBRjlELFFBQUEsNEJBQTRCLGdDQUVrQztBQUVwRSxNQUFNLDRCQUE0QixHQUFHLENBQzFDLFNBQTBCLEVBQ0MsRUFBRSxDQUFDLElBQUEsMkRBQWdDLEVBQUMsU0FBUyxDQUFDLENBQUE7QUFGOUQsUUFBQSw0QkFBNEIsZ0NBRWtDO0FBRTNFLHlFQUF5RTtBQUNsRSxNQUFNLDhCQUE4QixHQUFHLENBQzVDLFNBQTBCLEVBQzFCLFNBQWlCLEVBQ1EsRUFBRTtJQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFBLHNEQUEyQixFQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNwRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0IsV0FBVyxTQUFTLGdDQUFnQyxDQUNyRCxDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUMsQ0FBQTtBQVpZLFFBQUEsOEJBQThCLGtDQVkxQyJ9
32
+ const describeError = (error) => error instanceof Error
33
+ ? error.message
34
+ : typeof error?.message === "string"
35
+ ? error.message
36
+ : String(error);
37
+ exports.describeError = describeError;
38
+ /**
39
+ * Emits one event after the write committed; a failed emit is logged and
40
+ * never undoes the write (the Admin already sees the new state).
41
+ */
42
+ const emitAfterCommit = async (container, name, buildData, pluginKey) => {
43
+ try {
44
+ const data = buildData();
45
+ await container
46
+ .resolve(utils_1.Modules.EVENT_BUS)
47
+ .emit({ name, data });
48
+ }
49
+ catch (error) {
50
+ try {
51
+ container
52
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
53
+ .error(`Event "${name}" für Plugin "${pluginKey}" konnte nicht gesendet werden: ${(0, exports.describeError)(error)}`);
54
+ }
55
+ catch {
56
+ // Logging must not replace the original outcome.
57
+ }
58
+ }
59
+ };
60
+ exports.emitAfterCommit = emitAfterCommit;
61
+ /** Announces a saved toggle update with the plugin's effective values. */
62
+ const emitPluginFeaturesUpdated = (container, plugin) => (0, exports.emitAfterCommit)(container, plugin_features_1.PLUGIN_FEATURES_UPDATED_EVENT, () => plugin_features_1.PluginFeaturesUpdatedEventSchema.parse({
63
+ plugin_key: plugin.plugin_key,
64
+ enabled: plugin.enabled,
65
+ features: Object.fromEntries(plugin.features.map((feature) => [
66
+ feature.key,
67
+ feature.effective_enabled,
68
+ ])),
69
+ version: plugin.version,
70
+ }), plugin.plugin_key);
71
+ exports.emitPluginFeaturesUpdated = emitPluginFeaturesUpdated;
72
+ /** Announces a saved settings update; carries keys only, never values. */
73
+ const emitPluginSettingsUpdated = (container, plugin, changedKeys) => (0, exports.emitAfterCommit)(container, plugin_features_1.PLUGIN_SETTINGS_UPDATED_EVENT, () => plugin_features_1.PluginSettingsUpdatedEventSchema.parse({
74
+ plugin_key: plugin.plugin_key,
75
+ version: plugin.settings_version,
76
+ changed_keys: [...changedKeys],
77
+ }), plugin.plugin_key);
78
+ exports.emitPluginSettingsUpdated = emitPluginSettingsUpdated;
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWZlYXR1cmVzLWh0dHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3BsdWdpbi1mZWF0dXJlcy1odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDhHQUtpRjtBQU1qRixxREFJa0M7QUFFbEMsbURBQTREO0FBTTVELGdGQUkwQztBQVFuQyxNQUFNLDRCQUE0QixHQUFHLENBQzFDLFNBQTBCLEVBQ0csRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQXNCLENBQUMsQ0FBQTtBQUY5RCxRQUFBLDRCQUE0QixnQ0FFa0M7QUFFcEUsTUFBTSw0QkFBNEIsR0FBRyxDQUMxQyxTQUEwQixFQUNDLEVBQUUsQ0FDN0IsSUFBQSx5REFBOEIsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQzNDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUNsQyxDQUFBO0FBTFUsUUFBQSw0QkFBNEIsZ0NBS3RDO0FBRUksTUFBTSxxQkFBcUIsR0FBRyxDQUNuQyxTQUEwQixFQUNOLEVBQUUsQ0FDdEIsSUFBQSx5REFBOEIsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0QsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0lBQy9CLFFBQVEsRUFBRSxJQUFBLHFEQUEwQixFQUFDLFFBQVEsQ0FBQztDQUMvQyxDQUFDLENBQUMsQ0FBQTtBQU5RLFFBQUEscUJBQXFCLHlCQU03QjtBQUVMLDZFQUE2RTtBQUN0RSxNQUFNLHVCQUF1QixHQUFHLENBQ3JDLFNBQTBCLEVBQzFCLFNBQWlCLEVBQ0MsRUFBRTtJQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFBLG9EQUF5QixFQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNoRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJB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
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toRunRecord = exports.finishedRunColumns = exports.compactActionResult = exports.PLUGIN_ACTION_RESULT_MAX_BYTES = exports.staleCutoff = exports.isStaleRun = exports.PLUGIN_ACTION_RUN_MESSAGE_MAX_LENGTH = exports.PLUGIN_ACTION_RUN_ABORTED_MESSAGE = exports.PLUGIN_ACTION_RUN_STALE_AFTER_MS = void 0;
4
+ /** A run without a sign of life (start or progress) for this long is dead. */
5
+ exports.PLUGIN_ACTION_RUN_STALE_AFTER_MS = 60 * 60 * 1000;
6
+ /** Message of a run that was declared dead by the stale rule. */
7
+ exports.PLUGIN_ACTION_RUN_ABORTED_MESSAGE = "Abgebrochen (Neustart)";
8
+ /** Longest stored error message of a failed run. */
9
+ exports.PLUGIN_ACTION_RUN_MESSAGE_MAX_LENGTH = 1000;
10
+ /**
11
+ * The lazy restart rule: a `running` run whose last sign of life (start or
12
+ * reported progress) is older than `PLUGIN_ACTION_RUN_STALE_AFTER_MS` counts
13
+ * as aborted. The process that ran it restarted or lost it; nothing will
14
+ * finish it any more.
15
+ */
16
+ const isStaleRun = (run, now) => run.status === "running" &&
17
+ now.getTime() - run.last_activity_at.getTime() >=
18
+ exports.PLUGIN_ACTION_RUN_STALE_AFTER_MS;
19
+ exports.isStaleRun = isStaleRun;
20
+ /** Cutoff for the stale rule as used in queries. */
21
+ const staleCutoff = (now) => new Date(now.getTime() - exports.PLUGIN_ACTION_RUN_STALE_AFTER_MS);
22
+ exports.staleCutoff = staleCutoff;
23
+ /** Largest workflow result (serialized JSON) returned and stored. */
24
+ exports.PLUGIN_ACTION_RESULT_MAX_BYTES = 4096;
25
+ /** JSON copy of `result` when it is serializable and small, else `undefined`. */
26
+ const compactActionResult = (result) => {
27
+ if (result === undefined) {
28
+ return undefined;
29
+ }
30
+ try {
31
+ const json = JSON.stringify(result);
32
+ if (json === undefined ||
33
+ Buffer.byteLength(json, "utf8") > exports.PLUGIN_ACTION_RESULT_MAX_BYTES) {
34
+ return undefined;
35
+ }
36
+ return JSON.parse(json);
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ };
42
+ exports.compactActionResult = compactActionResult;
43
+ /**
44
+ * Columns of a finished run. Only a `running` run changes on progress; a
45
+ * finish always records the real outcome, also for a run the stale rule had
46
+ * already marked failed.
47
+ */
48
+ const finishedRunColumns = (outcome) => outcome.status === "completed"
49
+ ? {
50
+ status: "completed",
51
+ message: null,
52
+ result: (0, exports.compactActionResult)(outcome.result) ?? null,
53
+ }
54
+ : {
55
+ status: "failed",
56
+ message: outcome.message.slice(0, exports.PLUGIN_ACTION_RUN_MESSAGE_MAX_LENGTH) ||
57
+ "Unbekannter Fehler",
58
+ result: null,
59
+ };
60
+ exports.finishedRunColumns = finishedRunColumns;
61
+ const toDate = (value) => value instanceof Date ? value : new Date(String(value));
62
+ const toProgress = (value) => {
63
+ if (!value || typeof value !== "object") {
64
+ return null;
65
+ }
66
+ const candidate = value;
67
+ if (typeof candidate.current !== "number") {
68
+ return null;
69
+ }
70
+ return {
71
+ current: candidate.current,
72
+ total: typeof candidate.total === "number" ? candidate.total : null,
73
+ label: typeof candidate.label === "string" ? candidate.label : null,
74
+ };
75
+ };
76
+ /** Row (raw SQL or ORM) to record. */
77
+ const toRunRecord = (row) => ({
78
+ id: String(row.id),
79
+ plugin_key: String(row.plugin_key),
80
+ action_key: String(row.action_key),
81
+ status: row.status,
82
+ started_at: toDate(row.started_at),
83
+ finished_at: row.finished_at === null || row.finished_at === undefined
84
+ ? null
85
+ : toDate(row.finished_at),
86
+ triggered_by: typeof row.triggered_by === "string" ? row.triggered_by : null,
87
+ message: typeof row.message === "string" ? row.message : null,
88
+ progress: toProgress(row.progress),
89
+ result: row.result ?? null,
90
+ });
91
+ exports.toRunRecord = toRunRecord;
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWFjdGlvbi1ydW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGx1Z2luLWZlYXR1cmVzL2RvbWFpbi9wbHVnaW4tYWN0aW9uLXJ1bnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsOEVBQThFO0FBQ2pFLFFBQUEsZ0NBQWdDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7QUFFOUQsaUVBQWlFO0FBQ3BELFFBQUEsaUNBQWlDLEdBQUcsd0JBQXdCLENBQUE7QUFFekUsb0RBQW9EO0FBQ3ZDLFFBQUEsb0NBQW9DLEdBQUcsSUFBSSxDQUFBO0FBbUJ4RDs7Ozs7R0FLRztBQUNJLE1BQU0sVUFBVSxHQUFHLENBQ3hCLEdBQThELEVBQzlELEdBQVMsRUFDQSxFQUFFLENBQ1gsR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTO0lBQ3hCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO1FBQzVDLHdDQUFnQyxDQUFBO0FBTnZCLFFBQUEsVUFBVSxjQU1hO0FBRXBDLG9EQUFvRDtBQUM3QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVMsRUFBUSxFQUFFLENBQzdDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyx3Q0FBZ0MsQ0FBQyxDQUFBO0FBRC9DLFFBQUEsV0FBVyxlQUNvQztBQUU1RCxxRUFBcUU7QUFDeEQsUUFBQSw4QkFBOEIsR0FBRyxJQUFJLENBQUE7QUFFbEQsaUZBQWlGO0FBQzFFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFlLEVBQVcsRUFBRTtJQUM5RCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxN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