@surfside/ads-core-web 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +15 -15
  2. package/lib/cjs/debug/carousel.js +74 -0
  3. package/lib/cjs/debug/carousel.js.map +1 -0
  4. package/lib/cjs/helpers/Dom.js +52 -0
  5. package/lib/cjs/helpers/Dom.js.map +1 -0
  6. package/lib/cjs/helpers/Trackers.js +20 -0
  7. package/lib/cjs/helpers/Trackers.js.map +1 -0
  8. package/lib/cjs/helpers/index.js +19 -0
  9. package/lib/cjs/helpers/index.js.map +1 -0
  10. package/lib/cjs/index.js +49 -6099
  11. package/lib/cjs/index.js.map +1 -0
  12. package/lib/cjs/rendering/Banner.js +93 -0
  13. package/lib/cjs/rendering/Banner.js.map +1 -0
  14. package/lib/cjs/rendering/Carousel.js +350 -0
  15. package/lib/cjs/rendering/Carousel.js.map +1 -0
  16. package/lib/cjs/rendering/Framework.js +90 -0
  17. package/lib/cjs/rendering/Framework.js.map +1 -0
  18. package/lib/cjs/rendering/ProductCard.js +106 -0
  19. package/lib/cjs/rendering/ProductCard.js.map +1 -0
  20. package/lib/cjs/rendering/Video.js +299 -0
  21. package/lib/cjs/rendering/Video.js.map +1 -0
  22. package/lib/cjs/rendering/Watermark.js +59 -0
  23. package/lib/cjs/rendering/Watermark.js.map +1 -0
  24. package/lib/cjs/rendering/index.js +23 -0
  25. package/lib/cjs/rendering/index.js.map +1 -0
  26. package/lib/esm/debug/carousel.js +72 -0
  27. package/lib/esm/debug/carousel.js.map +1 -0
  28. package/lib/esm/helpers/Dom.js +43 -0
  29. package/lib/esm/helpers/Dom.js.map +1 -0
  30. package/lib/esm/helpers/Trackers.js +15 -0
  31. package/lib/esm/helpers/Trackers.js.map +1 -0
  32. package/lib/esm/helpers/index.js +3 -0
  33. package/lib/esm/helpers/index.js.map +1 -0
  34. package/lib/esm/index.js +26 -6063
  35. package/lib/esm/index.js.map +1 -0
  36. package/lib/esm/rendering/Banner.js +88 -0
  37. package/lib/esm/rendering/Banner.js.map +1 -0
  38. package/lib/esm/rendering/Carousel.js +344 -0
  39. package/lib/esm/rendering/Carousel.js.map +1 -0
  40. package/lib/esm/rendering/Framework.js +83 -0
  41. package/lib/esm/rendering/Framework.js.map +1 -0
  42. package/lib/esm/rendering/ProductCard.js +101 -0
  43. package/lib/esm/rendering/ProductCard.js.map +1 -0
  44. package/lib/esm/rendering/Video.js +295 -0
  45. package/lib/esm/rendering/Video.js.map +1 -0
  46. package/lib/esm/rendering/Watermark.js +55 -0
  47. package/lib/esm/rendering/Watermark.js.map +1 -0
  48. package/lib/esm/rendering/index.js +7 -0
  49. package/lib/esm/rendering/index.js.map +1 -0
  50. package/package.json +37 -27
  51. package/lib/types/debug/dist/index-7was9ptg.d.ts +0 -2
