@esportsplus/template 0.15.1 → 0.15.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.

Potentially problematic release.


This version of @esportsplus/template might be problematic. Click here for more details.

@@ -1,4 +1,4 @@
1
- import { effect, root } from '@esportsplus/reactivity';
1
+ import { computed, dispose, root } from '@esportsplus/reactivity';
2
2
  import { oncleanup } from './slot.js';
3
3
  import { className, isArray, isObject, raf, removeAttribute, setAttribute } from './utilities.js';
4
4
  import event from './event.js';
@@ -25,11 +25,10 @@ function attribute(element, name, value) {
25
25
  }
26
26
  function reactive(element, id, name, value, wait = false) {
27
27
  if (typeof value === 'function') {
28
- let instance = effect(() => {
28
+ let instance = computed(() => {
29
29
  let v = value(element);
30
30
  if (typeof v === 'function') {
31
- root((root) => {
32
- instance.on('cleanup', () => root.dispose());
31
+ root(() => {
33
32
  reactive(element, id, name, v(element), wait);
34
33
  });
35
34
  }
@@ -42,7 +41,7 @@ function reactive(element, id, name, value, wait = false) {
42
41
  });
43
42
  }
44
43
  });
45
- oncleanup(element, () => instance.dispose());
44
+ oncleanup(element, () => dispose(instance));
46
45
  wait = false;
47
46
  }
48
47
  else {
package/build/event.js CHANGED
@@ -11,17 +11,21 @@ let capture = new Set(['onblur', 'onfocus', 'onscroll']), controllers = new Map(
11
11
  controllers.set(event, null);
12
12
  });
13
13
  export default (element, event, listener) => {
14
- if (event === 'onmount') {
14
+ if (event === 'onconnected') {
15
15
  let interval = setInterval(() => {
16
16
  retry--;
17
17
  if (element.isConnected) {
18
18
  retry = 0;
19
- root(() => listener(element), scheduler);
19
+ root(() => listener(element));
20
20
  }
21
21
  if (retry === 0) {
22
22
  clearInterval(interval);
23
23
  }
24
- }, 1000 / 60), retry = 60, scheduler = root(({ scheduler }) => scheduler);
24
+ }, 1000 / 60), retry = 60;
25
+ return;
26
+ }
27
+ else if (event === 'oncleanup') {
28
+ oncleanup(element, () => listener(element));
25
29
  return;
26
30
  }
27
31
  else if (event === 'onrender') {
@@ -7,8 +7,8 @@ function reactive(renderable, slot) {
7
7
  slot.length = 0;
8
8
  reactive(renderable, slot);
9
9
  }, render = (i, n) => {
10
- return root(() => template(array, factory, i, n), scheduler);
11
- }, renderables = array.map(factory), scheduler = root((scope) => scope.scheduler);
10
+ return root(() => template(array, factory, i, n));
11
+ }, renderables = array.map(factory);
12
12
  array.on('pop', () => slot.pop());
13
13
  array.on('push', ({ items }) => slot.push(...render(array.length - items.length)));
14
14
  array.on('reverse', refresh);
package/build/slot.js CHANGED
@@ -1,7 +1,8 @@
1
- import { effect, root, DIRTY } from '@esportsplus/reactivity';
1
+ import { computed, dispose, root } from '@esportsplus/reactivity';
2
2
  import { RENDERABLE, RENDERABLE_REACTIVE, SLOT, SLOT_CLEANUP } from './constants.js';
3
3
  import { hydrate } from './html/index.js';
4
4
  import { firstChild, isArray, isObject, nextSibling, nodeValue, raf, text } from './utilities.js';
5
+ import { isFunction } from '@esportsplus/utilities';
5
6
  let cleanup = [], scheduled = false;
6
7
  function after(anchor, groups) {
7
8
  for (let i = 0, n = groups.length; i < n; i++) {
@@ -136,17 +137,11 @@ class Slot {
136
137
  return this.nodes.length;
137
138
  }
138
139
  render(input) {
139
- if (typeof input === 'function') {
140
- let instance = effect((self) => {
140
+ if (isFunction(input)) {
141
+ let instance = computed(() => {
141
142
  let v = input();
142
- if (typeof v === 'function') {
143
- root((root) => {
144
- instance.on('cleanup', () => root.dispose());
145
- this.render(v());
146
- });
147
- }
148
- else if (self.state === DIRTY) {
149
- this.render(v);
143
+ if (isFunction(v)) {
144
+ root(() => this.render(v()));
150
145
  }
151
146
  else {
152
147
  raf.add(() => {
@@ -154,7 +149,7 @@ class Slot {
154
149
  });
155
150
  }
156
151
  });
157
- oncleanup(this.marker, () => instance.dispose());
152
+ oncleanup(this.marker, () => dispose(instance));
158
153
  return this;
159
154
  }
160
155
  if (this.text) {
package/build/types.d.ts CHANGED
@@ -12,7 +12,8 @@ type Attributes = {
12
12
  } & {
13
13
  [key: `aria-${string}`]: string | number | boolean | undefined;
14
14
  [key: `data-${string}`]: string | undefined;
15
- onmount?: (element: Element) => void;
15
+ onconnected?: (element: Element) => void;
16
+ oncleanup?: (element: Element) => void;
16
17
  onrender?: (element: Element) => void;
17
18
  } & Record<PropertyKey, unknown>;
18
19
  type Effect<T> = () => EffectResponse<T>;
@@ -26,7 +27,7 @@ type Renderable<T = unknown> = RenderableReactive<T> | RenderableTemplate<T>;
26
27
  type RenderableReactive<T = unknown> = Readonly<{
27
28
  [RENDERABLE]: typeof RENDERABLE_REACTIVE;
28
29
  literals: null;
29
- template: (this: ReactiveArray<T>, value: T, i: number) => RenderableTemplate<T>;
30
+ template: (...args: Parameters<Parameters<ReactiveArray<T>['map']>[0]>) => RenderableTemplate<T>;
30
31
  values: ReactiveArray<T>;
31
32
  }>;
32
33
  type RenderableTemplate<T> = {
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "author": "ICJR",
3
3
  "dependencies": {
4
- "@esportsplus/reactivity": "^0.4.7",
5
- "@esportsplus/tasks": "^0.1.9",
6
- "@esportsplus/utilities": "^0.19.0"
4
+ "@esportsplus/reactivity": "^0.6.2",
5
+ "@esportsplus/tasks": "^0.1.11",
6
+ "@esportsplus/utilities": "^0.21.0"
7
7
  },
8
8
  "devDependencies": {
9
- "@esportsplus/typescript": "^0.9.1"
9
+ "@esportsplus/typescript": "^0.9.2"
10
10
  },
11
11
  "main": "./build/index.js",
12
12
  "name": "@esportsplus/template",
13
13
  "private": false,
14
14
  "type": "module",
15
15
  "types": "./build/index.d.ts",
16
- "version": "0.15.1",
16
+ "version": "0.15.2",
17
17
  "scripts": {
18
18
  "build": "tsc && tsc-alias",
19
19
  "-": "-"
package/src/attributes.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { effect, root } from '@esportsplus/reactivity';
1
+ import { computed, dispose, root } from '@esportsplus/reactivity';
2
2
  import { oncleanup } from './slot';
3
3
  import { Attributes, Element } from './types';
4
4
  import { className, isArray, isObject, raf, removeAttribute, setAttribute } from './utilities';
@@ -34,12 +34,11 @@ function attribute(element: Element, name: string, value: unknown) {
34
34
 
35
35
  function reactive(element: Element, id: string, name: string, value: unknown, wait = false) {
36
36
  if (typeof value === 'function') {
37
- let instance = effect(() => {
37
+ let instance = computed(() => {
38
38
  let v = (value as Function)(element);
39
39
 
40
40
  if (typeof v === 'function') {
41
- root((root) => {
42
- instance.on('cleanup', () => root.dispose());
41
+ root(() => {
43
42
  reactive(element, id, name, v(element), wait);
44
43
  });
45
44
  }
@@ -53,7 +52,7 @@ function reactive(element: Element, id: string, name: string, value: unknown, wa
53
52
  }
54
53
  });
55
54
 
56
- oncleanup(element, () => instance.dispose());
55
+ oncleanup(element, () => dispose(instance));
57
56
 
58
57
  wait = false;
59
58
  }
package/src/event.ts CHANGED
@@ -24,24 +24,27 @@ let capture = new Set<`on${string}`>(['onblur', 'onfocus', 'onscroll']),
24
24
 
25
25
 
26
26
  export default (element: Element, event: `on${string}`, listener: Function) => {
27
- if (event === 'onmount') {
27
+ if (event === 'onconnected') {
28
28
  let interval = setInterval(() => {
29
29
  retry--;
30
30
 
31
31
  if (element.isConnected) {
32
32
  retry = 0;
33
- root(() => listener(element), scheduler);
33
+ root(() => listener(element));
34
34
  }
35
35
 
36
36
  if (retry === 0) {
37
37
  clearInterval(interval);
38
38
  }
39
39
  }, 1000 / 60),
40
- retry = 60,
41
- scheduler = root(({ scheduler }) => scheduler);
40
+ retry = 60;
42
41
 
43
42
  return;
44
43
  }
44
+ else if (event === 'oncleanup') {
45
+ oncleanup(element, () => listener(element));
46
+ return;
47
+ }
45
48
  else if (event === 'onrender') {
46
49
  return root(() => listener(element));
47
50
  }
@@ -14,10 +14,9 @@ function reactive<T>(renderable: RenderableReactive<T>, slot: Slot) {
14
14
  reactive(renderable, slot);
15
15
  },
16
16
  render = (i: number, n?: number) => {
17
- return root(() => template(array, factory, i, n), scheduler);
17
+ return root(() => template(array, factory, i, n));
18
18
  },
19
- renderables = array.map( factory ),
20
- scheduler = root((scope) => scope.scheduler);
19
+ renderables = array.map(factory);
21
20
 
22
21
  array.on('pop', () => slot.pop());
23
22
  array.on('push', ({ items }) => slot.push(...render(array.length - items.length)));
package/src/slot.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { effect, root, DIRTY } from '@esportsplus/reactivity';
1
+ import { computed, dispose, root } from '@esportsplus/reactivity';
2
2
  import { RENDERABLE, RENDERABLE_REACTIVE, SLOT, SLOT_CLEANUP } from './constants';
3
3
  import { hydrate } from './html';
4
4
  import { Element, Elements, RenderableReactive, RenderableTemplate } from './types';
5
5
  import { firstChild, isArray, isObject, nextSibling, nodeValue, raf, text } from './utilities'
6
+ import { isFunction } from '@esportsplus/utilities';
6
7
 
7
8
 
8
9
  let cleanup: VoidFunction[] = [],
@@ -190,18 +191,12 @@ class Slot {
190
191
  }
191
192
 
192
193
  render(input: unknown) {
193
- if (typeof input === 'function') {
194
- let instance = effect((self) => {
194
+ if (isFunction(input)) {
195
+ let instance = computed(() => {
195
196
  let v = (input as Function)();
196
197
 
197
- if (typeof v === 'function') {
198
- root((root) => {
199
- instance.on('cleanup', () => root.dispose());
200
- this.render(v());
201
- });
202
- }
203
- else if (self.state === DIRTY) {
204
- this.render(v);
198
+ if (isFunction(v)) {
199
+ root(() => this.render(v()));
205
200
  }
206
201
  else {
207
202
  raf.add(() => {
@@ -210,7 +205,7 @@ class Slot {
210
205
  }
211
206
  });
212
207
 
213
- oncleanup(this.marker, () => instance.dispose());
208
+ oncleanup(this.marker, () => dispose(instance));
214
209
 
215
210
  return this;
216
211
  }
package/src/types.ts CHANGED
@@ -14,10 +14,9 @@ type Attributes = {
14
14
  } & {
15
15
  [key: `aria-${string}`]: string | number | boolean | undefined;
16
16
  [key: `data-${string}`]: string | undefined;
17
- // Element is mounted to DOM
18
- // - Trigger animations, etc.
19
- onmount?: (element: Element) => void;
20
- // Element is rendered in fragment
17
+ onconnected?: (element: Element) => void;
18
+ oncleanup?: (element: Element) => void;
19
+ // Rendered in fragment
21
20
  // - Used to retrieve reference to the element
22
21
  onrender?: (element: Element) => void;
23
22
  } & Record<PropertyKey, unknown>;
@@ -39,7 +38,9 @@ type Renderable<T = unknown> = RenderableReactive<T> | RenderableTemplate<T>;
39
38
  type RenderableReactive<T = unknown> = Readonly<{
40
39
  [RENDERABLE]: typeof RENDERABLE_REACTIVE;
41
40
  literals: null;
42
- template: (this: ReactiveArray<T>, value: T, i: number) => RenderableTemplate<T>;
41
+ template: (
42
+ ...args: Parameters< Parameters<ReactiveArray<T>['map']>[0] >
43
+ ) => RenderableTemplate<T>;
43
44
  values: ReactiveArray<T>;
44
45
  }>;
45
46