@adhese/sdk 0.20.0 → 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 +20 -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-Cr3vDRnz.cjs → cjs/requestAds/requestAds.schema.cjs} +2 -2
  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-BsJYUvgz.js → requestAds/requestAds.schema.js} +2 -2
  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-BsJYUvgz.js.map +0 -1
  79. package/dist/requestAds.schema-Cr3vDRnz.cjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @adhese/sdk
2
2
 
3
+ ## 0.21.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b2dfc1e: Make onRender hook a passive hook, hijacks should go via the onBeforeRender hook from now on
8
+ - b2dfc1e: Add onInit to slots initialisation
9
+
10
+ ### Patch Changes
11
+
12
+ - 10a2c67: Update entry file(s)
13
+ - Updated dependencies [10a2c67]
14
+ - Updated dependencies [de15eab]
15
+ - @adhese/sdk-shared@0.10.0
16
+
17
+ ## 0.20.1
18
+
19
+ ### Patch Changes
20
+
21
+ - b4a1289: Make ID in response optional
22
+
3
23
  ## 0.20.0
4
24
 
5
25
  ### Minor Changes
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ function useConsent(context) {
5
+ const consent = sdkShared.ref("none");
6
+ const consentType = sdkShared.computed(() => consent.value === "none" || consent.value === "all" ? "binary" : "tcf");
7
+ function onTcfConsentChange(data) {
8
+ if (data.tcString)
9
+ consent.value = data.tcString;
10
+ }
11
+ context.hooks.onInit(() => {
12
+ var _a;
13
+ (_a = window.__tcfapi) == null ? void 0 : _a.call(window, "addEventListener", 2, onTcfConsentChange);
14
+ });
15
+ context.hooks.onDispose(() => {
16
+ var _a;
17
+ (_a = window.__tcfapi) == null ? void 0 : _a.call(window, "removeEventListener", 2, onTcfConsentChange);
18
+ });
19
+ sdkShared.watch(() => context.consent, (newConsent) => {
20
+ consent.value = newConsent ? "all" : "none";
21
+ }, { immediate: true });
22
+ sdkShared.watch([consent, consentType], ([newConsent, newConsentType]) => {
23
+ if (newConsentType === "binary") {
24
+ context.parameters.set("tl", newConsent);
25
+ context.parameters.delete("xt");
26
+ } else {
27
+ context.parameters.set("xt", newConsent);
28
+ context.parameters.delete("tl");
29
+ }
30
+ }, { immediate: true });
31
+ sdkShared.watch(consent, (newConsent) => {
32
+ context.consentString = newConsent;
33
+ }, { immediate: true });
34
+ return [consent, consentType];
35
+ }
36
+ exports.useConsent = useConsent;
37
+ //# sourceMappingURL=consent.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.cjs","sources":["../../../src/consent/consent.ts"],"sourcesContent":["import { type ComputedRef, type Ref, computed, ref, watch } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '@adhese/sdk';\nimport type { ConsentData } from '../types';\n\nexport function useConsent(context: AdheseContext): [\n value: Ref<string>,\n type: ComputedRef<'binary' | 'tcf'>,\n] {\n const consent = ref('none');\n const consentType = computed(() => (consent.value === 'none' || consent.value === 'all') ? 'binary' : 'tcf');\n\n function onTcfConsentChange(data: ConsentData): void {\n if (data.tcString)\n consent.value = data.tcString;\n }\n\n context.hooks.onInit(() => {\n window.__tcfapi?.('addEventListener', 2, onTcfConsentChange);\n });\n\n context.hooks.onDispose(() => {\n window.__tcfapi?.('removeEventListener', 2, onTcfConsentChange);\n });\n\n watch(() => context.consent, (newConsent) => {\n consent.value = newConsent ? 'all' : 'none';\n }, { immediate: true });\n\n watch([consent, consentType], ([newConsent, newConsentType]) => {\n if (newConsentType === 'binary') {\n context.parameters.set('tl', newConsent);\n context.parameters.delete('xt');\n }\n else {\n context.parameters.set('xt', newConsent);\n context.parameters.delete('tl');\n }\n }, { immediate: true });\n\n watch(consent, (newConsent) => {\n context.consentString = newConsent;\n }, { immediate: true });\n\n return [consent, consentType];\n}\n"],"names":["ref","computed","watch"],"mappings":";;;AAIO,SAAS,WAAW,SAGzB;AACM,QAAA,UAAUA,cAAI,MAAM;AACpB,QAAA,cAAcC,UAAAA,SAAS,MAAO,QAAQ,UAAU,UAAU,QAAQ,UAAU,QAAS,WAAW,KAAK;AAE3G,WAAS,mBAAmB,MAAyB;AACnD,QAAI,KAAK;AACP,cAAQ,QAAQ,KAAK;AAAA,EACzB;AAEQ,UAAA,MAAM,OAAO,MAAM;;AAClB,iBAAA,aAAA,gCAAW,oBAAoB,GAAG;AAAA,EAAkB,CAC5D;AAEO,UAAA,MAAM,UAAU,MAAM;;AACrB,iBAAA,aAAA,gCAAW,uBAAuB,GAAG;AAAA,EAAkB,CAC/D;AAEDC,YAAAA,MAAM,MAAM,QAAQ,SAAS,CAAC,eAAe;AACnC,YAAA,QAAQ,aAAa,QAAQ;AAAA,EAAA,GACpC,EAAE,WAAW,KAAA,CAAM;AAEhBA,YAAA,MAAA,CAAC,SAAS,WAAW,GAAG,CAAC,CAAC,YAAY,cAAc,MAAM;AAC9D,QAAI,mBAAmB,UAAU;AACvB,cAAA,WAAW,IAAI,MAAM,UAAU;AAC/B,cAAA,WAAW,OAAO,IAAI;AAAA,IAAA,OAE3B;AACK,cAAA,WAAW,IAAI,MAAM,UAAU;AAC/B,cAAA,WAAW,OAAO,IAAI;AAAA,IAChC;AAAA,EAAA,GACC,EAAE,WAAW,KAAA,CAAM;AAEhBA,kBAAA,SAAS,CAAC,eAAe;AAC7B,YAAQ,gBAAgB;AAAA,EAAA,GACvB,EAAE,WAAW,KAAA,CAAM;AAEf,SAAA,CAAC,SAAS,WAAW;AAC9B;;"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ const slot = require("../slot/slot.cjs");
5
+ async function findDomSlots(context) {
6
+ await sdkShared.waitForDomLoad();
7
+ return Array.from(document.querySelectorAll(".adunit")).filter((element) => {
8
+ var _a;
9
+ if (!element.dataset.format)
10
+ return false;
11
+ const name = sdkShared.generateName(
12
+ context.location,
13
+ element.dataset.format,
14
+ element.dataset.slot
15
+ );
16
+ return !((_a = context.getAll) == null ? void 0 : _a.call(context).some((activeSlot) => activeSlot.name === name));
17
+ }).map((element) => slot.createSlot({
18
+ format: element.dataset.format,
19
+ containingElement: element,
20
+ slot: element.dataset.slot,
21
+ context
22
+ })).filter((slot2) => {
23
+ var _a;
24
+ return !((_a = context.getAll) == null ? void 0 : _a.call(context).some((activeSlot) => activeSlot.name === slot2.name));
25
+ });
26
+ }
27
+ exports.findDomSlots = findDomSlots;
28
+ //# sourceMappingURL=findDomSlots.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findDomSlots.cjs","sources":["../../../src/findDomSlots/findDomSlots.ts"],"sourcesContent":["import { generateName, waitForDomLoad } from '@adhese/sdk-shared';\nimport type { AdheseContext, AdheseSlot } from '@adhese/sdk';\nimport { createSlot } from '../slot/slot';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter((element) => {\n if (!element.dataset.format)\n return false;\n\n const name = generateName(\n context.location,\n element.dataset.format,\n element.dataset.slot,\n );\n\n return !context.getAll?.().some(activeSlot => activeSlot.name === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name === slot.name));\n}\n"],"names":["waitForDomLoad","generateName","createSlot","slot"],"mappings":";;;;AAOA,eAAsB,aACpB,SACoC;AACpC,QAAMA,UAAe,eAAA;AAEd,SAAA,MAAM,KAAK,SAAS,iBAA8B,SAAS,CAAC,EAChE,OAAO,CAAC,YAAY;;AACf,QAAA,CAAC,QAAQ,QAAQ;AACZ,aAAA;AAET,UAAM,OAAOC,UAAA;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,IAAA;AAGX,WAAA,GAAC,aAAQ,WAAR,iCAAmB,KAAK,CAAc,eAAA,WAAW,SAAS;AAAA,EACnE,CAAA,EACA,IAAI,CAAA,YAAWC,gBAAW;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,mBAAmB;AAAA,IACnB,MAAM,QAAQ,QAAQ;AAAA,IACtB;AAAA,EAAA,CACD,CAAC,EACD,OAAO;;AAAQ,cAAC,aAAQ,WAAR,iCAAmB,KAAK,CAAc,eAAA,WAAW,SAASC,MAAK;AAAA,GAAK;AACzF;;"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ function createGlobalHooks() {
5
+ const disposeFunctions = /* @__PURE__ */ new Set();
6
+ let isInit = false;
7
+ const [runOnInit, onInit, disposeOnInit] = sdkShared.createSyncHook({
8
+ onRun(callbacks) {
9
+ isInit = true;
10
+ callbacks == null ? void 0 : callbacks.clear();
11
+ },
12
+ onAdd() {
13
+ if (isInit)
14
+ runOnInit();
15
+ }
16
+ });
17
+ disposeFunctions.add(disposeOnInit);
18
+ let isDisposed = false;
19
+ const [runOnDispose, onDispose, disposeOnDispose] = sdkShared.createSyncHook({
20
+ onRun(callbacks) {
21
+ isDisposed = true;
22
+ callbacks == null ? void 0 : callbacks.clear();
23
+ },
24
+ onAdd() {
25
+ if (isDisposed)
26
+ runOnDispose();
27
+ }
28
+ });
29
+ disposeFunctions.add(disposeOnDispose);
30
+ const [runOnRequest, onRequest, disposeOnRequest] = sdkShared.createAsyncHook();
31
+ disposeFunctions.add(disposeOnRequest);
32
+ const [runOnResponse, onResponse, disposeOnResponse] = sdkShared.createAsyncHook();
33
+ disposeFunctions.add(disposeOnResponse);
34
+ const [runOnSlotCreate, onSlotCreate, disposeOnSlotCreate] = sdkShared.createSyncHook();
35
+ disposeFunctions.add(disposeOnSlotCreate);
36
+ function clearAll() {
37
+ for (const disposeFunction of disposeFunctions)
38
+ disposeFunction();
39
+ }
40
+ return {
41
+ runOnInit,
42
+ onInit,
43
+ runOnDispose,
44
+ onDispose,
45
+ runOnRequest,
46
+ onRequest,
47
+ runOnResponse,
48
+ onResponse,
49
+ runOnSlotCreate,
50
+ onSlotCreate,
51
+ clearAll
52
+ };
53
+ }
54
+ exports.createGlobalHooks = createGlobalHooks;
55
+ //# sourceMappingURL=hooks.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.cjs","sources":["../../src/hooks.ts"],"sourcesContent":["import { createAsyncHook, createSyncHook } from '@adhese/sdk-shared';\nimport type { AdMultiRequestOptions } from './requestAds/requestAds';\nimport type { AdheseAd, AdheseSlotOptions } from './index';\n\n// eslint-disable-next-line ts/explicit-function-return-type,ts/explicit-module-boundary-types\nexport function createGlobalHooks() {\n const disposeFunctions = new Set<() => void>();\n\n let isInit = false;\n const [runOnInit, onInit, disposeOnInit] = createSyncHook({\n onRun(callbacks) {\n isInit = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n });\n disposeFunctions.add(disposeOnInit);\n\n let isDisposed = false;\n const [runOnDispose, onDispose, disposeOnDispose] = createSyncHook({\n onRun(callbacks) {\n isDisposed = true;\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n });\n disposeFunctions.add(disposeOnDispose);\n\n const [runOnRequest, onRequest, disposeOnRequest] = createAsyncHook<AdMultiRequestOptions>();\n disposeFunctions.add(disposeOnRequest);\n\n const [runOnResponse, onResponse, disposeOnResponse] = createAsyncHook<ReadonlyArray<AdheseAd>>();\n disposeFunctions.add(disposeOnResponse);\n\n const [runOnSlotCreate, onSlotCreate, disposeOnSlotCreate] = createSyncHook<AdheseSlotOptions>();\n disposeFunctions.add(disposeOnSlotCreate);\n\n function clearAll(): void {\n for (const disposeFunction of disposeFunctions)\n disposeFunction();\n }\n\n return {\n runOnInit,\n onInit,\n runOnDispose,\n onDispose,\n runOnRequest,\n onRequest,\n runOnResponse,\n onResponse,\n runOnSlotCreate,\n onSlotCreate,\n clearAll,\n };\n}\n"],"names":["createSyncHook","createAsyncHook"],"mappings":";;;AAKO,SAAS,oBAAoB;AAC5B,QAAA,uCAAuB;AAE7B,MAAI,SAAS;AACb,QAAM,CAAC,WAAW,QAAQ,aAAa,IAAIA,UAAAA,eAAe;AAAA,IACxD,MAAM,WAAW;AACN,eAAA;AACT,6CAAW;AAAA,IACb;AAAA,IACA,QAAQ;AACF,UAAA;AACQ;IACd;AAAA,EAAA,CACD;AACD,mBAAiB,IAAI,aAAa;AAElC,MAAI,aAAa;AACjB,QAAM,CAAC,cAAc,WAAW,gBAAgB,IAAIA,UAAAA,eAAe;AAAA,IACjE,MAAM,WAAW;AACF,mBAAA;AACb,6CAAW;AAAA,IACb;AAAA,IACA,QAAQ;AACF,UAAA;AACW;IACjB;AAAA,EAAA,CACD;AACD,mBAAiB,IAAI,gBAAgB;AAErC,QAAM,CAAC,cAAc,WAAW,gBAAgB,IAAIC,UAAuC,gBAAA;AAC3F,mBAAiB,IAAI,gBAAgB;AAErC,QAAM,CAAC,eAAe,YAAY,iBAAiB,IAAIA,UAAyC,gBAAA;AAChG,mBAAiB,IAAI,iBAAiB;AAEtC,QAAM,CAAC,iBAAiB,cAAc,mBAAmB,IAAID,UAAkC,eAAA;AAC/F,mBAAiB,IAAI,mBAAmB;AAExC,WAAS,WAAiB;AACxB,eAAW,mBAAmB;AACZ;EACpB;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const main = require("./main.cjs");
4
+ exports.createAdhese = main.createAdhese;
5
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ const _package = require("../package.json.cjs");
5
+ const logger = sdkShared.createLogger({
6
+ scope: `${_package.name}@${_package.version}`
7
+ });
8
+ exports.logger = logger;
9
+ //# sourceMappingURL=logger.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.cjs","sources":["../../../src/logger/logger.ts"],"sourcesContent":["import { createLogger } from '@adhese/sdk-shared';\nimport { name, version } from '../../package.json';\n\nexport const logger = createLogger({\n scope: `${name}@${version}`,\n});\n"],"names":["createLogger","name","version"],"mappings":";;;;AAGO,MAAM,SAASA,UAAAA,aAAa;AAAA,EACjC,OAAO,GAAGC,SAAAA,IAAI,IAAIC,SAAO,OAAA;AAC3B,CAAC;;"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ const _package = require("./package.json.cjs");
5
+ const slotManager = require("./slotManager/slotManager.cjs");
6
+ const consent = require("./consent/consent.cjs");
7
+ const main_utils = require("./main.utils.cjs");
8
+ const logger = require("./logger/logger.cjs");
9
+ const main_composables = require("./main.composables.cjs");
10
+ const hooks = require("./hooks.cjs");
11
+ function createAdhese(options) {
12
+ const scope = sdkShared.effectScope();
13
+ return scope.run(() => {
14
+ var _a;
15
+ const mergedOptions = {
16
+ host: `https://ads-${options.account}.adhese.com`,
17
+ poolHost: `https://pool-${options.account}.adhese.com`,
18
+ location: "homepage",
19
+ requestType: "POST",
20
+ debug: false,
21
+ initialSlots: [],
22
+ findDomSlotsOnLoad: false,
23
+ consent: false,
24
+ logReferrer: true,
25
+ logUrl: true,
26
+ eagerRendering: false,
27
+ viewabilityTracking: true,
28
+ ...options
29
+ };
30
+ main_utils.setupLogging(mergedOptions);
31
+ const hooks$1 = hooks.createGlobalHooks();
32
+ const context = sdkShared.reactive({
33
+ location: mergedOptions.location,
34
+ consent: mergedOptions.consent,
35
+ debug: mergedOptions.debug,
36
+ options: mergedOptions,
37
+ logger: logger.logger,
38
+ isDisposed: false,
39
+ parameters: /* @__PURE__ */ new Map(),
40
+ events: sdkShared.createEventManager(),
41
+ slots: /* @__PURE__ */ new Map(),
42
+ device: "unknown",
43
+ hooks: hooks$1,
44
+ plugins: {},
45
+ dispose,
46
+ findDomSlots,
47
+ getAll,
48
+ get,
49
+ addSlot
50
+ });
51
+ for (const [index, plugin] of ((_a = options.plugins) == null ? void 0 : _a.entries()) ?? []) {
52
+ const data = plugin(context, {
53
+ index,
54
+ version: _package.version,
55
+ hooks: hooks$1
56
+ });
57
+ const name = data.name;
58
+ context.plugins[name] = sdkShared.omit(data, ["name"]);
59
+ }
60
+ sdkShared.watch(() => context.location, (newLocation) => {
61
+ var _a2;
62
+ (_a2 = context.events) == null ? void 0 : _a2.locationChange.dispatch(newLocation);
63
+ });
64
+ main_composables.useMainParameters(context, mergedOptions);
65
+ const slotManager$1 = slotManager.createSlotManager({
66
+ initialSlots: mergedOptions.initialSlots,
67
+ context
68
+ });
69
+ function getAll() {
70
+ return slotManager$1.getAll() ?? [];
71
+ }
72
+ context.getAll = getAll;
73
+ function get(name) {
74
+ return slotManager$1.get(name);
75
+ }
76
+ context.get = get;
77
+ function addSlot(slotOptions) {
78
+ return slotManager$1.add(slotOptions);
79
+ }
80
+ context.addSlot = addSlot;
81
+ async function findDomSlots() {
82
+ const domSlots = (await slotManager$1.findDomSlots() ?? []).filter((slot) => !slot.lazyLoading);
83
+ if (domSlots.length <= 0)
84
+ return [];
85
+ await main_utils.fetchAllUnrenderedSlots(context.getAll());
86
+ return domSlots;
87
+ }
88
+ context.findDomSlots = findDomSlots;
89
+ main_composables.useMainDebugMode(context);
90
+ main_composables.useMainQueryDetector(mergedOptions, context);
91
+ consent.useConsent(context);
92
+ function dispose() {
93
+ var _a2, _b;
94
+ context.isDisposed = true;
95
+ slotManager$1.dispose();
96
+ (_a2 = context.parameters) == null ? void 0 : _a2.clear();
97
+ (_b = context.events) == null ? void 0 : _b.dispose();
98
+ hooks$1.runOnDispose();
99
+ hooks$1.clearAll();
100
+ scope.stop();
101
+ }
102
+ context.dispose = dispose;
103
+ hooks$1.onInit(async () => {
104
+ var _a2;
105
+ await sdkShared.awaitTimeout(0);
106
+ if ((slotManager$1.getAll().length ?? 0) > 0)
107
+ await main_utils.fetchAllUnrenderedSlots(context.getAll()).catch(logger.logger.error);
108
+ if (mergedOptions.findDomSlotsOnLoad)
109
+ await (context == null ? void 0 : context.findDomSlots());
110
+ if (mergedOptions.debug || window.location.search.includes("adhese_debug=true") || main_utils.isPreviewMode())
111
+ (_a2 = context.events) == null ? void 0 : _a2.debugChange.dispatch(true);
112
+ if (!scope.active)
113
+ dispose();
114
+ });
115
+ hooks$1.runOnInit();
116
+ return context;
117
+ });
118
+ }
119
+ exports.createAdhese = createAdhese;
120
+ //# sourceMappingURL=main.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.cjs","sources":["../../src/main.ts"],"sourcesContent":["import { awaitTimeout, createEventManager, effectScope, omit, reactive, watch } from '@adhese/sdk-shared';\nimport { version } from '../package.json';\nimport { createSlotManager } from './slotManager/slotManager';\nimport { useConsent } from './consent/consent';\nimport { fetchAllUnrenderedSlots, isPreviewMode, setupLogging } from './main.utils';\nimport type {\n Adhese,\n AdheseContextStateWithPlugins,\n AdheseOptions,\n AdhesePlugin,\n MergedOptions,\n} from './main.types';\nimport { logger } from './logger/logger';\nimport { useMainDebugMode, useMainParameters, useMainQueryDetector } from './main.composables';\nimport { createGlobalHooks } from './hooks';\n\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/slot.types';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options {AdheseOptions} The options to create the Adhese instance with. See the {@link AdheseOptions} type for more information.\n *\n * @return Adhese The Adhese instance.\n */\nexport function createAdhese<T extends ReadonlyArray<AdhesePlugin>>(options: AdheseOptions<T>): Adhese<T> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions: MergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n };\n setupLogging(mergedOptions);\n\n const hooks = createGlobalHooks();\n\n const context = reactive<AdheseContextStateWithPlugins<T>>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n options: mergedOptions,\n logger,\n isDisposed: false,\n parameters: new Map(),\n events: createEventManager(),\n slots: new Map(),\n device: 'unknown',\n hooks,\n plugins: {},\n dispose,\n findDomSlots,\n getAll,\n get,\n addSlot,\n });\n\n for (const [index, plugin] of options.plugins?.entries() ?? []) {\n const data = plugin(context, {\n index,\n version,\n hooks,\n });\n\n const name = data.name as keyof typeof context.plugins;\n context.plugins[name] = omit(data, ['name']) as typeof context.plugins[typeof name];\n }\n\n watch(() => context.location, (newLocation) => {\n context.events?.locationChange.dispatch(newLocation);\n });\n\n useMainParameters(context, mergedOptions);\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n context.getAll = getAll;\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n context.get = get;\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n return slotManager.add(slotOptions);\n }\n context.addSlot = addSlot;\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots() ?? []).filter(slot => !slot.lazyLoading);\n\n if (domSlots.length <= 0)\n return [];\n\n await fetchAllUnrenderedSlots(context.getAll());\n\n return domSlots;\n }\n context.findDomSlots = findDomSlots;\n\n useMainDebugMode(context);\n\n useMainQueryDetector(mergedOptions, context);\n\n useConsent(context);\n\n function dispose(): void {\n context.isDisposed = true;\n\n slotManager.dispose();\n context.parameters?.clear();\n context.events?.dispose();\n\n hooks.runOnDispose();\n hooks.clearAll();\n\n scope.stop();\n }\n context.dispose = dispose;\n\n hooks.onInit(async () => {\n await awaitTimeout(0);\n\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAllUnrenderedSlots(context.getAll()).catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await context?.findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n context.events?.debugChange.dispatch(true);\n\n if (!scope.active)\n dispose();\n });\n\n hooks.runOnInit();\n\n return context as Adhese<T>;\n })!;\n}\n"],"names":["effectScope","setupLogging","hooks","createGlobalHooks","reactive","logger","createEventManager","version","omit","watch","_a","useMainParameters","slotManager","createSlotManager","fetchAllUnrenderedSlots","useMainDebugMode","useMainQueryDetector","useConsent","awaitTimeout","isPreviewMode"],"mappings":";;;;;;;;;;AAyBO,SAAS,aAAoD,SAAsC;AACxG,QAAM,QAAQA,UAAAA;AAEP,SAAA,MAAM,IAAI,MAAM;;AACrB,UAAM,gBAA+B;AAAA,MACnC,MAAM,eAAe,QAAQ,OAAO;AAAA,MACpC,UAAU,gBAAgB,QAAQ,OAAO;AAAA,MACzC,UAAU;AAAA,MACV,aAAa;AAAA,MACb,OAAO;AAAA,MACP,cAAc,CAAC;AAAA,MACf,oBAAoB;AAAA,MACpB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,GAAG;AAAA,IAAA;AAELC,eAAA,aAAa,aAAa;AAE1B,UAAMC,UAAQC,MAAAA;AAEd,UAAM,UAAUC,UAAAA,SAA2C;AAAA,MACzD,UAAU,cAAc;AAAA,MACxB,SAAS,cAAc;AAAA,MACvB,OAAO,cAAc;AAAA,MACrB,SAAS;AAAA,MAAA,QACTC,OAAA;AAAA,MACA,YAAY;AAAA,MACZ,gCAAgB,IAAI;AAAA,MACpB,QAAQC,UAAAA,mBAAmB;AAAA,MAC3B,2BAAW,IAAI;AAAA,MACf,QAAQ;AAAA,MAAA,OACRJ;AAAAA,MACA,SAAS,CAAC;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAEU,eAAA,CAAC,OAAO,MAAM,OAAK,aAAQ,YAAR,mBAAiB,cAAa,IAAI;AACxD,YAAA,OAAO,OAAO,SAAS;AAAA,QAC3B;AAAA,QAAA,SACAK,SAAA;AAAA,QAAA,OACAL;AAAAA,MAAA,CACD;AAED,YAAM,OAAO,KAAK;AAClB,cAAQ,QAAQ,IAAI,IAAIM,eAAK,MAAM,CAAC,MAAM,CAAC;AAAA,IAC7C;AAEAC,cAAAA,MAAM,MAAM,QAAQ,UAAU,CAAC,gBAAgB;;AACrC,OAAAC,MAAA,QAAA,WAAA,gBAAAA,IAAQ,eAAe,SAAS;AAAA,IAAW,CACpD;AAEDC,uCAAkB,SAAS,aAAa;AAExC,UAAMC,gBAAcC,YAAAA,kBAAkB;AAAA,MACpC,cAAc,cAAc;AAAA,MAC5B;AAAA,IAAA,CACD;AAED,aAAS,SAAoC;AACpC,aAAAD,cAAY,OAAO,KAAK;IACjC;AACA,YAAQ,SAAS;AAEjB,aAAS,IAAI,MAAsC;AAC1C,aAAAA,cAAY,IAAI,IAAI;AAAA,IAC7B;AACA,YAAQ,MAAM;AAEd,aAAS,QAAQ,aAAsD;AAC9D,aAAAA,cAAY,IAAI,WAAW;AAAA,IACpC;AACA,YAAQ,UAAU;AAElB,mBAAe,eAAmD;AAC1D,YAAA,YAAY,MAAMA,cAAY,aAAa,KAAK,CAAA,GAAI,OAAO,CAAA,SAAQ,CAAC,KAAK,WAAW;AAE1F,UAAI,SAAS,UAAU;AACrB,eAAO;AAEH,YAAAE,mCAAwB,QAAQ,OAAA,CAAQ;AAEvC,aAAA;AAAA,IACT;AACA,YAAQ,eAAe;AAEvBC,qBAAA,iBAAiB,OAAO;AAExBC,0CAAqB,eAAe,OAAO;AAE3CC,YAAA,WAAW,OAAO;AAElB,aAAS,UAAgB;;AACvB,cAAQ,aAAa;AAErBL,oBAAY,QAAQ;AACpB,OAAAF,MAAA,QAAQ,eAAR,gBAAAA,IAAoB;AACpB,oBAAQ,WAAR,mBAAgB;AAEhBR,cAAM,aAAa;AACnBA,cAAM,SAAS;AAEf,YAAM,KAAK;AAAA,IACb;AACA,YAAQ,UAAU;AAElBA,YAAM,OAAO,YAAY;;AACvB,YAAMgB,UAAAA,aAAa,CAAC;AAEpB,WAAKN,cAAY,OAAS,EAAA,UAAU,KAAK;AACvC,cAAME,WAAAA,wBAAwB,QAAQ,OAAA,CAAQ,EAAE,MAAMT,OAAAA,OAAO,KAAK;AAEpE,UAAI,cAAc;AAChB,eAAM,mCAAS;AAEb,UAAA,cAAc,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,KAAKc,yBAAc;AACvF,SAAAT,MAAA,QAAA,WAAA,gBAAAA,IAAQ,YAAY,SAAS;AAEvC,UAAI,CAAC,MAAM;AACD;IAAA,CACX;AAEDR,YAAM,UAAU;AAET,WAAA;AAAA,EAAA,CACR;AACH;;"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ const queryDetector = require("./queryDetector/queryDetector.cjs");
5
+ function useMainQueryDetector(mergedOptions, context) {
6
+ const [device] = queryDetector.useQueryDetector(context, mergedOptions.queries);
7
+ sdkShared.watch(device, async (newDevice) => {
8
+ var _a, _b;
9
+ context.device = newDevice;
10
+ (_a = context.parameters) == null ? void 0 : _a.set("dt", newDevice);
11
+ (_b = context.parameters) == null ? void 0 : _b.set("br", newDevice);
12
+ await Promise.allSettled(context.getAll().map((slot) => slot.request()));
13
+ }, { immediate: true });
14
+ }
15
+ function useMainDebugMode(context) {
16
+ sdkShared.watch(() => context.debug, async (newDebug) => {
17
+ var _a, _b;
18
+ if (newDebug) {
19
+ context.logger.setMinLogLevelThreshold("debug");
20
+ context.logger.debug("Debug mode enabled");
21
+ (_a = context.events) == null ? void 0 : _a.debugChange.dispatch(true);
22
+ } else {
23
+ context.logger.debug("Debug mode disabled");
24
+ context.logger.setMinLogLevelThreshold("info");
25
+ (_b = context.events) == null ? void 0 : _b.debugChange.dispatch(false);
26
+ }
27
+ }, {
28
+ immediate: true
29
+ });
30
+ context.hooks.onDispose(() => {
31
+ context.logger.resetLogs();
32
+ context.logger.info("Adhese instance disposed");
33
+ });
34
+ }
35
+ function useMainParameters(context, options) {
36
+ const parameters = /* @__PURE__ */ new Map();
37
+ if (options.logReferrer)
38
+ parameters.set("re", btoa(document.referrer));
39
+ if (options.logUrl)
40
+ parameters.set("ur", btoa(window.location.href));
41
+ for (const [key, value] of Object.entries({
42
+ ...options.parameters ?? {},
43
+ rn: Math.round(Math.random() * 1e4).toString()
44
+ }))
45
+ parameters.set(key, value);
46
+ context.parameters = parameters;
47
+ sdkShared.watch(
48
+ () => context.parameters,
49
+ (newParameters) => {
50
+ var _a;
51
+ (_a = context.events) == null ? void 0 : _a.parametersChange.dispatch(newParameters);
52
+ },
53
+ {
54
+ deep: true
55
+ }
56
+ );
57
+ }
58
+ exports.useMainDebugMode = useMainDebugMode;
59
+ exports.useMainParameters = useMainParameters;
60
+ exports.useMainQueryDetector = useMainQueryDetector;
61
+ //# sourceMappingURL=main.composables.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.composables.cjs","sources":["../../src/main.composables.ts"],"sourcesContent":["import { watch } from '@adhese/sdk-shared';\nimport type { AdheseContextState, MergedOptions } from './main.types';\nimport { useQueryDetector } from './queryDetector/queryDetector';\n\nexport function useMainQueryDetector(mergedOptions: MergedOptions, context: AdheseContextState): void {\n const [device] = useQueryDetector(context, mergedOptions.queries);\n watch(device, async (newDevice) => {\n context.device = newDevice;\n\n context.parameters?.set('dt', newDevice);\n context.parameters?.set('br', newDevice);\n\n await Promise.allSettled(context.getAll().map(slot => slot.request()));\n }, { immediate: true });\n}\n\nexport function useMainDebugMode(context: AdheseContextState): void {\n watch(() => context.debug, async (newDebug) => {\n if (newDebug) {\n context.logger.setMinLogLevelThreshold('debug');\n context.logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n context.logger.debug('Debug mode disabled');\n context.logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n }, {\n immediate: true,\n });\n\n context.hooks.onDispose(() => {\n context.logger.resetLogs();\n context.logger.info('Adhese instance disposed');\n });\n}\n\nexport function useMainParameters(context: AdheseContextState, options: MergedOptions): void {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n context.parameters = parameters;\n\n watch(\n () => context.parameters,\n (newParameters) => {\n context.events?.parametersChange.dispatch(newParameters);\n },\n {\n deep: true,\n },\n );\n}\n"],"names":["useQueryDetector","watch"],"mappings":";;;;AAIgB,SAAA,qBAAqB,eAA8B,SAAmC;AACpG,QAAM,CAAC,MAAM,IAAIA,cAAAA,iBAAiB,SAAS,cAAc,OAAO;AAC1DC,kBAAA,QAAQ,OAAO,cAAc;;AACjC,YAAQ,SAAS;AAET,kBAAA,eAAA,mBAAY,IAAI,MAAM;AACtB,kBAAA,eAAA,mBAAY,IAAI,MAAM;AAExB,UAAA,QAAQ,WAAW,QAAQ,OAAO,EAAE,IAAI,CAAQ,SAAA,KAAK,QAAQ,CAAC,CAAC;AAAA,EAAA,GACpE,EAAE,WAAW,KAAA,CAAM;AACxB;AAEO,SAAS,iBAAiB,SAAmC;AAClEA,YAAAA,MAAM,MAAM,QAAQ,OAAO,OAAO,aAAa;;AAC7C,QAAI,UAAU;AACJ,cAAA,OAAO,wBAAwB,OAAO;AACtC,cAAA,OAAO,MAAM,oBAAoB;AACjC,oBAAA,WAAA,mBAAQ,YAAY,SAAS;AAAA,IAAI,OAEtC;AACK,cAAA,OAAO,MAAM,qBAAqB;AAClC,cAAA,OAAO,wBAAwB,MAAM;AACrC,oBAAA,WAAA,mBAAQ,YAAY,SAAS;AAAA,IACvC;AAAA,EAAA,GACC;AAAA,IACD,WAAW;AAAA,EAAA,CACZ;AAEO,UAAA,MAAM,UAAU,MAAM;AAC5B,YAAQ,OAAO;AACP,YAAA,OAAO,KAAK,0BAA0B;AAAA,EAAA,CAC/C;AACH;AAEgB,SAAA,kBAAkB,SAA6B,SAA8B;AACrF,QAAA,iCAAiB;AAEvB,MAAI,QAAQ;AACV,eAAW,IAAI,MAAM,KAAK,SAAS,QAAQ,CAAC;AAE9C,MAAI,QAAQ;AACV,eAAW,IAAI,MAAM,KAAK,OAAO,SAAS,IAAI,CAAC;AAEjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ;AAAA,IACxC,GAAG,QAAQ,cAAc,CAAC;AAAA,IAC1B,IAAI,KAAK,MAAM,KAAK,WAAW,GAAM,EAAE,SAAS;AAAA,EAAA,CACjD;AACY,eAAA,IAAI,KAAK,KAAK;AAE3B,UAAQ,aAAa;AAErBA,YAAA;AAAA,IACE,MAAM,QAAQ;AAAA,IACd,CAAC,kBAAkB;;AACT,oBAAA,WAAA,mBAAQ,iBAAiB,SAAS;AAAA,IAC5C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EAAA;AAEJ;;;;"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const logger = require("./logger/logger.cjs");
4
+ function setupLogging(mergedOptions) {
5
+ if (mergedOptions.debug || window.location.search.includes("adhese_debug=true")) {
6
+ logger.logger.setMinLogLevelThreshold("debug");
7
+ logger.logger.debug("Debug logging enabled");
8
+ }
9
+ logger.logger.debug("Created Adhese SDK instance", {
10
+ mergedOptions
11
+ });
12
+ }
13
+ function isPreviewMode() {
14
+ return window.location.search.includes("adhesePreviewCreativeId");
15
+ }
16
+ async function fetchAllUnrenderedSlots(slots) {
17
+ const filteredSlots = slots.filter((slot) => !slot.lazyLoading && !slot.data);
18
+ if (filteredSlots.length === 0)
19
+ return;
20
+ await Promise.allSettled(filteredSlots.map((slot) => slot.request()));
21
+ }
22
+ exports.fetchAllUnrenderedSlots = fetchAllUnrenderedSlots;
23
+ exports.isPreviewMode = isPreviewMode;
24
+ exports.setupLogging = setupLogging;
25
+ //# sourceMappingURL=main.utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.utils.cjs","sources":["../../src/main.utils.ts"],"sourcesContent":["import { logger } from './logger/logger';\n\nimport type { AdheseContext } from './main.types';\nimport type { AdheseSlot } from './slot/slot.types';\n\n/**\n * Sets up logging based on the provided options. If debug is enabled, the log level threshold is set to debug.\n */\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\n/**\n * Checks if the current page is in preview mode.\n */\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n\nexport async function fetchAllUnrenderedSlots(slots: ReadonlyArray<AdheseSlot>): Promise<void> {\n const filteredSlots = slots.filter(slot => !slot.lazyLoading && !slot.data);\n\n if (filteredSlots.length === 0)\n return;\n\n await Promise.allSettled(filteredSlots.map(slot => slot.request()));\n}\n"],"names":["logger"],"mappings":";;;AAQO,SAAS,aAAa,eAA+C;AAC1E,MAAI,cAAc,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,GAAG;AAC/EA,kBAAO,wBAAwB,OAAO;AACtCA,kBAAO,MAAM,uBAAuB;AAAA,EACtC;AAEAA,SAAA,OAAO,MAAM,+BAA+B;AAAA,IAC1C;AAAA,EAAA,CACD;AACH;AAKO,SAAS,gBAAyB;AACvC,SAAO,OAAO,SAAS,OAAO,SAAS,yBAAyB;AAClE;AAEA,eAAsB,wBAAwB,OAAiD;AACvF,QAAA,gBAAgB,MAAM,OAAO,CAAA,SAAQ,CAAC,KAAK,eAAe,CAAC,KAAK,IAAI;AAE1E,MAAI,cAAc,WAAW;AAC3B;AAEI,QAAA,QAAQ,WAAW,cAAc,IAAI,UAAQ,KAAK,QAAS,CAAA,CAAC;AACpE;;;;"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const name = "@adhese/sdk";
4
+ const version = "0.21.0";
5
+ exports.name = name;
6
+ exports.version = version;
7
+ //# sourceMappingURL=package.json.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.json.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const sdkShared = require("@adhese/sdk-shared");
4
+ function useQueryDetector(context, queries = {
5
+ mobile: "(max-width: 768px)",
6
+ tablet: "(min-width: 769px) and (max-width: 1024px)",
7
+ desktop: "(min-width: 1025px)"
8
+ }) {
9
+ const entries = Object.entries(queries);
10
+ const active = sdkShared.ref(getQuery(entries));
11
+ const queryList = entries.map(([, query]) => window.matchMedia(query));
12
+ const handleOnChange = sdkShared.debounce(() => {
13
+ active.value = getQuery(entries);
14
+ }, {
15
+ waitMs: 50
16
+ });
17
+ context.hooks.onInit(() => {
18
+ for (const query of queryList)
19
+ query.addEventListener("change", handleOnChange.call);
20
+ handleOnChange.call();
21
+ });
22
+ function dispose() {
23
+ for (const query of queryList)
24
+ query.removeEventListener("change", handleOnChange.call);
25
+ }
26
+ context.hooks.onDispose(dispose);
27
+ return [sdkShared.computed(() => active.value), dispose];
28
+ }
29
+ function getQuery(entries) {
30
+ for (const [device, query] of entries) {
31
+ if (window.matchMedia(query).matches)
32
+ return device;
33
+ }
34
+ return "unknown";
35
+ }
36
+ exports.useQueryDetector = useQueryDetector;
37
+ //# sourceMappingURL=queryDetector.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDetector.cjs","sources":["../../../src/queryDetector/queryDetector.ts"],"sourcesContent":["import { type ComputedRef, computed, debounce, ref } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '@adhese/sdk';\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n */\nexport function useQueryDetector(context: AdheseContext, queries: Record<string, string> = {\n mobile: '(max-width: 768px)',\n tablet: '(min-width: 769px) and (max-width: 1024px)',\n desktop: '(min-width: 1025px)',\n}): [ComputedRef<string>, () => void] {\n const entries = Object.entries(queries);\n\n const active = ref(getQuery(entries));\n const queryList = entries.map(([, query]) => window.matchMedia(query));\n\n const handleOnChange = debounce((): void => {\n active.value = getQuery(entries);\n }, {\n waitMs: 50,\n });\n\n context.hooks.onInit(() => {\n for (const query of queryList)\n query.addEventListener('change', handleOnChange.call);\n\n handleOnChange.call();\n });\n\n function dispose(): void {\n for (const query of queryList)\n query.removeEventListener('change', handleOnChange.call);\n }\n\n context.hooks.onDispose(dispose);\n\n return [computed(() => active.value), dispose];\n}\n\nfunction getQuery(entries: ReadonlyArray<[string, string]>): string {\n for (const [device, query] of entries) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n}\n"],"names":["ref","debounce","computed"],"mappings":";;;AAMgB,SAAA,iBAAiB,SAAwB,UAAkC;AAAA,EACzF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX,GAAsC;AAC9B,QAAA,UAAU,OAAO,QAAQ,OAAO;AAEtC,QAAM,SAASA,UAAA,IAAI,SAAS,OAAO,CAAC;AAC9B,QAAA,YAAY,QAAQ,IAAI,CAAC,CAAA,EAAG,KAAK,MAAM,OAAO,WAAW,KAAK,CAAC;AAE/D,QAAA,iBAAiBC,UAAAA,SAAS,MAAY;AACnC,WAAA,QAAQ,SAAS,OAAO;AAAA,EAAA,GAC9B;AAAA,IACD,QAAQ;AAAA,EAAA,CACT;AAEO,UAAA,MAAM,OAAO,MAAM;AACzB,eAAW,SAAS;AACZ,YAAA,iBAAiB,UAAU,eAAe,IAAI;AAEtD,mBAAe,KAAK;AAAA,EAAA,CACrB;AAED,WAAS,UAAgB;AACvB,eAAW,SAAS;AACZ,YAAA,oBAAoB,UAAU,eAAe,IAAI;AAAA,EAC3D;AAEQ,UAAA,MAAM,UAAU,OAAO;AAE/B,SAAO,CAACC,UAAS,SAAA,MAAM,OAAO,KAAK,GAAG,OAAO;AAC/C;AAEA,SAAS,SAAS,SAAkD;AAClE,aAAW,CAAC,QAAQ,KAAK,KAAK,SAAS;AACjC,QAAA,OAAO,WAAW,KAAK,EAAE;AACpB,aAAA;AAAA,EACX;AAEO,SAAA;AACT;;"}
@@ -0,0 +1,81 @@
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
+ const requestAds_preview = require("./requestAds.preview.cjs");
6
+ const requestAds_utils = require("./requestAds.utils.cjs");
7
+ const batch = /* @__PURE__ */ new Map();
8
+ const runRequestAdsBatch = sdkShared.debounce(async (context) => {
9
+ if (batch.size === 0)
10
+ return [];
11
+ const ads = await requestAds({
12
+ slots: Array.from(batch.values()).map(({ options }) => options.slot),
13
+ context
14
+ });
15
+ for (const { options, resolve } of batch.values()) {
16
+ const ad = ads.find(({ slotName }) => sdkShared.toValue(slotName) === sdkShared.toValue(options.slot.name));
17
+ if (ad)
18
+ resolve(ad);
19
+ else
20
+ resolve(null);
21
+ }
22
+ batch.clear();
23
+ return ads;
24
+ }, {
25
+ waitMs: 20,
26
+ timing: "trailing"
27
+ });
28
+ async function requestAd(options) {
29
+ const promise = new Promise(
30
+ (resolve) => {
31
+ batch.set(sdkShared.toValue(options.slot.name), { options, resolve });
32
+ }
33
+ );
34
+ await runRequestAdsBatch.call(options.context);
35
+ return promise;
36
+ }
37
+ async function requestAds(requestOptions) {
38
+ var _a, _b, _c, _d, _e;
39
+ const options = await requestOptions.context.hooks.runOnRequest(requestOptions);
40
+ const { context } = options;
41
+ try {
42
+ (_a = context == null ? void 0 : context.events) == null ? void 0 : _a.requestAd.dispatch({
43
+ ...options,
44
+ context
45
+ });
46
+ const [response, previews, parseResponse] = await Promise.all([
47
+ ((_b = context.options.requestType) == null ? void 0 : _b.toUpperCase()) === "POST" ? requestAds_utils.requestWithPost(options) : requestAds_utils.requestWithGet(options),
48
+ requestAds_preview.requestPreviews(context.options.account),
49
+ Promise.resolve().then(() => require("./requestAds.schema.cjs")).then((module2) => module2.parseResponse)
50
+ ]);
51
+ logger.logger.debug("Received response", response);
52
+ if (!response.ok)
53
+ throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);
54
+ const result = parseResponse(await response.json());
55
+ logger.logger.debug("Parsed ad", result);
56
+ if (previews.length > 0)
57
+ logger.logger.info(`Found ${previews.length} ${previews.length === 1 ? "preview" : "previews"}. Replacing ads in response with preview items`, previews);
58
+ const matchedPreviews = previews.map(({ slotName, ...preview }) => {
59
+ const partnerAd = result.find((ad) => ad.libId === preview.libId);
60
+ return {
61
+ slotName: `${(partnerAd == null ? void 0 : partnerAd.slotName) ?? slotName}`,
62
+ ...preview
63
+ };
64
+ });
65
+ if (matchedPreviews.length > 0)
66
+ (_c = context.events) == null ? void 0 : _c.previewReceived.dispatch(matchedPreviews);
67
+ const mergedResult = await context.hooks.runOnResponse([
68
+ ...result.filter((ad) => !previews.some((preview) => preview.libId === ad.libId)),
69
+ ...matchedPreviews
70
+ ]);
71
+ (_d = context.events) == null ? void 0 : _d.responseReceived.dispatch(mergedResult);
72
+ return mergedResult;
73
+ } catch (error) {
74
+ logger.logger.error(String(error));
75
+ (_e = context == null ? void 0 : context.events) == null ? void 0 : _e.requestError.dispatch(error);
76
+ throw error;
77
+ }
78
+ }
79
+ exports.requestAd = requestAd;
80
+ exports.requestAds = requestAds;
81
+ //# sourceMappingURL=requestAds.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestAds.cjs","sources":["../../../src/requestAds/requestAds.ts"],"sourcesContent":["import { type MaybeRef, debounce, toValue } from '@adhese/sdk-shared';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport type { AdheseAd } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * Slot you want to fetch the ad for\n */\n slot: {\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n };\n context: AdheseContext;\n};\n\nexport type AdMultiRequestOptions = Omit<AdRequestOptions, 'slot'> & {\n slots: ReadonlyArray<AdRequestOptions['slot']>;\n};\n\nconst batch = new Map<string, {\n options: AdRequestOptions;\n resolve(ad: AdheseAd | null): void;\n}>();\n\n/**\n * Debounced function to request ads in batches. This function is debounced to prevent multiple requests for the same ad.\n */\nconst runRequestAdsBatch = debounce(async (context: AdheseContext) => {\n if (batch.size === 0)\n return [];\n\n const ads = await requestAds({\n slots: Array.from(batch.values()).map(({ options }) => options.slot),\n context,\n });\n\n for (const { options, resolve } of batch.values()) {\n const ad = ads.find(({ slotName }) => toValue(slotName) === toValue(options.slot.name));\n\n if (ad)\n resolve(ad);\n else\n resolve(null);\n }\n\n batch.clear();\n\n return ads;\n}, {\n waitMs: 20,\n timing: 'trailing',\n});\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd(options: AdRequestOptions): Promise<AdheseAd | null> {\n const promise = new Promise<AdheseAd | null>((resolve) => {\n batch.set(toValue(options.slot.name), { options, resolve });\n },\n );\n\n await runRequestAdsBatch.call(options.context);\n\n return promise;\n}\n\n/**\n * Request multiple ads from the API. If you need to fetch a single ad use the `requestAd` function.\n */\nexport async function requestAds(requestOptions: AdMultiRequestOptions): Promise<ReadonlyArray<AdheseAd>> {\n const options = await requestOptions.context.hooks.runOnRequest(requestOptions);\n\n const { context } = options;\n\n try {\n context?.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews, parseResponse] = await Promise.all([\n context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options),\n requestPreviews(context.options.account),\n import('./requestAds.schema').then(module => module.parseResponse),\n ]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult = await context.hooks.runOnResponse([\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ]);\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context?.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n"],"names":["debounce","toValue","requestWithPost","requestWithGet","requestPreviews","module","logger"],"mappings":";;;;;;AAsBA,MAAM,4BAAY;AAQlB,MAAM,qBAAqBA,UAAAA,SAAS,OAAO,YAA2B;AACpE,MAAI,MAAM,SAAS;AACjB,WAAO;AAEH,QAAA,MAAM,MAAM,WAAW;AAAA,IAC3B,OAAO,MAAM,KAAK,MAAM,OAAQ,CAAA,EAAE,IAAI,CAAC,EAAE,cAAc,QAAQ,IAAI;AAAA,IACnE;AAAA,EAAA,CACD;AAED,aAAW,EAAE,SAAS,QAAa,KAAA,MAAM,UAAU;AACjD,UAAM,KAAK,IAAI,KAAK,CAAC,EAAE,SAAS,MAAMC,UAAAA,QAAQ,QAAQ,MAAMA,UAAAA,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAElF,QAAA;AACF,cAAQ,EAAE;AAAA;AAEV,cAAQ,IAAI;AAAA,EAChB;AAEA,QAAM,MAAM;AAEL,SAAA;AACT,GAAG;AAAA,EACD,QAAQ;AAAA,EACR,QAAQ;AACV,CAAC;AAKD,eAAsB,UAAU,SAAqD;AACnF,QAAM,UAAU,IAAI;AAAA,IAAyB,CAAC,YAAY;AAClD,YAAA,IAAIA,kBAAQ,QAAQ,KAAK,IAAI,GAAG,EAAE,SAAS,QAAA,CAAS;AAAA,IAC5D;AAAA,EAAA;AAGM,QAAA,mBAAmB,KAAK,QAAQ,OAAO;AAEtC,SAAA;AACT;AAKA,eAAsB,WAAW,gBAAyE;;AACxG,QAAM,UAAU,MAAM,eAAe,QAAQ,MAAM,aAAa,cAAc;AAExE,QAAA,EAAE,QAAY,IAAA;AAEhB,MAAA;AACO,6CAAA,WAAA,mBAAQ,UAAU,SAAS;AAAA,MAClC,GAAG;AAAA,MACH;AAAA,IAAA;AAGF,UAAM,CAAC,UAAU,UAAU,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC5D,aAAQ,QAAQ,gBAAhB,mBAA6B,mBAAkB,SAC3CC,iBAAAA,gBAAgB,OAAO,IACvBC,iBAAA,eAAe,OAAO;AAAA,MAC1BC,mCAAgB,QAAQ,QAAQ,OAAO;AAAA,MACvC,QAAO,QAAA,EAAA,KAAA,MAAA,QAAA,yBAAqB,CAAA,EAAE,KAAK,CAAAC,YAAUA,QAAO,aAAa;AAAA,IAAA,CAClE;AAEMC,WAAAA,OAAA,MAAM,qBAAqB,QAAQ;AAE1C,QAAI,CAAC,SAAS;AACN,YAAA,IAAI,MAAM,yBAAyB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAEnF,UAAM,SAAS,cAAe,MAAM,SAAS,KAAkB,CAAA;AACxDA,WAAAA,OAAA,MAAM,aAAa,MAAM;AAEhC,QAAI,SAAS,SAAS;AACbA,aAAA,OAAA,KAAK,SAAS,SAAS,MAAM,IAAI,SAAS,WAAW,IAAI,YAAY,UAAU,kDAAkD,QAAQ;AAE5I,UAAA,kBAAkB,SAAS,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc;AACjE,YAAM,YAAY,OAAO,KAAK,QAAM,GAAG,UAAU,QAAQ,KAAK;AAEtD,aAAA;AAAA,QACN,UAAU,IAAG,uCAAW,aAAY,QAAQ;AAAA,QAC5C,GAAG;AAAA,MAAA;AAAA,IACL,CACD;AAED,QAAI,gBAAgB,SAAS;AACnB,oBAAA,WAAA,mBAAQ,gBAAgB,SAAS;AAE3C,UAAM,eAAe,MAAM,QAAQ,MAAM,cAAc;AAAA,MACrD,GAAG,OAAO,OAAO,CAAA,OAAM,CAAC,SAAS,KAAK,CAAA,YAAW,QAAQ,UAAU,GAAG,KAAK,CAAC;AAAA,MAC5E,GAAG;AAAA,IAAA,CACJ;AAEO,kBAAA,WAAA,mBAAQ,iBAAiB,SAAS;AAEnC,WAAA;AAAA,WAEF,OAAO;AACLA,WAAAA,OAAA,MAAM,OAAO,KAAK,CAAC;AACjB,6CAAA,WAAA,mBAAQ,aAAa,SAAS;AAEjC,UAAA;AAAA,EACR;AACF;;;"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const logger = require("../logger/logger.cjs");
4
+ async function requestPreviews(account) {
5
+ const previewObjects = getPreviewObjects();
6
+ const [list, adSchema] = await Promise.all([
7
+ Promise.allSettled(previewObjects.filter((previewObject) => "adhesePreviewCreativeId" in previewObject).map(async (previewObject) => {
8
+ const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);
9
+ endpoint.searchParams.set(
10
+ "id",
11
+ previewObject.adhesePreviewCreativeId
12
+ );
13
+ const response = await fetch(endpoint.href, {
14
+ method: "GET",
15
+ headers: {
16
+ accept: "application/json"
17
+ }
18
+ });
19
+ if (!response.ok)
20
+ return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));
21
+ return await response.json();
22
+ })),
23
+ Promise.resolve().then(() => require("./requestAds.schema.cjs")).then((module2) => module2.adSchema)
24
+ ]);
25
+ return adSchema.array().parse(list.filter((response) => {
26
+ if (response.status === "rejected") {
27
+ logger.logger.error(response.reason);
28
+ return false;
29
+ }
30
+ return response.status === "fulfilled";
31
+ }).flatMap((response) => response.value.map((item) => ({
32
+ ...item,
33
+ preview: true
34
+ }))));
35
+ }
36
+ function getPreviewObjects() {
37
+ const currentUrl = new URL(window.location.href);
38
+ const previewObjects = [];
39
+ let currentObject = {};
40
+ for (const [key, value] of currentUrl.searchParams.entries()) {
41
+ if (key === "adhesePreviewCreativeId" && Object.keys(currentObject).length > 0) {
42
+ previewObjects.push(currentObject);
43
+ currentObject = {};
44
+ }
45
+ currentObject[key] = value;
46
+ }
47
+ if (Object.keys(currentObject).length > 0)
48
+ previewObjects.push(currentObject);
49
+ return previewObjects;
50
+ }
51
+ exports.requestPreviews = requestPreviews;
52
+ //# sourceMappingURL=requestAds.preview.cjs.map