@upstart.gg/sdk 0.0.131 → 0.0.133
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.js +1 -0
- package/dist/shared/ai/schemas.js.map +1 -0
- package/dist/shared/ai/types.d.ts +6 -0
- package/dist/shared/ai/types.d.ts.map +1 -1
- package/dist/shared/ai/types.js +1 -0
- package/dist/shared/ai/types.js.map +1 -0
- package/dist/shared/ajv.js +2 -1
- package/dist/shared/ajv.js.map +1 -0
- package/dist/shared/analytics/init.js +1 -0
- package/dist/shared/analytics/init.js.map +1 -0
- package/dist/shared/analytics/track.js +1 -0
- package/dist/shared/analytics/track.js.map +1 -0
- package/dist/shared/analytics/types.js +1 -0
- package/dist/shared/analytics/types.js.map +1 -0
- package/dist/shared/attributes.js +2 -1
- package/dist/shared/attributes.js.map +1 -0
- package/dist/shared/brick-manifest.js +2 -1
- package/dist/shared/brick-manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/accordion.manifest.js +2 -1
- package/dist/shared/bricks/manifests/accordion.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/all-manifests.js +2 -1
- package/dist/shared/bricks/manifests/all-manifests.js.map +1 -0
- package/dist/shared/bricks/manifests/box.manifest.js +2 -1
- package/dist/shared/bricks/manifests/box.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/button.manifest.js +2 -1
- package/dist/shared/bricks/manifests/button.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/card.manifest.js +2 -1
- package/dist/shared/bricks/manifests/card.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/carousel.manifest.js +2 -1
- package/dist/shared/bricks/manifests/carousel.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/footer.manifest.js +2 -1
- package/dist/shared/bricks/manifests/footer.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/form.manifest.js +2 -1
- package/dist/shared/bricks/manifests/form.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/hero.manifest.js +2 -1
- package/dist/shared/bricks/manifests/hero.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/html.manifest.js +2 -1
- package/dist/shared/bricks/manifests/html.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/icon.manifest.d.ts.map +1 -1
- package/dist/shared/bricks/manifests/icon.manifest.js +2 -1
- package/dist/shared/bricks/manifests/icon.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/image.manifest.js +2 -1
- package/dist/shared/bricks/manifests/image.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/images-gallery.manifest.js +2 -1
- package/dist/shared/bricks/manifests/images-gallery.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/map.manifest.js +2 -1
- package/dist/shared/bricks/manifests/map.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/navbar.manifest.js +2 -1
- package/dist/shared/bricks/manifests/navbar.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/sidebar.manifest.js +2 -1
- package/dist/shared/bricks/manifests/sidebar.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/social-links.manifest.js +2 -1
- package/dist/shared/bricks/manifests/social-links.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/spacer.manifest.js +2 -1
- package/dist/shared/bricks/manifests/spacer.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/testimonials.manifest.js +2 -1
- package/dist/shared/bricks/manifests/testimonials.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/text.manifest.js +2 -1
- package/dist/shared/bricks/manifests/text.manifest.js.map +1 -0
- package/dist/shared/bricks/manifests/video.manifest.js +2 -1
- package/dist/shared/bricks/manifests/video.manifest.js.map +1 -0
- package/dist/shared/bricks/props/align.js +2 -1
- package/dist/shared/bricks/props/align.js.map +1 -0
- package/dist/shared/bricks/props/background.js +2 -1
- package/dist/shared/bricks/props/background.js.map +1 -0
- package/dist/shared/bricks/props/boolean.js +2 -1
- package/dist/shared/bricks/props/boolean.js.map +1 -0
- package/dist/shared/bricks/props/border.js +2 -1
- package/dist/shared/bricks/props/border.js.map +1 -0
- package/dist/shared/bricks/props/color-preset.js +2 -1
- package/dist/shared/bricks/props/color-preset.js.map +1 -0
- package/dist/shared/bricks/props/color.js +2 -1
- package/dist/shared/bricks/props/color.js.map +1 -0
- package/dist/shared/bricks/props/common.js +2 -1
- package/dist/shared/bricks/props/common.js.map +1 -0
- package/dist/shared/bricks/props/css-length.js +2 -1
- package/dist/shared/bricks/props/css-length.js.map +1 -0
- package/dist/shared/bricks/props/datarecord.js +2 -1
- package/dist/shared/bricks/props/datarecord.js.map +1 -0
- package/dist/shared/bricks/props/datasource.js +2 -1
- package/dist/shared/bricks/props/datasource.js.map +1 -0
- package/dist/shared/bricks/props/date.js +2 -1
- package/dist/shared/bricks/props/date.js.map +1 -0
- package/dist/shared/bricks/props/direction.js +2 -1
- package/dist/shared/bricks/props/direction.js.map +1 -0
- package/dist/shared/bricks/props/dynamic.js +2 -1
- package/dist/shared/bricks/props/dynamic.js.map +1 -0
- package/dist/shared/bricks/props/effects.js +2 -1
- package/dist/shared/bricks/props/effects.js.map +1 -0
- package/dist/shared/bricks/props/enum.js +2 -1
- package/dist/shared/bricks/props/enum.js.map +1 -0
- package/dist/shared/bricks/props/file.js +1 -0
- package/dist/shared/bricks/props/file.js.map +1 -0
- package/dist/shared/bricks/props/geolocation.js +2 -1
- package/dist/shared/bricks/props/geolocation.js.map +1 -0
- package/dist/shared/bricks/props/helpers.js +2 -1
- package/dist/shared/bricks/props/helpers.js.map +1 -0
- package/dist/shared/bricks/props/image.js +2 -1
- package/dist/shared/bricks/props/image.js.map +1 -0
- package/dist/shared/bricks/props/number.js +2 -1
- package/dist/shared/bricks/props/number.js.map +1 -0
- package/dist/shared/bricks/props/position.js +2 -1
- package/dist/shared/bricks/props/position.js.map +1 -0
- package/dist/shared/bricks/props/string.js +2 -1
- package/dist/shared/bricks/props/string.js.map +1 -0
- package/dist/shared/bricks/props/tags.js +2 -1
- package/dist/shared/bricks/props/tags.js.map +1 -0
- package/dist/shared/bricks/props/text.js +2 -1
- package/dist/shared/bricks/props/text.js.map +1 -0
- package/dist/shared/bricks/props/types.js +1 -0
- package/dist/shared/bricks/props/types.js.map +1 -0
- package/dist/shared/bricks.js +2 -1
- package/dist/shared/bricks.js.map +1 -0
- package/dist/shared/{chunk-6PGAWO4H.js → chunk-3YVJ2ELD.js} +2 -1
- package/dist/shared/chunk-3YVJ2ELD.js.map +1 -0
- package/dist/shared/{chunk-AB3IMRXZ.js → chunk-4BTB3MU2.js} +2 -1
- package/dist/shared/chunk-4BTB3MU2.js.map +1 -0
- package/dist/shared/{chunk-ZJNA4QQC.js → chunk-4WDWJA3N.js} +1 -0
- package/dist/shared/chunk-4WDWJA3N.js.map +1 -0
- package/dist/shared/{chunk-NQKXDMQ5.js → chunk-5O4Z3YQY.js} +1 -0
- package/dist/shared/chunk-5O4Z3YQY.js.map +1 -0
- package/dist/shared/{chunk-VK26ZZFR.js → chunk-5YRC3IT3.js} +2 -1
- package/dist/shared/chunk-5YRC3IT3.js.map +1 -0
- package/dist/shared/{chunk-WAML3IGZ.js → chunk-6HLU4UI2.js} +1 -0
- package/dist/shared/chunk-6HLU4UI2.js.map +1 -0
- package/dist/shared/{chunk-MKIXZXWS.js → chunk-6I3ONVU6.js} +1 -0
- package/dist/shared/chunk-6I3ONVU6.js.map +1 -0
- package/dist/shared/{chunk-AZHH3XJJ.js → chunk-7A2JNQX3.js} +2 -1
- package/dist/shared/chunk-7A2JNQX3.js.map +1 -0
- package/dist/shared/{chunk-7UBMXMNJ.js → chunk-A3GF4PYW.js} +2 -1
- package/dist/shared/chunk-A3GF4PYW.js.map +1 -0
- package/dist/shared/chunk-A3K4NUVP.js +4 -0
- package/dist/shared/chunk-A3K4NUVP.js.map +1 -0
- package/dist/shared/{chunk-F4JNKU7J.js → chunk-AFVJZPLS.js} +2 -1
- package/dist/shared/chunk-AFVJZPLS.js.map +1 -0
- package/dist/shared/{chunk-PW5HRVMD.js → chunk-AI4GHU7R.js} +2 -1
- package/dist/shared/chunk-AI4GHU7R.js.map +1 -0
- package/dist/shared/{chunk-SAJY7H6N.js → chunk-B3EATRFX.js} +2 -1
- package/dist/shared/chunk-B3EATRFX.js.map +1 -0
- package/dist/shared/{chunk-3FPFR5RA.js → chunk-CCI4C3TM.js} +2 -1
- package/dist/shared/chunk-CCI4C3TM.js.map +1 -0
- package/dist/shared/{chunk-URRCKLAS.js → chunk-CFF6Q7O7.js} +2 -1
- package/dist/shared/chunk-CFF6Q7O7.js.map +1 -0
- package/dist/shared/{chunk-Z4YKRLOX.js → chunk-CZRCW5EN.js} +2 -1
- package/dist/shared/chunk-CZRCW5EN.js.map +1 -0
- package/dist/shared/{chunk-ARMM6B47.js → chunk-DCH4ZKWT.js} +1 -0
- package/dist/shared/chunk-DCH4ZKWT.js.map +1 -0
- package/dist/shared/{chunk-GC5OWY2Z.js → chunk-DHI3IBOD.js} +2 -1
- package/dist/shared/chunk-DHI3IBOD.js.map +1 -0
- package/dist/shared/{chunk-PZYX3ACO.js → chunk-DQ7PRWTG.js} +1 -0
- package/dist/shared/chunk-DQ7PRWTG.js.map +1 -0
- package/dist/shared/{chunk-XED6ARVN.js → chunk-E6XEI7IK.js} +2 -1
- package/dist/shared/chunk-E6XEI7IK.js.map +1 -0
- package/dist/shared/{chunk-6R76KIHZ.js → chunk-FLOMNC6J.js} +2 -1
- package/dist/shared/chunk-FLOMNC6J.js.map +1 -0
- package/dist/shared/{chunk-EVDZ2KND.js → chunk-G5CJU6RD.js} +2 -1
- package/dist/shared/chunk-G5CJU6RD.js.map +1 -0
- package/dist/shared/{chunk-MVCVVKBY.js → chunk-GACHLACT.js} +2 -1
- package/dist/shared/chunk-GACHLACT.js.map +1 -0
- package/dist/shared/{chunk-X62OEAE6.js → chunk-GLS7HPIZ.js} +1 -0
- package/dist/shared/chunk-GLS7HPIZ.js.map +1 -0
- package/dist/shared/{chunk-COT2ROEH.js → chunk-GOMXZC4B.js} +2 -1
- package/dist/shared/chunk-GOMXZC4B.js.map +1 -0
- package/dist/shared/{chunk-L2HOZVBC.js → chunk-GPEMPZXK.js} +1 -0
- package/dist/shared/chunk-GPEMPZXK.js.map +1 -0
- package/dist/shared/{chunk-IFEIRRZ2.js → chunk-HAGKVQOW.js} +1 -0
- package/dist/shared/chunk-HAGKVQOW.js.map +1 -0
- package/dist/shared/{chunk-ILIWVWHC.js → chunk-I3VL6SRH.js} +2 -1
- package/dist/shared/chunk-I3VL6SRH.js.map +1 -0
- package/dist/shared/{chunk-2NLDX5FG.js → chunk-IKC3FK7L.js} +2 -1
- package/dist/shared/chunk-IKC3FK7L.js.map +1 -0
- package/dist/shared/{chunk-STDCM2KD.js → chunk-IKHZD2JH.js} +2 -1
- package/dist/shared/chunk-IKHZD2JH.js.map +1 -0
- package/dist/shared/{chunk-NKIEDT7V.js → chunk-IUXCWWGO.js} +1 -0
- package/dist/shared/chunk-IUXCWWGO.js.map +1 -0
- package/dist/shared/{chunk-SFKZAUPW.js → chunk-JMN3HTZU.js} +1 -0
- package/dist/shared/chunk-JMN3HTZU.js.map +1 -0
- package/dist/shared/{chunk-VLXZMESE.js → chunk-KBHDY425.js} +1 -0
- package/dist/shared/chunk-KBHDY425.js.map +1 -0
- package/dist/shared/{chunk-5WY7LYXK.js → chunk-KFM6KXSE.js} +1 -0
- package/dist/shared/chunk-KFM6KXSE.js.map +1 -0
- package/dist/shared/{chunk-7QFMCLUL.js → chunk-KLD3P5XH.js} +1 -0
- package/dist/shared/chunk-KLD3P5XH.js.map +1 -0
- package/dist/shared/{chunk-6L3Z5SZQ.js → chunk-KO5FPOWZ.js} +1 -0
- package/dist/shared/chunk-KO5FPOWZ.js.map +1 -0
- package/dist/shared/{chunk-YIFNKP4J.js → chunk-KSEURRVZ.js} +1 -0
- package/dist/shared/chunk-KSEURRVZ.js.map +1 -0
- package/dist/shared/{chunk-HP7CZB2F.js → chunk-KYY3PHP7.js} +1 -0
- package/dist/shared/chunk-KYY3PHP7.js.map +1 -0
- package/dist/shared/{chunk-ARYG4XMX.js → chunk-NJGXC7D6.js} +2 -1
- package/dist/shared/chunk-NJGXC7D6.js.map +1 -0
- package/dist/shared/{chunk-SFDRAHYP.js → chunk-NM5MMPCF.js} +2 -1
- package/dist/shared/chunk-NM5MMPCF.js.map +1 -0
- package/dist/shared/{chunk-GXNHF6J5.js → chunk-OGBMYMZD.js} +2 -1
- package/dist/shared/chunk-OGBMYMZD.js.map +1 -0
- package/dist/shared/{chunk-HSRXUIVM.js → chunk-OHNYCXPX.js} +2 -1
- package/dist/shared/chunk-OHNYCXPX.js.map +1 -0
- package/dist/shared/{chunk-MPBYGS6W.js → chunk-OIY3EPHO.js} +1 -0
- package/dist/shared/chunk-OIY3EPHO.js.map +1 -0
- package/dist/shared/{chunk-L42YBY5I.js → chunk-PIG623TZ.js} +1 -0
- package/dist/shared/chunk-PIG623TZ.js.map +1 -0
- package/dist/shared/chunk-PLSV746R.js +4 -0
- package/dist/shared/chunk-PLSV746R.js.map +1 -0
- package/dist/shared/chunk-PSCN3VVA.js +4 -0
- package/dist/shared/chunk-PSCN3VVA.js.map +1 -0
- package/dist/shared/{chunk-3P36LG6T.js → chunk-PSTFJ5IJ.js} +2 -1
- package/dist/shared/chunk-PSTFJ5IJ.js.map +1 -0
- package/dist/shared/{chunk-TH5SONR6.js → chunk-PXI7AHWS.js} +2 -1
- package/dist/shared/chunk-PXI7AHWS.js.map +1 -0
- package/dist/shared/{chunk-AMQAGDFH.js → chunk-Q4H4QEMB.js} +1 -0
- package/dist/shared/chunk-Q4H4QEMB.js.map +1 -0
- package/dist/shared/{chunk-LEWKHCRI.js → chunk-QGYZ7CG5.js} +2 -1
- package/dist/shared/chunk-QGYZ7CG5.js.map +1 -0
- package/dist/shared/{chunk-US53TNMK.js → chunk-QWGUMKZC.js} +2 -1
- package/dist/shared/chunk-QWGUMKZC.js.map +1 -0
- package/dist/shared/{chunk-5X5SX5N7.js → chunk-QX6OGRRT.js} +2 -1
- package/dist/shared/chunk-QX6OGRRT.js.map +1 -0
- package/dist/shared/{chunk-VDX2J22H.js → chunk-R6ATC4TC.js} +2 -1
- package/dist/shared/chunk-R6ATC4TC.js.map +1 -0
- package/dist/shared/{chunk-WXKRIUTA.js → chunk-RDZK73KV.js} +1 -0
- package/dist/shared/chunk-RDZK73KV.js.map +1 -0
- package/dist/shared/{chunk-4GIZ6WSG.js → chunk-RJYZ5FAR.js} +2 -1
- package/dist/shared/chunk-RJYZ5FAR.js.map +1 -0
- package/dist/shared/{chunk-3QOAHMV4.js → chunk-SQ5T4AT5.js} +2 -1
- package/dist/shared/chunk-SQ5T4AT5.js.map +1 -0
- package/dist/shared/{chunk-DKNOZLA6.js → chunk-SWLUQVK7.js} +2 -1
- package/dist/shared/chunk-SWLUQVK7.js.map +1 -0
- package/dist/shared/{chunk-QGFQA7OZ.js → chunk-SXHDQ64Z.js} +2 -1
- package/dist/shared/chunk-SXHDQ64Z.js.map +1 -0
- package/dist/shared/{chunk-UDQWYGSO.js → chunk-SY6DZLTC.js} +2 -1
- package/dist/shared/chunk-SY6DZLTC.js.map +1 -0
- package/dist/shared/{chunk-RJZZWCBD.js → chunk-VEDQV5XO.js} +1 -0
- package/dist/shared/chunk-VEDQV5XO.js.map +1 -0
- package/dist/shared/{chunk-JRCVYDCD.js → chunk-W33JMRRN.js} +2 -1
- package/dist/shared/chunk-W33JMRRN.js.map +1 -0
- package/dist/shared/{chunk-Y3X4F4YJ.js → chunk-WBZW5LVH.js} +2 -1
- package/dist/shared/chunk-WBZW5LVH.js.map +1 -0
- package/dist/shared/{chunk-SDS4QU72.js → chunk-WHTPGWUV.js} +2 -1
- package/dist/shared/chunk-WHTPGWUV.js.map +1 -0
- package/dist/shared/{chunk-LT4CW2F7.js → chunk-WYVJE6J5.js} +2 -1
- package/dist/shared/chunk-WYVJE6J5.js.map +1 -0
- package/dist/shared/{chunk-QDJQAZIA.js → chunk-ZA3GAB4H.js} +2 -1
- package/dist/shared/chunk-ZA3GAB4H.js.map +1 -0
- package/dist/shared/{chunk-2CYAFF56.js → chunk-ZFCUSWMT.js} +1 -0
- package/dist/shared/chunk-ZFCUSWMT.js.map +1 -0
- package/dist/shared/{chunk-UCR2UZOY.js → chunk-ZQPXQCY2.js} +2 -1
- package/dist/shared/chunk-ZQPXQCY2.js.map +1 -0
- package/dist/shared/{chunk-DHSWVVMI.js → chunk-ZTZJHY4E.js} +2 -1
- package/dist/shared/chunk-ZTZJHY4E.js.map +1 -0
- package/dist/shared/context.js +1 -0
- package/dist/shared/context.js.map +1 -0
- package/dist/shared/datarecords/external/airtable/handler.js +1 -0
- package/dist/shared/datarecords/external/airtable/handler.js.map +1 -0
- package/dist/shared/datarecords/external/airtable/oauth/config.js +1 -0
- package/dist/shared/datarecords/external/airtable/oauth/config.js.map +1 -0
- package/dist/shared/datarecords/external/airtable/types.js +2 -1
- package/dist/shared/datarecords/external/airtable/types.js.map +1 -0
- package/dist/shared/datarecords/external/generic-webhook/handler.js +1 -0
- package/dist/shared/datarecords/external/generic-webhook/handler.js.map +1 -0
- package/dist/shared/datarecords/external/generic-webhook/options.js +1 -0
- package/dist/shared/datarecords/external/generic-webhook/options.js.map +1 -0
- package/dist/shared/datarecords/external/google/oauth/config.js +1 -0
- package/dist/shared/datarecords/external/google/oauth/config.js.map +1 -0
- package/dist/shared/datarecords/external/google/sheets/client.js +2 -1
- package/dist/shared/datarecords/external/google/sheets/client.js.map +1 -0
- package/dist/shared/datarecords/external/google/sheets/handler.js +2 -1
- package/dist/shared/datarecords/external/google/sheets/handler.js.map +1 -0
- package/dist/shared/datarecords/external/google/sheets/types.js +2 -1
- package/dist/shared/datarecords/external/google/sheets/types.js.map +1 -0
- package/dist/shared/datarecords/external/notion/handler.js +1 -0
- package/dist/shared/datarecords/external/notion/handler.js.map +1 -0
- package/dist/shared/datarecords/external/notion/oauth/config.js +1 -0
- package/dist/shared/datarecords/external/notion/oauth/config.js.map +1 -0
- package/dist/shared/datarecords/external/notion/types.js +2 -1
- package/dist/shared/datarecords/external/notion/types.js.map +1 -0
- package/dist/shared/datarecords/types.js +2 -1
- package/dist/shared/datarecords/types.js.map +1 -0
- package/dist/shared/datarecords.js +1 -0
- package/dist/shared/datarecords.js.map +1 -0
- package/dist/shared/datasources/external/facebook/posts/fetcher.js +2 -1
- package/dist/shared/datasources/external/facebook/posts/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/facebook/posts/schema.js +1 -0
- package/dist/shared/datasources/external/facebook/posts/schema.js.map +1 -0
- package/dist/shared/datasources/external/http-json/fetcher.js +2 -1
- package/dist/shared/datasources/external/http-json/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/http-json/options.js +1 -0
- package/dist/shared/datasources/external/http-json/options.js.map +1 -0
- package/dist/shared/datasources/external/http-json/schema.js +1 -0
- package/dist/shared/datasources/external/http-json/schema.js.map +1 -0
- package/dist/shared/datasources/external/instagram/feed/fetcher.js +2 -1
- package/dist/shared/datasources/external/instagram/feed/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/instagram/feed/schema.js +1 -0
- package/dist/shared/datasources/external/instagram/feed/schema.js.map +1 -0
- package/dist/shared/datasources/external/mastodon/account/fetcher.js +2 -1
- package/dist/shared/datasources/external/mastodon/account/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/mastodon/account/schema.js +2 -1
- package/dist/shared/datasources/external/mastodon/account/schema.js.map +1 -0
- package/dist/shared/datasources/external/mastodon/options.js +1 -0
- package/dist/shared/datasources/external/mastodon/options.js.map +1 -0
- package/dist/shared/datasources/external/mastodon/status/fetcher.js +2 -1
- package/dist/shared/datasources/external/mastodon/status/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/mastodon/status/sample.array.js +1 -0
- package/dist/shared/datasources/external/mastodon/status/sample.array.js.map +1 -0
- package/dist/shared/datasources/external/mastodon/status/sample.single.js +1 -0
- package/dist/shared/datasources/external/mastodon/status/sample.single.js.map +1 -0
- package/dist/shared/datasources/external/mastodon/status/schema.js +2 -1
- package/dist/shared/datasources/external/mastodon/status/schema.js.map +1 -0
- package/dist/shared/datasources/external/meta/oauth/config.js +2 -1
- package/dist/shared/datasources/external/meta/oauth/config.js.map +1 -0
- package/dist/shared/datasources/external/meta/options.js +1 -0
- package/dist/shared/datasources/external/meta/options.js.map +1 -0
- package/dist/shared/datasources/external/rss/fetcher.js +2 -1
- package/dist/shared/datasources/external/rss/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/rss/options.js +1 -0
- package/dist/shared/datasources/external/rss/options.js.map +1 -0
- package/dist/shared/datasources/external/rss/schema.js +2 -1
- package/dist/shared/datasources/external/rss/schema.js.map +1 -0
- package/dist/shared/datasources/external/threads/media/fetcher.js +2 -1
- package/dist/shared/datasources/external/threads/media/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/threads/media/schema.js +1 -0
- package/dist/shared/datasources/external/threads/media/schema.js.map +1 -0
- package/dist/shared/datasources/external/tiktok/oauth/config.js +2 -1
- package/dist/shared/datasources/external/tiktok/oauth/config.js.map +1 -0
- package/dist/shared/datasources/external/tiktok/video/fetcher.js +2 -1
- package/dist/shared/datasources/external/tiktok/video/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/tiktok/video/options.js +1 -0
- package/dist/shared/datasources/external/tiktok/video/options.js.map +1 -0
- package/dist/shared/datasources/external/tiktok/video/schema.js +1 -0
- package/dist/shared/datasources/external/tiktok/video/schema.js.map +1 -0
- package/dist/shared/datasources/external/youtube/list/fetcher.js +2 -1
- package/dist/shared/datasources/external/youtube/list/fetcher.js.map +1 -0
- package/dist/shared/datasources/external/youtube/list/options.js +1 -0
- package/dist/shared/datasources/external/youtube/list/options.js.map +1 -0
- package/dist/shared/datasources/external/youtube/list/schema.js +2 -1
- package/dist/shared/datasources/external/youtube/list/schema.js.map +1 -0
- package/dist/shared/datasources/external/youtube/oauth/config.js +2 -1
- package/dist/shared/datasources/external/youtube/oauth/config.js.map +1 -0
- package/dist/shared/datasources/fetcher.js +1 -0
- package/dist/shared/datasources/fetcher.js.map +1 -0
- package/dist/shared/datasources/internal/blog/schema.js +1 -0
- package/dist/shared/datasources/internal/blog/schema.js.map +1 -0
- package/dist/shared/datasources/internal/changelog/schema.js +1 -0
- package/dist/shared/datasources/internal/changelog/schema.js.map +1 -0
- package/dist/shared/datasources/internal/contact-info/schema.js +2 -1
- package/dist/shared/datasources/internal/contact-info/schema.js.map +1 -0
- package/dist/shared/datasources/internal/cv/schema.js +1 -0
- package/dist/shared/datasources/internal/cv/schema.js.map +1 -0
- package/dist/shared/datasources/internal/faq/schema.js +1 -0
- package/dist/shared/datasources/internal/faq/schema.js.map +1 -0
- package/dist/shared/datasources/internal/job-board/schema.js +1 -0
- package/dist/shared/datasources/internal/job-board/schema.js.map +1 -0
- package/dist/shared/datasources/internal/links/schema.js +2 -1
- package/dist/shared/datasources/internal/links/schema.js.map +1 -0
- package/dist/shared/datasources/internal/recipes/schema.js +1 -0
- package/dist/shared/datasources/internal/recipes/schema.js.map +1 -0
- package/dist/shared/datasources/internal/restaurant/schema.js +1 -0
- package/dist/shared/datasources/internal/restaurant/schema.js.map +1 -0
- package/dist/shared/datasources/samples.js +1 -0
- package/dist/shared/datasources/samples.js.map +1 -0
- package/dist/shared/datasources/schemas.js +2 -1
- package/dist/shared/datasources/schemas.js.map +1 -0
- package/dist/shared/datasources/types.js +2 -1
- package/dist/shared/datasources/types.js.map +1 -0
- package/dist/shared/datasources/utils.js +2 -1
- package/dist/shared/datasources/utils.js.map +1 -0
- package/dist/shared/datasources.js +1 -0
- package/dist/shared/datasources.js.map +1 -0
- package/dist/shared/env.js +1 -0
- package/dist/shared/env.js.map +1 -0
- package/dist/shared/errors.js +2 -1
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/images.js +2 -1
- package/dist/shared/images.js.map +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/layout-constants.js +1 -0
- package/dist/shared/layout-constants.js.map +1 -0
- package/dist/shared/manifest.js +1 -0
- package/dist/shared/manifest.js.map +1 -0
- package/dist/shared/oauth.js +2 -1
- package/dist/shared/oauth.js.map +1 -0
- package/dist/shared/page.js +2 -1
- package/dist/shared/page.js.map +1 -0
- package/dist/shared/prompt.js +2 -1
- package/dist/shared/prompt.js.map +1 -0
- package/dist/shared/responsive.js +2 -1
- package/dist/shared/responsive.js.map +1 -0
- package/dist/shared/site.js +2 -1
- package/dist/shared/site.js.map +1 -0
- package/dist/shared/sitemap.js +2 -1
- package/dist/shared/sitemap.js.map +1 -0
- package/dist/shared/social-icons.js +1 -0
- package/dist/shared/social-icons.js.map +1 -0
- package/dist/shared/theme.js +2 -1
- package/dist/shared/theme.js.map +1 -0
- package/dist/shared/themes/color-system.js +1 -0
- package/dist/shared/themes/color-system.js.map +1 -0
- package/dist/shared/utils/canvas-data-uri.js +1 -0
- package/dist/shared/utils/canvas-data-uri.js.map +1 -0
- package/dist/shared/utils/invariant.js +2 -1
- package/dist/shared/utils/invariant.js.map +1 -0
- package/dist/shared/utils/json-date.js +2 -1
- package/dist/shared/utils/json-date.js.map +1 -0
- package/dist/shared/utils/llm.js +2 -1
- package/dist/shared/utils/llm.js.map +1 -0
- package/dist/shared/utils/merge.js +2 -1
- package/dist/shared/utils/merge.js.map +1 -0
- package/dist/shared/utils/object-hash.js +1 -0
- package/dist/shared/utils/object-hash.js.map +1 -0
- package/dist/shared/utils/schema.js +2 -1
- package/dist/shared/utils/schema.js.map +1 -0
- package/dist/shared/utils/string-enum.js +2 -1
- package/dist/shared/utils/string-enum.js.map +1 -0
- package/dist/shared/utils/try-catch.js +1 -0
- package/dist/shared/utils/try-catch.js.map +1 -0
- package/dist/shared/utils/typed-ref.js +2 -1
- package/dist/shared/utils/typed-ref.js.map +1 -0
- package/package.json +2 -2
- package/src/shared/ai/types.ts +4 -0
- package/src/shared/bricks/manifests/icon.manifest.ts +1 -1
- package/src/shared/theme.ts +7 -7
- package/src/shared/themes/tests/color-system.test.ts +5 -1
- package/dist/shared/chunk-NXIF3UMD.js +0 -3
- package/dist/shared/chunk-TCTVRT4O.js +0 -3
- package/dist/shared/chunk-VE3S4LGT.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/sitemap.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\nimport { StringEnum } from \"./utils/string-enum\";\nimport { pageSchema } from \"./page\";\nimport { toLLMSchema } from \"./utils/llm\";\n\nexport const sitemapPageEntry = Type.Pick(pageSchema, [\"id\", \"label\", \"path\", \"attributes\"]);\nexport type SitemapPageEntry = Static<typeof sitemapPageEntry>;\n\nexport const sectionsPlanSchema = Type.Array(\n Type.Object(\n {\n id: Type.String({\n title: \"Section ID\",\n examples: [\"header-section\", \"hero-section\", \"features-section\"],\n format: \"slug\",\n }),\n name: Type.String({ title: \"Section name\", examples: [\"Header\", \"Hero\", \"Features\"] }),\n description: Type.String({\n title: \"A long description of the section\",\n description: `You must elaborate a clear and detailled plan that describes:\n- The section purpose in the page, in detail.\n- The section structure, look & feel, and structural/design organization, in detail\n- the types of bricks (e.g. \"container\", \"text\", \"video\", \"carousel\", etc) that will be used and their purpose, in detail\n\nIMPORTANT: be very descriptive and precise in your plan. The more details you provide, the better the generated page will be.`,\n\n examples: [\n \"This section contains a `hero` and a call-to-action `button`. All of theme aligned horizontally. The section should market a coffee shop.\",\n \"This section should contain a `hero` text and an `image`.\",\n ],\n }),\n },\n { additionalProperties: false },\n ),\n {\n title: \"Sections plan\",\n description: \"A plan for the sections of the page. Used to generate the page content.\",\n examples: [\n [\n {\n id: \"header-section\",\n name: \"Header\",\n description: \"This section only contains a header brick\",\n },\n {\n id: \"hero-section\",\n name: \"Hero\",\n description:\n \"This is the hero section of the page. It should display a marketing message using a hero brick, as well as a button (CTA). The section should center bricks horizontally.\",\n },\n ],\n ],\n },\n);\n\nexport const sitemapEntry = Type.Composite(\n [\n sitemapPageEntry,\n Type.Object({\n status: Type.Optional(\n StringEnum([\"draft\", \"published\"], {\n title: \"Page status\",\n enumNames: [\"Draft\", \"Published\"],\n default: \"draft\",\n \"ai:hidden\": true,\n description:\n \"The status of the page. Can be draft or published. [AI instructions: Dont generate this.]\",\n \"ai:instructions\": \"Upsie: Never generate this optional field.\",\n }),\n ),\n }),\n ],\n {\n description: \"Pages map. The complete list of site pages & their metadata\",\n additionalProperties: false,\n },\n);\n\nexport const sitemapSchema = Type.Array(sitemapEntry);\nexport type Sitemap = Static<typeof sitemapSchema>;\n\nexport function getSitemapSchemaForLLM() {\n return toLLMSchema(\n Type.Array(\n Type.Composite([\n sitemapEntry,\n Type.Object({\n // Sections plan helps agents to the structure and content of the page\n sectionsPlan: sectionsPlanSchema,\n }),\n ]),\n ),\n );\n}\n\nexport function getSitemapSchemaNoPlansForLLM() {\n return toLLMSchema(sitemapSchema);\n}\n"],"mappings":";;mHAAA,OAAS,QAAAA,MAAyB,oBAK3B,IAAMC,EAAmBC,EAAK,KAAKC,EAAY,CAAC,KAAM,QAAS,OAAQ,YAAY,CAAC,EAG9EC,EAAqBF,EAAK,MACrCA,EAAK,OACH,CACE,GAAIA,EAAK,OAAO,CACd,MAAO,aACP,SAAU,CAAC,iBAAkB,eAAgB,kBAAkB,EAC/D,OAAQ,MACV,CAAC,EACD,KAAMA,EAAK,OAAO,CAAE,MAAO,eAAgB,SAAU,CAAC,SAAU,OAAQ,UAAU,CAAE,CAAC,EACrF,YAAaA,EAAK,OAAO,CACvB,MAAO,oCACP,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA,+HAOb,SAAU,CACR,4IACA,2DACF,CACF,CAAC,CACH,EACA,CAAE,qBAAsB,EAAM,CAChC,EACA,CACE,MAAO,gBACP,YAAa,0EACb,SAAU,CACR,CACE,CACE,GAAI,iBACJ,KAAM,SACN,YAAa,2CACf,EACA,CACE,GAAI,eACJ,KAAM,OACN,YACE,2KACJ,CACF,CACF,CACF,CACF,EAEaG,EAAeH,EAAK,UAC/B,CACED,EACAC,EAAK,OAAO,CACV,OAAQA,EAAK,SACXI,EAAW,CAAC,QAAS,WAAW,EAAG,CACjC,MAAO,cACP,UAAW,CAAC,QAAS,WAAW,EAChC,QAAS,QACT,YAAa,GACb,YACE,4FACF,kBAAmB,4CACrB,CAAC,CACH,CACF,CAAC,CACH,EACA,CACE,YAAa,8DACb,qBAAsB,EACxB,CACF,EAEaC,EAAgBL,EAAK,MAAMG,CAAY,EAG7C,SAASG,GAAyB,CACvC,OAAOC,EACLP,EAAK,MACHA,EAAK,UAAU,CACbG,EACAH,EAAK,OAAO,CAEV,aAAcE,CAChB,CAAC,CACH,CAAC,CACH,CACF,CACF,CAEO,SAASM,GAAgC,CAC9C,OAAOD,EAAYF,CAAa,CAClC","names":["Type","sitemapPageEntry","Type","pageSchema","sectionsPlanSchema","sitemapEntry","StringEnum","sitemapSchema","getSitemapSchemaForLLM","toLLMSchema","getSitemapSchemaNoPlansForLLM"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
3
|
var n=class{accessToken;constructor(e){this.accessToken=e}async callDriveApi(e,i="GET",a){let o=a instanceof ArrayBuffer||a instanceof Uint8Array,r={Authorization:`Bearer ${this.accessToken}`};o?r["Content-Type"]="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":r["Content-Type"]="application/json";let s=await fetch(e,{method:i,headers:r,body:o?a:a?JSON.stringify(a):void 0});if(e.includes("export")&&e.includes("mimeType=text/csv")){let t=await s.text();return{success:s.ok,data:t,status:s.status,headers:s.headers}}if(e.includes("export")&&e.includes("mimeType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")){let t=await s.arrayBuffer();return{success:s.ok,data:t,status:s.status,headers:s.headers}}if(e.includes("upload/")&&s.ok)try{let t=await s.json();return{success:s.ok,data:t,status:s.status,headers:s.headers}}catch{return{success:!0,data:{message:"Upload successful"},status:s.status,headers:s.headers}}if(!s.ok&&s.headers.get("content-type")?.includes("text/html"))return{success:!1,data:{error:"HTML error response",details:(await s.text()).substring(0,200)},status:s.status,headers:s.headers};let u=await s.json();return{success:s.ok,data:u,status:s.status,headers:s.headers}}};function d(c){return new n(c)}export{d as a};
|
|
4
|
+
//# sourceMappingURL=chunk-ZFCUSWMT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/datarecords/external/google/sheets/client.ts"],"sourcesContent":["interface ApiResponse<T> {\n success: boolean;\n data: T;\n status: number;\n headers: Headers;\n}\n\nclass GoogleDriveClient {\n private accessToken: string;\n\n constructor(accessToken: string) {\n this.accessToken = accessToken;\n }\n\n async callDriveApi<T>(\n endpoint: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" = \"GET\",\n body?: unknown,\n ): Promise<ApiResponse<T>> {\n // Handle binary data for uploads\n const isBinaryUpload = body instanceof ArrayBuffer || body instanceof Uint8Array;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.accessToken}`,\n };\n\n if (!isBinaryUpload) {\n headers[\"Content-Type\"] = \"application/json\";\n } else {\n headers[\"Content-Type\"] = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n }\n\n const response = await fetch(endpoint, {\n method,\n headers,\n body: isBinaryUpload ? (body as BodyInit) : body ? JSON.stringify(body) : undefined,\n });\n\n // Handle CSV responses\n if (endpoint.includes(\"export\") && endpoint.includes(\"mimeType=text/csv\")) {\n const csvText = await response.text();\n return {\n success: response.ok,\n data: csvText as T,\n status: response.status,\n headers: response.headers,\n };\n }\n\n // Handle binary responses (like XLSX downloads) - keeping for compatibility\n if (\n endpoint.includes(\"export\") &&\n endpoint.includes(\"mimeType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\")\n ) {\n const arrayBuffer = await response.arrayBuffer();\n return {\n success: response.ok,\n data: arrayBuffer as T,\n status: response.status,\n headers: response.headers,\n };\n }\n\n // Handle upload responses which might not be JSON\n if (endpoint.includes(\"upload/\") && response.ok) {\n // For successful uploads, try to parse JSON, but fallback gracefully\n try {\n const data = await response.json();\n return {\n success: response.ok,\n data,\n status: response.status,\n headers: response.headers,\n };\n } catch {\n // If JSON parsing fails but response is ok, return success\n return {\n success: true,\n data: { message: \"Upload successful\" } as T,\n status: response.status,\n headers: response.headers,\n };\n }\n }\n\n // Handle error responses that might be HTML\n if (!response.ok) {\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"text/html\")) {\n const errorText = await response.text();\n return {\n success: false,\n data: { error: \"HTML error response\", details: errorText.substring(0, 200) } as T,\n status: response.status,\n headers: response.headers,\n };\n }\n }\n\n const data = await response.json();\n\n return {\n success: response.ok,\n data,\n status: response.status,\n headers: response.headers,\n };\n }\n}\n\nexport default function getClient(accessToken: string): GoogleDriveClient {\n return new GoogleDriveClient(accessToken);\n}\n"],"mappings":";;AAOA,IAAMA,EAAN,KAAwB,CACd,YAER,YAAYC,EAAqB,CAC/B,KAAK,YAAcA,CACrB,CAEA,MAAM,aACJC,EACAC,EAA2C,MAC3CC,EACyB,CAEzB,IAAMC,EAAiBD,aAAgB,aAAeA,aAAgB,WAChEE,EAAkC,CACtC,cAAe,UAAU,KAAK,WAAW,EAC3C,EAEKD,EAGHC,EAAQ,cAAc,EAAI,oEAF1BA,EAAQ,cAAc,EAAI,mBAK5B,IAAMC,EAAW,MAAM,MAAML,EAAU,CACrC,OAAAC,EACA,QAAAG,EACA,KAAMD,EAAkBD,EAAoBA,EAAO,KAAK,UAAUA,CAAI,EAAI,MAC5E,CAAC,EAGD,GAAIF,EAAS,SAAS,QAAQ,GAAKA,EAAS,SAAS,mBAAmB,EAAG,CACzE,IAAMM,EAAU,MAAMD,EAAS,KAAK,EACpC,MAAO,CACL,QAASA,EAAS,GAClB,KAAMC,EACN,OAAQD,EAAS,OACjB,QAASA,EAAS,OACpB,CACF,CAGA,GACEL,EAAS,SAAS,QAAQ,GAC1BA,EAAS,SAAS,4EAA4E,EAC9F,CACA,IAAMO,EAAc,MAAMF,EAAS,YAAY,EAC/C,MAAO,CACL,QAASA,EAAS,GAClB,KAAME,EACN,OAAQF,EAAS,OACjB,QAASA,EAAS,OACpB,CACF,CAGA,GAAIL,EAAS,SAAS,SAAS,GAAKK,EAAS,GAE3C,GAAI,CACF,IAAMG,EAAO,MAAMH,EAAS,KAAK,EACjC,MAAO,CACL,QAASA,EAAS,GAClB,KAAAG,EACA,OAAQH,EAAS,OACjB,QAASA,EAAS,OACpB,CACF,MAAQ,CAEN,MAAO,CACL,QAAS,GACT,KAAM,CAAE,QAAS,mBAAoB,EACrC,OAAQA,EAAS,OACjB,QAASA,EAAS,OACpB,CACF,CAIF,GAAI,CAACA,EAAS,IACQA,EAAS,QAAQ,IAAI,cAAc,GACtC,SAAS,WAAW,EAEnC,MAAO,CACL,QAAS,GACT,KAAM,CAAE,MAAO,sBAAuB,SAHtB,MAAMA,EAAS,KAAK,GAGqB,UAAU,EAAG,GAAG,CAAE,EAC3E,OAAQA,EAAS,OACjB,QAASA,EAAS,OACpB,EAIJ,IAAMG,EAAO,MAAMH,EAAS,KAAK,EAEjC,MAAO,CACL,QAASA,EAAS,GAClB,KAAAG,EACA,OAAQH,EAAS,OACjB,QAASA,EAAS,OACpB,CACF,CACF,EAEe,SAARI,EAA2BV,EAAwC,CACxE,OAAO,IAAID,EAAkBC,CAAW,CAC1C","names":["GoogleDriveClient","accessToken","endpoint","method","body","isBinaryUpload","headers","response","csvText","arrayBuffer","data","getClient"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a as r}from"./chunk-
|
|
3
|
+
import{a as r}from"./chunk-GPEMPZXK.js";import{b as i}from"./chunk-GLS7HPIZ.js";import{a}from"./chunk-IUXCWWGO.js";import{Type as e}from"@sinclair/typebox";var f=e.Union([e.Literal("airtable"),e.Literal("google-sheets"),e.Literal("notion"),e.Literal("internal")]),o=e.Object({provider:e.Literal("internal"),schema:e.Any({title:"Schema",description:"JSON Schema of the datarecord. Always of type 'object' and representing a row that will be saved in the database.",examples:[{type:"object",properties:{firstname:{type:"string",title:"Firstname"},lastname:{type:"string",title:"Lastname"},email:{type:"string",format:"email",title:"Email"}},required:["email"],title:"Newsletter Subscription"}]}),indexes:e.Array(e.Object({name:e.String({title:"Index name"}),fields:e.Array(e.String(),{title:"Fields to index"}),unique:e.Optional(e.Boolean({title:"Unique index",default:!1}))},{examples:[{name:"unique_email_index",fields:["email"],unique:!0},{name:"lastname_index",fields:["lastname"]}]}),{title:"Indexes",description:"IMPORTANT: Indexes to create on the datarecord. use it to enforce uniqueness or improve query performance."})},{examples:[{provider:"internal",schema:{type:"object",properties:{firstname:{type:"string",title:"Firstname"},lastname:{type:"string",title:"Lastname"},email:{type:"string",format:"email",title:"Email"}},required:["email"],title:"Newsletter Subscription"},indexes:[{name:"email_index",fields:["email"],unique:!0}]}]}),t=e.Object({schema:e.Any({title:"Schema",description:"JSON Schema of the datarecord. Always of type 'object' and representing a row that will be saved.",examples:[{type:"object",properties:{firstname:{type:"string",title:"Firstname"},lastname:{type:"string",title:"Lastname"},email:{type:"string",format:"email",title:"Email"}},required:["email"],title:"Newsletter Subscription"}]})}),s=e.Union([e.Composite([e.Object({provider:e.Literal("airtable"),options:i}),t]),e.Composite([e.Object({provider:e.Literal("google-sheets"),options:r}),t]),e.Composite([e.Object({provider:e.Literal("notion"),options:a}),t]),o]),n=e.Object({id:e.String({title:"Datarecord ID",comment:"A unique identifier for the datarecord, e.g., 'newsletter_subscriptions'"}),label:e.String({title:"Name of the datarecord",comment:"For example, 'Newsletter Subscriptions'"}),description:e.Optional(e.String({title:"Description of the datarecord"}))}),l=e.Composite([s,n]),y=e.Composite([n,o]),u=e.Array(l);export{f as a,s as b,y as c,u as d};
|
|
4
|
+
//# sourceMappingURL=chunk-ZQPXQCY2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/datarecords/types.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\nimport { airtableOptions } from \"./external/airtable/types\";\nimport { genericWebhookOptions } from \"./external/generic-webhook/options\";\nimport { googleSheetsOptions } from \"./external/google/sheets/types\";\nimport { notionOptions } from \"./external/notion/types\";\n\nexport const connectorSchema = Type.Union([\n Type.Literal(\"airtable\"),\n Type.Literal(\"google-sheets\"),\n Type.Literal(\"notion\"),\n // Type.Literal(\"generic-webhook\"),\n // saved to Upstart platform\n Type.Literal(\"internal\"),\n]);\n\nexport type DatarecordConnector = Static<typeof connectorSchema>;\n\nconst internalDatarecord = Type.Object(\n {\n provider: Type.Literal(\"internal\"),\n // options: Type.Optional(Type.Any()),\n schema: Type.Any({\n title: \"Schema\",\n description:\n \"JSON Schema of the datarecord. Always of type 'object' and representing a row that will be saved in the database.\",\n examples: [\n {\n type: \"object\",\n properties: {\n firstname: { type: \"string\", title: \"Firstname\" },\n lastname: { type: \"string\", title: \"Lastname\" },\n email: { type: \"string\", format: \"email\", title: \"Email\" },\n },\n required: [\"email\"],\n title: \"Newsletter Subscription\",\n },\n ],\n }),\n indexes: Type.Array(\n Type.Object(\n {\n name: Type.String({ title: \"Index name\" }),\n fields: Type.Array(Type.String(), { title: \"Fields to index\" }),\n unique: Type.Optional(Type.Boolean({ title: \"Unique index\", default: false })),\n },\n {\n examples: [\n {\n name: \"unique_email_index\",\n fields: [\"email\"],\n unique: true,\n },\n {\n name: \"lastname_index\",\n fields: [\"lastname\"],\n },\n ],\n },\n ),\n {\n title: \"Indexes\",\n description:\n \"IMPORTANT: Indexes to create on the datarecord. use it to enforce uniqueness or improve query performance.\",\n },\n ),\n },\n {\n examples: [\n {\n provider: \"internal\",\n schema: {\n type: \"object\",\n properties: {\n firstname: { type: \"string\", title: \"Firstname\" },\n lastname: { type: \"string\", title: \"Lastname\" },\n email: { type: \"string\", format: \"email\", title: \"Email\" },\n },\n required: [\"email\"],\n title: \"Newsletter Subscription\",\n },\n indexes: [\n {\n name: \"email_index\",\n fields: [\"email\"],\n unique: true,\n },\n ],\n },\n ],\n },\n);\n\n// Schema commun à tous les datarecords\nconst commonDatarecordSchema = Type.Object({\n schema: Type.Any({\n title: \"Schema\",\n description:\n \"JSON Schema of the datarecord. Always of type 'object' and representing a row that will be saved.\",\n examples: [\n {\n type: \"object\",\n properties: {\n firstname: { type: \"string\", title: \"Firstname\" },\n lastname: { type: \"string\", title: \"Lastname\" },\n email: { type: \"string\", format: \"email\", title: \"Email\" },\n },\n required: [\"email\"],\n title: \"Newsletter Subscription\",\n },\n ],\n }),\n});\n\nexport const datarecordsConnectors = Type.Union([\n Type.Composite([\n Type.Object({\n provider: Type.Literal(\"airtable\"),\n options: airtableOptions,\n }),\n commonDatarecordSchema,\n ]),\n Type.Composite([\n Type.Object({\n provider: Type.Literal(\"google-sheets\"),\n options: googleSheetsOptions,\n }),\n commonDatarecordSchema,\n ]),\n Type.Composite([\n Type.Object({\n provider: Type.Literal(\"notion\"),\n options: notionOptions,\n }),\n commonDatarecordSchema,\n ]),\n // Type.Composite([\n // Type.Object({\n // provider: Type.Literal(\"generic-webhook\"),\n // options: genericWebhookOptions,\n // }),\n // commonDatarecordSchema,\n // ]),\n internalDatarecord,\n]);\n\nconst datarecordMetadata = Type.Object({\n id: Type.String({\n title: \"Datarecord ID\",\n comment: \"A unique identifier for the datarecord, e.g., 'newsletter_subscriptions'\",\n }),\n label: Type.String({\n title: \"Name of the datarecord\",\n comment: \"For example, 'Newsletter Subscriptions'\",\n }),\n description: Type.Optional(Type.String({ title: \"Description of the datarecord\" })),\n});\n\nconst datarecordManifest = Type.Composite([datarecordsConnectors, datarecordMetadata]);\n\nexport const internalDatarecordManifest = Type.Composite([datarecordMetadata, internalDatarecord]);\nexport type InternalDatarecord = Static<typeof internalDatarecordManifest>;\nexport type Datarecord = Static<typeof datarecordManifest>;\n\nexport const datarecordsList = Type.Array(datarecordManifest);\nexport type DatarecordsList = Static<typeof datarecordsList>;\n"],"mappings":"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","names":["Type","connectorSchema","Type","internalDatarecord","commonDatarecordSchema","datarecordsConnectors","airtableOptions","googleSheetsOptions","notionOptions","datarecordMetadata","datarecordManifest","internalDatarecordManifest","datarecordsList"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{d as t}from"./chunk-
|
|
3
|
+
import{d as t}from"./chunk-NM5MMPCF.js";import{a as o}from"./chunk-KFM6KXSE.js";import{a as e}from"./chunk-JMN3HTZU.js";import{Type as d}from"@sinclair/typebox";function p(r={}){return d.Object({width:e(["border-0","border","border-2","border-4","border-8"],{title:"Width",enumNames:["None","Small","Medium","Large","Extra large"],"ai:instructions":"Don't specify width if you want no border.","ui:field":"enum","ui:display":"select","ui:placeholder":"None",default:"border-0"}),color:t({title:"Color",description:"The color of the border.",default:"border-current"})},{title:"Border","ui:styleId":"styles:border",description:"Set the border width and color.","ui:field":"border","ui:responsive":!0,examples:[{width:"border-2",color:"border-primary-200"},{width:"border-4",color:"border-accent-400"},{width:"border",color:"border-neutral-100"}],...r})}function s(r={}){return o("styles:border",r)}function a(r={}){return d.Optional(e(["rounded-auto","rounded-none","rounded-sm","rounded-md","rounded-lg","rounded-xl","rounded-2xl","rounded-full"],{title:"Corner rounding",enumNames:["Auto","None","Small","Medium","Large","Extra large","2xl","Full"],"ui:styleId":"styles:rounding","ui:responsive":"desktop",...r}))}function b(r={}){return o("styles:rounding",r)}export{p as a,s as b,a as c,b as d};
|
|
4
|
+
//# sourceMappingURL=chunk-ZTZJHY4E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/bricks/props/border.ts"],"sourcesContent":["import { type ObjectOptions, Type, type Static, type StringOptions } from \"@sinclair/typebox\";\nimport { typedRef } from \"~/shared/utils/typed-ref\";\nimport { StringEnum } from \"~/shared/utils/string-enum\";\nimport { borderColorRef } from \"./color\";\n\nexport function border(opts: ObjectOptions = {}) {\n return Type.Object(\n {\n width: StringEnum([\"border-0\", \"border\", \"border-2\", \"border-4\", \"border-8\"], {\n title: \"Width\",\n enumNames: [\"None\", \"Small\", \"Medium\", \"Large\", \"Extra large\"],\n \"ai:instructions\": \"Don't specify width if you want no border.\",\n \"ui:field\": \"enum\",\n \"ui:display\": \"select\",\n \"ui:placeholder\": \"None\",\n default: \"border-0\",\n }),\n color: borderColorRef({\n title: \"Color\",\n description: \"The color of the border.\",\n default: \"border-current\",\n }),\n },\n {\n title: \"Border\",\n \"ui:styleId\": \"styles:border\",\n description: \"Set the border width and color.\",\n \"ui:field\": \"border\",\n \"ui:responsive\": true,\n examples: [\n {\n width: \"border-2\",\n color: \"border-primary-200\",\n },\n {\n width: \"border-4\",\n color: \"border-accent-400\",\n },\n {\n width: \"border\",\n color: \"border-neutral-100\",\n },\n ],\n ...opts,\n },\n );\n}\n\nexport type BorderSettings = Static<ReturnType<typeof border>>;\n\nexport function borderRef(\n options: Omit<ObjectOptions, \"default\"> & { default?: Partial<BorderSettings> } = {},\n) {\n return typedRef(\"styles:border\", options);\n}\n\nexport function rounding(opts: StringOptions = {}) {\n return Type.Optional(\n StringEnum(\n [\n \"rounded-auto\",\n \"rounded-none\",\n \"rounded-sm\",\n \"rounded-md\",\n \"rounded-lg\",\n \"rounded-xl\",\n \"rounded-2xl\",\n \"rounded-full\",\n ],\n {\n title: \"Corner rounding\",\n enumNames: [\"Auto\", \"None\", \"Small\", \"Medium\", \"Large\", \"Extra large\", \"2xl\", \"Full\"],\n // $id: \"styles:rounding\",\n \"ui:styleId\": \"styles:rounding\",\n \"ui:responsive\": \"desktop\",\n ...opts,\n },\n ),\n );\n}\n\nexport type RoundingSettings = Static<ReturnType<typeof rounding>>;\n\nexport function roundingRef(options: StringOptions = {}) {\n return typedRef(\"styles:rounding\", options);\n}\n"],"mappings":";;wHAAA,OAA6B,QAAAA,MAA6C,oBAKnE,SAASC,EAAOC,EAAsB,CAAC,EAAG,CAC/C,OAAOC,EAAK,OACV,CACE,MAAOC,EAAW,CAAC,WAAY,SAAU,WAAY,WAAY,UAAU,EAAG,CAC5E,MAAO,QACP,UAAW,CAAC,OAAQ,QAAS,SAAU,QAAS,aAAa,EAC7D,kBAAmB,6CACnB,WAAY,OACZ,aAAc,SACd,iBAAkB,OAClB,QAAS,UACX,CAAC,EACD,MAAOC,EAAe,CACpB,MAAO,QACP,YAAa,2BACb,QAAS,gBACX,CAAC,CACH,EACA,CACE,MAAO,SACP,aAAc,gBACd,YAAa,kCACb,WAAY,SACZ,gBAAiB,GACjB,SAAU,CACR,CACE,MAAO,WACP,MAAO,oBACT,EACA,CACE,MAAO,WACP,MAAO,mBACT,EACA,CACE,MAAO,SACP,MAAO,oBACT,CACF,EACA,GAAGH,CACL,CACF,CACF,CAIO,SAASI,EACdC,EAAkF,CAAC,EACnF,CACA,OAAOC,EAAS,gBAAiBD,CAAO,CAC1C,CAEO,SAASE,EAASP,EAAsB,CAAC,EAAG,CACjD,OAAOC,EAAK,SACVC,EACE,CACE,eACA,eACA,aACA,aACA,aACA,aACA,cACA,cACF,EACA,CACE,MAAO,kBACP,UAAW,CAAC,OAAQ,OAAQ,QAAS,SAAU,QAAS,cAAe,MAAO,MAAM,EAEpF,aAAc,kBACd,gBAAiB,UACjB,GAAGF,CACL,CACF,CACF,CACF,CAIO,SAASQ,EAAYH,EAAyB,CAAC,EAAG,CACvD,OAAOC,EAAS,kBAAmBD,CAAO,CAC5C","names":["Type","border","opts","Type","StringEnum","borderColorRef","borderRef","options","typedRef","rounding","roundingRef"]}
|
package/dist/shared/context.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
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};
|
|
4
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +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,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
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};
|
|
4
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +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,3 +1,4 @@
|
|
|
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-
|
|
3
|
+
import{a,b,c}from"../../../chunk-GLS7HPIZ.js";export{c as AirtableFieldTypes,a as airtableFields,b as airtableOptions};
|
|
4
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
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};
|
|
4
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +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,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
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};
|
|
4
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +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,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
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())});
|
|
4
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +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,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a}from"../../../../chunk-
|
|
3
|
+
import{a}from"../../../../chunk-ZFCUSWMT.js";export{a as default};
|
|
4
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a as p}from"../../../../chunk-
|
|
3
|
+
import{a as p}from"../../../../chunk-ZFCUSWMT.js";async function w(o,n){try{let e=await p(n).callDriveApi(`https://www.googleapis.com/drive/v3/files/${o}/export?mimeType=text/csv`,"GET");if(!e.success)throw new Error(`Failed to download spreadsheet: ${e.status}`);return e.data}catch(s){throw console.error("Error downloading Google Sheets data:",s),s}}async function u(o,n,s){try{let r=await p(s).callDriveApi(`https://www.googleapis.com/upload/drive/v3/files/${o}?uploadType=resumable`,"PATCH",{mimeType:"application/vnd.google-apps.spreadsheet"});if(!r.success){let c=r.data;throw new Error(`Failed to initiate upload: ${r.status} - ${c}`)}let t=r.headers.get("Location");if(!t)throw new Error("No upload URL returned from Google Drive");return(await fetch(t,{method:"PUT",headers:{"Content-Type":"text/csv"},body:n.map(c=>c.replace("\r","")).join(`
|
|
4
4
|
`)})).ok}catch(e){throw console.error("Error uploading Google Sheets data:",e),e}}async function v({formData:o,options:n,properties:s,accessToken:e}){try{if(!e)throw new Error("Access token is required");if(!n.spreadsheetId)throw new Error("Spreadsheet ID is required");let t=(await w(n.spreadsheetId,e)).trim().split(`
|
|
5
5
|
`),i={};for(let[l,a]of o.entries())i[l]=a;let d=g(s).map(l=>{let a=i[l]?.toString()||"";return a.includes(",")||a.includes('"')||a.includes(`
|
|
6
6
|
`)?`"${a.replace(/"/g,'""')}"`:a}).join(",");return t.push(d),u(n.spreadsheetId,t,e)}catch(r){return console.error("Error pushing data to Google Sheets:",r),!1}}async function y({name:o,schema:n,accessToken:s}){try{let r=await p(s).callDriveApi("https://www.googleapis.com/drive/v3/files","POST",{name:o,mimeType:"application/vnd.google-apps.spreadsheet"});if(!r.success)throw new Error(`Failed to create spreadsheet: ${r.status}`);let t=r.data.id,i=`https://docs.google.com/spreadsheets/d/${t}/edit`,d=g(n.properties).join(",");return await u(t,[d],s),{spreadsheetId:t,spreadsheetUrl:i}}catch(e){throw console.error("Error creating Google Sheets spreadsheet:",e),e}}function g(o){return Object.entries(o).sort(([,e],[,r])=>{let t=e.metadata?.order,i=r.metadata?.order;return t!==void 0&&i!==void 0?t-i:t!==void 0&&i===void 0?-1:t===void 0&&i!==void 0?1:0}).map(([e,r])=>e)}async function T({spreadsheetId:o,newName:n,newProperties:s,accessToken:e}){try{if(n&&await p(e).callDriveApi(`https://www.googleapis.com/drive/v3/files/${o}`,"PATCH",{name:n}),s){let r=g(s),c=(await w(o,e)).split(`
|
|
7
7
|
`).map((d,l)=>{if(l===0)return[...d.split(","),...r].join(",");{let a=d.split(","),h=r.map(()=>"");return[...a,...h].join(",")}});await u(o,c,e)}}catch(r){throw console.error("Error updating Google Sheets spreadsheet:",r),r}}export{y as createTable,v as saveRecord,T as updateTable};
|
|
8
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/shared/datarecords/external/google/sheets/handler.ts"],"sourcesContent":["import type { TObject, TProperties } from \"@sinclair/typebox\";\nimport getClient from \"./client\";\nimport type { GoogleSheetsOptions } from \"./types\";\n\nasync function downloadGoogleSheetsData(spreadsheetId: string, accessToken: string): Promise<string> {\n try {\n const client = getClient(accessToken);\n const response = await client.callDriveApi<string>(\n `https://www.googleapis.com/drive/v3/files/${spreadsheetId}/export?mimeType=text/csv`,\n \"GET\",\n );\n\n if (!response.success) {\n throw new Error(`Failed to download spreadsheet: ${response.status}`);\n }\n\n return response.data;\n } catch (error) {\n console.error(\"Error downloading Google Sheets data:\", error);\n throw error;\n }\n}\n\nasync function uploadGoogleSheetsData(\n spreadsheetId: string,\n csvLines: string[],\n accessToken: string,\n): Promise<boolean> {\n try {\n const client = getClient(accessToken);\n // Use resumable upload to ensure the content is properly converted\n const initResponse = await client.callDriveApi<string>(\n `https://www.googleapis.com/upload/drive/v3/files/${spreadsheetId}?uploadType=resumable`,\n \"PATCH\",\n {\n mimeType: \"application/vnd.google-apps.spreadsheet\",\n },\n );\n\n if (!initResponse.success) {\n const errorText = initResponse.data;\n throw new Error(`Failed to initiate upload: ${initResponse.status} - ${errorText}`);\n }\n\n const uploadUrl = initResponse.headers.get(\"Location\");\n\n if (!uploadUrl) {\n throw new Error(\"No upload URL returned from Google Drive\");\n }\n\n // Upload the CSV content\n const uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"text/csv\",\n },\n body: csvLines.map((line) => line.replace(\"\\r\", \"\")).join(\"\\n\"),\n });\n return uploadResponse.ok;\n } catch (error) {\n console.error(\"Error uploading Google Sheets data:\", error);\n throw error;\n }\n}\n\nexport async function saveRecord({\n formData,\n options,\n properties,\n accessToken,\n}: {\n formData: FormData;\n options: GoogleSheetsOptions;\n properties: TProperties;\n accessToken: string;\n}): Promise<boolean> {\n try {\n if (!accessToken) {\n throw new Error(\"Access token is required\");\n }\n\n if (!options.spreadsheetId) {\n throw new Error(\"Spreadsheet ID is required\");\n }\n\n // Download existing CSV data\n const existingCsv = await downloadGoogleSheetsData(options.spreadsheetId, accessToken);\n const csvLines = existingCsv.trim().split(\"\\n\");\n\n // Convert FormData to a record object\n const record: Record<string, unknown> = {};\n for (const [key, value] of formData.entries()) {\n record[key] = value;\n }\n\n // build new csv line using the metadata.order of properties\n const orderedHeaders = buildGoogleSheetHeaders(properties);\n const newCsvRow = orderedHeaders\n .map((header) => {\n const value = record[header]?.toString() || \"\";\n // Escape CSV values that contain commas, quotes, or newlines\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n })\n .join(\",\");\n\n // Add new rows to CSV\n csvLines.push(newCsvRow);\n\n return uploadGoogleSheetsData(options.spreadsheetId, csvLines, accessToken);\n } catch (error) {\n console.error(\"Error pushing data to Google Sheets:\", error);\n return false;\n }\n}\n\n/**\n * Create a spreadsheet in Google Sheets\n * @param title\n * @param schema\n * @param accessToken\n * @returns\n */\nexport async function createTable({\n name,\n schema,\n accessToken,\n}: {\n name: string;\n schema: TObject;\n accessToken: string;\n}): Promise<{ spreadsheetId: string; spreadsheetUrl: string }> {\n try {\n const client = getClient(accessToken);\n\n // First create the file\n const createResponse = await client.callDriveApi<{ id: string }>(\n \"https://www.googleapis.com/drive/v3/files\",\n \"POST\",\n {\n name: name,\n mimeType: \"application/vnd.google-apps.spreadsheet\",\n },\n );\n\n if (!createResponse.success) {\n throw new Error(`Failed to create spreadsheet: ${createResponse.status}`);\n }\n\n const spreadsheetId = createResponse.data.id;\n\n const spreadsheetUrl = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/edit`;\n\n const headers = buildGoogleSheetHeaders(schema.properties as TProperties);\n const headerLine = headers.join(\",\");\n\n await uploadGoogleSheetsData(spreadsheetId, [headerLine], accessToken);\n return {\n spreadsheetId,\n spreadsheetUrl,\n };\n } catch (error) {\n console.error(\"Error creating Google Sheets spreadsheet:\", error);\n throw error;\n }\n}\n\nfunction buildGoogleSheetHeaders(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 return fieldName;\n });\n return fields;\n}\n\nexport async function updateTable({\n spreadsheetId,\n newName,\n newProperties,\n accessToken,\n}: {\n spreadsheetId: string;\n newName?: string;\n newProperties?: TProperties;\n accessToken: string;\n}): Promise<void> {\n try {\n // rename spreadsheet\n if (newName) {\n const client = getClient(accessToken);\n await client.callDriveApi<string>(\n `https://www.googleapis.com/drive/v3/files/${spreadsheetId}`,\n \"PATCH\",\n {\n name: newName,\n },\n );\n }\n\n if (newProperties) {\n const newHeaders = buildGoogleSheetHeaders(newProperties);\n // const headerLine = newHeaders.join(\",\");\n\n // first, download the existing data\n const existingData = await downloadGoogleSheetsData(spreadsheetId, accessToken);\n\n // add new header for first line, and empty value for other\n const currentLines = existingData.split(\"\\n\");\n const csvLines = currentLines.map((line, index) => {\n if (index === 0) {\n const currentHeaders = line.split(\",\");\n const allHeaders = [...currentHeaders, ...newHeaders];\n return allHeaders.join(\",\");\n } else {\n const currentValues = line.split(\",\");\n const newValues = newHeaders.map(() => \"\");\n const updatedValues = [...currentValues, ...newValues];\n return updatedValues.join(\",\");\n }\n });\n\n // upload updated data\n await uploadGoogleSheetsData(spreadsheetId, csvLines, accessToken);\n }\n } catch (error) {\n console.error(\"Error updating Google Sheets spreadsheet:\", error);\n throw error;\n }\n}\n"],"mappings":"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","names":["downloadGoogleSheetsData","spreadsheetId","accessToken","response","getClient","error","uploadGoogleSheetsData","csvLines","initResponse","errorText","uploadUrl","line","saveRecord","formData","options","properties","record","key","value","newCsvRow","buildGoogleSheetHeaders","header","createTable","name","schema","createResponse","spreadsheetUrl","headerLine","fieldA","fieldB","orderA","orderB","fieldName","field","updateTable","newName","newProperties","newHeaders","index","currentValues","newValues"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a}from"../../../../chunk-
|
|
3
|
+
import{a}from"../../../../chunk-GPEMPZXK.js";export{a as googleSheetsOptions};
|
|
4
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
3
|
import{Client as c}from"@notionhq/client";import{nanoid as d}from"nanoid";var g=10,b=1e3;async function h({formData:o,options:s,properties:r,accessToken:e}){let t=new c({auth:e}),p=f(o,s.properties);try{return t.pages.create({parent:{database_id:s.id},properties:{...p}})}catch{return}}async function l(o,s,r,e,t){let p=t?t+1:1;if(p>(r?.maxCalls??g))return{status:"max_call_reached",pages:s};try{let n=await o.search({filter:{property:"object",value:"page"},start_cursor:e,page_size:100});if(!n)return{status:"error",pages:s};for(let a in n.results){let i=n.results[a];if(i.parent.type!=="database_id"){let m={id:i.id,name:i.properties.title&&i.properties.title.type==="title"&&Array.isArray(i.properties.title.title)&&i.properties.title.title[0]?.plain_text?i.properties.title.title[0].plain_text:"No Title"};if(s.push(m),s.length>=(r?.maxResults??b))return{status:"max_pages_reached",pages:s}}}if(n.has_more&&n.next_cursor){let a=await l(o,s,r,n.next_cursor,p);return a.status!=="success"?{status:a.status,pages:s}:a}}catch(n){console.error("Error searching Notion pages:",n)}return{status:"success",pages:s}}async function _(o,s){try{let r=new c({auth:o});return await l(r,[],{...s})}catch(r){throw console.error("Error listing Notion databases:",r),r}}function u(o,s=[]){let r={};for(let[e,t]of Object.entries(o))t.type==="string"?e in(s??[])&&e==="id"?r[e]={title:{},name:e,type:"title"}:t.format==="email"?r[e]={type:"email",name:e,email:{}}:t.format==="uri"?r[e]={type:"url",name:e,url:{}}:t.format==="date"||t.format==="date-time"?r[e]={type:"date",name:e,date:{}}:t.enum&&Array.isArray(t.enum)&&t.enum.length>0?t.metadata?.["ui:widget"]==="checkbox"?r[e]={type:"multi_select",name:e,multi_select:{options:t.enum.map(p=>({name:p}))}}:r[e]={type:"select",name:e,select:{options:t.enum.map(p=>({name:p}))}}:r[e]={rich_text:{},name:e,type:"rich_text"}:t.type==="number"?r[e]={number:{}}:t.type==="boolean"&&(r[e]={checkbox:{}});return r.id||(r.id={title:{},name:"id",type:"title"}),r}async function P({id:o,newName:s,newProperties:r,accessToken:e}){let t=new c({auth:e}),p=r?u(r):{},n=await t.databases.update({database_id:o,...s?{title:[{type:"text",text:{content:s}}]}:{},...Object.keys(p).length>0?{properties:p}:{}});if(!n)throw new Error("Failed to update Notion database");return{id:n.id,name:n.title[0]?.plain_text,properties:n.properties,url:n.url}}async function R({name:o,schema:s,pageId:r,accessToken:e}){let t=u(s.properties,s.required),p={parent:{type:"page_id",page_id:r},title:[{type:"text",text:{content:o}}],properties:t},n=new c({auth:e}),a=await n.databases.create(p);if(!a)throw new Error("Failed to create Notion database");let i=await n.databases.retrieve({database_id:a.id});if(!i)throw new Error("Failed to retrieve Notion database after creation");return{id:i.id,name:i.title[0]?.plain_text,properties:i.properties,url:i.url}}async function k({pageId:o,accessToken:s}){let r=new c({auth:s});try{let e=await r.pages.retrieve({page_id:o});if(!e){console.log("Failed to retrieve Notion page");return}if(e){let t=e;return{id:t.id,name:t.properties.title&&t.properties.title.type==="title"&&Array.isArray(t.properties.title.title)&&t.properties.title.title[0]?.plain_text?t.properties.title.title[0].plain_text:"No Title"}}}catch(e){console.error("Error retrieving Notion page:",e)}}function f(o,s){let r={};for(let[e,t]of o.entries())if(!(t==null||t==="")&&e in s)switch(s[e].type){case"title":r[e]={title:[{text:{content:String(t)}}]};break;case"rich_text":r[e]={rich_text:[{text:{content:String(t)}}]};break;case"email":r[e]={email:String(t)};break;case"phone_number":r[e]={phone_number:String(t)};break;case"url":r[e]={url:String(t)};break;case"number":r[e]={number:Number(t)};break;case"checkbox":r[e]={checkbox:t==="true"||t==="1"};break;case"date":r[e]={date:t?{start:String(t)}:null};break;case"select":r[e]={select:{name:String(t)}};break;case"multi_select":{let n=(a=>{if(a.startsWith("[")&&a.endsWith("]"))try{return JSON.parse(a)}catch{return[a]}return a.includes(",")?a.split(",").map(i=>i.trim()).filter(i=>i.length>0):[a]})(String(t));r[e]={multi_select:n.map(a=>({name:a}))};break}default:console.warn(`Unsupported property type for key "${e}": ${s[e].type}`),r[e]={rich_text:[{text:{content:String(t)}}]}}return"id"in r||(r.id={title:[{text:{content:d(5)}}]}),r}export{k as checkPage,R as createTable,_ as listPages,h as saveRecord,P as updateTable};
|
|
4
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/shared/datarecords/external/notion/handler.ts"],"sourcesContent":["import {\n Client,\n type CreateDatabaseResponse,\n type DatabaseObjectResponse,\n type GetPageResponse,\n type PageObjectResponse,\n} from \"@notionhq/client\";\nimport type { TObject, TProperties } from \"@sinclair/typebox\";\nimport { nanoid } from \"nanoid\";\nimport type { ListPagesResponse, NotionOptions, NotionPage, NotionPages } from \"./types\";\n\nconst MAX_CALL = 10;\nconst MAX_PAGES = 1000;\n\nexport type { CreateDatabaseResponse, DatabaseObjectResponse, ListPagesResponse };\n\nexport async function saveRecord({\n formData,\n options,\n properties,\n accessToken,\n}: {\n formData: FormData;\n options: NotionOptions;\n properties: TProperties;\n accessToken: string;\n}) {\n const client = new Client({\n auth: accessToken,\n });\n const notionData = buildCreatePageParameters(formData, options.properties);\n\n try {\n return client.pages.create({\n parent: { database_id: options.id },\n properties: {\n ...notionData,\n },\n });\n } catch (e) {\n return;\n }\n}\n\nasync function searchPages(\n client: Client,\n pages: NotionPages,\n parameters: {\n maxResults?: number;\n maxCalls?: number;\n },\n offset?: string,\n resultIndex?: number,\n): Promise<ListPagesResponse> {\n const nextIndex = resultIndex ? resultIndex + 1 : 1;\n // Notion API has a hard limit of 300 results (3 requests of 100 results)\n if (nextIndex > (parameters?.maxCalls ?? MAX_CALL)) {\n return {\n status: \"max_call_reached\",\n pages,\n };\n }\n try {\n const response = await client.search({\n filter: {\n property: \"object\",\n value: \"page\",\n },\n start_cursor: offset,\n page_size: 100, // default\n });\n if (!response) {\n return {\n status: \"error\",\n pages,\n };\n }\n for (const d in response.results) {\n const p = response.results[d] as PageObjectResponse;\n\n if (p.parent.type !== \"database_id\") {\n const page = {\n id: p.id,\n name:\n p.properties.title &&\n p.properties.title.type === \"title\" &&\n Array.isArray(p.properties.title.title) &&\n p.properties.title.title[0]?.plain_text\n ? p.properties.title.title[0].plain_text\n : \"No Title\",\n };\n pages.push(page);\n if (pages.length >= (parameters?.maxResults ?? MAX_PAGES)) {\n return {\n status: \"max_pages_reached\",\n pages: pages,\n };\n }\n }\n }\n if (response.has_more && response.next_cursor) {\n const moreResults = await searchPages(client, pages, parameters, response.next_cursor, nextIndex);\n if (moreResults.status !== \"success\") {\n return {\n status: moreResults.status,\n pages: pages,\n };\n }\n return moreResults;\n }\n } catch (error) {\n console.error(\"Error searching Notion pages:\", error);\n }\n return {\n status: \"success\",\n pages,\n };\n}\n\nexport async function listPages(\n accessToken: string,\n parameters?: {\n maxResults?: number;\n maxCalls?: number;\n },\n): Promise<ListPagesResponse> {\n try {\n const client = new Client({\n auth: accessToken,\n });\n\n const response = await searchPages(client, [], { ...parameters });\n return response;\n } catch (error) {\n console.error(\"Error listing Notion databases:\", error);\n throw error;\n }\n}\n\n/**\n * In Notion, databases column are sorted by alphabetical order\n * @param schema\n * @returns\n */\nfunction buildDatabaseProperties(schemaProperties: TProperties, requiredFields: string[] = []) {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n const properties: Record<string, any> = {};\n\n for (const [fieldName, field] of Object.entries(schemaProperties)) {\n if (field.type === \"string\") {\n if (fieldName in (requiredFields ?? []) && fieldName === \"id\") {\n properties[fieldName] = {\n title: {},\n name: fieldName,\n type: \"title\",\n };\n } else {\n if (field.format === \"email\") {\n properties[fieldName] = {\n type: \"email\",\n name: fieldName,\n email: {},\n };\n } else if (field.format === \"uri\") {\n properties[fieldName] = {\n type: \"url\",\n name: fieldName,\n url: {},\n };\n } else if (field.format === \"date\" || field.format === \"date-time\") {\n properties[fieldName] = {\n type: \"date\",\n name: fieldName,\n date: {},\n };\n } else {\n if (field.enum && Array.isArray(field.enum) && field.enum.length > 0) {\n if (field.metadata?.[\"ui:widget\"] === \"checkbox\") {\n properties[fieldName] = {\n type: \"multi_select\",\n name: fieldName,\n multi_select: {\n options: field.enum.map((option) => ({\n name: option,\n })),\n },\n };\n } else {\n properties[fieldName] = {\n type: \"select\",\n name: fieldName,\n select: {\n options: field.enum.map((option) => ({\n name: option,\n })),\n },\n };\n }\n } else {\n properties[fieldName] = {\n rich_text: {},\n name: fieldName,\n type: \"rich_text\",\n };\n }\n }\n }\n } else if (field.type === \"number\") {\n properties[fieldName] = {\n number: {},\n };\n } else if (field.type === \"boolean\") {\n properties[fieldName] = {\n checkbox: {},\n };\n }\n }\n\n // if no id field of type title, add one\n if (!properties.id) {\n properties.id = {\n title: {},\n name: \"id\",\n type: \"title\",\n };\n }\n return properties;\n}\n\nexport async function updateTable({\n id,\n newName,\n newProperties,\n accessToken,\n}: {\n id: string;\n newName?: string;\n newProperties?: TProperties;\n accessToken: string;\n}): Promise<NotionOptions> {\n const client = new Client({\n auth: accessToken,\n });\n\n const properties = newProperties ? buildDatabaseProperties(newProperties) : {};\n const response = (await client.databases.update({\n database_id: id,\n ...(newName\n ? {\n title: [\n {\n type: \"text\" as const,\n text: {\n content: newName,\n },\n },\n ],\n }\n : {}),\n ...(Object.keys(properties).length > 0 ? { properties } : {}),\n })) as DatabaseObjectResponse;\n if (!response) {\n throw new Error(\"Failed to update Notion database\");\n }\n return {\n id: response.id,\n name: response.title[0]?.plain_text,\n properties: response.properties,\n url: response.url,\n };\n}\n\nexport async function createTable({\n name,\n schema,\n pageId,\n accessToken,\n}: {\n name: string;\n schema: TObject;\n pageId: string;\n accessToken: string;\n}): Promise<NotionOptions> {\n const properties = buildDatabaseProperties(schema.properties, schema.required);\n const data = {\n parent: { type: \"page_id\" as const, page_id: pageId },\n title: [\n {\n type: \"text\" as const,\n text: {\n content: name,\n },\n },\n ],\n properties,\n };\n const client = new Client({\n auth: accessToken,\n });\n const response = (await client.databases.create(data)) as CreateDatabaseResponse;\n if (!response) {\n throw new Error(\"Failed to create Notion database\");\n }\n const table = (await client.databases.retrieve({ database_id: response.id })) as DatabaseObjectResponse;\n if (!table) {\n throw new Error(\"Failed to retrieve Notion database after creation\");\n }\n return {\n id: table.id,\n name: table.title[0]?.plain_text,\n properties: table.properties,\n url: table.url,\n };\n}\n\nexport async function checkPage({\n pageId,\n accessToken,\n}: {\n pageId: string;\n accessToken: string;\n}): Promise<NotionPage | undefined> {\n const client = new Client({\n auth: accessToken,\n });\n try {\n const response = (await client.pages.retrieve({ page_id: pageId })) as GetPageResponse;\n if (!response) {\n console.log(\"Failed to retrieve Notion page\");\n return;\n }\n if (response) {\n // Convert the complex Notion response to a simple type\n const page = response as PageObjectResponse;\n return {\n id: page.id,\n name:\n page.properties.title &&\n page.properties.title.type === \"title\" &&\n Array.isArray(page.properties.title.title) &&\n page.properties.title.title[0]?.plain_text\n ? page.properties.title.title[0].plain_text\n : \"No Title\",\n };\n }\n } catch (e) {\n console.error(\"Error retrieving Notion page:\", e);\n }\n return;\n}\n\nfunction buildCreatePageParameters(data: FormData, databaseProperties: NotionOptions[\"properties\"]) {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n const notionData: Record<string, any> = {};\n for (const [key, value] of data.entries()) {\n if (value === null || value === undefined || value === \"\") continue;\n if (key in databaseProperties) {\n switch (databaseProperties[key].type) {\n case \"title\":\n notionData[key] = {\n title: [\n {\n text: {\n content: String(value),\n },\n },\n ],\n };\n break;\n case \"rich_text\":\n notionData[key] = {\n rich_text: [\n {\n text: {\n content: String(value),\n },\n },\n ],\n };\n break;\n case \"email\":\n notionData[key] = {\n email: String(value),\n };\n break;\n case \"phone_number\":\n notionData[key] = {\n phone_number: String(value),\n };\n break;\n case \"url\":\n notionData[key] = {\n url: String(value),\n };\n break;\n case \"number\":\n notionData[key] = {\n number: Number(value),\n };\n break;\n case \"checkbox\":\n notionData[key] = {\n checkbox: value === \"true\" || value === \"1\",\n };\n break;\n case \"date\":\n notionData[key] = {\n date: value ? { start: String(value) } : null,\n };\n break;\n case \"select\":\n notionData[key] = {\n select: {\n name: String(value),\n },\n };\n break;\n case \"multi_select\": {\n const getValues = (value: string) => {\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 const values = getValues(String(value));\n notionData[key] = {\n multi_select: values.map((v: string) => ({\n name: v,\n })),\n };\n break;\n }\n default:\n console.warn(`Unsupported property type for key \"${key}\": ${databaseProperties[key].type}`);\n notionData[key] = {\n rich_text: [\n {\n text: {\n content: String(value),\n },\n },\n ],\n };\n }\n }\n }\n if (!(\"id\" in notionData)) {\n notionData.id = {\n title: [\n {\n text: {\n content: nanoid(5),\n },\n },\n ],\n };\n }\n return notionData;\n}\n"],"mappings":";;AAAA,OACE,UAAAA,MAKK,mBAEP,OAAS,UAAAC,MAAc,SAGvB,IAAMC,EAAW,GACXC,EAAY,IAIlB,eAAsBC,EAAW,CAC/B,SAAAC,EACA,QAAAC,EACA,WAAAC,EACA,YAAAC,CACF,EAKG,CACD,IAAMC,EAAS,IAAIT,EAAO,CACxB,KAAMQ,CACR,CAAC,EACKE,EAAaC,EAA0BN,EAAUC,EAAQ,UAAU,EAEzE,GAAI,CACF,OAAOG,EAAO,MAAM,OAAO,CACzB,OAAQ,CAAE,YAAaH,EAAQ,EAAG,EAClC,WAAY,CACV,GAAGI,CACL,CACF,CAAC,CACH,MAAY,CACV,MACF,CACF,CAEA,eAAeE,EACbH,EACAI,EACAC,EAIAC,EACAC,EAC4B,CAC5B,IAAMC,EAAYD,EAAcA,EAAc,EAAI,EAElD,GAAIC,GAAaH,GAAY,UAAYZ,GACvC,MAAO,CACL,OAAQ,mBACR,MAAAW,CACF,EAEF,GAAI,CACF,IAAMK,EAAW,MAAMT,EAAO,OAAO,CACnC,OAAQ,CACN,SAAU,SACV,MAAO,MACT,EACA,aAAcM,EACd,UAAW,GACb,CAAC,EACD,GAAI,CAACG,EACH,MAAO,CACL,OAAQ,QACR,MAAAL,CACF,EAEF,QAAWM,KAAKD,EAAS,QAAS,CAChC,IAAME,EAAIF,EAAS,QAAQC,CAAC,EAE5B,GAAIC,EAAE,OAAO,OAAS,cAAe,CACnC,IAAMC,EAAO,CACX,GAAID,EAAE,GACN,KACEA,EAAE,WAAW,OACbA,EAAE,WAAW,MAAM,OAAS,SAC5B,MAAM,QAAQA,EAAE,WAAW,MAAM,KAAK,GACtCA,EAAE,WAAW,MAAM,MAAM,CAAC,GAAG,WACzBA,EAAE,WAAW,MAAM,MAAM,CAAC,EAAE,WAC5B,UACR,EAEA,GADAP,EAAM,KAAKQ,CAAI,EACXR,EAAM,SAAWC,GAAY,YAAcX,GAC7C,MAAO,CACL,OAAQ,oBACR,MAAOU,CACT,CAEJ,CACF,CACA,GAAIK,EAAS,UAAYA,EAAS,YAAa,CAC7C,IAAMI,EAAc,MAAMV,EAAYH,EAAQI,EAAOC,EAAYI,EAAS,YAAaD,CAAS,EAChG,OAAIK,EAAY,SAAW,UAClB,CACL,OAAQA,EAAY,OACpB,MAAOT,CACT,EAEKS,CACT,CACF,OAASC,EAAO,CACd,QAAQ,MAAM,gCAAiCA,CAAK,CACtD,CACA,MAAO,CACL,OAAQ,UACR,MAAAV,CACF,CACF,CAEA,eAAsBW,EACpBhB,EACAM,EAI4B,CAC5B,GAAI,CACF,IAAML,EAAS,IAAIT,EAAO,CACxB,KAAMQ,CACR,CAAC,EAGD,OADiB,MAAMI,EAAYH,EAAQ,CAAC,EAAG,CAAE,GAAGK,CAAW,CAAC,CAElE,OAASS,EAAO,CACd,cAAQ,MAAM,kCAAmCA,CAAK,EAChDA,CACR,CACF,CAOA,SAASE,EAAwBC,EAA+BC,EAA2B,CAAC,EAAG,CAE7F,IAAMpB,EAAkC,CAAC,EAEzC,OAAW,CAACqB,EAAWC,CAAK,IAAK,OAAO,QAAQH,CAAgB,EAC1DG,EAAM,OAAS,SACbD,KAAcD,GAAkB,CAAC,IAAMC,IAAc,KACvDrB,EAAWqB,CAAS,EAAI,CACtB,MAAO,CAAC,EACR,KAAMA,EACN,KAAM,OACR,EAEIC,EAAM,SAAW,QACnBtB,EAAWqB,CAAS,EAAI,CACtB,KAAM,QACN,KAAMA,EACN,MAAO,CAAC,CACV,EACSC,EAAM,SAAW,MAC1BtB,EAAWqB,CAAS,EAAI,CACtB,KAAM,MACN,KAAMA,EACN,IAAK,CAAC,CACR,EACSC,EAAM,SAAW,QAAUA,EAAM,SAAW,YACrDtB,EAAWqB,CAAS,EAAI,CACtB,KAAM,OACN,KAAMA,EACN,KAAM,CAAC,CACT,EAEIC,EAAM,MAAQ,MAAM,QAAQA,EAAM,IAAI,GAAKA,EAAM,KAAK,OAAS,EAC7DA,EAAM,WAAW,WAAW,IAAM,WACpCtB,EAAWqB,CAAS,EAAI,CACtB,KAAM,eACN,KAAMA,EACN,aAAc,CACZ,QAASC,EAAM,KAAK,IAAKC,IAAY,CACnC,KAAMA,CACR,EAAE,CACJ,CACF,EAEAvB,EAAWqB,CAAS,EAAI,CACtB,KAAM,SACN,KAAMA,EACN,OAAQ,CACN,QAASC,EAAM,KAAK,IAAKC,IAAY,CACnC,KAAMA,CACR,EAAE,CACJ,CACF,EAGFvB,EAAWqB,CAAS,EAAI,CACtB,UAAW,CAAC,EACZ,KAAMA,EACN,KAAM,WACR,EAIGC,EAAM,OAAS,SACxBtB,EAAWqB,CAAS,EAAI,CACtB,OAAQ,CAAC,CACX,EACSC,EAAM,OAAS,YACxBtB,EAAWqB,CAAS,EAAI,CACtB,SAAU,CAAC,CACb,GAKJ,OAAKrB,EAAW,KACdA,EAAW,GAAK,CACd,MAAO,CAAC,EACR,KAAM,KACN,KAAM,OACR,GAEKA,CACT,CAEA,eAAsBwB,EAAY,CAChC,GAAAC,EACA,QAAAC,EACA,cAAAC,EACA,YAAA1B,CACF,EAK2B,CACzB,IAAMC,EAAS,IAAIT,EAAO,CACxB,KAAMQ,CACR,CAAC,EAEKD,EAAa2B,EAAgBT,EAAwBS,CAAa,EAAI,CAAC,EACvEhB,EAAY,MAAMT,EAAO,UAAU,OAAO,CAC9C,YAAauB,EACb,GAAIC,EACA,CACE,MAAO,CACL,CACE,KAAM,OACN,KAAM,CACJ,QAASA,CACX,CACF,CACF,CACF,EACA,CAAC,EACL,GAAI,OAAO,KAAK1B,CAAU,EAAE,OAAS,EAAI,CAAE,WAAAA,CAAW,EAAI,CAAC,CAC7D,CAAC,EACD,GAAI,CAACW,EACH,MAAM,IAAI,MAAM,kCAAkC,EAEpD,MAAO,CACL,GAAIA,EAAS,GACb,KAAMA,EAAS,MAAM,CAAC,GAAG,WACzB,WAAYA,EAAS,WACrB,IAAKA,EAAS,GAChB,CACF,CAEA,eAAsBiB,EAAY,CAChC,KAAAC,EACA,OAAAC,EACA,OAAAC,EACA,YAAA9B,CACF,EAK2B,CACzB,IAAMD,EAAakB,EAAwBY,EAAO,WAAYA,EAAO,QAAQ,EACvEE,EAAO,CACX,OAAQ,CAAE,KAAM,UAAoB,QAASD,CAAO,EACpD,MAAO,CACL,CACE,KAAM,OACN,KAAM,CACJ,QAASF,CACX,CACF,CACF,EACA,WAAA7B,CACF,EACME,EAAS,IAAIT,EAAO,CACxB,KAAMQ,CACR,CAAC,EACKU,EAAY,MAAMT,EAAO,UAAU,OAAO8B,CAAI,EACpD,GAAI,CAACrB,EACH,MAAM,IAAI,MAAM,kCAAkC,EAEpD,IAAMsB,EAAS,MAAM/B,EAAO,UAAU,SAAS,CAAE,YAAaS,EAAS,EAAG,CAAC,EAC3E,GAAI,CAACsB,EACH,MAAM,IAAI,MAAM,mDAAmD,EAErE,MAAO,CACL,GAAIA,EAAM,GACV,KAAMA,EAAM,MAAM,CAAC,GAAG,WACtB,WAAYA,EAAM,WAClB,IAAKA,EAAM,GACb,CACF,CAEA,eAAsBC,EAAU,CAC9B,OAAAH,EACA,YAAA9B,CACF,EAGoC,CAClC,IAAMC,EAAS,IAAIT,EAAO,CACxB,KAAMQ,CACR,CAAC,EACD,GAAI,CACF,IAAMU,EAAY,MAAMT,EAAO,MAAM,SAAS,CAAE,QAAS6B,CAAO,CAAC,EACjE,GAAI,CAACpB,EAAU,CACb,QAAQ,IAAI,gCAAgC,EAC5C,MACF,CACA,GAAIA,EAAU,CAEZ,IAAMG,EAAOH,EACb,MAAO,CACL,GAAIG,EAAK,GACT,KACEA,EAAK,WAAW,OAChBA,EAAK,WAAW,MAAM,OAAS,SAC/B,MAAM,QAAQA,EAAK,WAAW,MAAM,KAAK,GACzCA,EAAK,WAAW,MAAM,MAAM,CAAC,GAAG,WAC5BA,EAAK,WAAW,MAAM,MAAM,CAAC,EAAE,WAC/B,UACR,CACF,CACF,OAAS,EAAG,CACV,QAAQ,MAAM,gCAAiC,CAAC,CAClD,CAEF,CAEA,SAASV,EAA0B4B,EAAgBG,EAAiD,CAElG,IAAMhC,EAAkC,CAAC,EACzC,OAAW,CAACiC,EAAKC,CAAK,IAAKL,EAAK,QAAQ,EACtC,GAAI,EAAAK,GAAU,MAA+BA,IAAU,KACnDD,KAAOD,EACT,OAAQA,EAAmBC,CAAG,EAAE,KAAM,CACpC,IAAK,QACHjC,EAAWiC,CAAG,EAAI,CAChB,MAAO,CACL,CACE,KAAM,CACJ,QAAS,OAAOC,CAAK,CACvB,CACF,CACF,CACF,EACA,MACF,IAAK,YACHlC,EAAWiC,CAAG,EAAI,CAChB,UAAW,CACT,CACE,KAAM,CACJ,QAAS,OAAOC,CAAK,CACvB,CACF,CACF,CACF,EACA,MACF,IAAK,QACHlC,EAAWiC,CAAG,EAAI,CAChB,MAAO,OAAOC,CAAK,CACrB,EACA,MACF,IAAK,eACHlC,EAAWiC,CAAG,EAAI,CAChB,aAAc,OAAOC,CAAK,CAC5B,EACA,MACF,IAAK,MACHlC,EAAWiC,CAAG,EAAI,CAChB,IAAK,OAAOC,CAAK,CACnB,EACA,MACF,IAAK,SACHlC,EAAWiC,CAAG,EAAI,CAChB,OAAQ,OAAOC,CAAK,CACtB,EACA,MACF,IAAK,WACHlC,EAAWiC,CAAG,EAAI,CAChB,SAAUC,IAAU,QAAUA,IAAU,GAC1C,EACA,MACF,IAAK,OACHlC,EAAWiC,CAAG,EAAI,CAChB,KAAMC,EAAQ,CAAE,MAAO,OAAOA,CAAK,CAAE,EAAI,IAC3C,EACA,MACF,IAAK,SACHlC,EAAWiC,CAAG,EAAI,CAChB,OAAQ,CACN,KAAM,OAAOC,CAAK,CACpB,CACF,EACA,MACF,IAAK,eAAgB,CAiBnB,IAAMC,GAhBaD,GAAkB,CACnC,GAAIA,EAAM,WAAW,GAAG,GAAKA,EAAM,SAAS,GAAG,EAC7C,GAAI,CACF,OAAO,KAAK,MAAMA,CAAK,CACzB,MAAQ,CACN,MAAO,CAACA,CAAK,CACf,CAEF,OAAIA,EAAM,SAAS,GAAG,EACbA,EACJ,MAAM,GAAG,EACT,IAAKE,GAAMA,EAAE,KAAK,CAAC,EACnB,OAAQA,GAAMA,EAAE,OAAS,CAAC,EAExB,CAACF,CAAK,CACf,GACyB,OAAOA,CAAK,CAAC,EACtClC,EAAWiC,CAAG,EAAI,CAChB,aAAcE,EAAO,IAAKC,IAAe,CACvC,KAAMA,CACR,EAAE,CACJ,EACA,KACF,CACA,QACE,QAAQ,KAAK,sCAAsCH,CAAG,MAAMD,EAAmBC,CAAG,EAAE,IAAI,EAAE,EAC1FjC,EAAWiC,CAAG,EAAI,CAChB,UAAW,CACT,CACE,KAAM,CACJ,QAAS,OAAOC,CAAK,CACvB,CACF,CACF,CACF,CACJ,CAGJ,MAAM,OAAQlC,IACZA,EAAW,GAAK,CACd,MAAO,CACL,CACE,KAAM,CACJ,QAAST,EAAO,CAAC,CACnB,CACF,CACF,CACF,GAEKS,CACT","names":["Client","nanoid","MAX_CALL","MAX_PAGES","saveRecord","formData","options","properties","accessToken","client","notionData","buildCreatePageParameters","searchPages","pages","parameters","offset","resultIndex","nextIndex","response","d","p","page","moreResults","error","listPages","buildDatabaseProperties","schemaProperties","requiredFields","fieldName","field","option","updateTable","id","newName","newProperties","createTable","name","schema","pageId","data","table","checkPage","databaseProperties","key","value","values","v"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
3
|
import{Type as t}from"@sinclair/typebox";var o=t.Object({access_token:t.String(),refresh_token:t.String()});export{o as notionOAuthTokenSchema};
|
|
4
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/shared/datarecords/external/notion/oauth/config.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const notionOAuthTokenSchema = Type.Object({\n access_token: Type.String(),\n refresh_token: Type.String(),\n});\nexport type NotionOAuthToken = Static<typeof notionOAuthTokenSchema>;\n"],"mappings":";;AAAA,OAAS,QAAAA,MAAyB,oBAE3B,IAAMC,EAAyBD,EAAK,OAAO,CAChD,aAAcA,EAAK,OAAO,EAC1B,cAAeA,EAAK,OAAO,CAC7B,CAAC","names":["Type","notionOAuthTokenSchema"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a}from"../../../chunk-
|
|
3
|
+
import{a}from"../../../chunk-IUXCWWGO.js";export{a as notionOptions};
|
|
4
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a,b,c,d}from"../chunk-
|
|
3
|
+
import{a,b,c,d}from"../chunk-ZQPXQCY2.js";import"../chunk-GPEMPZXK.js";import"../chunk-GLS7HPIZ.js";import"../chunk-IUXCWWGO.js";export{a as connectorSchema,b as datarecordsConnectors,d as datarecordsList,c as internalDatarecordManifest};
|
|
4
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/datarecords.ts"],"sourcesContent":["import type { Datarecord } from \"./datarecords/types\";\n\nexport function defineDataRecord<T extends Datarecord>(datarecord: T) {\n return datarecord;\n}\n"],"mappings":";;AAEO,SAASA,EAAuCC,EAAe,CACpE,OAAOA,CACT","names":["defineDataRecord","datarecord"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a as e}from"../../../../chunk-
|
|
3
|
+
import{a as e}from"../../../../chunk-6HLU4UI2.js";import{a as o}from"../../../../chunk-DCH4ZKWT.js";var c=async({options:a,oauth:s})=>{let r=new URLSearchParams({...e(a),fields:["from","permalink_url","name","description","caption","id","is_hidden","message","application","object_id","link","is_published","properties","status_type","story","type","actions","call_to_action","child_attachments"].join(","),access_token:s.config.accessToken}),t=await fetch(`https://graph.facebook.com/me/posts?${r}`);if(!t.ok)throw t.status===401?new o("fetchFacebookPostDatasource Error: Unauthorized."):new Error(`fetchFacebookPostDatasource Error: Response status: ${t.status}`);return await t.json()},m=c;export{m as default};
|
|
4
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/shared/datasources/external/facebook/posts/fetcher.ts"],"sourcesContent":["import { facebookPostSchema, type FacebookPostSchema } from \"./schema\";\nimport type { MetaFullOAuthConfig } from \"../../meta/oauth/config\";\nimport { UnauthorizedError } from \"~/shared/errors\";\nimport type { MetaOptions } from \"../../meta/options\";\nimport { stringifyObjectValues } from \"../../../utils\";\nimport type { DatasourceFetcher } from \"~/shared/datasources/fetcher\";\n\nconst fetchFacebookPostDatasource: DatasourceFetcher<\n FacebookPostSchema,\n MetaFullOAuthConfig,\n MetaOptions\n> = async ({ options, oauth }) => {\n const params = new URLSearchParams({\n ...stringifyObjectValues(options),\n fields: [\n \"from\",\n \"permalink_url\",\n \"name\",\n \"description\",\n \"caption\",\n \"id\",\n \"is_hidden\",\n \"message\",\n \"application\",\n \"object_id\",\n \"link\",\n \"is_published\",\n \"properties\",\n \"status_type\",\n \"story\",\n \"type\",\n \"actions\",\n \"call_to_action\",\n \"child_attachments\",\n ].join(\",\"),\n access_token: oauth.config.accessToken,\n });\n\n const response = await fetch(`https://graph.facebook.com/me/posts?${params}`);\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new UnauthorizedError(`fetchFacebookPostDatasource Error: Unauthorized.`);\n }\n throw new Error(`fetchFacebookPostDatasource Error: Response status: ${response.status}`);\n }\n\n const post = (await response.json()) as FacebookPostSchema;\n return post;\n};\n\nexport default fetchFacebookPostDatasource;\n"],"mappings":";;oGAOA,IAAMA,EAIF,MAAO,CAAE,QAAAC,EAAS,MAAAC,CAAM,IAAM,CAChC,IAAMC,EAAS,IAAI,gBAAgB,CACjC,GAAGC,EAAsBH,CAAO,EAChC,OAAQ,CACN,OACA,gBACA,OACA,cACA,UACA,KACA,YACA,UACA,cACA,YACA,OACA,eACA,aACA,cACA,QACA,OACA,UACA,iBACA,mBACF,EAAE,KAAK,GAAG,EACV,aAAcC,EAAM,OAAO,WAC7B,CAAC,EAEKG,EAAW,MAAM,MAAM,uCAAuCF,CAAM,EAAE,EAE5E,GAAI,CAACE,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAIC,EAAkB,kDAAkD,EAE1E,IAAI,MAAM,uDAAuDD,EAAS,MAAM,EAAE,EAI1F,OADc,MAAMA,EAAS,KAAK,CAEpC,EAEOE,EAAQP","names":["fetchFacebookPostDatasource","options","oauth","params","stringifyObjectValues","response","UnauthorizedError","fetcher_default"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
3
|
import{Type as t}from"@sinclair/typebox";var e=t.Object({data:t.Array(t.Object({from:t.Object({name:t.String(),id:t.String()}),id:t.String(),permalink_url:t.String(),is_hidden:t.Boolean(),message:t.Optional(t.String()),object_id:t.String(),link:t.String(),is_published:t.Boolean(),status_type:t.String(),type:t.String(),actions:t.Array(t.Object({name:t.String(),link:t.String()}))})),paging:t.Object({previous:t.Optional(t.String()),next:t.Optional(t.String())})});export{e as facebookPostSchema};
|
|
4
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/shared/datasources/external/facebook/posts/schema.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const facebookPostSchema = Type.Object({\n data: Type.Array(\n Type.Object({\n from: Type.Object({\n name: Type.String(),\n id: Type.String(),\n }),\n id: Type.String(),\n permalink_url: Type.String(),\n is_hidden: Type.Boolean(),\n message: Type.Optional(Type.String()),\n object_id: Type.String(),\n link: Type.String(),\n is_published: Type.Boolean(),\n status_type: Type.String(),\n type: Type.String(),\n actions: Type.Array(\n Type.Object({\n name: Type.String(),\n link: Type.String(),\n }),\n ),\n }),\n ),\n paging: Type.Object({\n previous: Type.Optional(Type.String()),\n next: Type.Optional(Type.String()),\n }),\n});\n\nexport type FacebookPostSchema = Static<typeof facebookPostSchema>;\n"],"mappings":";;AAAA,OAAS,QAAAA,MAAyB,oBAE3B,IAAMC,EAAqBD,EAAK,OAAO,CAC5C,KAAMA,EAAK,MACTA,EAAK,OAAO,CACV,KAAMA,EAAK,OAAO,CAChB,KAAMA,EAAK,OAAO,EAClB,GAAIA,EAAK,OAAO,CAClB,CAAC,EACD,GAAIA,EAAK,OAAO,EAChB,cAAeA,EAAK,OAAO,EAC3B,UAAWA,EAAK,QAAQ,EACxB,QAASA,EAAK,SAASA,EAAK,OAAO,CAAC,EACpC,UAAWA,EAAK,OAAO,EACvB,KAAMA,EAAK,OAAO,EAClB,aAAcA,EAAK,QAAQ,EAC3B,YAAaA,EAAK,OAAO,EACzB,KAAMA,EAAK,OAAO,EAClB,QAASA,EAAK,MACZA,EAAK,OAAO,CACV,KAAMA,EAAK,OAAO,EAClB,KAAMA,EAAK,OAAO,CACpB,CAAC,CACH,CACF,CAAC,CACH,EACA,OAAQA,EAAK,OAAO,CAClB,SAAUA,EAAK,SAASA,EAAK,OAAO,CAAC,EACrC,KAAMA,EAAK,SAASA,EAAK,OAAO,CAAC,CACnC,CAAC,CACH,CAAC","names":["Type","facebookPostSchema"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{b as c,c as r}from"../../../chunk-
|
|
3
|
+
import{b as c,c as r}from"../../../chunk-6HLU4UI2.js";var f=async({options:e,pageAttributes:n})=>{let o=c(n),a=e.url.replace(r,o),s={};if(e.headers)for(let[p,l]of Object.entries(e.headers??{}))s[p]=l.replace(r,o);let t=await fetch(a,{headers:s});if(!t.ok)throw new Error(`fetchHttpJSON Error: Response status: ${t.status}`);return t.json()},i=f;export{i as default};
|
|
4
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/shared/datasources/external/http-json/fetcher.ts"],"sourcesContent":["import type { DatasourceFetcher } from \"../../fetcher\";\nimport { createPlaceholderReplacer, placeholderRx } from \"../../utils\";\nimport type { HttpJsonOptions } from \"./options\";\n\n/**\n * For this fetcher, validation is done outside of the fetcher.\n */\nconst fetchHttpJSON: DatasourceFetcher<unknown, null, HttpJsonOptions> = async ({\n options,\n pageAttributes,\n}) => {\n const replacer = createPlaceholderReplacer(pageAttributes);\n const url = options.url.replace(placeholderRx, replacer);\n const headers: Record<string, string> = {};\n\n if (options.headers) {\n for (const [key, value] of Object.entries(options.headers ?? {})) {\n headers[key] = (value as string).replace(placeholderRx, replacer);\n }\n }\n\n const response = await fetch(url, { headers });\n\n if (!response.ok) {\n throw new Error(`fetchHttpJSON Error: Response status: ${response.status}`);\n }\n\n return response.json();\n};\n\nexport default fetchHttpJSON;\n"],"mappings":";;sDAOA,IAAMA,EAAmE,MAAO,CAC9E,QAAAC,EACA,eAAAC,CACF,IAAM,CACJ,IAAMC,EAAWC,EAA0BF,CAAc,EACnDG,EAAMJ,EAAQ,IAAI,QAAQK,EAAeH,CAAQ,EACjDI,EAAkC,CAAC,EAEzC,GAAIN,EAAQ,QACV,OAAW,CAACO,EAAKC,CAAK,IAAK,OAAO,QAAQR,EAAQ,SAAW,CAAC,CAAC,EAC7DM,EAAQC,CAAG,EAAKC,EAAiB,QAAQH,EAAeH,CAAQ,EAIpE,IAAMO,EAAW,MAAM,MAAML,EAAK,CAAE,QAAAE,CAAQ,CAAC,EAE7C,GAAI,CAACG,EAAS,GACZ,MAAM,IAAI,MAAM,yCAAyCA,EAAS,MAAM,EAAE,EAG5E,OAAOA,EAAS,KAAK,CACvB,EAEOC,EAAQX","names":["fetchHttpJSON","options","pageAttributes","replacer","createPlaceholderReplacer","url","placeholderRx","headers","key","value","response","fetcher_default"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
3
|
import{Type as t}from"@sinclair/typebox";var p=t.Object({url:t.String({format:"uri"}),headers:t.Optional(t.Record(t.String(),t.String()))});export{p as httpJsonOptions};
|
|
4
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/shared/datasources/external/http-json/options.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const httpJsonOptions = Type.Object({\n url: Type.String({ format: \"uri\" }),\n headers: Type.Optional(Type.Record(Type.String(), Type.String())),\n});\n\nexport type HttpJsonOptions = Static<typeof httpJsonOptions>;\n"],"mappings":";;AAAA,OAAS,QAAAA,MAAyB,oBAE3B,IAAMC,EAAkBD,EAAK,OAAO,CACzC,IAAKA,EAAK,OAAO,CAAE,OAAQ,KAAM,CAAC,EAClC,QAASA,EAAK,SAASA,EAAK,OAAOA,EAAK,OAAO,EAAGA,EAAK,OAAO,CAAC,CAAC,CAClE,CAAC","names":["Type","httpJsonOptions"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
3
|
import{Type as t}from"@sinclair/typebox";var e=t.Object({},{additionalProperties:!0}),o=t.Array(e,{title:"Http JSON"});export{o as jsonArraySchema,e as jsonObjectSchema};
|
|
4
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/shared/datasources/external/http-json/schema.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const jsonObjectSchema = Type.Object({}, { additionalProperties: true });\nexport const jsonArraySchema = Type.Array(jsonObjectSchema, { title: \"Http JSON\" });\n\nexport type JSONArraySchema = Static<typeof jsonArraySchema>;\n"],"mappings":";;AAAA,OAAS,QAAAA,MAAyB,oBAE3B,IAAMC,EAAmBD,EAAK,OAAO,CAAC,EAAG,CAAE,qBAAsB,EAAK,CAAC,EACjEE,EAAkBF,EAAK,MAAMC,EAAkB,CAAE,MAAO,WAAY,CAAC","names":["Type","jsonObjectSchema","jsonArraySchema"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a}from"../../../../chunk-
|
|
3
|
+
import{a}from"../../../../chunk-6HLU4UI2.js";import{a as t}from"../../../../chunk-DCH4ZKWT.js";var n=async({options:r,oauth:s})=>{let o=new URLSearchParams({...a(r),access_token:s.config.accessToken,fields:["id","caption","timestamp","thumbnail_url","media_url","permalink","media_type"].join(",")}),e=await fetch(`https://graph.instagram.com/me/media?${o.toString()}`);if(!e.ok)throw e.status===401?new t("fetchInstagramFeedDatasource Error: Unauthorized."):new Error(`fetchInstagramFeedDatasource Error: Response status: ${e.status}`);return await e.json()},h=n;export{h as default};
|
|
4
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/shared/datasources/external/instagram/feed/fetcher.ts"],"sourcesContent":["import type { InstagramFeedSchema } from \"./schema\";\nimport type { MetaFullOAuthConfig } from \"~/shared/datasources/external/meta/oauth/config\";\nimport { UnauthorizedError } from \"~/shared/errors\";\nimport type { MetaOptions } from \"~/shared/datasources/external/meta/options\";\nimport { stringifyObjectValues } from \"~/shared/datasources/utils\";\nimport type { DatasourceFetcher } from \"~/shared/datasources/fetcher\";\n\nconst fetchInstagramFeedDatasource: DatasourceFetcher<\n InstagramFeedSchema,\n MetaFullOAuthConfig,\n MetaOptions\n> = async ({ options, oauth }) => {\n const params = new URLSearchParams({\n ...stringifyObjectValues(options),\n access_token: oauth.config.accessToken,\n fields: [\"id\", \"caption\", \"timestamp\", \"thumbnail_url\", \"media_url\", \"permalink\", \"media_type\"].join(\",\"),\n });\n\n const response = await fetch(`https://graph.instagram.com/me/media?${params.toString()}`);\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new UnauthorizedError(`fetchInstagramFeedDatasource Error: Unauthorized.`);\n }\n throw new Error(`fetchInstagramFeedDatasource Error: Response status: ${response.status}`);\n }\n\n const feed = (await response.json()) as InstagramFeedSchema;\n\n return feed;\n};\n\nexport default fetchInstagramFeedDatasource;\n"],"mappings":";;+FAOA,IAAMA,EAIF,MAAO,CAAE,QAAAC,EAAS,MAAAC,CAAM,IAAM,CAChC,IAAMC,EAAS,IAAI,gBAAgB,CACjC,GAAGC,EAAsBH,CAAO,EAChC,aAAcC,EAAM,OAAO,YAC3B,OAAQ,CAAC,KAAM,UAAW,YAAa,gBAAiB,YAAa,YAAa,YAAY,EAAE,KAAK,GAAG,CAC1G,CAAC,EAEKG,EAAW,MAAM,MAAM,wCAAwCF,EAAO,SAAS,CAAC,EAAE,EAExF,GAAI,CAACE,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAIC,EAAkB,mDAAmD,EAE3E,IAAI,MAAM,wDAAwDD,EAAS,MAAM,EAAE,EAK3F,OAFc,MAAMA,EAAS,KAAK,CAGpC,EAEOE,EAAQP","names":["fetchInstagramFeedDatasource","options","oauth","params","stringifyObjectValues","response","UnauthorizedError","fetcher_default"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
3
|
import{Type as t}from"@sinclair/typebox";var a=t.Object({data:t.Array(t.Object({id:t.String(),caption:t.String(),timestamp:t.String(),media_url:t.String(),permalink:t.String(),media_type:t.Union([t.Literal("IMAGE"),t.Literal("VIDEO"),t.Literal("CAROUSEL_ALBUM")])})),paging:t.Object({cursors:t.Object({before:t.Optional(t.String()),after:t.Optional(t.String())}),next:t.Optional(t.String())})});export{a as instagramFeedSchema};
|
|
4
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/shared/datasources/external/instagram/feed/schema.ts"],"sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport const instagramFeedSchema = Type.Object({\n data: Type.Array(\n Type.Object({\n id: Type.String(),\n caption: Type.String(),\n timestamp: Type.String(),\n media_url: Type.String(),\n permalink: Type.String(),\n media_type: Type.Union([Type.Literal(\"IMAGE\"), Type.Literal(\"VIDEO\"), Type.Literal(\"CAROUSEL_ALBUM\")]),\n }),\n ),\n paging: Type.Object({\n cursors: Type.Object({\n before: Type.Optional(Type.String()),\n after: Type.Optional(Type.String()),\n }),\n next: Type.Optional(Type.String()),\n }),\n});\n\nexport type InstagramFeedSchema = Static<typeof instagramFeedSchema>;\n"],"mappings":";;AAAA,OAAS,QAAAA,MAAyB,oBAE3B,IAAMC,EAAsBD,EAAK,OAAO,CAC7C,KAAMA,EAAK,MACTA,EAAK,OAAO,CACV,GAAIA,EAAK,OAAO,EAChB,QAASA,EAAK,OAAO,EACrB,UAAWA,EAAK,OAAO,EACvB,UAAWA,EAAK,OAAO,EACvB,UAAWA,EAAK,OAAO,EACvB,WAAYA,EAAK,MAAM,CAACA,EAAK,QAAQ,OAAO,EAAGA,EAAK,QAAQ,OAAO,EAAGA,EAAK,QAAQ,gBAAgB,CAAC,CAAC,CACvG,CAAC,CACH,EACA,OAAQA,EAAK,OAAO,CAClB,QAASA,EAAK,OAAO,CACnB,OAAQA,EAAK,SAASA,EAAK,OAAO,CAAC,EACnC,MAAOA,EAAK,SAASA,EAAK,OAAO,CAAC,CACpC,CAAC,EACD,KAAMA,EAAK,SAASA,EAAK,OAAO,CAAC,CACnC,CAAC,CACH,CAAC","names":["Type","instagramFeedSchema"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a}from"../../../../chunk-
|
|
3
|
+
import{a}from"../../../../chunk-KO5FPOWZ.js";export{a as default};
|
|
4
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Upstart.gg - Copyright (C) 2024 Flippable - https://github.com/upstart-gg/upstart/blob/main/LICENSE */
|
|
2
2
|
|
|
3
|
-
import{a}from"../../../../chunk-
|
|
3
|
+
import{a}from"../../../../chunk-VEDQV5XO.js";export{a as mastodonAccountSchema};
|
|
4
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|