@oscarpalmer/abydon 0.21.0 → 0.22.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/src/parse.ts CHANGED
@@ -1,9 +1,17 @@
1
- import {isNullableOrWhitespace} from '@oscarpalmer/atoms/is';
2
- import {EXPRESSION_ABYDON_ATTRIBUTE_FULL} from './constants';
1
+ import {getString} from '@oscarpalmer/atoms/string';
2
+ import {
3
+ EXPRESSION_ABYDON_ATTRIBUTE_FULL,
4
+ EXPRESSION_EVENT_ATTRIBUTE,
5
+ WHITESPACE,
6
+ } from './constants';
3
7
  import type {FragmentData} from './models';
4
8
 
5
9
  function handleExpression(data: FragmentData, prefix: string, expression: unknown): string {
6
10
  if (Array.isArray(expression)) {
11
+ if (EXPRESSION_EVENT_ATTRIBUTE.test(prefix.split(WHITESPACE).at(-1)!)) {
12
+ return transformExpression(prefix, data.values.push(expression) - 1);
13
+ }
14
+
7
15
  const {length} = expression;
8
16
 
9
17
  let expressions = '';
@@ -19,7 +27,9 @@ function handleExpression(data: FragmentData, prefix: string, expression: unknow
19
27
  return transformExpression(prefix, data.values.push(expression) - 1);
20
28
  }
21
29
 
22
- return isNullableOrWhitespace(expression) ? prefix : `${prefix}${expression}`;
30
+ const asString = getString(expression);
31
+
32
+ return asString.trim().length === 0 ? prefix : `${prefix}${asString}`;
23
33
  }
24
34
 
25
35
  export function parse(data: FragmentData): string {
@@ -44,7 +54,7 @@ export function parse(data: FragmentData): string {
44
54
  }
45
55
 
46
56
  function transformAttribute(_: string, name: string, index: string): string {
47
- return `_${name}="@abydon.${index}@"`;
57
+ return `abydon-${name}="abydon.${index}"`;
48
58
  }
49
59
 
50
60
  function transformExpression(prefix: string, index: number): string {
@@ -1,6 +0,0 @@
1
- import { FragmentData } from "../../models.mjs";
2
-
3
- //#region src/node/attribute/index.d.ts
4
- declare function mapAttributes(data: FragmentData, element: HTMLElement | SVGElement): void;
5
- //#endregion
6
- export { mapAttributes };
@@ -1,65 +0,0 @@
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
- import { isReactive } from "@oscarpalmer/mora";
3
- import { isBooleanAttribute, setAttribute as setAttribute$1 } from "@oscarpalmer/toretto/attribute";
4
- //#region src/node/attribute/value.ts
5
- function getCallback(element, name) {
6
- if (isBooleanAttribute(name) && name in element) return name === "checked" ? updateChecked : updateProperty;
7
- return name === "value" ? updateValue : setAttribute$1;
8
- }
9
- function setAttribute(data, element, name, value) {
10
- switch (true) {
11
- case EXPRESSION_ATTRIBUTE_CLASS.test(name):
12
- setClasses(data, element, name, value);
13
- return;
14
- case EXPRESSION_ATTRIBUTE_STYLE_PREFIX.test(name):
15
- setStyle(data, element, name, value);
16
- return;
17
- default:
18
- setValue(data, element, name, value);
19
- break;
20
- }
21
- }
22
- function setClasses(data, element, name, value) {
23
- function update(value) {
24
- if (value === true) element.classList.add(...classes);
25
- else element.classList.remove(...classes);
26
- }
27
- const classes = name.slice(6).split(".");
28
- if (isReactive(value)) data.mora.subscribers.add(value.subscribe(update));
29
- else update(value);
30
- }
31
- function setStyle(data, element, name, value) {
32
- const [, property, unit] = EXPRESSION_ATTRIBUTE_STYLE_FULL.exec(name) ?? [];
33
- if (property == null) return;
34
- function update(value) {
35
- if (value == null || value === false || value === true && unit == null) element.style.removeProperty(property);
36
- else element.style.setProperty(property, value === true ? unit : String(value));
37
- }
38
- if (isReactive(value)) data.mora.subscribers.add(value.subscribe(update));
39
- else update(value);
40
- }
41
- function setValue(data, element, name, value) {
42
- const callback = getCallback(element, name);
43
- if (isReactive(value)) data.mora.subscribers.add(value.subscribe((next) => {
44
- callback(element, name, next);
45
- }));
46
- else callback(element, name, value);
47
- }
48
- function updateChecked(element, name, value) {
49
- updateElement(EVENT_CHANGE, PROPERTY_CHECKED, element, name, value, value === true);
50
- }
51
- function updateElement(event, property, element, name, value, next) {
52
- if (!(property in element) || element[property] === next) return;
53
- setAttribute$1(element, name, value);
54
- if (element[property] === next) return;
55
- element[property] = next;
56
- element.dispatchEvent(new Event(event, { bubbles: true }));
57
- }
58
- function updateProperty(element, name, value) {
59
- setAttribute$1(element, name, value === true);
60
- }
61
- function updateValue(element, name, value) {
62
- updateElement(element instanceof HTMLSelectElement ? EVENT_CHANGE : EVENT_INPUT, PROPERTY_VALUE, element, name, value, String(value));
63
- }
64
- //#endregion
65
- export { setAttribute };
@@ -1,158 +0,0 @@
1
- import type {PlainObject} from '@oscarpalmer/atoms/models';
2
- import {isReactive} from '@oscarpalmer/mora';
3
- import {
4
- isBooleanAttribute,
5
- setAttribute as setTorettoAttribute,
6
- } from '@oscarpalmer/toretto/attribute';
7
- import {
8
- ATTRIBUTE_CLASS_PREFIX_LENGTH,
9
- ATTRIBUTE_NAME_DELIMITER,
10
- EVENT_CHANGE,
11
- EVENT_INPUT,
12
- EXPRESSION_ATTRIBUTE_CLASS,
13
- EXPRESSION_ATTRIBUTE_STYLE_FULL,
14
- EXPRESSION_ATTRIBUTE_STYLE_PREFIX,
15
- PROPERTY_CHECKED,
16
- PROPERTY_VALUE,
17
- } from '../../constants';
18
- import type {FragmentData} from '../../models';
19
-
20
- function getCallback(element: HTMLElement | SVGElement, name: string) {
21
- if (isBooleanAttribute(name) && name in element) {
22
- return name === PROPERTY_CHECKED ? updateChecked : updateProperty;
23
- }
24
-
25
- return name === PROPERTY_VALUE ? updateValue : setTorettoAttribute;
26
- }
27
-
28
- export function setAttribute(
29
- data: FragmentData,
30
- element: HTMLElement | SVGElement,
31
- name: string,
32
- value: unknown,
33
- ): void {
34
- switch (true) {
35
- case EXPRESSION_ATTRIBUTE_CLASS.test(name):
36
- setClasses(data, element, name, value);
37
- return;
38
-
39
- case EXPRESSION_ATTRIBUTE_STYLE_PREFIX.test(name):
40
- setStyle(data, element, name, value);
41
- return;
42
-
43
- default:
44
- setValue(data, element, name, value);
45
- break;
46
- }
47
- }
48
-
49
- function setClasses(
50
- data: FragmentData,
51
- element: HTMLElement | SVGElement,
52
- name: string,
53
- value: unknown,
54
- ): void {
55
- function update(value: unknown): void {
56
- if (value === true) {
57
- element.classList.add(...classes);
58
- } else {
59
- element.classList.remove(...classes);
60
- }
61
- }
62
-
63
- const classes = name.slice(ATTRIBUTE_CLASS_PREFIX_LENGTH).split(ATTRIBUTE_NAME_DELIMITER);
64
-
65
- if (isReactive(value)) {
66
- data.mora.subscribers.add(value.subscribe(update));
67
- } else {
68
- update(value);
69
- }
70
- }
71
-
72
- function setStyle(
73
- data: FragmentData,
74
- element: HTMLElement | SVGElement,
75
- name: string,
76
- value: unknown,
77
- ): void {
78
- const [, property, unit] = EXPRESSION_ATTRIBUTE_STYLE_FULL.exec(name) ?? [];
79
-
80
- if (property == null) {
81
- return;
82
- }
83
-
84
- function update(value: unknown): void {
85
- if (value == null || value === false || (value === true && unit == null)) {
86
- element.style.removeProperty(property);
87
- } else {
88
- element.style.setProperty(property, value === true ? unit : String(value));
89
- }
90
- }
91
-
92
- if (isReactive(value)) {
93
- data.mora.subscribers.add(value.subscribe(update));
94
- } else {
95
- update(value);
96
- }
97
- }
98
-
99
- function setValue(
100
- data: FragmentData,
101
- element: HTMLElement | SVGElement,
102
- name: string,
103
- value: unknown,
104
- ): void {
105
- const callback = getCallback(element, name);
106
-
107
- if (isReactive(value)) {
108
- data.mora.subscribers.add(
109
- value.subscribe(next => {
110
- callback(element, name, next);
111
- }),
112
- );
113
- } else {
114
- callback(element, name, value);
115
- }
116
- }
117
-
118
- function updateChecked(element: HTMLElement | SVGElement, name: string, value: unknown): void {
119
- updateElement(EVENT_CHANGE, PROPERTY_CHECKED, element, name, value, value === true);
120
- }
121
-
122
- function updateElement(
123
- event: string,
124
- property: string,
125
- element: HTMLElement | SVGElement,
126
- name: string,
127
- value: unknown,
128
- next: unknown,
129
- ): void {
130
- if (!(property in element) || (element as unknown as PlainObject)[property] === next) {
131
- return;
132
- }
133
-
134
- setTorettoAttribute(element, name, value);
135
-
136
- if ((element as unknown as PlainObject)[property] === next) {
137
- return;
138
- }
139
-
140
- (element as unknown as PlainObject)[property] = next;
141
-
142
- element.dispatchEvent(new Event(event, {bubbles: true}));
143
- }
144
-
145
- function updateProperty(element: HTMLElement | SVGElement, name: string, value: unknown): void {
146
- setTorettoAttribute(element, name, value === true);
147
- }
148
-
149
- function updateValue(element: HTMLElement | SVGElement, name: string, value: unknown): void {
150
- updateElement(
151
- element instanceof HTMLSelectElement ? EVENT_CHANGE : EVENT_INPUT,
152
- PROPERTY_VALUE,
153
- element,
154
- name,
155
- value,
156
- String(value),
157
- );
158
- }