@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/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, isProperElement} from '../helpers';
3
+ import {isFragment, isHTMLOrSVGElement} from '../helpers';
4
4
  import {createNodes} from '../helpers/dom';
5
- import type {FragmentData, ProperNode} from '../models';
5
+ import type {FragmentData} from '../models';
6
6
  import {mapAttributes} from './attribute';
7
- import {setReactiveNode} from './value';
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: ProperNode[]): void {
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 (isProperElement(node)) {
32
+ if (isHTMLOrSVGElement(node)) {
33
33
  mapAttributes(data, node);
34
34
  }
35
35
 
36
36
  if (node.hasChildNodes()) {
37
- mapNodes(data, [...node.childNodes] as ProperNode[]);
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
- setReactiveNode(data, comment, computed(value as GenericCallback));
45
+ setComputedValue(data, comment, value as GenericCallback);
46
46
  break;
47
47
 
48
48
  case isReactive(value):
49
- setReactiveNode(data, comment, value);
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, isFragment, isProperNode} from '../helpers';
6
+ import {compareArrays, isChildNode, isFragment} from '../helpers';
7
7
  import {createNodes, replaceNodes} from '../helpers/dom';
8
- import type {FragmentData, FragmentItem, ProperNode} from '../models';
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: ProperNode[] | undefined,
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: ProperNode[] | undefined,
127
+ nodes: ChildNode[] | undefined,
128
128
  comment: Comment,
129
129
  text: Text,
130
- next: ProperNode[],
131
- ): ProperNode[] {
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 setReactiveNode(
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: ProperNode[] | undefined;
156
+ let nodes: ChildNode[] | undefined;
157
157
 
158
- effect(() => {
159
- const value = reactive.get();
158
+ data.sentinel.effects.add(
159
+ effect(() => {
160
+ const value = reactive.get();
160
161
 
161
- if (Array.isArray(value)) {
162
- const result = setArray(fragments, nodes, comment, text, value);
162
+ if (Array.isArray(value)) {
163
+ const result = setArray(fragments, nodes, comment, text, value);
163
164
 
164
- fragments = typeof result === 'boolean' ? undefined : result?.fragments;
165
+ fragments = typeof result === 'boolean' ? undefined : result?.fragments;
165
166
 
166
- nodes =
167
- typeof result === 'boolean'
168
- ? result
169
- ? [text]
170
- : undefined
171
- : result?.nodes;
172
- } else {
173
- const valueIsFragment = isFragment(value);
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
- fragments = valueIsFragment ? [value] : undefined;
176
+ fragments = valueIsFragment ? [value] : undefined;
176
177
 
177
- if (valueIsFragment || isProperNode(value)) {
178
- nodes = setNodes(fragments, nodes, comment, text, createNodes(value));
179
- } else {
180
- nodes = setText(fragments, nodes, comment, text, value);
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
- if (item != null) {
185
- item.fragments = fragments;
186
- item.nodes = [...(nodes ?? [comment])];
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: ProperNode[] | undefined,
195
+ nodes: ChildNode[] | undefined,
194
196
  comment: Comment,
195
197
  text: Text,
196
198
  value: unknown,
197
- ): ProperNode[] | undefined {
199
+ ): ChildNode[] | undefined {
198
200
  const isNullable = isNullableOrWhitespace(value);
199
201
 
200
202
  text.textContent = isNullable ? '' : getString(value);
@@ -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(): ProperNode[];
14
+ get(): ChildNode[];
16
15
  identify(identifier: Key): Fragment;
17
16
  /**
18
17
  * Removes the fragment from the DOM
@@ -1,4 +1,3 @@
1
- import type { ProperNode } from '../models';
2
- export declare function createNodes(value: unknown): ProperNode[];
3
- export declare function removeNodes(nodes: ProperNode[]): void;
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;
@@ -1,6 +1,6 @@
1
1
  import type { Fragment } from '../fragment';
2
- import type { ProperElement, ProperNode } from '../models';
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 isProperElement(value: unknown): value is ProperElement;
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(): ProperNode[];
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
@@ -1,2 +1,3 @@
1
+ import '@oscarpalmer/sentinel';
1
2
  export type { Fragment } from './fragment';
2
3
  export { html } from './html';
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: ProperNode[];
18
+ nodes: ChildNode[];
13
19
  };
14
- export type ProperElement = HTMLElement | SVGElement;
15
- export type ProperNode = CharacterData | Element;
20
+ export type HTMLOrSVGElement = HTMLElement | SVGElement;
21
+ export {};
@@ -1,2 +1,2 @@
1
- import type { FragmentData, ProperElement } from '../../models';
2
- export declare function mapAttributes(data: FragmentData, element: ProperElement): void;
1
+ import type { FragmentData, HTMLOrSVGElement } from '../../models';
2
+ export declare function mapAttributes(data: FragmentData, element: HTMLOrSVGElement): void;
@@ -1,2 +1,2 @@
1
- import type { ProperElement } from '../../models';
2
- export declare function setAttribute(element: ProperElement, name: string, value: unknown): void;
1
+ import type { FragmentData, HTMLOrSVGElement } from '../../models';
2
+ export declare function setAttribute(data: FragmentData, element: HTMLOrSVGElement, name: string, value: unknown): void;
@@ -1,3 +1,3 @@
1
- import type { ProperElement } from '../models';
2
- export declare function mapEvent(element: ProperElement, name: string, value: unknown): void;
3
- export declare function removeEvents(element: ProperElement): void;
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;
@@ -1,2 +1,2 @@
1
- import type { FragmentData, ProperNode } from '../models';
2
- export declare function mapNodes(data: FragmentData, nodes: ProperNode[]): void;
1
+ import type { FragmentData } from '../models';
2
+ export declare function mapNodes(data: FragmentData, nodes: ChildNode[]): void;
@@ -1,3 +1,3 @@
1
1
  import { type Reactive } from '@oscarpalmer/sentinel';
2
2
  import type { FragmentData } from '../models';
3
- export declare function setReactiveNode(data: FragmentData, comment: Comment, reactive: Reactive): void;
3
+ export declare function setReactiveValue(data: FragmentData, comment: Comment, reactive: Reactive): void;