@mercurjs/core 2.3.2-canary.4 → 2.3.2

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 (68) hide show
  1. package/.medusa/server/src/api/admin/orders/[id]/route.d.ts +4 -0
  2. package/.medusa/server/src/api/admin/orders/[id]/route.js +25 -0
  3. package/.medusa/server/src/api/admin/orders/route.js +31 -1
  4. package/.medusa/server/src/api/admin/products/validators.d.ts +26 -26
  5. package/.medusa/server/src/api/hooks/payment/[provider]/route.d.ts +2 -0
  6. package/.medusa/server/src/api/hooks/payment/[provider]/route.js +39 -0
  7. package/.medusa/server/src/api/store/orders/[id]/route.d.ts +3 -0
  8. package/.medusa/server/src/api/store/orders/[id]/route.js +19 -0
  9. package/.medusa/server/src/api/store/orders/route.d.ts +3 -0
  10. package/.medusa/server/src/api/store/orders/route.js +34 -0
  11. package/.medusa/server/src/api/utils/ensure-seller-scope-middleware.d.ts +12 -0
  12. package/.medusa/server/src/api/utils/ensure-seller-scope-middleware.js +42 -0
  13. package/.medusa/server/src/api/utils/index.d.ts +2 -0
  14. package/.medusa/server/src/api/utils/index.js +3 -1
  15. package/.medusa/server/src/api/utils/split-order-payment-status.d.ts +10 -0
  16. package/.medusa/server/src/api/utils/split-order-payment-status.js +38 -0
  17. package/.medusa/server/src/api/vendor/middlewares.js +5 -3
  18. package/.medusa/server/src/api/vendor/orders/helpers.d.ts +1 -10
  19. package/.medusa/server/src/api/vendor/orders/helpers.js +5 -33
  20. package/.medusa/server/src/api/vendor/products/validators.d.ts +8 -8
  21. package/.medusa/server/src/api/vendor/sellers/middlewares.js +18 -2
  22. package/.medusa/server/src/api/vendor/stores/query-config.d.ts +5 -0
  23. package/.medusa/server/src/api/vendor/stores/query-config.js +9 -2
  24. package/.medusa/server/src/api/vendor/stores/route.js +5 -1
  25. package/.medusa/server/src/modules/product-edit/migrations/Migration20260828120000.d.ts +5 -0
  26. package/.medusa/server/src/modules/product-edit/migrations/Migration20260828120000.js +20 -0
  27. package/.medusa/server/src/modules/product-edit/models/product-change.js +7 -1
  28. package/.medusa/server/src/patches/apply-patch.d.ts +30 -0
  29. package/.medusa/server/src/patches/apply-patch.js +75 -0
  30. package/.medusa/server/src/patches/index.d.ts +7 -0
  31. package/.medusa/server/src/patches/index.js +110 -0
  32. package/.medusa/server/src/patches/jest-transformer.d.ts +14 -0
  33. package/.medusa/server/src/patches/jest-transformer.js +36 -0
  34. package/.medusa/server/src/patches/loader.d.ts +21 -0
  35. package/.medusa/server/src/patches/loader.js +124 -0
  36. package/.medusa/server/src/patches/manifest.d.ts +17 -0
  37. package/.medusa/server/src/patches/manifest.js +19 -0
  38. package/.medusa/server/src/patches/patches/@medusajs+core-flows@2.18.0.patch +21 -0
  39. package/.medusa/server/src/patches/resolve-package-dirs.d.ts +7 -0
  40. package/.medusa/server/src/patches/resolve-package-dirs.js +80 -0
  41. package/.medusa/server/src/patches/unified-diff.d.ts +25 -0
  42. package/.medusa/server/src/patches/unified-diff.js +127 -0
  43. package/.medusa/server/src/patches/version.d.ts +5 -0
  44. package/.medusa/server/src/patches/version.js +26 -0
  45. package/.medusa/server/src/subscribers/payment-webhook.d.ts +4 -0
  46. package/.medusa/server/src/subscribers/payment-webhook.js +42 -0
  47. package/.medusa/server/src/with-mercur.d.ts +8 -0
  48. package/.medusa/server/src/with-mercur.js +10 -1
  49. package/.medusa/server/src/workflows/events.d.ts +10 -0
  50. package/.medusa/server/src/workflows/events.js +12 -2
  51. package/.medusa/server/src/workflows/index.d.ts +1 -0
  52. package/.medusa/server/src/workflows/index.js +2 -1
  53. package/.medusa/server/src/workflows/payment/index.d.ts +1 -0
  54. package/.medusa/server/src/workflows/payment/index.js +18 -0
  55. package/.medusa/server/src/workflows/payment/workflows/index.d.ts +1 -0
  56. package/.medusa/server/src/workflows/payment/workflows/index.js +18 -0
  57. package/.medusa/server/src/workflows/payment/workflows/process-payment.d.ts +17 -0
  58. package/.medusa/server/src/workflows/payment/workflows/process-payment.js +142 -0
  59. package/.medusa/server/src/workflows/product/workflows/create-products.js +36 -14
  60. package/.medusa/server/src/workflows/product-attribute/workflows/update-product-attributes-on-product.js +16 -2
  61. package/.medusa/server/src/workflows/product-edit/steps/validate-no-pending-product-change.d.ts +5 -0
  62. package/.medusa/server/src/workflows/product-edit/steps/validate-no-pending-product-change.js +11 -12
  63. package/.medusa/server/src/workflows/product-edit/workflows/create-product-change.js +10 -3
  64. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-delete-product.js +2 -1
  65. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-update-attributes.js +94 -5
  66. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-update-product.js +2 -1
  67. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-update-variants.js +2 -1
  68. package/package.json +6 -5
