@labdigital/commercetools-mock 2.45.1 → 2.47.0
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/dist/index.cjs +614 -250
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +788 -59
- package/dist/index.d.ts +788 -59
- package/dist/index.js +602 -238
- package/dist/index.js.map +1 -1
- package/package.json +41 -48
- package/src/ctMock.ts +11 -13
- package/src/index.test.ts +5 -5
- package/src/lib/predicateParser.test.ts +91 -60
- package/src/lib/predicateParser.ts +38 -42
- package/src/lib/productSearchFilter.test.ts +18 -0
- package/src/lib/productSearchFilter.ts +7 -0
- package/src/lib/projectionSearchFilter.test.ts +17 -17
- package/src/lib/projectionSearchFilter.ts +2 -3
- package/src/oauth/server.test.ts +1 -1
- package/src/oauth/server.ts +11 -11
- package/src/priceSelector.ts +1 -1
- package/src/product-projection-search.ts +18 -19
- package/src/product-search.ts +48 -8
- package/src/repositories/business-unit.ts +17 -16
- package/src/repositories/cart/actions.ts +32 -32
- package/src/repositories/cart/helpers.ts +1 -1
- package/src/repositories/cart/index.ts +25 -8
- package/src/repositories/cart-discount/actions.ts +1 -4
- package/src/repositories/category/actions.ts +2 -6
- package/src/repositories/custom-object.ts +20 -21
- package/src/repositories/customer/actions.ts +4 -4
- package/src/repositories/errors.ts +1 -1
- package/src/repositories/extension.ts +2 -1
- package/src/repositories/helpers.ts +27 -27
- package/src/repositories/index.ts +17 -17
- package/src/repositories/my-customer.ts +1 -1
- package/src/repositories/my-order.ts +2 -2
- package/src/repositories/order/index.ts +1 -1
- package/src/repositories/product/actions.ts +1 -1
- package/src/repositories/quote/actions.ts +83 -0
- package/src/repositories/quote/index.ts +54 -0
- package/src/repositories/quote-request/actions.ts +84 -0
- package/src/repositories/quote-request/index.test.ts +167 -0
- package/src/repositories/quote-request/index.ts +67 -0
- package/src/repositories/quote-staged/actions.ts +84 -0
- package/src/repositories/quote-staged/index.ts +47 -0
- package/src/repositories/review.ts +4 -4
- package/src/repositories/shipping-method/actions.ts +17 -17
- package/src/repositories/shipping-method/index.ts +6 -6
- package/src/repositories/shopping-list/actions.ts +1 -1
- package/src/repositories/shopping-list/index.ts +9 -1
- package/src/repositories/subscription.ts +2 -4
- package/src/server.ts +3 -2
- package/src/services/abstract.ts +7 -7
- package/src/services/as-associate-order.test.ts +1 -1
- package/src/services/cart-discount.test.ts +1 -1
- package/src/services/cart.test.ts +40 -15
- package/src/services/category.test.ts +1 -1
- package/src/services/customer.test.ts +16 -55
- package/src/services/customer.ts +1 -1
- package/src/services/index.ts +20 -14
- package/src/services/inventory-entry.test.ts +5 -5
- package/src/services/my-cart.test.ts +2 -2
- package/src/services/my-customer.test.ts +2 -2
- package/src/services/order.test.ts +8 -8
- package/src/services/product-projection.test.ts +5 -5
- package/src/services/product-projection.ts +12 -14
- package/src/services/product.test.ts +155 -71
- package/src/services/quote-request.test.ts +59 -0
- package/src/services/quote-request.ts +16 -0
- package/src/services/quote-staged.ts +16 -0
- package/src/services/quote.ts +16 -0
- package/src/services/standalone-price.test.ts +4 -4
- package/src/services/state.test.ts +1 -1
- package/src/services/store.test.ts +2 -2
- package/src/services/tax-category.test.ts +1 -1
- package/src/shipping.ts +3 -3
- package/src/storage/in-memory.ts +55 -63
- package/src/testing/customer.ts +40 -0
- package/src/types.ts +51 -31
- package/src/repositories/quote-request.ts +0 -17
- package/src/repositories/quote.ts +0 -14
- package/src/repositories/staged-quote.ts +0 -17
package/dist/index.js
CHANGED
|
@@ -144,7 +144,7 @@ var getBearerToken = (request) => {
|
|
|
144
144
|
};
|
|
145
145
|
|
|
146
146
|
// src/oauth/store.ts
|
|
147
|
-
import { randomBytes } from "
|
|
147
|
+
import { randomBytes } from "crypto";
|
|
148
148
|
import { v4 as uuidv43 } from "uuid";
|
|
149
149
|
var OAuth2Store = class {
|
|
150
150
|
tokens = [];
|
|
@@ -209,7 +209,8 @@ var OAuth2Store = class {
|
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
211
|
validateToken(token) {
|
|
212
|
-
if (!this.validate)
|
|
212
|
+
if (!this.validate)
|
|
213
|
+
return true;
|
|
213
214
|
const foundToken = this.tokens.find((t) => t.access_token === token);
|
|
214
215
|
if (foundToken) {
|
|
215
216
|
return true;
|
|
@@ -343,7 +344,8 @@ var OAuth2Server = class {
|
|
|
343
344
|
request.query.scope?.toString()
|
|
344
345
|
);
|
|
345
346
|
return response.status(200).send(token);
|
|
346
|
-
}
|
|
347
|
+
}
|
|
348
|
+
if (grantType === "refresh_token") {
|
|
347
349
|
const refreshToken = request.query.refresh_token?.toString() || request.body.refresh_token;
|
|
348
350
|
if (!refreshToken) {
|
|
349
351
|
return next(
|
|
@@ -375,17 +377,16 @@ var OAuth2Server = class {
|
|
|
375
377
|
);
|
|
376
378
|
}
|
|
377
379
|
return response.status(200).send(token);
|
|
378
|
-
} else {
|
|
379
|
-
return next(
|
|
380
|
-
new CommercetoolsError(
|
|
381
|
-
{
|
|
382
|
-
code: "unsupported_grant_type",
|
|
383
|
-
message: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`
|
|
384
|
-
},
|
|
385
|
-
400
|
|
386
|
-
)
|
|
387
|
-
);
|
|
388
380
|
}
|
|
381
|
+
return next(
|
|
382
|
+
new CommercetoolsError(
|
|
383
|
+
{
|
|
384
|
+
code: "unsupported_grant_type",
|
|
385
|
+
message: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`
|
|
386
|
+
},
|
|
387
|
+
400
|
|
388
|
+
)
|
|
389
|
+
);
|
|
389
390
|
}
|
|
390
391
|
async customerTokenHandler(request, response, next) {
|
|
391
392
|
const projectKey = request.params.projectKey;
|
|
@@ -552,7 +553,8 @@ import deepEqual from "deep-equal";
|
|
|
552
553
|
|
|
553
554
|
// src/repositories/errors.ts
|
|
554
555
|
var checkConcurrentModification = (currentVersion, expectedVersion, identifier) => {
|
|
555
|
-
if (currentVersion === expectedVersion)
|
|
556
|
+
if (currentVersion === expectedVersion)
|
|
557
|
+
return;
|
|
556
558
|
throw new CommercetoolsError(
|
|
557
559
|
{
|
|
558
560
|
message: `Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`,
|
|
@@ -743,7 +745,8 @@ import { v4 as uuidv46 } from "uuid";
|
|
|
743
745
|
import { Decimal } from "decimal.js/decimal";
|
|
744
746
|
import { v4 as uuidv44 } from "uuid";
|
|
745
747
|
var createAddress = (base, projectKey, storage) => {
|
|
746
|
-
if (!base)
|
|
748
|
+
if (!base)
|
|
749
|
+
return void 0;
|
|
747
750
|
if (!base?.country) {
|
|
748
751
|
throw new Error("Country is required");
|
|
749
752
|
}
|
|
@@ -752,9 +755,12 @@ var createAddress = (base, projectKey, storage) => {
|
|
|
752
755
|
};
|
|
753
756
|
};
|
|
754
757
|
var createCustomFields = (draft, projectKey, storage) => {
|
|
755
|
-
if (!draft)
|
|
756
|
-
|
|
757
|
-
if (!draft.type
|
|
758
|
+
if (!draft)
|
|
759
|
+
return void 0;
|
|
760
|
+
if (!draft.type)
|
|
761
|
+
return void 0;
|
|
762
|
+
if (!draft.type.typeId)
|
|
763
|
+
return void 0;
|
|
758
764
|
const typeResource = storage.getByResourceIdentifier(
|
|
759
765
|
projectKey,
|
|
760
766
|
draft.type
|
|
@@ -837,7 +843,8 @@ var createTypedMoney = (value) => {
|
|
|
837
843
|
return result;
|
|
838
844
|
};
|
|
839
845
|
var resolveStoreReference = (ref, projectKey, storage) => {
|
|
840
|
-
if (!ref)
|
|
846
|
+
if (!ref)
|
|
847
|
+
return void 0;
|
|
841
848
|
const resource = storage.getByResourceIdentifier(projectKey, ref);
|
|
842
849
|
if (!resource) {
|
|
843
850
|
throw new Error("No such store");
|
|
@@ -905,7 +912,8 @@ var getRepositoryContext = (request) => ({
|
|
|
905
912
|
storeKey: request.params.storeKey
|
|
906
913
|
});
|
|
907
914
|
var createAssociate = (a, projectKey, storage) => {
|
|
908
|
-
if (!a)
|
|
915
|
+
if (!a)
|
|
916
|
+
return void 0;
|
|
909
917
|
if (!a.associateRoleAssignments) {
|
|
910
918
|
throw new Error("AssociateRoleAssignments is required");
|
|
911
919
|
}
|
|
@@ -992,10 +1000,6 @@ var markMatchingShippingRatePriceTiers = (cart, tiers) => {
|
|
|
992
1000
|
switch (tierType) {
|
|
993
1001
|
case "CartValue":
|
|
994
1002
|
return markMatchingCartValueTiers(cart, tiers);
|
|
995
|
-
// case 'CartClassification':
|
|
996
|
-
// return markMatchingCartClassificationTiers(cart, tiers)
|
|
997
|
-
// case 'CartScore':
|
|
998
|
-
// return markMatchingCartScoreTiers(cart, tiers)
|
|
999
1003
|
default:
|
|
1000
1004
|
throw new Error(`Unsupported tier type: ${tierType}`);
|
|
1001
1005
|
}
|
|
@@ -1008,7 +1012,8 @@ var markMatchingCartValueTiers = (cart, tiers) => {
|
|
|
1008
1012
|
let hasMatchingTier = false;
|
|
1009
1013
|
for (const tier of sortedTiers) {
|
|
1010
1014
|
const isMatching = !hasMatchingTier && cart.totalPrice.currencyCode === tier.price.currencyCode && cart.totalPrice.centAmount >= tier.minimumCentAmount;
|
|
1011
|
-
if (isMatching)
|
|
1015
|
+
if (isMatching)
|
|
1016
|
+
hasMatchingTier = true;
|
|
1012
1017
|
result[tier.minimumCentAmount] = {
|
|
1013
1018
|
...tier,
|
|
1014
1019
|
isMatching
|
|
@@ -1032,12 +1037,12 @@ var getShippingMethodsMatchingCart = (context, storage, cart, params = {}) => {
|
|
|
1032
1037
|
context.projectKey,
|
|
1033
1038
|
"shipping-method",
|
|
1034
1039
|
{
|
|
1035
|
-
|
|
1036
|
-
|
|
1040
|
+
where: [
|
|
1041
|
+
"zoneRates(zone(id in (:zoneIds)))",
|
|
1037
1042
|
`zoneRates(shippingRates(price(currencyCode="${cart.totalPrice.currencyCode}")))`
|
|
1038
1043
|
],
|
|
1039
1044
|
"var.zoneIds": zoneIds,
|
|
1040
|
-
|
|
1045
|
+
expand: params.expand
|
|
1041
1046
|
}
|
|
1042
1047
|
);
|
|
1043
1048
|
const results = shippingMethods.results.map((shippingMethod) => {
|
|
@@ -1073,7 +1078,7 @@ var selectPrice = ({
|
|
|
1073
1078
|
return countryMatch && currencyMatch;
|
|
1074
1079
|
});
|
|
1075
1080
|
};
|
|
1076
|
-
var calculateLineItemTotalPrice = (lineItem) => lineItem.price
|
|
1081
|
+
var calculateLineItemTotalPrice = (lineItem) => lineItem.price?.value.centAmount * lineItem.quantity;
|
|
1077
1082
|
var calculateCartTotalPrice = (cart) => cart.lineItems.reduce((cur, item) => cur + item.totalPrice.centAmount, 0);
|
|
1078
1083
|
|
|
1079
1084
|
// src/repositories/cart/actions.ts
|
|
@@ -1120,8 +1125,10 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
1120
1125
|
product.masterData.current.masterVariant,
|
|
1121
1126
|
...product.masterData.current.variants
|
|
1122
1127
|
].find((x) => {
|
|
1123
|
-
if (sku)
|
|
1124
|
-
|
|
1128
|
+
if (sku)
|
|
1129
|
+
return x.sku === sku;
|
|
1130
|
+
if (variantId)
|
|
1131
|
+
return x.id === variantId;
|
|
1125
1132
|
return false;
|
|
1126
1133
|
});
|
|
1127
1134
|
if (!variant) {
|
|
@@ -1207,7 +1214,7 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
1207
1214
|
} else {
|
|
1208
1215
|
throw new CommercetoolsError({
|
|
1209
1216
|
code: "General",
|
|
1210
|
-
message:
|
|
1217
|
+
message: "Either lineItemid or lineItemKey needs to be provided."
|
|
1211
1218
|
});
|
|
1212
1219
|
}
|
|
1213
1220
|
if (quantity === 0) {
|
|
@@ -1474,7 +1481,7 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
1474
1481
|
});
|
|
1475
1482
|
}
|
|
1476
1483
|
const zoneRate = method.zoneRates.find(
|
|
1477
|
-
(rate) => rate.zone.obj
|
|
1484
|
+
(rate) => rate.zone.obj?.locations.some((loc) => loc.country === country)
|
|
1478
1485
|
);
|
|
1479
1486
|
if (!zoneRate) {
|
|
1480
1487
|
throw new Error("Zone rate not found");
|
|
@@ -1552,6 +1559,18 @@ var CartRepository = class extends AbstractResourceRepository {
|
|
|
1552
1559
|
this.actions = new CartUpdateHandler(this._storage);
|
|
1553
1560
|
}
|
|
1554
1561
|
create(context, draft) {
|
|
1562
|
+
if (draft.anonymousId && draft.customerId) {
|
|
1563
|
+
throw new CommercetoolsError({
|
|
1564
|
+
code: "InvalidOperation",
|
|
1565
|
+
message: "Can set only one of customer OR anonymousId"
|
|
1566
|
+
});
|
|
1567
|
+
}
|
|
1568
|
+
if (draft.customerId) {
|
|
1569
|
+
this._storage.getByResourceIdentifier(context.projectKey, {
|
|
1570
|
+
typeId: "customer",
|
|
1571
|
+
id: draft.customerId
|
|
1572
|
+
});
|
|
1573
|
+
}
|
|
1555
1574
|
const lineItems = draft.lineItems?.map(
|
|
1556
1575
|
(draftLineItem) => this.draftLineItemtoLineItem(
|
|
1557
1576
|
context.projectKey,
|
|
@@ -1566,6 +1585,7 @@ var CartRepository = class extends AbstractResourceRepository {
|
|
|
1566
1585
|
billingAddress: draft.billingAddress ? createAddress(draft.billingAddress, context.projectKey, this._storage) : void 0,
|
|
1567
1586
|
cartState: "Active",
|
|
1568
1587
|
country: draft.country,
|
|
1588
|
+
customerId: draft.customerId,
|
|
1569
1589
|
customerEmail: draft.customerEmail,
|
|
1570
1590
|
customLineItems: [],
|
|
1571
1591
|
directDiscounts: [],
|
|
@@ -1636,8 +1656,10 @@ var CartRepository = class extends AbstractResourceRepository {
|
|
|
1636
1656
|
product.masterData.current.masterVariant,
|
|
1637
1657
|
...product.masterData.current.variants
|
|
1638
1658
|
].find((x) => {
|
|
1639
|
-
if (sku)
|
|
1640
|
-
|
|
1659
|
+
if (sku)
|
|
1660
|
+
return x.sku === sku;
|
|
1661
|
+
if (variantId)
|
|
1662
|
+
return x.id === variantId;
|
|
1641
1663
|
return false;
|
|
1642
1664
|
});
|
|
1643
1665
|
if (!variant) {
|
|
@@ -1819,7 +1841,8 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
1819
1841
|
);
|
|
1820
1842
|
}
|
|
1821
1843
|
setStore(context, resource, { store }) {
|
|
1822
|
-
if (!store)
|
|
1844
|
+
if (!store)
|
|
1845
|
+
return;
|
|
1823
1846
|
const resolvedType = this._storage.getByResourceIdentifier(
|
|
1824
1847
|
context.projectKey,
|
|
1825
1848
|
store
|
|
@@ -1850,7 +1873,8 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
1850
1873
|
};
|
|
1851
1874
|
}
|
|
1852
1875
|
updateSyncInfo(context, resource, { channel, externalId, syncedAt }) {
|
|
1853
|
-
if (!channel)
|
|
1876
|
+
if (!channel)
|
|
1877
|
+
return;
|
|
1854
1878
|
const resolvedType = this._storage.getByResourceIdentifier(
|
|
1855
1879
|
context.projectKey,
|
|
1856
1880
|
channel
|
|
@@ -2246,7 +2270,8 @@ var BusinessUnitRepository = class extends AbstractResourceRepository {
|
|
|
2246
2270
|
};
|
|
2247
2271
|
this.saveNew(context, division);
|
|
2248
2272
|
return division;
|
|
2249
|
-
}
|
|
2273
|
+
}
|
|
2274
|
+
if (this._isCompanyDraft(draft)) {
|
|
2250
2275
|
const company = resource;
|
|
2251
2276
|
this.saveNew(context, company);
|
|
2252
2277
|
return company;
|
|
@@ -2368,7 +2393,7 @@ var CartDiscountUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
2368
2393
|
throw new CommercetoolsError(
|
|
2369
2394
|
{
|
|
2370
2395
|
code: "InvalidOperation",
|
|
2371
|
-
message:
|
|
2396
|
+
message: `Cannot remove custom field ${name} because it does not exist.`
|
|
2372
2397
|
},
|
|
2373
2398
|
400
|
|
2374
2399
|
);
|
|
@@ -2548,15 +2573,11 @@ var CategoryUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
2548
2573
|
return;
|
|
2549
2574
|
}
|
|
2550
2575
|
if (assetId) {
|
|
2551
|
-
resource.assets = resource.assets.filter(
|
|
2552
|
-
return obj.id !== assetId;
|
|
2553
|
-
});
|
|
2576
|
+
resource.assets = resource.assets.filter((obj) => obj.id !== assetId);
|
|
2554
2577
|
return;
|
|
2555
2578
|
}
|
|
2556
2579
|
if (assetKey) {
|
|
2557
|
-
resource.assets = resource.assets.filter(
|
|
2558
|
-
return obj.key !== assetKey;
|
|
2559
|
-
});
|
|
2580
|
+
resource.assets = resource.assets.filter((obj) => obj.key !== assetKey);
|
|
2560
2581
|
return;
|
|
2561
2582
|
}
|
|
2562
2583
|
}
|
|
@@ -2779,26 +2800,25 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
|
|
|
2779
2800
|
return updated;
|
|
2780
2801
|
}
|
|
2781
2802
|
return current;
|
|
2782
|
-
} else {
|
|
2783
|
-
if (draft.version) {
|
|
2784
|
-
throw new CommercetoolsError(
|
|
2785
|
-
{
|
|
2786
|
-
code: "InvalidOperation",
|
|
2787
|
-
message: "version on create must be 0"
|
|
2788
|
-
},
|
|
2789
|
-
400
|
|
2790
|
-
);
|
|
2791
|
-
}
|
|
2792
|
-
const baseProperties = getBaseResourceProperties();
|
|
2793
|
-
const resource = {
|
|
2794
|
-
...baseProperties,
|
|
2795
|
-
container: draft.container,
|
|
2796
|
-
key: draft.key,
|
|
2797
|
-
value: draft.value
|
|
2798
|
-
};
|
|
2799
|
-
this.saveNew(context, resource);
|
|
2800
|
-
return resource;
|
|
2801
2803
|
}
|
|
2804
|
+
if (draft.version) {
|
|
2805
|
+
throw new CommercetoolsError(
|
|
2806
|
+
{
|
|
2807
|
+
code: "InvalidOperation",
|
|
2808
|
+
message: "version on create must be 0"
|
|
2809
|
+
},
|
|
2810
|
+
400
|
|
2811
|
+
);
|
|
2812
|
+
}
|
|
2813
|
+
const baseProperties = getBaseResourceProperties();
|
|
2814
|
+
const resource = {
|
|
2815
|
+
...baseProperties,
|
|
2816
|
+
container: draft.container,
|
|
2817
|
+
key: draft.key,
|
|
2818
|
+
value: draft.value
|
|
2819
|
+
};
|
|
2820
|
+
this.saveNew(context, resource);
|
|
2821
|
+
return resource;
|
|
2802
2822
|
}
|
|
2803
2823
|
getWithContainerAndKey(context, container, key) {
|
|
2804
2824
|
const items = this._storage.all(context.projectKey, this.getTypeId());
|
|
@@ -2823,7 +2843,7 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
|
|
|
2823
2843
|
};
|
|
2824
2844
|
|
|
2825
2845
|
// src/repositories/customer/actions.ts
|
|
2826
|
-
import assert2 from "
|
|
2846
|
+
import assert2 from "assert";
|
|
2827
2847
|
var CustomerUpdateHandler = class extends AbstractUpdateHandler {
|
|
2828
2848
|
addAddress(_context, resource, { address }) {
|
|
2829
2849
|
resource.addresses.push({
|
|
@@ -2937,7 +2957,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
2937
2957
|
}
|
|
2938
2958
|
resource.authenticationMode = authMode;
|
|
2939
2959
|
if (authMode === "ExternalAuth") {
|
|
2940
|
-
|
|
2960
|
+
resource.password = void 0;
|
|
2941
2961
|
return;
|
|
2942
2962
|
}
|
|
2943
2963
|
if (authMode === "Password") {
|
|
@@ -3491,7 +3511,8 @@ var ExtensionRepository = class extends AbstractResourceRepository {
|
|
|
3491
3511
|
extension,
|
|
3492
3512
|
"destination.authentication.headerValue"
|
|
3493
3513
|
);
|
|
3494
|
-
}
|
|
3514
|
+
}
|
|
3515
|
+
if (extension.destination.type === "AWSLambda") {
|
|
3495
3516
|
return maskSecretValue(resource, "destination.accessSecret");
|
|
3496
3517
|
}
|
|
3497
3518
|
}
|
|
@@ -3966,16 +3987,19 @@ function toRegExp(str) {
|
|
|
3966
3987
|
return new RegExp(str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"));
|
|
3967
3988
|
}
|
|
3968
3989
|
function normalize(regex) {
|
|
3969
|
-
if (typeof regex === "string")
|
|
3990
|
+
if (typeof regex === "string")
|
|
3991
|
+
regex = toRegExp(regex);
|
|
3970
3992
|
if (!regex.source.startsWith("^"))
|
|
3971
3993
|
return new RegExp(`^${regex.source}`, regex.flags);
|
|
3972
|
-
else
|
|
3994
|
+
else
|
|
3995
|
+
return regex;
|
|
3973
3996
|
}
|
|
3974
3997
|
function first(arr, predicate) {
|
|
3975
3998
|
let i = 0;
|
|
3976
3999
|
for (const item of arr) {
|
|
3977
4000
|
const result = predicate(item, i++);
|
|
3978
|
-
if (result)
|
|
4001
|
+
if (result)
|
|
4002
|
+
return { item, result };
|
|
3979
4003
|
}
|
|
3980
4004
|
}
|
|
3981
4005
|
var TokenTypes = class {
|
|
@@ -4139,7 +4163,8 @@ var Lexer = class {
|
|
|
4139
4163
|
*/
|
|
4140
4164
|
peek(position = this._state.position) {
|
|
4141
4165
|
const read = (i = position) => {
|
|
4142
|
-
if (i >= this._state.source.length)
|
|
4166
|
+
if (i >= this._state.source.length)
|
|
4167
|
+
return EOF(this);
|
|
4143
4168
|
const n = this._tokenTypes.peek(this._state.source, i);
|
|
4144
4169
|
if (!n || !n.result) {
|
|
4145
4170
|
throw new Error(
|
|
@@ -4159,7 +4184,8 @@ var Lexer = class {
|
|
|
4159
4184
|
) : null;
|
|
4160
4185
|
};
|
|
4161
4186
|
const t = read();
|
|
4162
|
-
if (t)
|
|
4187
|
+
if (t)
|
|
4188
|
+
return t;
|
|
4163
4189
|
let unexpected = this._state.source.substring(position, position + 1);
|
|
4164
4190
|
try {
|
|
4165
4191
|
this.peek(position + 1);
|
|
@@ -4181,7 +4207,8 @@ var Lexer = class {
|
|
|
4181
4207
|
*/
|
|
4182
4208
|
strpos(i) {
|
|
4183
4209
|
let lines = this._state.source.substring(0, i).split(/\r?\n/);
|
|
4184
|
-
if (!Array.isArray(lines))
|
|
4210
|
+
if (!Array.isArray(lines))
|
|
4211
|
+
lines = [lines];
|
|
4185
4212
|
const line = lines.length;
|
|
4186
4213
|
const column = lines[lines.length - 1].length + 1;
|
|
4187
4214
|
return { line, column };
|
|
@@ -4280,7 +4307,8 @@ var Parser = class {
|
|
|
4280
4307
|
* @returns {number} The binding power of the specified token type
|
|
4281
4308
|
*/
|
|
4282
4309
|
bp(tokenOrType) {
|
|
4283
|
-
if (tokenOrType == null)
|
|
4310
|
+
if (tokenOrType == null)
|
|
4311
|
+
return Number.NEGATIVE_INFINITY;
|
|
4284
4312
|
if (tokenOrType && typeof tokenOrType.isEof == "function" && tokenOrType.isEof())
|
|
4285
4313
|
return Number.NEGATIVE_INFINITY;
|
|
4286
4314
|
const type = this._type(tokenOrType);
|
|
@@ -4325,21 +4353,27 @@ var Parser = class {
|
|
|
4325
4353
|
parse(opts = { terminals: [0] }) {
|
|
4326
4354
|
const stop = opts.stop = opts.stop || createStop();
|
|
4327
4355
|
const check = () => {
|
|
4328
|
-
if (stop.isStopped())
|
|
4356
|
+
if (stop.isStopped())
|
|
4357
|
+
return false;
|
|
4329
4358
|
const t = this.lexer.peek();
|
|
4330
4359
|
const bp = this.bp(t);
|
|
4331
4360
|
return opts.terminals.reduce((canContinue, rbpOrType) => {
|
|
4332
|
-
if (!canContinue)
|
|
4333
|
-
|
|
4334
|
-
if (typeof rbpOrType == "
|
|
4361
|
+
if (!canContinue)
|
|
4362
|
+
return false;
|
|
4363
|
+
if (typeof rbpOrType == "number")
|
|
4364
|
+
return rbpOrType < bp;
|
|
4365
|
+
if (typeof rbpOrType == "string")
|
|
4366
|
+
return t.type != rbpOrType;
|
|
4335
4367
|
}, true);
|
|
4336
4368
|
};
|
|
4337
4369
|
const mkinfo = (token) => {
|
|
4338
4370
|
const bp = this.bp(token);
|
|
4339
4371
|
return { token, bp, stop, ctx: opts.ctx, options: opts };
|
|
4340
4372
|
};
|
|
4341
|
-
if (!opts.terminals)
|
|
4342
|
-
|
|
4373
|
+
if (!opts.terminals)
|
|
4374
|
+
opts.terminals = [0];
|
|
4375
|
+
if (opts.terminals.length == 0)
|
|
4376
|
+
opts.terminals.push(0);
|
|
4343
4377
|
let left = this.nud(mkinfo(this.lexer.next()));
|
|
4344
4378
|
while (check()) {
|
|
4345
4379
|
const operator = this.lexer.next();
|
|
@@ -4471,7 +4505,7 @@ var parseFilter = (filter) => {
|
|
|
4471
4505
|
(t) => ({
|
|
4472
4506
|
type: "Symbol",
|
|
4473
4507
|
kind: "int",
|
|
4474
|
-
value: parseInt(t.token.match, 10)
|
|
4508
|
+
value: Number.parseInt(t.token.match, 10)
|
|
4475
4509
|
})
|
|
4476
4510
|
).nud("STAR", 5, (_) => ({
|
|
4477
4511
|
type: "Symbol",
|
|
@@ -4495,9 +4529,8 @@ var parseFilter = (filter) => {
|
|
|
4495
4529
|
const expr = parser.parse({ terminals: [bp - 1] });
|
|
4496
4530
|
if (Array.isArray(expr)) {
|
|
4497
4531
|
return [left, ...expr];
|
|
4498
|
-
} else {
|
|
4499
|
-
return [left, expr];
|
|
4500
4532
|
}
|
|
4533
|
+
return [left, expr];
|
|
4501
4534
|
}).nud("(", 100, (t) => {
|
|
4502
4535
|
const expr = parser.parse({ terminals: [")"] });
|
|
4503
4536
|
lexer.expect(")");
|
|
@@ -4543,7 +4576,8 @@ var generateMatchFunc = (filter) => {
|
|
|
4543
4576
|
throw new Error(`Syntax error while parsing '${filter}'.`);
|
|
4544
4577
|
}
|
|
4545
4578
|
return (obj) => {
|
|
4546
|
-
if (!result.children)
|
|
4579
|
+
if (!result.children)
|
|
4580
|
+
return false;
|
|
4547
4581
|
return result.children.some((c) => c.match(obj));
|
|
4548
4582
|
};
|
|
4549
4583
|
};
|
|
@@ -4649,6 +4683,12 @@ var parseSearchQuery = (searchQuery) => {
|
|
|
4649
4683
|
return generateFieldMatchFunc(generateRangeMatchFunc, searchQuery.range);
|
|
4650
4684
|
}
|
|
4651
4685
|
if (isSearchExactExpression(searchQuery)) {
|
|
4686
|
+
if (Array.isArray(searchQuery.exact.values)) {
|
|
4687
|
+
return generateFieldMatchFunc(
|
|
4688
|
+
(value) => (searchQuery.exact.values ?? []).includes(value),
|
|
4689
|
+
searchQuery.exact
|
|
4690
|
+
);
|
|
4691
|
+
}
|
|
4652
4692
|
return generateFieldMatchFunc(
|
|
4653
4693
|
(value) => value === searchQuery.exact.value,
|
|
4654
4694
|
searchQuery.exact
|
|
@@ -4854,8 +4894,23 @@ var ProductSearch = class {
|
|
|
4854
4894
|
this._storage = config.storage;
|
|
4855
4895
|
}
|
|
4856
4896
|
search(projectKey, params) {
|
|
4857
|
-
|
|
4858
|
-
|
|
4897
|
+
const availabilityBySku = this._storage.all(projectKey, "inventory-entry").reduce((acc, entry) => {
|
|
4898
|
+
const existingEntry = acc.get(entry.sku);
|
|
4899
|
+
acc.set(entry.sku, {
|
|
4900
|
+
isOnStock: existingEntry?.isOnStock || entry.quantityOnStock > 0,
|
|
4901
|
+
availableQuantity: existingEntry?.availableQuantity ?? 0 + entry.quantityOnStock,
|
|
4902
|
+
// NOTE: This doesn't handle inventory entries for multiple channels,
|
|
4903
|
+
// so it doesn't exactly replicate the behavior of the commercetools api.
|
|
4904
|
+
isOnStockForChannel: existingEntry?.isOnStockForChannel ?? entry.supplyChannel?.id
|
|
4905
|
+
});
|
|
4906
|
+
return acc;
|
|
4907
|
+
}, /* @__PURE__ */ new Map());
|
|
4908
|
+
let productResources = this._storage.all(projectKey, "product").map(
|
|
4909
|
+
(r) => this.transformProduct(
|
|
4910
|
+
r,
|
|
4911
|
+
params.productProjectionParameters?.staged ?? false,
|
|
4912
|
+
availabilityBySku
|
|
4913
|
+
)
|
|
4859
4914
|
).filter((p) => {
|
|
4860
4915
|
if (!(params.productProjectionParameters?.staged ?? false)) {
|
|
4861
4916
|
return p.published;
|
|
@@ -4867,7 +4922,7 @@ var ProductSearch = class {
|
|
|
4867
4922
|
try {
|
|
4868
4923
|
validateSearchQuery(params.query);
|
|
4869
4924
|
const matchFunc = parseSearchQuery(params.query);
|
|
4870
|
-
|
|
4925
|
+
productResources = productResources.filter(
|
|
4871
4926
|
(resource) => matchFunc(resource, markMatchingVariant)
|
|
4872
4927
|
);
|
|
4873
4928
|
} catch (err) {
|
|
@@ -4882,7 +4937,7 @@ var ProductSearch = class {
|
|
|
4882
4937
|
}
|
|
4883
4938
|
}
|
|
4884
4939
|
if (params.productProjectionParameters) {
|
|
4885
|
-
applyPriceSelector(
|
|
4940
|
+
applyPriceSelector(productResources, {
|
|
4886
4941
|
country: params.productProjectionParameters.priceCountry,
|
|
4887
4942
|
channel: params.productProjectionParameters.priceChannel,
|
|
4888
4943
|
customerGroup: params.productProjectionParameters.priceCustomerGroup,
|
|
@@ -4891,7 +4946,10 @@ var ProductSearch = class {
|
|
|
4891
4946
|
}
|
|
4892
4947
|
const offset = params.offset || 0;
|
|
4893
4948
|
const limit = params.limit || 20;
|
|
4894
|
-
const productProjectionsResult =
|
|
4949
|
+
const productProjectionsResult = productResources.slice(
|
|
4950
|
+
offset,
|
|
4951
|
+
offset + limit
|
|
4952
|
+
);
|
|
4895
4953
|
const productProjectionsParameterGiven = !!params?.productProjectionParameters;
|
|
4896
4954
|
const results = productProjectionsResult.map(
|
|
4897
4955
|
(product) => ({
|
|
@@ -4904,14 +4962,14 @@ var ProductSearch = class {
|
|
|
4904
4962
|
})
|
|
4905
4963
|
);
|
|
4906
4964
|
return {
|
|
4907
|
-
total:
|
|
4965
|
+
total: productResources.length,
|
|
4908
4966
|
offset,
|
|
4909
4967
|
limit,
|
|
4910
4968
|
results,
|
|
4911
4969
|
facets: []
|
|
4912
4970
|
};
|
|
4913
4971
|
}
|
|
4914
|
-
|
|
4972
|
+
transformProduct(product, staged, availabilityBySku) {
|
|
4915
4973
|
const obj = !staged ? product.masterData.current : product.masterData.staged;
|
|
4916
4974
|
return {
|
|
4917
4975
|
id: product.id,
|
|
@@ -4925,7 +4983,10 @@ var ProductSearch = class {
|
|
|
4925
4983
|
slug: obj.slug,
|
|
4926
4984
|
categories: obj.categories,
|
|
4927
4985
|
masterVariant: obj.masterVariant,
|
|
4928
|
-
variants: obj.variants
|
|
4986
|
+
variants: obj.variants.map((variant) => ({
|
|
4987
|
+
...variant,
|
|
4988
|
+
availability: variant.sku ? availabilityBySku.get(variant.sku) : { isOnStock: false, availableQuantity: 0, isOnStockForChannel: [] }
|
|
4989
|
+
})),
|
|
4929
4990
|
productType: product.productType,
|
|
4930
4991
|
hasStagedChanges: product.masterData.hasStagedChanges,
|
|
4931
4992
|
published: product.masterData.published
|
|
@@ -5246,7 +5307,7 @@ var ProductUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
5246
5307
|
}
|
|
5247
5308
|
if (position >= variantImages.length) {
|
|
5248
5309
|
throw new Error(
|
|
5249
|
-
|
|
5310
|
+
"Invalid position given. Position in images where the image should be moved. Must be between 0 and the total number of images minus 1."
|
|
5250
5311
|
);
|
|
5251
5312
|
}
|
|
5252
5313
|
variant.images = variantImages.filter((image) => image.url !== imageUrl);
|
|
@@ -5879,9 +5940,8 @@ var parseQueryExpression = (predicate) => {
|
|
|
5879
5940
|
if (Array.isArray(predicate)) {
|
|
5880
5941
|
const callbacks = predicate.map((item) => generateMatchFunc2(item));
|
|
5881
5942
|
return (target, variables) => callbacks.every((callback) => callback(target, variables));
|
|
5882
|
-
} else {
|
|
5883
|
-
return generateMatchFunc2(predicate);
|
|
5884
5943
|
}
|
|
5944
|
+
return generateMatchFunc2(predicate);
|
|
5885
5945
|
};
|
|
5886
5946
|
var validateSymbol = (val) => {
|
|
5887
5947
|
if (!val.type) {
|
|
@@ -5917,7 +5977,10 @@ var resolveValue = (obj, val) => {
|
|
|
5917
5977
|
}
|
|
5918
5978
|
return obj[val.value];
|
|
5919
5979
|
};
|
|
5920
|
-
var getLexer2 = (value) => new Lexer(value).token("AND", /and(?![-_a-z0-9]+)/i).token("OR", /or(?![-_a-z0-9]+)/i).token("NOT", /not(?![-_a-z0-9]+)/i).token("WITHIN", /within(?![-_a-z0-9]+)/i).token("IN", /in(?![-_a-z0-9]+)/i).token("MATCHES_IGNORE_CASE", /matches\s+ignore\s+case(?![-_a-z0-9]+)/i).token("CONTAINS", /contains(?![-_a-z0-9]+)/i).token("ALL", /all(?![-_a-z0-9]+)/i).token("ANY", /any(?![-_a-z0-9]+)/i).token("EMPTY", /empty(?![-_a-z0-9]+)/i).token("IS", /is(?![-_a-z0-9]+)/i).token("DEFINED", /defined(?![-_a-z0-9]+)/i).token(
|
|
5980
|
+
var getLexer2 = (value) => new Lexer(value).token("AND", /and(?![-_a-z0-9]+)/i).token("OR", /or(?![-_a-z0-9]+)/i).token("NOT", /not(?![-_a-z0-9]+)/i).token("WITHIN", /within(?![-_a-z0-9]+)/i).token("IN", /in(?![-_a-z0-9]+)/i).token("MATCHES_IGNORE_CASE", /matches\s+ignore\s+case(?![-_a-z0-9]+)/i).token("CONTAINS", /contains(?![-_a-z0-9]+)/i).token("ALL", /all(?![-_a-z0-9]+)/i).token("ANY", /any(?![-_a-z0-9]+)/i).token("EMPTY", /empty(?![-_a-z0-9]+)/i).token("IS", /is(?![-_a-z0-9]+)/i).token("DEFINED", /defined(?![-_a-z0-9]+)/i).token(
|
|
5981
|
+
"IDENTIFIER",
|
|
5982
|
+
/[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}/
|
|
5983
|
+
).token("FLOAT", /\d+\.\d+/).token("INT", /\d+/).token("VARIABLE", /:([-_A-Za-z0-9]+)/).token("BOOLEAN", /(true|false)/).token("IDENTIFIER", /[-_A-Za-z0-9]+/).token("STRING", /"((?:\\.|[^"\\])*)"/).token("STRING", /'((?:\\.|[^'\\])*)'/).token("COMMA", ",").token("(", "(").token(")", ")").token(">=", ">=").token("<=", "<=").token(">", ">").token("<", "<").token("!=", "!=").token("=", "=").token('"', '"').token("WS", /\s+/, true);
|
|
5921
5984
|
var generateMatchFunc2 = (predicate) => {
|
|
5922
5985
|
const lexer = getLexer2(predicate);
|
|
5923
5986
|
const parser = new Parser(lexer).builder().nud(
|
|
@@ -5933,7 +5996,7 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
5933
5996
|
1,
|
|
5934
5997
|
(t) => ({
|
|
5935
5998
|
type: "boolean",
|
|
5936
|
-
value: t.token.match === "true"
|
|
5999
|
+
value: t.token.match === "true",
|
|
5937
6000
|
pos: t.token.strpos()
|
|
5938
6001
|
})
|
|
5939
6002
|
).nud(
|
|
@@ -5959,7 +6022,7 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
5959
6022
|
1,
|
|
5960
6023
|
(t) => ({
|
|
5961
6024
|
type: "int",
|
|
5962
|
-
value: parseInt(t.token.match, 10),
|
|
6025
|
+
value: Number.parseInt(t.token.match, 10),
|
|
5963
6026
|
pos: t.token.strpos()
|
|
5964
6027
|
})
|
|
5965
6028
|
).nud(
|
|
@@ -5967,7 +6030,7 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
5967
6030
|
1,
|
|
5968
6031
|
(t) => ({
|
|
5969
6032
|
type: "float",
|
|
5970
|
-
value: parseFloat(t.token.match),
|
|
6033
|
+
value: Number.parseFloat(t.token.match),
|
|
5971
6034
|
pos: t.token.strpos()
|
|
5972
6035
|
})
|
|
5973
6036
|
).nud("NOT", 100, ({ bp }) => {
|
|
@@ -5983,9 +6046,8 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
5983
6046
|
const expr = parser.parse({ terminals: [bp - 1] });
|
|
5984
6047
|
if (Array.isArray(expr)) {
|
|
5985
6048
|
return [left, ...expr];
|
|
5986
|
-
} else {
|
|
5987
|
-
return [left, expr];
|
|
5988
6049
|
}
|
|
6050
|
+
return [left, expr];
|
|
5989
6051
|
}).nud("(", 100, (t) => {
|
|
5990
6052
|
const expr = parser.parse({ terminals: [")"] });
|
|
5991
6053
|
return expr;
|
|
@@ -5995,22 +6057,21 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
5995
6057
|
return (obj, vars) => {
|
|
5996
6058
|
if (Array.isArray(obj)) {
|
|
5997
6059
|
return obj.some((item) => {
|
|
5998
|
-
const
|
|
5999
|
-
if (
|
|
6000
|
-
return expr(
|
|
6060
|
+
const value2 = resolveValue(item, left);
|
|
6061
|
+
if (value2) {
|
|
6062
|
+
return expr(value2, vars);
|
|
6001
6063
|
}
|
|
6002
6064
|
return false;
|
|
6003
6065
|
});
|
|
6004
|
-
}
|
|
6005
|
-
|
|
6006
|
-
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
}
|
|
6010
|
-
return expr(value, vars);
|
|
6066
|
+
}
|
|
6067
|
+
const value = resolveValue(obj, left);
|
|
6068
|
+
if (value) {
|
|
6069
|
+
if (Array.isArray(value)) {
|
|
6070
|
+
return value.some((item) => expr(item, vars));
|
|
6011
6071
|
}
|
|
6012
|
-
return
|
|
6072
|
+
return expr(value, vars);
|
|
6013
6073
|
}
|
|
6074
|
+
return false;
|
|
6014
6075
|
};
|
|
6015
6076
|
}).bp(")", 0).led("=", 20, ({ left, bp }) => {
|
|
6016
6077
|
const expr = parser.parse({ terminals: [bp - 1] });
|
|
@@ -6025,14 +6086,13 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
6025
6086
|
}
|
|
6026
6087
|
return value === other;
|
|
6027
6088
|
});
|
|
6028
|
-
} else {
|
|
6029
|
-
const resolvedValue = resolveValue(obj, left);
|
|
6030
|
-
const resolvedSymbol = resolveSymbol(expr, vars);
|
|
6031
|
-
if (Array.isArray(resolvedValue)) {
|
|
6032
|
-
return !!resolvedValue.some((elem) => elem === resolvedSymbol);
|
|
6033
|
-
}
|
|
6034
|
-
return resolvedValue === resolvedSymbol;
|
|
6035
6089
|
}
|
|
6090
|
+
const resolvedValue = resolveValue(obj, left);
|
|
6091
|
+
const resolvedSymbol = resolveSymbol(expr, vars);
|
|
6092
|
+
if (Array.isArray(resolvedValue)) {
|
|
6093
|
+
return !!resolvedValue.some((elem) => elem === resolvedSymbol);
|
|
6094
|
+
}
|
|
6095
|
+
return resolvedValue === resolvedSymbol;
|
|
6036
6096
|
};
|
|
6037
6097
|
}).led("!=", 20, ({ left, bp }) => {
|
|
6038
6098
|
const expr = parser.parse({ terminals: [bp - 1] });
|
|
@@ -6069,12 +6129,11 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
6069
6129
|
const val = resolveValue(obj, left);
|
|
6070
6130
|
return val.length === 0;
|
|
6071
6131
|
};
|
|
6072
|
-
} else {
|
|
6073
|
-
return (obj, vars) => {
|
|
6074
|
-
const val = resolveValue(obj, left);
|
|
6075
|
-
return val.length !== 0;
|
|
6076
|
-
};
|
|
6077
6132
|
}
|
|
6133
|
+
return (obj, vars) => {
|
|
6134
|
+
const val = resolveValue(obj, left);
|
|
6135
|
+
return val.length !== 0;
|
|
6136
|
+
};
|
|
6078
6137
|
}
|
|
6079
6138
|
case "defined": {
|
|
6080
6139
|
if (!invert) {
|
|
@@ -6082,12 +6141,11 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
6082
6141
|
const val = resolveValue(obj, left);
|
|
6083
6142
|
return val !== void 0;
|
|
6084
6143
|
};
|
|
6085
|
-
} else {
|
|
6086
|
-
return (obj, vars) => {
|
|
6087
|
-
const val = resolveValue(obj, left);
|
|
6088
|
-
return val === void 0;
|
|
6089
|
-
};
|
|
6090
6144
|
}
|
|
6145
|
+
return (obj, vars) => {
|
|
6146
|
+
const val = resolveValue(obj, left);
|
|
6147
|
+
return val === void 0;
|
|
6148
|
+
};
|
|
6091
6149
|
}
|
|
6092
6150
|
default: {
|
|
6093
6151
|
throw new Error("Unexpected");
|
|
@@ -6130,7 +6188,8 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
6130
6188
|
const expr = parser.parse({ terminals: [")"] });
|
|
6131
6189
|
return (obj, vars) => {
|
|
6132
6190
|
const value = resolveValue(obj, left);
|
|
6133
|
-
if (!value)
|
|
6191
|
+
if (!value)
|
|
6192
|
+
return false;
|
|
6134
6193
|
const maxDistance = resolveSymbol(expr[2], vars);
|
|
6135
6194
|
const distance = haversineDistance(
|
|
6136
6195
|
{
|
|
@@ -6160,9 +6219,8 @@ var generateMatchFunc2 = (predicate) => {
|
|
|
6160
6219
|
const array = expr.map((item) => resolveSymbol(item, vars));
|
|
6161
6220
|
if (keyword.type === "ALL") {
|
|
6162
6221
|
return array.every((item) => value.includes(item));
|
|
6163
|
-
} else {
|
|
6164
|
-
return array.some((item) => value.includes(item));
|
|
6165
6222
|
}
|
|
6223
|
+
return array.some((item) => value.includes(item));
|
|
6166
6224
|
};
|
|
6167
6225
|
}).build();
|
|
6168
6226
|
const result = parser.parse();
|
|
@@ -6269,7 +6327,8 @@ var ProductProjectionSearch = class {
|
|
|
6269
6327
|
};
|
|
6270
6328
|
}
|
|
6271
6329
|
getFacets(params, products) {
|
|
6272
|
-
if (!params.facet)
|
|
6330
|
+
if (!params.facet)
|
|
6331
|
+
return {};
|
|
6273
6332
|
const result = {};
|
|
6274
6333
|
const regexp = new RegExp(/ counting products$/);
|
|
6275
6334
|
for (let facet of params.facet) {
|
|
@@ -6403,9 +6462,8 @@ var ProductProjectionSearch = class {
|
|
|
6403
6462
|
max: numValues > 0 ? Math.max(...values) : 0,
|
|
6404
6463
|
mean: numValues > 0 ? mean(values) : 0
|
|
6405
6464
|
};
|
|
6406
|
-
} else {
|
|
6407
|
-
throw new Error("not supported");
|
|
6408
6465
|
}
|
|
6466
|
+
throw new Error("not supported");
|
|
6409
6467
|
}) || [];
|
|
6410
6468
|
const data = {
|
|
6411
6469
|
type: "range",
|
|
@@ -6752,23 +6810,289 @@ var ProjectUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
6752
6810
|
}
|
|
6753
6811
|
};
|
|
6754
6812
|
|
|
6755
|
-
// src/repositories/quote.ts
|
|
6813
|
+
// src/repositories/quote/actions.ts
|
|
6814
|
+
var QuoteUpdateHandler = class extends AbstractUpdateHandler {
|
|
6815
|
+
setCustomField(context, resource, { name, value }) {
|
|
6816
|
+
if (!resource.custom) {
|
|
6817
|
+
throw new Error("Resource has no custom field");
|
|
6818
|
+
}
|
|
6819
|
+
resource.custom.fields[name] = value;
|
|
6820
|
+
}
|
|
6821
|
+
setCustomType(context, resource, { type, fields }) {
|
|
6822
|
+
if (!type) {
|
|
6823
|
+
resource.custom = void 0;
|
|
6824
|
+
} else {
|
|
6825
|
+
const resolvedType = this._storage.getByResourceIdentifier(
|
|
6826
|
+
context.projectKey,
|
|
6827
|
+
type
|
|
6828
|
+
);
|
|
6829
|
+
if (!resolvedType) {
|
|
6830
|
+
throw new Error(`Type ${type} not found`);
|
|
6831
|
+
}
|
|
6832
|
+
resource.custom = {
|
|
6833
|
+
type: {
|
|
6834
|
+
typeId: "type",
|
|
6835
|
+
id: resolvedType.id
|
|
6836
|
+
},
|
|
6837
|
+
fields: fields || {}
|
|
6838
|
+
};
|
|
6839
|
+
}
|
|
6840
|
+
}
|
|
6841
|
+
transitionState(context, resource, { state, force }) {
|
|
6842
|
+
let stateReference = void 0;
|
|
6843
|
+
if (state) {
|
|
6844
|
+
stateReference = getReferenceFromResourceIdentifier(
|
|
6845
|
+
state,
|
|
6846
|
+
context.projectKey,
|
|
6847
|
+
this._storage
|
|
6848
|
+
);
|
|
6849
|
+
resource.state = stateReference;
|
|
6850
|
+
} else {
|
|
6851
|
+
throw new CommercetoolsError(
|
|
6852
|
+
{
|
|
6853
|
+
code: "InvalidJsonInput",
|
|
6854
|
+
message: "Request body does not contain valid JSON.",
|
|
6855
|
+
detailedErrorMessage: "actions -> state: Missing required value"
|
|
6856
|
+
},
|
|
6857
|
+
400
|
|
6858
|
+
);
|
|
6859
|
+
}
|
|
6860
|
+
return resource;
|
|
6861
|
+
}
|
|
6862
|
+
};
|
|
6863
|
+
|
|
6864
|
+
// src/repositories/quote/index.ts
|
|
6756
6865
|
var QuoteRepository = class extends AbstractResourceRepository {
|
|
6757
6866
|
constructor(config) {
|
|
6758
6867
|
super("quote", config);
|
|
6868
|
+
this.actions = new QuoteUpdateHandler(config.storage);
|
|
6759
6869
|
}
|
|
6760
6870
|
create(context, draft) {
|
|
6761
|
-
|
|
6871
|
+
const staged = this._storage.getByResourceIdentifier(
|
|
6872
|
+
context.projectKey,
|
|
6873
|
+
draft.stagedQuote
|
|
6874
|
+
);
|
|
6875
|
+
const cart = this._storage.getByResourceIdentifier(
|
|
6876
|
+
context.projectKey,
|
|
6877
|
+
staged.quotationCart
|
|
6878
|
+
);
|
|
6879
|
+
if (!cart.customerId) {
|
|
6880
|
+
throw new Error("Cart does not have a customer");
|
|
6881
|
+
}
|
|
6882
|
+
const resource = {
|
|
6883
|
+
...getBaseResourceProperties(),
|
|
6884
|
+
quoteState: "Accepted",
|
|
6885
|
+
quoteRequest: staged.quoteRequest,
|
|
6886
|
+
lineItems: cart.lineItems,
|
|
6887
|
+
customLineItems: cart.customLineItems,
|
|
6888
|
+
customer: {
|
|
6889
|
+
typeId: "customer",
|
|
6890
|
+
id: cart.customerId
|
|
6891
|
+
},
|
|
6892
|
+
stagedQuote: {
|
|
6893
|
+
typeId: "staged-quote",
|
|
6894
|
+
id: staged.id
|
|
6895
|
+
},
|
|
6896
|
+
totalPrice: cart.totalPrice,
|
|
6897
|
+
taxedPrice: cart.taxedPrice,
|
|
6898
|
+
taxMode: cart.taxMode,
|
|
6899
|
+
taxRoundingMode: cart.taxRoundingMode,
|
|
6900
|
+
taxCalculationMode: cart.taxCalculationMode,
|
|
6901
|
+
billingAddress: cart.billingAddress,
|
|
6902
|
+
shippingAddress: cart.shippingAddress
|
|
6903
|
+
};
|
|
6904
|
+
return resource;
|
|
6905
|
+
}
|
|
6906
|
+
};
|
|
6907
|
+
|
|
6908
|
+
// src/repositories/quote-request/index.ts
|
|
6909
|
+
import assert4 from "assert";
|
|
6910
|
+
|
|
6911
|
+
// src/repositories/quote-request/actions.ts
|
|
6912
|
+
var QuoteRequestUpdateHandler = class extends AbstractUpdateHandler {
|
|
6913
|
+
setCustomField(context, resource, { name, value }) {
|
|
6914
|
+
if (!resource.custom) {
|
|
6915
|
+
throw new Error("Resource has no custom field");
|
|
6916
|
+
}
|
|
6917
|
+
resource.custom.fields[name] = value;
|
|
6918
|
+
}
|
|
6919
|
+
setCustomType(context, resource, { type, fields }) {
|
|
6920
|
+
if (!type) {
|
|
6921
|
+
resource.custom = void 0;
|
|
6922
|
+
} else {
|
|
6923
|
+
const resolvedType = this._storage.getByResourceIdentifier(
|
|
6924
|
+
context.projectKey,
|
|
6925
|
+
type
|
|
6926
|
+
);
|
|
6927
|
+
if (!resolvedType) {
|
|
6928
|
+
throw new Error(`Type ${type} not found`);
|
|
6929
|
+
}
|
|
6930
|
+
resource.custom = {
|
|
6931
|
+
type: {
|
|
6932
|
+
typeId: "type",
|
|
6933
|
+
id: resolvedType.id
|
|
6934
|
+
},
|
|
6935
|
+
fields: fields || {}
|
|
6936
|
+
};
|
|
6937
|
+
}
|
|
6938
|
+
}
|
|
6939
|
+
transitionState(context, resource, { state, force }) {
|
|
6940
|
+
let stateReference = void 0;
|
|
6941
|
+
if (state) {
|
|
6942
|
+
stateReference = getReferenceFromResourceIdentifier(
|
|
6943
|
+
state,
|
|
6944
|
+
context.projectKey,
|
|
6945
|
+
this._storage
|
|
6946
|
+
);
|
|
6947
|
+
resource.state = stateReference;
|
|
6948
|
+
} else {
|
|
6949
|
+
throw new CommercetoolsError(
|
|
6950
|
+
{
|
|
6951
|
+
code: "InvalidJsonInput",
|
|
6952
|
+
message: "Request body does not contain valid JSON.",
|
|
6953
|
+
detailedErrorMessage: "actions -> state: Missing required value"
|
|
6954
|
+
},
|
|
6955
|
+
400
|
|
6956
|
+
);
|
|
6957
|
+
}
|
|
6958
|
+
return resource;
|
|
6762
6959
|
}
|
|
6763
6960
|
};
|
|
6764
6961
|
|
|
6765
|
-
// src/repositories/quote-request.ts
|
|
6962
|
+
// src/repositories/quote-request/index.ts
|
|
6766
6963
|
var QuoteRequestRepository = class extends AbstractResourceRepository {
|
|
6767
6964
|
constructor(config) {
|
|
6768
6965
|
super("quote-request", config);
|
|
6966
|
+
this.actions = new QuoteRequestUpdateHandler(config.storage);
|
|
6967
|
+
}
|
|
6968
|
+
create(context, draft) {
|
|
6969
|
+
assert4(draft.cart, "draft.cart is missing");
|
|
6970
|
+
return this.createFromCart(context, {
|
|
6971
|
+
id: draft.cart.id,
|
|
6972
|
+
typeId: "cart"
|
|
6973
|
+
});
|
|
6974
|
+
}
|
|
6975
|
+
createFromCart(context, cartReference) {
|
|
6976
|
+
const cart = this._storage.getByResourceIdentifier(
|
|
6977
|
+
context.projectKey,
|
|
6978
|
+
cartReference
|
|
6979
|
+
);
|
|
6980
|
+
if (!cart) {
|
|
6981
|
+
throw new Error("Cannot find cart");
|
|
6982
|
+
}
|
|
6983
|
+
if (!cart.customerId) {
|
|
6984
|
+
throw new Error("Cart does not have a customer");
|
|
6985
|
+
}
|
|
6986
|
+
const resource = {
|
|
6987
|
+
...getBaseResourceProperties(),
|
|
6988
|
+
billingAddress: cart.billingAddress,
|
|
6989
|
+
cart: cartReference,
|
|
6990
|
+
country: cart.country,
|
|
6991
|
+
custom: cart.custom,
|
|
6992
|
+
customer: {
|
|
6993
|
+
typeId: "customer",
|
|
6994
|
+
id: cart.customerId
|
|
6995
|
+
},
|
|
6996
|
+
customerGroup: cart.customerGroup,
|
|
6997
|
+
customLineItems: [],
|
|
6998
|
+
directDiscounts: cart.directDiscounts,
|
|
6999
|
+
lineItems: cart.lineItems,
|
|
7000
|
+
paymentInfo: cart.paymentInfo,
|
|
7001
|
+
quoteRequestState: "Submitted",
|
|
7002
|
+
shippingAddress: cart.shippingAddress,
|
|
7003
|
+
taxCalculationMode: cart.taxCalculationMode,
|
|
7004
|
+
taxedPrice: cart.taxedPrice,
|
|
7005
|
+
taxMode: cart.taxMode,
|
|
7006
|
+
taxRoundingMode: cart.taxRoundingMode,
|
|
7007
|
+
totalPrice: cart.totalPrice,
|
|
7008
|
+
store: cart.store
|
|
7009
|
+
};
|
|
7010
|
+
return this.saveNew(context, resource);
|
|
7011
|
+
}
|
|
7012
|
+
};
|
|
7013
|
+
|
|
7014
|
+
// src/repositories/quote-staged/actions.ts
|
|
7015
|
+
var StagedQuoteUpdateHandler = class extends AbstractUpdateHandler {
|
|
7016
|
+
setCustomField(context, resource, { name, value }) {
|
|
7017
|
+
if (!resource.custom) {
|
|
7018
|
+
throw new Error("Resource has no custom field");
|
|
7019
|
+
}
|
|
7020
|
+
resource.custom.fields[name] = value;
|
|
7021
|
+
}
|
|
7022
|
+
setCustomType(context, resource, { type, fields }) {
|
|
7023
|
+
if (!type) {
|
|
7024
|
+
resource.custom = void 0;
|
|
7025
|
+
} else {
|
|
7026
|
+
const resolvedType = this._storage.getByResourceIdentifier(
|
|
7027
|
+
context.projectKey,
|
|
7028
|
+
type
|
|
7029
|
+
);
|
|
7030
|
+
if (!resolvedType) {
|
|
7031
|
+
throw new Error(`Type ${type} not found`);
|
|
7032
|
+
}
|
|
7033
|
+
resource.custom = {
|
|
7034
|
+
type: {
|
|
7035
|
+
typeId: "type",
|
|
7036
|
+
id: resolvedType.id
|
|
7037
|
+
},
|
|
7038
|
+
fields: fields || {}
|
|
7039
|
+
};
|
|
7040
|
+
}
|
|
7041
|
+
}
|
|
7042
|
+
transitionState(context, resource, { state, force }) {
|
|
7043
|
+
let stateReference = void 0;
|
|
7044
|
+
if (state) {
|
|
7045
|
+
stateReference = getReferenceFromResourceIdentifier(
|
|
7046
|
+
state,
|
|
7047
|
+
context.projectKey,
|
|
7048
|
+
this._storage
|
|
7049
|
+
);
|
|
7050
|
+
resource.state = stateReference;
|
|
7051
|
+
} else {
|
|
7052
|
+
throw new CommercetoolsError(
|
|
7053
|
+
{
|
|
7054
|
+
code: "InvalidJsonInput",
|
|
7055
|
+
message: "Request body does not contain valid JSON.",
|
|
7056
|
+
detailedErrorMessage: "actions -> state: Missing required value"
|
|
7057
|
+
},
|
|
7058
|
+
400
|
|
7059
|
+
);
|
|
7060
|
+
}
|
|
7061
|
+
return resource;
|
|
7062
|
+
}
|
|
7063
|
+
};
|
|
7064
|
+
|
|
7065
|
+
// src/repositories/quote-staged/index.ts
|
|
7066
|
+
var StagedQuoteRepository = class extends AbstractResourceRepository {
|
|
7067
|
+
constructor(config) {
|
|
7068
|
+
super("staged-quote", config);
|
|
7069
|
+
this.actions = new StagedQuoteUpdateHandler(config.storage);
|
|
6769
7070
|
}
|
|
6770
7071
|
create(context, draft) {
|
|
6771
|
-
|
|
7072
|
+
const quoteRequest = this._storage.getByResourceIdentifier(
|
|
7073
|
+
context.projectKey,
|
|
7074
|
+
draft.quoteRequest
|
|
7075
|
+
);
|
|
7076
|
+
if (!quoteRequest.cart) {
|
|
7077
|
+
throw new Error("Cannot find quote request");
|
|
7078
|
+
}
|
|
7079
|
+
const cart = this._storage.getByResourceIdentifier(
|
|
7080
|
+
context.projectKey,
|
|
7081
|
+
quoteRequest.cart
|
|
7082
|
+
);
|
|
7083
|
+
const resource = {
|
|
7084
|
+
...getBaseResourceProperties(),
|
|
7085
|
+
stagedQuoteState: "InProgress",
|
|
7086
|
+
quoteRequest: {
|
|
7087
|
+
typeId: "quote-request",
|
|
7088
|
+
id: quoteRequest.id
|
|
7089
|
+
},
|
|
7090
|
+
quotationCart: {
|
|
7091
|
+
typeId: "cart",
|
|
7092
|
+
id: cart.id
|
|
7093
|
+
}
|
|
7094
|
+
};
|
|
7095
|
+
return resource;
|
|
6772
7096
|
}
|
|
6773
7097
|
};
|
|
6774
7098
|
|
|
@@ -6778,7 +7102,8 @@ var ReviewRepository = class extends AbstractResourceRepository {
|
|
|
6778
7102
|
super("review", config);
|
|
6779
7103
|
}
|
|
6780
7104
|
create(context, draft) {
|
|
6781
|
-
if (!draft.target)
|
|
7105
|
+
if (!draft.target)
|
|
7106
|
+
throw new Error("Missing target");
|
|
6782
7107
|
const resource = {
|
|
6783
7108
|
...getBaseResourceProperties(),
|
|
6784
7109
|
locale: draft.locale,
|
|
@@ -7050,7 +7375,7 @@ var ShoppingListUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
7050
7375
|
} else {
|
|
7051
7376
|
throw new CommercetoolsError({
|
|
7052
7377
|
code: "General",
|
|
7053
|
-
message:
|
|
7378
|
+
message: "Either lineItemid or lineItemKey needs to be provided."
|
|
7054
7379
|
});
|
|
7055
7380
|
}
|
|
7056
7381
|
if (quantity === 0) {
|
|
@@ -7175,7 +7500,12 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
|
|
|
7175
7500
|
context.projectKey,
|
|
7176
7501
|
this._storage
|
|
7177
7502
|
) : void 0,
|
|
7178
|
-
store: draft.store ? getStoreKeyReference(draft.store, context.projectKey, this._storage) : void 0
|
|
7503
|
+
store: draft.store ? getStoreKeyReference(draft.store, context.projectKey, this._storage) : void 0,
|
|
7504
|
+
businessUnit: draft.businessUnit ? getBusinessUnitKeyReference(
|
|
7505
|
+
draft.businessUnit,
|
|
7506
|
+
context.projectKey,
|
|
7507
|
+
this._storage
|
|
7508
|
+
) : void 0
|
|
7179
7509
|
};
|
|
7180
7510
|
return this.saveNew(context, resource);
|
|
7181
7511
|
}
|
|
@@ -7230,21 +7560,11 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
|
|
|
7230
7560
|
return lineItem;
|
|
7231
7561
|
}
|
|
7232
7562
|
throw new Error(
|
|
7233
|
-
|
|
7563
|
+
"must provide either sku, productId or variantId for ShoppingListLineItem"
|
|
7234
7564
|
);
|
|
7235
7565
|
};
|
|
7236
7566
|
};
|
|
7237
7567
|
|
|
7238
|
-
// src/repositories/staged-quote.ts
|
|
7239
|
-
var StagedQuoteRepository = class extends AbstractResourceRepository {
|
|
7240
|
-
constructor(config) {
|
|
7241
|
-
super("staged-quote", config);
|
|
7242
|
-
}
|
|
7243
|
-
create(context, draft) {
|
|
7244
|
-
throw new Error("not implemented");
|
|
7245
|
-
}
|
|
7246
|
-
};
|
|
7247
|
-
|
|
7248
7568
|
// src/repositories/standalone-price.ts
|
|
7249
7569
|
var StandAlonePriceRepository = class extends AbstractResourceRepository {
|
|
7250
7570
|
constructor(config) {
|
|
@@ -7389,7 +7709,8 @@ var StoreRepository = class extends AbstractResourceRepository {
|
|
|
7389
7709
|
}
|
|
7390
7710
|
};
|
|
7391
7711
|
var transformChannels = (context, storage, channels) => {
|
|
7392
|
-
if (!channels)
|
|
7712
|
+
if (!channels)
|
|
7713
|
+
return [];
|
|
7393
7714
|
return channels.map(
|
|
7394
7715
|
(ref) => getReferenceFromResourceIdentifier(
|
|
7395
7716
|
ref,
|
|
@@ -7468,7 +7789,8 @@ var SubscriptionRepository = class extends AbstractResourceRepository {
|
|
|
7468
7789
|
},
|
|
7469
7790
|
key: draft.key,
|
|
7470
7791
|
messages: draft.messages || [],
|
|
7471
|
-
status: "Healthy"
|
|
7792
|
+
status: "Healthy",
|
|
7793
|
+
events: draft.events || []
|
|
7472
7794
|
};
|
|
7473
7795
|
return this.saveNew(context, resource);
|
|
7474
7796
|
}
|
|
@@ -7690,44 +8012,44 @@ var createRepositories = (config) => ({
|
|
|
7690
8012
|
"associate-role": new AssociateRoleRepository(config),
|
|
7691
8013
|
"attribute-group": new AttributeGroupRepository(config),
|
|
7692
8014
|
"business-unit": new BusinessUnitRepository(config),
|
|
7693
|
-
|
|
7694
|
-
|
|
8015
|
+
category: new CategoryRepository(config),
|
|
8016
|
+
cart: new CartRepository(config),
|
|
7695
8017
|
"cart-discount": new CartDiscountRepository(config),
|
|
7696
|
-
|
|
7697
|
-
|
|
8018
|
+
customer: new CustomerRepository(config),
|
|
8019
|
+
channel: new ChannelRepository(config),
|
|
7698
8020
|
"customer-group": new CustomerGroupRepository(config),
|
|
7699
8021
|
"discount-code": new DiscountCodeRepository(config),
|
|
7700
|
-
|
|
8022
|
+
extension: new ExtensionRepository(config),
|
|
7701
8023
|
"inventory-entry": new InventoryEntryRepository(config),
|
|
7702
8024
|
"key-value-document": new CustomObjectRepository(config),
|
|
7703
|
-
|
|
8025
|
+
order: new OrderRepository(config),
|
|
7704
8026
|
"order-edit": new OrderEditRepository(config),
|
|
7705
|
-
|
|
8027
|
+
payment: new PaymentRepository(config),
|
|
7706
8028
|
"my-cart": new CartRepository(config),
|
|
7707
8029
|
"my-order": new MyOrderRepository(config),
|
|
7708
8030
|
"my-customer": new MyCustomerRepository(config),
|
|
7709
8031
|
"my-payment": new PaymentRepository(config),
|
|
7710
8032
|
"my-shopping-list": new ShoppingListRepository(config),
|
|
7711
|
-
|
|
8033
|
+
product: new ProductRepository(config),
|
|
7712
8034
|
"product-type": new ProductTypeRepository(config),
|
|
7713
8035
|
"product-discount": new ProductDiscountRepository(config),
|
|
7714
8036
|
"product-projection": new ProductProjectionRepository(config),
|
|
7715
8037
|
"product-selection": new ProductSelectionRepository(config),
|
|
7716
8038
|
"product-tailoring": new ProductTailoringRepository(config),
|
|
7717
|
-
|
|
7718
|
-
|
|
7719
|
-
|
|
8039
|
+
project: new ProjectRepository(config),
|
|
8040
|
+
review: new ReviewRepository(config),
|
|
8041
|
+
quote: new QuoteRepository(config),
|
|
7720
8042
|
"quote-request": new QuoteRequestRepository(config),
|
|
7721
8043
|
"shipping-method": new ShippingMethodRepository(config),
|
|
7722
8044
|
"shopping-list": new ShoppingListRepository(config),
|
|
7723
8045
|
"staged-quote": new StagedQuoteRepository(config),
|
|
7724
8046
|
"standalone-price": new StandAlonePriceRepository(config),
|
|
7725
|
-
|
|
7726
|
-
|
|
7727
|
-
|
|
8047
|
+
state: new StateRepository(config),
|
|
8048
|
+
store: new StoreRepository(config),
|
|
8049
|
+
subscription: new SubscriptionRepository(config),
|
|
7728
8050
|
"tax-category": new TaxCategoryRepository(config),
|
|
7729
|
-
|
|
7730
|
-
|
|
8051
|
+
type: new TypeRepository(config),
|
|
8052
|
+
zone: new ZoneRepository(config)
|
|
7731
8053
|
});
|
|
7732
8054
|
|
|
7733
8055
|
// src/services/as-associate.ts
|
|
@@ -7808,7 +8130,7 @@ var AbstractService = class {
|
|
|
7808
8130
|
return response.status(200).send(result);
|
|
7809
8131
|
}
|
|
7810
8132
|
getWithId(request, response) {
|
|
7811
|
-
const result = this._expandWithId(request, request.params
|
|
8133
|
+
const result = this._expandWithId(request, request.params.id);
|
|
7812
8134
|
if (!result) {
|
|
7813
8135
|
return response.status(404).send();
|
|
7814
8136
|
}
|
|
@@ -7817,18 +8139,19 @@ var AbstractService = class {
|
|
|
7817
8139
|
getWithKey(request, response) {
|
|
7818
8140
|
const result = this.repository.getByKey(
|
|
7819
8141
|
getRepositoryContext(request),
|
|
7820
|
-
request.params
|
|
8142
|
+
request.params.key,
|
|
7821
8143
|
{
|
|
7822
8144
|
expand: this._parseParam(request.query.expand)
|
|
7823
8145
|
}
|
|
7824
8146
|
);
|
|
7825
|
-
if (!result)
|
|
8147
|
+
if (!result)
|
|
8148
|
+
return response.status(404).send();
|
|
7826
8149
|
return response.status(200).send(result);
|
|
7827
8150
|
}
|
|
7828
8151
|
deleteWithId(request, response) {
|
|
7829
8152
|
const result = this.repository.delete(
|
|
7830
8153
|
getRepositoryContext(request),
|
|
7831
|
-
request.params
|
|
8154
|
+
request.params.id,
|
|
7832
8155
|
{
|
|
7833
8156
|
expand: this._parseParam(request.query.expand)
|
|
7834
8157
|
}
|
|
@@ -7841,7 +8164,7 @@ var AbstractService = class {
|
|
|
7841
8164
|
deleteWithKey(request, response) {
|
|
7842
8165
|
const resource = this.repository.getByKey(
|
|
7843
8166
|
getRepositoryContext(request),
|
|
7844
|
-
request.params
|
|
8167
|
+
request.params.key
|
|
7845
8168
|
);
|
|
7846
8169
|
if (!resource) {
|
|
7847
8170
|
return response.status(404).send("Not found");
|
|
@@ -7874,7 +8197,7 @@ var AbstractService = class {
|
|
|
7874
8197
|
);
|
|
7875
8198
|
const resource = this.repository.get(
|
|
7876
8199
|
getRepositoryContext(request),
|
|
7877
|
-
request.params
|
|
8200
|
+
request.params.id
|
|
7878
8201
|
);
|
|
7879
8202
|
if (!resource) {
|
|
7880
8203
|
return response.status(404).send("Not found");
|
|
@@ -7895,7 +8218,7 @@ var AbstractService = class {
|
|
|
7895
8218
|
);
|
|
7896
8219
|
const resource = this.repository.getByKey(
|
|
7897
8220
|
getRepositoryContext(request),
|
|
7898
|
-
request.params
|
|
8221
|
+
request.params.key
|
|
7899
8222
|
);
|
|
7900
8223
|
if (!resource) {
|
|
7901
8224
|
return response.status(404).send("Not found");
|
|
@@ -8591,19 +8914,19 @@ var ProductProjectionService = class extends AbstractService {
|
|
|
8591
8914
|
search(request, response) {
|
|
8592
8915
|
const query = request.query;
|
|
8593
8916
|
const searchParams = {
|
|
8594
|
-
|
|
8917
|
+
filter: queryParamsArray(query.filter),
|
|
8595
8918
|
"filter.query": queryParamsArray(query["filter.query"]),
|
|
8596
|
-
|
|
8597
|
-
|
|
8598
|
-
|
|
8599
|
-
|
|
8600
|
-
|
|
8601
|
-
|
|
8602
|
-
|
|
8603
|
-
|
|
8604
|
-
|
|
8605
|
-
|
|
8606
|
-
|
|
8919
|
+
facet: queryParamsArray(query.facet),
|
|
8920
|
+
expand: queryParamsArray(query.expand),
|
|
8921
|
+
staged: queryParamsValue(query.staged) === "true",
|
|
8922
|
+
localeProjection: queryParamsValue(query.localeProjection),
|
|
8923
|
+
storeProjection: queryParamsValue(query.storeProjection),
|
|
8924
|
+
priceChannel: queryParamsValue(query.priceChannel),
|
|
8925
|
+
priceCountry: queryParamsValue(query.priceCountry),
|
|
8926
|
+
priceCurrency: queryParamsValue(query.priceCurrency),
|
|
8927
|
+
priceCustomerGroup: queryParamsValue(query.priceCustomerGroup),
|
|
8928
|
+
offset: query.offset ? Number(queryParamsValue(query.offset)) : void 0,
|
|
8929
|
+
limit: query.limit ? Number(queryParamsValue(query.limit)) : void 0
|
|
8607
8930
|
};
|
|
8608
8931
|
const resource = this.repository.search(
|
|
8609
8932
|
getRepositoryContext(request),
|
|
@@ -8637,6 +8960,42 @@ var ProductTypeService = class extends AbstractService {
|
|
|
8637
8960
|
}
|
|
8638
8961
|
};
|
|
8639
8962
|
|
|
8963
|
+
// src/services/quote.ts
|
|
8964
|
+
var QuoteService = class extends AbstractService {
|
|
8965
|
+
repository;
|
|
8966
|
+
constructor(parent, repository) {
|
|
8967
|
+
super(parent);
|
|
8968
|
+
this.repository = repository;
|
|
8969
|
+
}
|
|
8970
|
+
getBasePath() {
|
|
8971
|
+
return "quotes";
|
|
8972
|
+
}
|
|
8973
|
+
};
|
|
8974
|
+
|
|
8975
|
+
// src/services/quote-request.ts
|
|
8976
|
+
var QuoteRequestService = class extends AbstractService {
|
|
8977
|
+
repository;
|
|
8978
|
+
constructor(parent, repository) {
|
|
8979
|
+
super(parent);
|
|
8980
|
+
this.repository = repository;
|
|
8981
|
+
}
|
|
8982
|
+
getBasePath() {
|
|
8983
|
+
return "quote-requests";
|
|
8984
|
+
}
|
|
8985
|
+
};
|
|
8986
|
+
|
|
8987
|
+
// src/services/quote-staged.ts
|
|
8988
|
+
var StagedQuoteService = class extends AbstractService {
|
|
8989
|
+
repository;
|
|
8990
|
+
constructor(parent, repository) {
|
|
8991
|
+
super(parent);
|
|
8992
|
+
this.repository = repository;
|
|
8993
|
+
}
|
|
8994
|
+
getBasePath() {
|
|
8995
|
+
return "staged-quotes";
|
|
8996
|
+
}
|
|
8997
|
+
};
|
|
8998
|
+
|
|
8640
8999
|
// src/services/reviews.ts
|
|
8641
9000
|
var ReviewService = class extends AbstractService {
|
|
8642
9001
|
repository;
|
|
@@ -8780,14 +9139,14 @@ var createServices = (router, repos) => ({
|
|
|
8780
9139
|
"associate-role": new AssociateRoleServices(router, repos["associate-role"]),
|
|
8781
9140
|
"as-associate": new AsAssociateService(router, repos["as-associate"]),
|
|
8782
9141
|
"business-unit": new BusinessUnitServices(router, repos["business-unit"]),
|
|
8783
|
-
|
|
8784
|
-
|
|
9142
|
+
category: new CategoryServices(router, repos.category),
|
|
9143
|
+
cart: new CartService(router, repos.cart, repos.order),
|
|
8785
9144
|
"cart-discount": new CartDiscountService(router, repos["cart-discount"]),
|
|
8786
|
-
|
|
8787
|
-
|
|
9145
|
+
customer: new CustomerService(router, repos.customer),
|
|
9146
|
+
channel: new ChannelService(router, repos.channel),
|
|
8788
9147
|
"customer-group": new CustomerGroupService(router, repos["customer-group"]),
|
|
8789
9148
|
"discount-code": new DiscountCodeService(router, repos["discount-code"]),
|
|
8790
|
-
|
|
9149
|
+
extension: new ExtensionServices(router, repos.extension),
|
|
8791
9150
|
"inventory-entry": new InventoryEntryService(
|
|
8792
9151
|
router,
|
|
8793
9152
|
repos["inventory-entry"]
|
|
@@ -8796,8 +9155,8 @@ var createServices = (router, repos) => ({
|
|
|
8796
9155
|
router,
|
|
8797
9156
|
repos["key-value-document"]
|
|
8798
9157
|
),
|
|
8799
|
-
|
|
8800
|
-
|
|
9158
|
+
order: new OrderService(router, repos.order),
|
|
9159
|
+
payment: new PaymentService(router, repos.payment),
|
|
8801
9160
|
"standalone-price": new StandAlonePriceService(
|
|
8802
9161
|
router,
|
|
8803
9162
|
repos["standalone-price"]
|
|
@@ -8816,7 +9175,7 @@ var createServices = (router, repos) => ({
|
|
|
8816
9175
|
repos["shipping-method"]
|
|
8817
9176
|
),
|
|
8818
9177
|
"product-type": new ProductTypeService(router, repos["product-type"]),
|
|
8819
|
-
|
|
9178
|
+
product: new ProductService(router, repos.product),
|
|
8820
9179
|
"product-discount": new ProductDiscountService(
|
|
8821
9180
|
router,
|
|
8822
9181
|
repos["product-discount"]
|
|
@@ -8829,18 +9188,21 @@ var createServices = (router, repos) => ({
|
|
|
8829
9188
|
router,
|
|
8830
9189
|
repos["product-selection"]
|
|
8831
9190
|
),
|
|
8832
|
-
|
|
9191
|
+
quotes: new QuoteService(router, repos.quote),
|
|
9192
|
+
"quote-request": new QuoteRequestService(router, repos["quote-request"]),
|
|
9193
|
+
reviews: new ReviewService(router, repos.review),
|
|
8833
9194
|
"shopping-list": new ShoppingListService(router, repos["shopping-list"]),
|
|
8834
|
-
"
|
|
8835
|
-
|
|
8836
|
-
|
|
9195
|
+
"staged-quote": new StagedQuoteService(router, repos["staged-quote"]),
|
|
9196
|
+
state: new StateService(router, repos.state),
|
|
9197
|
+
store: new StoreService(router, repos.store),
|
|
9198
|
+
subscription: new SubscriptionService(router, repos.subscription),
|
|
8837
9199
|
"tax-category": new TaxCategoryService(router, repos["tax-category"]),
|
|
8838
9200
|
"attribute-group": new AttributeGroupService(
|
|
8839
9201
|
router,
|
|
8840
9202
|
repos["attribute-group"]
|
|
8841
9203
|
),
|
|
8842
|
-
|
|
8843
|
-
|
|
9204
|
+
type: new TypeService(router, repos.type),
|
|
9205
|
+
zone: new ZoneService(router, repos.zone)
|
|
8844
9206
|
});
|
|
8845
9207
|
|
|
8846
9208
|
// src/services/project.ts
|
|
@@ -8882,7 +9244,7 @@ var AbstractStorage = class {
|
|
|
8882
9244
|
};
|
|
8883
9245
|
|
|
8884
9246
|
// src/storage/in-memory.ts
|
|
8885
|
-
import
|
|
9247
|
+
import assert5 from "assert";
|
|
8886
9248
|
var InMemoryStorage = class extends AbstractStorage {
|
|
8887
9249
|
resources = {};
|
|
8888
9250
|
projects = {};
|
|
@@ -8929,7 +9291,8 @@ var InMemoryStorage = class extends AbstractStorage {
|
|
|
8929
9291
|
getProject = (projectKey) => this.addProject(projectKey);
|
|
8930
9292
|
// Expand resolves a nested reference and injects the object in the given obj
|
|
8931
9293
|
expand = (projectKey, obj, clause) => {
|
|
8932
|
-
if (!clause)
|
|
9294
|
+
if (!clause)
|
|
9295
|
+
return obj;
|
|
8933
9296
|
const newObj = cloneObject(obj);
|
|
8934
9297
|
if (Array.isArray(clause)) {
|
|
8935
9298
|
for (const c of clause) {
|
|
@@ -8960,13 +9323,15 @@ var InMemoryStorage = class extends AbstractStorage {
|
|
|
8960
9323
|
this._resolveReference(projectKey, reference, params.rest);
|
|
8961
9324
|
} else if (params.index === "*") {
|
|
8962
9325
|
const reference = obj[params.element];
|
|
8963
|
-
if (reference === void 0 || !Array.isArray(reference))
|
|
9326
|
+
if (reference === void 0 || !Array.isArray(reference))
|
|
9327
|
+
return;
|
|
8964
9328
|
for (const itemRef of reference) {
|
|
8965
9329
|
this._resolveReference(projectKey, itemRef, params.rest);
|
|
8966
9330
|
}
|
|
8967
9331
|
} else {
|
|
8968
9332
|
const reference = obj[params.element][params.index];
|
|
8969
|
-
if (reference === void 0)
|
|
9333
|
+
if (reference === void 0)
|
|
9334
|
+
return;
|
|
8970
9335
|
this._resolveReference(projectKey, reference, params.rest);
|
|
8971
9336
|
}
|
|
8972
9337
|
};
|
|
@@ -8978,38 +9343,38 @@ var InMemoryStorage = class extends AbstractStorage {
|
|
|
8978
9343
|
"associate-role": /* @__PURE__ */ new Map(),
|
|
8979
9344
|
"attribute-group": /* @__PURE__ */ new Map(),
|
|
8980
9345
|
"business-unit": /* @__PURE__ */ new Map(),
|
|
8981
|
-
|
|
9346
|
+
cart: /* @__PURE__ */ new Map(),
|
|
8982
9347
|
"cart-discount": /* @__PURE__ */ new Map(),
|
|
8983
|
-
|
|
8984
|
-
|
|
8985
|
-
|
|
9348
|
+
category: /* @__PURE__ */ new Map(),
|
|
9349
|
+
channel: /* @__PURE__ */ new Map(),
|
|
9350
|
+
customer: /* @__PURE__ */ new Map(),
|
|
8986
9351
|
"customer-group": /* @__PURE__ */ new Map(),
|
|
8987
9352
|
"discount-code": /* @__PURE__ */ new Map(),
|
|
8988
|
-
|
|
9353
|
+
extension: /* @__PURE__ */ new Map(),
|
|
8989
9354
|
"inventory-entry": /* @__PURE__ */ new Map(),
|
|
8990
9355
|
"key-value-document": /* @__PURE__ */ new Map(),
|
|
8991
|
-
|
|
9356
|
+
order: /* @__PURE__ */ new Map(),
|
|
8992
9357
|
"order-edit": /* @__PURE__ */ new Map(),
|
|
8993
|
-
|
|
8994
|
-
|
|
8995
|
-
|
|
9358
|
+
payment: /* @__PURE__ */ new Map(),
|
|
9359
|
+
product: /* @__PURE__ */ new Map(),
|
|
9360
|
+
quote: /* @__PURE__ */ new Map(),
|
|
8996
9361
|
"quote-request": /* @__PURE__ */ new Map(),
|
|
8997
9362
|
"product-discount": /* @__PURE__ */ new Map(),
|
|
8998
9363
|
"product-selection": /* @__PURE__ */ new Map(),
|
|
8999
9364
|
"product-type": /* @__PURE__ */ new Map(),
|
|
9000
9365
|
"product-projection": /* @__PURE__ */ new Map(),
|
|
9001
9366
|
"product-tailoring": /* @__PURE__ */ new Map(),
|
|
9002
|
-
|
|
9367
|
+
review: /* @__PURE__ */ new Map(),
|
|
9003
9368
|
"shipping-method": /* @__PURE__ */ new Map(),
|
|
9004
9369
|
"staged-quote": /* @__PURE__ */ new Map(),
|
|
9005
|
-
|
|
9006
|
-
|
|
9370
|
+
state: /* @__PURE__ */ new Map(),
|
|
9371
|
+
store: /* @__PURE__ */ new Map(),
|
|
9007
9372
|
"shopping-list": /* @__PURE__ */ new Map(),
|
|
9008
9373
|
"standalone-price": /* @__PURE__ */ new Map(),
|
|
9009
|
-
|
|
9374
|
+
subscription: /* @__PURE__ */ new Map(),
|
|
9010
9375
|
"tax-category": /* @__PURE__ */ new Map(),
|
|
9011
|
-
|
|
9012
|
-
|
|
9376
|
+
type: /* @__PURE__ */ new Map(),
|
|
9377
|
+
zone: /* @__PURE__ */ new Map()
|
|
9013
9378
|
};
|
|
9014
9379
|
}
|
|
9015
9380
|
return projectStorage;
|
|
@@ -9032,7 +9397,7 @@ var InMemoryStorage = class extends AbstractStorage {
|
|
|
9032
9397
|
const store = this.forProjectKey(projectKey);
|
|
9033
9398
|
store[typeId]?.set(obj.id, obj);
|
|
9034
9399
|
const resource = this.get(projectKey, typeId, obj.id, params);
|
|
9035
|
-
|
|
9400
|
+
assert5(
|
|
9036
9401
|
resource,
|
|
9037
9402
|
`resource of type ${typeId} with id ${obj.id} not created`
|
|
9038
9403
|
);
|
|
@@ -9177,7 +9542,8 @@ var InMemoryStorage = class extends AbstractStorage {
|
|
|
9177
9542
|
});
|
|
9178
9543
|
}
|
|
9179
9544
|
_resolveReference(projectKey, reference, expand) {
|
|
9180
|
-
if (reference === void 0)
|
|
9545
|
+
if (reference === void 0)
|
|
9546
|
+
return;
|
|
9181
9547
|
if (reference.typeId !== void 0 && (reference.id !== void 0 || reference.key !== void 0)) {
|
|
9182
9548
|
if (!reference.obj) {
|
|
9183
9549
|
reference.obj = this.getByResourceIdentifier(projectKey, {
|
|
@@ -9330,12 +9696,11 @@ var CommercetoolsMock = class {
|
|
|
9330
9696
|
message: err.message,
|
|
9331
9697
|
errors: [err.info]
|
|
9332
9698
|
});
|
|
9333
|
-
} else {
|
|
9334
|
-
console.error(err);
|
|
9335
|
-
return resp.status(500).send({
|
|
9336
|
-
error: err.message
|
|
9337
|
-
});
|
|
9338
9699
|
}
|
|
9700
|
+
console.error(err);
|
|
9701
|
+
return resp.status(500).send({
|
|
9702
|
+
error: err.message
|
|
9703
|
+
});
|
|
9339
9704
|
});
|
|
9340
9705
|
return app;
|
|
9341
9706
|
}
|
|
@@ -9353,7 +9718,7 @@ var CommercetoolsMock = class {
|
|
|
9353
9718
|
const body = await request.text();
|
|
9354
9719
|
const url = new URL(request.url);
|
|
9355
9720
|
const headers = copyHeaders(request.headers);
|
|
9356
|
-
const res = await inject(app).post(url.pathname
|
|
9721
|
+
const res = await inject(app).post(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
|
|
9357
9722
|
return new HttpResponse(res.body, {
|
|
9358
9723
|
status: res.statusCode,
|
|
9359
9724
|
headers: mapHeaderType(res.headers)
|
|
@@ -9363,7 +9728,7 @@ var CommercetoolsMock = class {
|
|
|
9363
9728
|
const body = await request.text();
|
|
9364
9729
|
const url = new URL(request.url);
|
|
9365
9730
|
const headers = copyHeaders(request.headers);
|
|
9366
|
-
const res = await inject(app).get(url.pathname
|
|
9731
|
+
const res = await inject(app).get(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
|
|
9367
9732
|
if (res.statusCode === 200) {
|
|
9368
9733
|
const parsedBody = JSON.parse(res.body);
|
|
9369
9734
|
const resultCount = "count" in parsedBody ? parsedBody.count : Object.keys(parsedBody).length;
|
|
@@ -9381,7 +9746,7 @@ var CommercetoolsMock = class {
|
|
|
9381
9746
|
const body = await request.text();
|
|
9382
9747
|
const url = new URL(request.url);
|
|
9383
9748
|
const headers = copyHeaders(request.headers);
|
|
9384
|
-
const res = await inject(app).get(url.pathname
|
|
9749
|
+
const res = await inject(app).get(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
|
|
9385
9750
|
return new HttpResponse(res.body, {
|
|
9386
9751
|
status: res.statusCode,
|
|
9387
9752
|
headers: mapHeaderType(res.headers)
|
|
@@ -9391,7 +9756,7 @@ var CommercetoolsMock = class {
|
|
|
9391
9756
|
const body = await request.text();
|
|
9392
9757
|
const url = new URL(request.url);
|
|
9393
9758
|
const headers = copyHeaders(request.headers);
|
|
9394
|
-
const res = await inject(app).post(url.pathname
|
|
9759
|
+
const res = await inject(app).post(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
|
|
9395
9760
|
return new HttpResponse(res.body, {
|
|
9396
9761
|
status: res.statusCode,
|
|
9397
9762
|
headers: mapHeaderType(res.headers)
|
|
@@ -9401,7 +9766,7 @@ var CommercetoolsMock = class {
|
|
|
9401
9766
|
const body = await request.text();
|
|
9402
9767
|
const url = new URL(request.url);
|
|
9403
9768
|
const headers = copyHeaders(request.headers);
|
|
9404
|
-
const res = await inject(app).delete(url.pathname
|
|
9769
|
+
const res = await inject(app).delete(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
|
|
9405
9770
|
return new HttpResponse(res.body, {
|
|
9406
9771
|
status: res.statusCode,
|
|
9407
9772
|
headers: mapHeaderType(res.headers)
|
|
@@ -9416,10 +9781,9 @@ var CommercetoolsMock = class {
|
|
|
9416
9781
|
if (_globalListeners.length > 0) {
|
|
9417
9782
|
if (this._mswServer !== void 0) {
|
|
9418
9783
|
throw new Error("Server already started");
|
|
9419
|
-
} else {
|
|
9420
|
-
process.emitWarning("Server wasn't stopped properly, clearing");
|
|
9421
|
-
_globalListeners.forEach((listener) => listener.close());
|
|
9422
9784
|
}
|
|
9785
|
+
process.emitWarning("Server wasn't stopped properly, clearing");
|
|
9786
|
+
_globalListeners.forEach((listener) => listener.close());
|
|
9423
9787
|
}
|
|
9424
9788
|
const server = setupServer();
|
|
9425
9789
|
this.registerHandlers(server);
|