@upstart.gg/sdk 0.0.133 → 0.0.135

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 (527) hide show
  1. package/dist/shared/ai/schemas.d.ts +1 -2
  2. package/dist/shared/ai/schemas.d.ts.map +1 -1
  3. package/dist/shared/ai/schemas.js +28 -1
  4. package/dist/shared/ai/schemas.js.map +1 -1
  5. package/dist/shared/ai/types.d.ts +15 -1
  6. package/dist/shared/ai/types.d.ts.map +1 -1
  7. package/dist/shared/ajv.js +6861 -1
  8. package/dist/shared/ajv.js.map +1 -1
  9. package/dist/shared/analytics/init.js +20 -1
  10. package/dist/shared/analytics/init.js.map +1 -1
  11. package/dist/shared/analytics/track.js +24 -1
  12. package/dist/shared/analytics/track.js.map +1 -1
  13. package/dist/shared/attributes.d.ts +97 -30
  14. package/dist/shared/attributes.d.ts.map +1 -1
  15. package/dist/shared/attributes.js +46 -1
  16. package/dist/shared/brick-manifest.d.ts +1 -1
  17. package/dist/shared/brick-manifest.js +26 -1
  18. package/dist/shared/bricks/manifests/accordion.manifest.d.ts +2 -2
  19. package/dist/shared/bricks/manifests/accordion.manifest.js +29 -1
  20. package/dist/shared/bricks/manifests/all-manifests.d.ts.map +1 -1
  21. package/dist/shared/bricks/manifests/all-manifests.js +59 -1
  22. package/dist/shared/bricks/manifests/box.manifest.d.ts +2 -2
  23. package/dist/shared/bricks/manifests/box.manifest.js +28 -1
  24. package/dist/shared/bricks/manifests/button.manifest.d.ts +2 -2
  25. package/dist/shared/bricks/manifests/button.manifest.js +28 -1
  26. package/dist/shared/bricks/manifests/card.manifest.d.ts +3 -3
  27. package/dist/shared/bricks/manifests/card.manifest.js +28 -1
  28. package/dist/shared/bricks/manifests/carousel.manifest.d.ts +2 -2
  29. package/dist/shared/bricks/manifests/carousel.manifest.js +28 -1
  30. package/dist/shared/bricks/manifests/footer.manifest.d.ts +4 -4
  31. package/dist/shared/bricks/manifests/footer.manifest.d.ts.map +1 -1
  32. package/dist/shared/bricks/manifests/footer.manifest.js +30 -1
  33. package/dist/shared/bricks/manifests/form.manifest.d.ts +3 -3
  34. package/dist/shared/bricks/manifests/form.manifest.js +29 -1
  35. package/dist/shared/bricks/manifests/hero.manifest.d.ts +2 -2
  36. package/dist/shared/bricks/manifests/hero.manifest.js +28 -1
  37. package/dist/shared/bricks/manifests/html.manifest.d.ts +2 -2
  38. package/dist/shared/bricks/manifests/html.manifest.js +28 -1
  39. package/dist/shared/bricks/manifests/icon.manifest.d.ts +2 -2
  40. package/dist/shared/bricks/manifests/icon.manifest.js +28 -1
  41. package/dist/shared/bricks/manifests/image.manifest.d.ts +2 -2
  42. package/dist/shared/bricks/manifests/image.manifest.js +28 -1
  43. package/dist/shared/bricks/manifests/images-gallery.manifest.d.ts +2 -2
  44. package/dist/shared/bricks/manifests/images-gallery.manifest.js +28 -1
  45. package/dist/shared/bricks/manifests/map.manifest.d.ts +2 -2
  46. package/dist/shared/bricks/manifests/map.manifest.js +31 -1
  47. package/dist/shared/bricks/manifests/navbar.manifest.d.ts +4 -4
  48. package/dist/shared/bricks/manifests/navbar.manifest.d.ts.map +1 -1
  49. package/dist/shared/bricks/manifests/navbar.manifest.js +31 -1
  50. package/dist/shared/bricks/manifests/sidebar.manifest.d.ts +2 -2
  51. package/dist/shared/bricks/manifests/sidebar.manifest.js +29 -1
  52. package/dist/shared/bricks/manifests/social-links.manifest.d.ts +2 -2
  53. package/dist/shared/bricks/manifests/social-links.manifest.js +28 -1
  54. package/dist/shared/bricks/manifests/spacer.manifest.d.ts +2 -2
  55. package/dist/shared/bricks/manifests/spacer.manifest.js +28 -1
  56. package/dist/shared/bricks/manifests/table.manifest.d.ts +91 -0
  57. package/dist/shared/bricks/manifests/table.manifest.d.ts.map +1 -0
  58. package/dist/shared/bricks/manifests/table.manifest.js +31 -0
  59. package/dist/shared/bricks/manifests/tabs.manifest.d.ts +90 -0
  60. package/dist/shared/bricks/manifests/tabs.manifest.d.ts.map +1 -0
  61. package/dist/shared/bricks/manifests/tabs.manifest.js +31 -0
  62. package/dist/shared/bricks/manifests/tabs.manifest.js.map +1 -0
  63. package/dist/shared/bricks/manifests/testimonials.manifest.d.ts +2 -2
  64. package/dist/shared/bricks/manifests/testimonials.manifest.js +28 -1
  65. package/dist/shared/bricks/manifests/text.manifest.d.ts +2 -2
  66. package/dist/shared/bricks/manifests/text.manifest.js +28 -1
  67. package/dist/shared/bricks/manifests/timeline.manifest.d.ts +101 -0
  68. package/dist/shared/bricks/manifests/timeline.manifest.d.ts.map +1 -0
  69. package/dist/shared/bricks/manifests/timeline.manifest.js +31 -0
  70. package/dist/shared/bricks/manifests/timeline.manifest.js.map +1 -0
  71. package/dist/shared/bricks/manifests/video.manifest.d.ts +2 -2
  72. package/dist/shared/bricks/manifests/video.manifest.js +28 -1
  73. package/dist/shared/bricks/props/align.d.ts +2 -2
  74. package/dist/shared/bricks/props/align.js +19 -1
  75. package/dist/shared/bricks/props/background.d.ts +4 -4
  76. package/dist/shared/bricks/props/background.js +15 -1
  77. package/dist/shared/bricks/props/boolean.js +7 -1
  78. package/dist/shared/bricks/props/border.js +16 -1
  79. package/dist/shared/bricks/props/color-preset.d.ts.map +1 -1
  80. package/dist/shared/bricks/props/color-preset.js +13 -1
  81. package/dist/shared/bricks/props/color.js +14 -1
  82. package/dist/shared/bricks/props/common.d.ts +2 -2
  83. package/dist/shared/bricks/props/common.js +13 -1
  84. package/dist/shared/bricks/props/css-length.js +14 -1
  85. package/dist/shared/bricks/props/datarecord.js +7 -1
  86. package/dist/shared/bricks/props/datasource.d.ts +1 -1
  87. package/dist/shared/bricks/props/datasource.js +86 -1
  88. package/dist/shared/bricks/props/datasource.js.map +1 -1
  89. package/dist/shared/bricks/props/date.js +9 -1
  90. package/dist/shared/bricks/props/direction.js +11 -1
  91. package/dist/shared/bricks/props/dynamic.d.ts.map +1 -1
  92. package/dist/shared/bricks/props/dynamic.js +30 -1
  93. package/dist/shared/bricks/props/effects.js +17 -1
  94. package/dist/shared/bricks/props/file.js +15 -1
  95. package/dist/shared/bricks/props/file.js.map +1 -1
  96. package/dist/shared/bricks/props/geolocation.js +44 -1
  97. package/dist/shared/bricks/props/geolocation.js.map +1 -1
  98. package/dist/shared/bricks/props/helpers.d.ts +1 -1
  99. package/dist/shared/bricks/props/helpers.js +18 -1
  100. package/dist/shared/bricks/props/image.js +11 -1
  101. package/dist/shared/bricks/props/number.js +7 -1
  102. package/dist/shared/bricks/props/position.js +7 -1
  103. package/dist/shared/bricks/props/string.js +18 -1
  104. package/dist/shared/bricks/props/tags.js +10 -1
  105. package/dist/shared/bricks/props/text.js +19 -1
  106. package/dist/shared/bricks.d.ts +56 -44
  107. package/dist/shared/bricks.d.ts.map +1 -1
  108. package/dist/shared/bricks.js +79 -1
  109. package/dist/shared/chunk-2BPYOTKA.js +21 -0
  110. package/dist/shared/{chunk-WHTPGWUV.js.map → chunk-2BPYOTKA.js.map} +1 -1
  111. package/dist/shared/chunk-2HO4FHLM.js +456 -0
  112. package/dist/shared/{chunk-I3VL6SRH.js.map → chunk-2HO4FHLM.js.map} +1 -1
  113. package/dist/shared/chunk-2RK3CPYJ.js +74 -0
  114. package/dist/shared/{chunk-W33JMRRN.js.map → chunk-2RK3CPYJ.js.map} +1 -1
  115. package/dist/shared/chunk-3KLRW4I2.js +560 -0
  116. package/dist/shared/{chunk-B3EATRFX.js.map → chunk-3KLRW4I2.js.map} +1 -1
  117. package/dist/shared/chunk-3ZDN5BWN.js +18 -0
  118. package/dist/shared/{chunk-OIY3EPHO.js.map → chunk-3ZDN5BWN.js.map} +1 -1
  119. package/dist/shared/chunk-4WI23M7W.js +30 -0
  120. package/dist/shared/chunk-4WI23M7W.js.map +1 -0
  121. package/dist/shared/chunk-55C6MTX2.js +21 -0
  122. package/dist/shared/{chunk-KBHDY425.js.map → chunk-55C6MTX2.js.map} +1 -1
  123. package/dist/shared/chunk-6E42XWFH.js +103 -0
  124. package/dist/shared/{chunk-ZA3GAB4H.js.map → chunk-6E42XWFH.js.map} +1 -1
  125. package/dist/shared/chunk-6TVVKUWM.js +15 -0
  126. package/dist/shared/{chunk-4WDWJA3N.js.map → chunk-6TVVKUWM.js.map} +1 -1
  127. package/dist/shared/chunk-6WIMWLCJ.js +17 -0
  128. package/dist/shared/{chunk-KYY3PHP7.js.map → chunk-6WIMWLCJ.js.map} +1 -1
  129. package/dist/shared/chunk-7LAWWRU7.js +21 -0
  130. package/dist/shared/{chunk-IUXCWWGO.js.map → chunk-7LAWWRU7.js.map} +1 -1
  131. package/dist/shared/chunk-A2QPY54H.js +13 -0
  132. package/dist/shared/{chunk-KFM6KXSE.js.map → chunk-A2QPY54H.js.map} +1 -1
  133. package/dist/shared/chunk-BHC2A43S.js +67 -0
  134. package/dist/shared/{chunk-3YVJ2ELD.js.map → chunk-BHC2A43S.js.map} +1 -1
  135. package/dist/shared/chunk-BMWRR4DI.js +572 -0
  136. package/dist/shared/chunk-BMWRR4DI.js.map +1 -0
  137. package/dist/shared/chunk-BPBKHEQ5.js +39 -0
  138. package/dist/shared/{chunk-OHNYCXPX.js.map → chunk-BPBKHEQ5.js.map} +1 -1
  139. package/dist/shared/chunk-BW6EFRSF.js +794 -0
  140. package/dist/shared/chunk-BW6EFRSF.js.map +1 -0
  141. package/dist/shared/chunk-CKFRSHR2.js +105 -0
  142. package/dist/shared/{chunk-CFF6Q7O7.js.map → chunk-CKFRSHR2.js.map} +1 -1
  143. package/dist/shared/chunk-CSF2WQX2.js +60 -0
  144. package/dist/shared/{chunk-GLS7HPIZ.js.map → chunk-CSF2WQX2.js.map} +1 -1
  145. package/dist/shared/chunk-D4YQ6ABM.js +338 -0
  146. package/dist/shared/{chunk-PXI7AHWS.js.map → chunk-D4YQ6ABM.js.map} +1 -1
  147. package/dist/shared/chunk-DRTGM2UJ.js +129 -0
  148. package/dist/shared/{chunk-FLOMNC6J.js.map → chunk-DRTGM2UJ.js.map} +1 -1
  149. package/dist/shared/chunk-EQMU6NIU.js +1222 -0
  150. package/dist/shared/chunk-EQMU6NIU.js.map +1 -0
  151. package/dist/shared/chunk-EWSPTRDL.js +378 -0
  152. package/dist/shared/{chunk-QX6OGRRT.js.map → chunk-EWSPTRDL.js.map} +1 -1
  153. package/dist/shared/chunk-F22LDHEO.js +105 -0
  154. package/dist/shared/{chunk-5YRC3IT3.js.map → chunk-F22LDHEO.js.map} +1 -1
  155. package/dist/shared/chunk-FVU5PXRC.js +244 -0
  156. package/dist/shared/chunk-FVU5PXRC.js.map +1 -0
  157. package/dist/shared/chunk-GCQURRVB.js +837 -0
  158. package/dist/shared/{chunk-WYVJE6J5.js.map → chunk-GCQURRVB.js.map} +1 -1
  159. package/dist/shared/chunk-GPCI2N2A.js +395 -0
  160. package/dist/shared/{chunk-WBZW5LVH.js.map → chunk-GPCI2N2A.js.map} +1 -1
  161. package/dist/shared/chunk-GRMY35BU.js +722 -0
  162. package/dist/shared/{chunk-NJGXC7D6.js.map → chunk-GRMY35BU.js.map} +1 -1
  163. package/dist/shared/chunk-HPCCD6V5.js +17 -0
  164. package/dist/shared/{chunk-6I3ONVU6.js.map → chunk-HPCCD6V5.js.map} +1 -1
  165. package/dist/shared/chunk-JK2FWFJU.js +15 -0
  166. package/dist/shared/{chunk-JMN3HTZU.js.map → chunk-JK2FWFJU.js.map} +1 -1
  167. package/dist/shared/chunk-KNREHAPN.js +13 -0
  168. package/dist/shared/{chunk-KSEURRVZ.js.map → chunk-KNREHAPN.js.map} +1 -1
  169. package/dist/shared/chunk-KT7SSWMM.js +24 -0
  170. package/dist/shared/{chunk-KO5FPOWZ.js.map → chunk-KT7SSWMM.js.map} +1 -1
  171. package/dist/shared/chunk-LXAO3JA6.js +368 -0
  172. package/dist/shared/chunk-LXAO3JA6.js.map +1 -0
  173. package/dist/shared/chunk-MLZT7MRQ.js +538 -0
  174. package/dist/shared/chunk-MLZT7MRQ.js.map +1 -0
  175. package/dist/shared/chunk-NT3IW52F.js +260 -0
  176. package/dist/shared/chunk-NT3IW52F.js.map +1 -0
  177. package/dist/shared/chunk-NTLAKMMQ.js +94 -0
  178. package/dist/shared/{chunk-ZTZJHY4E.js.map → chunk-NTLAKMMQ.js.map} +1 -1
  179. package/dist/shared/chunk-O5PLB3YB.js +413 -0
  180. package/dist/shared/chunk-O5PLB3YB.js.map +1 -0
  181. package/dist/shared/chunk-O5PQISX4.js +51 -0
  182. package/dist/shared/{chunk-VEDQV5XO.js.map → chunk-O5PQISX4.js.map} +1 -1
  183. package/dist/shared/chunk-OJP4HMJT.js +22 -0
  184. package/dist/shared/{chunk-6HLU4UI2.js.map → chunk-OJP4HMJT.js.map} +1 -1
  185. package/dist/shared/chunk-OSJ6KGPX.js +16 -0
  186. package/dist/shared/{chunk-GPEMPZXK.js.map → chunk-OSJ6KGPX.js.map} +1 -1
  187. package/dist/shared/chunk-OXYXZHP2.js +48 -0
  188. package/dist/shared/{chunk-5O4Z3YQY.js.map → chunk-OXYXZHP2.js.map} +1 -1
  189. package/dist/shared/chunk-P3RH5URN.js +230 -0
  190. package/dist/shared/{chunk-R6ATC4TC.js.map → chunk-P3RH5URN.js.map} +1 -1
  191. package/dist/shared/chunk-Q4NPPLEU.js +34 -0
  192. package/dist/shared/{chunk-QWGUMKZC.js.map → chunk-Q4NPPLEU.js.map} +1 -1
  193. package/dist/shared/chunk-QL3T5HJQ.js +59 -0
  194. package/dist/shared/{chunk-E6XEI7IK.js.map → chunk-QL3T5HJQ.js.map} +1 -1
  195. package/dist/shared/chunk-QLQVDZIL.js +11 -0
  196. package/dist/shared/{chunk-KLD3P5XH.js.map → chunk-QLQVDZIL.js.map} +1 -1
  197. package/dist/shared/chunk-QQQ3FYPG.js +248 -0
  198. package/dist/shared/{chunk-SXHDQ64Z.js.map → chunk-QQQ3FYPG.js.map} +1 -1
  199. package/dist/shared/chunk-QSND5IWT.js +165 -0
  200. package/dist/shared/{chunk-ZQPXQCY2.js.map → chunk-QSND5IWT.js.map} +1 -1
  201. package/dist/shared/chunk-RV7AYVFV.js +75 -0
  202. package/dist/shared/{chunk-DHI3IBOD.js.map → chunk-RV7AYVFV.js.map} +1 -1
  203. package/dist/shared/chunk-SE6O65HC.js +44 -0
  204. package/dist/shared/{chunk-NM5MMPCF.js.map → chunk-SE6O65HC.js.map} +1 -1
  205. package/dist/shared/chunk-SHUGHJ7V.js +519 -0
  206. package/dist/shared/{chunk-IKC3FK7L.js.map → chunk-SHUGHJ7V.js.map} +1 -1
  207. package/dist/shared/chunk-TB3X4LRQ.js +56 -0
  208. package/dist/shared/{chunk-RJYZ5FAR.js.map → chunk-TB3X4LRQ.js.map} +1 -1
  209. package/dist/shared/chunk-TEO6TJOM.js +212 -0
  210. package/dist/shared/chunk-TEO6TJOM.js.map +1 -0
  211. package/dist/shared/chunk-TFGGYU6Y.js +394 -0
  212. package/dist/shared/{chunk-CZRCW5EN.js.map → chunk-TFGGYU6Y.js.map} +1 -1
  213. package/dist/shared/chunk-TKMWY2VN.js +18 -0
  214. package/dist/shared/{chunk-RDZK73KV.js.map → chunk-TKMWY2VN.js.map} +1 -1
  215. package/dist/shared/chunk-TNMNMYOB.js +69 -0
  216. package/dist/shared/{chunk-4BTB3MU2.js.map → chunk-TNMNMYOB.js.map} +1 -1
  217. package/dist/shared/chunk-U7TVEPKA.js +432 -0
  218. package/dist/shared/chunk-U7TVEPKA.js.map +1 -0
  219. package/dist/shared/chunk-UQF52PWK.js +70 -0
  220. package/dist/shared/{chunk-A3GF4PYW.js.map → chunk-UQF52PWK.js.map} +1 -1
  221. package/dist/shared/chunk-V3UA3LRK.js +253 -0
  222. package/dist/shared/{chunk-G5CJU6RD.js.map → chunk-V3UA3LRK.js.map} +1 -1
  223. package/dist/shared/chunk-W6MRYRGJ.js +100 -0
  224. package/dist/shared/{chunk-CCI4C3TM.js.map → chunk-W6MRYRGJ.js.map} +1 -1
  225. package/dist/shared/chunk-WGDUJSSS.js +462 -0
  226. package/dist/shared/chunk-WGDUJSSS.js.map +1 -0
  227. package/dist/shared/chunk-WKN566LN.js +29 -0
  228. package/dist/shared/{chunk-Q4H4QEMB.js.map → chunk-WKN566LN.js.map} +1 -1
  229. package/dist/shared/chunk-X6N463D4.js +222 -0
  230. package/dist/shared/{chunk-IKHZD2JH.js.map → chunk-X6N463D4.js.map} +1 -1
  231. package/dist/shared/chunk-X75YV73Q.js +178 -0
  232. package/dist/shared/{chunk-PLSV746R.js.map → chunk-X75YV73Q.js.map} +1 -1
  233. package/dist/shared/chunk-XCWMZVF5.js +89 -0
  234. package/dist/shared/{chunk-ZFCUSWMT.js.map → chunk-XCWMZVF5.js.map} +1 -1
  235. package/dist/shared/chunk-XCZVD5H6.js +13 -0
  236. package/dist/shared/{chunk-HAGKVQOW.js.map → chunk-XCZVD5H6.js.map} +1 -1
  237. package/dist/shared/chunk-XZ6WJZHN.js +10 -0
  238. package/dist/shared/{chunk-DCH4ZKWT.js.map → chunk-XZ6WJZHN.js.map} +1 -1
  239. package/dist/shared/chunk-Y74LZNND.js +30 -0
  240. package/dist/shared/{chunk-GACHLACT.js.map → chunk-Y74LZNND.js.map} +1 -1
  241. package/dist/shared/chunk-Z2NTDFB4.js +505 -0
  242. package/dist/shared/{chunk-SQ5T4AT5.js.map → chunk-Z2NTDFB4.js.map} +1 -1
  243. package/dist/shared/chunk-Z35I5JM5.js +131 -0
  244. package/dist/shared/{chunk-PSTFJ5IJ.js.map → chunk-Z35I5JM5.js.map} +1 -1
  245. package/dist/shared/chunk-ZEFOWKYP.js +44 -0
  246. package/dist/shared/{chunk-DQ7PRWTG.js.map → chunk-ZEFOWKYP.js.map} +1 -1
  247. package/dist/shared/chunk-ZGQ3AQBG.js +33 -0
  248. package/dist/shared/chunk-ZGQ3AQBG.js.map +1 -0
  249. package/dist/shared/chunk-ZLYIRH2B.js +68 -0
  250. package/dist/shared/{chunk-SWLUQVK7.js.map → chunk-ZLYIRH2B.js.map} +1 -1
  251. package/dist/shared/datarecords/external/airtable/handler.js +377 -1
  252. package/dist/shared/datarecords/external/airtable/handler.js.map +1 -1
  253. package/dist/shared/datarecords/external/airtable/oauth/config.js +15 -1
  254. package/dist/shared/datarecords/external/airtable/oauth/config.js.map +1 -1
  255. package/dist/shared/datarecords/external/airtable/types.js +11 -1
  256. package/dist/shared/datarecords/external/generic-webhook/handler.js +14 -1
  257. package/dist/shared/datarecords/external/generic-webhook/handler.js.map +1 -1
  258. package/dist/shared/datarecords/external/generic-webhook/options.js +16 -1
  259. package/dist/shared/datarecords/external/generic-webhook/options.js.map +1 -1
  260. package/dist/shared/datarecords/external/google/oauth/config.js +35 -1
  261. package/dist/shared/datarecords/external/google/oauth/config.js.map +1 -1
  262. package/dist/shared/datarecords/external/google/sheets/client.js +7 -1
  263. package/dist/shared/datarecords/external/google/sheets/handler.js +184 -5
  264. package/dist/shared/datarecords/external/google/sheets/handler.js.map +1 -1
  265. package/dist/shared/datarecords/external/google/sheets/types.js +7 -1
  266. package/dist/shared/datarecords/external/notion/handler.js +397 -1
  267. package/dist/shared/datarecords/external/notion/handler.js.map +1 -1
  268. package/dist/shared/datarecords/external/notion/oauth/config.js +11 -1
  269. package/dist/shared/datarecords/external/notion/oauth/config.js.map +1 -1
  270. package/dist/shared/datarecords/external/notion/types.js +7 -1
  271. package/dist/shared/datarecords/types.d.ts +3 -3
  272. package/dist/shared/datarecords/types.js +16 -1
  273. package/dist/shared/datarecords.js +9 -1
  274. package/dist/shared/datarecords.js.map +1 -1
  275. package/dist/shared/datasources/external/facebook/posts/fetcher.js +49 -1
  276. package/dist/shared/datasources/external/facebook/posts/fetcher.js.map +1 -1
  277. package/dist/shared/datasources/external/facebook/posts/schema.js +36 -1
  278. package/dist/shared/datasources/external/facebook/posts/schema.js.map +1 -1
  279. package/dist/shared/datasources/external/http-json/fetcher.js +29 -1
  280. package/dist/shared/datasources/external/http-json/fetcher.js.map +1 -1
  281. package/dist/shared/datasources/external/http-json/options.js +11 -1
  282. package/dist/shared/datasources/external/http-json/options.js.map +1 -1
  283. package/dist/shared/datasources/external/http-json/schema.js +10 -1
  284. package/dist/shared/datasources/external/http-json/schema.js.map +1 -1
  285. package/dist/shared/datasources/external/instagram/feed/fetcher.js +29 -1
  286. package/dist/shared/datasources/external/instagram/feed/fetcher.js.map +1 -1
  287. package/dist/shared/datasources/external/instagram/feed/schema.js +26 -1
  288. package/dist/shared/datasources/external/instagram/feed/schema.js.map +1 -1
  289. package/dist/shared/datasources/external/mastodon/account/fetcher.js +7 -1
  290. package/dist/shared/datasources/external/mastodon/account/schema.js +7 -1
  291. package/dist/shared/datasources/external/mastodon/options.js +10 -1
  292. package/dist/shared/datasources/external/mastodon/options.js.map +1 -1
  293. package/dist/shared/datasources/external/mastodon/status/fetcher.js +31 -1
  294. package/dist/shared/datasources/external/mastodon/status/fetcher.js.map +1 -1
  295. package/dist/shared/datasources/external/mastodon/status/sample.array.js +61 -1
  296. package/dist/shared/datasources/external/mastodon/status/sample.array.js.map +1 -1
  297. package/dist/shared/datasources/external/mastodon/status/sample.single.js +59 -1
  298. package/dist/shared/datasources/external/mastodon/status/sample.single.js.map +1 -1
  299. package/dist/shared/datasources/external/mastodon/status/schema.js +125 -1
  300. package/dist/shared/datasources/external/mastodon/status/schema.js.map +1 -1
  301. package/dist/shared/datasources/external/meta/oauth/config.js +17 -1
  302. package/dist/shared/datasources/external/meta/oauth/config.js.map +1 -1
  303. package/dist/shared/datasources/external/meta/options.js +10 -1
  304. package/dist/shared/datasources/external/meta/options.js.map +1 -1
  305. package/dist/shared/datasources/external/rss/fetcher.js +26 -1
  306. package/dist/shared/datasources/external/rss/fetcher.js.map +1 -1
  307. package/dist/shared/datasources/external/rss/options.js +10 -1
  308. package/dist/shared/datasources/external/rss/options.js.map +1 -1
  309. package/dist/shared/datasources/external/rss/schema.js +7 -1
  310. package/dist/shared/datasources/external/threads/media/fetcher.js +47 -1
  311. package/dist/shared/datasources/external/threads/media/fetcher.js.map +1 -1
  312. package/dist/shared/datasources/external/threads/media/schema.js +40 -1
  313. package/dist/shared/datasources/external/threads/media/schema.js.map +1 -1
  314. package/dist/shared/datasources/external/tiktok/oauth/config.js +18 -1
  315. package/dist/shared/datasources/external/tiktok/oauth/config.js.map +1 -1
  316. package/dist/shared/datasources/external/tiktok/video/fetcher.js +34 -1
  317. package/dist/shared/datasources/external/tiktok/video/fetcher.js.map +1 -1
  318. package/dist/shared/datasources/external/tiktok/video/options.js +11 -1
  319. package/dist/shared/datasources/external/tiktok/video/options.js.map +1 -1
  320. package/dist/shared/datasources/external/tiktok/video/schema.js +30 -1
  321. package/dist/shared/datasources/external/tiktok/video/schema.js.map +1 -1
  322. package/dist/shared/datasources/external/youtube/list/fetcher.js +32 -1
  323. package/dist/shared/datasources/external/youtube/list/fetcher.js.map +1 -1
  324. package/dist/shared/datasources/external/youtube/list/options.js +14 -1
  325. package/dist/shared/datasources/external/youtube/list/options.js.map +1 -1
  326. package/dist/shared/datasources/external/youtube/list/schema.js +7 -1
  327. package/dist/shared/datasources/external/youtube/oauth/config.js +18 -1
  328. package/dist/shared/datasources/external/youtube/oauth/config.js.map +1 -1
  329. package/dist/shared/datasources/internal/blog/schema.js +72 -1
  330. package/dist/shared/datasources/internal/blog/schema.js.map +1 -1
  331. package/dist/shared/datasources/internal/changelog/schema.js +51 -1
  332. package/dist/shared/datasources/internal/changelog/schema.js.map +1 -1
  333. package/dist/shared/datasources/internal/contact-info/schema.js +25 -1
  334. package/dist/shared/datasources/internal/contact-info/schema.js.map +1 -1
  335. package/dist/shared/datasources/internal/cv/schema.js +222 -1
  336. package/dist/shared/datasources/internal/cv/schema.js.map +1 -1
  337. package/dist/shared/datasources/internal/faq/schema.js +30 -1
  338. package/dist/shared/datasources/internal/faq/schema.js.map +1 -1
  339. package/dist/shared/datasources/internal/job-board/schema.js +224 -1
  340. package/dist/shared/datasources/internal/job-board/schema.js.map +1 -1
  341. package/dist/shared/datasources/internal/links/schema.js +7 -1
  342. package/dist/shared/datasources/internal/recipes/schema.js +45 -1
  343. package/dist/shared/datasources/internal/recipes/schema.js.map +1 -1
  344. package/dist/shared/datasources/internal/restaurant/schema.js +226 -1
  345. package/dist/shared/datasources/internal/restaurant/schema.js.map +1 -1
  346. package/dist/shared/datasources/samples.js +69 -1
  347. package/dist/shared/datasources/samples.js.map +1 -1
  348. package/dist/shared/datasources/schemas.js +34 -1
  349. package/dist/shared/datasources/schemas.js.map +1 -1
  350. package/dist/shared/datasources/types.d.ts +1 -1
  351. package/dist/shared/datasources/types.d.ts.map +1 -1
  352. package/dist/shared/datasources/types.js +32 -1
  353. package/dist/shared/datasources/utils.js +11 -1
  354. package/dist/shared/datasources.js +51 -1
  355. package/dist/shared/datasources.js.map +1 -1
  356. package/dist/shared/errors.js +7 -1
  357. package/dist/shared/images.d.ts +4 -4
  358. package/dist/shared/images.d.ts.map +1 -1
  359. package/dist/shared/images.js +44 -1
  360. package/dist/shared/images.js.map +1 -1
  361. package/dist/shared/index.js +9 -1
  362. package/dist/shared/index.js.map +1 -1
  363. package/dist/shared/layout-constants.js +14 -1
  364. package/dist/shared/layout-constants.js.map +1 -1
  365. package/dist/shared/manifest.js +52 -1
  366. package/dist/shared/manifest.js.map +1 -1
  367. package/dist/shared/oauth.js +8 -1
  368. package/dist/shared/page.d.ts +12 -126
  369. package/dist/shared/page.d.ts.map +1 -1
  370. package/dist/shared/page.js +58 -1
  371. package/dist/shared/prompt.js +7 -1
  372. package/dist/shared/responsive.js +10 -1
  373. package/dist/shared/responsive.js.map +1 -1
  374. package/dist/shared/schema-registry.d.ts +5 -0
  375. package/dist/shared/schema-registry.d.ts.map +1 -0
  376. package/dist/shared/schema-registry.js +119 -0
  377. package/dist/shared/schema-registry.js.map +1 -0
  378. package/dist/shared/site.d.ts +36 -33
  379. package/dist/shared/site.d.ts.map +1 -1
  380. package/dist/shared/site.js +127 -1
  381. package/dist/shared/site.js.map +1 -1
  382. package/dist/shared/sitemap.d.ts +17 -17
  383. package/dist/shared/sitemap.d.ts.map +1 -1
  384. package/dist/shared/sitemap.js +69 -1
  385. package/dist/shared/social-icons.js +312 -1
  386. package/dist/shared/social-icons.js.map +1 -1
  387. package/dist/shared/tests/schema-registry.test.d.ts +2 -0
  388. package/dist/shared/tests/schema-registry.test.d.ts.map +1 -0
  389. package/dist/shared/theme.d.ts +1 -1
  390. package/dist/shared/theme.d.ts.map +1 -1
  391. package/dist/shared/theme.js +35 -1
  392. package/dist/shared/themes/color-system.d.ts +0 -1
  393. package/dist/shared/themes/color-system.d.ts.map +1 -1
  394. package/dist/shared/themes/color-system.js +103 -1
  395. package/dist/shared/themes/color-system.js.map +1 -1
  396. package/dist/shared/utils/canvas-data-uri.js +7 -1
  397. package/dist/shared/utils/canvas-data-uri.js.map +1 -1
  398. package/dist/shared/utils/invariant.js +7 -1
  399. package/dist/shared/utils/json-date.js +7 -1
  400. package/dist/shared/utils/llm.d.ts +2 -3
  401. package/dist/shared/utils/llm.d.ts.map +1 -1
  402. package/dist/shared/utils/llm.js +24 -1
  403. package/dist/shared/utils/merge.js +7 -1
  404. package/dist/shared/utils/object-hash.js +13 -1
  405. package/dist/shared/utils/object-hash.js.map +1 -1
  406. package/dist/shared/utils/schema-registry.d.ts +5 -0
  407. package/dist/shared/utils/schema-registry.d.ts.map +1 -0
  408. package/dist/shared/utils/schema-registry.js +29 -0
  409. package/dist/shared/utils/schema-registry.js.map +1 -0
  410. package/dist/shared/utils/schema.d.ts +2 -1
  411. package/dist/shared/utils/schema.d.ts.map +1 -1
  412. package/dist/shared/utils/schema.js +31 -1
  413. package/dist/shared/utils/string-enum.js +7 -1
  414. package/dist/shared/utils/tests/schema-registry.test.d.ts +2 -0
  415. package/dist/shared/utils/tests/schema-registry.test.d.ts.map +1 -0
  416. package/dist/shared/utils/try-catch.js +13 -1
  417. package/dist/shared/utils/try-catch.js.map +1 -1
  418. package/dist/shared/utils/typed-ref.js +7 -1
  419. package/package.json +12 -13
  420. package/src/shared/ai/schemas.ts +4 -8
  421. package/src/shared/ai/types.ts +9 -1
  422. package/src/shared/attributes.ts +27 -25
  423. package/src/shared/bricks/manifests/all-manifests.ts +15 -0
  424. package/src/shared/bricks/manifests/footer.manifest.ts +36 -27
  425. package/src/shared/bricks/manifests/navbar.manifest.ts +1 -3
  426. package/src/shared/bricks/manifests/table.manifest.ts +443 -0
  427. package/src/shared/bricks/manifests/tabs.manifest.ts +576 -0
  428. package/src/shared/bricks/manifests/timeline.manifest.ts +441 -0
  429. package/src/shared/bricks/props/color-preset.ts +3 -1
  430. package/src/shared/bricks/props/dynamic.ts +0 -1
  431. package/src/shared/bricks.ts +54 -45
  432. package/src/shared/datasources/types.ts +1 -5
  433. package/src/shared/images.ts +10 -8
  434. package/src/shared/page.ts +0 -4
  435. package/src/shared/schema-registry.ts +82 -0
  436. package/src/shared/sitemap.ts +12 -16
  437. package/src/shared/tests/schema-registry.test.ts +14 -0
  438. package/src/shared/theme.ts +1 -4
  439. package/src/shared/themes/color-system.ts +0 -1
  440. package/src/shared/utils/llm.ts +13 -12
  441. package/src/shared/utils/schema-registry.ts +82 -0
  442. package/src/shared/utils/schema.ts +18 -3
  443. package/src/shared/utils/tests/schema-registry.test.ts +13 -0
  444. package/src/shared/utils/tests/schema.test.ts +82 -55
  445. package/dist/shared/bricks/props/enum.d.ts +0 -13
  446. package/dist/shared/bricks/props/enum.d.ts.map +0 -1
  447. package/dist/shared/bricks/props/enum.js +0 -4
  448. package/dist/shared/chunk-3YVJ2ELD.js +0 -4
  449. package/dist/shared/chunk-4BTB3MU2.js +0 -4
  450. package/dist/shared/chunk-4WDWJA3N.js +0 -4
  451. package/dist/shared/chunk-5O4Z3YQY.js +0 -4
  452. package/dist/shared/chunk-5YRC3IT3.js +0 -4
  453. package/dist/shared/chunk-6HLU4UI2.js +0 -4
  454. package/dist/shared/chunk-6I3ONVU6.js +0 -4
  455. package/dist/shared/chunk-7A2JNQX3.js +0 -4
  456. package/dist/shared/chunk-7A2JNQX3.js.map +0 -1
  457. package/dist/shared/chunk-A3GF4PYW.js +0 -4
  458. package/dist/shared/chunk-A3K4NUVP.js +0 -4
  459. package/dist/shared/chunk-A3K4NUVP.js.map +0 -1
  460. package/dist/shared/chunk-AFVJZPLS.js +0 -4
  461. package/dist/shared/chunk-AFVJZPLS.js.map +0 -1
  462. package/dist/shared/chunk-AI4GHU7R.js +0 -4
  463. package/dist/shared/chunk-AI4GHU7R.js.map +0 -1
  464. package/dist/shared/chunk-B3EATRFX.js +0 -4
  465. package/dist/shared/chunk-CCI4C3TM.js +0 -4
  466. package/dist/shared/chunk-CFF6Q7O7.js +0 -7
  467. package/dist/shared/chunk-CZRCW5EN.js +0 -4
  468. package/dist/shared/chunk-DCH4ZKWT.js +0 -4
  469. package/dist/shared/chunk-DHI3IBOD.js +0 -4
  470. package/dist/shared/chunk-DQ7PRWTG.js +0 -4
  471. package/dist/shared/chunk-E6XEI7IK.js +0 -4
  472. package/dist/shared/chunk-FLOMNC6J.js +0 -4
  473. package/dist/shared/chunk-G5CJU6RD.js +0 -7
  474. package/dist/shared/chunk-GACHLACT.js +0 -4
  475. package/dist/shared/chunk-GLS7HPIZ.js +0 -4
  476. package/dist/shared/chunk-GOMXZC4B.js +0 -35
  477. package/dist/shared/chunk-GOMXZC4B.js.map +0 -1
  478. package/dist/shared/chunk-GPEMPZXK.js +0 -4
  479. package/dist/shared/chunk-HAGKVQOW.js +0 -4
  480. package/dist/shared/chunk-I3VL6SRH.js +0 -9
  481. package/dist/shared/chunk-IKC3FK7L.js +0 -4
  482. package/dist/shared/chunk-IKHZD2JH.js +0 -4
  483. package/dist/shared/chunk-IUXCWWGO.js +0 -4
  484. package/dist/shared/chunk-JMN3HTZU.js +0 -4
  485. package/dist/shared/chunk-KBHDY425.js +0 -4
  486. package/dist/shared/chunk-KFM6KXSE.js +0 -4
  487. package/dist/shared/chunk-KLD3P5XH.js +0 -4
  488. package/dist/shared/chunk-KO5FPOWZ.js +0 -4
  489. package/dist/shared/chunk-KSEURRVZ.js +0 -4
  490. package/dist/shared/chunk-KYY3PHP7.js +0 -4
  491. package/dist/shared/chunk-NJGXC7D6.js +0 -4
  492. package/dist/shared/chunk-NM5MMPCF.js +0 -4
  493. package/dist/shared/chunk-OGBMYMZD.js +0 -4
  494. package/dist/shared/chunk-OGBMYMZD.js.map +0 -1
  495. package/dist/shared/chunk-OHNYCXPX.js +0 -4
  496. package/dist/shared/chunk-OIY3EPHO.js +0 -4
  497. package/dist/shared/chunk-PIG623TZ.js +0 -4
  498. package/dist/shared/chunk-PIG623TZ.js.map +0 -1
  499. package/dist/shared/chunk-PLSV746R.js +0 -4
  500. package/dist/shared/chunk-PSCN3VVA.js +0 -4
  501. package/dist/shared/chunk-PSCN3VVA.js.map +0 -1
  502. package/dist/shared/chunk-PSTFJ5IJ.js +0 -4
  503. package/dist/shared/chunk-PXI7AHWS.js +0 -4
  504. package/dist/shared/chunk-Q4H4QEMB.js +0 -4
  505. package/dist/shared/chunk-QGYZ7CG5.js +0 -4
  506. package/dist/shared/chunk-QGYZ7CG5.js.map +0 -1
  507. package/dist/shared/chunk-QWGUMKZC.js +0 -4
  508. package/dist/shared/chunk-QX6OGRRT.js +0 -5
  509. package/dist/shared/chunk-R6ATC4TC.js +0 -4
  510. package/dist/shared/chunk-RDZK73KV.js +0 -4
  511. package/dist/shared/chunk-RJYZ5FAR.js +0 -4
  512. package/dist/shared/chunk-SQ5T4AT5.js +0 -6
  513. package/dist/shared/chunk-SWLUQVK7.js +0 -4
  514. package/dist/shared/chunk-SXHDQ64Z.js +0 -5
  515. package/dist/shared/chunk-SY6DZLTC.js +0 -4
  516. package/dist/shared/chunk-SY6DZLTC.js.map +0 -1
  517. package/dist/shared/chunk-VEDQV5XO.js +0 -4
  518. package/dist/shared/chunk-W33JMRRN.js +0 -4
  519. package/dist/shared/chunk-WBZW5LVH.js +0 -4
  520. package/dist/shared/chunk-WHTPGWUV.js +0 -4
  521. package/dist/shared/chunk-WYVJE6J5.js +0 -4
  522. package/dist/shared/chunk-ZA3GAB4H.js +0 -9
  523. package/dist/shared/chunk-ZFCUSWMT.js +0 -4
  524. package/dist/shared/chunk-ZQPXQCY2.js +0 -4
  525. package/dist/shared/chunk-ZTZJHY4E.js +0 -4
  526. package/src/shared/bricks/props/enum.ts +0 -38
  527. /package/dist/shared/bricks/{props/enum.js.map → manifests/table.manifest.js.map} +0 -0
