@labdigital/commercetools-mock 0.7.1 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +26 -1
- package/dist/index.global.js +387 -92
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +384 -89
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +384 -89
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -4
- package/src/helpers.ts +24 -0
- package/src/lib/predicateParser.test.ts +16 -0
- package/src/lib/predicateParser.ts +8 -1
- package/src/lib/projectionSearchFilter.test.ts +6 -0
- package/src/lib/projectionSearchFilter.ts +173 -74
- package/src/product-projection-search.ts +210 -10
- package/src/repositories/abstract.ts +23 -5
- package/src/repositories/extension.ts +18 -1
- package/src/repositories/helpers.ts +37 -3
- package/src/repositories/product-projection.ts +1 -0
- package/src/repositories/project.ts +10 -5
- package/src/repositories/state.ts +14 -0
- package/src/services/product-projection.test.ts +170 -3
- package/src/validate.js +0 -1
package/dist/index.mjs
CHANGED
|
@@ -94,7 +94,7 @@ var resolveValue = (obj, val) => {
|
|
|
94
94
|
return obj[val.value];
|
|
95
95
|
};
|
|
96
96
|
var getLexer = (value) => {
|
|
97
|
-
return new perplex(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("FLOAT", /\d+\.\d+/).token("INT", /\d+/).token("VARIABLE", /:([-_A-Za-z0-9]+)/).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);
|
|
97
|
+
return new perplex(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("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);
|
|
98
98
|
};
|
|
99
99
|
var generateMatchFunc = (predicate) => {
|
|
100
100
|
const lexer = getLexer(predicate);
|
|
@@ -104,6 +104,12 @@ var generateMatchFunc = (predicate) => {
|
|
|
104
104
|
value: t.token.match,
|
|
105
105
|
pos: t.token.strpos()
|
|
106
106
|
};
|
|
107
|
+
}).nud("BOOLEAN", 1, (t) => {
|
|
108
|
+
return {
|
|
109
|
+
type: "boolean",
|
|
110
|
+
value: t.token.match === "true" ? true : false,
|
|
111
|
+
pos: t.token.strpos()
|
|
112
|
+
};
|
|
107
113
|
}).nud("VARIABLE", 100, (t) => {
|
|
108
114
|
return {
|
|
109
115
|
type: "var",
|
|
@@ -787,6 +793,21 @@ var getBaseResourceProperties = () => {
|
|
|
787
793
|
version: 0
|
|
788
794
|
};
|
|
789
795
|
};
|
|
796
|
+
var nestedLookup = (obj, path) => {
|
|
797
|
+
if (!path || path === "") {
|
|
798
|
+
return obj;
|
|
799
|
+
}
|
|
800
|
+
const parts = path.split(".");
|
|
801
|
+
let val = obj;
|
|
802
|
+
for (let i = 0; i < parts.length; i++) {
|
|
803
|
+
const part = parts[i];
|
|
804
|
+
if (val == void 0) {
|
|
805
|
+
return void 0;
|
|
806
|
+
}
|
|
807
|
+
val = val[part];
|
|
808
|
+
}
|
|
809
|
+
return val;
|
|
810
|
+
};
|
|
790
811
|
var QueryParamsAsArray = (input) => {
|
|
791
812
|
if (input == void 0) {
|
|
792
813
|
return [];
|
|
@@ -896,10 +917,41 @@ var createPrice = (draft) => {
|
|
|
896
917
|
};
|
|
897
918
|
};
|
|
898
919
|
var createTypedMoney = (value) => {
|
|
920
|
+
let fractionDigits = 2;
|
|
921
|
+
switch (value.currencyCode.toUpperCase()) {
|
|
922
|
+
case "BHD":
|
|
923
|
+
case "IQD":
|
|
924
|
+
case "JOD":
|
|
925
|
+
case "KWD":
|
|
926
|
+
case "LYD":
|
|
927
|
+
case "OMR":
|
|
928
|
+
case "TND":
|
|
929
|
+
fractionDigits = 3;
|
|
930
|
+
break;
|
|
931
|
+
case "CVE":
|
|
932
|
+
case "DJF":
|
|
933
|
+
case "GNF":
|
|
934
|
+
case "IDR":
|
|
935
|
+
case "JPY":
|
|
936
|
+
case "KMF":
|
|
937
|
+
case "KRW":
|
|
938
|
+
case "PYG":
|
|
939
|
+
case "RWF":
|
|
940
|
+
case "UGX":
|
|
941
|
+
case "VND":
|
|
942
|
+
case "VUV":
|
|
943
|
+
case "XAF":
|
|
944
|
+
case "XOF":
|
|
945
|
+
case "XPF":
|
|
946
|
+
fractionDigits = 0;
|
|
947
|
+
break;
|
|
948
|
+
default:
|
|
949
|
+
fractionDigits = 2;
|
|
950
|
+
}
|
|
899
951
|
return {
|
|
900
952
|
type: "centPrecision",
|
|
901
|
-
|
|
902
|
-
|
|
953
|
+
...value,
|
|
954
|
+
fractionDigits
|
|
903
955
|
};
|
|
904
956
|
};
|
|
905
957
|
var resolveStoreReference = (ref, projectKey, storage) => {
|
|
@@ -1107,7 +1159,14 @@ var AbstractRepository = class {
|
|
|
1107
1159
|
if (!deepEqual(modifiedResource, resource)) {
|
|
1108
1160
|
this.save(context, modifiedResource);
|
|
1109
1161
|
}
|
|
1110
|
-
|
|
1162
|
+
const result = this.postProcessResource(modifiedResource);
|
|
1163
|
+
if (!result) {
|
|
1164
|
+
throw new Error("invalid post process action");
|
|
1165
|
+
}
|
|
1166
|
+
return result;
|
|
1167
|
+
}
|
|
1168
|
+
postProcessResource(resource) {
|
|
1169
|
+
return resource;
|
|
1111
1170
|
}
|
|
1112
1171
|
};
|
|
1113
1172
|
var AbstractResourceRepository = class extends AbstractRepository {
|
|
@@ -1116,31 +1175,36 @@ var AbstractResourceRepository = class extends AbstractRepository {
|
|
|
1116
1175
|
this._storage.assertStorage(this.getTypeId());
|
|
1117
1176
|
}
|
|
1118
1177
|
query(context, params = {}) {
|
|
1119
|
-
|
|
1178
|
+
const result = this._storage.query(context.projectKey, this.getTypeId(), {
|
|
1120
1179
|
expand: params.expand,
|
|
1121
1180
|
where: params.where,
|
|
1122
1181
|
offset: params.offset,
|
|
1123
1182
|
limit: params.limit
|
|
1124
1183
|
});
|
|
1184
|
+
result.results = result.results.map(this.postProcessResource);
|
|
1185
|
+
return result;
|
|
1125
1186
|
}
|
|
1126
1187
|
get(context, id, params = {}) {
|
|
1127
|
-
|
|
1188
|
+
const resource = this._storage.get(context.projectKey, this.getTypeId(), id, params);
|
|
1189
|
+
return this.postProcessResource(resource);
|
|
1128
1190
|
}
|
|
1129
1191
|
getByKey(context, key, params = {}) {
|
|
1130
|
-
|
|
1192
|
+
const resource = this._storage.getByKey(
|
|
1131
1193
|
context.projectKey,
|
|
1132
1194
|
this.getTypeId(),
|
|
1133
1195
|
key,
|
|
1134
1196
|
params
|
|
1135
1197
|
);
|
|
1198
|
+
return this.postProcessResource(resource);
|
|
1136
1199
|
}
|
|
1137
1200
|
delete(context, id, params = {}) {
|
|
1138
|
-
|
|
1201
|
+
const resource = this._storage.delete(
|
|
1139
1202
|
context.projectKey,
|
|
1140
1203
|
this.getTypeId(),
|
|
1141
1204
|
id,
|
|
1142
1205
|
params
|
|
1143
1206
|
);
|
|
1207
|
+
return this.postProcessResource(resource);
|
|
1144
1208
|
}
|
|
1145
1209
|
save(context, resource) {
|
|
1146
1210
|
const current = this.get(context, resource.id);
|
|
@@ -2424,6 +2488,25 @@ var DiscountCodeService = class extends AbstractService {
|
|
|
2424
2488
|
}
|
|
2425
2489
|
};
|
|
2426
2490
|
|
|
2491
|
+
// src/lib/masking.ts
|
|
2492
|
+
var maskSecretValue = (resource, path) => {
|
|
2493
|
+
const parts = path.split(".");
|
|
2494
|
+
const clone = JSON.parse(JSON.stringify(resource));
|
|
2495
|
+
let val = clone;
|
|
2496
|
+
const target = parts.pop();
|
|
2497
|
+
for (let i = 0; i < parts.length; i++) {
|
|
2498
|
+
const part = parts[i];
|
|
2499
|
+
val = val[part];
|
|
2500
|
+
if (val === void 0) {
|
|
2501
|
+
return resource;
|
|
2502
|
+
}
|
|
2503
|
+
}
|
|
2504
|
+
if (val && target && val[target]) {
|
|
2505
|
+
val[target] = "****";
|
|
2506
|
+
}
|
|
2507
|
+
return clone;
|
|
2508
|
+
};
|
|
2509
|
+
|
|
2427
2510
|
// src/repositories/extension.ts
|
|
2428
2511
|
var ExtensionRepository = class extends AbstractResourceRepository {
|
|
2429
2512
|
constructor() {
|
|
@@ -2446,6 +2529,23 @@ var ExtensionRepository = class extends AbstractResourceRepository {
|
|
|
2446
2529
|
getTypeId() {
|
|
2447
2530
|
return "extension";
|
|
2448
2531
|
}
|
|
2532
|
+
postProcessResource(resource) {
|
|
2533
|
+
var _a;
|
|
2534
|
+
if (resource) {
|
|
2535
|
+
if (resource.destination.type === "HTTP" && ((_a = resource.destination.authentication) == null ? void 0 : _a.type) === "AuthorizationHeader") {
|
|
2536
|
+
return maskSecretValue(
|
|
2537
|
+
resource,
|
|
2538
|
+
"destination.authentication.headerValue"
|
|
2539
|
+
);
|
|
2540
|
+
} else if (resource.destination.type == "AWSLambda") {
|
|
2541
|
+
return maskSecretValue(
|
|
2542
|
+
resource,
|
|
2543
|
+
"destination.accessSecret"
|
|
2544
|
+
);
|
|
2545
|
+
}
|
|
2546
|
+
}
|
|
2547
|
+
return resource;
|
|
2548
|
+
}
|
|
2449
2549
|
create(context, draft) {
|
|
2450
2550
|
const resource = {
|
|
2451
2551
|
...getBaseResourceProperties(),
|
|
@@ -2876,38 +2976,71 @@ var parseFilterExpression = (filter, staged) => {
|
|
|
2876
2976
|
var getLexer2 = (value) => {
|
|
2877
2977
|
return new perplex2(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);
|
|
2878
2978
|
};
|
|
2879
|
-
var
|
|
2979
|
+
var parseFilter = (filter) => {
|
|
2880
2980
|
const lexer = getLexer2(filter);
|
|
2881
2981
|
const parser = new Parser2(lexer).builder().nud("IDENTIFIER", 100, (t) => {
|
|
2882
2982
|
return t.token.match;
|
|
2883
2983
|
}).led(":", 100, ({ left, bp }) => {
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
|
|
2888
|
-
|
|
2984
|
+
let parsed = parser.parse({ terminals: [bp - 1] });
|
|
2985
|
+
let expressions;
|
|
2986
|
+
expressions = !Array.isArray(parsed) ? [parsed] : parsed;
|
|
2987
|
+
const unique = new Set(expressions.map((expr) => expr.type));
|
|
2988
|
+
if (unique.size > 1) {
|
|
2989
|
+
throw new Error("Invalid expression");
|
|
2889
2990
|
}
|
|
2890
|
-
if (
|
|
2891
|
-
return
|
|
2892
|
-
|
|
2991
|
+
if (expressions.some((expr) => expr.type == "Symbol")) {
|
|
2992
|
+
return {
|
|
2993
|
+
source: left,
|
|
2994
|
+
type: "FilterExpression",
|
|
2995
|
+
children: expressions.map((e) => {
|
|
2996
|
+
if (e.type != "Symbol") {
|
|
2997
|
+
throw new Error("Invalid expression");
|
|
2998
|
+
}
|
|
2999
|
+
return {
|
|
3000
|
+
type: "FilterExpression",
|
|
3001
|
+
match: (obj) => {
|
|
3002
|
+
return obj === e.value;
|
|
3003
|
+
}
|
|
3004
|
+
};
|
|
3005
|
+
})
|
|
2893
3006
|
};
|
|
2894
3007
|
}
|
|
2895
|
-
return
|
|
2896
|
-
|
|
3008
|
+
return {
|
|
3009
|
+
source: left,
|
|
3010
|
+
type: expressions[0].type,
|
|
3011
|
+
children: expressions
|
|
2897
3012
|
};
|
|
2898
3013
|
}).nud("STRING", 20, (t) => {
|
|
2899
|
-
return
|
|
3014
|
+
return {
|
|
3015
|
+
type: "Symbol",
|
|
3016
|
+
kind: "string",
|
|
3017
|
+
value: t.token.groups[1]
|
|
3018
|
+
};
|
|
2900
3019
|
}).nud("INT", 5, (t) => {
|
|
2901
|
-
return
|
|
3020
|
+
return {
|
|
3021
|
+
type: "Symbol",
|
|
3022
|
+
kind: "int",
|
|
3023
|
+
value: parseInt(t.token.match, 10)
|
|
3024
|
+
};
|
|
2902
3025
|
}).nud("STAR", 5, (t) => {
|
|
2903
|
-
return
|
|
3026
|
+
return {
|
|
3027
|
+
type: "Symbol",
|
|
3028
|
+
kind: "any",
|
|
3029
|
+
value: null
|
|
3030
|
+
};
|
|
2904
3031
|
}).nud("EXISTS", 10, ({ bp }) => {
|
|
2905
|
-
return
|
|
2906
|
-
|
|
3032
|
+
return {
|
|
3033
|
+
type: "FilterExpression",
|
|
3034
|
+
match: (obj) => {
|
|
3035
|
+
return obj !== void 0;
|
|
3036
|
+
}
|
|
2907
3037
|
};
|
|
2908
3038
|
}).nud("MISSING", 10, ({ bp }) => {
|
|
2909
|
-
return
|
|
2910
|
-
|
|
3039
|
+
return {
|
|
3040
|
+
type: "FilterExpression",
|
|
3041
|
+
match: (obj) => {
|
|
3042
|
+
return obj === void 0;
|
|
3043
|
+
}
|
|
2911
3044
|
};
|
|
2912
3045
|
}).led("COMMA", 200, ({ left, token, bp }) => {
|
|
2913
3046
|
const expr = parser.parse({ terminals: [bp - 1] });
|
|
@@ -2916,38 +3049,74 @@ var generateMatchFunc2 = (filter) => {
|
|
|
2916
3049
|
} else {
|
|
2917
3050
|
return [left, expr];
|
|
2918
3051
|
}
|
|
3052
|
+
}).nud("(", 100, (t) => {
|
|
3053
|
+
const expr = parser.parse({ terminals: [")"] });
|
|
3054
|
+
lexer.expect(")");
|
|
3055
|
+
return expr;
|
|
2919
3056
|
}).bp(")", 0).led("TO", 20, ({ left, bp }) => {
|
|
2920
3057
|
const expr = parser.parse({ terminals: [bp - 1] });
|
|
2921
|
-
return
|
|
3058
|
+
return {
|
|
3059
|
+
start: left.value,
|
|
3060
|
+
stop: expr.value
|
|
3061
|
+
};
|
|
2922
3062
|
}).nud("RANGE", 20, ({ bp }) => {
|
|
2923
|
-
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
if (start !== null && stop !== null) {
|
|
2927
|
-
return (obj) => {
|
|
2928
|
-
return obj >= start && obj <= stop;
|
|
2929
|
-
};
|
|
2930
|
-
} else if (start === null && stop !== null) {
|
|
2931
|
-
return (obj) => {
|
|
2932
|
-
return obj <= stop;
|
|
2933
|
-
};
|
|
2934
|
-
} else if (start !== null && stop === null) {
|
|
2935
|
-
return (obj) => {
|
|
2936
|
-
return obj >= start;
|
|
2937
|
-
};
|
|
2938
|
-
} else {
|
|
2939
|
-
return (obj) => {
|
|
2940
|
-
return true;
|
|
2941
|
-
};
|
|
3063
|
+
let ranges = parser.parse();
|
|
3064
|
+
if (!Array.isArray(ranges)) {
|
|
3065
|
+
ranges = [ranges];
|
|
2942
3066
|
}
|
|
3067
|
+
return ranges.map((range) => {
|
|
3068
|
+
let func = void 0;
|
|
3069
|
+
if (range.start !== null && range.stop !== null) {
|
|
3070
|
+
func = (obj) => {
|
|
3071
|
+
return obj >= range.start && obj <= range.stop;
|
|
3072
|
+
};
|
|
3073
|
+
} else if (range.start === null && range.stop !== null) {
|
|
3074
|
+
func = (obj) => {
|
|
3075
|
+
return obj <= range.stop;
|
|
3076
|
+
};
|
|
3077
|
+
} else if (range.start !== null && range.stop === null) {
|
|
3078
|
+
func = (obj) => {
|
|
3079
|
+
return obj >= range.start;
|
|
3080
|
+
};
|
|
3081
|
+
} else {
|
|
3082
|
+
func = (obj) => {
|
|
3083
|
+
return true;
|
|
3084
|
+
};
|
|
3085
|
+
}
|
|
3086
|
+
return {
|
|
3087
|
+
type: "RangeExpression",
|
|
3088
|
+
start: range.start,
|
|
3089
|
+
stop: range.stop,
|
|
3090
|
+
match: func
|
|
3091
|
+
};
|
|
3092
|
+
});
|
|
2943
3093
|
}).build();
|
|
2944
|
-
|
|
2945
|
-
|
|
3094
|
+
return parser.parse();
|
|
3095
|
+
};
|
|
3096
|
+
var generateMatchFunc2 = (filter) => {
|
|
3097
|
+
const result = parseFilter(filter);
|
|
3098
|
+
if (!result) {
|
|
2946
3099
|
const lines = filter.split("\n");
|
|
2947
3100
|
const column = lines[lines.length - 1].length;
|
|
2948
3101
|
throw new Error(`Syntax error while parsing '${filter}'.`);
|
|
2949
3102
|
}
|
|
2950
|
-
|
|
3103
|
+
if (result.type == "TermExpression") {
|
|
3104
|
+
throw new Error(`Syntax error while parsing '${filter}'.`);
|
|
3105
|
+
}
|
|
3106
|
+
return (obj) => {
|
|
3107
|
+
if (!result.children)
|
|
3108
|
+
return false;
|
|
3109
|
+
return result.children.some((c) => c.match(obj));
|
|
3110
|
+
};
|
|
3111
|
+
};
|
|
3112
|
+
var generateFacetFunc = (filter) => {
|
|
3113
|
+
if (!filter.includes(":")) {
|
|
3114
|
+
return {
|
|
3115
|
+
source: filter,
|
|
3116
|
+
type: "TermExpression"
|
|
3117
|
+
};
|
|
3118
|
+
}
|
|
3119
|
+
return parseFilter(filter);
|
|
2951
3120
|
};
|
|
2952
3121
|
var filterProduct = (source, exprFunc) => {
|
|
2953
3122
|
return (p, markMatchingVariants) => {
|
|
@@ -2977,6 +3146,9 @@ var resolveVariantValue = (obj, path) => {
|
|
|
2977
3146
|
if (path === void 0) {
|
|
2978
3147
|
return obj;
|
|
2979
3148
|
}
|
|
3149
|
+
if (path.startsWith("variants.")) {
|
|
3150
|
+
path = path.substring(path.indexOf(".") + 1);
|
|
3151
|
+
}
|
|
2980
3152
|
if (path.startsWith("attributes.")) {
|
|
2981
3153
|
const [, attrName, ...rest] = path.split(".");
|
|
2982
3154
|
if (!obj.attributes) {
|
|
@@ -2993,21 +3165,6 @@ var resolveVariantValue = (obj, path) => {
|
|
|
2993
3165
|
}
|
|
2994
3166
|
return nestedLookup(obj, path);
|
|
2995
3167
|
};
|
|
2996
|
-
var nestedLookup = (obj, path) => {
|
|
2997
|
-
if (!path || path === "") {
|
|
2998
|
-
return obj;
|
|
2999
|
-
}
|
|
3000
|
-
const parts = path.split(".");
|
|
3001
|
-
let val = obj;
|
|
3002
|
-
for (let i = 0; i < parts.length; i++) {
|
|
3003
|
-
const part = parts[i];
|
|
3004
|
-
if (val == void 0) {
|
|
3005
|
-
return void 0;
|
|
3006
|
-
}
|
|
3007
|
-
val = val[part];
|
|
3008
|
-
}
|
|
3009
|
-
return val;
|
|
3010
|
-
};
|
|
3011
3168
|
var getVariants = (p, staged) => {
|
|
3012
3169
|
var _a, _b, _c, _d;
|
|
3013
3170
|
return [
|
|
@@ -3100,6 +3257,7 @@ var ProductProjectionSearch = class {
|
|
|
3100
3257
|
);
|
|
3101
3258
|
}
|
|
3102
3259
|
}
|
|
3260
|
+
const facets = this.getFacets(params, resources);
|
|
3103
3261
|
if (params["filter.query"]) {
|
|
3104
3262
|
try {
|
|
3105
3263
|
const filters = params["filter.query"].map(
|
|
@@ -3133,7 +3291,7 @@ var ProductProjectionSearch = class {
|
|
|
3133
3291
|
offset,
|
|
3134
3292
|
limit,
|
|
3135
3293
|
results: resources.map(this.transform),
|
|
3136
|
-
facets
|
|
3294
|
+
facets
|
|
3137
3295
|
};
|
|
3138
3296
|
}
|
|
3139
3297
|
transform(product) {
|
|
@@ -3144,6 +3302,9 @@ var ProductProjectionSearch = class {
|
|
|
3144
3302
|
lastModifiedAt: product.lastModifiedAt,
|
|
3145
3303
|
version: product.version,
|
|
3146
3304
|
name: obj.name,
|
|
3305
|
+
key: product.key,
|
|
3306
|
+
description: obj.description,
|
|
3307
|
+
metaDescription: obj.metaDescription,
|
|
3147
3308
|
slug: obj.slug,
|
|
3148
3309
|
categories: obj.categories,
|
|
3149
3310
|
masterVariant: obj.masterVariant,
|
|
@@ -3151,6 +3312,145 @@ var ProductProjectionSearch = class {
|
|
|
3151
3312
|
productType: product.productType
|
|
3152
3313
|
};
|
|
3153
3314
|
}
|
|
3315
|
+
getFacets(params, products) {
|
|
3316
|
+
if (!params.facet)
|
|
3317
|
+
return {};
|
|
3318
|
+
const staged = false;
|
|
3319
|
+
const result = {};
|
|
3320
|
+
for (const facet of params.facet) {
|
|
3321
|
+
const expression = generateFacetFunc(facet);
|
|
3322
|
+
if (expression.type === "TermExpression") {
|
|
3323
|
+
result[facet] = this.termFacet(expression.source, products, staged);
|
|
3324
|
+
}
|
|
3325
|
+
if (expression.type === "RangeExpression") {
|
|
3326
|
+
result[expression.source] = this.rangeFacet(
|
|
3327
|
+
expression.source,
|
|
3328
|
+
expression.children,
|
|
3329
|
+
products,
|
|
3330
|
+
staged
|
|
3331
|
+
);
|
|
3332
|
+
}
|
|
3333
|
+
if (expression.type === "FilterExpression") {
|
|
3334
|
+
result[expression.source] = this.filterFacet(
|
|
3335
|
+
expression.source,
|
|
3336
|
+
expression.children,
|
|
3337
|
+
products,
|
|
3338
|
+
staged
|
|
3339
|
+
);
|
|
3340
|
+
}
|
|
3341
|
+
}
|
|
3342
|
+
return result;
|
|
3343
|
+
}
|
|
3344
|
+
termFacet(facet, products, staged) {
|
|
3345
|
+
const result = {
|
|
3346
|
+
type: "terms",
|
|
3347
|
+
dataType: "text",
|
|
3348
|
+
missing: 0,
|
|
3349
|
+
total: 0,
|
|
3350
|
+
other: 0,
|
|
3351
|
+
terms: []
|
|
3352
|
+
};
|
|
3353
|
+
const terms = {};
|
|
3354
|
+
if (facet.startsWith("variants.")) {
|
|
3355
|
+
products.forEach((p) => {
|
|
3356
|
+
const variants = getVariants(p, staged);
|
|
3357
|
+
variants.forEach((v) => {
|
|
3358
|
+
result.total++;
|
|
3359
|
+
let value = resolveVariantValue(v, facet);
|
|
3360
|
+
if (value === void 0) {
|
|
3361
|
+
result.missing++;
|
|
3362
|
+
} else {
|
|
3363
|
+
if (typeof value === "number") {
|
|
3364
|
+
value = Number(value).toFixed(1);
|
|
3365
|
+
}
|
|
3366
|
+
terms[value] = value in terms ? terms[value] + 1 : 1;
|
|
3367
|
+
}
|
|
3368
|
+
});
|
|
3369
|
+
});
|
|
3370
|
+
} else {
|
|
3371
|
+
products.forEach((p) => {
|
|
3372
|
+
const value = nestedLookup(p, facet);
|
|
3373
|
+
result.total++;
|
|
3374
|
+
if (value === void 0) {
|
|
3375
|
+
result.missing++;
|
|
3376
|
+
} else {
|
|
3377
|
+
terms[value] = value in terms ? terms[value] + 1 : 1;
|
|
3378
|
+
}
|
|
3379
|
+
});
|
|
3380
|
+
}
|
|
3381
|
+
for (const term in terms) {
|
|
3382
|
+
result.terms.push({
|
|
3383
|
+
term,
|
|
3384
|
+
count: terms[term]
|
|
3385
|
+
});
|
|
3386
|
+
}
|
|
3387
|
+
return result;
|
|
3388
|
+
}
|
|
3389
|
+
filterFacet(source, filters, products, staged) {
|
|
3390
|
+
let count = 0;
|
|
3391
|
+
if (source.startsWith("variants.")) {
|
|
3392
|
+
for (const p of products) {
|
|
3393
|
+
for (const v of getVariants(p, staged)) {
|
|
3394
|
+
const val = resolveVariantValue(v, source);
|
|
3395
|
+
if (filters == null ? void 0 : filters.some((f) => f.match(val))) {
|
|
3396
|
+
count++;
|
|
3397
|
+
}
|
|
3398
|
+
}
|
|
3399
|
+
}
|
|
3400
|
+
} else {
|
|
3401
|
+
throw new Error("not supported");
|
|
3402
|
+
}
|
|
3403
|
+
return {
|
|
3404
|
+
type: "filter",
|
|
3405
|
+
count
|
|
3406
|
+
};
|
|
3407
|
+
}
|
|
3408
|
+
rangeFacet(source, ranges, products, staged) {
|
|
3409
|
+
const counts = (ranges == null ? void 0 : ranges.map((range) => {
|
|
3410
|
+
if (source.startsWith("variants.")) {
|
|
3411
|
+
const values = [];
|
|
3412
|
+
for (const p of products) {
|
|
3413
|
+
for (const v of getVariants(p, staged)) {
|
|
3414
|
+
const val = resolveVariantValue(v, source);
|
|
3415
|
+
if (val === void 0) {
|
|
3416
|
+
continue;
|
|
3417
|
+
}
|
|
3418
|
+
if (range.match(val)) {
|
|
3419
|
+
values.push(val);
|
|
3420
|
+
}
|
|
3421
|
+
}
|
|
3422
|
+
}
|
|
3423
|
+
const numValues = values.length;
|
|
3424
|
+
return {
|
|
3425
|
+
type: "double",
|
|
3426
|
+
from: range.start || 0,
|
|
3427
|
+
fromStr: range.start !== null ? Number(range.start).toFixed(1) : "",
|
|
3428
|
+
to: range.stop || 0,
|
|
3429
|
+
toStr: range.stop !== null ? Number(range.stop).toFixed(1) : "",
|
|
3430
|
+
count: numValues,
|
|
3431
|
+
total: values.reduce((a, b) => a + b, 0),
|
|
3432
|
+
min: numValues > 0 ? Math.min(...values) : 0,
|
|
3433
|
+
max: numValues > 0 ? Math.max(...values) : 0,
|
|
3434
|
+
mean: numValues > 0 ? mean(values) : 0
|
|
3435
|
+
};
|
|
3436
|
+
} else {
|
|
3437
|
+
throw new Error("not supported");
|
|
3438
|
+
}
|
|
3439
|
+
})) || [];
|
|
3440
|
+
const data = {
|
|
3441
|
+
type: "range",
|
|
3442
|
+
dataType: "number",
|
|
3443
|
+
ranges: counts
|
|
3444
|
+
};
|
|
3445
|
+
return data;
|
|
3446
|
+
}
|
|
3447
|
+
};
|
|
3448
|
+
var mean = (arr) => {
|
|
3449
|
+
let total = 0;
|
|
3450
|
+
for (let i = 0; i < arr.length; i++) {
|
|
3451
|
+
total += arr[i];
|
|
3452
|
+
}
|
|
3453
|
+
return total / arr.length;
|
|
3154
3454
|
};
|
|
3155
3455
|
|
|
3156
3456
|
// src/repositories/product-projection.ts
|
|
@@ -3178,6 +3478,7 @@ var ProductProjectionRepository = class extends AbstractResourceRepository {
|
|
|
3178
3478
|
const results = this._searchService.search(context.projectKey, {
|
|
3179
3479
|
filter: QueryParamsAsArray(query.filter),
|
|
3180
3480
|
"filter.query": QueryParamsAsArray(query["filter.query"]),
|
|
3481
|
+
facet: QueryParamsAsArray(query.facet),
|
|
3181
3482
|
offset: query.offset ? Number(query.offset) : void 0,
|
|
3182
3483
|
limit: query.limit ? Number(query.limit) : void 0,
|
|
3183
3484
|
expand: QueryParamsAsArray(query.expand)
|
|
@@ -3527,25 +3828,6 @@ var ProductTypeService = class extends AbstractService {
|
|
|
3527
3828
|
}
|
|
3528
3829
|
};
|
|
3529
3830
|
|
|
3530
|
-
// src/lib/masking.ts
|
|
3531
|
-
var maskSecretValue = (resource, path) => {
|
|
3532
|
-
const parts = path.split(".");
|
|
3533
|
-
const clone = JSON.parse(JSON.stringify(resource));
|
|
3534
|
-
let val = clone;
|
|
3535
|
-
const target = parts.pop();
|
|
3536
|
-
for (let i = 0; i < parts.length; i++) {
|
|
3537
|
-
const part = parts[i];
|
|
3538
|
-
val = val[part];
|
|
3539
|
-
if (val === void 0) {
|
|
3540
|
-
return resource;
|
|
3541
|
-
}
|
|
3542
|
-
}
|
|
3543
|
-
if (val && target && val[target]) {
|
|
3544
|
-
val[target] = "****";
|
|
3545
|
-
}
|
|
3546
|
-
return clone;
|
|
3547
|
-
};
|
|
3548
|
-
|
|
3549
3831
|
// src/repositories/project.ts
|
|
3550
3832
|
var ProjectRepository = class extends AbstractRepository {
|
|
3551
3833
|
constructor() {
|
|
@@ -3603,11 +3885,16 @@ var ProjectRepository = class extends AbstractRepository {
|
|
|
3603
3885
|
}
|
|
3604
3886
|
get(context) {
|
|
3605
3887
|
const resource = this._storage.getProject(context.projectKey);
|
|
3606
|
-
|
|
3607
|
-
|
|
3608
|
-
|
|
3609
|
-
)
|
|
3610
|
-
|
|
3888
|
+
return this.postProcessResource(resource);
|
|
3889
|
+
}
|
|
3890
|
+
postProcessResource(resource) {
|
|
3891
|
+
if (resource) {
|
|
3892
|
+
return maskSecretValue(
|
|
3893
|
+
resource,
|
|
3894
|
+
"externalOAuth.authorizationHeader"
|
|
3895
|
+
);
|
|
3896
|
+
}
|
|
3897
|
+
return resource;
|
|
3611
3898
|
}
|
|
3612
3899
|
save(context, resource) {
|
|
3613
3900
|
const current = this.get(context);
|
|
@@ -3876,6 +4163,14 @@ var StateRepository = class extends AbstractResourceRepository {
|
|
|
3876
4163
|
},
|
|
3877
4164
|
setRoles: (context, resource, { roles }) => {
|
|
3878
4165
|
resource.roles = roles;
|
|
4166
|
+
},
|
|
4167
|
+
setTransitions: (context, resource, { transitions }) => {
|
|
4168
|
+
resource.transitions = transitions == null ? void 0 : transitions.map((resourceId) => {
|
|
4169
|
+
return {
|
|
4170
|
+
id: resourceId.id || "",
|
|
4171
|
+
typeId: "state"
|
|
4172
|
+
};
|
|
4173
|
+
});
|
|
3879
4174
|
}
|
|
3880
4175
|
};
|
|
3881
4176
|
}
|