@adhese/sdk 0.1.5 → 0.3.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/cjs/index.js +28 -30
- package/dist/cjs/index.js.map +1 -1
- package/dist/es/index.js +26 -28
- package/dist/es/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/package.json +2 -13
- package/dist/cjs/devtools.js +0 -1786
- package/dist/cjs/devtools.js.map +0 -1
- package/dist/es/devtools.js +0 -1766
- package/dist/es/devtools.js.map +0 -1
- package/dist/style.css +0 -47
package/dist/cjs/index.js
CHANGED
|
@@ -6,6 +6,7 @@ var __publicField = (obj, key, value) => {
|
|
|
6
6
|
return value;
|
|
7
7
|
};
|
|
8
8
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
9
|
+
const sdkDevtools = require("@adhese/sdk-devtools");
|
|
9
10
|
const lodashEs = require("lodash-es");
|
|
10
11
|
const zod = require("zod");
|
|
11
12
|
async function waitForDomLoad() {
|
|
@@ -337,17 +338,8 @@ class MapWithEvents extends Map {
|
|
|
337
338
|
super.clear();
|
|
338
339
|
}
|
|
339
340
|
}
|
|
340
|
-
async function createDevtools(context) {
|
|
341
|
-
const devtools = await Promise.resolve().then(() => require("./devtools.js"));
|
|
342
|
-
const wrapperElement = document.createElement("div");
|
|
343
|
-
document.body.appendChild(wrapperElement);
|
|
344
|
-
const unmount = devtools.createAdheseDevtools(wrapperElement, context);
|
|
345
|
-
return () => {
|
|
346
|
-
unmount();
|
|
347
|
-
wrapperElement.outerHTML = "";
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
341
|
async function createAdhese(options) {
|
|
342
|
+
var _a;
|
|
351
343
|
const mergedOptions = {
|
|
352
344
|
host: `https://ads-${options.account}.adhese.com`,
|
|
353
345
|
poolHost: `https://pool-${options.account}.adhese.com`,
|
|
@@ -378,9 +370,9 @@ async function createAdhese(options) {
|
|
|
378
370
|
return context.location;
|
|
379
371
|
}
|
|
380
372
|
function setLocation(newLocation) {
|
|
381
|
-
var
|
|
373
|
+
var _a2;
|
|
382
374
|
context.location = newLocation;
|
|
383
|
-
(
|
|
375
|
+
(_a2 = context.events) == null ? void 0 : _a2.locationChange.dispatch(newLocation);
|
|
384
376
|
}
|
|
385
377
|
const queryDetector = createQueryDetector({
|
|
386
378
|
onChange: onQueryChange,
|
|
@@ -389,17 +381,19 @@ async function createAdhese(options) {
|
|
|
389
381
|
context.parameters = createParameters(mergedOptions, queryDetector);
|
|
390
382
|
context.parameters.addEventListener(onParametersChange);
|
|
391
383
|
let unmountDevtools;
|
|
392
|
-
if (mergedOptions.debug || window.location.search.includes("adhese_debug=true") || isPreviewMode())
|
|
393
|
-
unmountDevtools = await createDevtools(context);
|
|
384
|
+
if (mergedOptions.debug || window.location.search.includes("adhese_debug=true") || isPreviewMode()) {
|
|
385
|
+
unmountDevtools = await sdkDevtools.createDevtools(context);
|
|
386
|
+
(_a = context.events) == null ? void 0 : _a.debugChange.dispatch(true);
|
|
387
|
+
}
|
|
394
388
|
function onParametersChange() {
|
|
395
|
-
var
|
|
389
|
+
var _a2;
|
|
396
390
|
if (context.parameters)
|
|
397
|
-
(
|
|
391
|
+
(_a2 = context.events) == null ? void 0 : _a2.parametersChange.dispatch(context.parameters);
|
|
398
392
|
}
|
|
399
393
|
async function onQueryChange() {
|
|
400
|
-
var
|
|
394
|
+
var _a2, _b;
|
|
401
395
|
const query = queryDetector.getQuery();
|
|
402
|
-
(
|
|
396
|
+
(_a2 = context.parameters) == null ? void 0 : _a2.set("dt", query);
|
|
403
397
|
(_b = context.parameters) == null ? void 0 : _b.set("br", query);
|
|
404
398
|
await fetchAndRenderAllSlots();
|
|
405
399
|
}
|
|
@@ -407,8 +401,8 @@ async function createAdhese(options) {
|
|
|
407
401
|
return context.consent;
|
|
408
402
|
}
|
|
409
403
|
function setConsent(newConsent) {
|
|
410
|
-
var
|
|
411
|
-
(
|
|
404
|
+
var _a2, _b;
|
|
405
|
+
(_a2 = context.parameters) == null ? void 0 : _a2.set("tl", newConsent ? "all" : "none");
|
|
412
406
|
context.consent = newConsent;
|
|
413
407
|
(_b = context.events) == null ? void 0 : _b.consentChange.dispatch(newConsent);
|
|
414
408
|
}
|
|
@@ -447,22 +441,25 @@ async function createAdhese(options) {
|
|
|
447
441
|
context
|
|
448
442
|
});
|
|
449
443
|
await Promise.allSettled(ads.map((ad) => {
|
|
450
|
-
var
|
|
451
|
-
return (
|
|
444
|
+
var _a2;
|
|
445
|
+
return (_a2 = slotManager.get(ad.slotName)) == null ? void 0 : _a2.setAd(ad);
|
|
452
446
|
}));
|
|
453
447
|
return domSlots;
|
|
454
448
|
}
|
|
455
449
|
async function toggleDebug() {
|
|
450
|
+
var _a2, _b;
|
|
456
451
|
context.debug = !context.debug;
|
|
457
452
|
if (context.debug && !unmountDevtools) {
|
|
458
|
-
unmountDevtools = await createDevtools(context);
|
|
453
|
+
unmountDevtools = await sdkDevtools.createDevtools(context);
|
|
459
454
|
logger.setMinLogLevelThreshold("debug");
|
|
460
455
|
logger.debug("Debug mode enabled");
|
|
456
|
+
(_a2 = context.events) == null ? void 0 : _a2.debugChange.dispatch(true);
|
|
461
457
|
} else {
|
|
462
458
|
logger.debug("Debug mode disabled");
|
|
463
459
|
unmountDevtools == null ? void 0 : unmountDevtools();
|
|
464
460
|
unmountDevtools = void 0;
|
|
465
461
|
logger.setMinLogLevelThreshold("info");
|
|
462
|
+
(_b = context.events) == null ? void 0 : _b.debugChange.dispatch(false);
|
|
466
463
|
}
|
|
467
464
|
return context.debug;
|
|
468
465
|
}
|
|
@@ -479,30 +476,30 @@ async function createAdhese(options) {
|
|
|
479
476
|
context
|
|
480
477
|
});
|
|
481
478
|
await Promise.allSettled(ads.map((ad) => {
|
|
482
|
-
var
|
|
483
|
-
return (
|
|
479
|
+
var _a2;
|
|
480
|
+
return (_a2 = slotManager.get(ad.slotName)) == null ? void 0 : _a2.setAd(ad);
|
|
484
481
|
}));
|
|
485
482
|
}
|
|
486
483
|
const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {
|
|
487
|
-
var
|
|
484
|
+
var _a2, _b;
|
|
488
485
|
if (!data.tcString)
|
|
489
486
|
return;
|
|
490
487
|
logger.debug("TCF v2 consent data received", {
|
|
491
488
|
data
|
|
492
489
|
});
|
|
493
|
-
(
|
|
490
|
+
(_a2 = context.parameters) == null ? void 0 : _a2.set("xt", data.tcString);
|
|
494
491
|
(_b = context.parameters) == null ? void 0 : _b.delete("tl");
|
|
495
492
|
await fetchAndRenderAllSlots();
|
|
496
493
|
});
|
|
497
494
|
if (slotManager.getAll().length > 0)
|
|
498
495
|
await fetchAndRenderAllSlots().catch(logger.error);
|
|
499
496
|
function dispose() {
|
|
500
|
-
var
|
|
497
|
+
var _a2, _b, _c;
|
|
501
498
|
queryDetector.dispose();
|
|
502
499
|
slotManager.dispose();
|
|
503
500
|
queryDetector.dispose();
|
|
504
501
|
disposeOnTcfConsentChange();
|
|
505
|
-
(
|
|
502
|
+
(_a2 = context.parameters) == null ? void 0 : _a2.dispose();
|
|
506
503
|
(_b = context.parameters) == null ? void 0 : _b.clear();
|
|
507
504
|
logger.resetLogs();
|
|
508
505
|
(_c = context.events) == null ? void 0 : _c.dispose();
|
|
@@ -523,7 +520,8 @@ async function createAdhese(options) {
|
|
|
523
520
|
addSlot,
|
|
524
521
|
findDomSlots: findDomSlots2,
|
|
525
522
|
dispose,
|
|
526
|
-
toggleDebug
|
|
523
|
+
toggleDebug,
|
|
524
|
+
context
|
|
527
525
|
};
|
|
528
526
|
}
|
|
529
527
|
function addTrackingPixel(url) {
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../../utils/src/eventManager/eventManager.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/main.ts","../../../core/src/impressionTracking/impressionTracking.ts","../../../core/src/slot/createSlot/createSlot.utils.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 AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@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 (await Promise.all(Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter(element => Boolean(element.dataset.format))\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.getName() === slot.getName()));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@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'>): Promise<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 async function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Promise<Readonly<SlotManager>> {\n const slots = new Map<string, AdheseSlot>();\n\n await Promise.allSettled(initialSlots.map(async slot => add({\n ...slot,\n lazyLoading: false,\n })));\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n async function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Promise<Readonly<AdheseSlot>> {\n const slot = await createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n onNameChange,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.getName());\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n slots.set(slot.getName(), slot);\n\n function onNameChange(newName: string, previousName: string): void {\n slots.set(newName, slot);\n slots.delete(previousName);\n\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\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.getName(), slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\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 context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\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-es';\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-es';\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-es';\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): MapWithEvents<string, string | ReadonlyArray<string>> {\n const parameters = new MapWithEvents<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\nexport class MapWithEvents<T, U> extends Map<T, U> {\n private readonly listeners = new Set<() => void>();\n\n public addEventListener(listener: () => void): void {\n this.listeners.add(listener);\n }\n\n public removeEventListener(listener: () => void): void {\n this.listeners.delete(listener);\n }\n\n public set(key: T, value: U): this {\n const set = super.set(key, value);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return set;\n }\n\n public clear(): void {\n super.clear();\n\n this.listeners.forEach((listener) => {\n listener();\n });\n }\n\n public delete(key: T): boolean {\n const deleted = super.delete(key);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return deleted;\n }\n\n /**\n * Remove all listeners and clear the map.\n */\n public dispose(): void {\n this.listeners.clear();\n super.clear();\n }\n}\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\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';\n\nasync function createDevtools(context: AdheseContext): Promise<() => void> {\n const devtools = await import('@devtools');\n\n const wrapperElement = document.createElement('div');\n document.body.appendChild(wrapperElement);\n\n const unmount = devtools.createAdheseDevtools(wrapperElement, context);\n\n return () => {\n unmount();\n wrapperElement.outerHTML = '';\n };\n}\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 async function createAdhese(options: AdheseOptions): Promise<Readonly<Adhese>> {\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 eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = new Proxy<AdheseContext>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }, {});\n\n context.events = createEventManager();\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 context.parameters.addEventListener(onParametersChange);\n\n let unmountDevtools: (() => void) | undefined;\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n unmountDevtools = await createDevtools(context);\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 = await createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\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 const slot = await slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n const ad = await requestAd({\n slot,\n host: mergedOptions.host,\n parameters: context.parameters,\n account: mergedOptions.account,\n context,\n });\n\n await slot.setAd(ad);\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 const ads = await requestAds({\n host: mergedOptions.host,\n slots: domSlots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n\n return domSlots;\n }\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 }\n else {\n logger.debug('Debug mode disabled');\n unmountDevtools?.();\n unmountDevtools = undefined;\n logger.setMinLogLevelThreshold('info');\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 host: mergedOptions.host,\n slots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\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 if (slotManager.getAll().length > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.dispose();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n unmountDevtools?.();\n logger.info('Adhese instance disposed');\n }\n\n if (mergedOptions.findDomSlotsOnLoad)\n await slotManager.findDomSlots();\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 };\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 } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\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 ${ad.tag}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : '100%';\n iframe.style.height = ad.height ? `${ad.height}px` : '100%';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.style.width = ad.width ? `${ad.width}px` : '100%';\n element.style.height = ad.height ? `${ad.height}px` : '100%';\n\n element.innerHTML = ad.tag;\n}\n","import { type Ad, logger, requestAd } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { round } from 'lodash-es';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { renderIframe, renderInline } from './createSlot.utils';\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 async function createSlot(options: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n await waitForDomLoad();\n\n const parameters = new Map(Object.entries(options.parameters ?? {}));\n\n let format: string;\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format === 'string') {\n // eslint-disable-next-line prefer-destructuring\n format = options.format;\n }\n else {\n queryDetector = createQueryDetector({\n onChange: setFormat,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n\n format = queryDetector.getQuery();\n }\n\n async function setFormat(newFormat: string): Promise<void> {\n const oldName = getName();\n\n format = newFormat;\n options.onNameChange?.(getName(), oldName);\n\n const newAd = await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n cleanElement();\n\n await setAd(newAd);\n }\n\n function getFormat(): string {\n return format;\n }\n\n let element: HTMLElement | null = typeof containingElement === 'string' || !containingElement\n ? document.querySelector<HTMLElement>(`.adunit[data-format=\"${format}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`)\n : containingElement;\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element?.querySelector('iframe') ?? null;\n\n return element?.innerHTML ? (element.firstElementChild as HTMLElement) : null;\n }\n\n let impressionTrackingPixelElement: HTMLImageElement | null = null;\n let viewabilityTrackingPixelElement: HTMLImageElement | null = null;\n\n let isInViewport = false;\n\n let ad: Ad | null = null;\n function getAd(): Ad | null {\n return ad;\n }\n\n async function setAd(newAd: Ad): Promise<void> {\n ad = newAd;\n\n if (isInViewport || context.options.eagerRendering)\n await render(ad);\n\n if (element) {\n element.style.width = `${ad.width}px`;\n element.style.height = `${ad.height}px`;\n }\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n }\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport) {\n (async (): Promise<void> => {\n if (!ad && options.lazyLoading)\n await render();\n\n else if (ad)\n await render(ad);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\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 viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !viewabilityTrackingPixelElement && 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?.viewableImpressionCounter) {\n viewabilityTrackingPixelElement = addTrackingPixel(ad.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${getName()}`);\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 if (element && context.options.viewabilityTracking)\n viewabilityObserver.observe(element);\n\n if (element)\n renderIntersectionObserver.observe(element);\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n\n // eslint-disable-next-line require-atomic-updates\n ad = adToRender ?? ad ?? await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n if (!element) {\n const error = `Could not create slot for format ${format}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.style.position = 'relative';\n\n renderFunctions[renderMode](ad, element);\n\n if (ad?.impressionCounter && !impressionTrackingPixelElement) {\n impressionTrackingPixelElement = addTrackingPixel(ad.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${getName()}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n renderIntersectionObserver.disconnect();\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n\n return element;\n }\n\n function cleanElement(): void {\n if (!element)\n return;\n\n element.innerHTML = '';\n element.style.position = '';\n element.style.width = '';\n element.style.height = '';\n }\n\n function getName(): string {\n return `${context.location}${slot ? `${slot}` : ''}-${format}`;\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement?.remove();\n viewabilityTrackingPixelElement?.remove();\n\n element = null;\n ad = null;\n\n renderIntersectionObserver.disconnect();\n viewabilityObserver.disconnect();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n }\n\n function isViewabilityTracked(): boolean {\n return Boolean(viewabilityTrackingPixelElement);\n }\n\n function isImpressionTracked(): boolean {\n return Boolean(impressionTrackingPixelElement);\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n setFormat,\n getFormat,\n render,\n getElement,\n getName,\n getAd,\n setAd,\n isViewabilityTracked,\n isImpressionTracked,\n dispose,\n };\n}\n","import { type TypeOf, type ZodType, coerce, lazy, literal, object, string, union, unknown } 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});\nconst baseAdResponseScheme = object({\n adDuration: numberLike.optional(),\n adDuration2nd: numberLike.optional(),\n adDuration3rd: numberLike.optional(),\n adDuration4th: numberLike.optional(),\n adDuration5th: numberLike.optional(),\n adDuration6th: 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: string().optional(),\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n dm: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n extraField1: string().optional(),\n extraField2: string().optional(),\n height: numberLike.optional(),\n height3rd: numberLike.optional(),\n height4th: numberLike.optional(),\n height5th: numberLike.optional(),\n height6th: numberLike.optional(),\n heightLarge: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: string().optional(),\n originData: unknown().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n swfSrc2nd: string().optional(),\n swfSrc3rd: string().optional(),\n swfSrc4th: string().optional(),\n swfSrc5th: string().optional(),\n swfSrc6th: string().optional(),\n tag: string(),\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 width3rd: numberLike.optional(),\n width4th: numberLike.optional(),\n width5th: numberLike.optional(),\n width6th: numberLike.optional(),\n widthLarge: numberLike.optional(),\n});\nexport type AdResponse = TypeOf<typeof baseAdResponseScheme> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n};\nconst adResponseSchema: ZodType<AdResponse> = baseAdResponseScheme.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\nexport type Ad = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<Ad> | string;\n};\nexport const adSchema: ZodType<Ad> = 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","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());\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';\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 host,\n ...options\n}: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: slot.getName(),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: options.parameters && parseParameters(options.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(options: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n return fetch(new URL(`${options.host}/json/sl${options.slots.map(slot => slot.getName()).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","import type { UrlString } from '@utils';\nimport { type Adhese, type AdheseSlot, logger } from '@core';\nimport { type Ad, adSchema } 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<Pick<AdheseSlot, 'getName' | 'parameters'>>;\n /**\n * Host that you want to fetch the ads from\n */\n host: UrlString;\n /**\n * The Adhese account name.\n */\n account: string;\n /**\n * Request method to use for the requestAds\n *\n * @default 'POST'\n */\n method?: 'GET' | 'POST' | 'get' | 'post';\n /**\n * The parameters that are used for all ads.\n */\n parameters?: Map<string, ReadonlyArray<string> | string>;\n context: Partial<Adhese>;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds({\n method = 'POST',\n context,\n ...options\n}: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n method,\n });\n\n const [response, previews] = await Promise.all([method?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(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 = adSchema.array().parse((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: Pick<AdheseSlot, 'getName' | 'parameters'>;\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["_a","_b","findDomSlots","extFindDomSlots","debounce","uniqueId","random","round","union","coerce","literal","object","string","unknown","lazy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../../utils/src/eventManager/eventManager.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/main.ts","../../../core/src/impressionTracking/impressionTracking.ts","../../../core/src/slot/createSlot/createSlot.utils.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 AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@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 (await Promise.all(Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter(element => Boolean(element.dataset.format))\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.getName() === slot.getName()));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@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'>): Promise<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 async function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Promise<Readonly<SlotManager>> {\n const slots = new Map<string, AdheseSlot>();\n\n await Promise.allSettled(initialSlots.map(async slot => add({\n ...slot,\n lazyLoading: false,\n })));\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n async function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Promise<Readonly<AdheseSlot>> {\n const slot = await createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n onNameChange,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.getName());\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n slots.set(slot.getName(), slot);\n\n function onNameChange(newName: string, previousName: string): void {\n slots.set(newName, slot);\n slots.delete(previousName);\n\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\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.getName(), slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\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 context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\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-es';\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-es';\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-es';\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): MapWithEvents<string, string | ReadonlyArray<string>> {\n const parameters = new MapWithEvents<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\nexport class MapWithEvents<T, U> extends Map<T, U> {\n private readonly listeners = new Set<() => void>();\n\n public addEventListener(listener: () => void): void {\n this.listeners.add(listener);\n }\n\n public removeEventListener(listener: () => void): void {\n this.listeners.delete(listener);\n }\n\n public set(key: T, value: U): this {\n const set = super.set(key, value);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return set;\n }\n\n public clear(): void {\n super.clear();\n\n this.listeners.forEach((listener) => {\n listener();\n });\n }\n\n public delete(key: T): boolean {\n const deleted = super.delete(key);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return deleted;\n }\n\n /**\n * Remove all listeners and clear the map.\n */\n public dispose(): void {\n this.listeners.clear();\n super.clear();\n }\n}\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\nimport { createDevtools } from '@adhese/sdk-devtools';\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';\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 async function createAdhese(options: AdheseOptions): Promise<Readonly<Adhese>> {\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 eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = new Proxy<AdheseContext>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }, {});\n\n context.events = createEventManager();\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 context.parameters.addEventListener(onParametersChange);\n\n let unmountDevtools: (() => void) | undefined;\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode()) {\n unmountDevtools = await createDevtools(context);\n context.events?.debugChange.dispatch(true);\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 = await createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\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 const slot = await slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n const ad = await requestAd({\n slot,\n host: mergedOptions.host,\n parameters: context.parameters,\n account: mergedOptions.account,\n context,\n });\n\n await slot.setAd(ad);\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 const ads = await requestAds({\n host: mergedOptions.host,\n slots: domSlots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n\n return domSlots;\n }\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 host: mergedOptions.host,\n slots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\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 if (slotManager.getAll().length > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.dispose();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n unmountDevtools?.();\n logger.info('Adhese instance disposed');\n }\n\n if (mergedOptions.findDomSlotsOnLoad)\n await slotManager.findDomSlots();\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 };\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 } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\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 ${ad.tag}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : '100%';\n iframe.style.height = ad.height ? `${ad.height}px` : '100%';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.style.width = ad.width ? `${ad.width}px` : '100%';\n element.style.height = ad.height ? `${ad.height}px` : '100%';\n\n element.innerHTML = ad.tag;\n}\n","import { type Ad, logger, requestAd } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { round } from 'lodash-es';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { renderIframe, renderInline } from './createSlot.utils';\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 async function createSlot(options: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n await waitForDomLoad();\n\n const parameters = new Map(Object.entries(options.parameters ?? {}));\n\n let format: string;\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format === 'string') {\n // eslint-disable-next-line prefer-destructuring\n format = options.format;\n }\n else {\n queryDetector = createQueryDetector({\n onChange: setFormat,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n\n format = queryDetector.getQuery();\n }\n\n async function setFormat(newFormat: string): Promise<void> {\n const oldName = getName();\n\n format = newFormat;\n options.onNameChange?.(getName(), oldName);\n\n const newAd = await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n cleanElement();\n\n await setAd(newAd);\n }\n\n function getFormat(): string {\n return format;\n }\n\n let element: HTMLElement | null = typeof containingElement === 'string' || !containingElement\n ? document.querySelector<HTMLElement>(`.adunit[data-format=\"${format}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`)\n : containingElement;\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element?.querySelector('iframe') ?? null;\n\n return element?.innerHTML ? (element.firstElementChild as HTMLElement) : null;\n }\n\n let impressionTrackingPixelElement: HTMLImageElement | null = null;\n let viewabilityTrackingPixelElement: HTMLImageElement | null = null;\n\n let isInViewport = false;\n\n let ad: Ad | null = null;\n function getAd(): Ad | null {\n return ad;\n }\n\n async function setAd(newAd: Ad): Promise<void> {\n ad = newAd;\n\n if (isInViewport || context.options.eagerRendering)\n await render(ad);\n\n if (element) {\n element.style.width = `${ad.width}px`;\n element.style.height = `${ad.height}px`;\n }\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n }\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport) {\n (async (): Promise<void> => {\n if (!ad && options.lazyLoading)\n await render();\n\n else if (ad)\n await render(ad);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\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 viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !viewabilityTrackingPixelElement && 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?.viewableImpressionCounter) {\n viewabilityTrackingPixelElement = addTrackingPixel(ad.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${getName()}`);\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 if (element && context.options.viewabilityTracking)\n viewabilityObserver.observe(element);\n\n if (element)\n renderIntersectionObserver.observe(element);\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n\n // eslint-disable-next-line require-atomic-updates\n ad = adToRender ?? ad ?? await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n if (!element) {\n const error = `Could not create slot for format ${format}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.style.position = 'relative';\n\n renderFunctions[renderMode](ad, element);\n\n if (ad?.impressionCounter && !impressionTrackingPixelElement) {\n impressionTrackingPixelElement = addTrackingPixel(ad.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${getName()}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n renderIntersectionObserver.disconnect();\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n\n return element;\n }\n\n function cleanElement(): void {\n if (!element)\n return;\n\n element.innerHTML = '';\n element.style.position = '';\n element.style.width = '';\n element.style.height = '';\n }\n\n function getName(): string {\n return `${context.location}${slot ? `${slot}` : ''}-${format}`;\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement?.remove();\n viewabilityTrackingPixelElement?.remove();\n\n element = null;\n ad = null;\n\n renderIntersectionObserver.disconnect();\n viewabilityObserver.disconnect();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n }\n\n function isViewabilityTracked(): boolean {\n return Boolean(viewabilityTrackingPixelElement);\n }\n\n function isImpressionTracked(): boolean {\n return Boolean(impressionTrackingPixelElement);\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n setFormat,\n getFormat,\n render,\n getElement,\n getName,\n getAd,\n setAd,\n isViewabilityTracked,\n isImpressionTracked,\n dispose,\n };\n}\n","import { type TypeOf, type ZodType, coerce, lazy, literal, object, string, union, unknown } 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});\nconst baseAdResponseScheme = object({\n adDuration: numberLike.optional(),\n adDuration2nd: numberLike.optional(),\n adDuration3rd: numberLike.optional(),\n adDuration4th: numberLike.optional(),\n adDuration5th: numberLike.optional(),\n adDuration6th: 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: string().optional(),\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n dm: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n extraField1: string().optional(),\n extraField2: string().optional(),\n height: numberLike.optional(),\n height3rd: numberLike.optional(),\n height4th: numberLike.optional(),\n height5th: numberLike.optional(),\n height6th: numberLike.optional(),\n heightLarge: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: string().optional(),\n originData: unknown().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n swfSrc2nd: string().optional(),\n swfSrc3rd: string().optional(),\n swfSrc4th: string().optional(),\n swfSrc5th: string().optional(),\n swfSrc6th: string().optional(),\n tag: string(),\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 width3rd: numberLike.optional(),\n width4th: numberLike.optional(),\n width5th: numberLike.optional(),\n width6th: numberLike.optional(),\n widthLarge: numberLike.optional(),\n});\nexport type AdResponse = TypeOf<typeof baseAdResponseScheme> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n};\nconst adResponseSchema: ZodType<AdResponse> = baseAdResponseScheme.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\nexport type Ad = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<Ad> | string;\n};\nexport const adSchema: ZodType<Ad> = 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","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());\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';\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 host,\n ...options\n}: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: slot.getName(),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: options.parameters && parseParameters(options.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(options: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n return fetch(new URL(`${options.host}/json/sl${options.slots.map(slot => slot.getName()).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","import type { UrlString } from '@utils';\nimport { type Adhese, type AdheseSlot, logger } from '@core';\nimport { type Ad, adSchema } 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<Pick<AdheseSlot, 'getName' | 'parameters'>>;\n /**\n * Host that you want to fetch the ads from\n */\n host: UrlString;\n /**\n * The Adhese account name.\n */\n account: string;\n /**\n * Request method to use for the requestAds\n *\n * @default 'POST'\n */\n method?: 'GET' | 'POST' | 'get' | 'post';\n /**\n * The parameters that are used for all ads.\n */\n parameters?: Map<string, ReadonlyArray<string> | string>;\n context: Partial<Adhese>;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds({\n method = 'POST',\n context,\n ...options\n}: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n method,\n });\n\n const [response, previews] = await Promise.all([method?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(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 = adSchema.array().parse((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: Pick<AdheseSlot, 'getName' | 'parameters'>;\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["_a","_b","findDomSlots","extFindDomSlots","debounce","uniqueId","random","createDevtools","round","union","coerce","literal","object","string","unknown","lazy"],"mappings":"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"}
|
package/dist/es/index.js
CHANGED
|
@@ -4,6 +4,7 @@ var __publicField = (obj, key, value) => {
|
|
|
4
4
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
5
|
return value;
|
|
6
6
|
};
|
|
7
|
+
import { createDevtools } from "@adhese/sdk-devtools";
|
|
7
8
|
import { debounce, uniqueId, random, round } from "lodash-es";
|
|
8
9
|
import { union, coerce, literal, object, string, unknown, lazy } from "zod";
|
|
9
10
|
async function waitForDomLoad() {
|
|
@@ -335,17 +336,8 @@ class MapWithEvents extends Map {
|
|
|
335
336
|
super.clear();
|
|
336
337
|
}
|
|
337
338
|
}
|
|
338
|
-
async function createDevtools(context) {
|
|
339
|
-
const devtools = await import("./devtools.js");
|
|
340
|
-
const wrapperElement = document.createElement("div");
|
|
341
|
-
document.body.appendChild(wrapperElement);
|
|
342
|
-
const unmount = devtools.createAdheseDevtools(wrapperElement, context);
|
|
343
|
-
return () => {
|
|
344
|
-
unmount();
|
|
345
|
-
wrapperElement.outerHTML = "";
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
339
|
async function createAdhese(options) {
|
|
340
|
+
var _a;
|
|
349
341
|
const mergedOptions = {
|
|
350
342
|
host: `https://ads-${options.account}.adhese.com`,
|
|
351
343
|
poolHost: `https://pool-${options.account}.adhese.com`,
|
|
@@ -376,9 +368,9 @@ async function createAdhese(options) {
|
|
|
376
368
|
return context.location;
|
|
377
369
|
}
|
|
378
370
|
function setLocation(newLocation) {
|
|
379
|
-
var
|
|
371
|
+
var _a2;
|
|
380
372
|
context.location = newLocation;
|
|
381
|
-
(
|
|
373
|
+
(_a2 = context.events) == null ? void 0 : _a2.locationChange.dispatch(newLocation);
|
|
382
374
|
}
|
|
383
375
|
const queryDetector = createQueryDetector({
|
|
384
376
|
onChange: onQueryChange,
|
|
@@ -387,17 +379,19 @@ async function createAdhese(options) {
|
|
|
387
379
|
context.parameters = createParameters(mergedOptions, queryDetector);
|
|
388
380
|
context.parameters.addEventListener(onParametersChange);
|
|
389
381
|
let unmountDevtools;
|
|
390
|
-
if (mergedOptions.debug || window.location.search.includes("adhese_debug=true") || isPreviewMode())
|
|
382
|
+
if (mergedOptions.debug || window.location.search.includes("adhese_debug=true") || isPreviewMode()) {
|
|
391
383
|
unmountDevtools = await createDevtools(context);
|
|
384
|
+
(_a = context.events) == null ? void 0 : _a.debugChange.dispatch(true);
|
|
385
|
+
}
|
|
392
386
|
function onParametersChange() {
|
|
393
|
-
var
|
|
387
|
+
var _a2;
|
|
394
388
|
if (context.parameters)
|
|
395
|
-
(
|
|
389
|
+
(_a2 = context.events) == null ? void 0 : _a2.parametersChange.dispatch(context.parameters);
|
|
396
390
|
}
|
|
397
391
|
async function onQueryChange() {
|
|
398
|
-
var
|
|
392
|
+
var _a2, _b;
|
|
399
393
|
const query = queryDetector.getQuery();
|
|
400
|
-
(
|
|
394
|
+
(_a2 = context.parameters) == null ? void 0 : _a2.set("dt", query);
|
|
401
395
|
(_b = context.parameters) == null ? void 0 : _b.set("br", query);
|
|
402
396
|
await fetchAndRenderAllSlots();
|
|
403
397
|
}
|
|
@@ -405,8 +399,8 @@ async function createAdhese(options) {
|
|
|
405
399
|
return context.consent;
|
|
406
400
|
}
|
|
407
401
|
function setConsent(newConsent) {
|
|
408
|
-
var
|
|
409
|
-
(
|
|
402
|
+
var _a2, _b;
|
|
403
|
+
(_a2 = context.parameters) == null ? void 0 : _a2.set("tl", newConsent ? "all" : "none");
|
|
410
404
|
context.consent = newConsent;
|
|
411
405
|
(_b = context.events) == null ? void 0 : _b.consentChange.dispatch(newConsent);
|
|
412
406
|
}
|
|
@@ -445,22 +439,25 @@ async function createAdhese(options) {
|
|
|
445
439
|
context
|
|
446
440
|
});
|
|
447
441
|
await Promise.allSettled(ads.map((ad) => {
|
|
448
|
-
var
|
|
449
|
-
return (
|
|
442
|
+
var _a2;
|
|
443
|
+
return (_a2 = slotManager.get(ad.slotName)) == null ? void 0 : _a2.setAd(ad);
|
|
450
444
|
}));
|
|
451
445
|
return domSlots;
|
|
452
446
|
}
|
|
453
447
|
async function toggleDebug() {
|
|
448
|
+
var _a2, _b;
|
|
454
449
|
context.debug = !context.debug;
|
|
455
450
|
if (context.debug && !unmountDevtools) {
|
|
456
451
|
unmountDevtools = await createDevtools(context);
|
|
457
452
|
logger.setMinLogLevelThreshold("debug");
|
|
458
453
|
logger.debug("Debug mode enabled");
|
|
454
|
+
(_a2 = context.events) == null ? void 0 : _a2.debugChange.dispatch(true);
|
|
459
455
|
} else {
|
|
460
456
|
logger.debug("Debug mode disabled");
|
|
461
457
|
unmountDevtools == null ? void 0 : unmountDevtools();
|
|
462
458
|
unmountDevtools = void 0;
|
|
463
459
|
logger.setMinLogLevelThreshold("info");
|
|
460
|
+
(_b = context.events) == null ? void 0 : _b.debugChange.dispatch(false);
|
|
464
461
|
}
|
|
465
462
|
return context.debug;
|
|
466
463
|
}
|
|
@@ -477,30 +474,30 @@ async function createAdhese(options) {
|
|
|
477
474
|
context
|
|
478
475
|
});
|
|
479
476
|
await Promise.allSettled(ads.map((ad) => {
|
|
480
|
-
var
|
|
481
|
-
return (
|
|
477
|
+
var _a2;
|
|
478
|
+
return (_a2 = slotManager.get(ad.slotName)) == null ? void 0 : _a2.setAd(ad);
|
|
482
479
|
}));
|
|
483
480
|
}
|
|
484
481
|
const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {
|
|
485
|
-
var
|
|
482
|
+
var _a2, _b;
|
|
486
483
|
if (!data.tcString)
|
|
487
484
|
return;
|
|
488
485
|
logger.debug("TCF v2 consent data received", {
|
|
489
486
|
data
|
|
490
487
|
});
|
|
491
|
-
(
|
|
488
|
+
(_a2 = context.parameters) == null ? void 0 : _a2.set("xt", data.tcString);
|
|
492
489
|
(_b = context.parameters) == null ? void 0 : _b.delete("tl");
|
|
493
490
|
await fetchAndRenderAllSlots();
|
|
494
491
|
});
|
|
495
492
|
if (slotManager.getAll().length > 0)
|
|
496
493
|
await fetchAndRenderAllSlots().catch(logger.error);
|
|
497
494
|
function dispose() {
|
|
498
|
-
var
|
|
495
|
+
var _a2, _b, _c;
|
|
499
496
|
queryDetector.dispose();
|
|
500
497
|
slotManager.dispose();
|
|
501
498
|
queryDetector.dispose();
|
|
502
499
|
disposeOnTcfConsentChange();
|
|
503
|
-
(
|
|
500
|
+
(_a2 = context.parameters) == null ? void 0 : _a2.dispose();
|
|
504
501
|
(_b = context.parameters) == null ? void 0 : _b.clear();
|
|
505
502
|
logger.resetLogs();
|
|
506
503
|
(_c = context.events) == null ? void 0 : _c.dispose();
|
|
@@ -521,7 +518,8 @@ async function createAdhese(options) {
|
|
|
521
518
|
addSlot,
|
|
522
519
|
findDomSlots: findDomSlots2,
|
|
523
520
|
dispose,
|
|
524
|
-
toggleDebug
|
|
521
|
+
toggleDebug,
|
|
522
|
+
context
|
|
525
523
|
};
|
|
526
524
|
}
|
|
527
525
|
function addTrackingPixel(url) {
|