@adhese/sdk 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../safeframe/src/main.ts","../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/logger/logger.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onSlotCreate.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/useSlotHooks.ts","../src/slot/createSlot/createSlot.ts","../src/slot/findDomSlots/findDomSlots.ts","../src/slot/slotManager/slotManager.ts","../src/consent/tcfConsent.ts","../src/main.utils.ts","../src/hooks/onDispose.ts","../src/main.ts"],"sourcesContent":["import { uniqueId } from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext } from '@adhese/sdk';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: AdheseAd, element: HTMLElement): Position;\n render(position: Position): Promise<void>;\n dispose(): void;\n};\n\nexport type SafeFrameOptions = {\n renderFile: string;\n context: AdheseContext;\n};\n\nexport function createSafeFrame({\n renderFile,\n context,\n}: SafeFrameOptions): SafeFrame {\n const safeFrame = window.$sf;\n\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const adhesePositions = new Set<Position>();\n\n const config = new safeFrame.host.Config({\n auto: false,\n debug: context.debug,\n renderFile,\n });\n\n function addPosition(ad: AdheseAd, element: HTMLElement): Position {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const html = (ad.ext === 'js' && ad.body) ? ad.body : ad.tag;\n\n if (typeof html !== 'string')\n throw new Error('Ad tag is not a string');\n\n const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;\n\n element.id = elementId;\n\n const position = new safeFrame.host.Position({\n id: elementId,\n html,\n src: ad.ext === 'js' ? ad.swfSrc?.href : undefined,\n config: new safeFrame.host.PosConfig({\n id: elementId,\n w: Number(ad.width),\n h: Number(ad.height),\n size: `${Number(ad.width)}x${Number(ad.height)}`,\n tgt: html.includes('target=\"_self\"') ? '_self' : '_blank',\n dest: elementId,\n }),\n });\n\n adhesePositions.add(position);\n\n return position;\n }\n\n async function render(position: Position): Promise<void> {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n safeFrame.host.render(position);\n }\n\n function dispose(): void {\n }\n\n return {\n config,\n addPosition,\n render,\n dispose,\n };\n}\n","import type { AdheseAd } from '@adhese/sdk';\n\nexport function renderIframe(ad: AdheseAd, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: AdheseAd, element: HTMLElement): void {\n element.innerHTML = String(ad.tag);\n}\n\nexport function generateName(\n location: string,\n format: string,\n slot: string | undefined,\n): string {\n return `${location}${slot ? `${slot}` : ''}-${format}`;\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\n","import { debounce } from 'remeda';\nimport { logger } from '../logger/logger';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, {\n waitMs: 50,\n });\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange.call);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange.call);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","const hookMap = new Map<string, Set<Function>>();\n\nexport function clearAllHooks(): void {\n hookMap.clear();\n}\n\nexport function createAsyncHook<\n Argument = void,\n Callback extends (() => void | Promise<void>) | ((arg: Argument) => Argument | void | Promise<Argument | void>) = Argument extends void ?\n () => void | Promise<void> :\n (arg: Argument) => Argument | void | Promise<Argument | void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>,\n add: (callback: Callback) => () => void,\n dispose: () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = (async (arg) => {\n let latestResult: Argument = arg;\n\n for (const callback of hookMap.get(name) ?? [])\n // eslint-disable-next-line no-await-in-loop\n latestResult = (await callback(latestResult) as Argument) ?? latestResult;\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>;\n\n function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\n}\n\nexport function createSyncHook<\n Argument = void,\n Callback extends (arg: Argument) => Argument | void | Promise<void> = (arg: Argument) => Argument | void | Promise<void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: (arg: Argument) => Argument,\n add: (callback: Callback) => () => void,\n dispose: () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = ((arg) => {\n let latestResult: Argument = arg;\n\n const promisedCallbacks: Array<Callback> = [];\n\n for (const callback of hookMap.get(name) ?? []) {\n if (isCallbackAsync(callback))\n promisedCallbacks.push(callback as Callback);\n else\n latestResult = callback(latestResult) as Argument ?? latestResult;\n }\n\n // eslint-disable-next-line no-console\n Promise.allSettled(promisedCallbacks.map(callback => callback(latestResult) as Argument)).catch(console.trace);\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as (arg: Argument) => Argument;\n\n function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\n}\n\nexport function createPassiveHook<\n Argument = void,\n Callback extends (arg: Argument) => void | Promise<void> = (arg: Argument) => void | Promise<void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: (arg: Argument) => void,\n add: (callback: Callback) => () => void,\n dispose: () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n function run(arg: Argument): void {\n // eslint-disable-next-line no-console\n Promise.allSettled(Array.from(hookMap.get(name) ?? []).map(callback => callback(arg) as Callback)).catch(console.trace);\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n }\n\n function dispose(): void {\n hookMap.delete(name);\n }\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd }), dispose];\n}\n\nfunction isCallbackAsync(callback: Function): boolean {\n return callback.constructor.name === 'AsyncFunction';\n}\n\nfunction add<Callback extends Function>(callback: Callback, {\n name,\n onAdd,\n}: {\n name: string;\n onAdd?(hookSet: Set<Callback>): void;\n}): () => void {\n const hookSet = hookMap.get(name);\n\n if (hookSet)\n hookSet.add(callback);\n else\n hookMap.set(name, new Set([callback]));\n\n onAdd?.(hookSet as Set<Callback>);\n\n return () => {\n hookMap.get(name)?.delete(callback);\n };\n}\n","import { createSyncHook } from './createHook';\n\nlet resolveOnInitPromise = (): void => {};\nlet isInit = false;\nconst waitOnInit = new Promise<void>((resolve) => {\n resolveOnInitPromise = resolve;\n});\n\nconst [runOnInit, onInit] = createSyncHook('onInit', {\n onRun(callbacks) {\n isInit = true;\n\n resolveOnInitPromise();\n\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n});\n\nexport {\n onInit,\n runOnInit,\n waitOnInit,\n};\n","import type { AdMultiRequestOptions } from '../requestAds/requestAds';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdMultiRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { AdheseAd } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import { logger } from '../logger/logger';\nimport type { AdheseAd } from './requestAds.schema';\n\n/**\n * Request preview ads for the given account. This function will only return items when there are preview objects in the\n * URL detected.\n */\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<AdheseAd>> {\n const previewObjects = getPreviewObjects();\n\n const [list, adSchema] = await Promise.all([\n Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })),\n import('./requestAds.schema').then(module => module.adSchema),\n ]);\n\n return adSchema.array().parse(list\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .flatMap(response => response.value.map(item => ({\n ...item,\n preview: true,\n })))) as ReadonlyArray<AdheseAd>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { toValue } from '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport type { AdMultiRequestOptions } from './requestAds';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context,\n ...options\n}: Omit<AdMultiRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: context.parameters && parseParameters(context.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(context.options.host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdMultiRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }).map(([key, value]): [string, T] => {\n if (typeof value === 'string')\n return [key, filterSpecialChars(value) as T];\n\n return [key, value.map(filterSpecialChars) as unknown as T];\n }));\n}\n\nfunction filterSpecialChars(value: string): string {\n const specialRegex = /[^\\p{L}\\p{N}_]/gu;\n\n return value.replaceAll(specialRegex, '_');\n}\n","import { type MaybeRef, toValue } from '@adhese/sdk-shared';\nimport { debounce } from 'remeda';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport type { AdheseAd } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * Slot you want to fetch the ad for\n */\n slot: {\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n };\n context: AdheseContext;\n};\n\nexport type AdMultiRequestOptions = Omit<AdRequestOptions, 'slot'> & {\n slots: ReadonlyArray<AdRequestOptions['slot']>;\n};\n\nconst batch = new Map<string, {\n options: AdRequestOptions;\n resolve(ad: AdheseAd | null): void;\n}>();\n\n/**\n * Debounced function to request ads in batches. This function is debounced to prevent multiple requests for the same ad.\n */\nconst runRequestAdsBatch = debounce(async (context: AdheseContext) => {\n if (batch.size === 0)\n return [];\n\n const ads = await requestAds({\n slots: Array.from(batch.values()).map(({ options }) => options.slot),\n context,\n });\n\n for (const { options, resolve } of batch.values()) {\n const ad = ads.find(({ slotName }) => toValue(slotName) === toValue(options.slot.name));\n\n if (ad)\n resolve(ad);\n else\n resolve(null);\n }\n\n batch.clear();\n\n return ads;\n}, {\n waitMs: 20,\n timing: 'trailing',\n});\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd(options: AdRequestOptions): Promise<AdheseAd | null> {\n const promise = new Promise<AdheseAd | null>((resolve) => {\n batch.set(toValue(options.slot.name), { options, resolve });\n },\n );\n\n await runRequestAdsBatch.call(options.context);\n\n return promise;\n}\n\n/**\n * Request multiple ads from the API. If you need to fetch a single ad use the `requestAd` function.\n */\nexport async function requestAds(requestOptions: AdMultiRequestOptions): Promise<ReadonlyArray<AdheseAd>> {\n const options = await runOnRequest(requestOptions);\n\n const { context } = options;\n\n try {\n context?.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews, parseResponse] = await Promise.all([\n context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options),\n requestPreviews(context.options.account),\n import('./requestAds.schema').then(module => module.parseResponse),\n ]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult = await runOnResponse([\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ]);\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context?.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n","import type { AdheseSlotOptions } from '@adhese/sdk';\nimport { createSyncHook } from './createHook';\n\nconst [runOnSlotCreate, onSlotCreate] = createSyncHook<AdheseSlotOptions>('onSlotCreate');\n\nexport { runOnSlotCreate, onSlotCreate };\n","import { type ComputedRef, type Ref, computed, ref, watch } from '@adhese/sdk-shared';\nimport { round } from 'remeda';\nimport type { AdheseAd, AdheseContext } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { logger } from '../../logger/logger';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<AdheseAd | null>;\n name: ComputedRef<string>;\n element: ComputedRef<HTMLElement | null>;\n },\n): [\n ComputedRef,\n IntersectionObserver['disconnect'],\n ] {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = computed(() => Boolean(trackingPixel.value));\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad.value?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(ad.value.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${name.value}`);\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isTracked, (): void => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n }];\n}\n","import { type Ref, ref, watch } from '@adhese/sdk-shared';\nimport type { AdheseSlotOptions } from '@adhese/sdk';\n\nexport function useRenderIntersectionObserver({ options, element }: {\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import type { AdheseAd, AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport type { Ref, UnwrapRef } from '@adhese/sdk-shared';\nimport { createAsyncHook, createPassiveHook } from '../../hooks/createHook';\n\nexport function useSlotHooks({ setup }: AdheseSlotOptions, slotContext: Ref<UnwrapRef<AdheseSlot | null>>, id: string): {\n runOnSlotRender: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnRequest: ReturnType<typeof createAsyncHook<void>>[0];\n runOnDispose: ReturnType<typeof createPassiveHook<void>>[0];\n} {\n const [runOnSlotRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>(`onRender:${id}`);\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook(`onRequest:${id}`);\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook(`onDispose:${id}`);\n\n setup?.(slotContext, {\n onRender,\n onDispose,\n onRequest,\n });\n\n onDispose(() => {\n disposeOnRender();\n disposeOnRequest();\n disposeOnDispose();\n });\n\n return { runOnSlotRender, runOnRequest, runOnDispose };\n}\n","import { type Ref, type UnwrapRef, computed, effectScope, reactive, ref, uniqueId, waitForDomLoad, watch } from '@adhese/sdk-shared';\nimport { isDeepEqual } from 'remeda';\nimport type { AdheseAd } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport { onInit, waitOnInit } from '../../hooks/onInit';\nimport { requestAd as extRequestAd } from '../../requestAds/requestAds';\nimport { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport { logger } from '../../logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\nimport { useSlotHooks } from './useSlotHooks';\n\nconst renderFunctions: Record<RenderMode, (ad: AdheseAd, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlot | null>(null);\n const options = runOnSlotCreate(slotOptions);\n\n const id = uniqueId();\n\n const { runOnSlotRender, runOnDispose, runOnRequest } = useSlotHooks(options, slotContext, id);\n\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format !== 'string') {\n queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n }\n\n const format = ref(queryDetector ? queryDetector.getQuery() : options.format as string);\n function onQueryChange(newFormat: string): void {\n format.value = newFormat;\n }\n\n const ad = ref<AdheseAd | null>(null);\n const originalAd = ref(ad.value);\n\n const name = computed(() => generateName(context.location, format.value, slot));\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n const newAd = await requestAd();\n\n cleanElement();\n\n ad.value = newAd;\n originalAd.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const isDisposed = ref(false);\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value || isDisposed.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n options,\n element,\n });\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if ((!newAd || (oldAd && isDeepEqual(newAd, oldAd))) && status.value === 'rendered')\n return;\n\n if (newIsInViewport)\n await render(newAd ?? undefined);\n });\n\n watch(isInViewport, (value) => {\n options.onViewabilityChanged?.(value);\n });\n\n const [\n isViewabilityTracked,\n disposeViewabilityObserver,\n ] = useViewabilityObserver({\n context,\n ad,\n name,\n element,\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = computed(() => Boolean(impressionTrackingPixelElement.value));\n\n async function requestAd(): Promise<AdheseAd | null> {\n status.value = 'loading';\n\n await runOnRequest();\n\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n if (response) {\n ad.value = response;\n\n if (!originalAd.value)\n originalAd.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n }\n\n return response;\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n status.value = 'rendering';\n\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (!renderAd) {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n return null;\n }\n\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnSlotRender(renderAd);\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (context.safeFrame && renderAd && renderMode === 'iframe') {\n const position = context.safeFrame.addPosition(renderAd, element.value);\n\n await context.safeFrame.render(position);\n }\n else {\n renderFunctions[renderMode](renderAd, element.value);\n }\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n options.onRender?.(element.value);\n\n // eslint-disable-next-line require-atomic-updates\n ad.value = renderAd;\n\n status.value = 'rendered';\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n ad.value = null;\n\n disposeRenderIntersectionObserver();\n disposeViewabilityObserver();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n\n runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n onInit(async () => {\n status.value = 'initialized';\n\n if (options.lazyLoading)\n return;\n\n ad.value = await requestAd();\n });\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n render,\n request: requestAd,\n dispose,\n });\n\n watch(state, (newState) => {\n slotContext.value = newState;\n }, {\n deep: true,\n immediate: true,\n });\n\n return state;\n })!;\n}\n\nfunction useDomLoaded(): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n","import { waitForDomLoad } from '@adhese/sdk-shared';\nimport { generateName } from '../createSlot/createSlot.utils';\nimport type { AdheseContext } from '../../main.types';\nimport type { AdheseSlot } from '../createSlot/createSlot.types';\nimport { createSlot } from '../createSlot/createSlot';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter((element) => {\n if (!element.dataset.format)\n return false;\n\n const name = generateName(\n context.location,\n element.dataset.format,\n element.dataset.slot,\n );\n\n return !context.getAll?.().some(activeSlot => activeSlot.name === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name === slot.name));\n}\n","import type { Merge } from '@adhese/sdk-shared';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\nimport type { AdheseSlot, AdheseSlotOptions } from '../createSlot/createSlot.types';\nimport type { AdheseContext } from '../../main.types';\nimport { createSlot } from '../createSlot/createSlot';\nimport { logger } from '../../logger/logger';\n\nexport type AdheseSlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\n/**\n * Creates a new slot manager instance. This slot manager instance can be used to manage all slots in the Adhese\n * instance. It will automatically add all slots that are passed in the `initialSlots` array.\n */\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): AdheseSlotManager {\n context.slots = new Map<string, AdheseSlot>();\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(context.slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose'>): Readonly<AdheseSlot> {\n // console.log(options, context.slots, names.value);\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n if (get(slot.name)) {\n slot.dispose();\n\n throw new Error(`Slot with the name: ${slot.name} already exists. Create a new slot with a different format, slot, or the location.`);\n }\n\n function onDispose(): void {\n context.slots.delete(slot.id);\n logger.debug('Slot removed', {\n slot,\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n context.slots.set(slot.id, slot);\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(context.slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n context.slots.set(slot.id, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return getAll().find(slot => slot.name === name);\n }\n\n function dispose(): void {\n for (const slot of context.slots.values())\n slot.dispose();\n\n context.slots.clear();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\n/**\n * Creates the parameters map with a set of default parameters.\n */\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): Map<string, string | ReadonlyArray<string>> {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\n/**\n * Sets up logging based on the provided options. If debug is enabled, the log level threshold is set to debug.\n */\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\n/**\n * Checks if the current page is in preview mode.\n */\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n","import { createSyncHook } from './createHook';\n\nlet isDisposed = false;\n\nconst [runOnDispose, onDispose] = createSyncHook('onDispose', {\n onRun(callbacks) {\n isDisposed = true;\n\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n});\n\nexport {\n onDispose,\n runOnDispose,\n};\n","import { awaitTimeout, createEventManager, effectScope, reactive, watch } from '@adhese/sdk-shared';\nimport { createSafeFrame } from '@safeframe';\nimport { version } from '../package.json';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContextState, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\nimport { onRequest } from './hooks/onRequest';\nimport { onSlotCreate } from './hooks/onSlotCreate';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options {AdheseOptions} The options to create the Adhese instance with. See the {@link AdheseOptions} type for more information.\n *\n * @return Adhese The Adhese instance.\n */\nexport function createAdhese(options: AdheseOptions): Readonly<Adhese> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n safeFrame: false,\n eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive<AdheseContextState>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n options: mergedOptions,\n logger,\n isDisposed: false,\n parameters: new Map(),\n events: createEventManager(),\n slots: new Map(),\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version,\n onInit,\n onDispose,\n onRequest,\n onResponse,\n onSlotCreate,\n });\n }\n\n context.events = createEventManager();\n\n context.safeFrame = options.safeFrame\n ? createSafeFrame({\n renderFile: `${mergedOptions.poolHost}/sf/r.html`,\n context,\n })\n : undefined;\n\n watch(() => context.location, (newLocation) => {\n context.events?.locationChange.dispatch(newLocation);\n });\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n\n watch(\n () => context.parameters,\n (newParameters) => {\n context.events?.parametersChange.dispatch(newParameters);\n },\n {\n deep: true,\n },\n );\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAllUnrenderedSlots();\n }\n\n watch(() => context.consent, (newConsent) => {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n\n context.events?.consentChange.dispatch(newConsent);\n }, {\n immediate: true,\n });\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n context.getAll = getAll;\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n context.get = get;\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n return slotManager.add(slotOptions);\n }\n context.addSlot = addSlot;\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots() ?? []).filter(slot => !slot.lazyLoading);\n\n if (domSlots.length <= 0)\n return [];\n\n await fetchAllUnrenderedSlots();\n\n return domSlots;\n }\n context.findDomSlots = findDomSlots;\n\n watch(() => context.debug, async (newDebug) => {\n if (newDebug) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n }, {\n immediate: true,\n });\n\n async function fetchAllUnrenderedSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading && !slot.ad);\n\n if (slots.length === 0)\n return;\n\n await Promise.allSettled(slots.map(slot => slot.request()));\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAllUnrenderedSlots();\n });\n\n function dispose(): void {\n context.isDisposed = true;\n\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n logger.info('Adhese instance disposed');\n\n runOnDispose();\n\n clearAllHooks();\n\n scope.stop();\n }\n context.dispose = dispose;\n\n onInit(async () => {\n await awaitTimeout(0);\n\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAllUnrenderedSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await context?.findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n context.events?.debugChange.dispatch(true);\n\n if (!scope.active)\n dispose();\n });\n\n runOnInit();\n\n return context;\n })!;\n}\n"],"names":["name","runOnRequest","onRequest","runOnDispose","onDispose","requestAd","isDisposed","extRequestAd","add","_a","findDomSlots","extFindDomSlots"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/impressionTracking/impressionTracking.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../src/logger/logger.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/hooks/onDispose.ts","../src/queryDetector/queryDetector.ts","../src/slot/slot.utils.ts","../src/slot/slot.composables.ts","../src/slot/slot.ts","../src/findDomSlots/findDomSlots.ts","../src/slotManager/slotManager.ts","../src/consent/consent.ts","../src/main.utils.ts","../src/main.composables.ts","../src/main.ts"],"sourcesContent":["/**\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","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 (arg: Argument) => Argument | void | Promise<Argument | void> = (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: (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 (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 { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\n","import type { AdMultiRequestOptions } from '../requestAds/requestAds';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdMultiRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { AdheseAd } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import { logger } from '../logger/logger';\nimport type { AdheseAd } from './requestAds.schema';\n\n/**\n * Request preview ads for the given account. This function will only return items when there are preview objects in the\n * URL detected.\n */\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<AdheseAd>> {\n const previewObjects = getPreviewObjects();\n\n const [list, adSchema] = await Promise.all([\n Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })),\n import('./requestAds.schema').then(module => module.adSchema),\n ]);\n\n return adSchema.array().parse(list\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .flatMap(response => response.value.map(item => ({\n ...item,\n preview: true,\n })))) as ReadonlyArray<AdheseAd>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { toValue } from '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport type { AdMultiRequestOptions } from './requestAds';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context,\n ...options\n}: Omit<AdMultiRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: context.parameters && parseParameters(context.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(context.options.host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdMultiRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }).map(([key, value]): [string, T] => {\n if (typeof value === 'string')\n return [key, filterSpecialChars(value) as T];\n\n return [key, value.map(filterSpecialChars) as unknown as T];\n }));\n}\n\nfunction filterSpecialChars(value: string): string {\n const specialRegex = /[^\\p{L}\\p{N}_]/gu;\n\n return value.replaceAll(specialRegex, '_');\n}\n","import { type MaybeRef, toValue } from '@adhese/sdk-shared';\nimport { debounce } from 'remeda';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport type { AdheseAd } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * Slot you want to fetch the ad for\n */\n slot: {\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n };\n context: AdheseContext;\n};\n\nexport type AdMultiRequestOptions = Omit<AdRequestOptions, 'slot'> & {\n slots: ReadonlyArray<AdRequestOptions['slot']>;\n};\n\nconst batch = new Map<string, {\n options: AdRequestOptions;\n resolve(ad: AdheseAd | null): void;\n}>();\n\n/**\n * Debounced function to request ads in batches. This function is debounced to prevent multiple requests for the same ad.\n */\nconst runRequestAdsBatch = debounce(async (context: AdheseContext) => {\n if (batch.size === 0)\n return [];\n\n const ads = await requestAds({\n slots: Array.from(batch.values()).map(({ options }) => options.slot),\n context,\n });\n\n for (const { options, resolve } of batch.values()) {\n const ad = ads.find(({ slotName }) => toValue(slotName) === toValue(options.slot.name));\n\n if (ad)\n resolve(ad);\n else\n resolve(null);\n }\n\n batch.clear();\n\n return ads;\n}, {\n waitMs: 20,\n timing: 'trailing',\n});\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd(options: AdRequestOptions): Promise<AdheseAd | null> {\n const promise = new Promise<AdheseAd | null>((resolve) => {\n batch.set(toValue(options.slot.name), { options, resolve });\n },\n );\n\n await runRequestAdsBatch.call(options.context);\n\n return promise;\n}\n\n/**\n * Request multiple ads from the API. If you need to fetch a single ad use the `requestAd` function.\n */\nexport async function requestAds(requestOptions: AdMultiRequestOptions): Promise<ReadonlyArray<AdheseAd>> {\n const options = await runOnRequest(requestOptions);\n\n const { context } = options;\n\n try {\n context?.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews, parseResponse] = await Promise.all([\n context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options),\n requestPreviews(context.options.account),\n import('./requestAds.schema').then(module => module.parseResponse),\n ]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult = await runOnResponse([\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ]);\n\n 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 { 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 { debounce } from 'remeda';\nimport { type ComputedRef, computed, ref } from '@adhese/sdk-shared';\nimport { onInit } from '../hooks/onInit';\nimport { onDispose } from '../hooks/onDispose';\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n */\nexport function useQueryDetector(queries: Record<string, string> = {\n mobile: '(max-width: 768px)',\n tablet: '(min-width: 769px) and (max-width: 1024px)',\n desktop: '(min-width: 1025px)',\n}): [ComputedRef<string>, () => void] {\n const entries = Object.entries(queries);\n\n const active = ref(getQuery(entries));\n const queryList = entries.map(([, query]) => window.matchMedia(query));\n\n const handleOnChange = debounce((): void => {\n active.value = getQuery(entries);\n }, {\n waitMs: 50,\n });\n\n onInit(() => {\n for (const query of queryList)\n query.addEventListener('change', handleOnChange.call);\n\n handleOnChange.call();\n });\n\n function dispose(): void {\n for (const query of queryList)\n query.removeEventListener('change', handleOnChange.call);\n }\n\n onDispose(dispose);\n\n return [computed(() => active.value), dispose];\n}\n\nfunction getQuery(entries: ReadonlyArray<[string, string]>): string {\n for (const [device, query] of entries) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\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","import {\n type ComputedRef,\n type Ref,\n computed,\n ref,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext, AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport { round } from 'remeda';\nimport { onInit } from '../hooks/onInit';\nimport { createAsyncHook, createPassiveHook } from '../hooks/createHook';\nimport type { SlotHooks } from './slot.types';\n\nexport function 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\nexport function useRenderIntersectionObserver({ options, element, hooks }: {\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n hooks: SlotHooks;\n}): Ref<boolean> {\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 hooks.onDispose(() => {\n renderIntersectionObserver.disconnect();\n });\n\n return isInViewport;\n}\n\nexport function useViewabilityObserver(\n { context, slotContext, hooks, onTracked }: {\n context: AdheseContext;\n slotContext: Ref<AdheseSlot | null>;\n hooks: SlotHooks;\n onTracked?(trackingPixel: Ref<HTMLImageElement | null>): void;\n },\n): ComputedRef<boolean> {\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) {\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 onTracked?.(trackingPixel);\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(() => slotContext.value?.element, (element) => {\n if (element)\n observe(element);\n }, { immediate: true });\n\n watch(slotContext, (slot) => {\n if (slot?.element)\n viewabilityObserver.observe(slot.element);\n }, { once: true });\n\n hooks.onDispose(() => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n });\n\n return isTracked;\n}\n\nexport function useSlotHooks({ setup }: AdheseSlotOptions, slotContext: Ref<AdheseSlot | null>, id: string): {\n runOnBeforeRender: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnRender: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnBeforeRequest: ReturnType<typeof createAsyncHook<AdheseAd | null>>[0];\n runOnRequest: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnDispose: ReturnType<typeof createPassiveHook<void>>[0];\n} & SlotHooks {\n const [runOnBeforeRender, onBeforeRender, disposeOnBeforeRender] = createAsyncHook<AdheseAd>(`onBeforeRender:${id}`);\n const [runOnRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>(`onRender:${id}`);\n const [runOnBeforeRequest, onBeforeRequest, disposeOnBeforeRequest] = createAsyncHook<AdheseAd | null>(`onBeforeRequest:${id}`);\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdheseAd>(`onRequest:${id}`);\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook(`onDispose:${id}`);\n\n setup?.(slotContext, {\n onBeforeRender,\n onRender,\n onBeforeRequest,\n onDispose,\n onRequest,\n });\n\n onDispose(() => {\n disposeOnBeforeRender();\n disposeOnRender();\n disposeOnBeforeRequest();\n disposeOnRequest();\n disposeOnDispose();\n });\n\n return { runOnBeforeRender, runOnRender, runOnBeforeRequest, runOnRequest, runOnDispose, onDispose, onBeforeRequest, onRequest, onBeforeRender, onRender };\n}\n","import {\n type Ref,\n type UnwrapRef,\n computed,\n effectScope,\n reactive,\n ref,\n uniqueId,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport { doNothing, isDeepEqual } from 'remeda';\nimport type { AdheseAd } from '@adhese/sdk';\nimport { addTrackingPixel } from '../impressionTracking/impressionTracking';\nimport { onInit, waitOnInit } from '../hooks/onInit';\nimport { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport { runOnSlotCreate } from '../hooks/onSlotCreate';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './slot.types';\nimport { generateName, renderIframe, renderInline } from './slot.utils';\nimport {\n useDomLoaded,\n useRenderIntersectionObserver,\n useSlotHooks,\n useViewabilityObserver,\n} from './slot.composables';\n\nconst renderFunctions: Record<RenderMode, (ad: AdheseAd, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n none: doNothing,\n};\n\nconst defaultOptions = {\n renderMode: 'iframe',\n type: 'normal',\n} satisfies Partial<AdheseSlotOptions>;\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({\n ...defaultOptions,\n ...slotOptions,\n });\n\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n type = 'normal',\n } = options;\n\n const id = uniqueId();\n const {\n runOnBeforeRender,\n runOnRender,\n runOnBeforeRequest,\n runOnRequest,\n runOnDispose,\n ...hooks\n } = useSlotHooks(options, slotContext, id);\n\n const isDisposed = ref(false);\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n\n const [device, disposeQueryDetector] = useQueryDetector(typeof options.format === 'string'\n ? {\n [options.format]: '(min-width: 0px)',\n }\n : Object.fromEntries(options.format.map(item => [item.format, item.query])));\n\n const format = computed(() => typeof options.format === 'string' ? options.format : device.value);\n\n const data = ref<AdheseAd | null>(null) as Ref<AdheseAd | null>;\n const originalData = ref(data.value) as Ref<AdheseAd | null>;\n const name = computed(() => generateName(options.context.location, format.value, options.slot));\n\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n const newAd = await slotContext.value?.request();\n\n if (!newAd)\n return;\n\n slotContext.value?.cleanElement();\n\n data.value = newAd;\n originalData.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const element = computed(() => {\n if (!(typeof options.containingElement === 'string' || !options.containingElement))\n return options.containingElement;\n\n if (!isDomLoaded.value || slotContext.value?.isDisposed)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${options.containingElement}${options.slot ? `[data-slot=\"${options.slot}\"]` : ''}`);\n },\n );\n\n const isInViewport = useRenderIntersectionObserver({\n options,\n element,\n hooks,\n });\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n\n watch([data, isInViewport], async ([newData, newIsInViewport], [oldData]) => {\n if ((!newData || (oldData && isDeepEqual(newData, oldData))) && status.value === 'rendered')\n return;\n\n if (newIsInViewport)\n await slotContext.value?.render(newData ?? undefined);\n });\n\n hooks.onDispose(() => {\n disposeQueryDetector();\n });\n\n onInit(async () => {\n status.value = 'initialized';\n\n if (options.lazyLoading)\n return;\n\n data.value = await slotContext.value?.request() ?? null;\n });\n\n const isViewabilityTracked = useViewabilityObserver({\n context,\n slotContext,\n hooks,\n onTracked(trackingPixel) {\n if (slotContext.value?.data?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(slotContext.value?.data?.viewableImpressionCounter);\n\n context.logger.debug(`Viewability tracking pixel fired for ${slotContext.value?.name}`);\n }\n },\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = computed(() => Boolean(impressionTrackingPixelElement.value));\n\n async function request(): Promise<AdheseAd | null> {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'loading';\n\n let response = await runOnBeforeRequest(null);\n\n if (!response) {\n response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n }\n\n if (response)\n response = await runOnRequest(response);\n\n data.value = response;\n\n if (!originalData.value)\n originalData.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n\n if (!response)\n cleanElement();\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 ?? data.value ?? originalData.value ?? await request();\n\n renderAd = renderAd && await runOnBeforeRender(renderAd);\n\n if (!renderAd) {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n\n return null;\n }\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 (typeof renderAd?.tag !== 'string') {\n const error = `Could not render slot for slot ${name.value}. A valid tag doesn't exist or is not HTML string.`;\n logger.error(error, options);\n\n status.value = 'error';\n throw new Error(error);\n }\n\n renderFunctions[renderMode](renderAd, element.value);\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n // eslint-disable-next-line require-atomic-updates\n data.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 data.value = null;\n originalData.value = null;\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n data.value = null;\n\n runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n type,\n slot,\n parameters,\n format,\n name,\n data,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n render,\n request,\n dispose,\n cleanElement,\n ...hooks,\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","import { waitForDomLoad } from '@adhese/sdk-shared';\nimport type { AdheseContext, AdheseSlot } from '@adhese/sdk';\nimport { createSlot } from '../slot/slot';\nimport { generateName } from '../slot/slot.utils';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return 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 { AdheseContext } from '../main.types';\nimport { createSlot } from '../slot/slot';\nimport { logger } from '../logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions } from '../slot/slot.types';\n\nexport type AdheseSlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\n/**\n * Creates a new slot manager instance. This slot manager instance can be used to manage all slots in the Adhese\n * instance. It will automatically add all slots that are passed in the `initialSlots` array.\n */\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): AdheseSlotManager {\n context.slots = new Map<string, AdheseSlot>();\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(context.slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n context,\n setup(slotContext, slotHooks) {\n options.setup?.(slotContext, slotHooks);\n\n slotHooks.onDispose(() => {\n context.slots.delete(slot.id);\n logger.debug('Slot removed', {\n slot,\n });\n context.events?.removeSlot.dispatch(slot);\n });\n },\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 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 ComputedRef, type Ref, computed, ref, watch } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '@adhese/sdk';\nimport type { ConsentData } from '../types';\nimport { onInit } from '../hooks/onInit';\nimport { onDispose } from '../hooks/onDispose';\n\nexport function useConsent(context: AdheseContext): [\n value: Ref<string>,\n type: ComputedRef<'binary' | 'tcf'>,\n] {\n const consent = ref('none');\n const consentType = computed(() => (consent.value === 'none' || consent.value === 'all') ? 'binary' : 'tcf');\n\n function onTcfConsentChange(data: ConsentData): void {\n if (data.tcString)\n consent.value = data.tcString;\n }\n\n onInit(() => {\n window.__tcfapi?.('addEventListener', 2, onTcfConsentChange);\n });\n\n onDispose(() => {\n window.__tcfapi?.('removeEventListener', 2, onTcfConsentChange);\n });\n\n watch(() => context.consent, (newConsent) => {\n consent.value = newConsent ? 'all' : 'none';\n }, { immediate: true });\n\n watch([consent, consentType], ([newConsent, newConsentType]) => {\n if (newConsentType === 'binary') {\n context.parameters.set('tl', newConsent);\n context.parameters.delete('xt');\n }\n else {\n context.parameters.set('xt', newConsent);\n context.parameters.delete('tl');\n }\n }, { immediate: true });\n\n return [consent, consentType];\n}\n","import { logger } from './logger/logger';\n\nimport type { AdheseContext } from './main.types';\nimport type { AdheseSlot } from './slot/slot.types';\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\nexport async function fetchAllUnrenderedSlots(slots: ReadonlyArray<AdheseSlot>): Promise<void> {\n const filteredSlots = slots.filter(slot => !slot.lazyLoading && !slot.data);\n\n if (filteredSlots.length === 0)\n return;\n\n await Promise.allSettled(filteredSlots.map(slot => slot.request()));\n}\n","import { watch } from '@adhese/sdk-shared';\nimport type { AdheseContextState, MergedOptions } from './main.types';\nimport { useQueryDetector } from './queryDetector/queryDetector';\nimport { onDispose } from './hooks/onDispose';\n\nexport function useMainQueryDetector(mergedOptions: MergedOptions, context: AdheseContextState): void {\n const [device] = useQueryDetector(mergedOptions.queries);\n watch(device, async (newDevice) => {\n context.device = newDevice;\n\n context.parameters?.set('dt', newDevice);\n context.parameters?.set('br', newDevice);\n\n await Promise.allSettled(context.getAll().map(slot => slot.request()));\n }, { immediate: true });\n}\n\nexport function useMainDebugMode(context: AdheseContextState): void {\n watch(() => context.debug, async (newDebug) => {\n if (newDebug) {\n context.logger.setMinLogLevelThreshold('debug');\n context.logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n context.logger.debug('Debug mode disabled');\n context.logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n }, {\n immediate: true,\n });\n\n onDispose(() => {\n context.logger.resetLogs();\n context.logger.info('Adhese instance disposed');\n });\n}\n\nexport function useMainParameters(context: AdheseContextState, options: MergedOptions): void {\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 rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n context.parameters = parameters;\n\n watch(\n () => context.parameters,\n (newParameters) => {\n context.events?.parametersChange.dispatch(newParameters);\n },\n {\n deep: true,\n },\n );\n}\n","import { awaitTimeout, createEventManager, effectScope, reactive, watch } from '@adhese/sdk-shared';\nimport { version } from '../package.json';\nimport { createSlotManager } from './slotManager/slotManager';\nimport { useConsent } from './consent/consent';\nimport { fetchAllUnrenderedSlots, 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 { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\nimport { onRequest } from './hooks/onRequest';\nimport { onSlotCreate } from './hooks/onSlotCreate';\nimport { useMainDebugMode, useMainParameters, useMainQueryDetector } from './main.composables';\n\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/slot.types';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options {AdheseOptions} The options to create the Adhese instance with. See the {@link AdheseOptions} type for more information.\n *\n * @return Adhese The Adhese instance.\n */\nexport function createAdhese(options: AdheseOptions): Readonly<Adhese> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive<AdheseContextState>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n options: mergedOptions,\n logger,\n isDisposed: false,\n parameters: new Map(),\n events: createEventManager(),\n slots: new Map(),\n device: 'unknown',\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 watch(() => context.location, (newLocation) => {\n context.events?.locationChange.dispatch(newLocation);\n });\n\n useMainParameters(context, mergedOptions);\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(context.getAll());\n\n return domSlots;\n }\n context.findDomSlots = findDomSlots;\n\n useMainDebugMode(context);\n\n useMainQueryDetector(mergedOptions, context);\n\n useConsent(context);\n\n function dispose(): void {\n context.isDisposed = true;\n\n slotManager.dispose();\n context.parameters?.clear();\n context.events?.dispose();\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(context.getAll()).catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await context?.findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n context.events?.debugChange.dispatch(true);\n\n if (!scope.active)\n dispose();\n });\n\n runOnInit();\n\n return context;\n })!;\n}\n"],"names":["name","runOnRequest","onRequest","runOnDispose","onDispose","isDisposed","extRequestAd","add","_a","findDomSlots","extFindDomSlots"],"mappings":"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"}
@@ -1,61 +1,5 @@
1
- import { union, coerce, literal, number, string, ZodIssueCode, NEVER, object, unknown, lazy } from "zod";
2
- const numberLike = union([coerce.string().regex(/^\d+$/), literal("")]).transform((value) => value === "" ? void 0 : Number(value));
3
- const booleanLike = union([coerce.boolean(), literal("")]);
4
- const urlLike = union([coerce.string(), literal("")]).transform((value) => {
5
- try {
6
- return new URL(value);
7
- } catch {
8
- return void 0;
9
- }
10
- });
11
- const dateLike = union([coerce.string(), literal("")]).transform((value) => {
12
- if (value === "")
13
- return void 0;
14
- const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);
15
- if (Number.isNaN(date.getTime()))
16
- return void 0;
17
- return date;
18
- });
19
- const cssValueLike = union([coerce.string(), literal(""), number()]).transform((value) => {
20
- if (value === "" || value === 0 || value === "0")
21
- return void 0;
22
- if (numberLike.parse(value))
23
- return `${numberLike.parse(value)}px`;
24
- return String(value);
25
- });
26
- const isJson = string().transform((value, { addIssue }) => {
27
- try {
28
- return JSON.parse(value.replaceAll("'", '"'));
29
- } catch (error) {
30
- addIssue({
31
- code: ZodIssueCode.custom,
32
- message: `Invalid JSON: ${error.message}`
33
- });
34
- return NEVER;
35
- }
36
- });
37
- const isHtmlString = string().transform((value, { addIssue }) => {
38
- var _a;
39
- const htmlParser = new DOMParser();
40
- try {
41
- const html = htmlParser.parseFromString(value, "text/html");
42
- if (((_a = html.body) == null ? void 0 : _a.children.length) === 0)
43
- throw new Error("Invalid HTML");
44
- return value;
45
- } catch (error) {
46
- addIssue({
47
- code: ZodIssueCode.custom,
48
- message: error.message
49
- });
50
- return NEVER;
51
- }
52
- });
53
- const isJsonOrHtmlString = union([isJson, isHtmlString]);
54
- const isJsonOrHtmlOptionalString = union([coerce.string(), isJsonOrHtmlString]).transform((value) => {
55
- if (value === "")
56
- return void 0;
57
- return value;
58
- }).optional();
1
+ import { object, string, unknown, union, literal, lazy } from "zod";
2
+ import { numberLike, urlLike, dateLike, booleanLike, isJsonOrHtmlOptionalString, cssValueLike, isJsonOrHtmlString } from "@adhese/sdk-shared";
59
3
  const baseSchema = object({
60
4
  adDuration: numberLike.optional(),
61
5
  adFormat: string().optional(),
@@ -153,17 +97,8 @@ function parseResponse(response) {
153
97
  }
154
98
  export {
155
99
  adSchema,
156
- booleanLike,
157
- cssValueLike,
158
100
  daleSchema,
159
- dateLike,
160
- isHtmlString,
161
- isJson,
162
- isJsonOrHtmlOptionalString,
163
- isJsonOrHtmlString,
164
101
  jerliciaSchema,
165
- numberLike,
166
- parseResponse,
167
- urlLike
102
+ parseResponse
168
103
  };
169
- //# sourceMappingURL=requestAds.schema-Cb8_FVMb.js.map
104
+ //# sourceMappingURL=requestAds.schema-Bt7KDWqM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestAds.schema-Bt7KDWqM.js","sources":["../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import { type TypeOf, type ZodType, lazy, literal, object, string, union, unknown } from 'zod';\nimport {\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n numberLike,\n urlLike,\n} from '@adhese/sdk-shared';\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 AdheseAd<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<AdheseAd> {\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<AdheseAd>;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const zod = require("zod");
4
+ const sdkShared = require("@adhese/sdk-shared");
5
+ const baseSchema = zod.object({
6
+ adDuration: sdkShared.numberLike.optional(),
7
+ adFormat: zod.string().optional(),
8
+ adType: zod.string(),
9
+ additionalCreativeTracker: sdkShared.urlLike.optional(),
10
+ additionalViewableTracker: zod.string().optional(),
11
+ adspaceEnd: sdkShared.dateLike.optional(),
12
+ adspaceId: zod.string().optional(),
13
+ adspaceKey: zod.string().optional(),
14
+ adspaceStart: sdkShared.dateLike.optional(),
15
+ advertiserId: zod.string().optional(),
16
+ altText: zod.string().optional(),
17
+ auctionable: sdkShared.booleanLike.optional(),
18
+ body: sdkShared.isJsonOrHtmlOptionalString,
19
+ clickTag: sdkShared.urlLike.optional(),
20
+ comment: zod.string().optional(),
21
+ creativeName: zod.string().optional(),
22
+ deliveryGroupId: zod.string().optional(),
23
+ deliveryMultiples: zod.string().optional(),
24
+ ext: zod.string().optional(),
25
+ extension: zod.object({
26
+ mediaType: zod.string(),
27
+ prebid: zod.unknown().optional()
28
+ }).optional(),
29
+ height: sdkShared.numberLike.optional(),
30
+ id: zod.string(),
31
+ impressionCounter: sdkShared.urlLike.optional(),
32
+ libId: zod.string().optional(),
33
+ orderId: zod.string().optional(),
34
+ orderName: zod.string().optional(),
35
+ orderProperty: zod.string().optional(),
36
+ origin: zod.union([zod.literal("JERLICIA"), zod.literal("DALE")]),
37
+ originData: zod.unknown().optional(),
38
+ originInstance: zod.string().optional(),
39
+ poolPath: sdkShared.urlLike.optional(),
40
+ preview: sdkShared.booleanLike.optional(),
41
+ priority: sdkShared.numberLike.optional(),
42
+ sfSrc: sdkShared.urlLike.optional(),
43
+ share: zod.string().optional(),
44
+ // eslint-disable-next-line ts/naming-convention
45
+ slotID: zod.string(),
46
+ slotName: zod.string(),
47
+ swfSrc: sdkShared.urlLike.optional(),
48
+ tag: sdkShared.isJsonOrHtmlOptionalString,
49
+ tagUrl: sdkShared.urlLike.optional(),
50
+ timeStamp: sdkShared.dateLike.optional(),
51
+ trackedImpressionCounter: sdkShared.urlLike.optional(),
52
+ tracker: sdkShared.urlLike.optional(),
53
+ trackingUrl: sdkShared.urlLike.optional(),
54
+ url: sdkShared.urlLike.optional(),
55
+ viewableImpressionCounter: sdkShared.urlLike.optional(),
56
+ width: sdkShared.numberLike.optional(),
57
+ widthLarge: sdkShared.cssValueLike.optional()
58
+ });
59
+ const jerliciaSchema = zod.object({
60
+ origin: zod.literal("JERLICIA"),
61
+ tag: sdkShared.isJsonOrHtmlString
62
+ }).passthrough();
63
+ const daleSchema = zod.object({
64
+ origin: zod.literal("DALE"),
65
+ body: sdkShared.isJsonOrHtmlString
66
+ }).passthrough().transform(({ body, ...data }) => ({
67
+ ...data,
68
+ tag: body
69
+ }));
70
+ const adResponseSchema = baseSchema.extend({
71
+ additionalCreatives: zod.lazy(() => zod.union([adResponseSchema.array(), zod.string()]).optional())
72
+ });
73
+ const adSchema = adResponseSchema.transform(({
74
+ additionalCreatives,
75
+ ...data
76
+ }) => {
77
+ const filteredValue = Object.fromEntries(
78
+ Object.entries(data).filter(([, value]) => Boolean(value) && JSON.stringify(value) !== "{}" && JSON.stringify(value) !== "[]")
79
+ );
80
+ return {
81
+ ...filteredValue,
82
+ additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map((creative) => adSchema.parse(creative)) : additionalCreatives
83
+ };
84
+ });
85
+ function parseResponse(response) {
86
+ const schemaMap = {
87
+ /* eslint-disable ts/naming-convention */
88
+ JERLICIA: jerliciaSchema,
89
+ DALE: daleSchema
90
+ /* eslint-enable ts/naming-convention */
91
+ };
92
+ const preParsed = adResponseSchema.array().parse(response);
93
+ return preParsed.map((item) => {
94
+ const schema = schemaMap[item.origin];
95
+ if (!schema)
96
+ return adSchema.parse(item);
97
+ return schema.parse(item);
98
+ });
99
+ }
100
+ exports.adSchema = adSchema;
101
+ exports.daleSchema = daleSchema;
102
+ exports.jerliciaSchema = jerliciaSchema;
103
+ exports.parseResponse = parseResponse;
104
+ //# sourceMappingURL=requestAds.schema-DvERzWT3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestAds.schema-DvERzWT3.cjs","sources":["../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import { type TypeOf, type ZodType, lazy, literal, object, string, union, unknown } from 'zod';\nimport {\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n numberLike,\n urlLike,\n} from '@adhese/sdk-shared';\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 AdheseAd<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<AdheseAd> {\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<AdheseAd>;\n}\n"],"names":["object","numberLike","string","urlLike","dateLike","booleanLike","isJsonOrHtmlOptionalString","unknown","union","literal","cssValueLike","isJsonOrHtmlString","lazy"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@adhese/sdk",
3
3
  "type": "module",
4
- "version": "0.14.1",
4
+ "version": "0.16.0",
5
5
  "description": "Adhese SDK",
6
6
  "license": "GPL-3.0",
7
7
  "repository": {
@@ -32,7 +32,7 @@
32
32
  "prepareRelease": "npm run build"
33
33
  },
34
34
  "dependencies": {
35
- "@adhese/sdk-shared": "^0.4.0",
35
+ "@adhese/sdk-shared": "^0.5.0",
36
36
  "remeda": "^1.61.0",
37
37
  "zod": "^3.23.6"
38
38
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"requestAds.schema-Cb8_FVMb.js","sources":["../src/requestAds/requestAds.schema.ts"],"sourcesContent":["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 AdheseAd<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<AdheseAd> {\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<AdheseAd>;\n}\n"],"names":[],"mappings":"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"}