@adhese/sdk 0.13.0 → 0.14.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 +255 -0
- package/dist/index.cjs +255 -328
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +84 -35
- package/dist/index.js +188 -329
- package/dist/index.js.map +1 -1
- package/dist/requestAds.schema-Cb8_FVMb.js +169 -0
- package/dist/requestAds.schema-Cb8_FVMb.js.map +1 -0
- package/dist/requestAds.schema-D3gd-oXt.cjs +169 -0
- package/dist/requestAds.schema-D3gd-oXt.cjs.map +1 -0
- package/package.json +4 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../safeframe/src/main.ts","../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../src/logger/logger.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.schema.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onRender.ts","../src/hooks/onSlotCreate.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/createSlot.ts","../src/slot/findDomSlots/findDomSlots.ts","../src/slot/slotManager/slotManager.ts","../src/consent/tcfConsent.ts","../src/main.utils.ts","../src/hooks/onDispose.ts","../src/main.ts"],"sourcesContent":["import { uniqueId } from '@adhese/sdk-shared';\nimport type { Ad, AdheseContext } from '@adhese/sdk';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: Ad, element: HTMLElement): Position;\n render(position: Position): Promise<void>;\n dispose(): void;\n};\n\nexport type SafeFrameOptions = {\n renderFile: string;\n context: AdheseContext;\n};\n\nexport function createSafeFrame({\n renderFile,\n context,\n}: SafeFrameOptions): SafeFrame {\n const safeFrame = window.$sf;\n\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const adhesePositions = new Set<Position>();\n\n const config = new safeFrame.host.Config({\n auto: false,\n debug: context.debug,\n renderFile,\n });\n\n function addPosition(ad: Ad, element: HTMLElement): Position {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const html = (ad.ext === 'js' && ad.body) ? ad.body : ad.tag;\n\n if (typeof html !== 'string')\n throw new Error('Ad tag is not a string');\n\n const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;\n\n element.id = elementId;\n\n const position = new safeFrame.host.Position({\n id: elementId,\n html,\n src: ad.ext === 'js' ? ad.swfSrc?.href : undefined,\n config: new safeFrame.host.PosConfig({\n id: elementId,\n w: Number(ad.width),\n h: Number(ad.height),\n size: `${Number(ad.width)}x${Number(ad.height)}`,\n tgt: html.includes('target=\"_self\"') ? '_self' : '_blank',\n dest: elementId,\n }),\n });\n\n adhesePositions.add(position);\n\n return position;\n }\n\n async function render(position: Position): Promise<void> {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n safeFrame.host.render(position);\n }\n\n function dispose(): void {\n }\n\n return {\n config,\n addPosition,\n render,\n dispose,\n };\n}\n","import type { Ad } from '@adhese/sdk';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.innerHTML = String(ad.tag);\n}\n\nexport function generateName(\n location: string,\n format: string,\n slot: string | undefined,\n): string {\n return `${location}${slot ? `${slot}` : ''}-${format}`;\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import { debounce } from 'remeda';\nimport { logger } from '@adhese/sdk';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, {\n waitMs: 50,\n });\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange.call);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange.call);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","const hookMap = new Map<string, Set<Function>>();\n\nexport function clearAllHooks(): void {\n hookMap.clear();\n}\n\nexport function createAsyncHook<\n Argument = void,\n Callback extends (() => void | Promise<void>) | ((arg: Argument) => Argument | void | Promise<Argument | void>) = Argument extends void ?\n () => void | Promise<void> :\n (arg: Argument) => Argument | void | Promise<Argument | void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = (async (arg) => {\n let latestResult: Argument = arg;\n\n for (const callback of hookMap.get(name) ?? [])\n // eslint-disable-next-line no-await-in-loop\n latestResult = (await callback(latestResult) as Argument) ?? latestResult;\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>;\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nexport function createSyncHook<\n Argument = void,\n Callback extends (arg: Argument) => Argument | void | Promise<void> = (arg: Argument) => Argument | void | Promise<void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: (arg: Argument) => Argument,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = ((arg) => {\n let latestResult: Argument = arg;\n\n const promisedCallbacks: Array<Callback> = [];\n\n for (const callback of hookMap.get(name) ?? []) {\n if (isCallbackAsync(callback))\n promisedCallbacks.push(callback as Callback);\n else\n latestResult = callback(latestResult) as Argument ?? latestResult;\n }\n\n // eslint-disable-next-line no-console\n Promise.allSettled(promisedCallbacks.map(callback => callback(latestResult) as Argument)).catch(console.trace);\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as (arg: Argument) => Argument;\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nexport function createPassiveHook<\n Argument = void,\n Callback extends (arg: Argument) => void | Promise<void> = (arg: Argument) => void | Promise<void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: (arg: Argument) => void,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n function run(arg: Argument): void {\n // eslint-disable-next-line no-console\n Promise.allSettled(Array.from(hookMap.get(name) ?? []).map(callback => callback(arg) as Callback)).catch(console.trace);\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nfunction isCallbackAsync(callback: Function): boolean {\n return callback.constructor.name === 'AsyncFunction';\n}\n\nfunction add<Callback extends Function>(callback: Callback, {\n name,\n onAdd,\n}: {\n name: string;\n onAdd?(hookSet: Set<Callback>): void;\n}): () => void {\n const hookSet = hookMap.get(name);\n\n if (hookSet)\n hookSet.add(callback);\n else\n hookMap.set(name, new Set([callback]));\n\n onAdd?.(hookSet as Set<Callback>);\n\n return () => {\n hookMap.get(name)?.delete(callback);\n };\n}\n","import { createSyncHook } from './createHook';\n\nlet resolveOnInitPromise = (): void => {};\nlet isInit = false;\nconst waitOnInit = new Promise<void>((resolve) => {\n resolveOnInitPromise = resolve;\n});\n\nconst [runOnInit, onInit] = createSyncHook('onInit', {\n onRun(callbacks) {\n isInit = true;\n\n resolveOnInitPromise();\n\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n});\n\nexport {\n onInit,\n runOnInit,\n waitOnInit,\n};\n","import { createLogger } from '@adhese/sdk-shared';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\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 { Ad } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<Ad>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import {\n NEVER,\n type TypeOf,\n ZodIssueCode,\n type ZodType,\n coerce,\n lazy,\n literal,\n number,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\nexport const cssValueLike\n = union([coerce.string(), literal(''), number()]).transform<string | undefined>((value) => {\n if (value === '' || value === 0 || value === '0')\n return undefined;\n\n if (numberLike.parse(value))\n return `${numberLike.parse(value)}px`;\n\n return String(value);\n });\n\nexport const isJson = string().transform((value, { addIssue }) => {\n try {\n return JSON.parse(value.replaceAll('\\'', '\"')) as Record<string, unknown> | ReadonlyArray<unknown>;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid JSON: ${(error as Error).message}`,\n });\n\n return NEVER;\n }\n});\n\nexport const isHtmlString = string().transform((value, { addIssue }) => {\n const htmlParser = new DOMParser();\n\n try {\n const html = htmlParser.parseFromString(value, 'text/html');\n\n if (html.body?.children.length === 0)\n throw new Error('Invalid HTML');\n\n return value;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: (error as Error).message,\n });\n\n return NEVER;\n }\n});\n\nexport const isJsonOrHtmlString = union([isJson, isHtmlString]);\n\nexport const isJsonOrHtmlOptionalString = union([coerce.string(), isJsonOrHtmlString]).transform((value) => {\n if (value === '')\n return undefined;\n\n return value;\n}).optional();\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { logger } from '@adhese/sdk';\nimport { type Ad, adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { toValue } from '@vue/runtime-core';\nimport { logger } from '@adhese/sdk';\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 '@vue/runtime-core';\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 Ad, parseResponse } 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: Ad | null): void;\n}>();\n\nconst debouncedRequestAds = 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<Ad | null> {\n const promise = new Promise<Ad | null>((resolve) => {\n batch.set(toValue(options.slot.name), { options, resolve });\n },\n );\n\n await debouncedRequestAds.call(options.context);\n\n return promise;\n}\n\nexport async function requestAds(requestOptions: AdMultiRequestOptions): Promise<ReadonlyArray<Ad>> {\n const options = await runOnRequest(requestOptions);\n\n const { context } = options;\n\n try {\n context?.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews] = await Promise.all([context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(context.options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult = await runOnResponse([\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ]);\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context?.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n","import type { Ad } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRender, onRender] = createAsyncHook<Ad>('onRender');\n\nexport { runOnRender, onRender };\n","import type { AdheseSlotOptions } from '@adhese/sdk';\nimport { createSyncHook } from './createHook';\n\nconst [runOnSlotCreate, onSlotCreate] = createSyncHook<AdheseSlotOptions>('onSlotCreate');\n\nexport { runOnSlotCreate, onSlotCreate };\n","import { type ComputedRef, type Ref, computed, ref, watch } from '@vue/runtime-core';\nimport { round } from 'remeda';\nimport { type Ad, type AdheseContext, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<Ad | null>;\n name: ComputedRef<string>;\n element: ComputedRef<HTMLElement | null>;\n },\n): [\n ComputedRef,\n IntersectionObserver['disconnect'],\n ] {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = computed(() => Boolean(trackingPixel.value));\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad.value?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(ad.value.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${name.value}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isTracked, (): void => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n }];\n}\n","import { type Ref, ref, watch } from '@vue/runtime-core';\nimport type { AdheseSlotOptions } from '@adhese/sdk';\n\nexport function useRenderIntersectionObserver({ options, element }: {\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import { waitForDomLoad } from '@adhese/sdk-shared';\nimport { type Ref, computed, effectScope, reactive, ref, watch } from '@vue/runtime-core';\nimport { isDeepEqual } from 'remeda';\nimport { type Ad, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport { onInit, waitOnInit } from '../../hooks/onInit';\nimport { requestAd as extRequestAd } from '../../requestAds/requestAds';\nimport { runOnRender } from '../../hooks/onRender';\nimport { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance. 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): Readonly<AdheseSlot> {\n const scope = effectScope();\n\n return scope.run(() => {\n const options = runOnSlotCreate(slotOptions);\n\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format !== 'string') {\n queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n }\n\n const format = ref(queryDetector ? queryDetector.getQuery() : options.format as string);\n function onQueryChange(newFormat: string): void {\n format.value = newFormat;\n }\n\n const ad = ref<Ad | null>(null);\n const originalAd = ref(ad.value);\n\n const name = computed(() => generateName(context.location, format.value, slot));\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n options.onNameChange?.(newName, oldName);\n\n const newAd = await requestAd();\n\n cleanElement();\n\n ad.value = newAd;\n originalAd.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element.value?.querySelector('iframe') ?? null;\n\n return element.value?.innerHTML ? (element.value.firstElementChild as HTMLElement) : null;\n }\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n options,\n element,\n });\n\n const isRendered = ref(false);\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if ((!newAd || (oldAd && isDeepEqual(newAd, oldAd))) && isRendered.value)\n return;\n\n if (newIsInViewport)\n await render(newAd ?? undefined);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\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<Ad | null> {\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\n return response;\n }\n\n async function render(adToRender?: Ad): Promise<HTMLElement | null> {\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (!renderAd) {\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 runOnRender(renderAd);\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (context.safeFrame && renderAd && renderMode === 'iframe') {\n const position = context.safeFrame.addPosition(renderAd, element.value);\n\n await context.safeFrame.render(position);\n }\n else {\n renderFunctions[renderMode](renderAd, element.value);\n }\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n options.onRender?.(element.value);\n\n // eslint-disable-next-line require-atomic-updates\n ad.value = renderAd;\n\n isRendered.value = true;\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n ad.value = null;\n\n disposeRenderIntersectionObserver();\n disposeViewabilityObserver();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n\n scope.stop();\n }\n\n onInit(async () => {\n if (options.lazyLoading)\n return;\n\n ad.value = await requestAd();\n });\n\n return {\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n render,\n getElement,\n request: requestAd,\n dispose,\n };\n })!;\n}\n\nfunction useDomLoaded(): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n","import { waitForDomLoad } from '@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.value === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name.value === slot.name.value));\n}\n","import type { Merge } from '@adhese/sdk-shared';\nimport { effectScope, shallowReactive, watch, watchEffect } from '@vue/runtime-core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\nimport type { AdheseSlot, AdheseSlotOptions } from '../createSlot/createSlot.types';\nimport type { AdheseContext } from '../../main.types';\nimport { createSlot } from '../createSlot/createSlot';\nimport { logger } from '../../logger/logger';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Readonly<SlotManager> {\n const scope = effectScope();\n\n return scope.run(() => {\n const slots = shallowReactive<Map<string, AdheseSlot>>(new Map<string, AdheseSlot>());\n\n watchEffect(() => {\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n if (slots.has(slot.name.value)) {\n slot.dispose();\n\n throw new Error(`Slot with the name: ${slot.name.value} already exists. Create a new slot with a different format, slot, or the location.`);\n }\n\n const disposeSlotWatch = watch(slot.name, (newName, previousName) => {\n slots.set(newName, slot);\n slots.delete(previousName);\n });\n\n function onDispose(): void {\n slots.delete(slot.name.value);\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n\n disposeSlotWatch();\n }\n\n slots.set(slot.name.value, slot);\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n slots.set(slot.name.value, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n scope.stop();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n })!;\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): Map<string, string | ReadonlyArray<string>> {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n","import { createSyncHook } from './createHook';\n\nlet isDisposed = false;\n\nconst [runOnDispose, onDispose] = createSyncHook('onDispose', {\n onRun(callbacks) {\n isDisposed = true;\n\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n});\n\nexport {\n onDispose,\n runOnDispose,\n};\n","import { awaitTimeout, createEventManager } from '@adhese/sdk-shared';\nimport { effectScope, reactive, watch } from '@vue/runtime-core';\nimport { createSafeFrame } from '@safeframe';\nimport packageJson from '../package.json';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, 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 { onRender } from './hooks/onRender';\nimport { onRequest } from './hooks/onRequest';\nimport { onSlotCreate } from './hooks/onSlotCreate';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options {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 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: packageJson.version,\n onInit,\n onDispose,\n onRender,\n onRequest,\n onResponse,\n onSlotCreate,\n });\n }\n\n context.events = createEventManager();\n\n context.safeFrame = options.safeFrame\n ? createSafeFrame({\n renderFile: `${mergedOptions.poolHost}/sf/r.html`,\n context,\n })\n : undefined;\n\n 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.value);\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","debounce","name","createLogger","union","coerce","literal","number","string","ZodIssueCode","NEVER","object","unknown","lazy","toValue","ref","computed","round","watch","effectScope","reactive","requestAd","isDeepEqual","extRequestAd","waitForDomLoad","shallowReactive","watchEffect","add","onDispose","_a","findDomSlots","extFindDomSlots","createEventManager","awaitTimeout"],"mappings":"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"}
|
|
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 '@vue/runtime-core';\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 '@vue/runtime-core';\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 '@vue/runtime-core';\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 '@vue/runtime-core';\nimport type { AdheseSlotOptions } from '@adhese/sdk';\n\nexport function useRenderIntersectionObserver({ options, element }: {\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import type { AdheseAd, AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport type { Ref, UnwrapRef } from '@vue/runtime-core';\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 { uniqueId, waitForDomLoad } from '@adhese/sdk-shared';\nimport { type Ref, type UnwrapRef, computed, effectScope, reactive, ref, watch } from '@vue/runtime-core';\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 } from '@adhese/sdk-shared';\nimport { effectScope, reactive, watch } from '@vue/runtime-core';\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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,8 @@ import * as _adhese_sdk_shared from '@adhese/sdk-shared';
|
|
|
2
2
|
import { Merge, UrlString, EventManager } from '@adhese/sdk-shared';
|
|
3
3
|
import * as zod from 'zod';
|
|
4
4
|
import { TypeOf, ZodType } from 'zod';
|
|
5
|
-
import {
|
|
5
|
+
import { Ref, MaybeRef } from '@vue/runtime-core';
|
|
6
|
+
export { ComputedRef, Ref, ShallowReactive, ShallowRef, ShallowUnwrapRef, UnwrapNestedRefs, UnwrapRef, computed, customRef, effectScope, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, toRaw, toRefs, toValue, unref, watch, watchEffect, watchPostEffect, watchSyncEffect } from '@vue/runtime-core';
|
|
6
7
|
|
|
7
8
|
declare class Config {
|
|
8
9
|
auto?: boolean;
|
|
@@ -65,7 +66,7 @@ declare class PosConfig {
|
|
|
65
66
|
|
|
66
67
|
type SafeFrame = {
|
|
67
68
|
config: Config;
|
|
68
|
-
addPosition(positions:
|
|
69
|
+
addPosition(positions: AdheseAd, element: HTMLElement): Position;
|
|
69
70
|
render(position: Position): Promise<void>;
|
|
70
71
|
dispose(): void;
|
|
71
72
|
};
|
|
@@ -240,10 +241,27 @@ declare const adResponseSchema: ZodType<AdResponse>;
|
|
|
240
241
|
type PreParsedAd = TypeOf<typeof adResponseSchema> & {
|
|
241
242
|
additionalCreatives?: ReadonlyArray<PreParsedAd> | string;
|
|
242
243
|
};
|
|
243
|
-
type
|
|
244
|
+
type AdheseAd<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {
|
|
244
245
|
tag: T | string;
|
|
245
246
|
};
|
|
246
247
|
|
|
248
|
+
declare function createAsyncHook<Argument = void, Callback extends (() => void | Promise<void>) | ((arg: Argument) => Argument | void | Promise<Argument | void>) = Argument extends void ? () => void | Promise<void> : (arg: Argument) => Argument | void | Promise<Argument | void>>(name: string, { onRun, onAdd, }?: {
|
|
249
|
+
onRun?(callbacks?: Set<Callback>): void;
|
|
250
|
+
onAdd?(callbacks?: Set<Callback>): void;
|
|
251
|
+
}): [
|
|
252
|
+
run: Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>,
|
|
253
|
+
add: (callback: Callback) => () => void,
|
|
254
|
+
dispose: () => void
|
|
255
|
+
];
|
|
256
|
+
declare function createPassiveHook<Argument = void, Callback extends (arg: Argument) => void | Promise<void> = (arg: Argument) => void | Promise<void>>(name: string, { onRun, onAdd, }?: {
|
|
257
|
+
onRun?(callbacks?: Set<Callback>): void;
|
|
258
|
+
onAdd?(callbacks?: Set<Callback>): void;
|
|
259
|
+
}): [
|
|
260
|
+
run: (arg: Argument) => void,
|
|
261
|
+
add: (callback: Callback) => () => void,
|
|
262
|
+
dispose: () => void
|
|
263
|
+
];
|
|
264
|
+
|
|
247
265
|
type RenderMode = 'iframe' | 'inline';
|
|
248
266
|
type AdheseSlotOptions = {
|
|
249
267
|
/**
|
|
@@ -284,10 +302,6 @@ type AdheseSlotOptions = {
|
|
|
284
302
|
* Callback that is called when the slot is disposed.
|
|
285
303
|
*/
|
|
286
304
|
onDispose?(): void;
|
|
287
|
-
/**
|
|
288
|
-
* Callback that is called when the format of the slot changes.
|
|
289
|
-
*/
|
|
290
|
-
onNameChange?(newName: string, oldName: string): void;
|
|
291
305
|
/**
|
|
292
306
|
* Callback that is called when the slot is rendered.
|
|
293
307
|
*/
|
|
@@ -296,7 +310,7 @@ type AdheseSlotOptions = {
|
|
|
296
310
|
* Callback that is called before the ad is rendered. This can be used to modify the ad before it is rendered.
|
|
297
311
|
* Particularly useful for rendering ads with custom HTML if the ad tag contains a JSON object.
|
|
298
312
|
*/
|
|
299
|
-
onBeforeRender?(ad:
|
|
313
|
+
onBeforeRender?(ad: AdheseAd): AdheseAd | void;
|
|
300
314
|
/**
|
|
301
315
|
* Callback that is called when the viewability of the slot changes.
|
|
302
316
|
*/
|
|
@@ -306,6 +320,24 @@ type AdheseSlotOptions = {
|
|
|
306
320
|
* reasons, for example when the slot is not sold to a buyer.
|
|
307
321
|
*/
|
|
308
322
|
onEmpty?(): void;
|
|
323
|
+
/**
|
|
324
|
+
* Special callback that is run when the slot is initialized. It passes the slot context ref object and a special
|
|
325
|
+
* plugin object that contains a set of hooks you can use to hook into different moments of the slots lifecycle.
|
|
326
|
+
*/
|
|
327
|
+
setup?(context: Ref<AdheseSlot | null>, plugin: {
|
|
328
|
+
/**
|
|
329
|
+
* Hook that is called when the slot is rendered.
|
|
330
|
+
*/
|
|
331
|
+
onRender: ReturnType<typeof createAsyncHook<AdheseAd>>[1];
|
|
332
|
+
/**
|
|
333
|
+
* Hook that is called when the slot is requested from the server.
|
|
334
|
+
*/
|
|
335
|
+
onRequest: ReturnType<typeof createAsyncHook<void>>[1];
|
|
336
|
+
/**
|
|
337
|
+
* Hook that is called when the slot is disposed.
|
|
338
|
+
*/
|
|
339
|
+
onDispose: ReturnType<typeof createPassiveHook>[1];
|
|
340
|
+
}): void;
|
|
309
341
|
} & ({
|
|
310
342
|
/**
|
|
311
343
|
* If the slot should be lazy loaded. This means that the ad will only be requested when the slot is in the viewport.
|
|
@@ -322,13 +354,13 @@ type AdheseSlotOptions = {
|
|
|
322
354
|
lazyLoading?: false;
|
|
323
355
|
lazyLoadingOptions?: never;
|
|
324
356
|
});
|
|
325
|
-
type AdheseSlot = Merge<Omit<AdheseSlotOptions, 'onDispose' | 'context' | 'onFormatChange' | 'format'>, {
|
|
357
|
+
type AdheseSlot = Merge<Omit<AdheseSlotOptions, 'onDispose' | 'context' | 'onFormatChange' | 'format' | 'setup'>, {
|
|
326
358
|
/**
|
|
327
359
|
* The name of the slot. This is used to identify the slot in the Adhese instance.
|
|
328
360
|
*
|
|
329
361
|
* The name is generated based on the location, format, and slot of the slot.
|
|
330
362
|
*/
|
|
331
|
-
name:
|
|
363
|
+
readonly name: string;
|
|
332
364
|
/**
|
|
333
365
|
* The format code of the slot. Used to find the correct element on the page to render the ad in.
|
|
334
366
|
*
|
|
@@ -337,11 +369,11 @@ type AdheseSlot = Merge<Omit<AdheseSlotOptions, 'onDispose' | 'context' | 'onFor
|
|
|
337
369
|
*
|
|
338
370
|
* When you change the format, the slot will request a new ad from the API automatically.
|
|
339
371
|
*/
|
|
340
|
-
format:
|
|
372
|
+
readonly format: string;
|
|
341
373
|
/**
|
|
342
374
|
* The location of the slot. This is the location that is used to determine the current page URL.
|
|
343
375
|
*/
|
|
344
|
-
location: string;
|
|
376
|
+
readonly location: string;
|
|
345
377
|
/**
|
|
346
378
|
* The parameters that are used to render the ad.
|
|
347
379
|
*/
|
|
@@ -349,34 +381,55 @@ type AdheseSlot = Merge<Omit<AdheseSlotOptions, 'onDispose' | 'context' | 'onFor
|
|
|
349
381
|
/**
|
|
350
382
|
* Whether the viewability tracking pixel has been fired.
|
|
351
383
|
*/
|
|
352
|
-
isViewabilityTracked:
|
|
384
|
+
readonly isViewabilityTracked: boolean;
|
|
353
385
|
/**
|
|
354
386
|
* Whether the impression tracking pixel has been fired.
|
|
355
387
|
*/
|
|
356
|
-
isImpressionTracked:
|
|
388
|
+
readonly isImpressionTracked: boolean;
|
|
357
389
|
/**
|
|
358
390
|
* Ad object that is fetched from the API.
|
|
359
391
|
*/
|
|
360
|
-
ad:
|
|
392
|
+
ad: AdheseAd | null;
|
|
361
393
|
/**
|
|
362
|
-
*
|
|
394
|
+
* The state of the slot is currently in.
|
|
395
|
+
*
|
|
396
|
+
* - `initializing`: The slot is initializing.
|
|
397
|
+
* - `initialized`: The slot is initialized.
|
|
398
|
+
* - `loading`: The slot is loading data from the API
|
|
399
|
+
* - `loaded`: The slot has loaded data from the API and is ready to render
|
|
400
|
+
* - `empty`: The slot has loaded data from the API but the response was empty
|
|
401
|
+
* - `rendering`: The slot is rendering the ad
|
|
402
|
+
* - `rendered`: The slot has rendered the ad
|
|
403
|
+
* - `error`: The slot has encountered an error
|
|
404
|
+
*/
|
|
405
|
+
readonly status: 'initializing' | 'initialized' | 'loading' | 'loaded' | 'empty' | 'rendering' | 'rendered' | 'error';
|
|
406
|
+
/**
|
|
407
|
+
* Is the slot disposed.
|
|
363
408
|
*/
|
|
364
|
-
|
|
409
|
+
readonly isDisposed: boolean;
|
|
365
410
|
/**
|
|
366
|
-
*
|
|
411
|
+
* The element that contains the slot.
|
|
367
412
|
*/
|
|
368
|
-
|
|
413
|
+
readonly element: HTMLElement | null;
|
|
414
|
+
/**
|
|
415
|
+
* Unique identifier of the slot. ID is generated on initialization and will never change.
|
|
416
|
+
*/
|
|
417
|
+
readonly id: string;
|
|
418
|
+
/**
|
|
419
|
+
* Renders the slot in the containing element. If no ad is provided, a new ad will be requested from the API.
|
|
420
|
+
*/
|
|
421
|
+
render(ad?: AdheseAd): Promise<HTMLElement | null>;
|
|
369
422
|
/**
|
|
370
423
|
* Requests a new ad from the API and returns the ad object.
|
|
371
424
|
*/
|
|
372
|
-
request(): Promise<
|
|
425
|
+
request(): Promise<AdheseAd | null>;
|
|
373
426
|
/**
|
|
374
427
|
* Removes the slot from the DOM and cleans up the slot instance.
|
|
375
428
|
*/
|
|
376
429
|
dispose(): void;
|
|
377
430
|
}>;
|
|
378
431
|
|
|
379
|
-
type
|
|
432
|
+
type AdheseSlotManager = {
|
|
380
433
|
/**
|
|
381
434
|
* Returns all slots that are currently registered and rendered.
|
|
382
435
|
*/
|
|
@@ -421,10 +474,6 @@ type AdRequestOptions = {
|
|
|
421
474
|
type AdMultiRequestOptions = Omit<AdRequestOptions, 'slot'> & {
|
|
422
475
|
slots: ReadonlyArray<AdRequestOptions['slot']>;
|
|
423
476
|
};
|
|
424
|
-
/**
|
|
425
|
-
* Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.
|
|
426
|
-
*/
|
|
427
|
-
declare function requestAd(options: AdRequestOptions): Promise<Ad | null>;
|
|
428
477
|
|
|
429
478
|
declare const logger: _adhese_sdk_shared.Logger<"error" | "trace" | "debug" | "info" | "warn">;
|
|
430
479
|
|
|
@@ -432,11 +481,9 @@ declare const onInit: (callback: (arg: void) => void | Promise<void>) => () => v
|
|
|
432
481
|
|
|
433
482
|
declare const onDispose: (callback: (arg: void) => void | Promise<void>) => () => void;
|
|
434
483
|
|
|
435
|
-
declare const onRender: (callback: (arg: Ad) => void | Ad | Promise<void | Ad>) => () => void;
|
|
436
|
-
|
|
437
484
|
declare const onRequest: (callback: (arg: AdMultiRequestOptions) => void | AdMultiRequestOptions | Promise<void | AdMultiRequestOptions>) => () => void;
|
|
438
485
|
|
|
439
|
-
declare const onResponse: (callback: (arg: readonly
|
|
486
|
+
declare const onResponse: (callback: (arg: readonly AdheseAd[]) => void | readonly AdheseAd[] | Promise<void | readonly AdheseAd[]>) => () => void;
|
|
440
487
|
|
|
441
488
|
declare const onSlotCreate: (callback: (arg: AdheseSlotOptions) => void | Promise<void> | AdheseSlotOptions) => () => void;
|
|
442
489
|
|
|
@@ -445,7 +492,6 @@ type AdhesePluginInformation = {
|
|
|
445
492
|
version: string;
|
|
446
493
|
onInit: typeof onInit;
|
|
447
494
|
onDispose: typeof onDispose;
|
|
448
|
-
onRender: typeof onRender;
|
|
449
495
|
onRequest: typeof onRequest;
|
|
450
496
|
onResponse: typeof onResponse;
|
|
451
497
|
onSlotCreate: typeof onSlotCreate;
|
|
@@ -574,15 +620,18 @@ type AdheseEvents = {
|
|
|
574
620
|
consentChange: boolean;
|
|
575
621
|
addSlot: AdheseSlot;
|
|
576
622
|
removeSlot: AdheseSlot;
|
|
577
|
-
|
|
578
|
-
responseReceived: ReadonlyArray<Ad>;
|
|
623
|
+
responseReceived: ReadonlyArray<AdheseAd>;
|
|
579
624
|
requestAd: AdMultiRequestOptions;
|
|
580
625
|
requestError: Error;
|
|
581
|
-
previewReceived: ReadonlyArray<
|
|
626
|
+
previewReceived: ReadonlyArray<AdheseAd>;
|
|
582
627
|
parametersChange: Map<string, ReadonlyArray<string> | string>;
|
|
583
628
|
debugChange: boolean;
|
|
584
629
|
};
|
|
585
630
|
type BaseAdhese = {
|
|
631
|
+
/**
|
|
632
|
+
* The slots that are in the Adhese instance.
|
|
633
|
+
*/
|
|
634
|
+
slots: Map<string, AdheseSlot>;
|
|
586
635
|
/**
|
|
587
636
|
* The page location. This is used to determine the current page location identifier.
|
|
588
637
|
*/
|
|
@@ -644,12 +693,12 @@ type BaseAdhese = {
|
|
|
644
693
|
*/
|
|
645
694
|
dispose(): void;
|
|
646
695
|
};
|
|
647
|
-
type ReadonlyProps = 'options' | 'safeFrame' | 'isDisposed' | 'logger' | 'events' | 'get' | 'getAll' | 'addSlot' | 'findDomSlots' | 'dispose';
|
|
696
|
+
type ReadonlyProps = 'options' | 'safeFrame' | 'isDisposed' | 'logger' | 'events' | 'get' | 'getAll' | 'addSlot' | 'findDomSlots' | 'dispose' | 'slots';
|
|
648
697
|
type Adhese = Omit<BaseAdhese, ReadonlyProps> & Readonly<Pick<BaseAdhese, ReadonlyProps>>;
|
|
649
698
|
type AdheseContextState = Omit<BaseAdhese, 'options'> & {
|
|
650
699
|
readonly options: MergedOptions;
|
|
651
700
|
};
|
|
652
|
-
type NonPartialProps = 'options' | 'logger' | 'events' | 'isDisposed' | 'location' | 'consent' | 'debug' | 'parameters';
|
|
701
|
+
type NonPartialProps = 'options' | 'logger' | 'events' | 'isDisposed' | 'location' | 'consent' | 'debug' | 'parameters' | 'slots';
|
|
653
702
|
type AdheseContext = Omit<Partial<AdheseContextState>, NonPartialProps> & Pick<AdheseContextState, NonPartialProps>;
|
|
654
703
|
|
|
655
704
|
/**
|
|
@@ -661,4 +710,4 @@ type AdheseContext = Omit<Partial<AdheseContextState>, NonPartialProps> & Pick<A
|
|
|
661
710
|
*/
|
|
662
711
|
declare function createAdhese(options: AdheseOptions): Readonly<Adhese>;
|
|
663
712
|
|
|
664
|
-
export { type
|
|
713
|
+
export { type AdRequestOptions, type Adhese, type AdheseAd, type AdheseContext, type AdheseOptions, type AdhesePlugin, type AdhesePluginInformation, type AdheseSlot, type AdheseSlotManager, type AdheseSlotOptions, createAdhese };
|