medusa-strapi-plugin 0.0.12
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/src/admin/index.js +78 -0
- package/.medusa/server/src/admin/index.mjs +77 -0
- package/.medusa/server/src/api/admin/strapi/sync/route.js +25 -0
- package/.medusa/server/src/links/strapi-categories.js +21 -0
- package/.medusa/server/src/links/strapi-collections.js +21 -0
- package/.medusa/server/src/links/strapi-product-variants.js +21 -0
- package/.medusa/server/src/links/strapi-products.js +21 -0
- package/.medusa/server/src/modules/strapi/index.js +15 -0
- package/.medusa/server/src/modules/strapi/loader/create-content-models.js +92 -0
- package/.medusa/server/src/modules/strapi/service.js +336 -0
- package/.medusa/server/src/subscribers/create-category.js +19 -0
- package/.medusa/server/src/subscribers/create-collection.js +19 -0
- package/.medusa/server/src/subscribers/create-product.js +19 -0
- package/.medusa/server/src/subscribers/create-variant.js +19 -0
- package/.medusa/server/src/subscribers/delete-category.js +19 -0
- package/.medusa/server/src/subscribers/delete-collection.js +19 -0
- package/.medusa/server/src/subscribers/delete-product.js +19 -0
- package/.medusa/server/src/subscribers/delete-variant.js +19 -0
- package/.medusa/server/src/subscribers/sync-categories.js +39 -0
- package/.medusa/server/src/subscribers/sync-collections.js +39 -0
- package/.medusa/server/src/subscribers/sync-products.js +39 -0
- package/.medusa/server/src/subscribers/update-category.js +19 -0
- package/.medusa/server/src/subscribers/update-collection.js +19 -0
- package/.medusa/server/src/subscribers/update-product.js +19 -0
- package/.medusa/server/src/subscribers/update-variant.js +19 -0
- package/.medusa/server/src/workflows/delete-categories-strapi.js +12 -0
- package/.medusa/server/src/workflows/delete-collections-strapi.js +12 -0
- package/.medusa/server/src/workflows/delete-product-variants-strapi.js +12 -0
- package/.medusa/server/src/workflows/delete-products-strapi.js +12 -0
- package/.medusa/server/src/workflows/steps/delete-categories-strapi.js +19 -0
- package/.medusa/server/src/workflows/steps/delete-collections-strapi.js +19 -0
- package/.medusa/server/src/workflows/steps/delete-product-variants-strapi.js +19 -0
- package/.medusa/server/src/workflows/steps/delete-products-strapi.js +19 -0
- package/.medusa/server/src/workflows/steps/upsert-categories-strapi.js +57 -0
- package/.medusa/server/src/workflows/steps/upsert-collections-strapi.js +57 -0
- package/.medusa/server/src/workflows/steps/upsert-product-variants-strapi.js +59 -0
- package/.medusa/server/src/workflows/steps/upsert-products-strapi.js +57 -0
- package/.medusa/server/src/workflows/upsert-categories-strapi.js +20 -0
- package/.medusa/server/src/workflows/upsert-collections-strapi.js +20 -0
- package/.medusa/server/src/workflows/upsert-product-variants-strapi.js +20 -0
- package/.medusa/server/src/workflows/upsert-products-strapi.js +26 -0
- package/README.md +335 -0
- package/package.json +90 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
+
const adminSdk = require("@medusajs/admin-sdk");
|
|
4
|
+
const ui = require("@medusajs/ui");
|
|
5
|
+
const reactQuery = require("@tanstack/react-query");
|
|
6
|
+
const Medusa = require("@medusajs/js-sdk");
|
|
7
|
+
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
8
|
+
const Medusa__default = /* @__PURE__ */ _interopDefault(Medusa);
|
|
9
|
+
const sdk = new Medusa__default.default({
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
baseUrl: __BACKEND_URL__ || "/",
|
|
12
|
+
auth: {
|
|
13
|
+
type: "session"
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const StrapiSettingsPage = () => {
|
|
17
|
+
const { mutate, isPending } = reactQuery.useMutation({
|
|
18
|
+
mutationFn: () => sdk.client.fetch("/admin/strapi/sync", {
|
|
19
|
+
method: "POST",
|
|
20
|
+
body: {
|
|
21
|
+
entities: ["attributes"]
|
|
22
|
+
}
|
|
23
|
+
}),
|
|
24
|
+
onSuccess: () => {
|
|
25
|
+
ui.toast.success("Sync to Strapi triggered successfully");
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-4", children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Strapi Settings" }) }),
|
|
30
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
31
|
+
ui.Button,
|
|
32
|
+
{
|
|
33
|
+
variant: "primary",
|
|
34
|
+
onClick: () => mutate(),
|
|
35
|
+
isLoading: isPending,
|
|
36
|
+
children: "Sync to Strapi"
|
|
37
|
+
}
|
|
38
|
+
) })
|
|
39
|
+
] }) });
|
|
40
|
+
};
|
|
41
|
+
const config = adminSdk.defineRouteConfig({
|
|
42
|
+
label: "Strapi"
|
|
43
|
+
});
|
|
44
|
+
const widgetModule = { widgets: [] };
|
|
45
|
+
const routeModule = {
|
|
46
|
+
routes: [
|
|
47
|
+
{
|
|
48
|
+
Component: StrapiSettingsPage,
|
|
49
|
+
path: "/strapi"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
};
|
|
53
|
+
const menuItemModule = {
|
|
54
|
+
menuItems: [
|
|
55
|
+
{
|
|
56
|
+
label: config.label,
|
|
57
|
+
icon: void 0,
|
|
58
|
+
path: "/strapi",
|
|
59
|
+
nested: void 0,
|
|
60
|
+
rank: void 0,
|
|
61
|
+
translationNs: void 0
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
};
|
|
65
|
+
const formModule = { customFields: {} };
|
|
66
|
+
const displayModule = {
|
|
67
|
+
displays: {}
|
|
68
|
+
};
|
|
69
|
+
const i18nModule = { resources: {} };
|
|
70
|
+
const plugin = {
|
|
71
|
+
widgetModule,
|
|
72
|
+
routeModule,
|
|
73
|
+
menuItemModule,
|
|
74
|
+
formModule,
|
|
75
|
+
displayModule,
|
|
76
|
+
i18nModule
|
|
77
|
+
};
|
|
78
|
+
module.exports = plugin;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { defineRouteConfig } from "@medusajs/admin-sdk";
|
|
3
|
+
import { toast, Container, Heading, Button } from "@medusajs/ui";
|
|
4
|
+
import { useMutation } from "@tanstack/react-query";
|
|
5
|
+
import Medusa from "@medusajs/js-sdk";
|
|
6
|
+
const sdk = new Medusa({
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
baseUrl: __BACKEND_URL__ || "/",
|
|
9
|
+
auth: {
|
|
10
|
+
type: "session"
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
const StrapiSettingsPage = () => {
|
|
14
|
+
const { mutate, isPending } = useMutation({
|
|
15
|
+
mutationFn: () => sdk.client.fetch("/admin/strapi/sync", {
|
|
16
|
+
method: "POST",
|
|
17
|
+
body: {
|
|
18
|
+
entities: ["attributes"]
|
|
19
|
+
}
|
|
20
|
+
}),
|
|
21
|
+
onSuccess: () => {
|
|
22
|
+
toast.success("Sync to Strapi triggered successfully");
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return /* @__PURE__ */ jsx(Container, { className: "p-6", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-4", children: [
|
|
26
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Heading, { level: "h1", children: "Strapi Settings" }) }),
|
|
27
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
|
|
28
|
+
Button,
|
|
29
|
+
{
|
|
30
|
+
variant: "primary",
|
|
31
|
+
onClick: () => mutate(),
|
|
32
|
+
isLoading: isPending,
|
|
33
|
+
children: "Sync to Strapi"
|
|
34
|
+
}
|
|
35
|
+
) })
|
|
36
|
+
] }) });
|
|
37
|
+
};
|
|
38
|
+
const config = defineRouteConfig({
|
|
39
|
+
label: "Strapi"
|
|
40
|
+
});
|
|
41
|
+
const widgetModule = { widgets: [] };
|
|
42
|
+
const routeModule = {
|
|
43
|
+
routes: [
|
|
44
|
+
{
|
|
45
|
+
Component: StrapiSettingsPage,
|
|
46
|
+
path: "/strapi"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
};
|
|
50
|
+
const menuItemModule = {
|
|
51
|
+
menuItems: [
|
|
52
|
+
{
|
|
53
|
+
label: config.label,
|
|
54
|
+
icon: void 0,
|
|
55
|
+
path: "/strapi",
|
|
56
|
+
nested: void 0,
|
|
57
|
+
rank: void 0,
|
|
58
|
+
translationNs: void 0
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
};
|
|
62
|
+
const formModule = { customFields: {} };
|
|
63
|
+
const displayModule = {
|
|
64
|
+
displays: {}
|
|
65
|
+
};
|
|
66
|
+
const i18nModule = { resources: {} };
|
|
67
|
+
const plugin = {
|
|
68
|
+
widgetModule,
|
|
69
|
+
routeModule,
|
|
70
|
+
menuItemModule,
|
|
71
|
+
formModule,
|
|
72
|
+
displayModule,
|
|
73
|
+
i18nModule
|
|
74
|
+
};
|
|
75
|
+
export {
|
|
76
|
+
plugin as default
|
|
77
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const POST = async (req, res) => {
|
|
5
|
+
const eventService = req.scope.resolve("event_bus");
|
|
6
|
+
const defaultEntities = ["products", "collections", "categories"];
|
|
7
|
+
const requestedEntities = req.body?.entities || [];
|
|
8
|
+
const entityTypes = Array.from(new Set([...defaultEntities, ...requestedEntities]));
|
|
9
|
+
try {
|
|
10
|
+
await Promise.all(entityTypes.map((type) => eventService.emit({
|
|
11
|
+
name: `strapi-${type}.sync`,
|
|
12
|
+
data: {},
|
|
13
|
+
})));
|
|
14
|
+
res.status(200).json({
|
|
15
|
+
message: "Strapi sync triggered successfully",
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
res.status(500).json({
|
|
20
|
+
message: `Failed to trigger Strapi sync: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
exports.POST = POST;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N0cmFwaS9zeW5jL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVPLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FFRSxFQUNGLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVwRCxNQUFNLGVBQWUsR0FBRyxDQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEUsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUM7SUFFbkQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDNUIsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsRUFBRSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FDcEQsQ0FBQztJQUVGLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDdkIsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNoQixJQUFJLEVBQUUsVUFBVSxJQUFJLE9BQU87WUFDM0IsSUFBSSxFQUFFLEVBQUU7U0FDVCxDQUFDLENBQ0gsQ0FDRixDQUFDO1FBRUYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLG9DQUFvQztTQUM5QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxrQ0FDUCxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUMzQyxFQUFFO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQztBQW5DVyxRQUFBLElBQUksUUFtQ2YifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const strapi_1 = require("../modules/strapi");
|
|
5
|
+
exports.default = (0, utils_1.defineLink)({
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: utils_1.Modules.PRODUCT,
|
|
8
|
+
alias: "product_category",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
}, {
|
|
13
|
+
linkable: {
|
|
14
|
+
serviceName: strapi_1.STRAPI_MODULE,
|
|
15
|
+
alias: "cms_category",
|
|
16
|
+
primaryKey: "categoryId",
|
|
17
|
+
},
|
|
18
|
+
}, {
|
|
19
|
+
readOnly: true,
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyYXBpLWNhdGVnb3JpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGlua3Mvc3RyYXBpLWNhdGVnb3JpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBZ0U7QUFDaEUsOENBQWtEO0FBRWxELGtCQUFlLElBQUEsa0JBQVUsRUFDdkI7SUFDRSxRQUFRLEVBQUU7UUFDUixXQUFXLEVBQUUsZUFBTyxDQUFDLE9BQU87UUFDNUIsS0FBSyxFQUFFLGtCQUFrQjtRQUN6QixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNELEtBQUssRUFBRSxJQUFJO0NBQ1osRUFDRDtJQUNFLFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxzQkFBYTtRQUMxQixLQUFLLEVBQUUsY0FBYztRQUNyQixVQUFVLEVBQUUsWUFBWTtLQUN6QjtDQUNGLEVBQ0Q7SUFDRSxRQUFRLEVBQUUsSUFBSTtDQUNmLENBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const strapi_1 = require("../modules/strapi");
|
|
5
|
+
exports.default = (0, utils_1.defineLink)({
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: utils_1.Modules.PRODUCT,
|
|
8
|
+
alias: "product_collection",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
}, {
|
|
13
|
+
linkable: {
|
|
14
|
+
serviceName: strapi_1.STRAPI_MODULE,
|
|
15
|
+
alias: "cms_collection",
|
|
16
|
+
primaryKey: "collectionId",
|
|
17
|
+
},
|
|
18
|
+
}, {
|
|
19
|
+
readOnly: true,
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyYXBpLWNvbGxlY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpbmtzL3N0cmFwaS1jb2xsZWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFnRTtBQUNoRSw4Q0FBa0Q7QUFFbEQsa0JBQWUsSUFBQSxrQkFBVSxFQUN2QjtJQUNFLFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxlQUFPLENBQUMsT0FBTztRQUM1QixLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLFVBQVUsRUFBRSxJQUFJO0tBQ2pCO0lBQ0QsS0FBSyxFQUFFLElBQUk7Q0FDWixFQUNEO0lBQ0UsUUFBUSxFQUFFO1FBQ1IsV0FBVyxFQUFFLHNCQUFhO1FBQzFCLEtBQUssRUFBRSxnQkFBZ0I7UUFDdkIsVUFBVSxFQUFFLGNBQWM7S0FDM0I7Q0FDRixFQUNEO0lBQ0UsUUFBUSxFQUFFLElBQUk7Q0FDZixDQUNGLENBQUMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const strapi_1 = require("../modules/strapi");
|
|
5
|
+
exports.default = (0, utils_1.defineLink)({
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: utils_1.Modules.PRODUCT,
|
|
8
|
+
alias: "product_variant",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
}, {
|
|
13
|
+
linkable: {
|
|
14
|
+
serviceName: strapi_1.STRAPI_MODULE,
|
|
15
|
+
alias: "cms_variant",
|
|
16
|
+
primaryKey: "variantId",
|
|
17
|
+
},
|
|
18
|
+
}, {
|
|
19
|
+
readOnly: true,
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyYXBpLXByb2R1Y3QtdmFyaWFudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGlua3Mvc3RyYXBpLXByb2R1Y3QtdmFyaWFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBZ0U7QUFDaEUsOENBQWtEO0FBRWxELGtCQUFlLElBQUEsa0JBQVUsRUFDdkI7SUFDRSxRQUFRLEVBQUU7UUFDUixXQUFXLEVBQUUsZUFBTyxDQUFDLE9BQU87UUFDNUIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNELEtBQUssRUFBRSxJQUFJO0NBQ1osRUFDRDtJQUNFLFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxzQkFBYTtRQUMxQixLQUFLLEVBQUUsYUFBYTtRQUNwQixVQUFVLEVBQUUsV0FBVztLQUN4QjtDQUNGLEVBQ0Q7SUFDRSxRQUFRLEVBQUUsSUFBSTtDQUNmLENBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const strapi_1 = require("../modules/strapi");
|
|
5
|
+
exports.default = (0, utils_1.defineLink)({
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: utils_1.Modules.PRODUCT,
|
|
8
|
+
alias: "product",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
}, {
|
|
13
|
+
linkable: {
|
|
14
|
+
serviceName: strapi_1.STRAPI_MODULE,
|
|
15
|
+
alias: "cms_product",
|
|
16
|
+
primaryKey: "productId",
|
|
17
|
+
},
|
|
18
|
+
}, {
|
|
19
|
+
readOnly: true,
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyYXBpLXByb2R1Y3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpbmtzL3N0cmFwaS1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFnRTtBQUNoRSw4Q0FBa0Q7QUFFbEQsa0JBQWUsSUFBQSxrQkFBVSxFQUN2QjtJQUNFLFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxlQUFPLENBQUMsT0FBTztRQUM1QixLQUFLLEVBQUUsU0FBUztRQUNoQixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNELEtBQUssRUFBRSxJQUFJO0NBQ1osRUFDRDtJQUNFLFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxzQkFBYTtRQUMxQixLQUFLLEVBQUUsYUFBYTtRQUNwQixVQUFVLEVBQUUsV0FBVztLQUN4QjtDQUNGLEVBQ0Q7SUFDRSxRQUFRLEVBQUUsSUFBSTtDQUNmLENBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,15 @@
|
|
|
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.STRAPI_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const create_content_models_1 = __importDefault(require("./loader/create-content-models"));
|
|
9
|
+
const service_1 = __importDefault(require("./service"));
|
|
10
|
+
exports.STRAPI_MODULE = "strapi";
|
|
11
|
+
exports.default = (0, utils_1.Module)(exports.STRAPI_MODULE, {
|
|
12
|
+
service: service_1.default,
|
|
13
|
+
loaders: [create_content_models_1.default],
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zdHJhcGkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQW1EO0FBQ25ELDJGQUF1RTtBQUN2RSx3REFBNEM7QUFFL0IsUUFBQSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBRXRDLGtCQUFlLElBQUEsY0FBTSxFQUFDLHFCQUFhLEVBQUU7SUFDbkMsT0FBTyxFQUFFLGlCQUFtQjtJQUM1QixPQUFPLEVBQUUsQ0FBQywrQkFBeUIsQ0FBQztDQUNyQyxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,92 @@
|
|
|
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.default = syncContentModelsLoader;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const qs_1 = __importDefault(require("qs"));
|
|
9
|
+
async function syncContentModelsLoader({ container, options, }) {
|
|
10
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
11
|
+
if (!options?.base_url || !options?.api_key) {
|
|
12
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Strapi api key and base URL are required");
|
|
13
|
+
}
|
|
14
|
+
const systemIdKey = options.system_id_key || "systemId";
|
|
15
|
+
logger.debug(`Strapi baseURL: ${options.base_url}`);
|
|
16
|
+
// Validate that required content types exist with correct structure
|
|
17
|
+
await validateContentTypes(options, logger, systemIdKey);
|
|
18
|
+
logger.info("Connected to Strapi");
|
|
19
|
+
}
|
|
20
|
+
async function validateContentTypes(options, logger, systemIdKey) {
|
|
21
|
+
const requiredContentTypes = [
|
|
22
|
+
{
|
|
23
|
+
name: "products",
|
|
24
|
+
requiredFields: ["title", systemIdKey, "handle", "productType"],
|
|
25
|
+
relations: { variants: { fields: ["title", systemIdKey, "sku"] } },
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "product-variants",
|
|
29
|
+
requiredFields: ["title", systemIdKey, "sku"],
|
|
30
|
+
relations: { product: {} },
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "categories",
|
|
34
|
+
requiredFields: ["title", systemIdKey, "handle"],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "collections",
|
|
38
|
+
requiredFields: ["title", systemIdKey, "handle"],
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
for (const contentType of requiredContentTypes) {
|
|
42
|
+
await validateContentType(options, logger, contentType, systemIdKey);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function validateContentType(options, logger, contentType, systemIdKey) {
|
|
46
|
+
logger.debug(`Validating content type: ${contentType.name}`);
|
|
47
|
+
const params = qs_1.default.stringify({
|
|
48
|
+
fields: contentType.requiredFields,
|
|
49
|
+
populate: contentType.relations || {},
|
|
50
|
+
pagination: { limit: 1 },
|
|
51
|
+
});
|
|
52
|
+
const response = await fetch(`${options.base_url}/${contentType.name}?${params}`, {
|
|
53
|
+
headers: {
|
|
54
|
+
Authorization: `Bearer ${options.api_key}`,
|
|
55
|
+
"Content-Type": "application/json",
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
let errorDetails = `HTTP ${response.status} ${response.statusText}`;
|
|
60
|
+
let errorMessage = `Content type '${contentType.name}' validation failed: ${errorDetails}`;
|
|
61
|
+
try {
|
|
62
|
+
const errorResponse = await response.json();
|
|
63
|
+
if (errorResponse.error) {
|
|
64
|
+
errorDetails += ` - ${JSON.stringify(errorResponse.error)}`;
|
|
65
|
+
logger.error(`Strapi content type validation failed for '${contentType.name}':`, errorResponse);
|
|
66
|
+
if (response.status === 404) {
|
|
67
|
+
errorMessage = `Content type '${contentType.name}' does not exist in Strapi. Please create it using the schema files provided in the 'strapi-schemas' directory.`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (parseError) {
|
|
72
|
+
logger.error("Failed to parse error response from Strapi", parseError);
|
|
73
|
+
}
|
|
74
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, errorMessage);
|
|
75
|
+
}
|
|
76
|
+
const responseData = await response.json();
|
|
77
|
+
const { error } = responseData;
|
|
78
|
+
if (error) {
|
|
79
|
+
logger.error(`Strapi returned an error for content type '${contentType.name}':`, error);
|
|
80
|
+
logger.error("Full response:", responseData);
|
|
81
|
+
let errorMessage = `Content type '${contentType.name}' validation failed: ${error.message || JSON.stringify(error)}`;
|
|
82
|
+
// Check if it's a field-related error
|
|
83
|
+
if (error.message && error.message.includes("field")) {
|
|
84
|
+
errorMessage += `\n\nRequired fields for '${contentType.name}': ${contentType.requiredFields.join(", ")}`;
|
|
85
|
+
errorMessage += `\nPlease ensure all required fields exist in your Strapi content type.`;
|
|
86
|
+
errorMessage += `\nRefer to the schema files in the 'strapi-schemas' directory for the correct structure.`;
|
|
87
|
+
}
|
|
88
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, errorMessage);
|
|
89
|
+
}
|
|
90
|
+
logger.debug(`Content type '${contentType.name}' validation passed`);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWNvbnRlbnQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvc3RyYXBpL2xvYWRlci9jcmVhdGUtY29udGVudC1tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSwwQ0FxQkM7QUFsQ0QscURBR21DO0FBQ25DLDRDQUFvQjtBQVNMLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxFQUNwRCxTQUFTLEVBQ1QsT0FBTyxHQUNzQjtJQUM3QixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5FLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDBDQUEwQyxDQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDO0lBRXhELE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBRXBELG9FQUFvRTtJQUNwRSxNQUFNLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFekQsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLE9BQXNCLEVBQ3RCLE1BQVcsRUFDWCxXQUFtQjtJQUVuQixNQUFNLG9CQUFvQixHQUFHO1FBQzNCO1lBQ0UsSUFBSSxFQUFFLFVBQVU7WUFDaEIsY0FBYyxFQUFFLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDO1lBQy9ELFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtTQUNuRTtRQUNEO1lBQ0UsSUFBSSxFQUFFLGtCQUFrQjtZQUN4QixjQUFjLEVBQUUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQztZQUM3QyxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1NBQzNCO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsWUFBWTtZQUNsQixjQUFjLEVBQUUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQztTQUNqRDtRQUNEO1lBQ0UsSUFBSSxFQUFFLGFBQWE7WUFDbkIsY0FBYyxFQUFFLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUM7U0FDakQ7S0FDRixDQUFDO0lBRUYsS0FBSyxNQUFNLFdBQVcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sbUJBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkUsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsbUJBQW1CLENBQ2hDLE9BQXNCLEVBQ3RCLE1BQVcsRUFDWCxXQUFnQixFQUNoQixXQUFtQjtJQUVuQixNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU3RCxNQUFNLE1BQU0sR0FBRyxZQUFFLENBQUMsU0FBUyxDQUFDO1FBQzFCLE1BQU0sRUFBRSxXQUFXLENBQUMsY0FBYztRQUNsQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFNBQVMsSUFBSSxFQUFFO1FBQ3JDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDekIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQzFCLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRSxFQUNuRDtRQUNFLE9BQU8sRUFBRTtZQUNQLGFBQWEsRUFBRSxVQUFVLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDMUMsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQztLQUNGLENBQ0YsQ0FBQztJQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsSUFBSSxZQUFZLEdBQUcsUUFBUSxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwRSxJQUFJLFlBQVksR0FBRyxpQkFBaUIsV0FBVyxDQUFDLElBQUksd0JBQXdCLFlBQVksRUFBRSxDQUFDO1FBRTNGLElBQUksQ0FBQztZQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN4QixZQUFZLElBQUksTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLENBQUMsS0FBSyxDQUNWLDhDQUE4QyxXQUFXLENBQUMsSUFBSSxJQUFJLEVBQ2xFLGFBQWEsQ0FDZCxDQUFDO2dCQUVGLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDNUIsWUFBWSxHQUFHLGlCQUFpQixXQUFXLENBQUMsSUFBSSxpSEFBaUgsQ0FBQztnQkFDcEssQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFFRCxNQUFNLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLENBQUM7SUFFL0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxLQUFLLENBQ1YsOENBQThDLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFDbEUsS0FBSyxDQUNOLENBQUM7UUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTdDLElBQUksWUFBWSxHQUFHLGlCQUFpQixXQUFXLENBQUMsSUFBSSx3QkFDbEQsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDdkMsRUFBRSxDQUFDO1FBRUgsc0NBQXNDO1FBQ3RDLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JELFlBQVksSUFBSSw0QkFDZCxXQUFXLENBQUMsSUFDZCxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUMsWUFBWSxJQUFJLHdFQUF3RSxDQUFDO1lBQ3pGLFlBQVksSUFBSSwwRkFBMEYsQ0FBQztRQUM3RyxDQUFDO1FBRUQsTUFBTSxJQUFJLG1CQUFXLENBQUMsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixXQUFXLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3ZFLENBQUMifQ==
|