@schukai/monster 4.143.4 → 4.143.5
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/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"author":"Volker Schukai","dependencies":{"@floating-ui/dom":"^1.7.6"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"4.143.
|
|
1
|
+
{"author":"Volker Schukai","dependencies":{"@floating-ui/dom":"^1.7.6"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"4.143.5"}
|
|
@@ -1089,6 +1089,10 @@ function initTabEvents() {
|
|
|
1089
1089
|
return host.getConfig(configKey);
|
|
1090
1090
|
})
|
|
1091
1091
|
.then((config) => {
|
|
1092
|
+
if (!isObject(config)) {
|
|
1093
|
+
return;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1092
1096
|
for (const [name, query] of Object.entries(config)) {
|
|
1093
1097
|
if (labels.includes(name)) {
|
|
1094
1098
|
continue;
|
|
@@ -1130,6 +1134,10 @@ function updateFilterTabs() {
|
|
|
1130
1134
|
return host.getConfig(configKey);
|
|
1131
1135
|
})
|
|
1132
1136
|
.then((config) => {
|
|
1137
|
+
if (!isObject(config)) {
|
|
1138
|
+
return;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1133
1141
|
for (const [name, query] of Object.entries(config)) {
|
|
1134
1142
|
const found = element.querySelector(
|
|
1135
1143
|
`[data-monster-button-label="${name}"]`,
|
|
@@ -82,6 +82,8 @@ function parseBracketedKeyValueHash(hashString) {
|
|
|
82
82
|
let inSelector = true;
|
|
83
83
|
let escaped = false;
|
|
84
84
|
let quotedValueStartChar = "";
|
|
85
|
+
let valueParenthesisDepth = 0;
|
|
86
|
+
let valueClosedByParenthesis = false;
|
|
85
87
|
|
|
86
88
|
for (let i = 0; i < cleanedHashString.length; i++) {
|
|
87
89
|
const c = cleanedHashString[i];
|
|
@@ -166,6 +168,19 @@ function parseBracketedKeyValueHash(hashString) {
|
|
|
166
168
|
continue;
|
|
167
169
|
}
|
|
168
170
|
|
|
171
|
+
if (c === "(") {
|
|
172
|
+
valueParenthesisDepth++;
|
|
173
|
+
currentValue += c;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (c === ")" && valueParenthesisDepth > 0) {
|
|
178
|
+
valueParenthesisDepth--;
|
|
179
|
+
currentValue += c;
|
|
180
|
+
valueClosedByParenthesis = valueParenthesisDepth === 0;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
|
|
169
184
|
if (c === ",") {
|
|
170
185
|
inValue = false;
|
|
171
186
|
inKey = true;
|
|
@@ -173,6 +188,8 @@ function parseBracketedKeyValueHash(hashString) {
|
|
|
173
188
|
addToResult(currentKey, decodedCurrentValue);
|
|
174
189
|
currentKey = "";
|
|
175
190
|
currentValue = "";
|
|
191
|
+
valueParenthesisDepth = 0;
|
|
192
|
+
valueClosedByParenthesis = false;
|
|
176
193
|
continue;
|
|
177
194
|
}
|
|
178
195
|
|
|
@@ -186,6 +203,8 @@ function parseBracketedKeyValueHash(hashString) {
|
|
|
186
203
|
currentKey = "";
|
|
187
204
|
currentValue = "";
|
|
188
205
|
currentSelector = "";
|
|
206
|
+
valueParenthesisDepth = 0;
|
|
207
|
+
valueClosedByParenthesis = false;
|
|
189
208
|
continue;
|
|
190
209
|
}
|
|
191
210
|
|
|
@@ -199,6 +218,12 @@ function parseBracketedKeyValueHash(hashString) {
|
|
|
199
218
|
return selectors;
|
|
200
219
|
}
|
|
201
220
|
|
|
221
|
+
if (inValue && valueParenthesisDepth === 0 && valueClosedByParenthesis) {
|
|
222
|
+
const decodedCurrentValue = decodeURIComponent(currentValue);
|
|
223
|
+
addToResult(currentKey, decodedCurrentValue);
|
|
224
|
+
return selectors;
|
|
225
|
+
}
|
|
226
|
+
|
|
202
227
|
return {};
|
|
203
228
|
}
|
|
204
229
|
|
|
@@ -106,6 +106,16 @@ describe("parseBracketedKeyValueHash", () => {
|
|
|
106
106
|
expect(result).to.deep.equal({selector: {key1: 'value,1', key2: 'value,2'}});
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
+
it('should keep unencoded parentheses inside a percent-encoded filter expression', () => {
|
|
110
|
+
const hashString = '#list-filter-nucleus-pim-product-variants-list(tags=tags%20IN%20(%22gustav-varianten%22)';
|
|
111
|
+
const result = parseBracketedKeyValueHash(hashString);
|
|
112
|
+
expect(result).to.deep.equal({
|
|
113
|
+
'list-filter-nucleus-pim-product-variants-list': {
|
|
114
|
+
tags: 'tags IN ("gustav-varianten")'
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
109
119
|
it('should ignore leading hash symbol (#)', () => {
|
|
110
120
|
const hashString = 'selector(key=value)';
|
|
111
121
|
const result = parseBracketedKeyValueHash(hashString);
|
|
@@ -195,6 +205,18 @@ describe("parseBracketedKeyValueHash", () => {
|
|
|
195
205
|
const result = createBracketedKeyValueHash(input, true);
|
|
196
206
|
expect(result).to.deep.equal("#.example(color=r%22ed,font-size=14px);.other(background=blue)");
|
|
197
207
|
});
|
|
208
|
+
|
|
209
|
+
it('should round-trip a filter expression with quotes and parentheses', () => {
|
|
210
|
+
const input = {
|
|
211
|
+
'list-filter-nucleus-pim-product-variants-list': {
|
|
212
|
+
tags: 'tags IN ("gustav-varianten")'
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const hashString = createBracketedKeyValueHash(input, true);
|
|
217
|
+
const result = parseBracketedKeyValueHash(hashString);
|
|
218
|
+
expect(result).to.deep.equal(input);
|
|
219
|
+
});
|
|
198
220
|
|
|
199
221
|
it('should return an empty string for an empty object', () => {
|
|
200
222
|
const input = {};
|