saloe 0.0.89 → 0.0.91

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