@adhese/sdk 0.6.4 → 0.7.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/dist/index.cjs +65 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +12 -3
- package/dist/index.js +64 -26
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
package/dist/index.cjs
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const sdkDevtools = require("@adhese/sdk-devtools");
|
|
4
3
|
const runtimeCore = require("@vue/runtime-core");
|
|
5
|
-
const
|
|
6
|
-
const debounce = require("lodash/debounce");
|
|
7
|
-
const random = require("lodash/random");
|
|
8
|
-
const isEqual = require("lodash/isEqual");
|
|
9
|
-
const round = require("lodash/round");
|
|
4
|
+
const remeda = require("remeda");
|
|
10
5
|
const zod = require("zod");
|
|
11
6
|
async function waitForDomLoad() {
|
|
12
7
|
return new Promise((resolve) => {
|
|
@@ -67,6 +62,15 @@ function createEvent() {
|
|
|
67
62
|
removeListener
|
|
68
63
|
};
|
|
69
64
|
}
|
|
65
|
+
const savedIds = /* @__PURE__ */ new Set();
|
|
66
|
+
function uniqueId() {
|
|
67
|
+
let id;
|
|
68
|
+
do
|
|
69
|
+
id = Math.random().toString(36).slice(2);
|
|
70
|
+
while (savedIds.has(id));
|
|
71
|
+
savedIds.add(id);
|
|
72
|
+
return id;
|
|
73
|
+
}
|
|
70
74
|
function createSafeFrame({
|
|
71
75
|
renderFile,
|
|
72
76
|
context
|
|
@@ -188,10 +192,10 @@ function createSlotManager({
|
|
|
188
192
|
var _a;
|
|
189
193
|
const slot = createSlot({
|
|
190
194
|
...options,
|
|
191
|
-
onDispose,
|
|
195
|
+
onDispose: onDispose2,
|
|
192
196
|
context
|
|
193
197
|
});
|
|
194
|
-
function
|
|
198
|
+
function onDispose2() {
|
|
195
199
|
var _a2;
|
|
196
200
|
slots.delete(slot.name.value);
|
|
197
201
|
logger.debug("Slot removed", {
|
|
@@ -270,17 +274,19 @@ function createQueryDetector({
|
|
|
270
274
|
}
|
|
271
275
|
return "unknown";
|
|
272
276
|
}
|
|
273
|
-
const handleOnChange = debounce(() => {
|
|
277
|
+
const handleOnChange = remeda.debounce(() => {
|
|
274
278
|
void (onChange == null ? void 0 : onChange(getQuery()));
|
|
275
279
|
logger.debug(`Change device ${getQuery()}`);
|
|
276
|
-
},
|
|
280
|
+
}, {
|
|
281
|
+
waitMs: 50
|
|
282
|
+
});
|
|
277
283
|
if (onChange) {
|
|
278
284
|
for (const query of mediaMap.values())
|
|
279
|
-
query.addEventListener("change", handleOnChange);
|
|
285
|
+
query.addEventListener("change", handleOnChange.call);
|
|
280
286
|
}
|
|
281
287
|
function dispose() {
|
|
282
288
|
for (const query of mediaMap.values())
|
|
283
|
-
query.removeEventListener("change", handleOnChange);
|
|
289
|
+
query.removeEventListener("change", handleOnChange.call);
|
|
284
290
|
}
|
|
285
291
|
return {
|
|
286
292
|
queries: mediaMap,
|
|
@@ -372,7 +378,7 @@ function createParameters(options, queryDetector) {
|
|
|
372
378
|
tl: options.consent ? "all" : "none",
|
|
373
379
|
dt: queryDetector.getQuery(),
|
|
374
380
|
br: queryDetector.getQuery(),
|
|
375
|
-
rn: random(1e4).toString()
|
|
381
|
+
rn: Math.round(Math.random() * 1e4).toString()
|
|
376
382
|
}))
|
|
377
383
|
parameters.set(key, value);
|
|
378
384
|
return parameters;
|
|
@@ -391,7 +397,8 @@ function isPreviewMode() {
|
|
|
391
397
|
}
|
|
392
398
|
function createHook({
|
|
393
399
|
onRun,
|
|
394
|
-
onAdd
|
|
400
|
+
onAdd,
|
|
401
|
+
onDispose: onDispose2
|
|
395
402
|
}) {
|
|
396
403
|
const callbacks = /* @__PURE__ */ new Set();
|
|
397
404
|
function run() {
|
|
@@ -403,7 +410,11 @@ function createHook({
|
|
|
403
410
|
callbacks.add(callback);
|
|
404
411
|
onAdd == null ? void 0 : onAdd(callbacks);
|
|
405
412
|
}
|
|
406
|
-
|
|
413
|
+
function dispose() {
|
|
414
|
+
onDispose2 == null ? void 0 : onDispose2(callbacks);
|
|
415
|
+
callbacks.clear();
|
|
416
|
+
}
|
|
417
|
+
return [run, add, dispose];
|
|
407
418
|
}
|
|
408
419
|
let resolveOnInitPromise = () => {
|
|
409
420
|
};
|
|
@@ -411,7 +422,7 @@ let isInit = false;
|
|
|
411
422
|
const waitOnInit = new Promise((resolve) => {
|
|
412
423
|
resolveOnInitPromise = resolve;
|
|
413
424
|
});
|
|
414
|
-
const [runOnInit, onInit] = createHook({
|
|
425
|
+
const [runOnInit, onInit, disposeOnInit] = createHook({
|
|
415
426
|
onRun(callbacks) {
|
|
416
427
|
isInit = true;
|
|
417
428
|
resolveOnInitPromise();
|
|
@@ -423,6 +434,24 @@ const [runOnInit, onInit] = createHook({
|
|
|
423
434
|
runOnInit();
|
|
424
435
|
}
|
|
425
436
|
});
|
|
437
|
+
let resolveOnDisposePromise = () => {
|
|
438
|
+
};
|
|
439
|
+
let isDisposed = false;
|
|
440
|
+
new Promise((resolve) => {
|
|
441
|
+
resolveOnDisposePromise = resolve;
|
|
442
|
+
});
|
|
443
|
+
const [runOnDispose, onDispose, disposeOnDispose] = createHook({
|
|
444
|
+
onRun(callbacks) {
|
|
445
|
+
isDisposed = true;
|
|
446
|
+
resolveOnDisposePromise();
|
|
447
|
+
logger.debug("Disposal completed");
|
|
448
|
+
callbacks.clear();
|
|
449
|
+
},
|
|
450
|
+
onAdd() {
|
|
451
|
+
if (isDisposed)
|
|
452
|
+
runOnDispose();
|
|
453
|
+
}
|
|
454
|
+
});
|
|
426
455
|
function createAdhese(options) {
|
|
427
456
|
const scope = runtimeCore.effectScope();
|
|
428
457
|
return scope.run(() => {
|
|
@@ -440,6 +469,7 @@ function createAdhese(options) {
|
|
|
440
469
|
safeFrame: false,
|
|
441
470
|
eagerRendering: false,
|
|
442
471
|
viewabilityTracking: true,
|
|
472
|
+
plugins: [],
|
|
443
473
|
...options
|
|
444
474
|
};
|
|
445
475
|
setupLogging(mergedOptions);
|
|
@@ -536,19 +566,15 @@ function createAdhese(options) {
|
|
|
536
566
|
}
|
|
537
567
|
return domSlots;
|
|
538
568
|
}
|
|
539
|
-
let unmountDevtools;
|
|
540
569
|
async function toggleDebug() {
|
|
541
570
|
var _a, _b;
|
|
542
571
|
context.debug = !context.debug;
|
|
543
|
-
if (context.debug
|
|
544
|
-
unmountDevtools = await sdkDevtools.createDevtools(context);
|
|
572
|
+
if (context.debug) {
|
|
545
573
|
logger.setMinLogLevelThreshold("debug");
|
|
546
574
|
logger.debug("Debug mode enabled");
|
|
547
575
|
(_a = context.events) == null ? void 0 : _a.debugChange.dispatch(true);
|
|
548
576
|
} else {
|
|
549
577
|
logger.debug("Debug mode disabled");
|
|
550
|
-
unmountDevtools == null ? void 0 : unmountDevtools();
|
|
551
|
-
unmountDevtools = void 0;
|
|
552
578
|
logger.setMinLogLevelThreshold("info");
|
|
553
579
|
(_b = context.events) == null ? void 0 : _b.debugChange.dispatch(false);
|
|
554
580
|
}
|
|
@@ -581,7 +607,6 @@ function createAdhese(options) {
|
|
|
581
607
|
});
|
|
582
608
|
function dispose() {
|
|
583
609
|
var _a, _b;
|
|
584
|
-
unmountDevtools == null ? void 0 : unmountDevtools();
|
|
585
610
|
queryDetector.dispose();
|
|
586
611
|
slotManager.dispose();
|
|
587
612
|
queryDetector.dispose();
|
|
@@ -590,18 +615,21 @@ function createAdhese(options) {
|
|
|
590
615
|
logger.resetLogs();
|
|
591
616
|
(_b = context.events) == null ? void 0 : _b.dispose();
|
|
592
617
|
logger.info("Adhese instance disposed");
|
|
618
|
+
runOnDispose();
|
|
619
|
+
disposeOnInit();
|
|
620
|
+
disposeOnDispose();
|
|
593
621
|
scope.stop();
|
|
594
622
|
}
|
|
623
|
+
for (const plugin of mergedOptions.plugins)
|
|
624
|
+
plugin(context);
|
|
595
625
|
onInit(async () => {
|
|
596
626
|
var _a;
|
|
597
627
|
if ((slotManager.getAll().length ?? 0) > 0)
|
|
598
628
|
await fetchAndRenderAllSlots().catch(logger.error);
|
|
599
629
|
if (mergedOptions.findDomSlotsOnLoad)
|
|
600
630
|
await findDomSlots2();
|
|
601
|
-
if (mergedOptions.debug || window.location.search.includes("adhese_debug=true") || isPreviewMode())
|
|
602
|
-
unmountDevtools = await sdkDevtools.createDevtools(context);
|
|
631
|
+
if (mergedOptions.debug || window.location.search.includes("adhese_debug=true") || isPreviewMode())
|
|
603
632
|
(_a = context.events) == null ? void 0 : _a.debugChange.dispatch(true);
|
|
604
|
-
}
|
|
605
633
|
if (!scope.active)
|
|
606
634
|
dispose();
|
|
607
635
|
});
|
|
@@ -650,7 +678,7 @@ function useViewabilityObserver({ context, ad, name, element }) {
|
|
|
650
678
|
const isTracked = runtimeCore.computed(() => Boolean(trackingPixel.value));
|
|
651
679
|
const viewabilityObserver = new IntersectionObserver(([entry]) => {
|
|
652
680
|
if (context.options.viewabilityTracking && !trackingPixel.value && ad) {
|
|
653
|
-
const ratio = round(entry.intersectionRatio, 1);
|
|
681
|
+
const ratio = remeda.round(entry.intersectionRatio, 1);
|
|
654
682
|
if (ratio >= threshold && !timeoutId) {
|
|
655
683
|
timeoutId = setTimeout(() => {
|
|
656
684
|
var _a, _b, _c;
|
|
@@ -782,7 +810,7 @@ function createSlot(options) {
|
|
|
782
810
|
});
|
|
783
811
|
runtimeCore.watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {
|
|
784
812
|
var _a, _b;
|
|
785
|
-
if (!newAd ||
|
|
813
|
+
if (!newAd || oldAd && remeda.isDeepEqual(newAd, oldAd))
|
|
786
814
|
return;
|
|
787
815
|
if (newIsInViewport || context.options.eagerRendering)
|
|
788
816
|
await render(newAd);
|
|
@@ -1120,8 +1148,16 @@ function parseParameters(parameters) {
|
|
|
1120
1148
|
return true;
|
|
1121
1149
|
logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);
|
|
1122
1150
|
return false;
|
|
1151
|
+
}).map(([key, value]) => {
|
|
1152
|
+
if (typeof value === "string")
|
|
1153
|
+
return [key, filterSpecialChars(value)];
|
|
1154
|
+
return [key, value.map(filterSpecialChars)];
|
|
1123
1155
|
}));
|
|
1124
1156
|
}
|
|
1157
|
+
function filterSpecialChars(value) {
|
|
1158
|
+
const specialRegex = /[^\p{L}\p{N}_]/gu;
|
|
1159
|
+
return value.replaceAll(specialRegex, "_");
|
|
1160
|
+
}
|
|
1125
1161
|
async function requestAds(options) {
|
|
1126
1162
|
var _a, _b, _c, _d, _e;
|
|
1127
1163
|
const { context } = options;
|
|
@@ -1172,4 +1208,6 @@ async function requestAd({
|
|
|
1172
1208
|
return ad;
|
|
1173
1209
|
}
|
|
1174
1210
|
exports.createAdhese = createAdhese;
|
|
1211
|
+
exports.onDispose = onDispose;
|
|
1212
|
+
exports.onInit = onInit;
|
|
1175
1213
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../utils/src/eventManager/eventManager.ts","../../safeframe/src/main.ts","../../core/src/slot/createSlot/createSlot.utils.ts","../../core/src/slot/findDomSlots/findDomSlots.ts","../../core/src/slot/slotManager/slotManager.ts","../../core/src/consent/tcfConsent.ts","../../core/src/queryDetector/queryDetector.ts","../../logger/src/createLogger/createLogger.ts","../../core/src/logger/logger.ts","../../core/src/main.utils.ts","../../core/src/hooks/createHook.ts","../../core/src/hooks/onInit.ts","../../core/src/main.ts","../../core/src/impressionTracking/impressionTracking.ts","../../core/src/slot/createSlot/useViewabilityObserver.ts","../../core/src/slot/createSlot/useRenderIntersectionObserver.ts","../../core/src/slot/createSlot/createSlot.ts","../../core/src/requestAds/requestAds.schema.ts","../../core/src/requestAds/requestAds.preview.ts","../../core/src/requestAds/requestAds.utils.ts","../../core/src/requestAds/requestAds.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","import type { Ad, AdheseContext } from '@core';\nimport uniqueId from 'lodash/uniqueId';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: Ad, element: HTMLElement): Position;\n render(position: Position): Promise<void>;\n dispose(): void;\n};\n\nexport type SafeFrameOptions = {\n renderFile: string;\n context: AdheseContext;\n};\n\nexport function createSafeFrame({\n renderFile,\n context,\n}: SafeFrameOptions): SafeFrame {\n const safeFrame = window.$sf;\n\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const adhesePositions = new Set<Position>();\n\n const config = new safeFrame.host.Config({\n auto: false,\n debug: context.debug,\n renderFile,\n });\n\n function addPosition(ad: Ad, element: HTMLElement): Position {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const html = (ad.ext === 'js' && ad.body) ? ad.body : ad.tag;\n\n if (typeof html !== 'string')\n throw new Error('Ad tag is not a string');\n\n const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;\n\n element.id = elementId;\n\n const position = new safeFrame.host.Position({\n id: elementId,\n html,\n src: ad.ext === 'js' ? ad.swfSrc?.href : undefined,\n config: new safeFrame.host.PosConfig({\n id: elementId,\n w: Number(ad.width),\n h: Number(ad.height),\n size: `${Number(ad.width)}x${Number(ad.height)}`,\n tgt: html.includes('target=\"_self\"') ? '_self' : '_blank',\n dest: elementId,\n }),\n });\n\n adhesePositions.add(position);\n\n return position;\n }\n\n async function render(position: Position): Promise<void> {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n safeFrame.host.render(position);\n }\n\n function dispose(): void {\n }\n\n return {\n config,\n addPosition,\n render,\n dispose,\n };\n}\n","import type { Ad } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n // element.style.width = ad.width ? `${ad.width}px` : 'auto';\n // element.style.height = ad.height ? `${ad.height}px` : 'auto';\n\n element.innerHTML = String(ad.tag);\n}\n\nexport function generateName(\n location: string,\n format: string,\n slot: string | undefined,\n): string {\n return `${location}${slot ? `${slot}` : ''}-${format}`;\n}\n","import { type AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { generateName } from '../createSlot/createSlot.utils';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter((element) => {\n if (!element.dataset.format)\n return false;\n\n const name = generateName(\n context.location,\n element.dataset.format,\n element.dataset.slot,\n );\n\n return !context.getAll?.().some(activeSlot => activeSlot.name.value === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name.value === slot.name.value));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@core';\nimport { effectScope, shallowReactive, watch, watchEffect } from '@vue/runtime-core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Readonly<SlotManager> {\n const scope = effectScope();\n\n return scope.run(() => {\n const slots = shallowReactive<Map<string, AdheseSlot>>(new Map<string, AdheseSlot>());\n\n watchEffect(() => {\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.name.value);\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n slots.set(slot.name.value, slot);\n\n watch(slot.name, (newName, previousName) => {\n slots.set(newName, slot);\n slots.delete(previousName);\n });\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n slots.set(slot.name.value, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n scope.stop();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n })!;\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import debounce from 'lodash/debounce';\nimport { logger } from '@core';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, 50);\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","import { createEventManager } from '@utils';\nimport uniqueId from 'lodash/uniqueId';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import random from 'lodash/random';\nimport { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): Map<string, string | ReadonlyArray<string>> {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: random(10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n","export function createHook<T extends Function>(\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks: Set<T>): void;\n onAdd?(callbacks: Set<T>): void;\n },\n): [() => void, (callback: T) => void] {\n const callbacks = new Set<T>();\n\n function run(): void {\n for (const callback of callbacks)\n callback();\n\n onRun?.(callbacks);\n }\n\n function add(callback: T): void {\n callbacks.add(callback);\n\n onAdd?.(callbacks);\n }\n\n return [run, add];\n}\n","import { logger } from '@core';\nimport { createHook } from './createHook';\n\nlet resolveOnInitPromise = (): void => {};\nlet isInit = false;\nconst waitOnInit = new Promise<void>((resolve) => {\n resolveOnInitPromise = resolve;\n});\n\nconst [runOnInit, onInit] = createHook({\n onRun(callbacks) {\n isInit = true;\n\n resolveOnInitPromise();\n\n logger.debug('Initialization completed');\n\n callbacks.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n});\n\nexport {\n onInit,\n runOnInit,\n waitOnInit,\n};\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\nimport { createDevtools } from '@adhese/sdk-devtools';\nimport { effectScope, reactive, watch } from '@vue/runtime-core';\nimport { createSafeFrame } from '@safeframe';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport function createAdhese(options: AdheseOptions): Readonly<Adhese> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n safeFrame: false,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }) as AdheseContext;\n\n context.events = createEventManager();\n\n context.safeFrame = options.safeFrame\n ? createSafeFrame({\n renderFile: `${mergedOptions.poolHost}/sf/r.html`,\n context,\n })\n : undefined;\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n\n watch(\n context.parameters,\n onParametersChange,\n {\n deep: true,\n immediate: true,\n },\n );\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n async function addSlot(slotOptions: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n if (!slotManager)\n throw new Error('Slot manager not initialized');\n\n const slot = slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n slot.ad.value = await requestAd({\n slot,\n context,\n });\n }\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots() ?? []).filter(slot => !slot.lazyLoading);\n\n if (domSlots.length <= 0)\n return [];\n\n const ads = await requestAds({\n slots: domSlots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n\n return domSlots;\n }\n\n let unmountDevtools: (() => void) | undefined;\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug && !unmountDevtools) {\n // eslint-disable-next-line require-atomic-updates\n unmountDevtools = await createDevtools(context);\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n unmountDevtools?.();\n unmountDevtools = undefined;\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n slots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n function dispose(): void {\n unmountDevtools?.();\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n logger.info('Adhese instance disposed');\n\n scope.stop();\n }\n\n onInit(async () => {\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode()) {\n unmountDevtools = await createDevtools(context);\n\n context.events?.debugChange.dispatch(true);\n }\n\n if (!scope.active)\n dispose();\n });\n\n runOnInit();\n\n return {\n ...mergedOptions,\n ...slotManager,\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n context,\n } satisfies Adhese;\n })!;\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import { type Ad, type AdheseContext, logger } from '@core';\nimport { type ComputedRef, type Ref, computed, ref, watch } from '@vue/runtime-core';\nimport round from 'lodash/round';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<Ad | null>;\n name: ComputedRef<string>;\n element: ComputedRef<HTMLElement | null>;\n },\n): [\n ComputedRef,\n IntersectionObserver['disconnect'],\n ] {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = computed(() => Boolean(trackingPixel.value));\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad.value?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(ad.value.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${name.value}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isTracked, (): void => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n }];\n}\n","import { type Ref, ref, watch } from '@vue/runtime-core';\nimport { type Ad, type AdheseSlotOptions, logger } from '@core';\n\nexport function useRenderIntersectionObserver({ ad, options, element, render }: {\n ad: Ref<Ad | null>;\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n render(adToRender?: Ad): Promise<HTMLElement>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport.value) {\n (async (): Promise<void> => {\n if (!ad.value && options.lazyLoading)\n await render();\n\n await render(ad.value ?? undefined);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import { type Ad, requestAd as extRequestAd, logger } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { type Ref, computed, effectScope, reactive, ref, watch } from '@vue/runtime-core';\nimport isEqual from 'lodash/isEqual';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport { onInit, waitOnInit } from '../../hooks/onInit';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport function createSlot(options: AdheseSlotOptions): Readonly<AdheseSlot> {\n const scope = effectScope();\n\n return scope.run(() => {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format !== 'string') {\n queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n }\n\n const format = ref(queryDetector ? queryDetector.getQuery() : options.format as string);\n function onQueryChange(newFormat: string): void {\n format.value = newFormat;\n }\n\n const ad = ref<Ad | null>(null);\n const originalAd = ref(ad.value);\n\n const name = computed(() => generateName(context.location, format.value, slot));\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n options.onNameChange?.(newName, oldName);\n\n const newAd = await requestAd();\n\n cleanElement();\n\n ad.value = newAd;\n originalAd.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element.value?.querySelector('iframe') ?? null;\n\n return element.value?.innerHTML ? (element.value.firstElementChild as HTMLElement) : null;\n }\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n ad,\n options,\n element,\n render,\n });\n\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if (!newAd || isEqual(newAd, oldAd))\n return;\n\n if (newIsInViewport || context.options.eagerRendering)\n await render(newAd);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n });\n\n const [\n isViewabilityTracked,\n disposeViewabilityObserver,\n ] = useViewabilityObserver({\n context,\n ad,\n name,\n element,\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = computed(() => Boolean(impressionTrackingPixelElement.value));\n\n async function requestAd(): Promise<Ad> {\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n originalAd.value = response;\n\n return response;\n }\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n await waitOnInit;\n\n const renderAd = adToRender ?? ad.value ?? await requestAd();\n\n if (originalAd.value) {\n // eslint-disable-next-line require-atomic-updates\n ad.value = options.onBeforeRender?.(adToRender ?? originalAd.value) ?? renderAd;\n }\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (context.safeFrame && ad.value && renderMode === 'iframe') {\n const position = context.safeFrame.addPosition(ad.value, element.value);\n\n await context.safeFrame.render(position);\n }\n else {\n renderFunctions[renderMode](renderAd, element.value);\n }\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n options.onRender?.(element.value);\n\n disposeRenderIntersectionObserver();\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n ad.value = null;\n\n disposeRenderIntersectionObserver();\n disposeViewabilityObserver();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n\n scope.stop();\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n render,\n getElement,\n dispose,\n };\n })!;\n}\n\nfunction useDomLoaded(): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n","import {\n NEVER,\n type TypeOf,\n ZodIssueCode,\n type ZodType,\n coerce,\n lazy,\n literal,\n number,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\nexport const cssValueLike\n = union([coerce.string(), literal(''), number()]).transform<string | undefined>((value) => {\n if (value === '' || value === 0 || value === '0')\n return undefined;\n\n if (numberLike.parse(value))\n return `${numberLike.parse(value)}px`;\n\n return String(value);\n });\n\nexport const isJson = string().transform((value, { addIssue }) => {\n try {\n return JSON.parse(value.replaceAll('\\'', '\"')) as Record<string, unknown> | ReadonlyArray<unknown>;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid JSON: ${(error as Error).message}`,\n });\n\n return NEVER;\n }\n});\n\nexport const isHtmlString = string().transform((value, { addIssue }) => {\n const htmlParser = new DOMParser();\n\n try {\n const html = htmlParser.parseFromString(value, 'text/html');\n\n if (html.body?.children.length === 0)\n throw new Error('Invalid HTML');\n\n return value;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: (error as Error).message,\n });\n\n return NEVER;\n }\n});\n\nexport const isJsonOrHtmlString = union([isJson, isHtmlString]);\n\nexport const isJsonOrHtmlOptionalString = union([coerce.string(), isJsonOrHtmlString]).transform((value) => {\n if (value === '')\n return undefined;\n\n return value;\n}).optional();\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { type Ad, logger } from '@core';\nimport { adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { type AdRequestOptions, logger } from '@core';\nimport { toValue } from '@vue/runtime-core';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context: { options: { host }, parameters },\n ...options\n}: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: parameters && parseParameters(parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }));\n}\n\nexport function isJsonLike(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { type AdheseContext, logger } from '@core';\nimport type { MaybeRef } from '@vue/runtime-core';\nimport { type Ad, parseResponse } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<{\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n }>;\n context: AdheseContext;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds(options: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n const { context } = options;\n\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews] = await Promise.all([context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(context.options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult: ReadonlyArray<Ad> = [\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ];\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: AdRequestOptions['slots'][number];\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["effectScope","shallowReactive","watchEffect","_a","watch","findDomSlots","extFindDomSlots","reactive","createDevtools","ref","computed","requestAd","extRequestAd","union","coerce","literal","number","string","ZodIssueCode","NEVER","object","unknown","lazy","toValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../utils/src/eventManager/eventManager.ts","../../utils/src/uniqueId/uniqueId.ts","../../safeframe/src/main.ts","../../core/src/slot/createSlot/createSlot.utils.ts","../../core/src/slot/findDomSlots/findDomSlots.ts","../../core/src/slot/slotManager/slotManager.ts","../../core/src/consent/tcfConsent.ts","../../core/src/queryDetector/queryDetector.ts","../../logger/src/createLogger/createLogger.ts","../../core/src/logger/logger.ts","../../core/src/main.utils.ts","../../core/src/hooks/createHook.ts","../../core/src/hooks/onInit.ts","../../core/src/hooks/onDispose.ts","../../core/src/main.ts","../../core/src/impressionTracking/impressionTracking.ts","../../core/src/slot/createSlot/useViewabilityObserver.ts","../../core/src/slot/createSlot/useRenderIntersectionObserver.ts","../../core/src/slot/createSlot/createSlot.ts","../../core/src/requestAds/requestAds.schema.ts","../../core/src/requestAds/requestAds.preview.ts","../../core/src/requestAds/requestAds.utils.ts","../../core/src/requestAds/requestAds.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","const savedIds = new Set<string>();\n\nexport function uniqueId(): string {\n let id: string;\n\n do\n id = Math.random().toString(36).slice(2);\n while (savedIds.has(id));\n\n savedIds.add(id);\n\n return id;\n}\n","import type { Ad, AdheseContext } from '@core';\nimport { uniqueId } from '@utils';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: Ad, element: HTMLElement): Position;\n render(position: Position): Promise<void>;\n dispose(): void;\n};\n\nexport type SafeFrameOptions = {\n renderFile: string;\n context: AdheseContext;\n};\n\nexport function createSafeFrame({\n renderFile,\n context,\n}: SafeFrameOptions): SafeFrame {\n const safeFrame = window.$sf;\n\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const adhesePositions = new Set<Position>();\n\n const config = new safeFrame.host.Config({\n auto: false,\n debug: context.debug,\n renderFile,\n });\n\n function addPosition(ad: Ad, element: HTMLElement): Position {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const html = (ad.ext === 'js' && ad.body) ? ad.body : ad.tag;\n\n if (typeof html !== 'string')\n throw new Error('Ad tag is not a string');\n\n const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;\n\n element.id = elementId;\n\n const position = new safeFrame.host.Position({\n id: elementId,\n html,\n src: ad.ext === 'js' ? ad.swfSrc?.href : undefined,\n config: new safeFrame.host.PosConfig({\n id: elementId,\n w: Number(ad.width),\n h: Number(ad.height),\n size: `${Number(ad.width)}x${Number(ad.height)}`,\n tgt: html.includes('target=\"_self\"') ? '_self' : '_blank',\n dest: elementId,\n }),\n });\n\n adhesePositions.add(position);\n\n return position;\n }\n\n async function render(position: Position): Promise<void> {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n safeFrame.host.render(position);\n }\n\n function dispose(): void {\n }\n\n return {\n config,\n addPosition,\n render,\n dispose,\n };\n}\n","import type { Ad } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.innerHTML = String(ad.tag);\n}\n\nexport function generateName(\n location: string,\n format: string,\n slot: string | undefined,\n): string {\n return `${location}${slot ? `${slot}` : ''}-${format}`;\n}\n","import { type AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { generateName } from '../createSlot/createSlot.utils';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter((element) => {\n if (!element.dataset.format)\n return false;\n\n const name = generateName(\n context.location,\n element.dataset.format,\n element.dataset.slot,\n );\n\n return !context.getAll?.().some(activeSlot => activeSlot.name.value === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name.value === slot.name.value));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@core';\nimport { effectScope, shallowReactive, watch, watchEffect } from '@vue/runtime-core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Readonly<SlotManager> {\n const scope = effectScope();\n\n return scope.run(() => {\n const slots = shallowReactive<Map<string, AdheseSlot>>(new Map<string, AdheseSlot>());\n\n watchEffect(() => {\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.name.value);\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n slots.set(slot.name.value, slot);\n\n watch(slot.name, (newName, previousName) => {\n slots.set(newName, slot);\n slots.delete(previousName);\n });\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n slots.set(slot.name.value, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n scope.stop();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n })!;\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { debounce } from 'remeda';\nimport { logger } from '@core';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, {\n waitMs: 50,\n });\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange.call);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange.call);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","import { createEventManager, uniqueId } from '@utils';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): Map<string, string | ReadonlyArray<string>> {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n","export function createHook<T extends Function>(\n {\n onRun,\n onAdd,\n onDispose,\n }: {\n onRun?(callbacks: Set<T>): void;\n onAdd?(callbacks: Set<T>): void;\n onDispose?(callbacks: Set<T>): void;\n },\n): [\n run: () => void,\n add: (callback: T) => void,\n dispose: () => void,\n ] {\n const callbacks = new Set<T>();\n\n function run(): void {\n for (const callback of callbacks)\n callback();\n\n onRun?.(callbacks);\n }\n\n function add(callback: T): void {\n callbacks.add(callback);\n\n onAdd?.(callbacks);\n }\n\n function dispose(): void {\n onDispose?.(callbacks);\n\n callbacks.clear();\n }\n\n return [run, add, dispose];\n}\n","import { logger } from '@core';\nimport { createHook } from './createHook';\n\nlet resolveOnInitPromise = (): void => {};\nlet isInit = false;\nconst waitOnInit = new Promise<void>((resolve) => {\n resolveOnInitPromise = resolve;\n});\n\nconst [runOnInit, onInit, disposeOnInit] = createHook({\n onRun(callbacks) {\n isInit = true;\n\n resolveOnInitPromise();\n\n logger.debug('Initialization completed');\n\n callbacks.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n});\n\nexport {\n onInit,\n runOnInit,\n waitOnInit,\n disposeOnInit,\n};\n","import { logger } from '@core';\nimport { createHook } from './createHook';\n\nlet resolveOnDisposePromise = (): void => {};\nlet isDisposed = false;\n\nconst waitOnDispose = new Promise<void>((resolve) => {\n resolveOnDisposePromise = resolve;\n});\n\nconst [runOnDispose, onDispose, disposeOnDispose] = createHook({\n onRun(callbacks) {\n isDisposed = true;\n\n resolveOnDisposePromise();\n\n logger.debug('Disposal completed');\n\n callbacks.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n});\n\nexport {\n onDispose,\n runOnDispose,\n waitOnDispose,\n disposeOnDispose,\n};\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\nimport { effectScope, reactive, watch } from '@vue/runtime-core';\nimport { createSafeFrame } from '@safeframe';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\nimport { disposeOnInit, onInit, runOnInit } from './hooks/onInit';\nimport { disposeOnDispose, runOnDispose } from './hooks/onDispose';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport function createAdhese(options: AdheseOptions): Readonly<Adhese> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n safeFrame: false,\n eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }) as AdheseContext;\n\n context.events = createEventManager();\n\n context.safeFrame = options.safeFrame\n ? createSafeFrame({\n renderFile: `${mergedOptions.poolHost}/sf/r.html`,\n context,\n })\n : undefined;\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n\n watch(\n context.parameters,\n onParametersChange,\n {\n deep: true,\n immediate: true,\n },\n );\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n async function addSlot(slotOptions: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n if (!slotManager)\n throw new Error('Slot manager not initialized');\n\n const slot = slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n slot.ad.value = await requestAd({\n slot,\n context,\n });\n }\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots() ?? []).filter(slot => !slot.lazyLoading);\n\n if (domSlots.length <= 0)\n return [];\n\n const ads = await requestAds({\n slots: domSlots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n slots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n logger.info('Adhese instance disposed');\n\n runOnDispose();\n\n disposeOnInit();\n disposeOnDispose();\n\n scope.stop();\n }\n for (const plugin of mergedOptions.plugins)\n plugin(context);\n\n onInit(async () => {\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n context.events?.debugChange.dispatch(true);\n\n if (!scope.active)\n dispose();\n });\n\n runOnInit();\n\n return {\n ...mergedOptions,\n ...slotManager,\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n context,\n } satisfies Adhese;\n })!;\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import { type Ad, type AdheseContext, logger } from '@core';\nimport { type ComputedRef, type Ref, computed, ref, watch } from '@vue/runtime-core';\nimport { round } from 'remeda';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<Ad | null>;\n name: ComputedRef<string>;\n element: ComputedRef<HTMLElement | null>;\n },\n): [\n ComputedRef,\n IntersectionObserver['disconnect'],\n ] {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = computed(() => Boolean(trackingPixel.value));\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad.value?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(ad.value.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${name.value}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isTracked, (): void => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n }];\n}\n","import { type Ref, ref, watch } from '@vue/runtime-core';\nimport { type Ad, type AdheseSlotOptions, logger } from '@core';\n\nexport function useRenderIntersectionObserver({ ad, options, element, render }: {\n ad: Ref<Ad | null>;\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n render(adToRender?: Ad): Promise<HTMLElement>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport.value) {\n (async (): Promise<void> => {\n if (!ad.value && options.lazyLoading)\n await render();\n\n await render(ad.value ?? undefined);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import { type Ad, requestAd as extRequestAd, logger } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { type Ref, computed, effectScope, reactive, ref, watch } from '@vue/runtime-core';\nimport { isDeepEqual } from 'remeda';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport { onInit, waitOnInit } from '../../hooks/onInit';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport function createSlot(options: AdheseSlotOptions): Readonly<AdheseSlot> {\n const scope = effectScope();\n\n return scope.run(() => {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format !== 'string') {\n queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n }\n\n const format = ref(queryDetector ? queryDetector.getQuery() : options.format as string);\n function onQueryChange(newFormat: string): void {\n format.value = newFormat;\n }\n\n const ad = ref<Ad | null>(null);\n const originalAd = ref(ad.value);\n\n const name = computed(() => generateName(context.location, format.value, slot));\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n options.onNameChange?.(newName, oldName);\n\n const newAd = await requestAd();\n\n cleanElement();\n\n ad.value = newAd;\n originalAd.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element.value?.querySelector('iframe') ?? null;\n\n return element.value?.innerHTML ? (element.value.firstElementChild as HTMLElement) : null;\n }\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n ad,\n options,\n element,\n render,\n });\n\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if (!newAd || (oldAd && isDeepEqual(newAd, oldAd)))\n return;\n\n if (newIsInViewport || context.options.eagerRendering)\n await render(newAd);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n });\n\n const [\n isViewabilityTracked,\n disposeViewabilityObserver,\n ] = useViewabilityObserver({\n context,\n ad,\n name,\n element,\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = computed(() => Boolean(impressionTrackingPixelElement.value));\n\n async function requestAd(): Promise<Ad> {\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n originalAd.value = response;\n\n return response;\n }\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n await waitOnInit;\n\n const renderAd = adToRender ?? ad.value ?? await requestAd();\n\n if (originalAd.value) {\n // eslint-disable-next-line require-atomic-updates\n ad.value = options.onBeforeRender?.(adToRender ?? originalAd.value) ?? renderAd;\n }\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (context.safeFrame && ad.value && renderMode === 'iframe') {\n const position = context.safeFrame.addPosition(ad.value, element.value);\n\n await context.safeFrame.render(position);\n }\n else {\n renderFunctions[renderMode](renderAd, element.value);\n }\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n options.onRender?.(element.value);\n\n disposeRenderIntersectionObserver();\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n ad.value = null;\n\n disposeRenderIntersectionObserver();\n disposeViewabilityObserver();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n\n scope.stop();\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n render,\n getElement,\n dispose,\n };\n })!;\n}\n\nfunction useDomLoaded(): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n","import {\n NEVER,\n type TypeOf,\n ZodIssueCode,\n type ZodType,\n coerce,\n lazy,\n literal,\n number,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\nexport const cssValueLike\n = union([coerce.string(), literal(''), number()]).transform<string | undefined>((value) => {\n if (value === '' || value === 0 || value === '0')\n return undefined;\n\n if (numberLike.parse(value))\n return `${numberLike.parse(value)}px`;\n\n return String(value);\n });\n\nexport const isJson = string().transform((value, { addIssue }) => {\n try {\n return JSON.parse(value.replaceAll('\\'', '\"')) as Record<string, unknown> | ReadonlyArray<unknown>;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid JSON: ${(error as Error).message}`,\n });\n\n return NEVER;\n }\n});\n\nexport const isHtmlString = string().transform((value, { addIssue }) => {\n const htmlParser = new DOMParser();\n\n try {\n const html = htmlParser.parseFromString(value, 'text/html');\n\n if (html.body?.children.length === 0)\n throw new Error('Invalid HTML');\n\n return value;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: (error as Error).message,\n });\n\n return NEVER;\n }\n});\n\nexport const isJsonOrHtmlString = union([isJson, isHtmlString]);\n\nexport const isJsonOrHtmlOptionalString = union([coerce.string(), isJsonOrHtmlString]).transform((value) => {\n if (value === '')\n return undefined;\n\n return value;\n}).optional();\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { type Ad, logger } from '@core';\nimport { adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { type AdRequestOptions, logger } from '@core';\nimport { toValue } from '@vue/runtime-core';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context: { options: { host }, parameters },\n ...options\n}: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: parameters && parseParameters(parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }).map(([key, value]): [string, T] => {\n if (typeof value === 'string')\n return [key, filterSpecialChars(value) as T];\n\n return [key, value.map(filterSpecialChars) as unknown as T];\n }));\n}\n\nfunction filterSpecialChars(value: string): string {\n const specialRegex = /[^\\p{L}\\p{N}_]/gu;\n\n return value.replaceAll(specialRegex, '_');\n}\n","import { type AdheseContext, logger } from '@core';\nimport type { MaybeRef } from '@vue/runtime-core';\nimport { type Ad, parseResponse } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<{\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n }>;\n context: AdheseContext;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds(options: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n const { context } = options;\n\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews] = await Promise.all([context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(context.options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult: ReadonlyArray<Ad> = [\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ];\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: AdRequestOptions['slots'][number];\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["effectScope","shallowReactive","watchEffect","onDispose","_a","watch","findDomSlots","extFindDomSlots","debounce","reactive","ref","computed","round","requestAd","isDeepEqual","extRequestAd","union","coerce","literal","number","string","ZodIssueCode","NEVER","object","unknown","lazy","toValue"],"mappings":"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"}
|