@adhese/sdk 0.19.0 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @adhese/sdk
2
2
 
3
+ ## 0.19.2
4
+
5
+ ### Patch Changes
6
+
7
+ - aa0ef98: Move zod exports to @adhese/sdk-shared
8
+ - d8b7f2e: Move remeda exports to @adhese/sdk-shared
9
+ - Updated dependencies [aa0ef98]
10
+ - Updated dependencies [d8b7f2e]
11
+ - @adhese/sdk-shared@0.9.0
12
+
13
+ ## 0.19.1
14
+
15
+ ### Patch Changes
16
+
17
+ - 34268cf: Move generateName function @adhese/sdk-shared
18
+ - Updated dependencies [34268cf]
19
+ - @adhese/sdk-shared@0.8.0
20
+
3
21
  ## 0.19.0
4
22
 
5
23
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const sdkShared = require("@adhese/sdk-shared");
4
- const remeda = require("remeda");
5
4
  const name = "@adhese/sdk";
6
- const version = "0.19.0";
5
+ const version = "0.19.2";
7
6
  const logger = sdkShared.createLogger({
8
7
  scope: `${name}@${version}`
9
8
  });
@@ -26,7 +25,7 @@ async function requestPreviews(account) {
26
25
  return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));
27
26
  return await response.json();
28
27
  })),
29
- Promise.resolve().then(() => require("./requestAds.schema-lenvDWpb.cjs")).then((module2) => module2.adSchema)
28
+ Promise.resolve().then(() => require("./requestAds.schema-Cr3vDRnz.cjs")).then((module2) => module2.adSchema)
30
29
  ]);
