@adhese/sdk 0.14.1 → 0.15.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @adhese/sdk
2
2
 
3
+ ## 0.15.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 467d857: Move SafeFrame code to a seperate plugin instead of including it
8
+
3
9
  ## 0.14.1
4
10
 
5
11
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -2,60 +2,8 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const sdkShared = require("@adhese/sdk-shared");
4
4
  const remeda = require("remeda");
5
- function createSafeFrame({
6
- renderFile,
7
- context
8
- }) {
9
- const safeFrame = window.$sf;
10
- if (!safeFrame)
11
- throw new Error("SafeFrame not found");
12
- const adhesePositions = /* @__PURE__ */ new Set();
13
- const config = new safeFrame.host.Config({
14
- auto: false,
15
- debug: context.debug,
16
- renderFile
17
- });
18
- function addPosition(ad, element) {
19
- var _a;
20
- if (!safeFrame)
21
- throw new Error("SafeFrame not found");
22
- const html = ad.ext === "js" && ad.body ? ad.body : ad.tag;
23
- if (typeof html !== "string")
24
- throw new Error("Ad tag is not a string");
25
- const elementId = element.id || `ad-${ad.id}-${sdkShared.uniqueId()}`;
26
- element.id = elementId;
27
- const position = new safeFrame.host.Position({
28
- id: elementId,
29
- html,
30
- src: ad.ext === "js" ? (_a = ad.swfSrc) == null ? void 0 : _a.href : void 0,
31
- config: new safeFrame.host.PosConfig({
32
- id: elementId,
33
- w: Number(ad.width),
34
- h: Number(ad.height),
35
- size: `${Number(ad.width)}x${Number(ad.height)}`,
36
- tgt: html.includes('target="_self"') ? "_self" : "_blank",
37
- dest: elementId
38
- })
39
- });
40
- adhesePositions.add(position);
41
- return position;
42
- }
43
- async function render(position) {
44
- if (!safeFrame)
45
- throw new Error("SafeFrame not found");
46
- safeFrame.host.render(position);
47
- }
48
- function dispose() {
49
- }
50
- return {
51
- config,
52
- addPosition,
53
- render,
54
- dispose
55
- };
56
- }
57
5
  const name = "@adhese/sdk";
