@oscarpalmer/abydon 0.11.0 → 0.12.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/fragment.mjs +27 -10
- package/dist/helpers/dom.mjs +3 -3
- package/dist/helpers/index.mjs +6 -6
- package/dist/index.js +266 -240
- package/dist/index.mjs +1 -0
- package/dist/node/attribute/index.mjs +9 -4
- package/dist/node/attribute/value.mjs +13 -13
- package/dist/node/event.mjs +3 -4
- package/dist/node/index.mjs +10 -5
- package/dist/node/value.mjs +6 -6
- package/package.json +1 -1
- package/src/fragment.ts +34 -12
- package/src/helpers/dom.ts +9 -10
- package/src/helpers/index.ts +6 -6
- package/src/index.ts +1 -0
- package/src/models.ts +9 -4
- package/src/node/attribute/index.ts +24 -6
- package/src/node/attribute/value.ts +37 -19
- package/src/node/event.ts +9 -9
- package/src/node/index.ts +20 -8
- package/src/node/value.ts +36 -34
- package/types/fragment.d.ts +1 -2
- package/types/helpers/dom.d.ts +3 -4
- package/types/helpers/index.d.ts +3 -3
- package/types/index.d.cts +1 -2
- package/types/index.d.ts +1 -0
- package/types/models.d.ts +9 -3
- package/types/node/attribute/index.d.ts +2 -2
- package/types/node/attribute/value.d.ts +2 -2
- package/types/node/event.d.ts +3 -3
- package/types/node/index.d.ts +2 -2
- package/types/node/value.d.ts +1 -1
package/src/node/index.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type {GenericCallback} from '@oscarpalmer/atoms/models';
|
|
2
2
|
import {computed, isReactive} from '@oscarpalmer/sentinel';
|
|
3
|
-
import {isFragment,
|
|
3
|
+
import {isFragment, isHTMLOrSVGElement} from '../helpers';
|
|
4
4
|
import {createNodes} from '../helpers/dom';
|
|
5
|
-
import type {FragmentData
|
|
5
|
+
import type {FragmentData} from '../models';
|
|
6
6
|
import {mapAttributes} from './attribute';
|
|
7
|
-
import {
|
|
7
|
+
import {setReactiveValue} from './value';
|
|
8
8
|
|
|
9
9
|
const commentExpression = /^abydon\.(\d+)$/;
|
|
10
10
|
|
|
@@ -17,7 +17,7 @@ function mapNode(data: FragmentData, comment: Comment): void {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export function mapNodes(data: FragmentData, nodes:
|
|
20
|
+
export function mapNodes(data: FragmentData, nodes: ChildNode[]): void {
|
|
21
21
|
const {length} = nodes;
|
|
22
22
|
|
|
23
23
|
for (let index = 0; index < length; index += 1) {
|
|
@@ -29,12 +29,12 @@ export function mapNodes(data: FragmentData, nodes: ProperNode[]): void {
|
|
|
29
29
|
continue;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
if (
|
|
32
|
+
if (isHTMLOrSVGElement(node)) {
|
|
33
33
|
mapAttributes(data, node);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
if (node.hasChildNodes()) {
|
|
37
|
-
mapNodes(data, [...node.childNodes] as
|
|
37
|
+
mapNodes(data, [...node.childNodes] as ChildNode[]);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -42,11 +42,11 @@ export function mapNodes(data: FragmentData, nodes: ProperNode[]): void {
|
|
|
42
42
|
function mapValue(data: FragmentData, comment: Comment, value: unknown): void {
|
|
43
43
|
switch (true) {
|
|
44
44
|
case typeof value === 'function':
|
|
45
|
-
|
|
45
|
+
setComputedValue(data, comment, value as GenericCallback);
|
|
46
46
|
break;
|
|
47
47
|
|
|
48
48
|
case isReactive(value):
|
|
49
|
-
|
|
49
|
+
setReactiveValue(data, comment, value);
|
|
50
50
|
break;
|
|
51
51
|
|
|
52
52
|
default:
|
|
@@ -70,3 +70,15 @@ function replaceComment(
|
|
|
70
70
|
|
|
71
71
|
comment.replaceWith(...nodes);
|
|
72
72
|
}
|
|
73
|
+
|
|
74
|
+
function setComputedValue(
|
|
75
|
+
data: FragmentData,
|
|
76
|
+
comment: Comment,
|
|
77
|
+
callback: GenericCallback,
|
|
78
|
+
): void {
|
|
79
|
+
const value = computed(callback);
|
|
80
|
+
|
|
81
|
+
data.sentinel.values.add(value);
|
|
82
|
+
|
|
83
|
+
setReactiveValue(data, comment, value);
|
|
84
|
+
}
|
package/src/node/value.ts
CHANGED
|
@@ -3,9 +3,9 @@ import type {Key} from '@oscarpalmer/atoms/models';
|
|
|
3
3
|
import {getString} from '@oscarpalmer/atoms/string';
|
|
4
4
|
import {type Reactive, effect} from '@oscarpalmer/sentinel';
|
|
5
5
|
import type {Fragment} from '../fragment';
|
|
6
|
-
import {compareArrays,
|
|
6
|
+
import {compareArrays, isChildNode, isFragment} from '../helpers';
|
|
7
7
|
import {createNodes, replaceNodes} from '../helpers/dom';
|
|
8
|
-
import type {FragmentData, FragmentItem
|
|
8
|
+
import type {FragmentData, FragmentItem} from '../models';
|
|
9
9
|
|
|
10
10
|
function removeFragments(fragments: Fragment[] | undefined): void {
|
|
11
11
|
if (fragments != null) {
|
|
@@ -19,7 +19,7 @@ function removeFragments(fragments: Fragment[] | undefined): void {
|
|
|
19
19
|
|
|
20
20
|
function setArray(
|
|
21
21
|
fragments: Fragment[] | undefined,
|
|
22
|
-
nodes:
|
|
22
|
+
nodes: ChildNode[] | undefined,
|
|
23
23
|
comment: Comment,
|
|
24
24
|
text: Text,
|
|
25
25
|
value: unknown[],
|
|
@@ -124,11 +124,11 @@ function setArray(
|
|
|
124
124
|
|
|
125
125
|
function setNodes(
|
|
126
126
|
fragments: Fragment[] | undefined,
|
|
127
|
-
nodes:
|
|
127
|
+
nodes: ChildNode[] | undefined,
|
|
128
128
|
comment: Comment,
|
|
129
129
|
text: Text,
|
|
130
|
-
next:
|
|
131
|
-
):
|
|
130
|
+
next: ChildNode[],
|
|
131
|
+
): ChildNode[] {
|
|
132
132
|
if (nodes == null) {
|
|
133
133
|
if (comment.parentNode != null) {
|
|
134
134
|
replaceNodes([comment], next);
|
|
@@ -144,7 +144,7 @@ function setNodes(
|
|
|
144
144
|
return next;
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
export function
|
|
147
|
+
export function setReactiveValue(
|
|
148
148
|
data: FragmentData,
|
|
149
149
|
comment: Comment,
|
|
150
150
|
reactive: Reactive,
|
|
@@ -153,48 +153,50 @@ export function setReactiveNode(
|
|
|
153
153
|
const text = new Text();
|
|
154
154
|
|
|
155
155
|
let fragments: Fragment[] | undefined;
|
|
156
|
-
let nodes:
|
|
156
|
+
let nodes: ChildNode[] | undefined;
|
|
157
157
|
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
data.sentinel.effects.add(
|
|
159
|
+
effect(() => {
|
|
160
|
+
const value = reactive.get();
|
|
160
161
|
|
|
161
|
-
|
|
162
|
-
|
|
162
|
+
if (Array.isArray(value)) {
|
|
163
|
+
const result = setArray(fragments, nodes, comment, text, value);
|
|
163
164
|
|
|
164
|
-
|
|
165
|
+
fragments = typeof result === 'boolean' ? undefined : result?.fragments;
|
|
165
166
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
167
|
+
nodes =
|
|
168
|
+
typeof result === 'boolean'
|
|
169
|
+
? result
|
|
170
|
+
? [text]
|
|
171
|
+
: undefined
|
|
172
|
+
: result?.nodes;
|
|
173
|
+
} else {
|
|
174
|
+
const valueIsFragment = isFragment(value);
|
|
174
175
|
|
|
175
|
-
|
|
176
|
+
fragments = valueIsFragment ? [value] : undefined;
|
|
176
177
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
178
|
+
if (valueIsFragment || isChildNode(value)) {
|
|
179
|
+
nodes = setNodes(fragments, nodes, comment, text, createNodes(value));
|
|
180
|
+
} else {
|
|
181
|
+
nodes = setText(fragments, nodes, comment, text, value);
|
|
182
|
+
}
|
|
181
183
|
}
|
|
182
|
-
}
|
|
183
184
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
185
|
+
if (item != null) {
|
|
186
|
+
item.fragments = fragments;
|
|
187
|
+
item.nodes = [...(nodes ?? [comment])];
|
|
188
|
+
}
|
|
189
|
+
}),
|
|
190
|
+
);
|
|
189
191
|
}
|
|
190
192
|
|
|
191
193
|
function setText(
|
|
192
194
|
fragments: Fragment[] | undefined,
|
|
193
|
-
nodes:
|
|
195
|
+
nodes: ChildNode[] | undefined,
|
|
194
196
|
comment: Comment,
|
|
195
197
|
text: Text,
|
|
196
198
|
value: unknown,
|
|
197
|
-
):
|
|
199
|
+
): ChildNode[] | undefined {
|
|
198
200
|
const isNullable = isNullableOrWhitespace(value);
|
|
199
201
|
|
|
200
202
|
text.textContent = isNullable ? '' : getString(value);
|
package/types/fragment.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Key } from '@oscarpalmer/atoms/models';
|
|
2
|
-
import type { ProperNode } from './models';
|
|
3
2
|
export declare class Fragment {
|
|
4
3
|
private readonly $fragment;
|
|
5
4
|
private readonly data;
|
|
@@ -12,7 +11,7 @@ export declare class Fragment {
|
|
|
12
11
|
/**
|
|
13
12
|
* Gets a list of the fragment's nodes
|
|
14
13
|
*/
|
|
15
|
-
get():
|
|
14
|
+
get(): ChildNode[];
|
|
16
15
|
identify(identifier: Key): Fragment;
|
|
17
16
|
/**
|
|
18
17
|
* Removes the fragment from the DOM
|
package/types/helpers/dom.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function replaceNodes(from: ProperNode[], to: ProperNode[]): void;
|
|
1
|
+
export declare function createNodes(value: unknown): ChildNode[];
|
|
2
|
+
export declare function removeNodes(nodes: ChildNode[]): void;
|
|
3
|
+
export declare function replaceNodes(from: ChildNode[], to: ChildNode[]): void;
|
package/types/helpers/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Fragment } from '../fragment';
|
|
2
|
-
import type {
|
|
2
|
+
import type { HTMLOrSVGElement } from '../models';
|
|
3
3
|
export declare function compareArrays(first: unknown[], second: unknown[]): 'added' | 'dissimilar' | 'removed';
|
|
4
|
+
export declare function isChildNode(value: unknown): value is ChildNode;
|
|
4
5
|
export declare function isFragment(value: unknown): value is Fragment;
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function isProperNode(value: unknown): value is ProperNode;
|
|
6
|
+
export declare function isHTMLOrSVGElement(value: unknown): value is HTMLOrSVGElement;
|
package/types/index.d.cts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import { Key } from '@oscarpalmer/atoms/models';
|
|
4
4
|
|
|
5
|
-
export type ProperNode = CharacterData | Element;
|
|
6
5
|
export declare class Fragment {
|
|
7
6
|
private readonly $fragment;
|
|
8
7
|
private readonly data;
|
|
@@ -15,7 +14,7 @@ export declare class Fragment {
|
|
|
15
14
|
/**
|
|
16
15
|
* Gets a list of the fragment's nodes
|
|
17
16
|
*/
|
|
18
|
-
get():
|
|
17
|
+
get(): ChildNode[];
|
|
19
18
|
identify(identifier: Key): Fragment;
|
|
20
19
|
/**
|
|
21
20
|
* Removes the fragment from the DOM
|
package/types/index.d.ts
CHANGED
package/types/models.d.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import type { Key } from '@oscarpalmer/atoms/models';
|
|
2
|
+
import type { Effect, Reactive } from '@oscarpalmer/sentinel';
|
|
2
3
|
import type { Fragment } from './fragment';
|
|
3
4
|
export type FragmentData = {
|
|
4
5
|
expressions: unknown[];
|
|
5
6
|
identifier?: Key;
|
|
6
7
|
items: FragmentItem[];
|
|
8
|
+
sentinel: FragmentDataSentinel;
|
|
7
9
|
strings: TemplateStringsArray;
|
|
8
10
|
values: unknown[];
|
|
9
11
|
};
|
|
12
|
+
type FragmentDataSentinel = {
|
|
13
|
+
effects: Set<Effect>;
|
|
14
|
+
values: Set<Reactive>;
|
|
15
|
+
};
|
|
10
16
|
export type FragmentItem = {
|
|
11
17
|
fragments?: Fragment[];
|
|
12
|
-
nodes:
|
|
18
|
+
nodes: ChildNode[];
|
|
13
19
|
};
|
|
14
|
-
export type
|
|
15
|
-
export
|
|
20
|
+
export type HTMLOrSVGElement = HTMLElement | SVGElement;
|
|
21
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { FragmentData,
|
|
2
|
-
export declare function mapAttributes(data: FragmentData, element:
|
|
1
|
+
import type { FragmentData, HTMLOrSVGElement } from '../../models';
|
|
2
|
+
export declare function mapAttributes(data: FragmentData, element: HTMLOrSVGElement): void;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function setAttribute(element:
|
|
1
|
+
import type { FragmentData, HTMLOrSVGElement } from '../../models';
|
|
2
|
+
export declare function setAttribute(data: FragmentData, element: HTMLOrSVGElement, name: string, value: unknown): void;
|
package/types/node/event.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function mapEvent(element:
|
|
3
|
-
export declare function removeEvents(element:
|
|
1
|
+
import type { HTMLOrSVGElement } from '../models';
|
|
2
|
+
export declare function mapEvent(element: HTMLOrSVGElement, name: string, value: unknown): void;
|
|
3
|
+
export declare function removeEvents(element: HTMLOrSVGElement): void;
|
package/types/node/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { FragmentData
|
|
2
|
-
export declare function mapNodes(data: FragmentData, nodes:
|
|
1
|
+
import type { FragmentData } from '../models';
|
|
2
|
+
export declare function mapNodes(data: FragmentData, nodes: ChildNode[]): void;
|
package/types/node/value.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type Reactive } from '@oscarpalmer/sentinel';
|
|
2
2
|
import type { FragmentData } from '../models';
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function setReactiveValue(data: FragmentData, comment: Comment, reactive: Reactive): void;
|