31
30
  return adSchema.array().parse(list.filter((response) => {
32
31
  if (response.status === "rejected") {
@@ -101,7 +100,7 @@ function filterSpecialChars(value) {
101
100
  return value.replaceAll(specialRegex, "_");
102
101
  }
103
102
  const batch = /* @__PURE__ */ new Map();
104
- const runRequestAdsBatch = remeda.debounce(async (context) => {
103
+ const runRequestAdsBatch = sdkShared.debounce(async (context) => {
105
104
  if (batch.size === 0)
106
105
  return [];
107
106
  const ads = await requestAds({
@@ -142,7 +141,7 @@ async function requestAds(requestOptions) {
142
141
  const [response, previews, parseResponse] = await Promise.all([
143
142
  ((_b = context.options.requestType) == null ? void 0 : _b.toUpperCase()) === "POST" ? requestWithPost(options) : requestWithGet(options),
144
143
  requestPreviews(context.options.account),
145
- Promise.resolve().then(() => require("./requestAds.schema-lenvDWpb.cjs")).then((module2) => module2.parseResponse)
144
+ Promise.resolve().then(() => require("./requestAds.schema-Cr3vDRnz.cjs")).then((module2) => module2.parseResponse)
146
145
  ]);
147
146
  logger.debug("Received response", response);
148
147
  if (!response.ok)
@@ -180,7 +179,7 @@ function useQueryDetector(context, queries = {
180
179
  const entries = Object.entries(queries);
181
180
  const active = sdkShared.ref(getQuery(entries));
182
181
  const queryList = entries.map(([, query]) => window.matchMedia(query));
183
- const handleOnChange = remeda.debounce(() => {
182
+ const handleOnChange = sdkShared.debounce(() => {
184
183
  active.value = getQuery(entries);
185
184
  }, {
186
185
  waitMs: 50
@@ -230,9 +229,6 @@ function renderIframe(ad, element) {
230
229
  function renderInline(ad, element) {
231
230
  element.innerHTML = String(ad.tag);
232
231
  }
233
- function generateName(location, format, slot) {
234
- return `${location}${slot ? `${slot}` : ""}-${format}`;
235
- }
236
232
  function useDomLoaded(context) {
237
233
  const isDomLoaded = sdkShared.ref(false);
238
234
  context.hooks.onInit(async () => {
@@ -283,7 +279,7 @@ function useViewabilityObserver({ context, slotContext, hooks, onTracked }) {
283
279
  const isTracked = sdkShared.ref(false);
284
280
  const viewabilityObserver = new IntersectionObserver(([entry]) => {
285
281
  if (context.options.viewabilityTracking && !trackingPixel.value) {
286
- const ratio = remeda.round(entry.intersectionRatio, 1);
282
+ const ratio = sdkShared.round(entry.intersectionRatio, 1);
287
283
  if (ratio >= threshold && !timeoutId) {
288
284
  timeoutId = setTimeout(() => {
289
285
  timeoutId = null;
@@ -350,7 +346,7 @@ function useSlotHooks({ setup }, slotContext) {
350
346
  const renderFunctions = {
351
347
  iframe: renderIframe,
352
348
  inline: renderInline,
353
- none: remeda.doNothing
349
+ none: sdkShared.doNothing
354
350
  };
355
351
  const defaultOptions = {
356
352
  renderMode: "iframe",
@@ -389,7 +385,7 @@ function createSlot(slotOptions) {
389
385
  const format = sdkShared.computed(() => typeof options.format === "string" ? options.format : device.value);
390
386
  const data = sdkShared.ref(null);
391
387
  const originalData = sdkShared.ref(data.value);
392
- const name2 = sdkShared.computed(() => generateName(options.context.location, format.value, options.slot));
388
+ const name2 = sdkShared.computed(() => sdkShared.generateName(options.context.location, format.value, options.slot));
393
389
  sdkShared.watch(name2, async (newName, oldName) => {
394
390
  var _a, _b;
395
391
  if (newName === oldName)
@@ -420,7 +416,7 @@ function createSlot(slotOptions) {
420
416
  const status = sdkShared.ref("initializing");
421
417
  sdkShared.watch([data, isInViewport], async ([newData, newIsInViewport], [oldData]) => {
422
418
  var _a;
423
- if ((!newData || oldData && remeda.isDeepEqual(newData, oldData)) && status.value === "rendered")
419
+ if ((!newData || oldData && sdkShared.isDeepEqual(newData, oldData)) && status.value === "rendered")
424
420
  return;
425
421
  if (newIsInViewport)
426
422
  await ((_a = slotContext.value) == null ? void 0 : _a.render(newData ?? void 0));
@@ -569,7 +565,7 @@ async function findDomSlots(context) {
569
565
  var _a;
570
566
  if (!element.dataset.format)
571
567
  return false;
572
- const name2 = generateName(
568
+ const name2 = sdkShared.generateName(
573
569
  context.location,
574
570
  element.dataset.format,
575
571
  element.dataset.slot
@@ -850,7 +846,7 @@ function createAdhese(options) {
850
846
  hooks
851
847
  });
852
848
  const name2 = data.name;
853
- context.plugins[name2] = remeda.omit(data, ["name"]);
849
+ context.plugins[name2] = sdkShared.omit(data, ["name"]);
854
850
  }
855
851
  sdkShared.watch(() => context.location, (newLocation) => {
856
852
  var _a2;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/logger/logger.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.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/hooks.ts","../src/main.ts"],"sourcesContent":["import { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\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 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 requestOptions.context.hooks.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 context.hooks.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 { debounce } from 'remeda';\nimport { type ComputedRef, computed, ref } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '@adhese/sdk';\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(context: AdheseContext, 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 context.hooks.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 context.hooks.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 Ref,\n createAsyncHook,\n createPassiveHook,\n ref,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext, AdheseSlot, AdheseSlotContext, AdheseSlotHooks, AdheseSlotOptions } from '@adhese/sdk';\nimport { round } from 'remeda';\n\nexport function useDomLoaded(context: AdheseContext): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n context.hooks.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: AdheseSlotHooks;\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: AdheseSlotHooks;\n onTracked?(trackingPixel: Ref<HTMLImageElement | null>): void;\n },\n): Ref<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 = ref(false);\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\n isTracked.value = true;\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<AdheseSlotContext | null>): {\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} & AdheseSlotHooks {\n const [runOnBeforeRender, onBeforeRender, disposeOnBeforeRender] = createAsyncHook<AdheseAd>();\n const [runOnRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>();\n const [runOnBeforeRequest, onBeforeRequest, disposeOnBeforeRequest] = createAsyncHook<AdheseAd | null>();\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdheseAd>();\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook();\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 addTrackingPixel,\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 { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotContext, 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<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...slotOptions,\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\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);\n\n const isDisposed = ref(false);\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n\n const [device, disposeQueryDetector] = useQueryDetector(context, 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(context);\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 context.hooks.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 = ref(false);\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n });\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\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 isImpressionTracked.value = true;\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 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 pluginOptions,\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';\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 context.hooks.onInit(() => {\n window.__tcfapi?.('addEventListener', 2, onTcfConsentChange);\n });\n\n context.hooks.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';\n\nexport function useMainQueryDetector(mergedOptions: MergedOptions, context: AdheseContextState): void {\n const [device] = useQueryDetector(context, 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 context.hooks.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 { createAsyncHook, createSyncHook } from '@adhese/sdk-shared';\nimport type { AdMultiRequestOptions } from './requestAds/requestAds';\nimport type { AdheseAd, AdheseSlotOptions } from './index';\n\n// eslint-disable-next-line ts/explicit-function-return-type,ts/explicit-module-boundary-types\nexport function createGlobalHooks() {\n const disposeFunctions = new Set<() => void>();\n\n let isInit = false;\n const [runOnInit, onInit, disposeOnInit] = createSyncHook({\n onRun(callbacks) {\n isInit = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n });\n disposeFunctions.add(disposeOnInit);\n\n let isDisposed = false;\n const [runOnDispose, onDispose, disposeOnDispose] = createSyncHook({\n onRun(callbacks) {\n isDisposed = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n });\n disposeFunctions.add(disposeOnDispose);\n\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdMultiRequestOptions>();\n disposeFunctions.add(disposeOnRequest);\n\n const [runOnResponse, onResponse, disposeOnResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>();\n disposeFunctions.add(disposeOnResponse);\n\n const [runOnSlotCreate, onSlotCreate, disposeOnSlotCreate] = createSyncHook<AdheseSlotOptions>();\n disposeFunctions.add(disposeOnSlotCreate);\n\n function clearAll(): void {\n for (const disposeFunction of disposeFunctions)\n disposeFunction();\n }\n\n return {\n runOnInit,\n onInit,\n runOnDispose,\n onDispose,\n runOnRequest,\n onRequest,\n runOnResponse,\n onResponse,\n runOnSlotCreate,\n onSlotCreate,\n clearAll,\n };\n}\n","import { awaitTimeout, createEventManager, effectScope, reactive, watch } from '@adhese/sdk-shared';\nimport { omit } from 'remeda';\nimport { version } from '../package.json';\nimport { createSlotManager } from './slotManager/slotManager';\nimport { useConsent } from './consent/consent';\nimport { fetchAllUnrenderedSlots, isPreviewMode, setupLogging } from './main.utils';\nimport type {\n Adhese,\n AdheseContextStateWithPlugins,\n AdheseOptions,\n AdhesePlugin,\n MergedOptions,\n} from './main.types';\nimport { logger } from './logger/logger';\nimport { useMainDebugMode, useMainParameters, useMainQueryDetector } from './main.composables';\nimport { createGlobalHooks } from './hooks';\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<T extends ReadonlyArray<AdhesePlugin>>(options: AdheseOptions<T>): Adhese<T> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions: MergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n };\n setupLogging(mergedOptions);\n\n const hooks = createGlobalHooks();\n\n const context = reactive<AdheseContextStateWithPlugins<T>>({\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 hooks,\n plugins: {},\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of options.plugins?.entries() ?? []) {\n const data = plugin(context, {\n index,\n version,\n hooks,\n });\n\n const name = data.name as keyof typeof context.plugins;\n context.plugins[name] = omit(data, ['name']) as typeof context.plugins[typeof name];\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 hooks.runOnDispose();\n hooks.clearAll();\n\n scope.stop();\n }\n context.dispose = dispose;\n\n hooks.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 hooks.runOnInit();\n\n return context as Adhese<T>;\n })!;\n}\n"],"names":["createLogger","module","toValue","debounce","ref","computed","waitForDomLoad","watch","round","createAsyncHook","createPassiveHook","doNothing","effectScope","uniqueId","reactive","name","isDeepEqual","addTrackingPixel","extRequestAd","_a","findDomSlots","extFindDomSlots","createSyncHook","createEventManager","omit","awaitTimeout"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/logger/logger.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.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/hooks.ts","../src/main.ts"],"sourcesContent":["import { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\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, debounce, toValue } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\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 requestOptions.context.hooks.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 context.hooks.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 ComputedRef, computed, debounce, ref } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '@adhese/sdk';\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(context: AdheseContext, 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 context.hooks.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 context.hooks.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","import {\n type Ref,\n createAsyncHook,\n createPassiveHook,\n ref,\n round,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext, AdheseSlot, AdheseSlotContext, AdheseSlotHooks, AdheseSlotOptions } from '@adhese/sdk';\n\nexport function useDomLoaded(context: AdheseContext): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n context.hooks.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: AdheseSlotHooks;\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: AdheseSlotHooks;\n onTracked?(trackingPixel: Ref<HTMLImageElement | null>): void;\n },\n): Ref<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 = ref(false);\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\n isTracked.value = true;\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<AdheseSlotContext | null>): {\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} & AdheseSlotHooks {\n const [runOnBeforeRender, onBeforeRender, disposeOnBeforeRender] = createAsyncHook<AdheseAd>();\n const [runOnRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>();\n const [runOnBeforeRequest, onBeforeRequest, disposeOnBeforeRequest] = createAsyncHook<AdheseAd | null>();\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdheseAd>();\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook();\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 addTrackingPixel,\n computed,\n doNothing,\n effectScope,\n generateName,\n isDeepEqual,\n reactive,\n ref,\n uniqueId,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd } from '@adhese/sdk';\nimport { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotContext, AdheseSlotOptions, RenderMode } from './slot.types';\nimport { 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<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...slotOptions,\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\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);\n\n const isDisposed = ref(false);\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n\n const [device, disposeQueryDetector] = useQueryDetector(context, 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(context);\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 context.hooks.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 = ref(false);\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n });\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\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 isImpressionTracked.value = true;\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 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 pluginOptions,\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 { generateName, waitForDomLoad } from '@adhese/sdk-shared';\nimport type { AdheseContext, AdheseSlot } from '@adhese/sdk';\nimport { createSlot } from '../slot/slot';\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';\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 context.hooks.onInit(() => {\n window.__tcfapi?.('addEventListener', 2, onTcfConsentChange);\n });\n\n context.hooks.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';\n\nexport function useMainQueryDetector(mergedOptions: MergedOptions, context: AdheseContextState): void {\n const [device] = useQueryDetector(context, 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 context.hooks.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 { createAsyncHook, createSyncHook } from '@adhese/sdk-shared';\nimport type { AdMultiRequestOptions } from './requestAds/requestAds';\nimport type { AdheseAd, AdheseSlotOptions } from './index';\n\n// eslint-disable-next-line ts/explicit-function-return-type,ts/explicit-module-boundary-types\nexport function createGlobalHooks() {\n const disposeFunctions = new Set<() => void>();\n\n let isInit = false;\n const [runOnInit, onInit, disposeOnInit] = createSyncHook({\n onRun(callbacks) {\n isInit = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n });\n disposeFunctions.add(disposeOnInit);\n\n let isDisposed = false;\n const [runOnDispose, onDispose, disposeOnDispose] = createSyncHook({\n onRun(callbacks) {\n isDisposed = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n });\n disposeFunctions.add(disposeOnDispose);\n\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdMultiRequestOptions>();\n disposeFunctions.add(disposeOnRequest);\n\n const [runOnResponse, onResponse, disposeOnResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>();\n disposeFunctions.add(disposeOnResponse);\n\n const [runOnSlotCreate, onSlotCreate, disposeOnSlotCreate] = createSyncHook<AdheseSlotOptions>();\n disposeFunctions.add(disposeOnSlotCreate);\n\n function clearAll(): void {\n for (const disposeFunction of disposeFunctions)\n disposeFunction();\n }\n\n return {\n runOnInit,\n onInit,\n runOnDispose,\n onDispose,\n runOnRequest,\n onRequest,\n runOnResponse,\n onResponse,\n runOnSlotCreate,\n onSlotCreate,\n clearAll,\n };\n}\n","import { awaitTimeout, createEventManager, effectScope, omit, 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 {\n Adhese,\n AdheseContextStateWithPlugins,\n AdheseOptions,\n AdhesePlugin,\n MergedOptions,\n} from './main.types';\nimport { logger } from './logger/logger';\nimport { useMainDebugMode, useMainParameters, useMainQueryDetector } from './main.composables';\nimport { createGlobalHooks } from './hooks';\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<T extends ReadonlyArray<AdhesePlugin>>(options: AdheseOptions<T>): Adhese<T> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions: MergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n };\n setupLogging(mergedOptions);\n\n const hooks = createGlobalHooks();\n\n const context = reactive<AdheseContextStateWithPlugins<T>>({\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 hooks,\n plugins: {},\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of options.plugins?.entries() ?? []) {\n const data = plugin(context, {\n index,\n version,\n hooks,\n });\n\n const name = data.name as keyof typeof context.plugins;\n context.plugins[name] = omit(data, ['name']) as typeof context.plugins[typeof name];\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 hooks.runOnDispose();\n hooks.clearAll();\n\n scope.stop();\n }\n context.dispose = dispose;\n\n hooks.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 hooks.runOnInit();\n\n return context as Adhese<T>;\n })!;\n}\n"],"names":["createLogger","module","toValue","debounce","ref","computed","waitForDomLoad","watch","round","createAsyncHook","createPassiveHook","doNothing","effectScope","uniqueId","reactive","name","generateName","isDeepEqual","addTrackingPixel","extRequestAd","_a","findDomSlots","extFindDomSlots","createSyncHook","createEventManager","omit","awaitTimeout"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as _adhese_sdk_shared from '@adhese/sdk-shared';
2
2
  import { createAsyncHook, createPassiveHook, Ref, Merge, MaybeRef, UrlString, EventManager } from '@adhese/sdk-shared';
3
- import * as zod from 'zod';
4
- import { TypeOf, ZodType } from 'zod';
3
+ import * as _adhese_sdk_shared_validators from '@adhese/sdk-shared/validators';
4
+ import { TypeOf, ZodType } from '@adhese/sdk-shared/validators';
5
5
 
6
6
  type RenderMode = 'iframe' | 'inline' | 'none';
7
7
  type AdheseSlotHooks = {
@@ -210,65 +210,65 @@ type SlotManagerOptions = {
210
210
  context: AdheseContext;
211
211
  };
212
212
 
213
- declare const baseSchema: zod.ZodObject<{
214
- adDuration: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
215
- adFormat: zod.ZodOptional<zod.ZodString>;
216
- adType: zod.ZodString;
217
- additionalCreativeTracker: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
218
- additionalViewableTracker: zod.ZodOptional<zod.ZodString>;
219
- adspaceEnd: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, Date | undefined, string>>;
220
- adspaceId: zod.ZodOptional<zod.ZodString>;
221
- adspaceKey: zod.ZodOptional<zod.ZodString>;
222
- adspaceStart: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, Date | undefined, string>>;
223
- advertiserId: zod.ZodOptional<zod.ZodString>;
224
- altText: zod.ZodOptional<zod.ZodString>;
225
- auctionable: zod.ZodOptional<zod.ZodUnion<[zod.ZodBoolean, zod.ZodLiteral<"">]>>;
226
- body: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodUnion<[zod.ZodEffects<zod.ZodString, Record<string, unknown> | readonly unknown[], string>, zod.ZodEffects<zod.ZodString, string, string>]>]>, string | Record<string, unknown> | readonly unknown[] | undefined, string>>;
227
- clickTag: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
228
- comment: zod.ZodOptional<zod.ZodString>;
229
- creativeName: zod.ZodOptional<zod.ZodString>;
230
- deliveryGroupId: zod.ZodOptional<zod.ZodString>;
231
- deliveryMultiples: zod.ZodOptional<zod.ZodString>;
232
- ext: zod.ZodOptional<zod.ZodString>;
233
- extension: zod.ZodOptional<zod.ZodObject<{
234
- mediaType: zod.ZodString;
235
- prebid: zod.ZodOptional<zod.ZodUnknown>;
236
- }, "strip", zod.ZodTypeAny, {
213
+ declare const baseSchema: _adhese_sdk_shared_validators.ZodObject<{
214
+ adDuration: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, number | undefined, string>>;
215
+ adFormat: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
216
+ adType: _adhese_sdk_shared_validators.ZodString;
217
+ additionalCreativeTracker: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
218
+ additionalViewableTracker: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
219
+ adspaceEnd: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, Date | undefined, string>>;
220
+ adspaceId: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
221
+ adspaceKey: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
222
+ adspaceStart: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, Date | undefined, string>>;
223
+ advertiserId: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
224
+ altText: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
225
+ auctionable: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodBoolean, _adhese_sdk_shared_validators.ZodLiteral<"">]>>;
226
+ body: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodString, Record<string, unknown> | readonly unknown[], string>, _adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodString, string, string>]>]>, string | Record<string, unknown> | readonly unknown[] | undefined, string>>;
227
+ clickTag: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
228
+ comment: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
229
+ creativeName: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
230
+ deliveryGroupId: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
231
+ deliveryMultiples: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
232
+ ext: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
233
+ extension: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodObject<{
234
+ mediaType: _adhese_sdk_shared_validators.ZodString;
235
+ prebid: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodUnknown>;
236
+ }, "strip", _adhese_sdk_shared_validators.ZodTypeAny, {
237
237
  mediaType: string;
238
238
  prebid?: unknown;
239
239
  }, {
240
240
  mediaType: string;
241
241
  prebid?: unknown;
242
242
  }>>;
243
- height: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
244
- id: zod.ZodString;
245
- impressionCounter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
246
- libId: zod.ZodOptional<zod.ZodString>;
247
- orderId: zod.ZodOptional<zod.ZodString>;
248
- orderName: zod.ZodOptional<zod.ZodString>;
249
- orderProperty: zod.ZodOptional<zod.ZodString>;
250
- origin: zod.ZodUnion<[zod.ZodLiteral<"JERLICIA">, zod.ZodLiteral<"DALE">]>;
251
- originData: zod.ZodOptional<zod.ZodUnknown>;
252
- originInstance: zod.ZodOptional<zod.ZodString>;
253
- poolPath: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
254
- preview: zod.ZodOptional<zod.ZodUnion<[zod.ZodBoolean, zod.ZodLiteral<"">]>>;
255
- priority: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
256
- sfSrc: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
257
- share: zod.ZodOptional<zod.ZodString>;
258
- slotID: zod.ZodString;
259
- slotName: zod.ZodString;
260
- swfSrc: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
261
- tag: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodUnion<[zod.ZodEffects<zod.ZodString, Record<string, unknown> | readonly unknown[], string>, zod.ZodEffects<zod.ZodString, string, string>]>]>, string | Record<string, unknown> | readonly unknown[] | undefined, string>>;
262
- tagUrl: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
263
- timeStamp: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, Date | undefined, string>>;
264
- trackedImpressionCounter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
265
- tracker: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
266
- trackingUrl: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
267
- url: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
268
- viewableImpressionCounter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
269
- width: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
270
- widthLarge: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">, zod.ZodNumber]>, string | undefined, string | number>>;
271
- }, "strip", zod.ZodTypeAny, {
243
+ height: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, number | undefined, string>>;
244
+ id: _adhese_sdk_shared_validators.ZodString;
245
+ impressionCounter: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
246
+ libId: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
247
+ orderId: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
248
+ orderName: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
249
+ orderProperty: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
250
+ origin: _adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodLiteral<"JERLICIA">, _adhese_sdk_shared_validators.ZodLiteral<"DALE">]>;
251
+ originData: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodUnknown>;
252
+ originInstance: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
253
+ poolPath: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
254
+ preview: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodBoolean, _adhese_sdk_shared_validators.ZodLiteral<"">]>>;
255
+ priority: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, number | undefined, string>>;
256
+ sfSrc: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
257
+ share: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodString>;
258
+ slotID: _adhese_sdk_shared_validators.ZodString;
259
+ slotName: _adhese_sdk_shared_validators.ZodString;
260
+ swfSrc: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
261
+ tag: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodString, Record<string, unknown> | readonly unknown[], string>, _adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodString, string, string>]>]>, string | Record<string, unknown> | readonly unknown[] | undefined, string>>;
262
+ tagUrl: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
263
+ timeStamp: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, Date | undefined, string>>;
264
+ trackedImpressionCounter: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
265
+ tracker: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
266
+ trackingUrl: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
267
+ url: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
268
+ viewableImpressionCounter: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, URL | undefined, string>>;
269
+ width: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">]>, number | undefined, string>>;
270
+ widthLarge: _adhese_sdk_shared_validators.ZodOptional<_adhese_sdk_shared_validators.ZodEffects<_adhese_sdk_shared_validators.ZodUnion<[_adhese_sdk_shared_validators.ZodString, _adhese_sdk_shared_validators.ZodLiteral<"">, _adhese_sdk_shared_validators.ZodNumber]>, string | undefined, string | number>>;
271
+ }, "strip", _adhese_sdk_shared_validators.ZodTypeAny, {
272
272
  adType: string;
273
273
  id: string;
274
274
  origin: "JERLICIA" | "DALE";
package/dist/index.js CHANGED
@@ -1,7 +1,6 @@
1
- import { createLogger, toValue, ref, computed, waitForDomLoad, watch, createAsyncHook, createPassiveHook, effectScope, uniqueId, reactive, addTrackingPixel, createSyncHook, createEventManager, awaitTimeout } from "@adhese/sdk-shared";
2
- import { debounce, round, isDeepEqual, doNothing, omit } from "remeda";
1
+ import { createLogger, toValue, debounce, ref, computed, waitForDomLoad, watch, round, createAsyncHook, createPassiveHook, effectScope, uniqueId, reactive, generateName, isDeepEqual, addTrackingPixel, doNothing, createSyncHook, createEventManager, omit, awaitTimeout } from "@adhese/sdk-shared";
3
2
  const name = "@adhese/sdk";
4
- const version = "0.19.0";
3
+ const version = "0.19.2";
5
4
  const logger = createLogger({
6
5
  scope: `${name}@${version}`
7
6
  });
@@ -24,7 +23,7 @@ async function requestPreviews(account) {
24
23
  return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));
25
24
  return await response.json();
26
25
  })),
27
- import("./requestAds.schema-DbGNhzE_.js").then((module) => module.adSchema)
26
+ import("./requestAds.schema-BsJYUvgz.js").then((module) => module.adSchema)
28
27
  ]);
29
28
  return adSchema.array().parse(list.filter((response) => {
30
29
  if (response.status === "rejected") {
@@ -140,7 +139,7 @@ async function requestAds(requestOptions) {
140
139
  const [response, previews, parseResponse] = await Promise.all([
141
140
  ((_b = context.options.requestType) == null ? void 0 : _b.toUpperCase()) === "POST" ? requestWithPost(options) : requestWithGet(options),
142
141
  requestPreviews(context.options.account),
143
- import("./requestAds.schema-DbGNhzE_.js").then((module) => module.parseResponse)
142
+ import("./requestAds.schema-BsJYUvgz.js").then((module) => module.parseResponse)
144
143
  ]);
145
144
  logger.debug("Received response", response);
146
145
  if (!response.ok)
@@ -228,9 +227,6 @@ function renderIframe(ad, element) {
228
227
  function renderInline(ad, element) {
229
228
  element.innerHTML = String(ad.tag);
230
229
  }
231
- function generateName(location, format, slot) {
232
- return `${location}${slot ? `${slot}` : ""}-${format}`;
233
- }
234
230
  function useDomLoaded(context) {
235
231
  const isDomLoaded = ref(false);
236
232
  context.hooks.onInit(async () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/logger/logger.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.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/hooks.ts","../src/main.ts"],"sourcesContent":["import { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\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 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 requestOptions.context.hooks.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 context.hooks.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 { debounce } from 'remeda';\nimport { type ComputedRef, computed, ref } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '@adhese/sdk';\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(context: AdheseContext, 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 context.hooks.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 context.hooks.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 Ref,\n createAsyncHook,\n createPassiveHook,\n ref,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext, AdheseSlot, AdheseSlotContext, AdheseSlotHooks, AdheseSlotOptions } from '@adhese/sdk';\nimport { round } from 'remeda';\n\nexport function useDomLoaded(context: AdheseContext): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n context.hooks.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: AdheseSlotHooks;\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: AdheseSlotHooks;\n onTracked?(trackingPixel: Ref<HTMLImageElement | null>): void;\n },\n): Ref<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 = ref(false);\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\n isTracked.value = true;\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<AdheseSlotContext | null>): {\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} & AdheseSlotHooks {\n const [runOnBeforeRender, onBeforeRender, disposeOnBeforeRender] = createAsyncHook<AdheseAd>();\n const [runOnRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>();\n const [runOnBeforeRequest, onBeforeRequest, disposeOnBeforeRequest] = createAsyncHook<AdheseAd | null>();\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdheseAd>();\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook();\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 addTrackingPixel,\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 { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotContext, 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<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...slotOptions,\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\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);\n\n const isDisposed = ref(false);\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n\n const [device, disposeQueryDetector] = useQueryDetector(context, 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(context);\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 context.hooks.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 = ref(false);\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n });\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\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 isImpressionTracked.value = true;\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 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 pluginOptions,\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';\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 context.hooks.onInit(() => {\n window.__tcfapi?.('addEventListener', 2, onTcfConsentChange);\n });\n\n context.hooks.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';\n\nexport function useMainQueryDetector(mergedOptions: MergedOptions, context: AdheseContextState): void {\n const [device] = useQueryDetector(context, 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 context.hooks.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 { createAsyncHook, createSyncHook } from '@adhese/sdk-shared';\nimport type { AdMultiRequestOptions } from './requestAds/requestAds';\nimport type { AdheseAd, AdheseSlotOptions } from './index';\n\n// eslint-disable-next-line ts/explicit-function-return-type,ts/explicit-module-boundary-types\nexport function createGlobalHooks() {\n const disposeFunctions = new Set<() => void>();\n\n let isInit = false;\n const [runOnInit, onInit, disposeOnInit] = createSyncHook({\n onRun(callbacks) {\n isInit = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n });\n disposeFunctions.add(disposeOnInit);\n\n let isDisposed = false;\n const [runOnDispose, onDispose, disposeOnDispose] = createSyncHook({\n onRun(callbacks) {\n isDisposed = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n });\n disposeFunctions.add(disposeOnDispose);\n\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdMultiRequestOptions>();\n disposeFunctions.add(disposeOnRequest);\n\n const [runOnResponse, onResponse, disposeOnResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>();\n disposeFunctions.add(disposeOnResponse);\n\n const [runOnSlotCreate, onSlotCreate, disposeOnSlotCreate] = createSyncHook<AdheseSlotOptions>();\n disposeFunctions.add(disposeOnSlotCreate);\n\n function clearAll(): void {\n for (const disposeFunction of disposeFunctions)\n disposeFunction();\n }\n\n return {\n runOnInit,\n onInit,\n runOnDispose,\n onDispose,\n runOnRequest,\n onRequest,\n runOnResponse,\n onResponse,\n runOnSlotCreate,\n onSlotCreate,\n clearAll,\n };\n}\n","import { awaitTimeout, createEventManager, effectScope, reactive, watch } from '@adhese/sdk-shared';\nimport { omit } from 'remeda';\nimport { version } from '../package.json';\nimport { createSlotManager } from './slotManager/slotManager';\nimport { useConsent } from './consent/consent';\nimport { fetchAllUnrenderedSlots, isPreviewMode, setupLogging } from './main.utils';\nimport type {\n Adhese,\n AdheseContextStateWithPlugins,\n AdheseOptions,\n AdhesePlugin,\n MergedOptions,\n} from './main.types';\nimport { logger } from './logger/logger';\nimport { useMainDebugMode, useMainParameters, useMainQueryDetector } from './main.composables';\nimport { createGlobalHooks } from './hooks';\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<T extends ReadonlyArray<AdhesePlugin>>(options: AdheseOptions<T>): Adhese<T> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions: MergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n };\n setupLogging(mergedOptions);\n\n const hooks = createGlobalHooks();\n\n const context = reactive<AdheseContextStateWithPlugins<T>>({\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 hooks,\n plugins: {},\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of options.plugins?.entries() ?? []) {\n const data = plugin(context, {\n index,\n version,\n hooks,\n });\n\n const name = data.name as keyof typeof context.plugins;\n context.plugins[name] = omit(data, ['name']) as typeof context.plugins[typeof name];\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 hooks.runOnDispose();\n hooks.clearAll();\n\n scope.stop();\n }\n context.dispose = dispose;\n\n hooks.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 hooks.runOnInit();\n\n return context as Adhese<T>;\n })!;\n}\n"],"names":["name","extRequestAd","_a","findDomSlots","extFindDomSlots"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/logger/logger.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.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/hooks.ts","../src/main.ts"],"sourcesContent":["import { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\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, debounce, toValue } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\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 requestOptions.context.hooks.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 context.hooks.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 ComputedRef, computed, debounce, ref } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '@adhese/sdk';\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(context: AdheseContext, 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 context.hooks.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 context.hooks.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","import {\n type Ref,\n createAsyncHook,\n createPassiveHook,\n ref,\n round,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext, AdheseSlot, AdheseSlotContext, AdheseSlotHooks, AdheseSlotOptions } from '@adhese/sdk';\n\nexport function useDomLoaded(context: AdheseContext): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n context.hooks.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: AdheseSlotHooks;\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: AdheseSlotHooks;\n onTracked?(trackingPixel: Ref<HTMLImageElement | null>): void;\n },\n): Ref<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 = ref(false);\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\n isTracked.value = true;\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<AdheseSlotContext | null>): {\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} & AdheseSlotHooks {\n const [runOnBeforeRender, onBeforeRender, disposeOnBeforeRender] = createAsyncHook<AdheseAd>();\n const [runOnRender, onRender, disposeOnRender] = createAsyncHook<AdheseAd>();\n const [runOnBeforeRequest, onBeforeRequest, disposeOnBeforeRequest] = createAsyncHook<AdheseAd | null>();\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdheseAd>();\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook();\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 addTrackingPixel,\n computed,\n doNothing,\n effectScope,\n generateName,\n isDeepEqual,\n reactive,\n ref,\n uniqueId,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd } from '@adhese/sdk';\nimport { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotContext, AdheseSlotOptions, RenderMode } from './slot.types';\nimport { 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<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...slotOptions,\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\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);\n\n const isDisposed = ref(false);\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n\n const [device, disposeQueryDetector] = useQueryDetector(context, 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(context);\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 context.hooks.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 = ref(false);\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n });\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\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 isImpressionTracked.value = true;\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 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 pluginOptions,\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 { generateName, waitForDomLoad } from '@adhese/sdk-shared';\nimport type { AdheseContext, AdheseSlot } from '@adhese/sdk';\nimport { createSlot } from '../slot/slot';\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';\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 context.hooks.onInit(() => {\n window.__tcfapi?.('addEventListener', 2, onTcfConsentChange);\n });\n\n context.hooks.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';\n\nexport function useMainQueryDetector(mergedOptions: MergedOptions, context: AdheseContextState): void {\n const [device] = useQueryDetector(context, 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 context.hooks.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 { createAsyncHook, createSyncHook } from '@adhese/sdk-shared';\nimport type { AdMultiRequestOptions } from './requestAds/requestAds';\nimport type { AdheseAd, AdheseSlotOptions } from './index';\n\n// eslint-disable-next-line ts/explicit-function-return-type,ts/explicit-module-boundary-types\nexport function createGlobalHooks() {\n const disposeFunctions = new Set<() => void>();\n\n let isInit = false;\n const [runOnInit, onInit, disposeOnInit] = createSyncHook({\n onRun(callbacks) {\n isInit = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n });\n disposeFunctions.add(disposeOnInit);\n\n let isDisposed = false;\n const [runOnDispose, onDispose, disposeOnDispose] = createSyncHook({\n onRun(callbacks) {\n isDisposed = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n });\n disposeFunctions.add(disposeOnDispose);\n\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdMultiRequestOptions>();\n disposeFunctions.add(disposeOnRequest);\n\n const [runOnResponse, onResponse, disposeOnResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>();\n disposeFunctions.add(disposeOnResponse);\n\n const [runOnSlotCreate, onSlotCreate, disposeOnSlotCreate] = createSyncHook<AdheseSlotOptions>();\n disposeFunctions.add(disposeOnSlotCreate);\n\n function clearAll(): void {\n for (const disposeFunction of disposeFunctions)\n disposeFunction();\n }\n\n return {\n runOnInit,\n onInit,\n runOnDispose,\n onDispose,\n runOnRequest,\n onRequest,\n runOnResponse,\n onResponse,\n runOnSlotCreate,\n onSlotCreate,\n clearAll,\n };\n}\n","import { awaitTimeout, createEventManager, effectScope, omit, 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 {\n Adhese,\n AdheseContextStateWithPlugins,\n AdheseOptions,\n AdhesePlugin,\n MergedOptions,\n} from './main.types';\nimport { logger } from './logger/logger';\nimport { useMainDebugMode, useMainParameters, useMainQueryDetector } from './main.composables';\nimport { createGlobalHooks } from './hooks';\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<T extends ReadonlyArray<AdhesePlugin>>(options: AdheseOptions<T>): Adhese<T> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions: MergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n };\n setupLogging(mergedOptions);\n\n const hooks = createGlobalHooks();\n\n const context = reactive<AdheseContextStateWithPlugins<T>>({\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 hooks,\n plugins: {},\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of options.plugins?.entries() ?? []) {\n const data = plugin(context, {\n index,\n version,\n hooks,\n });\n\n const name = data.name as keyof typeof context.plugins;\n context.plugins[name] = omit(data, ['name']) as typeof context.plugins[typeof name];\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 hooks.runOnDispose();\n hooks.clearAll();\n\n scope.stop();\n }\n context.dispose = dispose;\n\n hooks.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 hooks.runOnInit();\n\n return context as Adhese<T>;\n })!;\n}\n"],"names":["name","extRequestAd","_a","findDomSlots","extFindDomSlots"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import { object, string, unknown, union, literal, lazy } from "zod";
2
- import { numberLike, urlLike, dateLike, booleanLike, isJsonOrHtmlOptionalString, cssValueLike, isJsonOrHtmlString } from "@adhese/sdk-shared/validators";
1
+ import { object, numberLike, string, urlLike, dateLike, booleanLike, isJsonOrHtmlOptionalString, unknown, union, literal, cssValueLike, isJsonOrHtmlString, lazy } from "@adhese/sdk-shared/validators";
3
2
  const baseSchema = object({
4
3
  adDuration: numberLike.optional(),
5
4
  adFormat: string().optional(),
@@ -101,4 +100,4 @@ export {
101
100
  jerliciaSchema,
102
101
  parseResponse
103
102
  };
104
- //# sourceMappingURL=requestAds.schema-DbGNhzE_.js.map
103
+ //# sourceMappingURL=requestAds.schema-BsJYUvgz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"requestAds.schema-lenvDWpb.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/validators';\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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"}
1
+ {"version":3,"file":"requestAds.schema-BsJYUvgz.js","sources":["../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import {\n type TypeOf,\n type ZodType,\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n lazy,\n literal,\n numberLike,\n object,\n string,\n union,\n unknown,\n urlLike,\n} from '@adhese/sdk-shared/validators';\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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"}
@@ -1,49 +1,48 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const zod = require("zod");
4
3
  const validators = require("@adhese/sdk-shared/validators");
5
- const baseSchema = zod.object({
4
+ const baseSchema = validators.object({
6
5
  adDuration: validators.numberLike.optional(),
7
- adFormat: zod.string().optional(),
8
- adType: zod.string(),
6
+ adFormat: validators.string().optional(),
7
+ adType: validators.string(),
9
8
  additionalCreativeTracker: validators.urlLike.optional(),
10
- additionalViewableTracker: zod.string().optional(),
9
+ additionalViewableTracker: validators.string().optional(),
11
10
  adspaceEnd: validators.dateLike.optional(),
12
- adspaceId: zod.string().optional(),
13
- adspaceKey: zod.string().optional(),
11
+ adspaceId: validators.string().optional(),
12
+ adspaceKey: validators.string().optional(),
14
13
  adspaceStart: validators.dateLike.optional(),
15
- advertiserId: zod.string().optional(),
16
- altText: zod.string().optional(),
14
+ advertiserId: validators.string().optional(),
15
+ altText: validators.string().optional(),
17
16
  auctionable: validators.booleanLike.optional(),
18
17
  body: validators.isJsonOrHtmlOptionalString,
19
18
  clickTag: validators.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()
19
+ comment: validators.string().optional(),
20
+ creativeName: validators.string().optional(),
21
+ deliveryGroupId: validators.string().optional(),
22
+ deliveryMultiples: validators.string().optional(),
23
+ ext: validators.string().optional(),
24
+ extension: validators.object({
25
+ mediaType: validators.string(),
26
+ prebid: validators.unknown().optional()
28
27
  }).optional(),
29
28
  height: validators.numberLike.optional(),
30
- id: zod.string(),
29
+ id: validators.string(),
31
30
  impressionCounter: validators.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(),
31
+ libId: validators.string().optional(),
32
+ orderId: validators.string().optional(),
33
+ orderName: validators.string().optional(),
34
+ orderProperty: validators.string().optional(),
35
+ origin: validators.union([validators.literal("JERLICIA"), validators.literal("DALE")]),
36
+ originData: validators.unknown().optional(),
37
+ originInstance: validators.string().optional(),
39
38
  poolPath: validators.urlLike.optional(),
40
39
  preview: validators.booleanLike.optional(),
41
40
  priority: validators.numberLike.optional(),
42
41
  sfSrc: validators.urlLike.optional(),
43
- share: zod.string().optional(),
42
+ share: validators.string().optional(),
44
43
  // eslint-disable-next-line ts/naming-convention
45
- slotID: zod.string(),
46
- slotName: zod.string(),
44
+ slotID: validators.string(),
45
+ slotName: validators.string(),
47
46
  swfSrc: validators.urlLike.optional(),
48
47
  tag: validators.isJsonOrHtmlOptionalString,
49
48
  tagUrl: validators.urlLike.optional(),
@@ -56,19 +55,19 @@ const baseSchema = zod.object({
56
55
  width: validators.numberLike.optional(),
57
56
  widthLarge: validators.cssValueLike.optional()
58
57
  });
59
- const jerliciaSchema = zod.object({
60
- origin: zod.literal("JERLICIA"),
58
+ const jerliciaSchema = validators.object({
59
+ origin: validators.literal("JERLICIA"),
61
60
  tag: validators.isJsonOrHtmlString
62
61
  }).passthrough();
63
- const daleSchema = zod.object({
64
- origin: zod.literal("DALE"),
62
+ const daleSchema = validators.object({
63
+ origin: validators.literal("DALE"),
65
64
  body: validators.isJsonOrHtmlString
66
65
  }).passthrough().transform(({ body, ...data }) => ({
67
66
  ...data,
68
67
  tag: body
69
68
  }));
70
69
  const adResponseSchema = baseSchema.extend({
71
- additionalCreatives: zod.lazy(() => zod.union([adResponseSchema.array(), zod.string()]).optional())
70
+ additionalCreatives: validators.lazy(() => validators.union([adResponseSchema.array(), validators.string()]).optional())
72
71
  });
73
72
  const adSchema = adResponseSchema.transform(({
74
73
  additionalCreatives,
@@ -101,4 +100,4 @@ exports.adSchema = adSchema;
101
100
  exports.daleSchema = daleSchema;
102
101
  exports.jerliciaSchema = jerliciaSchema;
103
102
  exports.parseResponse = parseResponse;
104
- //# sourceMappingURL=requestAds.schema-lenvDWpb.cjs.map
103
+ //# sourceMappingURL=requestAds.schema-Cr3vDRnz.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestAds.schema-Cr3vDRnz.cjs","sources":["../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import {\n type TypeOf,\n type ZodType,\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n lazy,\n literal,\n numberLike,\n object,\n string,\n union,\n unknown,\n urlLike,\n} from '@adhese/sdk-shared/validators';\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.19.0",
4
+ "version": "0.19.2",
5
5
  "description": "Adhese SDK",
6
6
  "license": "GPL-3.0",
7
7
  "repository": {
@@ -32,8 +32,6 @@
32
32
  "prepareRelease": "npm run build"
33
33
  },
34
34
  "dependencies": {
35
- "@adhese/sdk-shared": "^0.7.0",
36
- "remeda": "^1.61.0",
37
- "zod": "^3.23.8"
35
+ "@adhese/sdk-shared": "^0.9.0"
38
36
  }
39
37
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"requestAds.schema-DbGNhzE_.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/validators';\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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"}