@legenki/print2medusa 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/examples/basic-store/medusa-config.snippet.js +9 -1
- package/.medusa/server/src/utils/index.js +3 -1
- package/.medusa/server/src/utils/removed.js +78 -0
- package/.medusa/server/src/utils/stock.js +6 -2
- package/.medusa/server/src/workflows/sync-products.js +49 -1
- package/README.md +49 -22
- package/package.json +10 -9
|
@@ -27,12 +27,18 @@ module.exports = (0, utils_1.defineConfig)({
|
|
|
27
27
|
// allowPartialOrders: false,
|
|
28
28
|
// markupPercent: 30,
|
|
29
29
|
// defaultCurrency: "USD",
|
|
30
|
+
// onDiscontinued: "flag",
|
|
31
|
+
// onRemovedFromPrintful: "unpublish", // or "ignore"
|
|
32
|
+
// liveShippingRates: true,
|
|
33
|
+
// fallbackShippingRates: { STANDARD: 500 },
|
|
30
34
|
},
|
|
31
35
|
},
|
|
32
36
|
],
|
|
33
37
|
modules: [
|
|
34
38
|
{
|
|
35
39
|
resolve: "@medusajs/medusa/fulfillment",
|
|
40
|
+
// Required for live rates + shipping method confirmation.
|
|
41
|
+
dependencies: ["query"],
|
|
36
42
|
options: {
|
|
37
43
|
providers: [
|
|
38
44
|
{
|
|
@@ -45,6 +51,8 @@ module.exports = (0, utils_1.defineConfig)({
|
|
|
45
51
|
options: {
|
|
46
52
|
apiToken: process.env.PRINTFUL_API_TOKEN,
|
|
47
53
|
storeId: process.env.PRINTFUL_STORE_ID,
|
|
54
|
+
// liveShippingRates: true,
|
|
55
|
+
// fallbackShippingRates: { STANDARD: 500 },
|
|
48
56
|
},
|
|
49
57
|
},
|
|
50
58
|
],
|
|
@@ -54,4 +62,4 @@ module.exports = (0, utils_1.defineConfig)({
|
|
|
54
62
|
});
|
|
55
63
|
// silence unused import when copying
|
|
56
64
|
void utils_1.Modules;
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkdXNhLWNvbmZpZy5zbmlwcGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZXhhbXBsZXMvYmFzaWMtc3RvcmUvbWVkdXNhLWNvbmZpZy5zbmlwcGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7O0dBRUc7QUFDSCxxREFBMEU7QUFFMUUsSUFBQSxlQUFPLEVBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBRTdELE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBQSxvQkFBWSxFQUFDO0lBQzVCLGFBQWEsRUFBRTtRQUNiLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVk7UUFDckMsSUFBSSxFQUFFO1lBQ0osU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVztZQUNsQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFXO1lBQ2xDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVU7WUFDaEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLGFBQWE7WUFDbEQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLGFBQWE7U0FDekQ7S0FDRjtJQUNELE9BQU8sRUFBRTtRQUNQO1lBQ0UsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxPQUFPLEVBQUU7Z0JBQ1AsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCO2dCQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7Z0JBQ3RDLDBCQUEwQjtnQkFDMUIsOEJBQThCO2dCQUM5Qiw2QkFBNkI7Z0JBQzdCLHFCQUFxQjtnQkFDckIsMEJBQTBCO2dCQUMxQiwwQkFBMEI7Z0JBQzFCLHFEQUFxRDtnQkFDckQsMkJBQTJCO2dCQUMzQiw0Q0FBNEM7YUFDN0M7U0FDRjtLQUNGO0lBQ0QsT0FBTyxFQUFFO1FBQ1A7WUFDRSxPQUFPLEVBQUUsOEJBQThCO1lBQ3ZDLDBEQUEwRDtZQUMxRCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDdkIsT0FBTyxFQUFFO2dCQUNQLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUscUNBQXFDO3dCQUM5QyxFQUFFLEVBQUUsUUFBUTtxQkFDYjtvQkFDRDt3QkFDRSxPQUFPLEVBQUUsc0RBQXNEO3dCQUMvRCxFQUFFLEVBQUUsVUFBVTt3QkFDZCxPQUFPLEVBQUU7NEJBQ1AsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCOzRCQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7NEJBQ3RDLDJCQUEyQjs0QkFDM0IsNENBQTRDO3lCQUM3QztxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtDQUNGLENBQUMsQ0FBQTtBQUVGLHFDQUFxQztBQUNyQyxLQUFLLGVBQU8sQ0FBQSJ9
|
|
@@ -17,5 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./errors"), exports);
|
|
18
18
|
__exportStar(require("./mappers"), exports);
|
|
19
19
|
__exportStar(require("./printful-client"), exports);
|
|
20
|
+
__exportStar(require("./removed"), exports);
|
|
21
|
+
__exportStar(require("./stock"), exports);
|
|
20
22
|
__exportStar(require("./types"), exports);
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF3QjtBQUN4Qiw0Q0FBeUI7QUFDekIsb0RBQWlDO0FBQ2pDLDRDQUF5QjtBQUN6QiwwQ0FBdUI7QUFDdkIsMENBQXVCIn0=
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REMOVED_MARKER_KEY = void 0;
|
|
4
|
+
exports.planRemovedProductWrite = planRemovedProductWrite;
|
|
5
|
+
exports.shouldRunRemovalPass = shouldRunRemovalPass;
|
|
6
|
+
exports.findMissingSyncProductLinks = findMissingSyncProductLinks;
|
|
7
|
+
exports.clearRemovedMarker = clearRemovedMarker;
|
|
8
|
+
const stock_1 = require("./stock");
|
|
9
|
+
/** Set when the plugin unpublished a product because it vanished from Printful. */
|
|
10
|
+
exports.REMOVED_MARKER_KEY = "printful_removed";
|
|
11
|
+
/**
|
|
12
|
+
* Decide what to write for a linked product that no longer appears in Printful.
|
|
13
|
+
*
|
|
14
|
+
* Pure: the caller applies the result. Same ownership rules as stock —
|
|
15
|
+
* we only claim an unpublish we perform. A product the merchant already
|
|
16
|
+
* drafted without our marker is left alone.
|
|
17
|
+
*/
|
|
18
|
+
function planRemovedProductWrite(input) {
|
|
19
|
+
const { policy, currentStatus, currentMetadata } = input;
|
|
20
|
+
const metadata = { ...currentMetadata };
|
|
21
|
+
if (policy === "ignore") {
|
|
22
|
+
return { action: "none", status: currentStatus, metadata };
|
|
23
|
+
}
|
|
24
|
+
// Already draft without a plugin marker — merchant owns it.
|
|
25
|
+
if (currentStatus === "draft") {
|
|
26
|
+
const alreadyOurs = metadata[stock_1.STOCK_MARKER_KEY] === "unavailable" ||
|
|
27
|
+
metadata[exports.REMOVED_MARKER_KEY] === true;
|
|
28
|
+
if (!alreadyOurs) {
|
|
29
|
+
return { action: "none", status: "draft", metadata };
|
|
30
|
+
}
|
|
31
|
+
// Keep markers consistent if we already unpublished for stock/removal.
|
|
32
|
+
metadata[stock_1.STOCK_MARKER_KEY] = "unavailable";
|
|
33
|
+
metadata[exports.REMOVED_MARKER_KEY] = true;
|
|
34
|
+
return { action: "none", status: "draft", metadata };
|
|
35
|
+
}
|
|
36
|
+
metadata[stock_1.STOCK_MARKER_KEY] = "unavailable";
|
|
37
|
+
metadata[exports.REMOVED_MARKER_KEY] = true;
|
|
38
|
+
return { action: "unpublish", status: "draft", metadata };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether this sync run may take products down.
|
|
42
|
+
*
|
|
43
|
+
* A partial run — `limit` set, for a smoke test or a manual spot-check — sees
|
|
44
|
+
* only the first N products, so every product past the limit looks removed.
|
|
45
|
+
* Acting on that would unpublish most of the catalogue from a run the merchant
|
|
46
|
+
* expected to touch a handful of items.
|
|
47
|
+
*
|
|
48
|
+
* `"ignore"` turns the pass off entirely for merchants who curate publication
|
|
49
|
+
* by hand.
|
|
50
|
+
*/
|
|
51
|
+
function shouldRunRemovalPass(input) {
|
|
52
|
+
return input.limit == null && input.policy !== "ignore";
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Which linked products are missing from a full Printful listing.
|
|
56
|
+
*
|
|
57
|
+
* `seenSyncProductIds` is the set of Printful sync product ids returned by
|
|
58
|
+
* the full list endpoint (including ignored ones — ignored still "exists").
|
|
59
|
+
* Only a full catalogue pass may call this: a partial sync (`limit`) would
|
|
60
|
+
* otherwise treat every product beyond the limit as removed.
|
|
61
|
+
*/
|
|
62
|
+
function findMissingSyncProductLinks(links, seenSyncProductIds) {
|
|
63
|
+
const seen = new Set([...seenSyncProductIds].map((id) => String(id).trim()).filter(Boolean));
|
|
64
|
+
return links.filter((link) => !seen.has(String(link.printful_sync_product_id).trim()));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Clear removal markers when a product is seen again on a later sync.
|
|
68
|
+
* Stock publication may still keep the product draft if variants are OOS.
|
|
69
|
+
*/
|
|
70
|
+
function clearRemovedMarker(metadata) {
|
|
71
|
+
if (metadata[exports.REMOVED_MARKER_KEY] === undefined) {
|
|
72
|
+
return metadata;
|
|
73
|
+
}
|
|
74
|
+
const next = { ...metadata };
|
|
75
|
+
delete next[exports.REMOVED_MARKER_KEY];
|
|
76
|
+
return next;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9yZW1vdmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQStCQSwwREE2QkM7QUFhRCxvREFLQztBQVVELGtFQVNDO0FBTUQsZ0RBU0M7QUFoSEQsbUNBQTBDO0FBZTFDLG1GQUFtRjtBQUN0RSxRQUFBLGtCQUFrQixHQUFHLGtCQUFrQixDQUFBO0FBUXBEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHVCQUF1QixDQUFDLEtBSXZDO0lBQ0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBQ3hELE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxlQUFlLEVBQUUsQ0FBQTtJQUV2QyxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxDQUFBO0lBQzVELENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsSUFBSSxhQUFhLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDOUIsTUFBTSxXQUFXLEdBQ2YsUUFBUSxDQUFDLHdCQUFnQixDQUFDLEtBQUssYUFBYTtZQUM1QyxRQUFRLENBQUMsMEJBQWtCLENBQUMsS0FBSyxJQUFJLENBQUE7UUFDdkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUE7UUFDdEQsQ0FBQztRQUNELHVFQUF1RTtRQUN2RSxRQUFRLENBQUMsd0JBQWdCLENBQUMsR0FBRyxhQUFhLENBQUE7UUFDMUMsUUFBUSxDQUFDLDBCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFBO1FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUE7SUFDdEQsQ0FBQztJQUVELFFBQVEsQ0FBQyx3QkFBZ0IsQ0FBQyxHQUFHLGFBQWEsQ0FBQTtJQUMxQyxRQUFRLENBQUMsMEJBQWtCLENBQUMsR0FBRyxJQUFJLENBQUE7SUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQTtBQUMzRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLEtBR3BDO0lBQ0MsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQTtBQUN6RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLDJCQUEyQixDQUV6QyxLQUFVLEVBQUUsa0JBQW9DO0lBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUNsQixDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FDdkUsQ0FBQTtJQUNELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FDakIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDbEUsQ0FBQTtBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsUUFBaUM7SUFFakMsSUFBSSxRQUFRLENBQUMsMEJBQWtCLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMvQyxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFBO0lBQzVCLE9BQU8sSUFBSSxDQUFDLDBCQUFrQixDQUFDLENBQUE7SUFDL0IsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIn0=
|
|
@@ -4,6 +4,7 @@ exports.DISCONTINUED_MARKER_KEY = exports.STOCK_MARKER_KEY = void 0;
|
|
|
4
4
|
exports.planStockActions = planStockActions;
|
|
5
5
|
exports.resolvePublication = resolvePublication;
|
|
6
6
|
exports.resolveExistingProductWrite = resolveExistingProductWrite;
|
|
7
|
+
const removed_1 = require("./removed");
|
|
7
8
|
/** Statuses that mean a variant cannot currently be ordered. */
|
|
8
9
|
const UNAVAILABLE = new Set([
|
|
9
10
|
"out_of_stock",
|
|
@@ -102,7 +103,7 @@ function resolveExistingProductWrite(input) {
|
|
|
102
103
|
// Printful-derived keys win over the stored copies of themselves, but the
|
|
103
104
|
// marker decision is made against the *current* metadata and must survive
|
|
104
105
|
// the merge — the mapper never writes STOCK_MARKER_KEY.
|
|
105
|
-
|
|
106
|
+
let metadata = {
|
|
106
107
|
...publication.metadata,
|
|
107
108
|
...mappedMetadata,
|
|
108
109
|
};
|
|
@@ -112,6 +113,9 @@ function resolveExistingProductWrite(input) {
|
|
|
112
113
|
else {
|
|
113
114
|
metadata[exports.STOCK_MARKER_KEY] = publication.metadata[exports.STOCK_MARKER_KEY];
|
|
114
115
|
}
|
|
116
|
+
// Seen again on Printful — drop the removal flag even if stock still keeps
|
|
117
|
+
// the product draft (all variants out of stock).
|
|
118
|
+
metadata = (0, removed_1.clearRemovedMarker)(metadata);
|
|
115
119
|
return { status: publication.status, metadata };
|
|
116
120
|
}
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvc3RvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBb0JBLDRDQTRCQztBQTZCRCxnREErQkM7QUFnQkQsa0VBaUNDO0FBN0pELHVDQUE4QztBQUc5QyxnRUFBZ0U7QUFDaEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDMUIsY0FBYztJQUNkLHdCQUF3QjtJQUN4QixjQUFjO0NBQ2YsQ0FBQyxDQUFBO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLFFBQXdFO0lBRXhFLE1BQU0sbUJBQW1CLEdBQTJCLEVBQUUsQ0FBQTtJQUN0RCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFDeEIsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFBO0lBRTNCLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixJQUFJLFFBQVEsQ0FBQTtRQUNoRCxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFBO1FBRTFDLElBQUksTUFBTSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQzlCLGVBQWUsR0FBRyxJQUFJLENBQUE7UUFDeEIsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDN0IsWUFBWSxHQUFHLElBQUksQ0FBQTtRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUUzRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXO1FB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
|
|
@@ -10,6 +10,7 @@ const orphans_1 = require("../utils/orphans");
|
|
|
10
10
|
const variant_links_1 = require("../utils/variant-links");
|
|
11
11
|
const sync_status_1 = require("../utils/sync-status");
|
|
12
12
|
const stock_1 = require("../utils/stock");
|
|
13
|
+
const removed_1 = require("../utils/removed");
|
|
13
14
|
const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
14
15
|
name: "printful-sync-products",
|
|
15
16
|
// Runs past the HTTP response and completes on its own — no
|
|
@@ -264,6 +265,53 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
264
265
|
});
|
|
265
266
|
}
|
|
266
267
|
}
|
|
268
|
+
// Products that disappeared from Printful. Only a full catalogue pass may
|
|
269
|
+
// do this — a `limit` would treat everything beyond the page as removed.
|
|
270
|
+
// The decision lives in `shouldRunRemovalPass` so it is covered by a test:
|
|
271
|
+
// this is the one condition whose failure unpublishes a live catalogue.
|
|
272
|
+
{
|
|
273
|
+
const removalPolicy = options.onRemovedFromPrintful ?? "unpublish";
|
|
274
|
+
if ((0, removed_1.shouldRunRemovalPass)({ policy: removalPolicy, limit: input.limit })) {
|
|
275
|
+
try {
|
|
276
|
+
const seenIds = summaries.map((s) => String(s.id));
|
|
277
|
+
// Include ignored Printful rows: they still exist in the store.
|
|
278
|
+
const links = await printful.listPrintfulProductLinks({ printful_store_id: storeId }, { take: 100_000 });
|
|
279
|
+
const missing = (0, removed_1.findMissingSyncProductLinks)(links, seenIds);
|
|
280
|
+
for (const link of missing) {
|
|
281
|
+
try {
|
|
282
|
+
const product = await productModule.retrieveProduct(link.medusa_product_id);
|
|
283
|
+
const plan = (0, removed_1.planRemovedProductWrite)({
|
|
284
|
+
policy: removalPolicy,
|
|
285
|
+
currentStatus: product.status === "published" ? "published" : "draft",
|
|
286
|
+
currentMetadata: (product.metadata ?? {}),
|
|
287
|
+
});
|
|
288
|
+
if (plan.action === "unpublish") {
|
|
289
|
+
await productModule.updateProducts(link.medusa_product_id, {
|
|
290
|
+
status: plan.status,
|
|
291
|
+
metadata: plan.metadata,
|
|
292
|
+
});
|
|
293
|
+
counters.updated += 1;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
counters.failed += 1;
|
|
298
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
299
|
+
counters.errors.push(`Removed product ${link.printful_sync_product_id}: ${message}`);
|
|
300
|
+
}
|
|
301
|
+
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
302
|
+
products_processed: processed,
|
|
303
|
+
products_total: toProcess.length,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
counters.failed += 1;
|
|
309
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
310
|
+
counters.errors.push(`Removal pass failed: ${message}`);
|
|
311
|
+
logger.error(`Printful sync removal pass failed: ${message}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
267
315
|
return new workflows_sdk_1.StepResponse(counters, { orphanProductIds: orphans.toDelete() });
|
|
268
316
|
}, async (compensateInput, { container }) => {
|
|
269
317
|
if (!compensateInput?.orphanProductIds?.length) {
|
|
@@ -311,4 +359,4 @@ exports.syncProductsWorkflow = (0, workflows_sdk_1.createWorkflow)("printful-syn
|
|
|
311
359
|
});
|
|
312
360
|
});
|
|
313
361
|
exports.default = exports.syncProductsWorkflow;
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3luYy1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFNMEM7QUFDMUMsNERBR29DO0FBQ3BDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFFckQsOENBQWdGO0FBQ2hGLDhDQUFnRDtBQUNoRCwwREFBOEQ7QUFDOUQsc0RBQXdEO0FBQ3hELDBDQUl1QjtBQWdCdkIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2pDO0lBQ0UsSUFBSSxFQUFFLHdCQUF3QjtJQUM5Qiw0REFBNEQ7SUFDNUQsMEVBQTBFO0lBQzFFLEtBQUssRUFBRSxJQUFJO0lBQ1gsbUJBQW1CLEVBQUUsSUFBSTtJQUN6Qix5RUFBeUU7SUFDekUsa0VBQWtFO0lBQ2xFLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLG9DQUFvQztDQUNyQyxFQUNELEtBQUssRUFBRSxLQUF3QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUNoRCxNQUFNLFFBQVEsR0FBMEIsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDMUUsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUUzQyxNQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FB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
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3luYy1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFNMEM7QUFDMUMsNERBR29DO0FBQ3BDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFFckQsOENBQWdGO0FBQ2hGLDhDQUFnRDtBQUNoRCwwREFBOEQ7QUFDOUQsc0RBQXdEO0FBQ3hELDBDQUl1QjtBQUN2Qiw4Q0FLeUI7QUFnQnpCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQkFBVSxFQUNqQztJQUNFLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsNERBQTREO0lBQzVELDBFQUEwRTtJQUMxRSxLQUFLLEVBQUUsSUFBSTtJQUNYLG1CQUFtQixFQUFFLElBQUk7SUFDekIseUVBQXlFO0lBQ3pFLGtFQUFrRTtJQUNsRSx1RUFBdUU7SUFDdkUsc0VBQXNFO0lBQ3RFLDBFQUEwRTtJQUMxRSxvQ0FBb0M7Q0FDckMsRUFDRCxLQUFLLEVBQUUsS0FBd0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDaEQsTUFBTSxRQUFRLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDekMsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDM0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7SUFFM0MsTUFBTSxTQUFTLEdBQUcs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
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@legenki/print2medusa)
|
|
4
4
|
[](https://www.npmjs.com/package/@legenki/print2medusa)
|
|
5
|
-
[](
|
|
5
|
+
[](https://github.com/legenki/print2medusa/blob/main/LICENSE)
|
|
6
6
|
|
|
7
7
|
Printful → Medusa v2 plugin: **sync Store Products**, **auto-create Printful orders** on payment capture, and a **Fulfillment Provider** for admin shipping options.
|
|
8
8
|
|
|
@@ -11,7 +11,7 @@ Published on npm as [`@legenki/print2medusa`](https://www.npmjs.com/package/@leg
|
|
|
11
11
|
## Requirements
|
|
12
12
|
|
|
13
13
|
- Node.js ≥ 20
|
|
14
|
-
- Medusa
|
|
14
|
+
- Medusa **≥ 2.18.0** (peer dependency `^2.18.0`)
|
|
15
15
|
- Printful store on the **Manual order / API** platform with a private token (`orders`, `sync_products` scopes)
|
|
16
16
|
|
|
17
17
|
## Install
|
|
@@ -89,6 +89,9 @@ See `examples/basic-store/` for a fuller snippet.
|
|
|
89
89
|
| -------------------- | ----------------------------------------------------------------------------------------- |
|
|
90
90
|
| Product sync | Admin **Sync Now** or `POST /admin/printful/sync` → runs in the background, one at a time |
|
|
91
91
|
| Stock awareness | Variants Printful reports as unavailable unpublish the product; restock republishes it |
|
|
92
|
+
| Removal handling | A full sync drafts products that vanished from Printful; a re-add republishes them |
|
|
93
|
+
| Shipping fidelity | The method the customer paid for is confirmed with Printful and sent on the order |
|
|
94
|
+
| Order economics | Printful's cost and your margin on the Admin order page |
|
|
92
95
|
| Links | `printful_product_link` / `printful_variant_link` (+ metadata IDs) |
|
|
93
96
|
| Orders | On `payment.captured` → creates Printful order with **`sync_variant_id`** |
|
|
94
97
|
| Fulfillment provider | Select Printful shipping option in Admin locations |
|
|
@@ -246,11 +249,9 @@ cart — the whole response is cached, and each option is picked from it locally
|
|
|
246
249
|
|
|
247
250
|
### Limits worth knowing
|
|
248
251
|
|
|
249
|
-
- **
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
calculation onto the shipping method, and the mechanism that would fix this
|
|
253
|
-
needs its own release.
|
|
252
|
+
- **A method override is sent only when Printful confirmed it live** at selection
|
|
253
|
+
(`rate_source: "live"`). Fallback pricing still lets checkout complete; the
|
|
254
|
+
order then lets Printful pick the method. See the 0.7.0 changelog.
|
|
254
255
|
- **Return options are never priced live.** Printful quotes outbound shipping
|
|
255
256
|
only, so a return shipping option must be given a flat admin price.
|
|
256
257
|
- **Rates are quoted in the cart's currency** by asking Printful to convert. If
|
|
@@ -282,6 +283,18 @@ unpublished itself — a product you set to draft by hand stays draft. Variants
|
|
|
282
283
|
carry `printful_availability_status` in metadata, and discontinued products get
|
|
283
284
|
`printful_discontinued` unless `onDiscontinued: "ignore"`.
|
|
284
285
|
|
|
286
|
+
**Sold-out sizes are still orderable in Medusa cart APIs** (`manage_inventory`
|
|
287
|
+
is false for POD). Hide or disable them in your storefront by reading
|
|
288
|
+
`printful_availability_status` — see
|
|
289
|
+
[the storefront availability guide](https://github.com/legenki/print2medusa/blob/main/docs/storefront-availability.md).
|
|
290
|
+
|
|
291
|
+
### Products removed from Printful
|
|
292
|
+
|
|
293
|
+
After a **full** sync, linked products that no longer appear in the Printful
|
|
294
|
+
store list are unpublished by default (`onRemovedFromPrintful: "unpublish"`).
|
|
295
|
+
Use `"ignore"` to leave publication alone. The plugin never deletes products.
|
|
296
|
+
Partial syncs with `limit` skip this pass.
|
|
297
|
+
|
|
285
298
|
## Order economics
|
|
286
299
|
|
|
287
300
|
Printful returns what it charged along with the created order, so the plugin
|
|
@@ -320,10 +333,23 @@ breakdown need not sum to the total.
|
|
|
320
333
|
npm install
|
|
321
334
|
npm run build
|
|
322
335
|
npm run dev # watch + yalc publish
|
|
323
|
-
npm test
|
|
336
|
+
npm test # unit only — no database needed
|
|
324
337
|
npm run typecheck
|
|
325
338
|
```
|
|
326
339
|
|
|
340
|
+
The integration suite runs against a real Postgres, so it is a separate
|
|
341
|
+
command rather than part of `npm test`:
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
createdb print2medusa_test
|
|
345
|
+
DATABASE_URL=postgres://localhost:5432/print2medusa_test npm run test:integration
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
`npm run test:all` runs both. The integration tests cover what unit tests
|
|
349
|
+
cannot: that the sync claim is atomic under concurrent inserts, and that a
|
|
350
|
+
redelivered webhook produces one row rather than two — both of which depend on
|
|
351
|
+
real unique-index behaviour.
|
|
352
|
+
|
|
327
353
|
In a host Medusa app:
|
|
328
354
|
|
|
329
355
|
```bash
|
|
@@ -332,7 +358,7 @@ npx medusa plugin:add @legenki/print2medusa
|
|
|
332
358
|
|
|
333
359
|
## Roadmap
|
|
334
360
|
|
|
335
|
-
See [ROADMAP.md](
|
|
361
|
+
See [ROADMAP.md](https://github.com/legenki/print2medusa/blob/main/ROADMAP.md) for the planned path from `0.2.0` (webhooks and
|
|
336
362
|
order status) through `1.0.0` (stable API and Printful v2 migration), including
|
|
337
363
|
the testing strategy for each release.
|
|
338
364
|
|
|
@@ -343,22 +369,23 @@ the testing strategy for each release.
|
|
|
343
369
|
- Long-running sync runs as a Medusa **workflow** (not a blocking HTTP body only—route awaits the workflow today; can be queued later).
|
|
344
370
|
- Webhooks carry their secret in the URL path because Printful v1 supports no
|
|
345
371
|
custom headers — see [Webhooks](#webhooks).
|
|
346
|
-
- Multi-store
|
|
372
|
+
- Multi-store polish and Printful API v2: see [ROADMAP.md](https://github.com/legenki/print2medusa/blob/main/ROADMAP.md).
|
|
347
373
|
|
|
348
374
|
## Options
|
|
349
375
|
|
|
350
|
-
| Option
|
|
351
|
-
|
|
|
352
|
-
| `apiToken`
|
|
353
|
-
| `storeId`
|
|
354
|
-
| `autoSubmitOrders`
|
|
355
|
-
| `createOnOrderPlaced`
|
|
356
|
-
| `allowPartialOrders`
|
|
357
|
-
| `markupPercent`
|
|
358
|
-
| `defaultCurrency`
|
|
359
|
-
| `webhookSecret`
|
|
360
|
-
| `syncStaleMinutes`
|
|
361
|
-
| `onDiscontinued`
|
|
376
|
+
| Option | Description |
|
|
377
|
+
| ----------------------- | ---------------------------------------------------------------------------------- |
|
|
378
|
+
| `apiToken` | Printful private token (required) |
|
|
379
|
+
| `storeId` | `X-PF-Store-Id` for account-level tokens |
|
|
380
|
+
| `autoSubmitOrders` | Confirm orders for fulfillment (default true) |
|
|
381
|
+
| `createOnOrderPlaced` | Also create Printful order on `order.placed` |
|
|
382
|
+
| `allowPartialOrders` | Allow orders that mix Printful + non-Printful items |
|
|
383
|
+
| `markupPercent` | Markup on retail prices during sync |
|
|
384
|
+
| `defaultCurrency` | Fallback currency code |
|
|
385
|
+
| `webhookSecret` | Shared secret for the Printful webhook path (see [Webhooks](#webhooks)) |
|
|
386
|
+
| `syncStaleMinutes` | Minutes before a running sync is presumed dead and reclaimed (default 60) |
|
|
387
|
+
| `onDiscontinued` | `"flag"` (default) marks discontinued products, `"ignore"` omits the marker |
|
|
388
|
+
| `onRemovedFromPrintful` | `"unpublish"` (default) drafts products gone from Printful, `"ignore"` leaves them |
|
|
362
389
|
|
|
363
390
|
## License
|
|
364
391
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@legenki/print2medusa",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Printful
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "Printful \u2192 Medusa v2 plugin: product sync, auto fulfillment, and admin tools",
|
|
5
5
|
"author": "Andy Legenki",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
"typecheck:tests": "tsc --noEmit -p tsconfig.tests.json",
|
|
49
49
|
"test": "vitest run",
|
|
50
50
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
51
|
+
"test:all": "npm run test && npm run test:integration",
|
|
51
52
|
"test:watch": "vitest",
|
|
52
53
|
"prepublishOnly": "medusa plugin:build"
|
|
53
54
|
},
|
|
@@ -77,13 +78,13 @@
|
|
|
77
78
|
"yalc": "^1.0.0-pre.53"
|
|
78
79
|
},
|
|
79
80
|
"peerDependencies": {
|
|
80
|
-
"@medusajs/admin-sdk": "2.18.0",
|
|
81
|
-
"@medusajs/cli": "2.18.0",
|
|
82
|
-
"@medusajs/framework": "2.18.0",
|
|
83
|
-
"@medusajs/icons": "2.18.0",
|
|
84
|
-
"@medusajs/medusa": "2.18.0",
|
|
85
|
-
"@medusajs/test-utils": "2.18.0",
|
|
86
|
-
"@medusajs/ui": "4.2.0"
|
|
81
|
+
"@medusajs/admin-sdk": "^2.18.0",
|
|
82
|
+
"@medusajs/cli": "^2.18.0",
|
|
83
|
+
"@medusajs/framework": "^2.18.0",
|
|
84
|
+
"@medusajs/icons": "^2.18.0",
|
|
85
|
+
"@medusajs/medusa": "^2.18.0",
|
|
86
|
+
"@medusajs/test-utils": "^2.18.0",
|
|
87
|
+
"@medusajs/ui": "^4.2.0"
|
|
87
88
|
},
|
|
88
89
|
"engines": {
|
|
89
90
|
"node": ">=20"
|