@adartem/adlib-attributes 0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 ADARTEM
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,212 @@
1
+ # @adartem/adlib-attributes
2
+
3
+ `@adartem/adlib-attributes` est le **package central** de la plateforme **AdLib**.
4
+ Il regroupe le **core unifié**, le **runtime global** et le **loader officiel**
5
+ `attributes.js`.
6
+
7
+ 👉 C’est le **seul point d’entrée requis** pour utiliser AdLib côté navigateur.
8
+
9
+ ---
10
+
11
+ ## 🎯 Rôle
12
+
13
+ - Loader ESM universel (`dist/attributes.js`)
14
+ - Runtime global unique
15
+ - Core d’événements et de délégation
16
+ - Chargement dynamique des modules `ad-*`
17
+ - Auto-scan optionnel du DOM
18
+ - API globale exposée via `window.AdLibAttributes`
19
+
20
+ ---
21
+
22
+ ## 📦 Contenu du package
23
+
24
+ ### Loader
25
+ - Fichier distribué : `dist/attributes.js`
26
+ - Conçu pour être chargé via CDN ou bundler
27
+ - Initialise automatiquement le runtime dans le navigateur
28
+
29
+ ### Runtime
30
+ - Orchestration des modules `ad-*`
31
+ - Gestion des états (`idle`, `loading`, `ready`, `error`)
32
+ - Import dynamique ESM
33
+ - API globale stable
34
+
35
+ ### Core
36
+ - Délégation d’événements
37
+ - Émission d’événements personnalisés
38
+ - Enregistrement et cycle de vie des modules
39
+ - Support DOM statique et dynamique
40
+
41
+ ---
42
+
43
+ ## 🌍 API globale
44
+
45
+ Une fois le loader chargé, le runtime est exposé globalement :
46
+
47
+ ```js
48
+ window.AdLibAttributes
49
+ ```
50
+
51
+ ### Interface principale
52
+
53
+ ```ts
54
+ interface AdLibRuntime {
55
+ version: string;
56
+ config: RuntimeConfig;
57
+ core: Core;
58
+ debug: boolean;
59
+
60
+ modules: Record<string, RuntimeModuleState>;
61
+
62
+ load(key: ModuleKey): Promise<RuntimeModuleState>;
63
+ reload(key: ModuleKey): Promise<RuntimeModuleState>;
64
+ push(
65
+ key: ModuleKey,
66
+ cb: (state: RuntimeModuleState) => void
67
+ ): void;
68
+
69
+ /**
70
+ * Détruit le runtime et les modules chargés.
71
+ * ⚠️ Ne détruit PAS le Core singleton partagé.
72
+ */
73
+ destroy(options?: { keepGlobal?: boolean }): void;
74
+ }
75
+ ```
76
+
77
+ ---
78
+
79
+ ## 🧭 États des modules
80
+
81
+ Chaque module `ad-*` expose un état :
82
+
83
+ - `idle` — non chargé
84
+ - `loading` — import en cours
85
+ - `ready` — initialisé
86
+ - `error` — échec d’import ou d’initialisation
87
+
88
+ Accessible via :
89
+
90
+ ```js
91
+ window.AdLibAttributes.modules['ad-click']
92
+ ```
93
+
94
+ ---
95
+
96
+ ## ⏳ File d’attente globale (queue)
97
+
98
+ Avant le chargement effectif du runtime, il est possible de déclarer des callbacks
99
+ dans une file globale :
100
+
101
+ ```js
102
+ window.AdLibAttributesQueue = [
103
+ ['ad-click', (state) => {
104
+ if (state.status === 'ready') {
105
+ console.log('ad-click prĂŞt');
106
+ }
107
+ }]
108
+ ];
109
+ ```
110
+
111
+ 👉 Le runtime consomme automatiquement cette queue à l’initialisation.
112
+
113
+ ---
114
+
115
+ ## 🔍 Scan du DOM & conventions
116
+
117
+ ### Attributs reconnus
118
+ - `ad-*`
119
+ - `data-ad-*`
120
+
121
+ Exemples équivalents :
122
+
123
+ ```html
124
+ <button ad-click></button>
125
+ <button data-ad-click></button>
126
+ ```
127
+
128
+ ### Auto-scan
129
+
130
+ Lorsque l’option `auto` est activée :
131
+ - Scan initial du DOM
132
+ - Observation des ajouts dynamiques (`MutationObserver`)
133
+ - Chargement automatique des modules requis
134
+
135
+ ---
136
+
137
+ ## 🔗 Résolution dynamique des modules
138
+
139
+ Chaque module `ad-*` est résolu via une map interne au runtime.
140
+
141
+ Logique de résolution (simplifiée) :
142
+
143
+ ```text
144
+ {registry|base}/@adartem/ad-click@{version}/dist/index.js
145
+ ```
146
+
147
+ Les paramètres de résolution sont configurables via les attributs
148
+ `data-adlib-*` du loader.
149
+
150
+ ---
151
+
152
+ ## 🚀 Snippets recommandés
153
+
154
+ ### Intégration standard (head ou footer)
155
+
156
+ ```html
157
+ <script
158
+ type="module"
159
+ src="https://cdn.jsdelivr.net/npm/@adartem/adlib-attributes@latest/dist/attributes.js"
160
+ data-adlib-auto="true"
161
+ ad-click
162
+ ></script>
163
+ ```
164
+
165
+ ### Paramètres disponibles
166
+
167
+ | Attribut | Description |
168
+ |--------|-------------|
169
+ | `ad-*` | Modules Ă  charger |
170
+ | `data-adlib-auto` | Active l’auto-scan |
171
+ | `data-adlib-registry` | Registry CDN |
172
+ | `data-adlib-base` | Base URL personnalisée |
173
+ | `data-adlib-version` | Version des modules |
174
+ | `data-adlib-debug` | Logs debug |
175
+
176
+ 👉 Tous les paramètres sont optionnels.
177
+
178
+ ---
179
+
180
+ ## đź§© Utilisation avec bundler
181
+
182
+ Le package peut aussi être importé directement (side-effect import) :
183
+
184
+ ```js
185
+ import '@adartem/adlib-attributes/attributes.js';
186
+ ```
187
+
188
+ 👉 Le loader s’exécute automatiquement en environnement navigateur.
189
+
190
+ ---
191
+
192
+ ## 📦 Exports & distribution
193
+
194
+ - Bundle **ESM**
195
+ - Compatible CDN (jsDelivr, unpkg, etc.)
196
+ - Fichiers générés dans `dist/`
197
+ - Sourcemaps incluses
198
+
199
+ ---
200
+
201
+ ## 🧪 Développement
202
+
203
+ ```bash
204
+ pnpm -r --filter @adartem/adlib-attributes build
205
+ pnpm -r test
206
+ ```
207
+
208
+ ---
209
+
210
+ ## 🪪 Licence
211
+
212
+ MIT © ADARTEM
package/attributes.js ADDED
@@ -0,0 +1,2 @@
1
+ function N(e){return e.startsWith("ad-")&&e.length>3}function I(e){return e.startsWith("data-")?e.slice(5):e}function V(e){return typeof e!="object"||e===null?!1:typeof e.querySelectorAll=="function"}function j(e=document){if(!V(e))return[];let t=new Set,r=e.querySelectorAll("*");for(let i of Array.from(r))for(let s of Array.from(i.attributes)){let a=I(s.name);N(a)&&t.add(a)}return Array.from(t)}function k(){return typeof window<"u"&&typeof document<"u"}function z(e=!1){return{debug:(...t)=>{e&&console.warn("[debug]",...t)},warn:(...t)=>{console.warn("[warn]",...t)},error:(...t)=>{console.error("[error]",...t)}}}function B(e){return typeof Element<"u"&&e instanceof Element}function U(e,t){try{return e.matches(t)}catch{return!1}}function Y(e,t){let r=e;for(;r;){if(B(r)&&U(r,t))return r;r=B(r)?r.parentElement:null}return null}function W(e){return t=>{let r=e.entries.slice();for(let i of r){let s=Y(t.target,i.selector);if(s&&(i.handler(t,s),i.once)){let a=e.entries.indexOf(i);a>=0&&e.entries.splice(a,1)}}}}function J(e){return e instanceof Document?e.documentElement??e:e}function x(e={}){let t=e.root??document,r=z(!!e.debug),i=new Map,s=new Map,a=new Map;function g(u,l,o,n={}){let c=!!n.capture,f=!!n.passive,m=a.get(u);if(m)return m.entries.push({selector:l,handler:o,once:!!n.once}),()=>{let v=m.entries.findIndex(S=>S.selector===l&&S.handler===o);v>=0&&m.entries.splice(v,1),m.entries.length===0&&(t.removeEventListener(u,m.listener,{capture:m.capture}),a.delete(u))};let w={capture:c,passive:f,entries:[{selector:l,handler:o,once:!!n.once}],listener:()=>{}},_=W(w);return w.listener=_,a.set(u,w),t.addEventListener(u,_,{capture:c,passive:f}),()=>{let v=a.get(u);if(!v)return;let S=v.entries.findIndex(q=>q.selector===l&&q.handler===o);S>=0&&v.entries.splice(S,1),v.entries.length===0&&(t.removeEventListener(u,v.listener,{capture:v.capture}),a.delete(u))}}function d(u,l,o){let n=new CustomEvent(l,{detail:o,bubbles:!0});u.dispatchEvent(n)}function y(u){i.set(u.key,u)}function p(u){i.delete(u)}function M(u,l){let o=i.get(u);if(!o||s.has(u))return;let n=o.init(O);s.set(u,n)}function A(u){let l=s.get(u);l&&(l.destroy(),s.delete(u))}function h(u){for(let l of i.keys())M(l)}function R(){for(let u of s.keys())A(u)}let b=null;function D(u=t){return b?()=>{}:(b=new MutationObserver(l=>{}),b.observe(J(u),{subtree:!0,childList:!0,attributes:!1}),()=>E())}function E(){b&&(b.disconnect(),b=null)}function C(){E(),R();for(let[u,l]of a.entries())t.removeEventListener(u,l.listener,{capture:l.capture});a.clear(),i.clear(),s.clear()}function K(){return r}let O={on:g,emit:d,register:y,unregister:p,mount:M,unmount:A,mountAll:h,unmountAll:R,observe:D,stopObserving:E,destroy:C,getLogger:K};return O}var L=null;function $(e={}){return L||(L=x({autoMount:!0,...e}),(e.autoMount??!0)&&typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{L?.mountAll()},{once:!0}):L.mountAll()),L)}function X(e){return e.trim().replace(/\/+$/,"")}function Z(e){return X(e.base??e.registry)}function ee(e){return(e.version??"").trim()||"latest"}function te(e,t,r){return`${e}/@adartem/${t}@${r}/dist/index.js`}var ne={"ad-click":"ad-click"};function T(e,t){let r=Z(t),i=ee(t),s=ne[e];return s?te(r,s,i):null}var re="https://cdn.jsdelivr.net/npm";function oe(e,t){return e[t]??(e[t]={key:t,status:"idle"})}function ie(e){return e.status==="ready"||e.status==="error"}function se(e){return e instanceof Error?e:new Error(String(e))}function H(e){let t=(e??"").trim();if(t)return t.replace(/\/+$/,"")}function ue(e){let t=H(e.config?.registry)??re,r=(e.config?.version??e.version).trim()||e.version,i={registry:t,version:r},s=H(e.config?.base);return s&&(i.base=s),i}function ce(e,t){let r=e&&typeof e=="object"?e.default??e:e;if(!r||typeof r!="object")throw new Error(`Invalid module definition for ${t}`);let i=r;if(typeof i.key!="string"||typeof i.init!="function")throw new Error(`Invalid module definition for ${t}`);if(i.key!==t)throw new Error(`Module key mismatch: expected "${t}", got "${i.key}"`);return i}function Q(e){let t=e.debug??!1,r=e.auto??!1,i=e.core==null,s=e.core??x({debug:t,autoMount:!1}),a=s.getLogger(),g=ue(e),d={},y=[],p=null;function M(...o){t&&a.debug("[AdLib Runtime]",...o)}function A(...o){a.error("[AdLib Runtime]",...o)}function h(o,n){for(let c=y.length-1;c>=0;c--){let f=y[c];if(f&&f.key===o){y.splice(c,1);try{f.cb(n)}catch(m){A("push callback failed",o,m)}}}}function R(o){let n=d[o];if(n){try{n.instance?.destroy?.()}catch(c){A("destroyModule failed",o,c)}delete n.instance,delete n.def,delete n.error,delete n.promise,n.status="idle"}}async function b(o){let n=oe(d,o);if(n.status==="ready"||n.status==="error")return n;if(n.status==="loading"&&n.promise)return n.promise;let c=T(o,g);if(!c)return n.status="error",n.error=new Error(`Unknown module key: ${o}`),h(o,n),n;n.status="loading",M("load()",o,"->",c);let f=(async()=>{try{let m=await import(c),w=ce(m,o);return n.def=w,n.instance||(n.instance=w.init(s)),n.status="ready",delete n.error,delete n.promise,h(o,n),n}catch(m){return n.status="error",n.error=se(m),delete n.promise,h(o,n),n}})();return n.promise=f,f}async function D(o){return M("reload()",o),R(o),b(o)}function E(o,n){let c=d[o];if(c&&ie(c)){try{n(c)}catch(f){A("push callback failed",o,f)}return}y.push({key:o,cb:n})}function C(o=document){let n=j(o);for(let c of n)b(c)}function K(){k()&&(p||(p=new MutationObserver(o=>{for(let n of o)for(let c of Array.from(n.addedNodes))c instanceof HTMLElement&&C(c)}),p.observe(document.documentElement,{childList:!0,subtree:!0})))}function O(){p?.disconnect(),p=null}function u(o){M("destroy()"),O();for(let n of Object.values(d))try{n.instance?.destroy?.()}catch(c){A("destroy module failed",n.key,c)}if(i)try{s.destroy()}catch(n){A("core.destroy failed",n)}for(let n of Object.keys(d))delete d[n];y.length=0,!o?.keepGlobal&&typeof window<"u"&&delete window.AdLibAttributes}let l={version:e.version,config:g,core:s,debug:t,modules:d,load:b,push:E,reload:D,destroy:u};if(typeof window<"u"){let o=window.AdLibAttributesQueue;if(Array.isArray(o)&&o.length>0){let n=o.splice(0,o.length);for(let[c,f]of n)l.push(c,f)}}return r&&k()&&(C(document.body??document),K()),l}function ae(e){return typeof e=="object"&&e!==null&&typeof e.getAttributeNames=="function"}function le(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function de(e){if(typeof e!="object"||e===null)return!1;let t=e.attributes;if(typeof t!="object"||t===null)return!1;let r=t;return typeof r.length=="number"&&typeof r.item=="function"}function fe(e){return typeof e!="object"||e===null?!1:typeof e.querySelectorAll=="function"}function me(e){if(ae(e)){let t=e.getAttributeNames();if(le(t))return t}if(de(e)){let t=[];for(let r=0;r<e.attributes.length;r++){let i=e.attributes.item(r);i&&typeof i.name=="string"&&i.name&&t.push(i.name)}return t}return[]}function ge(e){let t=(e.getAttribute("type")??"").trim();if(t&&t!=="module")return!1;let r=(e.getAttribute("src")??"").trim();return r?r.includes("attributes.js"):!1}function P(e){if(typeof e!="string")return;let t=e.trim();return t||void 0}function G(e,t){if(typeof e!="string")return t;let r=e.trim().toLowerCase();return r===""||r==="true"||r==="1"||r==="yes"||r==="on"?!0:r==="false"||r==="0"||r==="no"||r==="off"?!1:t}function pe(e){let t=e.dataset??{},r=G(t.adlibDebug,!1),i=G(t.adlibAuto,!0),s=P(t.adlibRegistry),a=P(t.adlibVersion),g=P(t.adlibBase),d={};return s&&(d.registry=s),a&&(d.version=a),g&&(d.base=g),{debug:r,auto:i,config:d}}function F(e=document){if(!fe(e))return[];let t=Array.from(e.querySelectorAll("script")),r=[];for(let i of t){if(!(i instanceof HTMLScriptElement)||!ge(i))continue;let s=new Set;for(let a of me(i)){let g=I(a);N(g)&&s.add(g)}r.push({el:i,requestedKeys:Array.from(s),loaderConfig:pe(i)})}return r}var ye="0.0.0";(function(){if(!k()||window.AdLibAttributes)return;let t=F(document),r=t[0],i=r?.loaderConfig.debug??!1,s=r?.loaderConfig.auto??!0,a=r?.loaderConfig.config??{},g=$({root:document,debug:i}),d=Q({version:ye,core:g,debug:i,auto:s,config:a});window.AdLibAttributes=d;let y=new Set;for(let p of t)for(let M of p.requestedKeys)y.add(M);for(let p of y)d.load(p).catch(()=>{})})();
2
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../adlib-utils/src/attributes/keys.ts","../../adlib-utils/src/dom/guards.ts","../../adlib-utils/src/dom/scan.ts","../../adlib-utils/src/env/bool.ts","../../adlib-utils/src/env/index.ts","../src/core/index.ts","../src/runtime/module-map.ts","../src/runtime/runtime.ts","../src/runtime/script-detection.ts","../src/runtime/attributes.ts"],"sourcesContent":["import type { ModuleKey } from '../types';\n\nexport function isModuleKey(value: string): value is ModuleKey {\n return value.startsWith('ad-') && value.length > 3;\n}\n\nexport function normalizeAttributeName(name: string): string {\n return name.startsWith('data-') ? name.slice(5) : name;\n}","export type QuerySelectorAllHost = {\n querySelectorAll(selectors: string): NodeListOf<Element>;\n};\n\n/**\n * Type guard: vérifie que `value` expose bien `querySelectorAll`.\n * - sans `any`\n * - sans accès unsafe\n */\nexport function hasQuerySelectorAll(value: unknown): value is QuerySelectorAllHost {\n if (typeof value !== 'object' || value === null) return false;\n\n // On passe par une signature \"indexée\" typée en unknown,\n // puis on raffine vers Function.\n const v = value as Record<string, unknown>;\n const qsa = v['querySelectorAll'];\n\n return typeof qsa === 'function';\n}","import { isModuleKey, normalizeAttributeName } from '../attributes/keys';\nimport type { ModuleKey } from '../types';\nimport { hasQuerySelectorAll } from './guards';\n\nexport function collectModuleKeysFromDOM(root: ParentNode = document): ModuleKey[] {\n if (!hasQuerySelectorAll(root)) return [];\n\n const found = new Set<string>();\n const elements = root.querySelectorAll<HTMLElement>('*');\n\n for (const el of Array.from(elements)) {\n for (const attr of Array.from(el.attributes)) {\n const normalized = normalizeAttributeName(attr.name);\n if (!isModuleKey(normalized)) continue;\n found.add(normalized);\n }\n }\n\n return Array.from(found) as ModuleKey[];\n}","export function parseBoolAttr(v: string | null): boolean | undefined {\n if (v == null) return undefined;\n const s = v.trim().toLowerCase();\n if (s === '' || s === '1' || s === 'true') return true;\n if (s === '0' || s === 'false') return false;\n return undefined;\n}","export function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isServer(): boolean {\n return !isBrowser();\n}\n\nexport * from './bool';","/* --------------------------------------------------------------------------\n * AdLib Attributes · Core\n *\n * Primitives partagées utilisées par le runtime et les modules d’attributs :\n * - délégation d’événements (listeners uniques sur une racine)\n * - registre de modules (définitions + instances)\n * - cycle de vie (mount/unmount/destroy)\n * - observation DOM (signal de changements, orchestration pilotée par le runtime)\n * -------------------------------------------------------------------------- */\n\nexport type Disposer = () => void;\nexport type Cleanup = void | Disposer;\n\nexport type CoreLogger = {\n debug: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n};\n\nexport type CoreOptions = {\n /** Root document/shadow root to bind listeners & observer (defaults to document). */\n root?: Document | ShadowRoot;\n /** Enable debug logs (printed as console.warn with \"[debug]\"). */\n debug?: boolean;\n /** Auto-mount modules on DOMContentLoaded when using singleton. Default: true. */\n autoMount?: boolean;\n};\n\nexport type DelegatedHandler = (e: Event, matched: Element) => void;\n\nexport type OnOptions = {\n /** If true, this delegated handler will run once then auto-unsubscribe. */\n once?: boolean;\n /** Capture phase for the underlying listener (per event type, first call wins). */\n capture?: boolean;\n /** Passive flag for the underlying listener (per event type, first call wins). */\n passive?: boolean;\n};\n\nexport interface Core {\n /**\n * Event delegation: listen on root and invoke handler when an ancestor matches selector.\n * Returns a disposer to remove this specific handler.\n */\n on: (type: string, selector: string, handler: DelegatedHandler, options?: OnOptions) => Disposer;\n\n /** Emit a CustomEvent from a given element. */\n emit: (el: Element, name: string, detail?: unknown) => void;\n\n /** Register a module definition. */\n register: (def: AdLibModuleDefinition) => void;\n\n /** Unregister a module definition by key. */\n unregister: (key: ModuleKey) => void;\n\n /** Mount a module by key, optionally on a given root. */\n mount: (key: ModuleKey, root?: ParentNode) => void;\n\n /** Unmount a module instance by key. */\n unmount: (key: ModuleKey) => void;\n\n /** Mount all registered modules. */\n mountAll: (root?: ParentNode) => void;\n\n /** Unmount all mounted modules. */\n unmountAll: () => void;\n\n /**\n * Observe dynamic DOM changes on a given root.\n *\n * Rôle :\n * - fournir un signal de changement DOM (ajouts/retraits de nœuds)\n * - permettre au runtime d’orchestrer un rescan/remount si nécessaire\n *\n * Retourne un disposer pour arrêter l’observation.\n */\n observe: (root?: ParentNode) => Disposer;\n\n /** Stop observing dynamic DOM changes. */\n stopObserving: () => void;\n\n /** Destroy core: unmount all, remove listeners, disconnect observer. */\n destroy: () => void;\n\n /** Core logger (debug/warn/error). */\n getLogger: () => CoreLogger;\n}\n\n/** Module key type (ex: 'ad-click'). */\nexport type ModuleKey = `ad-${string}`;\n\nexport interface AdLibModuleInstance {\n key: ModuleKey;\n destroy(): void;\n restart?(options?: { rescan?: boolean }): void;\n}\n\nexport interface AdLibModuleDefinition {\n key: ModuleKey;\n init(core: Core): AdLibModuleInstance;\n}\n\n/* --------------------------------- Internals -------------------------------- */\n\ntype DelegatedEntry = {\n selector: string;\n handler: DelegatedHandler;\n once: boolean;\n};\n\ntype EventListenerInfo = {\n capture: boolean;\n passive: boolean;\n listener: (e: Event) => void;\n entries: DelegatedEntry[];\n};\n\nfunction createLogger(debug = false): CoreLogger {\n return {\n debug: (...args: unknown[]) => {\n if (!debug) return;\n console.warn('[debug]', ...args);\n },\n warn: (...args: unknown[]) => {\n console.warn('[warn]', ...args);\n },\n error: (...args: unknown[]) => {\n console.error('[error]', ...args);\n },\n };\n}\n\nfunction isElement(value: unknown): value is Element {\n // Garde-fou typé : vérifie l’existence de Element (tests / environnements non DOM).\n return typeof Element !== 'undefined' && value instanceof Element;\n}\n\nfunction safeMatches(el: Element, selector: string): boolean {\n try {\n return el.matches(selector);\n } catch {\n return false;\n }\n}\n\nfunction findClosestMatching(target: EventTarget | null, selector: string): Element | null {\n let cur: EventTarget | null = target;\n\n while (cur) {\n if (isElement(cur) && safeMatches(cur, selector)) return cur;\n cur = isElement(cur) ? cur.parentElement : null;\n }\n\n return null;\n}\n\nfunction createDelegatedListener(info: EventListenerInfo) {\n return (e: Event) => {\n // Copie défensive : la liste peut être modifiée par un handler \"once\".\n const entries = info.entries.slice();\n\n for (const entry of entries) {\n const matched = findClosestMatching(e.target, entry.selector);\n if (!matched) continue;\n\n entry.handler(e, matched);\n\n if (entry.once) {\n const idx = info.entries.indexOf(entry);\n if (idx >= 0) info.entries.splice(idx, 1);\n }\n }\n };\n}\n\nfunction resolveObserverTarget(root: ParentNode): Node {\n // MutationObserver attend un Node.\n // - Document => document.documentElement si disponible, sinon le document lui-même\n // - ShadowRoot / Element => observe directement\n if (root instanceof Document) return root.documentElement ?? root;\n return root as unknown as Node;\n}\n\n/* ---------------------------------- Core ---------------------------------- */\n\nexport function createCore(options: CoreOptions = {}): Core {\n const root: Document | ShadowRoot = options.root ?? document;\n const logger = createLogger(!!options.debug);\n\n const defs = new Map<ModuleKey, AdLibModuleDefinition>();\n const instances = new Map<ModuleKey, AdLibModuleInstance>();\n\n const listenersByType = new Map<string, EventListenerInfo>();\n\n function on(type: string, selector: string, handler: DelegatedHandler, opts: OnOptions = {}): Disposer {\n const capture = !!opts.capture;\n const passive = !!opts.passive;\n\n const existing = listenersByType.get(type);\n if (existing) {\n existing.entries.push({ selector, handler, once: !!opts.once });\n\n return () => {\n const idx = existing.entries.findIndex((e) => e.selector === selector && e.handler === handler);\n if (idx >= 0) existing.entries.splice(idx, 1);\n\n // ✅ Si c'était le dernier handler, on retire le listener racine et on nettoie la map\n if (existing.entries.length === 0) {\n root.removeEventListener(type, existing.listener, { capture: existing.capture });\n listenersByType.delete(type);\n }\n };\n }\n\n const info: EventListenerInfo = {\n capture,\n passive,\n entries: [{ selector, handler, once: !!opts.once }],\n listener: () => {},\n };\n\n const listener = createDelegatedListener(info);\n info.listener = listener;\n\n listenersByType.set(type, info);\n\n root.addEventListener(type, listener, { capture, passive });\n\n // ✅ Disposer “handler-level” (pas “type-level”)\n return () => {\n const cur = listenersByType.get(type);\n if (!cur) return;\n\n const idx = cur.entries.findIndex((e) => e.selector === selector && e.handler === handler);\n if (idx >= 0) cur.entries.splice(idx, 1);\n\n if (cur.entries.length === 0) {\n root.removeEventListener(type, cur.listener, { capture: cur.capture });\n listenersByType.delete(type);\n }\n };\n }\n\n function emit(el: Element, name: string, detail?: unknown) {\n const ev = new CustomEvent(name, { detail, bubbles: true });\n el.dispatchEvent(ev);\n }\n\n function register(def: AdLibModuleDefinition) {\n defs.set(def.key, def);\n }\n\n function unregister(key: ModuleKey) {\n defs.delete(key);\n }\n\n function mount(key: ModuleKey, _root?: ParentNode) {\n const def = defs.get(key);\n if (!def) return;\n if (instances.has(key)) return;\n\n const inst = def.init(api);\n instances.set(key, inst);\n }\n\n function unmount(key: ModuleKey) {\n const inst = instances.get(key);\n if (!inst) return;\n inst.destroy();\n instances.delete(key);\n }\n\n function mountAll(_root?: ParentNode) {\n for (const key of defs.keys()) mount(key);\n }\n\n function unmountAll() {\n for (const key of instances.keys()) unmount(key);\n }\n\n let observer: MutationObserver | null = null;\n\n function observe(observedRoot: ParentNode = root): Disposer {\n if (observer) return () => {};\n\n observer = new MutationObserver((_mutations) => {\n // Signal DOM : le runtime est responsable de décider quoi charger / recharger.\n // Le core garantit uniquement une observation stable et désinscriptible.\n });\n\n observer.observe(resolveObserverTarget(observedRoot), {\n subtree: true,\n childList: true,\n attributes: false,\n });\n\n return () => stopObserving();\n }\n\n function stopObserving() {\n if (!observer) return;\n observer.disconnect();\n observer = null;\n }\n\n function destroy() {\n stopObserving();\n unmountAll();\n\n for (const [type, info] of listenersByType.entries()) {\n root.removeEventListener(type, info.listener, { capture: info.capture });\n }\n\n listenersByType.clear();\n defs.clear();\n instances.clear();\n }\n\n function getLogger() {\n return logger;\n }\n\n const api: Core = {\n on,\n emit,\n register,\n unregister,\n mount,\n unmount,\n mountAll,\n unmountAll,\n observe,\n stopObserving,\n destroy,\n getLogger,\n };\n\n return api;\n}\n\n/* ----------------------------- Singleton helpers ---------------------------- */\n\nlet singleton: Core | null = null;\n\nexport function getCoreSingleton(options: CoreOptions = {}): Core {\n if (singleton) return singleton;\n singleton = createCore({ autoMount: true, ...options });\n\n const shouldAutoMount = options.autoMount ?? true;\n if (shouldAutoMount && typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener(\n 'DOMContentLoaded',\n () => {\n singleton?.mountAll();\n },\n { once: true }\n );\n } else {\n singleton.mountAll();\n }\n }\n\n return singleton;\n}\n\nexport default createCore;","import type { ModuleKey, RuntimeConfig } from './types';\n\nfunction normalizeOrigin(origin: string): string {\n return origin.trim().replace(/\\/+$/, '');\n}\n\nfunction resolveOrigin(config: RuntimeConfig): string {\n // `base` permet de forcer une origine de chargement (ex: CDN custom).\n // Sinon, on utilise `registry` (ex: jsDelivr / unpkg / registry interne).\n return normalizeOrigin(config.base ?? config.registry);\n}\n\nfunction resolveVersion(config: RuntimeConfig): string {\n const v = (config.version ?? '').trim();\n return v || 'latest';\n}\n\n/**\n * Construit le chemin d'import ESM d'un module à partir de la configuration runtime.\n * Format :\n * {origin}/@adartem/{package}@{version}/dist/index.js\n */\nfunction makeEsmImportPath(origin: string, pkgName: string, version: string): string {\n return `${origin}/@adartem/${pkgName}@${version}/dist/index.js`;\n}\n\nconst PACKAGE_BY_KEY: Record<ModuleKey, string> = {\n 'ad-click': 'ad-click',\n};\n\nexport function getImportPathForModule(key: ModuleKey, config: RuntimeConfig): string | null {\n const origin = resolveOrigin(config);\n const version = resolveVersion(config);\n\n const pkgName = PACKAGE_BY_KEY[key];\n if (!pkgName) return null;\n\n return makeEsmImportPath(origin, pkgName, version);\n}","import { collectModuleKeysFromDOM, isBrowser } from '@adartem/adlib-utils';\n\nimport type { Core } from '../core';\nimport { createCore } from '../core';\nimport { getImportPathForModule } from './module-map';\nimport type {\n AdLibModuleDefinition,\n AdLibRuntime,\n GlobalQueueItem,\n ModuleKey,\n RuntimeConfig,\n RuntimeModuleState,\n RuntimeOptions,\n} from './types';\n\n/**\n * Runtime robuste:\n * - load() : import + init(core) + état\n * - push() : callbacks avant/après load\n * - queue globale window.AdLibAttributesQueue\n * - reload() : destroy module + re-init\n * - auto (optionnel) : scan DOM minimal + MutationObserver\n */\n\ntype QueueEntry = {\n key: ModuleKey;\n cb: (state: RuntimeModuleState) => void;\n};\n\nconst DEFAULT_REGISTRY = 'https://cdn.jsdelivr.net/npm';\n\nfunction stateOf(modules: Record<string, RuntimeModuleState>, key: ModuleKey): RuntimeModuleState {\n return (modules[key] ??= { key, status: 'idle' });\n}\n\nfunction isReadyOrError(s: RuntimeModuleState) {\n return s.status === 'ready' || s.status === 'error';\n}\n\nfunction toError(err: unknown): Error {\n return err instanceof Error ? err : new Error(String(err));\n}\n\nfunction normalizeUrlBase(value?: string): string | undefined {\n const v = (value ?? '').trim();\n if (!v) return undefined;\n return v.replace(/\\/+$/, '');\n}\n\nfunction resolveConfig(options: RuntimeOptions): RuntimeConfig {\n const registry = normalizeUrlBase(options.config?.registry) ?? DEFAULT_REGISTRY;\n const version = (options.config?.version ?? options.version).trim() || options.version;\n\n const out: RuntimeConfig = { registry, version };\n\n const base = normalizeUrlBase(options.config?.base);\n if (base) out.base = base; // ✅ n’ajoute pas la clé si undefined\n\n return out;\n}\n\n/**\n * Valide/normalise le résultat d'un import dynamique vers une AdLibModuleDefinition.\n * Permet d'éviter les `any` et les accès unsafe.\n */\nfunction toModuleDefinition(mod: unknown, expectedKey: ModuleKey): AdLibModuleDefinition {\n const candidate = (() => {\n if (mod && typeof mod === 'object') {\n const record = mod as Record<string, unknown>;\n return record.default ?? mod;\n }\n return mod;\n })();\n\n if (!candidate || typeof candidate !== 'object') {\n throw new Error(`Invalid module definition for ${expectedKey}`);\n }\n\n const def = candidate as Partial<AdLibModuleDefinition>;\n\n if (typeof def.key !== 'string' || typeof def.init !== 'function') {\n throw new Error(`Invalid module definition for ${expectedKey}`);\n }\n\n // Sécurité: clé cohérente\n if (def.key !== expectedKey) {\n throw new Error(`Module key mismatch: expected \"${expectedKey}\", got \"${def.key}\"`);\n }\n\n return def as AdLibModuleDefinition;\n}\n\nexport function createRuntime(options: RuntimeOptions): AdLibRuntime {\n const debug = options.debug ?? false;\n const auto = options.auto ?? false;\n\n // ✅ Ownership: runtime propriétaire uniquement si options.core est absent (null/undefined)\n const ownsCore = options.core == null;\n\n // ✅ Runtime ne récupère jamais le singleton tout seul.\n // - si core injecté => utilisé tel quel, et NON détruit par runtime.destroy()\n // - sinon => core dédié, détruit par runtime.destroy()\n const core: Core =\n options.core ??\n createCore({\n debug,\n autoMount: false,\n });\n\n const logger = core.getLogger();\n const config = resolveConfig(options);\n\n const modules: Record<string, RuntimeModuleState> = {};\n const queue: QueueEntry[] = [];\n\n let observer: MutationObserver | null = null;\n\n function log(...args: unknown[]) {\n if (!debug) return;\n logger.debug('[AdLib Runtime]', ...args);\n }\n\n function logError(...args: unknown[]) {\n logger.error('[AdLib Runtime]', ...args);\n }\n\n function flush(key: ModuleKey, st: RuntimeModuleState) {\n for (let i = queue.length - 1; i >= 0; i--) {\n const entry = queue[i];\n if (!entry) continue;\n if (entry.key === key) {\n queue.splice(i, 1);\n try {\n entry.cb(st);\n } catch (e) {\n logError('push callback failed', key, e);\n }\n }\n }\n }\n\n function destroyModule(key: ModuleKey) {\n const st = modules[key];\n if (!st) return;\n\n try {\n st.instance?.destroy?.();\n } catch (e) {\n logError('destroyModule failed', key, e);\n }\n\n delete st.instance;\n delete st.def;\n delete st.error;\n delete st.promise;\n\n st.status = 'idle';\n }\n\n async function load(key: ModuleKey): Promise<RuntimeModuleState> {\n const st = stateOf(modules, key);\n\n if (st.status === 'ready') return st;\n if (st.status === 'error') return st;\n\n if (st.status === 'loading' && st.promise) return st.promise;\n\n const importPath = getImportPathForModule(key, config);\n if (!importPath) {\n st.status = 'error';\n st.error = new Error(`Unknown module key: ${key}`);\n flush(key, st);\n return st;\n }\n\n st.status = 'loading';\n log('load()', key, '->', importPath);\n\n const promise: Promise<RuntimeModuleState> = (async () => {\n try {\n const mod: unknown = await import(/* @vite-ignore */ importPath);\n const def = toModuleDefinition(mod, key);\n\n st.def = def;\n\n if (!st.instance) {\n st.instance = def.init(core);\n }\n\n st.status = 'ready';\n delete st.error;\n delete st.promise;\n\n flush(key, st);\n return st;\n } catch (err) {\n st.status = 'error';\n st.error = toError(err);\n delete st.promise;\n\n flush(key, st);\n return st;\n }\n })();\n\n st.promise = promise;\n return promise;\n }\n\n async function reload(key: ModuleKey): Promise<RuntimeModuleState> {\n log('reload()', key);\n destroyModule(key);\n return load(key);\n }\n\n function push(key: ModuleKey, cb: (state: RuntimeModuleState) => void) {\n const st = modules[key];\n if (st && isReadyOrError(st)) {\n try {\n cb(st);\n } catch (e) {\n logError('push callback failed', key, e);\n }\n return;\n }\n queue.push({ key, cb });\n }\n\n function autoLoadFromDOM(root: ParentNode = document) {\n const keys = collectModuleKeysFromDOM(root);\n for (const key of keys) void load(key);\n }\n\n function startObserver() {\n if (!isBrowser()) return;\n if (observer) return;\n\n observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of Array.from(m.addedNodes)) {\n if (!(node instanceof HTMLElement)) continue;\n autoLoadFromDOM(node);\n }\n }\n });\n\n observer.observe(document.documentElement, { childList: true, subtree: true });\n }\n\n function stopObserver() {\n observer?.disconnect();\n observer = null;\n }\n\n function destroy(opts?: { keepGlobal?: boolean }) {\n log('destroy()');\n\n stopObserver();\n\n for (const st of Object.values(modules)) {\n try {\n st.instance?.destroy?.();\n } catch (e) {\n logError('destroy module failed', st.key, e);\n }\n }\n\n // ✅ Ownership rule: ne détruit le core QUE si le runtime l'a créé\n if (ownsCore) {\n try {\n core.destroy();\n } catch (e) {\n logError('core.destroy failed', e);\n }\n }\n\n for (const k of Object.keys(modules)) delete modules[k];\n queue.length = 0;\n\n if (!opts?.keepGlobal && typeof window !== 'undefined') {\n delete window.AdLibAttributes;\n }\n }\n\n const runtime: AdLibRuntime = {\n version: options.version,\n config,\n core,\n debug,\n modules,\n load,\n push,\n reload,\n destroy,\n };\n\n if (typeof window !== 'undefined') {\n const globalQ = window.AdLibAttributesQueue;\n if (Array.isArray(globalQ) && globalQ.length > 0) {\n const items: GlobalQueueItem[] = globalQ.splice(0, globalQ.length);\n for (const [key, cb] of items) runtime.push(key, cb);\n }\n }\n\n if (auto && isBrowser()) {\n autoLoadFromDOM(document.body ?? document);\n startObserver();\n }\n\n return runtime;\n}","import { isModuleKey, normalizeAttributeName } from '@adartem/adlib-utils';\n\nimport type { LoaderScriptConfig, LoaderScriptInfo, RuntimeConfig } from './types';\n\n/** Helpers DOM-agnostic (compat jsdom + environnements DOM partiels) */\n\ntype AttrLike = { name: string };\ntype AttributesLike = {\n length: number;\n item(index: number): AttrLike | null;\n};\n\nfunction hasGetAttributeNames(el: unknown): el is { getAttributeNames(): unknown } {\n return (\n typeof el === 'object' &&\n el !== null &&\n typeof (el as { getAttributeNames?: unknown }).getAttributeNames === 'function'\n );\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\nfunction hasAttributesLike(el: unknown): el is { attributes: AttributesLike } {\n if (typeof el !== 'object' || el === null) return false;\n\n const attrs = (el as { attributes?: unknown }).attributes;\n if (typeof attrs !== 'object' || attrs === null) return false;\n\n const a = attrs as Partial<AttributesLike>;\n return typeof a.length === 'number' && typeof a.item === 'function';\n}\n\nfunction hasQuerySelectorAll(\n root: unknown,\n): root is ParentNode & { querySelectorAll(selectors: string): NodeListOf<Element> } {\n if (typeof root !== 'object' || root === null) return false;\n return typeof (root as { querySelectorAll?: unknown }).querySelectorAll === 'function';\n}\n\n/** Safe wrapper (jsdom + navigateurs anciens + environnements DOM partiels) */\nfunction getAttributeNamesSafe(el: Element): string[] {\n // 1) voie moderne: getAttributeNames()\n if (hasGetAttributeNames(el)) {\n const maybe = el.getAttributeNames();\n if (isStringArray(maybe)) return maybe;\n }\n\n // 2) fallback: attributes NamedNodeMap-like (structure minimale)\n if (hasAttributesLike(el)) {\n const out: string[] = [];\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes.item(i);\n if (attr && typeof attr.name === 'string' && attr.name) out.push(attr.name);\n }\n return out;\n }\n\n return [];\n}\n\n/**\n * Heuristique “loader script” :\n * - <script type=\"module\" src=\".../attributes.js\">\n * Tolérant aux chemins (CDN, querystring, chemins relatifs/absolus).\n */\nfunction isAttributesLoaderScript(s: HTMLScriptElement): boolean {\n const type = (s.getAttribute('type') ?? '').trim();\n if (type && type !== 'module') return false;\n\n const src = (s.getAttribute('src') ?? '').trim();\n if (!src) return false;\n\n return src.includes('attributes.js');\n}\n\nfunction pickNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const v = value.trim();\n return v ? v : undefined;\n}\n\nfunction parseBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== 'string') return fallback;\n const v = value.trim().toLowerCase();\n if (v === '' || v === 'true' || v === '1' || v === 'yes' || v === 'on') return true;\n if (v === 'false' || v === '0' || v === 'no' || v === 'off') return false;\n return fallback;\n}\n\n/**\n * Source unique de vérité: lit data-adlib-* depuis le <script> et retourne une config normalisée.\n * Conventions dataset camelCase :\n * - data-adlib-registry => dataset.adlibRegistry\n * - data-adlib-version => dataset.adlibVersion\n * - data-adlib-base => dataset.adlibBase\n * - data-adlib-auto => dataset.adlibAuto\n * - data-adlib-debug => dataset.adlibDebug\n */\nfunction readLoaderConfig(s: HTMLScriptElement): LoaderScriptConfig {\n // dataset est standard sur HTMLScriptElement en DOM.\n // Fallback léger pour les environnements DOM incomplets.\n const ds = (s as unknown as { dataset?: Record<string, string> }).dataset ?? {};\n\n const debug = parseBoolean(ds.adlibDebug, false);\n const auto = parseBoolean(ds.adlibAuto, true);\n\n const registry = pickNonEmptyString(ds.adlibRegistry);\n const version = pickNonEmptyString(ds.adlibVersion);\n const base = pickNonEmptyString(ds.adlibBase);\n\n // ✅ exactOptionalPropertyTypes-safe : ne pas inclure les clés si undefined\n const config: Partial<RuntimeConfig> = {};\n if (registry) config.registry = registry;\n if (version) config.version = version;\n if (base) config.base = base;\n\n return { debug, auto, config };\n}\n\nexport function findLoaderScripts(root: ParentNode = document): LoaderScriptInfo[] {\n if (!hasQuerySelectorAll(root)) return [];\n\n const scripts = Array.from(root.querySelectorAll('script'));\n const result: LoaderScriptInfo[] = [];\n\n for (const script of scripts) {\n if (!(script instanceof HTMLScriptElement)) continue;\n if (!isAttributesLoaderScript(script)) continue;\n\n const requested = new Set<LoaderScriptInfo['requestedKeys'][number]>();\n\n for (const rawName of getAttributeNamesSafe(script)) {\n const name = normalizeAttributeName(rawName);\n if (isModuleKey(name)) requested.add(name);\n }\n\n result.push({\n el: script,\n requestedKeys: Array.from(requested),\n loaderConfig: readLoaderConfig(script),\n });\n }\n\n return result;\n}","import { isBrowser } from '@adartem/adlib-utils';\n\nimport { getCoreSingleton } from '../core';\nimport { createRuntime } from './runtime';\nimport { findLoaderScripts } from './script-detection';\nimport type { ModuleKey } from './types';\n\ndeclare const __ADLIB_VERSION__: string | undefined;\n\n// Vitest / dev (TS direct) => la constante n'existe pas\n// Build tsup => la constante est injectée (string)\nconst VERSION = typeof __ADLIB_VERSION__ === 'string' ? __ADLIB_VERSION__ : 'dev';\n\n(function bootstrap() {\n if (!isBrowser()) return;\n\n // Ne pas re-bootstrap si déjà présent\n if (window.AdLibAttributes) return;\n\n const loaders = findLoaderScripts(document);\n const primary = loaders[0];\n\n // ✅ Source unique de vérité: script-detection.ts normalise data-adlib-*\n const debug = primary?.loaderConfig.debug ?? false;\n const auto = primary?.loaderConfig.auto ?? true;\n const config = primary?.loaderConfig.config ?? {};\n\n const core = getCoreSingleton({ root: document, debug });\n const runtime = createRuntime({\n version: VERSION,\n core,\n debug,\n auto,\n config,\n });\n\n // Expose global\n window.AdLibAttributes = runtime;\n\n // 1) Modules demandés via attributs du <script ... attributes.js ...>\n const requested = new Set<ModuleKey>();\n for (const info of loaders) {\n for (const k of info.requestedKeys) requested.add(k);\n }\n\n // 2) Chargement initial\n for (const key of requested) {\n runtime.load(key).catch(() => {\n // le runtime gère déjà l'état error ; ici on évite de throw global\n });\n }\n})();"],"mappings":"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","names":["isModuleKey","value","normalizeAttributeName","name","hasQuerySelectorAll","collectModuleKeysFromDOM","root","found","elements","el","attr","normalized","isBrowser","createLogger","debug","args","isElement","value","safeMatches","el","selector","findClosestMatching","target","cur","createDelegatedListener","info","e","entries","entry","matched","idx","resolveObserverTarget","root","createCore","options","logger","defs","instances","listenersByType","on","type","handler","opts","capture","passive","existing","listener","emit","name","detail","ev","register","def","unregister","key","mount","_root","inst","api","unmount","mountAll","unmountAll","observer","observe","observedRoot","_mutations","stopObserving","destroy","getLogger","singleton","getCoreSingleton","normalizeOrigin","origin","resolveOrigin","config","resolveVersion","makeEsmImportPath","pkgName","version","PACKAGE_BY_KEY","getImportPathForModule","key","DEFAULT_REGISTRY","stateOf","modules","key","isReadyOrError","s","toError","err","normalizeUrlBase","value","v","resolveConfig","options","registry","version","out","base","toModuleDefinition","mod","expectedKey","candidate","def","createRuntime","debug","auto","ownsCore","core","createCore","logger","config","queue","observer","log","args","logError","flush","st","i","entry","e","destroyModule","load","importPath","getImportPathForModule","promise","reload","push","cb","autoLoadFromDOM","root","keys","collectModuleKeysFromDOM","startObserver","isBrowser","mutations","m","node","stopObserver","destroy","opts","k","runtime","globalQ","items","hasGetAttributeNames","el","isStringArray","value","v","hasAttributesLike","attrs","a","hasQuerySelectorAll","root","getAttributeNamesSafe","maybe","out","i","attr","isAttributesLoaderScript","s","type","src","pickNonEmptyString","parseBoolean","fallback","readLoaderConfig","ds","debug","auto","registry","version","base","config","findLoaderScripts","scripts","result","script","requested","rawName","name","normalizeAttributeName","isModuleKey","VERSION","isBrowser","loaders","findLoaderScripts","primary","debug","auto","config","core","getCoreSingleton","runtime","createRuntime","requested","info","k","key"]}
@@ -0,0 +1,2 @@
1
+ function N(e){return e.startsWith("ad-")&&e.length>3}function I(e){return e.startsWith("data-")?e.slice(5):e}function V(e){return typeof e!="object"||e===null?!1:typeof e.querySelectorAll=="function"}function j(e=document){if(!V(e))return[];let t=new Set,r=e.querySelectorAll("*");for(let i of Array.from(r))for(let s of Array.from(i.attributes)){let a=I(s.name);N(a)&&t.add(a)}return Array.from(t)}function k(){return typeof window<"u"&&typeof document<"u"}function z(e=!1){return{debug:(...t)=>{e&&console.warn("[debug]",...t)},warn:(...t)=>{console.warn("[warn]",...t)},error:(...t)=>{console.error("[error]",...t)}}}function B(e){return typeof Element<"u"&&e instanceof Element}function U(e,t){try{return e.matches(t)}catch{return!1}}function Y(e,t){let r=e;for(;r;){if(B(r)&&U(r,t))return r;r=B(r)?r.parentElement:null}return null}function W(e){return t=>{let r=e.entries.slice();for(let i of r){let s=Y(t.target,i.selector);if(s&&(i.handler(t,s),i.once)){let a=e.entries.indexOf(i);a>=0&&e.entries.splice(a,1)}}}}function J(e){return e instanceof Document?e.documentElement??e:e}function x(e={}){let t=e.root??document,r=z(!!e.debug),i=new Map,s=new Map,a=new Map;function g(u,l,o,n={}){let c=!!n.capture,f=!!n.passive,m=a.get(u);if(m)return m.entries.push({selector:l,handler:o,once:!!n.once}),()=>{let v=m.entries.findIndex(S=>S.selector===l&&S.handler===o);v>=0&&m.entries.splice(v,1),m.entries.length===0&&(t.removeEventListener(u,m.listener,{capture:m.capture}),a.delete(u))};let w={capture:c,passive:f,entries:[{selector:l,handler:o,once:!!n.once}],listener:()=>{}},_=W(w);return w.listener=_,a.set(u,w),t.addEventListener(u,_,{capture:c,passive:f}),()=>{let v=a.get(u);if(!v)return;let S=v.entries.findIndex(q=>q.selector===l&&q.handler===o);S>=0&&v.entries.splice(S,1),v.entries.length===0&&(t.removeEventListener(u,v.listener,{capture:v.capture}),a.delete(u))}}function d(u,l,o){let n=new CustomEvent(l,{detail:o,bubbles:!0});u.dispatchEvent(n)}function y(u){i.set(u.key,u)}function p(u){i.delete(u)}function M(u,l){let o=i.get(u);if(!o||s.has(u))return;let n=o.init(O);s.set(u,n)}function A(u){let l=s.get(u);l&&(l.destroy(),s.delete(u))}function h(u){for(let l of i.keys())M(l)}function R(){for(let u of s.keys())A(u)}let b=null;function D(u=t){return b?()=>{}:(b=new MutationObserver(l=>{}),b.observe(J(u),{subtree:!0,childList:!0,attributes:!1}),()=>E())}function E(){b&&(b.disconnect(),b=null)}function C(){E(),R();for(let[u,l]of a.entries())t.removeEventListener(u,l.listener,{capture:l.capture});a.clear(),i.clear(),s.clear()}function K(){return r}let O={on:g,emit:d,register:y,unregister:p,mount:M,unmount:A,mountAll:h,unmountAll:R,observe:D,stopObserving:E,destroy:C,getLogger:K};return O}var L=null;function $(e={}){return L||(L=x({autoMount:!0,...e}),(e.autoMount??!0)&&typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{L?.mountAll()},{once:!0}):L.mountAll()),L)}function X(e){return e.trim().replace(/\/+$/,"")}function Z(e){return X(e.base??e.registry)}function ee(e){return(e.version??"").trim()||"latest"}function te(e,t,r){return`${e}/@adartem/${t}@${r}/dist/index.js`}var ne={"ad-click":"ad-click"};function T(e,t){let r=Z(t),i=ee(t),s=ne[e];return s?te(r,s,i):null}var re="https://cdn.jsdelivr.net/npm";function oe(e,t){return e[t]??(e[t]={key:t,status:"idle"})}function ie(e){return e.status==="ready"||e.status==="error"}function se(e){return e instanceof Error?e:new Error(String(e))}function H(e){let t=(e??"").trim();if(t)return t.replace(/\/+$/,"")}function ue(e){let t=H(e.config?.registry)??re,r=(e.config?.version??e.version).trim()||e.version,i={registry:t,version:r},s=H(e.config?.base);return s&&(i.base=s),i}function ce(e,t){let r=e&&typeof e=="object"?e.default??e:e;if(!r||typeof r!="object")throw new Error(`Invalid module definition for ${t}`);let i=r;if(typeof i.key!="string"||typeof i.init!="function")throw new Error(`Invalid module definition for ${t}`);if(i.key!==t)throw new Error(`Module key mismatch: expected "${t}", got "${i.key}"`);return i}function Q(e){let t=e.debug??!1,r=e.auto??!1,i=e.core==null,s=e.core??x({debug:t,autoMount:!1}),a=s.getLogger(),g=ue(e),d={},y=[],p=null;function M(...o){t&&a.debug("[AdLib Runtime]",...o)}function A(...o){a.error("[AdLib Runtime]",...o)}function h(o,n){for(let c=y.length-1;c>=0;c--){let f=y[c];if(f&&f.key===o){y.splice(c,1);try{f.cb(n)}catch(m){A("push callback failed",o,m)}}}}function R(o){let n=d[o];if(n){try{n.instance?.destroy?.()}catch(c){A("destroyModule failed",o,c)}delete n.instance,delete n.def,delete n.error,delete n.promise,n.status="idle"}}async function b(o){let n=oe(d,o);if(n.status==="ready"||n.status==="error")return n;if(n.status==="loading"&&n.promise)return n.promise;let c=T(o,g);if(!c)return n.status="error",n.error=new Error(`Unknown module key: ${o}`),h(o,n),n;n.status="loading",M("load()",o,"->",c);let f=(async()=>{try{let m=await import(c),w=ce(m,o);return n.def=w,n.instance||(n.instance=w.init(s)),n.status="ready",delete n.error,delete n.promise,h(o,n),n}catch(m){return n.status="error",n.error=se(m),delete n.promise,h(o,n),n}})();return n.promise=f,f}async function D(o){return M("reload()",o),R(o),b(o)}function E(o,n){let c=d[o];if(c&&ie(c)){try{n(c)}catch(f){A("push callback failed",o,f)}return}y.push({key:o,cb:n})}function C(o=document){let n=j(o);for(let c of n)b(c)}function K(){k()&&(p||(p=new MutationObserver(o=>{for(let n of o)for(let c of Array.from(n.addedNodes))c instanceof HTMLElement&&C(c)}),p.observe(document.documentElement,{childList:!0,subtree:!0})))}function O(){p?.disconnect(),p=null}function u(o){M("destroy()"),O();for(let n of Object.values(d))try{n.instance?.destroy?.()}catch(c){A("destroy module failed",n.key,c)}if(i)try{s.destroy()}catch(n){A("core.destroy failed",n)}for(let n of Object.keys(d))delete d[n];y.length=0,!o?.keepGlobal&&typeof window<"u"&&delete window.AdLibAttributes}let l={version:e.version,config:g,core:s,debug:t,modules:d,load:b,push:E,reload:D,destroy:u};if(typeof window<"u"){let o=window.AdLibAttributesQueue;if(Array.isArray(o)&&o.length>0){let n=o.splice(0,o.length);for(let[c,f]of n)l.push(c,f)}}return r&&k()&&(C(document.body??document),K()),l}function ae(e){return typeof e=="object"&&e!==null&&typeof e.getAttributeNames=="function"}function le(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function de(e){if(typeof e!="object"||e===null)return!1;let t=e.attributes;if(typeof t!="object"||t===null)return!1;let r=t;return typeof r.length=="number"&&typeof r.item=="function"}function fe(e){return typeof e!="object"||e===null?!1:typeof e.querySelectorAll=="function"}function me(e){if(ae(e)){let t=e.getAttributeNames();if(le(t))return t}if(de(e)){let t=[];for(let r=0;r<e.attributes.length;r++){let i=e.attributes.item(r);i&&typeof i.name=="string"&&i.name&&t.push(i.name)}return t}return[]}function ge(e){let t=(e.getAttribute("type")??"").trim();if(t&&t!=="module")return!1;let r=(e.getAttribute("src")??"").trim();return r?r.includes("attributes.js"):!1}function P(e){if(typeof e!="string")return;let t=e.trim();return t||void 0}function G(e,t){if(typeof e!="string")return t;let r=e.trim().toLowerCase();return r===""||r==="true"||r==="1"||r==="yes"||r==="on"?!0:r==="false"||r==="0"||r==="no"||r==="off"?!1:t}function pe(e){let t=e.dataset??{},r=G(t.adlibDebug,!1),i=G(t.adlibAuto,!0),s=P(t.adlibRegistry),a=P(t.adlibVersion),g=P(t.adlibBase),d={};return s&&(d.registry=s),a&&(d.version=a),g&&(d.base=g),{debug:r,auto:i,config:d}}function F(e=document){if(!fe(e))return[];let t=Array.from(e.querySelectorAll("script")),r=[];for(let i of t){if(!(i instanceof HTMLScriptElement)||!ge(i))continue;let s=new Set;for(let a of me(i)){let g=I(a);N(g)&&s.add(g)}r.push({el:i,requestedKeys:Array.from(s),loaderConfig:pe(i)})}return r}var ye="0.0.0";(function(){if(!k()||window.AdLibAttributes)return;let t=F(document),r=t[0],i=r?.loaderConfig.debug??!1,s=r?.loaderConfig.auto??!0,a=r?.loaderConfig.config??{},g=$({root:document,debug:i}),d=Q({version:ye,core:g,debug:i,auto:s,config:a});window.AdLibAttributes=d;let y=new Set;for(let p of t)for(let M of p.requestedKeys)y.add(M);for(let p of y)d.load(p).catch(()=>{})})();
2
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../adlib-utils/src/attributes/keys.ts","../../adlib-utils/src/dom/guards.ts","../../adlib-utils/src/dom/scan.ts","../../adlib-utils/src/env/bool.ts","../../adlib-utils/src/env/index.ts","../src/core/index.ts","../src/runtime/module-map.ts","../src/runtime/runtime.ts","../src/runtime/script-detection.ts","../src/runtime/attributes.ts"],"sourcesContent":["import type { ModuleKey } from '../types';\n\nexport function isModuleKey(value: string): value is ModuleKey {\n return value.startsWith('ad-') && value.length > 3;\n}\n\nexport function normalizeAttributeName(name: string): string {\n return name.startsWith('data-') ? name.slice(5) : name;\n}","export type QuerySelectorAllHost = {\n querySelectorAll(selectors: string): NodeListOf<Element>;\n};\n\n/**\n * Type guard: vérifie que `value` expose bien `querySelectorAll`.\n * - sans `any`\n * - sans accès unsafe\n */\nexport function hasQuerySelectorAll(value: unknown): value is QuerySelectorAllHost {\n if (typeof value !== 'object' || value === null) return false;\n\n // On passe par une signature \"indexée\" typée en unknown,\n // puis on raffine vers Function.\n const v = value as Record<string, unknown>;\n const qsa = v['querySelectorAll'];\n\n return typeof qsa === 'function';\n}","import { isModuleKey, normalizeAttributeName } from '../attributes/keys';\nimport type { ModuleKey } from '../types';\nimport { hasQuerySelectorAll } from './guards';\n\nexport function collectModuleKeysFromDOM(root: ParentNode = document): ModuleKey[] {\n if (!hasQuerySelectorAll(root)) return [];\n\n const found = new Set<string>();\n const elements = root.querySelectorAll<HTMLElement>('*');\n\n for (const el of Array.from(elements)) {\n for (const attr of Array.from(el.attributes)) {\n const normalized = normalizeAttributeName(attr.name);\n if (!isModuleKey(normalized)) continue;\n found.add(normalized);\n }\n }\n\n return Array.from(found) as ModuleKey[];\n}","export function parseBoolAttr(v: string | null): boolean | undefined {\n if (v == null) return undefined;\n const s = v.trim().toLowerCase();\n if (s === '' || s === '1' || s === 'true') return true;\n if (s === '0' || s === 'false') return false;\n return undefined;\n}","export function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isServer(): boolean {\n return !isBrowser();\n}\n\nexport * from './bool';","/* --------------------------------------------------------------------------\n * AdLib Attributes · Core\n *\n * Primitives partagées utilisées par le runtime et les modules d’attributs :\n * - délégation d’événements (listeners uniques sur une racine)\n * - registre de modules (définitions + instances)\n * - cycle de vie (mount/unmount/destroy)\n * - observation DOM (signal de changements, orchestration pilotée par le runtime)\n * -------------------------------------------------------------------------- */\n\nexport type Disposer = () => void;\nexport type Cleanup = void | Disposer;\n\nexport type CoreLogger = {\n debug: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n};\n\nexport type CoreOptions = {\n /** Root document/shadow root to bind listeners & observer (defaults to document). */\n root?: Document | ShadowRoot;\n /** Enable debug logs (printed as console.warn with \"[debug]\"). */\n debug?: boolean;\n /** Auto-mount modules on DOMContentLoaded when using singleton. Default: true. */\n autoMount?: boolean;\n};\n\nexport type DelegatedHandler = (e: Event, matched: Element) => void;\n\nexport type OnOptions = {\n /** If true, this delegated handler will run once then auto-unsubscribe. */\n once?: boolean;\n /** Capture phase for the underlying listener (per event type, first call wins). */\n capture?: boolean;\n /** Passive flag for the underlying listener (per event type, first call wins). */\n passive?: boolean;\n};\n\nexport interface Core {\n /**\n * Event delegation: listen on root and invoke handler when an ancestor matches selector.\n * Returns a disposer to remove this specific handler.\n */\n on: (type: string, selector: string, handler: DelegatedHandler, options?: OnOptions) => Disposer;\n\n /** Emit a CustomEvent from a given element. */\n emit: (el: Element, name: string, detail?: unknown) => void;\n\n /** Register a module definition. */\n register: (def: AdLibModuleDefinition) => void;\n\n /** Unregister a module definition by key. */\n unregister: (key: ModuleKey) => void;\n\n /** Mount a module by key, optionally on a given root. */\n mount: (key: ModuleKey, root?: ParentNode) => void;\n\n /** Unmount a module instance by key. */\n unmount: (key: ModuleKey) => void;\n\n /** Mount all registered modules. */\n mountAll: (root?: ParentNode) => void;\n\n /** Unmount all mounted modules. */\n unmountAll: () => void;\n\n /**\n * Observe dynamic DOM changes on a given root.\n *\n * Rôle :\n * - fournir un signal de changement DOM (ajouts/retraits de nœuds)\n * - permettre au runtime d’orchestrer un rescan/remount si nécessaire\n *\n * Retourne un disposer pour arrêter l’observation.\n */\n observe: (root?: ParentNode) => Disposer;\n\n /** Stop observing dynamic DOM changes. */\n stopObserving: () => void;\n\n /** Destroy core: unmount all, remove listeners, disconnect observer. */\n destroy: () => void;\n\n /** Core logger (debug/warn/error). */\n getLogger: () => CoreLogger;\n}\n\n/** Module key type (ex: 'ad-click'). */\nexport type ModuleKey = `ad-${string}`;\n\nexport interface AdLibModuleInstance {\n key: ModuleKey;\n destroy(): void;\n restart?(options?: { rescan?: boolean }): void;\n}\n\nexport interface AdLibModuleDefinition {\n key: ModuleKey;\n init(core: Core): AdLibModuleInstance;\n}\n\n/* --------------------------------- Internals -------------------------------- */\n\ntype DelegatedEntry = {\n selector: string;\n handler: DelegatedHandler;\n once: boolean;\n};\n\ntype EventListenerInfo = {\n capture: boolean;\n passive: boolean;\n listener: (e: Event) => void;\n entries: DelegatedEntry[];\n};\n\nfunction createLogger(debug = false): CoreLogger {\n return {\n debug: (...args: unknown[]) => {\n if (!debug) return;\n console.warn('[debug]', ...args);\n },\n warn: (...args: unknown[]) => {\n console.warn('[warn]', ...args);\n },\n error: (...args: unknown[]) => {\n console.error('[error]', ...args);\n },\n };\n}\n\nfunction isElement(value: unknown): value is Element {\n // Garde-fou typé : vérifie l’existence de Element (tests / environnements non DOM).\n return typeof Element !== 'undefined' && value instanceof Element;\n}\n\nfunction safeMatches(el: Element, selector: string): boolean {\n try {\n return el.matches(selector);\n } catch {\n return false;\n }\n}\n\nfunction findClosestMatching(target: EventTarget | null, selector: string): Element | null {\n let cur: EventTarget | null = target;\n\n while (cur) {\n if (isElement(cur) && safeMatches(cur, selector)) return cur;\n cur = isElement(cur) ? cur.parentElement : null;\n }\n\n return null;\n}\n\nfunction createDelegatedListener(info: EventListenerInfo) {\n return (e: Event) => {\n // Copie défensive : la liste peut être modifiée par un handler \"once\".\n const entries = info.entries.slice();\n\n for (const entry of entries) {\n const matched = findClosestMatching(e.target, entry.selector);\n if (!matched) continue;\n\n entry.handler(e, matched);\n\n if (entry.once) {\n const idx = info.entries.indexOf(entry);\n if (idx >= 0) info.entries.splice(idx, 1);\n }\n }\n };\n}\n\nfunction resolveObserverTarget(root: ParentNode): Node {\n // MutationObserver attend un Node.\n // - Document => document.documentElement si disponible, sinon le document lui-même\n // - ShadowRoot / Element => observe directement\n if (root instanceof Document) return root.documentElement ?? root;\n return root as unknown as Node;\n}\n\n/* ---------------------------------- Core ---------------------------------- */\n\nexport function createCore(options: CoreOptions = {}): Core {\n const root: Document | ShadowRoot = options.root ?? document;\n const logger = createLogger(!!options.debug);\n\n const defs = new Map<ModuleKey, AdLibModuleDefinition>();\n const instances = new Map<ModuleKey, AdLibModuleInstance>();\n\n const listenersByType = new Map<string, EventListenerInfo>();\n\n function on(type: string, selector: string, handler: DelegatedHandler, opts: OnOptions = {}): Disposer {\n const capture = !!opts.capture;\n const passive = !!opts.passive;\n\n const existing = listenersByType.get(type);\n if (existing) {\n existing.entries.push({ selector, handler, once: !!opts.once });\n\n return () => {\n const idx = existing.entries.findIndex((e) => e.selector === selector && e.handler === handler);\n if (idx >= 0) existing.entries.splice(idx, 1);\n\n // ✅ Si c'était le dernier handler, on retire le listener racine et on nettoie la map\n if (existing.entries.length === 0) {\n root.removeEventListener(type, existing.listener, { capture: existing.capture });\n listenersByType.delete(type);\n }\n };\n }\n\n const info: EventListenerInfo = {\n capture,\n passive,\n entries: [{ selector, handler, once: !!opts.once }],\n listener: () => {},\n };\n\n const listener = createDelegatedListener(info);\n info.listener = listener;\n\n listenersByType.set(type, info);\n\n root.addEventListener(type, listener, { capture, passive });\n\n // ✅ Disposer “handler-level” (pas “type-level”)\n return () => {\n const cur = listenersByType.get(type);\n if (!cur) return;\n\n const idx = cur.entries.findIndex((e) => e.selector === selector && e.handler === handler);\n if (idx >= 0) cur.entries.splice(idx, 1);\n\n if (cur.entries.length === 0) {\n root.removeEventListener(type, cur.listener, { capture: cur.capture });\n listenersByType.delete(type);\n }\n };\n }\n\n function emit(el: Element, name: string, detail?: unknown) {\n const ev = new CustomEvent(name, { detail, bubbles: true });\n el.dispatchEvent(ev);\n }\n\n function register(def: AdLibModuleDefinition) {\n defs.set(def.key, def);\n }\n\n function unregister(key: ModuleKey) {\n defs.delete(key);\n }\n\n function mount(key: ModuleKey, _root?: ParentNode) {\n const def = defs.get(key);\n if (!def) return;\n if (instances.has(key)) return;\n\n const inst = def.init(api);\n instances.set(key, inst);\n }\n\n function unmount(key: ModuleKey) {\n const inst = instances.get(key);\n if (!inst) return;\n inst.destroy();\n instances.delete(key);\n }\n\n function mountAll(_root?: ParentNode) {\n for (const key of defs.keys()) mount(key);\n }\n\n function unmountAll() {\n for (const key of instances.keys()) unmount(key);\n }\n\n let observer: MutationObserver | null = null;\n\n function observe(observedRoot: ParentNode = root): Disposer {\n if (observer) return () => {};\n\n observer = new MutationObserver((_mutations) => {\n // Signal DOM : le runtime est responsable de décider quoi charger / recharger.\n // Le core garantit uniquement une observation stable et désinscriptible.\n });\n\n observer.observe(resolveObserverTarget(observedRoot), {\n subtree: true,\n childList: true,\n attributes: false,\n });\n\n return () => stopObserving();\n }\n\n function stopObserving() {\n if (!observer) return;\n observer.disconnect();\n observer = null;\n }\n\n function destroy() {\n stopObserving();\n unmountAll();\n\n for (const [type, info] of listenersByType.entries()) {\n root.removeEventListener(type, info.listener, { capture: info.capture });\n }\n\n listenersByType.clear();\n defs.clear();\n instances.clear();\n }\n\n function getLogger() {\n return logger;\n }\n\n const api: Core = {\n on,\n emit,\n register,\n unregister,\n mount,\n unmount,\n mountAll,\n unmountAll,\n observe,\n stopObserving,\n destroy,\n getLogger,\n };\n\n return api;\n}\n\n/* ----------------------------- Singleton helpers ---------------------------- */\n\nlet singleton: Core | null = null;\n\nexport function getCoreSingleton(options: CoreOptions = {}): Core {\n if (singleton) return singleton;\n singleton = createCore({ autoMount: true, ...options });\n\n const shouldAutoMount = options.autoMount ?? true;\n if (shouldAutoMount && typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener(\n 'DOMContentLoaded',\n () => {\n singleton?.mountAll();\n },\n { once: true }\n );\n } else {\n singleton.mountAll();\n }\n }\n\n return singleton;\n}\n\nexport default createCore;","import type { ModuleKey, RuntimeConfig } from './types';\n\nfunction normalizeOrigin(origin: string): string {\n return origin.trim().replace(/\\/+$/, '');\n}\n\nfunction resolveOrigin(config: RuntimeConfig): string {\n // `base` permet de forcer une origine de chargement (ex: CDN custom).\n // Sinon, on utilise `registry` (ex: jsDelivr / unpkg / registry interne).\n return normalizeOrigin(config.base ?? config.registry);\n}\n\nfunction resolveVersion(config: RuntimeConfig): string {\n const v = (config.version ?? '').trim();\n return v || 'latest';\n}\n\n/**\n * Construit le chemin d'import ESM d'un module à partir de la configuration runtime.\n * Format :\n * {origin}/@adartem/{package}@{version}/dist/index.js\n */\nfunction makeEsmImportPath(origin: string, pkgName: string, version: string): string {\n return `${origin}/@adartem/${pkgName}@${version}/dist/index.js`;\n}\n\nconst PACKAGE_BY_KEY: Record<ModuleKey, string> = {\n 'ad-click': 'ad-click',\n};\n\nexport function getImportPathForModule(key: ModuleKey, config: RuntimeConfig): string | null {\n const origin = resolveOrigin(config);\n const version = resolveVersion(config);\n\n const pkgName = PACKAGE_BY_KEY[key];\n if (!pkgName) return null;\n\n return makeEsmImportPath(origin, pkgName, version);\n}","import { collectModuleKeysFromDOM, isBrowser } from '@adartem/adlib-utils';\n\nimport type { Core } from '../core';\nimport { createCore } from '../core';\nimport { getImportPathForModule } from './module-map';\nimport type {\n AdLibModuleDefinition,\n AdLibRuntime,\n GlobalQueueItem,\n ModuleKey,\n RuntimeConfig,\n RuntimeModuleState,\n RuntimeOptions,\n} from './types';\n\n/**\n * Runtime robuste:\n * - load() : import + init(core) + état\n * - push() : callbacks avant/après load\n * - queue globale window.AdLibAttributesQueue\n * - reload() : destroy module + re-init\n * - auto (optionnel) : scan DOM minimal + MutationObserver\n */\n\ntype QueueEntry = {\n key: ModuleKey;\n cb: (state: RuntimeModuleState) => void;\n};\n\nconst DEFAULT_REGISTRY = 'https://cdn.jsdelivr.net/npm';\n\nfunction stateOf(modules: Record<string, RuntimeModuleState>, key: ModuleKey): RuntimeModuleState {\n return (modules[key] ??= { key, status: 'idle' });\n}\n\nfunction isReadyOrError(s: RuntimeModuleState) {\n return s.status === 'ready' || s.status === 'error';\n}\n\nfunction toError(err: unknown): Error {\n return err instanceof Error ? err : new Error(String(err));\n}\n\nfunction normalizeUrlBase(value?: string): string | undefined {\n const v = (value ?? '').trim();\n if (!v) return undefined;\n return v.replace(/\\/+$/, '');\n}\n\nfunction resolveConfig(options: RuntimeOptions): RuntimeConfig {\n const registry = normalizeUrlBase(options.config?.registry) ?? DEFAULT_REGISTRY;\n const version = (options.config?.version ?? options.version).trim() || options.version;\n\n const out: RuntimeConfig = { registry, version };\n\n const base = normalizeUrlBase(options.config?.base);\n if (base) out.base = base; // ✅ n’ajoute pas la clé si undefined\n\n return out;\n}\n\n/**\n * Valide/normalise le résultat d'un import dynamique vers une AdLibModuleDefinition.\n * Permet d'éviter les `any` et les accès unsafe.\n */\nfunction toModuleDefinition(mod: unknown, expectedKey: ModuleKey): AdLibModuleDefinition {\n const candidate = (() => {\n if (mod && typeof mod === 'object') {\n const record = mod as Record<string, unknown>;\n return record.default ?? mod;\n }\n return mod;\n })();\n\n if (!candidate || typeof candidate !== 'object') {\n throw new Error(`Invalid module definition for ${expectedKey}`);\n }\n\n const def = candidate as Partial<AdLibModuleDefinition>;\n\n if (typeof def.key !== 'string' || typeof def.init !== 'function') {\n throw new Error(`Invalid module definition for ${expectedKey}`);\n }\n\n // Sécurité: clé cohérente\n if (def.key !== expectedKey) {\n throw new Error(`Module key mismatch: expected \"${expectedKey}\", got \"${def.key}\"`);\n }\n\n return def as AdLibModuleDefinition;\n}\n\nexport function createRuntime(options: RuntimeOptions): AdLibRuntime {\n const debug = options.debug ?? false;\n const auto = options.auto ?? false;\n\n // ✅ Ownership: runtime propriétaire uniquement si options.core est absent (null/undefined)\n const ownsCore = options.core == null;\n\n // ✅ Runtime ne récupère jamais le singleton tout seul.\n // - si core injecté => utilisé tel quel, et NON détruit par runtime.destroy()\n // - sinon => core dédié, détruit par runtime.destroy()\n const core: Core =\n options.core ??\n createCore({\n debug,\n autoMount: false,\n });\n\n const logger = core.getLogger();\n const config = resolveConfig(options);\n\n const modules: Record<string, RuntimeModuleState> = {};\n const queue: QueueEntry[] = [];\n\n let observer: MutationObserver | null = null;\n\n function log(...args: unknown[]) {\n if (!debug) return;\n logger.debug('[AdLib Runtime]', ...args);\n }\n\n function logError(...args: unknown[]) {\n logger.error('[AdLib Runtime]', ...args);\n }\n\n function flush(key: ModuleKey, st: RuntimeModuleState) {\n for (let i = queue.length - 1; i >= 0; i--) {\n const entry = queue[i];\n if (!entry) continue;\n if (entry.key === key) {\n queue.splice(i, 1);\n try {\n entry.cb(st);\n } catch (e) {\n logError('push callback failed', key, e);\n }\n }\n }\n }\n\n function destroyModule(key: ModuleKey) {\n const st = modules[key];\n if (!st) return;\n\n try {\n st.instance?.destroy?.();\n } catch (e) {\n logError('destroyModule failed', key, e);\n }\n\n delete st.instance;\n delete st.def;\n delete st.error;\n delete st.promise;\n\n st.status = 'idle';\n }\n\n async function load(key: ModuleKey): Promise<RuntimeModuleState> {\n const st = stateOf(modules, key);\n\n if (st.status === 'ready') return st;\n if (st.status === 'error') return st;\n\n if (st.status === 'loading' && st.promise) return st.promise;\n\n const importPath = getImportPathForModule(key, config);\n if (!importPath) {\n st.status = 'error';\n st.error = new Error(`Unknown module key: ${key}`);\n flush(key, st);\n return st;\n }\n\n st.status = 'loading';\n log('load()', key, '->', importPath);\n\n const promise: Promise<RuntimeModuleState> = (async () => {\n try {\n const mod: unknown = await import(/* @vite-ignore */ importPath);\n const def = toModuleDefinition(mod, key);\n\n st.def = def;\n\n if (!st.instance) {\n st.instance = def.init(core);\n }\n\n st.status = 'ready';\n delete st.error;\n delete st.promise;\n\n flush(key, st);\n return st;\n } catch (err) {\n st.status = 'error';\n st.error = toError(err);\n delete st.promise;\n\n flush(key, st);\n return st;\n }\n })();\n\n st.promise = promise;\n return promise;\n }\n\n async function reload(key: ModuleKey): Promise<RuntimeModuleState> {\n log('reload()', key);\n destroyModule(key);\n return load(key);\n }\n\n function push(key: ModuleKey, cb: (state: RuntimeModuleState) => void) {\n const st = modules[key];\n if (st && isReadyOrError(st)) {\n try {\n cb(st);\n } catch (e) {\n logError('push callback failed', key, e);\n }\n return;\n }\n queue.push({ key, cb });\n }\n\n function autoLoadFromDOM(root: ParentNode = document) {\n const keys = collectModuleKeysFromDOM(root);\n for (const key of keys) void load(key);\n }\n\n function startObserver() {\n if (!isBrowser()) return;\n if (observer) return;\n\n observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of Array.from(m.addedNodes)) {\n if (!(node instanceof HTMLElement)) continue;\n autoLoadFromDOM(node);\n }\n }\n });\n\n observer.observe(document.documentElement, { childList: true, subtree: true });\n }\n\n function stopObserver() {\n observer?.disconnect();\n observer = null;\n }\n\n function destroy(opts?: { keepGlobal?: boolean }) {\n log('destroy()');\n\n stopObserver();\n\n for (const st of Object.values(modules)) {\n try {\n st.instance?.destroy?.();\n } catch (e) {\n logError('destroy module failed', st.key, e);\n }\n }\n\n // ✅ Ownership rule: ne détruit le core QUE si le runtime l'a créé\n if (ownsCore) {\n try {\n core.destroy();\n } catch (e) {\n logError('core.destroy failed', e);\n }\n }\n\n for (const k of Object.keys(modules)) delete modules[k];\n queue.length = 0;\n\n if (!opts?.keepGlobal && typeof window !== 'undefined') {\n delete window.AdLibAttributes;\n }\n }\n\n const runtime: AdLibRuntime = {\n version: options.version,\n config,\n core,\n debug,\n modules,\n load,\n push,\n reload,\n destroy,\n };\n\n if (typeof window !== 'undefined') {\n const globalQ = window.AdLibAttributesQueue;\n if (Array.isArray(globalQ) && globalQ.length > 0) {\n const items: GlobalQueueItem[] = globalQ.splice(0, globalQ.length);\n for (const [key, cb] of items) runtime.push(key, cb);\n }\n }\n\n if (auto && isBrowser()) {\n autoLoadFromDOM(document.body ?? document);\n startObserver();\n }\n\n return runtime;\n}","import { isModuleKey, normalizeAttributeName } from '@adartem/adlib-utils';\n\nimport type { LoaderScriptConfig, LoaderScriptInfo, RuntimeConfig } from './types';\n\n/** Helpers DOM-agnostic (compat jsdom + environnements DOM partiels) */\n\ntype AttrLike = { name: string };\ntype AttributesLike = {\n length: number;\n item(index: number): AttrLike | null;\n};\n\nfunction hasGetAttributeNames(el: unknown): el is { getAttributeNames(): unknown } {\n return (\n typeof el === 'object' &&\n el !== null &&\n typeof (el as { getAttributeNames?: unknown }).getAttributeNames === 'function'\n );\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\nfunction hasAttributesLike(el: unknown): el is { attributes: AttributesLike } {\n if (typeof el !== 'object' || el === null) return false;\n\n const attrs = (el as { attributes?: unknown }).attributes;\n if (typeof attrs !== 'object' || attrs === null) return false;\n\n const a = attrs as Partial<AttributesLike>;\n return typeof a.length === 'number' && typeof a.item === 'function';\n}\n\nfunction hasQuerySelectorAll(\n root: unknown,\n): root is ParentNode & { querySelectorAll(selectors: string): NodeListOf<Element> } {\n if (typeof root !== 'object' || root === null) return false;\n return typeof (root as { querySelectorAll?: unknown }).querySelectorAll === 'function';\n}\n\n/** Safe wrapper (jsdom + navigateurs anciens + environnements DOM partiels) */\nfunction getAttributeNamesSafe(el: Element): string[] {\n // 1) voie moderne: getAttributeNames()\n if (hasGetAttributeNames(el)) {\n const maybe = el.getAttributeNames();\n if (isStringArray(maybe)) return maybe;\n }\n\n // 2) fallback: attributes NamedNodeMap-like (structure minimale)\n if (hasAttributesLike(el)) {\n const out: string[] = [];\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes.item(i);\n if (attr && typeof attr.name === 'string' && attr.name) out.push(attr.name);\n }\n return out;\n }\n\n return [];\n}\n\n/**\n * Heuristique “loader script” :\n * - <script type=\"module\" src=\".../attributes.js\">\n * Tolérant aux chemins (CDN, querystring, chemins relatifs/absolus).\n */\nfunction isAttributesLoaderScript(s: HTMLScriptElement): boolean {\n const type = (s.getAttribute('type') ?? '').trim();\n if (type && type !== 'module') return false;\n\n const src = (s.getAttribute('src') ?? '').trim();\n if (!src) return false;\n\n return src.includes('attributes.js');\n}\n\nfunction pickNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const v = value.trim();\n return v ? v : undefined;\n}\n\nfunction parseBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== 'string') return fallback;\n const v = value.trim().toLowerCase();\n if (v === '' || v === 'true' || v === '1' || v === 'yes' || v === 'on') return true;\n if (v === 'false' || v === '0' || v === 'no' || v === 'off') return false;\n return fallback;\n}\n\n/**\n * Source unique de vérité: lit data-adlib-* depuis le <script> et retourne une config normalisée.\n * Conventions dataset camelCase :\n * - data-adlib-registry => dataset.adlibRegistry\n * - data-adlib-version => dataset.adlibVersion\n * - data-adlib-base => dataset.adlibBase\n * - data-adlib-auto => dataset.adlibAuto\n * - data-adlib-debug => dataset.adlibDebug\n */\nfunction readLoaderConfig(s: HTMLScriptElement): LoaderScriptConfig {\n // dataset est standard sur HTMLScriptElement en DOM.\n // Fallback léger pour les environnements DOM incomplets.\n const ds = (s as unknown as { dataset?: Record<string, string> }).dataset ?? {};\n\n const debug = parseBoolean(ds.adlibDebug, false);\n const auto = parseBoolean(ds.adlibAuto, true);\n\n const registry = pickNonEmptyString(ds.adlibRegistry);\n const version = pickNonEmptyString(ds.adlibVersion);\n const base = pickNonEmptyString(ds.adlibBase);\n\n // ✅ exactOptionalPropertyTypes-safe : ne pas inclure les clés si undefined\n const config: Partial<RuntimeConfig> = {};\n if (registry) config.registry = registry;\n if (version) config.version = version;\n if (base) config.base = base;\n\n return { debug, auto, config };\n}\n\nexport function findLoaderScripts(root: ParentNode = document): LoaderScriptInfo[] {\n if (!hasQuerySelectorAll(root)) return [];\n\n const scripts = Array.from(root.querySelectorAll('script'));\n const result: LoaderScriptInfo[] = [];\n\n for (const script of scripts) {\n if (!(script instanceof HTMLScriptElement)) continue;\n if (!isAttributesLoaderScript(script)) continue;\n\n const requested = new Set<LoaderScriptInfo['requestedKeys'][number]>();\n\n for (const rawName of getAttributeNamesSafe(script)) {\n const name = normalizeAttributeName(rawName);\n if (isModuleKey(name)) requested.add(name);\n }\n\n result.push({\n el: script,\n requestedKeys: Array.from(requested),\n loaderConfig: readLoaderConfig(script),\n });\n }\n\n return result;\n}","import { isBrowser } from '@adartem/adlib-utils';\n\nimport { getCoreSingleton } from '../core';\nimport { createRuntime } from './runtime';\nimport { findLoaderScripts } from './script-detection';\nimport type { ModuleKey } from './types';\n\ndeclare const __ADLIB_VERSION__: string | undefined;\n\n// Vitest / dev (TS direct) => la constante n'existe pas\n// Build tsup => la constante est injectée (string)\nconst VERSION = typeof __ADLIB_VERSION__ === 'string' ? __ADLIB_VERSION__ : 'dev';\n\n(function bootstrap() {\n if (!isBrowser()) return;\n\n // Ne pas re-bootstrap si déjà présent\n if (window.AdLibAttributes) return;\n\n const loaders = findLoaderScripts(document);\n const primary = loaders[0];\n\n // ✅ Source unique de vérité: script-detection.ts normalise data-adlib-*\n const debug = primary?.loaderConfig.debug ?? false;\n const auto = primary?.loaderConfig.auto ?? true;\n const config = primary?.loaderConfig.config ?? {};\n\n const core = getCoreSingleton({ root: document, debug });\n const runtime = createRuntime({\n version: VERSION,\n core,\n debug,\n auto,\n config,\n });\n\n // Expose global\n window.AdLibAttributes = runtime;\n\n // 1) Modules demandés via attributs du <script ... attributes.js ...>\n const requested = new Set<ModuleKey>();\n for (const info of loaders) {\n for (const k of info.requestedKeys) requested.add(k);\n }\n\n // 2) Chargement initial\n for (const key of requested) {\n runtime.load(key).catch(() => {\n // le runtime gère déjà l'état error ; ici on évite de throw global\n });\n }\n})();"],"mappings":"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","names":["isModuleKey","value","normalizeAttributeName","name","hasQuerySelectorAll","collectModuleKeysFromDOM","root","found","elements","el","attr","normalized","isBrowser","createLogger","debug","args","isElement","value","safeMatches","el","selector","findClosestMatching","target","cur","createDelegatedListener","info","e","entries","entry","matched","idx","resolveObserverTarget","root","createCore","options","logger","defs","instances","listenersByType","on","type","handler","opts","capture","passive","existing","listener","emit","name","detail","ev","register","def","unregister","key","mount","_root","inst","api","unmount","mountAll","unmountAll","observer","observe","observedRoot","_mutations","stopObserving","destroy","getLogger","singleton","getCoreSingleton","normalizeOrigin","origin","resolveOrigin","config","resolveVersion","makeEsmImportPath","pkgName","version","PACKAGE_BY_KEY","getImportPathForModule","key","DEFAULT_REGISTRY","stateOf","modules","key","isReadyOrError","s","toError","err","normalizeUrlBase","value","v","resolveConfig","options","registry","version","out","base","toModuleDefinition","mod","expectedKey","candidate","def","createRuntime","debug","auto","ownsCore","core","createCore","logger","config","queue","observer","log","args","logError","flush","st","i","entry","e","destroyModule","load","importPath","getImportPathForModule","promise","reload","push","cb","autoLoadFromDOM","root","keys","collectModuleKeysFromDOM","startObserver","isBrowser","mutations","m","node","stopObserver","destroy","opts","k","runtime","globalQ","items","hasGetAttributeNames","el","isStringArray","value","v","hasAttributesLike","attrs","a","hasQuerySelectorAll","root","getAttributeNamesSafe","maybe","out","i","attr","isAttributesLoaderScript","s","type","src","pickNonEmptyString","parseBoolean","fallback","readLoaderConfig","ds","debug","auto","registry","version","base","config","findLoaderScripts","scripts","result","script","requested","rawName","name","normalizeAttributeName","isModuleKey","VERSION","isBrowser","loaders","findLoaderScripts","primary","debug","auto","config","core","getCoreSingleton","runtime","createRuntime","requested","info","k","key"]}