@@ -1,4 +1,380 @@
1
1
  /*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
2
2
 
3
- var u=e=>new Promise(n=>setTimeout(n,e));function d(e){if(!e)throw new Error("Missing Airtable API token");return{async callApi(n,s="GET",o=null){let a=`https://api.airtable.com/${n}`,i=5,t=3e4;for(let r=1;r<=i;r++)try{let c=await fetch(a,{method:s,headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:o?JSON.stringify(o):void 0});if(c.status===429&&r<i){console.warn(`Airtable rate limit hit (429) on attempt ${r}/${i}. Waiting ${t/1e3}s before retry...`),await u(t);continue}let l=await c.json();return{status:c.status,success:c.ok,data:l}}catch(c){if(r<i){console.warn(`Network error on attempt ${r}/${i}. Waiting ${t/1e3}s before retry...`,c),await u(t);continue}throw console.error(`Error on attempt ${r}/${i}:`,c),c}throw new Error(`Airtable API rate limit exceeded after ${i} attempts`)}}}function f(e,n){switch(n){case"checkbox":return e==="true"||e==="1"||e.toLowerCase()==="on";case"number":{let s=Number(e);return Number.isNaN(s)?e:s}case"date":case"dateTime":return e;case"email":case"url":case"singleLineText":case"multilineText":return e;case"singleSelect":return e;case"multipleSelects":{if(e.startsWith("[")&&e.endsWith("]"))try{return JSON.parse(e)}catch{return[e]}return e.includes(",")?e.split(",").map(s=>s.trim()).filter(s=>s.length>0):[e]}default:return console.warn(`Unknown Airtable field type: ${n}, treating as text`),e}}function b(e){if(e==="true"||e==="false")return e==="true";if(/^\d+\.?\d*$/.test(e)){let n=Number(e);if(!Number.isNaN(n))return n}if(/^\d{4}-\d{2}-\d{2}$/.test(e)||/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(e))return e;if(e.includes(",")){let n=e.split(",").map(s=>s.trim()).filter(s=>s.length>0);if(n.length>1)return n}return e}async function g({formData:e,options:n,properties:s,accessToken:o}){try{let a=d(o),i={};for(let[r,c]of e.entries()){if(c==null||c==="")continue;if(c instanceof File){console.warn(`File upload not yet supported for field: ${r}`);continue}let l=n.fields?.find(m=>m.name===r);l?i[r]=f(c,l.type):i[r]=b(c)}let t=await a.callApi(`v0/${n.baseId}/${n.tableId}`,"POST",{records:[{fields:i}]});if(!t.success)throw new Error(`Failed to push data to Airtable: ${t.status} - ${JSON.stringify(t.data)}`);return t.data.records[0]?{id:t.data.records[0].id}:null}catch(a){console.error("Error pushing data to Airtable:",a)}return null}function p(e){return Object.entries(e).sort(([,o],[,a])=>{let i=o.metadata?.order,t=a.metadata?.order;return i!==void 0&&t!==void 0?i-t:i!==void 0&&t===void 0?-1:i===void 0&&t!==void 0?1:0}).map(([o,a])=>{if(a.type==="string")return a.format==="email"?{name:o,type:"email"}:a.format==="uri"?{name:o,type:"url"}:a.format==="date"?{name:o,type:"date",options:{dateFormat:{name:"local"}}}:a.format==="date-time"?{name:o,type:"dateTime",options:{dateFormat:{name:"local"},timeFormat:{name:"24hour"},timeZone:"client"}}:a.metadata?.["ui:multiline"]?{name:o,type:"multilineText"}:a.enum?a.metadata?.["ui:widget"]==="checkbox"?{name:o,type:"multipleSelects",options:{choices:a.enum.map(i=>({name:i}))}}:{name:o,type:"singleSelect",options:{choices:a.enum.map(i=>({name:i}))}}:{name:o,type:"singleLineText"};if(a.type==="boolean")return{name:o,type:"checkbox",options:{icon:"check",color:"grayBright"}};if(a.type==="number")return{name:o,type:"number",options:{precision:8}}})}async function y({name:e,schema:n,baseId:s,accessToken:o}){let a=p(n.properties),i={name:e,description:`Table created by Upstart for ${e}`,fields:a};try{let r=await d(o).callApi(`v0/meta/bases/${s}/tables`,"POST",i);if(!r.success)throw console.error("Error while creating Airtable table with:",JSON.stringify(i,null,2),"from schema: ",JSON.stringify(n,null,2)),new Error(`Failed to create Airtable table: ${r.status} - ${JSON.stringify(r.data)}`);return{tableId:r.data.id,fields:r.data.fields,tableName:r.data.name,externalUrl:`https://airtable.com/${s}/${r.data.id}`}}catch(t){throw t instanceof Error?console.error(t.message):console.error("Unknown error occurred while creating Airtable table",t),t}}async function w({baseId:e,tableId:n,newName:s,newProperties:o,accessToken:a}){let i=d(a);if(o)try{let t=p(o);for(let r of t){let c=await i.callApi(`v0/meta/bases/${e}/tables/${n}/fields`,"POST",r);if(!c.success)throw console.error("Error while adding field to Airtable table with:",JSON.stringify(r,null,2)),new Error(`Failed to update Airtable table: ${c.status} - ${JSON.stringify(c.data)}`)}}catch(t){throw t instanceof Error?console.error(t.message):console.error("Unknown error occurred while updating Airtable table",t),t}try{let t={name:s,description:`Table updated by Upstart for ${s}`},r=await i.callApi(`v0/meta/bases/${e}/tables/${n}`,"PATCH",t);if(!r.success)throw console.error("Error while updating Airtable table with:",JSON.stringify(t,null,2)),new Error(`Failed to update Airtable table: ${r.status} - ${JSON.stringify(r.data)}`);return{tableId:r.data.id,fields:r.data.fields,tableName:r.data.name,externalUrl:`https://airtable.com/${e}/${r.data.id}`}}catch(t){throw t instanceof Error?console.error(t.message):console.error("Unknown error occurred while creating Airtable table",t),t}}async function h(e){try{let s=await d(e).callApi("v0/meta/bases");if(s.success)return s.data.bases;throw new Error(`Failed to fetch bases: ${s.status}`)}catch(n){return console.error("Error fetching Airtable bases:",n),[]}}export{y as createTable,h as fetchAirtableBases,g as saveRecord,w as updateTable};
3
+ import "../../../chunk-ZGQ3AQBG.js";
4
+
5
+ // src/shared/datarecords/external/airtable/handler.ts
6
+ var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
7
+ function getClient(token) {
8
+ if (!token) {
9
+ throw new Error("Missing Airtable API token");
10
+ }
11
+ return {
12
+ async callApi(path, method = "GET", body = null) {
13
+ const url = `https://api.airtable.com/${path}`;
14
+ const maxRetries = 5;
15
+ const retryDelay = 3e4;
16
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
17
+ try {
18
+ const res = await fetch(url, {
19
+ method,
20
+ headers: {
21
+ Authorization: `Bearer ${token}`,
22
+ "Content-Type": "application/json"
23
+ },
24
+ body: body ? JSON.stringify(body) : void 0
25
+ });
26
+ if (res.status === 429 && attempt < maxRetries) {
27
+ console.warn(
28
+ `Airtable rate limit hit (429) on attempt ${attempt}/${maxRetries}. Waiting ${retryDelay / 1e3}s before retry...`
29
+ );
30
+ await sleep(retryDelay);
31
+ continue;
32
+ }
33
+ const data = await res.json();
34
+ return {
35
+ status: res.status,
36
+ success: res.ok,
37
+ data
38
+ };
39
+ } catch (error) {
40
+ if (attempt < maxRetries) {
41
+ console.warn(
42
+ `Network error on attempt ${attempt}/${maxRetries}. Waiting ${retryDelay / 1e3}s before retry...`,
43
+ error
44
+ );
45
+ await sleep(retryDelay);
46
+ continue;
47
+ }
48
+ console.error(`Error on attempt ${attempt}/${maxRetries}:`, error);
49
+ throw error;
50
+ }
51
+ }
52
+ throw new Error(`Airtable API rate limit exceeded after ${maxRetries} attempts`);
53
+ }
54
+ };
55
+ }
56
+ function convertValueForAirtableField(value, fieldType) {
57
+ switch (fieldType) {
58
+ case "checkbox":
59
+ return value === "true" || value === "1" || value.toLowerCase() === "on";
60
+ case "number": {
61
+ const numValue = Number(value);
62
+ return Number.isNaN(numValue) ? value : numValue;
63
+ }
64
+ case "date":
65
+ case "dateTime":
66
+ return value;
67
+ case "email":
68
+ case "url":
69
+ case "singleLineText":
70
+ case "multilineText":
71
+ return value;
72
+ case "singleSelect":
73
+ return value;
74
+ case "multipleSelects": {
75
+ if (value.startsWith("[") && value.endsWith("]")) {
76
+ try {
77
+ return JSON.parse(value);
78
+ } catch {
79
+ return [value];
80
+ }
81
+ }
82
+ if (value.includes(",")) {
83
+ return value.split(",").map((v) => v.trim()).filter((v) => v.length > 0);
84
+ }
85
+ return [value];
86
+ }
87
+ default:
88
+ console.warn(`Unknown Airtable field type: ${fieldType}, treating as text`);
89
+ return value;
90
+ }
91
+ }
92
+ function convertValueByPattern(value) {
93
+ if (value === "true" || value === "false") {
94
+ return value === "true";
95
+ }
96
+ if (/^\d+\.?\d*$/.test(value)) {
97
+ const numValue = Number(value);
98
+ if (!Number.isNaN(numValue)) {
99
+ return numValue;
100
+ }
101
+ }
102
+ if (/^\d{4}-\d{2}-\d{2}$/.test(value) || /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value)) {
103
+ return value;
104
+ }
105
+ if (value.includes(",")) {
106
+ const values = value.split(",").map((v) => v.trim()).filter((v) => v.length > 0);
107
+ if (values.length > 1) {
108
+ return values;
109
+ }
110
+ }
111
+ return value;
112
+ }
113
+ async function saveRecord({
114
+ formData,
115
+ options,
116
+ properties,
117
+ accessToken
118
+ }) {
119
+ try {
120
+ const client = getClient(accessToken);
121
+ const records = {};
122
+ for (const [key, value] of formData.entries()) {
123
+ if (value === null || value === void 0 || value === "") continue;
124
+ if (value instanceof File) {
125
+ console.warn(`File upload not yet supported for field: ${key}`);
126
+ continue;
127
+ }
128
+ const fieldDef = options.fields?.find((field) => field.name === key);
129
+ if (fieldDef) {
130
+ records[key] = convertValueForAirtableField(value, fieldDef.type);
131
+ } else {
132
+ records[key] = convertValueByPattern(value);
133
+ }
134
+ }
135
+ const response = await client.callApi(`v0/${options.baseId}/${options.tableId}`, "POST", {
136
+ records: [
137
+ {
138
+ fields: records
139
+ }
140
+ ]
141
+ });
142
+ if (!response.success) {
143
+ throw new Error(
144
+ `Failed to push data to Airtable: ${response.status} - ${JSON.stringify(response.data)}`
145
+ );
146
+ }
147
+ return response.data.records[0] ? { id: response.data.records[0].id } : null;
148
+ } catch (error) {
149
+ console.error("Error pushing data to Airtable:", error);
150
+ }
151
+ return null;
152
+ }
153
+ function buildAirtableTableData(properties) {
154
+ const sortedEntries = Object.entries(properties).sort(([, fieldA], [, fieldB]) => {
155
+ const orderA = fieldA.metadata?.order;
156
+ const orderB = fieldB.metadata?.order;
157
+ if (orderA !== void 0 && orderB !== void 0) {
158
+ return orderA - orderB;
159
+ }
160
+ if (orderA !== void 0 && orderB === void 0) {
161
+ return -1;
162
+ }
163
+ if (orderA === void 0 && orderB !== void 0) {
164
+ return 1;
165
+ }
166
+ return 0;
167
+ });
168
+ const fields = sortedEntries.map(([fieldName, field]) => {
169
+ if (field.type === "string") {
170
+ if (field.format === "email") {
171
+ return {
172
+ name: fieldName,
173
+ type: "email"
174
+ };
175
+ }
176
+ if (field.format === "uri") {
177
+ return {
178
+ name: fieldName,
179
+ type: "url"
180
+ };
181
+ }
182
+ if (field.format === "date") {
183
+ return {
184
+ name: fieldName,
185
+ type: "date",
186
+ options: {
187
+ dateFormat: {
188
+ name: "local"
189
+ }
190
+ }
191
+ };
192
+ }
193
+ if (field.format === "date-time") {
194
+ return {
195
+ name: fieldName,
196
+ type: "dateTime",
197
+ options: {
198
+ dateFormat: {
199
+ name: "local"
200
+ },
201
+ timeFormat: {
202
+ name: "24hour"
203
+ },
204
+ timeZone: "client"
205
+ }
206
+ };
207
+ }
208
+ if (field.metadata?.["ui:multiline"]) {
209
+ return {
210
+ name: fieldName,
211
+ type: "multilineText"
212
+ };
213
+ }
214
+ if (field.enum) {
215
+ if (field.metadata?.["ui:widget"] === "checkbox") {
216
+ return {
217
+ name: fieldName,
218
+ type: "multipleSelects",
219
+ options: {
220
+ choices: field.enum.map((value) => ({
221
+ name: value
222
+ }))
223
+ }
224
+ };
225
+ }
226
+ return {
227
+ name: fieldName,
228
+ type: "singleSelect",
229
+ options: {
230
+ choices: field.enum.map((value) => ({
231
+ name: value
232
+ }))
233
+ }
234
+ };
235
+ }
236
+ return {
237
+ name: fieldName,
238
+ type: "singleLineText"
239
+ };
240
+ }
241
+ if (field.type === "boolean") {
242
+ return {
243
+ name: fieldName,
244
+ type: "checkbox",
245
+ options: {
246
+ icon: "check",
247
+ color: "grayBright"
248
+ }
249
+ };
250
+ }
251
+ if (field.type === "number") {
252
+ return {
253
+ name: fieldName,
254
+ type: "number",
255
+ options: {
256
+ precision: 8
257
+ }
258
+ };
259
+ }
260
+ });
261
+ return fields;
262
+ }
263
+ async function createTable({
264
+ name,
265
+ schema,
266
+ baseId,
267
+ accessToken
268
+ }) {
269
+ const fields = buildAirtableTableData(schema.properties);
270
+ const tableCreationData = {
271
+ name,
272
+ description: `Table created by Upstart for ${name}`,
273
+ fields
274
+ };
275
+ try {
276
+ const client = getClient(accessToken);
277
+ const response = await client.callApi(`v0/meta/bases/${baseId}/tables`, "POST", tableCreationData);
278
+ if (!response.success) {
279
+ console.error(
280
+ "Error while creating Airtable table with:",
281
+ JSON.stringify(tableCreationData, null, 2),
282
+ "from schema: ",
283
+ JSON.stringify(schema, null, 2)
284
+ );
285
+ throw new Error(
286
+ `Failed to create Airtable table: ${response.status} - ${JSON.stringify(response.data)}`
287
+ );
288
+ }
289
+ return {
290
+ tableId: response.data.id,
291
+ fields: response.data.fields,
292
+ tableName: response.data.name,
293
+ externalUrl: `https://airtable.com/${baseId}/${response.data.id}`
294
+ };
295
+ } catch (error) {
296
+ if (error instanceof Error) {
297
+ console.error(error.message);
298
+ } else {
299
+ console.error("Unknown error occurred while creating Airtable table", error);
300
+ }
301
+ throw error;
302
+ }
303
+ }
304
+ async function updateTable({
305
+ baseId,
306
+ tableId,
307
+ newName,
308
+ newProperties,
309
+ accessToken
310
+ }) {
311
+ const client = getClient(accessToken);
312
+ if (newProperties) {
313
+ try {
314
+ const fields = buildAirtableTableData(newProperties);
315
+ for (const field of fields) {
316
+ const response = await client.callApi(`v0/meta/bases/${baseId}/tables/${tableId}/fields`, "POST", field);
317
+ if (!response.success) {
318
+ console.error("Error while adding field to Airtable table with:", JSON.stringify(field, null, 2));
319
+ throw new Error(
320
+ `Failed to update Airtable table: ${response.status} - ${JSON.stringify(response.data)}`
321
+ );
322
+ }
323
+ }
324
+ } catch (error) {
325
+ if (error instanceof Error) {
326
+ console.error(error.message);
327
+ } else {
328
+ console.error("Unknown error occurred while updating Airtable table", error);
329
+ }
330
+ throw error;
331
+ }
332
+ }
333
+ try {
334
+ const tableUpdateData = {
335
+ name: newName,
336
+ description: `Table updated by Upstart for ${newName}`
337
+ };
338
+ const response = await client.callApi(`v0/meta/bases/${baseId}/tables/${tableId}`, "PATCH", tableUpdateData);
339
+ if (!response.success) {
340
+ console.error("Error while updating Airtable table with:", JSON.stringify(tableUpdateData, null, 2));
341
+ throw new Error(
342
+ `Failed to update Airtable table: ${response.status} - ${JSON.stringify(response.data)}`
343
+ );
344
+ }
345
+ return {
346
+ tableId: response.data.id,
347
+ fields: response.data.fields,
348
+ tableName: response.data.name,
349
+ externalUrl: `https://airtable.com/${baseId}/${response.data.id}`
350
+ };
351
+ } catch (error) {
352
+ if (error instanceof Error) {
353
+ console.error(error.message);
354
+ } else {
355
+ console.error("Unknown error occurred while creating Airtable table", error);
356
+ }
357
+ throw error;
358
+ }
359
+ }
360
+ async function fetchAirtableBases(accessToken) {
361
+ try {
362
+ const client = getClient(accessToken);
363
+ const response = await client.callApi("v0/meta/bases");
364
+ if (response.success) {
365
+ return response.data.bases;
366
+ } else {
367
+ throw new Error(`Failed to fetch bases: ${response.status}`);
368
+ }
369
+ } catch (error) {
370
+ console.error("Error fetching Airtable bases:", error);
371
+ return [];
372
+ }
373
+ }
374
+ export {
375
+ createTable,
376
+ fetchAirtableBases,
377
+ saveRecord,
378
+ updateTable
379
+ };
4
380
  //# sourceMappingURL=handler.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/shared/datarecords/external/airtable/handler.ts"],"sourcesContent":["import type { TObject, TProperties } from \"@sinclair/typebox\";\nimport type { AirtableBases, AirtableFieldType, AirtableOptions } from \"./types\";\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction getClient(token: string) {\n if (!token) {\n throw new Error(\"Missing Airtable API token\");\n }\n\n return {\n async callApi<R, P extends Record<string, unknown> = Record<string, unknown>>(\n path: string,\n method: \"GET\" | \"POST\" | \"DELETE\" | \"PUT\" | \"PATCH\" = \"GET\",\n body: P | null = null,\n ) {\n const url = `https://api.airtable.com/${path}`;\n const maxRetries = 5;\n const retryDelay = 30000; // 30 seconds\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const res = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n // if 429 is rate limit exceeded\n if (res.status === 429 && attempt < maxRetries) {\n console.warn(\n `Airtable rate limit hit (429) on attempt ${attempt}/${maxRetries}. Waiting ${retryDelay / 1000}s before retry...`,\n );\n await sleep(retryDelay);\n continue; // Retry\n }\n\n const data = await res.json();\n\n // for any other response (success or definitive error)\n return {\n status: res.status,\n success: res.ok,\n data: data as R,\n };\n } catch (error) {\n // In case of network error, we also retry except on the last attempt\n if (attempt < maxRetries) {\n console.warn(\n `Network error on attempt ${attempt}/${maxRetries}. Waiting ${retryDelay / 1000}s before retry...`,\n error,\n );\n await sleep(retryDelay);\n continue;\n }\n // On the last attempt, we rethrow the error\n console.error(`Error on attempt ${attempt}/${maxRetries}:`, error);\n throw error;\n }\n }\n\n // If we reach here, it means we exhausted all attempts with 429\n throw new Error(`Airtable API rate limit exceeded after ${maxRetries} attempts`);\n },\n };\n}\n\n/**\n * Convert a FormData value based on Airtable field type\n */\nfunction convertValueForAirtableField(value: string, fieldType: AirtableFieldType): unknown {\n switch (fieldType) {\n case \"checkbox\":\n return value === \"true\" || value === \"1\" || value.toLowerCase() === \"on\";\n\n case \"number\": {\n const numValue = Number(value);\n return Number.isNaN(numValue) ? value : numValue;\n }\n\n case \"date\":\n case \"dateTime\":\n // Airtable expects ISO format strings\n return value;\n\n case \"email\":\n case \"url\":\n case \"singleLineText\":\n case \"multilineText\":\n return value;\n\n case \"singleSelect\":\n return value;\n\n case \"multipleSelects\": {\n // Handle comma-separated values or JSON array strings\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n try {\n return JSON.parse(value);\n } catch {\n return [value];\n }\n }\n if (value.includes(\",\")) {\n return value\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n }\n return [value];\n }\n\n default:\n console.warn(`Unknown Airtable field type: ${fieldType}, treating as text`);\n return value;\n }\n}\n\n/**\n * Fallback conversion based on value patterns (when field type is unknown)\n */\nfunction convertValueByPattern(value: string): unknown {\n // Handle boolean-like values\n if (value === \"true\" || value === \"false\") {\n return value === \"true\";\n }\n\n // Handle number-like values\n if (/^\\d+\\.?\\d*$/.test(value)) {\n const numValue = Number(value);\n if (!Number.isNaN(numValue)) {\n return numValue;\n }\n }\n\n // Handle date formats\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(value)) {\n return value;\n }\n\n // Handle comma-separated values (potential multiple select)\n if (value.includes(\",\")) {\n const values = value\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n if (values.length > 1) {\n return values;\n }\n }\n\n // Default to string\n return value;\n}\n\nexport async function saveRecord({\n formData,\n options,\n properties,\n accessToken,\n}: {\n formData: FormData;\n options: AirtableOptions;\n properties: TProperties;\n accessToken: string;\n}): Promise<{ id: string } | null> {\n try {\n const client = getClient(accessToken);\n const records: Record<string, unknown> = {};\n\n for (const [key, value] of formData.entries()) {\n // Skip empty values\n if (value === null || value === undefined || value === \"\") continue;\n\n // Skip Files for now as they need special handling\n if (value instanceof File) {\n console.warn(`File upload not yet supported for field: ${key}`);\n continue;\n }\n\n // Find the field definition in options.fields\n const fieldDef = options.fields?.find((field) => field.name === key);\n\n if (fieldDef) {\n // Use field type information for precise conversion\n records[key] = convertValueForAirtableField(value, fieldDef.type as AirtableFieldType);\n } else {\n // Fallback to pattern-based conversion if field definition not found\n records[key] = convertValueByPattern(value);\n }\n }\n const response = await client.callApi<{\n records: Array<{ id: string; fields: Record<string, unknown> }>;\n }>(`v0/${options.baseId}/${options.tableId}`, \"POST\", {\n records: [\n {\n fields: records,\n },\n ],\n });\n\n if (!response.success) {\n throw new Error(\n `Failed to push data to Airtable: ${response.status} - ${JSON.stringify(response.data)}`,\n );\n }\n\n return response.data.records[0] ? { id: response.data.records[0].id } : null;\n } catch (error) {\n console.error(\"Error pushing data to Airtable:\", error);\n }\n\n return null;\n}\n\n/**\n * Build Airtable table creation data from schema\n */\nfunction buildAirtableTableData(properties: TProperties) {\n // Sort fields by metadata.order (ascending), then fields without order\n const sortedEntries = Object.entries(properties).sort(([, fieldA], [, fieldB]) => {\n const orderA = fieldA.metadata?.order;\n const orderB = fieldB.metadata?.order;\n\n // If both have order, sort by order value\n if (orderA !== undefined && orderB !== undefined) {\n return orderA - orderB;\n }\n\n // Fields with order come first\n if (orderA !== undefined && orderB === undefined) {\n return -1;\n }\n\n if (orderA === undefined && orderB !== undefined) {\n return 1;\n }\n\n // Both without order, maintain original order\n return 0;\n });\n\n const fields = sortedEntries.map(([fieldName, field]) => {\n // Seulement 3 cas : string, number, boolean\n if (field.type === \"string\") {\n if (field.format === \"email\") {\n return {\n name: fieldName,\n type: \"email\",\n };\n }\n if (field.format === \"uri\") {\n return {\n name: fieldName,\n type: \"url\",\n };\n }\n if (field.format === \"date\") {\n return {\n name: fieldName,\n type: \"date\",\n options: {\n dateFormat: {\n name: \"local\",\n },\n },\n };\n }\n if (field.format === \"date-time\") {\n return {\n name: fieldName,\n type: \"dateTime\",\n options: {\n dateFormat: {\n name: \"local\",\n },\n timeFormat: {\n name: \"24hour\",\n },\n timeZone: \"client\",\n },\n };\n }\n if (field.metadata?.[\"ui:multiline\"]) {\n return {\n name: fieldName,\n type: \"multilineText\",\n };\n }\n if (field.enum) {\n if (field.metadata?.[\"ui:widget\"] === \"checkbox\") {\n return {\n name: fieldName,\n type: \"multipleSelects\",\n options: {\n choices: (field.enum as Array<string>).map((value) => ({\n name: value,\n })),\n },\n };\n }\n return {\n name: fieldName,\n type: \"singleSelect\",\n options: {\n choices: (field.enum as Array<string>).map((value) => ({\n name: value,\n })),\n },\n };\n }\n return {\n name: fieldName,\n type: \"singleLineText\",\n };\n }\n if (field.type === \"boolean\") {\n return {\n name: fieldName,\n type: \"checkbox\",\n options: {\n icon: \"check\",\n color: \"grayBright\",\n },\n };\n }\n if (field.type === \"number\") {\n return {\n name: fieldName,\n type: \"number\",\n options: {\n precision: 8,\n },\n };\n }\n });\n\n return fields;\n}\n\nexport async function createTable({\n name,\n schema,\n baseId,\n accessToken,\n}: {\n name: string;\n schema: TObject;\n baseId: string;\n accessToken: string;\n}): Promise<AirtableOptions | null> {\n const fields = buildAirtableTableData(schema.properties);\n const tableCreationData = {\n name,\n description: `Table created by Upstart for ${name}`,\n fields: fields,\n };\n // console.dir(data);\n try {\n const client = getClient(accessToken);\n const response = await client.callApi<{\n id: string;\n name: string;\n description: string;\n primaryFieldId: string;\n fields: Array<{\n id: string;\n name: string;\n type: string;\n }>;\n }>(`v0/meta/bases/${baseId}/tables`, \"POST\", tableCreationData);\n\n if (!response.success) {\n console.error(\n \"Error while creating Airtable table with:\",\n JSON.stringify(tableCreationData, null, 2),\n \"from schema: \",\n JSON.stringify(schema, null, 2),\n );\n throw new Error(\n `Failed to create Airtable table: ${response.status} - ${JSON.stringify(response.data)}`,\n );\n }\n\n return {\n tableId: response.data.id,\n fields: response.data.fields,\n tableName: response.data.name,\n externalUrl: `https://airtable.com/${baseId}/${response.data.id}`,\n } as AirtableOptions;\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(\"Unknown error occurred while creating Airtable table\", error);\n }\n throw error;\n }\n}\n\nexport async function updateTable({\n baseId,\n tableId,\n newName,\n newProperties,\n accessToken,\n}: {\n baseId: string;\n tableId: string;\n newName: string;\n newProperties?: TProperties;\n accessToken: string;\n}): Promise<AirtableOptions | null> {\n const client = getClient(accessToken);\n if (newProperties) {\n try {\n const fields = buildAirtableTableData(newProperties);\n for (const field of fields) {\n const response = await client.callApi<{\n id: string;\n name: string;\n description: string;\n type: string;\n }>(`v0/meta/bases/${baseId}/tables/${tableId}/fields`, \"POST\", field);\n if (!response.success) {\n console.error(\"Error while adding field to Airtable table with:\", JSON.stringify(field, null, 2));\n throw new Error(\n `Failed to update Airtable table: ${response.status} - ${JSON.stringify(response.data)}`,\n );\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(\"Unknown error occurred while updating Airtable table\", error);\n }\n throw error;\n }\n }\n\n try {\n const tableUpdateData = {\n name: newName,\n description: `Table updated by Upstart for ${newName}`,\n };\n const response = await client.callApi<{\n id: string;\n name: string;\n description: string;\n primaryFieldId: string;\n fields: Array<{\n id: string;\n name: string;\n type: string;\n }>;\n }>(`v0/meta/bases/${baseId}/tables/${tableId}`, \"PATCH\", tableUpdateData);\n\n if (!response.success) {\n console.error(\"Error while updating Airtable table with:\", JSON.stringify(tableUpdateData, null, 2));\n throw new Error(\n `Failed to update Airtable table: ${response.status} - ${JSON.stringify(response.data)}`,\n );\n }\n\n return {\n tableId: response.data.id,\n fields: response.data.fields,\n tableName: response.data.name,\n externalUrl: `https://airtable.com/${baseId}/${response.data.id}`,\n } as AirtableOptions;\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(\"Unknown error occurred while creating Airtable table\", error);\n }\n throw error;\n }\n}\n\nexport async function fetchAirtableBases(accessToken: string): Promise<AirtableBases> {\n try {\n const client = getClient(accessToken);\n const response = await client.callApi<{\n bases: AirtableBases;\n }>(\"v0/meta/bases\");\n\n if (response.success) {\n return response.data.bases;\n } else {\n throw new Error(`Failed to fetch bases: ${response.status}`);\n }\n } catch (error) {\n console.error(\"Error fetching Airtable bases:\", error);\n return [];\n }\n}\n"],"mappings":"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","names":["sleep","ms","resolve","getClient","token","path","method","body","url","maxRetries","retryDelay","attempt","res","data","error","convertValueForAirtableField","value","fieldType","numValue","v","convertValueByPattern","values","saveRecord","formData","options","properties","accessToken","client","records","key","fieldDef","field","response","buildAirtableTableData","fieldA","fieldB","orderA","orderB","fieldName","createTable","name","schema","baseId","fields","tableCreationData","updateTable","tableId","newName","newProperties","tableUpdateData","fetchAirtableBases"]}
