@capibox/bridge-server 0.0.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,516 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
40
+
41
+ // src/server/middleware.ts
42
+ import { NextResponse, userAgent } from "next/server";
43
+
44
+ // src/server/_utils/is.ts
45
+ var regexes = {
46
+ ipv4: /^(?:(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/,
47
+ ipv6: /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i
48
+ };
49
+ function not(func) {
50
+ return function() {
51
+ return !func.apply(null, Array.prototype.slice.call(arguments));
52
+ };
53
+ }
54
+ function existy(value) {
55
+ return value != null;
56
+ }
57
+ function ip(value) {
58
+ return existy(value) && regexes.ipv4.test(value) || regexes.ipv6.test(value);
59
+ }
60
+ function object(value) {
61
+ return Object(value) === value;
62
+ }
63
+ function string(value) {
64
+ return Object.prototype.toString.call(value) === "[object String]";
65
+ }
66
+ var is = {
67
+ existy,
68
+ ip,
69
+ object,
70
+ string,
71
+ not: {
72
+ existy: not(existy),
73
+ ip: not(ip),
74
+ object: not(object),
75
+ string: not(string)
76
+ }
77
+ };
78
+ var is_default = is;
79
+
80
+ // src/server/_utils/client-ip.ts
81
+ function getClientIpFromXForwardedFor(value) {
82
+ if (!is_default.existy(value)) {
83
+ return null;
84
+ }
85
+ const forwardedIps = value.split(",").map(function(e) {
86
+ const ip2 = e.trim();
87
+ if (ip2.includes(":")) {
88
+ const splitted = ip2.split(":");
89
+ if (splitted.length === 2) {
90
+ return splitted[0];
91
+ }
92
+ }
93
+ return ip2;
94
+ });
95
+ for (let i = 0; i < forwardedIps.length; i++) {
96
+ if (is_default.ip(forwardedIps[i])) {
97
+ return forwardedIps[i];
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ function getClientIp(req) {
103
+ if (req.headers) {
104
+ if (is_default.ip(req.headers["x-client-ip"])) {
105
+ return req.headers["x-client-ip"];
106
+ }
107
+ const xForwardedFor = getClientIpFromXForwardedFor(req.headers["x-forwarded-for"]);
108
+ if (is_default.ip(req.headers["cf-connecting-ip"])) {
109
+ return req.headers["cf-connecting-ip"];
110
+ }
111
+ if (is_default.ip(req.headers["fastly-client-ip"])) {
112
+ return req.headers["fastly-client-ip"];
113
+ }
114
+ if (is_default.ip(req.headers["true-client-ip"])) {
115
+ return req.headers["true-client-ip"];
116
+ }
117
+ if (is_default.ip(req.headers["x-real-ip"])) {
118
+ return req.headers["x-real-ip"];
119
+ }
120
+ if (is_default.ip(req.headers["x-cluster-client-ip"])) {
121
+ return req.headers["x-cluster-client-ip"];
122
+ }
123
+ if (is_default.ip(req.headers["x-forwarded"])) {
124
+ return req.headers["x-forwarded"];
125
+ }
126
+ if (is_default.ip(req.headers["forwarded-for"])) {
127
+ return req.headers["forwarded-for"];
128
+ }
129
+ if (is_default.ip(xForwardedFor)) {
130
+ return xForwardedFor;
131
+ }
132
+ if (is_default.ip(req.headers.forwarded)) {
133
+ return req.headers.forwarded;
134
+ }
135
+ if (is_default.ip(req.headers["x-appengine-user-ip"])) {
136
+ return req.headers["x-appengine-user-ip"];
137
+ }
138
+ }
139
+ if (is_default.existy(req.connection) && !!req.connection) {
140
+ if (is_default.ip(req.connection.remoteAddress)) {
141
+ return req.connection.remoteAddress;
142
+ }
143
+ if (is_default.existy(req.connection.socket) && !!req.connection.socket && !!req.connection.socket.remoteAddress && is_default.ip(req.connection.socket.remoteAddress)) {
144
+ return req.connection.socket.remoteAddress;
145
+ }
146
+ }
147
+ if (is_default.existy(req.socket) && !!req.socket && !!req.socket.remoteAddress && is_default.ip(req.socket.remoteAddress)) {
148
+ return req.socket.remoteAddress;
149
+ }
150
+ if (is_default.existy(req.info) && !!req.info && !!req.info.remoteAddress && is_default.ip(req.info.remoteAddress)) {
151
+ return req.info.remoteAddress;
152
+ }
153
+ if (is_default.existy(req.requestContext) && !!req.requestContext && is_default.existy(req.requestContext.identity) && !!req.requestContext.identity && !!req.requestContext.identity.sourceIp && is_default.ip(req.requestContext.identity.sourceIp)) {
154
+ return req.requestContext.identity.sourceIp;
155
+ }
156
+ if (req.headers) {
157
+ if (is_default.ip(req.headers["Cf-Pseudo-IPv4"])) {
158
+ return req.headers["Cf-Pseudo-IPv4"];
159
+ }
160
+ }
161
+ return "127.0.0.2";
162
+ }
163
+
164
+ // src/browser/crm-auth/path.ts
165
+ var CRM_AUTH_SIGN_IN_PATH = "/api/crm-auth/sign-in";
166
+ var CRM_AUTH_SIGN_OUT_PATH = "/api/crm-auth/sign-out";
167
+ var CRM_AUTH_VERIFY_PATH = "/api/crm-auth/verify";
168
+
169
+ // src/server/_utils/server-fetch-utils.ts
170
+ var serverProxyHeaders = () => {
171
+ return {
172
+ "Content-Type": "application/json",
173
+ "Authorization": `${process.env.CAPIBOX_ENV}`.toLowerCase() === "prod" ? `${process.env.CAPIBOX_API_KEY}` : "dev"
174
+ };
175
+ };
176
+
177
+ // src/server/middleware.ts
178
+ import cache3 from "memory-cache";
179
+
180
+ // src/server/cache/cache.ts
181
+ var CACHE_KEY_FUNNELS = "funnels-data";
182
+ var CACHE_KEY_SPLIT = "split-data";
183
+
184
+ // src/server/split/get-split-data.ts
185
+ import cache from "memory-cache";
186
+
187
+ // src/server/_utils/backend-url.ts
188
+ var getBackendUrl = () => {
189
+ return process.env.CLIENT_BACKEND_URL ? process.env.CLIENT_BACKEND_URL : "https://api.capibox.com";
190
+ };
191
+
192
+ // src/server/split/get-split-data.ts
193
+ var getSplitData = () => __async(null, null, function* () {
194
+ const cachedResponse = cache.get(CACHE_KEY_SPLIT);
195
+ if (cachedResponse) {
196
+ return cachedResponse;
197
+ } else {
198
+ try {
199
+ const res = yield fetch(`${getBackendUrl()}/funnels/split`, {
200
+ headers: {
201
+ "Content-Type": "application/json",
202
+ "Authorization": `${process.env.CAPIBOX_API_KEY}`
203
+ }
204
+ });
205
+ let resJson = [];
206
+ if (res.ok) {
207
+ resJson = yield res.json();
208
+ }
209
+ cache.put(CACHE_KEY_SPLIT, resJson, 2147483647);
210
+ return resJson;
211
+ } catch (e) {
212
+ return [];
213
+ }
214
+ }
215
+ });
216
+
217
+ // src/server/_utils/trim-char.ts
218
+ var trimChar = (string2, charToRemove) => {
219
+ while (string2.charAt(0) == charToRemove) {
220
+ string2 = string2.substring(1);
221
+ }
222
+ while (string2.charAt(string2.length - 1) == charToRemove) {
223
+ string2 = string2.substring(0, string2.length - 1);
224
+ }
225
+ return string2;
226
+ };
227
+
228
+ // src/server/split/get-split-item.ts
229
+ var getSplitItemForPath = (_0) => __async(null, [_0], function* ({ path }) {
230
+ const splits = yield getSplitData();
231
+ const inputs = splits.filter((i) => i.active).map((i) => `/${trimChar(i.url ? i.url : "", "/")}`);
232
+ const inputIndex = inputs.indexOf(path);
233
+ if (inputIndex >= 0) {
234
+ return splits[inputIndex];
235
+ }
236
+ return void 0;
237
+ });
238
+ var getSplitItemForReq = (_0) => __async(null, [_0], function* ({ req }) {
239
+ return yield getSplitItemForPath({ path: req.nextUrl.pathname });
240
+ });
241
+
242
+ // src/server/split/get-split-winner.ts
243
+ var getSplitItemUrlWinner = (item) => {
244
+ const splitValues = fillSplitItemUrlsRange(item);
245
+ const _time = (/* @__PURE__ */ new Date()).getTime();
246
+ const _seed100 = _time % 100;
247
+ let currentSplit = splitValues.find(
248
+ (e) => e.range.start <= _seed100 && e.range.finish > _seed100
249
+ );
250
+ if (!currentSplit) {
251
+ currentSplit = splitValues[0];
252
+ }
253
+ return currentSplit;
254
+ };
255
+ var fillSplitItemUrlsRange = (item) => {
256
+ const splits = item.splits ? item.splits : [];
257
+ return splits.map((curr, i, data) => {
258
+ const minPercent = data.slice(0, i).map((a) => a.split).reduce((a, b) => a + b, 0);
259
+ return __spreadProps(__spreadValues({}, curr), {
260
+ range: {
261
+ start: minPercent,
262
+ finish: minPercent + curr.split
263
+ }
264
+ });
265
+ });
266
+ };
267
+
268
+ // src/browser/funnels/get-capibox-templates.ts
269
+ import cache2 from "memory-cache";
270
+ var getCapiboxTemplates = () => __async(null, null, function* () {
271
+ const cachedResponse = cache2.get(CACHE_KEY_FUNNELS);
272
+ if (cachedResponse) {
273
+ return cachedResponse;
274
+ } else {
275
+ const funnelRes = yield fetch(`${getBackendUrl()}/funnels/funnel`, {
276
+ headers: {
277
+ "project-key": `${process.env.CAPIBOX_API_KEY}`
278
+ }
279
+ });
280
+ const responseBody = yield funnelRes.json();
281
+ cache2.put(CACHE_KEY_FUNNELS, responseBody, 2147483647);
282
+ return responseBody;
283
+ }
284
+ });
285
+
286
+ // src/server/middleware.ts
287
+ var middleware = (req, options) => __async(null, null, function* () {
288
+ if (req.nextUrl.pathname.startsWith("/app/clear-cache")) {
289
+ cache3.del(CACHE_KEY_FUNNELS);
290
+ cache3.del(CACHE_KEY_SPLIT);
291
+ const res = NextResponse.json({ s: (/* @__PURE__ */ new Date()).getTime() });
292
+ res.headers.append("Access-Control-Allow-Credentials", "true");
293
+ res.headers.append("Access-Control-Allow-Origin", "*");
294
+ res.headers.append("Access-Control-Allow-Methods", "GET,DELETE,PATCH,POST,PUT");
295
+ res.headers.append(
296
+ "Access-Control-Allow-Headers",
297
+ "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version"
298
+ );
299
+ return res;
300
+ }
301
+ if ((options == null ? void 0 : options.templates) && req.nextUrl.pathname.startsWith("/app/get-templates")) {
302
+ const res = NextResponse.json({
303
+ success: true,
304
+ data: options.templates
305
+ });
306
+ res.headers.append("Access-Control-Allow-Credentials", "true");
307
+ res.headers.append("Access-Control-Allow-Origin", "*");
308
+ res.headers.append("Access-Control-Allow-Methods", "GET,DELETE,PATCH,POST,PUT");
309
+ res.headers.append(
310
+ "Access-Control-Allow-Headers",
311
+ "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version"
312
+ );
313
+ return res;
314
+ }
315
+ const input = yield getSplitItemForReq({ req });
316
+ if (input) {
317
+ const currentSplit = getSplitItemUrlWinner(input);
318
+ return NextResponse.redirect(
319
+ new URL(`/${trimChar(currentSplit.url, "/")}${req.nextUrl.search}`, req.url)
320
+ );
321
+ }
322
+ if (req.nextUrl.pathname.startsWith("/api-client-proxy")) {
323
+ if (req.nextUrl.pathname === "/api-client-proxy/funnels/funnel") {
324
+ const capiboxTemplates = yield getCapiboxTemplates();
325
+ const res = NextResponse.json(capiboxTemplates);
326
+ res.headers.set("X-Cache", "HIT");
327
+ return res;
328
+ }
329
+ let urlClone = req.nextUrl.clone();
330
+ const targetUrl = new URL(getBackendUrl());
331
+ const requestHeaders = new Headers(req.headers);
332
+ requestHeaders.set("host", targetUrl.hostname);
333
+ requestHeaders.set("project-key", `${process.env.CAPIBOX_API_KEY}`);
334
+ if (req.nextUrl.pathname.includes("/realtime/")) {
335
+ const ip2 = getClientIp({ headers: Object.fromEntries(req.headers) });
336
+ const { device, browser, os } = userAgent(req);
337
+ requestHeaders.set("x-client-ip", ip2);
338
+ requestHeaders.set("x-os", `${os.name} / ${os.version}`);
339
+ requestHeaders.set("x-browser", `${browser.name} / ${browser.version}`);
340
+ requestHeaders.set("x-device", device.type ? device.type : "-");
341
+ const anUuidV3Cookie = req.cookies.get("an_uuid_v3");
342
+ if (anUuidV3Cookie) {
343
+ requestHeaders.set("x-realtime", anUuidV3Cookie == null ? void 0 : anUuidV3Cookie.value);
344
+ }
345
+ }
346
+ if (req.nextUrl.pathname === "/api-client-proxy/session") {
347
+ const ip2 = getClientIp({ headers: Object.fromEntries(req.headers) });
348
+ const { ua } = userAgent(req);
349
+ requestHeaders.set("x-client-ip", ip2);
350
+ requestHeaders.set("x-user-agent", ua);
351
+ }
352
+ urlClone.protocol = targetUrl.protocol;
353
+ urlClone.hostname = targetUrl.hostname;
354
+ urlClone.port = targetUrl.port;
355
+ urlClone.pathname = urlClone.pathname.replace(/^\/api-client-proxy/, "");
356
+ return NextResponse.rewrite(urlClone, {
357
+ headers: requestHeaders
358
+ });
359
+ }
360
+ if (req.nextUrl.pathname === CRM_AUTH_SIGN_IN_PATH) {
361
+ const res = yield fetch(
362
+ "https://auth.crm.apidata.app/api/sign-in",
363
+ {
364
+ method: "POST",
365
+ body: JSON.stringify(yield req.json()),
366
+ headers: serverProxyHeaders()
367
+ }
368
+ );
369
+ const resJson = yield res.json();
370
+ const result = NextResponse.json(resJson);
371
+ if (!!resJson.action && !!resJson.token && resJson.action === "logged-in") {
372
+ result.cookies.set({
373
+ name: "token",
374
+ value: resJson.token,
375
+ maxAge: 60 * 60 * 24 * 30,
376
+ httpOnly: true
377
+ });
378
+ }
379
+ return result;
380
+ }
381
+ if (req.nextUrl.pathname === CRM_AUTH_VERIFY_PATH) {
382
+ const tokenCookie = req.cookies.get("token");
383
+ if (!tokenCookie || !tokenCookie.value) {
384
+ return NextResponse.json({ success: 0 });
385
+ }
386
+ const payload = {
387
+ data: {
388
+ token: tokenCookie.value
389
+ }
390
+ };
391
+ const res = yield fetch(
392
+ "https://auth.crm.apidata.app/api/check",
393
+ {
394
+ method: "POST",
395
+ body: JSON.stringify(payload),
396
+ headers: serverProxyHeaders()
397
+ }
398
+ );
399
+ const resJson = yield res.json();
400
+ const result = NextResponse.json(resJson);
401
+ if (!("id" in resJson && resJson.id > 0)) {
402
+ result.cookies.delete("token");
403
+ }
404
+ return result;
405
+ }
406
+ if (req.nextUrl.pathname === CRM_AUTH_SIGN_OUT_PATH) {
407
+ const res = NextResponse.json({ success: 1 });
408
+ res.cookies.delete("token");
409
+ return res;
410
+ }
411
+ });
412
+
413
+ // src/lib/api.ts
414
+ import createFetchClient from "openapi-fetch";
415
+ var endpoint = "/api-client-proxy";
416
+ var $apiClient = createFetchClient({
417
+ baseUrl: endpoint,
418
+ headers: {
419
+ "project-key": "Frontend"
420
+ }
421
+ });
422
+
423
+ // src/browser/funnels/get.ts
424
+ var getFunnels = () => __async(null, null, function* () {
425
+ let response = [];
426
+ if (typeof window == "undefined") {
427
+ response = yield getCapiboxTemplates();
428
+ } else {
429
+ const res = yield $apiClient.GET("/funnels/funnel", {
430
+ params: {
431
+ header: {
432
+ "project-key": "Frontend"
433
+ }
434
+ }
435
+ });
436
+ if (!res || !res.data) return [];
437
+ response = res.data;
438
+ }
439
+ const tmpFunnels = response;
440
+ const output = [];
441
+ for (const funnel of tmpFunnels) {
442
+ output.push({
443
+ landing: funnel.angle,
444
+ checkout: funnel.version,
445
+ angle: funnel.angle,
446
+ version: funnel.version,
447
+ homePageTemplate: funnel.home_page,
448
+ quizPageTemplate: funnel.quiz_page,
449
+ resultPageTemplate: funnel.results_page,
450
+ emailPageTemplate: funnel.email_page,
451
+ checkoutPageTemplate: funnel.checkout_page,
452
+ paymentWindowTemplate: funnel.payment_window,
453
+ upsellPageTemplate: funnel.upsell_page,
454
+ options: funnel.options,
455
+ upsellOptions: funnel.upsell_options
456
+ });
457
+ }
458
+ return output;
459
+ });
460
+
461
+ // src/browser/funnels/get-templates.ts
462
+ var defaultTemplate = {
463
+ homePageTemplate: "Default",
464
+ quizPageTemplate: "Default",
465
+ resultPageTemplate: "Default",
466
+ emailPageTemplate: "Default",
467
+ checkoutPageTemplate: "Default",
468
+ paymentWindowTemplate: "Default",
469
+ upsellPageTemplate: "Default"
470
+ };
471
+ var getTemplates = (_0) => __async(null, [_0], function* ({
472
+ angle,
473
+ version,
474
+ searchParams
475
+ }) {
476
+ const funnelsData = yield getFunnels();
477
+ const filteredFunnelsData = funnelsData.filter((a) => {
478
+ if ((a.checkout === version || a.checkout === "any") && (a.landing === angle || a.landing === "any")) {
479
+ return true;
480
+ }
481
+ return false;
482
+ });
483
+ if (filteredFunnelsData.length > 0) {
484
+ const _flowData = JSON.parse(
485
+ JSON.stringify(filteredFunnelsData[filteredFunnelsData.length - 1])
486
+ );
487
+ if (searchParams) {
488
+ const keys = Object.keys(defaultTemplate);
489
+ for (const key of keys) {
490
+ if (searchParams.get(key)) {
491
+ _flowData[key] = searchParams.get(key);
492
+ }
493
+ }
494
+ }
495
+ return _flowData;
496
+ }
497
+ return __spreadProps(__spreadValues({}, defaultTemplate), {
498
+ landing: angle,
499
+ checkout: version,
500
+ angle,
501
+ version
502
+ });
503
+ });
504
+
505
+ // src/index.ts
506
+ var server = {
507
+ middleware,
508
+ funnels: {
509
+ get: getFunnels,
510
+ getTemplates
511
+ }
512
+ };
513
+ export {
514
+ server
515
+ };
516
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/middleware.ts","../src/server/_utils/is.ts","../src/server/_utils/client-ip.ts","../src/browser/crm-auth/path.ts","../src/server/_utils/server-fetch-utils.ts","../src/server/cache/cache.ts","../src/server/split/get-split-data.ts","../src/server/_utils/backend-url.ts","../src/server/_utils/trim-char.ts","../src/server/split/get-split-item.ts","../src/server/split/get-split-winner.ts","../src/browser/funnels/get-capibox-templates.ts","../src/lib/api.ts","../src/browser/funnels/get.ts","../src/browser/funnels/get-templates.ts","../src/index.ts"],"sourcesContent":["import {NextRequest, NextResponse, userAgent} from \"next/server\";\nimport {getClientIp} from \"./_utils/client-ip\";\nimport {CRM_AUTH_SIGN_IN_PATH, CRM_AUTH_SIGN_OUT_PATH, CRM_AUTH_VERIFY_PATH} from \"../browser/crm-auth/path\";\nimport {serverProxyHeaders} from \"./_utils/server-fetch-utils\";\nimport cache from 'memory-cache';\nimport {CACHE_KEY_FUNNELS, CACHE_KEY_SPLIT} from \"./cache/cache\";\nimport {getSplitItemForReq} from \"./split/get-split-item\";\nimport {trimChar} from \"./_utils/trim-char\";\nimport {getSplitItemUrlWinner} from \"./split/get-split-winner\";\nimport {getBackendUrl} from \"./_utils/backend-url\";\nimport {getCapiboxTemplates} from \"../browser/funnels/get-capibox-templates\";\n\ntype Templates = {\n [key: string]: string[]\n}\n\ntype Options = {\n templates?: Templates,\n}\n\nexport const middleware = async (\n req: NextRequest,\n options?: Options,\n) => {\n if (req.nextUrl.pathname.startsWith('/app/clear-cache')) {\n cache.del(CACHE_KEY_FUNNELS);\n cache.del(CACHE_KEY_SPLIT);\n\n const res = NextResponse.json({s: new Date().getTime()})\n\n res.headers.append('Access-Control-Allow-Credentials', \"true\")\n res.headers.append('Access-Control-Allow-Origin', '*') // replace this your actual origin\n res.headers.append('Access-Control-Allow-Methods', 'GET,DELETE,PATCH,POST,PUT')\n res.headers.append(\n 'Access-Control-Allow-Headers',\n 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version'\n )\n return res;\n }\n\n if (options?.templates && req.nextUrl.pathname.startsWith('/app/get-templates')) {\n const res = NextResponse.json({\n success: true,\n\n data: options.templates,\n })\n res.headers.append('Access-Control-Allow-Credentials', \"true\")\n res.headers.append('Access-Control-Allow-Origin', '*') // replace this your actual origin\n res.headers.append('Access-Control-Allow-Methods', 'GET,DELETE,PATCH,POST,PUT')\n res.headers.append(\n 'Access-Control-Allow-Headers',\n 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version'\n )\n\n return res\n }\n\n // SPLIT TEST\n const input = await getSplitItemForReq({req});\n if (input) {\n const currentSplit = getSplitItemUrlWinner(input);\n\n return NextResponse.redirect(\n new URL(`/${trimChar(currentSplit.url, '/')}${req.nextUrl.search}`, req.url),\n )\n }\n\n if (req.nextUrl.pathname.startsWith('/api-client-proxy')) {\n if (req.nextUrl.pathname === '/api-client-proxy/funnels/funnel') {\n const capiboxTemplates = await getCapiboxTemplates();\n const res = NextResponse.json(capiboxTemplates);\n res.headers.set('X-Cache', 'HIT');\n return res;\n }\n\n let urlClone = req.nextUrl.clone();\n\n const targetUrl = new URL(getBackendUrl())\n const requestHeaders = new Headers(req.headers)\n requestHeaders.set('host', targetUrl.hostname)\n requestHeaders.set('project-key', `${process.env.CAPIBOX_API_KEY}`)\n\n if (req.nextUrl.pathname.includes('/realtime/')) {\n const ip = getClientIp({headers: Object.fromEntries(req.headers)})\n const {device, browser, os} = userAgent(req)\n requestHeaders.set('x-client-ip', ip)\n requestHeaders.set('x-os', `${os.name} / ${os.version}`)\n requestHeaders.set('x-browser', `${browser.name} / ${browser.version}`)\n requestHeaders.set('x-device', device.type ? device.type : '-')\n const anUuidV3Cookie = req.cookies.get('an_uuid_v3');\n if (anUuidV3Cookie) {\n requestHeaders.set('x-realtime', anUuidV3Cookie?.value)\n }\n }\n if (req.nextUrl.pathname === '/api-client-proxy/session') {\n const ip = getClientIp({headers: Object.fromEntries(req.headers)})\n const {ua} = userAgent(req);\n requestHeaders.set('x-client-ip', ip)\n requestHeaders.set('x-user-agent', ua)\n }\n\n urlClone.protocol = targetUrl.protocol\n urlClone.hostname = targetUrl.hostname\n urlClone.port = targetUrl.port\n urlClone.pathname = urlClone.pathname.replace(/^\\/api-client-proxy/, '');\n\n return NextResponse.rewrite(urlClone, {\n headers: requestHeaders,\n })\n }\n\n // crm auth\n if (req.nextUrl.pathname === CRM_AUTH_SIGN_IN_PATH) {\n const res = await fetch(\n 'https://auth.crm.apidata.app/api/sign-in',\n {\n method: 'POST',\n body: JSON.stringify(await req.json()),\n headers: serverProxyHeaders(),\n }\n )\n const resJson = await res.json();\n\n const result = NextResponse.json(resJson);\n if (!!resJson.action && !!resJson.token && resJson.action === 'logged-in') {\n result.cookies.set({\n name: \"token\",\n value: resJson.token,\n maxAge: 60 * 60 * 24 * 30,\n httpOnly: true,\n });\n }\n return result;\n }\n if (req.nextUrl.pathname === CRM_AUTH_VERIFY_PATH) {\n const tokenCookie = req.cookies.get('token')\n if (!tokenCookie || !tokenCookie.value) {\n return NextResponse.json({success: 0})\n }\n\n const payload = {\n data: {\n token: tokenCookie.value,\n }\n }\n const res = await fetch(\n 'https://auth.crm.apidata.app/api/check',\n {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: serverProxyHeaders(),\n }\n )\n const resJson = await res.json();\n\n const result = NextResponse.json(resJson);\n if (!('id' in resJson && resJson.id > 0)) {\n result.cookies.delete(\"token\");\n }\n return result;\n }\n if (req.nextUrl.pathname === CRM_AUTH_SIGN_OUT_PATH) {\n const res = NextResponse.json({success: 1});\n res.cookies.delete(\"token\");\n return res;\n }\n}","\"use strict\";\n\nconst regexes = {\n ipv4: /^(?:(?:\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])$/,\n ipv6: /^((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})((([\\dA-F]{1,4}((?!\\3)::|:\\b|$))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})$/i\n};\n\nfunction not(func: any) {\n return function () {\n return !func.apply(null, Array.prototype.slice.call(arguments));\n };\n}\n\nfunction existy(value: any) {\n return value != null;\n}\n\nfunction ip(value: any) {\n return existy(value) && regexes.ipv4.test(value) || regexes.ipv6.test(value);\n}\n\nfunction object(value: any) {\n return Object(value) === value;\n}\n\nfunction string(value: any) {\n return Object.prototype.toString.call(value) === '[object String]';\n}\n\nconst is = {\n existy: existy,\n ip: ip,\n object: object,\n string: string,\n not: {\n existy: not(existy),\n ip: not(ip),\n object: not(object),\n string: not(string)\n }\n};\nexport default is;\n","import is from \"./is\";\n\nfunction getClientIpFromXForwardedFor(value: any) {\n if (!is.existy(value)) {\n return null;\n }\n\n const forwardedIps = value.split(',').map(function (e: string) {\n const ip = e.trim();\n\n if (ip.includes(':')) {\n const splitted = ip.split(':');\n if (splitted.length === 2) {\n return splitted[0];\n }\n }\n return ip;\n });\n\n for (let i = 0; i < forwardedIps.length; i++) {\n if (is.ip(forwardedIps[i])) {\n return forwardedIps[i];\n }\n }\n\n return null;\n}\n\nexport function getClientIp(req: {\n headers?: {\n [key: string]: string\n },\n connection?: {\n remoteAddress?: string,\n socket?: {\n remoteAddress?: string,\n },\n },\n socket?: {\n remoteAddress?: string,\n },\n info?: {\n remoteAddress?: string,\n },\n requestContext?: {\n identity?: {\n sourceIp?: string,\n }\n },\n}) {\n if (req.headers) {\n if (is.ip(req.headers['x-client-ip'])) {\n return req.headers['x-client-ip'];\n }\n\n const xForwardedFor = getClientIpFromXForwardedFor(req.headers['x-forwarded-for']);\n\n if (is.ip(req.headers['cf-connecting-ip'])) {\n return req.headers['cf-connecting-ip'];\n }\n\n if (is.ip(req.headers['fastly-client-ip'])) {\n return req.headers['fastly-client-ip'];\n }\n\n if (is.ip(req.headers['true-client-ip'])) {\n return req.headers['true-client-ip'];\n }\n\n if (is.ip(req.headers['x-real-ip'])) {\n return req.headers['x-real-ip'];\n }\n\n if (is.ip(req.headers['x-cluster-client-ip'])) {\n return req.headers['x-cluster-client-ip'];\n }\n\n if (is.ip(req.headers['x-forwarded'])) {\n return req.headers['x-forwarded'];\n }\n\n if (is.ip(req.headers['forwarded-for'])) {\n return req.headers['forwarded-for'];\n }\n\n if (is.ip(xForwardedFor)) {\n return xForwardedFor;\n }\n\n if (is.ip(req.headers.forwarded)) {\n return req.headers.forwarded;\n }\n\n if (is.ip(req.headers['x-appengine-user-ip'])) {\n return req.headers['x-appengine-user-ip'];\n }\n }\n\n if (is.existy(req.connection) && !!req.connection) {\n if (is.ip(req.connection.remoteAddress)) {\n return req.connection.remoteAddress;\n }\n\n if (is.existy(req.connection.socket) && !!req.connection.socket && !!req.connection.socket.remoteAddress && is.ip(req.connection.socket.remoteAddress)) {\n return req.connection.socket.remoteAddress;\n }\n }\n\n if (is.existy(req.socket) && !!req.socket && !!req.socket.remoteAddress && is.ip(req.socket.remoteAddress)) {\n return req.socket.remoteAddress;\n }\n\n if (is.existy(req.info) && !!req.info && !!req.info.remoteAddress && is.ip(req.info.remoteAddress)) {\n return req.info.remoteAddress;\n }\n\n if (is.existy(req.requestContext) && !!req.requestContext && is.existy(req.requestContext.identity) && !!req.requestContext.identity && !!req.requestContext.identity.sourceIp && is.ip(req.requestContext.identity.sourceIp)) {\n return req.requestContext.identity.sourceIp;\n }\n\n if (req.headers) {\n if (is.ip(req.headers['Cf-Pseudo-IPv4'])) {\n return req.headers['Cf-Pseudo-IPv4'];\n }\n }\n\n return \"127.0.0.2\";\n}\n\n","export const CRM_AUTH_SIGN_IN_PATH = '/api/crm-auth/sign-in';\nexport const CRM_AUTH_SIGN_OUT_PATH = '/api/crm-auth/sign-out';\nexport const CRM_AUTH_VERIFY_PATH = '/api/crm-auth/verify';","import {NextRequest} from \"next/server\";\n// import {endpoint} from \"@capibox/bridge-interface\";\n\n// export const serverProxyPostRequest = async (req: NextRequest) => {\n// const res = await fetch(\n// req.nextUrl.pathname.replace(\n// endpoint.MAIN_ENDPOINT,\n// 'https://api.capibox.com'\n// ),\n// {\n// method: 'POST',\n// body: JSON.stringify(await req.json()),\n// headers: serverProxyHeaders(),\n// }\n// )\n// return await res.json();\n// }\n\nexport const serverProxyHeaders = () => {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': `${process.env.CAPIBOX_ENV}`.toLowerCase() === 'prod' ? `${process.env.CAPIBOX_API_KEY}` : 'dev'\n }\n}","export const CACHE_KEY_FUNNELS = 'funnels-data';\nexport const CACHE_KEY_SPLIT = 'split-data';","import cache from \"memory-cache\";\nimport {CACHE_KEY_SPLIT} from \"../cache/cache\";\nimport {components} from \"../../lib/api.def\";\nimport {getBackendUrl} from \"../_utils/backend-url\";\n\nexport const getSplitData = async (): Promise<components['schemas']['SplitResponseDto'][]> => {\n const cachedResponse = cache.get(CACHE_KEY_SPLIT);\n\n if (cachedResponse) {\n return cachedResponse;\n } else {\n try {\n const res = await fetch(`${getBackendUrl()}/funnels/split`, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `${process.env.CAPIBOX_API_KEY}`\n },\n });\n let resJson: components['schemas']['SplitResponseDto'][] = [];\n if (res.ok) {\n resJson = await res.json();\n }\n cache.put(CACHE_KEY_SPLIT, resJson, 2147483647);\n\n return resJson;\n } catch (e) {\n return [];\n }\n }\n};","export const getBackendUrl = () => {\n return process.env.CLIENT_BACKEND_URL ? process.env.CLIENT_BACKEND_URL : 'https://api.capibox.com';\n}","export const trimChar = (string: string, charToRemove: string) => {\n while (string.charAt(0) == charToRemove) {\n string = string.substring(1)\n }\n\n while (string.charAt(string.length - 1) == charToRemove) {\n string = string.substring(0, string.length - 1)\n }\n\n return string\n}\n","import {getSplitData} from \"./get-split-data\";\nimport {NextRequest} from \"next/server\";\nimport {trimChar} from \"../_utils/trim-char\";\n\nexport const getSplitItemForPath = async ({path}: { path: string }) => {\n\n const splits = await getSplitData();\n\n // TODO make url required\n const inputs = splits.filter(i => i.active)\n .map((i) => `/${trimChar((i.url ? i.url : ''), '/')}`)\n\n const inputIndex = inputs.indexOf(path)\n if (inputIndex >= 0) {\n return splits[inputIndex]\n }\n return undefined;\n}\n\nexport const getSplitItemForReq = async ({req}: { req: NextRequest }) => {\n return await getSplitItemForPath({path: req.nextUrl.pathname});\n}","import {components} from \"../../lib/api.def\";\n\nexport type SplitItemUrlWithRange = {\n range: {\n start: number,\n finish: number,\n }\n} & components['schemas']['SplitItemDto'];\n\nexport const getSplitItemUrlWinner = (item: components['schemas']['SplitResponseDto']) => {\n const splitValues = fillSplitItemUrlsRange(item);\n\n const _time = new Date().getTime()\n const _seed100 = _time % 100\n\n let currentSplit = splitValues.find(\n (e) => e.range.start <= _seed100 && e.range.finish > _seed100,\n )\n if (!currentSplit) {\n currentSplit = splitValues[0]\n }\n return currentSplit;\n}\n\n// TODO make splits required\nexport const fillSplitItemUrlsRange = (item: components['schemas']['SplitResponseDto']): SplitItemUrlWithRange[] => {\n const splits = item.splits ? item.splits : [];\n return splits.map((curr, i, data) => {\n const minPercent = data\n .slice(0, i)\n .map((a) => a.split)\n .reduce((a, b) => a + b, 0)\n\n return {\n ...curr,\n range: {\n start: minPercent,\n finish: minPercent + curr.split,\n },\n }\n });\n}","import cache from \"memory-cache\";\nimport {CACHE_KEY_FUNNELS} from \"../../server/cache/cache\";\nimport {getBackendUrl} from \"../../server/_utils/backend-url\";\nimport {components} from \"../../lib/api.def\";\n\nexport const getCapiboxTemplates = async (): Promise<components['schemas']['FunnelResponseDto'][]> => {\n const cachedResponse = cache.get(CACHE_KEY_FUNNELS);\n if (cachedResponse) {\n return cachedResponse;\n } else {\n const funnelRes = await fetch(`${getBackendUrl()}/funnels/funnel`, {\n headers: {\n 'project-key': `${process.env.CAPIBOX_API_KEY}`\n }\n })\n const responseBody = await funnelRes.json();\n cache.put(CACHE_KEY_FUNNELS, responseBody, 2147483647);\n return responseBody;\n }\n}","import createFetchClient from \"openapi-fetch\";\nimport type {paths} from \"./api.def\";\n\nconst endpoint = '/api-client-proxy';\n\nexport const $apiClient = createFetchClient<paths>({\n baseUrl: endpoint,\n headers: {\n 'project-key': \"Frontend\"\n },\n});","import {$apiClient} from \"../../lib/api\";\nimport {components} from \"../../lib/api.def\";\nimport {getCapiboxTemplates} from \"./get-capibox-templates\";\n\nexport type SdkRemoteFunnel = {\n checkout: string,\n landing: string,\n\n angle: string,\n version: string,\n\n homePageTemplate: string,\n quizPageTemplate: string,\n resultPageTemplate: string,\n emailPageTemplate: string,\n checkoutPageTemplate: string,\n paymentWindowTemplate: string,\n upsellPageTemplate: string,\n\n options?: any,\n upsellOptions?: any,\n}\n\nexport const getFunnels = async (): Promise<SdkRemoteFunnel[]> => {\n let response: components['schemas']['FunnelResponseDto'][] = [];\n if (typeof window == \"undefined\") {\n response = await getCapiboxTemplates();\n } else {\n const res = await $apiClient.GET('/funnels/funnel', {\n params: {\n header: {\n 'project-key': 'Frontend'\n }\n }\n });\n if (!res || !res.data) return [];\n response = res.data;\n }\n\n const tmpFunnels: components['schemas']['FunnelResponseDto'][] = response;\n const output: SdkRemoteFunnel[] = [];\n for (const funnel of tmpFunnels) {\n output.push({\n landing: funnel.angle,\n checkout: funnel.version,\n\n angle: funnel.angle,\n version: funnel.version,\n\n homePageTemplate: funnel.home_page,\n quizPageTemplate: funnel.quiz_page,\n resultPageTemplate: funnel.results_page,\n emailPageTemplate: funnel.email_page,\n checkoutPageTemplate: funnel.checkout_page,\n paymentWindowTemplate: funnel.payment_window,\n upsellPageTemplate: funnel.upsell_page,\n\n options: funnel.options,\n upsellOptions: funnel.upsell_options,\n });\n }\n return output;\n}","import {getFunnels, SdkRemoteFunnel} from \"./get\";\nimport {ReadonlyURLSearchParams} from \"next/navigation\";\n\n\ntype SdkRemoteTemplate = Omit<SdkRemoteFunnel, \"checkout\" | \"angle\" | \"landing\" | \"version\" | \"options\" | \"upsellOptions\">\n\nconst defaultTemplate: SdkRemoteTemplate = {\n homePageTemplate: 'Default',\n quizPageTemplate: 'Default',\n resultPageTemplate: 'Default',\n emailPageTemplate: 'Default',\n checkoutPageTemplate: 'Default',\n paymentWindowTemplate: 'Default',\n upsellPageTemplate: 'Default',\n}\n\ntype Props = {\n angle: string,\n version: string,\n searchParams?: ReadonlyURLSearchParams\n}\n\nexport const getTemplates = async ({\n angle, version, searchParams\n }: Props): Promise<SdkRemoteFunnel> => {\n const funnelsData = await getFunnels();\n\n const filteredFunnelsData = funnelsData.filter((a) => {\n if (\n (a.checkout === version || a.checkout === 'any') &&\n (a.landing === angle || a.landing === 'any')\n ) {\n return true\n }\n return false\n })\n if (filteredFunnelsData.length > 0) {\n const _flowData: SdkRemoteFunnel = JSON.parse(\n JSON.stringify(filteredFunnelsData[filteredFunnelsData.length - 1])\n )\n if (searchParams) {\n const keys = Object.keys(defaultTemplate)\n for (const key of keys) {\n if (searchParams.get(key)) {\n // @ts-ignore\n _flowData[key] = searchParams.get(key);\n }\n }\n }\n\n return _flowData;\n }\n return {\n ...defaultTemplate,\n landing: angle,\n checkout: version,\n angle,\n version,\n }\n}","import {middleware} from \"./server/middleware\";\nimport {getFunnels} from \"./browser/funnels/get\";\nimport {getTemplates} from \"./browser/funnels/get-templates\";\nexport {SdkRemoteFunnel} from \"./browser/funnels/get\";\n\nconst server = {\n middleware,\n funnels: {\n get: getFunnels,\n getTemplates\n }\n}\n\nexport {\n server\n}\n\n// v.0.0.50"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAqB,cAAc,iBAAgB;;;ACEnD,IAAM,UAAU;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AACV;AAEA,SAAS,IAAI,MAAW;AACpB,SAAO,WAAY;AACf,WAAO,CAAC,KAAK,MAAM,MAAM,MAAM,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,EAClE;AACJ;AAEA,SAAS,OAAO,OAAY;AACxB,SAAO,SAAS;AACpB;AAEA,SAAS,GAAG,OAAY;AACpB,SAAO,OAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK;AAC/E;AAEA,SAAS,OAAO,OAAY;AACxB,SAAO,OAAO,KAAK,MAAM;AAC7B;AAEA,SAAS,OAAO,OAAY;AACxB,SAAO,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM;AACrD;AAEA,IAAM,KAAK;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,IACD,QAAQ,IAAI,MAAM;AAAA,IAClB,IAAI,IAAI,EAAE;AAAA,IACV,QAAQ,IAAI,MAAM;AAAA,IAClB,QAAQ,IAAI,MAAM;AAAA,EACtB;AACJ;AACA,IAAO,aAAQ;;;ACvCf,SAAS,6BAA6B,OAAY;AAC9C,MAAI,CAAC,WAAG,OAAO,KAAK,GAAG;AACnB,WAAO;AAAA,EACX;AAEA,QAAM,eAAe,MAAM,MAAM,GAAG,EAAE,IAAI,SAAU,GAAW;AAC3D,UAAMA,MAAK,EAAE,KAAK;AAElB,QAAIA,IAAG,SAAS,GAAG,GAAG;AAClB,YAAM,WAAWA,IAAG,MAAM,GAAG;AAC7B,UAAI,SAAS,WAAW,GAAG;AACvB,eAAO,SAAS,CAAC;AAAA,MACrB;AAAA,IACJ;AACA,WAAOA;AAAA,EACX,CAAC;AAED,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,QAAI,WAAG,GAAG,aAAa,CAAC,CAAC,GAAG;AACxB,aAAO,aAAa,CAAC;AAAA,IACzB;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,SAAS,YAAY,KAqBzB;AACC,MAAI,IAAI,SAAS;AACb,QAAI,WAAG,GAAG,IAAI,QAAQ,aAAa,CAAC,GAAG;AACnC,aAAO,IAAI,QAAQ,aAAa;AAAA,IACpC;AAEA,UAAM,gBAAgB,6BAA6B,IAAI,QAAQ,iBAAiB,CAAC;AAEjF,QAAI,WAAG,GAAG,IAAI,QAAQ,kBAAkB,CAAC,GAAG;AACxC,aAAO,IAAI,QAAQ,kBAAkB;AAAA,IACzC;AAEA,QAAI,WAAG,GAAG,IAAI,QAAQ,kBAAkB,CAAC,GAAG;AACxC,aAAO,IAAI,QAAQ,kBAAkB;AAAA,IACzC;AAEA,QAAI,WAAG,GAAG,IAAI,QAAQ,gBAAgB,CAAC,GAAG;AACtC,aAAO,IAAI,QAAQ,gBAAgB;AAAA,IACvC;AAEA,QAAI,WAAG,GAAG,IAAI,QAAQ,WAAW,CAAC,GAAG;AACjC,aAAO,IAAI,QAAQ,WAAW;AAAA,IAClC;AAEA,QAAI,WAAG,GAAG,IAAI,QAAQ,qBAAqB,CAAC,GAAG;AAC3C,aAAO,IAAI,QAAQ,qBAAqB;AAAA,IAC5C;AAEA,QAAI,WAAG,GAAG,IAAI,QAAQ,aAAa,CAAC,GAAG;AACnC,aAAO,IAAI,QAAQ,aAAa;AAAA,IACpC;AAEA,QAAI,WAAG,GAAG,IAAI,QAAQ,eAAe,CAAC,GAAG;AACrC,aAAO,IAAI,QAAQ,eAAe;AAAA,IACtC;AAEA,QAAI,WAAG,GAAG,aAAa,GAAG;AACtB,aAAO;AAAA,IACX;AAEA,QAAI,WAAG,GAAG,IAAI,QAAQ,SAAS,GAAG;AAC9B,aAAO,IAAI,QAAQ;AAAA,IACvB;AAEA,QAAI,WAAG,GAAG,IAAI,QAAQ,qBAAqB,CAAC,GAAG;AAC3C,aAAO,IAAI,QAAQ,qBAAqB;AAAA,IAC5C;AAAA,EACJ;AAEA,MAAI,WAAG,OAAO,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,YAAY;AAC/C,QAAI,WAAG,GAAG,IAAI,WAAW,aAAa,GAAG;AACrC,aAAO,IAAI,WAAW;AAAA,IAC1B;AAEA,QAAI,WAAG,OAAO,IAAI,WAAW,MAAM,KAAK,CAAC,CAAC,IAAI,WAAW,UAAU,CAAC,CAAC,IAAI,WAAW,OAAO,iBAAiB,WAAG,GAAG,IAAI,WAAW,OAAO,aAAa,GAAG;AACpJ,aAAO,IAAI,WAAW,OAAO;AAAA,IACjC;AAAA,EACJ;AAEA,MAAI,WAAG,OAAO,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,OAAO,iBAAiB,WAAG,GAAG,IAAI,OAAO,aAAa,GAAG;AACxG,WAAO,IAAI,OAAO;AAAA,EACtB;AAEA,MAAI,WAAG,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,KAAK,iBAAiB,WAAG,GAAG,IAAI,KAAK,aAAa,GAAG;AAChG,WAAO,IAAI,KAAK;AAAA,EACpB;AAEA,MAAI,WAAG,OAAO,IAAI,cAAc,KAAK,CAAC,CAAC,IAAI,kBAAkB,WAAG,OAAO,IAAI,eAAe,QAAQ,KAAK,CAAC,CAAC,IAAI,eAAe,YAAY,CAAC,CAAC,IAAI,eAAe,SAAS,YAAY,WAAG,GAAG,IAAI,eAAe,SAAS,QAAQ,GAAG;AAC3N,WAAO,IAAI,eAAe,SAAS;AAAA,EACvC;AAEA,MAAI,IAAI,SAAS;AACb,QAAI,WAAG,GAAG,IAAI,QAAQ,gBAAgB,CAAC,GAAG;AACtC,aAAO,IAAI,QAAQ,gBAAgB;AAAA,IACvC;AAAA,EACJ;AAEA,SAAO;AACX;;;AC/HO,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB;;;ACgB7B,IAAM,qBAAqB,MAAM;AACpC,SAAO;AAAA,IACH,gBAAgB;AAAA,IAChB,iBAAiB,GAAG,QAAQ,IAAI,WAAW,GAAG,YAAY,MAAM,SAAS,GAAG,QAAQ,IAAI,eAAe,KAAK;AAAA,EAChH;AACJ;;;AJnBA,OAAOC,YAAW;;;AKJX,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;;;ACD/B,OAAO,WAAW;;;ACAX,IAAM,gBAAgB,MAAM;AAC/B,SAAO,QAAQ,IAAI,qBAAqB,QAAQ,IAAI,qBAAqB;AAC7E;;;ADGO,IAAM,eAAe,MAAkE;AAC1F,QAAM,iBAAiB,MAAM,IAAI,eAAe;AAEhD,MAAI,gBAAgB;AAChB,WAAO;AAAA,EACX,OAAO;AACH,QAAI;AACA,YAAM,MAAM,MAAM,MAAM,GAAG,cAAc,CAAC,kBAAkB;AAAA,QACxD,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,iBAAiB,GAAG,QAAQ,IAAI,eAAe;AAAA,QACnD;AAAA,MACJ,CAAC;AACD,UAAI,UAAuD,CAAC;AAC5D,UAAI,IAAI,IAAI;AACR,kBAAU,MAAM,IAAI,KAAK;AAAA,MAC7B;AACA,YAAM,IAAI,iBAAiB,SAAS,UAAU;AAE9C,aAAO;AAAA,IACX,SAAS,GAAG;AACR,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AACJ;;;AE7BO,IAAM,WAAW,CAACC,SAAgB,iBAAyB;AAC9D,SAAOA,QAAO,OAAO,CAAC,KAAK,cAAc;AACrC,IAAAA,UAASA,QAAO,UAAU,CAAC;AAAA,EAC/B;AAEA,SAAOA,QAAO,OAAOA,QAAO,SAAS,CAAC,KAAK,cAAc;AACrD,IAAAA,UAASA,QAAO,UAAU,GAAGA,QAAO,SAAS,CAAC;AAAA,EAClD;AAEA,SAAOA;AACX;;;ACNO,IAAM,sBAAsB,CAAO,OAA6B,eAA7B,KAA6B,WAA7B,EAAC,KAAI,GAAwB;AAEnE,QAAM,SAAS,MAAM,aAAa;AAGlC,QAAM,SAAS,OAAO,OAAO,OAAK,EAAE,MAAM,EACrC,IAAI,CAAC,MAAM,IAAI,SAAU,EAAE,MAAM,EAAE,MAAM,IAAK,GAAG,CAAC,EAAE;AAEzD,QAAM,aAAa,OAAO,QAAQ,IAAI;AACtC,MAAI,cAAc,GAAG;AACjB,WAAO,OAAO,UAAU;AAAA,EAC5B;AACA,SAAO;AACX;AAEO,IAAM,qBAAqB,CAAO,OAAgC,eAAhC,KAAgC,WAAhC,EAAC,IAAG,GAA4B;AACrE,SAAO,MAAM,oBAAoB,EAAC,MAAM,IAAI,QAAQ,SAAQ,CAAC;AACjE;;;ACZO,IAAM,wBAAwB,CAAC,SAAoD;AACtF,QAAM,cAAc,uBAAuB,IAAI;AAE/C,QAAM,SAAQ,oBAAI,KAAK,GAAE,QAAQ;AACjC,QAAM,WAAW,QAAQ;AAEzB,MAAI,eAAe,YAAY;AAAA,IAC3B,CAAC,MAAM,EAAE,MAAM,SAAS,YAAY,EAAE,MAAM,SAAS;AAAA,EACzD;AACA,MAAI,CAAC,cAAc;AACf,mBAAe,YAAY,CAAC;AAAA,EAChC;AACA,SAAO;AACX;AAGO,IAAM,yBAAyB,CAAC,SAA6E;AAChH,QAAM,SAAS,KAAK,SAAS,KAAK,SAAS,CAAC;AAC5C,SAAO,OAAO,IAAI,CAAC,MAAM,GAAG,SAAS;AACjC,UAAM,aAAa,KACd,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,EAClB,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAE9B,WAAO,iCACA,OADA;AAAA,MAEH,OAAO;AAAA,QACH,OAAO;AAAA,QACP,QAAQ,aAAa,KAAK;AAAA,MAC9B;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;;;ACzCA,OAAOC,YAAW;AAKX,IAAM,sBAAsB,MAAmE;AAClG,QAAM,iBAAiBC,OAAM,IAAI,iBAAiB;AAClD,MAAI,gBAAgB;AAChB,WAAO;AAAA,EACX,OAAO;AACH,UAAM,YAAY,MAAM,MAAM,GAAG,cAAc,CAAC,mBAAmB;AAAA,MAC/D,SAAS;AAAA,QACL,eAAe,GAAG,QAAQ,IAAI,eAAe;AAAA,MACjD;AAAA,IACJ,CAAC;AACD,UAAM,eAAe,MAAM,UAAU,KAAK;AAC1C,IAAAA,OAAM,IAAI,mBAAmB,cAAc,UAAU;AACrD,WAAO;AAAA,EACX;AACJ;;;AXCO,IAAM,aAAa,CACtB,KACA,YACC;AACD,MAAI,IAAI,QAAQ,SAAS,WAAW,kBAAkB,GAAG;AACrD,IAAAC,OAAM,IAAI,iBAAiB;AAC3B,IAAAA,OAAM,IAAI,eAAe;AAEzB,UAAM,MAAM,aAAa,KAAK,EAAC,IAAG,oBAAI,KAAK,GAAE,QAAQ,EAAC,CAAC;AAEvD,QAAI,QAAQ,OAAO,oCAAoC,MAAM;AAC7D,QAAI,QAAQ,OAAO,+BAA+B,GAAG;AACrD,QAAI,QAAQ,OAAO,gCAAgC,2BAA2B;AAC9E,QAAI,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAEA,OAAI,mCAAS,cAAa,IAAI,QAAQ,SAAS,WAAW,oBAAoB,GAAG;AAC7E,UAAM,MAAM,aAAa,KAAK;AAAA,MAC1B,SAAS;AAAA,MAET,MAAM,QAAQ;AAAA,IAClB,CAAC;AACD,QAAI,QAAQ,OAAO,oCAAoC,MAAM;AAC7D,QAAI,QAAQ,OAAO,+BAA+B,GAAG;AACrD,QAAI,QAAQ,OAAO,gCAAgC,2BAA2B;AAC9E,QAAI,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAGA,QAAM,QAAQ,MAAM,mBAAmB,EAAC,IAAG,CAAC;AAC5C,MAAI,OAAO;AACP,UAAM,eAAe,sBAAsB,KAAK;AAEhD,WAAO,aAAa;AAAA,MAChB,IAAI,IAAI,IAAI,SAAS,aAAa,KAAK,GAAG,CAAC,GAAG,IAAI,QAAQ,MAAM,IAAI,IAAI,GAAG;AAAA,IAC/E;AAAA,EACJ;AAEA,MAAI,IAAI,QAAQ,SAAS,WAAW,mBAAmB,GAAG;AACtD,QAAI,IAAI,QAAQ,aAAa,oCAAoC;AAC7D,YAAM,mBAAmB,MAAM,oBAAoB;AACnD,YAAM,MAAM,aAAa,KAAK,gBAAgB;AAC9C,UAAI,QAAQ,IAAI,WAAW,KAAK;AAChC,aAAO;AAAA,IACX;AAEA,QAAI,WAAW,IAAI,QAAQ,MAAM;AAEjC,UAAM,YAAY,IAAI,IAAI,cAAc,CAAC;AACzC,UAAM,iBAAiB,IAAI,QAAQ,IAAI,OAAO;AAC9C,mBAAe,IAAI,QAAQ,UAAU,QAAQ;AAC7C,mBAAe,IAAI,eAAe,GAAG,QAAQ,IAAI,eAAe,EAAE;AAElE,QAAI,IAAI,QAAQ,SAAS,SAAS,YAAY,GAAG;AAC7C,YAAMC,MAAK,YAAY,EAAC,SAAS,OAAO,YAAY,IAAI,OAAO,EAAC,CAAC;AACjE,YAAM,EAAC,QAAQ,SAAS,GAAE,IAAI,UAAU,GAAG;AAC3C,qBAAe,IAAI,eAAeA,GAAE;AACpC,qBAAe,IAAI,QAAQ,GAAG,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE;AACvD,qBAAe,IAAI,aAAa,GAAG,QAAQ,IAAI,MAAM,QAAQ,OAAO,EAAE;AACtE,qBAAe,IAAI,YAAY,OAAO,OAAO,OAAO,OAAO,GAAG;AAC9D,YAAM,iBAAiB,IAAI,QAAQ,IAAI,YAAY;AACnD,UAAI,gBAAgB;AAChB,uBAAe,IAAI,cAAc,iDAAgB,KAAK;AAAA,MAC1D;AAAA,IACJ;AACA,QAAI,IAAI,QAAQ,aAAa,6BAA6B;AACtD,YAAMA,MAAK,YAAY,EAAC,SAAS,OAAO,YAAY,IAAI,OAAO,EAAC,CAAC;AACjE,YAAM,EAAC,GAAE,IAAI,UAAU,GAAG;AAC1B,qBAAe,IAAI,eAAeA,GAAE;AACpC,qBAAe,IAAI,gBAAgB,EAAE;AAAA,IACzC;AAEA,aAAS,WAAW,UAAU;AAC9B,aAAS,WAAW,UAAU;AAC9B,aAAS,OAAO,UAAU;AAC1B,aAAS,WAAW,SAAS,SAAS,QAAQ,uBAAuB,EAAE;AAEvE,WAAO,aAAa,QAAQ,UAAU;AAAA,MAClC,SAAS;AAAA,IACb,CAAC;AAAA,EACL;AAGA,MAAI,IAAI,QAAQ,aAAa,uBAAuB;AAChD,UAAM,MAAM,MAAM;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,MAAM,IAAI,KAAK,CAAC;AAAA,QACrC,SAAS,mBAAmB;AAAA,MAChC;AAAA,IACJ;AACA,UAAM,UAAU,MAAM,IAAI,KAAK;AAE/B,UAAM,SAAS,aAAa,KAAK,OAAO;AACxC,QAAI,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAC,QAAQ,SAAS,QAAQ,WAAW,aAAa;AACvE,aAAO,QAAQ,IAAI;AAAA,QACf,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,QAAQ,KAAK,KAAK,KAAK;AAAA,QACvB,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACX;AACA,MAAI,IAAI,QAAQ,aAAa,sBAAsB;AAC/C,UAAM,cAAc,IAAI,QAAQ,IAAI,OAAO;AAC3C,QAAI,CAAC,eAAe,CAAC,YAAY,OAAO;AACpC,aAAO,aAAa,KAAK,EAAC,SAAS,EAAC,CAAC;AAAA,IACzC;AAEA,UAAM,UAAU;AAAA,MACZ,MAAM;AAAA,QACF,OAAO,YAAY;AAAA,MACvB;AAAA,IACJ;AACA,UAAM,MAAM,MAAM;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,OAAO;AAAA,QAC5B,SAAS,mBAAmB;AAAA,MAChC;AAAA,IACJ;AACA,UAAM,UAAU,MAAM,IAAI,KAAK;AAE/B,UAAM,SAAS,aAAa,KAAK,OAAO;AACxC,QAAI,EAAE,QAAQ,WAAW,QAAQ,KAAK,IAAI;AACtC,aAAO,QAAQ,OAAO,OAAO;AAAA,IACjC;AACA,WAAO;AAAA,EACX;AACA,MAAI,IAAI,QAAQ,aAAa,wBAAwB;AACjD,UAAM,MAAM,aAAa,KAAK,EAAC,SAAS,EAAC,CAAC;AAC1C,QAAI,QAAQ,OAAO,OAAO;AAC1B,WAAO;AAAA,EACX;AACJ;;;AYtKA,OAAO,uBAAuB;AAG9B,IAAM,WAAW;AAEV,IAAM,aAAa,kBAAyB;AAAA,EAC/C,SAAS;AAAA,EACT,SAAS;AAAA,IACL,eAAe;AAAA,EACnB;AACJ,CAAC;;;ACaM,IAAM,aAAa,MAAwC;AAC9D,MAAI,WAAyD,CAAC;AAC9D,MAAI,OAAO,UAAU,aAAa;AAC9B,eAAW,MAAM,oBAAoB;AAAA,EACzC,OAAO;AACH,UAAM,MAAM,MAAM,WAAW,IAAI,mBAAmB;AAAA,MAChD,QAAQ;AAAA,QACJ,QAAQ;AAAA,UACJ,eAAe;AAAA,QACnB;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,QAAI,CAAC,OAAO,CAAC,IAAI,KAAM,QAAO,CAAC;AAC/B,eAAW,IAAI;AAAA,EACnB;AAEA,QAAM,aAA2D;AACjE,QAAM,SAA4B,CAAC;AACnC,aAAW,UAAU,YAAY;AAC7B,WAAO,KAAK;AAAA,MACR,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MAEjB,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAEhB,kBAAkB,OAAO;AAAA,MACzB,kBAAkB,OAAO;AAAA,MACzB,oBAAoB,OAAO;AAAA,MAC3B,mBAAmB,OAAO;AAAA,MAC1B,sBAAsB,OAAO;AAAA,MAC7B,uBAAuB,OAAO;AAAA,MAC9B,oBAAoB,OAAO;AAAA,MAE3B,SAAS,OAAO;AAAA,MAChB,eAAe,OAAO;AAAA,IAC1B,CAAC;AAAA,EACL;AACA,SAAO;AACX;;;ACxDA,IAAM,kBAAqC;AAAA,EACvC,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,oBAAoB;AACxB;AAQO,IAAM,eAAe,CAAO,OAEuC,eAFvC,KAEuC,WAFvC;AAAA,EACI;AAAA,EAAO;AAAA,EAAS;AACpB,GAAuC;AACtE,QAAM,cAAc,MAAM,WAAW;AAErC,QAAM,sBAAsB,YAAY,OAAO,CAAC,MAAM;AAClD,SACK,EAAE,aAAa,WAAW,EAAE,aAAa,WACzC,EAAE,YAAY,SAAS,EAAE,YAAY,QACxC;AACE,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX,CAAC;AACD,MAAI,oBAAoB,SAAS,GAAG;AAChC,UAAM,YAA6B,KAAK;AAAA,MACpC,KAAK,UAAU,oBAAoB,oBAAoB,SAAS,CAAC,CAAC;AAAA,IACtE;AACA,QAAI,cAAc;AACd,YAAM,OAAO,OAAO,KAAK,eAAe;AACxC,iBAAW,OAAO,MAAM;AACpB,YAAI,aAAa,IAAI,GAAG,GAAG;AAEvB,oBAAU,GAAG,IAAI,aAAa,IAAI,GAAG;AAAA,QACzC;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACA,SAAO,iCACA,kBADA;AAAA,IAEH,SAAS;AAAA,IACT,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACJ;AACJ;;;ACtDA,IAAM,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACL,KAAK;AAAA,IACL;AAAA,EACJ;AACJ;","names":["ip","cache","string","cache","cache","cache","ip"]}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@capibox/bridge-server",
3
+ "version": "0.0.50",
4
+ "description": "",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsup",
13
+ "test": "echo \"Error: no test specified\" && exit 1",
14
+ "clickup:upload-md": "node scripts/clickup-upload-md.js"
15
+ },
16
+ "keywords": [],
17
+ "author": "",
18
+ "license": "ISC",
19
+ "devDependencies": {
20
+ "@types/memory-cache": "^0.2.6",
21
+ "openapi-typescript": "^7.8.0",
22
+ "ts-node": "^10.9.2",
23
+ "tsup": "^8.0.2",
24
+ "typescript": "^5.8.3"
25
+ },
26
+ "dependencies": {
27
+ "memory-cache": "^0.2.0",
28
+ "openapi-fetch": "^0.14.0",
29
+ "zod": "^3.24.1"
30
+ },
31
+ "peerDependencies": {
32
+ "next": "^13.0.0 || ^14.0.0 || ^15.0.0"
33
+ }
34
+ }