@adhese/sdk 1.8.1 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @adhese/sdk
2
2
 
3
+ ## 1.8.2
4
+
5
+ ### Patch Changes
6
+
7
+ - cf3f4ec: Make renderMode configurable per slot from within the onBeforeRender hook
8
+
3
9
  ## 1.8.1
4
10
 
5
11
  ### Patch Changes
@@ -47,6 +47,7 @@ declare const baseSchema: zod.ZodObject<{
47
47
  poolPath: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
48
48
  preview: zod.ZodOptional<zod.ZodUnion<[zod.ZodBoolean, zod.ZodLiteral<"">]>>;
49
49
  priority: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">, zod.ZodNumber]>, number | undefined, string | number>>;
50
+ renderMode: zod.ZodOptional<zod.ZodUnion<[zod.ZodLiteral<"inline">, zod.ZodLiteral<"iframe">]>>;
50
51
  sfSrc: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodLiteral<"">]>, URL | undefined, string>>;
51
52
  share: zod.ZodOptional<zod.ZodString>;
52
53
  slotID: zod.ZodString;
@@ -102,6 +103,7 @@ declare const baseSchema: zod.ZodObject<{
102
103
  poolPath?: URL | undefined;
103
104
  preview?: boolean | "" | undefined;
104
105
  priority?: number | undefined;
106
+ renderMode?: "iframe" | "inline" | undefined;
105
107
  sfSrc?: URL | undefined;
106
108
  share?: string | undefined;
107
109
  swfSrc?: URL | undefined;
@@ -155,6 +157,7 @@ declare const baseSchema: zod.ZodObject<{
155
157
  poolPath?: string | undefined;
156
158
  preview?: boolean | "" | undefined;
157
159
  priority?: string | number | undefined;
160
+ renderMode?: "iframe" | "inline" | undefined;
158
161
  sfSrc?: string | undefined;
159
162
  share?: string | undefined;
160
163
  swfSrc?: string | undefined;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const name = "@adhese/sdk";
4
- const version = "1.8.1";
4
+ const version = "1.8.2";
5
5
  exports.name = name;
6
6
  exports.version = version;
7
7
  //# sourceMappingURL=package.json.cjs.map
@@ -39,6 +39,7 @@ const baseSchema = validators.object({
39
39
  poolPath: validators.urlLike.optional(),
40
40
  preview: validators.booleanLike.optional(),
41
41
  priority: validators.numberLike.optional(),
42
+ renderMode: validators.union([validators.literal("inline"), validators.literal("iframe")]).optional(),
42
43
  sfSrc: validators.urlLike.optional(),
43
44
  share: validators.string().optional(),
44
45
  // eslint-disable-next-line ts/naming-convention
@@ -1 +1 @@
1
- {"version":3,"file":"requestAds.schema.cjs","sources":["../../../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import {\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n lazy,\n literal,\n numberLike,\n object,\n string,\n type TypeOf,\n union,\n unknown,\n urlLike,\n type ZodType,\n} from '@adhese/sdk-shared/validators';\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n additionalTracker: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type AdheseAd<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<AdheseAd> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<AdheseAd>;\n}\n"],"names":["object","numberLike","string","urlLike","dateLike","booleanLike","isJsonOrHtmlOptionalString","unknown","union","literal","cssValueLike","isJsonOrHtmlString","lazy"],"mappings":"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"}
1
+ {"version":3,"file":"requestAds.schema.cjs","sources":["../../../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import {\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n lazy,\n literal,\n numberLike,\n object,\n string,\n type TypeOf,\n union,\n unknown,\n urlLike,\n type ZodType,\n} from '@adhese/sdk-shared/validators';\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n additionalTracker: 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 renderMode: union([literal('inline'), literal('iframe')]).optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type AdheseAd<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<AdheseAd> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<AdheseAd>;\n}\n"],"names":["object","numberLike","string","urlLike","dateLike","booleanLike","isJsonOrHtmlOptionalString","unknown","union","literal","cssValueLike","isJsonOrHtmlString","lazy"],"mappings":"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"}
@@ -20,7 +20,9 @@ function createSlot(slotOptions) {
20
20
  const slotContext = sdkShared.ref(null);
21
21
  const options = slotOptions.context.hooks.runOnSlotCreate({
22
22
  ...defaultOptions,
23
- ...Object.fromEntries(Object.entries(slotOptions).filter(([, value]) => value !== void 0))
23
+ ...Object.fromEntries(
24
+ Object.entries(slotOptions).filter(([, value]) => value !== void 0)
25
+ )
24
26
  });
25
27
  const {
26
28
  containingElement,
@@ -28,9 +30,9 @@ function createSlot(slotOptions) {
28
30
  context,
29
31
  pluginOptions,
30
32
  initialData = null,
31
- renderMode = "iframe",
32
33
  type = "normal"
33
34
  } = options;
35
+ let { renderMode = "iframe" } = options;
34
36
  const id = sdkShared.uniqueId();
35
37
  const {
36
38
  runOnBeforeRender,
@@ -44,14 +46,25 @@ function createSlot(slotOptions) {
44
46
  ...hooks
45
47
  } = slot_composables.useSlotHooks(options, slotContext);
46
48
  const isDisposed = sdkShared.ref(false);
47
- const parameters = sdkShared.reactive(new Map(Object.entries(options.parameters ?? {})));
48
- const [device, disposeQueryDetector] = queryDetector.useQueryDetector(context, typeof options.format === "string" ? {
49
- [options.format]: "(min-width: 0px)"
50
- } : Object.fromEntries(options.format.map((item) => [item.format, item.query])));
51
- const format = sdkShared.computed(() => typeof options.format === "string" ? options.format : device.value);
49
+ const parameters = sdkShared.reactive(
50
+ new Map(Object.entries(options.parameters ?? {}))
51
+ );
52
+ const [device, disposeQueryDetector] = queryDetector.useQueryDetector(
53
+ context,
54
+ typeof options.format === "string" ? {
55
+ [options.format]: "(min-width: 0px)"
56
+ } : Object.fromEntries(
57
+ options.format.map((item) => [item.format, item.query])
58
+ )
59
+ );
60
+ const format = sdkShared.computed(
61
+ () => typeof options.format === "string" ? options.format : device.value
62
+ );
52
63
  const data = sdkShared.ref(null);
53
64
  const originalData = sdkShared.ref(data.value);
54
- const name = sdkShared.computed(() => sdkShared.generateName(options.context.location, format.value, options.slot));
65
+ const name = sdkShared.computed(
66
+ () => sdkShared.generateName(options.context.location, format.value, options.slot)
67
+ );
55
68
  const status = sdkShared.ref("initializing");
56
69
  sdkShared.watch(name, async (newName, oldName) => {
57
70
  var _a, _b;
@@ -67,11 +80,14 @@ function createSlot(slotOptions) {
67
80
  const isDomLoaded = slot_composables.useDomLoaded(context);
68
81
  const element = sdkShared.shallowRef(null);
69
82
  function getElement() {
70
- if (!(typeof options.containingElement === "string" || !options.containingElement))
83
+ if (!(typeof options.containingElement === "string" || !options.containingElement)) {
71
84
  return options.containingElement;
85
+ }
72
86
  if (!isDomLoaded.value)
73
87
  return null;
74
- return document.querySelector(`#${options.containingElement}`);
88
+ return document.querySelector(
89
+ `#${options.containingElement}`
90
+ );
75
91
  }
76
92
  sdkShared.watch(element, async (newElement, oldElement) => {
77
93
  if (status.value === "empty" || status.value === "error" || status.value === "loading") {
@@ -81,8 +97,9 @@ function createSlot(slotOptions) {
81
97
  status.value = "loaded";
82
98
  return;
83
99
  }
84
- if (newElement === oldElement || oldElement === null && newElement === null)
100
+ if (newElement === oldElement || oldElement === null && newElement === null) {
85
101
  return;
102
+ }
86
103
  await render();
87
104
  });
88
105
  const domObserver = new MutationObserver(() => {
@@ -104,11 +121,15 @@ function createSlot(slotOptions) {
104
121
  element,
105
122
  hooks
106
123
  });
107
- sdkShared.watch(isInViewport, async (newIsInViewport) => {
108
- var _a;
109
- if (newIsInViewport && status.value !== "rendered")
110
- await ((_a = slotContext.value) == null ? void 0 : _a.render());
111
- }, { immediate: true });
124
+ sdkShared.watch(
125
+ isInViewport,
126
+ async (newIsInViewport) => {
127
+ var _a;
128
+ if (newIsInViewport && status.value !== "rendered")
129
+ await ((_a = slotContext.value) == null ? void 0 : _a.render());
130
+ },
131
+ { immediate: true }
132
+ );
112
133
  hooks.onDispose(() => {
113
134
  disposeQueryDetector();
114
135
  });
@@ -148,18 +169,26 @@ function createSlot(slotOptions) {
148
169
  const additionalTrackingPixelElement = sdkShared.ref(null);
149
170
  const isImpressionTracked = sdkShared.ref(false);
150
171
  const isAdditionalTracked = sdkShared.ref(false);
151
- sdkShared.watch([status, isInViewport, data], ([newStatus, newIsInViewport, newData]) => {
152
- if (newStatus === "rendered" && newIsInViewport) {
153
- if ((newData == null ? void 0 : newData.impressionCounter) && !impressionTrackingPixelElement.value) {
154
- impressionTrackingPixelElement.value = sdkShared.addTrackingPixel(newData.impressionCounter);
155
- isImpressionTracked.value = true;
156
- }
157
- if ((newData == null ? void 0 : newData.additionalTracker) && !additionalTrackingPixelElement.value) {
158
- additionalTrackingPixelElement.value = sdkShared.addTrackingPixel(newData.additionalTracker);
159
- isAdditionalTracked.value = true;
172
+ sdkShared.watch(
173
+ [status, isInViewport, data],
174
+ ([newStatus, newIsInViewport, newData]) => {
175
+ if (newStatus === "rendered" && newIsInViewport) {
176
+ if ((newData == null ? void 0 : newData.impressionCounter) && !impressionTrackingPixelElement.value) {
177
+ impressionTrackingPixelElement.value = sdkShared.addTrackingPixel(
178
+ newData.impressionCounter
179
+ );
180
+ isImpressionTracked.value = true;
181
+ }
182
+ if ((newData == null ? void 0 : newData.additionalTracker) && !additionalTrackingPixelElement.value) {
183
+ additionalTrackingPixelElement.value = sdkShared.addTrackingPixel(
184
+ newData.additionalTracker
185
+ );
186
+ isAdditionalTracked.value = true;
187
+ }
160
188
  }
161
- }
162
- }, { immediate: true });
189
+ },
190
+ { immediate: true }
191
+ );
163
192
  sdkShared.watch(status, async (newStatus, oldStatus) => {
164
193
  var _a, _b;
165
194
  if (newStatus === "loaded" && oldStatus === "rendered") {
@@ -204,7 +233,11 @@ function createSlot(slotOptions) {
204
233
  } catch (error) {
205
234
  status.value = "error";
206
235
  logger.logger.error(`Error requesting ad for slot ${name.value}`, error);
207
- runOnError(new Error(`Error requesting ad for slot ${name.value}`, { cause: error }));
236
+ runOnError(
237
+ new Error(`Error requesting ad for slot ${name.value}`, {
238
+ cause: error
239
+ })
240
+ );
208
241
  return null;
209
242
  }
210
243
  }
@@ -220,8 +253,12 @@ function createSlot(slotOptions) {
220
253
  element.value = getElement();
221
254
  let renderAd = adToRender ?? data.value ?? originalData.value ?? await request();
222
255
  renderAd = renderAd && await runOnBeforeRender(renderAd);
256
+ renderMode = (renderAd == null ? void 0 : renderAd.renderMode) ?? renderMode;
223
257
  if (!element.value && renderMode !== "none") {
224
- logger.logger.debug(`Could not render slot for format ${format.value}. No element found.`, slotContext.value);
258
+ logger.logger.debug(
259
+ `Could not render slot for format ${format.value}. No element found.`,
260
+ slotContext.value
261
+ );
225
262
  return null;
226
263
  }
227
264
  if (!renderAd) {
@@ -233,10 +270,13 @@ function createSlot(slotOptions) {
233
270
  throw new Error(error);
234
271
  }
235
272
  if (renderMode !== "none" && element.value) {
236
- renderFunctions[renderMode]({
237
- ...renderAd,
238
- ...sdkShared.pick(options, ["width", "height"])
239
- }, element.value);
273
+ renderFunctions[renderMode](
274
+ {
275
+ ...renderAd,
276
+ ...sdkShared.pick(options, ["width", "height"])
277
+ },
278
+ element.value
279
+ );
240
280
  }
241
281
  logger.logger.debug(`Slot rendered ${name.value}`, {
242
282
  renderedElement: element,
@@ -300,12 +340,16 @@ function createSlot(slotOptions) {
300
340
  options: sdkShared.omit(options, ["context"]),
301
341
  ...hooks
302
342
  });
303
- sdkShared.watch(state, (newState) => {
304
- slotContext.value = newState;
305
- }, {
306
- deep: true,
307
- immediate: true
308
- });
343
+ sdkShared.watch(
344
+ state,
345
+ (newState) => {
346
+ slotContext.value = newState;
347
+ },
348
+ {
349
+ deep: true,
350
+ immediate: true
351
+ }
352
+ );
309
353
  context.hooks.onInit(async () => {
310
354
  var _a;
311
355
  await runOnInit();
@@ -1 +1 @@
1
- {"version":3,"file":"slot.cjs","sources":["../../../src/slot/slot.ts"],"sourcesContent":["import type { AdheseAd } from '@adhese/sdk';\nimport type { AdheseSlot, AdheseSlotContext, AdheseSlotOptions, RenderMode } from './slot.types';\nimport {\n addTrackingPixel,\n computed,\n doNothing,\n effectScope,\n generateName,\n omit,\n pick,\n reactive,\n type Ref,\n ref,\n renderIframe,\n renderInline,\n type RenderOptions,\n shallowRef,\n uniqueId,\n type UnwrapRef,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport {\n useDomLoaded,\n useRenderIntersectionObserver,\n useSlotHooks,\n useViewabilityObserver,\n} from './slot.composables';\n\nconst renderFunctions: Record<RenderMode, (ad: RenderOptions, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n none: doNothing,\n};\n\nconst defaultOptions = {\n renderMode: 'iframe',\n type: 'normal',\n} satisfies Partial<AdheseSlotOptions>;\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...(Object.fromEntries(Object.entries(slotOptions).filter(([, value]) => value !== undefined)) as AdheseSlotOptions),\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\n initialData = null,\n renderMode = 'iframe',\n type = 'normal',\n } = options;\n\n const id = uniqueId();\n const {\n runOnBeforeRender,\n runOnRender,\n runOnBeforeRequest,\n runOnRequest,\n runOnInit,\n runOnDispose,\n runOnEmpty,\n runOnError,\n ...hooks\n } = useSlotHooks(options, slotContext);\n\n const isDisposed = ref(false);\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n\n const [device, disposeQueryDetector] = useQueryDetector(context, typeof options.format === 'string'\n ? {\n [options.format]: '(min-width: 0px)',\n }\n : Object.fromEntries(options.format.map(item => [item.format, item.query])));\n\n const format = computed(() => typeof options.format === 'string' ? options.format : device.value);\n\n const data = ref<AdheseAd | null>(null) as Ref<AdheseAd | null>;\n const originalData = ref(data.value) as Ref<AdheseAd | null>;\n const name = computed(() => generateName(options.context.location, format.value, options.slot));\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n const newAd = await slotContext.value?.request();\n\n if (!newAd)\n return;\n\n slotContext.value?.cleanElement();\n\n data.value = newAd;\n originalData.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded(context);\n\n const element = shallowRef<HTMLElement | null>(null);\n\n function getElement(): HTMLElement | null {\n if (!(typeof options.containingElement === 'string' || !options.containingElement))\n return options.containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`#${options.containingElement}`);\n }\n\n watch(element, async (newElement, oldElement) => {\n if (status.value === 'empty' || status.value === 'error' || status.value === 'loading') {\n return;\n }\n\n if (newElement === null && data.value) {\n status.value = 'loaded';\n\n return;\n }\n\n if (newElement === oldElement || (oldElement === null && newElement === null))\n return;\n\n await render();\n });\n\n const domObserver = new MutationObserver(() => {\n element.value = getElement();\n });\n\n domObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n watch(\n isDomLoaded,\n () => {\n element.value = getElement();\n },\n { immediate: true, deep: true },\n );\n\n const isInViewport = useRenderIntersectionObserver({\n options,\n element,\n hooks,\n });\n\n watch(isInViewport, async (newIsInViewport) => {\n if (newIsInViewport && status.value !== 'rendered')\n await slotContext.value?.render();\n }, { immediate: true });\n\n hooks.onDispose(() => {\n disposeQueryDetector();\n });\n\n const isViewabilityTracked = useViewabilityObserver({\n context,\n slotContext,\n hooks,\n onTracked(trackingPixel) {\n let viewabilityPixel;\n if (slotContext.value?.data?.origin === undefined) {\n context.logger.warn(\n `Origin not found for ${slotContext.value?.name}`,\n );\n return;\n }\n switch (slotContext.value?.data?.origin) {\n case 'DALE': {\n // @ts-expect-error - Data structure is not typed and very messy to type\n const seatbid = slotContext.value?.data?.originData?.seatbid;\n const bid = seatbid ? seatbid[0]?.bid[0] : undefined;\n viewabilityPixel = bid\n ? bid.ext?.adhese?.viewableImpressionCounter\n : undefined;\n break;\n }\n case 'JERLICIA':\n viewabilityPixel\n = slotContext.value?.data?.viewableImpressionCounter;\n break;\n }\n if (viewabilityPixel) {\n trackingPixel.value = addTrackingPixel(viewabilityPixel);\n context.logger.debug(\n `Viewability tracking pixel fired for ${slotContext.value?.name}`,\n );\n }\n },\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const additionalTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = ref(false);\n const isAdditionalTracked = ref(false);\n watch([status, isInViewport, data], ([newStatus, newIsInViewport, newData]) => {\n if (newStatus === 'rendered' && newIsInViewport) {\n if (newData?.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(newData.impressionCounter);\n isImpressionTracked.value = true;\n }\n if (newData?.additionalTracker && !additionalTrackingPixelElement.value) {\n additionalTrackingPixelElement.value = addTrackingPixel(newData.additionalTracker);\n isAdditionalTracked.value = true;\n }\n }\n }, { immediate: true });\n watch(status, async (newStatus, oldStatus) => {\n if (newStatus === 'loaded' && oldStatus === 'rendered') {\n impressionTrackingPixelElement.value?.remove();\n impressionTrackingPixelElement.value = null;\n additionalTrackingPixelElement.value?.remove();\n additionalTrackingPixelElement.value = null;\n }\n });\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n if (additionalTrackingPixelElement.value)\n additionalTrackingPixelElement.value.remove();\n });\n\n async function request(): Promise<AdheseAd | null> {\n try {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'loading';\n\n let response = await runOnBeforeRequest(null);\n\n if (!response) {\n response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n }\n\n if (response)\n response = await runOnRequest(response);\n\n data.value = response;\n\n if (!originalData.value)\n originalData.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n\n if (!response)\n cleanElement();\n\n if (response && context.options.eagerRendering && element.value)\n await render(response);\n\n return response;\n }\n catch (error) {\n status.value = 'error';\n\n logger.error(`Error requesting ad for slot ${name.value}`, error);\n\n runOnError(new Error(`Error requesting ad for slot ${name.value}`, { cause: error }));\n\n return null;\n }\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n if (status.value === 'empty' || status.value === 'error' || status.value === 'initializing') {\n return null;\n }\n\n try {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'rendering';\n await waitForDomLoad();\n element.value = getElement();\n\n let renderAd = adToRender ?? data.value ?? originalData.value ?? await request();\n\n renderAd = renderAd && await runOnBeforeRender(renderAd);\n\n if (!element.value && renderMode !== 'none') {\n logger.debug(`Could not render slot for format ${format.value}. No element found.`, slotContext.value);\n\n return null;\n }\n\n if (!renderAd) {\n return null;\n }\n\n if (typeof renderAd?.tag !== 'string' && renderMode !== 'none') {\n const error = `Could not render slot for slot ${name.value}. A valid tag doesn't exist or is not HTML string.`;\n logger.error(error, options);\n\n throw new Error(error);\n }\n\n if (renderMode !== 'none' && element.value) {\n renderFunctions[renderMode]({\n ...renderAd,\n ...pick(options, ['width', 'height']),\n } as RenderOptions, element.value);\n }\n\n logger.debug(`Slot rendered ${name.value}`, {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n // eslint-disable-next-line require-atomic-updates\n status.value = 'rendered';\n\n runOnRender(renderAd);\n\n return element.value;\n }\n catch (error) {\n // eslint-disable-next-line require-atomic-updates\n status.value = 'error';\n\n logger.error(`${error}`, options);\n\n runOnError(new Error(error as string));\n\n return null;\n }\n }\n\n function processOnEmpty(): void {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n runOnEmpty();\n }\n\n function cleanElement(): void {\n if (!element.value || renderMode === 'none')\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n element.value = null;\n\n data.value = null;\n originalData.value = null;\n\n domObserver.disconnect();\n\n runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n type,\n slot,\n parameters,\n format,\n name,\n data,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n pluginOptions,\n isVisible: isInViewport,\n render,\n request,\n dispose,\n processOnEmpty,\n cleanElement,\n options: omit(options, ['context']),\n ...hooks,\n });\n\n watch(state, (newState) => {\n slotContext.value = newState;\n }, {\n deep: true,\n immediate: true,\n });\n\n context.hooks.onInit(async () => {\n await runOnInit();\n\n if (status.value === 'empty' || status.value === 'error') {\n return;\n }\n\n if (initialData) {\n status.value = 'loaded';\n\n data.value = initialData;\n data.value = await runOnRequest(initialData);\n\n return;\n }\n\n status.value = 'initialized';\n\n if (options.lazyLoading) {\n return;\n }\n\n data.value = await slotContext.value?.request() ?? null;\n });\n\n return state;\n })!;\n}\n"],"names":["renderIframe","renderInline","doNothing","effectScope","ref","uniqueId","useSlotHooks","reactive","useQueryDetector","computed","generateName","watch","useDomLoaded","shallowRef","useRenderIntersectionObserver","useViewabilityObserver","addTrackingPixel","extRequestAd","logger","waitForDomLoad","pick","omit"],"mappings":"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"}
1
+ {"version":3,"file":"slot.cjs","sources":["../../../src/slot/slot.ts"],"sourcesContent":["import type { AdheseAd } from '@adhese/sdk';\nimport type {\n AdheseSlot,\n AdheseSlotContext,\n AdheseSlotOptions,\n RenderMode,\n} from './slot.types';\nimport {\n addTrackingPixel,\n computed,\n doNothing,\n effectScope,\n generateName,\n omit,\n pick,\n reactive,\n type Ref,\n ref,\n renderIframe,\n renderInline,\n type RenderOptions,\n shallowRef,\n uniqueId,\n type UnwrapRef,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport {\n useDomLoaded,\n useRenderIntersectionObserver,\n useSlotHooks,\n useViewabilityObserver,\n} from './slot.composables';\n\nconst renderFunctions: Record<\n RenderMode,\n (ad: RenderOptions, element: HTMLElement) => void\n> = {\n iframe: renderIframe,\n inline: renderInline,\n none: doNothing,\n};\n\nconst defaultOptions = {\n renderMode: 'iframe',\n type: 'normal',\n} satisfies Partial<AdheseSlotOptions>;\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...(Object.fromEntries(\n Object.entries(slotOptions).filter(([, value]) => value !== undefined),\n ) as AdheseSlotOptions),\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\n initialData = null,\n type = 'normal',\n } = options;\n\n let { renderMode = 'iframe' } = options;\n\n const id = uniqueId();\n const {\n runOnBeforeRender,\n runOnRender,\n runOnBeforeRequest,\n runOnRequest,\n runOnInit,\n runOnDispose,\n runOnEmpty,\n runOnError,\n ...hooks\n } = useSlotHooks(options, slotContext);\n\n const isDisposed = ref(false);\n const parameters = reactive(\n new Map(Object.entries(options.parameters ?? {})),\n );\n\n const [device, disposeQueryDetector] = useQueryDetector(\n context,\n typeof options.format === 'string'\n ? {\n [options.format]: '(min-width: 0px)',\n }\n : Object.fromEntries(\n options.format.map(item => [item.format, item.query]),\n ),\n );\n\n const format = computed(() =>\n typeof options.format === 'string' ? options.format : device.value,\n );\n\n const data = ref<AdheseAd | null>(null) as Ref<AdheseAd | null>;\n const originalData = ref(data.value) as Ref<AdheseAd | null>;\n const name = computed(() =>\n generateName(options.context.location, format.value, options.slot),\n );\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n const newAd = await slotContext.value?.request();\n\n if (!newAd)\n return;\n\n slotContext.value?.cleanElement();\n\n data.value = newAd;\n originalData.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded(context);\n\n const element = shallowRef<HTMLElement | null>(null);\n\n function getElement(): HTMLElement | null {\n if (\n !(\n typeof options.containingElement === 'string'\n || !options.containingElement\n )\n ) {\n return options.containingElement;\n }\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(\n `#${options.containingElement}`,\n );\n }\n\n watch(element, async (newElement, oldElement) => {\n if (\n status.value === 'empty'\n || status.value === 'error'\n || status.value === 'loading'\n ) {\n return;\n }\n\n if (newElement === null && data.value) {\n status.value = 'loaded';\n\n return;\n }\n\n if (\n newElement === oldElement\n || (oldElement === null && newElement === null)\n ) {\n return;\n }\n\n await render();\n });\n\n const domObserver = new MutationObserver(() => {\n element.value = getElement();\n });\n\n domObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n watch(\n isDomLoaded,\n () => {\n element.value = getElement();\n },\n { immediate: true, deep: true },\n );\n\n const isInViewport = useRenderIntersectionObserver({\n options,\n element,\n hooks,\n });\n\n watch(\n isInViewport,\n async (newIsInViewport) => {\n if (newIsInViewport && status.value !== 'rendered')\n await slotContext.value?.render();\n },\n { immediate: true },\n );\n\n hooks.onDispose(() => {\n disposeQueryDetector();\n });\n\n const isViewabilityTracked = useViewabilityObserver({\n context,\n slotContext,\n hooks,\n onTracked(trackingPixel) {\n let viewabilityPixel;\n if (slotContext.value?.data?.origin === undefined) {\n context.logger.warn(\n `Origin not found for ${slotContext.value?.name}`,\n );\n return;\n }\n switch (slotContext.value?.data?.origin) {\n case 'DALE': {\n // @ts-expect-error - Data structure is not typed and very messy to type\n const seatbid = slotContext.value?.data?.originData?.seatbid;\n const bid = seatbid ? seatbid[0]?.bid[0] : undefined;\n viewabilityPixel = bid\n ? bid.ext?.adhese?.viewableImpressionCounter\n : undefined;\n break;\n }\n case 'JERLICIA':\n viewabilityPixel\n = slotContext.value?.data?.viewableImpressionCounter;\n break;\n }\n if (viewabilityPixel) {\n trackingPixel.value = addTrackingPixel(viewabilityPixel);\n context.logger.debug(\n `Viewability tracking pixel fired for ${slotContext.value?.name}`,\n );\n }\n },\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const additionalTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = ref(false);\n const isAdditionalTracked = ref(false);\n watch(\n [status, isInViewport, data],\n ([newStatus, newIsInViewport, newData]) => {\n if (newStatus === 'rendered' && newIsInViewport) {\n if (\n newData?.impressionCounter\n && !impressionTrackingPixelElement.value\n ) {\n impressionTrackingPixelElement.value = addTrackingPixel(\n newData.impressionCounter,\n );\n isImpressionTracked.value = true;\n }\n if (\n newData?.additionalTracker\n && !additionalTrackingPixelElement.value\n ) {\n additionalTrackingPixelElement.value = addTrackingPixel(\n newData.additionalTracker,\n );\n isAdditionalTracked.value = true;\n }\n }\n },\n { immediate: true },\n );\n watch(status, async (newStatus, oldStatus) => {\n if (newStatus === 'loaded' && oldStatus === 'rendered') {\n impressionTrackingPixelElement.value?.remove();\n impressionTrackingPixelElement.value = null;\n additionalTrackingPixelElement.value?.remove();\n additionalTrackingPixelElement.value = null;\n }\n });\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n if (additionalTrackingPixelElement.value)\n additionalTrackingPixelElement.value.remove();\n });\n\n async function request(): Promise<AdheseAd | null> {\n try {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'loading';\n\n let response = await runOnBeforeRequest(null);\n\n if (!response) {\n response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n }\n\n if (response)\n response = await runOnRequest(response);\n\n data.value = response;\n\n if (!originalData.value)\n originalData.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n\n if (!response)\n cleanElement();\n\n if (response && context.options.eagerRendering && element.value)\n await render(response);\n\n return response;\n }\n catch (error) {\n status.value = 'error';\n\n logger.error(`Error requesting ad for slot ${name.value}`, error);\n\n runOnError(\n new Error(`Error requesting ad for slot ${name.value}`, {\n cause: error,\n }),\n );\n\n return null;\n }\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n if (\n status.value === 'empty'\n || status.value === 'error'\n || status.value === 'initializing'\n ) {\n return null;\n }\n\n try {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'rendering';\n await waitForDomLoad();\n element.value = getElement();\n\n let renderAd\n = adToRender ?? data.value ?? originalData.value ?? (await request());\n\n renderAd = renderAd && (await runOnBeforeRender(renderAd));\n\n renderMode = renderAd?.renderMode ?? renderMode;\n\n if (!element.value && renderMode !== 'none') {\n logger.debug(\n `Could not render slot for format ${format.value}. No element found.`,\n slotContext.value,\n );\n\n return null;\n }\n\n if (!renderAd) {\n return null;\n }\n\n if (typeof renderAd?.tag !== 'string' && renderMode !== 'none') {\n const error = `Could not render slot for slot ${name.value}. A valid tag doesn't exist or is not HTML string.`;\n logger.error(error, options);\n\n throw new Error(error);\n }\n\n if (renderMode !== 'none' && element.value) {\n renderFunctions[renderMode](\n {\n ...renderAd,\n ...pick(options, ['width', 'height']),\n } as RenderOptions,\n element.value,\n );\n }\n\n logger.debug(`Slot rendered ${name.value}`, {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n // eslint-disable-next-line require-atomic-updates\n status.value = 'rendered';\n\n runOnRender(renderAd);\n\n return element.value;\n }\n catch (error) {\n // eslint-disable-next-line require-atomic-updates\n status.value = 'error';\n\n logger.error(`${error}`, options);\n\n runOnError(new Error(error as string));\n\n return null;\n }\n }\n\n function processOnEmpty(): void {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n runOnEmpty();\n }\n\n function cleanElement(): void {\n if (!element.value || renderMode === 'none')\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n element.value = null;\n\n data.value = null;\n originalData.value = null;\n\n domObserver.disconnect();\n\n runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n type,\n slot,\n parameters,\n format,\n name,\n data,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n pluginOptions,\n isVisible: isInViewport,\n render,\n request,\n dispose,\n processOnEmpty,\n cleanElement,\n options: omit(options, ['context']),\n ...hooks,\n });\n\n watch(\n state,\n (newState) => {\n slotContext.value = newState;\n },\n {\n deep: true,\n immediate: true,\n },\n );\n\n context.hooks.onInit(async () => {\n await runOnInit();\n\n if (status.value === 'empty' || status.value === 'error') {\n return;\n }\n\n if (initialData) {\n status.value = 'loaded';\n\n data.value = initialData;\n data.value = await runOnRequest(initialData);\n\n return;\n }\n\n status.value = 'initialized';\n\n if (options.lazyLoading) {\n return;\n }\n\n data.value = (await slotContext.value?.request()) ?? null;\n });\n\n return state;\n })!;\n}\n"],"names":["renderIframe","renderInline","doNothing","effectScope","ref","uniqueId","useSlotHooks","reactive","useQueryDetector","computed","generateName","watch","useDomLoaded","shallowRef","useRenderIntersectionObserver","useViewabilityObserver","addTrackingPixel","extRequestAd","logger","waitForDomLoad","pick","omit"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  const name = "@adhese/sdk";
2
- const version = "1.8.1";
2
+ const version = "1.8.2";
3
3
  export {
4
4
  name,
5
5
  version
@@ -37,6 +37,7 @@ const baseSchema = object({
37
37
  poolPath: urlLike.optional(),
38
38
  preview: booleanLike.optional(),
39
39
  priority: numberLike.optional(),
40
+ renderMode: union([literal("inline"), literal("iframe")]).optional(),
40
41
  sfSrc: urlLike.optional(),
41
42
  share: string().optional(),
42
43
  // eslint-disable-next-line ts/naming-convention
@@ -1 +1 @@
1
- {"version":3,"file":"requestAds.schema.js","sources":["../../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import {\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n lazy,\n literal,\n numberLike,\n object,\n string,\n type TypeOf,\n union,\n unknown,\n urlLike,\n type ZodType,\n} from '@adhese/sdk-shared/validators';\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n additionalTracker: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type AdheseAd<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<AdheseAd> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<AdheseAd>;\n}\n"],"names":[],"mappings":";AAkBA,MAAM,aAAa,OAAO;AAAA,EACxB,YAAY,WAAW,SAAS;AAAA,EAChC,UAAU,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQ,OAAO;AAAA,EACf,2BAA2B,QAAQ,SAAS;AAAA,EAC5C,2BAA2B,OAAO,EAAE,SAAS;AAAA,EAC7C,YAAY,SAAS,SAAS;AAAA,EAC9B,WAAW,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,SAAS,SAAS;AAAA,EAChC,cAAc,OAAO,EAAE,SAAS;AAAA,EAChC,SAAS,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAa,YAAY,SAAS;AAAA,EAClC,MAAM;AAAA,EACN,UAAU,QAAQ,SAAS;AAAA,EAC3B,SAAS,OAAO,EAAE,SAAS;AAAA,EAC3B,cAAc,OAAO,EAAE,SAAS;AAAA,EAChC,iBAAiB,OAAO,EAAE,SAAS;AAAA,EACnC,mBAAmB,OAAO,EAAE,SAAS;AAAA,EACrC,KAAK,OAAO,EAAE,SAAS;AAAA,EACvB,WAAW,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,QAAQ,QAAQ,EAAE,SAAS;AAAA,EAC5B,CAAA,EAAE,SAAS;AAAA,EACZ,QAAQ,WAAW,SAAS;AAAA,EAC5B,IAAI,OAAO,EAAE,SAAS;AAAA,EACtB,mBAAmB,QAAQ,SAAS;AAAA,EACpC,mBAAmB,QAAQ,SAAS;AAAA,EACpC,OAAO,OAAO,EAAE,SAAS;AAAA,EACzB,SAAS,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAe,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,MAAM,CAAC,QAAQ,UAAU,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,EACpD,YAAY,QAAQ,EAAE,SAAS;AAAA,EAC/B,gBAAgB,OAAO,EAAE,SAAS;AAAA,EAClC,UAAU,QAAQ,SAAS;AAAA,EAC3B,SAAS,YAAY,SAAS;AAAA,EAC9B,UAAU,WAAW,SAAS;AAAA,EAC9B,OAAO,QAAQ,SAAS;AAAA,EACxB,OAAO,OAAO,EAAE,SAAS;AAAA;AAAA,EAEzB,QAAQ,OAAO;AAAA,EACf,UAAU,OAAO;AAAA,EACjB,QAAQ,QAAQ,SAAS;AAAA,EACzB,KAAK;AAAA,EACL,QAAQ,QAAQ,SAAS;AAAA,EACzB,WAAW,SAAS,SAAS;AAAA,EAC7B,0BAA0B,QAAQ,SAAS;AAAA,EAC3C,SAAS,QAAQ,SAAS;AAAA,EAC1B,aAAa,QAAQ,SAAS;AAAA,EAC9B,KAAK,QAAQ,SAAS;AAAA,EACtB,2BAA2B,QAAQ,SAAS;AAAA,EAC5C,OAAO,WAAW,SAAS;AAAA,EAC3B,YAAY,aAAa,SAAS;AACpC,CAAC;AAEM,MAAM,iBAAiB,OAAO;AAAA,EACnC,QAAQ,QAAQ,UAAU;AAAA,EAC1B,KAAK;AACP,CAAC,EAAE,YAAY;AAER,MAAM,aAAa,OAAO;AAAA,EAC/B,QAAQ,QAAQ,MAAM;AAAA,EACtB,MAAM;AACR,CAAC,EAAE,cAAc,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY;AAAA,EACjD,GAAG;AAAA,EACH,KAAK;AACP,EAAE;AAMF,MAAM,mBAAwC,WAAW,OAAO;AAAA,EAC9D,qBAAqB,KAAK,MAAM,MAAM,CAAC,iBAAiB,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,SAAU,CAAA;AACxF,CAAC;AAUY,MAAA,WAAiC,iBAAiB,UAAU,CAAC;AAAA,EACxE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,gBAAgB,OAAO;AAAA,IAC3B,OAAO,QAAQ,IAAI,EAChB,OAAO,CAAC,CAAG,EAAA,KAAK,MACf,QAAQ,KAAK,KACV,KAAK,UAAU,KAAK,MAAM,QAC1B,KAAK,UAAU,KAAK,MAAM,IAAI;AAAA,EACvC;AAEQ,SAAA;AAAA,IACN,GAAG;AAAA,IACH,qBAAqB,MAAM,QAAQ,mBAAmB,IAAI,oBAAoB,IAAI,CAAA,aAAY,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,EAC5H;AACF,CAAC;AAEM,SAAS,cAAc,UAA4C;AACxE,QAAM,YAAY;AAAA;AAAA,IAEhB,UAAU;AAAA,IACV,MAAM;AAAA;AAAA,EAER;AAEA,QAAM,YAAY,iBAAiB,MAAM,EAAE,MAAM,QAAQ;AAElD,SAAA,UAAU,IAAI,CAAC,SAAS;AACvB,UAAA,SAAS,UAAU,KAAK,MAAM;AAEpC,QAAI,CAAC;AACI,aAAA,SAAS,MAAM,IAAI;AAErB,WAAA,OAAO,MAAM,IAAI;AAAA,EAAA,CACzB;AACH;"}
1
+ {"version":3,"file":"requestAds.schema.js","sources":["../../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import {\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n lazy,\n literal,\n numberLike,\n object,\n string,\n type TypeOf,\n union,\n unknown,\n urlLike,\n type ZodType,\n} from '@adhese/sdk-shared/validators';\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n additionalTracker: 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 renderMode: union([literal('inline'), literal('iframe')]).optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type AdheseAd<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<AdheseAd> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<AdheseAd>;\n}\n"],"names":[],"mappings":"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"}
package/dist/slot/slot.js CHANGED
@@ -18,7 +18,9 @@ function createSlot(slotOptions) {
18
18
  const slotContext = ref(null);
19
19
  const options = slotOptions.context.hooks.runOnSlotCreate({
20
20
  ...defaultOptions,
21
- ...Object.fromEntries(Object.entries(slotOptions).filter(([, value]) => value !== void 0))
21
+ ...Object.fromEntries(
22
+ Object.entries(slotOptions).filter(([, value]) => value !== void 0)
23
+ )
22
24
  });
23
25
  const {
24
26
  containingElement,
@@ -26,9 +28,9 @@ function createSlot(slotOptions) {
26
28
  context,
27
29
  pluginOptions,
28
30
  initialData = null,
29
- renderMode = "iframe",
30
31
  type = "normal"
31
32
  } = options;
33
+ let { renderMode = "iframe" } = options;
32
34
  const id = uniqueId();
33
35
  const {
34
36
  runOnBeforeRender,
@@ -42,14 +44,25 @@ function createSlot(slotOptions) {
42
44
  ...hooks
43
45
  } = useSlotHooks(options, slotContext);
44
46
  const isDisposed = ref(false);
45
- const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));
46
- const [device, disposeQueryDetector] = useQueryDetector(context, typeof options.format === "string" ? {
47
- [options.format]: "(min-width: 0px)"
48
- } : Object.fromEntries(options.format.map((item) => [item.format, item.query])));
49
- const format = computed(() => typeof options.format === "string" ? options.format : device.value);
47
+ const parameters = reactive(
48
+ new Map(Object.entries(options.parameters ?? {}))
49
+ );
50
+ const [device, disposeQueryDetector] = useQueryDetector(
51
+ context,
52
+ typeof options.format === "string" ? {
53
+ [options.format]: "(min-width: 0px)"
54
+ } : Object.fromEntries(
55
+ options.format.map((item) => [item.format, item.query])
56
+ )
57
+ );
58
+ const format = computed(
59
+ () => typeof options.format === "string" ? options.format : device.value
60
+ );
50
61
  const data = ref(null);
51
62
  const originalData = ref(data.value);
52
- const name = computed(() => generateName(options.context.location, format.value, options.slot));
63
+ const name = computed(
64
+ () => generateName(options.context.location, format.value, options.slot)
65
+ );
53
66
  const status = ref("initializing");
54
67
  watch(name, async (newName, oldName) => {
55
68
  var _a, _b;
@@ -65,11 +78,14 @@ function createSlot(slotOptions) {
65
78
  const isDomLoaded = useDomLoaded(context);
66
79
  const element = shallowRef(null);
67
80
  function getElement() {
68
- if (!(typeof options.containingElement === "string" || !options.containingElement))
81
+ if (!(typeof options.containingElement === "string" || !options.containingElement)) {
69
82
  return options.containingElement;
83
+ }
70
84
  if (!isDomLoaded.value)
71
85
  return null;
72
- return document.querySelector(`#${options.containingElement}`);
86
+ return document.querySelector(
87
+ `#${options.containingElement}`
88
+ );
73
89
  }
74
90
  watch(element, async (newElement, oldElement) => {
75
91
  if (status.value === "empty" || status.value === "error" || status.value === "loading") {
@@ -79,8 +95,9 @@ function createSlot(slotOptions) {
79
95
  status.value = "loaded";
80
96
  return;
81
97
  }
82
- if (newElement === oldElement || oldElement === null && newElement === null)
98
+ if (newElement === oldElement || oldElement === null && newElement === null) {
83
99
  return;
100
+ }
84
101
  await render();
85
102
  });
86
103
  const domObserver = new MutationObserver(() => {
@@ -102,11 +119,15 @@ function createSlot(slotOptions) {
102
119
  element,
103
120
  hooks
104
121
  });
105
- watch(isInViewport, async (newIsInViewport) => {
106
- var _a;
107
- if (newIsInViewport && status.value !== "rendered")
108
- await ((_a = slotContext.value) == null ? void 0 : _a.render());
109
- }, { immediate: true });
122
+ watch(
123
+ isInViewport,
124
+ async (newIsInViewport) => {
125
+ var _a;
126
+ if (newIsInViewport && status.value !== "rendered")
127
+ await ((_a = slotContext.value) == null ? void 0 : _a.render());
128
+ },
129
+ { immediate: true }
130
+ );
110
131
  hooks.onDispose(() => {
111
132
  disposeQueryDetector();
112
133
  });
@@ -146,18 +167,26 @@ function createSlot(slotOptions) {
146
167
  const additionalTrackingPixelElement = ref(null);
147
168
  const isImpressionTracked = ref(false);
148
169
  const isAdditionalTracked = ref(false);
149
- watch([status, isInViewport, data], ([newStatus, newIsInViewport, newData]) => {
150
- if (newStatus === "rendered" && newIsInViewport) {
151
- if ((newData == null ? void 0 : newData.impressionCounter) && !impressionTrackingPixelElement.value) {
152
- impressionTrackingPixelElement.value = addTrackingPixel(newData.impressionCounter);
153
- isImpressionTracked.value = true;
154
- }
155
- if ((newData == null ? void 0 : newData.additionalTracker) && !additionalTrackingPixelElement.value) {
156
- additionalTrackingPixelElement.value = addTrackingPixel(newData.additionalTracker);
157
- isAdditionalTracked.value = true;
170
+ watch(
171
+ [status, isInViewport, data],
172
+ ([newStatus, newIsInViewport, newData]) => {
173
+ if (newStatus === "rendered" && newIsInViewport) {
174
+ if ((newData == null ? void 0 : newData.impressionCounter) && !impressionTrackingPixelElement.value) {
175
+ impressionTrackingPixelElement.value = addTrackingPixel(
176
+ newData.impressionCounter
177
+ );
178
+ isImpressionTracked.value = true;
179
+ }
180
+ if ((newData == null ? void 0 : newData.additionalTracker) && !additionalTrackingPixelElement.value) {
181
+ additionalTrackingPixelElement.value = addTrackingPixel(
182
+ newData.additionalTracker
183
+ );
184
+ isAdditionalTracked.value = true;
185
+ }
158
186
  }
159
- }
160
- }, { immediate: true });
187
+ },
188
+ { immediate: true }
189
+ );
161
190
  watch(status, async (newStatus, oldStatus) => {
162
191
  var _a, _b;
163
192
  if (newStatus === "loaded" && oldStatus === "rendered") {
@@ -202,7 +231,11 @@ function createSlot(slotOptions) {
202
231
  } catch (error) {
203
232
  status.value = "error";
204
233
  logger.error(`Error requesting ad for slot ${name.value}`, error);
205
- runOnError(new Error(`Error requesting ad for slot ${name.value}`, { cause: error }));
234
+ runOnError(
235
+ new Error(`Error requesting ad for slot ${name.value}`, {
236
+ cause: error
237
+ })
238
+ );
206
239
  return null;
207
240
  }
208
241
  }
@@ -218,8 +251,12 @@ function createSlot(slotOptions) {
218
251
  element.value = getElement();
219
252
  let renderAd = adToRender ?? data.value ?? originalData.value ?? await request();
220
253
  renderAd = renderAd && await runOnBeforeRender(renderAd);
254
+ renderMode = (renderAd == null ? void 0 : renderAd.renderMode) ?? renderMode;
221
255
  if (!element.value && renderMode !== "none") {
222
- logger.debug(`Could not render slot for format ${format.value}. No element found.`, slotContext.value);
256
+ logger.debug(
257
+ `Could not render slot for format ${format.value}. No element found.`,
258
+ slotContext.value
259
+ );
223
260
  return null;
224
261
  }
225
262
  if (!renderAd) {
@@ -231,10 +268,13 @@ function createSlot(slotOptions) {
231
268
  throw new Error(error);
232
269
  }
233
270
  if (renderMode !== "none" && element.value) {
234
- renderFunctions[renderMode]({
235
- ...renderAd,
236
- ...pick(options, ["width", "height"])
237
- }, element.value);
271
+ renderFunctions[renderMode](
272
+ {
273
+ ...renderAd,
274
+ ...pick(options, ["width", "height"])
275
+ },
276
+ element.value
277
+ );
238
278
  }
239
279
  logger.debug(`Slot rendered ${name.value}`, {
240
280
  renderedElement: element,
@@ -298,12 +338,16 @@ function createSlot(slotOptions) {
298
338
  options: omit(options, ["context"]),
299
339
  ...hooks
300
340
  });
301
- watch(state, (newState) => {
302
- slotContext.value = newState;
303
- }, {
304
- deep: true,
305
- immediate: true
306
- });
341
+ watch(
342
+ state,
343
+ (newState) => {
344
+ slotContext.value = newState;
345
+ },
346
+ {
347
+ deep: true,
348
+ immediate: true
349
+ }
350
+ );
307
351
  context.hooks.onInit(async () => {
308
352
  var _a;
309
353
  await runOnInit();
@@ -1 +1 @@
1
- {"version":3,"file":"slot.js","sources":["../../src/slot/slot.ts"],"sourcesContent":["import type { AdheseAd } from '@adhese/sdk';\nimport type { AdheseSlot, AdheseSlotContext, AdheseSlotOptions, RenderMode } from './slot.types';\nimport {\n addTrackingPixel,\n computed,\n doNothing,\n effectScope,\n generateName,\n omit,\n pick,\n reactive,\n type Ref,\n ref,\n renderIframe,\n renderInline,\n type RenderOptions,\n shallowRef,\n uniqueId,\n type UnwrapRef,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport {\n useDomLoaded,\n useRenderIntersectionObserver,\n useSlotHooks,\n useViewabilityObserver,\n} from './slot.composables';\n\nconst renderFunctions: Record<RenderMode, (ad: RenderOptions, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n none: doNothing,\n};\n\nconst defaultOptions = {\n renderMode: 'iframe',\n type: 'normal',\n} satisfies Partial<AdheseSlotOptions>;\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...(Object.fromEntries(Object.entries(slotOptions).filter(([, value]) => value !== undefined)) as AdheseSlotOptions),\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\n initialData = null,\n renderMode = 'iframe',\n type = 'normal',\n } = options;\n\n const id = uniqueId();\n const {\n runOnBeforeRender,\n runOnRender,\n runOnBeforeRequest,\n runOnRequest,\n runOnInit,\n runOnDispose,\n runOnEmpty,\n runOnError,\n ...hooks\n } = useSlotHooks(options, slotContext);\n\n const isDisposed = ref(false);\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n\n const [device, disposeQueryDetector] = useQueryDetector(context, typeof options.format === 'string'\n ? {\n [options.format]: '(min-width: 0px)',\n }\n : Object.fromEntries(options.format.map(item => [item.format, item.query])));\n\n const format = computed(() => typeof options.format === 'string' ? options.format : device.value);\n\n const data = ref<AdheseAd | null>(null) as Ref<AdheseAd | null>;\n const originalData = ref(data.value) as Ref<AdheseAd | null>;\n const name = computed(() => generateName(options.context.location, format.value, options.slot));\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n const newAd = await slotContext.value?.request();\n\n if (!newAd)\n return;\n\n slotContext.value?.cleanElement();\n\n data.value = newAd;\n originalData.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded(context);\n\n const element = shallowRef<HTMLElement | null>(null);\n\n function getElement(): HTMLElement | null {\n if (!(typeof options.containingElement === 'string' || !options.containingElement))\n return options.containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`#${options.containingElement}`);\n }\n\n watch(element, async (newElement, oldElement) => {\n if (status.value === 'empty' || status.value === 'error' || status.value === 'loading') {\n return;\n }\n\n if (newElement === null && data.value) {\n status.value = 'loaded';\n\n return;\n }\n\n if (newElement === oldElement || (oldElement === null && newElement === null))\n return;\n\n await render();\n });\n\n const domObserver = new MutationObserver(() => {\n element.value = getElement();\n });\n\n domObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n watch(\n isDomLoaded,\n () => {\n element.value = getElement();\n },\n { immediate: true, deep: true },\n );\n\n const isInViewport = useRenderIntersectionObserver({\n options,\n element,\n hooks,\n });\n\n watch(isInViewport, async (newIsInViewport) => {\n if (newIsInViewport && status.value !== 'rendered')\n await slotContext.value?.render();\n }, { immediate: true });\n\n hooks.onDispose(() => {\n disposeQueryDetector();\n });\n\n const isViewabilityTracked = useViewabilityObserver({\n context,\n slotContext,\n hooks,\n onTracked(trackingPixel) {\n let viewabilityPixel;\n if (slotContext.value?.data?.origin === undefined) {\n context.logger.warn(\n `Origin not found for ${slotContext.value?.name}`,\n );\n return;\n }\n switch (slotContext.value?.data?.origin) {\n case 'DALE': {\n // @ts-expect-error - Data structure is not typed and very messy to type\n const seatbid = slotContext.value?.data?.originData?.seatbid;\n const bid = seatbid ? seatbid[0]?.bid[0] : undefined;\n viewabilityPixel = bid\n ? bid.ext?.adhese?.viewableImpressionCounter\n : undefined;\n break;\n }\n case 'JERLICIA':\n viewabilityPixel\n = slotContext.value?.data?.viewableImpressionCounter;\n break;\n }\n if (viewabilityPixel) {\n trackingPixel.value = addTrackingPixel(viewabilityPixel);\n context.logger.debug(\n `Viewability tracking pixel fired for ${slotContext.value?.name}`,\n );\n }\n },\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const additionalTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = ref(false);\n const isAdditionalTracked = ref(false);\n watch([status, isInViewport, data], ([newStatus, newIsInViewport, newData]) => {\n if (newStatus === 'rendered' && newIsInViewport) {\n if (newData?.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(newData.impressionCounter);\n isImpressionTracked.value = true;\n }\n if (newData?.additionalTracker && !additionalTrackingPixelElement.value) {\n additionalTrackingPixelElement.value = addTrackingPixel(newData.additionalTracker);\n isAdditionalTracked.value = true;\n }\n }\n }, { immediate: true });\n watch(status, async (newStatus, oldStatus) => {\n if (newStatus === 'loaded' && oldStatus === 'rendered') {\n impressionTrackingPixelElement.value?.remove();\n impressionTrackingPixelElement.value = null;\n additionalTrackingPixelElement.value?.remove();\n additionalTrackingPixelElement.value = null;\n }\n });\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n if (additionalTrackingPixelElement.value)\n additionalTrackingPixelElement.value.remove();\n });\n\n async function request(): Promise<AdheseAd | null> {\n try {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'loading';\n\n let response = await runOnBeforeRequest(null);\n\n if (!response) {\n response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n }\n\n if (response)\n response = await runOnRequest(response);\n\n data.value = response;\n\n if (!originalData.value)\n originalData.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n\n if (!response)\n cleanElement();\n\n if (response && context.options.eagerRendering && element.value)\n await render(response);\n\n return response;\n }\n catch (error) {\n status.value = 'error';\n\n logger.error(`Error requesting ad for slot ${name.value}`, error);\n\n runOnError(new Error(`Error requesting ad for slot ${name.value}`, { cause: error }));\n\n return null;\n }\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n if (status.value === 'empty' || status.value === 'error' || status.value === 'initializing') {\n return null;\n }\n\n try {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'rendering';\n await waitForDomLoad();\n element.value = getElement();\n\n let renderAd = adToRender ?? data.value ?? originalData.value ?? await request();\n\n renderAd = renderAd && await runOnBeforeRender(renderAd);\n\n if (!element.value && renderMode !== 'none') {\n logger.debug(`Could not render slot for format ${format.value}. No element found.`, slotContext.value);\n\n return null;\n }\n\n if (!renderAd) {\n return null;\n }\n\n if (typeof renderAd?.tag !== 'string' && renderMode !== 'none') {\n const error = `Could not render slot for slot ${name.value}. A valid tag doesn't exist or is not HTML string.`;\n logger.error(error, options);\n\n throw new Error(error);\n }\n\n if (renderMode !== 'none' && element.value) {\n renderFunctions[renderMode]({\n ...renderAd,\n ...pick(options, ['width', 'height']),\n } as RenderOptions, element.value);\n }\n\n logger.debug(`Slot rendered ${name.value}`, {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n // eslint-disable-next-line require-atomic-updates\n status.value = 'rendered';\n\n runOnRender(renderAd);\n\n return element.value;\n }\n catch (error) {\n // eslint-disable-next-line require-atomic-updates\n status.value = 'error';\n\n logger.error(`${error}`, options);\n\n runOnError(new Error(error as string));\n\n return null;\n }\n }\n\n function processOnEmpty(): void {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n runOnEmpty();\n }\n\n function cleanElement(): void {\n if (!element.value || renderMode === 'none')\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n element.value = null;\n\n data.value = null;\n originalData.value = null;\n\n domObserver.disconnect();\n\n runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n type,\n slot,\n parameters,\n format,\n name,\n data,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n pluginOptions,\n isVisible: isInViewport,\n render,\n request,\n dispose,\n processOnEmpty,\n cleanElement,\n options: omit(options, ['context']),\n ...hooks,\n });\n\n watch(state, (newState) => {\n slotContext.value = newState;\n }, {\n deep: true,\n immediate: true,\n });\n\n context.hooks.onInit(async () => {\n await runOnInit();\n\n if (status.value === 'empty' || status.value === 'error') {\n return;\n }\n\n if (initialData) {\n status.value = 'loaded';\n\n data.value = initialData;\n data.value = await runOnRequest(initialData);\n\n return;\n }\n\n status.value = 'initialized';\n\n if (options.lazyLoading) {\n return;\n }\n\n data.value = await slotContext.value?.request() ?? null;\n });\n\n return state;\n })!;\n}\n"],"names":["extRequestAd"],"mappings":"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"}
1
+ {"version":3,"file":"slot.js","sources":["../../src/slot/slot.ts"],"sourcesContent":["import type { AdheseAd } from '@adhese/sdk';\nimport type {\n AdheseSlot,\n AdheseSlotContext,\n AdheseSlotOptions,\n RenderMode,\n} from './slot.types';\nimport {\n addTrackingPixel,\n computed,\n doNothing,\n effectScope,\n generateName,\n omit,\n pick,\n reactive,\n type Ref,\n ref,\n renderIframe,\n renderInline,\n type RenderOptions,\n shallowRef,\n uniqueId,\n type UnwrapRef,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport {\n useDomLoaded,\n useRenderIntersectionObserver,\n useSlotHooks,\n useViewabilityObserver,\n} from './slot.composables';\n\nconst renderFunctions: Record<\n RenderMode,\n (ad: RenderOptions, element: HTMLElement) => void\n> = {\n iframe: renderIframe,\n inline: renderInline,\n none: doNothing,\n};\n\nconst defaultOptions = {\n renderMode: 'iframe',\n type: 'normal',\n} satisfies Partial<AdheseSlotOptions>;\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...(Object.fromEntries(\n Object.entries(slotOptions).filter(([, value]) => value !== undefined),\n ) as AdheseSlotOptions),\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\n initialData = null,\n type = 'normal',\n } = options;\n\n let { renderMode = 'iframe' } = options;\n\n const id = uniqueId();\n const {\n runOnBeforeRender,\n runOnRender,\n runOnBeforeRequest,\n runOnRequest,\n runOnInit,\n runOnDispose,\n runOnEmpty,\n runOnError,\n ...hooks\n } = useSlotHooks(options, slotContext);\n\n const isDisposed = ref(false);\n const parameters = reactive(\n new Map(Object.entries(options.parameters ?? {})),\n );\n\n const [device, disposeQueryDetector] = useQueryDetector(\n context,\n typeof options.format === 'string'\n ? {\n [options.format]: '(min-width: 0px)',\n }\n : Object.fromEntries(\n options.format.map(item => [item.format, item.query]),\n ),\n );\n\n const format = computed(() =>\n typeof options.format === 'string' ? options.format : device.value,\n );\n\n const data = ref<AdheseAd | null>(null) as Ref<AdheseAd | null>;\n const originalData = ref(data.value) as Ref<AdheseAd | null>;\n const name = computed(() =>\n generateName(options.context.location, format.value, options.slot),\n );\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n const newAd = await slotContext.value?.request();\n\n if (!newAd)\n return;\n\n slotContext.value?.cleanElement();\n\n data.value = newAd;\n originalData.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded(context);\n\n const element = shallowRef<HTMLElement | null>(null);\n\n function getElement(): HTMLElement | null {\n if (\n !(\n typeof options.containingElement === 'string'\n || !options.containingElement\n )\n ) {\n return options.containingElement;\n }\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(\n `#${options.containingElement}`,\n );\n }\n\n watch(element, async (newElement, oldElement) => {\n if (\n status.value === 'empty'\n || status.value === 'error'\n || status.value === 'loading'\n ) {\n return;\n }\n\n if (newElement === null && data.value) {\n status.value = 'loaded';\n\n return;\n }\n\n if (\n newElement === oldElement\n || (oldElement === null && newElement === null)\n ) {\n return;\n }\n\n await render();\n });\n\n const domObserver = new MutationObserver(() => {\n element.value = getElement();\n });\n\n domObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n watch(\n isDomLoaded,\n () => {\n element.value = getElement();\n },\n { immediate: true, deep: true },\n );\n\n const isInViewport = useRenderIntersectionObserver({\n options,\n element,\n hooks,\n });\n\n watch(\n isInViewport,\n async (newIsInViewport) => {\n if (newIsInViewport && status.value !== 'rendered')\n await slotContext.value?.render();\n },\n { immediate: true },\n );\n\n hooks.onDispose(() => {\n disposeQueryDetector();\n });\n\n const isViewabilityTracked = useViewabilityObserver({\n context,\n slotContext,\n hooks,\n onTracked(trackingPixel) {\n let viewabilityPixel;\n if (slotContext.value?.data?.origin === undefined) {\n context.logger.warn(\n `Origin not found for ${slotContext.value?.name}`,\n );\n return;\n }\n switch (slotContext.value?.data?.origin) {\n case 'DALE': {\n // @ts-expect-error - Data structure is not typed and very messy to type\n const seatbid = slotContext.value?.data?.originData?.seatbid;\n const bid = seatbid ? seatbid[0]?.bid[0] : undefined;\n viewabilityPixel = bid\n ? bid.ext?.adhese?.viewableImpressionCounter\n : undefined;\n break;\n }\n case 'JERLICIA':\n viewabilityPixel\n = slotContext.value?.data?.viewableImpressionCounter;\n break;\n }\n if (viewabilityPixel) {\n trackingPixel.value = addTrackingPixel(viewabilityPixel);\n context.logger.debug(\n `Viewability tracking pixel fired for ${slotContext.value?.name}`,\n );\n }\n },\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const additionalTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = ref(false);\n const isAdditionalTracked = ref(false);\n watch(\n [status, isInViewport, data],\n ([newStatus, newIsInViewport, newData]) => {\n if (newStatus === 'rendered' && newIsInViewport) {\n if (\n newData?.impressionCounter\n && !impressionTrackingPixelElement.value\n ) {\n impressionTrackingPixelElement.value = addTrackingPixel(\n newData.impressionCounter,\n );\n isImpressionTracked.value = true;\n }\n if (\n newData?.additionalTracker\n && !additionalTrackingPixelElement.value\n ) {\n additionalTrackingPixelElement.value = addTrackingPixel(\n newData.additionalTracker,\n );\n isAdditionalTracked.value = true;\n }\n }\n },\n { immediate: true },\n );\n watch(status, async (newStatus, oldStatus) => {\n if (newStatus === 'loaded' && oldStatus === 'rendered') {\n impressionTrackingPixelElement.value?.remove();\n impressionTrackingPixelElement.value = null;\n additionalTrackingPixelElement.value?.remove();\n additionalTrackingPixelElement.value = null;\n }\n });\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n if (additionalTrackingPixelElement.value)\n additionalTrackingPixelElement.value.remove();\n });\n\n async function request(): Promise<AdheseAd | null> {\n try {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'loading';\n\n let response = await runOnBeforeRequest(null);\n\n if (!response) {\n response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n }\n\n if (response)\n response = await runOnRequest(response);\n\n data.value = response;\n\n if (!originalData.value)\n originalData.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n\n if (!response)\n cleanElement();\n\n if (response && context.options.eagerRendering && element.value)\n await render(response);\n\n return response;\n }\n catch (error) {\n status.value = 'error';\n\n logger.error(`Error requesting ad for slot ${name.value}`, error);\n\n runOnError(\n new Error(`Error requesting ad for slot ${name.value}`, {\n cause: error,\n }),\n );\n\n return null;\n }\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n if (\n status.value === 'empty'\n || status.value === 'error'\n || status.value === 'initializing'\n ) {\n return null;\n }\n\n try {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'rendering';\n await waitForDomLoad();\n element.value = getElement();\n\n let renderAd\n = adToRender ?? data.value ?? originalData.value ?? (await request());\n\n renderAd = renderAd && (await runOnBeforeRender(renderAd));\n\n renderMode = renderAd?.renderMode ?? renderMode;\n\n if (!element.value && renderMode !== 'none') {\n logger.debug(\n `Could not render slot for format ${format.value}. No element found.`,\n slotContext.value,\n );\n\n return null;\n }\n\n if (!renderAd) {\n return null;\n }\n\n if (typeof renderAd?.tag !== 'string' && renderMode !== 'none') {\n const error = `Could not render slot for slot ${name.value}. A valid tag doesn't exist or is not HTML string.`;\n logger.error(error, options);\n\n throw new Error(error);\n }\n\n if (renderMode !== 'none' && element.value) {\n renderFunctions[renderMode](\n {\n ...renderAd,\n ...pick(options, ['width', 'height']),\n } as RenderOptions,\n element.value,\n );\n }\n\n logger.debug(`Slot rendered ${name.value}`, {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n // eslint-disable-next-line require-atomic-updates\n status.value = 'rendered';\n\n runOnRender(renderAd);\n\n return element.value;\n }\n catch (error) {\n // eslint-disable-next-line require-atomic-updates\n status.value = 'error';\n\n logger.error(`${error}`, options);\n\n runOnError(new Error(error as string));\n\n return null;\n }\n }\n\n function processOnEmpty(): void {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n runOnEmpty();\n }\n\n function cleanElement(): void {\n if (!element.value || renderMode === 'none')\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n element.value = null;\n\n data.value = null;\n originalData.value = null;\n\n domObserver.disconnect();\n\n runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n type,\n slot,\n parameters,\n format,\n name,\n data,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n pluginOptions,\n isVisible: isInViewport,\n render,\n request,\n dispose,\n processOnEmpty,\n cleanElement,\n options: omit(options, ['context']),\n ...hooks,\n });\n\n watch(\n state,\n (newState) => {\n slotContext.value = newState;\n },\n {\n deep: true,\n immediate: true,\n },\n );\n\n context.hooks.onInit(async () => {\n await runOnInit();\n\n if (status.value === 'empty' || status.value === 'error') {\n return;\n }\n\n if (initialData) {\n status.value = 'loaded';\n\n data.value = initialData;\n data.value = await runOnRequest(initialData);\n\n return;\n }\n\n status.value = 'initialized';\n\n if (options.lazyLoading) {\n return;\n }\n\n data.value = (await slotContext.value?.request()) ?? null;\n });\n\n return state;\n })!;\n}\n"],"names":["extRequestAd"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@adhese/sdk",
3
3
  "type": "module",
4
- "version": "1.8.1",
4
+ "version": "1.8.2",
5
5
  "description": "Adhese SDK",
6
6
  "license": "GPL-3.0",
7
7
  "repository": {