saloe 0.0.89 → 0.0.90

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.
@@ -203,11 +203,12 @@ const listener = ({
203
203
  }, listenAfterMs);
204
204
  };
205
205
  };
206
+ const LISTENER_SCRIPT = listener.toString();
206
207
  const getScriptListener = ({
207
208
  SRC_ELEMEMENTS_QUERY = [],
208
209
  listenAfterMs = 2500
209
210
  } = {}) => {
210
- return `<script defer>(${listener.toString()})({ SRC_ELEMEMENTS_QUERY: ${JSON.stringify(SRC_ELEMEMENTS_QUERY)}, listenAfterMs: ${listenAfterMs} })<\/script>`;
211
+ return `<script defer>(${LISTENER_SCRIPT})({ SRC_ELEMEMENTS_QUERY: ${JSON.stringify(SRC_ELEMEMENTS_QUERY)}, listenAfterMs: ${listenAfterMs} })<\/script>`;
211
212
  };
212
213
  exports.getScriptListener = getScriptListener;
213
214
  exports.listener = listener;
@@ -201,11 +201,12 @@ const listener = ({
201
201
  }, listenAfterMs);
202
202
  };
203
203
  };
204
+ const LISTENER_SCRIPT = listener.toString();
204
205
  const getScriptListener = ({
205
206
  SRC_ELEMEMENTS_QUERY = [],
206
207
  listenAfterMs = 2500
207
208
  } = {}) => {
208
- return `<script defer>(${listener.toString()})({ SRC_ELEMEMENTS_QUERY: ${JSON.stringify(SRC_ELEMEMENTS_QUERY)}, listenAfterMs: ${listenAfterMs} })<\/script>`;
209
+ return `<script defer>(${LISTENER_SCRIPT})({ SRC_ELEMEMENTS_QUERY: ${JSON.stringify(SRC_ELEMEMENTS_QUERY)}, listenAfterMs: ${listenAfterMs} })<\/script>`;
209
210
  };
