@labdigital/commercetools-mock 2.30.0 → 2.31.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 +374 -203
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +374 -203
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/productSearchFilter.test.ts +328 -0
- package/src/lib/productSearchFilter.ts +329 -0
- package/src/product-search.ts +12 -2
- package/src/repositories/order/actions.ts +9 -0
- package/src/services/order.test.ts +14 -0
package/dist/index.cjs
CHANGED
|
@@ -3990,6 +3990,9 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
3990
3990
|
changePaymentState(context, resource, { paymentState }) {
|
|
3991
3991
|
resource.paymentState = paymentState;
|
|
3992
3992
|
}
|
|
3993
|
+
changeShipmentState(context, resource, { shipmentState }) {
|
|
3994
|
+
resource.shipmentState = shipmentState;
|
|
3995
|
+
}
|
|
3993
3996
|
setBillingAddress(context, resource, { address }) {
|
|
3994
3997
|
resource.billingAddress = createAddress(
|
|
3995
3998
|
address,
|
|
@@ -4541,19 +4544,346 @@ var PaymentRepository = class extends AbstractResourceRepository {
|
|
|
4541
4544
|
}
|
|
4542
4545
|
};
|
|
4543
4546
|
|
|
4544
|
-
// src/lib/
|
|
4545
|
-
var
|
|
4546
|
-
|
|
4547
|
-
|
|
4548
|
-
|
|
4549
|
-
|
|
4550
|
-
}
|
|
4551
|
-
|
|
4552
|
-
|
|
4553
|
-
|
|
4554
|
-
|
|
4555
|
-
|
|
4547
|
+
// src/lib/projectionSearchFilter.ts
|
|
4548
|
+
var parseFilterExpression = (filter) => {
|
|
4549
|
+
const exprFunc = generateMatchFunc2(filter);
|
|
4550
|
+
const [source] = filter.split(":", 1);
|
|
4551
|
+
if (source.startsWith("variants.")) {
|
|
4552
|
+
return filterVariants(source, exprFunc);
|
|
4553
|
+
}
|
|
4554
|
+
return filterProduct(source, exprFunc);
|
|
4555
|
+
};
|
|
4556
|
+
var getLexer2 = (value) => new Lexer(value).token("MISSING", /missing(?![-_a-z0-9]+)/i).token("EXISTS", /exists(?![-_a-z0-9]+)/i).token("RANGE", /range(?![-_a-z0-9]+)/i).token("TO", /to(?![-_a-z0-9]+)/i).token("IDENTIFIER", /[-_.a-z]+/i).token("FLOAT", /\d+\.\d+/).token("INT", /\d+/).token("STRING", /"((?:\\.|[^"\\])*)"/).token("STRING", /'((?:\\.|[^'\\])*)'/).token("COMMA", ",").token("STAR", "*").token("(", "(").token(":", ":").token(")", ")").token('"', '"').token("WS", /\s+/, true);
|
|
4557
|
+
var parseFilter = (filter) => {
|
|
4558
|
+
const lexer = getLexer2(filter);
|
|
4559
|
+
const parser = new Parser(lexer).builder().nud("IDENTIFIER", 100, (t) => t.token.match).led(":", 100, ({ left, bp }) => {
|
|
4560
|
+
const parsed = parser.parse({ terminals: [bp - 1] });
|
|
4561
|
+
const expressions = !Array.isArray(parsed) ? [parsed] : parsed;
|
|
4562
|
+
const unique = new Set(expressions.map((expr) => expr.type));
|
|
4563
|
+
if (unique.size > 1) {
|
|
4564
|
+
throw new Error("Invalid expression");
|
|
4565
|
+
}
|
|
4566
|
+
if (expressions.some((expr) => expr.type == "Symbol")) {
|
|
4567
|
+
return {
|
|
4568
|
+
source: left,
|
|
4569
|
+
type: "FilterExpression",
|
|
4570
|
+
children: expressions.map((e) => {
|
|
4571
|
+
if (e.type != "Symbol") {
|
|
4572
|
+
throw new Error("Invalid expression");
|
|
4573
|
+
}
|
|
4574
|
+
return {
|
|
4575
|
+
type: "FilterExpression",
|
|
4576
|
+
match: (obj) => obj === e.value
|
|
4577
|
+
};
|
|
4578
|
+
})
|
|
4579
|
+
};
|
|
4580
|
+
}
|
|
4581
|
+
return {
|
|
4582
|
+
source: left,
|
|
4583
|
+
type: expressions[0].type,
|
|
4584
|
+
children: expressions
|
|
4585
|
+
};
|
|
4586
|
+
}).nud(
|
|
4587
|
+
"STRING",
|
|
4588
|
+
20,
|
|
4589
|
+
(t) => ({
|
|
4590
|
+
type: "Symbol",
|
|
4591
|
+
kind: "string",
|
|
4592
|
+
// @ts-ignore
|
|
4593
|
+
value: t.token.groups[1]
|
|
4594
|
+
})
|
|
4595
|
+
).nud(
|
|
4596
|
+
"INT",
|
|
4597
|
+
5,
|
|
4598
|
+
(t) => ({
|
|
4599
|
+
type: "Symbol",
|
|
4600
|
+
kind: "int",
|
|
4601
|
+
value: parseInt(t.token.match, 10)
|
|
4602
|
+
})
|
|
4603
|
+
).nud("STAR", 5, (_) => ({
|
|
4604
|
+
type: "Symbol",
|
|
4605
|
+
kind: "any",
|
|
4606
|
+
value: null
|
|
4607
|
+
})).nud(
|
|
4608
|
+
"EXISTS",
|
|
4609
|
+
10,
|
|
4610
|
+
({ bp }) => ({
|
|
4611
|
+
type: "FilterExpression",
|
|
4612
|
+
match: (obj) => obj !== void 0
|
|
4613
|
+
})
|
|
4614
|
+
).nud(
|
|
4615
|
+
"MISSING",
|
|
4616
|
+
10,
|
|
4617
|
+
({ bp }) => ({
|
|
4618
|
+
type: "FilterExpression",
|
|
4619
|
+
match: (obj) => obj === void 0
|
|
4620
|
+
})
|
|
4621
|
+
).led("COMMA", 200, ({ left, token, bp }) => {
|
|
4622
|
+
const expr = parser.parse({ terminals: [bp - 1] });
|
|
4623
|
+
if (Array.isArray(expr)) {
|
|
4624
|
+
return [left, ...expr];
|
|
4625
|
+
} else {
|
|
4626
|
+
return [left, expr];
|
|
4627
|
+
}
|
|
4628
|
+
}).nud("(", 100, (t) => {
|
|
4629
|
+
const expr = parser.parse({ terminals: [")"] });
|
|
4630
|
+
lexer.expect(")");
|
|
4631
|
+
return expr;
|
|
4632
|
+
}).bp(")", 0).led("TO", 20, ({ left, bp }) => {
|
|
4633
|
+
const expr = parser.parse({ terminals: [bp - 1] });
|
|
4634
|
+
return {
|
|
4635
|
+
start: left.value,
|
|
4636
|
+
stop: expr.value
|
|
4637
|
+
};
|
|
4638
|
+
}).nud("RANGE", 20, ({ bp }) => {
|
|
4639
|
+
let ranges = parser.parse();
|
|
4640
|
+
if (!Array.isArray(ranges)) {
|
|
4641
|
+
ranges = [ranges];
|
|
4642
|
+
}
|
|
4643
|
+
return ranges.map((range) => {
|
|
4644
|
+
let func;
|
|
4645
|
+
if (range.start !== null && range.stop !== null) {
|
|
4646
|
+
func = (obj) => obj >= range.start && obj <= range.stop;
|
|
4647
|
+
} else if (range.start === null && range.stop !== null) {
|
|
4648
|
+
func = (obj) => obj <= range.stop;
|
|
4649
|
+
} else if (range.start !== null && range.stop === null) {
|
|
4650
|
+
func = (obj) => obj >= range.start;
|
|
4651
|
+
} else {
|
|
4652
|
+
func = (obj) => true;
|
|
4653
|
+
}
|
|
4654
|
+
return {
|
|
4655
|
+
type: "RangeExpression",
|
|
4656
|
+
start: range.start,
|
|
4657
|
+
stop: range.stop,
|
|
4658
|
+
match: func
|
|
4659
|
+
};
|
|
4660
|
+
});
|
|
4661
|
+
}).build();
|
|
4662
|
+
return parser.parse();
|
|
4663
|
+
};
|
|
4664
|
+
var generateMatchFunc2 = (filter) => {
|
|
4665
|
+
const result = parseFilter(filter);
|
|
4666
|
+
if (!result) {
|
|
4667
|
+
throw new Error(`Syntax error while parsing '${filter}'.`);
|
|
4668
|
+
}
|
|
4669
|
+
if (result.type == "TermExpression") {
|
|
4670
|
+
throw new Error(`Syntax error while parsing '${filter}'.`);
|
|
4671
|
+
}
|
|
4672
|
+
return (obj) => {
|
|
4673
|
+
if (!result.children)
|
|
4674
|
+
return false;
|
|
4675
|
+
return result.children.some((c) => c.match(obj));
|
|
4676
|
+
};
|
|
4677
|
+
};
|
|
4678
|
+
var generateFacetFunc = (filter) => {
|
|
4679
|
+
if (!filter.includes(":")) {
|
|
4680
|
+
return {
|
|
4681
|
+
source: filter,
|
|
4682
|
+
type: "TermExpression"
|
|
4683
|
+
};
|
|
4684
|
+
}
|
|
4685
|
+
return parseFilter(filter);
|
|
4686
|
+
};
|
|
4687
|
+
var filterProduct = (source, exprFunc) => (p, markMatchingVariants) => {
|
|
4688
|
+
const value = nestedLookup(p, source);
|
|
4689
|
+
return exprFunc(value);
|
|
4690
|
+
};
|
|
4691
|
+
var filterVariants = (source, exprFunc) => (p, markMatchingVariants) => {
|
|
4692
|
+
const [, ...paths] = source.split(".");
|
|
4693
|
+
const path = paths.join(".");
|
|
4694
|
+
const variants = getVariants(p);
|
|
4695
|
+
for (const variant of variants) {
|
|
4696
|
+
const value = resolveVariantValue(variant, path);
|
|
4697
|
+
if (exprFunc(value)) {
|
|
4698
|
+
if (markMatchingVariants) {
|
|
4699
|
+
for (const v of variants) {
|
|
4700
|
+
v.isMatchingVariant = false;
|
|
4701
|
+
}
|
|
4702
|
+
variant.isMatchingVariant = true;
|
|
4703
|
+
}
|
|
4704
|
+
return true;
|
|
4705
|
+
}
|
|
4706
|
+
}
|
|
4707
|
+
return false;
|
|
4708
|
+
};
|
|
4709
|
+
var resolveVariantValue = (obj, path) => {
|
|
4710
|
+
if (path === void 0) {
|
|
4711
|
+
return obj;
|
|
4712
|
+
}
|
|
4713
|
+
if (path.startsWith("variants.")) {
|
|
4714
|
+
path = path.substring(path.indexOf(".") + 1);
|
|
4715
|
+
}
|
|
4716
|
+
if (path.startsWith("attributes.")) {
|
|
4717
|
+
const [, attrName, ...rest] = path.split(".");
|
|
4718
|
+
if (!obj.attributes) {
|
|
4719
|
+
return void 0;
|
|
4720
|
+
}
|
|
4721
|
+
for (const attr of obj.attributes) {
|
|
4722
|
+
if (attr.name === attrName) {
|
|
4723
|
+
return nestedLookup(attr.value, rest.join("."));
|
|
4724
|
+
}
|
|
4725
|
+
}
|
|
4726
|
+
}
|
|
4727
|
+
if (path === "price.centAmount") {
|
|
4728
|
+
return obj.prices && obj.prices.length > 0 ? obj.prices[0].value.centAmount : void 0;
|
|
4729
|
+
}
|
|
4730
|
+
return nestedLookup(obj, path);
|
|
4731
|
+
};
|
|
4732
|
+
var getVariants = (p) => [
|
|
4733
|
+
p.masterVariant,
|
|
4734
|
+
...p.variants ?? []
|
|
4735
|
+
];
|
|
4736
|
+
|
|
4737
|
+
// src/lib/productSearchFilter.ts
|
|
4738
|
+
var parseSearchQuery = (searchQuery) => {
|
|
4739
|
+
if (isSearchAndExpression(searchQuery)) {
|
|
4740
|
+
return (obj, markMatchingVariant) => searchQuery.and.every((expr) => {
|
|
4741
|
+
const filterFunc = parseSearchQuery(expr);
|
|
4742
|
+
return filterFunc(obj, markMatchingVariant);
|
|
4743
|
+
});
|
|
4744
|
+
}
|
|
4745
|
+
if (isSearchOrExpression(searchQuery)) {
|
|
4746
|
+
return (obj, markMatchingVariant) => searchQuery.or.some((expr) => {
|
|
4747
|
+
const filterFunc = parseSearchQuery(expr);
|
|
4748
|
+
return filterFunc(obj, markMatchingVariant);
|
|
4749
|
+
});
|
|
4750
|
+
}
|
|
4751
|
+
if (isSearchNotExpression(searchQuery)) {
|
|
4752
|
+
return (obj, markMatchingVariant) => !parseSearchQuery(searchQuery.not)(obj, markMatchingVariant);
|
|
4753
|
+
}
|
|
4754
|
+
if (isSearchFilterExpression(searchQuery)) {
|
|
4755
|
+
return (obj, markMatchingVariant) => searchQuery.filter.every((expr) => {
|
|
4756
|
+
const filterFunc = parseSearchQuery(expr);
|
|
4757
|
+
return filterFunc(obj, markMatchingVariant);
|
|
4758
|
+
});
|
|
4759
|
+
}
|
|
4760
|
+
if (isSearchRangeExpression(searchQuery)) {
|
|
4761
|
+
const generateRangeMatchFunc = (value) => {
|
|
4762
|
+
const rangeFilters = [];
|
|
4763
|
+
if (searchQuery.range.gte) {
|
|
4764
|
+
rangeFilters.push(value >= searchQuery.range.gte);
|
|
4765
|
+
}
|
|
4766
|
+
if (searchQuery.range.gt) {
|
|
4767
|
+
rangeFilters.push(value > searchQuery.range.gt);
|
|
4768
|
+
}
|
|
4769
|
+
if (searchQuery.range.lte) {
|
|
4770
|
+
rangeFilters.push(value <= searchQuery.range.lte);
|
|
4771
|
+
}
|
|
4772
|
+
if (searchQuery.range.lt) {
|
|
4773
|
+
rangeFilters.push(value < searchQuery.range.lt);
|
|
4774
|
+
}
|
|
4775
|
+
return rangeFilters.every((filter) => filter);
|
|
4776
|
+
};
|
|
4777
|
+
return generateFieldMatchFunc(generateRangeMatchFunc, searchQuery.range);
|
|
4778
|
+
}
|
|
4779
|
+
if (isSearchExactExpression(searchQuery)) {
|
|
4780
|
+
return generateFieldMatchFunc(
|
|
4781
|
+
(value) => value === searchQuery.exact.value,
|
|
4782
|
+
searchQuery.exact
|
|
4783
|
+
);
|
|
4784
|
+
}
|
|
4785
|
+
if (isSearchExistsExpression(searchQuery)) {
|
|
4786
|
+
return generateFieldMatchFunc((value) => !!value, searchQuery.exists);
|
|
4787
|
+
}
|
|
4788
|
+
if (isSearchFullTextExpression(searchQuery)) {
|
|
4789
|
+
return generateFieldMatchFunc(
|
|
4790
|
+
(value) => value.includes(searchQuery.fullText.value),
|
|
4791
|
+
searchQuery.fullText
|
|
4792
|
+
);
|
|
4793
|
+
}
|
|
4794
|
+
if (isSearchFullTextPrefixExpression(searchQuery)) {
|
|
4795
|
+
return generateFieldMatchFunc(
|
|
4796
|
+
(value) => value.startsWith(searchQuery.fullTextPrefix.value),
|
|
4797
|
+
searchQuery.fullTextPrefix
|
|
4798
|
+
);
|
|
4799
|
+
}
|
|
4800
|
+
if (isSearchPrefixExpression(searchQuery)) {
|
|
4801
|
+
return generateFieldMatchFunc(
|
|
4802
|
+
(value) => value.startsWith(searchQuery.prefix.value),
|
|
4803
|
+
searchQuery.prefix
|
|
4804
|
+
);
|
|
4805
|
+
}
|
|
4806
|
+
if (isSearchWildCardExpression(searchQuery)) {
|
|
4807
|
+
const generateWildcardMatchFunc = (value) => {
|
|
4808
|
+
const wildCardValues = searchQuery.wildcard.value.split("*").filter((v) => !!v);
|
|
4809
|
+
if (searchQuery.wildcard.caseInsensitive) {
|
|
4810
|
+
return wildCardValues.every(
|
|
4811
|
+
(wildCardValue) => value.toLowerCase().includes(wildCardValue.toLowerCase())
|
|
4812
|
+
);
|
|
4813
|
+
}
|
|
4814
|
+
return wildCardValues.every(
|
|
4815
|
+
(wildCardValue) => value.includes(wildCardValue)
|
|
4816
|
+
);
|
|
4817
|
+
};
|
|
4818
|
+
return generateFieldMatchFunc(
|
|
4819
|
+
generateWildcardMatchFunc,
|
|
4820
|
+
searchQuery.wildcard
|
|
4821
|
+
);
|
|
4822
|
+
}
|
|
4823
|
+
throw new Error("Unsupported search query expression");
|
|
4824
|
+
};
|
|
4825
|
+
var generateFieldMatchFunc = (matchFunc, searchQuery) => {
|
|
4826
|
+
const generateMatchFunc3 = (obj, markMatchingVariants) => {
|
|
4827
|
+
if (searchQuery.field.startsWith("variants.")) {
|
|
4828
|
+
const variantField = searchQuery.field.substring(
|
|
4829
|
+
searchQuery.field.indexOf(".") + 1
|
|
4830
|
+
);
|
|
4831
|
+
const variants = getVariants(obj);
|
|
4832
|
+
for (const variant of variants) {
|
|
4833
|
+
const value = resolveFieldValue(variant, {
|
|
4834
|
+
...searchQuery,
|
|
4835
|
+
field: variantField
|
|
4836
|
+
});
|
|
4837
|
+
if (matchFunc(value)) {
|
|
4838
|
+
if (markMatchingVariants) {
|
|
4839
|
+
for (const v of variants) {
|
|
4840
|
+
v.isMatchingVariant = false;
|
|
4841
|
+
}
|
|
4842
|
+
variant.isMatchingVariant = true;
|
|
4843
|
+
}
|
|
4844
|
+
return true;
|
|
4845
|
+
}
|
|
4846
|
+
}
|
|
4847
|
+
return false;
|
|
4848
|
+
}
|
|
4849
|
+
return matchFunc(resolveFieldValue(obj, searchQuery));
|
|
4850
|
+
};
|
|
4851
|
+
return generateMatchFunc3;
|
|
4852
|
+
};
|
|
4853
|
+
var resolveFieldValue = (obj, searchQuery) => {
|
|
4854
|
+
if (searchQuery.field === void 0) {
|
|
4855
|
+
throw new Error("Missing field path in query expression");
|
|
4556
4856
|
}
|
|
4857
|
+
let fieldPath = searchQuery.field;
|
|
4858
|
+
const language = "language" in searchQuery ? searchQuery.language : void 0;
|
|
4859
|
+
if (fieldPath.startsWith("variants.")) {
|
|
4860
|
+
fieldPath = fieldPath.substring(fieldPath.indexOf(".") + 1);
|
|
4861
|
+
}
|
|
4862
|
+
if (fieldPath.startsWith("attributes.")) {
|
|
4863
|
+
const [, attrName, ...rest] = fieldPath.split(".");
|
|
4864
|
+
if (!obj.attributes) {
|
|
4865
|
+
return void 0;
|
|
4866
|
+
}
|
|
4867
|
+
for (const attr of obj.attributes) {
|
|
4868
|
+
if (attr.name === attrName) {
|
|
4869
|
+
return nestedLookupByLanguage(attr.value, rest.join("."), language);
|
|
4870
|
+
}
|
|
4871
|
+
}
|
|
4872
|
+
}
|
|
4873
|
+
if (fieldPath === "prices.currentCentAmount") {
|
|
4874
|
+
return obj.prices && obj.prices.length > 0 ? obj.prices[0].value.centAmount : void 0;
|
|
4875
|
+
}
|
|
4876
|
+
return nestedLookupByLanguage(obj, fieldPath, language);
|
|
4877
|
+
};
|
|
4878
|
+
var nestedLookupByLanguage = (obj, path, language) => {
|
|
4879
|
+
const value = nestedLookup(obj, path);
|
|
4880
|
+
if (language && value && typeof value === "object") {
|
|
4881
|
+
const matchingLanguageKey = Object.keys(value).find(
|
|
4882
|
+
(key) => key.toLowerCase().startsWith(language.toLowerCase())
|
|
4883
|
+
);
|
|
4884
|
+
return matchingLanguageKey ? value[matchingLanguageKey] : void 0;
|
|
4885
|
+
}
|
|
4886
|
+
return value;
|
|
4557
4887
|
};
|
|
4558
4888
|
var isSearchAndExpression = (expr) => expr.and !== void 0;
|
|
4559
4889
|
var isSearchOrExpression = (expr) => expr.or !== void 0;
|
|
@@ -4566,6 +4896,32 @@ var isSearchFullTextExpression = (expr) => expr.fullText !== void 0;
|
|
|
4566
4896
|
var isSearchFullTextPrefixExpression = (expr) => expr.fullTextPrefix !== void 0;
|
|
4567
4897
|
var isSearchPrefixExpression = (expr) => expr.prefix !== void 0;
|
|
4568
4898
|
var isSearchWildCardExpression = (expr) => expr.wildcard !== void 0;
|
|
4899
|
+
|
|
4900
|
+
// src/lib/searchQueryTypeChecker.ts
|
|
4901
|
+
var validateSearchQuery = (query) => {
|
|
4902
|
+
if (isSearchAndExpression2(query)) {
|
|
4903
|
+
query.and.forEach((expr) => validateSearchQuery(expr));
|
|
4904
|
+
} else if (isSearchOrExpression2(query)) {
|
|
4905
|
+
query.or.forEach((expr) => validateSearchQuery(expr));
|
|
4906
|
+
} else if (isSearchNotExpression2(query)) {
|
|
4907
|
+
validateSearchQuery(query.not);
|
|
4908
|
+
} else if (isSearchFilterExpression2(query) || isSearchRangeExpression2(query) || isSearchExactExpression2(query) || isSearchExistsExpression2(query) || isSearchFullTextExpression2(query) || isSearchFullTextPrefixExpression2(query) || isSearchPrefixExpression2(query) || isSearchWildCardExpression2(query) || isSearchAnyValue(query)) {
|
|
4909
|
+
return;
|
|
4910
|
+
} else {
|
|
4911
|
+
throw new Error("Unsupported search query expression");
|
|
4912
|
+
}
|
|
4913
|
+
};
|
|
4914
|
+
var isSearchAndExpression2 = (expr) => expr.and !== void 0;
|
|
4915
|
+
var isSearchOrExpression2 = (expr) => expr.or !== void 0;
|
|
4916
|
+
var isSearchNotExpression2 = (expr) => expr.not !== void 0;
|
|
4917
|
+
var isSearchFilterExpression2 = (expr) => expr.filter !== void 0;
|
|
4918
|
+
var isSearchRangeExpression2 = (expr) => expr.range !== void 0;
|
|
4919
|
+
var isSearchExactExpression2 = (expr) => expr.exact !== void 0;
|
|
4920
|
+
var isSearchExistsExpression2 = (expr) => expr.exists !== void 0;
|
|
4921
|
+
var isSearchFullTextExpression2 = (expr) => expr.fullText !== void 0;
|
|
4922
|
+
var isSearchFullTextPrefixExpression2 = (expr) => expr.fullTextPrefix !== void 0;
|
|
4923
|
+
var isSearchPrefixExpression2 = (expr) => expr.prefix !== void 0;
|
|
4924
|
+
var isSearchWildCardExpression2 = (expr) => expr.wildcard !== void 0;
|
|
4569
4925
|
var isSearchAnyValue = (expr) => expr.value !== void 0;
|
|
4570
4926
|
|
|
4571
4927
|
// src/priceSelector.ts
|
|
@@ -4626,7 +4982,7 @@ var ProductSearch = class {
|
|
|
4626
4982
|
this._storage = storage;
|
|
4627
4983
|
}
|
|
4628
4984
|
search(projectKey, params) {
|
|
4629
|
-
|
|
4985
|
+
let resources = this._storage.all(projectKey, "product").map(
|
|
4630
4986
|
(r) => this.transform(r, params.productProjectionParameters?.staged ?? false)
|
|
4631
4987
|
).filter((p) => {
|
|
4632
4988
|
if (!params.productProjectionParameters?.staged) {
|
|
@@ -4634,9 +4990,14 @@ var ProductSearch = class {
|
|
|
4634
4990
|
}
|
|
4635
4991
|
return true;
|
|
4636
4992
|
});
|
|
4993
|
+
const markMatchingVariant = params.markMatchingVariants ?? false;
|
|
4637
4994
|
if (params.query) {
|
|
4638
4995
|
try {
|
|
4639
4996
|
validateSearchQuery(params.query);
|
|
4997
|
+
const matchFunc = parseSearchQuery(params.query);
|
|
4998
|
+
resources = resources.filter(
|
|
4999
|
+
(resource) => matchFunc(resource, markMatchingVariant)
|
|
5000
|
+
);
|
|
4640
5001
|
} catch (err) {
|
|
4641
5002
|
console.error(err);
|
|
4642
5003
|
throw new CommercetoolsError(
|
|
@@ -5613,196 +5974,6 @@ var ProductDiscountUpdateHandler = class extends AbstractUpdateHandler {
|
|
|
5613
5974
|
}
|
|
5614
5975
|
};
|
|
5615
5976
|
|
|
5616
|
-
// src/lib/projectionSearchFilter.ts
|
|
5617
|
-
var parseFilterExpression = (filter) => {
|
|
5618
|
-
const exprFunc = generateMatchFunc2(filter);
|
|
5619
|
-
const [source] = filter.split(":", 1);
|
|
5620
|
-
if (source.startsWith("variants.")) {
|
|
5621
|
-
return filterVariants(source, exprFunc);
|
|
5622
|
-
}
|
|
5623
|
-
return filterProduct(source, exprFunc);
|
|
5624
|
-
};
|
|
5625
|
-
var getLexer2 = (value) => new Lexer(value).token("MISSING", /missing(?![-_a-z0-9]+)/i).token("EXISTS", /exists(?![-_a-z0-9]+)/i).token("RANGE", /range(?![-_a-z0-9]+)/i).token("TO", /to(?![-_a-z0-9]+)/i).token("IDENTIFIER", /[-_.a-z]+/i).token("FLOAT", /\d+\.\d+/).token("INT", /\d+/).token("STRING", /"((?:\\.|[^"\\])*)"/).token("STRING", /'((?:\\.|[^'\\])*)'/).token("COMMA", ",").token("STAR", "*").token("(", "(").token(":", ":").token(")", ")").token('"', '"').token("WS", /\s+/, true);
|
|
5626
|
-
var parseFilter = (filter) => {
|
|
5627
|
-
const lexer = getLexer2(filter);
|
|
5628
|
-
const parser = new Parser(lexer).builder().nud("IDENTIFIER", 100, (t) => t.token.match).led(":", 100, ({ left, bp }) => {
|
|
5629
|
-
const parsed = parser.parse({ terminals: [bp - 1] });
|
|
5630
|
-
const expressions = !Array.isArray(parsed) ? [parsed] : parsed;
|
|
5631
|
-
const unique = new Set(expressions.map((expr) => expr.type));
|
|
5632
|
-
if (unique.size > 1) {
|
|
5633
|
-
throw new Error("Invalid expression");
|
|
5634
|
-
}
|
|
5635
|
-
if (expressions.some((expr) => expr.type == "Symbol")) {
|
|
5636
|
-
return {
|
|
5637
|
-
source: left,
|
|
5638
|
-
type: "FilterExpression",
|
|
5639
|
-
children: expressions.map((e) => {
|
|
5640
|
-
if (e.type != "Symbol") {
|
|
5641
|
-
throw new Error("Invalid expression");
|
|
5642
|
-
}
|
|
5643
|
-
return {
|
|
5644
|
-
type: "FilterExpression",
|
|
5645
|
-
match: (obj) => obj === e.value
|
|
5646
|
-
};
|
|
5647
|
-
})
|
|
5648
|
-
};
|
|
5649
|
-
}
|
|
5650
|
-
return {
|
|
5651
|
-
source: left,
|
|
5652
|
-
type: expressions[0].type,
|
|
5653
|
-
children: expressions
|
|
5654
|
-
};
|
|
5655
|
-
}).nud(
|
|
5656
|
-
"STRING",
|
|
5657
|
-
20,
|
|
5658
|
-
(t) => ({
|
|
5659
|
-
type: "Symbol",
|
|
5660
|
-
kind: "string",
|
|
5661
|
-
// @ts-ignore
|
|
5662
|
-
value: t.token.groups[1]
|
|
5663
|
-
})
|
|
5664
|
-
).nud(
|
|
5665
|
-
"INT",
|
|
5666
|
-
5,
|
|
5667
|
-
(t) => ({
|
|
5668
|
-
type: "Symbol",
|
|
5669
|
-
kind: "int",
|
|
5670
|
-
value: parseInt(t.token.match, 10)
|
|
5671
|
-
})
|
|
5672
|
-
).nud("STAR", 5, (_) => ({
|
|
5673
|
-
type: "Symbol",
|
|
5674
|
-
kind: "any",
|
|
5675
|
-
value: null
|
|
5676
|
-
})).nud(
|
|
5677
|
-
"EXISTS",
|
|
5678
|
-
10,
|
|
5679
|
-
({ bp }) => ({
|
|
5680
|
-
type: "FilterExpression",
|
|
5681
|
-
match: (obj) => obj !== void 0
|
|
5682
|
-
})
|
|
5683
|
-
).nud(
|
|
5684
|
-
"MISSING",
|
|
5685
|
-
10,
|
|
5686
|
-
({ bp }) => ({
|
|
5687
|
-
type: "FilterExpression",
|
|
5688
|
-
match: (obj) => obj === void 0
|
|
5689
|
-
})
|
|
5690
|
-
).led("COMMA", 200, ({ left, token, bp }) => {
|
|
5691
|
-
const expr = parser.parse({ terminals: [bp - 1] });
|
|
5692
|
-
if (Array.isArray(expr)) {
|
|
5693
|
-
return [left, ...expr];
|
|
5694
|
-
} else {
|
|
5695
|
-
return [left, expr];
|
|
5696
|
-
}
|
|
5697
|
-
}).nud("(", 100, (t) => {
|
|
5698
|
-
const expr = parser.parse({ terminals: [")"] });
|
|
5699
|
-
lexer.expect(")");
|
|
5700
|
-
return expr;
|
|
5701
|
-
}).bp(")", 0).led("TO", 20, ({ left, bp }) => {
|
|
5702
|
-
const expr = parser.parse({ terminals: [bp - 1] });
|
|
5703
|
-
return {
|
|
5704
|
-
start: left.value,
|
|
5705
|
-
stop: expr.value
|
|
5706
|
-
};
|
|
5707
|
-
}).nud("RANGE", 20, ({ bp }) => {
|
|
5708
|
-
let ranges = parser.parse();
|
|
5709
|
-
if (!Array.isArray(ranges)) {
|
|
5710
|
-
ranges = [ranges];
|
|
5711
|
-
}
|
|
5712
|
-
return ranges.map((range) => {
|
|
5713
|
-
let func;
|
|
5714
|
-
if (range.start !== null && range.stop !== null) {
|
|
5715
|
-
func = (obj) => obj >= range.start && obj <= range.stop;
|
|
5716
|
-
} else if (range.start === null && range.stop !== null) {
|
|
5717
|
-
func = (obj) => obj <= range.stop;
|
|
5718
|
-
} else if (range.start !== null && range.stop === null) {
|
|
5719
|
-
func = (obj) => obj >= range.start;
|
|
5720
|
-
} else {
|
|
5721
|
-
func = (obj) => true;
|
|
5722
|
-
}
|
|
5723
|
-
return {
|
|
5724
|
-
type: "RangeExpression",
|
|
5725
|
-
start: range.start,
|
|
5726
|
-
stop: range.stop,
|
|
5727
|
-
match: func
|
|
5728
|
-
};
|
|
5729
|
-
});
|
|
5730
|
-
}).build();
|
|
5731
|
-
return parser.parse();
|
|
5732
|
-
};
|
|
5733
|
-
var generateMatchFunc2 = (filter) => {
|
|
5734
|
-
const result = parseFilter(filter);
|
|
5735
|
-
if (!result) {
|
|
5736
|
-
throw new Error(`Syntax error while parsing '${filter}'.`);
|
|
5737
|
-
}
|
|
5738
|
-
if (result.type == "TermExpression") {
|
|
5739
|
-
throw new Error(`Syntax error while parsing '${filter}'.`);
|
|
5740
|
-
}
|
|
5741
|
-
return (obj) => {
|
|
5742
|
-
if (!result.children)
|
|
5743
|
-
return false;
|
|
5744
|
-
return result.children.some((c) => c.match(obj));
|
|
5745
|
-
};
|
|
5746
|
-
};
|
|
5747
|
-
var generateFacetFunc = (filter) => {
|
|
5748
|
-
if (!filter.includes(":")) {
|
|
5749
|
-
return {
|
|
5750
|
-
source: filter,
|
|
5751
|
-
type: "TermExpression"
|
|
5752
|
-
};
|
|
5753
|
-
}
|
|
5754
|
-
return parseFilter(filter);
|
|
5755
|
-
};
|
|
5756
|
-
var filterProduct = (source, exprFunc) => (p, markMatchingVariants) => {
|
|
5757
|
-
const value = nestedLookup(p, source);
|
|
5758
|
-
return exprFunc(value);
|
|
5759
|
-
};
|
|
5760
|
-
var filterVariants = (source, exprFunc) => (p, markMatchingVariants) => {
|
|
5761
|
-
const [, ...paths] = source.split(".");
|
|
5762
|
-
const path = paths.join(".");
|
|
5763
|
-
const variants = getVariants(p);
|
|
5764
|
-
for (const variant of variants) {
|
|
5765
|
-
const value = resolveVariantValue(variant, path);
|
|
5766
|
-
if (exprFunc(value)) {
|
|
5767
|
-
if (markMatchingVariants) {
|
|
5768
|
-
for (const v of variants) {
|
|
5769
|
-
v.isMatchingVariant = false;
|
|
5770
|
-
}
|
|
5771
|
-
variant.isMatchingVariant = true;
|
|
5772
|
-
}
|
|
5773
|
-
return true;
|
|
5774
|
-
}
|
|
5775
|
-
}
|
|
5776
|
-
return false;
|
|
5777
|
-
};
|
|
5778
|
-
var resolveVariantValue = (obj, path) => {
|
|
5779
|
-
if (path === void 0) {
|
|
5780
|
-
return obj;
|
|
5781
|
-
}
|
|
5782
|
-
if (path.startsWith("variants.")) {
|
|
5783
|
-
path = path.substring(path.indexOf(".") + 1);
|
|
5784
|
-
}
|
|
5785
|
-
if (path.startsWith("attributes.")) {
|
|
5786
|
-
const [, attrName, ...rest] = path.split(".");
|
|
5787
|
-
if (!obj.attributes) {
|
|
5788
|
-
return void 0;
|
|
5789
|
-
}
|
|
5790
|
-
for (const attr of obj.attributes) {
|
|
5791
|
-
if (attr.name === attrName) {
|
|
5792
|
-
return nestedLookup(attr.value, rest.join("."));
|
|
5793
|
-
}
|
|
5794
|
-
}
|
|
5795
|
-
}
|
|
5796
|
-
if (path === "price.centAmount") {
|
|
5797
|
-
return obj.prices && obj.prices.length > 0 ? obj.prices[0].value.centAmount : void 0;
|
|
5798
|
-
}
|
|
5799
|
-
return nestedLookup(obj, path);
|
|
5800
|
-
};
|
|
5801
|
-
var getVariants = (p) => [
|
|
5802
|
-
p.masterVariant,
|
|
5803
|
-
...p.variants ?? []
|
|
5804
|
-
];
|
|
5805
|
-
|
|
5806
5977
|
// src/product-projection-search.ts
|
|
5807
5978
|
var ProductProjectionSearch = class {
|
|
5808
5979
|
_storage;
|