@adhese/sdk 0.20.1 → 0.21.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.
Files changed (79) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/consent/consent.cjs +37 -0
  3. package/dist/cjs/consent/consent.cjs.map +1 -0
  4. package/dist/cjs/findDomSlots/findDomSlots.cjs +28 -0
  5. package/dist/cjs/findDomSlots/findDomSlots.cjs.map +1 -0
  6. package/dist/cjs/hooks.cjs +55 -0
  7. package/dist/cjs/hooks.cjs.map +1 -0
  8. package/dist/cjs/index.cjs +5 -0
  9. package/dist/cjs/index.cjs.map +1 -0
  10. package/dist/cjs/logger/logger.cjs +9 -0
  11. package/dist/cjs/logger/logger.cjs.map +1 -0
  12. package/dist/cjs/main.cjs +120 -0
  13. package/dist/cjs/main.cjs.map +1 -0
  14. package/dist/cjs/main.composables.cjs +61 -0
  15. package/dist/cjs/main.composables.cjs.map +1 -0
  16. package/dist/cjs/main.utils.cjs +25 -0
  17. package/dist/cjs/main.utils.cjs.map +1 -0
  18. package/dist/cjs/package.json.cjs +7 -0
  19. package/dist/cjs/package.json.cjs.map +1 -0
  20. package/dist/cjs/queryDetector/queryDetector.cjs +37 -0
  21. package/dist/cjs/queryDetector/queryDetector.cjs.map +1 -0
  22. package/dist/cjs/requestAds/requestAds.cjs +81 -0
  23. package/dist/cjs/requestAds/requestAds.cjs.map +1 -0
  24. package/dist/cjs/requestAds/requestAds.preview.cjs +52 -0
  25. package/dist/cjs/requestAds/requestAds.preview.cjs.map +1 -0
  26. package/dist/{requestAds.schema-nGqXiJ84.cjs → cjs/requestAds/requestAds.schema.cjs} +1 -1
  27. package/dist/cjs/requestAds/requestAds.schema.cjs.map +1 -0
  28. package/dist/cjs/requestAds/requestAds.utils.cjs +54 -0
  29. package/dist/cjs/requestAds/requestAds.utils.cjs.map +1 -0
  30. package/dist/cjs/slot/slot.cjs +229 -0
  31. package/dist/cjs/slot/slot.cjs.map +1 -0
  32. package/dist/cjs/slot/slot.composables.cjs +125 -0
  33. package/dist/cjs/slot/slot.composables.cjs.map +1 -0
  34. package/dist/cjs/slot/slot.utils.cjs +31 -0
  35. package/dist/cjs/slot/slot.utils.cjs.map +1 -0
  36. package/dist/cjs/slotManager/slotManager.cjs +75 -0
  37. package/dist/cjs/slotManager/slotManager.cjs.map +1 -0
  38. package/dist/consent/consent.js +37 -0
  39. package/dist/consent/consent.js.map +1 -0
  40. package/dist/findDomSlots/findDomSlots.js +28 -0
  41. package/dist/findDomSlots/findDomSlots.js.map +1 -0
  42. package/dist/hooks.js +55 -0
  43. package/dist/hooks.js.map +1 -0
  44. package/dist/index.js +1 -910
  45. package/dist/index.js.map +1 -1
  46. package/dist/logger/logger.js +9 -0
  47. package/dist/logger/logger.js.map +1 -0
  48. package/dist/main.composables.js +61 -0
  49. package/dist/main.composables.js.map +1 -0
  50. package/dist/main.js +120 -0
  51. package/dist/main.js.map +1 -0
  52. package/dist/main.utils.js +25 -0
  53. package/dist/main.utils.js.map +1 -0
  54. package/dist/package.json.js +7 -0
  55. package/dist/package.json.js.map +1 -0
  56. package/dist/queryDetector/queryDetector.js +37 -0
  57. package/dist/queryDetector/queryDetector.js.map +1 -0
  58. package/dist/requestAds/requestAds.js +81 -0
  59. package/dist/requestAds/requestAds.js.map +1 -0
  60. package/dist/requestAds/requestAds.preview.js +52 -0
  61. package/dist/requestAds/requestAds.preview.js.map +1 -0
  62. package/dist/{requestAds.schema-B71AZ4NL.js → requestAds/requestAds.schema.js} +1 -1
  63. package/dist/requestAds/requestAds.schema.js.map +1 -0
  64. package/dist/requestAds/requestAds.utils.js +54 -0
  65. package/dist/requestAds/requestAds.utils.js.map +1 -0
  66. package/dist/slot/slot.composables.js +125 -0
  67. package/dist/slot/slot.composables.js.map +1 -0
  68. package/dist/slot/slot.js +229 -0
  69. package/dist/slot/slot.js.map +1 -0
  70. package/dist/slot/slot.utils.js +31 -0
  71. package/dist/slot/slot.utils.js.map +1 -0
  72. package/dist/slotManager/slotManager.js +75 -0
  73. package/dist/slotManager/slotManager.js.map +1 -0
  74. package/package.json +3 -3
  75. package/dist/index.cjs +0 -914
  76. package/dist/index.cjs.map +0 -1
  77. package/dist/index.d.ts +0 -654
  78. package/dist/requestAds.schema-B71AZ4NL.js.map +0 -1
  79. package/dist/requestAds.schema-nGqXiJ84.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestAds.preview.cjs","sources":["../../../src/requestAds/requestAds.preview.ts"],"sourcesContent":["import { logger } from '../logger/logger';\nimport type { AdheseAd } from './requestAds.schema';\n\n/**\n * Request preview ads for the given account. This function will only return items when there are preview objects in the\n * URL detected.\n */\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<AdheseAd>> {\n const previewObjects = getPreviewObjects();\n\n const [list, adSchema] = await Promise.all([\n Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })),\n import('./requestAds.schema').then(module => module.adSchema),\n ]);\n\n return adSchema.array().parse(list\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .flatMap(response => response.value.map(item => ({\n ...item,\n preview: true,\n })))) as ReadonlyArray<AdheseAd>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n"],"names":["module","logger"],"mappings":";;;AAOA,eAAsB,gBAAgB,SAAmD;AACvF,QAAM,iBAAiB;AAEvB,QAAM,CAAC,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzC,QAAQ,WAAW,eAChB,OAAO,CAAA,kBAAiB,6BAA6B,aAAa,EAClE,IAAI,OAAO,kBAAkB;AAC5B,YAAM,WAAW,IAAI,IAAI,WAAW,OAAO,mDAAmD;AAC9F,eAAS,aAAa;AAAA,QACpB;AAAA,QACA,cAAc;AAAA,MAAA;AAGhB,YAAM,WAAW,MAAM,MAAM,SAAS,MAAM;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,MAAA,CACD;AAED,UAAI,CAAC,SAAS;AACL,eAAA,QAAQ,OAAO,IAAI,MAAM,yCAAyC,cAAc,uBAAuB,EAAE,CAAC;AAE5G,aAAA,MAAM,SAAS;IAAK,CAC5B,CAAC;AAAA,IACJ,QAAO,QAAA,EAAA,KAAA,MAAA,QAAA,yBAAqB,CAAA,EAAE,KAAK,CAAAA,YAAUA,QAAO,QAAQ;AAAA,EAAA,CAC7D;AAED,SAAO,SAAS,QAAQ,MAAM,KAC3B,OAAO,CAAC,aAAyF;AAC5F,QAAA,SAAS,WAAW,YAAY;AAC3BC,aAAAA,OAAA,MAAM,SAAS,MAAgB;AAC/B,aAAA;AAAA,IACT;AACA,WAAO,SAAS,WAAW;AAAA,EAAA,CAC5B,EACA,QAAQ,cAAY,SAAS,MAAM,IAAI,CAAS,UAAA;AAAA,IAC/C,GAAG;AAAA,IACH,SAAS;AAAA,EAAA,EACT,CAAC,CAAC;AACR;AAEA,SAAS,oBAA2D;AAClE,QAAM,aAAa,IAAI,IAAI,OAAO,SAAS,IAAI;AAE/C,QAAM,iBAAgD,CAAA;AACtD,MAAI,gBAAwC,CAAA;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,WAAW,aAAa,WAAW;AAC5D,QAAI,QAAQ,6BAA6B,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AAC9E,qBAAe,KAAK,aAAa;AACjC,sBAAgB,CAAA;AAAA,IAClB;AAEA,kBAAc,GAAG,IAAI;AAAA,EACvB;AAEA,MAAI,OAAO,KAAK,aAAa,EAAE,SAAS;AACtC,mBAAe,KAAK,aAAa;AAE5B,SAAA;AACT;;"}
