@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
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { base, en, Faker } from '@faker-js/faker';
|
|
2
2
|
import type {
|
|
3
3
|
Cache,
|
|
4
|
-
|
|
4
|
+
InventoryFactory,
|
|
5
|
+
InventoryFactoryOutput,
|
|
6
|
+
InventoryFactoryWithOutput,
|
|
5
7
|
InventoryIdentifier,
|
|
6
8
|
InventoryQueryBySKU,
|
|
7
9
|
InventoryStatus,
|
|
@@ -17,31 +19,37 @@ import {
|
|
|
17
19
|
success,
|
|
18
20
|
} from '@reactionary/core';
|
|
19
21
|
import type { FakeConfiguration } from '../schema/configuration.schema.js';
|
|
22
|
+
import type { FakeInventoryFactory } from '../factories/inventory/inventory.factory.js';
|
|
20
23
|
|
|
21
|
-
export class FakeInventoryProvider
|
|
24
|
+
export class FakeInventoryProvider<
|
|
25
|
+
TFactory extends InventoryFactory = FakeInventoryFactory,
|
|
26
|
+
> extends InventoryProvider<InventoryFactoryOutput<TFactory>> {
|
|
22
27
|
protected config: FakeConfiguration;
|
|
28
|
+
protected factory: InventoryFactoryWithOutput<TFactory>;
|
|
23
29
|
|
|
24
30
|
constructor(
|
|
25
31
|
config: FakeConfiguration,
|
|
26
32
|
cache: Cache,
|
|
27
|
-
context: RequestContext
|
|
33
|
+
context: RequestContext,
|
|
34
|
+
factory: InventoryFactoryWithOutput<TFactory>,
|
|
28
35
|
) {
|
|
29
36
|
super(cache, context);
|
|
30
37
|
|
|
31
38
|
this.config = config;
|
|
39
|
+
this.factory = factory;
|
|
32
40
|
}
|
|
33
41
|
|
|
34
42
|
@Reactionary({
|
|
35
43
|
inputSchema: InventoryQueryBySKUSchema,
|
|
36
|
-
outputSchema: InventorySchema
|
|
44
|
+
outputSchema: InventorySchema,
|
|
37
45
|
})
|
|
38
|
-
public override async getBySKU(
|
|
39
|
-
|
|
46
|
+
public override async getBySKU(
|
|
47
|
+
payload: InventoryQueryBySKU,
|
|
48
|
+
): Promise<Result<InventoryFactoryOutput<TFactory>, NotFoundError>> {
|
|
40
49
|
let hash = 0;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
hash
|
|
44
|
-
hash = hash & hash; // Convert to 32bit integer
|
|
50
|
+
for (let i = 0; i < payload.variant.sku.length; i++) {
|
|
51
|
+
hash = (hash << 5) - hash + payload.variant.sku.charCodeAt(i);
|
|
52
|
+
hash &= hash;
|
|
45
53
|
}
|
|
46
54
|
|
|
47
55
|
const generator = new Faker({
|
|
@@ -49,24 +57,18 @@ export class FakeInventoryProvider extends InventoryProvider {
|
|
|
49
57
|
locale: [en, base],
|
|
50
58
|
});
|
|
51
59
|
|
|
52
|
-
const identifier = {
|
|
53
|
-
variant: payload.variant,
|
|
54
|
-
fulfillmentCenter: payload.fulfilmentCenter,
|
|
55
|
-
} satisfies InventoryIdentifier;
|
|
56
|
-
|
|
57
60
|
const quantity = generator.number.int({ min: 0, max: 100 });
|
|
58
|
-
|
|
59
|
-
let status: InventoryStatus = 'outOfStock';
|
|
60
|
-
if (quantity > 0) {
|
|
61
|
-
status = 'inStock';
|
|
62
|
-
}
|
|
61
|
+
const status: InventoryStatus = quantity > 0 ? 'inStock' : 'outOfStock';
|
|
63
62
|
|
|
64
63
|
const result = {
|
|
65
|
-
identifier
|
|
64
|
+
identifier: {
|
|
65
|
+
variant: payload.variant,
|
|
66
|
+
fulfillmentCenter: payload.fulfilmentCenter,
|
|
67
|
+
} satisfies InventoryIdentifier,
|
|
66
68
|
quantity,
|
|
67
|
-
status
|
|
68
|
-
}
|
|
69
|
+
status,
|
|
70
|
+
};
|
|
69
71
|
|
|
70
|
-
return success(result);
|
|
72
|
+
return success(this.factory.parseInventory(this.context, result));
|
|
71
73
|
}
|
|
72
74
|
}
|
|
@@ -4,33 +4,41 @@ import {
|
|
|
4
4
|
OrderSearchResultSchema,
|
|
5
5
|
Reactionary,
|
|
6
6
|
type Cache,
|
|
7
|
+
type OrderSearchFactory,
|
|
8
|
+
type OrderSearchFactoryOutput,
|
|
9
|
+
type OrderSearchFactoryWithOutput,
|
|
7
10
|
type OrderSearchQueryByTerm,
|
|
8
11
|
type OrderSearchResult,
|
|
12
|
+
type OrderSearchResultItem,
|
|
9
13
|
type RequestContext,
|
|
10
14
|
type Result,
|
|
11
15
|
success,
|
|
12
|
-
type OrderSearchResultItem,
|
|
13
16
|
} from '@reactionary/core';
|
|
14
17
|
import type { FakeConfiguration } from '../schema/configuration.schema.js';
|
|
15
18
|
import { Faker, en, base } from '@faker-js/faker';
|
|
19
|
+
import type { FakeOrderSearchFactory } from '../factories/order-search/order-search.factory.js';
|
|
16
20
|
|
|
17
|
-
export class FakeOrderSearchProvider
|
|
21
|
+
export class FakeOrderSearchProvider<
|
|
22
|
+
TFactory extends OrderSearchFactory = FakeOrderSearchFactory,
|
|
23
|
+
> extends OrderSearchProvider<OrderSearchFactoryOutput<TFactory>> {
|
|
18
24
|
protected config: FakeConfiguration;
|
|
19
25
|
protected generator: Faker;
|
|
26
|
+
protected factory: OrderSearchFactoryWithOutput<TFactory>;
|
|
20
27
|
|
|
21
28
|
constructor(
|
|
22
29
|
config: FakeConfiguration,
|
|
23
30
|
cache: Cache,
|
|
24
|
-
context: RequestContext
|
|
31
|
+
context: RequestContext,
|
|
32
|
+
factory: OrderSearchFactoryWithOutput<TFactory>,
|
|
25
33
|
) {
|
|
26
34
|
super(cache, context);
|
|
27
35
|
|
|
28
36
|
this.config = config;
|
|
29
|
-
|
|
30
37
|
this.generator = new Faker({
|
|
31
38
|
locale: [en, base],
|
|
32
39
|
seed: config.seeds.product,
|
|
33
40
|
});
|
|
41
|
+
this.factory = factory;
|
|
34
42
|
}
|
|
35
43
|
|
|
36
44
|
@Reactionary({
|
|
@@ -38,41 +46,41 @@ export class FakeOrderSearchProvider extends OrderSearchProvider {
|
|
|
38
46
|
outputSchema: OrderSearchResultSchema,
|
|
39
47
|
})
|
|
40
48
|
public override async queryByTerm(
|
|
41
|
-
payload: OrderSearchQueryByTerm
|
|
42
|
-
): Promise<Result<
|
|
43
|
-
const items =
|
|
49
|
+
payload: OrderSearchQueryByTerm,
|
|
50
|
+
): Promise<Result<OrderSearchFactoryOutput<TFactory>>> {
|
|
51
|
+
const items: OrderSearchResultItem[] = [];
|
|
44
52
|
|
|
45
53
|
for (let i = 0; i < payload.search.paginationOptions.pageSize; i++) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
54
|
+
items.push({
|
|
55
|
+
customerName: this.generator.company.name(),
|
|
56
|
+
identifier: {
|
|
57
|
+
key: this.generator.string.uuid(),
|
|
58
|
+
},
|
|
59
|
+
inventoryStatus: 'Allocated',
|
|
60
|
+
orderDate: this.generator.date.past().toString(),
|
|
61
|
+
orderStatus: 'Shipped',
|
|
62
|
+
totalAmount: {
|
|
63
|
+
currency: 'USD',
|
|
64
|
+
value: this.generator.number.int({ multipleOf: 100 }),
|
|
65
|
+
},
|
|
66
|
+
userId: {
|
|
67
|
+
userId: '1234',
|
|
68
|
+
},
|
|
69
|
+
});
|
|
62
70
|
}
|
|
63
71
|
|
|
64
72
|
const totalCount = this.generator.number.int({ min: items.length, max: 200 });
|
|
65
73
|
const totalPages = Math.ceil(totalCount / payload.search.paginationOptions.pageSize);
|
|
66
74
|
|
|
67
75
|
const result = {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
identifier: payload.search,
|
|
77
|
+
items,
|
|
78
|
+
pageNumber: payload.search.paginationOptions.pageNumber,
|
|
79
|
+
pageSize: payload.search.paginationOptions.pageSize,
|
|
80
|
+
totalCount,
|
|
81
|
+
totalPages,
|
|
74
82
|
} satisfies OrderSearchResult;
|
|
75
83
|
|
|
76
|
-
return success(result);
|
|
84
|
+
return success(this.factory.parseOrderSearchResult(this.context, result, payload));
|
|
77
85
|
}
|
|
78
86
|
}
|
|
@@ -7,30 +7,38 @@ import {
|
|
|
7
7
|
type Cache,
|
|
8
8
|
type NotFoundError,
|
|
9
9
|
type Order,
|
|
10
|
+
type OrderFactory,
|
|
11
|
+
type OrderFactoryOutput,
|
|
12
|
+
type OrderFactoryWithOutput,
|
|
10
13
|
type OrderQueryById,
|
|
11
14
|
type RequestContext,
|
|
12
15
|
type Result,
|
|
13
16
|
} from '@reactionary/core';
|
|
14
17
|
import type { FakeConfiguration } from '../schema/configuration.schema.js';
|
|
15
18
|
import { Faker, en, base } from '@faker-js/faker';
|
|
19
|
+
import type { FakeOrderFactory } from '../factories/order/order.factory.js';
|
|
16
20
|
|
|
17
|
-
export class FakeOrderProvider
|
|
21
|
+
export class FakeOrderProvider<
|
|
22
|
+
TFactory extends OrderFactory = FakeOrderFactory,
|
|
23
|
+
> extends OrderProvider<OrderFactoryOutput<TFactory>> {
|
|
18
24
|
protected config: FakeConfiguration;
|
|
19
25
|
protected generator: Faker;
|
|
26
|
+
protected factory: OrderFactoryWithOutput<TFactory>;
|
|
20
27
|
|
|
21
28
|
constructor(
|
|
22
29
|
config: FakeConfiguration,
|
|
23
30
|
cache: Cache,
|
|
24
|
-
context: RequestContext
|
|
31
|
+
context: RequestContext,
|
|
32
|
+
factory: OrderFactoryWithOutput<TFactory>,
|
|
25
33
|
) {
|
|
26
34
|
super(cache, context);
|
|
27
35
|
|
|
28
36
|
this.config = config;
|
|
29
|
-
|
|
30
37
|
this.generator = new Faker({
|
|
31
38
|
locale: [en, base],
|
|
32
39
|
seed: config.seeds.product,
|
|
33
40
|
});
|
|
41
|
+
this.factory = factory;
|
|
34
42
|
}
|
|
35
43
|
|
|
36
44
|
@Reactionary({
|
|
@@ -38,8 +46,8 @@ export class FakeOrderProvider extends OrderProvider {
|
|
|
38
46
|
outputSchema: OrderSchema,
|
|
39
47
|
})
|
|
40
48
|
public override async getById(
|
|
41
|
-
payload: OrderQueryById
|
|
42
|
-
): Promise<Result<
|
|
49
|
+
payload: OrderQueryById,
|
|
50
|
+
): Promise<Result<OrderFactoryOutput<TFactory>, NotFoundError>> {
|
|
43
51
|
const order = {
|
|
44
52
|
identifier: payload.order,
|
|
45
53
|
inventoryStatus: 'Allocated',
|
|
@@ -47,60 +55,36 @@ export class FakeOrderProvider extends OrderProvider {
|
|
|
47
55
|
orderStatus: 'Shipped',
|
|
48
56
|
paymentInstructions: [],
|
|
49
57
|
userId: {
|
|
50
|
-
userId: '1234'
|
|
58
|
+
userId: '1234',
|
|
51
59
|
},
|
|
52
60
|
price: {
|
|
53
61
|
grandTotal: {
|
|
54
62
|
currency: 'USD',
|
|
55
|
-
value: this.generator.number.float({
|
|
56
|
-
min: 100,
|
|
57
|
-
max: 10000,
|
|
58
|
-
multipleOf: 25,
|
|
59
|
-
}),
|
|
63
|
+
value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
|
|
60
64
|
},
|
|
61
65
|
totalDiscount: {
|
|
62
66
|
currency: 'USD',
|
|
63
|
-
value: this.generator.number.float({
|
|
64
|
-
min: 100,
|
|
65
|
-
max: 10000,
|
|
66
|
-
multipleOf: 25,
|
|
67
|
-
}),
|
|
67
|
+
value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
|
|
68
68
|
},
|
|
69
69
|
totalProductPrice: {
|
|
70
70
|
currency: 'USD',
|
|
71
|
-
value: this.generator.number.float({
|
|
72
|
-
min: 100,
|
|
73
|
-
max: 10000,
|
|
74
|
-
multipleOf: 25,
|
|
75
|
-
}),
|
|
71
|
+
value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
|
|
76
72
|
},
|
|
77
73
|
totalShipping: {
|
|
78
74
|
currency: 'USD',
|
|
79
|
-
value: this.generator.number.float({
|
|
80
|
-
min: 100,
|
|
81
|
-
max: 10000,
|
|
82
|
-
multipleOf: 25,
|
|
83
|
-
}),
|
|
75
|
+
value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
|
|
84
76
|
},
|
|
85
77
|
totalSurcharge: {
|
|
86
78
|
currency: 'USD',
|
|
87
|
-
value: this.generator.number.float({
|
|
88
|
-
min: 100,
|
|
89
|
-
max: 10000,
|
|
90
|
-
multipleOf: 25,
|
|
91
|
-
}),
|
|
79
|
+
value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
|
|
92
80
|
},
|
|
93
81
|
totalTax: {
|
|
94
82
|
currency: 'USD',
|
|
95
|
-
value: this.generator.number.float({
|
|
96
|
-
min: 100,
|
|
97
|
-
max: 10000,
|
|
98
|
-
multipleOf: 25,
|
|
99
|
-
}),
|
|
83
|
+
value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
|
|
100
84
|
},
|
|
101
85
|
},
|
|
102
86
|
} satisfies Order;
|
|
103
87
|
|
|
104
|
-
return success(order);
|
|
88
|
+
return success(this.factory.parseOrder(this.context, order));
|
|
105
89
|
}
|
|
106
90
|
}
|
|
@@ -1,30 +1,37 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
CustomerPriceQuerySchema,
|
|
3
|
+
ListPriceQuerySchema,
|
|
4
4
|
PriceProvider,
|
|
5
|
+
PriceSchema,
|
|
6
|
+
Reactionary,
|
|
7
|
+
success,
|
|
8
|
+
type Cache,
|
|
5
9
|
type CustomerPriceQuery,
|
|
6
10
|
type ListPriceQuery,
|
|
7
11
|
type Price,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
error,
|
|
13
|
-
success,
|
|
12
|
+
type PriceFactory,
|
|
13
|
+
type PriceFactoryOutput,
|
|
14
|
+
type PriceFactoryWithOutput,
|
|
15
|
+
type RequestContext,
|
|
14
16
|
type Result,
|
|
15
17
|
} from '@reactionary/core';
|
|
16
|
-
import type * as z from 'zod';
|
|
17
18
|
import type { FakeConfiguration } from '../schema/configuration.schema.js';
|
|
18
19
|
import { base, en, Faker } from '@faker-js/faker';
|
|
19
20
|
import { calcSeed } from '../utilities/seed.js';
|
|
21
|
+
import type { FakePriceFactory } from '../factories/price/price.factory.js';
|
|
20
22
|
|
|
21
|
-
export class FakePriceProvider
|
|
23
|
+
export class FakePriceProvider<
|
|
24
|
+
TFactory extends PriceFactory = FakePriceFactory,
|
|
25
|
+
> extends PriceProvider<PriceFactoryOutput<TFactory>> {
|
|
22
26
|
protected config: FakeConfiguration;
|
|
23
27
|
protected faker: Faker;
|
|
28
|
+
protected factory: PriceFactoryWithOutput<TFactory>;
|
|
29
|
+
|
|
24
30
|
constructor(
|
|
25
31
|
config: FakeConfiguration,
|
|
26
32
|
cache: Cache,
|
|
27
|
-
context: RequestContext
|
|
33
|
+
context: RequestContext,
|
|
34
|
+
factory: PriceFactoryWithOutput<TFactory>,
|
|
28
35
|
) {
|
|
29
36
|
super(cache, context);
|
|
30
37
|
|
|
@@ -32,6 +39,7 @@ export class FakePriceProvider extends PriceProvider {
|
|
|
32
39
|
this.faker = new Faker({
|
|
33
40
|
locale: [en, base],
|
|
34
41
|
});
|
|
42
|
+
this.factory = factory;
|
|
35
43
|
}
|
|
36
44
|
|
|
37
45
|
protected createPrice(variantSku: string, mode: 'list' | 'customer'): Price {
|
|
@@ -40,34 +48,30 @@ export class FakePriceProvider extends PriceProvider {
|
|
|
40
48
|
let price = this.faker.number.int({ min: 300, max: 100000 }) / 100;
|
|
41
49
|
let onSale = false;
|
|
42
50
|
if (mode === 'customer') {
|
|
43
|
-
|
|
44
|
-
onSale = this.faker.datatype.boolean({ probability: 0.1 }); // 10% chance of being on sale
|
|
45
|
-
|
|
51
|
+
onSale = this.faker.datatype.boolean({ probability: 0.1 });
|
|
46
52
|
if (onSale) {
|
|
47
|
-
price = price * this.faker.number.float({ min: 0.5, max: 0.9 });
|
|
53
|
+
price = price * this.faker.number.float({ min: 0.5, max: 0.9 });
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
|
|
51
57
|
const tiers = [];
|
|
52
58
|
if (variantSku.includes('with-tiers')) {
|
|
53
|
-
// Add tiered pricing for SKUs that include "with-tiers"
|
|
54
59
|
tiers.push({
|
|
55
60
|
minimumQuantity: this.faker.number.int({ min: 2, max: 5 }),
|
|
56
61
|
price: {
|
|
57
|
-
value: price * 0.8,
|
|
62
|
+
value: price * 0.8,
|
|
58
63
|
currency: this.context.languageContext.currencyCode,
|
|
59
64
|
},
|
|
60
65
|
});
|
|
61
66
|
tiers.push({
|
|
62
67
|
minimumQuantity: this.faker.number.int({ min: 6, max: 10 }),
|
|
63
68
|
price: {
|
|
64
|
-
value: price * 0.6,
|
|
69
|
+
value: price * 0.6,
|
|
65
70
|
currency: this.context.languageContext.currencyCode,
|
|
66
71
|
},
|
|
67
72
|
});
|
|
68
73
|
}
|
|
69
74
|
|
|
70
|
-
|
|
71
75
|
return {
|
|
72
76
|
identifier: {
|
|
73
77
|
variant: {
|
|
@@ -80,32 +84,36 @@ export class FakePriceProvider extends PriceProvider {
|
|
|
80
84
|
},
|
|
81
85
|
onSale,
|
|
82
86
|
tieredPrices: tiers,
|
|
83
|
-
}
|
|
87
|
+
};
|
|
84
88
|
}
|
|
85
89
|
|
|
86
|
-
|
|
87
|
-
|
|
88
90
|
@Reactionary({
|
|
89
91
|
inputSchema: ListPriceQuerySchema,
|
|
90
|
-
outputSchema: PriceSchema
|
|
92
|
+
outputSchema: PriceSchema,
|
|
91
93
|
})
|
|
92
|
-
public override async getListPrice(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
public override async getListPrice(
|
|
95
|
+
payload: ListPriceQuery,
|
|
96
|
+
): Promise<Result<PriceFactoryOutput<TFactory>>> {
|
|
97
|
+
const base =
|
|
98
|
+
payload.variant.sku === 'unknown-sku'
|
|
99
|
+
? this.createEmptyPriceResult(payload.variant.sku)
|
|
100
|
+
: this.createPrice(payload.variant.sku, 'list');
|
|
96
101
|
|
|
97
|
-
return success(this.
|
|
102
|
+
return success(this.factory.parsePrice(this.context, base));
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
@Reactionary({
|
|
101
106
|
inputSchema: CustomerPriceQuerySchema,
|
|
102
|
-
outputSchema: PriceSchema
|
|
107
|
+
outputSchema: PriceSchema,
|
|
103
108
|
})
|
|
104
|
-
public override async getCustomerPrice(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
public override async getCustomerPrice(
|
|
110
|
+
payload: CustomerPriceQuery,
|
|
111
|
+
): Promise<Result<PriceFactoryOutput<TFactory>>> {
|
|
112
|
+
const base =
|
|
113
|
+
payload.variant.sku === 'unknown-sku'
|
|
114
|
+
? this.createEmptyPriceResult(payload.variant.sku)
|
|
115
|
+
: this.createPrice(payload.variant.sku, 'customer');
|
|
108
116
|
|
|
109
|
-
return success(this.
|
|
117
|
+
return success(this.factory.parsePrice(this.context, base));
|
|
110
118
|
}
|
|
111
119
|
}
|
|
@@ -7,23 +7,36 @@ import {
|
|
|
7
7
|
type Result,
|
|
8
8
|
success,
|
|
9
9
|
type ProductAssociation,
|
|
10
|
+
type Cache,
|
|
10
11
|
type ProductSearchResultItem,
|
|
12
|
+
type RequestContext,
|
|
13
|
+
} from '@reactionary/core';
|
|
14
|
+
import type {
|
|
15
|
+
ProductAssociationsFactory,
|
|
16
|
+
ProductAssociationsFactoryOutput,
|
|
17
|
+
ProductAssociationsFactoryWithOutput,
|
|
11
18
|
} from '@reactionary/core';
|
|
12
19
|
import type { FakeConfiguration } from '../schema/configuration.schema.js';
|
|
13
|
-
import {
|
|
20
|
+
import { en, Faker } from '@faker-js/faker';
|
|
14
21
|
import { calcSeed } from '../utilities/seed.js';
|
|
22
|
+
import type { FakeProductAssociationsFactory } from '../factories/product-associations/product-associations.factory.js';
|
|
15
23
|
|
|
16
|
-
export class FakeProductAssociationsProvider
|
|
24
|
+
export class FakeProductAssociationsProvider<
|
|
25
|
+
TFactory extends ProductAssociationsFactory = FakeProductAssociationsFactory,
|
|
26
|
+
> extends ProductAssociationsProvider<ProductAssociationsFactoryOutput<TFactory>> {
|
|
17
27
|
protected config: FakeConfiguration;
|
|
28
|
+
protected factory: ProductAssociationsFactoryWithOutput<TFactory>;
|
|
18
29
|
protected faker: Faker;
|
|
19
30
|
|
|
20
31
|
constructor(
|
|
21
32
|
config: FakeConfiguration,
|
|
22
|
-
cache:
|
|
23
|
-
context:
|
|
33
|
+
cache: Cache,
|
|
34
|
+
context: RequestContext,
|
|
35
|
+
factory: ProductAssociationsFactoryWithOutput<TFactory>,
|
|
24
36
|
) {
|
|
25
37
|
super(cache, context);
|
|
26
38
|
this.config = config;
|
|
39
|
+
this.factory = factory;
|
|
27
40
|
this.faker = new Faker({ locale: [en] });
|
|
28
41
|
}
|
|
29
42
|
|
|
@@ -35,7 +48,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
|
|
|
35
48
|
})
|
|
36
49
|
public override async getAccessories(
|
|
37
50
|
query: ProductAssociationsGetAccessoriesQuery
|
|
38
|
-
): Promise<Result<
|
|
51
|
+
): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
|
|
39
52
|
const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfAccessories || 4, 'accessory');
|
|
40
53
|
|
|
41
54
|
const result: ProductAssociation[] = associatedProducts.map(product => ({
|
|
@@ -46,7 +59,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
|
|
|
46
59
|
product,
|
|
47
60
|
} satisfies ProductAssociation));
|
|
48
61
|
|
|
49
|
-
return success(result);
|
|
62
|
+
return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
|
|
50
63
|
}
|
|
51
64
|
|
|
52
65
|
@Reactionary({
|
|
@@ -57,7 +70,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
|
|
|
57
70
|
})
|
|
58
71
|
public override async getSpareparts(
|
|
59
72
|
query: ProductAssociationsGetSparepartsQuery
|
|
60
|
-
): Promise<Result<
|
|
73
|
+
): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
|
|
61
74
|
const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfSpareparts || 4, 'sparepart');
|
|
62
75
|
|
|
63
76
|
const result: ProductAssociation[] = associatedProducts.map(product => ({
|
|
@@ -68,7 +81,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
|
|
|
68
81
|
product,
|
|
69
82
|
} satisfies ProductAssociation));
|
|
70
83
|
|
|
71
|
-
return success(result);
|
|
84
|
+
return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
|
|
72
85
|
}
|
|
73
86
|
|
|
74
87
|
@Reactionary({
|
|
@@ -79,7 +92,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
|
|
|
79
92
|
})
|
|
80
93
|
public override async getReplacements(
|
|
81
94
|
query: ProductAssociationsGetReplacementsQuery
|
|
82
|
-
): Promise<Result<
|
|
95
|
+
): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
|
|
83
96
|
const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfReplacements || 4, 'replacement');
|
|
84
97
|
|
|
85
98
|
const result: ProductAssociation[] = associatedProducts.map(product => ({
|
|
@@ -90,7 +103,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
|
|
|
90
103
|
product,
|
|
91
104
|
} satisfies ProductAssociation));
|
|
92
105
|
|
|
93
|
-
return success(result);
|
|
106
|
+
return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
|
|
94
107
|
}
|
|
95
108
|
|
|
96
109
|
private generateFakeAssociatedProducts(baseProductKey: string, count: number, type: string): ProductSearchResultItem[] {
|