@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.
@@ -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
+ })();