@adhese/sdk 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +34 -27
- package/dist/cjs/index.js.map +1 -1
- package/dist/es/index.js +34 -27
- package/dist/es/index.js.map +1 -1
- package/dist/index.d.ts +17 -77
- package/package.json +3 -3
package/dist/cjs/index.js
CHANGED
|
@@ -601,6 +601,7 @@ async function createSlot(options) {
|
|
|
601
601
|
account: context.options.account,
|
|
602
602
|
host: context.options.host,
|
|
603
603
|
parameters: context.parameters,
|
|
604
|
+
method: context.options.requestType,
|
|
604
605
|
context
|
|
605
606
|
});
|
|
606
607
|
cleanElement();
|
|
@@ -695,6 +696,7 @@ async function createSlot(options) {
|
|
|
695
696
|
account: context.options.account,
|
|
696
697
|
host: context.options.host,
|
|
697
698
|
parameters: context.parameters,
|
|
699
|
+
method: context.options.requestType,
|
|
698
700
|
context
|
|
699
701
|
});
|
|
700
702
|
if (!element) {
|
|
@@ -782,13 +784,8 @@ const dateLike = zod.union([zod.coerce.string(), zod.literal("")]).transform((va
|
|
|
782
784
|
return void 0;
|
|
783
785
|
return date;
|
|
784
786
|
});
|
|
785
|
-
const
|
|
787
|
+
const baseSchema = zod.object({
|
|
786
788
|
adDuration: numberLike.optional(),
|
|
787
|
-
adDuration2nd: numberLike.optional(),
|
|
788
|
-
adDuration3rd: numberLike.optional(),
|
|
789
|
-
adDuration4th: numberLike.optional(),
|
|
790
|
-
adDuration5th: numberLike.optional(),
|
|
791
|
-
adDuration6th: numberLike.optional(),
|
|
792
789
|
adFormat: zod.string().optional(),
|
|
793
790
|
adType: zod.string(),
|
|
794
791
|
additionalCreativeTracker: urlLike.optional(),
|
|
@@ -806,28 +803,21 @@ const baseAdResponseScheme = zod.object({
|
|
|
806
803
|
creativeName: zod.string().optional(),
|
|
807
804
|
deliveryGroupId: zod.string().optional(),
|
|
808
805
|
deliveryMultiples: zod.string().optional(),
|
|
809
|
-
dm: zod.string().optional(),
|
|
810
806
|
ext: zod.string().optional(),
|
|
811
807
|
extension: zod.object({
|
|
812
808
|
mediaType: zod.string(),
|
|
813
809
|
prebid: zod.unknown().optional()
|
|
814
810
|
}).optional(),
|
|
815
|
-
extraField1: zod.string().optional(),
|
|
816
|
-
extraField2: zod.string().optional(),
|
|
817
811
|
height: numberLike.optional(),
|
|
818
|
-
height3rd: numberLike.optional(),
|
|
819
|
-
height4th: numberLike.optional(),
|
|
820
|
-
height5th: numberLike.optional(),
|
|
821
|
-
height6th: numberLike.optional(),
|
|
822
|
-
heightLarge: numberLike.optional(),
|
|
823
812
|
id: zod.string().optional(),
|
|
824
813
|
impressionCounter: urlLike.optional(),
|
|
825
814
|
libId: zod.string().optional(),
|
|
826
815
|
orderId: zod.string().optional(),
|
|
827
816
|
orderName: zod.string().optional(),
|
|
828
817
|
orderProperty: zod.string().optional(),
|
|
829
|
-
origin: zod.
|
|
818
|
+
origin: zod.union([zod.literal("JERLICIA"), zod.literal("DALE")]),
|
|
830
819
|
originData: zod.unknown().optional(),
|
|
820
|
+
originInstance: zod.string().optional(),
|
|
831
821
|
poolPath: urlLike.optional(),
|
|
832
822
|
preview: booleanLike.optional(),
|
|
833
823
|
priority: numberLike.optional(),
|
|
@@ -836,12 +826,7 @@ const baseAdResponseScheme = zod.object({
|
|
|
836
826
|
slotID: zod.string(),
|
|
837
827
|
slotName: zod.string(),
|
|
838
828
|
swfSrc: urlLike.optional(),
|
|
839
|
-
|
|
840
|
-
swfSrc3rd: zod.string().optional(),
|
|
841
|
-
swfSrc4th: zod.string().optional(),
|
|
842
|
-
swfSrc5th: zod.string().optional(),
|
|
843
|
-
swfSrc6th: zod.string().optional(),
|
|
844
|
-
tag: zod.string(),
|
|
829
|
+
tag: zod.string().optional(),
|
|
845
830
|
tagUrl: urlLike.optional(),
|
|
846
831
|
timeStamp: dateLike.optional(),
|
|
847
832
|
trackedImpressionCounter: urlLike.optional(),
|
|
@@ -850,13 +835,20 @@ const baseAdResponseScheme = zod.object({
|
|
|
850
835
|
url: urlLike.optional(),
|
|
851
836
|
viewableImpressionCounter: urlLike.optional(),
|
|
852
837
|
width: numberLike.optional(),
|
|
853
|
-
width3rd: numberLike.optional(),
|
|
854
|
-
width4th: numberLike.optional(),
|
|
855
|
-
width5th: numberLike.optional(),
|
|
856
|
-
width6th: numberLike.optional(),
|
|
857
838
|
widthLarge: numberLike.optional()
|
|
858
839
|
});
|
|
859
|
-
const
|
|
840
|
+
const jerliciaSchema = zod.object({
|
|
841
|
+
origin: zod.literal("JERLICIA"),
|
|
842
|
+
tag: zod.string()
|
|
843
|
+
}).passthrough();
|
|
844
|
+
const daleSchema = zod.object({
|
|
845
|
+
origin: zod.literal("DALE"),
|
|
846
|
+
body: zod.string()
|
|
847
|
+
}).passthrough().transform(({ body, ...data }) => ({
|
|
848
|
+
...data,
|
|
849
|
+
tag: body
|
|
850
|
+
}));
|
|
851
|
+
const adResponseSchema = baseSchema.extend({
|
|
860
852
|
additionalCreatives: zod.lazy(() => zod.union([adResponseSchema.array(), zod.string()]).optional())
|
|
861
853
|
});
|
|
862
854
|
const adSchema = adResponseSchema.transform(({
|
|
@@ -871,6 +863,21 @@ const adSchema = adResponseSchema.transform(({
|
|
|
871
863
|
additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map((creative) => adSchema.parse(creative)) : additionalCreatives
|
|
872
864
|
};
|
|
873
865
|
});
|
|
866
|
+
function parseResponse(response) {
|
|
867
|
+
const schemaMap = {
|
|
868
|
+
/* eslint-disable ts/naming-convention */
|
|
869
|
+
JERLICIA: jerliciaSchema,
|
|
870
|
+
DALE: daleSchema
|
|
871
|
+
/* eslint-enable ts/naming-convention */
|
|
872
|
+
};
|
|
873
|
+
const preParsed = adResponseSchema.array().parse(response);
|
|
874
|
+
return preParsed.map((item) => {
|
|
875
|
+
const schema = schemaMap[item.origin];
|
|
876
|
+
if (!schema)
|
|
877
|
+
return adSchema.parse(item);
|
|
878
|
+
return schema.parse(item);
|
|
879
|
+
});
|
|
880
|
+
}
|
|
874
881
|
async function requestPreviews(account) {
|
|
875
882
|
const previewObjects = getPreviewObjects();
|
|
876
883
|
const list = (await Promise.allSettled(previewObjects.filter((previewObject) => "adhesePreviewCreativeId" in previewObject).map(async (previewObject) => {
|
|
@@ -969,7 +976,7 @@ async function requestAds({
|
|
|
969
976
|
logger.debug("Received response", response);
|
|
970
977
|
if (!response.ok)
|
|
971
978
|
throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);
|
|
972
|
-
const result =
|
|
979
|
+
const result = parseResponse(await response.json());
|
|
973
980
|
logger.debug("Parsed ad", result);
|
|
974
981
|
if (previews.length > 0)
|
|
975
982
|
logger.info(`Found ${previews.length} ${previews.length === 1 ? "preview" : "previews"}. Replacing ads in response with preview items`, previews);
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../../utils/src/eventManager/eventManager.ts","../../../core/src/slot/findDomSlots/findDomSlots.ts","../../../core/src/slot/slotManager/slotManager.ts","../../../core/src/consent/tcfConsent.ts","../../../core/src/queryDetector/queryDetector.ts","../../../logger/src/createLogger/createLogger.ts","../../../core/src/logger/logger.ts","../../../core/src/main.utils.ts","../../../core/src/main.ts","../../../core/src/impressionTracking/impressionTracking.ts","../../../core/src/slot/createSlot/createSlot.utils.ts","../../../core/src/slot/createSlot/createSlot.ts","../../../core/src/requestAds/requestAds.schema.ts","../../../core/src/requestAds/requestAds.preview.ts","../../../core/src/requestAds/requestAds.utils.ts","../../../core/src/requestAds/requestAds.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","import { type AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@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 (await Promise.all(Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter(element => Boolean(element.dataset.format))\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.getName() === slot.getName()));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Promise<Readonly<AdheseSlot>>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport async function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Promise<Readonly<SlotManager>> {\n const slots = new Map<string, AdheseSlot>();\n\n await Promise.allSettled(initialSlots.map(async slot => add({\n ...slot,\n lazyLoading: false,\n })));\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n async function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Promise<Readonly<AdheseSlot>> {\n const slot = await createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n onNameChange,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.getName());\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n slots.set(slot.getName(), slot);\n\n function onNameChange(newName: string, previousName: string): void {\n slots.set(newName, slot);\n slots.delete(previousName);\n\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots) {\n slots.set(slot.getName(), slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { debounce } from 'lodash-es';\nimport { logger } from '@core';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, 50);\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","import { createEventManager } from '@utils';\nimport { uniqueId } from 'lodash-es';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import { random } from 'lodash-es';\nimport { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): MapWithEvents<string, string | ReadonlyArray<string>> {\n const parameters = new MapWithEvents<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: random(10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n\nexport class MapWithEvents<T, U> extends Map<T, U> {\n private readonly listeners = new Set<() => void>();\n\n public addEventListener(listener: () => void): void {\n this.listeners.add(listener);\n }\n\n public removeEventListener(listener: () => void): void {\n this.listeners.delete(listener);\n }\n\n public set(key: T, value: U): this {\n const set = super.set(key, value);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return set;\n }\n\n public clear(): void {\n super.clear();\n\n this.listeners.forEach((listener) => {\n listener();\n });\n }\n\n public delete(key: T): boolean {\n const deleted = super.delete(key);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return deleted;\n }\n\n /**\n * Remove all listeners and clear the map.\n */\n public dispose(): void {\n this.listeners.clear();\n super.clear();\n }\n}\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\nimport { createDevtools } from '@adhese/sdk-devtools';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport async function createAdhese(options: AdheseOptions): Promise<Readonly<Adhese>> {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = new Proxy<AdheseContext>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }, {});\n\n context.events = createEventManager();\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n context.parameters.addEventListener(onParametersChange);\n\n let unmountDevtools: (() => void) | undefined;\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode()) {\n unmountDevtools = await createDevtools(context);\n context.events?.debugChange.dispatch(true);\n }\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = await createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll();\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n async function addSlot(slotOptions: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const slot = await slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n const ad = await requestAd({\n slot,\n host: mergedOptions.host,\n parameters: context.parameters,\n account: mergedOptions.account,\n context,\n });\n\n await slot.setAd(ad);\n }\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots()).filter(slot => !slot.lazyLoading);\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots: domSlots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug && !unmountDevtools) {\n // eslint-disable-next-line require-atomic-updates\n unmountDevtools = await createDevtools(context);\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n unmountDevtools?.();\n unmountDevtools = undefined;\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = slotManager.getAll().filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n if (slotManager.getAll().length > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.dispose();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n unmountDevtools?.();\n logger.info('Adhese instance disposed');\n }\n\n if (mergedOptions.findDomSlotsOnLoad)\n await slotManager.findDomSlots();\n\n return {\n ...mergedOptions,\n ...slotManager,\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n context,\n };\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import type { Ad } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\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 ${ad.tag}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : '100%';\n iframe.style.height = ad.height ? `${ad.height}px` : '100%';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.style.width = ad.width ? `${ad.width}px` : '100%';\n element.style.height = ad.height ? `${ad.height}px` : '100%';\n\n element.innerHTML = ad.tag;\n}\n","import { type Ad, logger, requestAd } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { round } from 'lodash-es';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { renderIframe, renderInline } from './createSlot.utils';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport async function createSlot(options: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n await waitForDomLoad();\n\n const parameters = new Map(Object.entries(options.parameters ?? {}));\n\n let format: string;\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format === 'string') {\n // eslint-disable-next-line prefer-destructuring\n format = options.format;\n }\n else {\n queryDetector = createQueryDetector({\n onChange: setFormat,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n\n format = queryDetector.getQuery();\n }\n\n async function setFormat(newFormat: string): Promise<void> {\n const oldName = getName();\n\n format = newFormat;\n options.onNameChange?.(getName(), oldName);\n\n const newAd = await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n cleanElement();\n\n await setAd(newAd);\n }\n\n function getFormat(): string {\n return format;\n }\n\n let element: HTMLElement | null = typeof containingElement === 'string' || !containingElement\n ? document.querySelector<HTMLElement>(`.adunit[data-format=\"${format}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`)\n : containingElement;\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element?.querySelector('iframe') ?? null;\n\n return element?.innerHTML ? (element.firstElementChild as HTMLElement) : null;\n }\n\n let impressionTrackingPixelElement: HTMLImageElement | null = null;\n let viewabilityTrackingPixelElement: HTMLImageElement | null = null;\n\n let isInViewport = false;\n\n let ad: Ad | null = null;\n function getAd(): Ad | null {\n return ad;\n }\n\n async function setAd(newAd: Ad): Promise<void> {\n ad = newAd;\n\n if (isInViewport || context.options.eagerRendering)\n await render(ad);\n\n if (element) {\n element.style.width = `${ad.width}px`;\n element.style.height = `${ad.height}px`;\n }\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n }\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport) {\n (async (): Promise<void> => {\n if (!ad && options.lazyLoading)\n await render();\n\n else if (ad)\n await render(ad);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !viewabilityTrackingPixelElement && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad?.viewableImpressionCounter) {\n viewabilityTrackingPixelElement = addTrackingPixel(ad.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${getName()}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n if (element && context.options.viewabilityTracking)\n viewabilityObserver.observe(element);\n\n if (element)\n renderIntersectionObserver.observe(element);\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n\n // eslint-disable-next-line require-atomic-updates\n ad = adToRender ?? ad ?? await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n if (!element) {\n const error = `Could not create slot for format ${format}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.style.position = 'relative';\n\n renderFunctions[renderMode](ad, element);\n\n if (ad?.impressionCounter && !impressionTrackingPixelElement) {\n impressionTrackingPixelElement = addTrackingPixel(ad.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${getName()}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n renderIntersectionObserver.disconnect();\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n\n return element;\n }\n\n function cleanElement(): void {\n if (!element)\n return;\n\n element.innerHTML = '';\n element.style.position = '';\n element.style.width = '';\n element.style.height = '';\n }\n\n function getName(): string {\n return `${context.location}${slot ? `${slot}` : ''}-${format}`;\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement?.remove();\n viewabilityTrackingPixelElement?.remove();\n\n element = null;\n ad = null;\n\n renderIntersectionObserver.disconnect();\n viewabilityObserver.disconnect();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n }\n\n function isViewabilityTracked(): boolean {\n return Boolean(viewabilityTrackingPixelElement);\n }\n\n function isImpressionTracked(): boolean {\n return Boolean(impressionTrackingPixelElement);\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n setFormat,\n getFormat,\n render,\n getElement,\n getName,\n getAd,\n setAd,\n isViewabilityTracked,\n isImpressionTracked,\n dispose,\n };\n}\n","import { type TypeOf, type ZodType, coerce, lazy, literal, object, string, union, unknown } from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\nconst baseAdResponseScheme = object({\n adDuration: numberLike.optional(),\n adDuration2nd: numberLike.optional(),\n adDuration3rd: numberLike.optional(),\n adDuration4th: numberLike.optional(),\n adDuration5th: numberLike.optional(),\n adDuration6th: 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: string().optional(),\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n dm: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n extraField1: string().optional(),\n extraField2: string().optional(),\n height: numberLike.optional(),\n height3rd: numberLike.optional(),\n height4th: numberLike.optional(),\n height5th: numberLike.optional(),\n height6th: numberLike.optional(),\n heightLarge: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: string().optional(),\n originData: unknown().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n swfSrc2nd: string().optional(),\n swfSrc3rd: string().optional(),\n swfSrc4th: string().optional(),\n swfSrc5th: string().optional(),\n swfSrc6th: string().optional(),\n tag: string(),\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 width3rd: numberLike.optional(),\n width4th: numberLike.optional(),\n width5th: numberLike.optional(),\n width6th: numberLike.optional(),\n widthLarge: numberLike.optional(),\n});\nexport type AdResponse = TypeOf<typeof baseAdResponseScheme> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n};\nconst adResponseSchema: ZodType<AdResponse> = baseAdResponseScheme.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\nexport type Ad = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<Ad> | string;\n};\nexport const adSchema: ZodType<Ad> = 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","import { type Ad, logger } from '@core';\nimport { adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat());\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 { type AdRequestOptions, logger } from '@core';\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 host,\n ...options\n}: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: slot.getName(),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: options.parameters && parseParameters(options.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet(options: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n return fetch(new URL(`${options.host}/json/sl${options.slots.map(slot => slot.getName()).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 }));\n}\n","import type { UrlString } from '@utils';\nimport { type Adhese, type AdheseSlot, logger } from '@core';\nimport { type Ad, adSchema } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<Pick<AdheseSlot, 'getName' | 'parameters'>>;\n /**\n * Host that you want to fetch the ads from\n */\n host: UrlString;\n /**\n * The Adhese account name.\n */\n account: string;\n /**\n * Request method to use for the requestAds\n *\n * @default 'POST'\n */\n method?: 'GET' | 'POST' | 'get' | 'post';\n /**\n * The parameters that are used for all ads.\n */\n parameters?: Map<string, ReadonlyArray<string> | string>;\n context: Partial<Adhese>;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds({\n method = 'POST',\n context,\n ...options\n}: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n method,\n });\n\n const [response, previews] = await Promise.all([method?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = adSchema.array().parse((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: ReadonlyArray<Ad> = [\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ];\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: Pick<AdheseSlot, 'getName' | 'parameters'>;\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["_a","_b","findDomSlots","extFindDomSlots","debounce","uniqueId","random","createDevtools","round","union","coerce","literal","object","string","unknown","lazy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../../utils/src/eventManager/eventManager.ts","../../../core/src/slot/findDomSlots/findDomSlots.ts","../../../core/src/slot/slotManager/slotManager.ts","../../../core/src/consent/tcfConsent.ts","../../../core/src/queryDetector/queryDetector.ts","../../../logger/src/createLogger/createLogger.ts","../../../core/src/logger/logger.ts","../../../core/src/main.utils.ts","../../../core/src/main.ts","../../../core/src/impressionTracking/impressionTracking.ts","../../../core/src/slot/createSlot/createSlot.utils.ts","../../../core/src/slot/createSlot/createSlot.ts","../../../core/src/requestAds/requestAds.schema.ts","../../../core/src/requestAds/requestAds.preview.ts","../../../core/src/requestAds/requestAds.utils.ts","../../../core/src/requestAds/requestAds.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","import { type AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@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 (await Promise.all(Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter(element => Boolean(element.dataset.format))\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.getName() === slot.getName()));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Promise<Readonly<AdheseSlot>>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport async function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Promise<Readonly<SlotManager>> {\n const slots = new Map<string, AdheseSlot>();\n\n await Promise.allSettled(initialSlots.map(async slot => add({\n ...slot,\n lazyLoading: false,\n })));\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n async function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Promise<Readonly<AdheseSlot>> {\n const slot = await createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n onNameChange,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.getName());\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n slots.set(slot.getName(), slot);\n\n function onNameChange(newName: string, previousName: string): void {\n slots.set(newName, slot);\n slots.delete(previousName);\n\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots) {\n slots.set(slot.getName(), slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { debounce } from 'lodash-es';\nimport { logger } from '@core';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, 50);\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","import { createEventManager } from '@utils';\nimport { uniqueId } from 'lodash-es';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import { random } from 'lodash-es';\nimport { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): MapWithEvents<string, string | ReadonlyArray<string>> {\n const parameters = new MapWithEvents<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: random(10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n\nexport class MapWithEvents<T, U> extends Map<T, U> {\n private readonly listeners = new Set<() => void>();\n\n public addEventListener(listener: () => void): void {\n this.listeners.add(listener);\n }\n\n public removeEventListener(listener: () => void): void {\n this.listeners.delete(listener);\n }\n\n public set(key: T, value: U): this {\n const set = super.set(key, value);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return set;\n }\n\n public clear(): void {\n super.clear();\n\n this.listeners.forEach((listener) => {\n listener();\n });\n }\n\n public delete(key: T): boolean {\n const deleted = super.delete(key);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return deleted;\n }\n\n /**\n * Remove all listeners and clear the map.\n */\n public dispose(): void {\n this.listeners.clear();\n super.clear();\n }\n}\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\nimport { createDevtools } from '@adhese/sdk-devtools';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport async function createAdhese(options: AdheseOptions): Promise<Readonly<Adhese>> {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = new Proxy<AdheseContext>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }, {});\n\n context.events = createEventManager();\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n context.parameters.addEventListener(onParametersChange);\n\n let unmountDevtools: (() => void) | undefined;\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode()) {\n unmountDevtools = await createDevtools(context);\n context.events?.debugChange.dispatch(true);\n }\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = await createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll();\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n async function addSlot(slotOptions: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const slot = await slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n const ad = await requestAd({\n slot,\n host: mergedOptions.host,\n parameters: context.parameters,\n account: mergedOptions.account,\n context,\n });\n\n await slot.setAd(ad);\n }\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots()).filter(slot => !slot.lazyLoading);\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots: domSlots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug && !unmountDevtools) {\n // eslint-disable-next-line require-atomic-updates\n unmountDevtools = await createDevtools(context);\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n unmountDevtools?.();\n unmountDevtools = undefined;\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = slotManager.getAll().filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n if (slotManager.getAll().length > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.dispose();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n unmountDevtools?.();\n logger.info('Adhese instance disposed');\n }\n\n if (mergedOptions.findDomSlotsOnLoad)\n await slotManager.findDomSlots();\n\n return {\n ...mergedOptions,\n ...slotManager,\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n context,\n };\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import type { Ad } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\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 ${ad.tag}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : '100%';\n iframe.style.height = ad.height ? `${ad.height}px` : '100%';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.style.width = ad.width ? `${ad.width}px` : '100%';\n element.style.height = ad.height ? `${ad.height}px` : '100%';\n\n element.innerHTML = ad.tag;\n}\n","import { type Ad, logger, requestAd } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { round } from 'lodash-es';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { renderIframe, renderInline } from './createSlot.utils';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport async function createSlot(options: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n await waitForDomLoad();\n\n const parameters = new Map(Object.entries(options.parameters ?? {}));\n\n let format: string;\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format === 'string') {\n // eslint-disable-next-line prefer-destructuring\n format = options.format;\n }\n else {\n queryDetector = createQueryDetector({\n onChange: setFormat,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n\n format = queryDetector.getQuery();\n }\n\n async function setFormat(newFormat: string): Promise<void> {\n const oldName = getName();\n\n format = newFormat;\n options.onNameChange?.(getName(), oldName);\n\n const newAd = await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n method: context.options.requestType,\n context,\n });\n\n cleanElement();\n\n await setAd(newAd);\n }\n\n function getFormat(): string {\n return format;\n }\n\n let element: HTMLElement | null = typeof containingElement === 'string' || !containingElement\n ? document.querySelector<HTMLElement>(`.adunit[data-format=\"${format}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`)\n : containingElement;\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element?.querySelector('iframe') ?? null;\n\n return element?.innerHTML ? (element.firstElementChild as HTMLElement) : null;\n }\n\n let impressionTrackingPixelElement: HTMLImageElement | null = null;\n let viewabilityTrackingPixelElement: HTMLImageElement | null = null;\n\n let isInViewport = false;\n\n let ad: Ad | null = null;\n function getAd(): Ad | null {\n return ad;\n }\n\n async function setAd(newAd: Ad): Promise<void> {\n ad = newAd;\n\n if (isInViewport || context.options.eagerRendering)\n await render(ad);\n\n if (element) {\n element.style.width = `${ad.width}px`;\n element.style.height = `${ad.height}px`;\n }\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n }\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport) {\n (async (): Promise<void> => {\n if (!ad && options.lazyLoading)\n await render();\n\n else if (ad)\n await render(ad);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !viewabilityTrackingPixelElement && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad?.viewableImpressionCounter) {\n viewabilityTrackingPixelElement = addTrackingPixel(ad.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${getName()}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n if (element && context.options.viewabilityTracking)\n viewabilityObserver.observe(element);\n\n if (element)\n renderIntersectionObserver.observe(element);\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n\n // eslint-disable-next-line require-atomic-updates\n ad = adToRender ?? ad ?? await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n method: context.options.requestType,\n context,\n });\n\n if (!element) {\n const error = `Could not create slot for format ${format}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.style.position = 'relative';\n\n renderFunctions[renderMode](ad, element);\n\n if (ad?.impressionCounter && !impressionTrackingPixelElement) {\n impressionTrackingPixelElement = addTrackingPixel(ad.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${getName()}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n renderIntersectionObserver.disconnect();\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n\n return element;\n }\n\n function cleanElement(): void {\n if (!element)\n return;\n\n element.innerHTML = '';\n element.style.position = '';\n element.style.width = '';\n element.style.height = '';\n }\n\n function getName(): string {\n return `${context.location}${slot ? `${slot}` : ''}-${format}`;\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement?.remove();\n viewabilityTrackingPixelElement?.remove();\n\n element = null;\n ad = null;\n\n renderIntersectionObserver.disconnect();\n viewabilityObserver.disconnect();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n }\n\n function isViewabilityTracked(): boolean {\n return Boolean(viewabilityTrackingPixelElement);\n }\n\n function isImpressionTracked(): boolean {\n return Boolean(impressionTrackingPixelElement);\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n setFormat,\n getFormat,\n render,\n getElement,\n getName,\n getAd,\n setAd,\n isViewabilityTracked,\n isImpressionTracked,\n dispose,\n };\n}\n","import {\n type TypeOf,\n type ZodType,\n coerce,\n lazy,\n literal,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\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: string().optional(),\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().optional(),\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 share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: string().optional(),\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: numberLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: string(),\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: string(),\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad = Omit<PreParsedAd, 'tag'> & {\n tag: string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { type Ad, logger } from '@core';\nimport { adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { type AdRequestOptions, logger } from '@core';\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 host,\n ...options\n}: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: slot.getName(),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: options.parameters && parseParameters(options.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet(options: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n return fetch(new URL(`${options.host}/json/sl${options.slots.map(slot => slot.getName()).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 }));\n}\n","import type { UrlString } from '@utils';\nimport { type Adhese, type AdheseSlot, logger } from '@core';\nimport { type Ad, parseResponse } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<Pick<AdheseSlot, 'getName' | 'parameters'>>;\n /**\n * Host that you want to fetch the ads from\n */\n host: UrlString;\n /**\n * The Adhese account name.\n */\n account: string;\n /**\n * Request method to use for the requestAds\n *\n * @default 'POST'\n */\n method?: 'GET' | 'POST' | 'get' | 'post';\n /**\n * The parameters that are used for all ads.\n */\n parameters?: Map<string, ReadonlyArray<string> | string>;\n context: Partial<Adhese>;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds({\n method = 'POST',\n context,\n ...options\n}: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n method,\n });\n\n const [response, previews] = await Promise.all([method?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult: ReadonlyArray<Ad> = [\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ];\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: Pick<AdheseSlot, 'getName' | 'parameters'>;\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["_a","_b","findDomSlots","extFindDomSlots","debounce","uniqueId","random","createDevtools","round","union","coerce","literal","object","string","unknown","lazy"],"mappings":"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"}
|
package/dist/es/index.js
CHANGED
|
@@ -599,6 +599,7 @@ async function createSlot(options) {
|
|
|
599
599
|
account: context.options.account,
|
|
600
600
|
host: context.options.host,
|
|
601
601
|
parameters: context.parameters,
|
|
602
|
+
method: context.options.requestType,
|
|
602
603
|
context
|
|
603
604
|
});
|
|
604
605
|
cleanElement();
|
|
@@ -693,6 +694,7 @@ async function createSlot(options) {
|
|
|
693
694
|
account: context.options.account,
|
|
694
695
|
host: context.options.host,
|
|
695
696
|
parameters: context.parameters,
|
|
697
|
+
method: context.options.requestType,
|
|
696
698
|
context
|
|
697
699
|
});
|
|
698
700
|
if (!element) {
|
|
@@ -780,13 +782,8 @@ const dateLike = union([coerce.string(), literal("")]).transform((value) => {
|
|
|
780
782
|
return void 0;
|
|
781
783
|
return date;
|
|
782
784
|
});
|
|
783
|
-
const
|
|
785
|
+
const baseSchema = object({
|
|
784
786
|
adDuration: numberLike.optional(),
|
|
785
|
-
adDuration2nd: numberLike.optional(),
|
|
786
|
-
adDuration3rd: numberLike.optional(),
|
|
787
|
-
adDuration4th: numberLike.optional(),
|
|
788
|
-
adDuration5th: numberLike.optional(),
|
|
789
|
-
adDuration6th: numberLike.optional(),
|
|
790
787
|
adFormat: string().optional(),
|
|
791
788
|
adType: string(),
|
|
792
789
|
additionalCreativeTracker: urlLike.optional(),
|
|
@@ -804,28 +801,21 @@ const baseAdResponseScheme = object({
|
|
|
804
801
|
creativeName: string().optional(),
|
|
805
802
|
deliveryGroupId: string().optional(),
|
|
806
803
|
deliveryMultiples: string().optional(),
|
|
807
|
-
dm: string().optional(),
|
|
808
804
|
ext: string().optional(),
|
|
809
805
|
extension: object({
|
|
810
806
|
mediaType: string(),
|
|
811
807
|
prebid: unknown().optional()
|
|
812
808
|
}).optional(),
|
|
813
|
-
extraField1: string().optional(),
|
|
814
|
-
extraField2: string().optional(),
|
|
815
809
|
height: numberLike.optional(),
|
|
816
|
-
height3rd: numberLike.optional(),
|
|
817
|
-
height4th: numberLike.optional(),
|
|
818
|
-
height5th: numberLike.optional(),
|
|
819
|
-
height6th: numberLike.optional(),
|
|
820
|
-
heightLarge: numberLike.optional(),
|
|
821
810
|
id: string().optional(),
|
|
822
811
|
impressionCounter: urlLike.optional(),
|
|
823
812
|
libId: string().optional(),
|
|
824
813
|
orderId: string().optional(),
|
|
825
814
|
orderName: string().optional(),
|
|
826
815
|
orderProperty: string().optional(),
|
|
827
|
-
origin:
|
|
816
|
+
origin: union([literal("JERLICIA"), literal("DALE")]),
|
|
828
817
|
originData: unknown().optional(),
|
|
818
|
+
originInstance: string().optional(),
|
|
829
819
|
poolPath: urlLike.optional(),
|
|
830
820
|
preview: booleanLike.optional(),
|
|
831
821
|
priority: numberLike.optional(),
|
|
@@ -834,12 +824,7 @@ const baseAdResponseScheme = object({
|
|
|
834
824
|
slotID: string(),
|
|
835
825
|
slotName: string(),
|
|
836
826
|
swfSrc: urlLike.optional(),
|
|
837
|
-
|
|
838
|
-
swfSrc3rd: string().optional(),
|
|
839
|
-
swfSrc4th: string().optional(),
|
|
840
|
-
swfSrc5th: string().optional(),
|
|
841
|
-
swfSrc6th: string().optional(),
|
|
842
|
-
tag: string(),
|
|
827
|
+
tag: string().optional(),
|
|
843
828
|
tagUrl: urlLike.optional(),
|
|
844
829
|
timeStamp: dateLike.optional(),
|
|
845
830
|
trackedImpressionCounter: urlLike.optional(),
|
|
@@ -848,13 +833,20 @@ const baseAdResponseScheme = object({
|
|
|
848
833
|
url: urlLike.optional(),
|
|
849
834
|
viewableImpressionCounter: urlLike.optional(),
|
|
850
835
|
width: numberLike.optional(),
|
|
851
|
-
width3rd: numberLike.optional(),
|
|
852
|
-
width4th: numberLike.optional(),
|
|
853
|
-
width5th: numberLike.optional(),
|
|
854
|
-
width6th: numberLike.optional(),
|
|
855
836
|
widthLarge: numberLike.optional()
|
|
856
837
|
});
|
|
857
|
-
const
|
|
838
|
+
const jerliciaSchema = object({
|
|
839
|
+
origin: literal("JERLICIA"),
|
|
840
|
+
tag: string()
|
|
841
|
+
}).passthrough();
|
|
842
|
+
const daleSchema = object({
|
|
843
|
+
origin: literal("DALE"),
|
|
844
|
+
body: string()
|
|
845
|
+
}).passthrough().transform(({ body, ...data }) => ({
|
|
846
|
+
...data,
|
|
847
|
+
tag: body
|
|
848
|
+
}));
|
|
849
|
+
const adResponseSchema = baseSchema.extend({
|
|
858
850
|
additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional())
|
|
859
851
|
});
|
|
860
852
|
const adSchema = adResponseSchema.transform(({
|
|
@@ -869,6 +861,21 @@ const adSchema = adResponseSchema.transform(({
|
|
|
869
861
|
additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map((creative) => adSchema.parse(creative)) : additionalCreatives
|
|
870
862
|
};
|
|
871
863
|
});
|
|
864
|
+
function parseResponse(response) {
|
|
865
|
+
const schemaMap = {
|
|
866
|
+
/* eslint-disable ts/naming-convention */
|
|
867
|
+
JERLICIA: jerliciaSchema,
|
|
868
|
+
DALE: daleSchema
|
|
869
|
+
/* eslint-enable ts/naming-convention */
|
|
870
|
+
};
|
|
871
|
+
const preParsed = adResponseSchema.array().parse(response);
|
|
872
|
+
return preParsed.map((item) => {
|
|
873
|
+
const schema = schemaMap[item.origin];
|
|
874
|
+
if (!schema)
|
|
875
|
+
return adSchema.parse(item);
|
|
876
|
+
return schema.parse(item);
|
|
877
|
+
});
|
|
878
|
+
}
|
|
872
879
|
async function requestPreviews(account) {
|
|
873
880
|
const previewObjects = getPreviewObjects();
|
|
874
881
|
const list = (await Promise.allSettled(previewObjects.filter((previewObject) => "adhesePreviewCreativeId" in previewObject).map(async (previewObject) => {
|
|
@@ -967,7 +974,7 @@ async function requestAds({
|
|
|
967
974
|
logger.debug("Received response", response);
|
|
968
975
|
if (!response.ok)
|
|
969
976
|
throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);
|
|
970
|
-
const result =
|
|
977
|
+
const result = parseResponse(await response.json());
|
|
971
978
|
logger.debug("Parsed ad", result);
|
|
972
979
|
if (previews.length > 0)
|
|
973
980
|
logger.info(`Found ${previews.length} ${previews.length === 1 ? "preview" : "previews"}. Replacing ads in response with preview items`, previews);
|
package/dist/es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../../utils/src/eventManager/eventManager.ts","../../../core/src/slot/findDomSlots/findDomSlots.ts","../../../core/src/slot/slotManager/slotManager.ts","../../../core/src/consent/tcfConsent.ts","../../../core/src/queryDetector/queryDetector.ts","../../../logger/src/createLogger/createLogger.ts","../../../core/src/logger/logger.ts","../../../core/src/main.utils.ts","../../../core/src/main.ts","../../../core/src/impressionTracking/impressionTracking.ts","../../../core/src/slot/createSlot/createSlot.utils.ts","../../../core/src/slot/createSlot/createSlot.ts","../../../core/src/requestAds/requestAds.schema.ts","../../../core/src/requestAds/requestAds.preview.ts","../../../core/src/requestAds/requestAds.utils.ts","../../../core/src/requestAds/requestAds.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","import { type AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@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 (await Promise.all(Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter(element => Boolean(element.dataset.format))\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.getName() === slot.getName()));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Promise<Readonly<AdheseSlot>>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport async function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Promise<Readonly<SlotManager>> {\n const slots = new Map<string, AdheseSlot>();\n\n await Promise.allSettled(initialSlots.map(async slot => add({\n ...slot,\n lazyLoading: false,\n })));\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n async function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Promise<Readonly<AdheseSlot>> {\n const slot = await createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n onNameChange,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.getName());\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n slots.set(slot.getName(), slot);\n\n function onNameChange(newName: string, previousName: string): void {\n slots.set(newName, slot);\n slots.delete(previousName);\n\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots) {\n slots.set(slot.getName(), slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { debounce } from 'lodash-es';\nimport { logger } from '@core';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, 50);\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","import { createEventManager } from '@utils';\nimport { uniqueId } from 'lodash-es';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import { random } from 'lodash-es';\nimport { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): MapWithEvents<string, string | ReadonlyArray<string>> {\n const parameters = new MapWithEvents<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: random(10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n\nexport class MapWithEvents<T, U> extends Map<T, U> {\n private readonly listeners = new Set<() => void>();\n\n public addEventListener(listener: () => void): void {\n this.listeners.add(listener);\n }\n\n public removeEventListener(listener: () => void): void {\n this.listeners.delete(listener);\n }\n\n public set(key: T, value: U): this {\n const set = super.set(key, value);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return set;\n }\n\n public clear(): void {\n super.clear();\n\n this.listeners.forEach((listener) => {\n listener();\n });\n }\n\n public delete(key: T): boolean {\n const deleted = super.delete(key);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return deleted;\n }\n\n /**\n * Remove all listeners and clear the map.\n */\n public dispose(): void {\n this.listeners.clear();\n super.clear();\n }\n}\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\nimport { createDevtools } from '@adhese/sdk-devtools';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport async function createAdhese(options: AdheseOptions): Promise<Readonly<Adhese>> {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = new Proxy<AdheseContext>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }, {});\n\n context.events = createEventManager();\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n context.parameters.addEventListener(onParametersChange);\n\n let unmountDevtools: (() => void) | undefined;\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode()) {\n unmountDevtools = await createDevtools(context);\n context.events?.debugChange.dispatch(true);\n }\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = await createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll();\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n async function addSlot(slotOptions: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const slot = await slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n const ad = await requestAd({\n slot,\n host: mergedOptions.host,\n parameters: context.parameters,\n account: mergedOptions.account,\n context,\n });\n\n await slot.setAd(ad);\n }\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots()).filter(slot => !slot.lazyLoading);\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots: domSlots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug && !unmountDevtools) {\n // eslint-disable-next-line require-atomic-updates\n unmountDevtools = await createDevtools(context);\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n unmountDevtools?.();\n unmountDevtools = undefined;\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = slotManager.getAll().filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n if (slotManager.getAll().length > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.dispose();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n unmountDevtools?.();\n logger.info('Adhese instance disposed');\n }\n\n if (mergedOptions.findDomSlotsOnLoad)\n await slotManager.findDomSlots();\n\n return {\n ...mergedOptions,\n ...slotManager,\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n context,\n };\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import type { Ad } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\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 ${ad.tag}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : '100%';\n iframe.style.height = ad.height ? `${ad.height}px` : '100%';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.style.width = ad.width ? `${ad.width}px` : '100%';\n element.style.height = ad.height ? `${ad.height}px` : '100%';\n\n element.innerHTML = ad.tag;\n}\n","import { type Ad, logger, requestAd } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { round } from 'lodash-es';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { renderIframe, renderInline } from './createSlot.utils';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport async function createSlot(options: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n await waitForDomLoad();\n\n const parameters = new Map(Object.entries(options.parameters ?? {}));\n\n let format: string;\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format === 'string') {\n // eslint-disable-next-line prefer-destructuring\n format = options.format;\n }\n else {\n queryDetector = createQueryDetector({\n onChange: setFormat,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n\n format = queryDetector.getQuery();\n }\n\n async function setFormat(newFormat: string): Promise<void> {\n const oldName = getName();\n\n format = newFormat;\n options.onNameChange?.(getName(), oldName);\n\n const newAd = await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n cleanElement();\n\n await setAd(newAd);\n }\n\n function getFormat(): string {\n return format;\n }\n\n let element: HTMLElement | null = typeof containingElement === 'string' || !containingElement\n ? document.querySelector<HTMLElement>(`.adunit[data-format=\"${format}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`)\n : containingElement;\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element?.querySelector('iframe') ?? null;\n\n return element?.innerHTML ? (element.firstElementChild as HTMLElement) : null;\n }\n\n let impressionTrackingPixelElement: HTMLImageElement | null = null;\n let viewabilityTrackingPixelElement: HTMLImageElement | null = null;\n\n let isInViewport = false;\n\n let ad: Ad | null = null;\n function getAd(): Ad | null {\n return ad;\n }\n\n async function setAd(newAd: Ad): Promise<void> {\n ad = newAd;\n\n if (isInViewport || context.options.eagerRendering)\n await render(ad);\n\n if (element) {\n element.style.width = `${ad.width}px`;\n element.style.height = `${ad.height}px`;\n }\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n }\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport) {\n (async (): Promise<void> => {\n if (!ad && options.lazyLoading)\n await render();\n\n else if (ad)\n await render(ad);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !viewabilityTrackingPixelElement && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad?.viewableImpressionCounter) {\n viewabilityTrackingPixelElement = addTrackingPixel(ad.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${getName()}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n if (element && context.options.viewabilityTracking)\n viewabilityObserver.observe(element);\n\n if (element)\n renderIntersectionObserver.observe(element);\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n\n // eslint-disable-next-line require-atomic-updates\n ad = adToRender ?? ad ?? await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n if (!element) {\n const error = `Could not create slot for format ${format}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.style.position = 'relative';\n\n renderFunctions[renderMode](ad, element);\n\n if (ad?.impressionCounter && !impressionTrackingPixelElement) {\n impressionTrackingPixelElement = addTrackingPixel(ad.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${getName()}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n renderIntersectionObserver.disconnect();\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n\n return element;\n }\n\n function cleanElement(): void {\n if (!element)\n return;\n\n element.innerHTML = '';\n element.style.position = '';\n element.style.width = '';\n element.style.height = '';\n }\n\n function getName(): string {\n return `${context.location}${slot ? `${slot}` : ''}-${format}`;\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement?.remove();\n viewabilityTrackingPixelElement?.remove();\n\n element = null;\n ad = null;\n\n renderIntersectionObserver.disconnect();\n viewabilityObserver.disconnect();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n }\n\n function isViewabilityTracked(): boolean {\n return Boolean(viewabilityTrackingPixelElement);\n }\n\n function isImpressionTracked(): boolean {\n return Boolean(impressionTrackingPixelElement);\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n setFormat,\n getFormat,\n render,\n getElement,\n getName,\n getAd,\n setAd,\n isViewabilityTracked,\n isImpressionTracked,\n dispose,\n };\n}\n","import { type TypeOf, type ZodType, coerce, lazy, literal, object, string, union, unknown } from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\nconst baseAdResponseScheme = object({\n adDuration: numberLike.optional(),\n adDuration2nd: numberLike.optional(),\n adDuration3rd: numberLike.optional(),\n adDuration4th: numberLike.optional(),\n adDuration5th: numberLike.optional(),\n adDuration6th: 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: string().optional(),\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n dm: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n extraField1: string().optional(),\n extraField2: string().optional(),\n height: numberLike.optional(),\n height3rd: numberLike.optional(),\n height4th: numberLike.optional(),\n height5th: numberLike.optional(),\n height6th: numberLike.optional(),\n heightLarge: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: string().optional(),\n originData: unknown().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n swfSrc2nd: string().optional(),\n swfSrc3rd: string().optional(),\n swfSrc4th: string().optional(),\n swfSrc5th: string().optional(),\n swfSrc6th: string().optional(),\n tag: string(),\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 width3rd: numberLike.optional(),\n width4th: numberLike.optional(),\n width5th: numberLike.optional(),\n width6th: numberLike.optional(),\n widthLarge: numberLike.optional(),\n});\nexport type AdResponse = TypeOf<typeof baseAdResponseScheme> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n};\nconst adResponseSchema: ZodType<AdResponse> = baseAdResponseScheme.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\nexport type Ad = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<Ad> | string;\n};\nexport const adSchema: ZodType<Ad> = 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","import { type Ad, logger } from '@core';\nimport { adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat());\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 { type AdRequestOptions, logger } from '@core';\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 host,\n ...options\n}: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: slot.getName(),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: options.parameters && parseParameters(options.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet(options: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n return fetch(new URL(`${options.host}/json/sl${options.slots.map(slot => slot.getName()).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 }));\n}\n","import type { UrlString } from '@utils';\nimport { type Adhese, type AdheseSlot, logger } from '@core';\nimport { type Ad, adSchema } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<Pick<AdheseSlot, 'getName' | 'parameters'>>;\n /**\n * Host that you want to fetch the ads from\n */\n host: UrlString;\n /**\n * The Adhese account name.\n */\n account: string;\n /**\n * Request method to use for the requestAds\n *\n * @default 'POST'\n */\n method?: 'GET' | 'POST' | 'get' | 'post';\n /**\n * The parameters that are used for all ads.\n */\n parameters?: Map<string, ReadonlyArray<string> | string>;\n context: Partial<Adhese>;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds({\n method = 'POST',\n context,\n ...options\n}: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n method,\n });\n\n const [response, previews] = await Promise.all([method?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = adSchema.array().parse((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: ReadonlyArray<Ad> = [\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ];\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: Pick<AdheseSlot, 'getName' | 'parameters'>;\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["_a","_b","findDomSlots","extFindDomSlots"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../../utils/src/eventManager/eventManager.ts","../../../core/src/slot/findDomSlots/findDomSlots.ts","../../../core/src/slot/slotManager/slotManager.ts","../../../core/src/consent/tcfConsent.ts","../../../core/src/queryDetector/queryDetector.ts","../../../logger/src/createLogger/createLogger.ts","../../../core/src/logger/logger.ts","../../../core/src/main.utils.ts","../../../core/src/main.ts","../../../core/src/impressionTracking/impressionTracking.ts","../../../core/src/slot/createSlot/createSlot.utils.ts","../../../core/src/slot/createSlot/createSlot.ts","../../../core/src/requestAds/requestAds.schema.ts","../../../core/src/requestAds/requestAds.preview.ts","../../../core/src/requestAds/requestAds.utils.ts","../../../core/src/requestAds/requestAds.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","import { type AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@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 (await Promise.all(Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter(element => Boolean(element.dataset.format))\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.getName() === slot.getName()));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Promise<Readonly<AdheseSlot>>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport async function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Promise<Readonly<SlotManager>> {\n const slots = new Map<string, AdheseSlot>();\n\n await Promise.allSettled(initialSlots.map(async slot => add({\n ...slot,\n lazyLoading: false,\n })));\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n async function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Promise<Readonly<AdheseSlot>> {\n const slot = await createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n onNameChange,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.getName());\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n slots.set(slot.getName(), slot);\n\n function onNameChange(newName: string, previousName: string): void {\n slots.set(newName, slot);\n slots.delete(previousName);\n\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots) {\n slots.set(slot.getName(), slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { debounce } from 'lodash-es';\nimport { logger } from '@core';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, 50);\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","import { createEventManager } from '@utils';\nimport { uniqueId } from 'lodash-es';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import { random } from 'lodash-es';\nimport { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): MapWithEvents<string, string | ReadonlyArray<string>> {\n const parameters = new MapWithEvents<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: random(10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n\nexport class MapWithEvents<T, U> extends Map<T, U> {\n private readonly listeners = new Set<() => void>();\n\n public addEventListener(listener: () => void): void {\n this.listeners.add(listener);\n }\n\n public removeEventListener(listener: () => void): void {\n this.listeners.delete(listener);\n }\n\n public set(key: T, value: U): this {\n const set = super.set(key, value);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return set;\n }\n\n public clear(): void {\n super.clear();\n\n this.listeners.forEach((listener) => {\n listener();\n });\n }\n\n public delete(key: T): boolean {\n const deleted = super.delete(key);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return deleted;\n }\n\n /**\n * Remove all listeners and clear the map.\n */\n public dispose(): void {\n this.listeners.clear();\n super.clear();\n }\n}\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\nimport { createDevtools } from '@adhese/sdk-devtools';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport async function createAdhese(options: AdheseOptions): Promise<Readonly<Adhese>> {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = new Proxy<AdheseContext>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }, {});\n\n context.events = createEventManager();\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n context.parameters.addEventListener(onParametersChange);\n\n let unmountDevtools: (() => void) | undefined;\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode()) {\n unmountDevtools = await createDevtools(context);\n context.events?.debugChange.dispatch(true);\n }\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = await createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll();\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n async function addSlot(slotOptions: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const slot = await slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n const ad = await requestAd({\n slot,\n host: mergedOptions.host,\n parameters: context.parameters,\n account: mergedOptions.account,\n context,\n });\n\n await slot.setAd(ad);\n }\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots()).filter(slot => !slot.lazyLoading);\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots: domSlots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug && !unmountDevtools) {\n // eslint-disable-next-line require-atomic-updates\n unmountDevtools = await createDevtools(context);\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n unmountDevtools?.();\n unmountDevtools = undefined;\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = slotManager.getAll().filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n if (slotManager.getAll().length > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.dispose();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n unmountDevtools?.();\n logger.info('Adhese instance disposed');\n }\n\n if (mergedOptions.findDomSlotsOnLoad)\n await slotManager.findDomSlots();\n\n return {\n ...mergedOptions,\n ...slotManager,\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n context,\n };\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import type { Ad } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\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 ${ad.tag}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : '100%';\n iframe.style.height = ad.height ? `${ad.height}px` : '100%';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.style.width = ad.width ? `${ad.width}px` : '100%';\n element.style.height = ad.height ? `${ad.height}px` : '100%';\n\n element.innerHTML = ad.tag;\n}\n","import { type Ad, logger, requestAd } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { round } from 'lodash-es';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { renderIframe, renderInline } from './createSlot.utils';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport async function createSlot(options: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n await waitForDomLoad();\n\n const parameters = new Map(Object.entries(options.parameters ?? {}));\n\n let format: string;\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format === 'string') {\n // eslint-disable-next-line prefer-destructuring\n format = options.format;\n }\n else {\n queryDetector = createQueryDetector({\n onChange: setFormat,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n\n format = queryDetector.getQuery();\n }\n\n async function setFormat(newFormat: string): Promise<void> {\n const oldName = getName();\n\n format = newFormat;\n options.onNameChange?.(getName(), oldName);\n\n const newAd = await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n method: context.options.requestType,\n context,\n });\n\n cleanElement();\n\n await setAd(newAd);\n }\n\n function getFormat(): string {\n return format;\n }\n\n let element: HTMLElement | null = typeof containingElement === 'string' || !containingElement\n ? document.querySelector<HTMLElement>(`.adunit[data-format=\"${format}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`)\n : containingElement;\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element?.querySelector('iframe') ?? null;\n\n return element?.innerHTML ? (element.firstElementChild as HTMLElement) : null;\n }\n\n let impressionTrackingPixelElement: HTMLImageElement | null = null;\n let viewabilityTrackingPixelElement: HTMLImageElement | null = null;\n\n let isInViewport = false;\n\n let ad: Ad | null = null;\n function getAd(): Ad | null {\n return ad;\n }\n\n async function setAd(newAd: Ad): Promise<void> {\n ad = newAd;\n\n if (isInViewport || context.options.eagerRendering)\n await render(ad);\n\n if (element) {\n element.style.width = `${ad.width}px`;\n element.style.height = `${ad.height}px`;\n }\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n }\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport) {\n (async (): Promise<void> => {\n if (!ad && options.lazyLoading)\n await render();\n\n else if (ad)\n await render(ad);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !viewabilityTrackingPixelElement && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad?.viewableImpressionCounter) {\n viewabilityTrackingPixelElement = addTrackingPixel(ad.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${getName()}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n if (element && context.options.viewabilityTracking)\n viewabilityObserver.observe(element);\n\n if (element)\n renderIntersectionObserver.observe(element);\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n\n // eslint-disable-next-line require-atomic-updates\n ad = adToRender ?? ad ?? await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n method: context.options.requestType,\n context,\n });\n\n if (!element) {\n const error = `Could not create slot for format ${format}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.style.position = 'relative';\n\n renderFunctions[renderMode](ad, element);\n\n if (ad?.impressionCounter && !impressionTrackingPixelElement) {\n impressionTrackingPixelElement = addTrackingPixel(ad.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${getName()}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n renderIntersectionObserver.disconnect();\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n\n return element;\n }\n\n function cleanElement(): void {\n if (!element)\n return;\n\n element.innerHTML = '';\n element.style.position = '';\n element.style.width = '';\n element.style.height = '';\n }\n\n function getName(): string {\n return `${context.location}${slot ? `${slot}` : ''}-${format}`;\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement?.remove();\n viewabilityTrackingPixelElement?.remove();\n\n element = null;\n ad = null;\n\n renderIntersectionObserver.disconnect();\n viewabilityObserver.disconnect();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n }\n\n function isViewabilityTracked(): boolean {\n return Boolean(viewabilityTrackingPixelElement);\n }\n\n function isImpressionTracked(): boolean {\n return Boolean(impressionTrackingPixelElement);\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n setFormat,\n getFormat,\n render,\n getElement,\n getName,\n getAd,\n setAd,\n isViewabilityTracked,\n isImpressionTracked,\n dispose,\n };\n}\n","import {\n type TypeOf,\n type ZodType,\n coerce,\n lazy,\n literal,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\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: string().optional(),\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().optional(),\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 share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: string().optional(),\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: numberLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: string(),\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: string(),\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad = Omit<PreParsedAd, 'tag'> & {\n tag: string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { type Ad, logger } from '@core';\nimport { adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { type AdRequestOptions, logger } from '@core';\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 host,\n ...options\n}: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: slot.getName(),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: options.parameters && parseParameters(options.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet(options: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n return fetch(new URL(`${options.host}/json/sl${options.slots.map(slot => slot.getName()).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 }));\n}\n","import type { UrlString } from '@utils';\nimport { type Adhese, type AdheseSlot, logger } from '@core';\nimport { type Ad, parseResponse } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<Pick<AdheseSlot, 'getName' | 'parameters'>>;\n /**\n * Host that you want to fetch the ads from\n */\n host: UrlString;\n /**\n * The Adhese account name.\n */\n account: string;\n /**\n * Request method to use for the requestAds\n *\n * @default 'POST'\n */\n method?: 'GET' | 'POST' | 'get' | 'post';\n /**\n * The parameters that are used for all ads.\n */\n parameters?: Map<string, ReadonlyArray<string> | string>;\n context: Partial<Adhese>;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds({\n method = 'POST',\n context,\n ...options\n}: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n method,\n });\n\n const [response, previews] = await Promise.all([method?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult: ReadonlyArray<Ad> = [\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ];\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: Pick<AdheseSlot, 'getName' | 'parameters'>;\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["_a","_b","findDomSlots","extFindDomSlots"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -86,13 +86,8 @@ type SlotManagerOptions = {
|
|
|
86
86
|
context: AdheseContext;
|
|
87
87
|
};
|
|
88
88
|
|
|
89
|
-
declare const
|
|
89
|
+
declare const baseSchema: zod.ZodObject<{
|
|
90
90
|
adDuration: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
91
|
-
adDuration2nd: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
92
|
-
adDuration3rd: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
93
|
-
adDuration4th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
94
|
-
adDuration5th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
95
|
-
adDuration6th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
96
91
|
adFormat: zod.ZodOptional<zod.ZodString>;
|
|
97
92
|
adType: zod.ZodString;
|
|
98
93
|
additionalCreativeTracker: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
|
|
@@ -110,7 +105,6 @@ declare const baseAdResponseScheme: zod.ZodObject<{
|
|
|
110
105
|
creativeName: zod.ZodOptional<zod.ZodString>;
|
|
111
106
|
deliveryGroupId: zod.ZodOptional<zod.ZodString>;
|
|
112
107
|
deliveryMultiples: zod.ZodOptional<zod.ZodString>;
|
|
113
|
-
dm: zod.ZodOptional<zod.ZodString>;
|
|
114
108
|
ext: zod.ZodOptional<zod.ZodString>;
|
|
115
109
|
extension: zod.ZodOptional<zod.ZodObject<{
|
|
116
110
|
mediaType: zod.ZodString;
|
|
@@ -122,22 +116,16 @@ declare const baseAdResponseScheme: zod.ZodObject<{
|
|
|
122
116
|
mediaType: string;
|
|
123
117
|
prebid?: unknown;
|
|
124
118
|
}>>;
|
|
125
|
-
extraField1: zod.ZodOptional<zod.ZodString>;
|
|
126
|
-
extraField2: zod.ZodOptional<zod.ZodString>;
|
|
127
119
|
height: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
128
|
-
height3rd: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
129
|
-
height4th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
130
|
-
height5th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
131
|
-
height6th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
132
|
-
heightLarge: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
133
120
|
id: zod.ZodOptional<zod.ZodString>;
|
|
134
121
|
impressionCounter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
|
|
135
122
|
libId: zod.ZodOptional<zod.ZodString>;
|
|
136
123
|
orderId: zod.ZodOptional<zod.ZodString>;
|
|
137
124
|
orderName: zod.ZodOptional<zod.ZodString>;
|
|
138
125
|
orderProperty: zod.ZodOptional<zod.ZodString>;
|
|
139
|
-
origin: zod.
|
|
126
|
+
origin: zod.ZodUnion<[zod.ZodLiteral<"JERLICIA">, zod.ZodLiteral<"DALE">]>;
|
|
140
127
|
originData: zod.ZodOptional<zod.ZodUnknown>;
|
|
128
|
+
originInstance: zod.ZodOptional<zod.ZodString>;
|
|
141
129
|
poolPath: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
|
|
142
130
|
preview: zod.ZodOptional<zod.ZodUnion<[zod.ZodBoolean, zod.ZodLiteral<"">]>>;
|
|
143
131
|
priority: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
@@ -145,12 +133,7 @@ declare const baseAdResponseScheme: zod.ZodObject<{
|
|
|
145
133
|
slotID: zod.ZodString;
|
|
146
134
|
slotName: zod.ZodString;
|
|
147
135
|
swfSrc: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
|
|
148
|
-
|
|
149
|
-
swfSrc3rd: zod.ZodOptional<zod.ZodString>;
|
|
150
|
-
swfSrc4th: zod.ZodOptional<zod.ZodString>;
|
|
151
|
-
swfSrc5th: zod.ZodOptional<zod.ZodString>;
|
|
152
|
-
swfSrc6th: zod.ZodOptional<zod.ZodString>;
|
|
153
|
-
tag: zod.ZodString;
|
|
136
|
+
tag: zod.ZodOptional<zod.ZodString>;
|
|
154
137
|
tagUrl: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
|
|
155
138
|
timeStamp: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, Date | undefined, string>>;
|
|
156
139
|
trackedImpressionCounter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
|
|
@@ -159,22 +142,13 @@ declare const baseAdResponseScheme: zod.ZodObject<{
|
|
|
159
142
|
url: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
|
|
160
143
|
viewableImpressionCounter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
|
|
161
144
|
width: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
162
|
-
width3rd: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
163
|
-
width4th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
164
|
-
width5th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
165
|
-
width6th: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
166
145
|
widthLarge: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, number | undefined, string>>;
|
|
167
146
|
}, "strip", zod.ZodTypeAny, {
|
|
147
|
+
origin: "JERLICIA" | "DALE";
|
|
168
148
|
adType: string;
|
|
169
149
|
slotID: string;
|
|
170
150
|
slotName: string;
|
|
171
|
-
tag: string;
|
|
172
151
|
adDuration?: number | undefined;
|
|
173
|
-
adDuration2nd?: number | undefined;
|
|
174
|
-
adDuration3rd?: number | undefined;
|
|
175
|
-
adDuration4th?: number | undefined;
|
|
176
|
-
adDuration5th?: number | undefined;
|
|
177
|
-
adDuration6th?: number | undefined;
|
|
178
152
|
adFormat?: string | undefined;
|
|
179
153
|
additionalCreativeTracker?: URL | undefined;
|
|
180
154
|
additionalViewableTracker?: string | undefined;
|
|
@@ -191,38 +165,26 @@ declare const baseAdResponseScheme: zod.ZodObject<{
|
|
|
191
165
|
creativeName?: string | undefined;
|
|
192
166
|
deliveryGroupId?: string | undefined;
|
|
193
167
|
deliveryMultiples?: string | undefined;
|
|
194
|
-
dm?: string | undefined;
|
|
195
168
|
ext?: string | undefined;
|
|
196
169
|
extension?: {
|
|
197
170
|
mediaType: string;
|
|
198
171
|
prebid?: unknown;
|
|
199
172
|
} | undefined;
|
|
200
|
-
extraField1?: string | undefined;
|
|
201
|
-
extraField2?: string | undefined;
|
|
202
173
|
height?: number | undefined;
|
|
203
|
-
height3rd?: number | undefined;
|
|
204
|
-
height4th?: number | undefined;
|
|
205
|
-
height5th?: number | undefined;
|
|
206
|
-
height6th?: number | undefined;
|
|
207
|
-
heightLarge?: number | undefined;
|
|
208
174
|
id?: string | undefined;
|
|
209
175
|
impressionCounter?: URL | undefined;
|
|
210
176
|
libId?: string | undefined;
|
|
211
177
|
orderId?: string | undefined;
|
|
212
178
|
orderName?: string | undefined;
|
|
213
179
|
orderProperty?: string | undefined;
|
|
214
|
-
origin?: string | undefined;
|
|
215
180
|
originData?: unknown;
|
|
181
|
+
originInstance?: string | undefined;
|
|
216
182
|
poolPath?: URL | undefined;
|
|
217
183
|
preview?: boolean | "" | undefined;
|
|
218
184
|
priority?: number | undefined;
|
|
219
185
|
share?: string | undefined;
|
|
220
186
|
swfSrc?: URL | undefined;
|
|
221
|
-
|
|
222
|
-
swfSrc3rd?: string | undefined;
|
|
223
|
-
swfSrc4th?: string | undefined;
|
|
224
|
-
swfSrc5th?: string | undefined;
|
|
225
|
-
swfSrc6th?: string | undefined;
|
|
187
|
+
tag?: string | undefined;
|
|
226
188
|
tagUrl?: URL | undefined;
|
|
227
189
|
timeStamp?: Date | undefined;
|
|
228
190
|
trackedImpressionCounter?: URL | undefined;
|
|
@@ -231,22 +193,13 @@ declare const baseAdResponseScheme: zod.ZodObject<{
|
|
|
231
193
|
url?: URL | undefined;
|
|
232
194
|
viewableImpressionCounter?: URL | undefined;
|
|
233
195
|
width?: number | undefined;
|
|
234
|
-
width3rd?: number | undefined;
|
|
235
|
-
width4th?: number | undefined;
|
|
236
|
-
width5th?: number | undefined;
|
|
237
|
-
width6th?: number | undefined;
|
|
238
196
|
widthLarge?: number | undefined;
|
|
239
197
|
}, {
|
|
198
|
+
origin: "JERLICIA" | "DALE";
|
|
240
199
|
adType: string;
|
|
241
200
|
slotID: string;
|
|
242
201
|
slotName: string;
|
|
243
|
-
tag: string;
|
|
244
202
|
adDuration?: string | undefined;
|
|
245
|
-
adDuration2nd?: string | undefined;
|
|
246
|
-
adDuration3rd?: string | undefined;
|
|
247
|
-
adDuration4th?: string | undefined;
|
|
248
|
-
adDuration5th?: string | undefined;
|
|
249
|
-
adDuration6th?: string | undefined;
|
|
250
203
|
adFormat?: string | undefined;
|
|
251
204
|
additionalCreativeTracker?: string | undefined;
|
|
252
205
|
additionalViewableTracker?: string | undefined;
|
|
@@ -263,38 +216,26 @@ declare const baseAdResponseScheme: zod.ZodObject<{
|
|
|
263
216
|
creativeName?: string | undefined;
|
|
264
217
|
deliveryGroupId?: string | undefined;
|
|
265
218
|
deliveryMultiples?: string | undefined;
|
|
266
|
-
dm?: string | undefined;
|
|
267
219
|
ext?: string | undefined;
|
|
268
220
|
extension?: {
|
|
269
221
|
mediaType: string;
|
|
270
222
|
prebid?: unknown;
|
|
271
223
|
} | undefined;
|
|
272
|
-
extraField1?: string | undefined;
|
|
273
|
-
extraField2?: string | undefined;
|
|
274
224
|
height?: string | undefined;
|
|
275
|
-
height3rd?: string | undefined;
|
|
276
|
-
height4th?: string | undefined;
|
|
277
|
-
height5th?: string | undefined;
|
|
278
|
-
height6th?: string | undefined;
|
|
279
|
-
heightLarge?: string | undefined;
|
|
280
225
|
id?: string | undefined;
|
|
281
226
|
impressionCounter?: string | undefined;
|
|
282
227
|
libId?: string | undefined;
|
|
283
228
|
orderId?: string | undefined;
|
|
284
229
|
orderName?: string | undefined;
|
|
285
230
|
orderProperty?: string | undefined;
|
|
286
|
-
origin?: string | undefined;
|
|
287
231
|
originData?: unknown;
|
|
232
|
+
originInstance?: string | undefined;
|
|
288
233
|
poolPath?: string | undefined;
|
|
289
234
|
preview?: boolean | "" | undefined;
|
|
290
235
|
priority?: string | undefined;
|
|
291
236
|
share?: string | undefined;
|
|
292
237
|
swfSrc?: string | undefined;
|
|
293
|
-
|
|
294
|
-
swfSrc3rd?: string | undefined;
|
|
295
|
-
swfSrc4th?: string | undefined;
|
|
296
|
-
swfSrc5th?: string | undefined;
|
|
297
|
-
swfSrc6th?: string | undefined;
|
|
238
|
+
tag?: string | undefined;
|
|
298
239
|
tagUrl?: string | undefined;
|
|
299
240
|
timeStamp?: string | undefined;
|
|
300
241
|
trackedImpressionCounter?: string | undefined;
|
|
@@ -303,18 +244,17 @@ declare const baseAdResponseScheme: zod.ZodObject<{
|
|
|
303
244
|
url?: string | undefined;
|
|
304
245
|
viewableImpressionCounter?: string | undefined;
|
|
305
246
|
width?: string | undefined;
|
|
306
|
-
width3rd?: string | undefined;
|
|
307
|
-
width4th?: string | undefined;
|
|
308
|
-
width5th?: string | undefined;
|
|
309
|
-
width6th?: string | undefined;
|
|
310
247
|
widthLarge?: string | undefined;
|
|
311
248
|
}>;
|
|
312
|
-
type AdResponse = TypeOf<typeof
|
|
249
|
+
type AdResponse = (TypeOf<typeof baseSchema> & {
|
|
313
250
|
additionalCreatives?: ReadonlyArray<AdResponse> | string;
|
|
314
|
-
};
|
|
251
|
+
});
|
|
315
252
|
declare const adResponseSchema: ZodType<AdResponse>;
|
|
316
|
-
type
|
|
317
|
-
additionalCreatives?: ReadonlyArray<
|
|
253
|
+
type PreParsedAd = TypeOf<typeof adResponseSchema> & {
|
|
254
|
+
additionalCreatives?: ReadonlyArray<PreParsedAd> | string;
|
|
255
|
+
};
|
|
256
|
+
type Ad = Omit<PreParsedAd, 'tag'> & {
|
|
257
|
+
tag: string;
|
|
318
258
|
};
|
|
319
259
|
|
|
320
260
|
type RenderMode = 'iframe' | 'inline';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adhese/sdk",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.0",
|
|
5
5
|
"description": "Adhese SDK",
|
|
6
6
|
"license": "GPL-3.0",
|
|
7
7
|
"repository": {
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"lint:fix": "eslint --fix .",
|
|
23
23
|
"clean": "rm -rf dist",
|
|
24
24
|
"typecheck": "tsc --noEmit",
|
|
25
|
-
"
|
|
25
|
+
"prepareRelease": "npm run build"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@adhese/sdk-devtools": "^0.
|
|
28
|
+
"@adhese/sdk-devtools": "^0.4.0",
|
|
29
29
|
"lodash-es": "^4.17.21",
|
|
30
30
|
"zod": "^3.22.4"
|
|
31
31
|
}
|