@upstart.gg/sdk 0.0.95 → 0.0.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/dist/node/cli/api.js +2 -2
  2. package/dist/node/cli/api.js.map +1 -1
  3. package/dist/node/cli/commands/login/cmd-login.js +6 -6
  4. package/dist/node/cli/commands/login/cmd-login.js.map +1 -1
  5. package/dist/node/cli/commands/logout/cmd-logout.js +2 -2
  6. package/dist/node/cli/commands/publish/cmd-publish.d.ts.map +1 -1
  7. package/dist/node/cli/commands/publish/cmd-publish.js +18 -18
  8. package/dist/node/cli/commands/publish/cmd-publish.js.map +1 -1
  9. package/dist/node/cli/commands/publish/uploader.js +7 -7
  10. package/dist/node/cli/commands/publish/uploader.js.map +1 -1
  11. package/dist/node/cli/is-logged-in.js +2 -2
  12. package/dist/node/cli/is-logged-in.js.map +1 -1
  13. package/dist/node/cli/program.js +24 -24
  14. package/dist/node/cli/program.js.map +1 -1
  15. package/dist/node/shared/config.d.ts +4 -14
  16. package/dist/node/shared/config.d.ts.map +1 -1
  17. package/dist/node/shared/config.js +4 -4
  18. package/dist/node/shared/config.js.map +1 -1
  19. package/dist/node/shared/logger.d.ts.map +1 -1
  20. package/dist/node/shared/logger.js +2 -2
  21. package/dist/node/shared/logger.js.map +1 -1
  22. package/dist/shared/ajv.d.ts +2 -0
  23. package/dist/shared/ajv.d.ts.map +1 -1
  24. package/dist/shared/ajv.js +1 -1
  25. package/dist/shared/attributes.d.ts +45 -83
  26. package/dist/shared/attributes.d.ts.map +1 -1
  27. package/dist/shared/attributes.js +1 -1
  28. package/dist/shared/brick-manifest.d.ts +7 -17
  29. package/dist/shared/brick-manifest.d.ts.map +1 -1
  30. package/dist/shared/brick-manifest.js +1 -1
  31. package/dist/shared/bricks/manifests/accordion.manifest.d.ts +111 -0
  32. package/dist/shared/bricks/manifests/accordion.manifest.d.ts.map +1 -0
  33. package/dist/shared/bricks/manifests/accordion.manifest.js +3 -0
  34. package/dist/shared/bricks/manifests/all-manifests.d.ts +5 -0
  35. package/dist/shared/bricks/manifests/all-manifests.d.ts.map +1 -1
  36. package/dist/shared/bricks/manifests/all-manifests.js +1 -1
  37. package/dist/shared/bricks/manifests/button.manifest.d.ts +22 -13
  38. package/dist/shared/bricks/manifests/button.manifest.d.ts.map +1 -1
  39. package/dist/shared/bricks/manifests/button.manifest.js +1 -1
  40. package/dist/shared/bricks/manifests/card.manifest.d.ts +44 -54
  41. package/dist/shared/bricks/manifests/card.manifest.d.ts.map +1 -1
  42. package/dist/shared/bricks/manifests/card.manifest.js +1 -1
  43. package/dist/shared/bricks/manifests/carousel.manifest.d.ts +39 -12
  44. package/dist/shared/bricks/manifests/carousel.manifest.d.ts.map +1 -1
  45. package/dist/shared/bricks/manifests/carousel.manifest.js +1 -1
  46. package/dist/shared/bricks/manifests/container.manifest.d.ts +49 -172
  47. package/dist/shared/bricks/manifests/container.manifest.d.ts.map +1 -1
  48. package/dist/shared/bricks/manifests/container.manifest.js +1 -1
  49. package/dist/shared/bricks/manifests/divider.manifest.d.ts +63 -0
  50. package/dist/shared/bricks/manifests/divider.manifest.d.ts.map +1 -0
  51. package/dist/shared/bricks/manifests/divider.manifest.js +3 -0
  52. package/dist/shared/bricks/manifests/footer.manifest.d.ts +30 -35
  53. package/dist/shared/bricks/manifests/footer.manifest.d.ts.map +1 -1
  54. package/dist/shared/bricks/manifests/footer.manifest.js +1 -1
  55. package/dist/shared/bricks/manifests/form.manifest.d.ts +22 -12
  56. package/dist/shared/bricks/manifests/form.manifest.d.ts.map +1 -1
  57. package/dist/shared/bricks/manifests/form.manifest.js +1 -1
  58. package/dist/shared/bricks/manifests/hero.manifest.d.ts +31 -71
  59. package/dist/shared/bricks/manifests/hero.manifest.d.ts.map +1 -1
  60. package/dist/shared/bricks/manifests/hero.manifest.js +1 -1
  61. package/dist/shared/bricks/manifests/icon.manifest.d.ts +18 -12
  62. package/dist/shared/bricks/manifests/icon.manifest.d.ts.map +1 -1
  63. package/dist/shared/bricks/manifests/icon.manifest.js +1 -1
  64. package/dist/shared/bricks/manifests/image.manifest.d.ts +36 -50
  65. package/dist/shared/bricks/manifests/image.manifest.d.ts.map +1 -1
  66. package/dist/shared/bricks/manifests/image.manifest.js +1 -1
  67. package/dist/shared/bricks/manifests/images-gallery.manifest.d.ts +55 -115
  68. package/dist/shared/bricks/manifests/images-gallery.manifest.d.ts.map +1 -1
  69. package/dist/shared/bricks/manifests/images-gallery.manifest.js +1 -1
  70. package/dist/shared/bricks/manifests/map.manifest.d.ts +36 -12
  71. package/dist/shared/bricks/manifests/map.manifest.d.ts.map +1 -1
  72. package/dist/shared/bricks/manifests/map.manifest.js +1 -1
  73. package/dist/shared/bricks/manifests/navbar.manifest.d.ts +160 -0
  74. package/dist/shared/bricks/manifests/navbar.manifest.d.ts.map +1 -0
  75. package/dist/shared/bricks/manifests/navbar.manifest.js +3 -0
  76. package/dist/shared/bricks/manifests/sidebar.manifest.d.ts +83 -12
  77. package/dist/shared/bricks/manifests/sidebar.manifest.d.ts.map +1 -1
  78. package/dist/shared/bricks/manifests/sidebar.manifest.js +1 -1
  79. package/dist/shared/bricks/manifests/social-links.manifest.d.ts +37 -12
  80. package/dist/shared/bricks/manifests/social-links.manifest.d.ts.map +1 -1
  81. package/dist/shared/bricks/manifests/social-links.manifest.js +1 -1
  82. package/dist/shared/bricks/manifests/testimonials.manifest.d.ts +94 -0
  83. package/dist/shared/bricks/manifests/testimonials.manifest.d.ts.map +1 -0
  84. package/dist/shared/bricks/manifests/testimonials.manifest.js +3 -0
  85. package/dist/shared/bricks/manifests/text.manifest.d.ts +31 -63
  86. package/dist/shared/bricks/manifests/text.manifest.d.ts.map +1 -1
  87. package/dist/shared/bricks/manifests/text.manifest.js +1 -1
  88. package/dist/shared/bricks/manifests/timeline.manifest.d.ts +122 -0
  89. package/dist/shared/bricks/manifests/timeline.manifest.d.ts.map +1 -0
  90. package/dist/shared/bricks/manifests/timeline.manifest.js +3 -0
  91. package/dist/shared/bricks/manifests/video.manifest.d.ts +38 -12
  92. package/dist/shared/bricks/manifests/video.manifest.d.ts.map +1 -1
  93. package/dist/shared/bricks/manifests/video.manifest.js +1 -1
  94. package/dist/shared/bricks/props/_style-presets.d.ts +1 -1
  95. package/dist/shared/bricks/props/_style-presets.d.ts.map +1 -1
  96. package/dist/shared/bricks/props/_style-presets.js +1 -1
  97. package/dist/shared/bricks/props/align.d.ts +7 -3
  98. package/dist/shared/bricks/props/align.d.ts.map +1 -1
  99. package/dist/shared/bricks/props/align.js +1 -1
  100. package/dist/shared/bricks/props/background.d.ts +8 -1
  101. package/dist/shared/bricks/props/background.d.ts.map +1 -1
  102. package/dist/shared/bricks/props/background.js +1 -1
  103. package/dist/shared/bricks/props/boolean.js +1 -1
  104. package/dist/shared/bricks/props/border.d.ts +24 -22
  105. package/dist/shared/bricks/props/border.d.ts.map +1 -1
  106. package/dist/shared/bricks/props/border.js +1 -1
  107. package/dist/shared/bricks/props/color.d.ts +5 -0
  108. package/dist/shared/bricks/props/color.d.ts.map +1 -0
  109. package/dist/shared/bricks/props/color.js +3 -0
  110. package/dist/shared/bricks/props/common.d.ts +9 -1
  111. package/dist/shared/bricks/props/common.d.ts.map +1 -1
  112. package/dist/shared/bricks/props/common.js +1 -1
  113. package/dist/shared/bricks/props/container.d.ts +37 -45
  114. package/dist/shared/bricks/props/container.d.ts.map +1 -1
  115. package/dist/shared/bricks/props/container.js +1 -1
  116. package/dist/shared/bricks/props/css-length.d.ts +5 -0
  117. package/dist/shared/bricks/props/css-length.d.ts.map +1 -0
  118. package/dist/shared/bricks/props/css-length.js +3 -0
  119. package/dist/shared/bricks/props/datasource.d.ts +9 -13
  120. package/dist/shared/bricks/props/datasource.d.ts.map +1 -1
  121. package/dist/shared/bricks/props/datasource.js +1 -1
  122. package/dist/shared/bricks/props/date.d.ts +4 -0
  123. package/dist/shared/bricks/props/date.d.ts.map +1 -0
  124. package/dist/shared/bricks/props/date.js +3 -0
  125. package/dist/shared/bricks/props/effects.d.ts +4 -21
  126. package/dist/shared/bricks/props/effects.d.ts.map +1 -1
  127. package/dist/shared/bricks/props/effects.js +1 -1
  128. package/dist/shared/bricks/props/enum.d.ts +13 -0
  129. package/dist/shared/bricks/props/enum.d.ts.map +1 -0
  130. package/dist/shared/bricks/props/enum.js +3 -0
  131. package/dist/shared/bricks/props/file.d.ts +2 -0
  132. package/dist/shared/bricks/props/file.d.ts.map +1 -0
  133. package/dist/shared/bricks/props/file.js +3 -0
  134. package/dist/shared/bricks/props/geolocation.d.ts +16 -0
  135. package/dist/shared/bricks/props/geolocation.d.ts.map +1 -0
  136. package/dist/shared/bricks/props/geolocation.js +3 -0
  137. package/dist/shared/bricks/props/helpers.d.ts +8 -4
  138. package/dist/shared/bricks/props/helpers.d.ts.map +1 -1
  139. package/dist/shared/bricks/props/helpers.js +1 -1
  140. package/dist/shared/bricks/props/image.d.ts +7 -1
  141. package/dist/shared/bricks/props/image.d.ts.map +1 -1
  142. package/dist/shared/bricks/props/image.js +1 -1
  143. package/dist/shared/bricks/props/number.js +1 -1
  144. package/dist/shared/bricks/props/padding.d.ts +2 -1
  145. package/dist/shared/bricks/props/padding.d.ts.map +1 -1
  146. package/dist/shared/bricks/props/padding.js +1 -1
  147. package/dist/shared/bricks/props/position.d.ts.map +1 -1
  148. package/dist/shared/bricks/props/position.js +1 -1
  149. package/dist/shared/bricks/props/preset.d.ts +92 -0
  150. package/dist/shared/bricks/props/preset.d.ts.map +1 -0
  151. package/dist/shared/bricks/props/preset.js +3 -0
  152. package/dist/shared/bricks/props/string.d.ts +8 -3
  153. package/dist/shared/bricks/props/string.d.ts.map +1 -1
  154. package/dist/shared/bricks/props/string.js +1 -1
  155. package/dist/shared/bricks/props/text.d.ts +3 -4
  156. package/dist/shared/bricks/props/text.d.ts.map +1 -1
  157. package/dist/shared/bricks/props/text.js +1 -1
  158. package/dist/shared/bricks/props/types.d.ts +5 -2
  159. package/dist/shared/bricks/props/types.d.ts.map +1 -1
  160. package/dist/shared/bricks.d.ts +243 -134
  161. package/dist/shared/bricks.d.ts.map +1 -1
  162. package/dist/shared/bricks.js +1 -1
  163. package/dist/shared/chunk-2AJYHJFG.js +8 -0
  164. package/dist/shared/chunk-2FHWS73Y.js +6 -0
  165. package/dist/shared/chunk-3FJVF357.js +3 -0
  166. package/dist/shared/chunk-3RHYJ6E7.js +5 -0
  167. package/dist/shared/chunk-3VZACK2Y.js +3 -0
  168. package/dist/shared/chunk-3XCKZ4JQ.js +3 -0
  169. package/dist/shared/chunk-4MPRHJWO.js +3 -0
  170. package/dist/shared/chunk-5EOWW7BX.js +4 -0
  171. package/dist/shared/chunk-5HYPCOSS.js +3 -0
  172. package/dist/shared/chunk-5K5C6XFX.js +3 -0
  173. package/dist/shared/chunk-6QS5PKLA.js +3 -0
  174. package/dist/shared/chunk-74EL657O.js +3 -0
  175. package/dist/shared/chunk-AJDYOLKP.js +3 -0
  176. package/dist/shared/chunk-ALFOZHAH.js +3 -0
  177. package/dist/shared/{chunk-FGU4BGP4.js → chunk-ATDJCXC2.js} +1 -1
  178. package/dist/shared/chunk-BJSO43AS.js +3 -0
  179. package/dist/shared/chunk-BTKLQQZA.js +3 -0
  180. package/dist/shared/chunk-CAVNF3BU.js +3 -0
  181. package/dist/shared/chunk-CCNU3J56.js +3 -0
  182. package/dist/shared/chunk-CTRS76PX.js +3 -0
  183. package/dist/shared/chunk-DCH2FI6T.js +8 -0
  184. package/dist/shared/chunk-DFSQR6QC.js +3 -0
  185. package/dist/shared/chunk-ENU4SEHO.js +3 -0
  186. package/dist/shared/chunk-G7LX3UKQ.js +3 -0
  187. package/dist/shared/chunk-GGJBTPGW.js +3 -0
  188. package/dist/shared/chunk-H24R3IWA.js +3 -0
  189. package/dist/shared/chunk-HYVQXAK5.js +3 -0
  190. package/dist/shared/chunk-LKVQQQTI.js +3 -0
  191. package/dist/shared/chunk-MITJPRGD.js +6 -0
  192. package/dist/shared/chunk-NLZBY65T.js +3 -0
  193. package/dist/shared/chunk-OUI2VDNM.js +3 -0
  194. package/dist/shared/chunk-OYIL5SCU.js +3 -0
  195. package/dist/shared/chunk-P5DZK4TS.js +3 -0
  196. package/dist/shared/chunk-PK3R5VOF.js +3 -0
  197. package/dist/shared/chunk-QPATZM3I.js +3 -0
  198. package/dist/shared/chunk-RDBEWW4G.js +7 -0
  199. package/dist/shared/chunk-RPBQZW5I.js +3 -0
  200. package/dist/shared/chunk-SLSIAUYV.js +3 -0
  201. package/dist/shared/chunk-SUG225LF.js +3 -0
  202. package/dist/shared/chunk-U5XOIYSS.js +3 -0
  203. package/dist/shared/{chunk-HIZPJNEM.js → chunk-UL7L3HYV.js} +1 -1
  204. package/dist/shared/chunk-V6BCYHZH.js +3 -0
  205. package/dist/shared/chunk-VA5LFJVE.js +3 -0
  206. package/dist/shared/chunk-VAC73HJE.js +3 -0
  207. package/dist/shared/chunk-VBWC36L2.js +3 -0
  208. package/dist/shared/chunk-VLGLD6GR.js +3 -0
  209. package/dist/shared/chunk-VTFWVTPI.js +3 -0
  210. package/dist/shared/chunk-WAAKB6OB.js +3 -0
  211. package/dist/shared/chunk-Y36SM2AO.js +3 -0
  212. package/dist/shared/chunk-Y7CEEEVW.js +3 -0
  213. package/dist/shared/chunk-YZ5Y4WE6.js +3 -0
  214. package/dist/shared/chunk-Z7SYP6FG.js +3 -0
  215. package/dist/shared/chunk-ZJNA4QQC.js +3 -0
  216. package/dist/shared/chunk-ZMDHKAWL.js +3 -0
  217. package/dist/shared/context.d.ts +38 -0
  218. package/dist/shared/context.d.ts.map +1 -0
  219. package/dist/shared/{chunk-WJ5CDDXW.js → context.js} +0 -1
  220. package/dist/shared/datarecords/types.d.ts +40 -20
  221. package/dist/shared/datarecords/types.d.ts.map +1 -1
  222. package/dist/shared/datarecords/types.js +1 -1
  223. package/dist/shared/datasources/external/http-json/fetcher.d.ts.map +1 -0
  224. package/dist/shared/datasources/external/http-json/options.d.ts.map +1 -0
  225. package/dist/shared/datasources/external/{json → http-json}/schema.d.ts +0 -1
  226. package/dist/shared/datasources/external/http-json/schema.d.ts.map +1 -0
  227. package/dist/shared/datasources/external/http-json/tests/fetcher.test.d.ts.map +1 -0
  228. package/dist/shared/datasources/external/rss/fetcher.d.ts.map +1 -1
  229. package/dist/shared/datasources/external/rss/sample.d.ts.map +1 -1
  230. package/dist/shared/datasources/external/rss/schema.d.ts +7 -13
  231. package/dist/shared/datasources/external/rss/schema.d.ts.map +1 -1
  232. package/dist/shared/datasources/external/youtube/list/sample.d.ts +23 -32
  233. package/dist/shared/datasources/external/youtube/list/sample.d.ts.map +1 -1
  234. package/dist/shared/datasources/external/youtube/list/schema.d.ts +24 -33
  235. package/dist/shared/datasources/external/youtube/list/schema.d.ts.map +1 -1
  236. package/dist/shared/datasources/internal/blog/schema.d.ts.map +1 -1
  237. package/dist/shared/datasources/internal/changelog/schema.d.ts.map +1 -1
  238. package/dist/shared/datasources/internal/recipes/schema.d.ts.map +1 -1
  239. package/dist/shared/datasources/samples.d.ts +1 -1
  240. package/dist/shared/datasources/samples.d.ts.map +1 -1
  241. package/dist/shared/datasources/schemas.d.ts +33 -583
  242. package/dist/shared/datasources/schemas.d.ts.map +1 -1
  243. package/dist/shared/datasources/schemas.js +1 -1
  244. package/dist/shared/datasources/types.d.ts +75 -1314
  245. package/dist/shared/datasources/types.d.ts.map +1 -1
  246. package/dist/shared/datasources/types.js +1 -1
  247. package/dist/shared/datasources.d.ts +14 -0
  248. package/dist/shared/datasources.d.ts.map +1 -1
  249. package/dist/shared/datasources.js +1 -1
  250. package/dist/shared/images.d.ts +30 -0
  251. package/dist/shared/images.d.ts.map +1 -0
  252. package/dist/shared/images.js +3 -0
  253. package/dist/shared/layout-constants.js +1 -1
  254. package/dist/shared/page.d.ts +110 -2676
  255. package/dist/shared/page.d.ts.map +1 -1
  256. package/dist/shared/page.js +1 -1
  257. package/dist/shared/prompt.d.ts +4 -0
  258. package/dist/shared/prompt.d.ts.map +1 -0
  259. package/dist/shared/prompt.js +3 -0
  260. package/dist/shared/responsive.d.ts +3 -3
  261. package/dist/shared/responsive.d.ts.map +1 -1
  262. package/dist/shared/responsive.js +1 -1
  263. package/dist/shared/site.d.ts +545 -0
  264. package/dist/shared/site.d.ts.map +1 -0
  265. package/dist/shared/site.js +3 -0
  266. package/dist/shared/sitemap.d.ts +38 -0
  267. package/dist/shared/sitemap.d.ts.map +1 -0
  268. package/dist/shared/sitemap.js +3 -0
  269. package/dist/shared/theme.d.ts +41 -19
  270. package/dist/shared/theme.d.ts.map +1 -1
  271. package/dist/shared/theme.js +1 -1
  272. package/dist/shared/themes/color-system.d.ts +5 -309
  273. package/dist/shared/themes/color-system.d.ts.map +1 -1
  274. package/dist/shared/themes/color-system.js +1 -1
  275. package/dist/shared/utils/invariant.js +1 -1
  276. package/dist/shared/utils/schema.d.ts +10 -1
  277. package/dist/shared/utils/schema.d.ts.map +1 -1
  278. package/dist/shared/utils/schema.js +1 -1
  279. package/dist/shared/utils/typed-ref.d.ts +32 -0
  280. package/dist/shared/utils/typed-ref.d.ts.map +1 -0
  281. package/dist/shared/utils/typed-ref.js +3 -0
  282. package/package.json +12 -12
  283. package/src/node/cli/api.ts +101 -0
  284. package/src/node/cli/commands/cmd-build.ts +64 -0
  285. package/src/node/cli/commands/login/cmd-login.ts +111 -0
  286. package/src/node/cli/commands/logout/cmd-logout.ts +11 -0
  287. package/src/node/cli/commands/publish/cmd-publish.ts +135 -0
  288. package/src/node/cli/commands/publish/parse-gitignore.ts +278 -0
  289. package/src/node/cli/commands/publish/uploader.ts +333 -0
  290. package/src/node/cli/constants.ts +14 -0
  291. package/src/node/cli/is-logged-in.ts +28 -0
  292. package/src/node/cli/program.ts +77 -0
  293. package/src/node/cli/store.ts +64 -0
  294. package/src/node/cli/tests/api.test.ts +161 -0
  295. package/src/node/cli/types.ts +34 -0
  296. package/src/node/cli/utils.ts +20 -0
  297. package/src/node/shared/config.ts +69 -0
  298. package/src/node/shared/logger.ts +44 -0
  299. package/src/shared/ajv.ts +111 -0
  300. package/src/shared/analytics/init.ts +14 -0
  301. package/src/shared/analytics/track.ts +21 -0
  302. package/src/shared/analytics/types.ts +13 -0
  303. package/src/shared/attributes.ts +222 -0
  304. package/src/shared/brick-manifest.ts +110 -0
  305. package/src/shared/bricks/manifests/accordion.manifest.ts +179 -0
  306. package/src/shared/bricks/manifests/all-manifests.ts +92 -0
  307. package/src/shared/bricks/manifests/button.manifest.ts +145 -0
  308. package/src/shared/bricks/manifests/card.manifest.ts +269 -0
  309. package/src/shared/bricks/manifests/carousel.manifest.ts +106 -0
  310. package/src/shared/bricks/manifests/container.manifest.ts +357 -0
  311. package/src/shared/bricks/manifests/divider.manifest.ts +121 -0
  312. package/src/shared/bricks/manifests/footer.manifest.ts +487 -0
  313. package/src/shared/bricks/manifests/form.manifest.ts +112 -0
  314. package/src/shared/bricks/manifests/hero.manifest.ts +132 -0
  315. package/src/shared/bricks/manifests/icon.manifest.ts +130 -0
  316. package/src/shared/bricks/manifests/image.manifest.ts +203 -0
  317. package/src/shared/bricks/manifests/images-gallery.manifest.ts +227 -0
  318. package/src/shared/bricks/manifests/map.manifest.ts +75 -0
  319. package/src/shared/bricks/manifests/navbar.manifest.ts +344 -0
  320. package/src/shared/bricks/manifests/sidebar.manifest.ts +90 -0
  321. package/src/shared/bricks/manifests/social-links.manifest.ts +370 -0
  322. package/src/shared/bricks/manifests/testimonials.manifest.ts +397 -0
  323. package/src/shared/bricks/manifests/tests/header.manifest.test.ts +10 -0
  324. package/src/shared/bricks/manifests/text.manifest.ts +164 -0
  325. package/src/shared/bricks/manifests/timeline.manifest.ts +456 -0
  326. package/src/shared/bricks/manifests/video.manifest.ts +59 -0
  327. package/src/shared/bricks/props/_style-presets.ts +352 -0
  328. package/src/shared/bricks/props/align.ts +59 -0
  329. package/src/shared/bricks/props/background.ts +118 -0
  330. package/src/shared/bricks/props/boolean.ts +11 -0
  331. package/src/shared/bricks/props/border.ts +84 -0
  332. package/src/shared/bricks/props/color.ts +24 -0
  333. package/src/shared/bricks/props/common.ts +37 -0
  334. package/src/shared/bricks/props/container.ts +356 -0
  335. package/src/shared/bricks/props/css-length.ts +25 -0
  336. package/src/shared/bricks/props/datasource.ts +60 -0
  337. package/src/shared/bricks/props/date.ts +24 -0
  338. package/src/shared/bricks/props/effects.ts +123 -0
  339. package/src/shared/bricks/props/enum.ts +42 -0
  340. package/src/shared/bricks/props/file.ts +12 -0
  341. package/src/shared/bricks/props/geolocation.ts +30 -0
  342. package/src/shared/bricks/props/helpers.ts +101 -0
  343. package/src/shared/bricks/props/image.ts +90 -0
  344. package/src/shared/bricks/props/number.ts +16 -0
  345. package/src/shared/bricks/props/padding.ts +21 -0
  346. package/src/shared/bricks/props/position.ts +27 -0
  347. package/src/shared/bricks/props/preset.ts +136 -0
  348. package/src/shared/bricks/props/string.ts +60 -0
  349. package/src/shared/bricks/props/tests/align.test.ts +37 -0
  350. package/src/shared/bricks/props/tests/background.test.ts +102 -0
  351. package/src/shared/bricks/props/tests/border.test.ts +38 -0
  352. package/src/shared/bricks/props/tests/effects.test.ts +37 -0
  353. package/src/shared/bricks/props/tests/helpers.test.ts +133 -0
  354. package/src/shared/bricks/props/tests/image.test.ts +71 -0
  355. package/src/shared/bricks/props/tests/padding.ts +12 -0
  356. package/src/shared/bricks/props/tests/string.test.ts +79 -0
  357. package/src/shared/bricks/props/text.ts +66 -0
  358. package/src/shared/bricks/props/types.ts +57 -0
  359. package/src/shared/bricks.ts +232 -0
  360. package/src/shared/context.ts +39 -0
  361. package/src/shared/datarecords/external/airtable/handler.ts +21 -0
  362. package/src/shared/datarecords/external/airtable/options.ts +22 -0
  363. package/src/shared/datarecords/external/generic-webhook/handler.ts +10 -0
  364. package/src/shared/datarecords/external/generic-webhook/options.ts +13 -0
  365. package/src/shared/datarecords/external/google/oauth/config.ts +30 -0
  366. package/src/shared/datarecords/external/google/sheets/handler.ts +26 -0
  367. package/src/shared/datarecords/external/google/sheets/options.ts +9 -0
  368. package/src/shared/datarecords/types.ts +120 -0
  369. package/src/shared/datarecords.ts +5 -0
  370. package/src/shared/datasources/README.md +3 -0
  371. package/src/shared/datasources/external/facebook/posts/fetcher.ts +62 -0
  372. package/src/shared/datasources/external/facebook/posts/sample.ts +35 -0
  373. package/src/shared/datasources/external/facebook/posts/schema.ts +33 -0
  374. package/src/shared/datasources/external/facebook/posts/tests/fetcher.test.ts +91 -0
  375. package/src/shared/datasources/external/http-json/fetcher.ts +28 -0
  376. package/src/shared/datasources/external/http-json/options.ts +12 -0
  377. package/src/shared/datasources/external/http-json/schema.ts +6 -0
  378. package/src/shared/datasources/external/http-json/tests/fetcher.test.ts +70 -0
  379. package/src/shared/datasources/external/instagram/feed/fetcher.ts +43 -0
  380. package/src/shared/datasources/external/instagram/feed/sample.ts +22 -0
  381. package/src/shared/datasources/external/instagram/feed/schema.ts +23 -0
  382. package/src/shared/datasources/external/instagram/feed/tests/fetcher.test.ts +82 -0
  383. package/src/shared/datasources/external/mastodon/account/fetcher.ts +33 -0
  384. package/src/shared/datasources/external/mastodon/account/sample.ts +33 -0
  385. package/src/shared/datasources/external/mastodon/account/schema.ts +45 -0
  386. package/src/shared/datasources/external/mastodon/account/tests/fetcher.test.ts +65 -0
  387. package/src/shared/datasources/external/mastodon/options.ts +11 -0
  388. package/src/shared/datasources/external/mastodon/status/fetcher.ts +45 -0
  389. package/src/shared/datasources/external/mastodon/status/sample.array.ts +59 -0
  390. package/src/shared/datasources/external/mastodon/status/sample.single.ts +55 -0
  391. package/src/shared/datasources/external/mastodon/status/schema.ts +130 -0
  392. package/src/shared/datasources/external/mastodon/status/tests/fetcher.test.ts +74 -0
  393. package/src/shared/datasources/external/meta/oauth/config.ts +16 -0
  394. package/src/shared/datasources/external/meta/options.ts +11 -0
  395. package/src/shared/datasources/external/rss/fetcher.ts +30 -0
  396. package/src/shared/datasources/external/rss/options.ts +11 -0
  397. package/src/shared/datasources/external/rss/sample.ts +22 -0
  398. package/src/shared/datasources/external/rss/schema.ts +42 -0
  399. package/src/shared/datasources/external/threads/media/fetcher.ts +63 -0
  400. package/src/shared/datasources/external/threads/media/sample.ts +44 -0
  401. package/src/shared/datasources/external/threads/media/schema.ts +37 -0
  402. package/src/shared/datasources/external/tiktok/oauth/config.ts +17 -0
  403. package/src/shared/datasources/external/tiktok/video/fetcher.ts +49 -0
  404. package/src/shared/datasources/external/tiktok/video/options.ts +12 -0
  405. package/src/shared/datasources/external/tiktok/video/sample.ts +26 -0
  406. package/src/shared/datasources/external/tiktok/video/schema.ts +27 -0
  407. package/src/shared/datasources/external/youtube/list/fetcher.ts +46 -0
  408. package/src/shared/datasources/external/youtube/list/options.ts +15 -0
  409. package/src/shared/datasources/external/youtube/list/sample.ts +33 -0
  410. package/src/shared/datasources/external/youtube/list/schema.ts +38 -0
  411. package/src/shared/datasources/external/youtube/oauth/config.ts +15 -0
  412. package/src/shared/datasources/fetcher.ts +17 -0
  413. package/src/shared/datasources/internal/blog/schema.ts +69 -0
  414. package/src/shared/datasources/internal/changelog/schema.ts +48 -0
  415. package/src/shared/datasources/internal/contact-info/schema.ts +20 -0
  416. package/src/shared/datasources/internal/cv/schema.ts +217 -0
  417. package/src/shared/datasources/internal/faq/schema.ts +27 -0
  418. package/src/shared/datasources/internal/job-board/schema.ts +228 -0
  419. package/src/shared/datasources/internal/links/schema.ts +15 -0
  420. package/src/shared/datasources/internal/recipes/schema.ts +42 -0
  421. package/src/shared/datasources/internal/restaurant/schema.ts +225 -0
  422. package/src/shared/datasources/provider-options.ts +7 -0
  423. package/src/shared/datasources/samples.ts +26 -0
  424. package/src/shared/datasources/schemas.ts +45 -0
  425. package/src/shared/datasources/types.ts +276 -0
  426. package/src/shared/datasources/utils.ts +16 -0
  427. package/src/shared/datasources.ts +42 -0
  428. package/src/shared/env.ts +23 -0
  429. package/src/shared/errors.ts +1 -0
  430. package/src/shared/images.ts +44 -0
  431. package/src/shared/index.ts +3 -0
  432. package/src/shared/layout-constants.ts +25 -0
  433. package/src/shared/manifest.ts +50 -0
  434. package/src/shared/oauth.ts +16 -0
  435. package/src/shared/page.ts +61 -0
  436. package/src/shared/prompt.ts +9 -0
  437. package/src/shared/responsive.ts +5 -0
  438. package/src/shared/site.ts +97 -0
  439. package/src/shared/sitemap.ts +66 -0
  440. package/src/shared/social-icons.ts +307 -0
  441. package/src/shared/tests/attributes.test.ts +37 -0
  442. package/src/shared/theme.ts +245 -0
  443. package/src/shared/themes/README.md +34 -0
  444. package/src/shared/themes/color-system.ts +127 -0
  445. package/src/shared/utils/canvas-data-uri.ts +2 -0
  446. package/src/shared/utils/invariant.ts +25 -0
  447. package/src/shared/utils/json-date.ts +8 -0
  448. package/src/shared/utils/merge.ts +12 -0
  449. package/src/shared/utils/object-hash.ts +7 -0
  450. package/src/shared/utils/schema.ts +30 -0
  451. package/src/shared/utils/try-catch.ts +12 -0
  452. package/src/shared/utils/typed-ref.ts +41 -0
  453. package/dist/shared/bricks/manifests/countdown.manifest.d.ts +0 -57
  454. package/dist/shared/bricks/manifests/countdown.manifest.d.ts.map +0 -1
  455. package/dist/shared/bricks/manifests/countdown.manifest.js +0 -3
  456. package/dist/shared/bricks/manifests/generic-component.manifest.d.ts +0 -62
  457. package/dist/shared/bricks/manifests/generic-component.manifest.d.ts.map +0 -1
  458. package/dist/shared/bricks/manifests/generic-component.manifest.js +0 -3
  459. package/dist/shared/bricks/manifests/header.manifest.d.ts +0 -275
  460. package/dist/shared/bricks/manifests/header.manifest.d.ts.map +0 -1
  461. package/dist/shared/bricks/manifests/header.manifest.js +0 -3
  462. package/dist/shared/bricks/props/_docs-common-styles.d.ts +0 -59
  463. package/dist/shared/bricks/props/_docs-common-styles.d.ts.map +0 -1
  464. package/dist/shared/bricks/props/_docs-common-styles.js +0 -3
  465. package/dist/shared/bricks/props/tests/container.test.d.ts +0 -2
  466. package/dist/shared/bricks/props/tests/container.test.d.ts.map +0 -1
  467. package/dist/shared/chunk-2ZPY4LCA.js +0 -3
  468. package/dist/shared/chunk-3CY6AZG7.js +0 -3
  469. package/dist/shared/chunk-4FLI7C3B.js +0 -3
  470. package/dist/shared/chunk-64II435T.js +0 -3
  471. package/dist/shared/chunk-6LDLGZUM.js +0 -3
  472. package/dist/shared/chunk-6MEWEGNA.js +0 -3
  473. package/dist/shared/chunk-AZ63RF3K.js +0 -3
  474. package/dist/shared/chunk-BK6LBWDI.js +0 -3
  475. package/dist/shared/chunk-BMDB2V7J.js +0 -3
  476. package/dist/shared/chunk-BXEKJXEP.js +0 -3
  477. package/dist/shared/chunk-DAPQ4JPP.js +0 -3
  478. package/dist/shared/chunk-ERSFH7XA.js +0 -3
  479. package/dist/shared/chunk-F2ZVIFHO.js +0 -3
  480. package/dist/shared/chunk-H6L4KRCJ.js +0 -3
  481. package/dist/shared/chunk-IKAMZM4I.js +0 -3
  482. package/dist/shared/chunk-IWSVY2VC.js +0 -3
  483. package/dist/shared/chunk-JVDUEZYO.js +0 -3
  484. package/dist/shared/chunk-KB4HY432.js +0 -3
  485. package/dist/shared/chunk-LDOM2LJF.js +0 -3
  486. package/dist/shared/chunk-P5FVZ5PL.js +0 -3
  487. package/dist/shared/chunk-PD7P5KSV.js +0 -3
  488. package/dist/shared/chunk-PJ6HA55L.js +0 -3
  489. package/dist/shared/chunk-PSSJMWGU.js +0 -3
  490. package/dist/shared/chunk-Q4MXTCE4.js +0 -8
  491. package/dist/shared/chunk-QCQH5WLN.js +0 -3
  492. package/dist/shared/chunk-RBYYMUOZ.js +0 -3
  493. package/dist/shared/chunk-RHRJYPU3.js +0 -3
  494. package/dist/shared/chunk-S64XUCWM.js +0 -3
  495. package/dist/shared/chunk-SO5M7CYA.js +0 -3
  496. package/dist/shared/chunk-SQVL4WSX.js +0 -3
  497. package/dist/shared/chunk-SWGSHUTE.js +0 -3
  498. package/dist/shared/chunk-U44NTSIO.js +0 -3
  499. package/dist/shared/chunk-U4R5EGBK.js +0 -3
  500. package/dist/shared/chunk-U5WW6K7W.js +0 -3
  501. package/dist/shared/chunk-V2NS45PF.js +0 -3
  502. package/dist/shared/chunk-WOEBR25A.js +0 -3
  503. package/dist/shared/chunk-WPTVLIYS.js +0 -3
  504. package/dist/shared/chunk-WXKRIUTA.js +0 -3
  505. package/dist/shared/chunk-XBX6II3M.js +0 -3
  506. package/dist/shared/chunk-XGCBIXOO.js +0 -3
  507. package/dist/shared/chunk-YY6DANZF.js +0 -3
  508. package/dist/shared/chunk-ZWQHIQEQ.js +0 -3
  509. package/dist/shared/datasources/external/json/fetcher.d.ts.map +0 -1
  510. package/dist/shared/datasources/external/json/options.d.ts.map +0 -1
  511. package/dist/shared/datasources/external/json/schema.d.ts.map +0 -1
  512. package/dist/shared/datasources/external/json/tests/fetcher.test.d.ts.map +0 -1
  513. package/dist/shared/datasources/external/rss/tests/fetcher.test.d.ts +0 -2
  514. package/dist/shared/datasources/external/rss/tests/fetcher.test.d.ts.map +0 -1
  515. package/dist/shared/template.d.ts +0 -898
  516. package/dist/shared/template.d.ts.map +0 -1
  517. package/dist/shared/template.js +0 -3
  518. package/dist/shared/tests/page.test.d.ts +0 -2
  519. package/dist/shared/tests/page.test.d.ts.map +0 -1
  520. package/dist/shared/tests/test-config.d.ts +0 -3
  521. package/dist/shared/tests/test-config.d.ts.map +0 -1
  522. package/dist/shared/themes/all-themes.d.ts +0 -3
  523. package/dist/shared/themes/all-themes.d.ts.map +0 -1
  524. package/dist/shared/themes/all-themes.js +0 -3
  525. /package/dist/shared/datasources/external/{json → http-json}/fetcher.d.ts +0 -0
  526. /package/dist/shared/datasources/external/{json → http-json}/options.d.ts +0 -0
  527. /package/dist/shared/datasources/external/{json → http-json}/tests/fetcher.test.d.ts +0 -0