@@ -100,4 +100,4 @@ exports.adSchema = adSchema;
100
100
  exports.daleSchema = daleSchema;
101
101
  exports.jerliciaSchema = jerliciaSchema;
102
102
  exports.parseResponse = parseResponse;
103
- //# sourceMappingURL=requestAds.schema-nGqXiJ84.cjs.map
103
+ //# sourceMappingURL=requestAds.schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestAds.schema.cjs","sources":["../../../src/requestAds/requestAds.schema.ts"],"sourcesContent":["import {\n type TypeOf,\n type ZodType,\n booleanLike,\n cssValueLike,\n dateLike,\n isJsonOrHtmlOptionalString,\n isJsonOrHtmlString,\n lazy,\n literal,\n numberLike,\n object,\n string,\n union,\n unknown,\n urlLike,\n} from '@adhese/sdk-shared/validators';\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string().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 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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"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ const logger = require("../logger/logger.cjs");
5
+ function requestWithPost({
6
+ context,
7
+ ...options
8
+ }) {
9
+ const payload = {
10
+ ...options,
11
+ slots: options.slots.map((slot) => ({
12
+ slotname: sdkShared.toValue(slot.name),
13
+ parameters: parseParameters(slot.parameters)
14
+ })),
15
+ parameters: context.parameters && parseParameters(context.parameters)
16
+ };
17
+ return fetch(`${new URL(context.options.host).href}json`, {
18
+ method: "POST",
19
+ body: JSON.stringify(payload),
20
+ headers: {
21
+ // eslint-disable-next-line ts/naming-convention
22
+ "Content-Type": "application/json"
23
+ }
24
+ });
25
+ }
26
+ async function requestWithGet({ context, slots }) {
27
+ return fetch(new URL(`${context.options.host}/json/sl${slots.map((slot) => sdkShared.toValue(slot.name)).join("/sl")}`), {
28
+ method: "GET",
29
+ headers: {
30
+ // eslint-disable-next-line ts/naming-convention
31
+ "Content-Type": "application/json"
32
+ }
33
+ });
34
+ }
35
+ function parseParameters(parameters) {
36
+ return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {
37
+ if (key.length === 2)
38
+ return true;
39
+ logger.logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);
40
+ return false;
41
+ }).map(([key, value]) => {
42
+ if (typeof value === "string")
43
+ return [key, filterSpecialChars(value)];
44
+ return [key, value.map(filterSpecialChars)];
45
+ }));
46
+ }
47
+ function filterSpecialChars(value) {
48
+ const specialRegex = /[^\p{L}\p{N}_]/gu;
49
+ return value.replaceAll(specialRegex, "_");
50
+ }
51
+ exports.parseParameters = parseParameters;
52
+ exports.requestWithGet = requestWithGet;
53
+ exports.requestWithPost = requestWithPost;
54
+ //# sourceMappingURL=requestAds.utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestAds.utils.cjs","sources":["../../../src/requestAds/requestAds.utils.ts"],"sourcesContent":["import { toValue } from '@adhese/sdk-shared';\nimport { logger } from '../logger/logger';\nimport type { AdMultiRequestOptions } from './requestAds';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context,\n ...options\n}: Omit<AdMultiRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: context.parameters && parseParameters(context.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(context.options.host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdMultiRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }).map(([key, value]): [string, T] => {\n if (typeof value === 'string')\n return [key, filterSpecialChars(value) as T];\n\n return [key, value.map(filterSpecialChars) as unknown as T];\n }));\n}\n\nfunction filterSpecialChars(value: string): string {\n const specialRegex = /[^\\p{L}\\p{N}_]/gu;\n\n return value.replaceAll(specialRegex, '_');\n}\n"],"names":["toValue","logger"],"mappings":";;;;AAYO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAA6D;AAC3D,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,OAAO,QAAQ,MAAM,IAAI,CAAS,UAAA;AAAA,MAChC,UAAUA,UAAAA,QAAQ,KAAK,IAAI;AAAA,MAC3B,YAAY,gBAAgB,KAAK,UAAU;AAAA,IAAA,EAC3C;AAAA,IACF,YAAY,QAAQ,cAAc,gBAAgB,QAAQ,UAAU;AAAA,EAAA;AAG/D,SAAA,MAAM,GAAG,IAAI,IAAI,QAAQ,QAAQ,IAAI,EAAE,IAAI,QAAQ;AAAA,IACxD,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC5B,SAAS;AAAA;AAAA,MAEP,gBAAgB;AAAA,IAClB;AAAA,EAAA,CACD;AACH;AAEA,eAAsB,eAAe,EAAE,SAAS,SAAmE;AAC1G,SAAA,MAAM,IAAI,IAAI,GAAG,QAAQ,QAAQ,IAAI,WAAW,MAAM,IAAI,UAAQA,UAAAA,QAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,GAAG;AAAA,IAC3G,QAAQ;AAAA,IACR,SAAS;AAAA;AAAA,MAEP,gBAAgB;AAAA,IAClB;AAAA,EAAA,CACD;AACH;AAEO,SAAS,gBAA0D,YAA+C;AACvH,SAAO,OAAO,YAAY,MAAM,KAAK,WAAW,QAAA,CAAS,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM;AAC3E,QAAI,IAAI,WAAW;AACV,aAAA;AAEFC,WAAA,OAAA,KAAK,0BAA0B,GAAG,iEAAiE;AACnG,WAAA;AAAA,EACR,CAAA,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAmB;AACpC,QAAI,OAAO,UAAU;AACnB,aAAO,CAAC,KAAK,mBAAmB,KAAK,CAAM;AAE7C,WAAO,CAAC,KAAK,MAAM,IAAI,kBAAkB,CAAiB;AAAA,EAC3D,CAAA,CAAC;AACJ;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,eAAe;AAEd,SAAA,MAAM,WAAW,cAAc,GAAG;AAC3C;;;;"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ const requestAds = require("../requestAds/requestAds.cjs");
5
+ const logger = require("../logger/logger.cjs");
6
+ const queryDetector = require("../queryDetector/queryDetector.cjs");
7
+ const slot_utils = require("./slot.utils.cjs");
8
+ const slot_composables = require("./slot.composables.cjs");
9
+ const renderFunctions = {
10
+ iframe: slot_utils.renderIframe,
11
+ inline: slot_utils.renderInline,
12
+ none: sdkShared.doNothing
13
+ };
14
+ const defaultOptions = {
15
+ renderMode: "iframe",
16
+ type: "normal"
17
+ };
18
+ function createSlot(slotOptions) {
19
+ const scope = sdkShared.effectScope();
20
+ return scope.run(() => {
21
+ const slotContext = sdkShared.ref(null);
22
+ const options = slotOptions.context.hooks.runOnSlotCreate({
23
+ ...defaultOptions,
24
+ ...slotOptions
25
+ });
26
+ const {
27
+ containingElement,
28
+ slot,
29
+ context,
30
+ pluginOptions,
31
+ renderMode = "iframe",
32
+ type = "normal"
33
+ } = options;
34
+ const id = sdkShared.uniqueId();
35
+ const {
36
+ runOnBeforeRender,
37
+ runOnRender,
38
+ runOnBeforeRequest,
39
+ runOnRequest,
40
+ runOnInit,
41
+ runOnDispose,
42
+ ...hooks
43
+ } = slot_composables.useSlotHooks(options, slotContext);
44
+ const isDisposed = sdkShared.ref(false);
45
+ const parameters = sdkShared.reactive(new Map(Object.entries(options.parameters ?? {})));
46
+ const [device, disposeQueryDetector] = queryDetector.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 = sdkShared.computed(() => typeof options.format === "string" ? options.format : device.value);
50
+ const data = sdkShared.ref(null);
51
+ const originalData = sdkShared.ref(data.value);
52
+ const name = sdkShared.computed(() => sdkShared.generateName(options.context.location, format.value, options.slot));
53
+ sdkShared.watch(name, async (newName, oldName) => {
54
+ var _a, _b;
55
+ if (newName === oldName)
56
+ return;
57
+ const newAd = await ((_a = slotContext.value) == null ? void 0 : _a.request());
58
+ if (!newAd)
59
+ return;
60
+ (_b = slotContext.value) == null ? void 0 : _b.cleanElement();
61
+ data.value = newAd;
62
+ originalData.value = newAd;
63
+ });
64
+ const isDomLoaded = slot_composables.useDomLoaded(context);
65
+ const element = sdkShared.computed(
66
+ () => {
67
+ var _a;
68
+ if (!(typeof options.containingElement === "string" || !options.containingElement))
69
+ return options.containingElement;
70
+ if (!isDomLoaded.value || ((_a = slotContext.value) == null ? void 0 : _a.isDisposed))
71
+ return null;
72
+ return document.querySelector(`.adunit[data-format="${format.value}"]#${options.containingElement}${options.slot ? `[data-slot="${options.slot}"]` : ""}`);
73
+ }
74
+ );
75
+ const isInViewport = slot_composables.useRenderIntersectionObserver({
76
+ options,
77
+ element,
78
+ hooks
79
+ });
80
+ const status = sdkShared.ref("initializing");
81
+ sdkShared.watch([data, isInViewport], async ([newData, newIsInViewport], [oldData]) => {
82
+ var _a;
83
+ if ((!newData || oldData && sdkShared.isDeepEqual(newData, oldData)) && status.value === "rendered")
84
+ return;
85
+ if (newIsInViewport)
86
+ await ((_a = slotContext.value) == null ? void 0 : _a.render(newData ?? void 0));
87
+ });
88
+ hooks.onDispose(() => {
89
+ disposeQueryDetector();
90
+ });
91
+ const isViewabilityTracked = slot_composables.useViewabilityObserver({
92
+ context,
93
+ slotContext,
94
+ hooks,
95
+ onTracked(trackingPixel) {
96
+ var _a, _b, _c, _d, _e;
97
+ if ((_b = (_a = slotContext.value) == null ? void 0 : _a.data) == null ? void 0 : _b.viewableImpressionCounter) {
98
+ trackingPixel.value = sdkShared.addTrackingPixel((_d = (_c = slotContext.value) == null ? void 0 : _c.data) == null ? void 0 : _d.viewableImpressionCounter);
99
+ context.logger.debug(`Viewability tracking pixel fired for ${(_e = slotContext.value) == null ? void 0 : _e.name}`);
100
+ }
101
+ }
102
+ });
103
+ const impressionTrackingPixelElement = sdkShared.ref(null);
104
+ const isImpressionTracked = sdkShared.ref(false);
105
+ hooks.onDispose(() => {
106
+ if (impressionTrackingPixelElement.value)
107
+ impressionTrackingPixelElement.value.remove();
108
+ });
109
+ async function request() {
110
+ if (options.lazyLoading && !isInViewport.value)
111
+ return null;
112
+ status.value = "loading";
113
+ let response = await runOnBeforeRequest(null);
114
+ if (!response) {
115
+ response = await requestAds.requestAd({
116
+ slot: {
117
+ name: name.value,
118
+ parameters
119
+ },
120
+ context
121
+ });
122
+ }
123
+ if (response)
124
+ response = await runOnRequest(response);
125
+ data.value = response;
126
+ if (!originalData.value)
127
+ originalData.value = response;
128
+ status.value = response ? "loaded" : "empty";
129
+ if (!response)
130
+ cleanElement();
131
+ return response;
132
+ }
133
+ async function render(adToRender) {
134
+ status.value = "rendering";
135
+ await sdkShared.waitForDomLoad();
136
+ let renderAd = adToRender ?? data.value ?? originalData.value ?? await request();
137
+ renderAd = renderAd && await runOnBeforeRender(renderAd);
138
+ if (!renderAd) {
139
+ status.value = "empty";
140
+ logger.logger.debug(`No ad to render for slot ${name.value}`);
141
+ return null;
142
+ }
143
+ if (!element.value) {
144
+ const error = `Could not create slot for format ${format.value}. No element found.`;
145
+ logger.logger.error(error, options);
146
+ throw new Error(error);
147
+ }
148
+ if (context.debug)
149
+ element.value.style.position = "relative";
150
+ if (typeof (renderAd == null ? void 0 : renderAd.tag) !== "string") {
151
+ const error = `Could not render slot for slot ${name.value}. A valid tag doesn't exist or is not HTML string.`;
152
+ logger.logger.error(error, options);
153
+ status.value = "error";
154
+ throw new Error(error);
155
+ }
156
+ renderFunctions[renderMode](renderAd, element.value);
157
+ if (renderAd.impressionCounter && !impressionTrackingPixelElement.value)
158
+ impressionTrackingPixelElement.value = sdkShared.addTrackingPixel(renderAd.impressionCounter);
159
+ isImpressionTracked.value = true;
160
+ logger.logger.debug(`Slot rendered ${name.value}`, {
161
+ renderedElement: element,
162
+ location: context.location,
163
+ format,
164
+ containingElement
165
+ });
166
+ data.value = renderAd;
167
+ status.value = "rendered";
168
+ runOnRender(renderAd);
169
+ return element.value;
170
+ }
171
+ function cleanElement() {
172
+ if (!element.value)
173
+ return;
174
+ element.value.innerHTML = "";
175
+ element.value.style.position = "";
176
+ element.value.style.width = "";
177
+ element.value.style.height = "";
178
+ data.value = null;
179
+ originalData.value = null;
180
+ }
181
+ function dispose() {
182
+ cleanElement();
183
+ data.value = null;
184
+ runOnDispose();
185
+ isDisposed.value = true;
186
+ scope.stop();
187
+ }
188
+ const state = sdkShared.reactive({
189
+ location: context.location ?? "",
190
+ lazyLoading: options.lazyLoading ?? false,
191
+ type,
192
+ slot,
193
+ parameters,
194
+ format,
195
+ name,
196
+ data,
197
+ isViewabilityTracked,
198
+ isImpressionTracked,
199
+ status,
200
+ element,
201
+ isDisposed,
202
+ id,
203
+ pluginOptions,
204
+ render,
205
+ request,
206
+ dispose,
207
+ cleanElement,
208
+ options: sdkShared.omit(options, ["context"]),
209
+ ...hooks
210
+ });
211
+ sdkShared.watch(state, (newState) => {
212
+ slotContext.value = newState;
213
+ }, {
214
+ deep: true,
215
+ immediate: true
216
+ });
217
+ context.hooks.onInit(async () => {
218
+ var _a;
219
+ status.value = "initialized";
220
+ runOnInit();
221
+ if (options.lazyLoading)
222
+ return;
223
+ data.value = await ((_a = slotContext.value) == null ? void 0 : _a.request()) ?? null;
224
+ });
225
+ return state;
226
+ });
227
+ }
228
+ exports.createSlot = createSlot;
229
+ //# sourceMappingURL=slot.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot.cjs","sources":["../../../src/slot/slot.ts"],"sourcesContent":["import {\n type Ref,\n type UnwrapRef,\n addTrackingPixel,\n computed,\n doNothing,\n effectScope,\n generateName,\n isDeepEqual,\n omit,\n reactive,\n ref,\n uniqueId,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd } from '@adhese/sdk';\nimport { requestAd as extRequestAd } from '../requestAds/requestAds';\nimport { logger } from '../logger/logger';\nimport { useQueryDetector } from '../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotContext, AdheseSlotOptions, RenderMode } from './slot.types';\nimport { renderIframe, renderInline } from './slot.utils';\nimport {\n useDomLoaded,\n useRenderIntersectionObserver,\n useSlotHooks,\n useViewabilityObserver,\n} from './slot.composables';\n\nconst renderFunctions: Record<RenderMode, (ad: AdheseAd, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n none: doNothing,\n};\n\nconst defaultOptions = {\n renderMode: 'iframe',\n type: 'normal',\n} satisfies Partial<AdheseSlotOptions>;\n\n/**\n * Create a new slot instance. This slot instance can be used to request and render ads.\n *\n * @param slotOptions {AdheseSlotOptions} The options to create the slot with.\n *\n * @return AdheseSlot The created slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): AdheseSlot {\n const scope = effectScope();\n\n return scope.run(() => {\n const slotContext = ref<AdheseSlotContext | null>(null);\n const options = slotOptions.context.hooks.runOnSlotCreate({\n ...defaultOptions,\n ...slotOptions,\n });\n\n const {\n containingElement,\n slot,\n context,\n pluginOptions,\n renderMode = 'iframe',\n type = 'normal',\n } = options;\n\n const id = uniqueId();\n const {\n runOnBeforeRender,\n runOnRender,\n runOnBeforeRequest,\n runOnRequest,\n runOnInit,\n runOnDispose,\n ...hooks\n } = useSlotHooks(options, slotContext);\n\n const isDisposed = ref(false);\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n\n const [device, disposeQueryDetector] = useQueryDetector(context, typeof options.format === 'string'\n ? {\n [options.format]: '(min-width: 0px)',\n }\n : Object.fromEntries(options.format.map(item => [item.format, item.query])));\n\n const format = computed(() => typeof options.format === 'string' ? options.format : device.value);\n\n const data = ref<AdheseAd | null>(null) as Ref<AdheseAd | null>;\n const originalData = ref(data.value) as Ref<AdheseAd | null>;\n const name = computed(() => generateName(options.context.location, format.value, options.slot));\n\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n const newAd = await slotContext.value?.request();\n\n if (!newAd)\n return;\n\n slotContext.value?.cleanElement();\n\n data.value = newAd;\n originalData.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded(context);\n\n const element = computed(() => {\n if (!(typeof options.containingElement === 'string' || !options.containingElement))\n return options.containingElement;\n\n if (!isDomLoaded.value || slotContext.value?.isDisposed)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${options.containingElement}${options.slot ? `[data-slot=\"${options.slot}\"]` : ''}`);\n },\n );\n\n const isInViewport = useRenderIntersectionObserver({\n options,\n element,\n hooks,\n });\n\n const status = ref<UnwrapRef<AdheseSlot>['status']>('initializing');\n\n watch([data, isInViewport], async ([newData, newIsInViewport], [oldData]) => {\n if ((!newData || (oldData && isDeepEqual(newData, oldData))) && status.value === 'rendered')\n return;\n\n if (newIsInViewport)\n await slotContext.value?.render(newData ?? undefined);\n });\n\n hooks.onDispose(() => {\n disposeQueryDetector();\n });\n\n const isViewabilityTracked = useViewabilityObserver({\n context,\n slotContext,\n hooks,\n onTracked(trackingPixel) {\n if (slotContext.value?.data?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(slotContext.value?.data?.viewableImpressionCounter);\n\n context.logger.debug(`Viewability tracking pixel fired for ${slotContext.value?.name}`);\n }\n },\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = ref(false);\n hooks.onDispose(() => {\n if (impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value.remove();\n });\n\n async function request(): Promise<AdheseAd | null> {\n if (options.lazyLoading && !isInViewport.value)\n return null;\n\n status.value = 'loading';\n\n let response = await runOnBeforeRequest(null);\n\n if (!response) {\n response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n }\n\n if (response)\n response = await runOnRequest(response);\n\n data.value = response;\n\n if (!originalData.value)\n originalData.value = response;\n\n status.value = response ? 'loaded' : 'empty';\n\n if (!response)\n cleanElement();\n\n return response;\n }\n\n async function render(adToRender?: AdheseAd): Promise<HTMLElement | null> {\n status.value = 'rendering';\n\n await waitForDomLoad();\n\n let renderAd = adToRender ?? data.value ?? originalData.value ?? await request();\n\n renderAd = renderAd && await runOnBeforeRender(renderAd);\n\n if (!renderAd) {\n status.value = 'empty';\n logger.debug(`No ad to render for slot ${name.value}`);\n\n return null;\n }\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (typeof renderAd?.tag !== 'string') {\n const error = `Could not render slot for slot ${name.value}. A valid tag doesn't exist or is not HTML string.`;\n logger.error(error, options);\n\n status.value = 'error';\n throw new Error(error);\n }\n\n renderFunctions[renderMode](renderAd, element.value);\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value)\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n isImpressionTracked.value = true;\n\n logger.debug(`Slot rendered ${name.value}`, {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n // eslint-disable-next-line require-atomic-updates\n data.value = renderAd;\n\n status.value = 'rendered';\n\n runOnRender(renderAd);\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n\n data.value = null;\n originalData.value = null;\n }\n\n function dispose(): void {\n cleanElement();\n\n data.value = null;\n\n runOnDispose();\n\n isDisposed.value = true;\n\n scope.stop();\n }\n\n const state = reactive({\n location: context.location ?? '',\n lazyLoading: options.lazyLoading ?? false,\n type,\n slot,\n parameters,\n format,\n name,\n data,\n isViewabilityTracked,\n isImpressionTracked,\n status,\n element,\n isDisposed,\n id,\n pluginOptions,\n render,\n request,\n dispose,\n cleanElement,\n 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 status.value = 'initialized';\n\n runOnInit();\n\n if (options.lazyLoading)\n return;\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","useRenderIntersectionObserver","isDeepEqual","useViewabilityObserver","addTrackingPixel","extRequestAd","waitForDomLoad","logger","omit"],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ function useDomLoaded(context) {
5
+ const isDomLoaded = sdkShared.ref(false);
6
+ context.hooks.onInit(async () => {
7
+ await sdkShared.waitForDomLoad();
8
+ isDomLoaded.value = true;
9
+ });
10
+ return isDomLoaded;
11
+ }
12
+ function useRenderIntersectionObserver({ options, element, hooks }) {
13
+ var _a;
14
+ const isInViewport = sdkShared.ref(false);
15
+ const renderIntersectionObserver = new IntersectionObserver((entries) => {
16
+ isInViewport.value = entries.some((entry) => entry.isIntersecting);
17
+ }, {
18
+ rootMargin: ((_a = options.lazyLoadingOptions) == null ? void 0 : _a.rootMargin) ?? "200px",
19
+ threshold: 0
20
+ });
21
+ function observe(newElement, oldElement) {
22
+ if (oldElement)
23
+ renderIntersectionObserver.unobserve(oldElement);
24
+ if (newElement)
25
+ renderIntersectionObserver.observe(newElement);
26
+ return () => {
27
+ if (newElement)
28
+ renderIntersectionObserver.unobserve(newElement);
29
+ };
30
+ }
31
+ sdkShared.watch(element, observe);
32
+ observe(element.value);
33
+ hooks.onDispose(() => {
34
+ renderIntersectionObserver.disconnect();
35
+ });
36
+ return isInViewport;
37
+ }
38
+ function useViewabilityObserver({ context, slotContext, hooks, onTracked }) {
39
+ let timeoutId = null;
40
+ const {
41
+ threshold,
42
+ duration,
43
+ rootMargin
44
+ } = {
45
+ threshold: 0.2,
46
+ duration: 1e3,
47
+ rootMargin: "0px",
48
+ ...context.options.viewabilityTrackingOptions
49
+ };
50
+ const trackingPixel = sdkShared.ref(null);
51
+ const isTracked = sdkShared.ref(false);
52
+ const viewabilityObserver = new IntersectionObserver(([entry]) => {
53
+ if (context.options.viewabilityTracking && !trackingPixel.value) {
54
+ const ratio = sdkShared.round(entry.intersectionRatio, 1);
55
+ if (ratio >= threshold && !timeoutId) {
56
+ timeoutId = setTimeout(() => {
57
+ timeoutId = null;
58
+ onTracked == null ? void 0 : onTracked(trackingPixel);
59
+ isTracked.value = true;
60
+ }, duration);
61
+ } else if (ratio < threshold && timeoutId) {
62
+ clearTimeout(timeoutId);
63
+ timeoutId = null;
64
+ }
65
+ }
66
+ }, {
67
+ rootMargin,
68
+ threshold: Array.from({ length: 11 }, (_, i) => i * 0.1)
69
+ });
70
+ function observe(newElement, oldElement) {
71
+ if (newElement && context.options.viewabilityTracking)
72
+ viewabilityObserver.observe(newElement);
73
+ return () => {
74
+ if (newElement)
75
+ viewabilityObserver.unobserve(newElement);
76
+ };
77
+ }
78
+ sdkShared.watch(() => {
79
+ var _a;
80
+ return (_a = slotContext.value) == null ? void 0 : _a.element;
81
+ }, (element) => {
82
+ if (element)
83
+ observe(element);
84
+ }, { immediate: true });
85
+ sdkShared.watch(slotContext, (slot) => {
86
+ if (slot == null ? void 0 : slot.element)
87
+ viewabilityObserver.observe(slot.element);
88
+ }, { once: true });
89
+ hooks.onDispose(() => {
90
+ var _a;
91
+ (_a = trackingPixel.value) == null ? void 0 : _a.remove();
92
+ viewabilityObserver.disconnect();
93
+ });
94
+ return isTracked;
95
+ }
96
+ function useSlotHooks({ setup }, slotContext) {
97
+ const [runOnBeforeRender, onBeforeRender, disposeOnBeforeRender] = sdkShared.createAsyncHook();
98
+ const [runOnRender, onRender, disposeOnRender] = sdkShared.createPassiveHook();
99
+ const [runOnBeforeRequest, onBeforeRequest, disposeOnBeforeRequest] = sdkShared.createAsyncHook();
100
+ const [runOnRequest, onRequest, disposeOnRequest] = sdkShared.createAsyncHook();
101
+ const [runOnInit, onInit, disposeOnInit] = sdkShared.createPassiveHook();
102
+ const [runOnDispose, onDispose, disposeOnDispose] = sdkShared.createPassiveHook();
103
+ setup == null ? void 0 : setup(slotContext, {
104
+ onBeforeRender,
105
+ onRender,
106
+ onBeforeRequest,
107
+ onDispose,
108
+ onRequest,
109
+ onInit
110
+ });
111
+ onDispose(() => {
112
+ disposeOnBeforeRender();
113
+ disposeOnRender();
114
+ disposeOnBeforeRequest();
115
+ disposeOnRequest();
116
+ disposeOnInit();
117
+ disposeOnDispose();
118
+ });
119
+ return { runOnBeforeRender, runOnRender, runOnBeforeRequest, runOnRequest, runOnDispose, onDispose, onBeforeRequest, onRequest, onBeforeRender, onRender, onInit, runOnInit };
120
+ }
121
+ exports.useDomLoaded = useDomLoaded;
122
+ exports.useRenderIntersectionObserver = useRenderIntersectionObserver;
123
+ exports.useSlotHooks = useSlotHooks;
124
+ exports.useViewabilityObserver = useViewabilityObserver;
125
+ //# sourceMappingURL=slot.composables.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot.composables.cjs","sources":["../../../src/slot/slot.composables.ts"],"sourcesContent":["import {\n type Ref,\n createAsyncHook,\n createPassiveHook,\n ref,\n round,\n waitForDomLoad,\n watch,\n} from '@adhese/sdk-shared';\nimport type { AdheseAd, AdheseContext, AdheseSlot, AdheseSlotContext, AdheseSlotHooks, AdheseSlotOptions } from '@adhese/sdk';\n\nexport function useDomLoaded(context: AdheseContext): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n context.hooks.onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n\nexport function useRenderIntersectionObserver({ options, element, hooks }: {\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n hooks: AdheseSlotHooks;\n}): Ref<boolean> {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n hooks.onDispose(() => {\n renderIntersectionObserver.disconnect();\n });\n\n return isInViewport;\n}\n\nexport function useViewabilityObserver(\n { context, slotContext, hooks, onTracked }: {\n context: AdheseContext;\n slotContext: Ref<AdheseSlot | null>;\n hooks: AdheseSlotHooks;\n onTracked?(trackingPixel: Ref<HTMLImageElement | null>): void;\n },\n): Ref<boolean> {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = ref(false);\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n onTracked?.(trackingPixel);\n\n isTracked.value = true;\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(() => slotContext.value?.element, (element) => {\n if (element)\n observe(element);\n }, { immediate: true });\n\n watch(slotContext, (slot) => {\n if (slot?.element)\n viewabilityObserver.observe(slot.element);\n }, { once: true });\n\n hooks.onDispose(() => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n });\n\n return isTracked;\n}\n\nexport function useSlotHooks({ setup }: AdheseSlotOptions, slotContext: Ref<AdheseSlotContext | null>): {\n runOnBeforeRender: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnRender: ReturnType<typeof createPassiveHook<AdheseAd>>[0];\n runOnBeforeRequest: ReturnType<typeof createAsyncHook<AdheseAd | null>>[0];\n runOnRequest: ReturnType<typeof createAsyncHook<AdheseAd>>[0];\n runOnInit: ReturnType<typeof createPassiveHook<void>>[0];\n runOnDispose: ReturnType<typeof createPassiveHook<void>>[0];\n} & AdheseSlotHooks {\n const [runOnBeforeRender, onBeforeRender, disposeOnBeforeRender] = createAsyncHook<AdheseAd>();\n const [runOnRender, onRender, disposeOnRender] = createPassiveHook<AdheseAd>();\n const [runOnBeforeRequest, onBeforeRequest, disposeOnBeforeRequest] = createAsyncHook<AdheseAd | null>();\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdheseAd>();\n const [runOnInit, onInit, disposeOnInit] = createPassiveHook();\n const [runOnDispose, onDispose, disposeOnDispose] = createPassiveHook();\n\n setup?.(slotContext, {\n onBeforeRender,\n onRender,\n onBeforeRequest,\n onDispose,\n onRequest,\n onInit,\n });\n\n onDispose(() => {\n disposeOnBeforeRender();\n disposeOnRender();\n disposeOnBeforeRequest();\n disposeOnRequest();\n disposeOnInit();\n disposeOnDispose();\n });\n\n return { runOnBeforeRender, runOnRender, runOnBeforeRequest, runOnRequest, runOnDispose, onDispose, onBeforeRequest, onRequest, onBeforeRender, onRender, onInit, runOnInit };\n}\n"],"names":["ref","waitForDomLoad","watch","round","createAsyncHook","createPassiveHook"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function renderIframe(ad, element) {
4
+ const iframe = document.createElement("iframe");
5
+ iframe.srcdoc = `
6
+ <!DOCTYPE html>
7
+ <html>
8
+ <head>
9
+ <style>
10
+ body {
11
+ margin: 0;
12
+ padding: 0;
13
+ overflow: hidden;
14
+ }
15
+ </style>
16
+ </head>
17
+ <body>
18
+ ${String(ad.tag)}
19
+ </body>
20
+ `.replaceAll(/\s+/g, " ").trim();
21
+ iframe.style.border = "none";
22
+ iframe.style.width = ad.width ? `${ad.width}px` : "auto";
23
+ iframe.style.height = ad.height ? `${ad.height}px` : "auto";
24
+ element.replaceChildren(iframe);
25
+ }
26
+ function renderInline(ad, element) {
27
+ element.innerHTML = String(ad.tag);
28
+ }
29
+ exports.renderIframe = renderIframe;
30
+ exports.renderInline = renderInline;
31
+ //# sourceMappingURL=slot.utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot.utils.cjs","sources":["../../../src/slot/slot.utils.ts"],"sourcesContent":["import type { AdheseAd } from '@adhese/sdk';\n\nexport function renderIframe(ad: AdheseAd, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: AdheseAd, element: HTMLElement): void {\n element.innerHTML = String(ad.tag);\n}\n"],"names":[],"mappings":";;AAEgB,SAAA,aAAa,IAAc,SAA4B;AAC/D,QAAA,SAAS,SAAS,cAAc,QAAQ;AAE9C,SAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAaN,OAAO,GAAG,GAAG,CAAC;AAAA;AAAA,QAElB,WAAW,QAAQ,GAAG,EAAE,KAAK;AAEnC,SAAO,MAAM,SAAS;AACtB,SAAO,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,KAAK,OAAO;AAClD,SAAO,MAAM,SAAS,GAAG,SAAS,GAAG,GAAG,MAAM,OAAO;AACrD,UAAQ,gBAAgB,MAAM;AAChC;AAEgB,SAAA,aAAa,IAAc,SAA4B;AAC7D,UAAA,YAAY,OAAO,GAAG,GAAG;AACnC;;;"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const findDomSlots = require("../findDomSlots/findDomSlots.cjs");
4
+ const slot = require("../slot/slot.cjs");
5
+ const logger = require("../logger/logger.cjs");
6
+ function createSlotManager({
7
+ initialSlots = [],
8
+ context
9
+ }) {
10
+ context.slots = /* @__PURE__ */ new Map();
11
+ function getAll() {
12
+ return Array.from(context.slots).map(([, slot2]) => slot2);
13
+ }
14
+ function add(options) {
15
+ var _a;
16
+ const slot$1 = slot.createSlot({
17
+ ...options,
18
+ context,
19
+ setup(slotContext, slotHooks) {
20
+ var _a2;
21
+ (_a2 = options.setup) == null ? void 0 : _a2.call(options, slotContext, slotHooks);
22
+ slotHooks.onDispose(() => {
23
+ var _a3;
24
+ context.slots.delete(slot$1.id);
25
+ logger.logger.debug("Slot removed", {
26
+ slot: slot$1
27
+ });
28
+ (_a3 = context.events) == null ? void 0 : _a3.removeSlot.dispatch(slot$1);
29
+ });
30
+ }
31
+ });
32
+ if (get(slot$1.name)) {
33
+ slot$1.dispose();
34
+ throw new Error(`Slot with the name: ${slot$1.name} already exists. Create a new slot with a different format, slot, or the location.`);
35
+ }
36
+ context.slots.set(slot$1.id, slot$1);
37
+ logger.logger.debug("Slot added", {
38
+ slot: slot$1,
39
+ slots: Array.from(context.slots.values())
40
+ });
41
+ (_a = context.events) == null ? void 0 : _a.addSlot.dispatch(slot$1);
42
+ return slot$1;
43
+ }
44
+ async function findDomSlots$1() {
45
+ const domSlots = await findDomSlots.findDomSlots(
46
+ context
47
+ );
48
+ for (const slot2 of domSlots)
49
+ context.slots.set(slot2.id, slot2);
50
+ return domSlots;
51
+ }
52
+ function get(name) {
53
+ return getAll().find((slot2) => slot2.name === name);
54
+ }
55
+ function dispose() {
56
+ for (const slot2 of context.slots.values())
57
+ slot2.dispose();
58
+ context.slots.clear();
59
+ }
60
+ for (const options of initialSlots) {
61
+ add({
62
+ ...options,
63
+ lazyLoading: false
64
+ });
65
+ }
66
+ return {
67
+ getAll,
68
+ add,
69
+ findDomSlots: findDomSlots$1,
70
+ get,
71
+ dispose
72
+ };
73
+ }
74
+ exports.createSlotManager = createSlotManager;
75
+ //# sourceMappingURL=slotManager.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slotManager.cjs","sources":["../../../src/slotManager/slotManager.ts"],"sourcesContent":["import type { Merge } from '@adhese/sdk-shared';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\nimport type { AdheseContext } from '../main.types';\nimport { createSlot } from '../slot/slot';\nimport { logger } from '../logger/logger';\nimport type { AdheseSlot, AdheseSlotOptions } from '../slot/slot.types';\n\nexport type AdheseSlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\n/**\n * Creates a new slot manager instance. This slot manager instance can be used to manage all slots in the Adhese\n * instance. It will automatically add all slots that are passed in the `initialSlots` array.\n */\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): AdheseSlotManager {\n context.slots = new Map<string, AdheseSlot>();\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(context.slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n context,\n setup(slotContext, slotHooks) {\n options.setup?.(slotContext, slotHooks);\n\n slotHooks.onDispose(() => {\n context.slots.delete(slot.id);\n logger.debug('Slot removed', {\n slot,\n });\n context.events?.removeSlot.dispatch(slot);\n });\n },\n });\n\n if (get(slot.name)) {\n slot.dispose();\n\n throw new Error(`Slot with the name: ${slot.name} already exists. Create a new slot with a different format, slot, or the location.`);\n }\n\n context.slots.set(slot.id, slot);\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(context.slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n context.slots.set(slot.id, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return getAll().find(slot => slot.name === name);\n }\n\n function dispose(): void {\n for (const slot of context.slots.values())\n slot.dispose();\n\n context.slots.clear();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n}\n"],"names":["slot","createSlot","_a","logger","findDomSlots","extFindDomSlots"],"mappings":";;;;;AA4CO,SAAS,kBAAkB;AAAA,EAChC,eAAe,CAAC;AAAA,EAChB;AACF,GAA0C;AAChC,UAAA,4BAAY;AAEpB,WAAS,SAAoC;AACpC,WAAA,MAAM,KAAK,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAG,EAAAA,KAAI,MAAMA,KAAI;AAAA,EACzD;AAEA,WAAS,IAAI,SAAiF;;AAC5F,UAAMA,SAAOC,KAAAA,WAAW;AAAA,MACtB,GAAG;AAAA,MACH;AAAA,MACA,MAAM,aAAa,WAAW;;AACpB,SAAAC,MAAA,QAAA,UAAA,gBAAAA,IAAA,cAAQ,aAAa;AAE7B,kBAAU,UAAU,MAAM;;AAChB,kBAAA,MAAM,OAAOF,OAAK,EAAE;AAC5BG,iBAAA,OAAO,MAAM,gBAAgB;AAAA,YAAA,MAC3BH;AAAAA,UAAA,CACD;AACO,WAAAE,MAAA,QAAA,WAAA,gBAAAA,IAAQ,WAAW,SAASF;AAAAA,QAAI,CACzC;AAAA,MACH;AAAA,IAAA,CACD;AAEG,QAAA,IAAIA,OAAK,IAAI,GAAG;AAClBA,aAAK,QAAQ;AAEb,YAAM,IAAI,MAAM,uBAAuBA,OAAK,IAAI,oFAAoF;AAAA,IACtI;AAEA,YAAQ,MAAM,IAAIA,OAAK,IAAIA,MAAI;AAE/BG,WAAA,OAAO,MAAM,cAAc;AAAA,MAAA,MACzBH;AAAAA,MACA,OAAO,MAAM,KAAK,QAAQ,MAAM,QAAQ;AAAA,IAAA,CACzC;AAEO,kBAAA,WAAA,mBAAQ,QAAQ,SAASA;AAE1B,WAAAA;AAAAA,EACT;AAEA,iBAAeI,iBAAmD;AAChE,UAAM,WAAW,MAAMC,aAAA;AAAA,MACrB;AAAA,IAAA;AAGF,eAAWL,SAAQ;AACjB,cAAQ,MAAM,IAAIA,MAAK,IAAIA,KAAI;AAE1B,WAAA;AAAA,EACT;AAEA,WAAS,IAAI,MAAsC;AACjD,WAAO,OAAS,EAAA,KAAK,CAAQA,UAAAA,MAAK,SAAS,IAAI;AAAA,EACjD;AAEA,WAAS,UAAgB;AACZ,eAAAA,SAAQ,QAAQ,MAAM,OAAO;AACtC,MAAAA,MAAK,QAAQ;AAEf,YAAQ,MAAM;EAChB;AAEA,aAAW,WAAW,cAAc;AAC9B,QAAA;AAAA,MACF,GAAG;AAAA,MACH,aAAa;AAAA,IAAA,CACd;AAAA,EACH;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IAAA,cACAI;AAAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;"}