@realmorg/realm 0.0.18 → 2.0.0-alpha.2

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