@adhese/sdk 0.1.5 → 0.2.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 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 _a;
373
+ var _a2;
382
374
  context.location = newLocation;
383
- (_a = context.events) == null ? void 0 : _a.locationChange.dispatch(newLocation);
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 _a;
389
+ var _a2;
396
390
  if (context.parameters)
397
- (_a = context.events) == null ? void 0 : _a.parametersChange.dispatch(context.parameters);
391
+ (_a2 = context.events) == null ? void 0 : _a2.parametersChange.dispatch(context.parameters);
398
392
  }
399
393
  async function onQueryChange() {
400
- var _a, _b;
394
+ var _a2, _b;
401
395
  const query = queryDetector.getQuery();
402
- (_a = context.parameters) == null ? void 0 : _a.set("dt", query);
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 _a, _b;
411
- (_a = context.parameters) == null ? void 0 : _a.set("tl", newConsent ? "all" : "none");
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 _a;
451
- return (_a = slotManager.get(ad.slotName)) == null ? void 0 : _a.setAd(ad);
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 _a;
483
- return (_a = slotManager.get(ad.slotName)) == null ? void 0 : _a.setAd(ad);
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 _a, _b;
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
- (_a = context.parameters) == null ? void 0 : _a.set("xt", data.tcString);
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 _a, _b, _c;
497
+ var _a2, _b, _c;
501
498
  queryDetector.dispose();
502
499
  slotManager.dispose();
503
500
  queryDetector.dispose();
504
501
  disposeOnTcfConsentChange();
505
- (_a = context.parameters) == null ? void 0 : _a.dispose();
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) {
@@ -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 _a;
371
+ var _a2;
380
372
  context.location = newLocation;
381
- (_a = context.events) == null ? void 0 : _a.locationChange.dispatch(newLocation);
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 _a;
387
+ var _a2;
394
388
  if (context.parameters)
395
- (_a = context.events) == null ? void 0 : _a.parametersChange.dispatch(context.parameters);
389
+ (_a2 = context.events) == null ? void 0 : _a2.parametersChange.dispatch(context.parameters);
396
390
  }
397
391
  async function onQueryChange() {
398
- var _a, _b;
392
+ var _a2, _b;
399
393
  const query = queryDetector.getQuery();
400
- (_a = context.parameters) == null ? void 0 : _a.set("dt", query);
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 _a, _b;
409
- (_a = context.parameters) == null ? void 0 : _a.set("tl", newConsent ? "all" : "none");
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 _a;
449
- return (_a = slotManager.get(ad.slotName)) == null ? void 0 : _a.setAd(ad);
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 _a;
481
- return (_a = slotManager.get(ad.slotName)) == null ? void 0 : _a.setAd(ad);
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 _a, _b;
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
- (_a = context.parameters) == null ? void 0 : _a.set("xt", data.tcString);
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 _a, _b, _c;
495
+ var _a2, _b, _c;
499
496
  queryDetector.dispose();
500
497
  slotManager.dispose();
501
498
  queryDetector.dispose();
502
499
  disposeOnTcfConsentChange();
503
- (_a = context.parameters) == null ? void 0 : _a.dispose();
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) {