@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.
- package/dist/shared/ai/schemas.d.ts +1 -2
- package/dist/shared/ai/schemas.d.ts.map +1 -1
- package/dist/shared/ai/schemas.js +28 -1
- package/dist/shared/ai/schemas.js.map +1 -1
- package/dist/shared/ai/types.d.ts +15 -1
- package/dist/shared/ai/types.d.ts.map +1 -1
- package/dist/shared/ajv.js +6861 -1
- package/dist/shared/ajv.js.map +1 -1
- package/dist/shared/analytics/init.js +20 -1
- package/dist/shared/analytics/init.js.map +1 -1
- package/dist/shared/analytics/track.js +24 -1
- package/dist/shared/analytics/track.js.map +1 -1
- package/dist/shared/attributes.d.ts +97 -30
- package/dist/shared/attributes.d.ts.map +1 -1
- package/dist/shared/attributes.js +46 -1
- package/dist/shared/brick-manifest.d.ts +1 -1
- package/dist/shared/brick-manifest.js +26 -1
- package/dist/shared/bricks/manifests/accordion.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/accordion.manifest.js +29 -1
- package/dist/shared/bricks/manifests/all-manifests.d.ts.map +1 -1
- package/dist/shared/bricks/manifests/all-manifests.js +59 -1
- package/dist/shared/bricks/manifests/box.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/box.manifest.js +28 -1
- package/dist/shared/bricks/manifests/button.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/button.manifest.js +28 -1
- package/dist/shared/bricks/manifests/card.manifest.d.ts +3 -3
- package/dist/shared/bricks/manifests/card.manifest.js +28 -1
- package/dist/shared/bricks/manifests/carousel.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/carousel.manifest.js +28 -1
- package/dist/shared/bricks/manifests/footer.manifest.d.ts +4 -4
- package/dist/shared/bricks/manifests/footer.manifest.d.ts.map +1 -1
- package/dist/shared/bricks/manifests/footer.manifest.js +30 -1
- package/dist/shared/bricks/manifests/form.manifest.d.ts +3 -3
- package/dist/shared/bricks/manifests/form.manifest.js +29 -1
- package/dist/shared/bricks/manifests/hero.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/hero.manifest.js +28 -1
- package/dist/shared/bricks/manifests/html.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/html.manifest.js +28 -1
- package/dist/shared/bricks/manifests/icon.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/icon.manifest.js +28 -1
- package/dist/shared/bricks/manifests/image.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/image.manifest.js +28 -1
- package/dist/shared/bricks/manifests/images-gallery.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/images-gallery.manifest.js +28 -1
- package/dist/shared/bricks/manifests/map.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/map.manifest.js +31 -1
- package/dist/shared/bricks/manifests/navbar.manifest.d.ts +4 -4
- package/dist/shared/bricks/manifests/navbar.manifest.d.ts.map +1 -1
- package/dist/shared/bricks/manifests/navbar.manifest.js +31 -1
- package/dist/shared/bricks/manifests/sidebar.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/sidebar.manifest.js +29 -1
- package/dist/shared/bricks/manifests/social-links.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/social-links.manifest.js +28 -1
- package/dist/shared/bricks/manifests/spacer.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/spacer.manifest.js +28 -1
- package/dist/shared/bricks/manifests/table.manifest.d.ts +91 -0
- package/dist/shared/bricks/manifests/table.manifest.d.ts.map +1 -0
- package/dist/shared/bricks/manifests/table.manifest.js +31 -0
- package/dist/shared/bricks/manifests/tabs.manifest.d.ts +90 -0
- package/dist/shared/bricks/manifests/tabs.manifest.d.ts.map +1 -0
- package/dist/shared/bricks/manifests/tabs.manifest.js +31 -0
- package/dist/shared/bricks/manifests/tabs.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/testimonials.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/testimonials.manifest.js +28 -1
- package/dist/shared/bricks/manifests/text.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/text.manifest.js +28 -1
- package/dist/shared/bricks/manifests/timeline.manifest.d.ts +101 -0
- package/dist/shared/bricks/manifests/timeline.manifest.d.ts.map +1 -0
- package/dist/shared/bricks/manifests/timeline.manifest.js +31 -0
- package/dist/shared/bricks/manifests/timeline.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/video.manifest.d.ts +2 -2
- package/dist/shared/bricks/manifests/video.manifest.js +28 -1
- package/dist/shared/bricks/props/align.d.ts +2 -2
- package/dist/shared/bricks/props/align.js +19 -1
- package/dist/shared/bricks/props/background.d.ts +4 -4
- package/dist/shared/bricks/props/background.js +15 -1
- package/dist/shared/bricks/props/boolean.js +7 -1
- package/dist/shared/bricks/props/border.js +16 -1
- package/dist/shared/bricks/props/color-preset.d.ts.map +1 -1
- package/dist/shared/bricks/props/color-preset.js +13 -1
- package/dist/shared/bricks/props/color.js +14 -1
- package/dist/shared/bricks/props/common.d.ts +2 -2
- package/dist/shared/bricks/props/common.js +13 -1
- package/dist/shared/bricks/props/css-length.js +14 -1
- package/dist/shared/bricks/props/datarecord.js +7 -1
- package/dist/shared/bricks/props/datasource.d.ts +1 -1
- package/dist/shared/bricks/props/datasource.js +86 -1
- package/dist/shared/bricks/props/datasource.js.map +1 -1
- package/dist/shared/bricks/props/date.js +9 -1
- package/dist/shared/bricks/props/direction.js +11 -1
- package/dist/shared/bricks/props/dynamic.d.ts.map +1 -1
- package/dist/shared/bricks/props/dynamic.js +30 -1
- package/dist/shared/bricks/props/effects.js +17 -1
- package/dist/shared/bricks/props/file.js +15 -1
- package/dist/shared/bricks/props/file.js.map +1 -1
- package/dist/shared/bricks/props/geolocation.js +44 -1
- package/dist/shared/bricks/props/geolocation.js.map +1 -1
- package/dist/shared/bricks/props/helpers.d.ts +1 -1
- package/dist/shared/bricks/props/helpers.js +18 -1
- package/dist/shared/bricks/props/image.js +11 -1
- package/dist/shared/bricks/props/number.js +7 -1
- package/dist/shared/bricks/props/position.js +7 -1
- package/dist/shared/bricks/props/string.js +18 -1
- package/dist/shared/bricks/props/tags.js +10 -1
- package/dist/shared/bricks/props/text.js +19 -1
- package/dist/shared/bricks.d.ts +56 -44
- package/dist/shared/bricks.d.ts.map +1 -1
- package/dist/shared/bricks.js +79 -1
- package/dist/shared/chunk-2BPYOTKA.js +21 -0
- package/dist/shared/{chunk-WHTPGWUV.js.map → chunk-2BPYOTKA.js.map} +1 -1
- package/dist/shared/chunk-2HO4FHLM.js +456 -0
- package/dist/shared/{chunk-I3VL6SRH.js.map → chunk-2HO4FHLM.js.map} +1 -1
- package/dist/shared/chunk-2RK3CPYJ.js +74 -0
- package/dist/shared/{chunk-W33JMRRN.js.map → chunk-2RK3CPYJ.js.map} +1 -1
- package/dist/shared/chunk-3KLRW4I2.js +560 -0
- package/dist/shared/{chunk-B3EATRFX.js.map → chunk-3KLRW4I2.js.map} +1 -1
- package/dist/shared/chunk-3ZDN5BWN.js +18 -0
- package/dist/shared/{chunk-OIY3EPHO.js.map → chunk-3ZDN5BWN.js.map} +1 -1
- package/dist/shared/chunk-4WI23M7W.js +30 -0
- package/dist/shared/chunk-4WI23M7W.js.map +1 -0
- package/dist/shared/chunk-55C6MTX2.js +21 -0
- package/dist/shared/{chunk-KBHDY425.js.map → chunk-55C6MTX2.js.map} +1 -1
- package/dist/shared/chunk-6E42XWFH.js +103 -0
- package/dist/shared/{chunk-ZA3GAB4H.js.map → chunk-6E42XWFH.js.map} +1 -1
- package/dist/shared/chunk-6TVVKUWM.js +15 -0
- package/dist/shared/{chunk-4WDWJA3N.js.map → chunk-6TVVKUWM.js.map} +1 -1
- package/dist/shared/chunk-6WIMWLCJ.js +17 -0
- package/dist/shared/{chunk-KYY3PHP7.js.map → chunk-6WIMWLCJ.js.map} +1 -1
- package/dist/shared/chunk-7LAWWRU7.js +21 -0
- package/dist/shared/{chunk-IUXCWWGO.js.map → chunk-7LAWWRU7.js.map} +1 -1
- package/dist/shared/chunk-A2QPY54H.js +13 -0
- package/dist/shared/{chunk-KFM6KXSE.js.map → chunk-A2QPY54H.js.map} +1 -1
- package/dist/shared/chunk-BHC2A43S.js +67 -0
- package/dist/shared/{chunk-3YVJ2ELD.js.map → chunk-BHC2A43S.js.map} +1 -1
- package/dist/shared/chunk-BMWRR4DI.js +572 -0
- package/dist/shared/chunk-BMWRR4DI.js.map +1 -0
- package/dist/shared/chunk-BPBKHEQ5.js +39 -0
- package/dist/shared/{chunk-OHNYCXPX.js.map → chunk-BPBKHEQ5.js.map} +1 -1
- package/dist/shared/chunk-BW6EFRSF.js +794 -0
- package/dist/shared/chunk-BW6EFRSF.js.map +1 -0
- package/dist/shared/chunk-CKFRSHR2.js +105 -0
- package/dist/shared/{chunk-CFF6Q7O7.js.map → chunk-CKFRSHR2.js.map} +1 -1
- package/dist/shared/chunk-CSF2WQX2.js +60 -0
- package/dist/shared/{chunk-GLS7HPIZ.js.map → chunk-CSF2WQX2.js.map} +1 -1
- package/dist/shared/chunk-D4YQ6ABM.js +338 -0
- package/dist/shared/{chunk-PXI7AHWS.js.map → chunk-D4YQ6ABM.js.map} +1 -1
- package/dist/shared/chunk-DRTGM2UJ.js +129 -0
- package/dist/shared/{chunk-FLOMNC6J.js.map → chunk-DRTGM2UJ.js.map} +1 -1
- package/dist/shared/chunk-EQMU6NIU.js +1222 -0
- package/dist/shared/chunk-EQMU6NIU.js.map +1 -0
- package/dist/shared/chunk-EWSPTRDL.js +378 -0
- package/dist/shared/{chunk-QX6OGRRT.js.map → chunk-EWSPTRDL.js.map} +1 -1
- package/dist/shared/chunk-F22LDHEO.js +105 -0
- package/dist/shared/{chunk-5YRC3IT3.js.map → chunk-F22LDHEO.js.map} +1 -1
- package/dist/shared/chunk-FVU5PXRC.js +244 -0
- package/dist/shared/chunk-FVU5PXRC.js.map +1 -0
- package/dist/shared/chunk-GCQURRVB.js +837 -0
- package/dist/shared/{chunk-WYVJE6J5.js.map → chunk-GCQURRVB.js.map} +1 -1
- package/dist/shared/chunk-GPCI2N2A.js +395 -0
- package/dist/shared/{chunk-WBZW5LVH.js.map → chunk-GPCI2N2A.js.map} +1 -1
- package/dist/shared/chunk-GRMY35BU.js +722 -0
- package/dist/shared/{chunk-NJGXC7D6.js.map → chunk-GRMY35BU.js.map} +1 -1
- package/dist/shared/chunk-HPCCD6V5.js +17 -0
- package/dist/shared/{chunk-6I3ONVU6.js.map → chunk-HPCCD6V5.js.map} +1 -1
- package/dist/shared/chunk-JK2FWFJU.js +15 -0
- package/dist/shared/{chunk-JMN3HTZU.js.map → chunk-JK2FWFJU.js.map} +1 -1
- package/dist/shared/chunk-KNREHAPN.js +13 -0
- package/dist/shared/{chunk-KSEURRVZ.js.map → chunk-KNREHAPN.js.map} +1 -1
- package/dist/shared/chunk-KT7SSWMM.js +24 -0
- package/dist/shared/{chunk-KO5FPOWZ.js.map → chunk-KT7SSWMM.js.map} +1 -1
- package/dist/shared/chunk-LXAO3JA6.js +368 -0
- package/dist/shared/chunk-LXAO3JA6.js.map +1 -0
- package/dist/shared/chunk-MLZT7MRQ.js +538 -0
- package/dist/shared/chunk-MLZT7MRQ.js.map +1 -0
- package/dist/shared/chunk-NT3IW52F.js +260 -0
- package/dist/shared/chunk-NT3IW52F.js.map +1 -0
- package/dist/shared/chunk-NTLAKMMQ.js +94 -0
- package/dist/shared/{chunk-ZTZJHY4E.js.map → chunk-NTLAKMMQ.js.map} +1 -1
- package/dist/shared/chunk-O5PLB3YB.js +413 -0
- package/dist/shared/chunk-O5PLB3YB.js.map +1 -0
- package/dist/shared/chunk-O5PQISX4.js +51 -0
- package/dist/shared/{chunk-VEDQV5XO.js.map → chunk-O5PQISX4.js.map} +1 -1
- package/dist/shared/chunk-OJP4HMJT.js +22 -0
- package/dist/shared/{chunk-6HLU4UI2.js.map → chunk-OJP4HMJT.js.map} +1 -1
- package/dist/shared/chunk-OSJ6KGPX.js +16 -0
- package/dist/shared/{chunk-GPEMPZXK.js.map → chunk-OSJ6KGPX.js.map} +1 -1
- package/dist/shared/chunk-OXYXZHP2.js +48 -0
- package/dist/shared/{chunk-5O4Z3YQY.js.map → chunk-OXYXZHP2.js.map} +1 -1
- package/dist/shared/chunk-P3RH5URN.js +230 -0
- package/dist/shared/{chunk-R6ATC4TC.js.map → chunk-P3RH5URN.js.map} +1 -1
- package/dist/shared/chunk-Q4NPPLEU.js +34 -0
- package/dist/shared/{chunk-QWGUMKZC.js.map → chunk-Q4NPPLEU.js.map} +1 -1
- package/dist/shared/chunk-QL3T5HJQ.js +59 -0
- package/dist/shared/{chunk-E6XEI7IK.js.map → chunk-QL3T5HJQ.js.map} +1 -1
- package/dist/shared/chunk-QLQVDZIL.js +11 -0
- package/dist/shared/{chunk-KLD3P5XH.js.map → chunk-QLQVDZIL.js.map} +1 -1
- package/dist/shared/chunk-QQQ3FYPG.js +248 -0
- package/dist/shared/{chunk-SXHDQ64Z.js.map → chunk-QQQ3FYPG.js.map} +1 -1
- package/dist/shared/chunk-QSND5IWT.js +165 -0
- package/dist/shared/{chunk-ZQPXQCY2.js.map → chunk-QSND5IWT.js.map} +1 -1
- package/dist/shared/chunk-RV7AYVFV.js +75 -0
- package/dist/shared/{chunk-DHI3IBOD.js.map → chunk-RV7AYVFV.js.map} +1 -1
- package/dist/shared/chunk-SE6O65HC.js +44 -0
- package/dist/shared/{chunk-NM5MMPCF.js.map → chunk-SE6O65HC.js.map} +1 -1
- package/dist/shared/chunk-SHUGHJ7V.js +519 -0
- package/dist/shared/{chunk-IKC3FK7L.js.map → chunk-SHUGHJ7V.js.map} +1 -1
- package/dist/shared/chunk-TB3X4LRQ.js +56 -0
- package/dist/shared/{chunk-RJYZ5FAR.js.map → chunk-TB3X4LRQ.js.map} +1 -1
- package/dist/shared/chunk-TEO6TJOM.js +212 -0
- package/dist/shared/chunk-TEO6TJOM.js.map +1 -0
- package/dist/shared/chunk-TFGGYU6Y.js +394 -0
- package/dist/shared/{chunk-CZRCW5EN.js.map → chunk-TFGGYU6Y.js.map} +1 -1
- package/dist/shared/chunk-TKMWY2VN.js +18 -0
- package/dist/shared/{chunk-RDZK73KV.js.map → chunk-TKMWY2VN.js.map} +1 -1
- package/dist/shared/chunk-TNMNMYOB.js +69 -0
- package/dist/shared/{chunk-4BTB3MU2.js.map → chunk-TNMNMYOB.js.map} +1 -1
- package/dist/shared/chunk-U7TVEPKA.js +432 -0
- package/dist/shared/chunk-U7TVEPKA.js.map +1 -0
- package/dist/shared/chunk-UQF52PWK.js +70 -0
- package/dist/shared/{chunk-A3GF4PYW.js.map → chunk-UQF52PWK.js.map} +1 -1
- package/dist/shared/chunk-V3UA3LRK.js +253 -0
- package/dist/shared/{chunk-G5CJU6RD.js.map → chunk-V3UA3LRK.js.map} +1 -1
- package/dist/shared/chunk-W6MRYRGJ.js +100 -0
- package/dist/shared/{chunk-CCI4C3TM.js.map → chunk-W6MRYRGJ.js.map} +1 -1
- package/dist/shared/chunk-WGDUJSSS.js +462 -0
- package/dist/shared/chunk-WGDUJSSS.js.map +1 -0
- package/dist/shared/chunk-WKN566LN.js +29 -0
- package/dist/shared/{chunk-Q4H4QEMB.js.map → chunk-WKN566LN.js.map} +1 -1
- package/dist/shared/chunk-X6N463D4.js +222 -0
- package/dist/shared/{chunk-IKHZD2JH.js.map → chunk-X6N463D4.js.map} +1 -1
- package/dist/shared/chunk-X75YV73Q.js +178 -0
- package/dist/shared/{chunk-PLSV746R.js.map → chunk-X75YV73Q.js.map} +1 -1
- package/dist/shared/chunk-XCWMZVF5.js +89 -0
- package/dist/shared/{chunk-ZFCUSWMT.js.map → chunk-XCWMZVF5.js.map} +1 -1
- package/dist/shared/chunk-XCZVD5H6.js +13 -0
- package/dist/shared/{chunk-HAGKVQOW.js.map → chunk-XCZVD5H6.js.map} +1 -1
- package/dist/shared/chunk-XZ6WJZHN.js +10 -0
- package/dist/shared/{chunk-DCH4ZKWT.js.map → chunk-XZ6WJZHN.js.map} +1 -1
- package/dist/shared/chunk-Y74LZNND.js +30 -0
- package/dist/shared/{chunk-GACHLACT.js.map → chunk-Y74LZNND.js.map} +1 -1
- package/dist/shared/chunk-Z2NTDFB4.js +505 -0
- package/dist/shared/{chunk-SQ5T4AT5.js.map → chunk-Z2NTDFB4.js.map} +1 -1
- package/dist/shared/chunk-Z35I5JM5.js +131 -0
- package/dist/shared/{chunk-PSTFJ5IJ.js.map → chunk-Z35I5JM5.js.map} +1 -1
- package/dist/shared/chunk-ZEFOWKYP.js +44 -0
- package/dist/shared/{chunk-DQ7PRWTG.js.map → chunk-ZEFOWKYP.js.map} +1 -1
- package/dist/shared/chunk-ZGQ3AQBG.js +33 -0
- package/dist/shared/chunk-ZGQ3AQBG.js.map +1 -0
- package/dist/shared/chunk-ZLYIRH2B.js +68 -0
- package/dist/shared/{chunk-SWLUQVK7.js.map → chunk-ZLYIRH2B.js.map} +1 -1
- package/dist/shared/datarecords/external/airtable/handler.js +377 -1
- package/dist/shared/datarecords/external/airtable/handler.js.map +1 -1
- package/dist/shared/datarecords/external/airtable/oauth/config.js +15 -1
- package/dist/shared/datarecords/external/airtable/oauth/config.js.map +1 -1
- package/dist/shared/datarecords/external/airtable/types.js +11 -1
- package/dist/shared/datarecords/external/generic-webhook/handler.js +14 -1
- package/dist/shared/datarecords/external/generic-webhook/handler.js.map +1 -1
- package/dist/shared/datarecords/external/generic-webhook/options.js +16 -1
- package/dist/shared/datarecords/external/generic-webhook/options.js.map +1 -1
- package/dist/shared/datarecords/external/google/oauth/config.js +35 -1
- package/dist/shared/datarecords/external/google/oauth/config.js.map +1 -1
- package/dist/shared/datarecords/external/google/sheets/client.js +7 -1
- package/dist/shared/datarecords/external/google/sheets/handler.js +184 -5
- package/dist/shared/datarecords/external/google/sheets/handler.js.map +1 -1
- package/dist/shared/datarecords/external/google/sheets/types.js +7 -1
- package/dist/shared/datarecords/external/notion/handler.js +397 -1
- package/dist/shared/datarecords/external/notion/handler.js.map +1 -1
- package/dist/shared/datarecords/external/notion/oauth/config.js +11 -1
- package/dist/shared/datarecords/external/notion/oauth/config.js.map +1 -1
- package/dist/shared/datarecords/external/notion/types.js +7 -1
- package/dist/shared/datarecords/types.d.ts +3 -3
- package/dist/shared/datarecords/types.js +16 -1
- package/dist/shared/datarecords.js +9 -1
- package/dist/shared/datarecords.js.map +1 -1
- package/dist/shared/datasources/external/facebook/posts/fetcher.js +49 -1
- package/dist/shared/datasources/external/facebook/posts/fetcher.js.map +1 -1
- package/dist/shared/datasources/external/facebook/posts/schema.js +36 -1
- package/dist/shared/datasources/external/facebook/posts/schema.js.map +1 -1
- package/dist/shared/datasources/external/http-json/fetcher.js +29 -1
- package/dist/shared/datasources/external/http-json/fetcher.js.map +1 -1
- package/dist/shared/datasources/external/http-json/options.js +11 -1
- package/dist/shared/datasources/external/http-json/options.js.map +1 -1
- package/dist/shared/datasources/external/http-json/schema.js +10 -1
- package/dist/shared/datasources/external/http-json/schema.js.map +1 -1
- package/dist/shared/datasources/external/instagram/feed/fetcher.js +29 -1
- package/dist/shared/datasources/external/instagram/feed/fetcher.js.map +1 -1
- package/dist/shared/datasources/external/instagram/feed/schema.js +26 -1
- package/dist/shared/datasources/external/instagram/feed/schema.js.map +1 -1
- package/dist/shared/datasources/external/mastodon/account/fetcher.js +7 -1
- package/dist/shared/datasources/external/mastodon/account/schema.js +7 -1
- package/dist/shared/datasources/external/mastodon/options.js +10 -1
- package/dist/shared/datasources/external/mastodon/options.js.map +1 -1
- package/dist/shared/datasources/external/mastodon/status/fetcher.js +31 -1
- package/dist/shared/datasources/external/mastodon/status/fetcher.js.map +1 -1
- package/dist/shared/datasources/external/mastodon/status/sample.array.js +61 -1
- package/dist/shared/datasources/external/mastodon/status/sample.array.js.map +1 -1
- package/dist/shared/datasources/external/mastodon/status/sample.single.js +59 -1
- package/dist/shared/datasources/external/mastodon/status/sample.single.js.map +1 -1
- package/dist/shared/datasources/external/mastodon/status/schema.js +125 -1
- package/dist/shared/datasources/external/mastodon/status/schema.js.map +1 -1
- package/dist/shared/datasources/external/meta/oauth/config.js +17 -1
- package/dist/shared/datasources/external/meta/oauth/config.js.map +1 -1
- package/dist/shared/datasources/external/meta/options.js +10 -1
- package/dist/shared/datasources/external/meta/options.js.map +1 -1
- package/dist/shared/datasources/external/rss/fetcher.js +26 -1
- package/dist/shared/datasources/external/rss/fetcher.js.map +1 -1
- package/dist/shared/datasources/external/rss/options.js +10 -1
- package/dist/shared/datasources/external/rss/options.js.map +1 -1
- package/dist/shared/datasources/external/rss/schema.js +7 -1
- package/dist/shared/datasources/external/threads/media/fetcher.js +47 -1
- package/dist/shared/datasources/external/threads/media/fetcher.js.map +1 -1
- package/dist/shared/datasources/external/threads/media/schema.js +40 -1
- package/dist/shared/datasources/external/threads/media/schema.js.map +1 -1
- package/dist/shared/datasources/external/tiktok/oauth/config.js +18 -1
- package/dist/shared/datasources/external/tiktok/oauth/config.js.map +1 -1
- package/dist/shared/datasources/external/tiktok/video/fetcher.js +34 -1
- package/dist/shared/datasources/external/tiktok/video/fetcher.js.map +1 -1
- package/dist/shared/datasources/external/tiktok/video/options.js +11 -1
- package/dist/shared/datasources/external/tiktok/video/options.js.map +1 -1
- package/dist/shared/datasources/external/tiktok/video/schema.js +30 -1
- package/dist/shared/datasources/external/tiktok/video/schema.js.map +1 -1
- package/dist/shared/datasources/external/youtube/list/fetcher.js +32 -1
- package/dist/shared/datasources/external/youtube/list/fetcher.js.map +1 -1
- package/dist/shared/datasources/external/youtube/list/options.js +14 -1
- package/dist/shared/datasources/external/youtube/list/options.js.map +1 -1
- package/dist/shared/datasources/external/youtube/list/schema.js +7 -1
- package/dist/shared/datasources/external/youtube/oauth/config.js +18 -1
- package/dist/shared/datasources/external/youtube/oauth/config.js.map +1 -1
- package/dist/shared/datasources/internal/blog/schema.js +72 -1
- package/dist/shared/datasources/internal/blog/schema.js.map +1 -1
- package/dist/shared/datasources/internal/changelog/schema.js +51 -1
- package/dist/shared/datasources/internal/changelog/schema.js.map +1 -1
- package/dist/shared/datasources/internal/contact-info/schema.js +25 -1
- package/dist/shared/datasources/internal/contact-info/schema.js.map +1 -1
- package/dist/shared/datasources/internal/cv/schema.js +222 -1
- package/dist/shared/datasources/internal/cv/schema.js.map +1 -1
- package/dist/shared/datasources/internal/faq/schema.js +30 -1
- package/dist/shared/datasources/internal/faq/schema.js.map +1 -1
- package/dist/shared/datasources/internal/job-board/schema.js +224 -1
- package/dist/shared/datasources/internal/job-board/schema.js.map +1 -1
- package/dist/shared/datasources/internal/links/schema.js +7 -1
- package/dist/shared/datasources/internal/recipes/schema.js +45 -1
- package/dist/shared/datasources/internal/recipes/schema.js.map +1 -1
- package/dist/shared/datasources/internal/restaurant/schema.js +226 -1
- package/dist/shared/datasources/internal/restaurant/schema.js.map +1 -1
- package/dist/shared/datasources/samples.js +69 -1
- package/dist/shared/datasources/samples.js.map +1 -1
- package/dist/shared/datasources/schemas.js +34 -1
- package/dist/shared/datasources/schemas.js.map +1 -1
- package/dist/shared/datasources/types.d.ts +1 -1
- package/dist/shared/datasources/types.d.ts.map +1 -1
- package/dist/shared/datasources/types.js +32 -1
- package/dist/shared/datasources/utils.js +11 -1
- package/dist/shared/datasources.js +51 -1
- package/dist/shared/datasources.js.map +1 -1
- package/dist/shared/errors.js +7 -1
- package/dist/shared/images.d.ts +4 -4
- package/dist/shared/images.d.ts.map +1 -1
- package/dist/shared/images.js +44 -1
- package/dist/shared/images.js.map +1 -1
- package/dist/shared/index.js +9 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/layout-constants.js +14 -1
- package/dist/shared/layout-constants.js.map +1 -1
- package/dist/shared/manifest.js +52 -1
- package/dist/shared/manifest.js.map +1 -1
- package/dist/shared/oauth.js +8 -1
- package/dist/shared/page.d.ts +12 -126
- package/dist/shared/page.d.ts.map +1 -1
- package/dist/shared/page.js +58 -1
- package/dist/shared/prompt.js +7 -1
- package/dist/shared/responsive.js +10 -1
- package/dist/shared/responsive.js.map +1 -1
- package/dist/shared/schema-registry.d.ts +5 -0
- package/dist/shared/schema-registry.d.ts.map +1 -0
- package/dist/shared/schema-registry.js +119 -0
- package/dist/shared/schema-registry.js.map +1 -0
- package/dist/shared/site.d.ts +36 -33
- package/dist/shared/site.d.ts.map +1 -1
- package/dist/shared/site.js +127 -1
- package/dist/shared/site.js.map +1 -1
- package/dist/shared/sitemap.d.ts +17 -17
- package/dist/shared/sitemap.d.ts.map +1 -1
- package/dist/shared/sitemap.js +69 -1
- package/dist/shared/social-icons.js +312 -1
- package/dist/shared/social-icons.js.map +1 -1
- package/dist/shared/tests/schema-registry.test.d.ts +2 -0
- package/dist/shared/tests/schema-registry.test.d.ts.map +1 -0
- package/dist/shared/theme.d.ts +1 -1
- package/dist/shared/theme.d.ts.map +1 -1
- package/dist/shared/theme.js +35 -1
- package/dist/shared/themes/color-system.d.ts +0 -1
- package/dist/shared/themes/color-system.d.ts.map +1 -1
- package/dist/shared/themes/color-system.js +103 -1
- package/dist/shared/themes/color-system.js.map +1 -1
- package/dist/shared/utils/canvas-data-uri.js +7 -1
- package/dist/shared/utils/canvas-data-uri.js.map +1 -1
- package/dist/shared/utils/invariant.js +7 -1
- package/dist/shared/utils/json-date.js +7 -1
- package/dist/shared/utils/llm.d.ts +2 -3
- package/dist/shared/utils/llm.d.ts.map +1 -1
- package/dist/shared/utils/llm.js +24 -1
- package/dist/shared/utils/merge.js +7 -1
- package/dist/shared/utils/object-hash.js +13 -1
- package/dist/shared/utils/object-hash.js.map +1 -1
- package/dist/shared/utils/schema-registry.d.ts +5 -0
- package/dist/shared/utils/schema-registry.d.ts.map +1 -0
- package/dist/shared/utils/schema-registry.js +29 -0
- package/dist/shared/utils/schema-registry.js.map +1 -0
- package/dist/shared/utils/schema.d.ts +2 -1
- package/dist/shared/utils/schema.d.ts.map +1 -1
- package/dist/shared/utils/schema.js +31 -1
- package/dist/shared/utils/string-enum.js +7 -1
- package/dist/shared/utils/tests/schema-registry.test.d.ts +2 -0
- package/dist/shared/utils/tests/schema-registry.test.d.ts.map +1 -0
- package/dist/shared/utils/try-catch.js +13 -1
- package/dist/shared/utils/try-catch.js.map +1 -1
- package/dist/shared/utils/typed-ref.js +7 -1
- package/package.json +12 -13
- package/src/shared/ai/schemas.ts +4 -8
- package/src/shared/ai/types.ts +9 -1
- package/src/shared/attributes.ts +27 -25
- package/src/shared/bricks/manifests/all-manifests.ts +15 -0
- package/src/shared/bricks/manifests/footer.manifest.ts +36 -27
- package/src/shared/bricks/manifests/navbar.manifest.ts +1 -3
- package/src/shared/bricks/manifests/table.manifest.ts +443 -0
- package/src/shared/bricks/manifests/tabs.manifest.ts +576 -0
- package/src/shared/bricks/manifests/timeline.manifest.ts +441 -0
- package/src/shared/bricks/props/color-preset.ts +3 -1
- package/src/shared/bricks/props/dynamic.ts +0 -1
- package/src/shared/bricks.ts +54 -45
- package/src/shared/datasources/types.ts +1 -5
- package/src/shared/images.ts +10 -8
- package/src/shared/page.ts +0 -4
- package/src/shared/schema-registry.ts +82 -0
- package/src/shared/sitemap.ts +12 -16
- package/src/shared/tests/schema-registry.test.ts +14 -0
- package/src/shared/theme.ts +1 -4
- package/src/shared/themes/color-system.ts +0 -1
- package/src/shared/utils/llm.ts +13 -12
- package/src/shared/utils/schema-registry.ts +82 -0
- package/src/shared/utils/schema.ts +18 -3
- package/src/shared/utils/tests/schema-registry.test.ts +13 -0
- package/src/shared/utils/tests/schema.test.ts +82 -55
- package/dist/shared/bricks/props/enum.d.ts +0 -13
- package/dist/shared/bricks/props/enum.d.ts.map +0 -1
- package/dist/shared/bricks/props/enum.js +0 -4
- package/dist/shared/chunk-3YVJ2ELD.js +0 -4
- package/dist/shared/chunk-4BTB3MU2.js +0 -4
- package/dist/shared/chunk-4WDWJA3N.js +0 -4
- package/dist/shared/chunk-5O4Z3YQY.js +0 -4
- package/dist/shared/chunk-5YRC3IT3.js +0 -4
- package/dist/shared/chunk-6HLU4UI2.js +0 -4
- package/dist/shared/chunk-6I3ONVU6.js +0 -4
- package/dist/shared/chunk-7A2JNQX3.js +0 -4
- package/dist/shared/chunk-7A2JNQX3.js.map +0 -1
- package/dist/shared/chunk-A3GF4PYW.js +0 -4
- package/dist/shared/chunk-A3K4NUVP.js +0 -4
- package/dist/shared/chunk-A3K4NUVP.js.map +0 -1
- package/dist/shared/chunk-AFVJZPLS.js +0 -4
- package/dist/shared/chunk-AFVJZPLS.js.map +0 -1
- package/dist/shared/chunk-AI4GHU7R.js +0 -4
- package/dist/shared/chunk-AI4GHU7R.js.map +0 -1
- package/dist/shared/chunk-B3EATRFX.js +0 -4
- package/dist/shared/chunk-CCI4C3TM.js +0 -4
- package/dist/shared/chunk-CFF6Q7O7.js +0 -7
- package/dist/shared/chunk-CZRCW5EN.js +0 -4
- package/dist/shared/chunk-DCH4ZKWT.js +0 -4
- package/dist/shared/chunk-DHI3IBOD.js +0 -4
- package/dist/shared/chunk-DQ7PRWTG.js +0 -4
- package/dist/shared/chunk-E6XEI7IK.js +0 -4
- package/dist/shared/chunk-FLOMNC6J.js +0 -4
- package/dist/shared/chunk-G5CJU6RD.js +0 -7
- package/dist/shared/chunk-GACHLACT.js +0 -4
- package/dist/shared/chunk-GLS7HPIZ.js +0 -4
- package/dist/shared/chunk-GOMXZC4B.js +0 -35
- package/dist/shared/chunk-GOMXZC4B.js.map +0 -1
- package/dist/shared/chunk-GPEMPZXK.js +0 -4
- package/dist/shared/chunk-HAGKVQOW.js +0 -4
- package/dist/shared/chunk-I3VL6SRH.js +0 -9
- package/dist/shared/chunk-IKC3FK7L.js +0 -4
- package/dist/shared/chunk-IKHZD2JH.js +0 -4
- package/dist/shared/chunk-IUXCWWGO.js +0 -4
- package/dist/shared/chunk-JMN3HTZU.js +0 -4
- package/dist/shared/chunk-KBHDY425.js +0 -4
- package/dist/shared/chunk-KFM6KXSE.js +0 -4
- package/dist/shared/chunk-KLD3P5XH.js +0 -4
- package/dist/shared/chunk-KO5FPOWZ.js +0 -4
- package/dist/shared/chunk-KSEURRVZ.js +0 -4
- package/dist/shared/chunk-KYY3PHP7.js +0 -4
- package/dist/shared/chunk-NJGXC7D6.js +0 -4
- package/dist/shared/chunk-NM5MMPCF.js +0 -4
- package/dist/shared/chunk-OGBMYMZD.js +0 -4
- package/dist/shared/chunk-OGBMYMZD.js.map +0 -1
- package/dist/shared/chunk-OHNYCXPX.js +0 -4
- package/dist/shared/chunk-OIY3EPHO.js +0 -4
- package/dist/shared/chunk-PIG623TZ.js +0 -4
- package/dist/shared/chunk-PIG623TZ.js.map +0 -1
- package/dist/shared/chunk-PLSV746R.js +0 -4
- package/dist/shared/chunk-PSCN3VVA.js +0 -4
- package/dist/shared/chunk-PSCN3VVA.js.map +0 -1
- package/dist/shared/chunk-PSTFJ5IJ.js +0 -4
- package/dist/shared/chunk-PXI7AHWS.js +0 -4
- package/dist/shared/chunk-Q4H4QEMB.js +0 -4
- package/dist/shared/chunk-QGYZ7CG5.js +0 -4
- package/dist/shared/chunk-QGYZ7CG5.js.map +0 -1
- package/dist/shared/chunk-QWGUMKZC.js +0 -4
- package/dist/shared/chunk-QX6OGRRT.js +0 -5
- package/dist/shared/chunk-R6ATC4TC.js +0 -4
- package/dist/shared/chunk-RDZK73KV.js +0 -4
- package/dist/shared/chunk-RJYZ5FAR.js +0 -4
- package/dist/shared/chunk-SQ5T4AT5.js +0 -6
- package/dist/shared/chunk-SWLUQVK7.js +0 -4
- package/dist/shared/chunk-SXHDQ64Z.js +0 -5
- package/dist/shared/chunk-SY6DZLTC.js +0 -4
- package/dist/shared/chunk-SY6DZLTC.js.map +0 -1
- package/dist/shared/chunk-VEDQV5XO.js +0 -4
- package/dist/shared/chunk-W33JMRRN.js +0 -4
- package/dist/shared/chunk-WBZW5LVH.js +0 -4
- package/dist/shared/chunk-WHTPGWUV.js +0 -4
- package/dist/shared/chunk-WYVJE6J5.js +0 -4
- package/dist/shared/chunk-ZA3GAB4H.js +0 -9
- package/dist/shared/chunk-ZFCUSWMT.js +0 -4
- package/dist/shared/chunk-ZQPXQCY2.js +0 -4
- package/dist/shared/chunk-ZTZJHY4E.js +0 -4
- package/src/shared/bricks/props/enum.ts +0 -38
- /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
|
-
|
|
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
|
|
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":"
|
|
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{
|
|
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
|
-
|
|
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":"
|
|
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
|
|
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":"
|
|
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
|
-
|
|
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":"
|
|
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":[]}
|