@adhese/sdk 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -125,7 +125,7 @@ function createSafeFrame({
125
125
  }
126
126
  const name = "@adhese/sdk";
127
127
  const type = "module";
128
- const version = "0.9.0";
128
+ const version = "0.10.0";
129
129
  const description = "Adhese SDK";
130
130
  const license = "GPL-3.0";
131
131
  const repository = {
@@ -289,6 +289,20 @@ function createSyncHook(name2, {
289
289
  };
290
290
  return [run, (callback) => add(callback, { name: name2, onAdd })];
291
291
  }
292
+ function createPassiveHook(name2, {
293
+ onRun,
294
+ onAdd
295
+ } = {}) {
296
+ hookMap.set(name2, /* @__PURE__ */ new Set());
297
+ function run(arg) {
298
+ Promise.allSettled(Array.from(hookMap.get(name2) ?? []).map((callback) => callback(arg))).catch(console.trace);
299
+ onRun == null ? void 0 : onRun(hookMap.get(name2));
300
+ }
301
+ return [run, (callback) => add(callback, { name: name2, onAdd })];
302
+ }
303
+ function isCallbackAsync(callback) {
304
+ return callback.constructor.name === "AsyncFunction";
305
+ }
292
306
  function add(callback, {
293
307
  name: name2,
294
308
  onAdd
@@ -304,9 +318,6 @@ function add(callback, {
304
318
  (_a = hookMap.get(name2)) == null ? void 0 : _a.delete(callback);
305
319
  };
306
320
  }
307
- function isCallbackAsync(callback) {
308
- return callback.constructor.name === "AsyncFunction";
309
- }
310
321
  let resolveOnInitPromise = () => {
311
322
  };
312
323
  let isInit = false;
@@ -693,6 +704,7 @@ async function requestAd({
693
704
  }
694
705
  const [runOnRender, onRender] = createAsyncHook("onRender");
695
706
  const [runOnSlotCreate, onSlotCreate] = createSyncHook("onSlotCreate");
707
+ const [runOnViewabilityChanged, onViewabilityChanged] = createPassiveHook("onViewabilityChanged");
696
708
  function useViewabilityObserver({ context, ad, name: name2, element }) {
697
709
  let timeoutId = null;
698
710
  const {
@@ -747,18 +759,11 @@ function useViewabilityObserver({ context, ad, name: name2, element }) {
747
759
  viewabilityObserver.disconnect();
748
760
  }];
749
761
  }
750
- function useRenderIntersectionObserver({ ad, options, element, render }) {
762
+ function useRenderIntersectionObserver({ options, element }) {
751
763
  var _a;
752
764
  const isInViewport = runtimeCore.ref(false);
753
765
  const renderIntersectionObserver = new IntersectionObserver((entries) => {
754
766
  isInViewport.value = entries.some((entry) => entry.isIntersecting);
755
- if (isInViewport.value) {
756
- (async () => {
757
- if (!ad.value && options.lazyLoading)
758
- await render();
759
- await render(ad.value ?? void 0);
760
- })().catch(logger.error);
761
- }
762
767
  }, {
763
768
  rootMargin: ((_a = options.lazyLoadingOptions) == null ? void 0 : _a.rootMargin) ?? "200px",
764
769
  threshold: 0
@@ -835,19 +840,24 @@ function createSlot(slotOptions) {
835
840
  return ((_b = element.value) == null ? void 0 : _b.innerHTML) ? element.value.firstElementChild : null;
836
841
  }
837
842
  const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({
838
- ad,
839
843
  options,
840
- element,
841
- render
844
+ element
842
845
  });
846
+ const isRendered = runtimeCore.ref(false);
843
847
  runtimeCore.watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {
844
848
  var _a, _b;
845
- if (!newAd || oldAd && remeda.isDeepEqual(newAd, oldAd))
849
+ if ((!newAd || oldAd && remeda.isDeepEqual(newAd, oldAd)) && isRendered.value)
846
850
  return;
847
851
  if (newIsInViewport || context.options.eagerRendering)
848
- await render(newAd);
852
+ await render(newAd ?? void 0);
849
853
  (_b = context.events) == null ? void 0 : _b.changeSlots.dispatch(Array.from(((_a = context.getAll) == null ? void 0 : _a.call(context)) ?? []));
850
854
  });
855
+ runtimeCore.watch(isInViewport, (value) => {
856
+ runOnViewabilityChanged({
857
+ name: name2.value,
858
+ isInViewport: value
859
+ });
860
+ }, { immediate: true });
851
861
  const [
852
862
  isViewabilityTracked,
853
863
  disposeViewabilityObserver
@@ -903,7 +913,7 @@ function createSlot(slotOptions) {
903
913
  });
904
914
  (_b = options.onRender) == null ? void 0 : _b.call(options, element.value);
905
915
  ad.value = renderAd;
906
- disposeRenderIntersectionObserver();
916
+ isRendered.value = true;
907
917
  return element.value;
908
918
  }
909
919
  function cleanElement() {
@@ -1132,7 +1142,8 @@ function createAdhese(options) {
1132
1142
  onRender,
1133
1143
  onRequest,
1134
1144
  onResponse,
1135
- onSlotCreate
1145
+ onSlotCreate,
1146
+ onViewabilityChanged
1136
1147
  });
1137
1148
  }
1138
1149
  context.events = createEventManager();
@@ -1166,12 +1177,16 @@ function createAdhese(options) {
1166
1177
  if (context.parameters)
1167
1178
  (_a = context.events) == null ? void 0 : _a.parametersChange.dispatch(context.parameters);
1168
1179
  }
1180
+ const debouncedFetchAllUnrenderedSlots = remeda.debounce(fetchAllUnrenderedSlots, {
1181
+ waitMs: 100,
1182
+ timing: "both"
1183
+ });
1169
1184
  async function onQueryChange() {
1170
1185
  var _a, _b;
1171
1186
  const query = queryDetector.getQuery();
1172
1187
  (_a = context.parameters) == null ? void 0 : _a.set("dt", query);
1173
1188
  (_b = context.parameters) == null ? void 0 : _b.set("br", query);
1174
- await fetchAndRenderAllSlots();
1189
+ await debouncedFetchAllUnrenderedSlots.call();
1175
1190
  }
1176
1191
  function getConsent() {
1177
1192
  return context.consent;
@@ -1193,9 +1208,9 @@ function createAdhese(options) {
1193
1208
  return slotManager.get(name2);
1194
1209
  }
1195
1210
  function addSlot(slotOptions) {
1196
- if (!slotManager)
1197
- throw new Error("Slot manager not initialized");
1198
- return slotManager.add(slotOptions);
1211
+ const newSlot = slotManager.add(slotOptions);
1212
+ debouncedFetchAllUnrenderedSlots.call().catch(logger.error);
1213
+ return newSlot;
1199
1214
  }
1200
1215
  async function findDomSlots2() {
1201
1216
  const domSlots = (await slotManager.findDomSlots() ?? []).filter((slot) => !slot.lazyLoading);
@@ -1226,8 +1241,8 @@ function createAdhese(options) {
1226
1241
  }
1227
1242
  return context.debug;
1228
1243
  }
1229
- async function fetchAndRenderAllSlots() {
1230
- const slots = (slotManager.getAll() ?? []).filter((slot) => !slot.lazyLoading);
1244
+ async function fetchAllUnrenderedSlots() {
1245
+ const slots = (slotManager.getAll() ?? []).filter((slot) => !slot.lazyLoading && !slot.ad.value);
1231
1246
  if (slots.length === 0)
1232
1247
  return;
1233
1248
  const ads = await requestAds({
@@ -1249,7 +1264,7 @@ function createAdhese(options) {
1249
1264
  });
1250
1265
  (_a = context.parameters) == null ? void 0 : _a.set("xt", data.tcString);
1251
1266
  (_b = context.parameters) == null ? void 0 : _b.delete("tl");
1252
- await fetchAndRenderAllSlots();
1267
+ await debouncedFetchAllUnrenderedSlots.call();
1253
1268
  });
1254
1269
  function dispose() {
1255
1270
  var _a, _b;
@@ -1268,7 +1283,7 @@ function createAdhese(options) {
1268
1283
  onInit(async () => {
1269
1284
  var _a;
1270
1285
  if ((slotManager.getAll().length ?? 0) > 0)
1271
- await fetchAndRenderAllSlots().catch(logger.error);
1286
+ await fetchAllUnrenderedSlots().catch(logger.error);
1272
1287
  if (mergedOptions.findDomSlotsOnLoad)
1273
1288
  await findDomSlots2();
1274
1289
  if (mergedOptions.debug || window.location.search.includes("adhese_debug=true") || isPreviewMode())
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../utils/src/eventManager/eventManager.ts","../../utils/src/uniqueId/uniqueId.ts","../../safeframe/src/main.ts","../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../../logger/src/createLogger/createLogger.ts","../src/logger/logger.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.schema.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onRender.ts","../src/hooks/onSlotCreate.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/createSlot.ts","../src/slot/findDomSlots/findDomSlots.ts","../src/slot/slotManager/slotManager.ts","../src/consent/tcfConsent.ts","../src/main.utils.ts","../src/hooks/onDispose.ts","../src/main.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","const savedIds = new Set<string>();\n\nexport function uniqueId(): string {\n let id: string;\n\n do\n id = Math.random().toString(36).slice(2);\n while (savedIds.has(id));\n\n savedIds.add(id);\n\n return id;\n}\n","import { uniqueId } from '@utils';\nimport type { Ad, AdheseContext } from '@adhese/sdk';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: Ad, element: HTMLElement): Position;\n render(position: Position): Promise<void>;\n dispose(): void;\n};\n\nexport type SafeFrameOptions = {\n renderFile: string;\n context: AdheseContext;\n};\n\nexport function createSafeFrame({\n renderFile,\n context,\n}: SafeFrameOptions): SafeFrame {\n const safeFrame = window.$sf;\n\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const adhesePositions = new Set<Position>();\n\n const config = new safeFrame.host.Config({\n auto: false,\n debug: context.debug,\n renderFile,\n });\n\n function addPosition(ad: Ad, element: HTMLElement): Position {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const html = (ad.ext === 'js' && ad.body) ? ad.body : ad.tag;\n\n if (typeof html !== 'string')\n throw new Error('Ad tag is not a string');\n\n const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;\n\n element.id = elementId;\n\n const position = new safeFrame.host.Position({\n id: elementId,\n html,\n src: ad.ext === 'js' ? ad.swfSrc?.href : undefined,\n config: new safeFrame.host.PosConfig({\n id: elementId,\n w: Number(ad.width),\n h: Number(ad.height),\n size: `${Number(ad.width)}x${Number(ad.height)}`,\n tgt: html.includes('target=\"_self\"') ? '_self' : '_blank',\n dest: elementId,\n }),\n });\n\n adhesePositions.add(position);\n\n return position;\n }\n\n async function render(position: Position): Promise<void> {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n safeFrame.host.render(position);\n }\n\n function dispose(): void {\n }\n\n return {\n config,\n addPosition,\n render,\n dispose,\n };\n}\n","import type { Ad } from '@adhese/sdk';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.innerHTML = String(ad.tag);\n}\n\nexport function generateName(\n location: string,\n format: string,\n slot: string | undefined,\n): string {\n return `${location}${slot ? `${slot}` : ''}-${format}`;\n}\n","/**\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 { debounce } from 'remeda';\nimport { logger } from '@adhese/sdk';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, {\n waitMs: 50,\n });\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange.call);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange.call);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","const hookMap = new Map<string, Set<Function>>();\n\nexport function clearAllHooks(): void {\n hookMap.clear();\n}\n\nexport function createAsyncHook<\n Argument = void,\n Callback extends (() => void | Promise<void>) | ((arg: Argument) => Argument | void | Promise<Argument | void>) = Argument extends void ?\n () => void | Promise<void> :\n (arg: Argument) => Argument | void | Promise<Argument | void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = (async (arg) => {\n let latestResult: Argument = arg;\n\n for (const callback of hookMap.get(name) ?? [])\n // eslint-disable-next-line no-await-in-loop\n latestResult = (await callback(latestResult) as Argument) ?? latestResult;\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>;\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nexport function createSyncHook<\n Argument = void,\n Callback extends (arg: Argument) => Argument | void | Promise<void> = (arg: Argument) => Argument | void | Promise<void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: (arg: Argument) => Argument,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = ((arg) => {\n let latestResult: Argument = arg;\n\n const promisedCallbacks: Array<Callback> = [];\n\n for (const callback of hookMap.get(name) ?? []) {\n if (isCallbackAsync(callback))\n promisedCallbacks.push(callback as Callback);\n else\n latestResult = callback(latestResult) as Argument ?? latestResult;\n }\n\n // eslint-disable-next-line no-console\n Promise.allSettled(promisedCallbacks.map(callback => callback(latestResult) as Argument)).catch(console.trace);\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as (arg: Argument) => Argument;\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nfunction add<Callback extends Function>(callback: Callback, {\n name,\n onAdd,\n}: {\n name: string;\n onAdd?(hookSet: Set<Callback>): void;\n}): () => void {\n const hookSet = hookMap.get(name);\n\n if (hookSet)\n hookSet.add(callback);\n else\n hookMap.set(name, new Set([callback]));\n\n onAdd?.(hookSet as Set<Callback>);\n\n return () => {\n hookMap.get(name)?.delete(callback);\n };\n}\n\nfunction isCallbackAsync(callback: Function): boolean {\n return callback.constructor.name === 'AsyncFunction';\n}\n","import { createSyncHook } from './createHook';\n\nlet resolveOnInitPromise = (): void => {};\nlet isInit = false;\nconst waitOnInit = new Promise<void>((resolve) => {\n resolveOnInitPromise = resolve;\n});\n\nconst [runOnInit, onInit] = createSyncHook('onInit', {\n onRun(callbacks) {\n isInit = true;\n\n resolveOnInitPromise();\n\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n});\n\nexport {\n onInit,\n runOnInit,\n waitOnInit,\n};\n","import { createEventManager, uniqueId } from '@utils';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import type { AdRequestOptions } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { Ad } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<Ad>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import {\n NEVER,\n type TypeOf,\n ZodIssueCode,\n type ZodType,\n coerce,\n lazy,\n literal,\n number,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\nexport const cssValueLike\n = union([coerce.string(), literal(''), number()]).transform<string | undefined>((value) => {\n if (value === '' || value === 0 || value === '0')\n return undefined;\n\n if (numberLike.parse(value))\n return `${numberLike.parse(value)}px`;\n\n return String(value);\n });\n\nexport const isJson = string().transform((value, { addIssue }) => {\n try {\n return JSON.parse(value.replaceAll('\\'', '\"')) as Record<string, unknown> | ReadonlyArray<unknown>;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid JSON: ${(error as Error).message}`,\n });\n\n return NEVER;\n }\n});\n\nexport const isHtmlString = string().transform((value, { addIssue }) => {\n const htmlParser = new DOMParser();\n\n try {\n const html = htmlParser.parseFromString(value, 'text/html');\n\n if (html.body?.children.length === 0)\n throw new Error('Invalid HTML');\n\n return value;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: (error as Error).message,\n });\n\n return NEVER;\n }\n});\n\nexport const isJsonOrHtmlString = union([isJson, isHtmlString]);\n\nexport const isJsonOrHtmlOptionalString = union([coerce.string(), isJsonOrHtmlString]).transform((value) => {\n if (value === '')\n return undefined;\n\n return value;\n}).optional();\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { logger } from '@adhese/sdk';\nimport { type Ad, adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { toValue } from '@vue/runtime-core';\nimport { type AdRequestOptions, logger } from '@adhese/sdk';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context: { options: { host }, parameters },\n ...options\n}: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: parameters && parseParameters(parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }).map(([key, value]): [string, T] => {\n if (typeof value === 'string')\n return [key, filterSpecialChars(value) as T];\n\n return [key, value.map(filterSpecialChars) as unknown as T];\n }));\n}\n\nfunction filterSpecialChars(value: string): string {\n const specialRegex = /[^\\p{L}\\p{N}_]/gu;\n\n return value.replaceAll(specialRegex, '_');\n}\n","import type { MaybeRef } from '@vue/runtime-core';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport { type Ad, parseResponse } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<{\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n }>;\n context: AdheseContext;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds(requestOptions: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n const options = await runOnRequest(requestOptions);\n\n const { context } = options;\n\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews] = await Promise.all([context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(context.options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult = await runOnResponse([\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ]);\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: AdRequestOptions['slots'][number];\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n","import type { Ad } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRender, onRender] = createAsyncHook<Ad>('onRender');\n\nexport { runOnRender, onRender };\n","import type { AdheseSlotOptions } from '@adhese/sdk';\nimport { createSyncHook } from './createHook';\n\nconst [runOnSlotCreate, onSlotCreate] = createSyncHook<AdheseSlotOptions>('onSlotCreate');\n\nexport { runOnSlotCreate, onSlotCreate };\n","import { type ComputedRef, type Ref, computed, ref, watch } from '@vue/runtime-core';\nimport { round } from 'remeda';\nimport { type Ad, type AdheseContext, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<Ad | null>;\n name: ComputedRef<string>;\n element: ComputedRef<HTMLElement | null>;\n },\n): [\n ComputedRef,\n IntersectionObserver['disconnect'],\n ] {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = computed(() => Boolean(trackingPixel.value));\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad.value?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(ad.value.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${name.value}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isTracked, (): void => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n }];\n}\n","import { type Ref, ref, watch } from '@vue/runtime-core';\nimport { type Ad, type AdheseSlotOptions, logger } from '@adhese/sdk';\n\nexport function useRenderIntersectionObserver({ ad, options, element, render }: {\n ad: Ref<Ad | null>;\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n render(adToRender?: Ad): Promise<HTMLElement>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport.value) {\n (async (): Promise<void> => {\n if (!ad.value && options.lazyLoading)\n await render();\n\n await render(ad.value ?? undefined);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import { waitForDomLoad } from '@utils';\nimport { type Ref, computed, effectScope, reactive, ref, watch } from '@vue/runtime-core';\nimport { isDeepEqual } from 'remeda';\nimport { type Ad, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport { onInit, waitOnInit } from '../../hooks/onInit';\nimport { requestAd as extRequestAd } from '../../requestAds/requestAds';\nimport { runOnRender } from '../../hooks/onRender';\nimport { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n const scope = effectScope();\n\n return scope.run(() => {\n const options = runOnSlotCreate(slotOptions);\n\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format !== 'string') {\n queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n }\n\n const format = ref(queryDetector ? queryDetector.getQuery() : options.format as string);\n function onQueryChange(newFormat: string): void {\n format.value = newFormat;\n }\n\n const ad = ref<Ad | null>(null);\n const originalAd = ref(ad.value);\n\n const name = computed(() => generateName(context.location, format.value, slot));\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n options.onNameChange?.(newName, oldName);\n\n const newAd = await requestAd();\n\n cleanElement();\n\n ad.value = newAd;\n originalAd.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element.value?.querySelector('iframe') ?? null;\n\n return element.value?.innerHTML ? (element.value.firstElementChild as HTMLElement) : null;\n }\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n ad,\n options,\n element,\n render,\n });\n\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if (!newAd || (oldAd && isDeepEqual(newAd, oldAd)))\n return;\n\n if (newIsInViewport || context.options.eagerRendering)\n await render(newAd);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n });\n\n const [\n isViewabilityTracked,\n disposeViewabilityObserver,\n ] = useViewabilityObserver({\n context,\n ad,\n name,\n element,\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = computed(() => Boolean(impressionTrackingPixelElement.value));\n\n async function requestAd(): Promise<Ad> {\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n originalAd.value = response;\n\n return response;\n }\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (renderAd)\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnRender(renderAd);\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (context.safeFrame && renderAd && renderMode === 'iframe') {\n const position = context.safeFrame.addPosition(renderAd, element.value);\n\n await context.safeFrame.render(position);\n }\n else {\n renderFunctions[renderMode](renderAd, element.value);\n }\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n options.onRender?.(element.value);\n\n // eslint-disable-next-line require-atomic-updates\n ad.value = renderAd;\n\n disposeRenderIntersectionObserver();\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n ad.value = null;\n\n disposeRenderIntersectionObserver();\n disposeViewabilityObserver();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n\n scope.stop();\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n render,\n getElement,\n dispose,\n };\n })!;\n}\n\nfunction useDomLoaded(): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n","import { waitForDomLoad } from '@utils';\nimport { generateName } from '../createSlot/createSlot.utils';\nimport type { AdheseContext } from '../../main.types';\nimport type { AdheseSlot } from '../createSlot/createSlot.types';\nimport { createSlot } from '../createSlot/createSlot';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter((element) => {\n if (!element.dataset.format)\n return false;\n\n const name = generateName(\n context.location,\n element.dataset.format,\n element.dataset.slot,\n );\n\n return !context.getAll?.().some(activeSlot => activeSlot.name.value === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name.value === slot.name.value));\n}\n","import type { Merge } from '@utils';\nimport { effectScope, shallowReactive, watch, watchEffect } from '@vue/runtime-core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\nimport type { AdheseSlot, AdheseSlotOptions } from '../createSlot/createSlot.types';\nimport type { AdheseContext } from '../../main.types';\nimport { createSlot } from '../createSlot/createSlot';\nimport { logger } from '../../logger/logger';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Readonly<SlotManager> {\n const scope = effectScope();\n\n return scope.run(() => {\n const slots = shallowReactive<Map<string, AdheseSlot>>(new Map<string, AdheseSlot>());\n\n watchEffect(() => {\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.name.value);\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n slots.set(slot.name.value, slot);\n\n watch(slot.name, (newName, previousName) => {\n slots.set(newName, slot);\n slots.delete(previousName);\n });\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n slots.set(slot.name.value, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n scope.stop();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n })!;\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): Map<string, string | ReadonlyArray<string>> {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n","import { createSyncHook } from './createHook';\n\nlet isDisposed = false;\n\nconst [runOnDispose, onDispose] = createSyncHook('onDispose', {\n onRun(callbacks) {\n isDisposed = true;\n\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n});\n\nexport {\n onDispose,\n runOnDispose,\n};\n","import { createEventManager } from '@utils';\nimport { effectScope, reactive, watch } from '@vue/runtime-core';\nimport { createSafeFrame } from '@safeframe';\nimport packageJson from '../package.json';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport { requestAds } from './requestAds/requestAds';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\nimport { onRender } from './hooks/onRender';\nimport { onRequest } from './hooks/onRequest';\nimport { onSlotCreate } from './hooks/onSlotCreate';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport function createAdhese(options: AdheseOptions): Readonly<Adhese> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n safeFrame: false,\n eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n addSlot,\n } satisfies AdheseContext) as AdheseContext;\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version: packageJson.version,\n onInit,\n onDispose,\n onRender,\n onRequest,\n onResponse,\n onSlotCreate,\n });\n }\n\n context.events = createEventManager();\n\n context.safeFrame = options.safeFrame\n ? createSafeFrame({\n renderFile: `${mergedOptions.poolHost}/sf/r.html`,\n context,\n })\n : undefined;\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n\n watch(\n context.parameters,\n onParametersChange,\n {\n deep: true,\n immediate: true,\n },\n );\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n if (!slotManager)\n throw new Error('Slot manager not initialized');\n\n return slotManager.add(slotOptions);\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots() ?? []).filter(slot => !slot.lazyLoading);\n\n if (domSlots.length <= 0)\n return [];\n\n const ads = await requestAds({\n slots: domSlots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n slots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n logger.info('Adhese instance disposed');\n\n runOnDispose();\n\n clearAllHooks();\n\n scope.stop();\n }\n\n onInit(async () => {\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n context.events?.debugChange.dispatch(true);\n\n if (!scope.active)\n dispose();\n });\n\n runOnInit();\n\n return {\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 get: slotManager.get,\n getAll: slotManager.getAll,\n context,\n options: mergedOptions,\n } satisfies Adhese;\n })!;\n}\n"],"names":["debounce","name","union","coerce","literal","number","string","ZodIssueCode","NEVER","object","unknown","lazy","toValue","ref","computed","round","watch","effectScope","reactive","requestAd","isDeepEqual","extRequestAd","shallowReactive","watchEffect","add","onDispose","_a","findDomSlots","extFindDomSlots"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../utils/src/eventManager/eventManager.ts","../../utils/src/uniqueId/uniqueId.ts","../../safeframe/src/main.ts","../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../../logger/src/createLogger/createLogger.ts","../src/logger/logger.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.schema.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onRender.ts","../src/hooks/onSlotCreate.ts","../src/hooks/onViewabilityChanged.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/createSlot.ts","../src/slot/findDomSlots/findDomSlots.ts","../src/slot/slotManager/slotManager.ts","../src/consent/tcfConsent.ts","../src/main.utils.ts","../src/hooks/onDispose.ts","../src/main.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","const savedIds = new Set<string>();\n\nexport function uniqueId(): string {\n let id: string;\n\n do\n id = Math.random().toString(36).slice(2);\n while (savedIds.has(id));\n\n savedIds.add(id);\n\n return id;\n}\n","import { uniqueId } from '@utils';\nimport type { Ad, AdheseContext } from '@adhese/sdk';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: Ad, element: HTMLElement): Position;\n render(position: Position): Promise<void>;\n dispose(): void;\n};\n\nexport type SafeFrameOptions = {\n renderFile: string;\n context: AdheseContext;\n};\n\nexport function createSafeFrame({\n renderFile,\n context,\n}: SafeFrameOptions): SafeFrame {\n const safeFrame = window.$sf;\n\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const adhesePositions = new Set<Position>();\n\n const config = new safeFrame.host.Config({\n auto: false,\n debug: context.debug,\n renderFile,\n });\n\n function addPosition(ad: Ad, element: HTMLElement): Position {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const html = (ad.ext === 'js' && ad.body) ? ad.body : ad.tag;\n\n if (typeof html !== 'string')\n throw new Error('Ad tag is not a string');\n\n const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;\n\n element.id = elementId;\n\n const position = new safeFrame.host.Position({\n id: elementId,\n html,\n src: ad.ext === 'js' ? ad.swfSrc?.href : undefined,\n config: new safeFrame.host.PosConfig({\n id: elementId,\n w: Number(ad.width),\n h: Number(ad.height),\n size: `${Number(ad.width)}x${Number(ad.height)}`,\n tgt: html.includes('target=\"_self\"') ? '_self' : '_blank',\n dest: elementId,\n }),\n });\n\n adhesePositions.add(position);\n\n return position;\n }\n\n async function render(position: Position): Promise<void> {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n safeFrame.host.render(position);\n }\n\n function dispose(): void {\n }\n\n return {\n config,\n addPosition,\n render,\n dispose,\n };\n}\n","import type { Ad } from '@adhese/sdk';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.innerHTML = String(ad.tag);\n}\n\nexport function generateName(\n location: string,\n format: string,\n slot: string | undefined,\n): string {\n return `${location}${slot ? `${slot}` : ''}-${format}`;\n}\n","/**\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 { debounce } from 'remeda';\nimport { logger } from '@adhese/sdk';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, {\n waitMs: 50,\n });\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange.call);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange.call);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","const hookMap = new Map<string, Set<Function>>();\n\nexport function clearAllHooks(): void {\n hookMap.clear();\n}\n\nexport function createAsyncHook<\n Argument = void,\n Callback extends (() => void | Promise<void>) | ((arg: Argument) => Argument | void | Promise<Argument | void>) = Argument extends void ?\n () => void | Promise<void> :\n (arg: Argument) => Argument | void | Promise<Argument | void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = (async (arg) => {\n let latestResult: Argument = arg;\n\n for (const callback of hookMap.get(name) ?? [])\n // eslint-disable-next-line no-await-in-loop\n latestResult = (await callback(latestResult) as Argument) ?? latestResult;\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>;\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nexport function createSyncHook<\n Argument = void,\n Callback extends (arg: Argument) => Argument | void | Promise<void> = (arg: Argument) => Argument | void | Promise<void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: (arg: Argument) => Argument,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = ((arg) => {\n let latestResult: Argument = arg;\n\n const promisedCallbacks: Array<Callback> = [];\n\n for (const callback of hookMap.get(name) ?? []) {\n if (isCallbackAsync(callback))\n promisedCallbacks.push(callback as Callback);\n else\n latestResult = callback(latestResult) as Argument ?? latestResult;\n }\n\n // eslint-disable-next-line no-console\n Promise.allSettled(promisedCallbacks.map(callback => callback(latestResult) as Argument)).catch(console.trace);\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as (arg: Argument) => Argument;\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nexport function createPassiveHook<\n Argument = void,\n Callback extends (arg: Argument) => void | Promise<void> = (arg: Argument) => void | Promise<void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: (arg: Argument) => void,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n function run(arg: Argument): void {\n // eslint-disable-next-line no-console\n Promise.allSettled(Array.from(hookMap.get(name) ?? []).map(callback => callback(arg) as Callback)).catch(console.trace);\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nfunction isCallbackAsync(callback: Function): boolean {\n return callback.constructor.name === 'AsyncFunction';\n}\n\nfunction add<Callback extends Function>(callback: Callback, {\n name,\n onAdd,\n}: {\n name: string;\n onAdd?(hookSet: Set<Callback>): void;\n}): () => void {\n const hookSet = hookMap.get(name);\n\n if (hookSet)\n hookSet.add(callback);\n else\n hookMap.set(name, new Set([callback]));\n\n onAdd?.(hookSet as Set<Callback>);\n\n return () => {\n hookMap.get(name)?.delete(callback);\n };\n}\n","import { createSyncHook } from './createHook';\n\nlet resolveOnInitPromise = (): void => {};\nlet isInit = false;\nconst waitOnInit = new Promise<void>((resolve) => {\n resolveOnInitPromise = resolve;\n});\n\nconst [runOnInit, onInit] = createSyncHook('onInit', {\n onRun(callbacks) {\n isInit = true;\n\n resolveOnInitPromise();\n\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n});\n\nexport {\n onInit,\n runOnInit,\n waitOnInit,\n};\n","import { createEventManager, uniqueId } from '@utils';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import type { AdRequestOptions } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { Ad } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<Ad>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import {\n NEVER,\n type TypeOf,\n ZodIssueCode,\n type ZodType,\n coerce,\n lazy,\n literal,\n number,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\nexport const cssValueLike\n = union([coerce.string(), literal(''), number()]).transform<string | undefined>((value) => {\n if (value === '' || value === 0 || value === '0')\n return undefined;\n\n if (numberLike.parse(value))\n return `${numberLike.parse(value)}px`;\n\n return String(value);\n });\n\nexport const isJson = string().transform((value, { addIssue }) => {\n try {\n return JSON.parse(value.replaceAll('\\'', '\"')) as Record<string, unknown> | ReadonlyArray<unknown>;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid JSON: ${(error as Error).message}`,\n });\n\n return NEVER;\n }\n});\n\nexport const isHtmlString = string().transform((value, { addIssue }) => {\n const htmlParser = new DOMParser();\n\n try {\n const html = htmlParser.parseFromString(value, 'text/html');\n\n if (html.body?.children.length === 0)\n throw new Error('Invalid HTML');\n\n return value;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: (error as Error).message,\n });\n\n return NEVER;\n }\n});\n\nexport const isJsonOrHtmlString = union([isJson, isHtmlString]);\n\nexport const isJsonOrHtmlOptionalString = union([coerce.string(), isJsonOrHtmlString]).transform((value) => {\n if (value === '')\n return undefined;\n\n return value;\n}).optional();\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { logger } from '@adhese/sdk';\nimport { type Ad, adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { toValue } from '@vue/runtime-core';\nimport { type AdRequestOptions, logger } from '@adhese/sdk';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context: { options: { host }, parameters },\n ...options\n}: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: parameters && parseParameters(parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }).map(([key, value]): [string, T] => {\n if (typeof value === 'string')\n return [key, filterSpecialChars(value) as T];\n\n return [key, value.map(filterSpecialChars) as unknown as T];\n }));\n}\n\nfunction filterSpecialChars(value: string): string {\n const specialRegex = /[^\\p{L}\\p{N}_]/gu;\n\n return value.replaceAll(specialRegex, '_');\n}\n","import type { MaybeRef } from '@vue/runtime-core';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport { type Ad, parseResponse } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<{\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n }>;\n context: AdheseContext;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds(requestOptions: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n const options = await runOnRequest(requestOptions);\n\n const { context } = options;\n\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews] = await Promise.all([context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(context.options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult = await runOnResponse([\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ]);\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: AdRequestOptions['slots'][number];\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n","import type { Ad } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRender, onRender] = createAsyncHook<Ad>('onRender');\n\nexport { runOnRender, onRender };\n","import type { AdheseSlotOptions } from '@adhese/sdk';\nimport { createSyncHook } from './createHook';\n\nconst [runOnSlotCreate, onSlotCreate] = createSyncHook<AdheseSlotOptions>('onSlotCreate');\n\nexport { runOnSlotCreate, onSlotCreate };\n","import { createPassiveHook } from './createHook';\n\nconst [runOnViewabilityChanged, onViewabilityChanged] = createPassiveHook<{\n name: string;\n isInViewport: boolean;\n}>('onViewabilityChanged');\n\nexport { runOnViewabilityChanged, onViewabilityChanged };\n","import { type ComputedRef, type Ref, computed, ref, watch } from '@vue/runtime-core';\nimport { round } from 'remeda';\nimport { type Ad, type AdheseContext, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<Ad | null>;\n name: ComputedRef<string>;\n element: ComputedRef<HTMLElement | null>;\n },\n): [\n ComputedRef,\n IntersectionObserver['disconnect'],\n ] {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = computed(() => Boolean(trackingPixel.value));\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad.value?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(ad.value.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${name.value}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isTracked, (): void => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n }];\n}\n","import { type Ref, ref, watch } from '@vue/runtime-core';\nimport type { AdheseSlotOptions } from '@adhese/sdk';\n\nexport function useRenderIntersectionObserver({ options, element }: {\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import { waitForDomLoad } from '@utils';\nimport { type Ref, computed, effectScope, reactive, ref, watch } from '@vue/runtime-core';\nimport { isDeepEqual } from 'remeda';\nimport { type Ad, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport { onInit, waitOnInit } from '../../hooks/onInit';\nimport { requestAd as extRequestAd } from '../../requestAds/requestAds';\nimport { runOnRender } from '../../hooks/onRender';\nimport { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport { runOnViewabilityChanged } from '../../hooks/onViewabilityChanged';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n const scope = effectScope();\n\n return scope.run(() => {\n const options = runOnSlotCreate(slotOptions);\n\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format !== 'string') {\n queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n }\n\n const format = ref(queryDetector ? queryDetector.getQuery() : options.format as string);\n function onQueryChange(newFormat: string): void {\n format.value = newFormat;\n }\n\n const ad = ref<Ad | null>(null);\n const originalAd = ref(ad.value);\n\n const name = computed(() => generateName(context.location, format.value, slot));\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n options.onNameChange?.(newName, oldName);\n\n const newAd = await requestAd();\n\n cleanElement();\n\n ad.value = newAd;\n originalAd.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element.value?.querySelector('iframe') ?? null;\n\n return element.value?.innerHTML ? (element.value.firstElementChild as HTMLElement) : null;\n }\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n options,\n element,\n });\n\n const isRendered = ref(false);\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if ((!newAd || (oldAd && isDeepEqual(newAd, oldAd))) && isRendered.value)\n return;\n\n if (newIsInViewport || context.options.eagerRendering)\n await render(newAd ?? undefined);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n });\n\n watch(isInViewport, (value) => {\n runOnViewabilityChanged({\n name: name.value,\n isInViewport: value,\n });\n }, { immediate: true });\n\n const [\n isViewabilityTracked,\n disposeViewabilityObserver,\n ] = useViewabilityObserver({\n context,\n ad,\n name,\n element,\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = computed(() => Boolean(impressionTrackingPixelElement.value));\n\n async function requestAd(): Promise<Ad> {\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n originalAd.value = response;\n\n return response;\n }\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (renderAd)\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnRender(renderAd);\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (context.safeFrame && renderAd && renderMode === 'iframe') {\n const position = context.safeFrame.addPosition(renderAd, element.value);\n\n await context.safeFrame.render(position);\n }\n else {\n renderFunctions[renderMode](renderAd, element.value);\n }\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n options.onRender?.(element.value);\n\n // eslint-disable-next-line require-atomic-updates\n ad.value = renderAd;\n\n isRendered.value = true;\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n ad.value = null;\n\n disposeRenderIntersectionObserver();\n disposeViewabilityObserver();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n\n scope.stop();\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n render,\n getElement,\n dispose,\n };\n })!;\n}\n\nfunction useDomLoaded(): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n","import { waitForDomLoad } from '@utils';\nimport { generateName } from '../createSlot/createSlot.utils';\nimport type { AdheseContext } from '../../main.types';\nimport type { AdheseSlot } from '../createSlot/createSlot.types';\nimport { createSlot } from '../createSlot/createSlot';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter((element) => {\n if (!element.dataset.format)\n return false;\n\n const name = generateName(\n context.location,\n element.dataset.format,\n element.dataset.slot,\n );\n\n return !context.getAll?.().some(activeSlot => activeSlot.name.value === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name.value === slot.name.value));\n}\n","import type { Merge } from '@utils';\nimport { effectScope, shallowReactive, watch, watchEffect } from '@vue/runtime-core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\nimport type { AdheseSlot, AdheseSlotOptions } from '../createSlot/createSlot.types';\nimport type { AdheseContext } from '../../main.types';\nimport { createSlot } from '../createSlot/createSlot';\nimport { logger } from '../../logger/logger';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Readonly<SlotManager> {\n const scope = effectScope();\n\n return scope.run(() => {\n const slots = shallowReactive<Map<string, AdheseSlot>>(new Map<string, AdheseSlot>());\n\n watchEffect(() => {\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.name.value);\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n slots.set(slot.name.value, slot);\n\n watch(slot.name, (newName, previousName) => {\n slots.set(newName, slot);\n slots.delete(previousName);\n });\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n slots.set(slot.name.value, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n scope.stop();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n })!;\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): Map<string, string | ReadonlyArray<string>> {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n","import { createSyncHook } from './createHook';\n\nlet isDisposed = false;\n\nconst [runOnDispose, onDispose] = createSyncHook('onDispose', {\n onRun(callbacks) {\n isDisposed = true;\n\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n});\n\nexport {\n onDispose,\n runOnDispose,\n};\n","import { createEventManager } from '@utils';\nimport { effectScope, reactive, watch } from '@vue/runtime-core';\nimport { createSafeFrame } from '@safeframe';\nimport { debounce } from 'remeda';\nimport packageJson from '../package.json';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport { requestAds } from './requestAds/requestAds';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\nimport { onRender } from './hooks/onRender';\nimport { onRequest } from './hooks/onRequest';\nimport { onSlotCreate } from './hooks/onSlotCreate';\nimport { onViewabilityChanged } from './hooks/onViewabilityChanged';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport function createAdhese(options: AdheseOptions): Readonly<Adhese> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n safeFrame: false,\n eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n addSlot,\n } satisfies AdheseContext) as AdheseContext;\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version: packageJson.version,\n onInit,\n onDispose,\n onRender,\n onRequest,\n onResponse,\n onSlotCreate,\n onViewabilityChanged,\n });\n }\n\n context.events = createEventManager();\n\n context.safeFrame = options.safeFrame\n ? createSafeFrame({\n renderFile: `${mergedOptions.poolHost}/sf/r.html`,\n context,\n })\n : undefined;\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n\n watch(\n context.parameters,\n onParametersChange,\n {\n deep: true,\n immediate: true,\n },\n );\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n const debouncedFetchAllUnrenderedSlots = debounce(fetchAllUnrenderedSlots, {\n waitMs: 100,\n timing: 'both',\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 debouncedFetchAllUnrenderedSlots.call();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n const newSlot = slotManager.add(slotOptions);\n\n debouncedFetchAllUnrenderedSlots.call().catch(logger.error);\n\n return newSlot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots() ?? []).filter(slot => !slot.lazyLoading);\n\n if (domSlots.length <= 0)\n return [];\n\n const ads = await requestAds({\n slots: domSlots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAllUnrenderedSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading && !slot.ad.value);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n slots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await debouncedFetchAllUnrenderedSlots.call();\n });\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n logger.info('Adhese instance disposed');\n\n runOnDispose();\n\n clearAllHooks();\n\n scope.stop();\n }\n\n onInit(async () => {\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAllUnrenderedSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n context.events?.debugChange.dispatch(true);\n\n if (!scope.active)\n dispose();\n });\n\n runOnInit();\n\n return {\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n get: slotManager.get,\n getAll: slotManager.getAll,\n context,\n options: mergedOptions,\n } satisfies Adhese;\n })!;\n}\n"],"names":["debounce","name","union","coerce","literal","number","string","ZodIssueCode","NEVER","object","unknown","lazy","toValue","ref","computed","round","watch","effectScope","reactive","requestAd","isDeepEqual","extRequestAd","shallowReactive","watchEffect","add","onDispose","_a","findDomSlots","extFindDomSlots"],"mappings":"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"}