@reactionary/source 0.3.18 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -14
- package/core/src/client/client-builder.ts +54 -6
- package/core/src/factories/cart.factory.ts +40 -0
- package/core/src/factories/category.factory.ts +40 -0
- package/core/src/factories/checkout.factory.ts +59 -0
- package/core/src/factories/identity.factory.ts +26 -0
- package/core/src/factories/index.ts +15 -0
- package/core/src/factories/inventory.factory.ts +26 -0
- package/core/src/factories/order-search.factory.ts +33 -0
- package/core/src/factories/order.factory.ts +21 -0
- package/core/src/factories/price.factory.ts +29 -0
- package/core/src/factories/product-associations.factory.ts +30 -0
- package/core/src/factories/product-list.factory.ts +82 -0
- package/core/src/factories/product-reviews.factory.ts +58 -0
- package/core/src/factories/product-search.factory.ts +31 -0
- package/core/src/factories/product.factory.ts +21 -0
- package/core/src/factories/profile.factory.ts +23 -0
- package/core/src/factories/store.factory.ts +21 -0
- package/core/src/index.ts +3 -1
- package/core/src/providers/cart.provider.ts +12 -10
- package/core/src/providers/category.provider.ts +9 -7
- package/core/src/providers/checkout.provider.ts +14 -10
- package/core/src/providers/identity.provider.ts +7 -7
- package/core/src/providers/inventory.provider.ts +4 -4
- package/core/src/providers/order-search.provider.ts +4 -2
- package/core/src/providers/order.provider.ts +4 -4
- package/core/src/providers/price.provider.ts +5 -5
- package/core/src/providers/product-associations.provider.ts +6 -4
- package/core/src/providers/product-list.provider.ts +13 -8
- package/core/src/providers/product-reviews.provider.ts +8 -4
- package/core/src/providers/product-search.provider.ts +15 -28
- package/core/src/providers/product.provider.ts +6 -6
- package/core/src/providers/profile.provider.ts +8 -8
- package/core/src/providers/store.provider.ts +2 -2
- package/core/src/test/client-builder.spec.ts +81 -0
- package/examples/node/package.json +7 -7
- package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +10 -4
- package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +8 -2
- package/examples/node/src/basic/basic-node-setup.spec.ts +5 -1
- package/examples/node/src/basic/client-creation.spec.ts +3 -3
- package/examples/node/src/utils.ts +41 -41
- package/examples/node/tsconfig.lib.json +2 -1
- package/package.json +1 -1
- package/providers/algolia/src/core/initialize.ts +76 -21
- package/providers/algolia/src/core/initialize.types.ts +107 -0
- package/providers/algolia/src/factories/index.ts +1 -0
- package/providers/algolia/src/factories/product-search/product-search.factory.ts +182 -0
- package/providers/algolia/src/index.ts +2 -2
- package/providers/algolia/src/providers/analytics.provider.ts +4 -4
- package/providers/algolia/src/providers/product-search.provider.ts +67 -184
- package/providers/algolia/src/schema/capabilities.schema.ts +81 -7
- package/providers/algolia/src/test/analytics.spec.ts +9 -1
- package/providers/algolia/src/test/client-builder-product-search-extension.example.ts +85 -0
- package/providers/commercetools/src/core/capability-descriptors.ts +324 -0
- package/providers/commercetools/src/core/initialize.ts +35 -151
- package/providers/commercetools/src/core/initialize.types.ts +174 -0
- package/providers/commercetools/src/factories/cart/cart.factory.ts +142 -0
- package/providers/commercetools/src/factories/category/category.factory.ts +77 -0
- package/providers/commercetools/src/factories/checkout/checkout-initializer-overrides.example.ts +94 -0
- package/providers/commercetools/src/factories/checkout/checkout.factory.ts +338 -0
- package/providers/commercetools/src/factories/identity/identity.factory.ts +26 -0
- package/providers/commercetools/src/factories/inventory/inventory.factory.ts +49 -0
- package/providers/commercetools/src/factories/order/order.factory.ts +149 -0
- package/providers/commercetools/src/factories/order-search/order-search.factory.ts +108 -0
- package/providers/commercetools/src/factories/price/price.factory.ts +76 -0
- package/providers/commercetools/src/factories/product/product-factory-baseline.example.ts +14 -0
- package/providers/commercetools/src/factories/product/product-factory-schema-and-parse-extension.example.ts +35 -0
- package/providers/commercetools/src/factories/product/product-factory-schema-extension.example.ts +23 -0
- package/providers/commercetools/src/factories/product/product-initializer-factory-extension.example.ts +41 -0
- package/providers/commercetools/src/factories/product/product-provider-custom-method-only.example.ts +47 -0
- package/providers/commercetools/src/factories/product/product-provider-schema-signature-extension.example.ts +61 -0
- package/providers/commercetools/src/factories/product/product.factory.ts +220 -0
- package/providers/commercetools/src/factories/product/utils.example.ts +9 -0
- package/providers/commercetools/src/factories/product-associations/product-associations.factory.ts +103 -0
- package/providers/commercetools/src/factories/product-list/product-list.factory.ts +122 -0
- package/providers/commercetools/src/factories/product-reviews/product-reviews.factory.ts +81 -0
- package/providers/commercetools/src/factories/product-search/product-search.factory.ts +182 -0
- package/providers/commercetools/src/factories/profile/profile.factory.ts +94 -0
- package/providers/commercetools/src/factories/store/store.factory.ts +49 -0
- package/providers/commercetools/src/index.ts +15 -0
- package/providers/commercetools/src/providers/cart.provider.ts +67 -193
- package/providers/commercetools/src/providers/category.provider.ts +24 -64
- package/providers/commercetools/src/providers/checkout.provider.ts +50 -322
- package/providers/commercetools/src/providers/identity.provider.ts +35 -15
- package/providers/commercetools/src/providers/inventory.provider.ts +13 -31
- package/providers/commercetools/src/providers/order-search.provider.ts +16 -110
- package/providers/commercetools/src/providers/order.provider.ts +13 -144
- package/providers/commercetools/src/providers/price.provider.ts +37 -51
- package/providers/commercetools/src/providers/product-associations.provider.ts +39 -104
- package/providers/commercetools/src/providers/product-list.provider.ts +38 -23
- package/providers/commercetools/src/providers/product-reviews.provider.ts +34 -14
- package/providers/commercetools/src/providers/product-search.provider.ts +17 -170
- package/providers/commercetools/src/providers/product.provider.ts +20 -199
- package/providers/commercetools/src/providers/profile.provider.ts +27 -73
- package/providers/commercetools/src/providers/store.provider.ts +13 -31
- package/providers/commercetools/src/schema/capabilities.schema.ts +258 -20
- package/providers/commercetools/src/test/caching.spec.ts +18 -2
- package/providers/commercetools/src/test/client-builder-merge-extensions.example.ts +125 -0
- package/providers/fake/src/core/initialize.ts +213 -44
- package/providers/fake/src/core/initialize.types.ts +164 -0
- package/providers/fake/src/factories/cart/cart.factory.ts +34 -0
- package/providers/fake/src/factories/category/category.factory.ts +40 -0
- package/providers/fake/src/factories/checkout/checkout.factory.ts +53 -0
- package/providers/fake/src/factories/identity/identity.factory.ts +25 -0
- package/providers/fake/src/factories/index.ts +14 -0
- package/providers/fake/src/factories/inventory/inventory.factory.ts +25 -0
- package/providers/fake/src/factories/order/order.factory.ts +22 -0
- package/providers/fake/src/factories/order-search/order-search.factory.ts +27 -0
- package/providers/fake/src/factories/price/price.factory.ts +26 -0
- package/providers/fake/src/factories/product/product.factory.ts +22 -0
- package/providers/fake/src/factories/product-associations/product-associations.factory.ts +25 -0
- package/providers/fake/src/factories/product-reviews/product-reviews.factory.ts +53 -0
- package/providers/fake/src/factories/product-search/product-search.factory.ts +27 -0
- package/providers/fake/src/factories/profile/profile.factory.ts +22 -0
- package/providers/fake/src/factories/store/store.factory.ts +22 -0
- package/providers/fake/src/index.ts +2 -0
- package/providers/fake/src/providers/cart.provider.ts +23 -14
- package/providers/fake/src/providers/category.provider.ts +120 -105
- package/providers/fake/src/providers/checkout.provider.ts +39 -20
- package/providers/fake/src/providers/identity.provider.ts +40 -34
- package/providers/fake/src/providers/inventory.provider.ts +26 -24
- package/providers/fake/src/providers/order-search.provider.ts +38 -30
- package/providers/fake/src/providers/order.provider.ts +21 -37
- package/providers/fake/src/providers/price.provider.ts +42 -34
- package/providers/fake/src/providers/product-associations.provider.ts +23 -10
- package/providers/fake/src/providers/product-reviews.provider.ts +71 -69
- package/providers/fake/src/providers/product-search.provider.ts +43 -70
- package/providers/fake/src/providers/product.provider.ts +34 -32
- package/providers/fake/src/providers/profile.provider.ts +62 -55
- package/providers/fake/src/providers/store.provider.ts +38 -22
- package/providers/fake/src/schema/capabilities.schema.ts +175 -18
- package/providers/fake/src/test/cart.provider.spec.ts +20 -3
- package/providers/fake/src/test/category.provider.spec.ts +4 -1
- package/providers/fake/src/test/checkout.provider.spec.ts +12 -2
- package/providers/fake/src/test/client-builder-product-extension.example.ts +75 -0
- package/providers/fake/src/test/order-search.provider.spec.ts +4 -7
- package/providers/fake/src/test/order.provider.spec.ts +4 -6
- package/providers/fake/src/test/price.provider.spec.ts +3 -1
- package/providers/fake/src/test/product.provider.spec.ts +8 -2
- package/providers/fake/src/test/profile.provider.spec.ts +4 -2
- package/providers/google-analytics/src/core/initialize.ts +37 -12
- package/providers/google-analytics/src/core/initialize.types.ts +47 -0
- package/providers/google-analytics/src/index.ts +1 -0
- package/providers/google-analytics/src/schema/capabilities.schema.ts +31 -5
- package/providers/medusa/src/core/initialize.ts +324 -81
- package/providers/medusa/src/core/initialize.types.ts +184 -0
- package/providers/medusa/src/factories/cart/cart.factory.ts +34 -0
- package/providers/medusa/src/factories/category/category.factory.ts +37 -0
- package/providers/medusa/src/factories/checkout/checkout.factory.ts +50 -0
- package/providers/medusa/src/factories/identity/identity.factory.ts +22 -0
- package/providers/medusa/src/factories/index.ts +12 -0
- package/providers/medusa/src/factories/inventory/inventory.factory.ts +25 -0
- package/providers/medusa/src/factories/order/order.factory.ts +22 -0
- package/providers/medusa/src/factories/order-search/order-search.factory.ts +27 -0
- package/providers/medusa/src/factories/price/price.factory.ts +26 -0
- package/providers/medusa/src/factories/product/product.factory.ts +22 -0
- package/providers/medusa/src/factories/product-associations/product-associations.factory.ts +25 -0
- package/providers/medusa/src/factories/product-search/product-search.factory.ts +27 -0
- package/providers/medusa/src/factories/profile/profile.factory.ts +22 -0
- package/providers/medusa/src/index.ts +2 -0
- package/providers/medusa/src/providers/cart.provider.ts +33 -20
- package/providers/medusa/src/providers/category.provider.ts +30 -12
- package/providers/medusa/src/providers/checkout.provider.ts +42 -17
- package/providers/medusa/src/providers/identity.provider.ts +1 -1
- package/providers/medusa/src/providers/inventory.provider.ts +21 -7
- package/providers/medusa/src/providers/order-search.provider.ts +16 -5
- package/providers/medusa/src/providers/order.provider.ts +17 -5
- package/providers/medusa/src/providers/price.provider.ts +26 -7
- package/providers/medusa/src/providers/product-associations.provider.ts +19 -8
- package/providers/medusa/src/providers/product-search.provider.ts +19 -31
- package/providers/medusa/src/providers/product.provider.ts +47 -11
- package/providers/medusa/src/providers/profile.provider.ts +35 -11
- package/providers/medusa/src/schema/capabilities.schema.ts +229 -18
- package/providers/medusa/src/test/cart.provider.spec.ts +18 -2
- package/providers/medusa/src/test/category.provider.spec.ts +4 -1
- package/providers/medusa/src/test/checkout.spec.ts +9 -9
- package/providers/medusa/src/test/inventory.provider.spec.ts +3 -1
- package/providers/medusa/src/test/large-cart.provider.spec.ts +8 -2
- package/providers/medusa/src/test/price.provider.spec.ts +8 -1
- package/providers/medusa/src/test/product.provider.spec.ts +3 -1
- package/providers/medusa/src/test/search.provider.spec.ts +16 -3
- package/providers/meilisearch/src/core/initialize.ts +88 -21
- package/providers/meilisearch/src/core/initialize.types.ts +119 -0
- package/providers/meilisearch/src/factories/index.ts +2 -0
- package/providers/meilisearch/src/factories/order-search/order-search.factory.ts +27 -0
- package/providers/meilisearch/src/factories/product-search/product-search.factory.ts +27 -0
- package/providers/meilisearch/src/index.ts +2 -0
- package/providers/meilisearch/src/providers/index.ts +1 -0
- package/providers/meilisearch/src/providers/order-search.provider.ts +21 -6
- package/providers/meilisearch/src/providers/product-search.provider.ts +24 -8
- package/providers/meilisearch/src/schema/capabilities.schema.ts +95 -8
|
@@ -12,6 +12,11 @@ import type {
|
|
|
12
12
|
CheckoutMutationRemovePaymentInstruction,
|
|
13
13
|
CheckoutMutationSetShippingAddress,
|
|
14
14
|
CheckoutMutationSetShippingInstruction,
|
|
15
|
+
CheckoutFactory,
|
|
16
|
+
CheckoutFactoryCheckoutOutput,
|
|
17
|
+
CheckoutFactoryPaymentMethodOutput,
|
|
18
|
+
CheckoutFactoryShippingMethodOutput,
|
|
19
|
+
CheckoutFactoryWithOutput,
|
|
15
20
|
CheckoutQueryById,
|
|
16
21
|
CheckoutQueryForAvailablePaymentMethods,
|
|
17
22
|
CheckoutQueryForAvailableShippingMethods,
|
|
@@ -57,6 +62,7 @@ import {
|
|
|
57
62
|
type MedusaCartIdentifier,
|
|
58
63
|
type MedusaOrderIdentifier
|
|
59
64
|
} from '../schema/medusa.schema.js';
|
|
65
|
+
import type { MedusaCheckoutFactory } from '../factories/checkout/checkout.factory.js';
|
|
60
66
|
const debug = createDebug('reactionary:medusa:checkout');
|
|
61
67
|
|
|
62
68
|
export class CheckoutNotReadyForFinalizationError extends Error {
|
|
@@ -74,8 +80,15 @@ export class CheckoutNotReadyForFinalizationError extends Error {
|
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
|
|
77
|
-
export class MedusaCheckoutProvider
|
|
83
|
+
export class MedusaCheckoutProvider<
|
|
84
|
+
TFactory extends CheckoutFactory = MedusaCheckoutFactory,
|
|
85
|
+
> extends CheckoutProvider<
|
|
86
|
+
CheckoutFactoryCheckoutOutput<TFactory>,
|
|
87
|
+
CheckoutFactoryShippingMethodOutput<TFactory>,
|
|
88
|
+
CheckoutFactoryPaymentMethodOutput<TFactory>
|
|
89
|
+
> {
|
|
78
90
|
protected config: MedusaConfiguration;
|
|
91
|
+
protected factory: CheckoutFactoryWithOutput<TFactory>;
|
|
79
92
|
|
|
80
93
|
/**
|
|
81
94
|
* This controls which fields are always included when fetching a cart
|
|
@@ -91,10 +104,12 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
91
104
|
config: MedusaConfiguration,
|
|
92
105
|
cache: Cache,
|
|
93
106
|
context: RequestContext,
|
|
94
|
-
public medusaApi: MedusaAPI
|
|
107
|
+
public medusaApi: MedusaAPI,
|
|
108
|
+
factory: CheckoutFactoryWithOutput<TFactory>,
|
|
95
109
|
) {
|
|
96
110
|
super(cache, context);
|
|
97
111
|
this.config = config;
|
|
112
|
+
this.factory = factory;
|
|
98
113
|
}
|
|
99
114
|
|
|
100
115
|
protected initiateCheckoutForCartPayload(payload: CheckoutMutationInitiateCheckout): StoreUpdateCart {
|
|
@@ -118,7 +133,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
118
133
|
})
|
|
119
134
|
public override async initiateCheckoutForCart(
|
|
120
135
|
payload: CheckoutMutationInitiateCheckout
|
|
121
|
-
): Promise<Result<
|
|
136
|
+
): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
|
|
122
137
|
const client = await this.medusaApi.getClient();
|
|
123
138
|
// we should eventually copy the cart.... but for now we just continue with the existing one.
|
|
124
139
|
if (debug.enabled) {
|
|
@@ -144,7 +159,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
144
159
|
})
|
|
145
160
|
public override async getById(
|
|
146
161
|
payload: CheckoutQueryById
|
|
147
|
-
): Promise<Result<
|
|
162
|
+
): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>, NotFoundError>> {
|
|
148
163
|
const client = await this.medusaApi.getClient();
|
|
149
164
|
const response = await client.store.cart.retrieve(payload.identifier.key, {
|
|
150
165
|
fields: this.includedFields,
|
|
@@ -165,7 +180,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
165
180
|
})
|
|
166
181
|
public override async setShippingAddress(
|
|
167
182
|
payload: CheckoutMutationSetShippingAddress
|
|
168
|
-
): Promise<Result<
|
|
183
|
+
): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
|
|
169
184
|
const client = await this.medusaApi.getClient();
|
|
170
185
|
|
|
171
186
|
const response = await client.store.cart.update(
|
|
@@ -191,7 +206,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
191
206
|
})
|
|
192
207
|
public override async getAvailableShippingMethods(
|
|
193
208
|
payload: CheckoutQueryForAvailableShippingMethods
|
|
194
|
-
): Promise<Result<
|
|
209
|
+
): Promise<Result<CheckoutFactoryShippingMethodOutput<TFactory>[]>> {
|
|
195
210
|
const client = await this.medusaApi.getClient();
|
|
196
211
|
|
|
197
212
|
if (debug.enabled) {
|
|
@@ -229,7 +244,9 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
229
244
|
shippingMethods
|
|
230
245
|
);
|
|
231
246
|
}
|
|
232
|
-
return success(
|
|
247
|
+
return success(
|
|
248
|
+
shippingMethods.map((x) => this.factory.parseShippingMethod(this.context, x)),
|
|
249
|
+
);
|
|
233
250
|
}
|
|
234
251
|
|
|
235
252
|
protected getAvailablePaymentMethodsPayload(payload: CheckoutQueryForAvailablePaymentMethods, regionId: string) {
|
|
@@ -244,7 +261,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
244
261
|
})
|
|
245
262
|
public override async getAvailablePaymentMethods(
|
|
246
263
|
payload: CheckoutQueryForAvailablePaymentMethods
|
|
247
|
-
): Promise<Result<
|
|
264
|
+
): Promise<Result<CheckoutFactoryPaymentMethodOutput<TFactory>[]>> {
|
|
248
265
|
const client = await this.medusaApi.getClient();
|
|
249
266
|
|
|
250
267
|
if (debug.enabled) {
|
|
@@ -286,7 +303,9 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
286
303
|
);
|
|
287
304
|
}
|
|
288
305
|
|
|
289
|
-
return success(
|
|
306
|
+
return success(
|
|
307
|
+
paymentMethods.map((x) => this.factory.parsePaymentMethod(this.context, x)),
|
|
308
|
+
);
|
|
290
309
|
}
|
|
291
310
|
|
|
292
311
|
|
|
@@ -307,7 +326,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
307
326
|
})
|
|
308
327
|
public override async addPaymentInstruction(
|
|
309
328
|
payload: CheckoutMutationAddPaymentInstruction
|
|
310
|
-
): Promise<Result<
|
|
329
|
+
): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
|
|
311
330
|
const client = await this.medusaApi.getClient();
|
|
312
331
|
|
|
313
332
|
if (debug.enabled) {
|
|
@@ -347,7 +366,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
347
366
|
})
|
|
348
367
|
public override removePaymentInstruction(
|
|
349
368
|
payload: CheckoutMutationRemovePaymentInstruction
|
|
350
|
-
): Promise<Result<
|
|
369
|
+
): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
|
|
351
370
|
throw new Error('Method not implemented.');
|
|
352
371
|
}
|
|
353
372
|
|
|
@@ -368,7 +387,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
368
387
|
})
|
|
369
388
|
public override async setShippingInstruction(
|
|
370
389
|
payload: CheckoutMutationSetShippingInstruction
|
|
371
|
-
): Promise<Result<
|
|
390
|
+
): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
|
|
372
391
|
const client = await this.medusaApi.getClient();
|
|
373
392
|
const medusaId = payload.checkout as MedusaCartIdentifier;
|
|
374
393
|
try {
|
|
@@ -412,7 +431,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
412
431
|
})
|
|
413
432
|
public override async finalizeCheckout(
|
|
414
433
|
payload: CheckoutMutationFinalizeCheckout
|
|
415
|
-
): Promise<Result<
|
|
434
|
+
): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
|
|
416
435
|
const checkout = await this.getById({ identifier: payload.checkout });
|
|
417
436
|
if (!checkout.success || !checkout.value.readyForFinalization) {
|
|
418
437
|
throw new CheckoutNotReadyForFinalizationError(payload.checkout);
|
|
@@ -432,9 +451,15 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
432
451
|
order_display_id: response.order?.display_id ? +'' : '',
|
|
433
452
|
},
|
|
434
453
|
});
|
|
435
|
-
|
|
454
|
+
const refreshedCheckout = await this.getById({
|
|
436
455
|
identifier: payload.checkout,
|
|
437
|
-
})
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
if (!refreshedCheckout.success) {
|
|
459
|
+
throw new Error(`Unable to reload checkout ${payload.checkout.key} after completion`);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
return success(refreshedCheckout.value);
|
|
438
463
|
}
|
|
439
464
|
|
|
440
465
|
throw new Error('Something failed during order creation');
|
|
@@ -534,7 +559,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
534
559
|
* @param remote
|
|
535
560
|
* @returns
|
|
536
561
|
*/
|
|
537
|
-
protected parseSingle(remote: StoreCart):
|
|
562
|
+
protected parseSingle(remote: StoreCart): CheckoutFactoryCheckoutOutput<TFactory> {
|
|
538
563
|
const identifier = {
|
|
539
564
|
key: remote.id,
|
|
540
565
|
// region_id: remote.region_id,
|
|
@@ -668,6 +693,6 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
|
|
|
668
693
|
shippingInstruction
|
|
669
694
|
};
|
|
670
695
|
|
|
671
|
-
return result;
|
|
696
|
+
return this.factory.parseCheckout(this.context, result);
|
|
672
697
|
}
|
|
673
698
|
}
|
|
@@ -8,6 +8,9 @@ import {
|
|
|
8
8
|
InventoryQueryBySKUSchema,
|
|
9
9
|
Reactionary,
|
|
10
10
|
type InventoryIdentifier,
|
|
11
|
+
type InventoryFactory,
|
|
12
|
+
type InventoryFactoryOutput,
|
|
13
|
+
type InventoryFactoryWithOutput,
|
|
11
14
|
type InventoryStatus,
|
|
12
15
|
type NotFoundError,
|
|
13
16
|
type Result,
|
|
@@ -17,27 +20,35 @@ import type * as z from 'zod';
|
|
|
17
20
|
import type { MedusaConfiguration } from '../schema/configuration.schema.js';
|
|
18
21
|
import { MedusaAdminAPI, type MedusaAPI } from '../core/client.js';
|
|
19
22
|
import createDebug from 'debug';
|
|
23
|
+
import type { MedusaInventoryFactory } from '../factories/inventory/inventory.factory.js';
|
|
20
24
|
|
|
21
25
|
const debug = createDebug('reactionary:medusa:inventory');
|
|
22
26
|
|
|
23
|
-
export class MedusaInventoryProvider
|
|
27
|
+
export class MedusaInventoryProvider<
|
|
28
|
+
TFactory extends InventoryFactory = MedusaInventoryFactory,
|
|
29
|
+
> extends InventoryProvider<InventoryFactoryOutput<TFactory>> {
|
|
24
30
|
protected config: MedusaConfiguration;
|
|
31
|
+
protected factory: InventoryFactoryWithOutput<TFactory>;
|
|
25
32
|
|
|
26
33
|
constructor(
|
|
27
34
|
config: MedusaConfiguration,
|
|
28
35
|
cache: Cache,
|
|
29
36
|
context: RequestContext,
|
|
30
|
-
public medusaApi: MedusaAPI
|
|
37
|
+
public medusaApi: MedusaAPI,
|
|
38
|
+
factory: InventoryFactoryWithOutput<TFactory>,
|
|
31
39
|
) {
|
|
32
40
|
super(cache, context);
|
|
33
41
|
this.config = config;
|
|
42
|
+
this.factory = factory;
|
|
34
43
|
}
|
|
35
44
|
|
|
36
45
|
@Reactionary({
|
|
37
46
|
inputSchema: InventoryQueryBySKUSchema,
|
|
38
47
|
outputSchema: InventorySchema,
|
|
39
48
|
})
|
|
40
|
-
public override async getBySKU(
|
|
49
|
+
public override async getBySKU(
|
|
50
|
+
payload: InventoryQueryBySKU,
|
|
51
|
+
): Promise<Result<InventoryFactoryOutput<TFactory>, NotFoundError>> {
|
|
41
52
|
const sku = payload.variant.sku;
|
|
42
53
|
const fulfillmentCenterKey = payload.fulfilmentCenter.key;
|
|
43
54
|
|
|
@@ -112,7 +123,7 @@ export class MedusaInventoryProvider extends InventoryProvider {
|
|
|
112
123
|
}
|
|
113
124
|
}
|
|
114
125
|
|
|
115
|
-
protected parseSingle(_body: unknown):
|
|
126
|
+
protected parseSingle(_body: unknown): InventoryFactoryOutput<TFactory> {
|
|
116
127
|
const { sku, fulfillmentCenterKey, quantity } = _body as {
|
|
117
128
|
sku: string;
|
|
118
129
|
fulfillmentCenterKey: string;
|
|
@@ -140,7 +151,7 @@ export class MedusaInventoryProvider extends InventoryProvider {
|
|
|
140
151
|
status
|
|
141
152
|
} satisfies Inventory;
|
|
142
153
|
|
|
143
|
-
return result;
|
|
154
|
+
return this.factory.parseInventory(this.context, result);
|
|
144
155
|
}
|
|
145
156
|
|
|
146
157
|
/**
|
|
@@ -150,7 +161,10 @@ export class MedusaInventoryProvider extends InventoryProvider {
|
|
|
150
161
|
* @param fulfillmentCenterKey
|
|
151
162
|
* @returns
|
|
152
163
|
*/
|
|
153
|
-
protected createEmptyInventoryResult(
|
|
164
|
+
protected createEmptyInventoryResult(
|
|
165
|
+
sku: string,
|
|
166
|
+
fulfillmentCenterKey: string,
|
|
167
|
+
): InventoryFactoryOutput<TFactory> {
|
|
154
168
|
const identifier = {
|
|
155
169
|
variant: { sku },
|
|
156
170
|
fulfillmentCenter: { key: fulfillmentCenterKey },
|
|
@@ -164,7 +178,7 @@ export class MedusaInventoryProvider extends InventoryProvider {
|
|
|
164
178
|
status
|
|
165
179
|
} satisfies Inventory;
|
|
166
180
|
|
|
167
|
-
return result;
|
|
181
|
+
return this.factory.parseInventory(this.context, result);
|
|
168
182
|
}
|
|
169
183
|
|
|
170
184
|
protected override getResourceName(): string {
|
|
@@ -13,6 +13,9 @@ import type {
|
|
|
13
13
|
OrderSearchIdentifier,
|
|
14
14
|
AddressIdentifier,
|
|
15
15
|
OrderInventoryStatus,
|
|
16
|
+
OrderSearchFactory,
|
|
17
|
+
OrderSearchFactoryOutput,
|
|
18
|
+
OrderSearchFactoryWithOutput,
|
|
16
19
|
} from '@reactionary/core';
|
|
17
20
|
import {
|
|
18
21
|
AddressIdentifierSchema,
|
|
@@ -26,21 +29,27 @@ import type { MedusaConfiguration } from '../schema/configuration.schema.js';
|
|
|
26
29
|
import type { MedusaAPI } from '../core/client.js';
|
|
27
30
|
import createDebug from 'debug';
|
|
28
31
|
import type { OrderStatus as MedusaOrderStatus, StoreOrder, StoreOrderAddress, StoreOrderListResponse } from '@medusajs/types';
|
|
32
|
+
import type { MedusaOrderSearchFactory } from '../factories/order-search/order-search.factory.js';
|
|
29
33
|
|
|
30
34
|
const debug = createDebug('reactionary:medusa:order-search');
|
|
31
35
|
|
|
32
|
-
export class MedusaOrderSearchProvider
|
|
36
|
+
export class MedusaOrderSearchProvider<
|
|
37
|
+
TFactory extends OrderSearchFactory = MedusaOrderSearchFactory,
|
|
38
|
+
> extends OrderSearchProvider<OrderSearchFactoryOutput<TFactory>> {
|
|
33
39
|
protected config: MedusaConfiguration;
|
|
40
|
+
protected factory: OrderSearchFactoryWithOutput<TFactory>;
|
|
34
41
|
|
|
35
42
|
constructor(
|
|
36
43
|
config: MedusaConfiguration,
|
|
37
44
|
cache: Cache,
|
|
38
45
|
context: RequestContext,
|
|
39
|
-
public medusaApi: MedusaAPI
|
|
46
|
+
public medusaApi: MedusaAPI,
|
|
47
|
+
factory: OrderSearchFactoryWithOutput<TFactory>,
|
|
40
48
|
) {
|
|
41
49
|
super(cache, context);
|
|
42
50
|
|
|
43
51
|
this.config = config;
|
|
52
|
+
this.factory = factory;
|
|
44
53
|
|
|
45
54
|
}
|
|
46
55
|
|
|
@@ -99,7 +108,9 @@ export class MedusaOrderSearchProvider extends OrderSearchProvider {
|
|
|
99
108
|
inputSchema: OrderSearchQueryByTermSchema,
|
|
100
109
|
outputSchema: OrderSearchResultSchema,
|
|
101
110
|
})
|
|
102
|
-
public async queryByTerm(
|
|
111
|
+
public async queryByTerm(
|
|
112
|
+
payload: OrderSearchQueryByTerm,
|
|
113
|
+
): Promise<Result<OrderSearchFactoryOutput<TFactory>>> {
|
|
103
114
|
debug('queryByTerm', payload);
|
|
104
115
|
|
|
105
116
|
const medusa = await this.medusaApi.getClient();
|
|
@@ -109,14 +120,14 @@ export class MedusaOrderSearchProvider extends OrderSearchProvider {
|
|
|
109
120
|
|
|
110
121
|
const response = await medusa.store.order.list(this.queryByTermPayload(payload));
|
|
111
122
|
|
|
112
|
-
const result = this.parsePaginatedResult(response, payload)
|
|
123
|
+
const result = this.parsePaginatedResult(response, payload);
|
|
113
124
|
if (debug.enabled) {
|
|
114
125
|
debug(
|
|
115
126
|
`Search for term "${payload.search.term}" returned ${response.orders.length} orders (page ${payload.search.paginationOptions.pageNumber} of ${result.totalPages})`
|
|
116
127
|
);
|
|
117
128
|
}
|
|
118
129
|
|
|
119
|
-
return success(result);
|
|
130
|
+
return success(this.factory.parseOrderSearchResult(this.context, result, payload));
|
|
120
131
|
}
|
|
121
132
|
|
|
122
133
|
protected composeAddressFromStoreAddress(storeAddress: StoreOrderAddress): Address {
|
|
@@ -17,6 +17,9 @@ import type {
|
|
|
17
17
|
OrderInventoryStatus,
|
|
18
18
|
PaymentMethodIdentifier,
|
|
19
19
|
PaymentInstruction,
|
|
20
|
+
OrderFactory,
|
|
21
|
+
OrderFactoryOutput,
|
|
22
|
+
OrderFactoryWithOutput,
|
|
20
23
|
} from '@reactionary/core';
|
|
21
24
|
import {
|
|
22
25
|
OrderProvider,
|
|
@@ -33,27 +36,35 @@ import type { MedusaConfiguration } from '../schema/configuration.schema.js';
|
|
|
33
36
|
import { handleProviderError } from '../utils/medusa-helpers.js';
|
|
34
37
|
import type { StoreOrder, StoreOrderLineItem, StorePaymentCollection } from '@medusajs/types';
|
|
35
38
|
import { parseMedusaItemPrice, parseMedusaCostBreakdown } from '../utils/medusa-helpers.js'
|
|
39
|
+
import type { MedusaOrderFactory } from '../factories/order/order.factory.js';
|
|
36
40
|
const debug = createDebug('reactionary:medusa:order');
|
|
37
41
|
|
|
38
|
-
export class MedusaOrderProvider
|
|
42
|
+
export class MedusaOrderProvider<
|
|
43
|
+
TFactory extends OrderFactory = MedusaOrderFactory,
|
|
44
|
+
> extends OrderProvider<OrderFactoryOutput<TFactory>> {
|
|
39
45
|
protected config: MedusaConfiguration;
|
|
46
|
+
protected factory: OrderFactoryWithOutput<TFactory>;
|
|
40
47
|
|
|
41
48
|
constructor(
|
|
42
49
|
config: MedusaConfiguration,
|
|
43
50
|
cache: Cache,
|
|
44
51
|
context: RequestContext,
|
|
45
|
-
public medusaApi: MedusaAPI
|
|
52
|
+
public medusaApi: MedusaAPI,
|
|
53
|
+
factory: OrderFactoryWithOutput<TFactory>,
|
|
46
54
|
) {
|
|
47
55
|
super(cache, context);
|
|
48
56
|
|
|
49
57
|
this.config = config;
|
|
58
|
+
this.factory = factory;
|
|
50
59
|
}
|
|
51
60
|
|
|
52
61
|
@Reactionary({
|
|
53
62
|
inputSchema: OrderQueryByIdSchema,
|
|
54
63
|
outputSchema: OrderSchema,
|
|
55
64
|
})
|
|
56
|
-
public async getById(
|
|
65
|
+
public async getById(
|
|
66
|
+
payload: OrderQueryById,
|
|
67
|
+
): Promise<Result<OrderFactoryOutput<TFactory>, NotFoundError>> {
|
|
57
68
|
debug('getById', payload);
|
|
58
69
|
|
|
59
70
|
const medusa = await this.medusaApi.getClient();
|
|
@@ -175,7 +186,7 @@ export class MedusaOrderProvider extends OrderProvider {
|
|
|
175
186
|
|
|
176
187
|
|
|
177
188
|
|
|
178
|
-
protected parseSingle(body: StoreOrder):
|
|
189
|
+
protected parseSingle(body: StoreOrder): OrderFactoryOutput<TFactory> {
|
|
179
190
|
|
|
180
191
|
const identifier = { key: body.id };
|
|
181
192
|
const userId: IdentityIdentifier = {
|
|
@@ -213,7 +224,7 @@ export class MedusaOrderProvider extends OrderProvider {
|
|
|
213
224
|
return this.parsePaymentInstruction(pc, body);
|
|
214
225
|
}) || [];
|
|
215
226
|
|
|
216
|
-
|
|
227
|
+
const result = {
|
|
217
228
|
identifier,
|
|
218
229
|
userId,
|
|
219
230
|
items,
|
|
@@ -222,5 +233,6 @@ export class MedusaOrderProvider extends OrderProvider {
|
|
|
222
233
|
inventoryStatus,
|
|
223
234
|
paymentInstructions
|
|
224
235
|
} satisfies Order;
|
|
236
|
+
return this.factory.parseOrder(this.context, result);
|
|
225
237
|
}
|
|
226
238
|
}
|
|
@@ -11,6 +11,9 @@ import {
|
|
|
11
11
|
type CustomerPriceQuery,
|
|
12
12
|
type ListPriceQuery,
|
|
13
13
|
type Price,
|
|
14
|
+
type PriceFactory,
|
|
15
|
+
type PriceFactoryOutput,
|
|
16
|
+
type PriceFactoryWithOutput,
|
|
14
17
|
type RequestContext,
|
|
15
18
|
type PriceIdentifier,
|
|
16
19
|
type MonetaryAmount,
|
|
@@ -20,27 +23,35 @@ import createDebug from 'debug';
|
|
|
20
23
|
import type * as z from 'zod';
|
|
21
24
|
import type { MedusaAPI } from '../core/client.js';
|
|
22
25
|
import type { MedusaConfiguration } from '../schema/configuration.schema.js';
|
|
26
|
+
import type { MedusaPriceFactory } from '../factories/price/price.factory.js';
|
|
23
27
|
|
|
24
28
|
const debug = createDebug('reactionary:medusa:price');
|
|
25
29
|
|
|
26
|
-
export class MedusaPriceProvider
|
|
30
|
+
export class MedusaPriceProvider<
|
|
31
|
+
TFactory extends PriceFactory = MedusaPriceFactory,
|
|
32
|
+
> extends PriceProvider<PriceFactoryOutput<TFactory>> {
|
|
27
33
|
protected config: MedusaConfiguration;
|
|
34
|
+
protected factory: PriceFactoryWithOutput<TFactory>;
|
|
28
35
|
|
|
29
36
|
constructor(
|
|
30
37
|
config: MedusaConfiguration,
|
|
31
38
|
cache: Cache,
|
|
32
39
|
context: RequestContext,
|
|
33
|
-
public medusaApi: MedusaAPI
|
|
40
|
+
public medusaApi: MedusaAPI,
|
|
41
|
+
factory: PriceFactoryWithOutput<TFactory>,
|
|
34
42
|
) {
|
|
35
43
|
super(cache, context);
|
|
36
44
|
this.config = config;
|
|
45
|
+
this.factory = factory;
|
|
37
46
|
}
|
|
38
47
|
|
|
39
48
|
@Reactionary({
|
|
40
49
|
inputSchema: ListPriceQuerySchema,
|
|
41
50
|
outputSchema: PriceSchema,
|
|
42
51
|
})
|
|
43
|
-
public override async getListPrice(
|
|
52
|
+
public override async getListPrice(
|
|
53
|
+
payload: ListPriceQuery,
|
|
54
|
+
): Promise<Result<PriceFactoryOutput<TFactory>>> {
|
|
44
55
|
const result = await this.getBySKU(payload, 'list');
|
|
45
56
|
|
|
46
57
|
return success(result);
|
|
@@ -50,14 +61,19 @@ export class MedusaPriceProvider extends PriceProvider {
|
|
|
50
61
|
inputSchema: CustomerPriceQuerySchema,
|
|
51
62
|
outputSchema: PriceSchema,
|
|
52
63
|
})
|
|
53
|
-
public override async getCustomerPrice(
|
|
64
|
+
public override async getCustomerPrice(
|
|
65
|
+
payload: CustomerPriceQuery,
|
|
66
|
+
): Promise<Result<PriceFactoryOutput<TFactory>>> {
|
|
54
67
|
const result = await this.getBySKU(payload, 'customer');
|
|
55
68
|
|
|
56
69
|
return success(result);
|
|
57
70
|
}
|
|
58
71
|
|
|
59
72
|
|
|
60
|
-
protected async getBySKU(
|
|
73
|
+
protected async getBySKU(
|
|
74
|
+
payload: ListPriceQuery | CustomerPriceQuery,
|
|
75
|
+
mode: 'list' | 'customer',
|
|
76
|
+
): Promise<PriceFactoryOutput<TFactory>> {
|
|
61
77
|
const sku = payload.variant.sku;
|
|
62
78
|
|
|
63
79
|
if (debug.enabled) {
|
|
@@ -98,7 +114,10 @@ export class MedusaPriceProvider extends PriceProvider {
|
|
|
98
114
|
}
|
|
99
115
|
}
|
|
100
116
|
|
|
101
|
-
protected parseSingle(
|
|
117
|
+
protected parseSingle(
|
|
118
|
+
variant: StoreProductVariant,
|
|
119
|
+
mode: 'list' | 'customer',
|
|
120
|
+
): PriceFactoryOutput<TFactory> {
|
|
102
121
|
const identifier = {
|
|
103
122
|
variant: {
|
|
104
123
|
sku: variant.sku || '',
|
|
@@ -139,7 +158,7 @@ export class MedusaPriceProvider extends PriceProvider {
|
|
|
139
158
|
onSale: isOnSale,
|
|
140
159
|
} satisfies Price;
|
|
141
160
|
|
|
142
|
-
return result;
|
|
161
|
+
return this.factory.parsePrice(this.context, result);
|
|
143
162
|
}
|
|
144
163
|
|
|
145
164
|
|
|
@@ -6,6 +6,11 @@ import {
|
|
|
6
6
|
ProductVariantIdentifierSchema,
|
|
7
7
|
success,
|
|
8
8
|
} from '@reactionary/core';
|
|
9
|
+
import type {
|
|
10
|
+
ProductAssociationsFactory,
|
|
11
|
+
ProductAssociationsFactoryOutput,
|
|
12
|
+
ProductAssociationsFactoryWithOutput,
|
|
13
|
+
} from '@reactionary/core';
|
|
9
14
|
import type {
|
|
10
15
|
ProductVariantIdentifier,
|
|
11
16
|
ProductIdentifier,
|
|
@@ -22,20 +27,26 @@ import type {
|
|
|
22
27
|
import type { MedusaConfiguration } from '../schema/configuration.schema.js';
|
|
23
28
|
import type { MedusaAPI } from '../core/client.js';
|
|
24
29
|
import type { StoreProduct, StoreProductVariant } from '@medusajs/types';
|
|
30
|
+
import type { MedusaProductAssociationsFactory } from '../factories/product-associations/product-associations.factory.js';
|
|
25
31
|
|
|
26
|
-
export class MedusaProductAssociationsProvider
|
|
32
|
+
export class MedusaProductAssociationsProvider<
|
|
33
|
+
TFactory extends ProductAssociationsFactory = MedusaProductAssociationsFactory,
|
|
34
|
+
> extends ProductAssociationsProvider<ProductAssociationsFactoryOutput<TFactory>> {
|
|
27
35
|
protected config: MedusaConfiguration;
|
|
28
36
|
protected medusa: MedusaAPI;
|
|
37
|
+
protected factory: ProductAssociationsFactoryWithOutput<TFactory>;
|
|
29
38
|
|
|
30
39
|
constructor(
|
|
31
40
|
config: MedusaConfiguration,
|
|
32
41
|
cache: Cache,
|
|
33
42
|
context: RequestContext,
|
|
34
|
-
medusa: MedusaAPI
|
|
43
|
+
medusa: MedusaAPI,
|
|
44
|
+
factory: ProductAssociationsFactoryWithOutput<TFactory>,
|
|
35
45
|
) {
|
|
36
46
|
super(cache, context);
|
|
37
47
|
this.config = config;
|
|
38
48
|
this.medusa = medusa;
|
|
49
|
+
this.factory = factory;
|
|
39
50
|
}
|
|
40
51
|
|
|
41
52
|
protected async fetchAssociatedProductsFor(productKey: ProductIdentifier, maxNumberOfAssociations: number, attributeName: string): Promise<ProductSearchResultItem[]> {
|
|
@@ -87,7 +98,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
|
|
|
87
98
|
})
|
|
88
99
|
public override async getAccessories(
|
|
89
100
|
query: ProductAssociationsGetAccessoriesQuery
|
|
90
|
-
): Promise<Result<
|
|
101
|
+
): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
|
|
91
102
|
const associatedProducts = await this.fetchAssociatedProductsFor(query.forProduct, query.numberOfAccessories || 4, 'reactionaryaccessories');
|
|
92
103
|
|
|
93
104
|
const result: ProductAssociation[] = associatedProducts.map(product => ({
|
|
@@ -98,7 +109,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
|
|
|
98
109
|
product,
|
|
99
110
|
} satisfies ProductAssociation));
|
|
100
111
|
|
|
101
|
-
return success(result);
|
|
112
|
+
return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
|
|
102
113
|
}
|
|
103
114
|
|
|
104
115
|
@Reactionary({
|
|
@@ -109,7 +120,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
|
|
|
109
120
|
})
|
|
110
121
|
public override async getSpareparts(
|
|
111
122
|
query: ProductAssociationsGetSparepartsQuery
|
|
112
|
-
): Promise<Result<
|
|
123
|
+
): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
|
|
113
124
|
const associatedProducts = await this.fetchAssociatedProductsFor(query.forProduct, query.numberOfSpareparts || 4, 'reactionaryspareparts');
|
|
114
125
|
|
|
115
126
|
const result: ProductAssociation[] = associatedProducts.map(product => ({
|
|
@@ -120,7 +131,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
|
|
|
120
131
|
product,
|
|
121
132
|
} satisfies ProductAssociation));
|
|
122
133
|
|
|
123
|
-
return success(result);
|
|
134
|
+
return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
|
|
124
135
|
}
|
|
125
136
|
|
|
126
137
|
@Reactionary({
|
|
@@ -131,7 +142,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
|
|
|
131
142
|
})
|
|
132
143
|
public override async getReplacements(
|
|
133
144
|
query: ProductAssociationsGetReplacementsQuery
|
|
134
|
-
): Promise<Result<
|
|
145
|
+
): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
|
|
135
146
|
const associatedProducts = await this.fetchAssociatedProductsFor(query.forProduct, query.numberOfReplacements || 4, 'reactionaryreplacements');
|
|
136
147
|
|
|
137
148
|
const result: ProductAssociation[] = associatedProducts.map(product => ({
|
|
@@ -142,7 +153,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
|
|
|
142
153
|
product,
|
|
143
154
|
} satisfies ProductAssociation));
|
|
144
155
|
|
|
145
|
-
return success(result);
|
|
156
|
+
return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
|
|
146
157
|
}
|
|
147
158
|
|
|
148
159
|
protected parseSingle(_body: StoreProduct): ProductSearchResultItem {
|