210
211
  export {
211
212
  getScriptListener,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "saloe",
3
- "version": "0.0.89",
3
+ "version": "0.0.90",
4
4
  "description": "Tools for making web development easy and efficient",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -0,0 +1,293 @@
1
+ const listener = ({
2
+ SRC_ELEMEMENTS_QUERY = [],
3
+ listenAfterMs = 2_500,
4
+ } = {}) => {
5
+ const EVENTS_PREVENT_DEFAULT_MANDATORY = [
6
+ 'submit'
7
+ ]
8
+
9
+ const EVENTS = [
10
+ 'mouseover',
11
+ 'click',
12
+ 'submit',
13
+ 'input',
14
+ 'blur',
15
+ 'change',
16
+ 'focus',
17
+ 'invalid',
18
+ ]
19
+
20
+ const addListener = ({ srcElement, eventName, listeners, afterExecuteListeners }) => {
21
+ srcElement?.addEventListener(eventName, (e) => {
22
+ executeListeners({ e, srcElement, listeners, afterExecuteListeners })
23
+ })
24
+ }
25
+
26
+ const executeListeners = async ({ e, srcElement, listeners, afterExecuteListeners }) => {
27
+ await Promise.all(
28
+ (listeners ?? []).map((listener) => {
29
+ if (listener) return listener({ e, srcElement })
30
+ })
31
+ )
32
+
33
+ if (afterExecuteListeners) await afterExecuteListeners()
34
+ }
35
+
36
+ const getListenerFromScript = ({ script, eventName }) => {
37
+ if (!script) return null
38
+ if (script[eventName]) return script[eventName]
39
+ const prev = Object.keys(script)?.find((key) => script[key][eventName])
40
+ if (!prev) return null
41
+ return script[prev][eventName]
42
+ }
43
+
44
+ const fetchListeners = async ({ srcElement, eventName, e }) => {
45
+ if (!srcElement?.getAttribute) return
46
+
47
+ const scriptNames = srcElement?.getAttribute(`on-${eventName}`)
48
+ if (!scriptNames) return
49
+
50
+ if (e && scriptNames && EVENTS_PREVENT_DEFAULT_MANDATORY.includes(eventName)) e.preventDefault()
51
+
52
+ const scripts = await Promise.all(
53
+ scriptNames?.split(',')?.map((scriptName) => {
54
+ const scriptToImport = `/${scriptName?.trim()}.js`
55
+ return importScriptDynamically({ path: scriptToImport })
56
+ })
57
+ )
58
+
59
+ const listeners = scripts?.map((script) => getListenerFromScript({ script, eventName }))
60
+
61
+ return listeners
62
+ }
63
+
64
+ const addScripts = () => {
65
+ const scriptsToLoad = [...document.querySelectorAll('script[data-script-to-load]')]
66
+ return Promise.all(
67
+ scriptsToLoad?.map((scriptToLoad) => {
68
+ const id = scriptToLoad?.getAttribute('data-script-to-load')
69
+ scriptToLoad.removeAttribute('data-script-to-load')
70
+
71
+ const attrs = scriptToLoad?.getAttributeNames()?.reduce((acc, attrName) => {
72
+ const attrValue = scriptToLoad.getAttribute(attrName)
73
+ if (attrValue !== 'text/script-to-load') acc[attrName] = attrValue
74
+ return acc
75
+ }, {})
76
+
77
+ const content = scriptToLoad?.textContent
78
+
79
+ scriptToLoad?.remove()
80
+
81
+ return loadScript({ id, attrs, content }).catch((err) => {
82
+ console.error(err)
83
+ })
84
+ })
85
+ )
86
+ }
87
+
88
+ const loadScript = ({ id, attrs, content }) => {
89
+ const script = document?.createElement('script')
90
+
91
+ Object.keys(attrs)?.forEach((attrKey) => script?.setAttribute(attrKey, attrs[attrKey]))
92
+ script.id = id
93
+ script.type = 'module'
94
+
95
+ if (content) script?.insertAdjacentHTML('beforeend', content)
96
+
97
+ return new Promise((resolve, reject) => {
98
+ if (!attrs.src) {
99
+ resolve()
100
+ document?.body?.insertAdjacentElement('beforeend', script)
101
+ return
102
+ }
103
+
104
+ script.onload = script.onreadystatechange = function () {
105
+ if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
106
+ resolve()
107
+ script.onload = script.onreadystatechange = null
108
+ }
109
+ }
110
+
111
+ script.onerror = () => {
112
+ console.error('script failed to load')
113
+ reject(new Error(`Failed to load script with src ${script.src}`))
114
+ }
115
+
116
+ document?.body?.insertAdjacentElement('beforeend', script)
117
+ })
118
+ }
119
+
120
+ // FIX: return import() to prevent __vitePreload to take action
121
+ const importScriptDynamically = ({ path }) => {
122
+ return import(path)?.catch((err) => { })
123
+ }
124
+
125
+ // load
126
+ const fireLoadListener = () => {
127
+ const eventName = 'load'
128
+ const srcElements = document?.querySelectorAll(`[on-${eventName}]`)
129
+
130
+ srcElements?.forEach(async (srcElement) => {
131
+ const listeners = await fetchListeners({ srcElement, eventName, e: null })
132
+ executeListeners({ e: null, srcElement, listeners })
133
+
134
+ srcElement?.removeAttribute(`on-${eventName}`)
135
+ })
136
+ }
137
+
138
+ // invalid
139
+ const fireInvalidListener = () => {
140
+ const eventName = 'invalid'
141
+ const srcElements = document?.querySelectorAll(`[on-${eventName}]`)
142
+
143
+ srcElements?.forEach(async (srcElement) => {
144
+ const listeners = await fetchListeners({ srcElement, eventName, e: null })
145
+ addListener({ srcElement, eventName, listeners })
146
+ })
147
+ }
148
+
149
+ // blur
150
+ const fireBlurListener = () => {
151
+ const eventName = 'blur'
152
+ const srcElements = document?.querySelectorAll(`[on-${eventName}]`)
153
+
154
+ srcElements?.forEach(async (srcElement) => {
155
+ const listeners = await fetchListeners({ srcElement, eventName, e: null })
156
+ addListener({ srcElement, eventName, listeners })
157
+ })
158
+ }
159
+
160
+ // focus
161
+ const fireFocusListener = () => {
162
+ const eventName = 'focus'
163
+ const srcElements = document?.querySelectorAll(`[on-${eventName}]`)
164
+
165
+ srcElements?.forEach(async (srcElement) => {
166
+ const listeners = await fetchListeners({ srcElement, eventName, e: null })
167
+ addListener({ srcElement, eventName, listeners })
168
+ })
169
+ }
170
+
171
+ // observers
172
+ const fireObserverListeners = () => {
173
+ const srcElements = [...document.querySelectorAll('[on-observe]')]
174
+
175
+ const uniqueScriptNames = [...srcElements?.reduce((acc, srcElement) => {
176
+ const attribute = srcElement?.getAttribute('on-observe')
177
+ if (attribute === 'undefined') return acc
178
+
179
+ const scriptNames = attribute?.split(',')
180
+ scriptNames?.forEach((scriptName) => acc?.set(scriptName, 1))
181
+
182
+ return acc
183
+ }, new Map())?.keys()]
184
+
185
+ uniqueScriptNames?.forEach(async (scriptName) => {
186
+ const observedSrcElements = document.querySelectorAll(`[on-observe*="${scriptName}"]`)
187
+
188
+ const script = await importScriptDynamically({ path: `/${scriptName?.trim()}.js` })
189
+ const listener = getListenerFromScript({ script, eventName: 'observe' })
190
+ if (!listener) return
191
+
192
+ const observer = new IntersectionObserver((entries) => {
193
+ entries.forEach((entry) => listener({ entry, observer }))
194
+ }, {
195
+ threshold: .5,
196
+ })
197
+
198
+ observedSrcElements?.forEach((observerSrcElement) => {
199
+ observer.observe(observerSrcElement)
200
+
201
+ const observerAttr = observerSrcElement?.getAttribute('on-observe')
202
+ const updatedObserverAttr = observerAttr?.replaceAll(scriptName + ', ', '')?.replaceAll(', ' + scriptName, '')?.replaceAll(scriptName, '')
203
+
204
+ if (!updatedObserverAttr) observerSrcElement.removeAttribute('on-observe')
205
+ else observerSrcElement.setAttribute('on-observe', updatedObserverAttr)
206
+ })
207
+ })
208
+ }
209
+
210
+ const getSrcElement = ({ srcElement, eventName }) => {
211
+ if (!srcElement?.hasAttribute) return srcElement
212
+ const attribute = `on-${eventName}`
213
+ const hasScriptName = srcElement?.hasAttribute(attribute)
214
+ if (hasScriptName) return srcElement
215
+
216
+ const query = `:is(${['a', 'button', ...SRC_ELEMEMENTS_QUERY].join(',')})[${attribute}]`
217
+ const closestButton = srcElement?.closest(query)
218
+ if (closestButton) return closestButton
219
+
220
+ return srcElement
221
+ }
222
+
223
+ const cloneSrcElement = ({ srcElement }) => {
224
+ const newSrcElement = document.createElement(srcElement?.tagName)
225
+
226
+ Array.from(srcElement?.attributes).forEach((attr) => {
227
+ if (attr.name.startsWith('on-')) return
228
+ newSrcElement.setAttribute(attr.name, attr.value)
229
+ })
230
+
231
+ return newSrcElement
232
+ }
233
+
234
+ const isAnchorBeingClicked = ({ srcElement, eventName }) => {
235
+ return srcElement?.tagName === 'A' && eventName === 'click'
236
+ }
237
+
238
+ const clickDefaultAnchor = ({ srcElement }) => {
239
+ const newAnchor = cloneSrcElement({ srcElement })
240
+ newAnchor.click()
241
+ }
242
+
243
+ const fireListeners = () => {
244
+ EVENTS.forEach((eventName) => {
245
+ document.body[`on${eventName}`] = async (e) => {
246
+ const srcElement = getSrcElement({ srcElement: e?.srcElement, eventName })
247
+ const isAnchorClicked = isAnchorBeingClicked({ srcElement, eventName })
248
+
249
+ if (isAnchorClicked) e.preventDefault()
250
+
251
+ const listeners = await fetchListeners({ srcElement, eventName, e })
252
+ const afterExecuteListeners = isAnchorClicked
253
+ ? () => { clickDefaultAnchor({ srcElement }) }
254
+ : null
255
+
256
+ executeListeners({ e, srcElement, listeners, afterExecuteListeners })
257
+ addListener({ srcElement, eventName, listeners, afterExecuteListeners })
258
+
259
+ if (srcElement?.removeAttribute) srcElement.removeAttribute(`on-${eventName}`)
260
+ }
261
+ })
262
+
263
+ const saloeListenEvent = new CustomEvent('saloeListen', {
264
+ detail: { message: 'This is a custom eventName!' }
265
+ })
266
+
267
+ document.body.addEventListener('saloeListen', async (e) => {
268
+ await addScripts()
269
+ fireLoadListener()
270
+ fireObserverListeners()
271
+ })
272
+
273
+ document.body.saloeListen = function () {
274
+ document.body.dispatchEvent(saloeListenEvent)
275
+ }
276
+
277
+ }
278
+
279
+ fireListeners()
280
+
281
+ window.onload = () => {
282
+ setTimeout(() => {
283
+ document.body.saloeListen()
284
+ }, listenAfterMs)
285
+ }
286
+ }
287
+
288
+ const LISTENER_SCRIPT = listener.toString()
289
+
290
+ export {
291
+ listener,
292
+ LISTENER_SCRIPT,
293
+ }
package/src/listener.js CHANGED
@@ -1,295 +1,11 @@
1
- const listener = ({
2
- SRC_ELEMEMENTS_QUERY = [],
3
- listenAfterMs = 2_500,
4
- } = {}) => {
5
- const EVENTS_PREVENT_DEFAULT_MANDATORY = [
6
- 'submit'
7
- ]
8
-
9
- const EVENTS = [
10
- 'mouseover',
11
- 'click',
12
- 'submit',
13
- 'input',
14
- 'blur',
15
- 'change',
16
- 'focus',
17
- 'invalid',
18
- ]
19
-
20
- const addListener = ({ srcElement, eventName, listeners, afterExecuteListeners }) => {
21
- srcElement?.addEventListener(eventName, (e) => {
22
- executeListeners({ e, srcElement, listeners, afterExecuteListeners })
23
- })
24
- }
25
-
26
- const executeListeners = async ({ e, srcElement, listeners, afterExecuteListeners }) => {
27
- await Promise.all(
28
- (listeners ?? []).map((listener) => {
29
- if (listener) return listener({ e, srcElement })
30
- })
31
- )
32
-
33
- if (afterExecuteListeners) await afterExecuteListeners()
34
- }
35
-
36
- const getListenerFromScript = ({ script, eventName }) => {
37
- if (!script) return null
38
- if (script[eventName]) return script[eventName]
39
- const prev = Object.keys(script)?.find((key) => script[key][eventName])
40
- if (!prev) return null
41
- return script[prev][eventName]
42
- }
43
-
44
- const fetchListeners = async ({ srcElement, eventName, e }) => {
45
- if (!srcElement?.getAttribute) return
46
-
47
- const scriptNames = srcElement?.getAttribute(`on-${eventName}`)
48
- if (!scriptNames) return
49
-
50
- if (e && scriptNames && EVENTS_PREVENT_DEFAULT_MANDATORY.includes(eventName)) e.preventDefault()
51
-
52
- const scripts = await Promise.all(
53
- scriptNames?.split(',')?.map((scriptName) => {
54
- const scriptToImport = `/${scriptName?.trim()}.js`
55
- return importScriptDynamically({ path: scriptToImport })
56
- })
57
- )
58
-
59
- const listeners = scripts?.map((script) => getListenerFromScript({ script, eventName }))
60
-
61
- return listeners
62
- }
63
-
64
- const addScripts = () => {
65
- const scriptsToLoad = [...document.querySelectorAll('script[data-script-to-load]')]
66
- return Promise.all(
67
- scriptsToLoad?.map((scriptToLoad) => {
68
- const id = scriptToLoad?.getAttribute('data-script-to-load')
69
- scriptToLoad.removeAttribute('data-script-to-load')
70
-
71
- const attrs = scriptToLoad?.getAttributeNames()?.reduce((acc, attrName) => {
72
- const attrValue = scriptToLoad.getAttribute(attrName)
73
- if (attrValue !== 'text/script-to-load') acc[attrName] = attrValue
74
- return acc
75
- }, {})
76
-
77
- const content = scriptToLoad?.textContent
78
-
79
- scriptToLoad?.remove()
80
-
81
- return loadScript({ id, attrs, content }).catch((err) => {
82
- console.error(err)
83
- })
84
- })
85
- )
86
- }
87
-
88
- const loadScript = ({ id, attrs, content }) => {
89
- const script = document?.createElement('script')
90
-
91
- Object.keys(attrs)?.forEach((attrKey) => script?.setAttribute(attrKey, attrs[attrKey]))
92
- script.id = id
93
- script.type = 'module'
94
-
95
- if (content) script?.insertAdjacentHTML('beforeend', content)
96
-
97
- return new Promise((resolve, reject) => {
98
- if (!attrs.src) {
99
- resolve()
100
- document?.body?.insertAdjacentElement('beforeend', script)
101
- return
102
- }
103
-
104
- script.onload = script.onreadystatechange = function () {
105
- if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
106
- resolve()
107
- script.onload = script.onreadystatechange = null
108
- }
109
- }
110
-
111
- script.onerror = () => {
112
- console.error('script failed to load')
113
- reject(new Error(`Failed to load script with src ${script.src}`))
114
- }
115
-
116
- document?.body?.insertAdjacentElement('beforeend', script)
117
- })
118
- }
119
-
120
- // FIX: return import() to prevent __vitePreload to take action
121
- const importScriptDynamically = ({ path }) => {
122
- return import(path)?.catch((err) => { })
123
- }
124
-
125
- // load
126
- const fireLoadListener = () => {
127
- const eventName = 'load'
128
- const srcElements = document?.querySelectorAll(`[on-${eventName}]`)
129
-
130
- srcElements?.forEach(async (srcElement) => {
131
- const listeners = await fetchListeners({ srcElement, eventName, e: null })
132
- executeListeners({ e: null, srcElement, listeners })
133
-
134
- srcElement?.removeAttribute(`on-${eventName}`)
135
- })
136
- }
137
-
138
- // invalid
139
- const fireInvalidListener = () => {
140
- const eventName = 'invalid'
141
- const srcElements = document?.querySelectorAll(`[on-${eventName}]`)
142
-
143
- srcElements?.forEach(async (srcElement) => {
144
- const listeners = await fetchListeners({ srcElement, eventName, e: null })
145
- addListener({ srcElement, eventName, listeners })
146
- })
147
- }
148
-
149
- // blur
150
- const fireBlurListener = () => {
151
- const eventName = 'blur'
152
- const srcElements = document?.querySelectorAll(`[on-${eventName}]`)
1
+ import { listener, LISTENER_SCRIPT } from './constants'
153
2
 
154
- srcElements?.forEach(async (srcElement) => {
155
- const listeners = await fetchListeners({ srcElement, eventName, e: null })
156
- addListener({ srcElement, eventName, listeners })
157
- })
158
- }
159
-
160
- // focus
161
- const fireFocusListener = () => {
162
- const eventName = 'focus'
163
- const srcElements = document?.querySelectorAll(`[on-${eventName}]`)
164
-
165
- srcElements?.forEach(async (srcElement) => {
166
- const listeners = await fetchListeners({ srcElement, eventName, e: null })
167
- addListener({ srcElement, eventName, listeners })
168
- })
169
- }
170
-
171
- // observers
172
- const fireObserverListeners = () => {
173
- const srcElements = [...document.querySelectorAll('[on-observe]')]
174
-
175
- const uniqueScriptNames = [...srcElements?.reduce((acc, srcElement) => {
176
- const attribute = srcElement?.getAttribute('on-observe')
177
- if (attribute === 'undefined') return acc
178
-
179
- const scriptNames = attribute?.split(',')
180
- scriptNames?.forEach((scriptName) => acc?.set(scriptName, 1))
181
-
182
- return acc
183
- }, new Map())?.keys()]
184
-
185
- uniqueScriptNames?.forEach(async (scriptName) => {
186
- const observedSrcElements = document.querySelectorAll(`[on-observe*="${scriptName}"]`)
187
-
188
- const script = await importScriptDynamically({ path: `/${scriptName?.trim()}.js` })
189
- const listener = getListenerFromScript({ script, eventName: 'observe' })
190
- if (!listener) return
191
-
192
- const observer = new IntersectionObserver((entries) => {
193
- entries.forEach((entry) => listener({ entry, observer }))
194
- }, {
195
- threshold: .5,
196
- })
197
-
198
- observedSrcElements?.forEach((observerSrcElement) => {
199
- observer.observe(observerSrcElement)
200
-
201
- const observerAttr = observerSrcElement?.getAttribute('on-observe')
202
- const updatedObserverAttr = observerAttr?.replaceAll(scriptName + ', ', '')?.replaceAll(', ' + scriptName, '')?.replaceAll(scriptName, '')
203
-
204
- if (!updatedObserverAttr) observerSrcElement.removeAttribute('on-observe')
205
- else observerSrcElement.setAttribute('on-observe', updatedObserverAttr)
206
- })
207
- })
208
- }
209
-
210
- const getSrcElement = ({ srcElement, eventName }) => {
211
- if (!srcElement?.hasAttribute) return srcElement
212
- const attribute = `on-${eventName}`
213
- const hasScriptName = srcElement?.hasAttribute(attribute)
214
- if (hasScriptName) return srcElement
215
-
216
- const query = `:is(${['a', 'button', ...SRC_ELEMEMENTS_QUERY].join(',')})[${attribute}]`
217
- const closestButton = srcElement?.closest(query)
218
- if (closestButton) return closestButton
219
-
220
- return srcElement
221
- }
222
-
223
- const cloneSrcElement = ({ srcElement }) => {
224
- const newSrcElement = document.createElement(srcElement?.tagName)
225
-
226
- Array.from(srcElement?.attributes).forEach((attr) => {
227
- if (attr.name.startsWith('on-')) return
228
- newSrcElement.setAttribute(attr.name, attr.value)
229
- })
230
-
231
- return newSrcElement
232
- }
233
-
234
- const isAnchorBeingClicked = ({ srcElement, eventName }) => {
235
- return srcElement?.tagName === 'A' && eventName === 'click'
236
- }
237
-
238
- const clickDefaultAnchor = ({ srcElement }) => {
239
- const newAnchor = cloneSrcElement({ srcElement })
240
- newAnchor.click()
241
- }
242
-
243
- const fireListeners = () => {
244
- EVENTS.forEach((eventName) => {
245
- document.body[`on${eventName}`] = async (e) => {
246
- const srcElement = getSrcElement({ srcElement: e?.srcElement, eventName })
247
- const isAnchorClicked = isAnchorBeingClicked({ srcElement, eventName })
248
-
249
- if (isAnchorClicked) e.preventDefault()
250
-
251
- const listeners = await fetchListeners({ srcElement, eventName, e })
252
- const afterExecuteListeners = isAnchorClicked
253
- ? () => { clickDefaultAnchor({ srcElement }) }
254
- : null
255
-
256
- executeListeners({ e, srcElement, listeners, afterExecuteListeners })
257
- addListener({ srcElement, eventName, listeners, afterExecuteListeners })
258
-
259
- if (srcElement?.removeAttribute) srcElement.removeAttribute(`on-${eventName}`)
260
- }
261
- })
262
-
263
- const saloeListenEvent = new CustomEvent('saloeListen', {
264
- detail: { message: 'This is a custom eventName!' }
265
- })
266
-
267
- document.body.addEventListener('saloeListen', async (e) => {
268
- await addScripts()
269
- fireLoadListener()
270
- fireObserverListeners()
271
- })
272
-
273
- document.body.saloeListen = function () {
274
- document.body.dispatchEvent(saloeListenEvent)
275
- }
276
-
277
- }
278
-
279
- fireListeners()
280
-
281
- window.onload = () => {
282
- setTimeout(() => {
283
- document.body.saloeListen()
284
- }, listenAfterMs)
285
- }
286
- }
287
3
 
288
4
  const getScriptListener = ({
289
5
  SRC_ELEMEMENTS_QUERY = [],
290
6
  listenAfterMs = 2_500
291
7
  } = {}) => {
292
- return `<script defer>(${listener.toString()})({ SRC_ELEMEMENTS_QUERY: ${JSON.stringify(SRC_ELEMEMENTS_QUERY)}, listenAfterMs: ${listenAfterMs} })</script>`
8
+ return `<script defer>(${LISTENER_SCRIPT})({ SRC_ELEMEMENTS_QUERY: ${JSON.stringify(SRC_ELEMEMENTS_QUERY)}, listenAfterMs: ${listenAfterMs} })</script>`
293
9
  }
294
10
 
295
11
  export {