1
+ {"version":3,"sources":["../../../../../src/shared/datarecords/external/airtable/handler.ts"],"sourcesContent":["import type { TObject, TProperties } from \"@sinclair/typebox\";\nimport type { AirtableBases, AirtableFieldType, AirtableOptions } from \"./types\";\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction getClient(token: string) {\n if (!token) {\n throw new Error(\"Missing Airtable API token\");\n }\n\n return {\n async callApi<R, P extends Record<string, unknown> = Record<string, unknown>>(\n path: string,\n method: \"GET\" | \"POST\" | \"DELETE\" | \"PUT\" | \"PATCH\" = \"GET\",\n body: P | null = null,\n ) {\n const url = `https://api.airtable.com/${path}`;\n const maxRetries = 5;\n const retryDelay = 30000; // 30 seconds\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const res = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n // if 429 is rate limit exceeded\n if (res.status === 429 && attempt < maxRetries) {\n console.warn(\n `Airtable rate limit hit (429) on attempt ${attempt}/${maxRetries}. Waiting ${retryDelay / 1000}s before retry...`,\n );\n await sleep(retryDelay);\n continue; // Retry\n }\n\n const data = await res.json();\n\n // for any other response (success or definitive error)\n return {\n status: res.status,\n success: res.ok,\n data: data as R,\n };\n } catch (error) {\n // In case of network error, we also retry except on the last attempt\n if (attempt < maxRetries) {\n console.warn(\n `Network error on attempt ${attempt}/${maxRetries}. Waiting ${retryDelay / 1000}s before retry...`,\n error,\n );\n await sleep(retryDelay);\n continue;\n }\n // On the last attempt, we rethrow the error\n console.error(`Error on attempt ${attempt}/${maxRetries}:`, error);\n throw error;\n }\n }\n\n // If we reach here, it means we exhausted all attempts with 429\n throw new Error(`Airtable API rate limit exceeded after ${maxRetries} attempts`);\n },\n };\n}\n\n/**\n * Convert a FormData value based on Airtable field type\n */\nfunction convertValueForAirtableField(value: string, fieldType: AirtableFieldType): unknown {\n switch (fieldType) {\n case \"checkbox\":\n return value === \"true\" || value === \"1\" || value.toLowerCase() === \"on\";\n\n case \"number\": {\n const numValue = Number(value);\n return Number.isNaN(numValue) ? value : numValue;\n }\n\n case \"date\":\n case \"dateTime\":\n // Airtable expects ISO format strings\n return value;\n\n case \"email\":\n case \"url\":\n case \"singleLineText\":\n case \"multilineText\":\n return value;\n\n case \"singleSelect\":\n return value;\n\n case \"multipleSelects\": {\n // Handle comma-separated values or JSON array strings\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n try {\n return JSON.parse(value);\n } catch {\n return [value];\n }\n }\n if (value.includes(\",\")) {\n return value\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n }\n return [value];\n }\n\n default:\n console.warn(`Unknown Airtable field type: ${fieldType}, treating as text`);\n return value;\n }\n}\n\n/**\n * Fallback conversion based on value patterns (when field type is unknown)\n */\nfunction convertValueByPattern(value: string): unknown {\n // Handle boolean-like values\n if (value === \"true\" || value === \"false\") {\n return value === \"true\";\n }\n\n // Handle number-like values\n if (/^\\d+\\.?\\d*$/.test(value)) {\n const numValue = Number(value);\n if (!Number.isNaN(numValue)) {\n return numValue;\n }\n }\n\n // Handle date formats\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(value)) {\n return value;\n }\n\n // Handle comma-separated values (potential multiple select)\n if (value.includes(\",\")) {\n const values = value\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n if (values.length > 1) {\n return values;\n }\n }\n\n // Default to string\n return value;\n}\n\nexport async function saveRecord({\n formData,\n options,\n properties,\n accessToken,\n}: {\n formData: FormData;\n options: AirtableOptions;\n properties: TProperties;\n accessToken: string;\n}): Promise<{ id: string } | null> {\n try {\n const client = getClient(accessToken);\n const records: Record<string, unknown> = {};\n\n for (const [key, value] of formData.entries()) {\n // Skip empty values\n if (value === null || value === undefined || value === \"\") continue;\n\n // Skip Files for now as they need special handling\n if (value instanceof File) {\n console.warn(`File upload not yet supported for field: ${key}`);\n continue;\n }\n\n // Find the field definition in options.fields\n const fieldDef = options.fields?.find((field) => field.name === key);\n\n if (fieldDef) {\n // Use field type information for precise conversion\n records[key] = convertValueForAirtableField(value, fieldDef.type as AirtableFieldType);\n } else {\n // Fallback to pattern-based conversion if field definition not found\n records[key] = convertValueByPattern(value);\n }\n }\n const response = await client.callApi<{\n records: Array<{ id: string; fields: Record<string, unknown> }>;\n }>(`v0/${options.baseId}/${options.tableId}`, \"POST\", {\n records: [\n {\n fields: records,\n },\n ],\n });\n\n if (!response.success) {\n throw new Error(\n `Failed to push data to Airtable: ${response.status} - ${JSON.stringify(response.data)}`,\n );\n }\n\n return response.data.records[0] ? { id: response.data.records[0].id } : null;\n } catch (error) {\n console.error(\"Error pushing data to Airtable:\", error);\n }\n\n return null;\n}\n\n/**\n * Build Airtable table creation data from schema\n */\nfunction buildAirtableTableData(properties: TProperties) {\n // Sort fields by metadata.order (ascending), then fields without order\n const sortedEntries = Object.entries(properties).sort(([, fieldA], [, fieldB]) => {\n const orderA = fieldA.metadata?.order;\n const orderB = fieldB.metadata?.order;\n\n // If both have order, sort by order value\n if (orderA !== undefined && orderB !== undefined) {\n return orderA - orderB;\n }\n\n // Fields with order come first\n if (orderA !== undefined && orderB === undefined) {\n return -1;\n }\n\n if (orderA === undefined && orderB !== undefined) {\n return 1;\n }\n\n // Both without order, maintain original order\n return 0;\n });\n\n const fields = sortedEntries.map(([fieldName, field]) => {\n // Seulement 3 cas : string, number, boolean\n if (field.type === \"string\") {\n if (field.format === \"email\") {\n return {\n name: fieldName,\n type: \"email\",\n };\n }\n if (field.format === \"uri\") {\n return {\n name: fieldName,\n type: \"url\",\n };\n }\n if (field.format === \"date\") {\n return {\n name: fieldName,\n type: \"date\",\n options: {\n dateFormat: {\n name: \"local\",\n },\n },\n };\n }\n if (field.format === \"date-time\") {\n return {\n name: fieldName,\n type: \"dateTime\",\n options: {\n dateFormat: {\n name: \"local\",\n },\n timeFormat: {\n name: \"24hour\",\n },\n timeZone: \"client\",\n },\n };\n }\n if (field.metadata?.[\"ui:multiline\"]) {\n return {\n name: fieldName,\n type: \"multilineText\",\n };\n }\n if (field.enum) {\n if (field.metadata?.[\"ui:widget\"] === \"checkbox\") {\n return {\n name: fieldName,\n type: \"multipleSelects\",\n options: {\n choices: (field.enum as Array<string>).map((value) => ({\n name: value,\n })),\n },\n };\n }\n return {\n name: fieldName,\n type: \"singleSelect\",\n options: {\n choices: (field.enum as Array<string>).map((value) => ({\n name: value,\n })),\n },\n };\n }\n return {\n name: fieldName,\n type: \"singleLineText\",\n };\n }\n if (field.type === \"boolean\") {\n return {\n name: fieldName,\n type: \"checkbox\",\n options: {\n icon: \"check\",\n color: \"grayBright\",\n },\n };\n }\n if (field.type === \"number\") {\n return {\n name: fieldName,\n type: \"number\",\n options: {\n precision: 8,\n },\n };\n }\n });\n\n return fields;\n}\n\nexport async function createTable({\n name,\n schema,\n baseId,\n accessToken,\n}: {\n name: string;\n schema: TObject;\n baseId: string;\n accessToken: string;\n}): Promise<AirtableOptions | null> {\n const fields = buildAirtableTableData(schema.properties);\n const tableCreationData = {\n name,\n description: `Table created by Upstart for ${name}`,\n fields: fields,\n };\n // console.dir(data);\n try {\n const client = getClient(accessToken);\n const response = await client.callApi<{\n id: string;\n name: string;\n description: string;\n primaryFieldId: string;\n fields: Array<{\n id: string;\n name: string;\n type: string;\n }>;\n }>(`v0/meta/bases/${baseId}/tables`, \"POST\", tableCreationData);\n\n if (!response.success) {\n console.error(\n \"Error while creating Airtable table with:\",\n JSON.stringify(tableCreationData, null, 2),\n \"from schema: \",\n JSON.stringify(schema, null, 2),\n );\n throw new Error(\n `Failed to create Airtable table: ${response.status} - ${JSON.stringify(response.data)}`,\n );\n }\n\n return {\n tableId: response.data.id,\n fields: response.data.fields,\n tableName: response.data.name,\n externalUrl: `https://airtable.com/${baseId}/${response.data.id}`,\n } as AirtableOptions;\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(\"Unknown error occurred while creating Airtable table\", error);\n }\n throw error;\n }\n}\n\nexport async function updateTable({\n baseId,\n tableId,\n newName,\n newProperties,\n accessToken,\n}: {\n baseId: string;\n tableId: string;\n newName: string;\n newProperties?: TProperties;\n accessToken: string;\n}): Promise<AirtableOptions | null> {\n const client = getClient(accessToken);\n if (newProperties) {\n try {\n const fields = buildAirtableTableData(newProperties);\n for (const field of fields) {\n const response = await client.callApi<{\n id: string;\n name: string;\n description: string;\n type: string;\n }>(`v0/meta/bases/${baseId}/tables/${tableId}/fields`, \"POST\", field);\n if (!response.success) {\n console.error(\"Error while adding field to Airtable table with:\", JSON.stringify(field, null, 2));\n throw new Error(\n `Failed to update Airtable table: ${response.status} - ${JSON.stringify(response.data)}`,\n );\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(\"Unknown error occurred while updating Airtable table\", error);\n }\n throw error;\n }\n }\n\n try {\n const tableUpdateData = {\n name: newName,\n description: `Table updated by Upstart for ${newName}`,\n };\n const response = await client.callApi<{\n id: string;\n name: string;\n description: string;\n primaryFieldId: string;\n fields: Array<{\n id: string;\n name: string;\n type: string;\n }>;\n }>(`v0/meta/bases/${baseId}/tables/${tableId}`, \"PATCH\", tableUpdateData);\n\n if (!response.success) {\n console.error(\"Error while updating Airtable table with:\", JSON.stringify(tableUpdateData, null, 2));\n throw new Error(\n `Failed to update Airtable table: ${response.status} - ${JSON.stringify(response.data)}`,\n );\n }\n\n return {\n tableId: response.data.id,\n fields: response.data.fields,\n tableName: response.data.name,\n externalUrl: `https://airtable.com/${baseId}/${response.data.id}`,\n } as AirtableOptions;\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(\"Unknown error occurred while creating Airtable table\", error);\n }\n throw error;\n }\n}\n\nexport async function fetchAirtableBases(accessToken: string): Promise<AirtableBases> {\n try {\n const client = getClient(accessToken);\n const response = await client.callApi<{\n bases: AirtableBases;\n }>(\"v0/meta/bases\");\n\n if (response.success) {\n return response.data.bases;\n } else {\n throw new Error(`Failed to fetch bases: ${response.status}`);\n }\n } catch (error) {\n console.error(\"Error fetching Airtable bases:\", error);\n return [];\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,18 @@
1
1
  /*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
2
2
 
3
- import{Type as e}from"@sinclair/typebox";var r=e.Object({scope:e.String(),token_type:e.String(),expires_in:e.Number(),access_token:e.String(),refresh_token:e.String(),refresh_expires_in:e.Number()});export{r as airtableOAuthTokenSchema};
3
+ import "../../../../chunk-ZGQ3AQBG.js";
4
+
5
+ // src/shared/datarecords/external/airtable/oauth/config.ts
6
+ import { Type } from "@sinclair/typebox";
7
+ var airtableOAuthTokenSchema = Type.Object({
8
+ scope: Type.String(),
9
+ token_type: Type.String(),
10
+ expires_in: Type.Number(),
11
+ access_token: Type.String(),
12
+ refresh_token: Type.String(),
13
+ refresh_expires_in: Type.Number()
14
+ });
15
+ export {
16
+ airtableOAuthTokenSchema
17
+ };
4
18
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/shared/datarecords/external/airtable/oauth/config.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const airtableOAuthTokenSchema = Type.Object({\n scope: Type.String(),\n token_type: Type.String(),\n expires_in: Type.Number(),\n access_token: Type.String(),\n refresh_token: Type.String(),\n refresh_expires_in: Type.Number(),\n});\nexport type AirtableOAuthToken = Static<typeof airtableOAuthTokenSchema>;\n"],"mappings":";;AAAA,OAAS,QAAAA,MAAyB,oBAE3B,IAAMC,EAA2BD,EAAK,OAAO,CAClD,MAAOA,EAAK,OAAO,EACnB,WAAYA,EAAK,OAAO,EACxB,WAAYA,EAAK,OAAO,EACxB,aAAcA,EAAK,OAAO,EAC1B,cAAeA,EAAK,OAAO,EAC3B,mBAAoBA,EAAK,OAAO,CAClC,CAAC","names":["Type","airtableOAuthTokenSchema"]}
1
+ {"version":3,"sources":["../../../../../../src/shared/datarecords/external/airtable/oauth/config.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const airtableOAuthTokenSchema = Type.Object({\n scope: Type.String(),\n token_type: Type.String(),\n expires_in: Type.Number(),\n access_token: Type.String(),\n refresh_token: Type.String(),\n refresh_expires_in: Type.Number(),\n});\nexport type AirtableOAuthToken = Static<typeof airtableOAuthTokenSchema>;\n"],"mappings":";;;;;AAAA,SAAS,YAAyB;AAE3B,IAAM,2BAA2B,KAAK,OAAO;AAAA,EAClD,OAAO,KAAK,OAAO;AAAA,EACnB,YAAY,KAAK,OAAO;AAAA,EACxB,YAAY,KAAK,OAAO;AAAA,EACxB,cAAc,KAAK,OAAO;AAAA,EAC1B,eAAe,KAAK,OAAO;AAAA,EAC3B,oBAAoB,KAAK,OAAO;AAClC,CAAC;","names":[]}
@@ -1,4 +1,14 @@
1
1
  /*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
2
2
 
3
- import{a,b,c}from"../../../chunk-GLS7HPIZ.js";export{c as AirtableFieldTypes,a as airtableFields,b as airtableOptions};
3
+ import {
4
+ AirtableFieldTypes,
5
+ airtableFields,
6
+ airtableOptions
7
+ } from "../../../chunk-CSF2WQX2.js";
8
+ import "../../../chunk-ZGQ3AQBG.js";
9
+ export {
10
+ AirtableFieldTypes,
11
+ airtableFields,
12
+ airtableOptions
13
+ };
4
14
  //# sourceMappingURL=types.js.map
@@ -1,4 +1,17 @@
1
1
  /*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
2
2
 
3
- async function r(o,e){return(await fetch(e.url,{method:"POST",body:JSON.stringify(o),headers:e.headers})).ok}export{r as default};
3
+ import "../../../chunk-ZGQ3AQBG.js";
4
+
5
+ // src/shared/datarecords/external/generic-webhook/handler.ts
6
+ async function genericWebhookHandler(formData, options) {
7
+ const result = await fetch(options.url, {
8
+ method: "POST",
9
+ body: JSON.stringify(formData),
10
+ headers: options.headers
11
+ });
12
+ return result.ok;
13
+ }
14
+ export {
15
+ genericWebhookHandler as default
16
+ };
4
17
  //# sourceMappingURL=handler.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/shared/datarecords/external/generic-webhook/handler.ts"],"sourcesContent":["import type { GenericWebhookOptions } from \"./options\";\n\nexport default async function genericWebhookHandler(formData: FormData, options: GenericWebhookOptions) {\n const result = await fetch(options.url, {\n method: \"POST\",\n body: JSON.stringify(formData),\n headers: options.headers,\n });\n return result.ok;\n}\n"],"mappings":";;AAEA,eAAOA,EAA6CC,EAAoBC,EAAgC,CAMtG,OALe,MAAM,MAAMA,EAAQ,IAAK,CACtC,OAAQ,OACR,KAAM,KAAK,UAAUD,CAAQ,EAC7B,QAASC,EAAQ,OACnB,CAAC,GACa,EAChB","names":["genericWebhookHandler","formData","options"]}
1
+ {"version":3,"sources":["../../../../../src/shared/datarecords/external/generic-webhook/handler.ts"],"sourcesContent":["import type { GenericWebhookOptions } from \"./options\";\n\nexport default async function genericWebhookHandler(formData: FormData, options: GenericWebhookOptions) {\n const result = await fetch(options.url, {\n method: \"POST\",\n body: JSON.stringify(formData),\n headers: options.headers,\n });\n return result.ok;\n}\n"],"mappings":";;;;;AAEA,eAAO,sBAA6C,UAAoB,SAAgC;AACtG,QAAM,SAAS,MAAM,MAAM,QAAQ,KAAK;AAAA,IACtC,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAC7B,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,SAAO,OAAO;AAChB;","names":[]}
@@ -1,4 +1,19 @@
1
1
  /*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
2
2
 
3
- import{Type as e}from"@sinclair/typebox";var o=e.Object({url:e.String({format:"uri",title:"Webhook URL"}),headers:e.Optional(e.Record(e.String(),e.String(),{title:"Headers",description:"Additional headers to include in the webhook request"}))});export{o as genericWebhookOptions};
3
+ import "../../../chunk-ZGQ3AQBG.js";
4
+
5
+ // src/shared/datarecords/external/generic-webhook/options.ts
6
+ import { Type } from "@sinclair/typebox";
7
+ var genericWebhookOptions = Type.Object({
8
+ url: Type.String({ format: "uri", title: "Webhook URL" }),
9
+ headers: Type.Optional(
10
+ Type.Record(Type.String(), Type.String(), {
11
+ title: "Headers",
12
+ description: "Additional headers to include in the webhook request"
13
+ })
14
+ )
15
+ });
16
+ export {
17
+ genericWebhookOptions
18
+ };
4
19
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/shared/datarecords/external/generic-webhook/options.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const genericWebhookOptions = Type.Object({\n url: Type.String({ format: \"uri\", title: \"Webhook URL\" }),\n headers: Type.Optional(\n Type.Record(Type.String(), Type.String(), {\n title: \"Headers\",\n description: \"Additional headers to include in the webhook request\",\n }),\n ),\n});\n\nexport type GenericWebhookOptions = Static<typeof genericWebhookOptions>;\n"],"mappings":";;AAAA,OAAS,QAAAA,MAAyB,oBAE3B,IAAMC,EAAwBD,EAAK,OAAO,CAC/C,IAAKA,EAAK,OAAO,CAAE,OAAQ,MAAO,MAAO,aAAc,CAAC,EACxD,QAASA,EAAK,SACZA,EAAK,OAAOA,EAAK,OAAO,EAAGA,EAAK,OAAO,EAAG,CACxC,MAAO,UACP,YAAa,sDACf,CAAC,CACH,CACF,CAAC","names":["Type","genericWebhookOptions"]}
1
+ {"version":3,"sources":["../../../../../src/shared/datarecords/external/generic-webhook/options.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const genericWebhookOptions = Type.Object({\n url: Type.String({ format: \"uri\", title: \"Webhook URL\" }),\n headers: Type.Optional(\n Type.Record(Type.String(), Type.String(), {\n title: \"Headers\",\n description: \"Additional headers to include in the webhook request\",\n }),\n ),\n});\n\nexport type GenericWebhookOptions = Static<typeof genericWebhookOptions>;\n"],"mappings":";;;;;AAAA,SAAS,YAAyB;AAE3B,IAAM,wBAAwB,KAAK,OAAO;AAAA,EAC/C,KAAK,KAAK,OAAO,EAAE,QAAQ,OAAO,OAAO,cAAc,CAAC;AAAA,EACxD,SAAS,KAAK;AAAA,IACZ,KAAK,OAAO,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG;AAAA,MACxC,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
@@ -1,4 +1,38 @@
1
1
  /*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
2
2
 
3
- import{Type as e}from"@sinclair/typebox";var o=e.Object({access_token:e.String(),token_type:e.String(),expires_in:e.Number(),refresh_token:e.Optional(e.String()),scope:e.String(),id_token:e.Optional(e.String())}),n=e.Object({iss:e.String(),sub:e.String(),aud:e.String(),iat:e.Number(),exp:e.Number(),email:e.Optional(e.String()),email_verified:e.Optional(e.Boolean()),name:e.Optional(e.String()),picture:e.Optional(e.String()),given_name:e.Optional(e.String()),family_name:e.Optional(e.String()),locale:e.Optional(e.String())});
3
+
4
+ // src/shared/datarecords/external/google/oauth/config.ts
5
+ import { Type } from "@sinclair/typebox";
6
+ var googleOAuthTokenSchema = Type.Object({
7
+ access_token: Type.String(),
8
+ token_type: Type.String(),
9
+ // Usually "Bearer"
10
+ expires_in: Type.Number(),
11
+ // Seconds until token expires, typically 3600 (1 hour)
12
+ refresh_token: Type.Optional(Type.String()),
13
+ // Only present in first OAuth exchange
14
+ scope: Type.String(),
15
+ // Space-separated list of granted scopes
16
+ id_token: Type.Optional(Type.String())
17
+ // JWT token containing user info, if requested
18
+ });
19
+ var googleIdTokenSchema = Type.Object({
20
+ iss: Type.String(),
21
+ // Issuer (usually 'https://accounts.google.com')
22
+ sub: Type.String(),
23
+ // Unique Google ID for the user
24
+ aud: Type.String(),
25
+ // Your client ID
26
+ iat: Type.Number(),
27
+ // Issued at (timestamp)
28
+ exp: Type.Number(),
29
+ // Expiration time (timestamp)
30
+ email: Type.Optional(Type.String()),
31
+ email_verified: Type.Optional(Type.Boolean()),
32
+ name: Type.Optional(Type.String()),
33
+ picture: Type.Optional(Type.String()),
34
+ given_name: Type.Optional(Type.String()),
35
+ family_name: Type.Optional(Type.String()),
36
+ locale: Type.Optional(Type.String())
37
+ });
4
38
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/shared/datarecords/external/google/oauth/config.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nconst googleOAuthTokenSchema = Type.Object({\n access_token: Type.String(),\n token_type: Type.String(), // Usually \"Bearer\"\n expires_in: Type.Number(), // Seconds until token expires, typically 3600 (1 hour)\n refresh_token: Type.Optional(Type.String()), // Only present in first OAuth exchange\n scope: Type.String(), // Space-separated list of granted scopes\n id_token: Type.Optional(Type.String()), // JWT token containing user info, if requested\n});\n\nexport type GoogleOAuthToken = Static<typeof googleOAuthTokenSchema>;\n\n// You might also want to define the decoded id_token structure:\nconst googleIdTokenSchema = Type.Object({\n iss: Type.String(), // Issuer (usually 'https://accounts.google.com')\n sub: Type.String(), // Unique Google ID for the user\n aud: Type.String(), // Your client ID\n iat: Type.Number(), // Issued at (timestamp)\n exp: Type.Number(), // Expiration time (timestamp)\n email: Type.Optional(Type.String()),\n email_verified: Type.Optional(Type.Boolean()),\n name: Type.Optional(Type.String()),\n picture: Type.Optional(Type.String()),\n given_name: Type.Optional(Type.String()),\n family_name: Type.Optional(Type.String()),\n locale: Type.Optional(Type.String()),\n});\n\nexport type GoogleIdToken = Static<typeof googleIdTokenSchema>;\n"],"mappings":";;AAAA,OAAS,QAAAA,MAAyB,oBAElC,IAAMC,EAAyBD,EAAK,OAAO,CACzC,aAAcA,EAAK,OAAO,EAC1B,WAAYA,EAAK,OAAO,EACxB,WAAYA,EAAK,OAAO,EACxB,cAAeA,EAAK,SAASA,EAAK,OAAO,CAAC,EAC1C,MAAOA,EAAK,OAAO,EACnB,SAAUA,EAAK,SAASA,EAAK,OAAO,CAAC,CACvC,CAAC,EAKKE,EAAsBF,EAAK,OAAO,CACtC,IAAKA,EAAK,OAAO,EACjB,IAAKA,EAAK,OAAO,EACjB,IAAKA,EAAK,OAAO,EACjB,IAAKA,EAAK,OAAO,EACjB,IAAKA,EAAK,OAAO,EACjB,MAAOA,EAAK,SAASA,EAAK,OAAO,CAAC,EAClC,eAAgBA,EAAK,SAASA,EAAK,QAAQ,CAAC,EAC5C,KAAMA,EAAK,SAASA,EAAK,OAAO,CAAC,EACjC,QAASA,EAAK,SAASA,EAAK,OAAO,CAAC,EACpC,WAAYA,EAAK,SAASA,EAAK,OAAO,CAAC,EACvC,YAAaA,EAAK,SAASA,EAAK,OAAO,CAAC,EACxC,OAAQA,EAAK,SAASA,EAAK,OAAO,CAAC,CACrC,CAAC","names":["Type","googleOAuthTokenSchema","googleIdTokenSchema"]}
1
+ {"version":3,"sources":["../../../../../../src/shared/datarecords/external/google/oauth/config.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nconst googleOAuthTokenSchema = Type.Object({\n access_token: Type.String(),\n token_type: Type.String(), // Usually \"Bearer\"\n expires_in: Type.Number(), // Seconds until token expires, typically 3600 (1 hour)\n refresh_token: Type.Optional(Type.String()), // Only present in first OAuth exchange\n scope: Type.String(), // Space-separated list of granted scopes\n id_token: Type.Optional(Type.String()), // JWT token containing user info, if requested\n});\n\nexport type GoogleOAuthToken = Static<typeof googleOAuthTokenSchema>;\n\n// You might also want to define the decoded id_token structure:\nconst googleIdTokenSchema = Type.Object({\n iss: Type.String(), // Issuer (usually 'https://accounts.google.com')\n sub: Type.String(), // Unique Google ID for the user\n aud: Type.String(), // Your client ID\n iat: Type.Number(), // Issued at (timestamp)\n exp: Type.Number(), // Expiration time (timestamp)\n email: Type.Optional(Type.String()),\n email_verified: Type.Optional(Type.Boolean()),\n name: Type.Optional(Type.String()),\n picture: Type.Optional(Type.String()),\n given_name: Type.Optional(Type.String()),\n family_name: Type.Optional(Type.String()),\n locale: Type.Optional(Type.String()),\n});\n\nexport type GoogleIdToken = Static<typeof googleIdTokenSchema>;\n"],"mappings":";;;;AAAA,SAAS,YAAyB;AAElC,IAAM,yBAAyB,KAAK,OAAO;AAAA,EACzC,cAAc,KAAK,OAAO;AAAA,EAC1B,YAAY,KAAK,OAAO;AAAA;AAAA,EACxB,YAAY,KAAK,OAAO;AAAA;AAAA,EACxB,eAAe,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA;AAAA,EAC1C,OAAO,KAAK,OAAO;AAAA;AAAA,EACnB,UAAU,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA;AACvC,CAAC;AAKD,IAAM,sBAAsB,KAAK,OAAO;AAAA,EACtC,KAAK,KAAK,OAAO;AAAA;AAAA,EACjB,KAAK,KAAK,OAAO;AAAA;AAAA,EACjB,KAAK,KAAK,OAAO;AAAA;AAAA,EACjB,KAAK,KAAK,OAAO;AAAA;AAAA,EACjB,KAAK,KAAK,OAAO;AAAA;AAAA,EACjB,OAAO,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EAClC,gBAAgB,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,EAC5C,MAAM,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EACjC,SAAS,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EACpC,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EACvC,aAAa,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,EACxC,QAAQ,KAAK,SAAS,KAAK,OAAO,CAAC;AACrC,CAAC;","names":[]}