@@ -0,0 +1,295 @@
1
+ import { Ctx, Ok, WrapValue } from '@surfside/ads-core-client';
2
+ import { QuerySelectorResult, Template } from './Framework';
3
+ ;
4
+ ;
5
+ export const RenderVideo = (logger, deviceInfo, geo, userAgent, builtVideo) => {
6
+ const log = Ctx(logger)?.with('RenderVideo');
7
+ log?.info('Rendering video');
8
+ log?.debug(builtVideo);
9
+ const videoContainer = document.createElement('div');
10
+ const shadow = videoContainer.attachShadow({ mode: 'open' });
11
+ const creativeContainerResult = Template(log, 'surfside-video', template, style);
12
+ if (!creativeContainerResult.ok) {
13
+ log?.error('Failed to load video player template', builtVideo, template, style);
14
+ return creativeContainerResult;
15
+ }
16
+ const creativeContainer = creativeContainerResult.value;
17
+ shadow.appendChild(creativeContainer);
18
+ const video = QuerySelectorResult(creativeContainer, '#surf-video-container');
19
+ if (!video.ok) {
20
+ log?.error('Failed to find video player element', builtVideo, creativeContainer);
21
+ return video;
22
+ }
23
+ const linearRes = WrapValue(builtVideo.video.ads[0]?.inline.creatives[0]);
24
+ if (!linearRes.ok) {
25
+ return linearRes;
26
+ }
27
+ const linear = linearRes.value;
28
+ for (const mediaFile of linear.mediaFiles) {
29
+ const source = document.createElement('source');
30
+ source.src = mediaFile.url;
31
+ source.type = mediaFile.type;
32
+ source.id = mediaFile.id;
33
+ video.value.appendChild(source);
34
+ }
35
+ // Attach callbacks
36
+ const surfVideoContainerRes = QuerySelectorResult(videoContainer, '#surf-video-container');
37
+ if (!surfVideoContainerRes.ok) {
38
+ return surfVideoContainerRes;
39
+ }
40
+ surfVideoContainerRes.value.addEventListener('loadeddata', () => loadInteractiveElements(logger, deviceInfo, geo, userAgent, videoContainer, linear));
41
+ return Ok(videoContainer);
42
+ };
43
+ const loadInteractiveElements = (logger, deviceInfo, geo, userAgent, element, linear) => {
44
+ const log = Ctx(logger)?.with('loadInteractiveElements');
45
+ log?.info('Video loaded. Adding interactive elements to the video player');
46
+ const videoElementRes = QuerySelectorResult(element, '#surf-video-container');
47
+ if (!videoElementRes.ok) {
48
+ return videoElementRes;
49
+ }
50
+ const videoElement = videoElementRes.value;
51
+ const duration = videoElement.duration;
52
+ const timerValueRes = QuerySelectorResult(element, '.timer-value');
53
+ if (!timerValueRes.ok) {
54
+ return timerValueRes;
55
+ }
56
+ const timerValue = timerValueRes.value;
57
+ timerValue.innerHTML = String(duration);
58
+ const trackersRes = initializeTrackers(log, linear.trackingEvents);
59
+ if (!trackersRes.ok) {
60
+ return trackersRes;
61
+ }
62
+ const trackers = trackersRes.value;
63
+ videoElement.onplay = () => fireTracker(log, deviceInfo, geo, userAgent, trackers, 'start');
64
+ videoElement.onended = () => fireTracker(log, deviceInfo, geo, userAgent, trackers, 'complete');
65
+ videoElement.ontimeupdate = async () => {
66
+ const currentTime = Math.floor(videoElement.currentTime);
67
+ timerValue.innerHTML = String(currentTime);
68
+ const percent = currentTime / videoElement.duration;
69
+ if (percent >= 0.25 && percent < 0.5) {
70
+ fireTracker(log, deviceInfo, geo, userAgent, trackers, 'firstQuartile');
71
+ }
72
+ else if (percent >= 0.5 && percent < 0.75) {
73
+ fireTracker(log, deviceInfo, geo, userAgent, trackers, 'midpoint');
74
+ }
75
+ else if (percent >= 0.75) {
76
+ fireTracker(log, deviceInfo, geo, userAgent, trackers, 'thirdQuartile');
77
+ }
78
+ };
79
+ const muteButton = QuerySelectorResult(element, '.mute-button');
80
+ if (muteButton.ok) {
81
+ log?.info('Adding mute handler');
82
+ muteButton.value.addEventListener('click', toggleMute.bind(undefined, log, videoElement));
83
+ }
84
+ else {
85
+ log?.info('Missing mute button');
86
+ }
87
+ const timerCircleRes = QuerySelectorResult(element, '.timer-circle');
88
+ if (!timerCircleRes.ok) {
89
+ return timerCircleRes;
90
+ }
91
+ const timerCircle = timerCircleRes.value;
92
+ timerCircle.style.animationDuration = `${videoElement.duration}s`;
93
+ log?.info('timerCircle.style.animationDuration', timerCircle.style.animationDuration);
94
+ videoElement.play()
95
+ .then(() => {
96
+ timerCircle.style.animationPlayState = 'running';
97
+ })
98
+ .catch(err => console.warn('User disallowed auto playing of video', err));
99
+ fireTracker(log, deviceInfo, geo, userAgent, trackers, 'impression');
100
+ return Ok(true);
101
+ };
102
+ const initializeTrackers = (logger, trackers) => {
103
+ const log = Ctx(logger)?.with('initializeTrackers');
104
+ log?.info('Initiailizing trackers', trackers);
105
+ const videoTrackers = {
106
+ start: { fired: false },
107
+ firstQuartile: { fired: false },
108
+ midpoint: { fired: false },
109
+ thirdQuartile: { fired: false },
110
+ complete: { fired: false },
111
+ impression: { fired: false },
112
+ stop: { fired: false }
113
+ };
114
+ for (const tracker of trackers) {
115
+ const eventName = tracker.event;
116
+ const url = tracker.url;
117
+ videoTrackers[eventName].url = url;
118
+ }
119
+ return Ok(videoTrackers);
120
+ };
121
+ const fireTracker = (logger, deviceInfo, geo, userAgent, trackers, trackerName) => {
122
+ const log = Ctx(logger)?.with('fireTracker');
123
+ log?.info('Firing video tracker [' + trackerName + ']');
124
+ const trackerData = trackers[trackerName];
125
+ if (trackerData.fired) {
126
+ return;
127
+ }
128
+ const urlString = trackerData.url;
129
+ if (urlString === undefined) {
130
+ log?.error('urlstring was undefined for tracker [' + trackerName + ']');
131
+ return;
132
+ }
133
+ const url = new URL(urlString);
134
+ const { os, osv, make, model } = deviceInfo ?? {};
135
+ const { latitude, longitude } = geo?.coords ?? {};
136
+ const addParam = (param, value) => value !== undefined
137
+ ? url.searchParams.set(param, value)
138
+ : undefined;
139
+ addParam('os', os);
140
+ addParam('os', osv);
141
+ addParam('make', make);
142
+ addParam('model', model);
143
+ addParam('ua', userAgent);
144
+ addParam('lat', latitude?.toString());
145
+ addParam('lon', longitude?.toString());
146
+ trackerData.fired = true;
147
+ fetch(url, {
148
+ method: 'GET',
149
+ mode: 'no-cors'
150
+ }).then(() => {
151
+ log?.debug('Successfully fired tracker [' + trackerName + ']');
152
+ }).catch(err => {
153
+ log?.error('Failed to fire tracker [' + trackerName + ']', err);
154
+ });
155
+ };
156
+ const toggleMute = (logger, videoElement, e) => {
157
+ const log = Ctx(logger)?.with('toggleMute');
158
+ log?.info('Toggling mute button');
159
+ videoElement.muted = !videoElement.muted;
160
+ const element = e.target;
161
+ if (videoElement.muted) {
162
+ log?.debug('Muted');
163
+ element.classList.add('muted');
164
+ element.classList.remove('unmuted');
165
+ }
166
+ else {
167
+ log?.debug('Unmuted');
168
+ element.classList.add('unmuted');
169
+ element.classList.remove('muted');
170
+ }
171
+ };
172
+ const template = `<div>
173
+ <video id="surf-video-container" autoplay muted></video>
174
+
175
+ <div class="timer">
176
+ <svg
177
+ width="36"
178
+ height="36"
179
+ viewBox="-2 2 36 36"
180
+ >
181
+ <circle
182
+ cx="16"
183
+ cy="16"
184
+ r="15"
185
+ stroke="#7b4af4"
186
+ stroke-width="4"
187
+ fill="none"
188
+ class="timer-circle"
189
+ />
190
+ </svg>
191
+ <div class="timer-value"></div>
192
+ </div>
193
+
194
+ <div class="watermark"></div>
195
+ <div class="mute-button muted"></div>
196
+ </div>`;
197
+ const style = `@keyframes grow-arc {
198
+ 0% {
199
+ stroke-dasharray: 0 94; /* 0% of the circumference */
200
+ stroke-dashoffset: 0;
201
+ }
202
+ 50% {
203
+ stroke-dasharray: 47 94; /* 90 degrees of the circle */
204
+ stroke-dashoffset: 0;
205
+ }
206
+ 100% {
207
+ stroke-dasharray: 94 94; /* Full circle */
208
+ stroke-dashoffset: 0;
209
+ }
210
+ }
211
+
212
+
213
+ .surfside-video {
214
+ --icon-muted: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none'%3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M9.586 3.586C10.846 2.326 13 3.218 13 5v14c0 1.782-2.154 2.674-3.414 1.414L5.172 16H4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h1.172l4.414-4.414ZM11 5 6.293 9.707a1 1 0 0 1-.707.293H4v4h1.586a1 1 0 0 1 .707.293L11 19V5Zm5.293 4.293a1 1 0 0 1 1.414 0L19 10.586l1.293-1.293a1 1 0 1 1 1.414 1.414L20.414 12l1.293 1.293a1 1 0 0 1-1.414 1.414L19 13.414l-1.293 1.293a1 1 0 0 1-1.414-1.414L17.586 12l-1.293-1.293a1 1 0 0 1 0-1.414Z' clip-rule='evenodd'/%3E%3C/svg%3E");
215
+ --icon-unmuted: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none'%3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M9.586 3.586C10.846 2.326 13 3.218 13 5v14c0 1.782-2.154 2.674-3.414 1.414L5.172 16H4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h1.172l4.414-4.414ZM11 5 6.293 9.707a1 1 0 0 1-.707.293H4v4h1.586a1 1 0 0 1 .707.293L11 19V5Zm6.657-.071a1 1 0 0 1 1.414 0c3.905 3.905 3.905 10.237 0 14.142a1 1 0 0 1-1.414-1.414 8 8 0 0 0 0-11.314 1 1 0 0 1 0-1.414Zm-2.829 2.828a1 1 0 0 1 1.415 0 6 6 0 0 1 0 8.486 1 1 0 1 1-1.415-1.415 4 4 0 0 0 0-5.656 1 1 0 0 1 0-1.415Z' clip-rule='evenodd'/%3E%3C/svg%3E");
216
+
217
+ position: relative;
218
+ overflow: hidden;
219
+
220
+ video {
221
+ width: 100%;
222
+ height: auto;
223
+ }
224
+
225
+ .timer {
226
+ position: absolute;
227
+ left: 5px;
228
+ top: 5px;
229
+ width: 32px;
230
+ height: 32px;
231
+
232
+ .timer-value {
233
+ position: absolute;
234
+ top: 0px;
235
+ left: 0;
236
+ width: 36px;
237
+ height: 36px;
238
+
239
+ color: white;
240
+
241
+ font-family: Poppins, Arial;
242
+ text-align: center;
243
+ font-size: 12px;
244
+ line-height: 36px;
245
+ }
246
+
247
+ .timer-circle {
248
+ fill: none;
249
+ stroke-width: 4;
250
+ animation-name: grow-arc;
251
+ animation-iteration-count: 1;
252
+ animation-timing-function: linear;
253
+ animation-fill-mode: forwards;
254
+ transform: rotate(-90deg);
255
+ transform-origin: 50% 50%;
256
+ }
257
+
258
+ }
259
+
260
+ .mute-button {
261
+ position: absolute;
262
+ width: 24px;
263
+ height: 24px;
264
+ right: 5px;
265
+ bottom: 5px;
266
+ cursor: pointer;
267
+ transition: transform 0.2s;
268
+ filter: drop-shadow(0 0 2px white) drop-shadow(0 0 4px white);
269
+
270
+ &:hover {
271
+ transform: scale(1.3);
272
+ }
273
+
274
+ &:active {
275
+ transform: scale(0.8);
276
+ }
277
+
278
+ &.muted {
279
+ background-image: var(--icon-muted);
280
+
281
+ &:hover {
282
+ background-image: var(--icon-unmuted);
283
+ }
284
+ }
285
+
286
+ &.unmuted {
287
+ background-image: var(--icon-unmuted);
288
+
289
+ &:hover {
290
+ background-image: var(--icon-muted);
291
+ }
292
+ }
293
+ }
294
+ }`;
295
+ //# sourceMappingURL=Video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Video.js","sourceRoot":"src/","sources":["rendering/Video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { Ctx, Ok } from '@surfside/ads-core';
2
+ export const RenderWatermark = (logger) => {
3
+ const log = Ctx(logger)?.with('RenderWatermark');
4
+ const parser = new DOMParser();
5
+ const doc = parser.parseFromString(template, 'text/html');
6
+ const wrapper = document.createElement('div');
7
+ const shadow = wrapper.attachShadow({ mode: 'open' });
8
+ const stylesheet = document.createElement('style');
9
+ stylesheet.innerHTML = style;
10
+ shadow.appendChild(stylesheet);
11
+ for (let i = 0; i < doc.body.children.length; i++) {
12
+ const element = doc.body.children.item(i);
13
+ if (element === null) {
14
+ log?.warn('Child returned null for some reason', i);
15
+ continue;
16
+ }
17
+ shadow.appendChild(element);
18
+ }
19
+ return Ok(wrapper);
20
+ };
21
+ const template = `<div class="watermark">
22
+ <a href="https://surfside.io/contact" target="_blank">
23
+ <div class="watermark-svg">
24
+ <img src="https://cdn.surfside.io/assets/surfside-logo.svg" alt="Surfside logo"/>
25
+ </div>
26
+ </a>
27
+ </div>
28
+ `;
29
+ const style = `.watermark {
30
+ background: rgba(255, 255, 255, 0.7);
31
+
32
+ position: absolute;
33
+ right: -67px;
34
+ width: 85px;
35
+ /* transform: scale(0.8); */
36
+ transform-origin: bottom right;
37
+ bottom: 0;
38
+
39
+ padding: 3px 2px 0px 6px;
40
+ border-radius: 5px 0 0 5px !important;
41
+ transition: right 300ms ease-out;
42
+
43
+ &:hover {
44
+ right: 0
45
+ }
46
+ }
47
+
48
+ .surfside-video .watermark {
49
+ top: 0;
50
+ height: auto;
51
+ bottom: initial;
52
+ overflow: hidden;
53
+ }
54
+ `;
55
+ //# sourceMappingURL=Watermark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Watermark.js","sourceRoot":"src/","sources":["rendering/Watermark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAgB,EAAE,EAAe,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAA2B,EAAuB,EAAE;IAChF,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACnD,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,GAAG,EAAE,IAAI,CAAC,qCAAqC,EAAE,CAAC,CAAC,CAAC;YACpD,SAAS;QACb,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;CAOhB,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './Banner';
2
+ export * from './Carousel';
3
+ export * from './Framework';
4
+ export * from './ProductCard';
5
+ export * from './Video';
6
+ export * from './Watermark';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["rendering/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,27 +1,37 @@
1
- {
2
- "name": "@surfside/ads-core-web",
3
- "module": "./lib/esm/index.js",
4
- "main": "./lib/cjs/index.js",
5
- "types": "./lib/types/index.d.ts",
6
- "version": "0.1.0",
7
- "license": "UNLICENSED",
8
- "files": [
9
- "lib/",
10
- "README.md"
11
- ],
12
- "type": "module",
13
- "scripts": {
14
- "build": "bun bun.build.ts",
15
- "lint": "npx eslint"
16
- },
17
- "devDependencies": {
18
- "@eslint/js": "^9.25.1",
19
- "@types/bun": "latest",
20
- "eslint": "^9.25.1",
21
- "handlebars": "^4.7.8",
22
- "typescript-eslint": "^8.31.0",
23
- "@surfside/ads-core-client": "^0.1.0",
24
- "@surfside/ads-core-mock": "^0.1.0",
25
- "typescript": "^5.8.3"
26
- }
27
- }
1
+ {
2
+ "name": "@surfside/ads-core-web",
3
+ "module": "./lib/esm/index.js",
4
+ "main": "./lib/cjs/index.js",
5
+ "types": "./lib/types/index.d.ts",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./lib/esm/index.js",
9
+ "require": "./lib/cjs/index.js",
10
+ "types": "./lib/types/index.d.ts"
11
+ }
12
+ },
13
+ "version": "0.1.2",
14
+ "license": "UNLICENSED",
15
+ "files": [
16
+ "lib/",
17
+ "README.md"
18
+ ],
19
+ "type": "module",
20
+ "scripts": {
21
+ "clean": "rm -rf ./lib",
22
+ "build": "tsc -p ./tsconfig.types.json && tsc -p ./tsconfig.esm.json && tsc -p tsconfig.cjs.json",
23
+ "lint": "npx eslint"
24
+ },
25
+ "dependencies": {
26
+ "@surfside/ads-core-client": "^0.1.2"
27
+ },
28
+ "devDependencies": {
29
+ "@eslint/js": "^9.25.1",
30
+ "@types/bun": "latest",
31
+ "eslint": "^9.25.1",
32
+ "handlebars": "^4.7.8",
33
+ "typescript-eslint": "^8.31.0",
34
+ "@surfside/ads-core-mock": "^0.1.0",
35
+ "typescript": "^5.8.3"
36
+ }
37
+ }
@@ -1,2 +0,0 @@
1
- declare const _exports: any;
2
- export = _exports;