medusa-strapi-plugin 0.0.13 → 0.0.16
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/modules/strapi/service.js +34 -1
- package/CHANGELOG.md +79 -0
- package/package.json +1 -1
- package/src/admin/README.md +34 -0
- package/src/admin/lib/sdk.ts +9 -0
- package/src/admin/routes/strapi/page.tsx +44 -0
- package/src/admin/tsconfig.json +24 -0
- package/src/admin/vite-env.d.ts +1 -0
- package/src/api/README.md +123 -0
- package/src/api/admin/strapi/sync/route.ts +38 -0
- package/src/jobs/README.md +36 -0
- package/src/links/README.md +26 -0
- package/src/links/strapi-categories.ts +23 -0
- package/src/links/strapi-collections.ts +23 -0
- package/src/links/strapi-product-variants.ts +23 -0
- package/src/links/strapi-products.ts +23 -0
- package/src/modules/README.md +113 -0
- package/src/modules/strapi/index.ts +10 -0
- package/src/modules/strapi/loader/create-content-models.ts +144 -0
- package/src/modules/strapi/service.ts +576 -0
- package/src/providers/README.md +30 -0
- package/src/subscribers/README.md +54 -0
- package/src/subscribers/create-category.ts +25 -0
- package/src/subscribers/create-collection.ts +25 -0
- package/src/subscribers/create-product.ts +25 -0
- package/src/subscribers/create-variant.ts +25 -0
- package/src/subscribers/delete-category.ts +25 -0
- package/src/subscribers/delete-collection.ts +25 -0
- package/src/subscribers/delete-product.ts +25 -0
- package/src/subscribers/delete-variant.ts +25 -0
- package/src/subscribers/sync-categories.ts +44 -0
- package/src/subscribers/sync-collections.ts +44 -0
- package/src/subscribers/sync-products.ts +44 -0
- package/src/subscribers/update-category.ts +25 -0
- package/src/subscribers/update-collection.ts +25 -0
- package/src/subscribers/update-product.ts +25 -0
- package/src/subscribers/update-variant.ts +25 -0
- package/src/workflows/README.md +69 -0
- package/src/workflows/delete-categories-strapi.ts +20 -0
- package/src/workflows/delete-collections-strapi.ts +20 -0
- package/src/workflows/delete-product-variants-strapi.ts +20 -0
- package/src/workflows/delete-products-strapi.ts +20 -0
- package/src/workflows/steps/delete-categories-strapi.ts +29 -0
- package/src/workflows/steps/delete-collections-strapi.ts +31 -0
- package/src/workflows/steps/delete-product-variants-strapi.ts +31 -0
- package/src/workflows/steps/delete-products-strapi.ts +29 -0
- package/src/workflows/steps/upsert-categories-strapi.ts +84 -0
- package/src/workflows/steps/upsert-collections-strapi.ts +84 -0
- package/src/workflows/steps/upsert-product-variants-strapi.ts +83 -0
- package/src/workflows/steps/upsert-products-strapi.ts +81 -0
- package/src/workflows/upsert-categories-strapi.ts +30 -0
- package/src/workflows/upsert-collections-strapi.ts +30 -0
- package/src/workflows/upsert-product-variants-strapi.ts +30 -0
- package/src/workflows/upsert-products-strapi.ts +36 -0
|
@@ -11,6 +11,7 @@ var StrapiEntity;
|
|
|
11
11
|
StrapiEntity["VARIANT"] = "product-variants";
|
|
12
12
|
StrapiEntity["CATEGORY"] = "categories";
|
|
13
13
|
StrapiEntity["COLLECTION"] = "collections";
|
|
14
|
+
StrapiEntity["CATEGORY_ATTRIBUTE_DESCRIPTION"] = "category-attribute-descriptions";
|
|
14
15
|
})(StrapiEntity || (StrapiEntity = {}));
|
|
15
16
|
class StrapiModuleService {
|
|
16
17
|
constructor({ logger }, options) {
|
|
@@ -156,6 +157,38 @@ class StrapiModuleService {
|
|
|
156
157
|
this.logger.debug(`Updating ${entity} with ID: ${systemId}`);
|
|
157
158
|
return await this.updateEntry(entity, entry.documentId, updatePayload);
|
|
158
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Auto-populates attribute description relations on a category if they don't exist
|
|
162
|
+
*/
|
|
163
|
+
async populateCategoryOverrides(categoryDocumentId, attributeValueDocumentIds) {
|
|
164
|
+
if (!attributeValueDocumentIds.length)
|
|
165
|
+
return;
|
|
166
|
+
try {
|
|
167
|
+
// 1. Fetch the category with its current descriptions populated
|
|
168
|
+
const category = await this.makeRequest(`${StrapiEntity.CATEGORY}/${categoryDocumentId}?populate=attribute_descriptions.attribute_value`);
|
|
169
|
+
if (!category)
|
|
170
|
+
return;
|
|
171
|
+
const existingDescriptions = category.attribute_descriptions || [];
|
|
172
|
+
// 2. Determine which attribute values are missing
|
|
173
|
+
const existingAttributeValueIds = existingDescriptions
|
|
174
|
+
.map((desc) => desc.attribute_value?.documentId)
|
|
175
|
+
.filter(Boolean);
|
|
176
|
+
const missingAttributeValueIds = attributeValueDocumentIds.filter((id) => !existingAttributeValueIds.includes(id));
|
|
177
|
+
if (missingAttributeValueIds.length === 0) {
|
|
178
|
+
this.logger.debug(`No new descriptions needed for category ${categoryDocumentId}`);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// 3. Create missing relations individually instead of updating the whole Category
|
|
182
|
+
await Promise.all(missingAttributeValueIds.map((missingId) => this.createEntry(StrapiEntity.CATEGORY_ATTRIBUTE_DESCRIPTION, {
|
|
183
|
+
category: categoryDocumentId,
|
|
184
|
+
attribute_value: missingId,
|
|
185
|
+
})));
|
|
186
|
+
this.logger.debug(`Added ${missingAttributeValueIds.length} missing attribute descriptions to category ${categoryDocumentId}`);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
this.logger.error(`Failed to populate descriptions for category ${categoryDocumentId}`, error);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
159
192
|
/**
|
|
160
193
|
* Lists entities based on the provided filter.
|
|
161
194
|
*/
|
|
@@ -334,4 +367,4 @@ class StrapiModuleService {
|
|
|
334
367
|
}
|
|
335
368
|
}
|
|
336
369
|
exports.default = StrapiModuleService;
|
|
337
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3N0cmFwaS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0EscURBQXdEO0FBQ3hELDRDQUFvQjtBQVlwQixJQUFLLFlBS0o7QUFMRCxXQUFLLFlBQVk7SUFDZixvQ0FBb0IsQ0FBQTtJQUNwQiw0Q0FBNEIsQ0FBQTtJQUM1Qix1Q0FBdUIsQ0FBQTtJQUN2QiwwQ0FBMEIsQ0FBQTtBQUM1QixDQUFDLEVBTEksWUFBWSxLQUFaLFlBQVksUUFLaEI7QUFFRCxNQUFxQixtQkFBbUI7SUFLdEMsWUFBWSxFQUFFLE1BQU0sRUFBd0IsRUFBRSxPQUFzQjtRQUNsRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsR0FBRyxPQUFPO1lBQ1YsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSTtZQUM5QyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsSUFBSSxVQUFVO1NBQ25ELENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBc0I7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsMENBQTBDLENBQzNDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FDdkIsUUFBZ0IsRUFDaEIsVUFBd0MsRUFBRTtRQUUxQyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDaEMsT0FBTyxFQUFFO29CQUNQLGFBQWEsRUFBRSxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO29CQUMvQyxjQUFjLEVBQUUsa0JBQWtCO2lCQUNuQztnQkFDRCxHQUFHLE9BQU87YUFDWCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixJQUFJLFlBQVksR0FBRyxRQUFRLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwRSxJQUFJLENBQUM7b0JBQ0gsTUFBTSxhQUFhLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzVDLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUN4QixZQUFZLElBQUksTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixpQ0FBaUMsR0FBRyxHQUFHLEVBQ3ZDLGFBQWEsQ0FDZCxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiw0Q0FBNEMsRUFDNUMsVUFBbUIsQ0FDcEIsQ0FBQztnQkFDSixDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxDQUFDO1lBRXJDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEdBQUcsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsT0FBTyxJQUFTLENBQUM7UUFDbkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLEVBQUUsS0FBYyxDQUFDLENBQUM7WUFDaEUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsdUJBQXdCLEtBQWUsQ0FBQyxPQUFPLElBQUksS0FBSyxFQUFFLENBQzNELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQixDQUMvQixNQUFjLEVBQ2QsUUFBZ0IsRUFDaEIsT0FBaUMsRUFDakMsa0JBQTJCLElBQUk7UUFFL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLE1BQU0sbUJBQW1CLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsWUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDMUIsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ2xELE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQztnQkFDdEIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsR0FBRyxPQUFPO2FBQ1gsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUNuQyxHQUFHLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FDdEIsQ0FBQztZQUVGLE9BQU8sTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFNLENBQUM7UUFDMUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixtQkFBbUIsTUFBTSxtQkFBbUIsUUFBUSxFQUFFLEVBQ3RELEtBQWMsQ0FDZixDQUFDO1lBQ0YsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FDdkIsTUFBYyxFQUNkLE9BQXFFLEVBQ3JFLGtCQUEyQixJQUFJO1FBRS9CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksTUFBTSxZQUFZLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxlQUFlO2dCQUNqQyxDQUFDLENBQUMsSUFBSSxZQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7Z0JBQ3pDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFUCxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBYSxHQUFHLE1BQU0sR0FBRyxXQUFXLEVBQUUsRUFBRTtnQkFDbkUsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLElBQUksRUFBRTt3QkFDSixHQUFHLE9BQU87cUJBQ1g7aUJBQ0YsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLE1BQU0sWUFBWSxFQUFFLEtBQWMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxXQUFXLENBQ3ZCLE1BQWMsRUFDZCxVQUFrQixFQUNsQixPQUFxRTtRQUVyRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLE1BQU0scUJBQXFCLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQWEsR0FBRyxNQUFNLElBQUksVUFBVSxFQUFFLEVBQUU7Z0JBQ25FLE1BQU0sRUFBRSxLQUFLO2dCQUNiLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQ3hDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLE1BQU0sWUFBWSxFQUFFLEtBQWMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNIOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFjLEVBQUUsVUFBa0I7UUFDbEQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxFQUFFLEVBQUU7Z0JBQ3ZELE1BQU0sRUFBRSxRQUFRO2FBQ2pCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLE1BQU0sWUFBWSxFQUFFLEtBQWMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQ2hCLE1BQWMsRUFDZCxRQUFnQixFQUNoQixhQUEyRSxFQUMzRSxhQUEyRSxFQUMzRSxrQkFBMkIsSUFBSTtRQUUvQixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FDMUMsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsZUFBZSxDQUNoQixDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxNQUFNLG1CQUFtQixRQUFRLGVBQWUsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksTUFBTSxhQUFhLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0QsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxNQVFWO1FBQ0MsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUNsQyxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFDNUIsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUVoQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixNQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUNqQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1lBQzNCLFFBQVEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0QixNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUMvQixTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQ3pCLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQy9CLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUM5QixTQUFTLEdBQUcsV0FBVyxDQUFDO1lBQ3hCLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzlCLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLE1BQU0sYUFBYSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRTFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsOEJBQThCLE1BQU0seUJBQXlCLENBQzlELENBQUM7WUFDRixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxZQUFFLENBQUMsU0FBUyxDQUFDO1lBQzFCLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxFQUFFO1lBQ3hELGlFQUFpRTtTQUNsRSxDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQVEsR0FBRyxNQUFNLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVyRSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLEdBQUcsSUFBSTtZQUNQLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUTtTQUN0QixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBbUI7UUFDckMsTUFBTSxhQUFhLEdBQUc7WUFDcEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDOUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtZQUMxQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFO1lBQzVCLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO1NBQ3ZDLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRztZQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFO1lBQzVCLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO1NBQ3ZDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQ25DLFlBQVksQ0FBQyxPQUFPLEVBQ3BCLE9BQU8sQ0FBQyxFQUFFLEVBQ1YsYUFBYSxFQUNiLGFBQWEsQ0FDZCxDQUFDO1FBRUYsZ0NBQWdDO1FBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBaUI7UUFDbkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQ2pELFlBQVksQ0FBQyxPQUFPLEVBQ3BCLFNBQVMsRUFDVCxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDeEMsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3pDLDhCQUE4QjtZQUM5QixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFhLEVBQUUsRUFBRSxDQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUNyRCxDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxRQUE2QixFQUM3QixZQUF3QjtRQUV4QiwrQkFBK0I7UUFDL0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzdCLE1BQU0sYUFBYSxHQUFHO2dCQUNwQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDOUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDMUIsT0FBTyxFQUFFLFlBQVksQ0FBQyxVQUFVO2dCQUNoQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFO2FBQ3ZCLENBQUM7WUFFRixNQUFNLGFBQWEsR0FBRztnQkFDcEIsT0FBTyxFQUFFLFlBQVksQ0FBQyxVQUFVO2dCQUNoQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFO2FBQ3ZCLENBQUM7WUFFRixNQUFNLElBQUksQ0FBQyxZQUFZLENBQ3JCLFlBQVksQ0FBQyxPQUFPLEVBQ3BCLE9BQU8sQ0FBQyxFQUFFLEVBQ1YsYUFBYSxFQUNiLGFBQWEsQ0FDZCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxPQUEwQjtRQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FDMUMsWUFBWSxDQUFDLE9BQU8sRUFDcEIsT0FBTyxDQUFDLEVBQUUsQ0FDWCxDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQ2pELFlBQVksQ0FBQyxPQUFPLEVBQ3BCLE9BQU8sQ0FBQyxVQUFvQixDQUM3QixDQUFDO1lBRUYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDYixtQ0FBbUMsT0FBTyxDQUFDLFVBQVUsb0NBQW9DLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FDdEcsQ0FBQztnQkFDRixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFO2dCQUNsRCxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDOUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDMUIsT0FBTyxFQUFFLFlBQVksQ0FBQyxVQUFVO2dCQUNoQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDcEUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRTtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsU0FBaUI7UUFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQzFDLFlBQVksQ0FBQyxPQUFPLEVBQ3BCLFNBQVMsQ0FDVixDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDbkUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFnQztRQUNyRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FDNUIsWUFBWSxDQUFDLFVBQVUsRUFDdkIsVUFBVSxDQUFDLEVBQUUsRUFDYjtZQUNFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ2pDLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRTtTQUNoQyxFQUNEO1lBQ0UsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRTtTQUNoQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsWUFBb0I7UUFDekMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQzFDLFlBQVksQ0FBQyxVQUFVLEVBQ3ZCLFlBQVksQ0FDYixDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDakUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBNEI7UUFDL0MsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQzVCLFlBQVksQ0FBQyxRQUFRLEVBQ3JCLFFBQVEsQ0FBQyxFQUFFLEVBQ1g7WUFDRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUMvQixLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQzFCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUU7U0FDOUIsRUFDRDtZQUNFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUU7U0FDOUIsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFrQjtRQUNyQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FDMUMsWUFBWSxDQUFDLFFBQVEsRUFDckIsVUFBVSxDQUNYLENBQUM7UUFFRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM3RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBL2RELHNDQStkQyJ9
|
|
370
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3N0cmFwaS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0EscURBQXdEO0FBQ3hELDRDQUFvQjtBQVlwQixJQUFLLFlBTUo7QUFORCxXQUFLLFlBQVk7SUFDZixvQ0FBb0IsQ0FBQTtJQUNwQiw0Q0FBNEIsQ0FBQTtJQUM1Qix1Q0FBdUIsQ0FBQTtJQUN2QiwwQ0FBMEIsQ0FBQTtJQUMxQixrRkFBa0UsQ0FBQTtBQUNwRSxDQUFDLEVBTkksWUFBWSxLQUFaLFlBQVksUUFNaEI7QUFFRCxNQUFxQixtQkFBbUI7SUFLdEMsWUFBWSxFQUFFLE1BQU0sRUFBd0IsRUFBRSxPQUFzQjtRQUNsRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsR0FBRyxPQUFPO1lBQ1YsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSTtZQUM5QyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsSUFBSSxVQUFVO1NBQ25ELENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBc0I7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsMENBQTBDLENBQzNDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FDdkIsUUFBZ0IsRUFDaEIsVUFBd0MsRUFBRTtR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
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
|
+
|
|
5
|
+
### [0.0.12](https://github.com/devx-commerce/medusa-strapi-plugin/compare/v0.0.12-beta.0...v0.0.12) (2025-10-06)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* enhance Strapi integration with new content type schemas and improved error handling ([296b5b6](https://github.com/devx-commerce/medusa-strapi-plugin/commit/296b5b69ddf3275479338e2c3a2f93bcb114b0d3))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* update STRAPI_URL in README and remove npm-publish workflow ([9945755](https://github.com/devx-commerce/medusa-strapi-plugin/commit/99457559431be7ecffc1646d1f2445584d27fbe8))
|
|
16
|
+
|
|
17
|
+
### 0.0.12-beta.0 (2025-09-02)
|
|
18
|
+
|
|
19
|
+
### [0.0.11](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.11-beta.0...v0.0.11) (2025-06-18)
|
|
20
|
+
|
|
21
|
+
### [0.0.11-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.8...v0.0.11-beta.0) (2025-06-18)
|
|
22
|
+
|
|
23
|
+
### [0.0.8-beta.8](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.7...v0.0.8-beta.8) (2025-06-05)
|
|
24
|
+
|
|
25
|
+
### [0.0.8-beta.7](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.6...v0.0.8-beta.7) (2025-06-05)
|
|
26
|
+
|
|
27
|
+
### [0.0.8-beta.6](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.5...v0.0.8-beta.6) (2025-06-05)
|
|
28
|
+
|
|
29
|
+
### [0.0.8-beta.5](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.4...v0.0.8-beta.5) (2025-06-04)
|
|
30
|
+
|
|
31
|
+
### [0.0.8-beta.4](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.3...v0.0.8-beta.4) (2025-06-04)
|
|
32
|
+
|
|
33
|
+
### [0.0.8-beta.3](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.2...v0.0.8-beta.3) (2025-06-03)
|
|
34
|
+
|
|
35
|
+
### [0.0.8-beta.2](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.1...v0.0.8-beta.2) (2025-06-03)
|
|
36
|
+
|
|
37
|
+
### [0.0.8-beta.1](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.0...v0.0.8-beta.1) (2025-06-03)
|
|
38
|
+
|
|
39
|
+
### [0.0.8-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7...v0.0.8-beta.0) (2025-06-03)
|
|
40
|
+
|
|
41
|
+
### [0.0.7](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.6...v0.0.7) (2025-06-03)
|
|
42
|
+
|
|
43
|
+
### [0.0.7-beta.6](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.5...v0.0.7-beta.6) (2025-06-03)
|
|
44
|
+
|
|
45
|
+
### [0.0.7-beta.5](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.4...v0.0.7-beta.5) (2025-06-02)
|
|
46
|
+
|
|
47
|
+
### [0.0.7-beta.4](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.3...v0.0.7-beta.4) (2025-05-30)
|
|
48
|
+
|
|
49
|
+
### [0.0.7-beta.3](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.2...v0.0.7-beta.3) (2025-05-30)
|
|
50
|
+
|
|
51
|
+
### [0.0.7-beta.2](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.1...v0.0.7-beta.2) (2025-05-30)
|
|
52
|
+
|
|
53
|
+
### [0.0.7-beta.1](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.0...v0.0.7-beta.1) (2025-05-30)
|
|
54
|
+
|
|
55
|
+
### [0.0.7-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.6...v0.0.7-beta.0) (2025-05-28)
|
|
56
|
+
|
|
57
|
+
### [0.0.6](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.6-beta.0...v0.0.6) (2025-05-28)
|
|
58
|
+
|
|
59
|
+
### [0.0.6-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.5...v0.0.6-beta.0) (2025-05-27)
|
|
60
|
+
|
|
61
|
+
### [0.0.5](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.5-beta.0...v0.0.5) (2025-05-24)
|
|
62
|
+
|
|
63
|
+
### [0.0.5-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.4...v0.0.5-beta.0) (2025-05-24)
|
|
64
|
+
|
|
65
|
+
### [0.0.4](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.4-beta.0...v0.0.4) (2025-05-23)
|
|
66
|
+
|
|
67
|
+
### [0.0.4-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.3...v0.0.4-beta.0) (2025-05-23)
|
|
68
|
+
|
|
69
|
+
### [0.0.3](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.3-beta.0...v0.0.3) (2025-05-23)
|
|
70
|
+
|
|
71
|
+
### [0.0.3-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.2...v0.0.3-beta.0) (2025-05-23)
|
|
72
|
+
|
|
73
|
+
### [0.0.2](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.2-beta.2...v0.0.2) (2025-05-20)
|
|
74
|
+
|
|
75
|
+
### [0.0.2-beta.2](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.2-beta.1...v0.0.2-beta.2) (2025-05-20)
|
|
76
|
+
|
|
77
|
+
### [0.0.2-beta.1](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.2-beta.0...v0.0.2-beta.1) (2025-05-20)
|
|
78
|
+
|
|
79
|
+
### 0.0.2-beta.0 (2025-05-20)
|
package/package.json
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Admin Customizations
|
|
2
|
+
|
|
3
|
+
You can extend the Medusa Admin to add widgets and new pages.
|
|
4
|
+
Your customizations interact with API routes to provide merchants with custom functionalities.
|
|
5
|
+
|
|
6
|
+
> **Note:** Widgets can fetch data from your custom API routes for dynamic content.
|
|
7
|
+
|
|
8
|
+
## Example: Create a Widget
|
|
9
|
+
|
|
10
|
+
A widget is a React component that can be injected into an existing page in the admin dashboard.
|
|
11
|
+
|
|
12
|
+
For example, create the file `src/admin/widgets/product-widget.tsx` with the following content:
|
|
13
|
+
|
|
14
|
+
```tsx title="src/admin/widgets/product-widget.tsx"
|
|
15
|
+
import { defineWidgetConfig } from "@medusajs/admin-sdk";
|
|
16
|
+
|
|
17
|
+
// The widget
|
|
18
|
+
const ProductWidget = () => {
|
|
19
|
+
return (
|
|
20
|
+
<div>
|
|
21
|
+
<h2>Product Widget</h2>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// The widget's configurations
|
|
27
|
+
export const config = defineWidgetConfig({
|
|
28
|
+
zone: "product.details.after",
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export default ProductWidget;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This inserts a widget with the text “Product Widget” at the end of a product’s details page.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { defineRouteConfig } from "@medusajs/admin-sdk";
|
|
2
|
+
import { Button, Container, Heading, toast } from "@medusajs/ui";
|
|
3
|
+
import { useMutation } from "@tanstack/react-query";
|
|
4
|
+
import { sdk } from "../../lib/sdk";
|
|
5
|
+
|
|
6
|
+
const StrapiSettingsPage = () => {
|
|
7
|
+
const { mutate, isPending } = useMutation({
|
|
8
|
+
mutationFn: () =>
|
|
9
|
+
sdk.client.fetch("/admin/strapi/sync", {
|
|
10
|
+
method: "POST",
|
|
11
|
+
body: {
|
|
12
|
+
entities: ["attributes"],
|
|
13
|
+
},
|
|
14
|
+
}),
|
|
15
|
+
onSuccess: () => {
|
|
16
|
+
toast.success("Sync to Strapi triggered successfully");
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<Container className="p-6">
|
|
22
|
+
<div className="flex flex-col gap-y-4">
|
|
23
|
+
<div>
|
|
24
|
+
<Heading level="h1">Strapi Settings</Heading>
|
|
25
|
+
</div>
|
|
26
|
+
<div>
|
|
27
|
+
<Button
|
|
28
|
+
variant="primary"
|
|
29
|
+
onClick={() => mutate()}
|
|
30
|
+
isLoading={isPending}
|
|
31
|
+
>
|
|
32
|
+
Sync to Strapi
|
|
33
|
+
</Button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</Container>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export const config = defineRouteConfig({
|
|
41
|
+
label: "Strapi",
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export default StrapiSettingsPage;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
|
|
9
|
+
/* Bundler mode */
|
|
10
|
+
"moduleResolution": "bundler",
|
|
11
|
+
"allowImportingTsExtensions": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"noEmit": true,
|
|
15
|
+
"jsx": "react-jsx",
|
|
16
|
+
|
|
17
|
+
/* Linting */
|
|
18
|
+
"strict": true,
|
|
19
|
+
"noUnusedLocals": true,
|
|
20
|
+
"noUnusedParameters": true,
|
|
21
|
+
"noFallthroughCasesInSwitch": true
|
|
22
|
+
},
|
|
23
|
+
"include": ["."]
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Custom API Routes
|
|
2
|
+
|
|
3
|
+
An API Route is a REST API endpoint.
|
|
4
|
+
API routes in a Medusa plugin are created in the `/src/api` directory of your plugin or Medusa application. The file’s name must be `route.ts` or `route.js`.
|
|
5
|
+
|
|
6
|
+
For example, to create a `GET` API Route at `/store/hello-world`, create the file `src/api/store/hello-world/route.ts` with the following content:
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
10
|
+
|
|
11
|
+
export async function GET(req: MedusaRequest, res: MedusaResponse) {
|
|
12
|
+
res.json({
|
|
13
|
+
message: "Hello world!",
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Supported HTTP methods
|
|
19
|
+
|
|
20
|
+
The file based routing supports the following HTTP methods:
|
|
21
|
+
|
|
22
|
+
- GET
|
|
23
|
+
- POST
|
|
24
|
+
- PUT
|
|
25
|
+
- PATCH
|
|
26
|
+
- DELETE
|
|
27
|
+
- OPTIONS
|
|
28
|
+
- HEAD
|
|
29
|
+
|
|
30
|
+
You can define a handler for each of these methods by exporting a function with the name of the method in the paths `route.ts` file.
|
|
31
|
+
|
|
32
|
+
For example:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
36
|
+
|
|
37
|
+
export async function GET(req: MedusaRequest, res: MedusaResponse) {
|
|
38
|
+
// Handle GET requests
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
42
|
+
// Handle POST requests
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function PUT(req: MedusaRequest, res: MedusaResponse) {
|
|
46
|
+
// Handle PUT requests
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Parameters
|
|
51
|
+
|
|
52
|
+
To create an API route that accepts a path parameter, create a directory within the route's path whose name is of the format `[param]`.
|
|
53
|
+
|
|
54
|
+
For example, if you want to define a route that takes a `productId` parameter, you can do so by creating a file called `/api/products/[productId]/route.ts`:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
58
|
+
|
|
59
|
+
export async function GET(req: MedusaRequest, res: MedusaResponse) {
|
|
60
|
+
const { productId } = req.params;
|
|
61
|
+
|
|
62
|
+
res.json({
|
|
63
|
+
message: `You're looking for product ${productId}`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
To create an API route that accepts multiple path parameters, create within the file's path multiple directories whose names are of the format `[param]`.
|
|
69
|
+
|
|
70
|
+
For example, if you want to define a route that takes both a `productId` and a `variantId` parameter, you can do so by creating a file called `/api/products/[productId]/variants/[variantId]/route.ts`.
|
|
71
|
+
|
|
72
|
+
## Using the container
|
|
73
|
+
|
|
74
|
+
The Medusa container is available on `req.scope`. Use it to access modules' main services and other registered resources:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
78
|
+
|
|
79
|
+
export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
|
|
80
|
+
const productModuleService = req.scope.resolve("product");
|
|
81
|
+
|
|
82
|
+
const [, count] = await productModuleService.listAndCount();
|
|
83
|
+
|
|
84
|
+
res.json({
|
|
85
|
+
count,
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Middleware
|
|
91
|
+
|
|
92
|
+
You can apply middleware to your routes by creating a file called `/api/middlewares.ts`. This file must export a configuration object with what middleware you want to apply to which routes.
|
|
93
|
+
|
|
94
|
+
For example, if you want to apply a custom middleware function to the `/store/custom` route, you can do so by adding the following to your `/api/middlewares.ts` file:
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import { defineMiddlewares } from "@medusajs/framework/http";
|
|
98
|
+
import type {
|
|
99
|
+
MedusaRequest,
|
|
100
|
+
MedusaResponse,
|
|
101
|
+
MedusaNextFunction,
|
|
102
|
+
} from "@medusajs/framework/http";
|
|
103
|
+
|
|
104
|
+
async function logger(
|
|
105
|
+
req: MedusaRequest,
|
|
106
|
+
res: MedusaResponse,
|
|
107
|
+
next: MedusaNextFunction,
|
|
108
|
+
) {
|
|
109
|
+
console.log("Request received");
|
|
110
|
+
next();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export default defineMiddlewares({
|
|
114
|
+
routes: [
|
|
115
|
+
{
|
|
116
|
+
matcher: "/store/custom",
|
|
117
|
+
middlewares: [logger],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The `matcher` property can be either a string or a regular expression. The `middlewares` property accepts an array of middleware functions.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
2
|
+
|
|
3
|
+
export const POST = async (
|
|
4
|
+
req: MedusaRequest<{
|
|
5
|
+
entities?: string[];
|
|
6
|
+
}>,
|
|
7
|
+
res: MedusaResponse,
|
|
8
|
+
) => {
|
|
9
|
+
const eventService = req.scope.resolve("event_bus");
|
|
10
|
+
|
|
11
|
+
const defaultEntities = ["products", "collections", "categories"];
|
|
12
|
+
const requestedEntities = req.body?.entities || [];
|
|
13
|
+
|
|
14
|
+
const entityTypes = Array.from(
|
|
15
|
+
new Set([...defaultEntities, ...requestedEntities]),
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
await Promise.all(
|
|
20
|
+
entityTypes.map((type) =>
|
|
21
|
+
eventService.emit({
|
|
22
|
+
name: `strapi-${type}.sync`,
|
|
23
|
+
data: {},
|
|
24
|
+
}),
|
|
25
|
+
),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
res.status(200).json({
|
|
29
|
+
message: "Strapi sync triggered successfully",
|
|
30
|
+
});
|
|
31
|
+
} catch (error) {
|
|
32
|
+
res.status(500).json({
|
|
33
|
+
message: `Failed to trigger Strapi sync: ${
|
|
34
|
+
error instanceof Error ? error.message : "Unknown error"
|
|
35
|
+
}`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Custom scheduled jobs
|
|
2
|
+
|
|
3
|
+
A scheduled job is a function executed at a specified interval of time in the background of your Medusa application.
|
|
4
|
+
|
|
5
|
+
A scheduled job is created in a TypeScript or JavaScript file under the `src/jobs` directory.
|
|
6
|
+
|
|
7
|
+
For example, create the file `src/jobs/hello-world.ts` with the following content:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import {
|
|
11
|
+
MedusaContainer
|
|
12
|
+
} from "@medusajs/framework/types";
|
|
13
|
+
|
|
14
|
+
export default async function myCustomJob(container: MedusaContainer) {
|
|
15
|
+
const productService = container.resolve("product")
|
|
16
|
+
|
|
17
|
+
const products = await productService.listAndCountProducts();
|
|
18
|
+
|
|
19
|
+
// Do something with the products
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const config = {
|
|
23
|
+
name: "daily-product-report",
|
|
24
|
+
schedule: "0 0 * * *", // Every day at midnight
|
|
25
|
+
};
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
A scheduled job file must export:
|
|
29
|
+
|
|
30
|
+
- The function to be executed whenever it’s time to run the scheduled job.
|
|
31
|
+
- A configuration object defining the job. It has three properties:
|
|
32
|
+
- `name`: a unique name for the job.
|
|
33
|
+
- `schedule`: a [cron expression](https://crontab.guru/).
|
|
34
|
+
- `numberOfExecutions`: an optional integer, specifying how many times the job will execute before being removed
|
|
35
|
+
|
|
36
|
+
The `handler` is a function that accepts one parameter, `container`, which is a `MedusaContainer` instance used to resolve services.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Module Links
|
|
2
|
+
|
|
3
|
+
A module link forms an association between two data models of different modules, while maintaining module isolation.
|
|
4
|
+
|
|
5
|
+
Learn more about links in [this documentation](https://docs.medusajs.com/learn/fundamentals/module-links)
|
|
6
|
+
|
|
7
|
+
For example:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import BlogModule from "../modules/blog";
|
|
11
|
+
import ProductModule from "@medusajs/medusa/product";
|
|
12
|
+
import { defineLink } from "@medusajs/framework/utils";
|
|
13
|
+
|
|
14
|
+
export default defineLink(
|
|
15
|
+
ProductModule.linkable.product,
|
|
16
|
+
BlogModule.linkable.post,
|
|
17
|
+
);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
This defines a link between the Product Module's `product` data model and the Blog Module's (custom module) `post` data model.
|
|
21
|
+
|
|
22
|
+
Then, in the Medusa application using this plugin, run the following command to sync the links to the database:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx medusa db:migrate
|
|
26
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineLink, Modules } from "@medusajs/framework/utils";
|
|
2
|
+
import { STRAPI_MODULE } from "../modules/strapi";
|
|
3
|
+
|
|
4
|
+
export default defineLink(
|
|
5
|
+
{
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: Modules.PRODUCT,
|
|
8
|
+
alias: "product_category",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
linkable: {
|
|
15
|
+
serviceName: STRAPI_MODULE,
|
|
16
|
+
alias: "cms_category",
|
|
17
|
+
primaryKey: "categoryId",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
readOnly: true,
|
|
22
|
+
},
|
|
23
|
+
);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineLink, Modules } from "@medusajs/framework/utils";
|
|
2
|
+
import { STRAPI_MODULE } from "../modules/strapi";
|
|
3
|
+
|
|
4
|
+
export default defineLink(
|
|
5
|
+
{
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: Modules.PRODUCT,
|
|
8
|
+
alias: "product_collection",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
linkable: {
|
|
15
|
+
serviceName: STRAPI_MODULE,
|
|
16
|
+
alias: "cms_collection",
|
|
17
|
+
primaryKey: "collectionId",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
readOnly: true,
|
|
22
|
+
},
|
|
23
|
+
);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineLink, Modules } from "@medusajs/framework/utils";
|
|
2
|
+
import { STRAPI_MODULE } from "../modules/strapi";
|
|
3
|
+
|
|
4
|
+
export default defineLink(
|
|
5
|
+
{
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: Modules.PRODUCT,
|
|
8
|
+
alias: "product_variant",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
linkable: {
|
|
15
|
+
serviceName: STRAPI_MODULE,
|
|
16
|
+
alias: "cms_variant",
|
|
17
|
+
primaryKey: "variantId",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
readOnly: true,
|
|
22
|
+
},
|
|
23
|
+
);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineLink, Modules } from "@medusajs/framework/utils";
|
|
2
|
+
import { STRAPI_MODULE } from "../modules/strapi";
|
|
3
|
+
|
|
4
|
+
export default defineLink(
|
|
5
|
+
{
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: Modules.PRODUCT,
|
|
8
|
+
alias: "product",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
linkable: {
|
|
15
|
+
serviceName: STRAPI_MODULE,
|
|
16
|
+
alias: "cms_product",
|
|
17
|
+
primaryKey: "productId",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
readOnly: true,
|
|
22
|
+
},
|
|
23
|
+
);
|