@nifrajs/island-trigger 4.0.0 → 5.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oGAAoG;AACpG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErF,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC,MAAM,WAAW,cAAc;IAC7B,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAyCD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,IAAI,EACf,OAAO,GAAE,cAAmB,GAC3B,MAAM,IAAI,CAwFZ"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oGAAoG;AACpG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErF,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC,MAAM,WAAW,cAAc;IAC7B,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAuCD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,IAAI,EACf,OAAO,GAAE,cAAmB,GAC3B,MAAM,IAAI,CAgFZ"}
package/dist/index.js CHANGED
@@ -5,7 +5,6 @@
5
5
  */
6
6
  /** The maximum media-query length accepted from an HTML data attribute. */
7
7
  export const MAX_MEDIA_QUERY_LENGTH = 256;
8
- const NOOP = () => { };
9
8
  const mediaQuery = (strategy) => {
10
9
  if (typeof strategy !== "object" || strategy === null)
11
10
  return undefined;
@@ -21,41 +20,42 @@ export function scheduleTrigger(strategy, run, options = {}) {
21
20
  // Cast through unknown so a consumer's DOM lib cannot merge its stricter Element signatures into
22
21
  // this structural, DOM-free contract.
23
22
  const browser = globalThis;
24
- let fired = false;
25
23
  let disposed = false;
26
24
  let cleanup;
27
- const fire = () => {
28
- if (fired || disposed)
29
- return;
30
- fired = true;
25
+ // The one disposer every pending strategy returns; `cleanup` holds what that strategy registered.
26
+ const stop = () => {
27
+ disposed = true;
31
28
  cleanup?.();
32
29
  cleanup = undefined;
30
+ };
31
+ // Firing stops the trigger first, so a late event (or a dispose) finds it already done.
32
+ const fire = () => {
33
+ if (disposed)
34
+ return;
35
+ stop();
33
36
  run();
34
37
  };
35
38
  if (strategy === "load") {
36
39
  fire();
37
- return NOOP;
40
+ return stop;
38
41
  }
39
42
  if (strategy === "idle") {
40
43
  const ric = browser.requestIdleCallback;
41
44
  if (ric === undefined) {
42
- const handle = globalThis.setTimeout(fire, 1);
43
- return () => {
44
- disposed = true;
45
- globalThis.clearTimeout(handle);
46
- };
45
+ const handle = setTimeout(fire, 1);
46
+ cleanup = () => clearTimeout(handle);
47
47
  }
48
- const handle = ric(fire);
49
- return () => {
50
- disposed = true;
51
- browser.cancelIdleCallback?.(handle);
52
- };
48
+ else {
49
+ const handle = ric(fire);
50
+ cleanup = () => browser.cancelIdleCallback?.(handle);
51
+ }
52
+ return stop;
53
53
  }
54
54
  if (strategy === "visible") {
55
55
  const Observer = browser.IntersectionObserver;
56
56
  if (options.target === undefined || Observer === undefined) {
57
57
  fire();
58
- return NOOP;
58
+ return stop;
59
59
  }
60
60
  const observer = new Observer((entries) => {
61
61
  if (entries.some((entry) => entry.isIntersecting))
@@ -63,26 +63,22 @@ export function scheduleTrigger(strategy, run, options = {}) {
63
63
  });
64
64
  observer.observe(options.target);
65
65
  cleanup = () => observer.disconnect();
66
- return () => {
67
- disposed = true;
68
- cleanup?.();
69
- cleanup = undefined;
70
- };
66
+ return stop;
71
67
  }
72
68
  const query = mediaQuery(strategy);
73
69
  const matchMedia = browser.matchMedia;
74
70
  if (query === undefined)
75
- return NOOP;
71
+ return stop;
76
72
  if (matchMedia === undefined) {
77
73
  // No matchMedia means the browser cannot honor a conditional trigger. Immediate activation is
78
74
  // the availability fallback; malformed/oversized queries remain inert above.
79
75
  fire();
80
- return NOOP;
76
+ return stop;
81
77
  }
82
78
  const list = matchMedia(query);
83
79
  if (list.matches) {
84
80
  fire();
85
- return NOOP;
81
+ return stop;
86
82
  }
87
83
  const onChange = (event) => {
88
84
  if (event.matches)
@@ -97,12 +93,8 @@ export function scheduleTrigger(strategy, run, options = {}) {
97
93
  cleanup = () => list.removeListener?.(onChange);
98
94
  }
99
95
  else {
100
- return NOOP;
96
+ return stop;
101
97
  }
102
- return () => {
103
- disposed = true;
104
- cleanup?.();
105
- cleanup = undefined;
106
- };
98
+ return stop;
107
99
  }
108
100
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/island-trigger",
3
- "version": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "Tiny, framework-neutral island trigger scheduler for nifra.",
5
5
  "keywords": [
6
6
  "nifra",
package/src/index.ts CHANGED
@@ -15,8 +15,6 @@ export interface TriggerOptions {
15
15
  readonly target?: object
16
16
  }
17
17
 
18
- const NOOP = (): void => {}
19
-
20
18
  /** Structural event shape used instead of a DOM lib type so this package stays runtime-neutral. */
21
19
  interface MediaQueryChangeEvent {
22
20
  readonly matches: boolean
@@ -67,71 +65,67 @@ export function scheduleTrigger(
67
65
  // Cast through unknown so a consumer's DOM lib cannot merge its stricter Element signatures into
68
66
  // this structural, DOM-free contract.
69
67
  const browser = globalThis as unknown as BrowserCapabilities
70
- let fired = false
71
68
  let disposed = false
72
69
  let cleanup: (() => void) | undefined
73
70
 
74
- const fire = (): void => {
75
- if (fired || disposed) return
76
- fired = true
71
+ // The one disposer every pending strategy returns; `cleanup` holds what that strategy registered.
72
+ const stop = (): void => {
73
+ disposed = true
77
74
  cleanup?.()
78
75
  cleanup = undefined
76
+ }
77
+ // Firing stops the trigger first, so a late event (or a dispose) finds it already done.
78
+ const fire = (): void => {
79
+ if (disposed) return
80
+ stop()
79
81
  run()
80
82
  }
81
83
 
82
84
  if (strategy === "load") {
83
85
  fire()
84
- return NOOP
86
+ return stop
85
87
  }
86
88
 
87
89
  if (strategy === "idle") {
88
90
  const ric = browser.requestIdleCallback
89
91
  if (ric === undefined) {
90
- const handle = globalThis.setTimeout(fire, 1)
91
- return () => {
92
- disposed = true
93
- globalThis.clearTimeout(handle)
94
- }
95
- }
96
- const handle = ric(fire)
97
- return () => {
98
- disposed = true
99
- browser.cancelIdleCallback?.(handle)
92
+ const handle = setTimeout(fire, 1)
93
+ cleanup = () => clearTimeout(handle)
94
+ } else {
95
+ const handle = ric(fire)
96
+ cleanup = () => browser.cancelIdleCallback?.(handle)
100
97
  }
98
+ return stop
101
99
  }
102
100
 
103
101
  if (strategy === "visible") {
104
102
  const Observer = browser.IntersectionObserver
105
103
  if (options.target === undefined || Observer === undefined) {
106
104
  fire()
107
- return NOOP
105
+ return stop
108
106
  }
109
107
  const observer = new Observer((entries) => {
110
108
  if (entries.some((entry) => entry.isIntersecting)) fire()
111
109
  })
112
110
  observer.observe(options.target)
113
111
  cleanup = () => observer.disconnect()
114
- return () => {
115
- disposed = true
116
- cleanup?.()
117
- cleanup = undefined
118
- }
112
+ return stop
119
113
  }
120
114
 
121
115
  const query = mediaQuery(strategy)
122
116
  const matchMedia = browser.matchMedia
123
- if (query === undefined) return NOOP
117
+ if (query === undefined) return stop
124
118
  if (matchMedia === undefined) {
125
119
  // No matchMedia means the browser cannot honor a conditional trigger. Immediate activation is
126
120
  // the availability fallback; malformed/oversized queries remain inert above.
127
121
  fire()
128
- return NOOP
122
+ return stop
129
123
  }
130
124
 
131
125
  const list = matchMedia(query)
132
126
  if (list.matches) {
133
127
  fire()
134
- return NOOP
128
+ return stop
135
129
  }
136
130
 
137
131
  const onChange = (event: MediaQueryChangeEvent): void => {
@@ -144,11 +138,7 @@ export function scheduleTrigger(
144
138
  list.addListener(onChange)
145
139
  cleanup = () => list.removeListener?.(onChange)
146
140
  } else {
147
- return NOOP
148
- }
149
- return () => {
150
- disposed = true
151
- cleanup?.()
152
- cleanup = undefined
141
+ return stop
153
142
  }
143
+ return stop
154
144
  }