@realmorg/realm 0.0.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/LICENSE +7 -0
- package/README.md +36 -0
- package/dist/realm.css +9 -0
- package/dist/realm.development.js +2458 -0
- package/dist/realm.production.min.js +11 -0
- package/dist/realm.production.min.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,2458 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Realm
|
|
3
|
+
* @link https://realm.codes
|
|
4
|
+
* @link https://github.com/realmorg
|
|
5
|
+
* @copyright Copyright (c) Realmorg
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// src/constants/attrs.ts
|
|
13
|
+
var RealmAttributeNames = {
|
|
14
|
+
ACTION: "action",
|
|
15
|
+
AS: "as",
|
|
16
|
+
ASYNC: "async",
|
|
17
|
+
CHILDREN: "children",
|
|
18
|
+
DEBOUNCE: "debounce",
|
|
19
|
+
DEBUG: "debug",
|
|
20
|
+
DEFER: "defer",
|
|
21
|
+
ELEMENT: "element",
|
|
22
|
+
EVERY: "every",
|
|
23
|
+
FROM: "from",
|
|
24
|
+
GLOBAL: "global",
|
|
25
|
+
HREF: "href",
|
|
26
|
+
INDEX: "index",
|
|
27
|
+
IS_LOADED: "loaded",
|
|
28
|
+
MOUNT: "mount",
|
|
29
|
+
MUTATE: "mutate",
|
|
30
|
+
NAME: "name",
|
|
31
|
+
OF: "of",
|
|
32
|
+
ONCE: "once",
|
|
33
|
+
REF: "ref",
|
|
34
|
+
REL: "rel",
|
|
35
|
+
SCRIPT_ID: "script-id",
|
|
36
|
+
SLOT: "slot",
|
|
37
|
+
SRC: "src",
|
|
38
|
+
STORAGE: "storage",
|
|
39
|
+
TO: "to",
|
|
40
|
+
TOGGLE: "toggle",
|
|
41
|
+
TYPE: "type",
|
|
42
|
+
VALUE: "value",
|
|
43
|
+
METHOD: "method",
|
|
44
|
+
HTTP_URL: "url"
|
|
45
|
+
};
|
|
46
|
+
var RealmMutableAttr = {
|
|
47
|
+
ATTR: "attr",
|
|
48
|
+
META: "meta",
|
|
49
|
+
SRC: "src",
|
|
50
|
+
STATE: "state"
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// src/constants/chars.ts
|
|
54
|
+
var EMPTY_STRING = "";
|
|
55
|
+
var BIND_ATTR_PREFIX = "_";
|
|
56
|
+
var STATE_PREFIX = "#";
|
|
57
|
+
var ATTR_PREFIX = "@";
|
|
58
|
+
var SOURCE_PREFIX = "$";
|
|
59
|
+
var EVENT_PREFIX = "RLM:";
|
|
60
|
+
var DATA_PREFIX = "data-";
|
|
61
|
+
var VAR_PREFIX = "var";
|
|
62
|
+
var COMMA_SEPARATOR = ",";
|
|
63
|
+
var DASH_SEPARATOR = "-";
|
|
64
|
+
var PIPELINE_SEPARATOR = "|";
|
|
65
|
+
var COLON = ":";
|
|
66
|
+
var SEMICOLON = ";";
|
|
67
|
+
var LEFT_PARENTHESES = "(";
|
|
68
|
+
var RIGHT_PARENTHESES = ")";
|
|
69
|
+
var LEFT_BRACES = "{";
|
|
70
|
+
var RIGHT_BRACES = "}";
|
|
71
|
+
var DOT_NOTATION = ".";
|
|
72
|
+
var META_PREFIX = "!";
|
|
73
|
+
var ALL = "*";
|
|
74
|
+
var RealmLogicOp = {
|
|
75
|
+
EQUALS_TO: "eq",
|
|
76
|
+
NOT_EQUALS_TO: "neq",
|
|
77
|
+
GREATER_THAN: "gt",
|
|
78
|
+
GREATER_THAN_OR_EQUALS_TO: "gte",
|
|
79
|
+
LESS_THAN: "lt",
|
|
80
|
+
LESS_THAN_OR_EQUALS_TO: "lte",
|
|
81
|
+
CONTAINS: "contains"
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// src/constants/tags.ts
|
|
85
|
+
var RealmTagNames = {
|
|
86
|
+
ALL,
|
|
87
|
+
TEMPLATE: "template",
|
|
88
|
+
EMBED: "embed",
|
|
89
|
+
SLOT: "slot",
|
|
90
|
+
WEB_APP: "web-app",
|
|
91
|
+
GLOBAL_STATE: "global-state",
|
|
92
|
+
DEFINE_ELEMENT: "define-element",
|
|
93
|
+
CUSTOM_ELEMENT: "custom-element",
|
|
94
|
+
ELEMENT_ATTR: "element-attr",
|
|
95
|
+
ELEMENT_STATE: "element-state",
|
|
96
|
+
ELEMENT_FLOW: "element-flow",
|
|
97
|
+
REPEAT_LIST: "repeat-list",
|
|
98
|
+
IS_VISIBLE: "is-visible",
|
|
99
|
+
IS_HIDDEN: "is-hidden",
|
|
100
|
+
IMPORT_ELEMENT: "import-element",
|
|
101
|
+
IMPORT_SCRIPT: "import-script",
|
|
102
|
+
IMPORT_STYLE: "import-style",
|
|
103
|
+
SCRIPT: "script",
|
|
104
|
+
LINK: "link",
|
|
105
|
+
STYLE: "style",
|
|
106
|
+
HEAD: "head"
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// src/constants/data.ts
|
|
110
|
+
var RealmMimeTypes = {
|
|
111
|
+
HTML: "text/html",
|
|
112
|
+
JSON: "application/json",
|
|
113
|
+
TEXT: "text/plain"
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// src/utils/json.ts
|
|
117
|
+
var JSONstringify = JSON.stringify;
|
|
118
|
+
var JSONparse = JSON.parse;
|
|
119
|
+
var JSONSafeStringify = (value = EMPTY_STRING) => typeof value === "object" ? JSONstringify(value) : `${value}`;
|
|
120
|
+
var JSONSafeParse = (value) => JSONparse(JSONSafeStringify(value));
|
|
121
|
+
|
|
122
|
+
// src/utils/logger.ts
|
|
123
|
+
var logger = (messsages, type = "log") => console[type](...messsages);
|
|
124
|
+
|
|
125
|
+
// src/constants/regx.ts
|
|
126
|
+
var UPPERCASE_ALPHABET_REGEX = /([A-Z])+/g;
|
|
127
|
+
var SPECIAL_CHARS_REGEX = /(?=[A-Z])|[.\-\s_]/;
|
|
128
|
+
var CSS_CUSTOM_SELECTOR_REGEX = /:host\(\[\\([#@]\w+?)\](\[(global)\])?(\[(eq|neq|gt|gte|lt|lte|contains)="(\w+?)"\])?\)/g;
|
|
129
|
+
var DOT_NOTATION_REGEX = /[$|#|@|!]([.]?(?:\w+[.-])*\w+)/gm;
|
|
130
|
+
|
|
131
|
+
// src/libs/RealmState.class.ts
|
|
132
|
+
var RealmState = class {
|
|
133
|
+
#states;
|
|
134
|
+
#observers;
|
|
135
|
+
constructor() {
|
|
136
|
+
this.#states = createMap();
|
|
137
|
+
this.#observers = createSet();
|
|
138
|
+
}
|
|
139
|
+
set(stateName, value, storage) {
|
|
140
|
+
const prevValue = getMap(this.#states, stateName);
|
|
141
|
+
const newValue = typeof value === "function" ? value(prevValue) : value;
|
|
142
|
+
if (storage !== "memory" /* MEMORY */) {
|
|
143
|
+
window?.[storage]?.setItem(
|
|
144
|
+
stateName,
|
|
145
|
+
JSONSafeStringify(newValue)
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
setMap(this.#states, stateName, newValue);
|
|
149
|
+
forEach(
|
|
150
|
+
this.#observers,
|
|
151
|
+
(fn) => fn?.apply?.(this, [stateName, newValue, prevValue])
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
get(name, storage) {
|
|
155
|
+
if (storage !== "memory" /* MEMORY */) {
|
|
156
|
+
const value = window?.[storage]?.getItem(name);
|
|
157
|
+
if (value)
|
|
158
|
+
return JSONSafeParse(value);
|
|
159
|
+
}
|
|
160
|
+
return getMap(this.#states, name);
|
|
161
|
+
}
|
|
162
|
+
async subscribe(observer) {
|
|
163
|
+
this.#observe(observer);
|
|
164
|
+
addSet(this.#observers, observer);
|
|
165
|
+
}
|
|
166
|
+
#observe(observer) {
|
|
167
|
+
forEachMap(
|
|
168
|
+
this.#states,
|
|
169
|
+
(value, stateName) => observer?.apply?.(this, [stateName, value])
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// src/utils/string.ts
|
|
175
|
+
var strTrim = (str) => str.trim();
|
|
176
|
+
var strSlice = (str, start = 1, end) => {
|
|
177
|
+
if (str == null)
|
|
178
|
+
return EMPTY_STRING;
|
|
179
|
+
return str.slice(start, end);
|
|
180
|
+
};
|
|
181
|
+
var strSplit = (str, split) => str.split(split);
|
|
182
|
+
var strToLower = (str) => str?.toLowerCase?.();
|
|
183
|
+
var strReplace = (str, searchValue, replaceValue) => str.replace(searchValue, replaceValue);
|
|
184
|
+
var strStartWith = (str, searchValue) => str.startsWith(searchValue);
|
|
185
|
+
var strIncludes = (str, searchValue) => str.includes(searchValue);
|
|
186
|
+
var toUpperCase = (str) => str.toUpperCase();
|
|
187
|
+
var capitalize = (str) => {
|
|
188
|
+
if (!str)
|
|
189
|
+
return EMPTY_STRING;
|
|
190
|
+
const [first, ...rest] = strSplit(strToLower(str), EMPTY_STRING);
|
|
191
|
+
return toUpperCase(first) + arrayJoin(rest, EMPTY_STRING);
|
|
192
|
+
};
|
|
193
|
+
var splitChars = (str) => strSplit(
|
|
194
|
+
str?.replace(UPPERCASE_ALPHABET_REGEX, capitalize),
|
|
195
|
+
SPECIAL_CHARS_REGEX
|
|
196
|
+
);
|
|
197
|
+
var dash = (str) => {
|
|
198
|
+
const parts = arrayMap(splitChars(str), strToLower) ?? [];
|
|
199
|
+
const length = parts.length;
|
|
200
|
+
if (length === 0)
|
|
201
|
+
return EMPTY_STRING;
|
|
202
|
+
if (length === 1)
|
|
203
|
+
return parts.at(0);
|
|
204
|
+
return arrayJoin(parts, DASH_SEPARATOR);
|
|
205
|
+
};
|
|
206
|
+
var newError = (errorMessage) => new Error(errorMessage);
|
|
207
|
+
|
|
208
|
+
// src/utils/object.ts
|
|
209
|
+
var createMap = (map = []) => new Map(map);
|
|
210
|
+
var createSet = (entries) => new Set(entries);
|
|
211
|
+
var createArray = (from) => Array.from(from);
|
|
212
|
+
var getObject = (isState) => (acc, item, index) => isState && index === 0 ? acc.get(item) : acc[item];
|
|
213
|
+
var getValueFrom = (source, dotNotation, prefix) => {
|
|
214
|
+
if (!dotNotation)
|
|
215
|
+
return source;
|
|
216
|
+
if (!DOT_NOTATION_REGEX.test(dotNotation))
|
|
217
|
+
return dotNotation;
|
|
218
|
+
if (!!prefix && !strStartWith(dotNotation, prefix))
|
|
219
|
+
return dotNotation;
|
|
220
|
+
const isState = source instanceof RealmState;
|
|
221
|
+
return dotNotation.replace(DOT_NOTATION_REGEX, (_match, group) => {
|
|
222
|
+
const target = arraySplit(strSlice(group), DOT_NOTATION);
|
|
223
|
+
const replaceValue = arrayReduce2(target, getObject(isState), source);
|
|
224
|
+
return typeof replaceValue === "object" ? JSONstringify(replaceValue) : replaceValue;
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
var toDotNotation = (object, prefix = SOURCE_PREFIX) => {
|
|
228
|
+
const entries = entriesOf(object);
|
|
229
|
+
return arrayReduce2(
|
|
230
|
+
entries,
|
|
231
|
+
(acc, [key, value]) => {
|
|
232
|
+
if (typeof value === "object")
|
|
233
|
+
return arrayReduce2(
|
|
234
|
+
toDotNotation(value),
|
|
235
|
+
(acc2, item) => [
|
|
236
|
+
...acc2,
|
|
237
|
+
`${prefix}${DOT_NOTATION}${key}${DOT_NOTATION}${item}`
|
|
238
|
+
],
|
|
239
|
+
acc
|
|
240
|
+
);
|
|
241
|
+
return [...acc, `${prefix}${DOT_NOTATION}${key}`];
|
|
242
|
+
},
|
|
243
|
+
[]
|
|
244
|
+
);
|
|
245
|
+
};
|
|
246
|
+
var isArray = (array) => Array.isArray(array);
|
|
247
|
+
var forEach = (array, fn) => void arrayReduce2(createArray(array), (acc, item, index) => {
|
|
248
|
+
fn?.(item, index);
|
|
249
|
+
return acc;
|
|
250
|
+
});
|
|
251
|
+
var forEachMap = (map, fn) => map.forEach(fn);
|
|
252
|
+
var forEachNode = (nodes, fn) => nodes.forEach(fn);
|
|
253
|
+
var arrayReduce2 = (array, fn, initialValue) => array.reduce(fn, initialValue);
|
|
254
|
+
var arrayPush = (array, value) => array.push(value);
|
|
255
|
+
var arrayPop = (array) => array.pop();
|
|
256
|
+
var arrayMap = (array, fn) => array.map(fn);
|
|
257
|
+
var arrayJoin = (array, separator) => array.join(separator);
|
|
258
|
+
var arraySplit = (str, separator) => str.split(separator);
|
|
259
|
+
var arraySplice = (array, start, deleteCount, ...items) => array.splice(start, deleteCount, ...items);
|
|
260
|
+
var arrayIncludes = (value, array) => array.includes(value);
|
|
261
|
+
var trimArrayString = (array) => array.map((item) => item.trim());
|
|
262
|
+
var someArray = (array, fn) => array.some(fn);
|
|
263
|
+
var findArray = (array, fn) => array.find(fn);
|
|
264
|
+
var filterArray = (array, fn) => array.filter(fn);
|
|
265
|
+
var getMap = (map, key) => map.get(key);
|
|
266
|
+
var setMap = (map, key, value) => map.set(key, value);
|
|
267
|
+
var addSet = (set, value) => set.add(value);
|
|
268
|
+
var fromEntries = (entries) => Object.fromEntries(entries);
|
|
269
|
+
var entriesOf = (object) => Object.entries(object);
|
|
270
|
+
|
|
271
|
+
// src/utils/dom.ts
|
|
272
|
+
var doc = document;
|
|
273
|
+
var head = doc.head;
|
|
274
|
+
var win = window;
|
|
275
|
+
var _html = (self, html) => self.innerHTML = html;
|
|
276
|
+
var _clear = (self) => (element) => _html(element ?? self, EMPTY_STRING);
|
|
277
|
+
var _content = (self) => (content, element) => (element ?? self).textContent = typeof content === "object" ? JSONstringify(content) : `${content}`;
|
|
278
|
+
var _attach = (self) => () => {
|
|
279
|
+
const element = self;
|
|
280
|
+
element.shadow = self.attachShadow({
|
|
281
|
+
mode: "closed",
|
|
282
|
+
slotAssignment: "manual"
|
|
283
|
+
});
|
|
284
|
+
return $shadow(element)();
|
|
285
|
+
};
|
|
286
|
+
var _append = (self) => (element, appendTo) => (appendTo ?? self).append(element);
|
|
287
|
+
var _renderTemplate = (self) => (node) => {
|
|
288
|
+
if (!node)
|
|
289
|
+
return;
|
|
290
|
+
const $$clone = $clone(self);
|
|
291
|
+
const element = node instanceof HTMLTemplateElement ? $$clone(node).content : node;
|
|
292
|
+
_append(self)(element, $shadow(self)());
|
|
293
|
+
};
|
|
294
|
+
var _remove = (self) => (element) => (element ?? self).remove();
|
|
295
|
+
var _replace = (self) => (newElement, targetElement) => (targetElement ?? self).replaceWith(newElement);
|
|
296
|
+
var _createElement = (tagName) => doc.createElement(tagName);
|
|
297
|
+
var _createFragment = () => doc.createDocumentFragment();
|
|
298
|
+
var _removeAttr = (self) => (attrName, element) => (element ?? self).removeAttribute(attrName);
|
|
299
|
+
var _attrs = (self) => (attributes, element) => {
|
|
300
|
+
const el = element ?? self;
|
|
301
|
+
const setAttribute = el.setAttribute.bind(el);
|
|
302
|
+
const removeAttribute = el.removeAttribute.bind(el);
|
|
303
|
+
const setDOMAttribute = (name, value) => name in el && (el[name] = value);
|
|
304
|
+
forEach(
|
|
305
|
+
attributes.filter((attr) => attr),
|
|
306
|
+
([name, value]) => {
|
|
307
|
+
if (typeof value !== "boolean") {
|
|
308
|
+
const finalValue = JSONSafeStringify(value);
|
|
309
|
+
setAttribute(name, finalValue);
|
|
310
|
+
setDOMAttribute(name, finalValue);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (value) {
|
|
314
|
+
setAttribute(name, EMPTY_STRING);
|
|
315
|
+
} else {
|
|
316
|
+
removeAttribute(name);
|
|
317
|
+
}
|
|
318
|
+
setDOMAttribute(name, value);
|
|
319
|
+
}
|
|
320
|
+
);
|
|
321
|
+
};
|
|
322
|
+
var _attr = (self) => (name, value, element) => _attrs(self)([[name, value]], element);
|
|
323
|
+
var _data = (self) => (name, value, element) => _attr(self)(`${DATA_PREFIX}${name}`, value, element);
|
|
324
|
+
var _datas = (self) => (attributes, element) => _attrs(self)(attributes, element);
|
|
325
|
+
var _slotTo = (slot, nodes) => slot && !!nodes && slot.assign(...nodes);
|
|
326
|
+
var _addEvent = (self) => (name, callback, element) => (element ?? self).addEventListener(name, callback);
|
|
327
|
+
var _removeEvent = (self) => (name, callback, element) => (element ?? self).removeEventListener(name, callback);
|
|
328
|
+
var _addCustomEvent = (self) => (name, callback, element) => _addEvent(self)(
|
|
329
|
+
EVENT_PREFIX + name,
|
|
330
|
+
(event2) => callback?.apply(element ?? self, [event2.detail])
|
|
331
|
+
);
|
|
332
|
+
var _sendEvent = (self) => (name, detail, element) => (element ?? self).dispatchEvent(
|
|
333
|
+
new CustomEvent(EVENT_PREFIX + name, {
|
|
334
|
+
detail
|
|
335
|
+
})
|
|
336
|
+
);
|
|
337
|
+
var _debug = (self) => (slot, value, element) => {
|
|
338
|
+
const debug = $attr(element ?? self)(
|
|
339
|
+
RealmAttributeNames.DEBUG,
|
|
340
|
+
slot
|
|
341
|
+
);
|
|
342
|
+
if (debug)
|
|
343
|
+
logger([debug, value]);
|
|
344
|
+
};
|
|
345
|
+
var $randId = () => parseInt(
|
|
346
|
+
strReplace(Math.random().toString(), DOT_NOTATION, EMPTY_STRING)
|
|
347
|
+
).toString(16);
|
|
348
|
+
var $html = (element) => element?.innerHTML;
|
|
349
|
+
var $name = (self) => () => self.name;
|
|
350
|
+
var $id = (self) => (element) => (element ?? self).id;
|
|
351
|
+
var $tagName = (self) => (element) => strToLower((element ?? self)?.tagName);
|
|
352
|
+
var $clone = (self) => (element) => (element ?? self).cloneNode(true);
|
|
353
|
+
var $qsString = (selector, attrs) => {
|
|
354
|
+
if (!isArray(attrs))
|
|
355
|
+
return selector;
|
|
356
|
+
return arrayReduce2(
|
|
357
|
+
attrs.filter((item) => isArray(item)),
|
|
358
|
+
(acc, [attrName, attrValue]) => {
|
|
359
|
+
const attrValueAssignment = `="${attrValue}"`;
|
|
360
|
+
if (attrName)
|
|
361
|
+
acc += `[${attrName}${attrValue ? attrValueAssignment : EMPTY_STRING}]`;
|
|
362
|
+
return acc;
|
|
363
|
+
},
|
|
364
|
+
selector
|
|
365
|
+
);
|
|
366
|
+
};
|
|
367
|
+
var $qs = (self) => (selector, attrs, element) => (element ?? self)?.querySelector($qsString(selector, attrs));
|
|
368
|
+
var $qsAll = (self) => (selector, attrs, element) => (element ?? self)?.querySelectorAll($qsString(selector, attrs));
|
|
369
|
+
var $children = (self) => (element) => createArray((element ?? self).children);
|
|
370
|
+
var $nodes = (self) => (element) => createArray((element ?? self).childNodes);
|
|
371
|
+
var $attrName = (attr) => attr.name;
|
|
372
|
+
var $attrValue = (attr) => attr.value;
|
|
373
|
+
var $attrs = (self) => (element) => createArray((element || self)?.attributes ?? []);
|
|
374
|
+
var $attrsKv = (self) => (element) => arrayReduce2(
|
|
375
|
+
$attrs(self)(element),
|
|
376
|
+
(acc, attr) => {
|
|
377
|
+
acc[$attrName(attr)] = $attrValue(attr);
|
|
378
|
+
return acc;
|
|
379
|
+
},
|
|
380
|
+
{}
|
|
381
|
+
);
|
|
382
|
+
var $attr = (self) => (name, element) => (element || self)?.getAttribute?.(name);
|
|
383
|
+
var $hasAttr = (self) => (name, element) => (element || self).hasAttribute(name);
|
|
384
|
+
var $data = (self) => (name, element) => $attr(self)(`${DATA_PREFIX}${name}`, element);
|
|
385
|
+
var $el = (self) => (selector, attrNameOrAttrs, attrValue) => $qs(self)(
|
|
386
|
+
selector,
|
|
387
|
+
isArray(attrNameOrAttrs) ? attrNameOrAttrs : [[attrNameOrAttrs, attrValue]]
|
|
388
|
+
);
|
|
389
|
+
var $els = (self) => (selector, attrNameOrAttrs, attrValue) => $qsAll(self)(
|
|
390
|
+
selector,
|
|
391
|
+
isArray(attrNameOrAttrs) ? attrNameOrAttrs : [[attrNameOrAttrs, attrValue]]
|
|
392
|
+
);
|
|
393
|
+
var $shadowEl = (self) => (selector, attrNameOrAttrs, attrValue) => $qs(self)(
|
|
394
|
+
selector,
|
|
395
|
+
isArray(attrNameOrAttrs) ? attrNameOrAttrs : [[attrNameOrAttrs, attrValue]],
|
|
396
|
+
$shadow(self)()
|
|
397
|
+
);
|
|
398
|
+
var $shadowEls = (self) => (selector, attrNameOrAttrs, attrValue) => $qsAll(self)(
|
|
399
|
+
selector,
|
|
400
|
+
isArray(attrNameOrAttrs) ? attrNameOrAttrs : [[attrNameOrAttrs, attrValue]],
|
|
401
|
+
$shadow(self)()
|
|
402
|
+
);
|
|
403
|
+
var $slotAttrName = (name) => `${ATTR_PREFIX}${name}`;
|
|
404
|
+
var $slotStateName = (name) => `${STATE_PREFIX}${name}`;
|
|
405
|
+
var $parent = (self) => (element) => (element ?? self).parentElement;
|
|
406
|
+
var $parentNode = (self) => (element) => (element ?? self).parentNode;
|
|
407
|
+
var $shadow = (self) => () => self.shadow;
|
|
408
|
+
var $root = (self) => () => self.getRootNode();
|
|
409
|
+
var $host = (self) => () => $root(self)().host;
|
|
410
|
+
var DOMFrom = (string) => {
|
|
411
|
+
const domParser = new DOMParser();
|
|
412
|
+
return domParser.parseFromString(string, RealmMimeTypes.HTML);
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
// src/constants/styles.ts
|
|
416
|
+
var HOST_SELECTOR = ":host";
|
|
417
|
+
var RealmCSSVarConst = {
|
|
418
|
+
OPERATOR: "op",
|
|
419
|
+
COMPARATOR: "comp",
|
|
420
|
+
VALUE: "value",
|
|
421
|
+
STYLE: "style",
|
|
422
|
+
GLOBAL: "global"
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
// src/utils/logic.ts
|
|
426
|
+
var isTruthy = (operator, comparator, value) => {
|
|
427
|
+
const eq = operator === RealmLogicOp.EQUALS_TO ? comparator : null;
|
|
428
|
+
const neq = operator === RealmLogicOp.NOT_EQUALS_TO ? comparator : null;
|
|
429
|
+
const gt = operator === RealmLogicOp.GREATER_THAN ? comparator : null;
|
|
430
|
+
const gte = operator === RealmLogicOp.GREATER_THAN_OR_EQUALS_TO ? comparator : null;
|
|
431
|
+
const lt = operator === RealmLogicOp.LESS_THAN ? comparator : null;
|
|
432
|
+
const lte = operator === RealmLogicOp.LESS_THAN_OR_EQUALS_TO ? comparator : null;
|
|
433
|
+
const contains = operator === RealmLogicOp.CONTAINS ? comparator : null;
|
|
434
|
+
const isStringOrBoolLike = ["true", "false"].includes(value) || isNaN(+value);
|
|
435
|
+
if (isStringOrBoolLike) {
|
|
436
|
+
return !!eq && value === eq || !!neq && value !== neq || !!contains && strIncludes(value, contains);
|
|
437
|
+
}
|
|
438
|
+
return !!eq && +value === +eq || !!neq && +value !== +neq || !!gt && +value > +gt || !!gte && +value >= +gte || !!lt && +value < +lt || !!lte && +value <= +lte;
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
// src/utils/cssom.ts
|
|
442
|
+
var getStyle = (rule) => rule?.style;
|
|
443
|
+
var selectorText = (rule, value) => {
|
|
444
|
+
if (!value)
|
|
445
|
+
return rule?.selectorText;
|
|
446
|
+
rule.selectorText = value;
|
|
447
|
+
};
|
|
448
|
+
var CSSText = (style, value) => {
|
|
449
|
+
if (!value)
|
|
450
|
+
return style.cssText;
|
|
451
|
+
style.cssText = value;
|
|
452
|
+
};
|
|
453
|
+
var setStyleProperty = (style, propName, propValue) => style.setProperty(propName, propValue);
|
|
454
|
+
var forEachCSSRules = (sheets, callback) => forEach(sheets, (sheet) => forEach(Object.values(sheet.cssRules), callback));
|
|
455
|
+
var $adoptedStyleSheets = (self) => $shadow(self)().adoptedStyleSheets;
|
|
456
|
+
var _attachStyle = (self) => () => {
|
|
457
|
+
const sheet = new CSSStyleSheet();
|
|
458
|
+
arrayPush($adoptedStyleSheets(self), sheet);
|
|
459
|
+
return sheet;
|
|
460
|
+
};
|
|
461
|
+
var _CSSvar = (name, rule, value, overwrite = true) => {
|
|
462
|
+
const varName = `${DASH_SEPARATOR}${DASH_SEPARATOR}${CSS.escape(dash(name))}`;
|
|
463
|
+
const style = getStyle(rule);
|
|
464
|
+
if (!style)
|
|
465
|
+
return varName;
|
|
466
|
+
const getProperty = () => style.getPropertyValue(varName);
|
|
467
|
+
if (value === void 0)
|
|
468
|
+
return getProperty();
|
|
469
|
+
const setProperty = () => setStyleProperty(style, varName, `${value}`);
|
|
470
|
+
if (!overwrite && !getProperty()) {
|
|
471
|
+
setProperty();
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
setProperty();
|
|
475
|
+
};
|
|
476
|
+
var $CSSvar = (name) => `${VAR_PREFIX}${LEFT_PARENTHESES}${DASH_SEPARATOR}${DASH_SEPARATOR}${name}${RIGHT_PARENTHESES}`;
|
|
477
|
+
var _renderStyle = (self) => (styleElement) => {
|
|
478
|
+
if (!styleElement)
|
|
479
|
+
return;
|
|
480
|
+
const cssRules = $html(styleElement);
|
|
481
|
+
const sheet = _attachStyle(self)();
|
|
482
|
+
arrayPush($adoptedStyleSheets(self), sheet);
|
|
483
|
+
sheet.replaceSync(cssRules);
|
|
484
|
+
forEachCSSRules([sheet], (rule) => {
|
|
485
|
+
const selector = selectorText(rule);
|
|
486
|
+
const matches = createArray(
|
|
487
|
+
selector?.matchAll(CSS_CUSTOM_SELECTOR_REGEX) ?? []
|
|
488
|
+
);
|
|
489
|
+
if (!matches.length)
|
|
490
|
+
return;
|
|
491
|
+
const currentRule = getStyle(rule);
|
|
492
|
+
const cssPropValue = arrayReduce2(
|
|
493
|
+
arraySplit(CSSText(currentRule), SEMICOLON),
|
|
494
|
+
(acc, style) => !style ? acc : [...acc, arrayMap(arraySplit(style, COLON), strTrim)],
|
|
495
|
+
[]
|
|
496
|
+
);
|
|
497
|
+
selectorText(
|
|
498
|
+
rule,
|
|
499
|
+
strReplace(selector, CSS_CUSTOM_SELECTOR_REGEX, HOST_SELECTOR)
|
|
500
|
+
);
|
|
501
|
+
_CSSvar(
|
|
502
|
+
RealmCSSVarConst.STYLE,
|
|
503
|
+
rule,
|
|
504
|
+
arrayJoin(
|
|
505
|
+
arrayMap(cssPropValue, (item) => arrayJoin(item, COLON)),
|
|
506
|
+
PIPELINE_SEPARATOR
|
|
507
|
+
)
|
|
508
|
+
);
|
|
509
|
+
for (const match of matches) {
|
|
510
|
+
const [, mutator, _hasCondition, operatorOrGlobal, ...operators] = match;
|
|
511
|
+
const mutatorType = strStartWith(mutator, STATE_PREFIX) ? RealmMutableAttr.STATE : RealmMutableAttr.ATTR;
|
|
512
|
+
const mutatorName = strSlice(mutator);
|
|
513
|
+
_CSSvar(mutatorType, rule, mutatorName);
|
|
514
|
+
const isGlobal = operatorOrGlobal === RealmCSSVarConst.GLOBAL;
|
|
515
|
+
const cssVarPrefix = mutatorName + DASH_SEPARATOR;
|
|
516
|
+
if (isGlobal)
|
|
517
|
+
_CSSvar(cssVarPrefix + RealmCSSVarConst.GLOBAL, rule, 1);
|
|
518
|
+
const [hasOperator, operator, value] = operators ?? [];
|
|
519
|
+
if (!hasOperator)
|
|
520
|
+
return;
|
|
521
|
+
_CSSvar(cssVarPrefix + RealmCSSVarConst.OPERATOR, rule, operator);
|
|
522
|
+
_CSSvar(cssVarPrefix + RealmCSSVarConst.COMPARATOR, rule, value);
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
_remove(styleElement)();
|
|
526
|
+
};
|
|
527
|
+
var _addCSS = (sheet, cssRules) => sheet.insertRule(
|
|
528
|
+
arrayReduce2(
|
|
529
|
+
cssRules,
|
|
530
|
+
(acc, [selector, rules]) => {
|
|
531
|
+
acc += selector + LEFT_BRACES + arrayJoin(
|
|
532
|
+
arrayReduce2(
|
|
533
|
+
rules,
|
|
534
|
+
(acc2, [property, value]) => [
|
|
535
|
+
...acc2,
|
|
536
|
+
arrayJoin([property, value], COLON)
|
|
537
|
+
],
|
|
538
|
+
[]
|
|
539
|
+
),
|
|
540
|
+
SEMICOLON
|
|
541
|
+
) + RIGHT_BRACES;
|
|
542
|
+
return acc;
|
|
543
|
+
},
|
|
544
|
+
EMPTY_STRING
|
|
545
|
+
)
|
|
546
|
+
);
|
|
547
|
+
var _setCSSProperty = (self) => (selector, name, value) => forEachCSSRules($adoptedStyleSheets(self), (rule) => {
|
|
548
|
+
if (selectorText(rule) !== selector)
|
|
549
|
+
return;
|
|
550
|
+
const styleMap = rule.styleMap;
|
|
551
|
+
if (styleMap.get(name) !== value)
|
|
552
|
+
styleMap.set(name, value);
|
|
553
|
+
});
|
|
554
|
+
var updateRuleProperty = (rule) => ([property, value]) => setStyleProperty(getStyle(rule), property, value);
|
|
555
|
+
var removeRuleProperty = (rule) => ([property]) => getStyle(rule).removeProperty(property);
|
|
556
|
+
var bindCSS = (element, name, value, dataType, isGlobalUpdate = false) => {
|
|
557
|
+
const sheet = $adoptedStyleSheets(element);
|
|
558
|
+
const strValue = `${value}`;
|
|
559
|
+
forEachCSSRules(sheet, (rule) => {
|
|
560
|
+
const defaultCSSVarPrefix = (isGlobalUpdate ? RealmCSSVarConst.GLOBAL : dataType) + DASH_SEPARATOR;
|
|
561
|
+
_CSSvar(defaultCSSVarPrefix + name, rule, strValue, false);
|
|
562
|
+
const state = _CSSvar(RealmMutableAttr.STATE, rule);
|
|
563
|
+
const attr = _CSSvar(RealmMutableAttr.ATTR, rule);
|
|
564
|
+
if (!state && !attr)
|
|
565
|
+
return;
|
|
566
|
+
if (state && state !== name || attr && attr !== name)
|
|
567
|
+
return;
|
|
568
|
+
const cssVarPrefix = name + DASH_SEPARATOR;
|
|
569
|
+
_CSSvar(cssVarPrefix + RealmCSSVarConst.VALUE, rule, strValue);
|
|
570
|
+
const operator = _CSSvar(cssVarPrefix + RealmCSSVarConst.OPERATOR, rule);
|
|
571
|
+
const styles = _CSSvar(RealmCSSVarConst.STYLE, rule);
|
|
572
|
+
const cssText = arrayMap(
|
|
573
|
+
arraySplit(styles, PIPELINE_SEPARATOR),
|
|
574
|
+
(style) => arraySplit(style, COLON)
|
|
575
|
+
);
|
|
576
|
+
const hasOperator = !!operator;
|
|
577
|
+
const comparator = _CSSvar(
|
|
578
|
+
cssVarPrefix + RealmCSSVarConst.COMPARATOR,
|
|
579
|
+
rule
|
|
580
|
+
);
|
|
581
|
+
const isTrue = isTruthy(operator, comparator, strValue);
|
|
582
|
+
const isUpdateStyle = hasOperator ? isTrue : true;
|
|
583
|
+
if (!isUpdateStyle) {
|
|
584
|
+
if (!someArray(cssText, ([property]) => !!getStyle(rule)[property]))
|
|
585
|
+
return;
|
|
586
|
+
return forEach(cssText, removeRuleProperty(rule));
|
|
587
|
+
}
|
|
588
|
+
forEach(cssText, updateRuleProperty(rule));
|
|
589
|
+
});
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
// src/libs/RealmBase.class.ts
|
|
593
|
+
var RealmBase = class extends HTMLElement {
|
|
594
|
+
// Element's name / tag's name
|
|
595
|
+
name;
|
|
596
|
+
// Element's random id
|
|
597
|
+
id;
|
|
598
|
+
// innerHTML cacche
|
|
599
|
+
#html;
|
|
600
|
+
// Shadow root assigned to element
|
|
601
|
+
shadow;
|
|
602
|
+
// Element's state
|
|
603
|
+
states;
|
|
604
|
+
// Default element's states and attributes
|
|
605
|
+
statesRegistry;
|
|
606
|
+
attrsRegistry;
|
|
607
|
+
// Clear HTML content
|
|
608
|
+
_clear = _clear(this);
|
|
609
|
+
// Set innerHTML
|
|
610
|
+
_html = (html, element) => {
|
|
611
|
+
const setCurrentHtml = () => this.#html = `${html}`;
|
|
612
|
+
element ? _html(element, `${html}`) : setCurrentHtml();
|
|
613
|
+
};
|
|
614
|
+
//#region manipulate DOM utility functions
|
|
615
|
+
_renderTemplate = _renderTemplate(this);
|
|
616
|
+
_renderShadow = (flowElement) => flowElement && _append(this)($clone(this)(flowElement), this.$shadow());
|
|
617
|
+
_content = _content(this);
|
|
618
|
+
_attach = _attach(this);
|
|
619
|
+
_append = _append(this);
|
|
620
|
+
_remove = _remove(this);
|
|
621
|
+
_replace = _replace(this);
|
|
622
|
+
_createElement = _createElement;
|
|
623
|
+
_createFragment = _createFragment;
|
|
624
|
+
_attrs = _attrs(this);
|
|
625
|
+
_attr = _attr(this);
|
|
626
|
+
_removeAttr = _removeAttr(this);
|
|
627
|
+
_data = _data(this);
|
|
628
|
+
_datas = _datas(this);
|
|
629
|
+
_slotTo = _slotTo;
|
|
630
|
+
_addEvent = _addEvent(this);
|
|
631
|
+
_removeEvent = _removeEvent(this);
|
|
632
|
+
_addCustomEvent = _addCustomEvent(this);
|
|
633
|
+
_sendEvent = _sendEvent(this);
|
|
634
|
+
_debug = _debug(this);
|
|
635
|
+
//#endregion
|
|
636
|
+
//#region get DOM infos utility functions
|
|
637
|
+
$html = (element) => $html(element ?? this);
|
|
638
|
+
$randId = $randId;
|
|
639
|
+
$name = $name(this);
|
|
640
|
+
$id = $id(this);
|
|
641
|
+
$tagName = $tagName(this);
|
|
642
|
+
$parent = $parent(this);
|
|
643
|
+
$parentNode = $parentNode(this);
|
|
644
|
+
$shadow = $shadow(this);
|
|
645
|
+
$root = $root(this);
|
|
646
|
+
$host = (element) => $host(element ?? this)();
|
|
647
|
+
$clone = $clone(this);
|
|
648
|
+
$qsString = $qsString;
|
|
649
|
+
$qs = $qs(this);
|
|
650
|
+
$qsAll = $qsAll(this);
|
|
651
|
+
$children = $children(this);
|
|
652
|
+
$nodes = $nodes(this);
|
|
653
|
+
$attrs = $attrs(this);
|
|
654
|
+
$attrsKv = $attrsKv(this);
|
|
655
|
+
$attr = $attr(this);
|
|
656
|
+
$hasAttr = $hasAttr(this);
|
|
657
|
+
$data = $data(this);
|
|
658
|
+
$el = $el(this);
|
|
659
|
+
$els = $els(this);
|
|
660
|
+
$shadowEl = $shadowEl(this);
|
|
661
|
+
$shadowEls = $shadowEls(this);
|
|
662
|
+
$slotAttrName = $slotAttrName;
|
|
663
|
+
$slotStateName = $slotStateName;
|
|
664
|
+
//#endregion
|
|
665
|
+
//#region CSSOM utility functions
|
|
666
|
+
_attachStyle = _attachStyle(this);
|
|
667
|
+
_renderStyle = _renderStyle(this);
|
|
668
|
+
_addCSS = _addCSS;
|
|
669
|
+
_setCSSProperty = _setCSSProperty(this);
|
|
670
|
+
_CSSvar = _CSSvar;
|
|
671
|
+
$CSSvar = $CSSvar;
|
|
672
|
+
//#endregion
|
|
673
|
+
};
|
|
674
|
+
|
|
675
|
+
// src/utils/timer.ts
|
|
676
|
+
var timerOnce = (handler, timeout) => {
|
|
677
|
+
let timer = setTimeout(handler, timeout);
|
|
678
|
+
return [timer, () => clearTimeout(timer)];
|
|
679
|
+
};
|
|
680
|
+
var timerEvery = (handler, timeout) => {
|
|
681
|
+
let interval = setInterval(handler, timeout);
|
|
682
|
+
return [interval, () => clearInterval(interval)];
|
|
683
|
+
};
|
|
684
|
+
var reqAnim = (handler) => {
|
|
685
|
+
let req = requestAnimationFrame(handler);
|
|
686
|
+
return [req, () => cancelAnimationFrame(req)];
|
|
687
|
+
};
|
|
688
|
+
|
|
689
|
+
// src/libs/RealmElement.class.ts
|
|
690
|
+
var RealmElement = class extends RealmBase {
|
|
691
|
+
onInit;
|
|
692
|
+
onMounted;
|
|
693
|
+
onUnmounted;
|
|
694
|
+
onAttributeChanged;
|
|
695
|
+
states = new RealmState();
|
|
696
|
+
statesRegistry = createSet();
|
|
697
|
+
attrsRegistry = createSet();
|
|
698
|
+
#attrObserver = [];
|
|
699
|
+
constructor({
|
|
700
|
+
name,
|
|
701
|
+
onInit,
|
|
702
|
+
onBeforeInit,
|
|
703
|
+
onMounted,
|
|
704
|
+
onUnmounted,
|
|
705
|
+
onAttributeChanged
|
|
706
|
+
}) {
|
|
707
|
+
super();
|
|
708
|
+
this.name = name;
|
|
709
|
+
this.id = this.$randId();
|
|
710
|
+
this.onMounted = onMounted;
|
|
711
|
+
this.onUnmounted = onUnmounted;
|
|
712
|
+
this.onAttributeChanged = onAttributeChanged;
|
|
713
|
+
onBeforeInit?.(this);
|
|
714
|
+
this._html(this.$html());
|
|
715
|
+
onInit?.(this);
|
|
716
|
+
}
|
|
717
|
+
subscribe(callback) {
|
|
718
|
+
arrayPush(this.#attrObserver, callback);
|
|
719
|
+
}
|
|
720
|
+
connectedCallback() {
|
|
721
|
+
const [observeAttr] = subscribeAttrMutation(
|
|
722
|
+
this,
|
|
723
|
+
(attrName, attrValue, prevAttrValue) => {
|
|
724
|
+
forEach(
|
|
725
|
+
this.#attrObserver,
|
|
726
|
+
(callback) => callback?.(attrName, attrValue, prevAttrValue)
|
|
727
|
+
);
|
|
728
|
+
this.onAttributeChanged?.(this, attrName, attrValue, prevAttrValue);
|
|
729
|
+
}
|
|
730
|
+
);
|
|
731
|
+
observeAttr();
|
|
732
|
+
reqAnim(() => this.onMounted?.(this));
|
|
733
|
+
}
|
|
734
|
+
disconnectedCallback() {
|
|
735
|
+
this.onUnmounted?.(this);
|
|
736
|
+
}
|
|
737
|
+
};
|
|
738
|
+
|
|
739
|
+
// src/utils/element.ts
|
|
740
|
+
var ElementDataTypes = /* @__PURE__ */ ((ElementDataTypes3) => {
|
|
741
|
+
ElementDataTypes3["STRING"] = "string";
|
|
742
|
+
ElementDataTypes3["NUMBER"] = "number";
|
|
743
|
+
ElementDataTypes3["BOOLEAN"] = "boolean";
|
|
744
|
+
ElementDataTypes3["ARRAY"] = "array";
|
|
745
|
+
ElementDataTypes3["OBJECT"] = "object";
|
|
746
|
+
ElementDataTypes3["HTML"] = "html";
|
|
747
|
+
ElementDataTypes3["JSON_STRING"] = "json";
|
|
748
|
+
return ElementDataTypes3;
|
|
749
|
+
})(ElementDataTypes || {});
|
|
750
|
+
var defineElement = ({
|
|
751
|
+
name,
|
|
752
|
+
extends: extendsTagName,
|
|
753
|
+
onBeforeRegister,
|
|
754
|
+
onRegistered,
|
|
755
|
+
onConnected,
|
|
756
|
+
...params
|
|
757
|
+
}) => () => new Promise((resolve) => {
|
|
758
|
+
const isNameValid = strIncludes(name, DASH_SEPARATOR);
|
|
759
|
+
const isDefined = customElements.get(name);
|
|
760
|
+
if (!isNameValid || isDefined)
|
|
761
|
+
throw newError(
|
|
762
|
+
`Element \`${name}\` has invalid name or already defined`
|
|
763
|
+
);
|
|
764
|
+
customElements.whenDefined(name).then(async () => {
|
|
765
|
+
onRegistered?.(name);
|
|
766
|
+
resolve(true);
|
|
767
|
+
});
|
|
768
|
+
onBeforeRegister?.(name);
|
|
769
|
+
class CustomElement extends RealmElement {
|
|
770
|
+
constructor() {
|
|
771
|
+
super({ name, ...params });
|
|
772
|
+
}
|
|
773
|
+
connectedCallback() {
|
|
774
|
+
super.connectedCallback();
|
|
775
|
+
onConnected?.(this);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
customElements.define(name, CustomElement, { extends: extendsTagName });
|
|
779
|
+
});
|
|
780
|
+
var parseValue = (type, value) => {
|
|
781
|
+
const transformValue = (defaultValue) => typeof value !== "string" ? value : JSONSafeParse(value || defaultValue);
|
|
782
|
+
const valueLookup = {
|
|
783
|
+
["number" /* NUMBER */]: () => +value,
|
|
784
|
+
["boolean" /* BOOLEAN */]: () => transformValue(value),
|
|
785
|
+
["array" /* ARRAY */]: () => transformValue("[]"),
|
|
786
|
+
["object" /* OBJECT */]: () => transformValue("{}")
|
|
787
|
+
};
|
|
788
|
+
return valueLookup?.[type]?.() ?? value;
|
|
789
|
+
};
|
|
790
|
+
var getElementEntries = (element, tagName = RealmTagNames.ELEMENT_ATTR) => createArray(element.$els(tagName));
|
|
791
|
+
var getCustomElementAttrs = (element, tagName) => createSet(
|
|
792
|
+
arrayReduce2(
|
|
793
|
+
getElementEntries(element, tagName),
|
|
794
|
+
(acc, item) => {
|
|
795
|
+
const name = element.$attr(RealmAttributeNames.NAME, item);
|
|
796
|
+
const type = element.$attr(
|
|
797
|
+
RealmAttributeNames.TYPE,
|
|
798
|
+
item
|
|
799
|
+
);
|
|
800
|
+
const value = parseValue(type, element.$html(item));
|
|
801
|
+
const attrs = [name, type, value];
|
|
802
|
+
return [...acc, attrs];
|
|
803
|
+
},
|
|
804
|
+
[]
|
|
805
|
+
)
|
|
806
|
+
);
|
|
807
|
+
var removeCustomElementAttrs = (element, tagName) => forEach(getElementEntries(element, tagName), (el) => element._remove(el));
|
|
808
|
+
var getValueType = (slotName, registry) => findArray(
|
|
809
|
+
createArray(registry),
|
|
810
|
+
([name]) => name === slotName
|
|
811
|
+
)?.at(1);
|
|
812
|
+
var bindSlot = (element, dataType, slotName, slotValue, hasGlobalAttr) => {
|
|
813
|
+
const getSlotName = () => slotName;
|
|
814
|
+
const getSlotValue = () => slotValue;
|
|
815
|
+
const getSlotValueFromObject = () => getValueFrom(slotValue, slotName);
|
|
816
|
+
const attrNameLookup = {
|
|
817
|
+
[RealmMutableAttr.STATE]: () => element.$slotStateName(slotName),
|
|
818
|
+
[RealmMutableAttr.ATTR]: () => element.$slotAttrName(slotName),
|
|
819
|
+
[RealmMutableAttr.SRC]: getSlotName,
|
|
820
|
+
[RealmMutableAttr.META]: getSlotName
|
|
821
|
+
};
|
|
822
|
+
const slotAttrName = attrNameLookup[dataType]?.();
|
|
823
|
+
const attrValueLookup = {
|
|
824
|
+
[RealmMutableAttr.STATE]: getSlotValue,
|
|
825
|
+
[RealmMutableAttr.ATTR]: getSlotValue,
|
|
826
|
+
[RealmMutableAttr.SRC]: getSlotValueFromObject,
|
|
827
|
+
[RealmMutableAttr.META]: getSlotValueFromObject
|
|
828
|
+
};
|
|
829
|
+
const slotAttrValue = attrValueLookup[dataType]?.();
|
|
830
|
+
const attrTypeLookup = {
|
|
831
|
+
[RealmMutableAttr.STATE]: getValueType(slotName, element.statesRegistry),
|
|
832
|
+
[RealmMutableAttr.ATTR]: getValueType(slotName, element.attrsRegistry)
|
|
833
|
+
};
|
|
834
|
+
const slotAttrType = attrTypeLookup[dataType];
|
|
835
|
+
forEachNode(
|
|
836
|
+
element.$shadowEls(RealmAttributeNames.SLOT, [
|
|
837
|
+
[RealmAttributeNames.NAME, slotAttrName],
|
|
838
|
+
hasGlobalAttr && [RealmAttributeNames.GLOBAL]
|
|
839
|
+
]),
|
|
840
|
+
(shadowSlot) => {
|
|
841
|
+
if (!shadowSlot)
|
|
842
|
+
return;
|
|
843
|
+
if (!hasGlobalAttr && element.$hasAttr(RealmAttributeNames.GLOBAL, shadowSlot))
|
|
844
|
+
return;
|
|
845
|
+
const slot = element._createElement(RealmTagNames.SLOT);
|
|
846
|
+
const slotId = element.$slotStateName(element.$randId());
|
|
847
|
+
const slotAttrMap = createMap();
|
|
848
|
+
setMap(slotAttrMap, shadowSlot, RealmAttributeNames.NAME);
|
|
849
|
+
setMap(slotAttrMap, slot, RealmAttributeNames.SLOT);
|
|
850
|
+
forEach([shadowSlot, slot], (slotElement) => {
|
|
851
|
+
element._data(dataType, slotAttrName, slotElement);
|
|
852
|
+
element._attrs(
|
|
853
|
+
[
|
|
854
|
+
[getMap(slotAttrMap, slotElement), slotId],
|
|
855
|
+
hasGlobalAttr && [RealmAttributeNames.GLOBAL]
|
|
856
|
+
],
|
|
857
|
+
slotElement
|
|
858
|
+
);
|
|
859
|
+
});
|
|
860
|
+
if (slotAttrType === "html" /* HTML */) {
|
|
861
|
+
element._html(slotAttrValue, slot);
|
|
862
|
+
} else {
|
|
863
|
+
element._content(slotAttrValue, slot);
|
|
864
|
+
}
|
|
865
|
+
element._append(slot);
|
|
866
|
+
element._slotTo(shadowSlot, [slot]);
|
|
867
|
+
element._debug(shadowSlot, slotAttrValue);
|
|
868
|
+
}
|
|
869
|
+
);
|
|
870
|
+
};
|
|
871
|
+
var updateSlot = (element, dataType, slotName, slotValue, isGlobalUpdate) => {
|
|
872
|
+
const attrNameLookup = {
|
|
873
|
+
[RealmMutableAttr.STATE]: element.$slotStateName(slotName),
|
|
874
|
+
[RealmMutableAttr.ATTR]: element.$slotAttrName(slotName),
|
|
875
|
+
[RealmMutableAttr.SRC]: slotName
|
|
876
|
+
};
|
|
877
|
+
const slotAttrName = attrNameLookup[dataType];
|
|
878
|
+
const attrTypeLookup = {
|
|
879
|
+
[RealmMutableAttr.STATE]: getValueType(slotName, element.statesRegistry),
|
|
880
|
+
[RealmMutableAttr.ATTR]: getValueType(slotName, element.attrsRegistry)
|
|
881
|
+
};
|
|
882
|
+
const slotAttrType = attrTypeLookup[dataType];
|
|
883
|
+
const selector = !isGlobalUpdate ? `[${DATA_PREFIX}${dataType}="${slotAttrName}"]:not([${RealmAttributeNames.GLOBAL}])` : RealmTagNames.SLOT;
|
|
884
|
+
const attrs = !isGlobalUpdate ? [] : [
|
|
885
|
+
[RealmAttributeNames.GLOBAL],
|
|
886
|
+
[`${DATA_PREFIX}${dataType}`, slotAttrName]
|
|
887
|
+
];
|
|
888
|
+
const nodes = element.$qsAll(
|
|
889
|
+
selector,
|
|
890
|
+
attrs,
|
|
891
|
+
isGlobalUpdate ? doc : void 0
|
|
892
|
+
);
|
|
893
|
+
forEachNode(nodes, (slot) => {
|
|
894
|
+
if (!slot)
|
|
895
|
+
return;
|
|
896
|
+
if (slotAttrType === "html" /* HTML */) {
|
|
897
|
+
element._html(slotValue, slot);
|
|
898
|
+
} else {
|
|
899
|
+
element._content(slotValue, slot);
|
|
900
|
+
}
|
|
901
|
+
element._debug(
|
|
902
|
+
element.$shadowEl(selector, [
|
|
903
|
+
...attrs,
|
|
904
|
+
[
|
|
905
|
+
RealmAttributeNames.NAME,
|
|
906
|
+
element.$attr(RealmAttributeNames.SLOT, slot)
|
|
907
|
+
],
|
|
908
|
+
[RealmAttributeNames.DEBUG]
|
|
909
|
+
]),
|
|
910
|
+
slotValue
|
|
911
|
+
);
|
|
912
|
+
});
|
|
913
|
+
};
|
|
914
|
+
var bindAttr = (element, dataType, dataBinding, node, name, value, isGlobalUpdate) => {
|
|
915
|
+
const getValue = () => value;
|
|
916
|
+
const getSlotValueFromObject = () => getValueFrom(value, name);
|
|
917
|
+
const attrValueLookup = {
|
|
918
|
+
[RealmMutableAttr.STATE]: getValue,
|
|
919
|
+
[RealmMutableAttr.ATTR]: getValue,
|
|
920
|
+
[RealmMutableAttr.SRC]: getSlotValueFromObject,
|
|
921
|
+
[RealmMutableAttr.META]: getSlotValueFromObject
|
|
922
|
+
};
|
|
923
|
+
const attrValue = attrValueLookup[dataType]();
|
|
924
|
+
const nodeHasGlobalAttr = element.$hasAttr(RealmAttributeNames.GLOBAL, node);
|
|
925
|
+
forEach(dataBinding, ([attrName, attrSrc, isGlobalFlag]) => {
|
|
926
|
+
const shouldUpdateGlobalState = isGlobalUpdate ? isGlobalFlag : !(isGlobalFlag && !nodeHasGlobalAttr);
|
|
927
|
+
const shouldUpdate = shouldUpdateGlobalState && name === attrSrc;
|
|
928
|
+
if (shouldUpdate)
|
|
929
|
+
element._attr(attrName, attrValue, node);
|
|
930
|
+
});
|
|
931
|
+
};
|
|
932
|
+
var attrMutableLookup = (statesBinding = createSet(), attrsBinding = createSet(), srcDataBinding = createSet(), metasBinding = createSet()) => ({
|
|
933
|
+
[RealmMutableAttr.STATE]: statesBinding,
|
|
934
|
+
[RealmMutableAttr.ATTR]: attrsBinding,
|
|
935
|
+
[RealmMutableAttr.SRC]: srcDataBinding,
|
|
936
|
+
[RealmMutableAttr.META]: metasBinding
|
|
937
|
+
});
|
|
938
|
+
var bindElement = (element, dataType, dataBinding, name, value, isGlobalUpdate, isUpdate) => {
|
|
939
|
+
bindCSS(element, name, value, dataType, isGlobalUpdate);
|
|
940
|
+
forEach(
|
|
941
|
+
dataBinding,
|
|
942
|
+
([node, ...bindings]) => bindAttr(
|
|
943
|
+
element,
|
|
944
|
+
dataType,
|
|
945
|
+
attrMutableLookup?.(...bindings)[dataType],
|
|
946
|
+
node,
|
|
947
|
+
name,
|
|
948
|
+
value,
|
|
949
|
+
isGlobalUpdate
|
|
950
|
+
)
|
|
951
|
+
);
|
|
952
|
+
if (isUpdate)
|
|
953
|
+
return updateSlot(element, dataType, name, value, isGlobalUpdate);
|
|
954
|
+
if (!isGlobalUpdate && dataType === RealmMutableAttr.STATE)
|
|
955
|
+
element.states.set(name, value);
|
|
956
|
+
return bindSlot(element, dataType, name, value, isGlobalUpdate);
|
|
957
|
+
};
|
|
958
|
+
var addAttrBinding = (element, attrName) => {
|
|
959
|
+
const globalAttrName = `${attrName}${COLON}${RealmAttributeNames.GLOBAL}`;
|
|
960
|
+
const isGlobal = element.$hasAttr(globalAttrName);
|
|
961
|
+
const attrSelector = isGlobal ? globalAttrName : attrName;
|
|
962
|
+
element._attr(BIND_ATTR_PREFIX + attrSelector, element.$attr(attrSelector));
|
|
963
|
+
};
|
|
964
|
+
var mutationObserver = (target, options) => {
|
|
965
|
+
const observer = new MutationObserver(options?.callback);
|
|
966
|
+
return [() => observer.observe(target, options), () => observer.disconnect()];
|
|
967
|
+
};
|
|
968
|
+
var addToBindList = (shouldAdded, bindAttrValues, attrName, attrValue, isGlobal) => shouldAdded && addSet(bindAttrValues, [attrName, attrValue, isGlobal]);
|
|
969
|
+
var getElementAttrBindings = (element) => arrayReduce2(
|
|
970
|
+
createArray(element.$shadowEls(RealmTagNames.ALL)),
|
|
971
|
+
(acc, node) => {
|
|
972
|
+
const stateBindList = createSet();
|
|
973
|
+
const attrBindList = createSet();
|
|
974
|
+
const srcBindList = createSet();
|
|
975
|
+
const metaBindList = createSet();
|
|
976
|
+
const [statesBinding, attrsBinding, srcDataBinding, metasBinding] = arrayReduce2(
|
|
977
|
+
element.$attrs(node),
|
|
978
|
+
(acc2, attr) => {
|
|
979
|
+
const [attrName, global] = strSplit(
|
|
980
|
+
$attrName(attr),
|
|
981
|
+
COLON
|
|
982
|
+
);
|
|
983
|
+
const isGlobal = global === RealmAttributeNames.GLOBAL;
|
|
984
|
+
const hasBindAttr = strStartWith(attrName, BIND_ATTR_PREFIX);
|
|
985
|
+
const hasAttr = element.$hasAttr(attrName, node);
|
|
986
|
+
if (hasAttr && !hasBindAttr)
|
|
987
|
+
return acc2;
|
|
988
|
+
const attrValue = $attrValue(attr);
|
|
989
|
+
const slicedAttrName = strSlice(attrName);
|
|
990
|
+
const slicedAttrValue = strSlice(attrValue);
|
|
991
|
+
const isState = strStartWith(attrValue, STATE_PREFIX);
|
|
992
|
+
addToBindList(
|
|
993
|
+
isState,
|
|
994
|
+
stateBindList,
|
|
995
|
+
slicedAttrName,
|
|
996
|
+
slicedAttrValue,
|
|
997
|
+
isGlobal
|
|
998
|
+
);
|
|
999
|
+
const isAttr = strStartWith(attrValue, ATTR_PREFIX);
|
|
1000
|
+
addToBindList(
|
|
1001
|
+
isAttr,
|
|
1002
|
+
attrBindList,
|
|
1003
|
+
slicedAttrName,
|
|
1004
|
+
slicedAttrValue,
|
|
1005
|
+
false
|
|
1006
|
+
);
|
|
1007
|
+
const isSource = strStartWith(attrValue, SOURCE_PREFIX);
|
|
1008
|
+
addToBindList(
|
|
1009
|
+
isSource,
|
|
1010
|
+
srcBindList,
|
|
1011
|
+
slicedAttrName,
|
|
1012
|
+
attrValue,
|
|
1013
|
+
false
|
|
1014
|
+
);
|
|
1015
|
+
const isMeta = strStartWith(attrValue, META_PREFIX);
|
|
1016
|
+
addToBindList(
|
|
1017
|
+
isMeta,
|
|
1018
|
+
metaBindList,
|
|
1019
|
+
slicedAttrName,
|
|
1020
|
+
attrValue,
|
|
1021
|
+
false
|
|
1022
|
+
);
|
|
1023
|
+
if (isSource || isMeta)
|
|
1024
|
+
element._removeAttr(attr.name, node);
|
|
1025
|
+
return [stateBindList, attrBindList, srcBindList, metaBindList];
|
|
1026
|
+
},
|
|
1027
|
+
[]
|
|
1028
|
+
);
|
|
1029
|
+
return [
|
|
1030
|
+
...acc,
|
|
1031
|
+
[node, statesBinding, attrsBinding, srcDataBinding, metasBinding]
|
|
1032
|
+
];
|
|
1033
|
+
},
|
|
1034
|
+
[]
|
|
1035
|
+
);
|
|
1036
|
+
var subscribeAttrMutation = (element, observer) => mutationObserver(element, {
|
|
1037
|
+
attributes: true,
|
|
1038
|
+
attributeOldValue: true,
|
|
1039
|
+
callback: (mutationList) => {
|
|
1040
|
+
for (const mutation of mutationList) {
|
|
1041
|
+
if (mutation.type !== "attributes")
|
|
1042
|
+
return;
|
|
1043
|
+
const attrName = mutation.attributeName;
|
|
1044
|
+
const attrValue = element.$attr(attrName, mutation.target);
|
|
1045
|
+
const prevAttrValue = mutation.oldValue;
|
|
1046
|
+
if (prevAttrValue !== attrValue) {
|
|
1047
|
+
observer?.(attrName, attrValue, prevAttrValue);
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1052
|
+
var findAttrFrom = (actionArgs, comparator, isMultipleResult) => isMultipleResult ? arrayMap(
|
|
1053
|
+
filterArray(actionArgs, ([argName]) => argName === comparator),
|
|
1054
|
+
([, argValue]) => argValue
|
|
1055
|
+
) : findArray(actionArgs, ([argName]) => argName === comparator)?.at(1);
|
|
1056
|
+
var getDefaultAttrValues = (element) => fromEntries(
|
|
1057
|
+
arrayMap(createArray(element.attrsRegistry), ([attrName, , attrValue]) => [
|
|
1058
|
+
attrName,
|
|
1059
|
+
attrValue
|
|
1060
|
+
])
|
|
1061
|
+
);
|
|
1062
|
+
|
|
1063
|
+
// src/elements/import-element.ts
|
|
1064
|
+
var IMPORT_ELEMENT_REQUEST_CACHE = createMap();
|
|
1065
|
+
var importElement = defineElement({
|
|
1066
|
+
name: RealmTagNames.IMPORT_ELEMENT,
|
|
1067
|
+
async onBeforeInit(element) {
|
|
1068
|
+
const { from, automount, as: tagAlias, ...attrs } = element.$attrsKv();
|
|
1069
|
+
const [, cachedHtml] = getMap(IMPORT_ELEMENT_REQUEST_CACHE, from) ?? [];
|
|
1070
|
+
if (!cachedHtml) {
|
|
1071
|
+
try {
|
|
1072
|
+
const response = await fetch(from);
|
|
1073
|
+
const html = await response.text();
|
|
1074
|
+
setMap(IMPORT_ELEMENT_REQUEST_CACHE, from, html);
|
|
1075
|
+
} catch {
|
|
1076
|
+
newError(`Failed to fetch "${from}"`);
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
const customElement2 = element.$qs(
|
|
1080
|
+
RealmTagNames.CUSTOM_ELEMENT,
|
|
1081
|
+
[],
|
|
1082
|
+
DOMFrom(getMap(IMPORT_ELEMENT_REQUEST_CACHE, from))
|
|
1083
|
+
);
|
|
1084
|
+
if (!customElement2)
|
|
1085
|
+
return element._remove();
|
|
1086
|
+
const nameAttr = element.$attr(
|
|
1087
|
+
RealmAttributeNames.NAME,
|
|
1088
|
+
customElement2
|
|
1089
|
+
);
|
|
1090
|
+
let customElementName = tagAlias ?? nameAttr;
|
|
1091
|
+
const hasDefined = !!customElements.get(customElementName);
|
|
1092
|
+
if (hasDefined) {
|
|
1093
|
+
customElementName = customElementName + DOT_NOTATION + element.$randId();
|
|
1094
|
+
}
|
|
1095
|
+
element._attr(RealmAttributeNames.NAME, customElementName, customElement2);
|
|
1096
|
+
if (automount !== void 0) {
|
|
1097
|
+
const mountElement = element._createElement(customElementName);
|
|
1098
|
+
element._attrs(entriesOf(attrs), mountElement);
|
|
1099
|
+
element._append(customElement2, doc.body);
|
|
1100
|
+
element._replace(mountElement, element);
|
|
1101
|
+
} else {
|
|
1102
|
+
element._append(customElement2, doc.body);
|
|
1103
|
+
element._remove();
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
});
|
|
1107
|
+
|
|
1108
|
+
// src/elements/import-resource.ts
|
|
1109
|
+
var SCRIPT_RESOURCE_REGISTRY = createMap();
|
|
1110
|
+
var STYLES_RESOURCE_REGISTRY = createMap();
|
|
1111
|
+
var appendResource = (element, tagName, attrs, appendTo) => {
|
|
1112
|
+
const createdElement = element._createElement(tagName);
|
|
1113
|
+
element._attrs(attrs, createdElement);
|
|
1114
|
+
element._append(createdElement, appendTo);
|
|
1115
|
+
};
|
|
1116
|
+
var importScriptElement = defineElement({
|
|
1117
|
+
name: RealmTagNames.IMPORT_SCRIPT,
|
|
1118
|
+
onMounted(element) {
|
|
1119
|
+
const parentNode = element.$parentNode();
|
|
1120
|
+
const isValidParentNode = parentNode instanceof ShadowRoot;
|
|
1121
|
+
if (!isValidParentNode)
|
|
1122
|
+
return;
|
|
1123
|
+
const { from, local, ...attrs } = element.$attrsKv();
|
|
1124
|
+
const hasAdded = getMap(SCRIPT_RESOURCE_REGISTRY, from);
|
|
1125
|
+
const hasLocal = local !== void 0;
|
|
1126
|
+
if (!hasAdded && !hasLocal) {
|
|
1127
|
+
appendResource(
|
|
1128
|
+
element,
|
|
1129
|
+
RealmTagNames.SCRIPT,
|
|
1130
|
+
[[RealmAttributeNames.SRC, from], ...entriesOf(attrs)],
|
|
1131
|
+
head
|
|
1132
|
+
);
|
|
1133
|
+
setMap(SCRIPT_RESOURCE_REGISTRY, from, true);
|
|
1134
|
+
}
|
|
1135
|
+
element._remove();
|
|
1136
|
+
}
|
|
1137
|
+
});
|
|
1138
|
+
var importStyleElement = defineElement({
|
|
1139
|
+
name: RealmTagNames.IMPORT_STYLE,
|
|
1140
|
+
onMounted(element) {
|
|
1141
|
+
const parentNode = element.$parentNode();
|
|
1142
|
+
const isValidParentNode = parentNode instanceof ShadowRoot;
|
|
1143
|
+
if (!isValidParentNode)
|
|
1144
|
+
return;
|
|
1145
|
+
const { from, local, ...attrs } = element.$attrsKv();
|
|
1146
|
+
const hasAdded = getMap(STYLES_RESOURCE_REGISTRY, from);
|
|
1147
|
+
const hasLocalAttr = local !== void 0;
|
|
1148
|
+
const resourceArgs = [
|
|
1149
|
+
element,
|
|
1150
|
+
RealmTagNames.LINK,
|
|
1151
|
+
[
|
|
1152
|
+
[RealmAttributeNames.HREF, from],
|
|
1153
|
+
[RealmAttributeNames.REL, "stylesheet"],
|
|
1154
|
+
...entriesOf(attrs)
|
|
1155
|
+
]
|
|
1156
|
+
];
|
|
1157
|
+
if (!hasAdded) {
|
|
1158
|
+
appendResource.apply(null, [...resourceArgs, head]);
|
|
1159
|
+
setMap(STYLES_RESOURCE_REGISTRY, from, true);
|
|
1160
|
+
}
|
|
1161
|
+
if (hasLocalAttr) {
|
|
1162
|
+
appendResource.apply(null, [
|
|
1163
|
+
...resourceArgs,
|
|
1164
|
+
element.$host().$shadow()
|
|
1165
|
+
]);
|
|
1166
|
+
}
|
|
1167
|
+
element._remove();
|
|
1168
|
+
}
|
|
1169
|
+
});
|
|
1170
|
+
|
|
1171
|
+
// src/elements/visibility-element.ts
|
|
1172
|
+
var getOperatorComparator = (element) => arrayReduce2(
|
|
1173
|
+
[
|
|
1174
|
+
RealmLogicOp.EQUALS_TO,
|
|
1175
|
+
RealmLogicOp.NOT_EQUALS_TO,
|
|
1176
|
+
RealmLogicOp.GREATER_THAN,
|
|
1177
|
+
RealmLogicOp.GREATER_THAN_OR_EQUALS_TO,
|
|
1178
|
+
RealmLogicOp.LESS_THAN,
|
|
1179
|
+
RealmLogicOp.LESS_THAN_OR_EQUALS_TO,
|
|
1180
|
+
RealmLogicOp.CONTAINS
|
|
1181
|
+
],
|
|
1182
|
+
(acc, operator) => {
|
|
1183
|
+
if (!element.$hasAttr(operator))
|
|
1184
|
+
return acc;
|
|
1185
|
+
return [operator, element.$attr(operator)];
|
|
1186
|
+
},
|
|
1187
|
+
[]
|
|
1188
|
+
);
|
|
1189
|
+
var isVisibleTruthy = (element, value) => {
|
|
1190
|
+
const [operator, comparator] = getOperatorComparator(element);
|
|
1191
|
+
return isTruthy(operator, comparator, `${value}`);
|
|
1192
|
+
};
|
|
1193
|
+
var updateIsVisibleCSSProperty = (element, attrValue, cssVarName, isVisiblePropName, isHiddenPropName) => {
|
|
1194
|
+
const hasAttrValue = element.$hasAttr(RealmAttributeNames.VALUE);
|
|
1195
|
+
const isVisible = isVisibleTruthy(
|
|
1196
|
+
element,
|
|
1197
|
+
attrValue || hasAttrValue && attrValue === ""
|
|
1198
|
+
);
|
|
1199
|
+
element._setCSSProperty(
|
|
1200
|
+
HOST_SELECTOR,
|
|
1201
|
+
element._CSSvar(cssVarName),
|
|
1202
|
+
isVisible ? isVisiblePropName : isHiddenPropName
|
|
1203
|
+
);
|
|
1204
|
+
};
|
|
1205
|
+
var createVisibilityElement = (elementName, [visible, hidden]) => {
|
|
1206
|
+
const displayVarName = VAR_PREFIX + DASH_SEPARATOR + $randId();
|
|
1207
|
+
return defineElement({
|
|
1208
|
+
name: elementName,
|
|
1209
|
+
onBeforeInit(element) {
|
|
1210
|
+
const [operator] = getOperatorComparator(element);
|
|
1211
|
+
addAttrBinding(element, RealmAttributeNames.VALUE);
|
|
1212
|
+
addAttrBinding(element, operator);
|
|
1213
|
+
const slot = element._createElement(RealmTagNames.SLOT);
|
|
1214
|
+
const cssRules = [
|
|
1215
|
+
[
|
|
1216
|
+
HOST_SELECTOR,
|
|
1217
|
+
[
|
|
1218
|
+
[_CSSvar(displayVarName), hidden],
|
|
1219
|
+
["display", element.$CSSvar(displayVarName)]
|
|
1220
|
+
]
|
|
1221
|
+
]
|
|
1222
|
+
];
|
|
1223
|
+
element._attach();
|
|
1224
|
+
element._append(slot, element.$shadow());
|
|
1225
|
+
element._addCSS(element._attachStyle(), cssRules);
|
|
1226
|
+
element._slotTo(slot, element.$nodes());
|
|
1227
|
+
},
|
|
1228
|
+
onInit(element) {
|
|
1229
|
+
updateIsVisibleCSSProperty(
|
|
1230
|
+
element,
|
|
1231
|
+
element.$attr(RealmAttributeNames.VALUE),
|
|
1232
|
+
displayVarName,
|
|
1233
|
+
hidden,
|
|
1234
|
+
visible
|
|
1235
|
+
);
|
|
1236
|
+
},
|
|
1237
|
+
onAttributeChanged(element, attrName, attrValue) {
|
|
1238
|
+
if (attrName !== RealmAttributeNames.VALUE)
|
|
1239
|
+
return;
|
|
1240
|
+
updateIsVisibleCSSProperty(
|
|
1241
|
+
element,
|
|
1242
|
+
attrValue,
|
|
1243
|
+
displayVarName,
|
|
1244
|
+
hidden,
|
|
1245
|
+
visible
|
|
1246
|
+
);
|
|
1247
|
+
}
|
|
1248
|
+
});
|
|
1249
|
+
};
|
|
1250
|
+
var VISIBLE_VALUE = "initial";
|
|
1251
|
+
var HIDDEN_VALUE = "none";
|
|
1252
|
+
var isVisibleElement = createVisibilityElement(
|
|
1253
|
+
RealmTagNames.IS_VISIBLE,
|
|
1254
|
+
[HIDDEN_VALUE, VISIBLE_VALUE]
|
|
1255
|
+
);
|
|
1256
|
+
var isHiddenElement = createVisibilityElement(
|
|
1257
|
+
RealmTagNames.IS_HIDDEN,
|
|
1258
|
+
[VISIBLE_VALUE, HIDDEN_VALUE]
|
|
1259
|
+
);
|
|
1260
|
+
|
|
1261
|
+
// src/constants/flow.ts
|
|
1262
|
+
var FlowEventNames = {
|
|
1263
|
+
TRIGGER_EVENT: "trigger-event",
|
|
1264
|
+
LISTEN_EVENT: "listen-event"
|
|
1265
|
+
};
|
|
1266
|
+
var FlowRuntimeEventTypes = {
|
|
1267
|
+
MOUNTED: "mounted",
|
|
1268
|
+
UNMOUNTED: "unmounted",
|
|
1269
|
+
ATTR_CHANGED: "attrchanged",
|
|
1270
|
+
STATE_CHANGED: "statechanged",
|
|
1271
|
+
ON: "on"
|
|
1272
|
+
};
|
|
1273
|
+
var FlowRuntimeMutableEventTypesLookup = {
|
|
1274
|
+
[RealmMutableAttr.ATTR]: FlowRuntimeEventTypes.ATTR_CHANGED,
|
|
1275
|
+
[RealmMutableAttr.STATE]: FlowRuntimeEventTypes.STATE_CHANGED
|
|
1276
|
+
};
|
|
1277
|
+
var FlowActionTypes = {
|
|
1278
|
+
SET_STATE: "set-state",
|
|
1279
|
+
SET_ATTR: "set-attr",
|
|
1280
|
+
SET_TIMER: "set-timer",
|
|
1281
|
+
SEND_EVENT: "send-event",
|
|
1282
|
+
TRIGGER_ELEMENT: "trigger-element",
|
|
1283
|
+
SCRIPT: "script",
|
|
1284
|
+
HTTP_REQUEST: "http-request",
|
|
1285
|
+
REQUEST_HEADER: "request-header",
|
|
1286
|
+
REQUEST_BODY: "request-body",
|
|
1287
|
+
RESPONSE_SUCCESS: "response-ok",
|
|
1288
|
+
RESPONSE_ERROR: "response-fail"
|
|
1289
|
+
};
|
|
1290
|
+
var FlowMutateTypes = {
|
|
1291
|
+
EQUALS_TO: "=",
|
|
1292
|
+
ADD: "+",
|
|
1293
|
+
SUBTRACT: "-",
|
|
1294
|
+
MULTIPLY: "*",
|
|
1295
|
+
DIVIDE: "/",
|
|
1296
|
+
ADD_STR: "add",
|
|
1297
|
+
ASSIGN: "assign",
|
|
1298
|
+
PUSH: "push",
|
|
1299
|
+
POP: "pop",
|
|
1300
|
+
REMOVE: "remove"
|
|
1301
|
+
};
|
|
1302
|
+
var ALL_USE_FN = `${"localState" /* LOCAL_STATE */},${"globalState" /* GLOBAL_STATE */},${"event" /* EVENT */},attrs, ${"attr" /* ATTR */},$`;
|
|
1303
|
+
|
|
1304
|
+
// src/constants/scripts.ts
|
|
1305
|
+
var RealmScriptTypes = {
|
|
1306
|
+
REALM_MODULE: "module/realm",
|
|
1307
|
+
JS: "application/javascript",
|
|
1308
|
+
MODULE: "module"
|
|
1309
|
+
};
|
|
1310
|
+
|
|
1311
|
+
// src/utils/script.ts
|
|
1312
|
+
var createScriptBlob = (script) => new Blob([script], { type: RealmScriptTypes.JS });
|
|
1313
|
+
var createScriptURL = (elementName, scriptId, script, params) => {
|
|
1314
|
+
const fnParams = params.length ? `{ ${arrayJoin(params, ", ")} }` : "";
|
|
1315
|
+
const scriptWrapper = `async (${fnParams})=>{
|
|
1316
|
+
${script}
|
|
1317
|
+
}`;
|
|
1318
|
+
const scriptContent = `__REALM_ADD_CUSTOM_FLOW('${elementName}', '${scriptId}', ${scriptWrapper})`;
|
|
1319
|
+
return URL.createObjectURL(createScriptBlob(scriptContent));
|
|
1320
|
+
};
|
|
1321
|
+
var attatchScriptFlow = (elementName, scriptId, script, params, onScriptLoad) => {
|
|
1322
|
+
const scriptURL = createScriptURL(elementName, scriptId, script, params);
|
|
1323
|
+
const scriptElement = _createElement(RealmTagNames.SCRIPT);
|
|
1324
|
+
scriptElement.onload = () => {
|
|
1325
|
+
onScriptLoad?.(elementName);
|
|
1326
|
+
URL.revokeObjectURL(scriptURL);
|
|
1327
|
+
_remove(head)(scriptElement);
|
|
1328
|
+
};
|
|
1329
|
+
_attrs(scriptElement)([
|
|
1330
|
+
[RealmAttributeNames.SRC, scriptURL],
|
|
1331
|
+
[RealmAttributeNames.TYPE, RealmScriptTypes.MODULE],
|
|
1332
|
+
[RealmAttributeNames.ASYNC],
|
|
1333
|
+
[RealmAttributeNames.SCRIPT_ID, scriptId]
|
|
1334
|
+
]);
|
|
1335
|
+
_append(head)(scriptElement);
|
|
1336
|
+
};
|
|
1337
|
+
|
|
1338
|
+
// src/utils/flow.ts
|
|
1339
|
+
var CUSTOM_SCRIPT_FLOW_REGISTRY = createMap();
|
|
1340
|
+
var FLOW_REGISTRY = createMap();
|
|
1341
|
+
var getScriptFlowRegistry = (elementName) => getMap(CUSTOM_SCRIPT_FLOW_REGISTRY, elementName);
|
|
1342
|
+
var addScriptFlow = (elementName, scriptId, fn) => setMap(getScriptFlowRegistry(elementName), scriptId, fn);
|
|
1343
|
+
window.__REALM_ADD_CUSTOM_FLOW = addScriptFlow;
|
|
1344
|
+
var registerScriptFlow = (eventFlowOwnerName) => setMap(
|
|
1345
|
+
CUSTOM_SCRIPT_FLOW_REGISTRY,
|
|
1346
|
+
eventFlowOwnerName,
|
|
1347
|
+
createMap()
|
|
1348
|
+
);
|
|
1349
|
+
var getScriptFlow = (elementName, scriptId) => getMap(getScriptFlowRegistry(elementName), scriptId);
|
|
1350
|
+
var getFlowRegistry = (name) => getMap(FLOW_REGISTRY, name) ?? createMap();
|
|
1351
|
+
var registerFlow = (name, elementName, flow) => {
|
|
1352
|
+
const flowMap = getFlowRegistry(name) ?? createMap();
|
|
1353
|
+
setMap(flowMap, elementName, flow);
|
|
1354
|
+
setMap(FLOW_REGISTRY, name, flowMap);
|
|
1355
|
+
};
|
|
1356
|
+
var getFlow = (name, elementName) => getMap(getFlowRegistry(name), elementName);
|
|
1357
|
+
var mutatesValue = ([mutateType, attrType, attrValue, attrIndex]) => {
|
|
1358
|
+
const isAllowedMutation = arrayIncludes(attrType, [
|
|
1359
|
+
"number" /* NUMBER */,
|
|
1360
|
+
"array" /* ARRAY */
|
|
1361
|
+
]);
|
|
1362
|
+
return (prevValue) => {
|
|
1363
|
+
if (!isAllowedMutation)
|
|
1364
|
+
return attrValue;
|
|
1365
|
+
const mutateLookup = {
|
|
1366
|
+
[FlowMutateTypes.EQUALS_TO]: () => isArray(attrValue) ? attrValue : +attrValue,
|
|
1367
|
+
[FlowMutateTypes.ADD]: () => +prevValue + +attrValue,
|
|
1368
|
+
[FlowMutateTypes.SUBTRACT]: () => +prevValue - +attrValue,
|
|
1369
|
+
[FlowMutateTypes.MULTIPLY]: () => +prevValue * +attrValue,
|
|
1370
|
+
[FlowMutateTypes.DIVIDE]: () => +prevValue / +attrValue,
|
|
1371
|
+
[FlowMutateTypes.ASSIGN]: () => {
|
|
1372
|
+
const array = [...prevValue];
|
|
1373
|
+
const prevValueIndex = array[+attrIndex];
|
|
1374
|
+
if (prevValueIndex !== void 0)
|
|
1375
|
+
array[+attrIndex] = typeof prevValueIndex === "object" ? {
|
|
1376
|
+
...prevValueIndex,
|
|
1377
|
+
...attrValue?.[0]
|
|
1378
|
+
} : attrValue;
|
|
1379
|
+
return array;
|
|
1380
|
+
},
|
|
1381
|
+
[FlowMutateTypes.PUSH]: () => [
|
|
1382
|
+
...prevValue,
|
|
1383
|
+
...arrayReduce2(
|
|
1384
|
+
attrValue,
|
|
1385
|
+
(acc, value) => {
|
|
1386
|
+
const newId = `${SOURCE_PREFIX}${SOURCE_PREFIX}${$randId()}`;
|
|
1387
|
+
return [
|
|
1388
|
+
...acc,
|
|
1389
|
+
typeof value === "object" ? {
|
|
1390
|
+
[newId]: Symbol(newId),
|
|
1391
|
+
...value
|
|
1392
|
+
} : value
|
|
1393
|
+
];
|
|
1394
|
+
},
|
|
1395
|
+
[]
|
|
1396
|
+
)
|
|
1397
|
+
],
|
|
1398
|
+
[FlowMutateTypes.POP]: () => {
|
|
1399
|
+
const array = [...prevValue];
|
|
1400
|
+
arrayPop(array);
|
|
1401
|
+
return array;
|
|
1402
|
+
},
|
|
1403
|
+
[FlowMutateTypes.REMOVE]: () => {
|
|
1404
|
+
const array = [...prevValue];
|
|
1405
|
+
arraySplice(array, +attrIndex, 1);
|
|
1406
|
+
return array;
|
|
1407
|
+
}
|
|
1408
|
+
};
|
|
1409
|
+
return mutateLookup?.[mutateType]?.();
|
|
1410
|
+
};
|
|
1411
|
+
};
|
|
1412
|
+
var actionFlowReducer = (eventFlowOwnerName, eventOwnerElement, acc, actionElement) => {
|
|
1413
|
+
const actionName = eventOwnerElement.$tagName(actionElement);
|
|
1414
|
+
const actionAttrs = eventOwnerElement.$attrs(actionElement);
|
|
1415
|
+
const actionContent = eventOwnerElement.$html(actionElement);
|
|
1416
|
+
const actionArgs = arrayReduce2(
|
|
1417
|
+
actionAttrs,
|
|
1418
|
+
eventFlowReducer,
|
|
1419
|
+
[]
|
|
1420
|
+
);
|
|
1421
|
+
if (actionName === FlowActionTypes.SET_STATE) {
|
|
1422
|
+
arrayPush(actionArgs, [RealmAttributeNames.VALUE, actionContent]);
|
|
1423
|
+
}
|
|
1424
|
+
if (actionName === RealmTagNames.SCRIPT) {
|
|
1425
|
+
const { type, use = "" } = fromEntries(actionArgs);
|
|
1426
|
+
const isValidScriptType = type === RealmScriptTypes.REALM_MODULE;
|
|
1427
|
+
if (isValidScriptType) {
|
|
1428
|
+
const scriptId = `${actionName}-${eventOwnerElement.$id()}-${eventOwnerElement.$randId()}`;
|
|
1429
|
+
const dependencies = trimArrayString(
|
|
1430
|
+
arraySplit(use === ALL ? ALL_USE_FN : use, COMMA_SEPARATOR)
|
|
1431
|
+
);
|
|
1432
|
+
arrayPush(actionArgs, [RealmAttributeNames.SCRIPT_ID, scriptId]);
|
|
1433
|
+
attatchScriptFlow(
|
|
1434
|
+
eventFlowOwnerName,
|
|
1435
|
+
scriptId,
|
|
1436
|
+
actionContent,
|
|
1437
|
+
dependencies
|
|
1438
|
+
);
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
if ([
|
|
1442
|
+
FlowActionTypes.SET_TIMER,
|
|
1443
|
+
FlowActionTypes.HTTP_REQUEST,
|
|
1444
|
+
FlowActionTypes.RESPONSE_SUCCESS,
|
|
1445
|
+
FlowActionTypes.RESPONSE_ERROR
|
|
1446
|
+
].includes(actionName)) {
|
|
1447
|
+
const actionReducer = createActionReducer(
|
|
1448
|
+
eventFlowOwnerName,
|
|
1449
|
+
eventOwnerElement
|
|
1450
|
+
);
|
|
1451
|
+
arrayPush(actionArgs, [
|
|
1452
|
+
RealmAttributeNames.ACTION,
|
|
1453
|
+
arrayReduce2(
|
|
1454
|
+
eventOwnerElement.$children(actionElement),
|
|
1455
|
+
actionReducer(),
|
|
1456
|
+
[]
|
|
1457
|
+
)
|
|
1458
|
+
]);
|
|
1459
|
+
}
|
|
1460
|
+
if ([
|
|
1461
|
+
FlowActionTypes.SEND_EVENT,
|
|
1462
|
+
FlowActionTypes.REQUEST_BODY
|
|
1463
|
+
].includes(actionName)) {
|
|
1464
|
+
arrayPush(actionArgs, [
|
|
1465
|
+
RealmAttributeNames.ACTION,
|
|
1466
|
+
eventOwnerElement.$html(actionElement)
|
|
1467
|
+
]);
|
|
1468
|
+
}
|
|
1469
|
+
const actionFlow = [actionName, actionArgs];
|
|
1470
|
+
return [...acc, actionFlow];
|
|
1471
|
+
};
|
|
1472
|
+
var createActionReducer = (eventFlowOwnerName, eventOwnerElement) => () => (acc, actionElement) => actionFlowReducer(
|
|
1473
|
+
eventFlowOwnerName,
|
|
1474
|
+
eventOwnerElement,
|
|
1475
|
+
acc,
|
|
1476
|
+
actionElement
|
|
1477
|
+
);
|
|
1478
|
+
var eventFlowReducer = (acc, attr) => [
|
|
1479
|
+
...acc,
|
|
1480
|
+
[$attrName(attr), $attrValue(attr)]
|
|
1481
|
+
];
|
|
1482
|
+
var createEventReducer = () => () => (acc, attr) => eventFlowReducer(acc, attr);
|
|
1483
|
+
var defineFlow = ({
|
|
1484
|
+
name,
|
|
1485
|
+
onBeforeRegister,
|
|
1486
|
+
onRegistered,
|
|
1487
|
+
onApply,
|
|
1488
|
+
onRemove
|
|
1489
|
+
}) => {
|
|
1490
|
+
const registerFlowFn = async (eventOwnerName, eventOwnerElement) => {
|
|
1491
|
+
const flowElements = createArray(eventOwnerElement.$els(name));
|
|
1492
|
+
const attrReducer = createEventReducer();
|
|
1493
|
+
const actionReducer = createActionReducer(
|
|
1494
|
+
eventOwnerName,
|
|
1495
|
+
eventOwnerElement
|
|
1496
|
+
);
|
|
1497
|
+
const flow = createSet(
|
|
1498
|
+
arrayReduce2(
|
|
1499
|
+
flowElements,
|
|
1500
|
+
(acc, eventElement) => [
|
|
1501
|
+
...acc,
|
|
1502
|
+
[
|
|
1503
|
+
// @note: attributes
|
|
1504
|
+
arrayReduce2(
|
|
1505
|
+
eventOwnerElement.$attrs(eventElement),
|
|
1506
|
+
attrReducer(),
|
|
1507
|
+
[]
|
|
1508
|
+
),
|
|
1509
|
+
// @note: actions
|
|
1510
|
+
arrayReduce2(
|
|
1511
|
+
eventOwnerElement.$children(eventElement),
|
|
1512
|
+
actionReducer(),
|
|
1513
|
+
[]
|
|
1514
|
+
)
|
|
1515
|
+
]
|
|
1516
|
+
],
|
|
1517
|
+
[]
|
|
1518
|
+
)
|
|
1519
|
+
);
|
|
1520
|
+
registerScriptFlow(eventOwnerName);
|
|
1521
|
+
onBeforeRegister?.(eventOwnerName);
|
|
1522
|
+
registerFlow(name, eventOwnerName, flow);
|
|
1523
|
+
onRegistered?.(eventOwnerName, flow);
|
|
1524
|
+
};
|
|
1525
|
+
const flowCallback = (callback) => async (hostElement, dispatcherElement) => {
|
|
1526
|
+
const flow = getFlow(name, hostElement.$tagName());
|
|
1527
|
+
if (flow)
|
|
1528
|
+
callback?.(flow, hostElement, dispatcherElement);
|
|
1529
|
+
};
|
|
1530
|
+
return [registerFlowFn, flowCallback(onApply), flowCallback(onRemove)];
|
|
1531
|
+
};
|
|
1532
|
+
|
|
1533
|
+
// src/elements/global-state.ts
|
|
1534
|
+
var globalState = win.globalState = new RealmState();
|
|
1535
|
+
var GLOBAL_STATE_REGISTRY = createSet();
|
|
1536
|
+
var getGlobalStateRegistry = () => GLOBAL_STATE_REGISTRY;
|
|
1537
|
+
var findGlobalStateRegistry = (name) => findArray(
|
|
1538
|
+
createArray(GLOBAL_STATE_REGISTRY),
|
|
1539
|
+
([stateName]) => stateName === name
|
|
1540
|
+
);
|
|
1541
|
+
var getGlobalStateType = (name) => findGlobalStateRegistry(name)?.at(1);
|
|
1542
|
+
var getGlobalStateStorage = (name) => {
|
|
1543
|
+
const options = findGlobalStateRegistry(name)?.at(3);
|
|
1544
|
+
return options?.storage ?? "memory" /* MEMORY */;
|
|
1545
|
+
};
|
|
1546
|
+
var getGlobalState = () => globalState;
|
|
1547
|
+
var getGlobalStateValue = (name) => globalState.get(name, getGlobalStateStorage(name));
|
|
1548
|
+
var updateGlobalState = (name, value) => globalState.set(name, value, getGlobalStateStorage(name));
|
|
1549
|
+
var globalStateElement = defineElement({
|
|
1550
|
+
name: RealmTagNames.GLOBAL_STATE,
|
|
1551
|
+
onBeforeInit(element) {
|
|
1552
|
+
const [name, type, storage] = arrayMap(
|
|
1553
|
+
[
|
|
1554
|
+
RealmAttributeNames.NAME,
|
|
1555
|
+
RealmAttributeNames.TYPE,
|
|
1556
|
+
RealmAttributeNames.STORAGE
|
|
1557
|
+
],
|
|
1558
|
+
(item) => element.$attr(item)
|
|
1559
|
+
);
|
|
1560
|
+
const value = parseValue(type, element.$html());
|
|
1561
|
+
addSet(GLOBAL_STATE_REGISTRY, [name, type, value, { storage }]);
|
|
1562
|
+
updateGlobalState(name, getGlobalStateValue(name) ?? value);
|
|
1563
|
+
},
|
|
1564
|
+
onMounted(element) {
|
|
1565
|
+
element._remove();
|
|
1566
|
+
}
|
|
1567
|
+
});
|
|
1568
|
+
|
|
1569
|
+
// src/utils/action.ts
|
|
1570
|
+
var ACTIONS_REGISTRY = createMap();
|
|
1571
|
+
var ATTRS_REGISTRY = createMap();
|
|
1572
|
+
var STATE_REGISTRY = createMap();
|
|
1573
|
+
var setAttrMapRegistry = (attrMap, elementName, attrs) => attrs.size && setMap(attrMap, elementName, attrs);
|
|
1574
|
+
var setAttrRegistry = (elementName, attrs) => setAttrMapRegistry(ATTRS_REGISTRY, elementName, attrs);
|
|
1575
|
+
var setStateRegistry = (elementName, attrs) => setAttrMapRegistry(STATE_REGISTRY, elementName, attrs);
|
|
1576
|
+
var getAttrRegistry = (elementName) => getMap(ATTRS_REGISTRY, elementName) ?? createSet();
|
|
1577
|
+
var getStateRegistry = (elementName) => getMap(STATE_REGISTRY, elementName) ?? createSet();
|
|
1578
|
+
var {
|
|
1579
|
+
EQUALS_TO: MutateTypeEqual,
|
|
1580
|
+
REMOVE: MutateTypeRemove,
|
|
1581
|
+
POP: MutateTypeArrayPop,
|
|
1582
|
+
PUSH: MutateTypeArrayPush,
|
|
1583
|
+
ASSIGN: MutateTypeArrayAssign,
|
|
1584
|
+
ADD_STR: MutateTypeArrayAdd
|
|
1585
|
+
} = FlowMutateTypes;
|
|
1586
|
+
var {
|
|
1587
|
+
MUTATE: AttrMutate,
|
|
1588
|
+
INDEX: AttrIndex,
|
|
1589
|
+
VALUE: AttrValue,
|
|
1590
|
+
FROM: AttrFrom,
|
|
1591
|
+
TOGGLE: AttrToggle
|
|
1592
|
+
} = RealmAttributeNames;
|
|
1593
|
+
var { ARRAY: DataTypeArray, HTML: DataTypeHTML } = ElementDataTypes;
|
|
1594
|
+
var getRawSourceFrom = (element, value, sourceType, event2) => {
|
|
1595
|
+
const strValue = `${value}`;
|
|
1596
|
+
const eventLookup = {
|
|
1597
|
+
["event" /* EVENT */]: () => getValueFrom(event2, strValue),
|
|
1598
|
+
["globalState" /* GLOBAL_STATE */]: () => getValueFrom(getGlobalState(), strValue),
|
|
1599
|
+
["localState" /* LOCAL_STATE */]: () => getValueFrom(element.states, strValue),
|
|
1600
|
+
["event:attr" /* EVENT_ATTR */]: () => {
|
|
1601
|
+
const attrOwner = event2.target;
|
|
1602
|
+
const attrs = element.$attrsKv(attrOwner);
|
|
1603
|
+
return getValueFrom(attrs, strValue);
|
|
1604
|
+
},
|
|
1605
|
+
["attr" /* ATTR */]: () => getValueFrom(
|
|
1606
|
+
{
|
|
1607
|
+
...getDefaultAttrValues(element),
|
|
1608
|
+
...element.$attrsKv(element)
|
|
1609
|
+
},
|
|
1610
|
+
strValue
|
|
1611
|
+
)
|
|
1612
|
+
};
|
|
1613
|
+
return eventLookup?.[sourceType]?.();
|
|
1614
|
+
};
|
|
1615
|
+
var getSourceFrom = (element, type, value, sourceType, event2) => {
|
|
1616
|
+
const getRawValue = () => getRawSourceFrom(element, value, sourceType, event2);
|
|
1617
|
+
const eventLookup = {
|
|
1618
|
+
["event" /* EVENT */]: getRawValue,
|
|
1619
|
+
["event:attr" /* EVENT_ATTR */]: getRawValue,
|
|
1620
|
+
["attr" /* ATTR */]: getRawValue,
|
|
1621
|
+
["globalState" /* GLOBAL_STATE */]: () => parseValue(type, getRawValue()),
|
|
1622
|
+
["localState" /* LOCAL_STATE */]: () => parseValue(type, getRawValue())
|
|
1623
|
+
};
|
|
1624
|
+
return eventLookup?.[sourceType]?.() ?? parseValue(type, value);
|
|
1625
|
+
};
|
|
1626
|
+
var findAttr = (actionArgs, attrName, fallbackAttr, isMultipleResult = false) => {
|
|
1627
|
+
const attr = findAttrFrom(actionArgs, attrName, isMultipleResult);
|
|
1628
|
+
const hasAttr = attr !== void 0;
|
|
1629
|
+
return [hasAttr ? attr : fallbackAttr, hasAttr];
|
|
1630
|
+
};
|
|
1631
|
+
var getMutatedValue = (element, actionArgs, attrType, event2) => {
|
|
1632
|
+
const [mutateAttr] = findAttr(
|
|
1633
|
+
actionArgs,
|
|
1634
|
+
AttrMutate,
|
|
1635
|
+
MutateTypeEqual
|
|
1636
|
+
);
|
|
1637
|
+
const [indexAttr, hasIndexAttr] = findAttr(actionArgs, AttrIndex);
|
|
1638
|
+
const [valueAttr, hasValueAttr] = findAttr(
|
|
1639
|
+
actionArgs,
|
|
1640
|
+
AttrValue
|
|
1641
|
+
);
|
|
1642
|
+
const isDataTypeArray = attrType === DataTypeArray;
|
|
1643
|
+
const isDataTypeHTML = attrType === DataTypeHTML;
|
|
1644
|
+
const isMutateTypeEqualsTo = mutateAttr === MutateTypeEqual;
|
|
1645
|
+
const isMutateTypeArrayRemove = mutateAttr === MutateTypeRemove;
|
|
1646
|
+
const isMutateTypeArrayPop = mutateAttr === MutateTypeArrayPop;
|
|
1647
|
+
const isMutateTypeArrayPush = mutateAttr === MutateTypeArrayPush;
|
|
1648
|
+
const isMutateTypeArrayAdd = mutateAttr === MutateTypeArrayAdd;
|
|
1649
|
+
const isMutateTypeArrayAssign = mutateAttr === MutateTypeArrayAssign;
|
|
1650
|
+
const isMutationArrayNotRequiredIndex = isMutateTypeArrayPush || isMutateTypeEqualsTo;
|
|
1651
|
+
const isMutationArrayRequiredIndex = isMutateTypeArrayRemove || isMutateTypeArrayAdd || isMutateTypeArrayAssign;
|
|
1652
|
+
const isStringMutationAllowed = !isDataTypeArray && hasValueAttr;
|
|
1653
|
+
const isHTMLMutationAllowed = isDataTypeHTML;
|
|
1654
|
+
const isArrayMutationAllowed = isDataTypeArray && (isMutateTypeArrayPop || isMutationArrayRequiredIndex && hasIndexAttr || isMutationArrayNotRequiredIndex && hasValueAttr);
|
|
1655
|
+
const isMutationAllowed = isStringMutationAllowed || isHTMLMutationAllowed || isArrayMutationAllowed;
|
|
1656
|
+
if (!isMutationAllowed)
|
|
1657
|
+
return;
|
|
1658
|
+
const [sourceType] = findAttr(actionArgs, AttrFrom);
|
|
1659
|
+
const attrIndex = hasIndexAttr ? getSourceFrom(element, attrType, indexAttr, sourceType, event2) : "-1";
|
|
1660
|
+
const attrValue = getSourceFrom(
|
|
1661
|
+
element,
|
|
1662
|
+
attrType,
|
|
1663
|
+
valueAttr,
|
|
1664
|
+
sourceType,
|
|
1665
|
+
event2
|
|
1666
|
+
);
|
|
1667
|
+
const [_toggle, hasToggle] = findAttr(actionArgs, AttrToggle);
|
|
1668
|
+
const mutatedValue = mutatesValue([
|
|
1669
|
+
mutateAttr,
|
|
1670
|
+
attrType,
|
|
1671
|
+
hasToggle ? !attrValue : attrValue,
|
|
1672
|
+
+attrIndex
|
|
1673
|
+
]);
|
|
1674
|
+
return mutatedValue;
|
|
1675
|
+
};
|
|
1676
|
+
var getAttrType = (name, attrEntries) => arrayReduce2(
|
|
1677
|
+
createArray(attrEntries),
|
|
1678
|
+
(acc, [attrName, attrType]) => attrName === name ? attrType : acc
|
|
1679
|
+
);
|
|
1680
|
+
var doAction = (element, elementName, actions) => (eventType, eventName, event2) => forEach(actions, ([actionName, actionArgs]) => {
|
|
1681
|
+
const [requiredAttrs = [], triggerAction] = getMap(
|
|
1682
|
+
ACTIONS_REGISTRY,
|
|
1683
|
+
actionName
|
|
1684
|
+
);
|
|
1685
|
+
const isValidAction = someArray(requiredAttrs, (attrName) => {
|
|
1686
|
+
const [, hasAttr] = findAttr(actionArgs, attrName);
|
|
1687
|
+
return hasAttr;
|
|
1688
|
+
});
|
|
1689
|
+
if (requiredAttrs.length && !isValidAction)
|
|
1690
|
+
return;
|
|
1691
|
+
return triggerAction?.(
|
|
1692
|
+
element,
|
|
1693
|
+
elementName,
|
|
1694
|
+
actionArgs,
|
|
1695
|
+
event2,
|
|
1696
|
+
eventType,
|
|
1697
|
+
eventName
|
|
1698
|
+
);
|
|
1699
|
+
});
|
|
1700
|
+
var actionTrigger = (element, elementName) => (actions) => doAction(element, elementName, actions);
|
|
1701
|
+
var createActionTrigger = (element) => actionTrigger(element, element.$name());
|
|
1702
|
+
var defineAction = ({ name, requiredAttrs, onTrigger }) => () => setMap(ACTIONS_REGISTRY, name, [requiredAttrs, onTrigger]);
|
|
1703
|
+
|
|
1704
|
+
// src/actions/http-request.ts
|
|
1705
|
+
var HttpMethod = {
|
|
1706
|
+
GET: "GET",
|
|
1707
|
+
POST: "POST",
|
|
1708
|
+
PUT: "PUT",
|
|
1709
|
+
DELETE: "DELETE",
|
|
1710
|
+
PATCH: "PATCH"
|
|
1711
|
+
};
|
|
1712
|
+
var ResponseType = {
|
|
1713
|
+
JSON: "json" /* JSON_STRING */,
|
|
1714
|
+
HTML: "html" /* HTML */,
|
|
1715
|
+
TEXT: "text"
|
|
1716
|
+
};
|
|
1717
|
+
var httpRequestAction = defineAction({
|
|
1718
|
+
name: FlowActionTypes.HTTP_REQUEST,
|
|
1719
|
+
async onTrigger(element, elementName, actionArgs, $event, eventType, eventName) {
|
|
1720
|
+
const [urlAttr, hasUrlAttr] = findAttr(
|
|
1721
|
+
actionArgs,
|
|
1722
|
+
RealmAttributeNames.HTTP_URL
|
|
1723
|
+
);
|
|
1724
|
+
if (!hasUrlAttr)
|
|
1725
|
+
throw newError(
|
|
1726
|
+
`Missing "${RealmAttributeNames.HTTP_URL}" attribute on <${FlowActionTypes.HTTP_REQUEST} />`
|
|
1727
|
+
);
|
|
1728
|
+
const [actionAttrs] = findAttr(
|
|
1729
|
+
actionArgs,
|
|
1730
|
+
RealmAttributeNames.ACTION
|
|
1731
|
+
);
|
|
1732
|
+
const [responseResponseOkAttr = [], hasResponseOkAttr] = findAttr(actionAttrs, FlowActionTypes.RESPONSE_SUCCESS);
|
|
1733
|
+
const [responseOkActions, hasResponseOkActions] = findAttr(
|
|
1734
|
+
responseResponseOkAttr,
|
|
1735
|
+
RealmAttributeNames.ACTION
|
|
1736
|
+
);
|
|
1737
|
+
const [responseResponseFailAttr = [], hasResponseFailAttr] = findAttr(actionAttrs, FlowActionTypes.RESPONSE_ERROR);
|
|
1738
|
+
const [responseFailActions, hasResponseFailActions] = findAttr(responseResponseFailAttr, RealmAttributeNames.ACTION);
|
|
1739
|
+
if (!(hasResponseOkAttr || hasResponseFailAttr))
|
|
1740
|
+
return;
|
|
1741
|
+
const [method = HttpMethod.GET] = findAttr(
|
|
1742
|
+
actionArgs,
|
|
1743
|
+
RealmAttributeNames.METHOD
|
|
1744
|
+
);
|
|
1745
|
+
const [asAttr = ResponseType.TEXT] = findAttr(
|
|
1746
|
+
actionArgs,
|
|
1747
|
+
RealmAttributeNames.AS
|
|
1748
|
+
);
|
|
1749
|
+
const [headersAttrs = []] = findAttr(
|
|
1750
|
+
actionAttrs,
|
|
1751
|
+
FlowActionTypes.REQUEST_HEADER,
|
|
1752
|
+
[],
|
|
1753
|
+
true
|
|
1754
|
+
);
|
|
1755
|
+
const headers = new Headers();
|
|
1756
|
+
forEach(headersAttrs, (headerAttr) => {
|
|
1757
|
+
const header = fromEntries(headerAttr);
|
|
1758
|
+
headers.set(
|
|
1759
|
+
header[RealmAttributeNames.NAME],
|
|
1760
|
+
header[RealmAttributeNames.VALUE]
|
|
1761
|
+
);
|
|
1762
|
+
});
|
|
1763
|
+
const [bodyAttr, hasBodyAttr] = findAttr(
|
|
1764
|
+
actionAttrs,
|
|
1765
|
+
FlowActionTypes.REQUEST_BODY
|
|
1766
|
+
);
|
|
1767
|
+
let body;
|
|
1768
|
+
if (hasBodyAttr) {
|
|
1769
|
+
const [bodyContent, hasBodyContent] = findAttr(
|
|
1770
|
+
bodyAttr,
|
|
1771
|
+
RealmAttributeNames.ACTION
|
|
1772
|
+
);
|
|
1773
|
+
if (hasBodyAttr && hasBodyContent)
|
|
1774
|
+
body = bodyContent;
|
|
1775
|
+
const [bodyValueAttr, hasBodyValueAttr] = findAttr(
|
|
1776
|
+
bodyAttr,
|
|
1777
|
+
RealmAttributeNames.VALUE
|
|
1778
|
+
);
|
|
1779
|
+
const [bodyFromAttr, hasBodyFromAttr] = findAttr(
|
|
1780
|
+
bodyAttr,
|
|
1781
|
+
RealmAttributeNames.FROM
|
|
1782
|
+
);
|
|
1783
|
+
if (hasBodyValueAttr && hasBodyFromAttr) {
|
|
1784
|
+
body = getRawSourceFrom(element, bodyValueAttr, bodyFromAttr, $event);
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
const doActionWrapper = (responseAction, $event2) => doAction(element, elementName, responseAction)(
|
|
1788
|
+
eventName,
|
|
1789
|
+
eventType,
|
|
1790
|
+
$event2
|
|
1791
|
+
);
|
|
1792
|
+
try {
|
|
1793
|
+
if (!hasResponseOkActions)
|
|
1794
|
+
return;
|
|
1795
|
+
const response = await fetch(urlAttr, {
|
|
1796
|
+
body,
|
|
1797
|
+
method,
|
|
1798
|
+
headers
|
|
1799
|
+
});
|
|
1800
|
+
if (!response.ok)
|
|
1801
|
+
throw newError(`[${response.status}] ${urlAttr}`);
|
|
1802
|
+
const getTextResponse = () => response.text();
|
|
1803
|
+
const valueLookup = {
|
|
1804
|
+
[ResponseType.JSON]: () => response.json(),
|
|
1805
|
+
[ResponseType.HTML]: getTextResponse,
|
|
1806
|
+
[ResponseType.TEXT]: getTextResponse
|
|
1807
|
+
};
|
|
1808
|
+
const responseValue = await valueLookup?.[asAttr]?.();
|
|
1809
|
+
doActionWrapper(responseOkActions, responseValue);
|
|
1810
|
+
} catch (err) {
|
|
1811
|
+
if (hasResponseFailActions) {
|
|
1812
|
+
doActionWrapper(responseFailActions, {
|
|
1813
|
+
message: "[ERROR] " + err?.message
|
|
1814
|
+
});
|
|
1815
|
+
}
|
|
1816
|
+
}
|
|
1817
|
+
}
|
|
1818
|
+
});
|
|
1819
|
+
|
|
1820
|
+
// src/actions/script-flow.ts
|
|
1821
|
+
var getScriptArgs = (element, $event) => {
|
|
1822
|
+
event = void 0;
|
|
1823
|
+
const attrs = {
|
|
1824
|
+
...getDefaultAttrValues(element),
|
|
1825
|
+
...element.$attrsKv()
|
|
1826
|
+
};
|
|
1827
|
+
const getShadowArgs = (refName) => [
|
|
1828
|
+
EMPTY_STRING,
|
|
1829
|
+
[[RealmAttributeNames.REF, refName]]
|
|
1830
|
+
];
|
|
1831
|
+
return [
|
|
1832
|
+
{
|
|
1833
|
+
$: element,
|
|
1834
|
+
attr: {
|
|
1835
|
+
get: (name) => element.$attr(name) ?? attrs?.[name],
|
|
1836
|
+
set: element._attr
|
|
1837
|
+
},
|
|
1838
|
+
refs: (refName) => element.$shadowEls.apply(null, getShadowArgs(refName)),
|
|
1839
|
+
ref: (refName) => element.$shadowEl.apply(null, getShadowArgs(refName)),
|
|
1840
|
+
attrs: element.$attrsKv(),
|
|
1841
|
+
localState: element.states,
|
|
1842
|
+
globalState: getGlobalState(),
|
|
1843
|
+
event: $event
|
|
1844
|
+
}
|
|
1845
|
+
];
|
|
1846
|
+
};
|
|
1847
|
+
var scriptAction = defineAction({
|
|
1848
|
+
name: FlowActionTypes.SCRIPT,
|
|
1849
|
+
requiredAttrs: [RealmAttributeNames.SCRIPT_ID],
|
|
1850
|
+
onTrigger(element, elementName, actionArgs, event2) {
|
|
1851
|
+
const [scriptIdAttr] = findAttr(
|
|
1852
|
+
actionArgs,
|
|
1853
|
+
RealmAttributeNames.SCRIPT_ID
|
|
1854
|
+
);
|
|
1855
|
+
reqAnim(() => {
|
|
1856
|
+
getScriptFlow(elementName, scriptIdAttr)?.apply(
|
|
1857
|
+
element,
|
|
1858
|
+
getScriptArgs(element, event2)
|
|
1859
|
+
);
|
|
1860
|
+
});
|
|
1861
|
+
}
|
|
1862
|
+
});
|
|
1863
|
+
|
|
1864
|
+
// src/actions/send-event.ts
|
|
1865
|
+
var sendEventAction = defineAction({
|
|
1866
|
+
name: FlowActionTypes.SEND_EVENT,
|
|
1867
|
+
requiredAttrs: [RealmAttributeNames.NAME],
|
|
1868
|
+
onTrigger(element, _elementName, actionArgs, $event) {
|
|
1869
|
+
const [eventNameAttr] = findAttr(
|
|
1870
|
+
actionArgs,
|
|
1871
|
+
RealmAttributeNames.NAME
|
|
1872
|
+
);
|
|
1873
|
+
const [targetAttr, hasTargetAttr] = findAttr(
|
|
1874
|
+
actionArgs,
|
|
1875
|
+
RealmAttributeNames.TO
|
|
1876
|
+
);
|
|
1877
|
+
const [parentTargetAttr, hasParentTargetAttr] = findAttr(
|
|
1878
|
+
actionArgs,
|
|
1879
|
+
RealmAttributeNames.TO + COLON + "parent"
|
|
1880
|
+
);
|
|
1881
|
+
const [typeAttr, hasTypeAttr] = findAttr(
|
|
1882
|
+
actionArgs,
|
|
1883
|
+
RealmAttributeNames.TYPE
|
|
1884
|
+
);
|
|
1885
|
+
const [valueAttr, hasValueAttr] = findAttr(
|
|
1886
|
+
actionArgs,
|
|
1887
|
+
RealmAttributeNames.VALUE
|
|
1888
|
+
);
|
|
1889
|
+
const [fromAttr, hasFromAttr] = findAttr(
|
|
1890
|
+
actionArgs,
|
|
1891
|
+
RealmAttributeNames.FROM
|
|
1892
|
+
);
|
|
1893
|
+
const [actionAttr] = findAttr(
|
|
1894
|
+
actionArgs,
|
|
1895
|
+
RealmAttributeNames.ACTION
|
|
1896
|
+
);
|
|
1897
|
+
const hasValueFromAttr = hasValueAttr && hasFromAttr;
|
|
1898
|
+
const getValue = () => getSourceFrom(element, typeAttr, valueAttr, fromAttr, $event);
|
|
1899
|
+
const eventDetailExtendedTypeLookup = {
|
|
1900
|
+
["html" /* HTML */]: () => actionAttr,
|
|
1901
|
+
["json" /* JSON_STRING */]: () => JSONSafeParse(actionAttr)
|
|
1902
|
+
};
|
|
1903
|
+
const selector = [EMPTY_STRING, RealmAttributeNames.REF, targetAttr];
|
|
1904
|
+
const eventName = FlowRuntimeEventTypes.ON + COLON + eventNameAttr;
|
|
1905
|
+
let eventDetail = $event;
|
|
1906
|
+
if (hasTypeAttr)
|
|
1907
|
+
eventDetail = !hasValueFromAttr ? eventDetailExtendedTypeLookup[typeAttr]?.() : getValue();
|
|
1908
|
+
let targetElements = [element];
|
|
1909
|
+
if (hasTargetAttr) {
|
|
1910
|
+
targetElements = createArray(element.$shadowEls.apply(null, selector));
|
|
1911
|
+
}
|
|
1912
|
+
if (hasParentTargetAttr) {
|
|
1913
|
+
const parentElement = element.$host();
|
|
1914
|
+
targetElements = [parentElement];
|
|
1915
|
+
if (parentTargetAttr !== EMPTY_STRING) {
|
|
1916
|
+
targetElements = createArray(
|
|
1917
|
+
parentElement.$shadowEls.apply(null, selector)
|
|
1918
|
+
);
|
|
1919
|
+
}
|
|
1920
|
+
}
|
|
1921
|
+
forEach(
|
|
1922
|
+
targetElements,
|
|
1923
|
+
(targetElement) => targetElement._sendEvent(eventName, eventDetail)
|
|
1924
|
+
);
|
|
1925
|
+
}
|
|
1926
|
+
});
|
|
1927
|
+
|
|
1928
|
+
// src/actions/set-action.ts
|
|
1929
|
+
var setStateAction = defineAction({
|
|
1930
|
+
name: FlowActionTypes.SET_STATE,
|
|
1931
|
+
requiredAttrs: [RealmAttributeNames.NAME],
|
|
1932
|
+
onTrigger(element, _elementName, actionArgs, event2) {
|
|
1933
|
+
const updateLocalState = (name, value2) => element.states.set(name, value2);
|
|
1934
|
+
const [nameAttr] = findAttr(actionArgs, RealmAttributeNames.NAME);
|
|
1935
|
+
const [, hasGlobalAttr] = findAttr(actionArgs, RealmAttributeNames.GLOBAL);
|
|
1936
|
+
const attrType = hasGlobalAttr ? getGlobalStateType(nameAttr) : getAttrType(nameAttr, element.statesRegistry);
|
|
1937
|
+
const updateState = hasGlobalAttr ? updateGlobalState : updateLocalState;
|
|
1938
|
+
const value = getMutatedValue(element, actionArgs, attrType, event2);
|
|
1939
|
+
updateState(nameAttr, value);
|
|
1940
|
+
}
|
|
1941
|
+
});
|
|
1942
|
+
var setAttrAction = defineAction({
|
|
1943
|
+
name: FlowActionTypes.SET_ATTR,
|
|
1944
|
+
requiredAttrs: [RealmAttributeNames.NAME],
|
|
1945
|
+
onTrigger(element, _elementName, actionArgs, event2) {
|
|
1946
|
+
const [nameAttr] = findAttr(actionArgs, RealmAttributeNames.NAME);
|
|
1947
|
+
const attrType = getAttrType(nameAttr, element.attrsRegistry);
|
|
1948
|
+
const mutatedValue = getMutatedValue(element, actionArgs, attrType, event2);
|
|
1949
|
+
const prevValue = parseValue(attrType, element.$attr(nameAttr));
|
|
1950
|
+
const value = mutatedValue(prevValue);
|
|
1951
|
+
element._attr(nameAttr, `${value}`);
|
|
1952
|
+
}
|
|
1953
|
+
});
|
|
1954
|
+
|
|
1955
|
+
// src/actions/set-timer.ts
|
|
1956
|
+
var setTimerAction = defineAction({
|
|
1957
|
+
name: FlowActionTypes.SET_TIMER,
|
|
1958
|
+
requiredAttrs: [RealmAttributeNames.ONCE, RealmAttributeNames.EVERY],
|
|
1959
|
+
onTrigger(element, elementName, actionArgs, event2, eventType, eventName) {
|
|
1960
|
+
const [actionAttr, hasActionAttr] = findAttr(
|
|
1961
|
+
actionArgs,
|
|
1962
|
+
RealmAttributeNames.ACTION
|
|
1963
|
+
);
|
|
1964
|
+
if (!hasActionAttr)
|
|
1965
|
+
return;
|
|
1966
|
+
const [onceAttr, hasOnceAttr] = findAttr(
|
|
1967
|
+
actionArgs,
|
|
1968
|
+
RealmAttributeNames.ONCE
|
|
1969
|
+
);
|
|
1970
|
+
const [everyAttr, hasEveryAttr] = findAttr(
|
|
1971
|
+
actionArgs,
|
|
1972
|
+
RealmAttributeNames.EVERY
|
|
1973
|
+
);
|
|
1974
|
+
const doTimer = () => doAction(element, elementName, actionAttr)(eventName, eventType, event2);
|
|
1975
|
+
if (hasOnceAttr) {
|
|
1976
|
+
timerOnce(doTimer, +onceAttr);
|
|
1977
|
+
} else if (hasEveryAttr) {
|
|
1978
|
+
timerEvery(doTimer, +everyAttr);
|
|
1979
|
+
}
|
|
1980
|
+
}
|
|
1981
|
+
});
|
|
1982
|
+
|
|
1983
|
+
// src/actions/trigger-element.ts
|
|
1984
|
+
var triggerElementAction = defineAction({
|
|
1985
|
+
name: FlowActionTypes.TRIGGER_ELEMENT,
|
|
1986
|
+
onTrigger(element, _elementName, actionArgs, event2) {
|
|
1987
|
+
forEach(
|
|
1988
|
+
actionArgs,
|
|
1989
|
+
([actionName, selector]) => forEachNode(
|
|
1990
|
+
element.$shadowEls(EMPTY_STRING, [[RealmAttributeNames.REF, selector]]),
|
|
1991
|
+
(el) => el?.[actionName]?.(event2)
|
|
1992
|
+
)
|
|
1993
|
+
);
|
|
1994
|
+
}
|
|
1995
|
+
});
|
|
1996
|
+
|
|
1997
|
+
// src/flows/listen-event.ts
|
|
1998
|
+
var dispatchEvent = (isRemoveEvent) => (dispatcherElement, eventType, eventName, actions) => {
|
|
1999
|
+
const eventCaller = isRemoveEvent ? dispatcherElement._removeEvent : dispatcherElement._addCustomEvent;
|
|
2000
|
+
const isCustomEvent = eventType === FlowRuntimeEventTypes.ON;
|
|
2001
|
+
const finalEventName = isCustomEvent ? FlowRuntimeEventTypes.ON + COLON + eventName : eventType;
|
|
2002
|
+
eventCaller(
|
|
2003
|
+
finalEventName,
|
|
2004
|
+
(event2) => reqAnim(
|
|
2005
|
+
() => dispatcherElement._sendEvent(FlowEventNames.LISTEN_EVENT, [
|
|
2006
|
+
eventType,
|
|
2007
|
+
eventName,
|
|
2008
|
+
actions,
|
|
2009
|
+
event2
|
|
2010
|
+
])
|
|
2011
|
+
)
|
|
2012
|
+
);
|
|
2013
|
+
};
|
|
2014
|
+
var applyEventListener = (flow, hostElement, applyEventCallback) => forEach(
|
|
2015
|
+
flow,
|
|
2016
|
+
([attrs, actions]) => forEach(
|
|
2017
|
+
attrs,
|
|
2018
|
+
([eventType, eventName]) => applyEventCallback(hostElement, eventType, eventName, actions)
|
|
2019
|
+
)
|
|
2020
|
+
);
|
|
2021
|
+
var listenEventFlow = defineFlow({
|
|
2022
|
+
name: FlowEventNames.LISTEN_EVENT,
|
|
2023
|
+
async onApply(flow, hostElement, dispatcherElement) {
|
|
2024
|
+
applyEventListener(flow, dispatcherElement ?? hostElement, dispatchEvent());
|
|
2025
|
+
},
|
|
2026
|
+
async onRemove(flow, hostElement, dispatcherElement) {
|
|
2027
|
+
applyEventListener(
|
|
2028
|
+
flow,
|
|
2029
|
+
dispatcherElement ?? hostElement,
|
|
2030
|
+
dispatchEvent(true)
|
|
2031
|
+
);
|
|
2032
|
+
}
|
|
2033
|
+
});
|
|
2034
|
+
|
|
2035
|
+
// src/flows/trigger-event.ts
|
|
2036
|
+
var sendTriggerEvent = (dispatcherElement, debounceTimer, debounceTime, eventName, actions) => (event2) => {
|
|
2037
|
+
const [, clearTimeout2] = debounceTimer || [];
|
|
2038
|
+
clearTimeout2?.();
|
|
2039
|
+
const triggerEvent = () => dispatcherElement._sendEvent(FlowEventNames.TRIGGER_EVENT, [
|
|
2040
|
+
EMPTY_STRING,
|
|
2041
|
+
eventName,
|
|
2042
|
+
actions,
|
|
2043
|
+
event2
|
|
2044
|
+
]);
|
|
2045
|
+
if (debounceTime > 0) {
|
|
2046
|
+
debounceTimer = timerOnce(triggerEvent, debounceTime);
|
|
2047
|
+
return;
|
|
2048
|
+
}
|
|
2049
|
+
return triggerEvent();
|
|
2050
|
+
};
|
|
2051
|
+
var dispatchEvent2 = (hostElement, isRemoveEvent) => (dispatcherElement, debounceTime, eventName, actions) => (listenerElement) => {
|
|
2052
|
+
let debounceTimer;
|
|
2053
|
+
const eventCaller = isRemoveEvent ? dispatcherElement._removeEvent : dispatcherElement._addEvent;
|
|
2054
|
+
eventCaller(
|
|
2055
|
+
eventName,
|
|
2056
|
+
sendTriggerEvent(
|
|
2057
|
+
hostElement,
|
|
2058
|
+
debounceTimer,
|
|
2059
|
+
debounceTime,
|
|
2060
|
+
eventName,
|
|
2061
|
+
actions
|
|
2062
|
+
),
|
|
2063
|
+
listenerElement
|
|
2064
|
+
);
|
|
2065
|
+
};
|
|
2066
|
+
var applyTriggerEvent = (flow, hostElement, applyEventCallback) => forEach(flow, ([attrs, actions]) => {
|
|
2067
|
+
const debounceTime = +findAttrFrom(attrs, RealmAttributeNames.DEBOUNCE);
|
|
2068
|
+
forEach(attrs, ([attrName, attrValue]) => {
|
|
2069
|
+
if (attrName === RealmAttributeNames.DEBOUNCE)
|
|
2070
|
+
return;
|
|
2071
|
+
forEachNode(
|
|
2072
|
+
hostElement.$shadowEls(
|
|
2073
|
+
EMPTY_STRING,
|
|
2074
|
+
RealmAttributeNames.REF,
|
|
2075
|
+
attrValue
|
|
2076
|
+
),
|
|
2077
|
+
applyEventCallback(hostElement, debounceTime, attrName, actions)
|
|
2078
|
+
);
|
|
2079
|
+
});
|
|
2080
|
+
});
|
|
2081
|
+
var triggerEventFlow = defineFlow({
|
|
2082
|
+
name: FlowEventNames.TRIGGER_EVENT,
|
|
2083
|
+
async onApply(flow, hostElement, dispatcherElement) {
|
|
2084
|
+
applyTriggerEvent(
|
|
2085
|
+
flow,
|
|
2086
|
+
dispatcherElement ?? hostElement,
|
|
2087
|
+
dispatchEvent2(hostElement)
|
|
2088
|
+
);
|
|
2089
|
+
},
|
|
2090
|
+
async onRemove(flow, hostElement, dispatcherElement) {
|
|
2091
|
+
applyTriggerEvent(
|
|
2092
|
+
flow,
|
|
2093
|
+
dispatcherElement ?? hostElement,
|
|
2094
|
+
dispatchEvent2(hostElement, true)
|
|
2095
|
+
);
|
|
2096
|
+
}
|
|
2097
|
+
});
|
|
2098
|
+
|
|
2099
|
+
// src/elements/element-flow.ts
|
|
2100
|
+
var eventFlowList = [listenEventFlow, triggerEventFlow];
|
|
2101
|
+
var actionList = [
|
|
2102
|
+
httpRequestAction,
|
|
2103
|
+
scriptAction,
|
|
2104
|
+
sendEventAction,
|
|
2105
|
+
setAttrAction,
|
|
2106
|
+
setStateAction,
|
|
2107
|
+
setTimerAction,
|
|
2108
|
+
triggerElementAction
|
|
2109
|
+
];
|
|
2110
|
+
var elementFlow = defineElement({
|
|
2111
|
+
name: RealmTagNames.ELEMENT_FLOW,
|
|
2112
|
+
async onBeforeInit(element) {
|
|
2113
|
+
const parentElement = element.$parent();
|
|
2114
|
+
if (!parentElement)
|
|
2115
|
+
return;
|
|
2116
|
+
const eventFlowOwnerName = element.$attr(
|
|
2117
|
+
RealmAttributeNames.NAME,
|
|
2118
|
+
parentElement
|
|
2119
|
+
);
|
|
2120
|
+
for (const registerAction of actionList)
|
|
2121
|
+
await registerAction();
|
|
2122
|
+
for (const [registerEventFlow] of eventFlowList)
|
|
2123
|
+
await registerEventFlow(eventFlowOwnerName, element);
|
|
2124
|
+
},
|
|
2125
|
+
async onMounted(element) {
|
|
2126
|
+
const parentNode = element.$parentNode();
|
|
2127
|
+
const isValidParentNode = parentNode instanceof ShadowRoot;
|
|
2128
|
+
if (!isValidParentNode)
|
|
2129
|
+
return;
|
|
2130
|
+
const hostElement = element.$host();
|
|
2131
|
+
for (const [, applyEventFlow] of eventFlowList)
|
|
2132
|
+
await applyEventFlow(hostElement);
|
|
2133
|
+
element._remove();
|
|
2134
|
+
}
|
|
2135
|
+
});
|
|
2136
|
+
|
|
2137
|
+
// src/elements/repeat-list.ts
|
|
2138
|
+
var repeatListElement = defineElement({
|
|
2139
|
+
name: RealmTagNames.REPEAT_LIST,
|
|
2140
|
+
onBeforeInit(element) {
|
|
2141
|
+
const fragment = element._createFragment();
|
|
2142
|
+
forEach(element.$nodes(), (node) => {
|
|
2143
|
+
element._append(element.$clone(node), fragment);
|
|
2144
|
+
element._remove(node);
|
|
2145
|
+
});
|
|
2146
|
+
element._attach();
|
|
2147
|
+
element._clear();
|
|
2148
|
+
const hostElement = element.$host();
|
|
2149
|
+
if (!hostElement)
|
|
2150
|
+
return;
|
|
2151
|
+
const ofAttr = element.$attr(RealmAttributeNames.OF);
|
|
2152
|
+
const dataSource = strSlice(ofAttr);
|
|
2153
|
+
if (!dataSource)
|
|
2154
|
+
return;
|
|
2155
|
+
const hostElementStates = hostElement?.states;
|
|
2156
|
+
const hostElementStatesRegistry = hostElement.statesRegistry;
|
|
2157
|
+
const hostElementAttrsRegistry = hostElement.attrsRegistry;
|
|
2158
|
+
const removeElementFlow = async () => {
|
|
2159
|
+
for (const [, , removeEventFlow] of eventFlowList)
|
|
2160
|
+
await removeEventFlow(hostElement, element);
|
|
2161
|
+
};
|
|
2162
|
+
const updateElementFlow = async () => {
|
|
2163
|
+
for (const [, applyEventFlow] of eventFlowList)
|
|
2164
|
+
await applyEventFlow(hostElement, element);
|
|
2165
|
+
};
|
|
2166
|
+
const updateIterableContent = (entries) => {
|
|
2167
|
+
const elementShadow = element.$shadow();
|
|
2168
|
+
element._clear();
|
|
2169
|
+
element._clear(elementShadow);
|
|
2170
|
+
forEach(entries, (item, index) => {
|
|
2171
|
+
element._append(
|
|
2172
|
+
element.$clone(fragment),
|
|
2173
|
+
elementShadow
|
|
2174
|
+
);
|
|
2175
|
+
const elementAttrBindings2 = getElementAttrBindings(element);
|
|
2176
|
+
forEach(
|
|
2177
|
+
toDotNotation(item),
|
|
2178
|
+
(name) => bindElement(
|
|
2179
|
+
element,
|
|
2180
|
+
RealmMutableAttr.SRC,
|
|
2181
|
+
elementAttrBindings2,
|
|
2182
|
+
name,
|
|
2183
|
+
item,
|
|
2184
|
+
false
|
|
2185
|
+
)
|
|
2186
|
+
);
|
|
2187
|
+
const meta = { index, length: entries.length };
|
|
2188
|
+
forEach(
|
|
2189
|
+
toDotNotation(meta, META_PREFIX),
|
|
2190
|
+
(name) => bindElement(
|
|
2191
|
+
element,
|
|
2192
|
+
RealmMutableAttr.META,
|
|
2193
|
+
elementAttrBindings2,
|
|
2194
|
+
name,
|
|
2195
|
+
meta,
|
|
2196
|
+
false
|
|
2197
|
+
)
|
|
2198
|
+
);
|
|
2199
|
+
});
|
|
2200
|
+
const elementAttrBindings = getElementAttrBindings(element);
|
|
2201
|
+
forEach(
|
|
2202
|
+
createArray([
|
|
2203
|
+
[hostElementStatesRegistry, RealmMutableAttr.STATE],
|
|
2204
|
+
[hostElementAttrsRegistry, RealmMutableAttr.ATTR]
|
|
2205
|
+
]),
|
|
2206
|
+
([registry, dataType]) => forEach(registry, ([mutateName]) => {
|
|
2207
|
+
const valueLookup = {
|
|
2208
|
+
[RealmMutableAttr.ATTR]: () => hostElement.$attr(mutateName),
|
|
2209
|
+
[RealmMutableAttr.STATE]: () => hostElementStates.get(mutateName)
|
|
2210
|
+
};
|
|
2211
|
+
bindElement(
|
|
2212
|
+
element,
|
|
2213
|
+
dataType,
|
|
2214
|
+
elementAttrBindings,
|
|
2215
|
+
mutateName,
|
|
2216
|
+
valueLookup[dataType](),
|
|
2217
|
+
false
|
|
2218
|
+
);
|
|
2219
|
+
})
|
|
2220
|
+
);
|
|
2221
|
+
};
|
|
2222
|
+
forEach(
|
|
2223
|
+
createArray([
|
|
2224
|
+
[hostElement, RealmMutableAttr.ATTR],
|
|
2225
|
+
[hostElementStates, RealmMutableAttr.STATE],
|
|
2226
|
+
[getGlobalState(), RealmMutableAttr.STATE, true]
|
|
2227
|
+
]),
|
|
2228
|
+
([mutator, mutateType, isGlobalState]) => {
|
|
2229
|
+
mutator.subscribe(
|
|
2230
|
+
async (mutatorName, value) => {
|
|
2231
|
+
const isValidIterableSource = isArray(value) && mutatorName === dataSource;
|
|
2232
|
+
if (!isValidIterableSource)
|
|
2233
|
+
return bindElement(
|
|
2234
|
+
element,
|
|
2235
|
+
mutateType,
|
|
2236
|
+
getElementAttrBindings(element),
|
|
2237
|
+
mutatorName,
|
|
2238
|
+
value,
|
|
2239
|
+
isGlobalState,
|
|
2240
|
+
true
|
|
2241
|
+
);
|
|
2242
|
+
await removeElementFlow();
|
|
2243
|
+
updateIterableContent(value);
|
|
2244
|
+
await updateElementFlow();
|
|
2245
|
+
}
|
|
2246
|
+
);
|
|
2247
|
+
}
|
|
2248
|
+
);
|
|
2249
|
+
}
|
|
2250
|
+
});
|
|
2251
|
+
|
|
2252
|
+
// src/elements/web-app.ts
|
|
2253
|
+
var webAppElement = defineElement({
|
|
2254
|
+
name: RealmTagNames.WEB_APP,
|
|
2255
|
+
onMounted(element) {
|
|
2256
|
+
element._attr(RealmAttributeNames.IS_LOADED, true);
|
|
2257
|
+
}
|
|
2258
|
+
});
|
|
2259
|
+
|
|
2260
|
+
// src/elements/core-element.ts
|
|
2261
|
+
var HTML_REGISTRY = createMap();
|
|
2262
|
+
var STYLE_REGISTRY = createMap();
|
|
2263
|
+
var ELEMENT_FLOW_REGISTRY = createMap();
|
|
2264
|
+
var SCRIPT_REGISTRY = createMap();
|
|
2265
|
+
var LINK_STYLE_REGISTRY = createMap();
|
|
2266
|
+
var registerElement = (elementName) => defineElement({
|
|
2267
|
+
name: elementName,
|
|
2268
|
+
onBeforeRegister() {
|
|
2269
|
+
const element = $el(doc)(
|
|
2270
|
+
RealmTagNames.CUSTOM_ELEMENT,
|
|
2271
|
+
RealmAttributeNames.NAME,
|
|
2272
|
+
elementName
|
|
2273
|
+
);
|
|
2274
|
+
const template = $el(element)(
|
|
2275
|
+
RealmTagNames.TEMPLATE
|
|
2276
|
+
);
|
|
2277
|
+
setMap(HTML_REGISTRY, elementName, template);
|
|
2278
|
+
if (template) {
|
|
2279
|
+
forEachNode(
|
|
2280
|
+
$els(template.content)(RealmTagNames.STYLE),
|
|
2281
|
+
(style) => setMap(STYLE_REGISTRY, elementName, style)
|
|
2282
|
+
);
|
|
2283
|
+
}
|
|
2284
|
+
forEach(
|
|
2285
|
+
[
|
|
2286
|
+
[RealmTagNames.ELEMENT_FLOW, ELEMENT_FLOW_REGISTRY],
|
|
2287
|
+
[RealmTagNames.IMPORT_SCRIPT, SCRIPT_REGISTRY],
|
|
2288
|
+
[RealmTagNames.IMPORT_STYLE, LINK_STYLE_REGISTRY]
|
|
2289
|
+
],
|
|
2290
|
+
([tagName, registry]) => {
|
|
2291
|
+
setMap(
|
|
2292
|
+
registry,
|
|
2293
|
+
elementName,
|
|
2294
|
+
createSet(createArray($els(element)(tagName)))
|
|
2295
|
+
);
|
|
2296
|
+
}
|
|
2297
|
+
);
|
|
2298
|
+
},
|
|
2299
|
+
onBeforeInit(element) {
|
|
2300
|
+
element._attach();
|
|
2301
|
+
element._renderStyle(getMap(STYLE_REGISTRY, elementName));
|
|
2302
|
+
element._renderTemplate(getMap(HTML_REGISTRY, elementName));
|
|
2303
|
+
forEach(
|
|
2304
|
+
[ELEMENT_FLOW_REGISTRY, SCRIPT_REGISTRY, LINK_STYLE_REGISTRY],
|
|
2305
|
+
(registry) => forEach(getMap(registry, elementName), element._renderShadow)
|
|
2306
|
+
);
|
|
2307
|
+
const slotChildren = element.$shadowEl(
|
|
2308
|
+
RealmTagNames.SLOT,
|
|
2309
|
+
[[RealmAttributeNames.CHILDREN]]
|
|
2310
|
+
);
|
|
2311
|
+
const slottedChildren = arrayReduce2(
|
|
2312
|
+
element.$nodes(),
|
|
2313
|
+
(acc, childElement) => {
|
|
2314
|
+
const slotName = element.$attr(
|
|
2315
|
+
RealmAttributeNames.SLOT,
|
|
2316
|
+
childElement
|
|
2317
|
+
);
|
|
2318
|
+
if (slotName) {
|
|
2319
|
+
element._slotTo(
|
|
2320
|
+
element.$shadowEl(RealmTagNames.SLOT, [
|
|
2321
|
+
[RealmAttributeNames.NAME, slotName]
|
|
2322
|
+
]),
|
|
2323
|
+
[childElement]
|
|
2324
|
+
);
|
|
2325
|
+
return acc;
|
|
2326
|
+
}
|
|
2327
|
+
return [...acc, childElement];
|
|
2328
|
+
},
|
|
2329
|
+
[]
|
|
2330
|
+
);
|
|
2331
|
+
element._slotTo(slotChildren, slottedChildren);
|
|
2332
|
+
const bindingElements = getElementAttrBindings(element);
|
|
2333
|
+
const attributesRegistry = getAttrRegistry(elementName);
|
|
2334
|
+
const statesRegistry = getStateRegistry(elementName);
|
|
2335
|
+
forEach(
|
|
2336
|
+
createArray([
|
|
2337
|
+
[createArray(attributesRegistry), RealmMutableAttr.ATTR],
|
|
2338
|
+
[createArray(statesRegistry), RealmMutableAttr.STATE],
|
|
2339
|
+
[getGlobalStateRegistry(), RealmMutableAttr.STATE, true]
|
|
2340
|
+
]),
|
|
2341
|
+
([registry, dataType, isGlobalState]) => forEach(registry, ([mutateName, valueType, value]) => {
|
|
2342
|
+
const getParsedValue = () => parseValue(valueType, value);
|
|
2343
|
+
const getValueFromSource = () => getValueFrom(value, mutateName);
|
|
2344
|
+
const valueLookup = {
|
|
2345
|
+
[RealmMutableAttr.ATTR]: () => element.$attr(mutateName) ?? getParsedValue(),
|
|
2346
|
+
[RealmMutableAttr.STATE]: getParsedValue,
|
|
2347
|
+
[RealmMutableAttr.SRC]: getValueFromSource,
|
|
2348
|
+
[RealmMutableAttr.META]: getValueFromSource
|
|
2349
|
+
};
|
|
2350
|
+
if (dataType === RealmMutableAttr.ATTR)
|
|
2351
|
+
addSet(element.attrsRegistry, [mutateName, valueType, value]);
|
|
2352
|
+
if (!isGlobalState && dataType === RealmMutableAttr.STATE)
|
|
2353
|
+
addSet(element.statesRegistry, [mutateName, valueType, value]);
|
|
2354
|
+
bindElement(
|
|
2355
|
+
element,
|
|
2356
|
+
dataType,
|
|
2357
|
+
bindingElements,
|
|
2358
|
+
mutateName,
|
|
2359
|
+
valueLookup[dataType](),
|
|
2360
|
+
isGlobalState
|
|
2361
|
+
);
|
|
2362
|
+
})
|
|
2363
|
+
);
|
|
2364
|
+
forEach(
|
|
2365
|
+
createArray([
|
|
2366
|
+
[element, RealmMutableAttr.ATTR],
|
|
2367
|
+
[element.states, RealmMutableAttr.STATE, false],
|
|
2368
|
+
[getGlobalState(), RealmMutableAttr.STATE, true]
|
|
2369
|
+
]),
|
|
2370
|
+
([mutator, mutateType, globalState2]) => mutator.subscribe((mutatorName, value, oldValue) => {
|
|
2371
|
+
const eventDetail = [mutatorName, value, oldValue];
|
|
2372
|
+
if (mutateType === RealmMutableAttr.STATE)
|
|
2373
|
+
arrayPush(eventDetail, globalState2);
|
|
2374
|
+
element._sendEvent(
|
|
2375
|
+
FlowRuntimeMutableEventTypesLookup[mutateType],
|
|
2376
|
+
eventDetail
|
|
2377
|
+
);
|
|
2378
|
+
bindElement(
|
|
2379
|
+
element,
|
|
2380
|
+
mutateType,
|
|
2381
|
+
bindingElements,
|
|
2382
|
+
mutatorName,
|
|
2383
|
+
value,
|
|
2384
|
+
globalState2,
|
|
2385
|
+
true
|
|
2386
|
+
);
|
|
2387
|
+
})
|
|
2388
|
+
);
|
|
2389
|
+
const actionTrigger2 = createActionTrigger(element);
|
|
2390
|
+
forEach(
|
|
2391
|
+
entriesOf(FlowEventNames),
|
|
2392
|
+
([, flowName]) => element._addCustomEvent(
|
|
2393
|
+
flowName,
|
|
2394
|
+
([eventType, eventName, actions, event2]) => actionTrigger2(actions)(eventType, eventName, event2)
|
|
2395
|
+
)
|
|
2396
|
+
);
|
|
2397
|
+
},
|
|
2398
|
+
onMounted(element) {
|
|
2399
|
+
element._sendEvent(FlowRuntimeEventTypes.MOUNTED);
|
|
2400
|
+
},
|
|
2401
|
+
onUnmounted(element) {
|
|
2402
|
+
element._sendEvent(FlowRuntimeEventTypes.UNMOUNTED);
|
|
2403
|
+
}
|
|
2404
|
+
});
|
|
2405
|
+
|
|
2406
|
+
// src/elements/custom-element.ts
|
|
2407
|
+
var customElement = defineElement({
|
|
2408
|
+
name: RealmTagNames.CUSTOM_ELEMENT,
|
|
2409
|
+
/**
|
|
2410
|
+
* Preparing attributes and states for `custom-element` element
|
|
2411
|
+
* @param element RealmElement
|
|
2412
|
+
*/
|
|
2413
|
+
onBeforeInit(element) {
|
|
2414
|
+
const mutableStores = [
|
|
2415
|
+
[RealmTagNames.ELEMENT_ATTR, setAttrRegistry],
|
|
2416
|
+
[RealmTagNames.ELEMENT_STATE, setStateRegistry]
|
|
2417
|
+
];
|
|
2418
|
+
const customElementName = element.$attr(RealmAttributeNames.NAME);
|
|
2419
|
+
for (const [tagName, setRegistry] of mutableStores) {
|
|
2420
|
+
const attrs = getCustomElementAttrs(element, tagName);
|
|
2421
|
+
if (attrs)
|
|
2422
|
+
setRegistry(customElementName, attrs);
|
|
2423
|
+
removeCustomElementAttrs(element, tagName);
|
|
2424
|
+
}
|
|
2425
|
+
},
|
|
2426
|
+
/**
|
|
2427
|
+
* Initializing custom element
|
|
2428
|
+
* @param element RealmElement
|
|
2429
|
+
*/
|
|
2430
|
+
onInit(element) {
|
|
2431
|
+
registerElement(element.$attr(RealmAttributeNames.NAME)).call(this);
|
|
2432
|
+
},
|
|
2433
|
+
/**
|
|
2434
|
+
* Mounting custom element
|
|
2435
|
+
* @param element RealmElement
|
|
2436
|
+
*/
|
|
2437
|
+
onMounted(element) {
|
|
2438
|
+
element._remove();
|
|
2439
|
+
}
|
|
2440
|
+
});
|
|
2441
|
+
|
|
2442
|
+
// src/index.ts
|
|
2443
|
+
var ASYNC_ELEMENT = [
|
|
2444
|
+
importElement,
|
|
2445
|
+
importScriptElement,
|
|
2446
|
+
importStyleElement,
|
|
2447
|
+
repeatListElement,
|
|
2448
|
+
isVisibleElement,
|
|
2449
|
+
isHiddenElement,
|
|
2450
|
+
elementFlow
|
|
2451
|
+
];
|
|
2452
|
+
var SYNC_ELEMENT = [globalStateElement, customElement, webAppElement];
|
|
2453
|
+
(async () => {
|
|
2454
|
+
for (const defineElement2 of ASYNC_ELEMENT)
|
|
2455
|
+
await defineElement2();
|
|
2456
|
+
for (const defineElement2 of SYNC_ELEMENT)
|
|
2457
|
+
defineElement2();
|
|
2458
|
+
})();
|