@design-edito/tools 0.1.35 → 0.1.37
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/agnostic/css/bem/index.js +2 -2
- package/agnostic/css/index.js +6 -6
- package/agnostic/html/hyper-json/cast/index.js +3 -2
- package/agnostic/html/hyper-json/index.js +4 -3
- package/agnostic/html/hyper-json/transformers/append/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/classList/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/join/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/length/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/print/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/push/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/querySelector/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/ref/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/replace/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/split/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toArray/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toBoolean/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toElement/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toNodeList/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toNull/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toNumber/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toRecord/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toRef/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toString/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toText/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/toTransformer/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/transformSelected/index.js +3 -2
- package/agnostic/html/hyper-json/transformers/trim/index.js +3 -2
- package/agnostic/html/hyper-json/tree/index.js +3 -2
- package/agnostic/html/hyper-json/utils/index.js +3 -2
- package/agnostic/html/index.js +12 -12
- package/agnostic/html/replace-in-element/index.d.ts +1 -1
- package/agnostic/html/replace-in-element/index.js +2 -1
- package/agnostic/misc/index.js +5 -5
- package/agnostic/misc/logs/index.js +2 -2
- package/agnostic/misc/lorem-ipsum/index.js +3 -3
- package/agnostic/numbers/index.js +6 -6
- package/agnostic/objects/index.d.ts +0 -2
- package/agnostic/objects/index.js +10 -14
- package/agnostic/strings/index.js +4 -4
- package/agnostic/time/index.js +3 -3
- package/chunks/chunk-2IV3O7FX.js +27 -0
- package/chunks/chunk-7YW5HL6N.js +168 -0
- package/chunks/chunk-BPOJYE4X.js +1108 -0
- package/chunks/chunk-CB52KVOZ.js +22 -0
- package/chunks/chunk-EVOTJ7SU.js +35 -0
- package/chunks/chunk-FONURDTX.js +211 -0
- package/chunks/chunk-HE6F5XJQ.js +20 -0
- package/chunks/chunk-NWFX6TEY.js +28 -0
- package/chunks/chunk-OVG5RGI3.js +29 -0
- package/chunks/chunk-R57V5HA7.js +211 -0
- package/chunks/chunk-TLTLM47Y.js +27 -0
- package/chunks/chunk-UFKH5WD2.js +21 -0
- package/chunks/chunk-W4OFHYWN.js +1108 -0
- package/chunks/chunk-WABWQCFE.js +127 -0
- package/chunks/chunk-XWLQR4UY.js +25 -0
- package/package.json +1 -1
@@ -0,0 +1,1108 @@
|
|
1
|
+
import {
|
2
|
+
Serialize
|
3
|
+
} from "./chunk-ZCPGE7H7.js";
|
4
|
+
import {
|
5
|
+
Types
|
6
|
+
} from "./chunk-5GI5G45R.js";
|
7
|
+
import {
|
8
|
+
replaceInElement
|
9
|
+
} from "./chunk-HE6F5XJQ.js";
|
10
|
+
import {
|
11
|
+
isRecord
|
12
|
+
} from "./chunk-YDIBNEGA.js";
|
13
|
+
import {
|
14
|
+
isInEnum
|
15
|
+
} from "./chunk-E6MSDKON.js";
|
16
|
+
import {
|
17
|
+
replaceAll
|
18
|
+
} from "./chunk-MF56TTC5.js";
|
19
|
+
import {
|
20
|
+
Window
|
21
|
+
} from "./chunk-RLJOYG64.js";
|
22
|
+
import {
|
23
|
+
isFalsy
|
24
|
+
} from "./chunk-QXAJXTXV.js";
|
25
|
+
|
26
|
+
// src/agnostic/html/hyper-json/cast/index.ts
|
27
|
+
var getWindow = Window.get;
|
28
|
+
var Cast;
|
29
|
+
((Cast2) => {
|
30
|
+
Cast2.toNull = () => null;
|
31
|
+
Cast2.toBoolean = (input) => !isFalsy(input);
|
32
|
+
Cast2.toNumber = (input) => {
|
33
|
+
const { Text } = getWindow();
|
34
|
+
if (typeof input === "number") return input;
|
35
|
+
if (typeof input === "string") return parseFloat(`${input}`);
|
36
|
+
if (input instanceof Text) return parseFloat(`${input.textContent}`);
|
37
|
+
return 0;
|
38
|
+
};
|
39
|
+
Cast2.toString = (input) => {
|
40
|
+
if (typeof input === "string") return input;
|
41
|
+
if (typeof input === "number" || typeof input === "boolean" || input === null) return `${input}`;
|
42
|
+
const { Element, Text, NodeList } = getWindow();
|
43
|
+
if (input instanceof Element) return input.outerHTML;
|
44
|
+
if (input instanceof Text) return input.textContent ?? "";
|
45
|
+
if (input instanceof NodeList) return Array.from(input).map((e) => {
|
46
|
+
if (e instanceof Element) return e.outerHTML;
|
47
|
+
return e.textContent;
|
48
|
+
}).join("");
|
49
|
+
return input.toString();
|
50
|
+
};
|
51
|
+
Cast2.toText = (input) => {
|
52
|
+
const { Text, document } = getWindow();
|
53
|
+
if (input instanceof Text) return input.cloneNode(true);
|
54
|
+
return document.createTextNode((0, Cast2.toString)(input));
|
55
|
+
};
|
56
|
+
Cast2.toElement = (input) => {
|
57
|
+
const { Element, Text, NodeList, document } = getWindow();
|
58
|
+
if (input instanceof Element) return input.cloneNode(true);
|
59
|
+
const elt = document.createElement("div");
|
60
|
+
if (input instanceof Text) {
|
61
|
+
elt.append(input.cloneNode(true));
|
62
|
+
return elt;
|
63
|
+
}
|
64
|
+
if (input instanceof NodeList) {
|
65
|
+
elt.append(...Array.from(input).map((e) => e.cloneNode(true)));
|
66
|
+
return elt;
|
67
|
+
}
|
68
|
+
if (Array.isArray(input)) return elt;
|
69
|
+
if (isRecord(input)) return elt;
|
70
|
+
elt.append(`${input}`);
|
71
|
+
return elt;
|
72
|
+
};
|
73
|
+
Cast2.toNodeList = (input) => {
|
74
|
+
const { Element, Text, NodeList, document } = getWindow();
|
75
|
+
const elt = document.createElement("div");
|
76
|
+
if (input instanceof NodeList) {
|
77
|
+
elt.append(...Array.from(input).map((i) => i.cloneNode(true)));
|
78
|
+
return elt.childNodes;
|
79
|
+
}
|
80
|
+
if (input instanceof Element || input instanceof Text) {
|
81
|
+
elt.append(input.cloneNode(true));
|
82
|
+
return elt.childNodes;
|
83
|
+
}
|
84
|
+
if (Array.isArray(input)) return elt.childNodes;
|
85
|
+
if (isRecord(input)) return elt.childNodes;
|
86
|
+
elt.innerHTML = `${input}`;
|
87
|
+
return elt.childNodes;
|
88
|
+
};
|
89
|
+
Cast2.toArray = (input) => {
|
90
|
+
const { NodeList } = getWindow();
|
91
|
+
if (Array.isArray(input)) return [...input];
|
92
|
+
if (input instanceof NodeList) return Array.from(input);
|
93
|
+
return [input];
|
94
|
+
};
|
95
|
+
Cast2.toRecord = (input) => {
|
96
|
+
if (isRecord(input)) return { ...input };
|
97
|
+
return {};
|
98
|
+
};
|
99
|
+
Cast2.toTransformer = (input) => {
|
100
|
+
return Utils.toNamedTransformer("utils/Cast.toTransformer", [], () => ({
|
101
|
+
action: "REPLACE",
|
102
|
+
value: input
|
103
|
+
}));
|
104
|
+
};
|
105
|
+
})(Cast || (Cast = {}));
|
106
|
+
|
107
|
+
// src/agnostic/html/hyper-json/transformers/classList/index.ts
|
108
|
+
var classList = (callerTagName, ...args) => {
|
109
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
110
|
+
const { Element } = Window.get();
|
111
|
+
if (!(currentValue instanceof Element)) return Utils.makeTransformerError("Current value must be an Element");
|
112
|
+
const [actionArg, classNameArg] = args;
|
113
|
+
if (actionArg === void 0 || classNameArg === void 0) return Utils.makeTransformerError(`Expecting 2 arguments: (action: 'add' | 'remove' | 'toggle', classList: string)`);
|
114
|
+
const action = Cast.toString(actionArg);
|
115
|
+
const className = Cast.toString(actionArg).trim();
|
116
|
+
if (action === "add" /* ADD */) {
|
117
|
+
const outputValue = currentValue.cloneNode(true);
|
118
|
+
outputValue.classList.add(className);
|
119
|
+
return { action: "REPLACE", value: outputValue };
|
120
|
+
} else if (action === "remove" /* REMOVE */) {
|
121
|
+
const outputValue = currentValue.cloneNode(true);
|
122
|
+
outputValue.classList.remove(className);
|
123
|
+
return { action: "REPLACE", value: outputValue };
|
124
|
+
} else if (action === "toggle" /* TOGGLE */) {
|
125
|
+
const outputValue = currentValue.cloneNode(true);
|
126
|
+
outputValue.classList.toggle(className);
|
127
|
+
return { action: "REPLACE", value: outputValue };
|
128
|
+
}
|
129
|
+
return Utils.makeTransformerError(`Unknown action: ${action}`);
|
130
|
+
});
|
131
|
+
};
|
132
|
+
|
133
|
+
// src/agnostic/html/hyper-json/transformers/join/index.ts
|
134
|
+
var join = (callerTagName, ...args) => {
|
135
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
136
|
+
const joiner = Cast.toString(args.at(0) ?? ",");
|
137
|
+
if (!Array.isArray(currentValue)) return Utils.makeTransformerError({
|
138
|
+
message: `Current value must be an array`,
|
139
|
+
input: currentValue
|
140
|
+
});
|
141
|
+
return {
|
142
|
+
action: "REPLACE",
|
143
|
+
value: currentValue.join(joiner)
|
144
|
+
};
|
145
|
+
});
|
146
|
+
};
|
147
|
+
|
148
|
+
// src/agnostic/html/hyper-json/transformers/length/index.ts
|
149
|
+
var length = (callerTagName, ...args) => {
|
150
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
151
|
+
const { Element, NodeList, Text } = Window.get();
|
152
|
+
if (typeof currentValue === "string" || Array.isArray(currentValue) || currentValue instanceof NodeList) return {
|
153
|
+
action: "REPLACE",
|
154
|
+
value: currentValue.length
|
155
|
+
};
|
156
|
+
if (currentValue instanceof Element) return {
|
157
|
+
action: "REPLACE",
|
158
|
+
value: Array.from(currentValue.childNodes).length
|
159
|
+
};
|
160
|
+
if (currentValue instanceof Text) return {
|
161
|
+
action: "REPLACE",
|
162
|
+
value: currentValue.data.length
|
163
|
+
};
|
164
|
+
return Utils.makeTransformerError(`Current value must be of type string, Array, NodeList, Element or Text`);
|
165
|
+
});
|
166
|
+
};
|
167
|
+
|
168
|
+
// src/agnostic/html/hyper-json/transformers/print/index.ts
|
169
|
+
var print = (callerTagName, ...args) => {
|
170
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
171
|
+
if (args.length === 0) console.log(currentValue);
|
172
|
+
else console.log(...args);
|
173
|
+
return { action: null };
|
174
|
+
});
|
175
|
+
};
|
176
|
+
|
177
|
+
// src/agnostic/html/hyper-json/transformers/push/index.ts
|
178
|
+
var push = (callerTagName, ...args) => {
|
179
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
180
|
+
if (!Array.isArray(currentValue)) return Utils.makeTransformerError({
|
181
|
+
message: "Current value must be an array",
|
182
|
+
input: currentValue
|
183
|
+
});
|
184
|
+
const outputValue = [...currentValue, ...args];
|
185
|
+
return {
|
186
|
+
action: "REPLACE",
|
187
|
+
value: outputValue
|
188
|
+
};
|
189
|
+
});
|
190
|
+
};
|
191
|
+
|
192
|
+
// src/agnostic/html/hyper-json/transformers/querySelector/index.ts
|
193
|
+
var querySelector = (callerTagName, ...args) => {
|
194
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
195
|
+
const { document, Element, NodeList } = Window.get();
|
196
|
+
const [selectorRaw] = args;
|
197
|
+
if (selectorRaw === void 0) return Utils.makeTransformerError("Selector argument expected.");
|
198
|
+
const selector = Cast.toString(selectorRaw);
|
199
|
+
let toQuery;
|
200
|
+
if (currentValue instanceof Element) {
|
201
|
+
toQuery = currentValue.cloneNode(true);
|
202
|
+
} else if (currentValue instanceof NodeList) {
|
203
|
+
toQuery = document.createElement("div");
|
204
|
+
toQuery.append(...Array.from(currentValue).map((e) => e.cloneNode(true)));
|
205
|
+
} else return Utils.makeTransformerError("Current value must be an Element or a NodeList");
|
206
|
+
const found = toQuery.querySelectorAll(selector);
|
207
|
+
return {
|
208
|
+
action: "REPLACE",
|
209
|
+
value: found
|
210
|
+
};
|
211
|
+
});
|
212
|
+
};
|
213
|
+
|
214
|
+
// src/agnostic/html/hyper-json/transformers/ref/index.ts
|
215
|
+
var ref = (callerTagName, ...args) => {
|
216
|
+
return Utils.toNamedTransformer(callerTagName, args, (_, callerTree) => {
|
217
|
+
const [refPathStrRaw] = args;
|
218
|
+
const { Text } = Window.get();
|
219
|
+
if (typeof refPathStrRaw !== "string" && !(refPathStrRaw instanceof Text)) return Utils.makeTransformerError({
|
220
|
+
message: "PathString must be of type string or Text",
|
221
|
+
input: refPathStrRaw !== void 0 ? refPathStrRaw : "<undefined>"
|
222
|
+
});
|
223
|
+
const refPathStr = Cast.toString(refPathStrRaw);
|
224
|
+
const refPath = Utils.pathStringToPath(Cast.toString(refPathStrRaw));
|
225
|
+
const foundTree = callerTree.resolve(refPath);
|
226
|
+
if (foundTree === void 0) return Utils.makeTransformerError({
|
227
|
+
message: "Referenced value has not been found",
|
228
|
+
input: refPathStr
|
229
|
+
});
|
230
|
+
const evaluated = foundTree.evaluate();
|
231
|
+
return {
|
232
|
+
action: "MERGE",
|
233
|
+
value: evaluated
|
234
|
+
};
|
235
|
+
});
|
236
|
+
};
|
237
|
+
|
238
|
+
// src/agnostic/html/hyper-json/transformers/replace/index.ts
|
239
|
+
var replace = (callerTagName, ...args) => {
|
240
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
241
|
+
const { Text, NodeList, Element } = Window.get();
|
242
|
+
if (typeof currentValue !== "string" && !(currentValue instanceof Text) && !(currentValue instanceof Element) && !(currentValue instanceof NodeList)) return Utils.makeTransformerError("Current value must be string, Text, Element or NodeList");
|
243
|
+
if (args.some((arg) => typeof arg !== "string" && !(arg instanceof Text) && !(arg instanceof Element) && !(arg instanceof NodeList))) return Utils.makeTransformerError("Arguments must be of type string, Text, Element or NodeList");
|
244
|
+
const [first, second] = args;
|
245
|
+
if (first === void 0 || second === void 0) return Utils.makeTransformerError(`Expecting at least 2 arguments. Found only ${args.length}`);
|
246
|
+
const replacer = args.at(-1);
|
247
|
+
const strReplacer = Cast.toString(replacer);
|
248
|
+
const toReplace = args.slice(0, -1);
|
249
|
+
const strToReplace = toReplace.map(Cast.toString);
|
250
|
+
const strInput = Cast.toString(currentValue);
|
251
|
+
const strOutput = strToReplace.reduce((str, torpl) => replaceAll(str, torpl, strReplacer), strInput);
|
252
|
+
if (typeof currentValue === "string") return { action: "REPLACE", value: strOutput };
|
253
|
+
if (currentValue instanceof Text) return { action: "REPLACE", value: Cast.toText(strOutput) };
|
254
|
+
if (currentValue instanceof Element) return { action: "REPLACE", value: Cast.toElement(strOutput) };
|
255
|
+
if (currentValue instanceof NodeList) return { action: "REPLACE", value: Cast.toNodeList(strOutput) };
|
256
|
+
return { action: null };
|
257
|
+
});
|
258
|
+
};
|
259
|
+
|
260
|
+
// src/agnostic/html/hyper-json/transformers/split/index.ts
|
261
|
+
var split = (callerTagName, ...args) => {
|
262
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
263
|
+
const { Text } = Window.get();
|
264
|
+
const [splitter] = args;
|
265
|
+
if (typeof currentValue !== "string" && !(currentValue instanceof Text)) return Utils.makeTransformerError({
|
266
|
+
message: "Current value must be string or Text",
|
267
|
+
input: currentValue
|
268
|
+
});
|
269
|
+
if (typeof splitter !== "string") return Utils.makeTransformerError({
|
270
|
+
message: "Splitter argument must be string",
|
271
|
+
input: splitter !== void 0 ? splitter : "<undefined>"
|
272
|
+
});
|
273
|
+
const strCurrentValue = Cast.toString(currentValue);
|
274
|
+
const splitted = strCurrentValue.split(splitter).map((e) => typeof currentValue === "string" ? Cast.toString(e) : Cast.toText(e));
|
275
|
+
return {
|
276
|
+
action: "REPLACE",
|
277
|
+
value: splitted
|
278
|
+
};
|
279
|
+
});
|
280
|
+
};
|
281
|
+
|
282
|
+
// src/agnostic/html/hyper-json/transformers/toArray/index.ts
|
283
|
+
var toArray = (callerTagName, ...args) => {
|
284
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
285
|
+
action: "REPLACE",
|
286
|
+
value: Cast.toArray(currentValue)
|
287
|
+
}));
|
288
|
+
};
|
289
|
+
|
290
|
+
// src/agnostic/html/hyper-json/transformers/toBoolean/index.ts
|
291
|
+
var toBoolean = (callerTagName, ...args) => {
|
292
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
293
|
+
action: "REPLACE",
|
294
|
+
value: Cast.toBoolean(currentValue)
|
295
|
+
}));
|
296
|
+
};
|
297
|
+
|
298
|
+
// src/agnostic/html/hyper-json/transformers/toElement/index.ts
|
299
|
+
var toElement = (callerTagName, ...args) => {
|
300
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
301
|
+
action: "REPLACE",
|
302
|
+
value: Cast.toElement(currentValue)
|
303
|
+
}));
|
304
|
+
};
|
305
|
+
|
306
|
+
// src/agnostic/html/hyper-json/transformers/toNodeList/index.ts
|
307
|
+
var toNodeList = (callerTagName, ...args) => {
|
308
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
309
|
+
action: "REPLACE",
|
310
|
+
value: Cast.toNodeList(currentValue)
|
311
|
+
}));
|
312
|
+
};
|
313
|
+
|
314
|
+
// src/agnostic/html/hyper-json/transformers/toNull/index.ts
|
315
|
+
var toNull = (callerTagName, ...args) => {
|
316
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
317
|
+
action: "REPLACE",
|
318
|
+
value: null
|
319
|
+
}));
|
320
|
+
};
|
321
|
+
|
322
|
+
// src/agnostic/html/hyper-json/transformers/toNumber/index.ts
|
323
|
+
var toNumber = (callerTagName, ...args) => {
|
324
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
325
|
+
action: "REPLACE",
|
326
|
+
value: Cast.toNumber(currentValue)
|
327
|
+
}));
|
328
|
+
};
|
329
|
+
|
330
|
+
// src/agnostic/html/hyper-json/transformers/toRecord/index.ts
|
331
|
+
var toRecord = (callerTagName, ...args) => {
|
332
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
333
|
+
action: "REPLACE",
|
334
|
+
value: Cast.toRecord(currentValue)
|
335
|
+
}));
|
336
|
+
};
|
337
|
+
|
338
|
+
// src/agnostic/html/hyper-json/transformers/toRef/index.ts
|
339
|
+
var toRef = (callerTagName, ...args) => {
|
340
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue, callerTree) => {
|
341
|
+
const { Text } = Window.get();
|
342
|
+
if (typeof currentValue !== "string" && !(currentValue instanceof Text)) return Utils.makeTransformerError({
|
343
|
+
message: "Current value must be string or Text",
|
344
|
+
input: currentValue
|
345
|
+
});
|
346
|
+
const refPathStr = Cast.toString(currentValue);
|
347
|
+
const refPath = Utils.pathStringToPath(refPathStr);
|
348
|
+
const foundTree = callerTree.resolve(refPath);
|
349
|
+
if (foundTree === void 0) return Utils.makeTransformerError({
|
350
|
+
message: "Referenced value has not been found",
|
351
|
+
input: refPathStr
|
352
|
+
});
|
353
|
+
const evaluated = foundTree.evaluate();
|
354
|
+
return {
|
355
|
+
action: "REPLACE",
|
356
|
+
value: evaluated
|
357
|
+
};
|
358
|
+
});
|
359
|
+
};
|
360
|
+
|
361
|
+
// src/agnostic/html/hyper-json/transformers/toString/index.ts
|
362
|
+
var toString = (callerTagName, ...args) => {
|
363
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
364
|
+
action: "REPLACE",
|
365
|
+
value: Cast.toString(currentValue)
|
366
|
+
}));
|
367
|
+
};
|
368
|
+
|
369
|
+
// src/agnostic/html/hyper-json/transformers/toText/index.ts
|
370
|
+
var toText = (callerTagName, ...args) => {
|
371
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
372
|
+
action: "REPLACE",
|
373
|
+
value: Cast.toText(currentValue)
|
374
|
+
}));
|
375
|
+
};
|
376
|
+
|
377
|
+
// src/agnostic/html/hyper-json/transformers/toTransformer/index.ts
|
378
|
+
var toTransformer = (callerTagName, ...args) => {
|
379
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => ({
|
380
|
+
action: "REPLACE",
|
381
|
+
value: Cast.toTransformer(currentValue)
|
382
|
+
}));
|
383
|
+
};
|
384
|
+
|
385
|
+
// src/agnostic/html/hyper-json/transformers/transformSelected/index.ts
|
386
|
+
var transformSelected = (callerTagName, ...args) => {
|
387
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue, callerTree) => {
|
388
|
+
const { NodeList, Element, Text } = Window.get();
|
389
|
+
if (!(currentValue instanceof Element) && !(currentValue instanceof NodeList)) return Utils.makeTransformerError({
|
390
|
+
message: "Current value must be Element or NodeList",
|
391
|
+
input: currentValue
|
392
|
+
});
|
393
|
+
const [selector, ...transformerDescriptors] = args;
|
394
|
+
if (typeof selector !== "string" && !(selector instanceof Text)) return Utils.makeTransformerError({
|
395
|
+
message: "Selector argument must be string or text",
|
396
|
+
input: selector !== void 0 ? selector : "<undefined>"
|
397
|
+
});
|
398
|
+
if (transformerDescriptors.length === 0) return Utils.makeTransformerError("No transformer descriptor provided");
|
399
|
+
let transformers = [];
|
400
|
+
for (const descriptor of transformerDescriptors) {
|
401
|
+
const errorResponse = Utils.makeTransformerError({
|
402
|
+
message: "Transformer descriptors must be of shape { name: string, arguments: Value[] }",
|
403
|
+
input: descriptor
|
404
|
+
});
|
405
|
+
if (!isRecord(descriptor)) return errorResponse;
|
406
|
+
if (!("name" in descriptor) || typeof descriptor.name !== "string") return errorResponse;
|
407
|
+
if (!("arguments" in descriptor) || !Array.isArray(descriptor.arguments)) return errorResponse;
|
408
|
+
const { name, arguments: args2 } = descriptor;
|
409
|
+
const generator = callerTree.getGenerator(name);
|
410
|
+
if (generator === void 0) return Utils.makeTransformerError(`No transformer found under the name ${name}`);
|
411
|
+
transformers.push(generator(name, ...args2));
|
412
|
+
}
|
413
|
+
const elementInput = Cast.toElement(currentValue);
|
414
|
+
const strSelector = Cast.toString(selector);
|
415
|
+
const selected = Array.from(elementInput.querySelectorAll(strSelector));
|
416
|
+
const transformationErrors = [];
|
417
|
+
const transformed = selected.map((input) => {
|
418
|
+
const output = transformers.reduce((reduced, transformer, transformerPos) => {
|
419
|
+
const result = transformer(reduced, callerTree);
|
420
|
+
if (result.action === "REPLACE") return result.value;
|
421
|
+
else if (result.action === "MERGE") {
|
422
|
+
const merged = Tree.mergeValues(
|
423
|
+
reduced,
|
424
|
+
result.value,
|
425
|
+
transformerPos,
|
426
|
+
callerTree
|
427
|
+
);
|
428
|
+
return merged;
|
429
|
+
}
|
430
|
+
if (result.action === "ERROR") transformationErrors.push({
|
431
|
+
message: result.value,
|
432
|
+
transformerName: transformer.transformerName,
|
433
|
+
transformerPos,
|
434
|
+
transforming: reduced
|
435
|
+
});
|
436
|
+
return reduced;
|
437
|
+
}, input);
|
438
|
+
return { input, output };
|
439
|
+
});
|
440
|
+
if (transformationErrors.length !== 0) return Utils.makeTransformerError({
|
441
|
+
message: "Some nested transformers returned an error",
|
442
|
+
errors: transformationErrors
|
443
|
+
});
|
444
|
+
const nonElementTransformResult = transformed.find((item) => !(item.output instanceof Element));
|
445
|
+
if (nonElementTransformResult !== void 0) return Utils.makeTransformerError({
|
446
|
+
message: "Some transformations resulted in a non Element output",
|
447
|
+
inputElement: nonElementTransformResult.input,
|
448
|
+
outputValue: nonElementTransformResult.output
|
449
|
+
});
|
450
|
+
const transformMap = new Map(transformed.map((e) => [e.input, e.output]));
|
451
|
+
const elementOutput = replaceInElement(elementInput, transformMap);
|
452
|
+
return {
|
453
|
+
action: "REPLACE",
|
454
|
+
value: elementOutput
|
455
|
+
};
|
456
|
+
});
|
457
|
+
};
|
458
|
+
|
459
|
+
// src/agnostic/html/hyper-json/transformers/trim/index.ts
|
460
|
+
var trim = (callerTagName, ...args) => {
|
461
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
462
|
+
const { Text } = Window.get();
|
463
|
+
if (typeof currentValue !== "string" && !(currentValue instanceof Text)) return Utils.makeTransformerError({
|
464
|
+
message: "Current value must be of type string or Text",
|
465
|
+
input: currentValue
|
466
|
+
});
|
467
|
+
const inputStr = Cast.toString(currentValue);
|
468
|
+
const trimmed = inputStr.trim();
|
469
|
+
return {
|
470
|
+
action: "REPLACE",
|
471
|
+
value: currentValue instanceof Text ? Cast.toText(trimmed) : trimmed
|
472
|
+
};
|
473
|
+
});
|
474
|
+
};
|
475
|
+
|
476
|
+
// src/agnostic/html/hyper-json/transformers/index.ts
|
477
|
+
var Transformers;
|
478
|
+
((Transformers2) => {
|
479
|
+
Transformers2.defaultGeneratorsMap = /* @__PURE__ */ new Map([
|
480
|
+
["append".toLowerCase(), append],
|
481
|
+
["classList".toLowerCase(), classList],
|
482
|
+
["join".toLowerCase(), join],
|
483
|
+
["length".toLowerCase(), length],
|
484
|
+
["print".toLowerCase(), print],
|
485
|
+
["push".toLowerCase(), push],
|
486
|
+
["querySelector".toLowerCase(), querySelector],
|
487
|
+
["ref".toLowerCase(), ref],
|
488
|
+
["replace".toLowerCase(), replace],
|
489
|
+
["split".toLowerCase(), split],
|
490
|
+
["toArray".toLowerCase(), toArray],
|
491
|
+
["toBoolean".toLowerCase(), toBoolean],
|
492
|
+
["toElement".toLowerCase(), toElement],
|
493
|
+
["toNodeList".toLowerCase(), toNodeList],
|
494
|
+
["toNull".toLowerCase(), toNull],
|
495
|
+
["toNumber".toLowerCase(), toNumber],
|
496
|
+
["toRecord".toLowerCase(), toRecord],
|
497
|
+
["toRef".toLowerCase(), toRef],
|
498
|
+
["toString".toLowerCase(), toString],
|
499
|
+
["toText".toLowerCase(), toText],
|
500
|
+
["toTransformer".toLowerCase(), toTransformer],
|
501
|
+
["transformSelected".toLowerCase(), transformSelected],
|
502
|
+
["trim".toLowerCase(), trim]
|
503
|
+
]);
|
504
|
+
})(Transformers || (Transformers = {}));
|
505
|
+
|
506
|
+
// src/agnostic/html/hyper-json/tree/index.ts
|
507
|
+
var getWindow2 = Window.get;
|
508
|
+
var isElement = (node) => node.nodeType === getWindow2().Node.ELEMENT_NODE;
|
509
|
+
var isText = (node) => node.nodeType === getWindow2().Node.TEXT_NODE;
|
510
|
+
var Tree;
|
511
|
+
((_Tree) => {
|
512
|
+
_Tree.defaultKeyAttribute = "_key";
|
513
|
+
_Tree.defaultActionAttribute = "_action";
|
514
|
+
_Tree.defaultRootKey = "_ROOT_";
|
515
|
+
function mergeValues(currentValue, incomingValue, mergeKey, initiatorTree) {
|
516
|
+
const { Element, Text, NodeList, document } = getWindow2();
|
517
|
+
if (typeof incomingValue === "function") {
|
518
|
+
const evaluated = incomingValue(currentValue, initiatorTree);
|
519
|
+
if (evaluated.action === null) return currentValue;
|
520
|
+
if (evaluated.action === "REPLACE") return evaluated.value;
|
521
|
+
if (evaluated.action === "ERROR") {
|
522
|
+
const errorMessage = `Tranformer error:
|
523
|
+
from: ${incomingValue.transformerName}
|
524
|
+
at: ${initiatorTree.pathString.slice(1)}/${mergeKey}
|
525
|
+
message:`;
|
526
|
+
console.warn(errorMessage, evaluated.value);
|
527
|
+
return currentValue;
|
528
|
+
}
|
529
|
+
return mergeValues(
|
530
|
+
currentValue,
|
531
|
+
evaluated.value,
|
532
|
+
mergeKey,
|
533
|
+
initiatorTree
|
534
|
+
);
|
535
|
+
}
|
536
|
+
if (Array.isArray(currentValue)) {
|
537
|
+
if (typeof mergeKey === "string") return currentValue;
|
538
|
+
return [...currentValue, incomingValue];
|
539
|
+
}
|
540
|
+
if (currentValue === null || typeof currentValue === "boolean" || typeof currentValue === "number" || typeof currentValue === "string" || typeof currentValue === "function" || currentValue instanceof Text || currentValue instanceof Element) {
|
541
|
+
if (incomingValue === null || typeof incomingValue === "boolean" || typeof incomingValue === "number" || typeof incomingValue === "string" || Array.isArray(incomingValue) || isRecord(incomingValue)) {
|
542
|
+
return incomingValue;
|
543
|
+
}
|
544
|
+
const frag = document.createDocumentFragment();
|
545
|
+
if (currentValue instanceof Element || currentValue instanceof Text) frag.append(currentValue.cloneNode(true));
|
546
|
+
else frag.append(`${currentValue}`);
|
547
|
+
if (incomingValue instanceof Element || incomingValue instanceof Text) {
|
548
|
+
frag.append(incomingValue.cloneNode(true));
|
549
|
+
return frag.childNodes;
|
550
|
+
}
|
551
|
+
frag.append(...Array.from(incomingValue).map((e) => e.cloneNode(true)));
|
552
|
+
return frag.childNodes;
|
553
|
+
}
|
554
|
+
if (currentValue instanceof NodeList) {
|
555
|
+
if (incomingValue instanceof Element || incomingValue instanceof Text) {
|
556
|
+
const frag = document.createDocumentFragment();
|
557
|
+
frag.append(...Array.from(currentValue).map((e) => e.cloneNode(true)), incomingValue);
|
558
|
+
return frag.childNodes;
|
559
|
+
}
|
560
|
+
if (incomingValue instanceof NodeList) {
|
561
|
+
const frag = document.createDocumentFragment();
|
562
|
+
frag.append(
|
563
|
+
...Array.from(currentValue).map((e) => e.cloneNode(true)),
|
564
|
+
...Array.from(incomingValue).map((e) => e.cloneNode(true))
|
565
|
+
);
|
566
|
+
return frag.childNodes;
|
567
|
+
}
|
568
|
+
if (incomingValue === null || typeof incomingValue === "string" || typeof incomingValue === "number" || typeof incomingValue === "boolean") {
|
569
|
+
const frag = document.createDocumentFragment();
|
570
|
+
frag.append(...Array.from(currentValue).map((e) => e.cloneNode(true)), `${incomingValue}`);
|
571
|
+
return frag.childNodes;
|
572
|
+
}
|
573
|
+
if (Array.isArray(incomingValue)) return [
|
574
|
+
...Array.from(currentValue),
|
575
|
+
...incomingValue
|
576
|
+
];
|
577
|
+
return { ...incomingValue };
|
578
|
+
}
|
579
|
+
if (typeof mergeKey === "number") return currentValue;
|
580
|
+
return {
|
581
|
+
...currentValue,
|
582
|
+
[mergeKey]: incomingValue
|
583
|
+
};
|
584
|
+
}
|
585
|
+
_Tree.mergeValues = mergeValues;
|
586
|
+
function mergeNodes(nodes, options = {}) {
|
587
|
+
const [first, ...rest] = nodes;
|
588
|
+
const actionAttribute = options?.actionAttribute ?? _Tree.defaultActionAttribute;
|
589
|
+
const keyAttribute = options?.keyAttribute ?? _Tree.defaultKeyAttribute;
|
590
|
+
if (first === void 0) throw new Error("Expecting at least one node");
|
591
|
+
const { Text, Element, document } = getWindow2();
|
592
|
+
function isTextOrElement(node) {
|
593
|
+
return node instanceof Text || node instanceof Element;
|
594
|
+
}
|
595
|
+
let CURRENT = first;
|
596
|
+
rest.forEach((node) => {
|
597
|
+
if (node instanceof Text) {
|
598
|
+
CURRENT.remove();
|
599
|
+
CURRENT = node;
|
600
|
+
return;
|
601
|
+
}
|
602
|
+
const actionRaw = node.getAttribute(actionAttribute);
|
603
|
+
const action = isInEnum(Types.ReductionAction, actionRaw) ? actionRaw : Types.ReductionAction.REPLACE;
|
604
|
+
if (action === Types.ReductionAction.REPLACE) {
|
605
|
+
CURRENT.remove();
|
606
|
+
CURRENT = node;
|
607
|
+
return;
|
608
|
+
}
|
609
|
+
if (CURRENT instanceof Text) {
|
610
|
+
if (node instanceof Text) {
|
611
|
+
const appended = action === Types.ReductionAction.APPEND ? document.createTextNode(`${CURRENT.textContent}${node.textContent}`) : document.createTextNode(`${node.textContent}${CURRENT.textContent}`);
|
612
|
+
CURRENT.remove();
|
613
|
+
node.remove();
|
614
|
+
CURRENT = appended;
|
615
|
+
return;
|
616
|
+
}
|
617
|
+
CURRENT.remove();
|
618
|
+
CURRENT = node;
|
619
|
+
return;
|
620
|
+
}
|
621
|
+
if (node instanceof Text) {
|
622
|
+
CURRENT.remove();
|
623
|
+
CURRENT = node;
|
624
|
+
return;
|
625
|
+
}
|
626
|
+
const currentAttributes = Array.from(CURRENT.attributes);
|
627
|
+
const nodeAttributes = Array.from(node.attributes);
|
628
|
+
const nodeChildren = Array.from(node.childNodes).filter(isTextOrElement);
|
629
|
+
const outputAttributes = action === Types.ReductionAction.APPEND ? [...currentAttributes, ...nodeAttributes] : [...nodeAttributes, ...currentAttributes];
|
630
|
+
if (action === Types.ReductionAction.APPEND) CURRENT.append(...nodeChildren);
|
631
|
+
else CURRENT.prepend(...nodeChildren);
|
632
|
+
outputAttributes.forEach((attr) => CURRENT.setAttribute(attr.name, attr.value));
|
633
|
+
node.remove();
|
634
|
+
return;
|
635
|
+
});
|
636
|
+
const wrapperChildren = Array.from(CURRENT.childNodes).filter(isTextOrElement);
|
637
|
+
const subpaths = /* @__PURE__ */ new Map();
|
638
|
+
let positionnedChildrenCount = 0;
|
639
|
+
wrapperChildren.forEach((child) => {
|
640
|
+
if (child instanceof Text) {
|
641
|
+
const childKey = positionnedChildrenCount;
|
642
|
+
const found = subpaths.get(childKey) ?? [];
|
643
|
+
found.push(child);
|
644
|
+
subpaths.set(childKey, found);
|
645
|
+
positionnedChildrenCount += 1;
|
646
|
+
} else {
|
647
|
+
const rawChildKey = child.getAttribute(keyAttribute);
|
648
|
+
const childKey = rawChildKey ?? positionnedChildrenCount;
|
649
|
+
const found = subpaths.get(childKey) ?? [];
|
650
|
+
found.push(child);
|
651
|
+
subpaths.set(childKey, found);
|
652
|
+
if (rawChildKey === null) {
|
653
|
+
positionnedChildrenCount += 1;
|
654
|
+
}
|
655
|
+
}
|
656
|
+
});
|
657
|
+
subpaths.forEach((nodes2, subpath) => {
|
658
|
+
if (nodes2.length < 2) return;
|
659
|
+
return mergeNodes(nodes2, {
|
660
|
+
actionAttribute,
|
661
|
+
keyAttribute
|
662
|
+
});
|
663
|
+
});
|
664
|
+
return CURRENT;
|
665
|
+
}
|
666
|
+
_Tree.mergeNodes = mergeNodes;
|
667
|
+
function mergeRootNodes(...args) {
|
668
|
+
const [nodes, options] = args;
|
669
|
+
const actionAttribute = options?.actionAttribute ?? _Tree.defaultActionAttribute;
|
670
|
+
const keyAttribute = options?.keyAttribute ?? _Tree.defaultKeyAttribute;
|
671
|
+
const rootKey = options?.rootKey ?? _Tree.defaultRootKey;
|
672
|
+
const { Element } = getWindow2();
|
673
|
+
const elements = nodes.filter((e) => e instanceof Element);
|
674
|
+
elements.forEach((element) => {
|
675
|
+
element.setAttribute(keyAttribute, rootKey);
|
676
|
+
const elementAction = element.getAttribute(actionAttribute) ?? Types.ReductionAction.APPEND;
|
677
|
+
element.setAttribute(actionAttribute, elementAction);
|
678
|
+
});
|
679
|
+
const merged = mergeNodes(elements, options);
|
680
|
+
return merged;
|
681
|
+
}
|
682
|
+
_Tree.mergeRootNodes = mergeRootNodes;
|
683
|
+
function from(nodes, options) {
|
684
|
+
const merged = mergeRootNodes(nodes, options);
|
685
|
+
return new Tree2(merged, options);
|
686
|
+
}
|
687
|
+
_Tree.from = from;
|
688
|
+
class Tree2 {
|
689
|
+
node;
|
690
|
+
name;
|
691
|
+
parent;
|
692
|
+
root;
|
693
|
+
isRoot;
|
694
|
+
path;
|
695
|
+
pathString;
|
696
|
+
tagName;
|
697
|
+
attributes;
|
698
|
+
subtrees = /* @__PURE__ */ new Map();
|
699
|
+
children;
|
700
|
+
type;
|
701
|
+
generators;
|
702
|
+
keyAttribute;
|
703
|
+
actionAttribute;
|
704
|
+
static fillOptions(options) {
|
705
|
+
const defaultOptions = {
|
706
|
+
generatorsMap: Transformers.defaultGeneratorsMap,
|
707
|
+
keyAttribute: _Tree.defaultKeyAttribute,
|
708
|
+
actionAttribute: _Tree.defaultActionAttribute
|
709
|
+
};
|
710
|
+
return {
|
711
|
+
...defaultOptions,
|
712
|
+
...options
|
713
|
+
};
|
714
|
+
}
|
715
|
+
constructor(node, parentOrOptions, pathFromParent, options) {
|
716
|
+
this.resolve = this.resolve.bind(this);
|
717
|
+
this.getGenerator = this.getGenerator.bind(this);
|
718
|
+
this.initValue = this.initValue.bind(this);
|
719
|
+
this.getInnerValue = this.getInnerValue.bind(this);
|
720
|
+
this.wrapInnerValue = this.wrapInnerValue.bind(this);
|
721
|
+
this.setCache = this.setCache.bind(this);
|
722
|
+
this.getPerfCounters = this.getPerfCounters.bind(this);
|
723
|
+
this.printPerfCounters = this.printPerfCounters.bind(this);
|
724
|
+
this.pushToEvalCallStack = this.pushToEvalCallStack.bind(this);
|
725
|
+
this.flushEvalCallStack = this.flushEvalCallStack.bind(this);
|
726
|
+
this.evaluate = this.evaluate.bind(this);
|
727
|
+
const { Element, Text, document } = getWindow2();
|
728
|
+
const _node = node;
|
729
|
+
const _parent = parentOrOptions instanceof Tree2 ? parentOrOptions : void 0;
|
730
|
+
this.node = _node;
|
731
|
+
this.parent = _parent ?? null;
|
732
|
+
this.root = this.parent === null ? this : this.parent.root;
|
733
|
+
this.isRoot = this.root === this;
|
734
|
+
let _options;
|
735
|
+
if (options !== void 0) {
|
736
|
+
_options = Tree2.fillOptions(options);
|
737
|
+
} else if (parentOrOptions instanceof Tree2 || parentOrOptions === void 0) {
|
738
|
+
_options = Tree2.fillOptions({});
|
739
|
+
} else {
|
740
|
+
_options = Tree2.fillOptions(parentOrOptions);
|
741
|
+
}
|
742
|
+
this.keyAttribute = _options.keyAttribute;
|
743
|
+
this.actionAttribute = _options.actionAttribute;
|
744
|
+
this.generators = this.isRoot ? _options.generatorsMap : this.root.generators;
|
745
|
+
this.name = this.node instanceof Element ? this.node.getAttribute(this.keyAttribute) : null;
|
746
|
+
const _pathFromParent = pathFromParent !== void 0 ? pathFromParent : void 0;
|
747
|
+
if (this.parent === null) this.path = [];
|
748
|
+
else if (_pathFromParent === void 0) {
|
749
|
+
this.path = [...this.parent.path, 0];
|
750
|
+
} else {
|
751
|
+
this.path = [...this.parent.path, _pathFromParent];
|
752
|
+
}
|
753
|
+
this.pathString = `/${this.path.join("/")}`;
|
754
|
+
this.tagName = node instanceof Element ? node.tagName.toLowerCase() : null;
|
755
|
+
this.attributes = isElement(node) ? Array.from(node.attributes) : null;
|
756
|
+
if (this.tagName === null) {
|
757
|
+
this.type = "text";
|
758
|
+
} else if (this.tagName === Types.TyperTagName.ANY) {
|
759
|
+
this.type = "any";
|
760
|
+
} else if (this.tagName === Types.TyperTagName.NULL) {
|
761
|
+
this.type = "null";
|
762
|
+
} else if (this.tagName === Types.TyperTagName.BOOLEAN) {
|
763
|
+
this.type = "boolean";
|
764
|
+
} else if (this.tagName === Types.TyperTagName.NUMBER) {
|
765
|
+
this.type = "number";
|
766
|
+
} else if (this.tagName === Types.TyperTagName.STRING) {
|
767
|
+
this.type = "string";
|
768
|
+
} else if (this.tagName === Types.TyperTagName.TEXT) {
|
769
|
+
this.type = "text";
|
770
|
+
} else if (this.tagName === Types.TyperTagName.NODELIST) {
|
771
|
+
this.type = "nodelist";
|
772
|
+
} else if (this.tagName === Types.TyperTagName.ARRAY) {
|
773
|
+
this.type = "array";
|
774
|
+
} else if (this.tagName === Types.TyperTagName.RECORD) {
|
775
|
+
this.type = "record";
|
776
|
+
} else if (this.tagName === Types.TyperTagName.LITERAL) {
|
777
|
+
this.type = "literal";
|
778
|
+
} else if (this.generators.get(this.tagName) !== void 0) {
|
779
|
+
this.type = "transformer";
|
780
|
+
} else {
|
781
|
+
this.type = "element";
|
782
|
+
}
|
783
|
+
const { childNodes } = node;
|
784
|
+
let positionnedChildrenCount = 0;
|
785
|
+
const mutableSubtrees = /* @__PURE__ */ new Map();
|
786
|
+
Array.from(childNodes).map((e) => {
|
787
|
+
if (!(e instanceof Text)) return e;
|
788
|
+
const trimmedTextNode = document.createTextNode(e.textContent?.trim() ?? "");
|
789
|
+
return trimmedTextNode;
|
790
|
+
}).filter((node2, _, nodes) => {
|
791
|
+
if (isElement(node2)) return true;
|
792
|
+
if (isText(node2)) {
|
793
|
+
const hasContent = (node2.textContent ?? "").trim() !== "";
|
794
|
+
if (hasContent) return true;
|
795
|
+
if (nodes.some((n) => n instanceof Element)) return false;
|
796
|
+
return true;
|
797
|
+
}
|
798
|
+
return false;
|
799
|
+
}).forEach((childNode) => {
|
800
|
+
if (childNode instanceof Text) {
|
801
|
+
childNode.textContent = childNode.textContent?.trim() ?? "";
|
802
|
+
mutableSubtrees.set(
|
803
|
+
positionnedChildrenCount,
|
804
|
+
new Tree2(childNode, this, positionnedChildrenCount, _options)
|
805
|
+
);
|
806
|
+
positionnedChildrenCount += 1;
|
807
|
+
} else {
|
808
|
+
const propertyName = childNode.getAttribute(this.keyAttribute);
|
809
|
+
if (propertyName === null) {
|
810
|
+
mutableSubtrees.set(
|
811
|
+
positionnedChildrenCount,
|
812
|
+
new Tree2(childNode, this, positionnedChildrenCount, _options)
|
813
|
+
);
|
814
|
+
positionnedChildrenCount += 1;
|
815
|
+
} else {
|
816
|
+
mutableSubtrees.set(
|
817
|
+
propertyName,
|
818
|
+
new Tree2(childNode, this, propertyName, _options)
|
819
|
+
);
|
820
|
+
}
|
821
|
+
}
|
822
|
+
});
|
823
|
+
this.subtrees = mutableSubtrees;
|
824
|
+
this.children = Array.from(this.subtrees.values());
|
825
|
+
}
|
826
|
+
resolve = function(path) {
|
827
|
+
let currentTree = this.root;
|
828
|
+
for (const chunk of path) {
|
829
|
+
const { subtrees } = currentTree;
|
830
|
+
const foundSubtree = subtrees.get(chunk);
|
831
|
+
if (foundSubtree === void 0) return void 0;
|
832
|
+
currentTree = foundSubtree;
|
833
|
+
}
|
834
|
+
return currentTree;
|
835
|
+
};
|
836
|
+
getGenerator(name) {
|
837
|
+
return this.generators.get(name);
|
838
|
+
}
|
839
|
+
initValue() {
|
840
|
+
const { type } = this;
|
841
|
+
let initialValue;
|
842
|
+
const { document } = getWindow2();
|
843
|
+
if (type === "any") {
|
844
|
+
initialValue = "";
|
845
|
+
} else if (type === "null") {
|
846
|
+
initialValue = null;
|
847
|
+
} else if (type === "boolean") {
|
848
|
+
initialValue = false;
|
849
|
+
} else if (type === "number") {
|
850
|
+
initialValue = 0;
|
851
|
+
} else if (type === "string") {
|
852
|
+
initialValue = "";
|
853
|
+
} else if (type === "text") {
|
854
|
+
initialValue = this.node.textContent;
|
855
|
+
} else if (type === "element") {
|
856
|
+
initialValue = document.createDocumentFragment().childNodes;
|
857
|
+
} else if (type === "nodelist") {
|
858
|
+
initialValue = document.createDocumentFragment().childNodes;
|
859
|
+
} else if (type === "array") {
|
860
|
+
initialValue = [];
|
861
|
+
} else if (type === "record") {
|
862
|
+
initialValue = {};
|
863
|
+
} else if (type === "transformer") {
|
864
|
+
initialValue = [];
|
865
|
+
} else if (type === "literal") {
|
866
|
+
initialValue = {};
|
867
|
+
} else {
|
868
|
+
initialValue = null;
|
869
|
+
}
|
870
|
+
return initialValue;
|
871
|
+
}
|
872
|
+
getInnerValue(initialValue) {
|
873
|
+
const { subtrees } = this;
|
874
|
+
const innerValue = Array.from(subtrees.entries()).reduce((currentValue, [subpath, subtree]) => mergeValues(
|
875
|
+
currentValue,
|
876
|
+
subtree.evaluate(),
|
877
|
+
subpath,
|
878
|
+
this
|
879
|
+
), initialValue);
|
880
|
+
return innerValue;
|
881
|
+
}
|
882
|
+
wrapInnerValue(innerValue) {
|
883
|
+
const { type } = this;
|
884
|
+
const { document } = getWindow2();
|
885
|
+
if (type === "transformer") {
|
886
|
+
const transformerName = this.tagName;
|
887
|
+
if (transformerName === null) return innerValue;
|
888
|
+
const generator = this.getGenerator(transformerName);
|
889
|
+
if (generator === void 0) return innerValue;
|
890
|
+
const transformer = Array.isArray(innerValue) ? generator(transformerName, ...innerValue) : generator(transformerName, innerValue);
|
891
|
+
return transformer;
|
892
|
+
}
|
893
|
+
if (type === "any") return innerValue;
|
894
|
+
if (type === "null") return null;
|
895
|
+
if (type === "boolean") return Cast.toBoolean(innerValue);
|
896
|
+
if (type === "number") return Cast.toNumber(innerValue);
|
897
|
+
if (type === "string") return Cast.toString(innerValue);
|
898
|
+
if (type === "array") return Cast.toArray(innerValue);
|
899
|
+
if (type === "record") return Cast.toRecord(innerValue);
|
900
|
+
if (type === "text") return Cast.toText(innerValue);
|
901
|
+
if (type === "element") {
|
902
|
+
const returnedElt = this.node.cloneNode();
|
903
|
+
const innerNodelist = Cast.toNodeList(innerValue);
|
904
|
+
returnedElt.append(...Array.from(innerNodelist));
|
905
|
+
return returnedElt;
|
906
|
+
}
|
907
|
+
if (type === "nodelist") return Cast.toNodeList(innerValue);
|
908
|
+
if (type === "literal") {
|
909
|
+
const val = Utils.toHyperJson(innerValue, this.keyAttribute);
|
910
|
+
const valChildren = val.childNodes;
|
911
|
+
const literal = document.createElement("literal");
|
912
|
+
literal.append(...Array.from(valChildren));
|
913
|
+
const thisElement = this.node;
|
914
|
+
Array.from(thisElement.attributes).forEach((attr) => literal.setAttribute(attr.name, attr.value));
|
915
|
+
return literal;
|
916
|
+
}
|
917
|
+
return null;
|
918
|
+
}
|
919
|
+
cache = void 0;
|
920
|
+
setCache(value) {
|
921
|
+
this.cache = Serialize.serialize(value);
|
922
|
+
}
|
923
|
+
perfCounters = {
|
924
|
+
computed: 0,
|
925
|
+
computeTime: 0,
|
926
|
+
computeTimeAvg: 0,
|
927
|
+
cached: 0,
|
928
|
+
cacheTime: 0,
|
929
|
+
cacheTimeAvg: 0,
|
930
|
+
totalTime: 0
|
931
|
+
};
|
932
|
+
getPerfCounters() {
|
933
|
+
const { subtrees } = this;
|
934
|
+
const subCounters = [];
|
935
|
+
subCounters.push([this.pathString, this.perfCounters]);
|
936
|
+
subtrees.forEach((subtree) => subCounters.push(...subtree.getPerfCounters()));
|
937
|
+
return subCounters;
|
938
|
+
}
|
939
|
+
printPerfCounters() {
|
940
|
+
const perfCounters = this.getPerfCounters().sort((a, b) => b[1].totalTime - a[1].totalTime).map((e) => ({
|
941
|
+
path: e[0],
|
942
|
+
totalMs: e[1].totalTime,
|
943
|
+
computeMs: e[1].computeTime,
|
944
|
+
cacheMs: e[1].cacheTime,
|
945
|
+
ops: `${e[1].computed}/${e[1].cached}`
|
946
|
+
}));
|
947
|
+
console.table(perfCounters);
|
948
|
+
}
|
949
|
+
callstack = [];
|
950
|
+
pushToEvalCallStack(path) {
|
951
|
+
this.callstack.push(path);
|
952
|
+
this.parent?.pushToEvalCallStack(path);
|
953
|
+
}
|
954
|
+
flushEvalCallStack() {
|
955
|
+
this.callstack.length = 0;
|
956
|
+
}
|
957
|
+
evaluate() {
|
958
|
+
const start = Date.now();
|
959
|
+
const circularPatternDetected = this.callstack.some((p) => p.startsWith(this.pathString));
|
960
|
+
if (circularPatternDetected) throw new Error(`Circular reference pattern detected @ ${this.pathString}`);
|
961
|
+
this.pushToEvalCallStack(this.pathString);
|
962
|
+
const { perfCounters, cache } = this;
|
963
|
+
if (cache !== void 0) {
|
964
|
+
const deserialized = Serialize.deserialize(cache);
|
965
|
+
const end2 = Date.now();
|
966
|
+
const time2 = end2 - start;
|
967
|
+
perfCounters.cached++;
|
968
|
+
perfCounters.cacheTime += time2;
|
969
|
+
perfCounters.cacheTimeAvg = perfCounters.cacheTime / perfCounters.cached;
|
970
|
+
perfCounters.totalTime = perfCounters.computeTime + perfCounters.cacheTime;
|
971
|
+
return deserialized;
|
972
|
+
}
|
973
|
+
const init = this.initValue();
|
974
|
+
const inner = this.getInnerValue(init);
|
975
|
+
const wrapped = this.wrapInnerValue(inner);
|
976
|
+
this.setCache(wrapped);
|
977
|
+
const end = Date.now();
|
978
|
+
const time = end - start;
|
979
|
+
perfCounters.computed++;
|
980
|
+
perfCounters.computeTime += time;
|
981
|
+
perfCounters.computeTimeAvg = perfCounters.computeTime / perfCounters.computed;
|
982
|
+
perfCounters.totalTime = perfCounters.computeTime + perfCounters.cacheTime;
|
983
|
+
this.flushEvalCallStack();
|
984
|
+
return wrapped;
|
985
|
+
}
|
986
|
+
}
|
987
|
+
_Tree.Tree = Tree2;
|
988
|
+
})(Tree || (Tree = {}));
|
989
|
+
|
990
|
+
// src/agnostic/html/hyper-json/utils/index.ts
|
991
|
+
var Utils;
|
992
|
+
((Utils2) => {
|
993
|
+
Utils2.pathStringToPath = (pathString) => {
|
994
|
+
let cleanPathString = pathString;
|
995
|
+
while (cleanPathString.startsWith("/")) {
|
996
|
+
cleanPathString = cleanPathString.slice(1);
|
997
|
+
}
|
998
|
+
while (cleanPathString.endsWith("/")) {
|
999
|
+
cleanPathString = cleanPathString.slice(0, -1);
|
1000
|
+
}
|
1001
|
+
return cleanPathString.split("/").map((e) => {
|
1002
|
+
const parsed = parseInt(e);
|
1003
|
+
if (Number.isNaN(parsed)) return e;
|
1004
|
+
return parsed;
|
1005
|
+
});
|
1006
|
+
};
|
1007
|
+
Utils2.pathToPathString = (path) => `/${path.map((e) => `${e}`).join("/")}`;
|
1008
|
+
Utils2.makeTransformerError = (value) => ({
|
1009
|
+
action: "ERROR",
|
1010
|
+
value
|
1011
|
+
});
|
1012
|
+
Utils2.toNamedTransformer = (name, args, anonymous) => {
|
1013
|
+
const named = anonymous;
|
1014
|
+
named.transformerName = name;
|
1015
|
+
named.args = args;
|
1016
|
+
return named;
|
1017
|
+
};
|
1018
|
+
Utils2.toHyperJson = (value, keyAttribute = Tree.defaultKeyAttribute) => {
|
1019
|
+
const { document, Element, Text, NodeList } = Window.get();
|
1020
|
+
if (value instanceof Text) {
|
1021
|
+
const elt2 = document.createElement("text");
|
1022
|
+
elt2.innerHTML = value.textContent ?? "";
|
1023
|
+
return elt2;
|
1024
|
+
}
|
1025
|
+
if (value instanceof Element) return value.cloneNode(true);
|
1026
|
+
if (value instanceof NodeList) {
|
1027
|
+
const elt2 = document.createElement("nodelist");
|
1028
|
+
elt2.append(...Array.from(value).map((e) => e.cloneNode(true)));
|
1029
|
+
return elt2;
|
1030
|
+
}
|
1031
|
+
if (value === null) return document.createElement("null");
|
1032
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
1033
|
+
const elt2 = document.createElement(typeof value);
|
1034
|
+
elt2.innerHTML = `${value}`;
|
1035
|
+
return elt2;
|
1036
|
+
}
|
1037
|
+
if (typeof value === "function") {
|
1038
|
+
const name = value.transformerName;
|
1039
|
+
const args = value.args;
|
1040
|
+
const elt2 = document.createElement(name);
|
1041
|
+
const hyperJsonArgs = args.map((arg) => (0, Utils2.toHyperJson)(arg, keyAttribute));
|
1042
|
+
elt2.append(...hyperJsonArgs);
|
1043
|
+
return elt2;
|
1044
|
+
}
|
1045
|
+
if (Array.isArray(value)) {
|
1046
|
+
const elt2 = document.createElement("array");
|
1047
|
+
elt2.append(...value.map((e) => (0, Utils2.toHyperJson)(e, keyAttribute)));
|
1048
|
+
return elt2;
|
1049
|
+
}
|
1050
|
+
const elt = document.createElement("record");
|
1051
|
+
Object.entries(value).forEach(([key, val]) => {
|
1052
|
+
const hjVal = (0, Utils2.toHyperJson)(val);
|
1053
|
+
hjVal.setAttribute(keyAttribute, key);
|
1054
|
+
elt.append(hjVal);
|
1055
|
+
});
|
1056
|
+
return elt;
|
1057
|
+
};
|
1058
|
+
})(Utils || (Utils = {}));
|
1059
|
+
|
1060
|
+
// src/agnostic/html/hyper-json/transformers/append/index.ts
|
1061
|
+
var append = (callerTagName, ...args) => {
|
1062
|
+
return Utils.toNamedTransformer(callerTagName, args, (currentValue) => {
|
1063
|
+
const { document, Element, Text, NodeList } = Window.get();
|
1064
|
+
const [...toAppend] = args;
|
1065
|
+
const frag = document.createDocumentFragment();
|
1066
|
+
frag.append(...Array.from(Cast.toNodeList(currentValue)).map((e) => e.cloneNode(true)));
|
1067
|
+
toAppend.forEach((item) => {
|
1068
|
+
if (item instanceof Element) frag.append(item.cloneNode(true));
|
1069
|
+
else if (item instanceof Text) frag.append(item.cloneNode(true));
|
1070
|
+
else if (item instanceof NodeList) frag.append(...Array.from(item).map((e) => e.cloneNode(true)));
|
1071
|
+
else frag.append(Cast.toString(item));
|
1072
|
+
});
|
1073
|
+
return {
|
1074
|
+
action: "REPLACE",
|
1075
|
+
value: frag.childNodes
|
1076
|
+
};
|
1077
|
+
});
|
1078
|
+
};
|
1079
|
+
|
1080
|
+
export {
|
1081
|
+
append,
|
1082
|
+
classList,
|
1083
|
+
join,
|
1084
|
+
length,
|
1085
|
+
print,
|
1086
|
+
push,
|
1087
|
+
querySelector,
|
1088
|
+
ref,
|
1089
|
+
replace,
|
1090
|
+
split,
|
1091
|
+
toArray,
|
1092
|
+
toBoolean,
|
1093
|
+
toElement,
|
1094
|
+
toNodeList,
|
1095
|
+
toNull,
|
1096
|
+
toNumber,
|
1097
|
+
toRecord,
|
1098
|
+
toRef,
|
1099
|
+
toString,
|
1100
|
+
toText,
|
1101
|
+
toTransformer,
|
1102
|
+
transformSelected,
|
1103
|
+
trim,
|
1104
|
+
Transformers,
|
1105
|
+
Tree,
|
1106
|
+
Utils,
|
1107
|
+
Cast
|
1108
|
+
};
|