@etohq/utils 1.5.1-alpha.2 → 1.5.1-alpha.4

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 (262) hide show
  1. package/dist/access-link/case-sensitivity.d.ts +14 -0
  2. package/dist/access-link/case-sensitivity.d.ts.map +1 -0
  3. package/dist/access-link/case-sensitivity.js +57 -0
  4. package/dist/access-link/case-sensitivity.js.map +1 -0
  5. package/dist/access-link/check-if-key-exists.d.ts +7 -0
  6. package/dist/access-link/check-if-key-exists.d.ts.map +1 -0
  7. package/dist/access-link/check-if-key-exists.js +36 -0
  8. package/dist/access-link/check-if-key-exists.js.map +1 -0
  9. package/dist/access-link/index.d.ts +11 -0
  10. package/dist/access-link/index.d.ts.map +1 -0
  11. package/dist/access-link/index.js +27 -0
  12. package/dist/access-link/index.js.map +1 -0
  13. package/dist/access-link/key-checks.d.ts +12 -0
  14. package/dist/access-link/key-checks.d.ts.map +1 -0
  15. package/dist/access-link/key-checks.js +78 -0
  16. package/dist/access-link/key-checks.js.map +1 -0
  17. package/dist/access-link/link-resolution.d.ts +26 -0
  18. package/dist/access-link/link-resolution.d.ts.map +1 -0
  19. package/dist/access-link/link-resolution.js +111 -0
  20. package/dist/access-link/link-resolution.js.map +1 -0
  21. package/dist/access-link/link-utils.d.ts +23 -0
  22. package/dist/access-link/link-utils.d.ts.map +1 -0
  23. package/dist/access-link/link-utils.js +61 -0
  24. package/dist/access-link/link-utils.js.map +1 -0
  25. package/dist/access-link/process-key.d.ts +5 -0
  26. package/dist/access-link/process-key.d.ts.map +1 -0
  27. package/dist/access-link/process-key.js +58 -0
  28. package/dist/access-link/process-key.js.map +1 -0
  29. package/dist/access-link/process-utils.d.ts +19 -0
  30. package/dist/access-link/process-utils.d.ts.map +1 -0
  31. package/dist/access-link/process-utils.js +52 -0
  32. package/dist/access-link/process-utils.js.map +1 -0
  33. package/dist/access-link/transform-link.d.ts +47 -0
  34. package/dist/access-link/transform-link.d.ts.map +1 -0
  35. package/dist/access-link/transform-link.js +25 -0
  36. package/dist/access-link/transform-link.js.map +1 -0
  37. package/dist/access-link/url-detection.d.ts +10 -0
  38. package/dist/access-link/url-detection.d.ts.map +1 -0
  39. package/dist/access-link/url-detection.js +63 -0
  40. package/dist/access-link/url-detection.js.map +1 -0
  41. package/dist/access-link/validation-utils.d.ts +23 -0
  42. package/dist/access-link/validation-utils.d.ts.map +1 -0
  43. package/dist/access-link/validation-utils.js +57 -0
  44. package/dist/access-link/validation-utils.js.map +1 -0
  45. package/dist/analytics/detect-bot.d.ts +2 -0
  46. package/dist/analytics/detect-bot.d.ts.map +1 -0
  47. package/dist/analytics/detect-bot.js +21 -0
  48. package/dist/analytics/detect-bot.js.map +1 -0
  49. package/dist/analytics/detect-qr.d.ts +2 -0
  50. package/dist/analytics/detect-qr.d.ts.map +1 -0
  51. package/dist/analytics/detect-qr.js +10 -0
  52. package/dist/analytics/detect-qr.js.map +1 -0
  53. package/dist/analytics/get-click-event.d.ts +8 -0
  54. package/dist/analytics/get-click-event.d.ts.map +1 -0
  55. package/dist/analytics/get-click-event.js +24 -0
  56. package/dist/analytics/get-click-event.js.map +1 -0
  57. package/dist/analytics/get-geolocation.d.ts +12 -0
  58. package/dist/analytics/get-geolocation.d.ts.map +1 -0
  59. package/dist/analytics/get-geolocation.js +51 -0
  60. package/dist/analytics/get-geolocation.js.map +1 -0
  61. package/dist/analytics/get-grant-event.d.ts +8 -0
  62. package/dist/analytics/get-grant-event.d.ts.map +1 -0
  63. package/dist/analytics/get-grant-event.js +24 -0
  64. package/dist/analytics/get-grant-event.js.map +1 -0
  65. package/dist/analytics/get-import-error-logs.d.ts +17 -0
  66. package/dist/analytics/get-import-error-logs.d.ts.map +1 -0
  67. package/dist/analytics/get-import-error-logs.js +23 -0
  68. package/dist/analytics/get-import-error-logs.js.map +1 -0
  69. package/dist/analytics/get-lead-events.d.ts +17 -0
  70. package/dist/analytics/get-lead-events.d.ts.map +1 -0
  71. package/dist/analytics/get-lead-events.js +17 -0
  72. package/dist/analytics/get-lead-events.js.map +1 -0
  73. package/dist/analytics/get-webhook-events.d.ts +17 -0
  74. package/dist/analytics/get-webhook-events.d.ts.map +1 -0
  75. package/dist/analytics/get-webhook-events.js +22 -0
  76. package/dist/analytics/get-webhook-events.js.map +1 -0
  77. package/dist/analytics/index.d.ts +18 -0
  78. package/dist/analytics/index.d.ts.map +1 -1
  79. package/dist/analytics/index.js +18 -0
  80. package/dist/analytics/index.js.map +1 -1
  81. package/dist/analytics/log-conversion-events.d.ts +6 -0
  82. package/dist/analytics/log-conversion-events.d.ts.map +1 -0
  83. package/dist/analytics/log-conversion-events.js +20 -0
  84. package/dist/analytics/log-conversion-events.js.map +1 -0
  85. package/dist/analytics/log-import-error.d.ts +6 -0
  86. package/dist/analytics/log-import-error.d.ts.map +1 -0
  87. package/dist/analytics/log-import-error.js +18 -0
  88. package/dist/analytics/log-import-error.js.map +1 -0
  89. package/dist/analytics/parse-user-agent.d.ts +13 -0
  90. package/dist/analytics/parse-user-agent.d.ts.map +1 -0
  91. package/dist/analytics/parse-user-agent.js +174 -0
  92. package/dist/analytics/parse-user-agent.js.map +1 -0
  93. package/dist/analytics/record-approval.d.ts +56 -0
  94. package/dist/analytics/record-approval.d.ts.map +1 -0
  95. package/dist/analytics/record-approval.js +32 -0
  96. package/dist/analytics/record-approval.js.map +1 -0
  97. package/dist/analytics/record-click.d.ts +32 -0
  98. package/dist/analytics/record-click.d.ts.map +1 -0
  99. package/dist/analytics/record-click.js +136 -0
  100. package/dist/analytics/record-click.js.map +1 -0
  101. package/dist/analytics/record-lead.d.ts +24 -0
  102. package/dist/analytics/record-lead.d.ts.map +1 -0
  103. package/dist/analytics/record-lead.js +72 -0
  104. package/dist/analytics/record-lead.js.map +1 -0
  105. package/dist/analytics/record-link.d.ts +106 -0
  106. package/dist/analytics/record-link.d.ts.map +1 -0
  107. package/dist/analytics/record-link.js +78 -0
  108. package/dist/analytics/record-link.js.map +1 -0
  109. package/dist/analytics/record-sale.d.ts +10 -0
  110. package/dist/analytics/record-sale.d.ts.map +1 -0
  111. package/dist/analytics/record-sale.js +35 -0
  112. package/dist/analytics/record-sale.js.map +1 -0
  113. package/dist/analytics/record-webhook-event.d.ts +26 -0
  114. package/dist/analytics/record-webhook-event.d.ts.map +1 -0
  115. package/dist/analytics/record-webhook-event.js +22 -0
  116. package/dist/analytics/record-webhook-event.js.map +1 -0
  117. package/dist/analytics/schemas.d.ts +257 -0
  118. package/dist/analytics/schemas.d.ts.map +1 -0
  119. package/dist/analytics/schemas.js +99 -0
  120. package/dist/analytics/schemas.js.map +1 -0
  121. package/dist/analytics/tinybird-client.d.ts +6 -0
  122. package/dist/analytics/tinybird-client.d.ts.map +1 -0
  123. package/dist/analytics/tinybird-client.js +11 -0
  124. package/dist/analytics/tinybird-client.js.map +1 -0
  125. package/dist/common/constants.d.ts +24 -0
  126. package/dist/common/constants.d.ts.map +1 -0
  127. package/dist/common/constants.js +196 -0
  128. package/dist/common/constants.js.map +1 -0
  129. package/dist/common/domains.d.ts +8 -0
  130. package/dist/common/domains.d.ts.map +1 -0
  131. package/dist/common/domains.js +88 -0
  132. package/dist/common/domains.js.map +1 -0
  133. package/dist/common/dynamic-import.d.ts.map +1 -1
  134. package/dist/common/dynamic-import.js +24 -1
  135. package/dist/common/dynamic-import.js.map +1 -1
  136. package/dist/common/fetch-with-retry.d.ts +6 -0
  137. package/dist/common/fetch-with-retry.d.ts.map +1 -0
  138. package/dist/common/fetch-with-retry.js +63 -0
  139. package/dist/common/fetch-with-retry.js.map +1 -0
  140. package/dist/common/get-identity-hash.d.ts +2 -0
  141. package/dist/common/get-identity-hash.d.ts.map +1 -0
  142. package/dist/common/get-identity-hash.js +19 -0
  143. package/dist/common/get-identity-hash.js.map +1 -0
  144. package/dist/common/index.d.ts +3 -0
  145. package/dist/common/index.d.ts.map +1 -1
  146. package/dist/common/index.js +3 -0
  147. package/dist/common/index.js.map +1 -1
  148. package/dist/common/is-valid-url.d.ts +2 -0
  149. package/dist/common/is-valid-url.d.ts.map +1 -0
  150. package/dist/common/is-valid-url.js +14 -0
  151. package/dist/common/is-valid-url.js.map +1 -0
  152. package/dist/common/reserved-slugs.d.ts +7 -0
  153. package/dist/common/reserved-slugs.d.ts.map +1 -0
  154. package/dist/common/reserved-slugs.js +64 -0
  155. package/dist/common/reserved-slugs.js.map +1 -0
  156. package/dist/common/to-snake-case.d.ts +5 -0
  157. package/dist/common/to-snake-case.d.ts.map +1 -0
  158. package/dist/common/to-snake-case.js +14 -0
  159. package/dist/common/to-snake-case.js.map +1 -0
  160. package/dist/dml/entity-builder.d.ts +68 -0
  161. package/dist/dml/entity-builder.d.ts.map +1 -1
  162. package/dist/dml/entity-builder.js +76 -0
  163. package/dist/dml/entity-builder.js.map +1 -1
  164. package/dist/dml/helpers/entity-builder/define-property.d.ts.map +1 -1
  165. package/dist/dml/helpers/entity-builder/define-property.js +77 -0
  166. package/dist/dml/helpers/entity-builder/define-property.js.map +1 -1
  167. package/dist/dml/helpers/mikro-orm/custom-type/geo-json-geometry.d.ts +10 -0
  168. package/dist/dml/helpers/mikro-orm/custom-type/geo-json-geometry.d.ts.map +1 -0
  169. package/dist/dml/helpers/mikro-orm/custom-type/geo-json-geometry.js +31 -0
  170. package/dist/dml/helpers/mikro-orm/custom-type/geo-json-geometry.js.map +1 -0
  171. package/dist/dml/properties/enum.d.ts.map +1 -1
  172. package/dist/dml/properties/enum.js +0 -1
  173. package/dist/dml/properties/enum.js.map +1 -1
  174. package/dist/dml/properties/geometry.d.ts +8 -0
  175. package/dist/dml/properties/geometry.d.ts.map +1 -0
  176. package/dist/dml/properties/geometry.js +14 -0
  177. package/dist/dml/properties/geometry.js.map +1 -0
  178. package/dist/dml/properties/index.d.ts +4 -0
  179. package/dist/dml/properties/index.d.ts.map +1 -1
  180. package/dist/dml/properties/index.js +4 -0
  181. package/dist/dml/properties/index.js.map +1 -1
  182. package/dist/dml/properties/multipolygon.d.ts +8 -0
  183. package/dist/dml/properties/multipolygon.d.ts.map +1 -0
  184. package/dist/dml/properties/multipolygon.js +14 -0
  185. package/dist/dml/properties/multipolygon.js.map +1 -0
  186. package/dist/dml/properties/point.d.ts +8 -0
  187. package/dist/dml/properties/point.d.ts.map +1 -0
  188. package/dist/dml/properties/point.js +14 -0
  189. package/dist/dml/properties/point.js.map +1 -0
  190. package/dist/dml/properties/polygon.d.ts +8 -0
  191. package/dist/dml/properties/polygon.d.ts.map +1 -0
  192. package/dist/dml/properties/polygon.js +14 -0
  193. package/dist/dml/properties/polygon.js.map +1 -0
  194. package/dist/index.d.ts +2 -0
  195. package/dist/index.d.ts.map +1 -1
  196. package/dist/index.js +2 -0
  197. package/dist/index.js.map +1 -1
  198. package/dist/modules-sdk/build-query.d.ts.map +1 -1
  199. package/dist/modules-sdk/build-query.js +3 -1
  200. package/dist/modules-sdk/build-query.js.map +1 -1
  201. package/dist/modules-sdk/definition.d.ts +18 -0
  202. package/dist/modules-sdk/definition.d.ts.map +1 -1
  203. package/dist/modules-sdk/definition.js +12 -0
  204. package/dist/modules-sdk/definition.js.map +1 -1
  205. package/dist/modules-sdk/spatial-query-processor.d.ts +2 -0
  206. package/dist/modules-sdk/spatial-query-processor.d.ts.map +1 -0
  207. package/dist/modules-sdk/spatial-query-processor.js +105 -0
  208. package/dist/modules-sdk/spatial-query-processor.js.map +1 -0
  209. package/dist/permissions/ability.d.ts +39 -0
  210. package/dist/permissions/ability.d.ts.map +1 -0
  211. package/dist/permissions/ability.js +51 -0
  212. package/dist/permissions/ability.js.map +1 -0
  213. package/dist/permissions/context-builder.d.ts +24 -0
  214. package/dist/permissions/context-builder.d.ts.map +1 -0
  215. package/dist/permissions/context-builder.js +30 -0
  216. package/dist/permissions/context-builder.js.map +1 -0
  217. package/dist/permissions/index.d.ts +4 -0
  218. package/dist/permissions/index.d.ts.map +1 -0
  219. package/dist/permissions/index.js +20 -0
  220. package/dist/permissions/index.js.map +1 -0
  221. package/dist/permissions/permission-service.d.ts +8 -0
  222. package/dist/permissions/permission-service.d.ts.map +1 -0
  223. package/dist/permissions/permission-service.js +20 -0
  224. package/dist/permissions/permission-service.js.map +1 -0
  225. package/dist/permissions/types.d.ts +17 -0
  226. package/dist/permissions/types.d.ts.map +1 -0
  227. package/dist/permissions/types.js +11 -0
  228. package/dist/permissions/types.js.map +1 -0
  229. package/dist/tsconfig.tsbuildinfo +1 -1
  230. package/dist/zod/schemas/approvals.d.ts +91 -0
  231. package/dist/zod/schemas/approvals.d.ts.map +1 -0
  232. package/dist/zod/schemas/approvals.js +38 -0
  233. package/dist/zod/schemas/approvals.js.map +1 -0
  234. package/dist/zod/schemas/clicks.d.ts +394 -0
  235. package/dist/zod/schemas/clicks.d.ts.map +1 -0
  236. package/dist/zod/schemas/clicks.js +85 -0
  237. package/dist/zod/schemas/clicks.js.map +1 -0
  238. package/dist/zod/schemas/leads.d.ts +423 -0
  239. package/dist/zod/schemas/leads.d.ts.map +1 -0
  240. package/dist/zod/schemas/leads.js +58 -0
  241. package/dist/zod/schemas/leads.js.map +1 -0
  242. package/package.json +8 -2
  243. package/dist/feature-flags/eto-v2.d.ts +0 -3
  244. package/dist/feature-flags/eto-v2.d.ts.map +0 -1
  245. package/dist/feature-flags/eto-v2.js +0 -10
  246. package/dist/feature-flags/eto-v2.js.map +0 -1
  247. package/dist/feature-flags/order-editing.d.ts +0 -3
  248. package/dist/feature-flags/order-editing.d.ts.map +0 -1
  249. package/dist/feature-flags/order-editing.js +0 -10
  250. package/dist/feature-flags/order-editing.js.map +0 -1
  251. package/dist/feature-flags/product-categories.d.ts +0 -3
  252. package/dist/feature-flags/product-categories.d.ts.map +0 -1
  253. package/dist/feature-flags/product-categories.js +0 -10
  254. package/dist/feature-flags/product-categories.js.map +0 -1
  255. package/dist/feature-flags/sales-channels.d.ts +0 -3
  256. package/dist/feature-flags/sales-channels.d.ts.map +0 -1
  257. package/dist/feature-flags/sales-channels.js +0 -10
  258. package/dist/feature-flags/sales-channels.js.map +0 -1
  259. package/dist/feature-flags/tax-inclusive-pricing.d.ts +0 -3
  260. package/dist/feature-flags/tax-inclusive-pricing.d.ts.map +0 -1
  261. package/dist/feature-flags/tax-inclusive-pricing.js +0 -10
  262. package/dist/feature-flags/tax-inclusive-pricing.js.map +0 -1
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.recordClick = recordClick;
4
+ const fetch_with_retry_1 = require("../common/fetch-with-retry");
5
+ const detect_qr_1 = require("./detect-qr");
6
+ const detect_bot_1 = require("./detect-bot");
7
+ const parse_user_agent_1 = require("./parse-user-agent");
8
+ const get_geolocation_1 = require("./get-geolocation");
9
+ const get_identity_hash_1 = require("../common/get-identity-hash");
10
+ /**
11
+ * Recording access link clicks with geo, ua, referer and timestamp data
12
+ * Following Dub's recordClick pattern exactly, adapted for ETO access links
13
+ **/
14
+ async function recordClick({ req, clickId, linkId, domain, key, url, userId, projectId, skipRatelimit, timestamp, referrer, trigger = "link", eventName = "click_events", tinybirdConfig,
15
+ // Raw data options (for workflows/API endpoints)
16
+ ip, userAgent, country, region, city, continent, latitude, longitude, }) {
17
+ if (!clickId) {
18
+ return null;
19
+ }
20
+ let searchParams;
21
+ let finalUserAgent = "";
22
+ let finalIP = "";
23
+ let finalReferrer = "";
24
+ let isBot = false;
25
+ let isQr = false;
26
+ let geo = {};
27
+ let fallbackGeo = {};
28
+ if (req) {
29
+ searchParams = new URL(req.url).searchParams;
30
+ if (req.headers.has("eto-no-track") || searchParams.has("eto-no-track")) {
31
+ return null;
32
+ }
33
+ if (req.method === "HEAD") {
34
+ return null;
35
+ }
36
+ finalUserAgent = req.headers.get("user-agent") || "";
37
+ // @ts-ignore - Headers.entries() is not available in the type definitions
38
+ finalIP = (0, get_geolocation_1.getIPFromRequest)(Object.fromEntries(req.headers.entries())) || "";
39
+ finalReferrer = referrer || req.headers.get("referer") || "";
40
+ isBot = (0, detect_bot_1.detectBot)(req);
41
+ isQr = (0, detect_qr_1.detectQr)(req);
42
+ // @ts-ignore - Headers.entries() is not available in the type definitions
43
+ geo = (0, get_geolocation_1.getGeolocationFromHeaders)(Object.fromEntries(req.headers.entries()));
44
+ if (finalIP) {
45
+ fallbackGeo = await (0, get_geolocation_1.getGeolocationFromIP)(finalIP);
46
+ }
47
+ }
48
+ else {
49
+ searchParams = new URLSearchParams();
50
+ finalUserAgent = userAgent || "";
51
+ finalIP = ip || "";
52
+ finalReferrer = referrer || "";
53
+ isBot = false;
54
+ isQr = false;
55
+ geo = {
56
+ continent: continent || "",
57
+ country: country || "Unknown",
58
+ region: region || "Unknown",
59
+ city: city || "Unknown",
60
+ latitude: latitude || "Unknown",
61
+ longitude: longitude || "Unknown",
62
+ };
63
+ }
64
+ const ua = (0, parse_user_agent_1.parseUserAgent)(finalUserAgent);
65
+ if (isBot) {
66
+ console.log(`Access not recorded ❌ – Bot detected.`, {
67
+ ua,
68
+ isBot,
69
+ });
70
+ return null;
71
+ }
72
+ let triggerFinal = trigger;
73
+ if (isQr) {
74
+ triggerFinal = "qr";
75
+ }
76
+ const identityHash = req ? await (0, get_identity_hash_1.getIdentityHash)(req) : "";
77
+ const clickData = {
78
+ timestamp: timestamp || new Date(Date.now()).toISOString(),
79
+ identity_hash: identityHash,
80
+ click_id: clickId,
81
+ link_id: linkId,
82
+ url: url || "",
83
+ ip: finalIP || "",
84
+ continent: geo.continent || fallbackGeo.continent || "",
85
+ country: geo.country || fallbackGeo.country || "Unknown",
86
+ region: geo.region || fallbackGeo.region || "Unknown",
87
+ city: geo.city || fallbackGeo.city || "Unknown",
88
+ latitude: geo.latitude || fallbackGeo.latitude || "Unknown",
89
+ longitude: geo.longitude || fallbackGeo.longitude || "Unknown",
90
+ device: ua.device || "Desktop",
91
+ device_vendor: ua.vendor || "Unknown",
92
+ device_model: ua.model || "Unknown",
93
+ browser: ua.browser || "Unknown",
94
+ browser_version: ua.version || "Unknown",
95
+ engine: ua.engine || "Unknown",
96
+ engine_version: ua.engineVersion || "Unknown",
97
+ os: ua.os || "Unknown",
98
+ os_version: ua.osVersion || "Unknown",
99
+ cpu_architecture: ua.cpu || "Unknown",
100
+ ua: finalUserAgent || "Unknown",
101
+ bot: isBot ? 1 : 0,
102
+ qr: isQr ? 1 : 0,
103
+ referer: finalReferrer
104
+ ? getDomainWithoutWWW(finalReferrer) || "(direct)"
105
+ : "(direct)",
106
+ referer_url: finalReferrer || "(direct)",
107
+ trigger: triggerFinal,
108
+ user_id: userId,
109
+ project_id: projectId || "",
110
+ };
111
+ try {
112
+ const response = await (0, fetch_with_retry_1.fetchWithRetry)(`${tinybirdConfig.apiUrl}/v0/events?name=${eventName}&wait=true`, {
113
+ method: "POST",
114
+ headers: {
115
+ Authorization: `Bearer ${tinybirdConfig.apiKey}`,
116
+ "Content-Type": "application/json",
117
+ },
118
+ body: JSON.stringify(clickData),
119
+ });
120
+ return await response.json();
121
+ }
122
+ catch (error) {
123
+ console.error("Failed to record access event:", error);
124
+ return null;
125
+ }
126
+ }
127
+ function getDomainWithoutWWW(url) {
128
+ try {
129
+ const domain = new URL(url).hostname;
130
+ return domain.startsWith("www.") ? domain.slice(4) : domain;
131
+ }
132
+ catch {
133
+ return url;
134
+ }
135
+ }
136
+ //# sourceMappingURL=record-click.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-click.js","sourceRoot":"","sources":["../../src/analytics/record-click.ts"],"names":[],"mappings":";;AAeA,kCA0KC;AAzLD,iEAA2D;AAC3D,2CAAsC;AACtC,6CAAwC;AACxC,yDAAmD;AACnD,uDAI0B;AAC1B,mEAA6D;AAE7D;;;IAGI;AACG,KAAK,UAAU,WAAW,CAAC,EAChC,GAAG,EACH,OAAO,EACP,MAAM,EACN,MAAM,EACN,GAAG,EACH,GAAG,EACH,MAAM,EACN,SAAS,EACT,aAAa,EACb,SAAS,EACT,QAAQ,EACR,OAAO,GAAG,MAAM,EAChB,SAAS,GAAG,cAAc,EAC1B,cAAc;AACd,iDAAiD;AACjD,EAAE,EACF,SAAS,EACT,OAAO,EACP,MAAM,EACN,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,SAAS,GAwBV;IACC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,YAA6B,CAAA;IACjC,IAAI,cAAc,GAAW,EAAE,CAAA;IAC/B,IAAI,OAAO,GAAW,EAAE,CAAA;IACxB,IAAI,aAAa,GAAW,EAAE,CAAA;IAC9B,IAAI,KAAK,GAAY,KAAK,CAAA;IAC1B,IAAI,IAAI,GAAY,KAAK,CAAA;IACzB,IAAI,GAAG,GAAQ,EAAE,CAAA;IACjB,IAAI,WAAW,GAAQ,EAAE,CAAA;IAEzB,IAAI,GAAG,EAAE,CAAC;QACR,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAA;QAE5C,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACxE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA;QACpD,0EAA0E;QAC1E,OAAO,GAAG,IAAA,kCAAgB,EAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3E,aAAa,GAAG,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAC5D,KAAK,GAAG,IAAA,sBAAS,EAAC,GAAG,CAAC,CAAA;QACtB,IAAI,GAAG,IAAA,oBAAQ,EAAC,GAAG,CAAC,CAAA;QACpB,0EAA0E;QAC1E,GAAG,GAAG,IAAA,2CAAyB,EAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAC1E,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,GAAG,MAAM,IAAA,sCAAoB,EAAC,OAAO,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,IAAI,eAAe,EAAE,CAAA;QACpC,cAAc,GAAG,SAAS,IAAI,EAAE,CAAA;QAChC,OAAO,GAAG,EAAE,IAAI,EAAE,CAAA;QAClB,aAAa,GAAG,QAAQ,IAAI,EAAE,CAAA;QAC9B,KAAK,GAAG,KAAK,CAAA;QACb,IAAI,GAAG,KAAK,CAAA;QACZ,GAAG,GAAG;YACJ,SAAS,EAAE,SAAS,IAAI,EAAE;YAC1B,OAAO,EAAE,OAAO,IAAI,SAAS;YAC7B,MAAM,EAAE,MAAM,IAAI,SAAS;YAC3B,IAAI,EAAE,IAAI,IAAI,SAAS;YACvB,QAAQ,EAAE,QAAQ,IAAI,SAAS;YAC/B,SAAS,EAAE,SAAS,IAAI,SAAS;SAClC,CAAA;IACH,CAAC;IAED,MAAM,EAAE,GAAG,IAAA,iCAAc,EAAC,cAAc,CAAC,CAAA;IAEzC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE;YACnD,EAAE;YACF,KAAK;SACN,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,YAAY,GAAG,OAAO,CAAA;IAC1B,IAAI,IAAI,EAAE,CAAC;QACT,YAAY,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,IAAA,mCAAe,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAE1D,MAAM,SAAS,GAAG;QAChB,SAAS,EAAE,SAAS,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;QAC1D,aAAa,EAAE,YAAY;QAC3B,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,GAAG,IAAI,EAAE;QACd,EAAE,EAAE,OAAO,IAAI,EAAE;QACjB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,IAAI,EAAE;QACvD,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,IAAI,SAAS;QACxD,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,IAAI,SAAS;QACrD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,IAAI,SAAS;QAC/C,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,IAAI,SAAS;QAC3D,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,IAAI,SAAS;QAC9D,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,SAAS;QAC9B,aAAa,EAAE,EAAE,CAAC,MAAM,IAAI,SAAS;QACrC,YAAY,EAAE,EAAE,CAAC,KAAK,IAAI,SAAS;QACnC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,SAAS;QAChC,eAAe,EAAE,EAAE,CAAC,OAAO,IAAI,SAAS;QACxC,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,SAAS;QAC9B,cAAc,EAAE,EAAE,CAAC,aAAa,IAAI,SAAS;QAC7C,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,SAAS;QACtB,UAAU,EAAE,EAAE,CAAC,SAAS,IAAI,SAAS;QACrC,gBAAgB,EAAE,EAAE,CAAC,GAAG,IAAI,SAAS;QACrC,EAAE,EAAE,cAAc,IAAI,SAAS;QAC/B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,EAAE,aAAa;YACpB,CAAC,CAAC,mBAAmB,CAAC,aAAa,CAAC,IAAI,UAAU;YAClD,CAAC,CAAC,UAAU;QACd,WAAW,EAAE,aAAa,IAAI,UAAU;QACxC,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,SAAS,IAAI,EAAE;KAC5B,CAAA;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,iCAAc,EACnC,GAAG,cAAc,CAAC,MAAM,mBAAmB,SAAS,YAAY,EAChE;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,cAAc,CAAC,MAAM,EAAE;gBAChD,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SAChC,CACF,CAAA;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAA;QACtD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ export declare function recordLead({ tinybirdConfig, eventName, // Fixed: lead_events not access_lead_events
2
+ eventId, eventNameValue, clickId, linkId, customerId, // ETO: user_id as customer_id
3
+ projectId, resourceType, resourceId, role, grantType, autoGranted, headers, metadata, timestamp, }: {
4
+ tinybirdConfig: {
5
+ apiKey: string;
6
+ apiUrl: string;
7
+ };
8
+ eventName?: string;
9
+ eventId: string;
10
+ eventNameValue: string;
11
+ clickId: string;
12
+ linkId: string;
13
+ customerId: string;
14
+ projectId?: string;
15
+ resourceType: string;
16
+ resourceId: string;
17
+ role: string;
18
+ grantType: "primary" | "dependency";
19
+ autoGranted: boolean;
20
+ headers?: Record<string, string>;
21
+ metadata?: string;
22
+ timestamp?: string;
23
+ }): Promise<any>;
24
+ //# sourceMappingURL=record-lead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-lead.d.ts","sourceRoot":"","sources":["../../src/analytics/record-lead.ts"],"names":[],"mappings":"AAGA,wBAAsB,UAAU,CAAC,EAC/B,cAAc,EACd,SAAyB,EAAE,4CAA4C;AACvE,OAAO,EACP,cAAc,EACd,OAAO,EACP,MAAM,EACN,UAAU,EAAE,8BAA8B;AAC1C,SAAS,EACT,YAAY,EACZ,UAAU,EACV,IAAI,EACJ,SAAS,EACT,WAAW,EACX,OAAO,EACP,QAAa,EACb,SAAS,GACV,EAAE;IACD,cAAc,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,SAAS,GAAG,YAAY,CAAA;IACnC,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,gBAoEA"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.recordLead = recordLead;
4
+ const fetch_with_retry_1 = require("../common/fetch-with-retry");
5
+ const get_geolocation_1 = require("./get-geolocation");
6
+ async function recordLead({ tinybirdConfig, eventName = "lead_events", // Fixed: lead_events not access_lead_events
7
+ eventId, eventNameValue, clickId, linkId, customerId, // ETO: user_id as customer_id
8
+ projectId, resourceType, resourceId, role, grantType, autoGranted, headers, metadata = "", timestamp, }) {
9
+ const ip = headers ? (0, get_geolocation_1.getIPFromRequest)(headers) : null;
10
+ const geo = headers ? (0, get_geolocation_1.getGeolocationFromHeaders)(headers) : {};
11
+ const fallbackGeo = ip ? await (0, get_geolocation_1.getGeolocationFromIP)(ip) : {};
12
+ // Following Dub's leadEventSchemaTB structure exactly
13
+ const leadData = {
14
+ // Inherited from clickEventSchemaTB (without timestamp)
15
+ click_id: clickId,
16
+ link_id: linkId,
17
+ user_id: customerId, // ETO addition
18
+ project_id: projectId || "", // ETO addition
19
+ url: "",
20
+ continent: geo.continent || fallbackGeo.continent || "",
21
+ country: geo.country || fallbackGeo.country || "Unknown",
22
+ region: geo.region || fallbackGeo.region || "Unknown",
23
+ city: geo.city || fallbackGeo.city || "Unknown",
24
+ latitude: geo.latitude || fallbackGeo.latitude || "Unknown",
25
+ longitude: geo.longitude || fallbackGeo.longitude || "Unknown",
26
+ device: "Unknown",
27
+ device_model: "Unknown",
28
+ device_vendor: "Unknown",
29
+ browser: "Unknown",
30
+ browser_version: "Unknown",
31
+ os: "Unknown",
32
+ os_version: "Unknown",
33
+ trigger: "grant",
34
+ engine: "Unknown",
35
+ engine_version: "Unknown",
36
+ cpu_architecture: "Unknown",
37
+ ua: "Unknown",
38
+ bot: 0,
39
+ referer: "Unknown",
40
+ referer_url: "Unknown",
41
+ ip: ip || "",
42
+ qr: 0,
43
+ // Lead-specific fields
44
+ event_id: eventId,
45
+ event_name: eventNameValue,
46
+ customer_id: customerId,
47
+ metadata: JSON.stringify({
48
+ resourceType,
49
+ resourceId,
50
+ role,
51
+ grantType,
52
+ autoGranted,
53
+ ...JSON.parse(metadata || "{}")
54
+ }),
55
+ };
56
+ try {
57
+ const response = await (0, fetch_with_retry_1.fetchWithRetry)(`${tinybirdConfig.apiUrl}/v0/events?name=${eventName}&wait=true`, {
58
+ method: "POST",
59
+ headers: {
60
+ Authorization: `Bearer ${tinybirdConfig.apiKey}`,
61
+ "Content-Type": "application/json",
62
+ },
63
+ body: JSON.stringify(leadData),
64
+ });
65
+ return await response.json();
66
+ }
67
+ catch (error) {
68
+ console.error("Failed to record lead event:", error);
69
+ return null;
70
+ }
71
+ }
72
+ //# sourceMappingURL=record-lead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-lead.js","sourceRoot":"","sources":["../../src/analytics/record-lead.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { z } from "zod";
2
+ import { Tinybird } from "@chronark/zod-bird";
3
+ import { AccessLinkDTO } from "@etohq/types";
4
+ export declare const accessLinksMetadataSchema: z.ZodObject<{
5
+ link_id: z.ZodString;
6
+ domain: z.ZodString;
7
+ key: z.ZodString;
8
+ url: z.ZodString;
9
+ short_link: z.ZodString;
10
+ project_id: z.ZodString;
11
+ external_id: z.ZodEffects<z.ZodNullable<z.ZodString>, string, string | null>;
12
+ tenant_id: z.ZodEffects<z.ZodNullable<z.ZodString>, string, string | null>;
13
+ target_resource_type: z.ZodEffects<z.ZodNullable<z.ZodString>, string, string | null>;
14
+ target_resource_id: z.ZodEffects<z.ZodNullable<z.ZodString>, string, string | null>;
15
+ access_role: z.ZodEffects<z.ZodNullable<z.ZodString>, string, string | null>;
16
+ max_uses: z.ZodEffects<z.ZodNullable<z.ZodNumber>, number, number | null>;
17
+ current_uses: z.ZodNumber;
18
+ expires_at: z.ZodEffects<z.ZodNullable<z.ZodDate>, string, Date | null>;
19
+ creator_user_id: z.ZodString;
20
+ creator_role: z.ZodEffects<z.ZodNullable<z.ZodString>, string, string | null>;
21
+ purpose: z.ZodString;
22
+ auto_approve: z.ZodEffects<z.ZodBoolean, 0 | 1, boolean>;
23
+ requires_approval: z.ZodEffects<z.ZodBoolean, 0 | 1, boolean>;
24
+ password_protected: z.ZodEffects<z.ZodBoolean, 0 | 1, boolean>;
25
+ created_at: z.ZodEffects<z.ZodDate, string, Date>;
26
+ deleted: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, 0 | 1, boolean | undefined>;
27
+ }, "strip", z.ZodTypeAny, {
28
+ domain: string;
29
+ key: string;
30
+ url: string;
31
+ link_id: string;
32
+ project_id: string;
33
+ short_link: string;
34
+ external_id: string;
35
+ tenant_id: string;
36
+ target_resource_type: string;
37
+ target_resource_id: string;
38
+ access_role: string;
39
+ max_uses: number;
40
+ current_uses: number;
41
+ expires_at: string;
42
+ creator_user_id: string;
43
+ creator_role: string;
44
+ purpose: string;
45
+ auto_approve: 0 | 1;
46
+ requires_approval: 0 | 1;
47
+ password_protected: 0 | 1;
48
+ created_at: string;
49
+ deleted: 0 | 1;
50
+ }, {
51
+ domain: string;
52
+ key: string;
53
+ url: string;
54
+ link_id: string;
55
+ project_id: string;
56
+ short_link: string;
57
+ external_id: string | null;
58
+ tenant_id: string | null;
59
+ target_resource_type: string | null;
60
+ target_resource_id: string | null;
61
+ access_role: string | null;
62
+ max_uses: number | null;
63
+ current_uses: number;
64
+ expires_at: Date | null;
65
+ creator_user_id: string;
66
+ creator_role: string | null;
67
+ purpose: string;
68
+ auto_approve: boolean;
69
+ requires_approval: boolean;
70
+ password_protected: boolean;
71
+ created_at: Date;
72
+ deleted?: boolean | undefined;
73
+ }>;
74
+ export declare function createRecordLink(tb: Tinybird): (events: any) => Promise<{
75
+ successful_rows: number;
76
+ quarantined_rows: number;
77
+ }>;
78
+ export declare const transformLinkTB: (link: AccessLinkDTO) => {
79
+ link_id: string;
80
+ domain: string;
81
+ key: string;
82
+ url: string;
83
+ short_link: string;
84
+ project_id: string;
85
+ external_id: string;
86
+ tenant_id: string;
87
+ target_resource_type: string;
88
+ target_resource_id: string;
89
+ access_role: string;
90
+ max_uses: number;
91
+ current_uses: number;
92
+ expires_at: Date | null;
93
+ creator_user_id: string;
94
+ creator_role: string;
95
+ purpose: string;
96
+ auto_approve: boolean;
97
+ requires_approval: boolean;
98
+ password_protected: boolean;
99
+ created_at: Date;
100
+ deleted: boolean;
101
+ };
102
+ export declare const recordLink: (tb: Tinybird, payload: AccessLinkDTO | AccessLinkDTO[]) => Promise<{
103
+ successful_rows: number;
104
+ quarantined_rows: number;
105
+ }>;
106
+ //# sourceMappingURL=record-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-link.d.ts","sourceRoot":"","sources":["../../src/analytics/record-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAG5C,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBpC,CAAA;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ;;;GAO5C;AAGD,eAAO,MAAM,eAAe,GAAI,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;CAyBlD,CAAA;AAGD,eAAO,MAAM,UAAU,GACrB,IAAI,QAAQ,EACZ,SAAS,aAAa,GAAG,aAAa,EAAE;;;EASzC,CAAA"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.recordLink = exports.transformLinkTB = exports.accessLinksMetadataSchema = void 0;
4
+ exports.createRecordLink = createRecordLink;
5
+ const zod_1 = require("zod");
6
+ // ETO access links metadata schema (following Dub's dubLinksMetadataSchema pattern)
7
+ exports.accessLinksMetadataSchema = zod_1.z.object({
8
+ link_id: zod_1.z.string(),
9
+ domain: zod_1.z.string(),
10
+ key: zod_1.z.string(),
11
+ url: zod_1.z.string(),
12
+ short_link: zod_1.z.string(),
13
+ project_id: zod_1.z.string(),
14
+ external_id: zod_1.z.string().nullable().transform((v) => v || ""),
15
+ tenant_id: zod_1.z.string().nullable().transform((v) => v || ""),
16
+ target_resource_type: zod_1.z.string().nullable().transform((v) => v || ""),
17
+ target_resource_id: zod_1.z.string().nullable().transform((v) => v || ""),
18
+ access_role: zod_1.z.string().nullable().transform((v) => v || ""),
19
+ max_uses: zod_1.z.number().nullable().transform((v) => v || 0),
20
+ current_uses: zod_1.z.number(),
21
+ expires_at: zod_1.z.date().nullable().transform((v) => v ? v.toISOString() : ""),
22
+ creator_user_id: zod_1.z.string(),
23
+ creator_role: zod_1.z.string().nullable().transform((v) => v || ""),
24
+ purpose: zod_1.z.string(),
25
+ auto_approve: zod_1.z.boolean().transform((v) => v ? 1 : 0),
26
+ requires_approval: zod_1.z.boolean().transform((v) => v ? 1 : 0),
27
+ password_protected: zod_1.z.boolean().transform((v) => v ? 1 : 0),
28
+ created_at: zod_1.z.date().transform((v) => v.toISOString().replace("T", " ").replace("Z", "")),
29
+ deleted: zod_1.z.boolean().default(false).transform((v) => v ? 1 : 0),
30
+ });
31
+ function createRecordLink(tb) {
32
+ return tb.buildIngestEndpoint({
33
+ datasource: "links_metadata", // Fixed: links_metadata not access_links_metadata
34
+ // @ts-ignore
35
+ event: exports.accessLinksMetadataSchema,
36
+ wait: true,
37
+ });
38
+ }
39
+ // Transform ETO AccessLinkDTO to Tinybird format (following Dub's transformLinkTB pattern)
40
+ const transformLinkTB = (link) => {
41
+ return {
42
+ link_id: link.id,
43
+ domain: link.domain,
44
+ key: link.key,
45
+ url: link.url,
46
+ short_link: link.short_link,
47
+ project_id: link.project_id,
48
+ external_id: link.external_id ?? "",
49
+ tenant_id: link.tenant_id ?? "",
50
+ target_resource_type: link.target_resource_type ?? "",
51
+ target_resource_id: link.target_resource_id ?? "",
52
+ access_role: link.access_role ?? "",
53
+ max_uses: link.max_uses ?? 0,
54
+ current_uses: link.current_uses,
55
+ expires_at: link.expires_at,
56
+ creator_user_id: link.creator_user_id,
57
+ creator_role: link.creator_role ?? "",
58
+ purpose: link.purpose,
59
+ auto_approve: link.auto_approve,
60
+ requires_approval: link.requires_approval,
61
+ password_protected: link.password_protected,
62
+ created_at: link.created_at,
63
+ deleted: link.deleted_at ? true : false,
64
+ };
65
+ };
66
+ exports.transformLinkTB = transformLinkTB;
67
+ // Record link wrapper (following Dub's recordLink pattern)
68
+ const recordLink = async (tb, payload) => {
69
+ const recordLinkTB = createRecordLink(tb);
70
+ if (Array.isArray(payload)) {
71
+ return await recordLinkTB(payload.map(exports.transformLinkTB));
72
+ }
73
+ else {
74
+ return await recordLinkTB((0, exports.transformLinkTB)(payload));
75
+ }
76
+ };
77
+ exports.recordLink = recordLink;
78
+ //# sourceMappingURL=record-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-link.js","sourceRoot":"","sources":["../../src/analytics/record-link.ts"],"names":[],"mappings":";;;AA8BA,4CAOC;AArCD,6BAAuB;AAIvB,oFAAoF;AACvE,QAAA,yBAAyB,GAAG,OAAC,CAAC,MAAM,CAAC;IAChD,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,oBAAoB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,kBAAkB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxD,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;IACxB,UAAU,EAAE,OAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE;IAC3B,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,YAAY,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,iBAAiB,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,kBAAkB,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,UAAU,EAAE,OAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzF,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChE,CAAC,CAAA;AAEF,SAAgB,gBAAgB,CAAC,EAAY;IAC3C,OAAO,EAAE,CAAC,mBAAmB,CAAC;QAC5B,UAAU,EAAE,gBAAgB,EAAE,kDAAkD;QAChF,aAAa;QACb,KAAK,EAAE,iCAAyB;QAChC,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;AACJ,CAAC;AAED,2FAA2F;AACpF,MAAM,eAAe,GAAG,CAAC,IAAmB,EAAE,EAAE;IACrD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;QAC/B,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,IAAI,EAAE;QACrD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,EAAE;QACjD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;QAC5B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;QACrC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;KACxC,CAAA;AACH,CAAC,CAAA;AAzBY,QAAA,eAAe,mBAyB3B;AAED,2DAA2D;AACpD,MAAM,UAAU,GAAG,KAAK,EAC7B,EAAY,EACZ,OAAwC,EACxC,EAAE;IACF,MAAM,YAAY,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;IAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAe,CAAC,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,YAAY,CAAC,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC,CAAA;IACrD,CAAC;AACH,CAAC,CAAA;AAXY,QAAA,UAAU,cAWtB"}
@@ -0,0 +1,10 @@
1
+ import { Tinybird } from "@chronark/zod-bird";
2
+ export declare function createRecordSale(tb: Tinybird): (events: any) => Promise<{
3
+ successful_rows: number;
4
+ quarantined_rows: number;
5
+ }>;
6
+ export declare function createRecordSaleWithTimestamp(tb: Tinybird): (events: any) => Promise<{
7
+ successful_rows: number;
8
+ quarantined_rows: number;
9
+ }>;
10
+ //# sourceMappingURL=record-sale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-sale.d.ts","sourceRoot":"","sources":["../../src/analytics/record-sale.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAgB7C,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ;;;GAM5C;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,QAAQ;;;GAQzD"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRecordSale = createRecordSale;
4
+ exports.createRecordSaleWithTimestamp = createRecordSaleWithTimestamp;
5
+ const zod_1 = require("zod");
6
+ // ETO sale/conversion event schema (following Dub's pattern)
7
+ const saleEventSchemaTB = zod_1.z.object({
8
+ click_id: zod_1.z.string(),
9
+ link_id: zod_1.z.string(),
10
+ user_id: zod_1.z.string().nullable(),
11
+ project_id: zod_1.z.string().nullable(),
12
+ event_id: zod_1.z.string(),
13
+ event_name: zod_1.z.string(),
14
+ customer_id: zod_1.z.string(),
15
+ sale_amount: zod_1.z.number(),
16
+ currency: zod_1.z.string().default("USD"),
17
+ metadata: zod_1.z.string().default(""),
18
+ });
19
+ function createRecordSale(tb) {
20
+ return tb.buildIngestEndpoint({
21
+ datasource: "sale_events", // Fixed: sale_events not access_sale_events
22
+ // @ts-ignore
23
+ event: saleEventSchemaTB,
24
+ });
25
+ }
26
+ function createRecordSaleWithTimestamp(tb) {
27
+ return tb.buildIngestEndpoint({
28
+ datasource: "sale_events", // Fixed: sale_events not access_sale_events
29
+ // @ts-ignore
30
+ event: saleEventSchemaTB.extend({
31
+ timestamp: zod_1.z.string(),
32
+ }),
33
+ });
34
+ }
35
+ //# sourceMappingURL=record-sale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-sale.js","sourceRoot":"","sources":["../../src/analytics/record-sale.ts"],"names":[],"mappings":";;AAiBA,4CAMC;AAED,sEAQC;AAjCD,6BAAuB;AAGvB,6DAA6D;AAC7D,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACjC,CAAC,CAAA;AAEF,SAAgB,gBAAgB,CAAC,EAAY;IAC3C,OAAO,EAAE,CAAC,mBAAmB,CAAC;QAC5B,UAAU,EAAE,aAAa,EAAE,4CAA4C;QACvE,aAAa;QACb,KAAK,EAAE,iBAAiB;KACzB,CAAC,CAAA;AACJ,CAAC;AAED,SAAgB,6BAA6B,CAAC,EAAY;IACxD,OAAO,EAAE,CAAC,mBAAmB,CAAC;QAC5B,UAAU,EAAE,aAAa,EAAE,4CAA4C;QACvE,aAAa;QACb,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC;YAC9B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;SACtB,CAAC;KACH,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { Tinybird } from "@chronark/zod-bird";
3
+ export declare const webhookEventSchemaTB: z.ZodObject<{
4
+ webhook_id: z.ZodString;
5
+ event_type: z.ZodString;
6
+ payload: z.ZodString;
7
+ status: z.ZodString;
8
+ project_id: z.ZodEffects<z.ZodNullable<z.ZodString>, string, string | null>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ project_id: string;
11
+ status: string;
12
+ webhook_id: string;
13
+ event_type: string;
14
+ payload: string;
15
+ }, {
16
+ project_id: string | null;
17
+ status: string;
18
+ webhook_id: string;
19
+ event_type: string;
20
+ payload: string;
21
+ }>;
22
+ export declare function createRecordWebhookEvent(tb: Tinybird): (events: any) => Promise<{
23
+ successful_rows: number;
24
+ quarantined_rows: number;
25
+ }>;
26
+ //# sourceMappingURL=record-webhook-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-webhook-event.d.ts","sourceRoot":"","sources":["../../src/analytics/record-webhook-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAG7C,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;EAM/B,CAAA;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ;;;GAOpD"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.webhookEventSchemaTB = void 0;
4
+ exports.createRecordWebhookEvent = createRecordWebhookEvent;
5
+ const zod_1 = require("zod");
6
+ // ETO webhook event schema (following Dub's pattern)
7
+ exports.webhookEventSchemaTB = zod_1.z.object({
8
+ webhook_id: zod_1.z.string(),
9
+ event_type: zod_1.z.string(),
10
+ payload: zod_1.z.string(),
11
+ status: zod_1.z.string(),
12
+ project_id: zod_1.z.string().nullable().transform((v) => v || ""),
13
+ });
14
+ function createRecordWebhookEvent(tb) {
15
+ return tb.buildIngestEndpoint({
16
+ datasource: "access_webhook_events",
17
+ // @ts-ignore
18
+ event: exports.webhookEventSchemaTB,
19
+ wait: true,
20
+ });
21
+ }
22
+ //# sourceMappingURL=record-webhook-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-webhook-event.js","sourceRoot":"","sources":["../../src/analytics/record-webhook-event.ts"],"names":[],"mappings":";;;AAYA,4DAOC;AAnBD,6BAAuB;AAGvB,qDAAqD;AACxC,QAAA,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;CAC5D,CAAC,CAAA;AAEF,SAAgB,wBAAwB,CAAC,EAAY;IACnD,OAAO,EAAE,CAAC,mBAAmB,CAAC;QAC5B,UAAU,EAAE,uBAAuB;QACnC,aAAa;QACb,KAAK,EAAE,4BAAoB;QAC3B,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;AACJ,CAAC"}