@@ -0,0 +1,14 @@
1
+ type TransformOutput = {
2
+ code: string;
3
+ };
4
+ export declare function process(sourceText: string, sourcePath: string): TransformOutput;
5
+ /**
6
+ * Editing a patch has to invalidate Jest's transform cache, or a stale entry
7
+ * serves the unpatched source and the suite quietly tests the wrong code.
8
+ */
9
+ export declare function getCacheKey(sourceText: string, sourcePath: string): string;
10
+ declare const _default: {
11
+ process: typeof process;
12
+ getCacheKey: typeof getCacheKey;
13
+ };
14
+ export default _default;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.process = process;
4
+ exports.getCacheKey = getCacheKey;
5
+ const crypto_1 = require("crypto");
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const apply_patch_1 = require("./apply-patch");
9
+ const manifest_1 = require("./manifest");
10
+ function patchesFingerprint() {
11
+ const hash = (0, crypto_1.createHash)("sha1");
12
+ for (const entry of manifest_1.PATCHES) {
13
+ const patchFilePath = (0, path_1.join)(__dirname, "patches", entry.file);
14
+ hash.update(entry.file);
15
+ if ((0, fs_1.existsSync)(patchFilePath)) {
16
+ hash.update((0, fs_1.readFileSync)(patchFilePath));
17
+ }
18
+ }
19
+ return hash.digest("hex");
20
+ }
21
+ function process(sourceText, sourcePath) {
22
+ return { code: (0, apply_patch_1.patchSourceForPath)(sourcePath, sourceText) ?? sourceText };
23
+ }
24
+ /**
25
+ * Editing a patch has to invalidate Jest's transform cache, or a stale entry
26
+ * serves the unpatched source and the suite quietly tests the wrong code.
27
+ */
28
+ function getCacheKey(sourceText, sourcePath) {
29
+ return (0, crypto_1.createHash)("sha1")
30
+ .update(sourceText)
31
+ .update(sourcePath)
32
+ .update(patchesFingerprint())
33
+ .digest("hex");
34
+ }
35
+ exports.default = { process, getCacheKey };
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamVzdC10cmFuc2Zvcm1lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wYXRjaGVzL2plc3QtdHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF1Q0EsMEJBS0M7QUFNRCxrQ0FNQztBQXhERCxtQ0FBbUM7QUFDbkMsMkJBQTZDO0FBQzdDLCtCQUEyQjtBQUUzQiwrQ0FBa0Q7QUFDbEQseUNBQW9DO0FBb0JwQyxTQUFTLGtCQUFrQjtJQUN6QixNQUFNLElBQUksR0FBRyxJQUFBLG1CQUFVLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFFL0IsS0FBSyxNQUFNLEtBQUssSUFBSSxrQkFBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkIsSUFBSSxJQUFBLGVBQVUsRUFBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBQSxpQkFBWSxFQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDM0IsQ0FBQztBQUVELFNBQWdCLE9BQU8sQ0FDckIsVUFBa0IsRUFDbEIsVUFBa0I7SUFFbEIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFBLGdDQUFrQixFQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQTtBQUMzRSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLFVBQWtCLEVBQUUsVUFBa0I7SUFDaEUsT0FBTyxJQUFBLG1CQUFVLEVBQUMsTUFBTSxDQUFDO1NBQ3RCLE1BQU0sQ0FBQyxVQUFVLENBQUM7U0FDbEIsTUFBTSxDQUFDLFVBQVUsQ0FBQztTQUNsQixNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM1QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDbEIsQ0FBQztBQUVELGtCQUFlLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFBIn0=
@@ -0,0 +1,21 @@
1
+ import type { PatchedFile } from "./apply-patch";
2
+ /**
3
+ * Files whose patched source was compiled in place of the original. Registering
4
+ * an override only takes effect if the module is required afterwards, so this
5
+ * is the difference between a patch being staged and a patch being live.
6
+ */
7
+ export declare function compiledPaths(): string[];
8
+ export declare function isAlreadyLoaded(absolutePath: string): boolean;
9
+ export declare function isOverridden(absolutePath: string): boolean;
10
+ export declare function registerOverrides(packageDir: string, files: PatchedFile[], resolve: (packageDir: string, relativePath: string) => string): void;
11
+ export declare function purgeFiles(absolutePaths: string[]): void;
12
+ /**
13
+ * Compiles the patched sources now, so the override is what the process holds.
14
+ *
15
+ * Re-running a module that calls `createWorkflow` hits Medusa's duplicate guard,
16
+ * which only lets a workflow re-register when its step definition is byte-equal
17
+ * — and step ids are generated, so a second load of the same file is not. The
18
+ * reload replays the same source, so replacing the previous definition is the
19
+ * correct outcome; `register` is swapped for the duration to say so.
20
+ */
21
+ export declare function reload(packageDir: string, absolutePaths: string[]): void;
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.compiledPaths = compiledPaths;
7
+ exports.isAlreadyLoaded = isAlreadyLoaded;
8
+ exports.isOverridden = isOverridden;
9
+ exports.registerOverrides = registerOverrides;
10
+ exports.purgeFiles = purgeFiles;
11
+ exports.reload = reload;
12
+ const module_1 = __importDefault(require("module"));
13
+ const path_1 = require("path");
14
+ const internals = module_1.default;
15
+ /** Absolute file path -> patched source, consulted on every `.js` load. */
16
+ const overrides = new Map();
17
+ /** Paths whose patched source was actually compiled, not merely registered. */
18
+ const compiled = new Set();
19
+ let installed = false;
20
+ // Patches are applied in memory rather than written to `node_modules`: a server
21
+ // boot has no business mutating installed packages, workers would race each
22
+ // other doing it, and a file already required cannot be un-required cleanly.
23
+ // Intercepting the loader keeps the change scoped to this process.
24
+ function install() {
25
+ if (installed)
26
+ return;
27
+ const original = internals._extensions[".js"];
28
+ internals._extensions[".js"] = function (module, filename) {
29
+ const patched = overrides.get(filename);
30
+ if (patched !== undefined) {
31
+ module._compile(patched, filename);
32
+ compiled.add(filename);
33
+ return;
34
+ }
35
+ original(module, filename);
36
+ };
37
+ installed = true;
38
+ }
39
+ /**
40
+ * Files whose patched source was compiled in place of the original. Registering
41
+ * an override only takes effect if the module is required afterwards, so this
42
+ * is the difference between a patch being staged and a patch being live.
43
+ */
44
+ function compiledPaths() {
45
+ return [...compiled];
46
+ }
47
+ function isAlreadyLoaded(absolutePath) {
48
+ return Object.prototype.hasOwnProperty.call(require.cache, absolutePath);
49
+ }
50
+ function isOverridden(absolutePath) {
51
+ return overrides.has(absolutePath);
52
+ }
53
+ function registerOverrides(packageDir, files, resolve) {
54
+ install();
55
+ for (const file of files) {
56
+ overrides.set(resolve(packageDir, file.relativePath), file.source);
57
+ }
58
+ }
59
+ // `withMercur()` runs from `medusa-config`, which is not always the first thing
60
+ // to pull in a target package — `@medusajs/test-utils` requires core-flows
61
+ // before it loads the config. A module already in the cache would keep its
62
+ // unpatched source forever, so the patched files are evicted and required again
63
+ // through the override above.
64
+ //
65
+ // Only the patched files are dropped, never the whole package: re-running an
66
+ // arbitrary core-flows module re-enters `createWorkflow`, and workflows whose
67
+ // step ids are generated rather than literal do not survive a second
68
+ // registration ("step definition already exists").
69
+ function purgeFiles(absolutePaths) {
70
+ for (const filename of absolutePaths) {
71
+ const cached = require.cache[filename];
72
+ if (!cached)
73
+ continue;
74
+ delete require.cache[filename];
75
+ // Parents keep `children` arrays pointing at the evicted module; leaving it
76
+ // there keeps the stale exports reachable through the module graph.
77
+ for (const parent of Object.values(require.cache)) {
78
+ const index = parent?.children?.indexOf(cached) ?? -1;
79
+ if (index !== -1)
80
+ parent.children.splice(index, 1);
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Compiles the patched sources now, so the override is what the process holds.
86
+ *
87
+ * Re-running a module that calls `createWorkflow` hits Medusa's duplicate guard,
88
+ * which only lets a workflow re-register when its step definition is byte-equal
89
+ * — and step ids are generated, so a second load of the same file is not. The
90
+ * reload replays the same source, so replacing the previous definition is the
91
+ * correct outcome; `register` is swapped for the duration to say so.
92
+ */
93
+ function reload(packageDir, absolutePaths) {
94
+ const manager = loadWorkflowManager(packageDir);
95
+ const original = manager?.register;
96
+ if (manager && original) {
97
+ manager.register = function register(workflowId, ...rest) {
98
+ manager.unregister(workflowId);
99
+ return original.call(this, workflowId, ...rest);
100
+ };
101
+ }
102
+ try {
103
+ for (const filename of absolutePaths) {
104
+ require(filename);
105
+ }
106
+ }
107
+ finally {
108
+ if (manager && original)
109
+ manager.register = original;
110
+ }
111
+ }
112
+ // Resolved from the patched package, not from `@mercurjs/core`: bun and pnpm
113
+ // give each dependent its own copy, and a `WorkflowManager` from a different
114
+ // copy holds a different registry than the one `createWorkflow` writes to.
115
+ function loadWorkflowManager(packageDir) {
116
+ try {
117
+ const requireFrom = module_1.default.createRequire((0, path_1.join)(packageDir, "index.js"));
118
+ return requireFrom("@medusajs/orchestration").WorkflowManager;
119
+ }
120
+ catch {
121
+ return null;
122
+ }
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BhdGNoZXMvbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0RBLHNDQUVDO0FBRUQsMENBRUM7QUFFRCxvQ0FFQztBQUVELDhDQVVDO0FBWUQsZ0NBY0M7QUFnQkQsd0JBa0JDO0FBbElELG9EQUEyQjtBQUMzQiwrQkFBMkI7QUFVM0IsTUFBTSxTQUFTLEdBQUcsZ0JBQW9DLENBQUE7QUFFdEQsMkVBQTJFO0FBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO0FBRTNDLCtFQUErRTtBQUMvRSxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO0FBRWxDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQTtBQUVyQixnRkFBZ0Y7QUFDaEYsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSxtRUFBbUU7QUFDbkUsU0FBUyxPQUFPO0lBQ2QsSUFBSSxTQUFTO1FBQUUsT0FBTTtJQUVyQixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTdDLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUTtRQUN2RCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3ZDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ2xDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDdEIsT0FBTTtRQUNSLENBQUM7UUFDRCxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzVCLENBQUMsQ0FBQTtJQUVELFNBQVMsR0FBRyxJQUFJLENBQUE7QUFDbEIsQ0FBQztB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
@@ -0,0 +1,17 @@
1
+ export interface PatchEntry {
2
+ /** Patch file under `patches/`, named `<package>@<generated-from-version>.patch`. */
3
+ file: string;
4
+ package: string;
5
+ /**
6
+ * Versions the patch is allowed to be attempted against. Applying is still
7
+ * gated on the diff's own context matching — this range only produces a
8
+ * clearer error than a failed hunk when a bump is known to be incompatible.
9
+ */
10
+ compatible: {
11
+ from: string;
12
+ to: string;
13
+ };
14
+ /** Surfaced in boot logs and in the error raised when the patch stops applying. */
15
+ reason: string;
16
+ }
17
+ export declare const PATCHES: PatchEntry[];
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PATCHES = void 0;
4
+ exports.PATCHES = [
5
+ {
6
+ file: "@medusajs+core-flows@2.18.0.patch",
7
+ package: "@medusajs/core-flows",
8
+ // Both targeted files are byte-identical in 2.17.2 and 2.18.0.
9
+ compatible: { from: "2.17.0", to: "2.19.0" },
10
+ reason: "refreshCartShippingMethodsWorkflow deletes any shipping method whose " +
11
+ "profile is not required by a cart item, deriving that set from each " +
12
+ "item's master product. In Mercur the profile belongs to the offer — the " +
13
+ "product link is one-to-one and the first offerer wins it — so in a " +
14
+ "multi-seller cart holding a co-sold product every other seller's method " +
15
+ "is judged orphaned and checkout fails. The patch disables that cleanup. " +
16
+ "See mercurjs/mercur#1442.",
17
+ },
18
+ ];
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGF0Y2hlcy9tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFjYSxRQUFBLE9BQU8sR0FBaUI7SUFDbkM7UUFDRSxJQUFJLEVBQUUsbUNBQW1DO1FBQ3pDLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsK0RBQStEO1FBQy9ELFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRTtRQUM1QyxNQUFNLEVBQ0osdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSwwRUFBMEU7WUFDMUUscUVBQXFFO1lBQ3JFLDBFQUEwRTtZQUMxRSwwRUFBMEU7WUFDMUUsMkJBQTJCO0tBQzlCO0NBQ0YsQ0FBQSJ9
@@ -0,0 +1,21 @@
1
+ diff --git a/dist/cart/workflows/refresh-cart-shipping-methods.js b/dist/cart/workflows/refresh-cart-shipping-methods.js
2
+ index 74e27fb..016edc9 100644
3
+ --- a/dist/cart/workflows/refresh-cart-shipping-methods.js
4
+ +++ b/dist/cart/workflows/refresh-cart-shipping-methods.js
5
+ @@ -107,7 +107,15 @@ exports.refreshCartShippingMethodsWorkflow = (0, workflows_sdk_1.createWorkflow)
6
+ // Collect profile IDs still required by remaining cart items so that
7
+ // shipping methods for profiles with no matching items can be dropped.
8
+ // Avoid clearing shipping methods for single-method carts.
9
+ - const shouldCleanupOrphanProfiles = shippingMethods.length > 1;
10
+ + // MERCUR: upstream drops a shipping method whose profile is not
11
+ + // required by any cart item, deriving that set from each item's
12
+ + // master product. Mercur's shipping profile belongs to the offer:
13
+ + // the product link is one-to-one and the first offerer wins it, so
14
+ + // in a multi-seller cart holding a co-sold product every other
15
+ + // seller's method is judged orphaned and checkout fails. The
16
+ + // cleanup is disabled rather than re-derived because the offer is
17
+ + // not on the cart this workflow is handed.
18
+ + const shouldCleanupOrphanProfiles = false;
19
+ const requiredProfileIds = new Set(items
20
+ .filter((item) => item.requires_shipping)
21
+ .map((item) => item.variant?.product?.shipping_profile?.id)
@@ -0,0 +1,7 @@
1
+ export type PackageCopy = {
2
+ dir: string;
3
+ version: string | null;
4
+ /** The copy `require()` resolves from the project — the one that must work. */
5
+ primary: boolean;
6
+ };
7
+ export declare function resolvePackageCopies(packageName: string): PackageCopy[];
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolvePackageCopies = resolvePackageCopies;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const pkg_dir_1 = __importDefault(require("pkg-dir"));
10
+ const resolve_cwd_1 = __importDefault(require("resolve-cwd"));
11
+ function readVersion(dir) {
12
+ try {
13
+ const raw = (0, fs_1.readFileSync)((0, path_1.join)(dir, "package.json"), "utf8");
14
+ return JSON.parse(raw).version ?? null;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ function canonical(dir) {
21
+ try {
22
+ return (0, fs_1.realpathSync)(dir);
23
+ }
24
+ catch {
25
+ return dir;
26
+ }
27
+ }
28
+ function sweepStore(storeDir, packageName, found) {
29
+ if (!(0, fs_1.existsSync)(storeDir))
30
+ return;
31
+ const prefix = `${packageName.replace("/", "+")}@`;
32
+ for (const entry of (0, fs_1.readdirSync)(storeDir)) {
33
+ if (!entry.startsWith(prefix))
34
+ continue;
35
+ const inner = (0, path_1.join)(storeDir, entry, "node_modules", ...packageName.split("/"));
36
+ if ((0, fs_1.existsSync)((0, path_1.join)(inner, "package.json")))
37
+ found.add(canonical(inner));
38
+ }
39
+ }
40
+ function resolvePackageCopies(packageName) {
41
+ let primary = null;
42
+ // Resolve the package entry point, not `<name>/package.json`: packages that
43
+ // declare `exports` without a `./package.json` entry — core-flows is one —
44
+ // make the subpath unresolvable, which would silently leave every copy
45
+ // non-primary and drop the guarantee that the copy this project loads is the
46
+ // one that must accept the patch.
47
+ try {
48
+ const entry = (0, resolve_cwd_1.default)(packageName);
49
+ const resolved = pkg_dir_1.default.sync((0, path_1.dirname)(entry));
50
+ if (resolved)
51
+ primary = canonical(resolved);
52
+ }
53
+ catch {
54
+ // Not resolvable from cwd; the sweeps below may still find copies.
55
+ }
56
+ const found = new Set();
57
+ if (primary)
58
+ found.add(primary);
59
+ let cursor = process.cwd();
60
+ while (true) {
61
+ const nodeModules = (0, path_1.join)(cursor, "node_modules");
62
+ if ((0, fs_1.existsSync)(nodeModules)) {
63
+ sweepStore((0, path_1.join)(nodeModules, ".bun"), packageName, found);
64
+ sweepStore((0, path_1.join)(nodeModules, ".pnpm"), packageName, found);
65
+ const hoisted = (0, path_1.join)(nodeModules, ...packageName.split("/"));
66
+ if ((0, fs_1.existsSync)((0, path_1.join)(hoisted, "package.json")))
67
+ found.add(canonical(hoisted));
68
+ }
69
+ const parent = (0, path_1.dirname)(cursor);
70
+ if (parent === cursor)
71
+ break;
72
+ cursor = parent;
73
+ }
74
+ return [...found].map((dir) => ({
75
+ dir,
76
+ version: readVersion(dir),
77
+ primary: dir === primary,
78
+ }));
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1wYWNrYWdlLWRpcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGF0Y2hlcy9yZXNvbHZlLXBhY2thZ2UtZGlycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVEQSxvREF3Q0M7QUEvRkQsMkJBQXdFO0FBQ3hFLCtCQUFvQztBQUNwQyxzREFBNEI7QUFDNUIsOERBQW9DO0FBb0JwQyxTQUFTLFdBQVcsQ0FBQyxHQUFXO0lBQzlCLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDM0QsT0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBMEIsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFBO0lBQ2xFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVztJQUM1QixJQUFJLENBQUM7UUFDSCxPQUFPLElBQUEsaUJBQVksRUFBQyxHQUFHLENBQUMsQ0FBQTtJQUMxQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUNqQixRQUFnQixFQUNoQixXQUFtQixFQUNuQixLQUFrQjtJQUVsQixJQUFJLENBQUMsSUFBQSxlQUFVLEVBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTTtJQUVqQyxNQUFNLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUE7SUFDbEQsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFBLGdCQUFXLEVBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVB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
@@ -0,0 +1,25 @@
1
+ export type Hunk = {
2
+ /** Context + removed lines: what the file must contain for the hunk to apply. */
3
+ before: string[];
4
+ /** Context + added lines: what replaces it. */
5
+ after: string[];
6
+ /** 1-based line the hunk was generated at, used as the first place to look. */
7
+ oldStart: number;
8
+ };
9
+ export type FilePatch = {
10
+ /** Path relative to the package root. */
11
+ path: string;
12
+ hunks: Hunk[];
13
+ };
14
+ /**
15
+ * Parses the subset of unified diff that `git diff --no-index` emits for text
16
+ * files: file headers, hunk headers, and ` `/`-`/`+` body lines. Anything else
17
+ * (rename, mode, binary) is unsupported on purpose — patches here are expected
18
+ * to be small edits to shipped JavaScript.
19
+ */
20
+ export declare function parseUnifiedDiff(patch: string): FilePatch[];
21
+ /**
22
+ * Applies every hunk, or returns `null`. A patch is never partially applied.
23
+ */
24
+ export declare function applyHunks(source: string, hunks: Hunk[]): string | null;
25
+ export declare function reverse(hunks: Hunk[]): Hunk[];
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseUnifiedDiff = parseUnifiedDiff;
4
+ exports.applyHunks = applyHunks;
5
+ exports.reverse = reverse;
6
+ const HUNK_HEADER = /^@@ -(\d+)(?:,\d+)? \+\d+(?:,\d+)? @@/;
7
+ function stripPrefix(path) {
8
+ return path.replace(/^[ab]\//, "").trim();
9
+ }
10
+ /**
11
+ * Parses the subset of unified diff that `git diff --no-index` emits for text
12
+ * files: file headers, hunk headers, and ` `/`-`/`+` body lines. Anything else
13
+ * (rename, mode, binary) is unsupported on purpose — patches here are expected
14
+ * to be small edits to shipped JavaScript.
15
+ */
16
+ function parseUnifiedDiff(patch) {
17
+ const files = [];
18
+ const lines = patch.split("\n");
19
+ let current = null;
20
+ let hunk = null;
21
+ const closeHunk = () => {
22
+ if (current && hunk)
23
+ current.hunks.push(hunk);
24
+ hunk = null;
25
+ };
26
+ for (const line of lines) {
27
+ if (line.startsWith("+++ ")) {
28
+ closeHunk();
29
+ const path = stripPrefix(line.slice(4));
30
+ if (path === "/dev/null") {
31
+ throw new Error("Unified diff deletes a file, which is not supported");
32
+ }
33
+ current = { path, hunks: [] };
34
+ files.push(current);
35
+ continue;
36
+ }
37
+ if (line.startsWith("--- ") || line.startsWith("diff --git ")) {
38
+ closeHunk();
39
+ continue;
40
+ }
41
+ const header = HUNK_HEADER.exec(line);
42
+ if (header) {
43
+ closeHunk();
44
+ hunk = { before: [], after: [], oldStart: Number.parseInt(header[1], 10) };
45
+ continue;
46
+ }
47
+ if (!hunk)
48
+ continue;
49
+ const marker = line[0];
50
+ const content = line.slice(1);
51
+ if (marker === " ") {
52
+ hunk.before.push(content);
53
+ hunk.after.push(content);
54
+ }
55
+ else if (marker === "-") {
56
+ hunk.before.push(content);
57
+ }
58
+ else if (marker === "+") {
59
+ hunk.after.push(content);
60
+ }
61
+ // "" and blank separators are ignored.
62
+ }
63
+ closeHunk();
64
+ return files.filter((file) => file.hunks.length);
65
+ }
66
+ function matchesAt(source, block, at) {
67
+ if (at < 0 || at + block.length > source.length)
68
+ return false;
69
+ return block.every((line, i) => source[at + i] === line);
70
+ }
71
+ /**
72
+ * How far from the recorded line a hunk may drift and still be considered the
73
+ * same code. Unbounded searching is unsafe: the same few lines of context can
74
+ * legitimately appear elsewhere in a file — cartFieldsForRefreshSteps and
75
+ * completeCartFields share several — and relocating a hunk that far would
76
+ * silently patch the wrong site.
77
+ */
78
+ const MAX_DRIFT_LINES = 50;
79
+ /**
80
+ * Locates a hunk by content, preferring the line it was generated at and
81
+ * otherwise accepting a single unambiguous match nearby. Returns -1 when the
82
+ * hunk does not apply, or could apply in more than one place — both mean the
83
+ * patch is stale and must be regenerated rather than guessed at.
84
+ */
85
+ function locate(source, block, oldStart) {
86
+ if (!block.length)
87
+ return -1;
88
+ const expected = oldStart - 1;
89
+ if (matchesAt(source, block, expected))
90
+ return expected;
91
+ const from = Math.max(0, expected - MAX_DRIFT_LINES);
92
+ const to = Math.min(source.length - block.length, expected + MAX_DRIFT_LINES);
93
+ let found = -1;
94
+ for (let i = from; i <= to; i++) {
95
+ if (!matchesAt(source, block, i))
96
+ continue;
97
+ if (found !== -1)
98
+ return -1;
99
+ found = i;
100
+ }
101
+ return found;
102
+ }
103
+ /**
104
+ * Applies every hunk, or returns `null`. A patch is never partially applied.
105
+ */
106
+ function applyHunks(source, hunks) {
107
+ let lines = source.split("\n");
108
+ for (const hunk of hunks) {
109
+ const at = locate(lines, hunk.before, hunk.oldStart);
110
+ if (at === -1)
111
+ return null;
112
+ lines = [
113
+ ...lines.slice(0, at),
114
+ ...hunk.after,
115
+ ...lines.slice(at + hunk.before.length),
116
+ ];
117
+ }
118
+ return lines.join("\n");
119
+ }
120
+ function reverse(hunks) {
121
+ return hunks.map((hunk) => ({
122
+ before: hunk.after,
123
+ after: hunk.before,
124
+ oldStart: hunk.oldStart,
125
+ }));
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pZmllZC1kaWZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BhdGNoZXMvdW5pZmllZC1kaWZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLDRDQXVEQztBQTRDRCxnQ0FlQztBQUVELDBCQU1DO0FBdElELE1BQU0sV0FBVyxHQUFHLHVDQUF1QyxDQUFBO0FBRTNELFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUMzQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFhO0lBQzVDLE1BQU0sS0FBSyxHQUFnQixFQUFFLENBQUE7SUFDN0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUUvQixJQUFJLE9BQU8sR0FBcUIsSUFBSSxDQUFBO0lBQ3BDLElBQUksSUFBSSxHQUFnQixJQUFJLENBQUE7SUFFNUIsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFO1FBQ3JCLElBQUksT0FBTyxJQUFJLElBQUk7WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3QyxJQUFJLEdBQUcsSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1QixTQUFTLEVBQUUsQ0FBQTtZQUNYLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdkMsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMscURB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
@@ -0,0 +1,5 @@
1
+ export declare function compareVersions(a: string, b: string): number;
2
+ export declare function isWithinRange(version: string, range: {
3
+ from: string;
4
+ to: string;
5
+ }): boolean;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // Deliberately not semver: the range a patch declares is always a plain
3
+ // "verified from this version, up to that one" pair, and pulling a resolver in
4
+ // for that would be more machinery than the check deserves.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.compareVersions = compareVersions;
7
+ exports.isWithinRange = isWithinRange;
8
+ function parse(version) {
9
+ const core = version.split("-")[0];
10
+ return core.split(".").map((part) => Number.parseInt(part, 10) || 0);
11
+ }
12
+ function compareVersions(a, b) {
13
+ const left = parse(a);
14
+ const right = parse(b);
15
+ for (let i = 0; i < 3; i++) {
16
+ const diff = (left[i] ?? 0) - (right[i] ?? 0);
17
+ if (diff !== 0)
18
+ return diff > 0 ? 1 : -1;
19
+ }
20
+ return 0;
21
+ }
22
+ function isWithinRange(version, range) {
23
+ return (compareVersions(version, range.from) >= 0 &&
24
+ compareVersions(version, range.to) < 0);
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wYXRjaGVzL3ZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdFQUF3RTtBQUN4RSwrRUFBK0U7QUFDL0UsNERBQTREOztBQU81RCwwQ0FVQztBQUVELHNDQVFDO0FBekJELFNBQVMsS0FBSyxDQUFDLE9BQWU7SUFDNUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQ2xELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNyQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzdDLElBQUksSUFBSSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FDM0IsT0FBZSxFQUNmLEtBQW1DO0lBRW5DLE9BQU8sQ0FDTCxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3pDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FDdkMsQ0FBQTtBQUNILENBQUMifQ==
@@ -0,0 +1,4 @@
1
+ import { SubscriberArgs, SubscriberConfig } from "@medusajs/framework";
2
+ import { ProviderWebhookPayload } from "@medusajs/framework/types";
3
+ export default function paymentWebhookHandler({ event, container, }: SubscriberArgs<ProviderWebhookPayload>): Promise<void>;
4
+ export declare const config: SubscriberConfig;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = paymentWebhookHandler;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const events_1 = require("../workflows/events");
7
+ const payment_1 = require("../workflows/payment");
8
+ const IGNORED_ACTIONS = [
9
+ utils_1.PaymentActions.NOT_SUPPORTED,
10
+ utils_1.PaymentActions.CANCELED,
11
+ utils_1.PaymentActions.FAILED,
12
+ utils_1.PaymentActions.REQUIRES_MORE,
13
+ utils_1.PaymentActions.PENDING_AUTHORIZATION,
14
+ // Intermediate provider events (e.g. Stripe `payment_intent.created`) must
15
+ // not trigger cart completion.
16
+ utils_1.PaymentActions.PENDING,
17
+ ];
18
+ async function paymentWebhookHandler({ event, container, }) {
19
+ const paymentService = container.resolve(utils_1.Modules.PAYMENT);
20
+ const input = event.data;
21
+ if (input.payload?.rawData?.type === "Buffer") {
22
+ input.payload.rawData = Buffer.from(input.payload.rawData.data);
23
+ }
24
+ const processedEvent = await paymentService.getWebhookActionAndData(input);
25
+ // Without a session id the event cannot be tied to a payment session, and
26
+ // the workflow's filters would resolve to an arbitrary unrelated cart.
27
+ if (!processedEvent.data?.session_id) {
28
+ return;
29
+ }
30
+ if (IGNORED_ACTIONS.includes(processedEvent.action)) {
31
+ return;
32
+ }
33
+ const wfEngine = container.resolve(utils_1.Modules.WORKFLOW_ENGINE);
34
+ await wfEngine.run(payment_1.processPaymentWorkflowId, { input: processedEvent });
35
+ }
36
+ exports.config = {
37
+ event: events_1.PaymentWebhookEvents.WEBHOOK_RECEIVED,
38
+ context: {
39
+ subscriberId: "mercur-payment-webhook-handler",
40
+ },
41
+ };
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC13ZWJob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3BheW1lbnQtd2ViaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1QkEsd0NBNEJDO0FBakRELHFEQUFtRTtBQUVuRSxnREFBMEQ7QUFDMUQsa0RBQStEO0FBTy9ELE1BQU0sZUFBZSxHQUFhO0lBQ2hDLHNCQUFjLENBQUMsYUFBYTtJQUM1QixzQkFBYyxDQUFDLFFBQVE7SUFDdkIsc0JBQWMsQ0FBQyxNQUFNO0lBQ3JCLHNCQUFjLENBQUMsYUFBYTtJQUM1QixzQkFBYyxDQUFDLHFCQUFxQjtJQUNwQywyRUFBMkU7SUFDM0UsK0JBQStCO0lBQy9CLHNCQUFjLENBQUMsT0FBTztDQUN2QixDQUFBO0FBRWMsS0FBSyxVQUFVLHFCQUFxQixDQUFDLEVBQ2xELEtBQUssRUFDTCxTQUFTLEdBQzhCO0lBQ3ZDLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRXpELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUE7SUFFeEIsSUFBSyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQXVDLEVBQUUsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9FLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ2hDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBdUMsQ0FBQyxJQUFJLENBQzVELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxjQUFjLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFMUUsMEVBQTBFO0lBQzFFLHVFQUF1RTtJQUN2RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUNyQyxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzNELE1BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQyxrQ0FBd0IsRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFBO0FBQ3pFLENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLDZCQUFvQixDQUFDLGdCQUFnQjtJQUM1QyxPQUFPLEVBQUU7UUFDUCxZQUFZLEVBQUUsZ0NBQWdDO0tBQy9DO0NBQ0YsQ0FBQSJ9
@@ -5,6 +5,14 @@ export type MercurInputConfig = Omit<InputConfigWithArrayModules, "projectConfig
5
5
  http?: HttpConfig & {
6
6
  vendorCors?: string;
7
7
  };
8
+ mercur?: {
9
+ /**
10
+ * Patch file names to skip, e.g. "@medusajs+core-flows@2.18.0.patch".
11
+ * Each one restores an upstream bug, so only reach for this when a patch
12
+ * conflicts with your own override.
13
+ */
14
+ disabledPatches?: string[];
15
+ };
8
16
  };
9
17
  };
10
18
  export declare function withMercur(config?: MercurInputConfig): InputConfigWithArrayModules;