medusa-dynamic-metadata 0.0.1

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.
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const metadata_options_1 = require("../../../config/metadata-options");
6
+ async function GET(req, res) {
7
+ const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
8
+ const options = (0, metadata_options_1.resolveDynamicMetadataOptions)(configModule);
9
+ const entity = req.query?.entity || "products";
10
+ // Get metadata descriptors for the requested entity
11
+ const entityConfig = options.entities[entity];
12
+ if (!entityConfig) {
13
+ res.status(404).json({
14
+ message: `No metadata configuration found for entity type: ${entity}`,
15
+ });
16
+ return;
17
+ }
18
+ res.json({
19
+ metadataDescriptors: entityConfig.descriptors,
20
+ });
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL21ldGFkYXRhLWNvbmZpZy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLGtCQXFCQztBQXpCRCxxREFBcUU7QUFFckUsdUVBQWdGO0FBRXpFLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDcEMsaUNBQXlCLENBQUMsYUFBYSxDQUN4QyxDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBQSxnREFBNkIsRUFBQyxZQUFZLENBQUMsQ0FBQTtJQUMzRCxNQUFNLE1BQU0sR0FBSSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQWlCLElBQUksVUFBVSxDQUFBO0lBRTFELG9EQUFvRDtJQUNwRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsb0RBQW9ELE1BQU0sRUFBRTtTQUN0RSxDQUFDLENBQUE7UUFDRixPQUFNO0lBQ1IsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDUCxtQkFBbUIsRUFBRSxZQUFZLENBQUMsV0FBVztLQUM5QyxDQUFDLENBQUE7QUFDSixDQUFDIn0=
@@ -0,0 +1,469 @@
1
+ "use strict";
2
+ /**
3
+ * Entity Registry
4
+ *
5
+ * Maps entity types to their corresponding widget zones and API endpoints.
6
+ * Provides default mappings for common Medusa entities and allows custom overrides.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.registerEntityMapping = registerEntityMapping;
10
+ exports.getEntityMapping = getEntityMapping;
11
+ exports.getWidgetZone = getWidgetZone;
12
+ exports.getApiEndpoint = getApiEndpoint;
13
+ exports.getResponseKey = getResponseKey;
14
+ exports.resolveApiEndpoint = resolveApiEndpoint;
15
+ exports.clearCustomMappings = clearCustomMappings;
16
+ exports.getRegisteredEntityTypes = getRegisteredEntityTypes;
17
+ exports.getEntityTypeFromZone = getEntityTypeFromZone;
18
+ exports.getAllRegisteredZones = getAllRegisteredZones;
19
+ /**
20
+ * Default entity type mappings for common Medusa entities
21
+ */
22
+ const DEFAULT_ENTITY_MAPPINGS = {
23
+ products: {
24
+ widgetZone: "product.details.after",
25
+ apiEndpoint: "/admin/products/{id}",
26
+ responseKey: "product",
27
+ },
28
+ orders: {
29
+ widgetZone: "order.details.after",
30
+ apiEndpoint: "/admin/orders/{id}",
31
+ responseKey: "order",
32
+ },
33
+ categories: {
34
+ widgetZone: "product_category.details.after",
35
+ apiEndpoint: "/admin/product-categories/{id}",
36
+ responseKey: "product_category",
37
+ },
38
+ collections: {
39
+ widgetZone: "product_collection.details.after",
40
+ apiEndpoint: "/admin/collections/{id}",
41
+ responseKey: "collection",
42
+ },
43
+ customers: {
44
+ widgetZone: "customer.details.after",
45
+ apiEndpoint: "/admin/customers/{id}",
46
+ responseKey: "customer",
47
+ },
48
+ regions: {
49
+ widgetZone: "region.details.after",
50
+ apiEndpoint: "/admin/regions/{id}",
51
+ responseKey: "region",
52
+ },
53
+ sales_channels: {
54
+ widgetZone: "sales_channel.details.after",
55
+ apiEndpoint: "/admin/sales-channels/{id}",
56
+ responseKey: "sales_channel",
57
+ },
58
+ stores: {
59
+ widgetZone: "store.details.after",
60
+ apiEndpoint: "/admin/stores/{id}",
61
+ responseKey: "store",
62
+ },
63
+ promotions: {
64
+ widgetZone: "promotion.details.after",
65
+ apiEndpoint: "/admin/promotions/{id}",
66
+ responseKey: "promotion",
67
+ },
68
+ campaigns: {
69
+ widgetZone: "campaign.details.after",
70
+ apiEndpoint: "/admin/campaigns/{id}",
71
+ responseKey: "campaign",
72
+ },
73
+ price_lists: {
74
+ widgetZone: "price_list.details.after",
75
+ apiEndpoint: "/admin/price-lists/{id}",
76
+ responseKey: "price_list",
77
+ },
78
+ shipping_profiles: {
79
+ widgetZone: "shipping_profile.details.after",
80
+ apiEndpoint: "/admin/shipping-profiles/{id}",
81
+ responseKey: "shipping_profile",
82
+ },
83
+ return_reasons: {
84
+ widgetZone: "return_reason.details.after",
85
+ apiEndpoint: "/admin/return-reasons/{id}",
86
+ responseKey: "return_reason",
87
+ },
88
+ inventory_items: {
89
+ widgetZone: "inventory_item.details.after",
90
+ apiEndpoint: "/admin/inventory-items/{id}",
91
+ responseKey: "inventory_item",
92
+ },
93
+ product_variants: {
94
+ widgetZone: "product_variant.details.after",
95
+ apiEndpoint: "/admin/product-variants/{id}",
96
+ responseKey: "product_variant",
97
+ },
98
+ account_holders: {
99
+ widgetZone: "account_holder.details.after",
100
+ apiEndpoint: "/admin/account-holders/{id}",
101
+ responseKey: "account_holder",
102
+ },
103
+ captures: {
104
+ widgetZone: "capture.details.after",
105
+ apiEndpoint: "/admin/captures/{id}",
106
+ responseKey: "capture",
107
+ },
108
+ carts: {
109
+ widgetZone: "cart.details.after",
110
+ apiEndpoint: "/admin/carts/{id}",
111
+ responseKey: "cart",
112
+ },
113
+ cart_addresses: {
114
+ widgetZone: "cart_address.details.after",
115
+ apiEndpoint: "/admin/cart-addresses/{id}",
116
+ responseKey: "cart_address",
117
+ },
118
+ cart_line_items: {
119
+ widgetZone: "cart_line_item.details.after",
120
+ apiEndpoint: "/admin/cart-line-items/{id}",
121
+ responseKey: "cart_line_item",
122
+ },
123
+ cart_line_item_adjustments: {
124
+ widgetZone: "cart_line_item_adjustment.details.after",
125
+ apiEndpoint: "/admin/cart-line-item-adjustments/{id}",
126
+ responseKey: "cart_line_item_adjustment",
127
+ },
128
+ cart_line_item_tax_lines: {
129
+ widgetZone: "cart_line_item_tax_line.details.after",
130
+ apiEndpoint: "/admin/cart-line-item-tax-lines/{id}",
131
+ responseKey: "cart_line_item_tax_line",
132
+ },
133
+ cart_shipping_methods: {
134
+ widgetZone: "cart_shipping_method.details.after",
135
+ apiEndpoint: "/admin/cart-shipping-methods/{id}",
136
+ responseKey: "cart_shipping_method",
137
+ },
138
+ cart_shipping_method_adjustments: {
139
+ widgetZone: "cart_shipping_method_adjustment.details.after",
140
+ apiEndpoint: "/admin/cart-shipping-method-adjustments/{id}",
141
+ responseKey: "cart_shipping_method_adjustment",
142
+ },
143
+ cart_shipping_method_tax_lines: {
144
+ widgetZone: "cart_shipping_method_tax_line.details.after",
145
+ apiEndpoint: "/admin/cart-shipping-method-tax-lines/{id}",
146
+ responseKey: "cart_shipping_method_tax_line",
147
+ },
148
+ contact_email_subscriptions: {
149
+ widgetZone: "contact_email_subscription.details.after",
150
+ apiEndpoint: "/admin/contact-email-subscriptions/{id}",
151
+ responseKey: "contact_email_subscription",
152
+ },
153
+ contact_requests: {
154
+ widgetZone: "contact_request.details.after",
155
+ apiEndpoint: "/admin/contact-requests/{id}",
156
+ responseKey: "contact_request",
157
+ },
158
+ credit_lines: {
159
+ widgetZone: "credit_line.details.after",
160
+ apiEndpoint: "/admin/credit-lines/{id}",
161
+ responseKey: "credit_line",
162
+ },
163
+ customer_addresses: {
164
+ widgetZone: "customer_address.details.after",
165
+ apiEndpoint: "/admin/customer-addresses/{id}",
166
+ responseKey: "customer_address",
167
+ },
168
+ customer_groups: {
169
+ widgetZone: "customer_group.details.after",
170
+ apiEndpoint: "/admin/customer-groups/{id}",
171
+ responseKey: "customer_group",
172
+ },
173
+ customer_group_customers: {
174
+ widgetZone: "customer_group_customer.details.after",
175
+ apiEndpoint: "/admin/customer-group-customers/{id}",
176
+ responseKey: "customer_group_customer",
177
+ },
178
+ fulfillments: {
179
+ widgetZone: "fulfillment.details.after",
180
+ apiEndpoint: "/admin/fulfillments/{id}",
181
+ responseKey: "fulfillment",
182
+ },
183
+ fulfillment_addresses: {
184
+ widgetZone: "fulfillment_address.details.after",
185
+ apiEndpoint: "/admin/fulfillment-addresses/{id}",
186
+ responseKey: "fulfillment_address",
187
+ },
188
+ fulfillment_sets: {
189
+ widgetZone: "fulfillment_set.details.after",
190
+ apiEndpoint: "/admin/fulfillment-sets/{id}",
191
+ responseKey: "fulfillment_set",
192
+ },
193
+ geo_zones: {
194
+ widgetZone: "geo_zone.details.after",
195
+ apiEndpoint: "/admin/geo-zones/{id}",
196
+ responseKey: "geo_zone",
197
+ },
198
+ images: {
199
+ widgetZone: "image.details.after",
200
+ apiEndpoint: "/admin/images/{id}",
201
+ responseKey: "image",
202
+ },
203
+ inventory_levels: {
204
+ widgetZone: "inventory_level.details.after",
205
+ apiEndpoint: "/admin/inventory-levels/{id}",
206
+ responseKey: "inventory_level",
207
+ },
208
+ invites: {
209
+ widgetZone: "invite.details.after",
210
+ apiEndpoint: "/admin/invites/{id}",
211
+ responseKey: "invite",
212
+ },
213
+ order_addresses: {
214
+ widgetZone: "order_address.details.after",
215
+ apiEndpoint: "/admin/order-addresses/{id}",
216
+ responseKey: "order_address",
217
+ },
218
+ order_changes: {
219
+ widgetZone: "order_change.details.after",
220
+ apiEndpoint: "/admin/order-changes/{id}",
221
+ responseKey: "order_change",
222
+ },
223
+ order_claims: {
224
+ widgetZone: "order_claim.details.after",
225
+ apiEndpoint: "/admin/order-claims/{id}",
226
+ responseKey: "order_claim",
227
+ },
228
+ order_claim_items: {
229
+ widgetZone: "order_claim_item.details.after",
230
+ apiEndpoint: "/admin/order-claim-items/{id}",
231
+ responseKey: "order_claim_item",
232
+ },
233
+ order_claim_item_images: {
234
+ widgetZone: "order_claim_item_image.details.after",
235
+ apiEndpoint: "/admin/order-claim-item-images/{id}",
236
+ responseKey: "order_claim_item_image",
237
+ },
238
+ order_credit_lines: {
239
+ widgetZone: "order_credit_line.details.after",
240
+ apiEndpoint: "/admin/order-credit-lines/{id}",
241
+ responseKey: "order_credit_line",
242
+ },
243
+ order_exchanges: {
244
+ widgetZone: "order_exchange.details.after",
245
+ apiEndpoint: "/admin/order-exchanges/{id}",
246
+ responseKey: "order_exchange",
247
+ },
248
+ order_exchange_items: {
249
+ widgetZone: "order_exchange_item.details.after",
250
+ apiEndpoint: "/admin/order-exchange-items/{id}",
251
+ responseKey: "order_exchange_item",
252
+ },
253
+ order_items: {
254
+ widgetZone: "order_item.details.after",
255
+ apiEndpoint: "/admin/order-items/{id}",
256
+ responseKey: "order_item",
257
+ },
258
+ order_line_items: {
259
+ widgetZone: "order_line_item.details.after",
260
+ apiEndpoint: "/admin/order-line-items/{id}",
261
+ responseKey: "order_line_item",
262
+ },
263
+ order_shipping_methods: {
264
+ widgetZone: "order_shipping_method.details.after",
265
+ apiEndpoint: "/admin/order-shipping-methods/{id}",
266
+ responseKey: "order_shipping_method",
267
+ },
268
+ payments: {
269
+ widgetZone: "payment.details.after",
270
+ apiEndpoint: "/admin/payments/{id}",
271
+ responseKey: "payment",
272
+ },
273
+ payment_collections: {
274
+ widgetZone: "payment_collection.details.after",
275
+ apiEndpoint: "/admin/payment-collections/{id}",
276
+ responseKey: "payment_collection",
277
+ },
278
+ payment_sessions: {
279
+ widgetZone: "payment_session.details.after",
280
+ apiEndpoint: "/admin/payment-sessions/{id}",
281
+ responseKey: "payment_session",
282
+ },
283
+ product_options: {
284
+ widgetZone: "product_option.details.after",
285
+ apiEndpoint: "/admin/product-options/{id}",
286
+ responseKey: "product_option",
287
+ },
288
+ product_option_values: {
289
+ widgetZone: "product_option_value.details.after",
290
+ apiEndpoint: "/admin/product-option-values/{id}",
291
+ responseKey: "product_option_value",
292
+ },
293
+ product_tags: {
294
+ widgetZone: "product_tag.details.after",
295
+ apiEndpoint: "/admin/product-tags/{id}",
296
+ responseKey: "product_tag",
297
+ },
298
+ product_types: {
299
+ widgetZone: "product_type.details.after",
300
+ apiEndpoint: "/admin/product-types/{id}",
301
+ responseKey: "product_type",
302
+ },
303
+ refunds: {
304
+ widgetZone: "refund.details.after",
305
+ apiEndpoint: "/admin/refunds/{id}",
306
+ responseKey: "refund",
307
+ },
308
+ refund_reasons: {
309
+ widgetZone: "refund_reason.details.after",
310
+ apiEndpoint: "/admin/refund-reasons/{id}",
311
+ responseKey: "refund_reason",
312
+ },
313
+ region_countries: {
314
+ widgetZone: "region_country.details.after",
315
+ apiEndpoint: "/admin/region-countries/{id}",
316
+ responseKey: "region_country",
317
+ },
318
+ reservation_items: {
319
+ widgetZone: "reservation_item.details.after",
320
+ apiEndpoint: "/admin/reservation-items/{id}",
321
+ responseKey: "reservation_item",
322
+ },
323
+ returns: {
324
+ widgetZone: "return.details.after",
325
+ apiEndpoint: "/admin/returns/{id}",
326
+ responseKey: "return",
327
+ },
328
+ return_items: {
329
+ widgetZone: "return_item.details.after",
330
+ apiEndpoint: "/admin/return-items/{id}",
331
+ responseKey: "return_item",
332
+ },
333
+ service_zones: {
334
+ widgetZone: "service_zone.details.after",
335
+ apiEndpoint: "/admin/service-zones/{id}",
336
+ responseKey: "service_zone",
337
+ },
338
+ shipping_options: {
339
+ widgetZone: "shipping_option.details.after",
340
+ apiEndpoint: "/admin/shipping-options/{id}",
341
+ responseKey: "shipping_option",
342
+ },
343
+ stock_locations: {
344
+ widgetZone: "stock_location.details.after",
345
+ apiEndpoint: "/admin/stock-locations/{id}",
346
+ responseKey: "stock_location",
347
+ },
348
+ stock_location_addresses: {
349
+ widgetZone: "stock_location_address.details.after",
350
+ apiEndpoint: "/admin/stock-location-addresses/{id}",
351
+ responseKey: "stock_location_address",
352
+ },
353
+ tax_rates: {
354
+ widgetZone: "tax_rate.details.after",
355
+ apiEndpoint: "/admin/tax-rates/{id}",
356
+ responseKey: "tax_rate",
357
+ },
358
+ tax_rate_rules: {
359
+ widgetZone: "tax_rate_rule.details.after",
360
+ apiEndpoint: "/admin/tax-rate-rules/{id}",
361
+ responseKey: "tax_rate_rule",
362
+ },
363
+ tax_regions: {
364
+ widgetZone: "tax_region.details.after",
365
+ apiEndpoint: "/admin/tax-regions/{id}",
366
+ responseKey: "tax_region",
367
+ },
368
+ users: {
369
+ widgetZone: "user.details.after",
370
+ apiEndpoint: "/admin/users/{id}",
371
+ responseKey: "user",
372
+ },
373
+ };
374
+ /**
375
+ * Custom entity mappings provided via configuration
376
+ */
377
+ let customMappings = {};
378
+ /**
379
+ * Register a custom entity type mapping
380
+ */
381
+ function registerEntityMapping(entityType, mapping) {
382
+ customMappings[entityType] = mapping;
383
+ }
384
+ /**
385
+ * Get entity mapping for a given entity type
386
+ * Returns custom mapping if available, otherwise falls back to default
387
+ */
388
+ function getEntityMapping(entityType) {
389
+ return customMappings[entityType] || DEFAULT_ENTITY_MAPPINGS[entityType];
390
+ }
391
+ /**
392
+ * Get widget zone for an entity type
393
+ */
394
+ function getWidgetZone(entityType) {
395
+ const mapping = getEntityMapping(entityType);
396
+ return mapping?.widgetZone;
397
+ }
398
+ /**
399
+ * Get API endpoint for an entity type
400
+ */
401
+ function getApiEndpoint(entityType) {
402
+ const mapping = getEntityMapping(entityType);
403
+ return mapping?.apiEndpoint;
404
+ }
405
+ /**
406
+ * Get response key for an entity type
407
+ */
408
+ function getResponseKey(entityType) {
409
+ const mapping = getEntityMapping(entityType);
410
+ return mapping?.responseKey;
411
+ }
412
+ /**
413
+ * Resolve API endpoint with entity ID
414
+ */
415
+ function resolveApiEndpoint(entityType, entityId) {
416
+ const endpoint = getApiEndpoint(entityType);
417
+ if (!endpoint)
418
+ return undefined;
419
+ return endpoint.replace("{id}", entityId);
420
+ }
421
+ /**
422
+ * Clear all custom mappings (useful for testing)
423
+ */
424
+ function clearCustomMappings() {
425
+ customMappings = {};
426
+ }
427
+ /**
428
+ * Get all registered entity types (defaults + customs)
429
+ */
430
+ function getRegisteredEntityTypes() {
431
+ const defaultTypes = Object.keys(DEFAULT_ENTITY_MAPPINGS);
432
+ const customTypes = Object.keys(customMappings);
433
+ return [...new Set([...defaultTypes, ...customTypes])];
434
+ }
435
+ /**
436
+ * Reverse lookup: Get entity type from widget zone
437
+ * Checks both default and custom mappings
438
+ */
439
+ function getEntityTypeFromZone(zone) {
440
+ // Check custom mappings first
441
+ for (const [entityType, mapping] of Object.entries(customMappings)) {
442
+ if (mapping.widgetZone === zone) {
443
+ return entityType;
444
+ }
445
+ }
446
+ // Check default mappings
447
+ for (const [entityType, mapping] of Object.entries(DEFAULT_ENTITY_MAPPINGS)) {
448
+ if (mapping.widgetZone === zone) {
449
+ return entityType;
450
+ }
451
+ }
452
+ return undefined;
453
+ }
454
+ /**
455
+ * Get all zones registered for any entity type
456
+ */
457
+ function getAllRegisteredZones() {
458
+ const zones = new Set();
459
+ // Add zones from default mappings
460
+ for (const mapping of Object.values(DEFAULT_ENTITY_MAPPINGS)) {
461
+ zones.add(mapping.widgetZone);
462
+ }
463
+ // Add zones from custom mappings
464
+ for (const mapping of Object.values(customMappings)) {
465
+ zones.add(mapping.widgetZone);
466
+ }
467
+ return Array.from(zones);
468
+ }
469
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbmZpZy9lbnRpdHktcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOztBQWlZSCxzREFLQztBQU1ELDRDQUVDO0FBS0Qsc0NBR0M7QUFLRCx3Q0FHQztBQUtELHdDQUdDO0FBS0QsZ0RBT0M7QUFLRCxrREFFQztBQUtELDREQUlDO0FBTUQsc0RBZ0JDO0FBS0Qsc0RBY0M7QUF0ZEQ7O0dBRUc7QUFDSCxNQUFNLHVCQUF1QixHQUFrQztJQUM3RCxRQUFRLEVBQUU7UUFDUixVQUFVLEVBQUUsdUJBQXVCO1FBQ25DLFdBQVcsRUFBRSxzQkFBc0I7UUFDbkMsV0FBVyxFQUFFLFNBQVM7S0FDdkI7SUFDRCxNQUFNLEVBQUU7UUFDTixVQUFVLEVBQUUscUJBQXFCO1FBQ2pDLFdBQVcsRUFBRSxvQkFBb0I7UUFDakMsV0FBVyxFQUFFLE9BQU87S0FDckI7SUFDRCxVQUFVLEVBQUU7UUFDVixVQUFVLEVBQUUsZ0NBQWdDO1FBQzVDLFdBQVcsRUFBRSxnQ0FBZ0M7UUFDN0MsV0FBVyxFQUFFLGtCQUFrQjtLQUNoQztJQUNELFdBQVcsRUFBRTtRQUNYLFVBQVUsRUFBRSxrQ0FBa0M7UUFDOUMsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxXQUFXLEVBQUUsWUFBWTtLQUMxQjtJQUNELFNBQVMsRUFBRTtRQUNULFVBQVUsRUFBRSx3QkFBd0I7UUFDcEMsV0FBVyxFQUFFLHVCQUF1QjtRQUNwQyxXQUFXLEVBQUUsVUFBVTtLQUN4QjtJQUNELE9BQU8sRUFBRTtRQUNQLFVBQVUsRUFBRSxzQkFBc0I7UUFDbEMsV0FBVyxFQUFFLHFCQUFxQjtRQUNsQyxXQUFXLEVBQUUsUUFBUTtLQUN0QjtJQUNELGNBQWMsRUFBRTtRQUNkLFVBQVUsRUFBRSw2QkFBNkI7UUFDekMsV0FBVyxFQUFFLDRCQUE0QjtRQUN6QyxXQUFXLEVBQUUs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
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_DYNAMIC_METADATA_OPTIONS = void 0;
4
+ exports.normalizeDynamicMetadataOptions = normalizeDynamicMetadataOptions;
5
+ exports.resolveDynamicMetadataOptions = resolveDynamicMetadataOptions;
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const zod_1 = require("zod");
8
+ const types_1 = require("../shared/metadata/types");
9
+ const utils_2 = require("../shared/metadata/utils");
10
+ const zone_resolver_1 = require("./zone-resolver");
11
+ const entity_registry_1 = require("./entity-registry");
12
+ const MetadataDescriptorSchema = zod_1.z.object({
13
+ key: zod_1.z.string().min(1),
14
+ label: zod_1.z
15
+ .string()
16
+ .trim()
17
+ .transform((value) => (value.length ? value : undefined))
18
+ .optional(),
19
+ type: zod_1.z.enum(types_1.METADATA_FIELD_TYPES),
20
+ filterable: zod_1.z.boolean().default(false),
21
+ });
22
+ const EntityMetadataConfigSchema = zod_1.z.object({
23
+ descriptors: zod_1.z.array(MetadataDescriptorSchema).default([]),
24
+ expose_client_helpers: zod_1.z.boolean().default(false),
25
+ filterable: zod_1.z.boolean().default(false),
26
+ widget_zone: zod_1.z.string().optional(),
27
+ api_endpoint: zod_1.z.string().optional(),
28
+ });
29
+ const DynamicMetadataOptionsSchema = zod_1.z.object({
30
+ entities: zod_1.z.record(zod_1.z.string(), EntityMetadataConfigSchema).default({}),
31
+ });
32
+ exports.DEFAULT_DYNAMIC_METADATA_OPTIONS = {
33
+ entities: {},
34
+ };
35
+ const PLUGIN_NAME = "medusa-dynamic-metadata";
36
+ function normalizeDynamicMetadataOptions(input) {
37
+ const parsed = DynamicMetadataOptionsSchema.parse(input ?? {});
38
+ const normalizedEntities = {};
39
+ for (const [entityType, entityConfig] of Object.entries(parsed.entities)) {
40
+ // Resolve widget zone: use from config, or fall back to entity registry/default
41
+ const widgetZone = (0, zone_resolver_1.resolveZoneFromEntityType)(entityType, entityConfig.widget_zone);
42
+ // Register zone mapping for reverse lookup
43
+ if (widgetZone) {
44
+ (0, zone_resolver_1.registerZoneMapping)(widgetZone, entityType);
45
+ }
46
+ // Register entity mapping if api_endpoint is provided
47
+ if (entityConfig.api_endpoint && widgetZone) {
48
+ // Extract response key from entity type (e.g., "products" -> "product")
49
+ const responseKey = entityType.endsWith("s")
50
+ ? entityType.slice(0, -1)
51
+ : entityType;
52
+ (0, entity_registry_1.registerEntityMapping)(entityType, {
53
+ widgetZone,
54
+ apiEndpoint: entityConfig.api_endpoint,
55
+ responseKey,
56
+ });
57
+ }
58
+ normalizedEntities[entityType] = {
59
+ ...entityConfig,
60
+ descriptors: (0, utils_2.normalizeMetadataDescriptors)(entityConfig.descriptors),
61
+ widget_zone: widgetZone, // Store resolved zone
62
+ };
63
+ }
64
+ return {
65
+ entities: normalizedEntities,
66
+ };
67
+ }
68
+ function resolveDynamicMetadataOptions(configModule) {
69
+ const plugins = configModule?.plugins ?? [];
70
+ for (const plugin of plugins) {
71
+ if ((0, utils_1.isString)(plugin)) {
72
+ if (plugin === PLUGIN_NAME) {
73
+ break;
74
+ }
75
+ continue;
76
+ }
77
+ if (plugin?.resolve === PLUGIN_NAME) {
78
+ return normalizeDynamicMetadataOptions(plugin.options);
79
+ }
80
+ }
81
+ return exports.DEFAULT_DYNAMIC_METADATA_OPTIONS;
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb25maWcvbWV0YWRhdGEtb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrRUEsMEVBMkNDO0FBRUQsc0VBbUJDO0FBbElELHFEQUFvRDtBQUNwRCw2QkFBdUI7QUFFdkIsb0RBR2lDO0FBQ2pDLG9EQUF1RTtBQUN2RSxtREFBZ0Y7QUFDaEYsdURBQXlEO0FBRXpELE1BQU0sd0JBQXdCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN4QyxHQUFHLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEIsS0FBSyxFQUFFLE9BQUM7U0FDTCxNQUFNLEVBQUU7U0FDUixJQUFJLEVBQUU7U0FDTixTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN4RCxRQUFRLEVBQUU7SUFDYixJQUFJLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBb0IsQ0FBQztJQUNsQyxVQUFVLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Q0FDdkMsQ0FBQyxDQUFBO0FBRUYsTUFBTSwwQkFBMEIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFDLFdBQVcsRUFBRSxPQUFDLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMxRCxxQkFBcUIsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNqRCxVQUFVLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdEMsV0FBVyxF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