58
- const version = "0.14.1";
6
+ const version = "0.15.0";
59
7
  function renderIframe(ad, element) {
60
8
  const iframe = document.createElement("iframe");
61
9
  iframe.srcdoc = `
@@ -496,21 +444,26 @@ function useSlotHooks({ setup }, slotContext, id) {
496
444
  }
497
445
  const renderFunctions = {
498
446
  iframe: renderIframe,
499
- inline: renderInline
447
+ inline: renderInline,
448
+ none: remeda.doNothing
500
449
  };
501
450
  function createSlot(slotOptions) {
502
451
  const scope = sdkShared.effectScope();
452
+ const mergedOptions = {
453
+ renderMode: "iframe",
454
+ ...slotOptions
455
+ };
503
456
  return scope.run(() => {
504
457
  const slotContext = sdkShared.ref(null);
505
- const options = runOnSlotCreate(slotOptions);
458
+ const options = runOnSlotCreate(mergedOptions);
506
459
  const id = sdkShared.uniqueId();
507
460
  const { runOnSlotRender, runOnDispose: runOnDispose2, runOnRequest: runOnRequest2 } = useSlotHooks(options, slotContext, id);
508
461
  const {
509
462
  containingElement,
510
463
  slot,
511
464
  context,
512
- renderMode = "iframe"
513
- } = options;
465
+ renderMode
466
+ } = mergedOptions;
514
467
  const parameters = sdkShared.reactive(new Map(Object.entries(options.parameters ?? {})));
515
468
  let queryDetector = null;
516
469
  if (typeof options.format !== "string") {
@@ -609,12 +562,7 @@ function createSlot(slotOptions) {
609
562
  }
610
563
  if (context.debug)
611
564
  element.value.style.position = "relative";
612
- if (context.safeFrame && renderAd && renderMode === "iframe") {
613
- const position = context.safeFrame.addPosition(renderAd, element.value);
614
- await context.safeFrame.render(position);
615
- } else {
616
- renderFunctions[renderMode](renderAd, element.value);
617
- }
565
+ renderFunctions[renderMode](renderAd, element.value);
618
566
  if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {
619
567
  impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);
620
568
  logger.debug(`Impression tracking pixel fired for ${name2.value}`);
@@ -840,7 +788,6 @@ function createAdhese(options) {
840
788
  consent: false,
841
789
  logReferrer: true,
842
790
  logUrl: true,
843
- safeFrame: false,
844
791
  eagerRendering: false,
845
792
  viewabilityTracking: true,
846
793
  plugins: [],
@@ -875,10 +822,6 @@ function createAdhese(options) {
875
822
  });
876
823
  }
877
824
  context.events = sdkShared.createEventManager();
878
- context.safeFrame = options.safeFrame ? createSafeFrame({
879
- renderFile: `${mergedOptions.poolHost}/sf/r.html`,
880
- context
881
- }) : void 0;
882
825
  sdkShared.watch(() => context.location, (newLocation) => {
883
826
  var _a;
884
827
  (_a = context.events) == null ? void 0 : _a.locationChange.dispatch(newLocation);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../safeframe/src/main.ts","../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/logger/logger.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onSlotCreate.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/useSlotHooks.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":["import { uniqueId } from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext } from '@adhese/sdk';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: AdheseAd, 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: AdheseAd, 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 { AdheseAd } from '@adhese/sdk';\n\nexport function renderIframe(ad: AdheseAd, 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: AdheseAd, 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 { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\n","import { debounce } from 'remeda';\nimport { logger } from '../logger/logger';\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 type { AdMultiRequestOptions } from '../requestAds/requestAds';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdMultiRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { AdheseAd } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import { logger } from '../logger/logger';\nimport type { AdheseAd } from './requestAds.schema';\n\n/**\n * Request preview ads for the given account. This function will only return items when there are preview objects in the\n * URL detected.\n */\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<AdheseAd>> {\n const previewObjects = getPreviewObjects();\n\n const [list, adSchema] = await Promise.all([\n 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 import('./requestAds.schema').then(module => module.adSchema),\n ]);\n\n return adSchema.array().parse(list\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 .flatMap(response => response.value.map(item => ({\n ...item,\n preview: true,\n })))) as ReadonlyArray<AdheseAd>;\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 '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport type { AdMultiRequestOptions } from './requestAds';\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,\n ...options\n}: Omit<AdMultiRequestOptions, '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: context.parameters && parseParameters(context.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(context.options.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<AdMultiRequestOptions, '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, toValue } from '@adhese/sdk-shared';\nimport { debounce } from 'remeda';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport type { AdheseAd } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * Slot you want to fetch the ad for\n */\n slot: {\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n };\n context: AdheseContext;\n};\n\nexport type AdMultiRequestOptions = Omit<AdRequestOptions, 'slot'> & {\n slots: ReadonlyArray<AdRequestOptions['slot']>;\n};\n\nconst batch = new Map<string, {\n options: AdRequestOptions;\n resolve(ad: AdheseAd | null): void;\n}>();\n\n/**\n * Debounced function to request ads in batches. This function is debounced to prevent multiple requests for the same ad.\n */\nconst runRequestAdsBatch = debounce(async (context: AdheseContext) => {\n if (batch.size === 0)\n return [];\n\n const ads = await requestAds({\n slots: Array.from(batch.values()).map(({ options }) => options.slot),\n context,\n });\n\n for (const { options, resolve } of batch.values()) {\n const ad = ads.find(({ slotName }) => toValue(slotName) === toValue(options.slot.name));\n\n if (ad)\n resolve(ad);\n else\n resolve(null);\n }\n\n batch.clear();\n\n return ads;\n}, {\n waitMs: 20,\n timing: 'trailing',\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(options: AdRequestOptions): Promise<AdheseAd | null> {\n const promise = new Promise<AdheseAd | null>((resolve) => {\n batch.set(toValue(options.slot.name), { options, resolve });\n },\n );\n\n await runRequestAdsBatch.call(options.context);\n\n return promise;\n}\n\n/**\n * Request multiple ads from the API. If you need to fetch a single ad use the `requestAd` function.\n */\nexport async function requestAds(requestOptions: AdMultiRequestOptions): Promise<ReadonlyArray<AdheseAd>> {\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, parseResponse] = await Promise.all([\n context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options),\n requestPreviews(context.options.account),\n import('./requestAds.schema').then(module => module.parseResponse),\n ]);\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","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 '@adhese/sdk-shared';\nimport { round } from 'remeda';\nimport type { AdheseAd, AdheseContext } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { logger } from '../../logger/logger';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<AdheseAd | 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 }, 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 '@adhese/sdk-shared';\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 type { AdheseAd, AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport type { Ref, UnwrapRef } from '@adhese/sdk-shared';\nimport { createAsyncHook, createPassiveHook } from '../../hooks/createHook';\n\nexport function useSlotHooks({ setup }: AdheseSlotOptions, slotContext: Ref<UnwrapRef<AdheseSlot | null>>, id: string): {\n runOnSlotRender: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnRequest: ReturnType<typeof createAsyncHook<void>>[0];\n runOnDispose: ReturnType<typeof createPassiveHook<void>>[0];\n} {\n const [runOnSlotRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>(`onRender:${id}`);\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook(`onRequest:${id}`);\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook(`onDispose:${id}`);\n\n setup?.(slotContext, {\n onRender,\n onDispose,\n onRequest,\n });\n\n onDispose(() => {\n disposeOnRender();\n disposeOnRequest();\n disposeOnDispose();\n });\n\n return { runOnSlotRender, runOnRequest, runOnDispose };\n}\n","import { type Ref, type UnwrapRef, computed, effectScope, reactive, ref, uniqueId, waitForDomLoad, watch } from '@adhese/sdk-shared';\nimport { isDeepEqual } from 'remeda';\nimport type { AdheseAd } 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 { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport { logger } from '../../logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\nimport { useSlotHooks } from './useSlotHooks';\n\nconst renderFunctions: Record<RenderMode, (ad: AdheseAd, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlot | null>(null);\n const options = runOnSlotCreate(slotOptions);\n\n const id = uniqueId();\n\n const { runOnSlotRender, runOnDispose, runOnRequest } = useSlotHooks(options, slotContext, id);\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<AdheseAd | 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 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 isDisposed = ref(false);\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value || isDisposed.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n options,\n element,\n });\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if ((!newAd || (oldAd && isDeepEqual(newAd, oldAd))) && status.value === 'rendered')\n return;\n\n if (newIsInViewport)\n await render(newAd ?? undefined);\n });\n\n watch(isInViewport, (value) => {\n options.onViewabilityChanged?.(value);\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<AdheseAd | null> {\n status.value = 'loading';\n\n await runOnRequest();\n\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n if (response) {\n ad.value = response;\n\n if (!originalAd.value)\n originalAd.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n }\n\n return response;\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n status.value = 'rendering';\n\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (!renderAd) {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n return null;\n }\n\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnSlotRender(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 status.value = 'rendered';\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 runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n onInit(async () => {\n status.value = 'initialized';\n\n if (options.lazyLoading)\n return;\n\n ad.value = await requestAd();\n });\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n render,\n request: requestAd,\n dispose,\n });\n\n watch(state, (newState) => {\n slotContext.value = newState;\n }, {\n deep: true,\n immediate: true,\n });\n\n return state;\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 '@adhese/sdk-shared';\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 === 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 === slot.name));\n}\n","import type { Merge } from '@adhese/sdk-shared';\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 AdheseSlotManager = {\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\n/**\n * Creates a new slot manager instance. This slot manager instance can be used to manage all slots in the Adhese\n * instance. It will automatically add all slots that are passed in the `initialSlots` array.\n */\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): AdheseSlotManager {\n context.slots = new Map<string, AdheseSlot>();\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(context.slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose'>): Readonly<AdheseSlot> {\n // console.log(options, context.slots, names.value);\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n if (get(slot.name)) {\n slot.dispose();\n\n throw new Error(`Slot with the name: ${slot.name} already exists. Create a new slot with a different format, slot, or the location.`);\n }\n\n function onDispose(): void {\n context.slots.delete(slot.id);\n logger.debug('Slot removed', {\n slot,\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n context.slots.set(slot.id, slot);\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(context.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 context.slots.set(slot.id, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return getAll().find(slot => slot.name === name);\n }\n\n function dispose(): void {\n for (const slot of context.slots.values())\n slot.dispose();\n\n context.slots.clear();\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","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\n/**\n * Creates the parameters map with a set of default parameters.\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\n/**\n * Sets up logging based on the provided options. If debug is enabled, the log level threshold is set to debug.\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\n/**\n * Checks if the current page is in preview mode.\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 { awaitTimeout, createEventManager, effectScope, reactive, watch } from '@adhese/sdk-shared';\nimport { createSafeFrame } from '@safeframe';\nimport { version } 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, AdheseContextState, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\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 {AdheseOptions} The options to create the Adhese instance with. See the {@link AdheseOptions} type for more information.\n *\n * @return 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<AdheseContextState>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n options: mergedOptions,\n logger,\n isDisposed: false,\n parameters: new Map(),\n events: createEventManager(),\n slots: new Map(),\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version,\n onInit,\n onDispose,\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 watch(() => 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 (newParameters) => {\n context.events?.parametersChange.dispatch(newParameters);\n },\n {\n deep: true,\n },\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 fetchAllUnrenderedSlots();\n }\n\n watch(() => context.consent, (newConsent) => {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n\n context.events?.consentChange.dispatch(newConsent);\n }, {\n immediate: true,\n });\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n context.getAll = getAll;\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n context.get = get;\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n return slotManager.add(slotOptions);\n }\n context.addSlot = addSlot;\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 await fetchAllUnrenderedSlots();\n\n return domSlots;\n }\n context.findDomSlots = findDomSlots;\n\n watch(() => context.debug, async (newDebug) => {\n if (newDebug) {\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 immediate: true,\n });\n\n async function fetchAllUnrenderedSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading && !slot.ad);\n\n if (slots.length === 0)\n return;\n\n await Promise.allSettled(slots.map(slot => slot.request()));\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 fetchAllUnrenderedSlots();\n });\n\n function dispose(): void {\n context.isDisposed = true;\n\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 context.dispose = dispose;\n\n onInit(async () => {\n await awaitTimeout(0);\n\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAllUnrenderedSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await context?.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 context;\n })!;\n}\n"],"names":["uniqueId","createLogger","debounce","name","module","toValue","ref","computed","round","watch","runOnRequest","onRequest","runOnDispose","onDispose","effectScope","reactive","requestAd","isDisposed","isDeepEqual","extRequestAd","waitForDomLoad","add","_a","findDomSlots","extFindDomSlots","createEventManager","awaitTimeout"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/logger/logger.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onSlotCreate.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/useSlotHooks.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":["import type { AdheseAd } from '@adhese/sdk';\n\nexport function renderIframe(ad: AdheseAd, 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: AdheseAd, 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 { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\n","import { debounce } from 'remeda';\nimport { logger } from '../logger/logger';\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 type { AdMultiRequestOptions } from '../requestAds/requestAds';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdMultiRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { AdheseAd } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import { logger } from '../logger/logger';\nimport type { AdheseAd } from './requestAds.schema';\n\n/**\n * Request preview ads for the given account. This function will only return items when there are preview objects in the\n * URL detected.\n */\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<AdheseAd>> {\n const previewObjects = getPreviewObjects();\n\n const [list, adSchema] = await Promise.all([\n 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 import('./requestAds.schema').then(module => module.adSchema),\n ]);\n\n return adSchema.array().parse(list\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 .flatMap(response => response.value.map(item => ({\n ...item,\n preview: true,\n })))) as ReadonlyArray<AdheseAd>;\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 '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport type { AdMultiRequestOptions } from './requestAds';\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,\n ...options\n}: Omit<AdMultiRequestOptions, '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: context.parameters && parseParameters(context.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(context.options.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<AdMultiRequestOptions, '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, toValue } from '@adhese/sdk-shared';\nimport { debounce } from 'remeda';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport type { AdheseAd } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * Slot you want to fetch the ad for\n */\n slot: {\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n };\n context: AdheseContext;\n};\n\nexport type AdMultiRequestOptions = Omit<AdRequestOptions, 'slot'> & {\n slots: ReadonlyArray<AdRequestOptions['slot']>;\n};\n\nconst batch = new Map<string, {\n options: AdRequestOptions;\n resolve(ad: AdheseAd | null): void;\n}>();\n\n/**\n * Debounced function to request ads in batches. This function is debounced to prevent multiple requests for the same ad.\n */\nconst runRequestAdsBatch = debounce(async (context: AdheseContext) => {\n if (batch.size === 0)\n return [];\n\n const ads = await requestAds({\n slots: Array.from(batch.values()).map(({ options }) => options.slot),\n context,\n });\n\n for (const { options, resolve } of batch.values()) {\n const ad = ads.find(({ slotName }) => toValue(slotName) === toValue(options.slot.name));\n\n if (ad)\n resolve(ad);\n else\n resolve(null);\n }\n\n batch.clear();\n\n return ads;\n}, {\n waitMs: 20,\n timing: 'trailing',\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(options: AdRequestOptions): Promise<AdheseAd | null> {\n const promise = new Promise<AdheseAd | null>((resolve) => {\n batch.set(toValue(options.slot.name), { options, resolve });\n },\n );\n\n await runRequestAdsBatch.call(options.context);\n\n return promise;\n}\n\n/**\n * Request multiple ads from the API. If you need to fetch a single ad use the `requestAd` function.\n */\nexport async function requestAds(requestOptions: AdMultiRequestOptions): Promise<ReadonlyArray<AdheseAd>> {\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, parseResponse] = await Promise.all([\n context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options),\n requestPreviews(context.options.account),\n import('./requestAds.schema').then(module => module.parseResponse),\n ]);\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","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 '@adhese/sdk-shared';\nimport { round } from 'remeda';\nimport type { AdheseAd, AdheseContext } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { logger } from '../../logger/logger';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<AdheseAd | 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 }, 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 '@adhese/sdk-shared';\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 type { AdheseAd, AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport type { Ref, UnwrapRef } from '@adhese/sdk-shared';\nimport { createAsyncHook, createPassiveHook } from '../../hooks/createHook';\n\nexport function useSlotHooks({ setup }: AdheseSlotOptions, slotContext: Ref<UnwrapRef<AdheseSlot | null>>, id: string): {\n runOnSlotRender: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnRequest: ReturnType<typeof createAsyncHook<void>>[0];\n runOnDispose: ReturnType<typeof createPassiveHook<void>>[0];\n} {\n const [runOnSlotRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>(`onRender:${id}`);\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook(`onRequest:${id}`);\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook(`onDispose:${id}`);\n\n setup?.(slotContext, {\n onRender,\n onDispose,\n onRequest,\n });\n\n onDispose(() => {\n disposeOnRender();\n disposeOnRequest();\n disposeOnDispose();\n });\n\n return { runOnSlotRender, runOnRequest, runOnDispose };\n}\n","import { type Ref, type UnwrapRef, computed, effectScope, reactive, ref, uniqueId, waitForDomLoad, watch } from '@adhese/sdk-shared';\nimport { doNothing, isDeepEqual } from 'remeda';\nimport type { AdheseAd } 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 { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport { logger } from '../../logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\nimport { useSlotHooks } from './useSlotHooks';\n\nconst renderFunctions: Record<RenderMode, (ad: AdheseAd, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n none: doNothing,\n};\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n const mergedOptions = {\n renderMode: 'iframe',\n ...slotOptions,\n } satisfies AdheseSlotOptions;\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlot | null>(null);\n const options = runOnSlotCreate(mergedOptions);\n\n const id = uniqueId();\n\n const { runOnSlotRender, runOnDispose, runOnRequest } = useSlotHooks(options, slotContext, id);\n\n const {\n containingElement,\n slot,\n context,\n renderMode,\n } = mergedOptions;\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<AdheseAd | 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 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 isDisposed = ref(false);\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value || isDisposed.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n options,\n element,\n });\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if ((!newAd || (oldAd && isDeepEqual(newAd, oldAd))) && status.value === 'rendered')\n return;\n\n if (newIsInViewport)\n await render(newAd ?? undefined);\n });\n\n watch(isInViewport, (value) => {\n options.onViewabilityChanged?.(value);\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<AdheseAd | null> {\n status.value = 'loading';\n\n await runOnRequest();\n\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n if (response) {\n ad.value = response;\n\n if (!originalAd.value)\n originalAd.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n }\n\n return response;\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n status.value = 'rendering';\n\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (!renderAd) {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n return null;\n }\n\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnSlotRender(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 renderFunctions[renderMode](renderAd, element.value);\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 status.value = 'rendered';\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 runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n onInit(async () => {\n status.value = 'initialized';\n\n if (options.lazyLoading)\n return;\n\n ad.value = await requestAd();\n });\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n render,\n request: requestAd,\n dispose,\n });\n\n watch(state, (newState) => {\n slotContext.value = newState;\n }, {\n deep: true,\n immediate: true,\n });\n\n return state;\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 '@adhese/sdk-shared';\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 === 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 === slot.name));\n}\n","import type { Merge } from '@adhese/sdk-shared';\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 AdheseSlotManager = {\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\n/**\n * Creates a new slot manager instance. This slot manager instance can be used to manage all slots in the Adhese\n * instance. It will automatically add all slots that are passed in the `initialSlots` array.\n */\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): AdheseSlotManager {\n context.slots = new Map<string, AdheseSlot>();\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(context.slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n if (get(slot.name)) {\n slot.dispose();\n\n throw new Error(`Slot with the name: ${slot.name} already exists. Create a new slot with a different format, slot, or the location.`);\n }\n\n function onDispose(): void {\n context.slots.delete(slot.id);\n logger.debug('Slot removed', {\n slot,\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n context.slots.set(slot.id, slot);\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(context.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 context.slots.set(slot.id, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return getAll().find(slot => slot.name === name);\n }\n\n function dispose(): void {\n for (const slot of context.slots.values())\n slot.dispose();\n\n context.slots.clear();\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","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\n/**\n * Creates the parameters map with a set of default parameters.\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\n/**\n * Sets up logging based on the provided options. If debug is enabled, the log level threshold is set to debug.\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\n/**\n * Checks if the current page is in preview mode.\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 { awaitTimeout, createEventManager, effectScope, reactive, watch } from '@adhese/sdk-shared';\nimport { version } 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, AdheseContextState, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\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 {AdheseOptions} The options to create the Adhese instance with. See the {@link AdheseOptions} type for more information.\n *\n * @return 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 eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive<AdheseContextState>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n options: mergedOptions,\n logger,\n isDisposed: false,\n parameters: new Map(),\n events: createEventManager(),\n slots: new Map(),\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version,\n onInit,\n onDispose,\n onRequest,\n onResponse,\n onSlotCreate,\n });\n }\n\n context.events = createEventManager();\n\n watch(() => 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 (newParameters) => {\n context.events?.parametersChange.dispatch(newParameters);\n },\n {\n deep: true,\n },\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 fetchAllUnrenderedSlots();\n }\n\n watch(() => context.consent, (newConsent) => {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n\n context.events?.consentChange.dispatch(newConsent);\n }, {\n immediate: true,\n });\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n context.getAll = getAll;\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n context.get = get;\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n return slotManager.add(slotOptions);\n }\n context.addSlot = addSlot;\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 await fetchAllUnrenderedSlots();\n\n return domSlots;\n }\n context.findDomSlots = findDomSlots;\n\n watch(() => context.debug, async (newDebug) => {\n if (newDebug) {\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 immediate: true,\n });\n\n async function fetchAllUnrenderedSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading && !slot.ad);\n\n if (slots.length === 0)\n return;\n\n await Promise.allSettled(slots.map(slot => slot.request()));\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 fetchAllUnrenderedSlots();\n });\n\n function dispose(): void {\n context.isDisposed = true;\n\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 context.dispose = dispose;\n\n onInit(async () => {\n await awaitTimeout(0);\n\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAllUnrenderedSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await context?.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 context;\n })!;\n}\n"],"names":["createLogger","debounce","name","module","toValue","ref","computed","round","watch","runOnRequest","onRequest","runOnDispose","onDispose","doNothing","effectScope","uniqueId","reactive","requestAd","isDisposed","isDeepEqual","extRequestAd","waitForDomLoad","add","_a","findDomSlots","extFindDomSlots","createEventManager","awaitTimeout"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,72 +3,6 @@ import { Ref, Merge, MaybeRef, UrlString, EventManager } from '@adhese/sdk-share
3
3
  import * as zod from 'zod';
4
4
  import { TypeOf, ZodType } from 'zod';
5
5
 
6
- declare class Config {
7
- auto?: boolean;
8
- debug?: boolean;
9
- renderFile?: string;
10
- cdn?: string;
11
- msgFile?: string;
12
- root?: string;
13
- to?: number;
14
- constructor(options?: {
15
- auto?: boolean;
16
- debug?: boolean;
17
- renderFile?: string;
18
- cdn?: string;
19
- msgFile?: string;
20
- root?: string;
21
- to?: number;
22
- });
23
- }
24
- declare class Position {
25
- html: string;
26
- id: string;
27
- src: string;
28
- meta?: Record<string, unknown>;
29
- config?: Record<string, unknown>;
30
- constructor(config: {
31
- id: string;
32
- src?: string;
33
- html: string;
34
- config?: PosConfig;
35
- });
36
- }
37
- declare class PosConfig {
38
- id: string;
39
- dest: string;
40
- constructor(posIDorObj: string | {
41
- bg?: string;
42
- css?: string;
43
- dest?: string;
44
- h?: number;
45
- id?: string;
46
- size?: string;
47
- tgt?: string;
48
- w?: number;
49
- z?: number;
50
- supports?: Record<string, unknown>;
51
- }, destID?: string, baseConf?: {
52
- bg?: string;
53
- css?: string;
54
- dest?: string;
55
- h?: number;
56
- id?: string;
57
- size?: string;
58
- tgt?: string;
59
- w?: number;
60
- z?: number;
61
- supports?: Record<string, unknown>;
62
- });
63
- }
64
-
65
- type SafeFrame = {
66
- config: Config;
67
- addPosition(positions: AdheseAd, element: HTMLElement): Position;
68
- render(position: Position): Promise<void>;
69
- dispose(): void;
70
- };
71
-
72
6
  declare const baseSchema: zod.ZodObject<{
73
7
  adDuration: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
74
8
  adFormat: zod.ZodOptional<zod.ZodString>;
@@ -260,7 +194,7 @@ declare function createPassiveHook<Argument = void, Callback extends (arg: Argum
260
194
  dispose: () => void
261
195
  ];
262
196
 
263
- type RenderMode = 'iframe' | 'inline';
197
+ type RenderMode = 'iframe' | 'inline' | 'none';
264
198
  type AdheseSlotOptions = {
265
199
  /**
266
200
  * The format code of the slot. Used to find the correct element on the page to render the ad in. If the format is a
@@ -572,10 +506,6 @@ type AdheseOptions = {
572
506
  * The query detector options for the Adhese instance.
573
507
  */
574
508
  queries?: Record<string, string>;
575
- /**
576
- * Enable rendering ads in a SafeFrame.
577
- */
578
- safeFrame?: boolean;
579
509
  /**
580
510
  * The plugins that are used for the Adhese instance. These plugins are called with the Adhese context and run during
581
511
  * the initialization of the Adhese instance.
@@ -659,10 +589,6 @@ type BaseAdhese = {
659
589
  * Options passed to the Adhese instance.
660
590
  */
661
591
  options: Readonly<MergedOptions>;
662
- /**
663
- * The SafeFrame instance that is used for rendering ads in a SafeFrame.
664
- */
665
- safeFrame?: SafeFrame;
666
592
  /**
667
593
  * Is the instance disposed
668
594
  */
@@ -691,7 +617,7 @@ type BaseAdhese = {
691
617
  */
692
618
  dispose(): void;
693
619
  };
694
- type ReadonlyProps = 'options' | 'safeFrame' | 'isDisposed' | 'logger' | 'events' | 'get' | 'getAll' | 'addSlot' | 'findDomSlots' | 'dispose' | 'slots';
620
+ type ReadonlyProps = 'options' | 'isDisposed' | 'logger' | 'events' | 'get' | 'getAll' | 'addSlot' | 'findDomSlots' | 'dispose' | 'slots';
695
621
  type Adhese = Omit<BaseAdhese, ReadonlyProps> & Readonly<Pick<BaseAdhese, ReadonlyProps>>;
696
622
  type AdheseContextState = Omit<BaseAdhese, 'options'> & {
697
623
  readonly options: MergedOptions;
package/dist/index.js CHANGED
@@ -1,59 +1,7 @@
1
- import { uniqueId, createLogger, toValue, ref, computed, watch, effectScope, reactive, waitForDomLoad, createEventManager, awaitTimeout } from "@adhese/sdk-shared";
2
- import { debounce, round, isDeepEqual } from "remeda";
3
- function createSafeFrame({
4
- renderFile,
5
- context
6
- }) {
7
- const safeFrame = window.$sf;
8
- if (!safeFrame)
9
- throw new Error("SafeFrame not found");
10
- const adhesePositions = /* @__PURE__ */ new Set();
11
- const config = new safeFrame.host.Config({
12
- auto: false,
13
- debug: context.debug,
14
- renderFile
15
- });
16
- function addPosition(ad, element) {
17
- var _a;
18
- if (!safeFrame)
19
- throw new Error("SafeFrame not found");
20
- const html = ad.ext === "js" && ad.body ? ad.body : ad.tag;
21
- if (typeof html !== "string")
22
- throw new Error("Ad tag is not a string");
23
- const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;
24
- element.id = elementId;
25
- const position = new safeFrame.host.Position({
26
- id: elementId,
27
- html,
28
- src: ad.ext === "js" ? (_a = ad.swfSrc) == null ? void 0 : _a.href : void 0,
29
- config: new safeFrame.host.PosConfig({
30
- id: elementId,
31
- w: Number(ad.width),
32
- h: Number(ad.height),
33
- size: `${Number(ad.width)}x${Number(ad.height)}`,
34
- tgt: html.includes('target="_self"') ? "_self" : "_blank",
35
- dest: elementId
36
- })
37
- });
38
- adhesePositions.add(position);
39
- return position;
40
- }
41
- async function render(position) {
42
- if (!safeFrame)
43
- throw new Error("SafeFrame not found");
44
- safeFrame.host.render(position);
45
- }
46
- function dispose() {
47
- }
48
- return {
49
- config,
50
- addPosition,
51
- render,
52
- dispose
53
- };
54
- }
1
+ import { createLogger, toValue, ref, computed, watch, effectScope, uniqueId, reactive, waitForDomLoad, createEventManager, awaitTimeout } from "@adhese/sdk-shared";
2
+ import { debounce, round, isDeepEqual, doNothing } from "remeda";
55
3
  const name = "@adhese/sdk";
56
- const version = "0.14.1";
4
+ const version = "0.15.0";
57
5
  function renderIframe(ad, element) {
58
6
  const iframe = document.createElement("iframe");
59
7
  iframe.srcdoc = `
@@ -494,21 +442,26 @@ function useSlotHooks({ setup }, slotContext, id) {
494
442
  }
495
443
  const renderFunctions = {
496
444
  iframe: renderIframe,
497
- inline: renderInline
445
+ inline: renderInline,
446
+ none: doNothing
498
447
  };
499
448
  function createSlot(slotOptions) {
500
449
  const scope = effectScope();
450
+ const mergedOptions = {
451
+ renderMode: "iframe",
452
+ ...slotOptions
453
+ };
501
454
  return scope.run(() => {
502
455
  const slotContext = ref(null);
503
- const options = runOnSlotCreate(slotOptions);
456
+ const options = runOnSlotCreate(mergedOptions);
504
457
  const id = uniqueId();
505
458
  const { runOnSlotRender, runOnDispose: runOnDispose2, runOnRequest: runOnRequest2 } = useSlotHooks(options, slotContext, id);
506
459
  const {
507
460
  containingElement,
508
461
  slot,
509
462
  context,
510
- renderMode = "iframe"
511
- } = options;
463
+ renderMode
464
+ } = mergedOptions;
512
465
  const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));
513
466
  let queryDetector = null;
514
467
  if (typeof options.format !== "string") {
@@ -607,12 +560,7 @@ function createSlot(slotOptions) {
607
560
  }
608
561
  if (context.debug)
609
562
  element.value.style.position = "relative";
610
- if (context.safeFrame && renderAd && renderMode === "iframe") {
611
- const position = context.safeFrame.addPosition(renderAd, element.value);
612
- await context.safeFrame.render(position);
613
- } else {
614
- renderFunctions[renderMode](renderAd, element.value);
615
- }
563
+ renderFunctions[renderMode](renderAd, element.value);
616
564
  if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {
617
565
  impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);
618
566
  logger.debug(`Impression tracking pixel fired for ${name2.value}`);
@@ -838,7 +786,6 @@ function createAdhese(options) {
838
786
  consent: false,
839
787
  logReferrer: true,
840
788
  logUrl: true,
841
- safeFrame: false,
842
789
  eagerRendering: false,
843
790
  viewabilityTracking: true,
844
791
  plugins: [],
@@ -873,10 +820,6 @@ function createAdhese(options) {
873
820
  });
874
821
  }
875
822
  context.events = createEventManager();
876
- context.safeFrame = options.safeFrame ? createSafeFrame({
877
- renderFile: `${mergedOptions.poolHost}/sf/r.html`,
878
- context
879
- }) : void 0;
880
823
  watch(() => context.location, (newLocation) => {
881
824
  var _a;
882
825
  (_a = context.events) == null ? void 0 : _a.locationChange.dispatch(newLocation);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../safeframe/src/main.ts","../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/logger/logger.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onSlotCreate.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/useSlotHooks.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":["import { uniqueId } from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext } from '@adhese/sdk';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: AdheseAd, 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: AdheseAd, 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 { AdheseAd } from '@adhese/sdk';\n\nexport function renderIframe(ad: AdheseAd, 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: AdheseAd, 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 { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\n","import { debounce } from 'remeda';\nimport { logger } from '../logger/logger';\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 type { AdMultiRequestOptions } from '../requestAds/requestAds';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdMultiRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { AdheseAd } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import { logger } from '../logger/logger';\nimport type { AdheseAd } from './requestAds.schema';\n\n/**\n * Request preview ads for the given account. This function will only return items when there are preview objects in the\n * URL detected.\n */\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<AdheseAd>> {\n const previewObjects = getPreviewObjects();\n\n const [list, adSchema] = await Promise.all([\n 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 import('./requestAds.schema').then(module => module.adSchema),\n ]);\n\n return adSchema.array().parse(list\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 .flatMap(response => response.value.map(item => ({\n ...item,\n preview: true,\n })))) as ReadonlyArray<AdheseAd>;\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 '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport type { AdMultiRequestOptions } from './requestAds';\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,\n ...options\n}: Omit<AdMultiRequestOptions, '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: context.parameters && parseParameters(context.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(context.options.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<AdMultiRequestOptions, '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, toValue } from '@adhese/sdk-shared';\nimport { debounce } from 'remeda';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport type { AdheseAd } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * Slot you want to fetch the ad for\n */\n slot: {\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n };\n context: AdheseContext;\n};\n\nexport type AdMultiRequestOptions = Omit<AdRequestOptions, 'slot'> & {\n slots: ReadonlyArray<AdRequestOptions['slot']>;\n};\n\nconst batch = new Map<string, {\n options: AdRequestOptions;\n resolve(ad: AdheseAd | null): void;\n}>();\n\n/**\n * Debounced function to request ads in batches. This function is debounced to prevent multiple requests for the same ad.\n */\nconst runRequestAdsBatch = debounce(async (context: AdheseContext) => {\n if (batch.size === 0)\n return [];\n\n const ads = await requestAds({\n slots: Array.from(batch.values()).map(({ options }) => options.slot),\n context,\n });\n\n for (const { options, resolve } of batch.values()) {\n const ad = ads.find(({ slotName }) => toValue(slotName) === toValue(options.slot.name));\n\n if (ad)\n resolve(ad);\n else\n resolve(null);\n }\n\n batch.clear();\n\n return ads;\n}, {\n waitMs: 20,\n timing: 'trailing',\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(options: AdRequestOptions): Promise<AdheseAd | null> {\n const promise = new Promise<AdheseAd | null>((resolve) => {\n batch.set(toValue(options.slot.name), { options, resolve });\n },\n );\n\n await runRequestAdsBatch.call(options.context);\n\n return promise;\n}\n\n/**\n * Request multiple ads from the API. If you need to fetch a single ad use the `requestAd` function.\n */\nexport async function requestAds(requestOptions: AdMultiRequestOptions): Promise<ReadonlyArray<AdheseAd>> {\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, parseResponse] = await Promise.all([\n context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options),\n requestPreviews(context.options.account),\n import('./requestAds.schema').then(module => module.parseResponse),\n ]);\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","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 '@adhese/sdk-shared';\nimport { round } from 'remeda';\nimport type { AdheseAd, AdheseContext } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { logger } from '../../logger/logger';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<AdheseAd | 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 }, 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 '@adhese/sdk-shared';\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 type { AdheseAd, AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport type { Ref, UnwrapRef } from '@adhese/sdk-shared';\nimport { createAsyncHook, createPassiveHook } from '../../hooks/createHook';\n\nexport function useSlotHooks({ setup }: AdheseSlotOptions, slotContext: Ref<UnwrapRef<AdheseSlot | null>>, id: string): {\n runOnSlotRender: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnRequest: ReturnType<typeof createAsyncHook<void>>[0];\n runOnDispose: ReturnType<typeof createPassiveHook<void>>[0];\n} {\n const [runOnSlotRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>(`onRender:${id}`);\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook(`onRequest:${id}`);\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook(`onDispose:${id}`);\n\n setup?.(slotContext, {\n onRender,\n onDispose,\n onRequest,\n });\n\n onDispose(() => {\n disposeOnRender();\n disposeOnRequest();\n disposeOnDispose();\n });\n\n return { runOnSlotRender, runOnRequest, runOnDispose };\n}\n","import { type Ref, type UnwrapRef, computed, effectScope, reactive, ref, uniqueId, waitForDomLoad, watch } from '@adhese/sdk-shared';\nimport { isDeepEqual } from 'remeda';\nimport type { AdheseAd } 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 { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport { logger } from '../../logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\nimport { useSlotHooks } from './useSlotHooks';\n\nconst renderFunctions: Record<RenderMode, (ad: AdheseAd, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlot | null>(null);\n const options = runOnSlotCreate(slotOptions);\n\n const id = uniqueId();\n\n const { runOnSlotRender, runOnDispose, runOnRequest } = useSlotHooks(options, slotContext, id);\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<AdheseAd | 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 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 isDisposed = ref(false);\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value || isDisposed.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n options,\n element,\n });\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if ((!newAd || (oldAd && isDeepEqual(newAd, oldAd))) && status.value === 'rendered')\n return;\n\n if (newIsInViewport)\n await render(newAd ?? undefined);\n });\n\n watch(isInViewport, (value) => {\n options.onViewabilityChanged?.(value);\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<AdheseAd | null> {\n status.value = 'loading';\n\n await runOnRequest();\n\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n if (response) {\n ad.value = response;\n\n if (!originalAd.value)\n originalAd.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n }\n\n return response;\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n status.value = 'rendering';\n\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (!renderAd) {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n return null;\n }\n\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnSlotRender(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 status.value = 'rendered';\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 runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n onInit(async () => {\n status.value = 'initialized';\n\n if (options.lazyLoading)\n return;\n\n ad.value = await requestAd();\n });\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n render,\n request: requestAd,\n dispose,\n });\n\n watch(state, (newState) => {\n slotContext.value = newState;\n }, {\n deep: true,\n immediate: true,\n });\n\n return state;\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 '@adhese/sdk-shared';\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 === 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 === slot.name));\n}\n","import type { Merge } from '@adhese/sdk-shared';\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 AdheseSlotManager = {\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\n/**\n * Creates a new slot manager instance. This slot manager instance can be used to manage all slots in the Adhese\n * instance. It will automatically add all slots that are passed in the `initialSlots` array.\n */\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): AdheseSlotManager {\n context.slots = new Map<string, AdheseSlot>();\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(context.slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose'>): Readonly<AdheseSlot> {\n // console.log(options, context.slots, names.value);\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n if (get(slot.name)) {\n slot.dispose();\n\n throw new Error(`Slot with the name: ${slot.name} already exists. Create a new slot with a different format, slot, or the location.`);\n }\n\n function onDispose(): void {\n context.slots.delete(slot.id);\n logger.debug('Slot removed', {\n slot,\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n context.slots.set(slot.id, slot);\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(context.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 context.slots.set(slot.id, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return getAll().find(slot => slot.name === name);\n }\n\n function dispose(): void {\n for (const slot of context.slots.values())\n slot.dispose();\n\n context.slots.clear();\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","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\n/**\n * Creates the parameters map with a set of default parameters.\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\n/**\n * Sets up logging based on the provided options. If debug is enabled, the log level threshold is set to debug.\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\n/**\n * Checks if the current page is in preview mode.\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 { awaitTimeout, createEventManager, effectScope, reactive, watch } from '@adhese/sdk-shared';\nimport { createSafeFrame } from '@safeframe';\nimport { version } 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, AdheseContextState, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\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 {AdheseOptions} The options to create the Adhese instance with. See the {@link AdheseOptions} type for more information.\n *\n * @return 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<AdheseContextState>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n options: mergedOptions,\n logger,\n isDisposed: false,\n parameters: new Map(),\n events: createEventManager(),\n slots: new Map(),\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version,\n onInit,\n onDispose,\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 watch(() => 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 (newParameters) => {\n context.events?.parametersChange.dispatch(newParameters);\n },\n {\n deep: true,\n },\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 fetchAllUnrenderedSlots();\n }\n\n watch(() => context.consent, (newConsent) => {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n\n context.events?.consentChange.dispatch(newConsent);\n }, {\n immediate: true,\n });\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n context.getAll = getAll;\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n context.get = get;\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n return slotManager.add(slotOptions);\n }\n context.addSlot = addSlot;\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 await fetchAllUnrenderedSlots();\n\n return domSlots;\n }\n context.findDomSlots = findDomSlots;\n\n watch(() => context.debug, async (newDebug) => {\n if (newDebug) {\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 immediate: true,\n });\n\n async function fetchAllUnrenderedSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading && !slot.ad);\n\n if (slots.length === 0)\n return;\n\n await Promise.allSettled(slots.map(slot => slot.request()));\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 fetchAllUnrenderedSlots();\n });\n\n function dispose(): void {\n context.isDisposed = true;\n\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 context.dispose = dispose;\n\n onInit(async () => {\n await awaitTimeout(0);\n\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAllUnrenderedSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await context?.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 context;\n })!;\n}\n"],"names":["name","runOnRequest","onRequest","runOnDispose","onDispose","requestAd","isDisposed","extRequestAd","add","_a","findDomSlots","extFindDomSlots"],"mappings":";;AAgBO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,YAAY,OAAO;AAEzB,MAAI,CAAC;AACG,UAAA,IAAI,MAAM,qBAAqB;AAEjC,QAAA,sCAAsB;AAE5B,QAAM,SAAS,IAAI,UAAU,KAAK,OAAO;AAAA,IACvC,MAAM;AAAA,IACN,OAAO,QAAQ;AAAA,IACf;AAAA,EAAA,CACD;AAEQ,WAAA,YAAY,IAAc,SAAgC;;AACjE,QAAI,CAAC;AACG,YAAA,IAAI,MAAM,qBAAqB;AAEjC,UAAA,OAAQ,GAAG,QAAQ,QAAQ,GAAG,OAAQ,GAAG,OAAO,GAAG;AAEzD,QAAI,OAAO,SAAS;AACZ,YAAA,IAAI,MAAM,wBAAwB;AAEpC,UAAA,YAAY,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,SAAU,CAAA;AAEzD,YAAQ,KAAK;AAEb,UAAM,WAAW,IAAI,UAAU,KAAK,SAAS;AAAA,MAC3C,IAAI;AAAA,MACJ;AAAA,MACA,KAAK,GAAG,QAAQ,QAAO,QAAG,WAAH,mBAAW,OAAO;AAAA,MACzC,QAAQ,IAAI,UAAU,KAAK,UAAU;AAAA,QACnC,IAAI;AAAA,QACJ,GAAG,OAAO,GAAG,KAAK;AAAA,QAClB,GAAG,OAAO,GAAG,MAAM;AAAA,QACnB,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC;AAAA,QAC9C,KAAK,KAAK,SAAS,gBAAgB,IAAI,UAAU;AAAA,QACjD,MAAM;AAAA,MAAA,CACP;AAAA,IAAA,CACF;AAED,oBAAgB,IAAI,QAAQ;AAErB,WAAA;AAAA,EACT;AAEA,iBAAe,OAAO,UAAmC;AACvD,QAAI,CAAC;AACG,YAAA,IAAI,MAAM,qBAAqB;AAE7B,cAAA,KAAK,OAAO,QAAQ;AAAA,EAChC;AAEA,WAAS,UAAgB;AAAA,EACzB;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;AC/EgB,SAAA,aAAa,IAAc,SAA4B;AAC/D,QAAA,SAAS,SAAS,cAAc,QAAQ;AAE9C,SAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAaN,OAAO,GAAG,GAAG,CAAC;AAAA;AAAA,QAElB,WAAW,QAAQ,GAAG,EAAE,KAAK;AAEnC,SAAO,MAAM,SAAS;AACtB,SAAO,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,KAAK,OAAO;AAClD,SAAO,MAAM,SAAS,GAAG,SAAS,GAAG,GAAG,MAAM,OAAO;AACrD,UAAQ,gBAAgB,MAAM;AAChC;AAEgB,SAAA,aAAa,IAAc,SAA4B;AAC7D,UAAA,YAAY,OAAO,GAAG,GAAG;AACnC;AAEgB,SAAA,aACd,UACA,QACA,MACQ;AACD,SAAA,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,KAAK,EAAE,IAAI,MAAM;AACtD;AChCO,SAAS,iBAAiB,KAAqC;AAC9D,QAAA,MAAM,SAAS,cAAc,KAAK;AAEpC,MAAA,MAAM,IAAI;AACd,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,QAAQ;AAClB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,WAAW;AACrB,MAAI,MAAM,MAAM;AAET,SAAA,SAAS,KAAK,YAAY,GAAG;AACtC;ACfO,MAAM,SAAS,aAAa;AAAA,EACjC,OAAO,GAAG,IAAI,IAAI,OAAO;AAC3B,CAAC;ACyBM,SAAS,oBACd;AAAA,EACE;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF,IAA2B,IACZ;AACf,QAAM,WAAW,IAAI;AAAA,IACnB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,WAAW,KAAK,CAAC,CAAC;AAAA,EAAA;AAG/E,WAAS,WAAmB;AAC1B,eAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACjD,UAAA,OAAO,WAAW,KAAK,EAAE;AACpB,eAAA;AAAA,IACX;AAEO,WAAA;AAAA,EACT;AAEM,QAAA,iBAAiB,SAAS,MAAY;AAErC,UAAA,qCAAW;AAEhB,WAAO,MAAM,iBAAiB,SAAU,CAAA,EAAE;AAAA,EAAA,GACzC;AAAA,IACD,QAAQ;AAAA,EAAA,CACT;AAED,MAAI,UAAU;AACD,eAAA,SAAS,SAAS,OAAO;AAC5B,YAAA,iBAAiB,UAAU,eAAe,IAAI;AAAA,EACxD;AAEA,WAAS,UAAgB;AACZ,eAAA,SAAS,SAAS,OAAO;AAC5B,YAAA,oBAAoB,UAAU,eAAe,IAAI;AAAA,EAC3D;AAEO,SAAA;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EAAA;AAEJ;AC7EA,MAAM,8BAAc;AAEb,SAAS,gBAAsB;AACpC,UAAQ,MAAM;AAChB;AAEO,SAAS,gBAMdA,OACA;AAAA,EACE;AAAA,EACA;AACF,IAGI,IAKF;AACF,UAAQ,IAAIA,OAAU,oBAAA,IAAe,CAAA;AAE/B,QAAA,MAAO,OAAO,QAAQ;AAC1B,QAAI,eAAyB;AAE7B,eAAW,YAAY,QAAQ,IAAIA,KAAI,KAAK,CAAC;AAE3B,qBAAA,MAAM,SAAS,YAAY,KAAkB;AAEvD,mCAAA,QAAQ,IAAIA,KAAI;AAEjB,WAAA;AAAA,EAAA;AAGT,WAAS,UAAgB;AACvB,YAAQ,OAAOA,KAAI;AAAA,EACrB;AAEO,SAAA,CAAC,KAAK,CAAC,aAAyB,IAAc,UAAU,EAAE,MAAAA,OAAM,MAAA,CAAO,GAAG,OAAO;AAC1F;AAEO,SAAS,eAIdA,OACA;AAAA,EACE;AAAA,EACA;AACF,IAGI,IAKF;AACF,UAAQ,IAAIA,OAAU,oBAAA,IAAe,CAAA;AAE/B,QAAA,MAAO,CAAC,QAAQ;AACpB,QAAI,eAAyB;AAE7B,UAAM,oBAAqC,CAAA;AAE3C,eAAW,YAAY,QAAQ,IAAIA,KAAI,KAAK,CAAA,GAAI;AAC9C,UAAI,gBAAgB,QAAQ;AAC1B,0BAAkB,KAAK,QAAoB;AAAA;AAE5B,uBAAA,SAAS,YAAY,KAAiB;AAAA,IACzD;AAGQ,YAAA,WAAW,kBAAkB,IAAI,CAAY,aAAA,SAAS,YAAY,CAAa,CAAC,EAAE,MAAM,QAAQ,KAAK;AAErG,mCAAA,QAAQ,IAAIA,KAAI;AAEjB,WAAA;AAAA,EAAA;AAGT,WAAS,UAAgB;AACvB,YAAQ,OAAOA,KAAI;AAAA,EACrB;AAEO,SAAA,CAAC,KAAK,CAAC,aAAyB,IAAc,UAAU,EAAE,MAAAA,OAAM,MAAA,CAAO,GAAG,OAAO;AAC1F;AAEO,SAAS,kBAIdA,OACA;AAAA,EACE;AAAA,EACA;AACF,IAGI,IAKF;AACF,UAAQ,IAAIA,OAAU,oBAAA,IAAe,CAAA;AAErC,WAAS,IAAI,KAAqB;AAEhC,YAAQ,WAAW,MAAM,KAAK,QAAQ,IAAIA,KAAI,KAAK,EAAE,EAAE,IAAI,CAAA,aAAY,SAAS,GAAG,CAAa,CAAC,EAAE,MAAM,QAAQ,KAAK;AAE9G,mCAAA,QAAQ,IAAIA,KAAI;AAAA,EAC1B;AAEA,WAAS,UAAgB;AACvB,YAAQ,OAAOA,KAAI;AAAA,EACrB;AAEO,SAAA,CAAC,KAAK,CAAC,aAAyB,IAAc,UAAU,EAAE,MAAAA,OAAM,MAAA,CAAO,GAAG,OAAO;AAC1F;AAEA,SAAS,gBAAgB,UAA6B;AAC7C,SAAA,SAAS,YAAY,SAAS;AACvC;AAEA,SAAS,IAA+B,UAAoB;AAAA,EAC1D,MAAAA;AAAA,EACA;AACF,GAGe;AACP,QAAA,UAAU,QAAQ,IAAIA,KAAI;AAE5B,MAAA;AACF,YAAQ,IAAI,QAAQ;AAAA;AAEpB,YAAQ,IAAIA,OAAM,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAEvC,iCAAQ;AAER,SAAO,MAAM;;AACX,kBAAQ,IAAIA,KAAI,MAAhB,mBAAmB,OAAO;AAAA,EAAQ;AAEtC;AClJA,IAAI,uBAAuB,MAAY;AAAC;AACxC,IAAI,SAAS;AACb,MAAM,aAAa,IAAI,QAAc,CAAC,YAAY;AACzB,yBAAA;AACzB,CAAC;AAED,MAAM,CAAC,WAAW,MAAM,IAAI,eAAe,UAAU;AAAA,EACnD,MAAM,WAAW;AACN,aAAA;AAEY;AAErB,2CAAW;AAAA,EACb;AAAA,EACA,QAAQ;AACF,QAAA;AACQ;EACd;AACF,CAAC;ACjBD,MAAM,CAAC,cAAc,SAAS,IAAI,gBAAuC,WAAW;ACApF,MAAM,CAAC,eAAe,UAAU,IAAI,gBAAyC,YAAY;ACIzF,eAAsB,gBAAgB,SAAmD;AACvF,QAAM,iBAAiB;AAEvB,QAAM,CAAC,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzC,QAAQ,WAAW,eAChB,OAAO,CAAA,kBAAiB,6BAA6B,aAAa,EAClE,IAAI,OAAO,kBAAkB;AAC5B,YAAM,WAAW,IAAI,IAAI,WAAW,OAAO,mDAAmD;AAC9F,eAAS,aAAa;AAAA,QACpB;AAAA,QACA,cAAc;AAAA,MAAA;AAGhB,YAAM,WAAW,MAAM,MAAM,SAAS,MAAM;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,MAAA,CACD;AAED,UAAI,CAAC,SAAS;AACL,eAAA,QAAQ,OAAO,IAAI,MAAM,yCAAyC,cAAc,uBAAuB,EAAE,CAAC;AAE5G,aAAA,MAAM,SAAS;IAAK,CAC5B,CAAC;AAAA,IACJ,OAAO,iCAAqB,EAAE,KAAK,CAAA,WAAU,OAAO,QAAQ;AAAA,EAAA,CAC7D;AAED,SAAO,SAAS,QAAQ,MAAM,KAC3B,OAAO,CAAC,aAAyF;AAC5F,QAAA,SAAS,WAAW,YAAY;AAC3B,aAAA,MAAM,SAAS,MAAgB;AAC/B,aAAA;AAAA,IACT;AACA,WAAO,SAAS,WAAW;AAAA,EAAA,CAC5B,EACA,QAAQ,cAAY,SAAS,MAAM,IAAI,CAAS,UAAA;AAAA,IAC/C,GAAG;AAAA,IACH,SAAS;AAAA,EAAA,EACT,CAAC,CAAC;AACR;AAEA,SAAS,oBAA2D;AAClE,QAAM,aAAa,IAAI,IAAI,OAAO,SAAS,IAAI;AAE/C,QAAM,iBAAgD,CAAA;AACtD,MAAI,gBAAwC,CAAA;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,WAAW,aAAa,WAAW;AAC5D,QAAI,QAAQ,6BAA6B,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AAC9E,qBAAe,KAAK,aAAa;AACjC,sBAAgB,CAAA;AAAA,IAClB;AAEA,kBAAc,GAAG,IAAI;AAAA,EACvB;AAEA,MAAI,OAAO,KAAK,aAAa,EAAE,SAAS;AACtC,mBAAe,KAAK,aAAa;AAE5B,SAAA;AACT;ACxDO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAA6D;AAC3D,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,OAAO,QAAQ,MAAM,IAAI,CAAS,UAAA;AAAA,MAChC,UAAU,QAAQ,KAAK,IAAI;AAAA,MAC3B,YAAY,gBAAgB,KAAK,UAAU;AAAA,IAAA,EAC3C;AAAA,IACF,YAAY,QAAQ,cAAc,gBAAgB,QAAQ,UAAU;AAAA,EAAA;AAG/D,SAAA,MAAM,GAAG,IAAI,IAAI,QAAQ,QAAQ,IAAI,EAAE,IAAI,QAAQ;AAAA,IACxD,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC5B,SAAS;AAAA;AAAA,MAEP,gBAAgB;AAAA,IAClB;AAAA,EAAA,CACD;AACH;AAEA,eAAsB,eAAe,EAAE,SAAS,SAAmE;AAC1G,SAAA,MAAM,IAAI,IAAI,GAAG,QAAQ,QAAQ,IAAI,WAAW,MAAM,IAAI,UAAQ,QAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,GAAG;AAAA,IAC3G,QAAQ;AAAA,IACR,SAAS;AAAA;AAAA,MAEP,gBAAgB;AAAA,IAClB;AAAA,EAAA,CACD;AACH;AAEO,SAAS,gBAA0D,YAA+C;AACvH,SAAO,OAAO,YAAY,MAAM,KAAK,WAAW,QAAA,CAAS,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM;AAC3E,QAAI,IAAI,WAAW;AACV,aAAA;AAEF,WAAA,KAAK,0BAA0B,GAAG,iEAAiE;AACnG,WAAA;AAAA,EACR,CAAA,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAmB;AACpC,QAAI,OAAO,UAAU;AACnB,aAAO,CAAC,KAAK,mBAAmB,KAAK,CAAM;AAE7C,WAAO,CAAC,KAAK,MAAM,IAAI,kBAAkB,CAAiB;AAAA,EAC3D,CAAA,CAAC;AACJ;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,eAAe;AAEd,SAAA,MAAM,WAAW,cAAc,GAAG;AAC3C;ACvCA,MAAM,4BAAY;AAQlB,MAAM,qBAAqB,SAAS,OAAO,YAA2B;AACpE,MAAI,MAAM,SAAS;AACjB,WAAO;AAEH,QAAA,MAAM,MAAM,WAAW;AAAA,IAC3B,OAAO,MAAM,KAAK,MAAM,OAAQ,CAAA,EAAE,IAAI,CAAC,EAAE,cAAc,QAAQ,IAAI;AAAA,IACnE;AAAA,EAAA,CACD;AAED,aAAW,EAAE,SAAS,QAAa,KAAA,MAAM,UAAU;AACjD,UAAM,KAAK,IAAI,KAAK,CAAC,EAAE,SAAS,MAAM,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAElF,QAAA;AACF,cAAQ,EAAE;AAAA;AAEV,cAAQ,IAAI;AAAA,EAChB;AAEA,QAAM,MAAM;AAEL,SAAA;AACT,GAAG;AAAA,EACD,QAAQ;AAAA,EACR,QAAQ;AACV,CAAC;AAKD,eAAsB,UAAU,SAAqD;AACnF,QAAM,UAAU,IAAI;AAAA,IAAyB,CAAC,YAAY;AAClD,YAAA,IAAI,QAAQ,QAAQ,KAAK,IAAI,GAAG,EAAE,SAAS,QAAA,CAAS;AAAA,IAC5D;AAAA,EAAA;AAGM,QAAA,mBAAmB,KAAK,QAAQ,OAAO;AAEtC,SAAA;AACT;AAKA,eAAsB,WAAW,gBAAyE;;AAClG,QAAA,UAAU,MAAM,aAAa,cAAc;AAE3C,QAAA,EAAE,QAAY,IAAA;AAEhB,MAAA;AACO,6CAAA,WAAA,mBAAQ,UAAU,SAAS;AAAA,MAClC,GAAG;AAAA,MACH;AAAA,IAAA;AAGF,UAAM,CAAC,UAAU,UAAU,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC5D,aAAQ,QAAQ,gBAAhB,mBAA6B,mBAAkB,SAC3C,gBAAgB,OAAO,IACvB,eAAe,OAAO;AAAA,MAC1B,gBAAgB,QAAQ,QAAQ,OAAO;AAAA,MACvC,OAAO,iCAAqB,EAAE,KAAK,CAAA,WAAU,OAAO,aAAa;AAAA,IAAA,CAClE;AAEM,WAAA,MAAM,qBAAqB,QAAQ;AAE1C,QAAI,CAAC,SAAS;AACN,YAAA,IAAI,MAAM,yBAAyB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAEnF,UAAM,SAAS,cAAe,MAAM,SAAS,KAAkB,CAAA;AACxD,WAAA,MAAM,aAAa,MAAM;AAEhC,QAAI,SAAS,SAAS;AACb,aAAA,KAAK,SAAS,SAAS,MAAM,IAAI,SAAS,WAAW,IAAI,YAAY,UAAU,kDAAkD,QAAQ;AAE5I,UAAA,kBAAkB,SAAS,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc;AACjE,YAAM,YAAY,OAAO,KAAK,QAAM,GAAG,UAAU,QAAQ,KAAK;AAEtD,aAAA;AAAA,QACN,UAAU,IAAG,uCAAW,aAAY,QAAQ;AAAA,QAC5C,GAAG;AAAA,MAAA;AAAA,IACL,CACD;AAED,QAAI,gBAAgB,SAAS;AACnB,oBAAA,WAAA,mBAAQ,gBAAgB,SAAS;AAErC,UAAA,eAAe,MAAM,cAAc;AAAA,MACvC,GAAG,OAAO,OAAO,CAAA,OAAM,CAAC,SAAS,KAAK,CAAA,YAAW,QAAQ,UAAU,GAAG,KAAK,CAAC;AAAA,MAC5E,GAAG;AAAA,IAAA,CACJ;AAED,QAAI,aAAa,WAAW;AACpB,YAAA,IAAI,MAAM,cAAc;AAExB,kBAAA,WAAA,mBAAQ,iBAAiB,SAAS;AAEnC,WAAA;AAAA,WAEF,OAAO;AACL,WAAA,MAAM,OAAO,KAAK,CAAC;AACjB,6CAAA,WAAA,mBAAQ,aAAa,SAAS;AAEjC,UAAA;AAAA,EACR;AACF;ACrIA,MAAM,CAAC,iBAAiB,YAAY,IAAI,eAAkC,cAAc;ACGjF,SAAS,uBACd,EAAE,SAAS,IAAI,MAAAA,OAAM,WASnB;AACF,MAAI,YAA2B;AACzB,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,GAAG,QAAQ,QAAQ;AAAA,EAAA;AAGf,QAAA,gBAAgB,IAA6B,IAAI;AAEvD,QAAM,YAAY,SAAS,MAAM,QAAQ,cAAc,KAAK,CAAC;AAE7D,QAAM,sBAAsB,IAAI,qBAAqB,CAAC,CAAC,KAAK,MAAM;AAChE,QAAI,QAAQ,QAAQ,uBAAuB,CAAC,cAAc,SAAS,IAAI;AACrE,YAAM,QAAQ,MAAM,MAAM,mBAAmB,CAAC;AAE1C,UAAA,SAAS,aAAa,CAAC,WAAW;AAEpC,oBAAY,WAAW,MAAM;;AACf,sBAAA;AAER,eAAA,QAAG,UAAH,mBAAU,2BAA2B;AACvC,0BAAc,QAAQ,iBAAiB,GAAG,MAAM,yBAAyB;AAEzE,mBAAO,MAAM,wCAAwCA,MAAK,KAAK,EAAE;AAAA,UACnE;AAAA,WACC,QAAQ;AAAA,MAAA,WAEJ,QAAQ,aAAa,WAAW;AACvC,qBAAa,SAAS;AACV,oBAAA;AAAA,MACd;AAAA,IACF;AAAA,EAAA,GACC;AAAA,IACD;AAAA,IACA,WAAW,MAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,GAAG,MAAM,IAAI,GAAG;AAAA,EAAA,CACxD;AAEQ,WAAA,QAAQ,YAAgC,YAA6C;AACxF,QAAA;AACF,0BAAoB,UAAU,UAAU;AAEtC,QAAA,cAAc,QAAQ,QAAQ;AAChC,0BAAoB,QAAQ,UAAU;AAExC,WAAO,MAAM;AACP,UAAA;AACF,4BAAoB,UAAU,UAAU;AAAA,IAAA;AAAA,EAE9C;AAEA,QAAM,SAAS,OAAO;AACtB,UAAQ,QAAQ,KAAK;AAEd,SAAA,CAAC,WAAW,MAAY;;AAC7B,wBAAc,UAAd,mBAAqB;AACrB,wBAAoB,WAAW;AAAA,EAAA,CAChC;AACH;AC5EO,SAAS,8BAA8B,EAAE,SAAS,WAMrD;;AACI,QAAA,eAAe,IAAI,KAAK;AAE9B,QAAM,6BAA6B,IAAI,qBAAqB,CAAC,YAAY;AACvE,iBAAa,QAAQ,QAAQ,KAAK,CAAA,UAAS,MAAM,cAAc;AAAA,EAAA,GAC9D;AAAA,IACD,cAAY,aAAQ,uBAAR,mBAA4B,eAAc;AAAA,IACtD,WAAW;AAAA,EAAA,CACZ;AAEQ,WAAA,QAAQ,YAAgC,YAA6C;AACxF,QAAA;AACF,iCAA2B,UAAU,UAAU;AAE7C,QAAA;AACF,iCAA2B,QAAQ,UAAU;AAE/C,WAAO,MAAM;AACP,UAAA;AACF,mCAA2B,UAAU,UAAU;AAAA,IAAA;AAAA,EAErD;AAEA,QAAM,SAAS,OAAO;AACtB,UAAQ,QAAQ,KAAK;AAEd,SAAA,CAAC,cAAc,MAAY;AAChC,+BAA2B,WAAW;AAAA,EAAA,CACvC;AACH;AClCO,SAAS,aAAa,EAAE,SAA4B,aAAgD,IAIzG;AACM,QAAA,CAAC,iBAAiB,UAAU,eAAe,IAAI,gBAA0B,YAAY,EAAE,EAAE;AACzF,QAAA,CAACC,eAAcC,YAAW,gBAAgB,IAAI,gBAAgB,aAAa,EAAE,EAAE;AAC/E,QAAA,CAACC,eAAcC,YAAW,gBAAgB,IAAI,kBAAkB,aAAa,EAAE,EAAE;AAEvF,iCAAQ,aAAa;AAAA,IACnB;AAAA,IACA,WAAAA;AAAA,IACA,WAAAF;AAAA,EAAA;AAGF,EAAAE,WAAU,MAAM;AACE;AACC;AACA;EAAA,CAClB;AAEM,SAAA,EAAE,iBAAiB,cAAAH,eAAc,cAAAE;AAC1C;ACXA,MAAM,kBAAoF;AAAA,EACxF,QAAQ;AAAA,EACR,QAAQ;AACV;AASO,SAAS,WAAW,aAA4C;AACrE,QAAM,QAAQ;AAEP,SAAA,MAAM,IAAI,MAAM;AACf,UAAA,cAAc,IAAuB,IAAI;AACzC,UAAA,UAAU,gBAAgB,WAAW;AAE3C,UAAM,KAAK;AAEL,UAAA,EAAE,iBAAiB,cAAAA,eAAc,cAAAF,cAAA,IAAiB,aAAa,SAAS,aAAa,EAAE;AAEvF,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACX,IAAA;AACE,UAAA,aAAa,SAAS,IAAI,IAAI,OAAO,QAAQ,QAAQ,cAAc,EAAE,CAAC,CAAC;AAC7E,QAAI,gBAAsC;AAEtC,QAAA,OAAO,QAAQ,WAAW,UAAU;AACtC,sBAAgB,oBAAoB;AAAA,QAClC,UAAU;AAAA,QACV,SAAS,OAAO,YAAY,QAAQ,OAAO,IAAI,CAAQ,SAAA,CAAC,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,MAAA,CAClF;AAAA,IACH;AAEA,UAAM,SAAS,IAAI,gBAAgB,cAAc,aAAa,QAAQ,MAAgB;AACtF,aAAS,cAAc,WAAyB;AAC9C,aAAO,QAAQ;AAAA,IACjB;AAEM,UAAA,KAAK,IAAqB,IAAI;AAC9B,UAAA,aAAa,IAAI,GAAG,KAAK;AAEzB,UAAAD,QAAO,SAAS,MAAM,aAAa,QAAQ,UAAU,OAAO,OAAO,IAAI,CAAC;AACxE,UAAAA,OAAM,OAAO,SAAS,YAAY;AACtC,UAAI,YAAY;AACd;AAEI,YAAA,QAAQ,MAAMK;AAEP;AAEb,SAAG,QAAQ;AACX,iBAAW,QAAQ;AAAA,IAAA,CACpB;AAED,UAAM,cAAc;AAEd,UAAAC,cAAa,IAAI,KAAK;AAC5B,UAAM,UAAU;AAAA,MAAS,MAAM;AAC7B,YAAI,EAAE,OAAO,sBAAsB,YAAY,CAAC;AACvC,iBAAA;AAEL,YAAA,CAAC,YAAY,SAASA,YAAW;AAC5B,iBAAA;AAET,eAAO,SAAS,cAA2B,wBAAwB,OAAO,KAAK,MAAM,iBAAiB,GAAG,OAAO,eAAe,IAAI,OAAO,EAAE,EAAE;AAAA,MAChJ;AAAA,IAAA;AAGA,UAAM,CAAC,cAAc,iCAAiC,IAAI,8BAA8B;AAAA,MACtF;AAAA,MACA;AAAA,IAAA,CACD;AAEK,UAAA,SAAS,IAAqC,cAAc;AAC5D,UAAA,CAAC,IAAI,YAAY,GAAG,OAAO,CAAC,OAAO,eAAe,GAAG,CAAC,KAAK,MAAM;AAChE,WAAA,CAAC,SAAU,SAAS,YAAY,OAAO,KAAK,MAAO,OAAO,UAAU;AACvE;AAEE,UAAA;AACI,cAAA,OAAO,SAAS,MAAS;AAAA,IAAA,CAClC;AAEK,UAAA,cAAc,CAAC,UAAU;;AAC7B,oBAAQ,yBAAR,iCAA+B;AAAA,IAAK,CACrC;AAEK,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,QACE,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,MAAAN;AAAA,MACA;AAAA,IAAA,CACD;AAEK,UAAA,iCAAiC,IAA6B,IAAI;AACxE,UAAM,sBAAsB,SAAS,MAAM,QAAQ,+BAA+B,KAAK,CAAC;AAExF,mBAAeK,cAAsC;AACnD,aAAO,QAAQ;AAEf,YAAMJ,cAAa;AAEb,YAAA,WAAW,MAAMM,UAAa;AAAA,QAClC,MAAM;AAAA,UACJ,MAAMP,MAAK;AAAA,UACX;AAAA,QACF;AAAA,QACA;AAAA,MAAA,CACD;AAED,UAAI,UAAU;AACZ,WAAG,QAAQ;AAEX,YAAI,CAAC,WAAW;AACd,qBAAW,QAAQ;AAEd,eAAA,QAAQ,WAAW,WAAW;AAAA,MACvC;AAEO,aAAA;AAAA,IACT;AAEA,mBAAe,OAAO,YAAoD;;AACxE,aAAO,QAAQ;AAEf,YAAM,eAAe;AACf,YAAA;AAEN,UAAI,WAAW,cAAc,GAAG,SAAS,WAAW,SAAS,MAAMK;AAEnE,UAAI,CAAC,UAAU;AACb,eAAO,QAAQ;AACf,eAAO,MAAM,4BAA4BL,MAAK,KAAK,EAAE;AAC9C,eAAA;AAAA,MACT;AAEW,mBAAA,aAAQ,mBAAR,iCAAyB,cAAa;AAEtC,iBAAA,MAAM,gBAAgB,QAAQ;AAErC,UAAA,CAAC,QAAQ,OAAO;AACZ,cAAA,QAAQ,oCAAoC,OAAO,KAAK;AACvD,eAAA,MAAM,OAAO,OAAO;AACrB,cAAA,IAAI,MAAM,KAAK;AAAA,MACvB;AAEA,UAAI,QAAQ;AACF,gBAAA,MAAM,MAAM,WAAW;AAEjC,UAAI,QAAQ,aAAa,YAAY,eAAe,UAAU;AAC5D,cAAM,WAAW,QAAQ,UAAU,YAAY,UAAU,QAAQ,KAAK;AAEhE,cAAA,QAAQ,UAAU,OAAO,QAAQ;AAAA,MAAA,OAEpC;AACH,wBAAgB,UAAU,EAAE,UAAU,QAAQ,KAAK;AAAA,MACrD;AAEA,UAAI,SAAS,qBAAqB,CAAC,+BAA+B,OAAO;AACxC,uCAAA,QAAQ,iBAAiB,SAAS,iBAAiB;AAElF,eAAO,MAAM,uCAAuCA,MAAK,KAAK,EAAE;AAAA,MAClE;AAEA,aAAO,MAAM,iBAAiB;AAAA,QAC5B,iBAAiB;AAAA,QACjB,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,MAAA,CACD;AAEO,oBAAA,aAAA,iCAAW,QAAQ;AAG3B,SAAG,QAAQ;AAEX,aAAO,QAAQ;AAEf,aAAO,QAAQ;AAAA,IACjB;AAEA,aAAS,eAAqB;AAC5B,UAAI,CAAC,QAAQ;AACX;AAEF,cAAQ,MAAM,YAAY;AAClB,cAAA,MAAM,MAAM,WAAW;AACvB,cAAA,MAAM,MAAM,QAAQ;AACpB,cAAA,MAAM,MAAM,SAAS;AAAA,IAC/B;AAEA,aAAS,UAAgB;;AACV;AAEb,2CAA+B,UAA/B,mBAAsC;AAEtC,SAAG,QAAQ;AAEuB;AACP;AAE3B,oBAAQ,cAAR;AAEA,qDAAe;AAEF,MAAAG;AAEb,MAAAG,YAAW,QAAQ;AAEnB,YAAM,KAAK;AAAA,IACb;AAEA,WAAO,YAAY;AACjB,aAAO,QAAQ;AAEf,UAAI,QAAQ;AACV;AAEC,SAAA,QAAQ,MAAMD;IAAU,CAC5B;AAED,UAAM,QAAQ,SAAS;AAAA,MACrB,UAAU,QAAQ,YAAY;AAAA,MAC9B,aAAa,QAAQ,eAAe;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAAL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAAM;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAASD;AAAAA,MACT;AAAA,IAAA,CACD;AAEK,UAAA,OAAO,CAAC,aAAa;AACzB,kBAAY,QAAQ;AAAA,IAAA,GACnB;AAAA,MACD,MAAM;AAAA,MACN,WAAW;AAAA,IAAA,CACZ;AAEM,WAAA;AAAA,EAAA,CACR;AACH;AAEA,SAAS,eAAuC;AACxC,QAAA,cAAc,IAAI,KAAK;AAE7B,SAAO,YAAY;AACjB,UAAM,eAAe;AAErB,gBAAY,QAAQ;AAAA,EAAA,CACrB;AACM,SAAA;AACT;AClRA,eAAsB,aACpB,SACoC;AACpC,QAAM,eAAe;AAEd,SAAA,MAAM,KAAK,SAAS,iBAA8B,SAAS,CAAC,EAChE,OAAO,CAAC,YAAY;;AACf,QAAA,CAAC,QAAQ,QAAQ;AACZ,aAAA;AAET,UAAML,QAAO;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,IAAA;AAGX,WAAA,GAAC,aAAQ,WAAR,iCAAmB,KAAK,CAAc,eAAA,WAAW,SAASA;AAAA,EACnE,CAAA,EACA,IAAI,CAAA,YAAW,WAAW;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,mBAAmB;AAAA,IACnB,MAAM,QAAQ,QAAQ;AAAA,IACtB;AAAA,EAAA,CACD,CAAC,EACD,OAAO;;AAAQ,cAAC,aAAQ,WAAR,iCAAmB,KAAK,CAAc,eAAA,WAAW,SAAS,KAAK;AAAA,GAAK;AACzF;ACUO,SAAS,kBAAkB;AAAA,EAChC,eAAe,CAAC;AAAA,EAChB;AACF,GAA0C;AAChC,UAAA,4BAAY;AAEpB,WAAS,SAAoC;AACpC,WAAA,MAAM,KAAK,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAG,EAAA,IAAI,MAAM,IAAI;AAAA,EACzD;AAEA,WAASQ,KAAI,SAAiF;;AAE5F,UAAM,OAAO,WAAW;AAAA,MACtB,GAAG;AAAA,MACH,WAAAJ;AAAA,MACA;AAAA,IAAA,CACD;AAEG,QAAA,IAAI,KAAK,IAAI,GAAG;AAClB,WAAK,QAAQ;AAEb,YAAM,IAAI,MAAM,uBAAuB,KAAK,IAAI,oFAAoF;AAAA,IACtI;AAEA,aAASA,aAAkB;;AACjB,cAAA,MAAM,OAAO,KAAK,EAAE;AAC5B,aAAO,MAAM,gBAAgB;AAAA,QAC3B;AAAA,MAAA,CACD;AACO,OAAAK,MAAA,QAAA,WAAA,gBAAAA,IAAQ,WAAW,SAAS;AAAA,IACtC;AAEA,YAAQ,MAAM,IAAI,KAAK,IAAI,IAAI;AAE/B,WAAO,MAAM,cAAc;AAAA,MACzB;AAAA,MACA,OAAO,MAAM,KAAK,QAAQ,MAAM,QAAQ;AAAA,IAAA,CACzC;AAEO,kBAAA,WAAA,mBAAQ,QAAQ,SAAS;AAE1B,WAAA;AAAA,EACT;AAEA,iBAAeC,iBAAmD;AAChE,UAAM,WAAW,MAAMC;AAAAA,MACrB;AAAA,IAAA;AAGF,eAAW,QAAQ;AACjB,cAAQ,MAAM,IAAI,KAAK,IAAI,IAAI;AAE1B,WAAA;AAAA,EACT;AAEA,WAAS,IAAIX,OAAsC;AACjD,WAAO,OAAS,EAAA,KAAK,CAAQ,SAAA,KAAK,SAASA,KAAI;AAAA,EACjD;AAEA,WAAS,UAAgB;AACZ,eAAA,QAAQ,QAAQ,MAAM,OAAO;AACtC,WAAK,QAAQ;AAEf,YAAQ,MAAM;EAChB;AAEA,aAAW,WAAW,cAAc;AAC9B,IAAAQ,KAAA;AAAA,MACF,GAAG;AAAA,MACH,aAAa;AAAA,IAAA,CACd;AAAA,EACH;AAEO,SAAA;AAAA,IACL;AAAA,IACA,KAAAA;AAAA,IAAA,cACAE;AAAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACpHO,SAAS,mBAAmB,UAAmE;;AAC7F,eAAA,aAAA,gCAAW,oBAAoB,GAAG;AAEzC,SAAO,MAAA;;AAAM,YAAAD,MAAA,OAAO,aAAP,gBAAAA,IAAA,aAAkB,uBAAuB,GAAG;AAAA;AAC3D;ACJgB,SAAA,iBACd,SACA,eAC6C;AACvC,QAAA,iCAAiB;AAEvB,MAAI,QAAQ;AACV,eAAW,IAAI,MAAM,KAAK,SAAS,QAAQ,CAAC;AAE9C,MAAI,QAAQ;AACV,eAAW,IAAI,MAAM,KAAK,OAAO,SAAS,IAAI,CAAC;AAEjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ;AAAA,IACxC,GAAG,QAAQ,cAAc,CAAC;AAAA,IAC1B,IAAI,QAAQ,UAAU,QAAQ;AAAA,IAC9B,IAAI,cAAc,SAAS;AAAA,IAC3B,IAAI,cAAc,SAAS;AAAA,IAC3B,IAAI,KAAK,MAAM,KAAK,WAAW,GAAM,EAAE,SAAS;AAAA,EAAA,CACjD;AACY,eAAA,IAAI,KAAK,KAAK;AAEpB,SAAA;AACT;AAKO,SAAS,aAAa,eAA+C;AAC1E,MAAI,cAAc,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,GAAG;AAC/E,WAAO,wBAAwB,OAAO;AACtC,WAAO,MAAM,uBAAuB;AAAA,EACtC;AAEA,SAAO,MAAM,+BAA+B;AAAA,IAC1C;AAAA,EAAA,CACD;AACH;AAKO,SAAS,gBAAyB;AACvC,SAAO,OAAO,SAAS,OAAO,SAAS,yBAAyB;AAClE;ACjDA,IAAI,aAAa;AAEjB,MAAM,CAAC,cAAc,SAAS,IAAI,eAAe,aAAa;AAAA,EAC5D,MAAM,WAAW;AACF,iBAAA;AAEb,2CAAW;AAAA,EACb;AAAA,EACA,QAAQ;AACF,QAAA;AACW;EACjB;AACF,CAAC;ACUM,SAAS,aAAa,SAA0C;AACrE,QAAM,QAAQ;AAEP,SAAA,MAAM,IAAI,MAAM;AACrB,UAAM,gBAAgB;AAAA,MACpB,MAAM,eAAe,QAAQ,OAAO;AAAA,MACpC,UAAU,gBAAgB,QAAQ,OAAO;AAAA,MACzC,UAAU;AAAA,MACV,aAAa;AAAA,MACb,OAAO;AAAA,MACP,cAAc,CAAC;AAAA,MACf,oBAAoB;AAAA,MACpB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,SAAS,CAAC;AAAA,MACV,GAAG;AAAA,IAAA;AAEL,iBAAa,aAAa;AAE1B,UAAM,UAAU,SAA6B;AAAA,MAC3C,UAAU,cAAc;AAAA,MACxB,SAAS,cAAc;AAAA,MACvB,OAAO,cAAc;AAAA,MACrB,SAAS;AAAA,MACT;AAAA,MACA,YAAY;AAAA,MACZ,gCAAgB,IAAI;AAAA,MACpB,QAAQ,mBAAmB;AAAA,MAC3B,2BAAW,IAAI;AAAA,MACf;AAAA,MACA,cAAAC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAED,eAAW,CAAC,OAAO,MAAM,KAAK,cAAc,QAAQ,WAAW;AAC7D,aAAO,SAAS;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAEA,YAAQ,SAAS;AAET,YAAA,YAAY,QAAQ,YACxB,gBAAgB;AAAA,MAChB,YAAY,GAAG,cAAc,QAAQ;AAAA,MACrC;AAAA,IAAA,CACD,IACC;AAEJ,UAAM,MAAM,QAAQ,UAAU,CAAC,gBAAgB;;AACrC,oBAAA,WAAA,mBAAQ,eAAe,SAAS;AAAA,IAAW,CACpD;AAED,UAAM,gBAAgB,oBAAoB;AAAA,MACxC,UAAU;AAAA,MACV,SAAS,cAAc;AAAA,IAAA,CACxB;AAEO,YAAA,aAAa,iBAAiB,eAAe,aAAa;AAElE;AAAA,MACE,MAAM,QAAQ;AAAA,MACd,CAAC,kBAAkB;;AACT,sBAAA,WAAA,mBAAQ,iBAAiB,SAAS;AAAA,MAC5C;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IAAA;AAGF,mBAAe,gBAA+B;;AACtC,YAAA,QAAQ,cAAc;AACpB,oBAAA,eAAA,mBAAY,IAAI,MAAM;AACtB,oBAAA,eAAA,mBAAY,IAAI,MAAM;AAE9B,YAAM,wBAAwB;AAAA,IAChC;AAEA,UAAM,MAAM,QAAQ,SAAS,CAAC,eAAe;;AAC3C,oBAAQ,eAAR,mBAAoB,IAAI,MAAM,aAAa,QAAQ;AAE3C,oBAAA,WAAA,mBAAQ,cAAc,SAAS;AAAA,IAAU,GAChD;AAAA,MACD,WAAW;AAAA,IAAA,CACZ;AAED,UAAM,cAAc,kBAAkB;AAAA,MACpC,cAAc,cAAc;AAAA,MAC5B;AAAA,IAAA,CACD;AAED,aAAS,SAAoC;AACpC,aAAA,YAAY,OAAO,KAAK;IACjC;AACA,YAAQ,SAAS;AAEjB,aAAS,IAAIV,OAAsC;AAC1C,aAAA,YAAY,IAAIA,KAAI;AAAA,IAC7B;AACA,YAAQ,MAAM;AAEd,aAAS,QAAQ,aAAsD;AAC9D,aAAA,YAAY,IAAI,WAAW;AAAA,IACpC;AACA,YAAQ,UAAU;AAElB,mBAAeU,gBAAmD;AAC1D,YAAA,YAAY,MAAM,YAAY,aAAa,KAAK,CAAA,GAAI,OAAO,CAAA,SAAQ,CAAC,KAAK,WAAW;AAE1F,UAAI,SAAS,UAAU;AACrB,eAAO;AAET,YAAM,wBAAwB;AAEvB,aAAA;AAAA,IACT;AACA,YAAQ,eAAeA;AAEvB,UAAM,MAAM,QAAQ,OAAO,OAAO,aAAa;;AAC7C,UAAI,UAAU;AACZ,eAAO,wBAAwB,OAAO;AACtC,eAAO,MAAM,oBAAoB;AACzB,sBAAA,WAAA,mBAAQ,YAAY,SAAS;AAAA,MAAI,OAEtC;AACH,eAAO,MAAM,qBAAqB;AAClC,eAAO,wBAAwB,MAAM;AAC7B,sBAAA,WAAA,mBAAQ,YAAY,SAAS;AAAA,MACvC;AAAA,IAAA,GACC;AAAA,MACD,WAAW;AAAA,IAAA,CACZ;AAED,mBAAe,0BAAyC;AACtD,YAAM,SAAS,YAAY,OAAO,KAAK,CAAC,GAAG,OAAO,CAAA,SAAQ,CAAC,KAAK,eAAe,CAAC,KAAK,EAAE;AAEvF,UAAI,MAAM,WAAW;AACnB;AAEI,YAAA,QAAQ,WAAW,MAAM,IAAI,UAAQ,KAAK,QAAS,CAAA,CAAC;AAAA,IAC5D;AAEM,UAAA,4BAA4B,mBAAmB,OAAO,SAAS;;AACnE,UAAI,CAAC,KAAK;AACR;AAEF,aAAO,MAAM,gCAAgC;AAAA,QAC3C;AAAA,MAAA,CACD;AAED,oBAAQ,eAAR,mBAAoB,IAAI,MAAM,KAAK;AAC3B,oBAAA,eAAA,mBAAY,OAAO;AAE3B,YAAM,wBAAwB;AAAA,IAAA,CAC/B;AAED,aAAS,UAAgB;;AACvB,cAAQ,aAAa;AAErB,oBAAc,QAAQ;AACtB,kBAAY,QAAQ;AACpB,oBAAc,QAAQ;AACI;AAC1B,oBAAQ,eAAR,mBAAoB;AACpB,aAAO,UAAU;AACjB,oBAAQ,WAAR,mBAAgB;AAChB,aAAO,KAAK,0BAA0B;AAEzB;AAEC;AAEd,YAAM,KAAK;AAAA,IACb;AACA,YAAQ,UAAU;AAElB,WAAO,YAAY;;AACjB,YAAM,aAAa,CAAC;AAEpB,WAAK,YAAY,OAAS,EAAA,UAAU,KAAK;AACvC,cAAM,wBAAwB,EAAE,MAAM,OAAO,KAAK;AAEpD,UAAI,cAAc;AAChB,eAAM,mCAAS;AAEb,UAAA,cAAc,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,KAAK,cAAc;AACvF,sBAAA,WAAA,mBAAQ,YAAY,SAAS;AAEvC,UAAI,CAAC,MAAM;AACD;IAAA,CACX;AAES;AAEH,WAAA;AAAA,EAAA,CACR;AACH;"}
1
+ {"version":3,"file":"index.js","sources":["../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/logger/logger.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onSlotCreate.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/useSlotHooks.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":["import type { AdheseAd } from '@adhese/sdk';\n\nexport function renderIframe(ad: AdheseAd, 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: AdheseAd, 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 { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\n","import { debounce } from 'remeda';\nimport { logger } from '../logger/logger';\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 dispose: () => 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 function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\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 type { AdMultiRequestOptions } from '../requestAds/requestAds';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdMultiRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { AdheseAd } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import { logger } from '../logger/logger';\nimport type { AdheseAd } from './requestAds.schema';\n\n/**\n * Request preview ads for the given account. This function will only return items when there are preview objects in the\n * URL detected.\n */\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<AdheseAd>> {\n const previewObjects = getPreviewObjects();\n\n const [list, adSchema] = await Promise.all([\n 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 import('./requestAds.schema').then(module => module.adSchema),\n ]);\n\n return adSchema.array().parse(list\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 .flatMap(response => response.value.map(item => ({\n ...item,\n preview: true,\n })))) as ReadonlyArray<AdheseAd>;\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 '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport type { AdMultiRequestOptions } from './requestAds';\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,\n ...options\n}: Omit<AdMultiRequestOptions, '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: context.parameters && parseParameters(context.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(context.options.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<AdMultiRequestOptions, '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, toValue } from '@adhese/sdk-shared';\nimport { debounce } from 'remeda';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport type { AdheseAd } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * Slot you want to fetch the ad for\n */\n slot: {\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n };\n context: AdheseContext;\n};\n\nexport type AdMultiRequestOptions = Omit<AdRequestOptions, 'slot'> & {\n slots: ReadonlyArray<AdRequestOptions['slot']>;\n};\n\nconst batch = new Map<string, {\n options: AdRequestOptions;\n resolve(ad: AdheseAd | null): void;\n}>();\n\n/**\n * Debounced function to request ads in batches. This function is debounced to prevent multiple requests for the same ad.\n */\nconst runRequestAdsBatch = debounce(async (context: AdheseContext) => {\n if (batch.size === 0)\n return [];\n\n const ads = await requestAds({\n slots: Array.from(batch.values()).map(({ options }) => options.slot),\n context,\n });\n\n for (const { options, resolve } of batch.values()) {\n const ad = ads.find(({ slotName }) => toValue(slotName) === toValue(options.slot.name));\n\n if (ad)\n resolve(ad);\n else\n resolve(null);\n }\n\n batch.clear();\n\n return ads;\n}, {\n waitMs: 20,\n timing: 'trailing',\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(options: AdRequestOptions): Promise<AdheseAd | null> {\n const promise = new Promise<AdheseAd | null>((resolve) => {\n batch.set(toValue(options.slot.name), { options, resolve });\n },\n );\n\n await runRequestAdsBatch.call(options.context);\n\n return promise;\n}\n\n/**\n * Request multiple ads from the API. If you need to fetch a single ad use the `requestAd` function.\n */\nexport async function requestAds(requestOptions: AdMultiRequestOptions): Promise<ReadonlyArray<AdheseAd>> {\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, parseResponse] = await Promise.all([\n context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options),\n requestPreviews(context.options.account),\n import('./requestAds.schema').then(module => module.parseResponse),\n ]);\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","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 '@adhese/sdk-shared';\nimport { round } from 'remeda';\nimport type { AdheseAd, AdheseContext } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { logger } from '../../logger/logger';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<AdheseAd | 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 }, 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 '@adhese/sdk-shared';\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 type { AdheseAd, AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport type { Ref, UnwrapRef } from '@adhese/sdk-shared';\nimport { createAsyncHook, createPassiveHook } from '../../hooks/createHook';\n\nexport function useSlotHooks({ setup }: AdheseSlotOptions, slotContext: Ref<UnwrapRef<AdheseSlot | null>>, id: string): {\n runOnSlotRender: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnRequest: ReturnType<typeof createAsyncHook<void>>[0];\n runOnDispose: ReturnType<typeof createPassiveHook<void>>[0];\n} {\n const [runOnSlotRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>(`onRender:${id}`);\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook(`onRequest:${id}`);\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook(`onDispose:${id}`);\n\n setup?.(slotContext, {\n onRender,\n onDispose,\n onRequest,\n });\n\n onDispose(() => {\n disposeOnRender();\n disposeOnRequest();\n disposeOnDispose();\n });\n\n return { runOnSlotRender, runOnRequest, runOnDispose };\n}\n","import { type Ref, type UnwrapRef, computed, effectScope, reactive, ref, uniqueId, waitForDomLoad, watch } from '@adhese/sdk-shared';\nimport { doNothing, isDeepEqual } from 'remeda';\nimport type { AdheseAd } 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 { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport { logger } from '../../logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\nimport { useSlotHooks } from './useSlotHooks';\n\nconst renderFunctions: Record<RenderMode, (ad: AdheseAd, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n none: doNothing,\n};\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n const mergedOptions = {\n renderMode: 'iframe',\n ...slotOptions,\n } satisfies AdheseSlotOptions;\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlot | null>(null);\n const options = runOnSlotCreate(mergedOptions);\n\n const id = uniqueId();\n\n const { runOnSlotRender, runOnDispose, runOnRequest } = useSlotHooks(options, slotContext, id);\n\n const {\n containingElement,\n slot,\n context,\n renderMode,\n } = mergedOptions;\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<AdheseAd | 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 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 isDisposed = ref(false);\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value || isDisposed.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n options,\n element,\n });\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if ((!newAd || (oldAd && isDeepEqual(newAd, oldAd))) && status.value === 'rendered')\n return;\n\n if (newIsInViewport)\n await render(newAd ?? undefined);\n });\n\n watch(isInViewport, (value) => {\n options.onViewabilityChanged?.(value);\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<AdheseAd | null> {\n status.value = 'loading';\n\n await runOnRequest();\n\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n if (response) {\n ad.value = response;\n\n if (!originalAd.value)\n originalAd.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n }\n\n return response;\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n status.value = 'rendering';\n\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (!renderAd) {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n return null;\n }\n\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnSlotRender(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 renderFunctions[renderMode](renderAd, element.value);\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 status.value = 'rendered';\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 runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n onInit(async () => {\n status.value = 'initialized';\n\n if (options.lazyLoading)\n return;\n\n ad.value = await requestAd();\n });\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n render,\n request: requestAd,\n dispose,\n });\n\n watch(state, (newState) => {\n slotContext.value = newState;\n }, {\n deep: true,\n immediate: true,\n });\n\n return state;\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 '@adhese/sdk-shared';\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 === 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 === slot.name));\n}\n","import type { Merge } from '@adhese/sdk-shared';\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 AdheseSlotManager = {\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\n/**\n * Creates a new slot manager instance. This slot manager instance can be used to manage all slots in the Adhese\n * instance. It will automatically add all slots that are passed in the `initialSlots` array.\n */\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): AdheseSlotManager {\n context.slots = new Map<string, AdheseSlot>();\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(context.slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n if (get(slot.name)) {\n slot.dispose();\n\n throw new Error(`Slot with the name: ${slot.name} already exists. Create a new slot with a different format, slot, or the location.`);\n }\n\n function onDispose(): void {\n context.slots.delete(slot.id);\n logger.debug('Slot removed', {\n slot,\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n context.slots.set(slot.id, slot);\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(context.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 context.slots.set(slot.id, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return getAll().find(slot => slot.name === name);\n }\n\n function dispose(): void {\n for (const slot of context.slots.values())\n slot.dispose();\n\n context.slots.clear();\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","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\n/**\n * Creates the parameters map with a set of default parameters.\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\n/**\n * Sets up logging based on the provided options. If debug is enabled, the log level threshold is set to debug.\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\n/**\n * Checks if the current page is in preview mode.\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 { awaitTimeout, createEventManager, effectScope, reactive, watch } from '@adhese/sdk-shared';\nimport { version } 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, AdheseContextState, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\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 {AdheseOptions} The options to create the Adhese instance with. See the {@link AdheseOptions} type for more information.\n *\n * @return 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 eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive<AdheseContextState>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n options: mergedOptions,\n logger,\n isDisposed: false,\n parameters: new Map(),\n events: createEventManager(),\n slots: new Map(),\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version,\n onInit,\n onDispose,\n onRequest,\n onResponse,\n onSlotCreate,\n });\n }\n\n context.events = createEventManager();\n\n watch(() => 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 (newParameters) => {\n context.events?.parametersChange.dispatch(newParameters);\n },\n {\n deep: true,\n },\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 fetchAllUnrenderedSlots();\n }\n\n watch(() => context.consent, (newConsent) => {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n\n context.events?.consentChange.dispatch(newConsent);\n }, {\n immediate: true,\n });\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n context.getAll = getAll;\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n context.get = get;\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n return slotManager.add(slotOptions);\n }\n context.addSlot = addSlot;\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 await fetchAllUnrenderedSlots();\n\n return domSlots;\n }\n context.findDomSlots = findDomSlots;\n\n watch(() => context.debug, async (newDebug) => {\n if (newDebug) {\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 immediate: true,\n });\n\n async function fetchAllUnrenderedSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading && !slot.ad);\n\n if (slots.length === 0)\n return;\n\n await Promise.allSettled(slots.map(slot => slot.request()));\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 fetchAllUnrenderedSlots();\n });\n\n function dispose(): void {\n context.isDisposed = true;\n\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 context.dispose = dispose;\n\n onInit(async () => {\n await awaitTimeout(0);\n\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAllUnrenderedSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await context?.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 context;\n })!;\n}\n"],"names":["name","runOnRequest","onRequest","runOnDispose","onDispose","requestAd","isDisposed","extRequestAd","add","_a","findDomSlots","extFindDomSlots"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@adhese/sdk",
3
3
  "type": "module",
4
- "version": "0.14.1",
4
+ "version": "0.15.0",
5
5
  "description": "Adhese SDK",
6
6
  "license": "GPL-3.0",
7
7
  "repository": {