@@ -0,0 +1,16 @@
1
+ import { Type, type Static, type StaticDecode } from "@sinclair/typebox";
2
+ import { buildOAuthConfigSchema } from "~/shared/oauth";
3
+
4
+ const metaOAuthConfig = Type.Object({
5
+ type: Type.Union([Type.Literal("short-lived"), Type.Literal("long-lived")]),
6
+ accessToken: Type.String(),
7
+ userId: Type.String(),
8
+ permissions: Type.Array(Type.String()),
9
+ expiresIn: Type.Number(),
10
+ tokenType: Type.String(),
11
+ });
12
+
13
+ export type MetaOAuthConfig = Static<typeof metaOAuthConfig>;
14
+
15
+ const metaFullOAuthConfig = buildOAuthConfigSchema(metaOAuthConfig);
16
+ export type MetaFullOAuthConfig = StaticDecode<typeof metaFullOAuthConfig>;
@@ -0,0 +1,11 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+ import { providerOptions } from "../../provider-options";
3
+
4
+ export const metaOptions = Type.Composite([
5
+ providerOptions,
6
+ Type.Object({
7
+ limit: Type.Optional(Type.Number()),
8
+ }),
9
+ ]);
10
+
11
+ export type MetaOptions = Static<typeof metaOptions>;
@@ -0,0 +1,30 @@
1
+ import type { RssOptions } from "./options";
2
+ import { parseFeed } from "htmlparser2";
3
+ import { type RssSchema, rssSchema } from "./schema";
4
+ import { ajv, serializeAjvErrors } from "~/shared/ajv";
5
+ import type { DatasourceFetcher } from "../../fetcher";
6
+ import { createPlaceholderReplacer, placeholderRx } from "../../utils";
7
+
8
+ const fetchRss: DatasourceFetcher<RssSchema, null, RssOptions> = async ({ options, attr }) => {
9
+ const replacer = createPlaceholderReplacer(attr);
10
+ const url = options.url.replace(placeholderRx, replacer);
11
+ const content = await (await fetch(url)).text();
12
+ const feed = parseFeed(content);
13
+
14
+ const newFeed: RssSchema =
15
+ feed?.items.map((item) => ({
16
+ ...item,
17
+ pubDate: item.pubDate ? item.pubDate.toISOString() : new Date().toISOString(),
18
+ })) ?? [];
19
+
20
+ const validate = ajv.compile<RssSchema>(rssSchema);
21
+ const isValid = validate(newFeed);
22
+
23
+ if (!isValid) {
24
+ throw new Error(`fetchRss Error: Invalid Feed data (${url}): ${serializeAjvErrors(validate.errors)}`);
25
+ }
26
+
27
+ return newFeed;
28
+ };
29
+
30
+ export default fetchRss;
@@ -0,0 +1,11 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+ import { providerOptions } from "../../provider-options";
3
+
4
+ export const rssOptions = Type.Composite([
5
+ providerOptions,
6
+ Type.Object({
7
+ url: Type.String({ format: "uri" }),
8
+ }),
9
+ ]);
10
+
11
+ export type RssOptions = Static<typeof rssOptions>;
@@ -0,0 +1,22 @@
1
+ import type { RssSchema } from "./schema";
2
+
3
+ export const sample = [
4
+ {
5
+ title: "Example title",
6
+ link: "https://example.com",
7
+ pubDate: "2022-01-01T00:00:00Z",
8
+ content: "Example content",
9
+ },
10
+ {
11
+ title: "Another example title",
12
+ link: "https://example.com",
13
+ pubDate: "2022-01-02T00:00:00Z",
14
+ content: "Another example content",
15
+ },
16
+ {
17
+ title: "Yet another example title",
18
+ link: "https://example.com",
19
+ pubDate: "2022-01-03T00:00:00Z",
20
+ content: "Yet another example content",
21
+ },
22
+ ] as RssSchema;
@@ -0,0 +1,42 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+
3
+ export const rssSchema = Type.Array(
4
+ Type.Object({
5
+ title: Type.Optional(
6
+ Type.String({
7
+ title: "Title",
8
+ description: "The title of the RSS feed item",
9
+ }),
10
+ ),
11
+ link: Type.Optional(
12
+ Type.String({
13
+ title: "Link",
14
+ description: "The link to the RSS feed item",
15
+ }),
16
+ ),
17
+ creator: Type.Optional(
18
+ Type.String({
19
+ title: "Creator",
20
+ description: "The creator of the RSS feed item",
21
+ }),
22
+ ),
23
+ content: Type.Optional(
24
+ Type.String({
25
+ title: "Content",
26
+ description: "The content of the RSS feed item",
27
+ }),
28
+ ),
29
+ pubDate: Type.Optional(
30
+ Type.String({
31
+ title: "Pub Date",
32
+ description: "The publication date of the RSS feed item",
33
+ }),
34
+ ),
35
+ }),
36
+ {
37
+ title: "RSS Feed",
38
+ description: "RSS feed items",
39
+ },
40
+ );
41
+
42
+ export type RssSchema = Static<typeof rssSchema>;
@@ -0,0 +1,63 @@
1
+ import { type ThreadsMediaSchema, threadsMediaSchema } from "./schema";
2
+ import type { MetaFullOAuthConfig } from "~/shared/datasources/external/meta/oauth/config";
3
+ import invariant from "~/shared/utils/invariant";
4
+ import { UnauthorizedError } from "~/shared/errors";
5
+ import type { MetaOptions } from "~/shared/datasources/external/meta/options";
6
+ import { stringifyObjectValues } from "~/shared/datasources/utils";
7
+ import { ajv, serializeAjvErrors } from "~/shared/ajv";
8
+ import type { DatasourceFetcher } from "~/shared/datasources/fetcher";
9
+
10
+ /**
11
+ * todo: add a way to retrieve media/posts from Threads for a given user other than "me"
12
+ */
13
+ const fetchThreadsMediaDatasource: DatasourceFetcher<
14
+ ThreadsMediaSchema,
15
+ MetaFullOAuthConfig,
16
+ MetaOptions
17
+ > = async ({ options, oauth }) => {
18
+ invariant(oauth?.config, "fetchThreadsMediaDatasource Error: OAuth config is required");
19
+
20
+ const params = new URLSearchParams({
21
+ ...stringifyObjectValues(options),
22
+ access_token: oauth.config.accessToken,
23
+ fields: [
24
+ "id",
25
+ "media_product_type",
26
+ "media_type",
27
+ "media_url",
28
+ "permalink",
29
+ "owner",
30
+ "username",
31
+ "text",
32
+ "timestamp",
33
+ "shortcode",
34
+ "thumbnail_url",
35
+ "children",
36
+ "is_quote_post",
37
+ ].join(","),
38
+ });
39
+
40
+ const response = await fetch(`https://graph.threads.net/v1.0/me/threads?${params.toString()}`);
41
+
42
+ if (!response.ok) {
43
+ if (response.status === 401) {
44
+ throw new UnauthorizedError(`fetchThreadsMediaDatasource Error: Unauthorized.`);
45
+ }
46
+ throw new Error(`fetchThreadsMediaDatasource Error: Response status: ${response.status}`);
47
+ }
48
+
49
+ const media = (await response.json()) as ThreadsMediaSchema;
50
+
51
+ const validate = ajv.compile<ThreadsMediaSchema>(threadsMediaSchema);
52
+ const isValid = validate(media);
53
+
54
+ if (!isValid) {
55
+ throw new Error(
56
+ `fetchThreadsMediaDatasource Error: Invalid Threads response data: ${serializeAjvErrors(validate.errors)}`,
57
+ );
58
+ }
59
+
60
+ return media;
61
+ };
62
+
63
+ export default fetchThreadsMediaDatasource;
@@ -0,0 +1,44 @@
1
+ import type { ThreadsMediaSchema } from "./schema";
2
+
3
+ export const sample = {
4
+ data: [
5
+ {
6
+ id: "1",
7
+ is_quote_post: false,
8
+ media_product_type: "THREADS",
9
+ media_type: "IMAGE",
10
+ media_url: "https://example.com/image.jpg",
11
+ owner: {
12
+ id: "1",
13
+ },
14
+ permalink: "https://example.com/post",
15
+ shortcode: "123456",
16
+ text: "Hello, world!",
17
+ thumbnail_url: "https://example.com/thumbnail.jpg",
18
+ timestamp: "2022-01-01T00:00:00Z",
19
+ username: "example",
20
+ },
21
+ {
22
+ id: "2",
23
+ is_quote_post: false,
24
+ media_product_type: "THREADS",
25
+ media_type: "VIDEO",
26
+ media_url: "https://example.com/video.mp4",
27
+ owner: {
28
+ id: "2",
29
+ },
30
+ permalink: "https://example.com/post",
31
+ shortcode: "654321",
32
+ text: "Goodbye, world!",
33
+ thumbnail_url: "https://example.com/thumbnail.jpg",
34
+ timestamp: "2022-01-02T00:00:00Z",
35
+ username: "example",
36
+ },
37
+ ],
38
+ paging: {
39
+ cursors: {
40
+ before: "",
41
+ after: "",
42
+ },
43
+ },
44
+ } satisfies ThreadsMediaSchema;
@@ -0,0 +1,37 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+
3
+ export const threadsMediaSchema = Type.Object({
4
+ data: Type.Array(
5
+ Type.Object({
6
+ id: Type.String(),
7
+ media_product_type: Type.Literal("THREADS"),
8
+ media_type: Type.Union([
9
+ Type.Literal("TEXT_POST"),
10
+ Type.Literal("IMAGE"),
11
+ Type.Literal("VIDEO"),
12
+ Type.Literal("CAROUSEL_ALBUM"),
13
+ Type.Literal("AUDIO"),
14
+ Type.Literal("REPOST_FACADE"),
15
+ ]),
16
+ media_url: Type.String(),
17
+ permalink: Type.String(),
18
+ owner: Type.Object({
19
+ id: Type.String(),
20
+ }),
21
+ username: Type.String(),
22
+ text: Type.String(),
23
+ timestamp: Type.String(),
24
+ thumbnail_url: Type.String(),
25
+ shortcode: Type.String(),
26
+ is_quote_post: Type.Boolean(),
27
+ }),
28
+ ),
29
+ paging: Type.Object({
30
+ cursors: Type.Object({
31
+ before: Type.String(),
32
+ after: Type.String(),
33
+ }),
34
+ }),
35
+ });
36
+
37
+ export type ThreadsMediaSchema = Static<typeof threadsMediaSchema>;
@@ -0,0 +1,17 @@
1
+ import { Type, type StaticDecode, type Static } from "@sinclair/typebox";
2
+ import { buildOAuthConfigSchema } from "~/shared/oauth";
3
+
4
+ const tiktokOAuthConfig = Type.Object({
5
+ accessToken: Type.String(),
6
+ expiresIn: Type.Number(),
7
+ openId: Type.String(),
8
+ refreshExpiresIn: Type.Number(),
9
+ refreshToken: Type.String(),
10
+ scope: Type.String(),
11
+ tokenType: Type.String(),
12
+ });
13
+
14
+ export type TiktokOAuthConfig = Static<typeof tiktokOAuthConfig>;
15
+
16
+ const tiktokFullOAuthConfig = buildOAuthConfigSchema(tiktokOAuthConfig);
17
+ export type TiktokFullOAuthConfig = StaticDecode<typeof tiktokFullOAuthConfig>;
@@ -0,0 +1,49 @@
1
+ import type { TiktokVideoOptions } from "./options";
2
+ import { type TiktokVideoListSchema, tiktokVideoListSchema } from "./schema";
3
+ import { UnauthorizedError } from "~/shared/errors";
4
+ import { ajv, serializeAjvErrors } from "~/shared/ajv";
5
+ import type { TiktokFullOAuthConfig } from "../oauth/config";
6
+ import type { DatasourceFetcher } from "~/shared/datasources/fetcher";
7
+
8
+ const fetchTiktokVideoDatasource: DatasourceFetcher<
9
+ TiktokVideoListSchema,
10
+ TiktokFullOAuthConfig,
11
+ TiktokVideoOptions
12
+ > = async ({ options, oauth }) => {
13
+ const params = new URLSearchParams({
14
+ access_token: oauth.config.accessToken,
15
+ fields: ["id", "title", "video_description", "duration", "cover_image_url", "embed_link"].join(","),
16
+ });
17
+
18
+ const url = `https://open.tiktokapis.com/v2/video/list/?${params.toString()}`;
19
+ const { refreshInterval, ...body } = options;
20
+ const response = await fetch(url, {
21
+ method: "POST",
22
+ headers: {
23
+ "Content-Type": "application/json",
24
+ Authorization: `Bearer ${oauth.config.accessToken}`,
25
+ },
26
+ body: JSON.stringify(body),
27
+ });
28
+
29
+ if (!response.ok) {
30
+ if (response.status === 401) {
31
+ throw new UnauthorizedError(`fetchTiktokVideoDatasource Error: Unauthorized.`);
32
+ }
33
+ throw new Error(`Response status: ${response.status}`);
34
+ }
35
+ const data = (await response.json()) as TiktokVideoListSchema;
36
+
37
+ const validate = ajv.compile<TiktokVideoListSchema>(tiktokVideoListSchema);
38
+ const isValid = validate(data);
39
+
40
+ if (!isValid) {
41
+ throw new Error(
42
+ `fetchTiktokVideoDatasource Error: Invalid TikTok response data: ${serializeAjvErrors(validate.errors)}`,
43
+ );
44
+ }
45
+
46
+ return data;
47
+ };
48
+
49
+ export default fetchTiktokVideoDatasource;
@@ -0,0 +1,12 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+ import { providerOptions } from "~/shared/datasources/provider-options";
3
+
4
+ export const tiktokVideoOptions = Type.Composite([
5
+ providerOptions,
6
+ Type.Object({
7
+ maxCount: Type.Optional(Type.Number()),
8
+ refreshInterval: Type.Optional(Type.Number()),
9
+ }),
10
+ ]);
11
+
12
+ export type TiktokVideoOptions = Static<typeof tiktokVideoOptions>;
@@ -0,0 +1,26 @@
1
+ import type { TiktokVideoListSchema } from "./schema";
2
+
3
+ export const sample = {
4
+ data: {
5
+ has_more: true,
6
+ cursor: 1,
7
+ videos: [
8
+ {
9
+ title: "Example title",
10
+ video_description: "Example description",
11
+ cover_image_url: "https://example.com/image.jpg",
12
+ duration: 60,
13
+ embed_link: "https://example.com/embed",
14
+ id: "1",
15
+ },
16
+ {
17
+ title: "Another example title",
18
+ video_description: "Another example description",
19
+ cover_image_url: "https://example.com/image.jpg",
20
+ duration: 60,
21
+ embed_link: "https://example.com/embed",
22
+ id: "2",
23
+ },
24
+ ],
25
+ },
26
+ } satisfies TiktokVideoListSchema;
@@ -0,0 +1,27 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+
3
+ export const tiktokVideoListSchema = Type.Object({
4
+ data: Type.Object({
5
+ has_more: Type.Boolean(),
6
+ cursor: Type.Number(),
7
+ videos: Type.Array(
8
+ Type.Object({
9
+ title: Type.String(),
10
+ video_description: Type.String(),
11
+ cover_image_url: Type.String(),
12
+ duration: Type.Number(),
13
+ embed_link: Type.String(),
14
+ id: Type.String(),
15
+ }),
16
+ ),
17
+ }),
18
+ error: Type.Optional(
19
+ Type.Object({
20
+ code: Type.String(),
21
+ message: Type.String(),
22
+ log_id: Type.String(),
23
+ }),
24
+ ),
25
+ });
26
+
27
+ export type TiktokVideoListSchema = Static<typeof tiktokVideoListSchema>;
@@ -0,0 +1,46 @@
1
+ import type { YoutubeListOptions } from "./options";
2
+ import { type YoutubeListSchema, youtubeListSchema } from "./schema";
3
+ import { UnauthorizedError } from "~/shared/errors";
4
+ import { stringifyObjectValues } from "~/shared/datasources/utils";
5
+ import { ajv, serializeAjvErrors } from "~/shared/ajv";
6
+ import type { YoutubeFullOAuthConfig } from "../oauth/config";
7
+ import type { DatasourceFetcher } from "~/shared/datasources/fetcher";
8
+
9
+ const fetchYoutubeList: DatasourceFetcher<
10
+ YoutubeListSchema,
11
+ YoutubeFullOAuthConfig,
12
+ YoutubeListOptions
13
+ > = async ({ options, oauth }) => {
14
+ const params = new URLSearchParams({
15
+ ...stringifyObjectValues(options),
16
+ part: "snippet,id",
17
+ type: "video",
18
+ videoEmbeddable: "true",
19
+ access_token: oauth.config.accessToken,
20
+ });
21
+
22
+ const url = `https://www.googleapis.com/youtube/v3/search?${params}`;
23
+
24
+ const response = await fetch(url);
25
+
26
+ if (!response.ok) {
27
+ if (response.status === 401) {
28
+ throw new UnauthorizedError(`fetchYoutubeList Error: Unauthorized.`);
29
+ }
30
+ throw new Error(`fetchYoutubeList Error: Response status: ${response.status}`);
31
+ }
32
+
33
+ const data = (await response.json()) as YoutubeListSchema;
34
+ const validate = ajv.compile<YoutubeListSchema>(youtubeListSchema);
35
+ const isValid = validate(data);
36
+
37
+ if (!isValid) {
38
+ throw new Error(
39
+ `fetchYoutubeList Error: Invalid Youtube response data: ${serializeAjvErrors(validate.errors)}`,
40
+ );
41
+ }
42
+
43
+ return data;
44
+ };
45
+
46
+ export default fetchYoutubeList;
@@ -0,0 +1,15 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+ import { providerOptions } from "~/shared/datasources/provider-options";
3
+
4
+ export const youtubeListOptions = Type.Composite([
5
+ providerOptions,
6
+ Type.Object({
7
+ channelId: Type.String(),
8
+ order: Type.Optional(Type.String()),
9
+ maxResults: Type.Optional(Type.Number()),
10
+ regionCode: Type.Optional(Type.String()),
11
+ relevanceLanguage: Type.Optional(Type.String()),
12
+ }),
13
+ ]);
14
+
15
+ export type YoutubeListOptions = Static<typeof youtubeListOptions>;
@@ -0,0 +1,33 @@
1
+ import type { YoutubeListSchema } from "./schema";
2
+
3
+ export const sample = [
4
+ {
5
+ etag: "123456789",
6
+ id: {
7
+ videoId: "dQw4w9WgXcQ",
8
+ channelId: "UCXuqSBlHAE6Xw-yeJA0Tunw",
9
+ playlistId: "PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
10
+ },
11
+ snippet: {
12
+ channelId: "UCXuqSBlHAE6Xw-yeJA0Tunw",
13
+ channelTitle: "RickAstleyVEVO",
14
+ description:
15
+ "Rick Astley's official music video for “Never Gonna Give You Up” Listen to Rick Astley: https://RickAstley.lnk.to/_listenYD Subscribe to the official Rick Astley YouTube channel: https://RickAstley.lnk.to/_subscribeYD Follow Rick Astley: Facebook: https://RickAstley.lnk.to/_followYD Twitter: https://RickAstley.lnk.to/_followYD Instagram: https://RickAstley.lnk.to/_followYD Website: https://RickAstley.lnk.to/_followYD Spotify: https://RickAstley.lnk.to/_followYD Lyrics: We're no strangers to love You know the rules and so do I A full commitment's what I'm thinking of You wouldn't get this from any other guy I just wanna tell you how I'm feeling Gotta make you understand Never gonna give you up Never gonna let you down Never gonna run around and desert you Never gonna make you cry Never gonna say goodbye Never gonna tell a lie and hurt you #RickAstley #NeverGonnaGiveYouUp #DancePop",
16
+ liveBroadcastContent: "none",
17
+ publishedAt: "2009-10-25",
18
+ thumbnails: {
19
+ default: {
20
+ height: 90,
21
+ url: "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg",
22
+ width: 120,
23
+ },
24
+ standard: {
25
+ height: 480,
26
+ url: "https://i.ytimg.com/vi/dQw4w9WgXcQ/sddefault.jpg",
27
+ width: 640,
28
+ },
29
+ },
30
+ title: "Rick Astley - Never Gonna Give You Up (Official Music Video)",
31
+ },
32
+ },
33
+ ] satisfies YoutubeListSchema;
@@ -0,0 +1,38 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+
3
+ export const youtubeListSchema = Type.Array(
4
+ Type.Object({
5
+ etag: Type.String(),
6
+ id: Type.Object({
7
+ videoId: Type.String(),
8
+ channelId: Type.String(),
9
+ playlistId: Type.String(),
10
+ }),
11
+ snippet: Type.Object({
12
+ publishedAt: Type.String(),
13
+ channelId: Type.String(),
14
+ title: Type.String(),
15
+ description: Type.String(),
16
+ thumbnails: Type.Object({
17
+ default: Type.Object({
18
+ url: Type.String(),
19
+ width: Type.Number(),
20
+ height: Type.Number(),
21
+ }),
22
+ standard: Type.Object({
23
+ url: Type.String(),
24
+ width: Type.Number(),
25
+ height: Type.Number(),
26
+ }),
27
+ }),
28
+ channelTitle: Type.String(),
29
+ liveBroadcastContent: Type.String(),
30
+ }),
31
+ }),
32
+ {
33
+ title: "Youtube list schema",
34
+ description: "Schema for a list of Youtube videos",
35
+ },
36
+ );
37
+
38
+ export type YoutubeListSchema = Static<typeof youtubeListSchema>;
@@ -0,0 +1,15 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+ import { buildOAuthConfigSchema } from "~/shared/oauth";
3
+
4
+ const youtubeOAuthConfig = Type.Object({
5
+ accessToken: Type.String(),
6
+ expiresIn: Type.Number(),
7
+ openId: Type.String(),
8
+ refreshExpiresIn: Type.Number(),
9
+ refreshToken: Type.String(),
10
+ scope: Type.String(),
11
+ tokenType: Type.String(),
12
+ });
13
+
14
+ const youtubeFullOAuthConfig = buildOAuthConfigSchema(youtubeOAuthConfig);
15
+ export type YoutubeFullOAuthConfig = Static<typeof youtubeFullOAuthConfig>;
@@ -0,0 +1,17 @@
1
+ import type { Attributes } from "../attributes";
2
+ import type { ProviderOptions } from "./provider-options";
3
+
4
+ export type DatasourceFetcherParams<
5
+ OAuthProps = unknown,
6
+ Opts extends Record<string, unknown> = ProviderOptions,
7
+ > = {
8
+ options: Opts;
9
+ attr: Attributes;
10
+ oauth: OAuthProps;
11
+ };
12
+
13
+ export type DatasourceFetcher<
14
+ T = unknown,
15
+ OAuthOpts = unknown,
16
+ Opts extends Record<string, unknown> = ProviderOptions,
17
+ > = (params: DatasourceFetcherParams<OAuthOpts, Opts>) => Promise<T>;
@@ -0,0 +1,69 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+
3
+ export const blogSchema = Type.Array(
4
+ Type.Object({
5
+ title: Type.String({
6
+ title: "Title",
7
+ description: "Blog post title",
8
+ }),
9
+ excerpt: Type.String({
10
+ title: "Excerpt",
11
+ description: "Short summary of the blog post",
12
+ format: "markdown",
13
+ }),
14
+ image: Type.Optional(
15
+ Type.String({
16
+ title: "Image URL",
17
+ format: "uri",
18
+ description: "Blog post image",
19
+ }),
20
+ ),
21
+ content: Type.String({
22
+ title: "Content",
23
+ description: "Blog post content",
24
+ format: "markdown",
25
+ }),
26
+ author: Type.Object({
27
+ name: Type.String({
28
+ title: "Author Name",
29
+ description: "Author's name",
30
+ }),
31
+ }),
32
+ publishedAt: Type.String({
33
+ title: "Published Date",
34
+ format: "date",
35
+ description: "Publication date in ISO format",
36
+ }),
37
+ slug: Type.String({
38
+ title: "Slug",
39
+ pattern: "^[a-z0-9]+(?:-[a-z0-9]+)*$",
40
+ description: "URL-friendly version of the title",
41
+ }),
42
+ status: Type.Union([Type.Literal("draft"), Type.Literal("published"), Type.Literal("archived")], {
43
+ title: "Status",
44
+ description: "Publication status of the blog post",
45
+ }),
46
+ categories: Type.Optional(
47
+ Type.Array(
48
+ Type.String({
49
+ title: "Categories",
50
+ description: "Blog post categories",
51
+ }),
52
+ ),
53
+ ),
54
+ tags: Type.Optional(
55
+ Type.Array(
56
+ Type.String({
57
+ title: "Tags",
58
+ description: "Blog post tags",
59
+ }),
60
+ ),
61
+ ),
62
+ }),
63
+ {
64
+ title: "Blog Posts",
65
+ description: "List of blog posts",
66
+ },
67
+ );
68
+
69
+ export type BlogSchema = Static<typeof blogSchema>;