@oscarpalmer/abydon 0.17.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abydon.full.mjs +304 -90
- package/dist/constants.d.mts +20 -1
- package/dist/constants.mjs +24 -5
- package/dist/fragments.mjs +4 -4
- package/dist/helpers/dom.d.mts +2 -1
- package/dist/helpers/dom.mjs +4 -1
- package/dist/helpers/index.d.mts +2 -1
- package/dist/helpers/index.mjs +3 -6
- package/dist/node/attribute/index.mjs +12 -2
- package/dist/node/attribute/value.mjs +3 -3
- package/dist/node/event.mjs +3 -3
- package/dist/node/index.mjs +24 -2
- package/dist/node/value.mjs +2 -1
- package/package.json +3 -4
- package/src/constants.ts +42 -4
- package/src/fragment.ts +2 -2
- package/src/fragments.ts +10 -4
- package/src/helpers/dom.ts +4 -0
- package/src/helpers/index.ts +13 -10
- package/src/node/attribute/index.ts +27 -1
- package/src/node/attribute/value.ts +11 -6
- package/src/node/event.ts +9 -4
- package/src/node/index.ts +54 -2
- package/src/node/value.ts +3 -2
package/dist/constants.d.mts
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
//#region src/constants.d.ts
|
|
2
|
+
declare const ARRAY_COMPARISON_ADDED = "added";
|
|
3
|
+
declare const ARRAY_COMPARISON_DISSIMILAR = "dissimilar";
|
|
4
|
+
declare const ARRAY_COMPARISON_REMOVED = "removed";
|
|
2
5
|
declare const ATTRIBUTE_CLASS_PREFIX_LENGTH = 6;
|
|
6
|
+
declare const ATTRIBUTE_NAME_DELIMITER = ".";
|
|
7
|
+
declare const ERROR_FRAGMENT = "Fragment function must return a Fragment instance";
|
|
8
|
+
declare const ERROR_IDENTIFIER_DUPLICATE = "Duplicate identifier found: '<id>'";
|
|
9
|
+
declare const ERROR_IDENTIFIER_TYPE = "Identifier cannot be null or undefined";
|
|
10
|
+
declare const EVENT_CHANGE = "change";
|
|
11
|
+
declare const EVENT_INPUT = "input";
|
|
12
|
+
declare const EVENT_SUBMIT = "submit";
|
|
3
13
|
declare const EVENT_DEFAULTS: Record<string, string>;
|
|
14
|
+
declare const EVENT_ON_PREFIXED = "@on";
|
|
15
|
+
declare const EVENT_ON_VALUE = "on";
|
|
16
|
+
declare const EVENT_OPTIONS_DELIMITER = ":";
|
|
4
17
|
declare const EXPRESSION_ABYDON_ATTRIBUTE_FULL: RegExp;
|
|
5
18
|
declare const EXPRESSION_ABYDON_ATTRIBUTE_PREFIX: RegExp;
|
|
6
19
|
declare const EXPRESSION_ABYDON_CONTENT: RegExp;
|
|
@@ -14,7 +27,13 @@ declare const EXPRESSION_EVENT_OPTIONS_CAPTURE: RegExp;
|
|
|
14
27
|
declare const EXPRESSION_EVENT_OPTIONS_ONCE: RegExp;
|
|
15
28
|
declare const EXPRESSION_EVENT_PREFIX: RegExp;
|
|
16
29
|
declare const EXPRESSION_PERIOD: RegExp;
|
|
30
|
+
declare const EXPRESSION_TEXTAREA_VALUE: RegExp;
|
|
31
|
+
declare const INPUT_TYPE_CHECKBOX = "checkbox";
|
|
17
32
|
declare const NAME_FRAGMENT = "$fragment";
|
|
18
33
|
declare const NAME_FRAGMENTS = "$fragments";
|
|
34
|
+
declare const PROPERTY_CHECKED = "checked";
|
|
35
|
+
declare const PROPERTY_IDENTIFIER = "identifier";
|
|
36
|
+
declare const PROPERTY_VALUE = "value";
|
|
37
|
+
declare const TEMPLATE_ITEM = "<>";
|
|
19
38
|
//#endregion
|
|
20
|
-
export { ATTRIBUTE_CLASS_PREFIX_LENGTH, EVENT_DEFAULTS, EXPRESSION_ABYDON_ATTRIBUTE_FULL, EXPRESSION_ABYDON_ATTRIBUTE_PREFIX, EXPRESSION_ABYDON_CONTENT, EXPRESSION_ATTRIBUTE_CLASS, EXPRESSION_ATTRIBUTE_STYLE_FULL, EXPRESSION_ATTRIBUTE_STYLE_PREFIX, EXPRESSION_EVENT_CHANGE_TYPES, EXPRESSION_EVENT_NAME, EXPRESSION_EVENT_OPTIONS_ACTIVE, EXPRESSION_EVENT_OPTIONS_CAPTURE, EXPRESSION_EVENT_OPTIONS_ONCE, EXPRESSION_EVENT_PREFIX, EXPRESSION_PERIOD, NAME_FRAGMENT, NAME_FRAGMENTS };
|
|
39
|
+
export { ARRAY_COMPARISON_ADDED, ARRAY_COMPARISON_DISSIMILAR, ARRAY_COMPARISON_REMOVED, ATTRIBUTE_CLASS_PREFIX_LENGTH, ATTRIBUTE_NAME_DELIMITER, ERROR_FRAGMENT, ERROR_IDENTIFIER_DUPLICATE, ERROR_IDENTIFIER_TYPE, EVENT_CHANGE, EVENT_DEFAULTS, EVENT_INPUT, EVENT_ON_PREFIXED, EVENT_ON_VALUE, EVENT_OPTIONS_DELIMITER, EVENT_SUBMIT, EXPRESSION_ABYDON_ATTRIBUTE_FULL, EXPRESSION_ABYDON_ATTRIBUTE_PREFIX, EXPRESSION_ABYDON_CONTENT, EXPRESSION_ATTRIBUTE_CLASS, EXPRESSION_ATTRIBUTE_STYLE_FULL, EXPRESSION_ATTRIBUTE_STYLE_PREFIX, EXPRESSION_EVENT_CHANGE_TYPES, EXPRESSION_EVENT_NAME, EXPRESSION_EVENT_OPTIONS_ACTIVE, EXPRESSION_EVENT_OPTIONS_CAPTURE, EXPRESSION_EVENT_OPTIONS_ONCE, EXPRESSION_EVENT_PREFIX, EXPRESSION_PERIOD, EXPRESSION_TEXTAREA_VALUE, INPUT_TYPE_CHECKBOX, NAME_FRAGMENT, NAME_FRAGMENTS, PROPERTY_CHECKED, PROPERTY_IDENTIFIER, PROPERTY_VALUE, TEMPLATE_ITEM };
|
package/dist/constants.mjs
CHANGED
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
//#region src/constants.ts
|
|
2
|
+
const ARRAY_COMPARISON_ADDED = "added";
|
|
3
|
+
const ARRAY_COMPARISON_DISSIMILAR = "dissimilar";
|
|
4
|
+
const ARRAY_COMPARISON_REMOVED = "removed";
|
|
2
5
|
const ATTRIBUTE_CLASS_PREFIX_LENGTH = 6;
|
|
6
|
+
const ATTRIBUTE_NAME_DELIMITER = ".";
|
|
7
|
+
const ERROR_FRAGMENT = "Fragment function must return a Fragment instance";
|
|
8
|
+
const ERROR_IDENTIFIER_DUPLICATE = "Duplicate identifier found: '<id>'";
|
|
9
|
+
const ERROR_IDENTIFIER_TYPE = "Identifier cannot be null or undefined";
|
|
10
|
+
const EVENT_CHANGE = "change";
|
|
11
|
+
const EVENT_INPUT = "input";
|
|
12
|
+
const EVENT_SUBMIT = "submit";
|
|
3
13
|
const EVENT_DEFAULTS = {
|
|
4
14
|
A: "click",
|
|
5
15
|
BUTTON: "click",
|
|
6
16
|
DETAILS: "toggle",
|
|
7
|
-
FORM:
|
|
8
|
-
SELECT:
|
|
9
|
-
TEXTAREA:
|
|
17
|
+
FORM: EVENT_SUBMIT,
|
|
18
|
+
SELECT: EVENT_CHANGE,
|
|
19
|
+
TEXTAREA: EVENT_INPUT
|
|
10
20
|
};
|
|
11
|
-
const
|
|
21
|
+
const EVENT_ON_PREFIXED = "@on";
|
|
22
|
+
const EVENT_ON_VALUE = "on";
|
|
23
|
+
const EVENT_OPTIONS_DELIMITER = ":";
|
|
24
|
+
const EXPRESSION_ABYDON_ATTRIBUTE_FULL = /(@?[\w-]+)="<!--abydon.(\d+)-->"/g;
|
|
12
25
|
const EXPRESSION_ABYDON_ATTRIBUTE_PREFIX = /^_/;
|
|
13
26
|
const EXPRESSION_ABYDON_CONTENT = /^@?abydon\.(\d+)@?$/;
|
|
14
27
|
const EXPRESSION_ATTRIBUTE_CLASS = /^class\./;
|
|
@@ -21,7 +34,13 @@ const EXPRESSION_EVENT_OPTIONS_CAPTURE = /^c(apture)$/i;
|
|
|
21
34
|
const EXPRESSION_EVENT_OPTIONS_ONCE = /^o(nce)$/i;
|
|
22
35
|
const EXPRESSION_EVENT_PREFIX = /^@/;
|
|
23
36
|
const EXPRESSION_PERIOD = /\./;
|
|
37
|
+
const EXPRESSION_TEXTAREA_VALUE = /<!--abydon\.(\d+)-->/;
|
|
38
|
+
const INPUT_TYPE_CHECKBOX = "checkbox";
|
|
24
39
|
const NAME_FRAGMENT = "$fragment";
|
|
25
40
|
const NAME_FRAGMENTS = "$fragments";
|
|
41
|
+
const PROPERTY_CHECKED = "checked";
|
|
42
|
+
const PROPERTY_IDENTIFIER = "identifier";
|
|
43
|
+
const PROPERTY_VALUE = "value";
|
|
44
|
+
const TEMPLATE_ITEM = "<>";
|
|
26
45
|
//#endregion
|
|
27
|
-
export { ATTRIBUTE_CLASS_PREFIX_LENGTH, EVENT_DEFAULTS, EXPRESSION_ABYDON_ATTRIBUTE_FULL, EXPRESSION_ABYDON_ATTRIBUTE_PREFIX, EXPRESSION_ABYDON_CONTENT, EXPRESSION_ATTRIBUTE_CLASS, EXPRESSION_ATTRIBUTE_STYLE_FULL, EXPRESSION_ATTRIBUTE_STYLE_PREFIX, EXPRESSION_EVENT_CHANGE_TYPES, EXPRESSION_EVENT_NAME, EXPRESSION_EVENT_OPTIONS_ACTIVE, EXPRESSION_EVENT_OPTIONS_CAPTURE, EXPRESSION_EVENT_OPTIONS_ONCE, EXPRESSION_EVENT_PREFIX, EXPRESSION_PERIOD, NAME_FRAGMENT, NAME_FRAGMENTS };
|
|
46
|
+
export { ARRAY_COMPARISON_ADDED, ARRAY_COMPARISON_DISSIMILAR, ARRAY_COMPARISON_REMOVED, ATTRIBUTE_CLASS_PREFIX_LENGTH, ATTRIBUTE_NAME_DELIMITER, ERROR_FRAGMENT, ERROR_IDENTIFIER_DUPLICATE, ERROR_IDENTIFIER_TYPE, EVENT_CHANGE, EVENT_DEFAULTS, EVENT_INPUT, EVENT_ON_PREFIXED, EVENT_ON_VALUE, EVENT_OPTIONS_DELIMITER, EVENT_SUBMIT, EXPRESSION_ABYDON_ATTRIBUTE_FULL, EXPRESSION_ABYDON_ATTRIBUTE_PREFIX, EXPRESSION_ABYDON_CONTENT, EXPRESSION_ATTRIBUTE_CLASS, EXPRESSION_ATTRIBUTE_STYLE_FULL, EXPRESSION_ATTRIBUTE_STYLE_PREFIX, EXPRESSION_EVENT_CHANGE_TYPES, EXPRESSION_EVENT_NAME, EXPRESSION_EVENT_OPTIONS_ACTIVE, EXPRESSION_EVENT_OPTIONS_CAPTURE, EXPRESSION_EVENT_OPTIONS_ONCE, EXPRESSION_EVENT_PREFIX, EXPRESSION_PERIOD, EXPRESSION_TEXTAREA_VALUE, INPUT_TYPE_CHECKBOX, NAME_FRAGMENT, NAME_FRAGMENTS, PROPERTY_CHECKED, PROPERTY_IDENTIFIER, PROPERTY_VALUE, TEMPLATE_ITEM };
|
package/dist/fragments.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NAME_FRAGMENTS } from "./constants.mjs";
|
|
1
|
+
import { ERROR_FRAGMENT, ERROR_IDENTIFIER_DUPLICATE, ERROR_IDENTIFIER_TYPE, NAME_FRAGMENTS } from "./constants.mjs";
|
|
2
2
|
import { isFragment, isFragments } from "./helpers/index.mjs";
|
|
3
3
|
import { getString } from "@oscarpalmer/atoms/string";
|
|
4
4
|
import { array } from "@oscarpalmer/mora";
|
|
@@ -36,13 +36,13 @@ function handleItems(state, items) {
|
|
|
36
36
|
for (let index = 0; index < length; index += 1) {
|
|
37
37
|
const item = items[index];
|
|
38
38
|
const identifier = state.identify(item);
|
|
39
|
-
if (identifier == null) throw new
|
|
39
|
+
if (identifier == null) throw new TypeError(ERROR_IDENTIFIER_TYPE);
|
|
40
40
|
const key = getString(identifier);
|
|
41
|
-
if (keys.has(key)) throw new Error(
|
|
41
|
+
if (keys.has(key)) throw new Error(ERROR_IDENTIFIER_DUPLICATE.replace("<>", key));
|
|
42
42
|
let instance = state.instances[key];
|
|
43
43
|
if (instance == null) {
|
|
44
44
|
instance = state.fragment(item);
|
|
45
|
-
if (!isFragment(instance)) throw new Error(
|
|
45
|
+
if (!isFragment(instance)) throw new Error(ERROR_FRAGMENT);
|
|
46
46
|
}
|
|
47
47
|
instance.identify(key);
|
|
48
48
|
state.instances[key] = instance;
|
package/dist/helpers/dom.d.mts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
//#region src/helpers/dom.d.ts
|
|
2
2
|
declare function createNodes(value: unknown): ChildNode[];
|
|
3
|
+
declare function isInputElement(node: Node): node is HTMLInputElement | HTMLSelectElement;
|
|
3
4
|
declare function removeNodes(nodes: ChildNode[]): void;
|
|
4
5
|
declare function replaceNodes(from: ChildNode[], to: ChildNode[]): void;
|
|
5
6
|
//#endregion
|
|
6
|
-
export { createNodes, removeNodes, replaceNodes };
|
|
7
|
+
export { createNodes, isInputElement, removeNodes, replaceNodes };
|
package/dist/helpers/dom.mjs
CHANGED
|
@@ -7,6 +7,9 @@ function createNodes(value) {
|
|
|
7
7
|
if (isChildNode(value)) return [value];
|
|
8
8
|
return [new Text(getString(value))];
|
|
9
9
|
}
|
|
10
|
+
function isInputElement(node) {
|
|
11
|
+
return node instanceof HTMLInputElement || node instanceof HTMLSelectElement;
|
|
12
|
+
}
|
|
10
13
|
function removeNodes(nodes) {
|
|
11
14
|
const { length } = nodes;
|
|
12
15
|
for (let index = 0; index < length; index += 1) nodes[index].remove();
|
|
@@ -17,4 +20,4 @@ function replaceNodes(from, to) {
|
|
|
17
20
|
for (let index = 1; index < length; index += 1) from[index].remove();
|
|
18
21
|
}
|
|
19
22
|
//#endregion
|
|
20
|
-
export { createNodes, removeNodes, replaceNodes };
|
|
23
|
+
export { createNodes, isInputElement, removeNodes, replaceNodes };
|
package/dist/helpers/index.d.mts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { ARRAY_COMPARISON_ADDED, ARRAY_COMPARISON_DISSIMILAR, ARRAY_COMPARISON_REMOVED } from "../constants.mjs";
|
|
1
2
|
import { t as Fragment } from "../fragment-9qTBAvtR.mjs";
|
|
2
3
|
import { Fragments } from "../fragments.mjs";
|
|
3
4
|
|
|
4
5
|
//#region src/helpers/index.d.ts
|
|
5
|
-
declare function compareArrays(first: unknown[], second: unknown[]):
|
|
6
|
+
declare function compareArrays(first: unknown[], second: unknown[]): typeof ARRAY_COMPARISON_ADDED | typeof ARRAY_COMPARISON_DISSIMILAR | typeof ARRAY_COMPARISON_REMOVED;
|
|
6
7
|
declare function isFragment(value: unknown): value is Fragment;
|
|
7
8
|
declare function isFragments(value: unknown): value is Fragments;
|
|
8
9
|
//#endregion
|
package/dist/helpers/index.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { NAME_FRAGMENT, NAME_FRAGMENTS } from "../constants.mjs";
|
|
1
|
+
import { ARRAY_COMPARISON_ADDED, ARRAY_COMPARISON_DISSIMILAR, ARRAY_COMPARISON_REMOVED, NAME_FRAGMENT, NAME_FRAGMENTS } from "../constants.mjs";
|
|
2
2
|
//#region src/helpers/index.ts
|
|
3
3
|
function compareArrays(first, second) {
|
|
4
4
|
const firstIsLarger = first.length > second.length;
|
|
5
5
|
const from = firstIsLarger ? first : second;
|
|
6
6
|
const to = firstIsLarger ? second : first;
|
|
7
|
-
if (!from.filter((key) => to.includes(key)).every((key, index) => to[index] === key)) return
|
|
8
|
-
return firstIsLarger ?
|
|
7
|
+
if (!from.filter((key) => to.includes(key)).every((key, index) => to[index] === key)) return ARRAY_COMPARISON_DISSIMILAR;
|
|
8
|
+
return firstIsLarger ? ARRAY_COMPARISON_REMOVED : ARRAY_COMPARISON_ADDED;
|
|
9
9
|
}
|
|
10
10
|
function isFragment(value) {
|
|
11
11
|
return isNamed(value, NAME_FRAGMENT);
|
|
@@ -16,8 +16,5 @@ function isFragments(value) {
|
|
|
16
16
|
function isNamed(value, name) {
|
|
17
17
|
return typeof value === "object" && value != null && name in value && value[name] === true;
|
|
18
18
|
}
|
|
19
|
-
const COMPARISON_ADDED = "added";
|
|
20
|
-
const COMPARISON_DISSIMILAR = "dissimilar";
|
|
21
|
-
const COMPARISON_REMOVED = "removed";
|
|
22
19
|
//#endregion
|
|
23
20
|
export { compareArrays, isFragment, isFragments };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { EXPRESSION_ABYDON_ATTRIBUTE_PREFIX, EXPRESSION_ABYDON_CONTENT, EXPRESSION_EVENT_PREFIX, EXPRESSION_PERIOD } from "../../constants.mjs";
|
|
1
|
+
import { EXPRESSION_ABYDON_ATTRIBUTE_PREFIX, EXPRESSION_ABYDON_CONTENT, EXPRESSION_EVENT_PREFIX, EXPRESSION_PERIOD, PROPERTY_CHECKED, PROPERTY_VALUE } from "../../constants.mjs";
|
|
2
|
+
import { isInputElement } from "../../helpers/dom.mjs";
|
|
2
3
|
import { mapEvent } from "../event.mjs";
|
|
3
4
|
import { setAttribute } from "./value.mjs";
|
|
4
|
-
import {
|
|
5
|
+
import { parse } from "@oscarpalmer/atoms/string";
|
|
6
|
+
import { computed, isReactive, isSignal } from "@oscarpalmer/mora";
|
|
5
7
|
//#region src/node/attribute/index.ts
|
|
6
8
|
function getValue(data, original) {
|
|
7
9
|
const matches = EXPRESSION_ABYDON_CONTENT.exec(original ?? "");
|
|
@@ -31,6 +33,14 @@ function mapAttributes(data, element) {
|
|
|
31
33
|
function mapValue(data, element, name, value) {
|
|
32
34
|
if (typeof value === "function") setComputedAttribute(data, element, name, value);
|
|
33
35
|
else setAttribute(data, element, name, value);
|
|
36
|
+
if (!isInputElement(element) || !isSignal(value)) return;
|
|
37
|
+
let property;
|
|
38
|
+
if (name === "checked" && element.type === "checkbox") property = PROPERTY_CHECKED;
|
|
39
|
+
else if (name === "value") property = PROPERTY_VALUE;
|
|
40
|
+
if (property != null) mapEvent(element, "@on", () => {
|
|
41
|
+
const next = element[property];
|
|
42
|
+
value.set(parse(String(next)) ?? next);
|
|
43
|
+
});
|
|
34
44
|
}
|
|
35
45
|
function setComputedAttribute(data, element, name, callback) {
|
|
36
46
|
const value = computed(callback);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EXPRESSION_ATTRIBUTE_CLASS, EXPRESSION_ATTRIBUTE_STYLE_FULL, EXPRESSION_ATTRIBUTE_STYLE_PREFIX } from "../../constants.mjs";
|
|
1
|
+
import { EVENT_CHANGE, EVENT_INPUT, EXPRESSION_ATTRIBUTE_CLASS, EXPRESSION_ATTRIBUTE_STYLE_FULL, EXPRESSION_ATTRIBUTE_STYLE_PREFIX, PROPERTY_CHECKED, PROPERTY_VALUE } from "../../constants.mjs";
|
|
2
2
|
import { isReactive } from "@oscarpalmer/mora";
|
|
3
3
|
import { isBooleanAttribute, setAttribute as setAttribute$1 } from "@oscarpalmer/toretto/attribute";
|
|
4
4
|
//#region src/node/attribute/value.ts
|
|
@@ -46,7 +46,7 @@ function setValue(data, element, name, value) {
|
|
|
46
46
|
else callback(element, name, value);
|
|
47
47
|
}
|
|
48
48
|
function updateChecked(element, name, value) {
|
|
49
|
-
updateElement(
|
|
49
|
+
updateElement(EVENT_CHANGE, PROPERTY_CHECKED, element, name, value, value === true);
|
|
50
50
|
}
|
|
51
51
|
function updateElement(event, property, element, name, value, next) {
|
|
52
52
|
if (!(property in element) || element[property] === next) return;
|
|
@@ -59,7 +59,7 @@ function updateProperty(element, name, value) {
|
|
|
59
59
|
setAttribute$1(element, name, value === true);
|
|
60
60
|
}
|
|
61
61
|
function updateValue(element, name, value) {
|
|
62
|
-
updateElement(element instanceof HTMLSelectElement ?
|
|
62
|
+
updateElement(element instanceof HTMLSelectElement ? EVENT_CHANGE : EVENT_INPUT, PROPERTY_VALUE, element, name, value, String(value));
|
|
63
63
|
}
|
|
64
64
|
//#endregion
|
|
65
65
|
export { setAttribute };
|
package/dist/node/event.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EVENT_DEFAULTS, EXPRESSION_EVENT_CHANGE_TYPES, EXPRESSION_EVENT_NAME, EXPRESSION_EVENT_OPTIONS_ACTIVE, EXPRESSION_EVENT_OPTIONS_CAPTURE, EXPRESSION_EVENT_OPTIONS_ONCE } from "../constants.mjs";
|
|
1
|
+
import { EVENT_CHANGE, EVENT_DEFAULTS, EVENT_INPUT, EVENT_SUBMIT, EXPRESSION_EVENT_CHANGE_TYPES, EXPRESSION_EVENT_NAME, EXPRESSION_EVENT_OPTIONS_ACTIVE, EXPRESSION_EVENT_OPTIONS_CAPTURE, EXPRESSION_EVENT_OPTIONS_ONCE } from "../constants.mjs";
|
|
2
2
|
import { on } from "@oscarpalmer/toretto/event";
|
|
3
3
|
//#region src/node/event.ts
|
|
4
4
|
function getOptions(options) {
|
|
@@ -12,8 +12,8 @@ function getOptions(options) {
|
|
|
12
12
|
function getType(element, type) {
|
|
13
13
|
if (type !== "on") return type;
|
|
14
14
|
if (element instanceof HTMLInputElement) {
|
|
15
|
-
if (EXPRESSION_EVENT_CHANGE_TYPES.test(element.type)) return
|
|
16
|
-
return element.type === "submit" ?
|
|
15
|
+
if (EXPRESSION_EVENT_CHANGE_TYPES.test(element.type)) return EVENT_CHANGE;
|
|
16
|
+
return element.type === "submit" ? EVENT_SUBMIT : EVENT_INPUT;
|
|
17
17
|
}
|
|
18
18
|
return EVENT_DEFAULTS[element.tagName] ?? type;
|
|
19
19
|
}
|
package/dist/node/index.mjs
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { EXPRESSION_ABYDON_CONTENT } from "../constants.mjs";
|
|
1
|
+
import { EXPRESSION_ABYDON_CONTENT, EXPRESSION_TEXTAREA_VALUE } from "../constants.mjs";
|
|
2
2
|
import { isFragment, isFragments } from "../helpers/index.mjs";
|
|
3
3
|
import { handleFragments } from "../fragments.mjs";
|
|
4
4
|
import { createNodes } from "../helpers/dom.mjs";
|
|
5
|
+
import { mapEvent } from "./event.mjs";
|
|
5
6
|
import { mapAttributes } from "./attribute/index.mjs";
|
|
6
7
|
import { setReactiveValue } from "./value.mjs";
|
|
7
|
-
import { computed, isReactive } from "@oscarpalmer/mora";
|
|
8
|
+
import { computed, isComputed, isReactive, isSignal } from "@oscarpalmer/mora";
|
|
8
9
|
import { isHTMLOrSVGElement } from "@oscarpalmer/toretto/is";
|
|
9
10
|
//#region src/node/index.ts
|
|
10
11
|
function mapNode(data, comment) {
|
|
@@ -20,10 +21,31 @@ function mapNodes(data, nodes) {
|
|
|
20
21
|
mapNode(data, node);
|
|
21
22
|
continue;
|
|
22
23
|
}
|
|
24
|
+
if (node instanceof HTMLTextAreaElement) mapTextarea(data, node);
|
|
23
25
|
if (isHTMLOrSVGElement(node)) mapAttributes(data, node);
|
|
24
26
|
if (node.hasChildNodes()) mapNodes(data, [...node.childNodes]);
|
|
25
27
|
}
|
|
26
28
|
}
|
|
29
|
+
function mapTextarea(data, element) {
|
|
30
|
+
const [, index] = EXPRESSION_TEXTAREA_VALUE.exec(element.value) ?? [];
|
|
31
|
+
if (index == null) return;
|
|
32
|
+
element.value = "";
|
|
33
|
+
const value = data.values[Number.parseInt(index, 10)];
|
|
34
|
+
if (isSignal(value)) {
|
|
35
|
+
element.value = String(value.peek());
|
|
36
|
+
mapEvent(element, "@on", () => {
|
|
37
|
+
value.set(element.value);
|
|
38
|
+
});
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let reactive;
|
|
42
|
+
if (typeof value === "function") reactive = computed(value);
|
|
43
|
+
else if (isComputed(value)) reactive = value;
|
|
44
|
+
if (reactive == null) element.value = String(value);
|
|
45
|
+
else data.mora.subscribers.add(reactive.subscribe((value) => {
|
|
46
|
+
element.value = String(value);
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
27
49
|
function mapValue(data, comment, value) {
|
|
28
50
|
switch (true) {
|
|
29
51
|
case typeof value === "function":
|
package/dist/node/value.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ARRAY_COMPARISON_ADDED } from "../constants.mjs";
|
|
1
2
|
import { compareArrays, isFragment } from "../helpers/index.mjs";
|
|
2
3
|
import { createNodes, replaceNodes } from "../helpers/dom.mjs";
|
|
3
4
|
import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
|
|
@@ -25,7 +26,7 @@ function handleArray(identifiers, items, nodes) {
|
|
|
25
26
|
if (comparison !== "removed") addToArray(identifiers, {
|
|
26
27
|
...items,
|
|
27
28
|
next
|
|
28
|
-
}, nodes, comparison ===
|
|
29
|
+
}, nodes, comparison === ARRAY_COMPARISON_ADDED);
|
|
29
30
|
const toRemove = items.fragments?.filter((fragment) => !identifiers.next.has(fragment.identifier)) ?? [];
|
|
30
31
|
const { length } = toRemove;
|
|
31
32
|
for (let index = 0; index < length; index += 1) toRemove[index].remove();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oscarpalmer/abydon",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"components",
|
|
6
6
|
"dom",
|
|
@@ -39,12 +39,11 @@
|
|
|
39
39
|
"tsdown:build": "npx tsdown -c ./tsdown.config.ts",
|
|
40
40
|
"tsdown:watch": "npx tsdown -c ./tsdown.config.ts --watch",
|
|
41
41
|
"test": "npx vp test run --coverage",
|
|
42
|
-
"test:leak": "npx vp test run --detect-async-leaks --coverage"
|
|
43
|
-
"watch": "npx vite build --watch"
|
|
42
|
+
"test:leak": "npx vp test run --detect-async-leaks --coverage"
|
|
44
43
|
},
|
|
45
44
|
"dependencies": {
|
|
46
45
|
"@oscarpalmer/atoms": "^0.165",
|
|
47
|
-
"@oscarpalmer/mora": "^0.
|
|
46
|
+
"@oscarpalmer/mora": "^0.27",
|
|
48
47
|
"@oscarpalmer/toretto": "^0.41"
|
|
49
48
|
},
|
|
50
49
|
"devDependencies": {
|
package/src/constants.ts
CHANGED
|
@@ -1,15 +1,41 @@
|
|
|
1
|
+
export const ARRAY_COMPARISON_ADDED = 'added';
|
|
2
|
+
|
|
3
|
+
export const ARRAY_COMPARISON_DISSIMILAR = 'dissimilar';
|
|
4
|
+
|
|
5
|
+
export const ARRAY_COMPARISON_REMOVED = 'removed';
|
|
6
|
+
|
|
1
7
|
export const ATTRIBUTE_CLASS_PREFIX_LENGTH = 6;
|
|
2
8
|
|
|
9
|
+
export const ATTRIBUTE_NAME_DELIMITER = '.';
|
|
10
|
+
|
|
11
|
+
export const ERROR_FRAGMENT = 'Fragment function must return a Fragment instance';
|
|
12
|
+
|
|
13
|
+
export const ERROR_IDENTIFIER_DUPLICATE = "Duplicate identifier found: '<id>'";
|
|
14
|
+
|
|
15
|
+
export const ERROR_IDENTIFIER_TYPE = 'Identifier cannot be null or undefined';
|
|
16
|
+
|
|
17
|
+
export const EVENT_CHANGE = 'change';
|
|
18
|
+
|
|
19
|
+
export const EVENT_INPUT = 'input';
|
|
20
|
+
|
|
21
|
+
export const EVENT_SUBMIT = 'submit';
|
|
22
|
+
|
|
3
23
|
export const EVENT_DEFAULTS: Record<string, string> = {
|
|
4
24
|
A: 'click',
|
|
5
25
|
BUTTON: 'click',
|
|
6
26
|
DETAILS: 'toggle',
|
|
7
|
-
FORM:
|
|
8
|
-
SELECT:
|
|
9
|
-
TEXTAREA:
|
|
27
|
+
FORM: EVENT_SUBMIT,
|
|
28
|
+
SELECT: EVENT_CHANGE,
|
|
29
|
+
TEXTAREA: EVENT_INPUT,
|
|
10
30
|
};
|
|
11
31
|
|
|
12
|
-
export const
|
|
32
|
+
export const EVENT_ON_PREFIXED = '@on';
|
|
33
|
+
|
|
34
|
+
export const EVENT_ON_VALUE = 'on';
|
|
35
|
+
|
|
36
|
+
export const EVENT_OPTIONS_DELIMITER = ':';
|
|
37
|
+
|
|
38
|
+
export const EXPRESSION_ABYDON_ATTRIBUTE_FULL = /(@?[\w-]+)="<!--abydon.(\d+)-->"/g;
|
|
13
39
|
|
|
14
40
|
export const EXPRESSION_ABYDON_ATTRIBUTE_PREFIX = /^_/;
|
|
15
41
|
|
|
@@ -35,6 +61,18 @@ export const EXPRESSION_EVENT_PREFIX = /^@/;
|
|
|
35
61
|
|
|
36
62
|
export const EXPRESSION_PERIOD = /\./;
|
|
37
63
|
|
|
64
|
+
export const EXPRESSION_TEXTAREA_VALUE = /<!--abydon\.(\d+)-->/;
|
|
65
|
+
|
|
66
|
+
export const INPUT_TYPE_CHECKBOX = 'checkbox';
|
|
67
|
+
|
|
38
68
|
export const NAME_FRAGMENT = '$fragment';
|
|
39
69
|
|
|
40
70
|
export const NAME_FRAGMENTS = '$fragments';
|
|
71
|
+
|
|
72
|
+
export const PROPERTY_CHECKED = 'checked';
|
|
73
|
+
|
|
74
|
+
export const PROPERTY_IDENTIFIER = 'identifier';
|
|
75
|
+
|
|
76
|
+
export const PROPERTY_VALUE = 'value';
|
|
77
|
+
|
|
78
|
+
export const TEMPLATE_ITEM = '<>';
|
package/src/fragment.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {isPlainObject} from '@oscarpalmer/atoms/is';
|
|
2
2
|
import {html} from '@oscarpalmer/toretto/html';
|
|
3
|
-
import {NAME_FRAGMENT} from './constants';
|
|
3
|
+
import {NAME_FRAGMENT, PROPERTY_IDENTIFIER} from './constants';
|
|
4
4
|
import {handleFragments} from './fragments';
|
|
5
5
|
import {isFragments} from './helpers';
|
|
6
6
|
import {removeNodes} from './helpers/dom';
|
|
@@ -56,7 +56,7 @@ export class Fragment {
|
|
|
56
56
|
configure(configuration: FragmentConfiguration): Fragment {
|
|
57
57
|
const actual = isPlainObject(configuration) ? configuration : {};
|
|
58
58
|
|
|
59
|
-
if (
|
|
59
|
+
if (PROPERTY_IDENTIFIER in actual) {
|
|
60
60
|
this.#configuration.identifier = actual.identifier;
|
|
61
61
|
}
|
|
62
62
|
|
package/src/fragments.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import {getString} from '@oscarpalmer/atoms/string';
|
|
2
2
|
import {array, type ReactiveArray} from '@oscarpalmer/mora';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
ERROR_FRAGMENT,
|
|
5
|
+
ERROR_IDENTIFIER_DUPLICATE,
|
|
6
|
+
ERROR_IDENTIFIER_TYPE,
|
|
7
|
+
NAME_FRAGMENTS,
|
|
8
|
+
TEMPLATE_ITEM,
|
|
9
|
+
} from './constants';
|
|
4
10
|
import type {Fragment} from './fragment';
|
|
5
11
|
import {isFragment, isFragments} from './helpers';
|
|
6
12
|
import type {FragmentsState} from './models';
|
|
@@ -58,13 +64,13 @@ function handleItems(state: FragmentsState, items: unknown[]): void {
|
|
|
58
64
|
const identifier = state.identify(item);
|
|
59
65
|
|
|
60
66
|
if (identifier == null) {
|
|
61
|
-
throw new
|
|
67
|
+
throw new TypeError(ERROR_IDENTIFIER_TYPE);
|
|
62
68
|
}
|
|
63
69
|
|
|
64
70
|
const key = getString(identifier);
|
|
65
71
|
|
|
66
72
|
if (keys.has(key)) {
|
|
67
|
-
throw new Error(
|
|
73
|
+
throw new Error(ERROR_IDENTIFIER_DUPLICATE.replace(TEMPLATE_ITEM, key));
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
let instance = state.instances[key];
|
|
@@ -73,7 +79,7 @@ function handleItems(state: FragmentsState, items: unknown[]): void {
|
|
|
73
79
|
instance = state.fragment(item);
|
|
74
80
|
|
|
75
81
|
if (!isFragment(instance)) {
|
|
76
|
-
throw new Error(
|
|
82
|
+
throw new Error(ERROR_FRAGMENT);
|
|
77
83
|
}
|
|
78
84
|
}
|
|
79
85
|
|
package/src/helpers/dom.ts
CHANGED
|
@@ -14,6 +14,10 @@ export function createNodes(value: unknown): ChildNode[] {
|
|
|
14
14
|
return [new Text(getString(value))];
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
export function isInputElement(node: Node): node is HTMLInputElement | HTMLSelectElement {
|
|
18
|
+
return node instanceof HTMLInputElement || node instanceof HTMLSelectElement;
|
|
19
|
+
}
|
|
20
|
+
|
|
17
21
|
export function removeNodes(nodes: ChildNode[]): void {
|
|
18
22
|
const {length} = nodes;
|
|
19
23
|
|
package/src/helpers/index.ts
CHANGED
|
@@ -1,21 +1,30 @@
|
|
|
1
1
|
import type {PlainObject} from '@oscarpalmer/atoms/models';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
ARRAY_COMPARISON_ADDED,
|
|
4
|
+
ARRAY_COMPARISON_DISSIMILAR,
|
|
5
|
+
ARRAY_COMPARISON_REMOVED,
|
|
6
|
+
NAME_FRAGMENT,
|
|
7
|
+
NAME_FRAGMENTS,
|
|
8
|
+
} from '../constants';
|
|
3
9
|
import type {Fragment} from '../fragment';
|
|
4
10
|
import type {Fragments} from '../fragments';
|
|
5
11
|
|
|
6
12
|
export function compareArrays(
|
|
7
13
|
first: unknown[],
|
|
8
14
|
second: unknown[],
|
|
9
|
-
):
|
|
15
|
+
):
|
|
16
|
+
| typeof ARRAY_COMPARISON_ADDED
|
|
17
|
+
| typeof ARRAY_COMPARISON_DISSIMILAR
|
|
18
|
+
| typeof ARRAY_COMPARISON_REMOVED {
|
|
10
19
|
const firstIsLarger = first.length > second.length;
|
|
11
20
|
const from = firstIsLarger ? first : second;
|
|
12
21
|
const to = firstIsLarger ? second : first;
|
|
13
22
|
|
|
14
23
|
if (!from.filter(key => to.includes(key)).every((key, index) => to[index] === key)) {
|
|
15
|
-
return
|
|
24
|
+
return ARRAY_COMPARISON_DISSIMILAR;
|
|
16
25
|
}
|
|
17
26
|
|
|
18
|
-
return firstIsLarger ?
|
|
27
|
+
return firstIsLarger ? ARRAY_COMPARISON_REMOVED : ARRAY_COMPARISON_ADDED;
|
|
19
28
|
}
|
|
20
29
|
|
|
21
30
|
export function isFragment(value: unknown): value is Fragment {
|
|
@@ -34,9 +43,3 @@ function isNamed(value: unknown, name: string): boolean {
|
|
|
34
43
|
(value as PlainObject)[name] === true
|
|
35
44
|
);
|
|
36
45
|
}
|
|
37
|
-
|
|
38
|
-
const COMPARISON_ADDED = 'added';
|
|
39
|
-
|
|
40
|
-
const COMPARISON_DISSIMILAR = 'dissimilar';
|
|
41
|
-
|
|
42
|
-
const COMPARISON_REMOVED = 'removed';
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import type {GenericCallback} from '@oscarpalmer/atoms/models';
|
|
2
|
-
import {
|
|
2
|
+
import {parse} from '@oscarpalmer/atoms/string';
|
|
3
|
+
import {computed, isReactive, isSignal} from '@oscarpalmer/mora';
|
|
3
4
|
import {
|
|
5
|
+
EVENT_ON_PREFIXED,
|
|
4
6
|
EXPRESSION_ABYDON_ATTRIBUTE_PREFIX,
|
|
5
7
|
EXPRESSION_ABYDON_CONTENT,
|
|
6
8
|
EXPRESSION_EVENT_PREFIX,
|
|
7
9
|
EXPRESSION_PERIOD,
|
|
10
|
+
INPUT_TYPE_CHECKBOX,
|
|
11
|
+
PROPERTY_CHECKED,
|
|
12
|
+
PROPERTY_VALUE,
|
|
8
13
|
} from '../../constants';
|
|
14
|
+
import {isInputElement} from '../../helpers/dom';
|
|
9
15
|
import type {FragmentData} from '../../models';
|
|
10
16
|
import {mapEvent} from '../event';
|
|
11
17
|
import {setAttribute} from './value';
|
|
@@ -58,6 +64,26 @@ function mapValue(
|
|
|
58
64
|
} else {
|
|
59
65
|
setAttribute(data, element, name, value);
|
|
60
66
|
}
|
|
67
|
+
|
|
68
|
+
if (!isInputElement(element) || !isSignal(value)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let property: string | undefined;
|
|
73
|
+
|
|
74
|
+
if (name === PROPERTY_CHECKED && element.type === INPUT_TYPE_CHECKBOX) {
|
|
75
|
+
property = PROPERTY_CHECKED;
|
|
76
|
+
} else if (name === PROPERTY_VALUE) {
|
|
77
|
+
property = PROPERTY_VALUE;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (property != null) {
|
|
81
|
+
mapEvent(element, EVENT_ON_PREFIXED, () => {
|
|
82
|
+
const next = element[property as keyof typeof element];
|
|
83
|
+
|
|
84
|
+
value.set(parse(String(next)) ?? next);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
61
87
|
}
|
|
62
88
|
|
|
63
89
|
function setComputedAttribute(
|
|
@@ -6,18 +6,23 @@ import {
|
|
|
6
6
|
} from '@oscarpalmer/toretto/attribute';
|
|
7
7
|
import {
|
|
8
8
|
ATTRIBUTE_CLASS_PREFIX_LENGTH,
|
|
9
|
+
ATTRIBUTE_NAME_DELIMITER,
|
|
10
|
+
EVENT_CHANGE,
|
|
11
|
+
EVENT_INPUT,
|
|
9
12
|
EXPRESSION_ATTRIBUTE_CLASS,
|
|
10
13
|
EXPRESSION_ATTRIBUTE_STYLE_FULL,
|
|
11
14
|
EXPRESSION_ATTRIBUTE_STYLE_PREFIX,
|
|
15
|
+
PROPERTY_CHECKED,
|
|
16
|
+
PROPERTY_VALUE,
|
|
12
17
|
} from '../../constants';
|
|
13
18
|
import type {FragmentData} from '../../models';
|
|
14
19
|
|
|
15
20
|
function getCallback(element: HTMLElement | SVGElement, name: string) {
|
|
16
21
|
if (isBooleanAttribute(name) && name in element) {
|
|
17
|
-
return name ===
|
|
22
|
+
return name === PROPERTY_CHECKED ? updateChecked : updateProperty;
|
|
18
23
|
}
|
|
19
24
|
|
|
20
|
-
return name ===
|
|
25
|
+
return name === PROPERTY_VALUE ? updateValue : setTorettoAttribute;
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
export function setAttribute(
|
|
@@ -55,7 +60,7 @@ function setClasses(
|
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
62
|
|
|
58
|
-
const classes = name.slice(ATTRIBUTE_CLASS_PREFIX_LENGTH).split(
|
|
63
|
+
const classes = name.slice(ATTRIBUTE_CLASS_PREFIX_LENGTH).split(ATTRIBUTE_NAME_DELIMITER);
|
|
59
64
|
|
|
60
65
|
if (isReactive(value)) {
|
|
61
66
|
data.mora.subscribers.add(value.subscribe(update));
|
|
@@ -111,7 +116,7 @@ function setValue(
|
|
|
111
116
|
}
|
|
112
117
|
|
|
113
118
|
function updateChecked(element: HTMLElement | SVGElement, name: string, value: unknown): void {
|
|
114
|
-
updateElement(
|
|
119
|
+
updateElement(EVENT_CHANGE, PROPERTY_CHECKED, element, name, value, value === true);
|
|
115
120
|
}
|
|
116
121
|
|
|
117
122
|
function updateElement(
|
|
@@ -143,8 +148,8 @@ function updateProperty(element: HTMLElement | SVGElement, name: string, value:
|
|
|
143
148
|
|
|
144
149
|
function updateValue(element: HTMLElement | SVGElement, name: string, value: unknown): void {
|
|
145
150
|
updateElement(
|
|
146
|
-
element instanceof HTMLSelectElement ?
|
|
147
|
-
|
|
151
|
+
element instanceof HTMLSelectElement ? EVENT_CHANGE : EVENT_INPUT,
|
|
152
|
+
PROPERTY_VALUE,
|
|
148
153
|
element,
|
|
149
154
|
name,
|
|
150
155
|
value,
|
package/src/node/event.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import {on} from '@oscarpalmer/toretto/event';
|
|
2
2
|
import {
|
|
3
|
+
EVENT_CHANGE,
|
|
3
4
|
EVENT_DEFAULTS,
|
|
5
|
+
EVENT_INPUT,
|
|
6
|
+
EVENT_ON_VALUE,
|
|
7
|
+
EVENT_OPTIONS_DELIMITER,
|
|
8
|
+
EVENT_SUBMIT,
|
|
4
9
|
EXPRESSION_EVENT_CHANGE_TYPES,
|
|
5
10
|
EXPRESSION_EVENT_NAME,
|
|
6
11
|
EXPRESSION_EVENT_OPTIONS_ACTIVE,
|
|
@@ -9,7 +14,7 @@ import {
|
|
|
9
14
|
} from '../constants';
|
|
10
15
|
|
|
11
16
|
function getOptions(options: string): AddEventListenerOptions {
|
|
12
|
-
const parts = options.split(
|
|
17
|
+
const parts = options.split(EVENT_OPTIONS_DELIMITER);
|
|
13
18
|
|
|
14
19
|
return {
|
|
15
20
|
capture: parts.some(part => EXPRESSION_EVENT_OPTIONS_CAPTURE.test(part)),
|
|
@@ -19,16 +24,16 @@ function getOptions(options: string): AddEventListenerOptions {
|
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
function getType(element: HTMLElement | SVGElement, type: string): string {
|
|
22
|
-
if (type !==
|
|
27
|
+
if (type !== EVENT_ON_VALUE) {
|
|
23
28
|
return type;
|
|
24
29
|
}
|
|
25
30
|
|
|
26
31
|
if (element instanceof HTMLInputElement) {
|
|
27
32
|
if (EXPRESSION_EVENT_CHANGE_TYPES.test(element.type)) {
|
|
28
|
-
return
|
|
33
|
+
return EVENT_CHANGE;
|
|
29
34
|
}
|
|
30
35
|
|
|
31
|
-
return element.type ===
|
|
36
|
+
return element.type === EVENT_SUBMIT ? EVENT_SUBMIT : EVENT_INPUT;
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
return EVENT_DEFAULTS[element.tagName] ?? type;
|