@atproto/oauth-provider 0.5.1 → 0.6.0

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 (325) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/account/account-manager.d.ts +7 -5
  3. package/dist/account/account-manager.d.ts.map +1 -1
  4. package/dist/account/account-manager.js +34 -25
  5. package/dist/account/account-manager.js.map +1 -1
  6. package/dist/account/account-store.d.ts +13 -5
  7. package/dist/account/account-store.d.ts.map +1 -1
  8. package/dist/account/account-store.js +24 -8
  9. package/dist/account/account-store.js.map +1 -1
  10. package/dist/account/account.d.ts +1 -11
  11. package/dist/account/account.d.ts.map +1 -1
  12. package/dist/account/{sign-up-data.d.ts → sign-up-input.d.ts} +5 -5
  13. package/dist/account/sign-up-input.d.ts.map +1 -0
  14. package/dist/account/{sign-up-data.js → sign-up-input.js} +3 -3
  15. package/dist/account/sign-up-input.js.map +1 -0
  16. package/dist/assets/assets-middleware.d.ts +2 -0
  17. package/dist/assets/assets-middleware.d.ts.map +1 -1
  18. package/dist/assets/assets-middleware.js +12 -14
  19. package/dist/assets/assets-middleware.js.map +1 -1
  20. package/dist/errors/invalid-invite-code-error.d.ts +5 -0
  21. package/dist/errors/invalid-invite-code-error.d.ts.map +1 -0
  22. package/dist/errors/invalid-invite-code-error.js +11 -0
  23. package/dist/errors/invalid-invite-code-error.js.map +1 -0
  24. package/dist/errors/oauth-error.d.ts +2 -2
  25. package/dist/errors/oauth-error.js.map +1 -1
  26. package/dist/lib/csp/index.d.ts +5 -6
  27. package/dist/lib/csp/index.d.ts.map +1 -1
  28. package/dist/lib/csp/index.js +14 -11
  29. package/dist/lib/csp/index.js.map +1 -1
  30. package/dist/lib/hcaptcha.d.ts +5 -3
  31. package/dist/lib/hcaptcha.d.ts.map +1 -1
  32. package/dist/lib/hcaptcha.js +7 -4
  33. package/dist/lib/hcaptcha.js.map +1 -1
  34. package/dist/lib/html/build-document.d.ts +2 -2
  35. package/dist/lib/html/build-document.d.ts.map +1 -1
  36. package/dist/lib/html/build-document.js +11 -7
  37. package/dist/lib/html/build-document.js.map +1 -1
  38. package/dist/lib/html/html.d.ts.map +1 -1
  39. package/dist/lib/html/html.js +10 -13
  40. package/dist/lib/html/html.js.map +1 -1
  41. package/dist/lib/html/util.d.ts +0 -1
  42. package/dist/lib/html/util.d.ts.map +1 -1
  43. package/dist/lib/html/util.js +0 -4
  44. package/dist/lib/html/util.js.map +1 -1
  45. package/dist/lib/http/response.d.ts +3 -1
  46. package/dist/lib/http/response.d.ts.map +1 -1
  47. package/dist/lib/http/response.js +3 -0
  48. package/dist/lib/http/response.js.map +1 -1
  49. package/dist/lib/http/security-headers.d.ts +48 -0
  50. package/dist/lib/http/security-headers.d.ts.map +1 -0
  51. package/dist/lib/http/security-headers.js +62 -0
  52. package/dist/lib/http/security-headers.js.map +1 -0
  53. package/dist/lib/util/type.d.ts +8 -0
  54. package/dist/lib/util/type.d.ts.map +1 -1
  55. package/dist/lib/util/type.js.map +1 -1
  56. package/dist/oauth-errors.d.ts +1 -0
  57. package/dist/oauth-errors.d.ts.map +1 -1
  58. package/dist/oauth-errors.js +3 -1
  59. package/dist/oauth-errors.js.map +1 -1
  60. package/dist/oauth-hooks.d.ts +4 -25
  61. package/dist/oauth-hooks.d.ts.map +1 -1
  62. package/dist/oauth-provider.d.ts.map +1 -1
  63. package/dist/oauth-provider.js +26 -25
  64. package/dist/oauth-provider.js.map +1 -1
  65. package/dist/output/backend-data.d.ts +4 -0
  66. package/dist/output/backend-data.d.ts.map +1 -0
  67. package/dist/output/backend-data.js +19 -0
  68. package/dist/output/backend-data.js.map +1 -0
  69. package/dist/output/build-authorize-data.d.ts +3 -19
  70. package/dist/output/build-authorize-data.d.ts.map +1 -1
  71. package/dist/output/build-authorize-data.js.map +1 -1
  72. package/dist/output/build-customization-data.d.ts +11 -18
  73. package/dist/output/build-customization-data.d.ts.map +1 -1
  74. package/dist/output/build-customization-data.js +1 -1
  75. package/dist/output/build-customization-data.js.map +1 -1
  76. package/dist/output/build-error-data.d.ts +3 -0
  77. package/dist/output/build-error-data.d.ts.map +1 -0
  78. package/dist/output/build-error-data.js +10 -0
  79. package/dist/output/build-error-data.js.map +1 -0
  80. package/dist/output/build-error-payload.d.ts +2 -1
  81. package/dist/output/build-error-payload.d.ts.map +1 -1
  82. package/dist/output/build-error-payload.js.map +1 -1
  83. package/dist/output/output-manager.d.ts +10 -4
  84. package/dist/output/output-manager.d.ts.map +1 -1
  85. package/dist/output/output-manager.js +68 -39
  86. package/dist/output/output-manager.js.map +1 -1
  87. package/dist/output/send-web-page.d.ts +6 -10
  88. package/dist/output/send-web-page.d.ts.map +1 -1
  89. package/dist/output/send-web-page.js +27 -47
  90. package/dist/output/send-web-page.js.map +1 -1
  91. package/dist/signer/signed-token-payload.d.ts +3 -3
  92. package/dist/signer/signer.d.ts +2 -2
  93. package/package.json +7 -39
  94. package/src/account/account-manager.ts +55 -34
  95. package/src/account/account-store.ts +29 -6
  96. package/src/account/account.ts +1 -14
  97. package/src/account/{sign-up-data.ts → sign-up-input.ts} +2 -2
  98. package/src/assets/assets-middleware.ts +11 -17
  99. package/src/errors/invalid-invite-code-error.ts +10 -0
  100. package/src/errors/oauth-error.ts +1 -1
  101. package/src/lib/csp/index.ts +16 -13
  102. package/src/lib/hcaptcha.ts +10 -7
  103. package/src/lib/html/build-document.ts +15 -8
  104. package/src/lib/html/html.ts +11 -18
  105. package/src/lib/html/util.ts +0 -4
  106. package/src/lib/http/response.ts +9 -1
  107. package/src/lib/http/security-headers.ts +91 -0
  108. package/src/lib/util/type.ts +18 -0
  109. package/src/oauth-errors.ts +1 -0
  110. package/src/oauth-hooks.ts +4 -25
  111. package/src/oauth-provider.ts +40 -34
  112. package/src/output/backend-data.ts +18 -0
  113. package/src/output/build-authorize-data.ts +3 -26
  114. package/src/output/build-customization-data.ts +2 -13
  115. package/src/output/build-error-data.ts +8 -0
  116. package/src/output/build-error-payload.ts +4 -2
  117. package/src/output/output-manager.ts +86 -47
  118. package/src/output/send-web-page.ts +29 -58
  119. package/tsconfig.backend.json +1 -2
  120. package/tsconfig.backend.tsbuildinfo +1 -1
  121. package/tsconfig.json +1 -5
  122. package/.linguirc +0 -57
  123. package/dist/account/sign-up-data.d.ts.map +0 -1
  124. package/dist/account/sign-up-data.js.map +0 -1
  125. package/dist/assets/app/bundle-manifest.json +0 -614
  126. package/dist/assets/app/index-ItwwtJ8r.js +0 -36
  127. package/dist/assets/app/index-ItwwtJ8r.js.map +0 -1
  128. package/dist/assets/app/main-B_dNxQo_.js +0 -4
  129. package/dist/assets/app/main-B_dNxQo_.js.map +0 -1
  130. package/dist/assets/app/main-CSatvmRR.css +0 -3
  131. package/dist/assets/app/main-CSatvmRR.js +0 -306
  132. package/dist/assets/app/main-CSatvmRR.js.map +0 -1
  133. package/dist/assets/app/messages-BQeltXSF.js +0 -4
  134. package/dist/assets/app/messages-BQeltXSF.js.map +0 -1
  135. package/dist/assets/app/messages-BQkEhfjg.js +0 -4
  136. package/dist/assets/app/messages-BQkEhfjg.js.map +0 -1
  137. package/dist/assets/app/messages-BUjKj_UJ.js +0 -4
  138. package/dist/assets/app/messages-BUjKj_UJ.js.map +0 -1
  139. package/dist/assets/app/messages-BWIQa8fO.js +0 -4
  140. package/dist/assets/app/messages-BWIQa8fO.js.map +0 -1
  141. package/dist/assets/app/messages-BaNVb0bp.js +0 -4
  142. package/dist/assets/app/messages-BaNVb0bp.js.map +0 -1
  143. package/dist/assets/app/messages-BaizVXcF.js +0 -4
  144. package/dist/assets/app/messages-BaizVXcF.js.map +0 -1
  145. package/dist/assets/app/messages-BfoClA1Y.js +0 -4
  146. package/dist/assets/app/messages-BfoClA1Y.js.map +0 -1
  147. package/dist/assets/app/messages-BsKGDZnC.js +0 -4
  148. package/dist/assets/app/messages-BsKGDZnC.js.map +0 -1
  149. package/dist/assets/app/messages-Bu-TJhml.js +0 -4
  150. package/dist/assets/app/messages-Bu-TJhml.js.map +0 -1
  151. package/dist/assets/app/messages-BvOKnBQk.js +0 -4
  152. package/dist/assets/app/messages-BvOKnBQk.js.map +0 -1
  153. package/dist/assets/app/messages-BxDzCiWz.js +0 -4
  154. package/dist/assets/app/messages-BxDzCiWz.js.map +0 -1
  155. package/dist/assets/app/messages-CDgFOy4S.js +0 -4
  156. package/dist/assets/app/messages-CDgFOy4S.js.map +0 -1
  157. package/dist/assets/app/messages-CLbTz0o9.js +0 -4
  158. package/dist/assets/app/messages-CLbTz0o9.js.map +0 -1
  159. package/dist/assets/app/messages-CNwSh0t7.js +0 -4
  160. package/dist/assets/app/messages-CNwSh0t7.js.map +0 -1
  161. package/dist/assets/app/messages-CSMNJ6P8.js +0 -4
  162. package/dist/assets/app/messages-CSMNJ6P8.js.map +0 -1
  163. package/dist/assets/app/messages-CZQUw3mp.js +0 -4
  164. package/dist/assets/app/messages-CZQUw3mp.js.map +0 -1
  165. package/dist/assets/app/messages-CZT41oVp.js +0 -4
  166. package/dist/assets/app/messages-CZT41oVp.js.map +0 -1
  167. package/dist/assets/app/messages-C_b-d3t8.js +0 -4
  168. package/dist/assets/app/messages-C_b-d3t8.js.map +0 -1
  169. package/dist/assets/app/messages-C_u3MTc2.js +0 -4
  170. package/dist/assets/app/messages-C_u3MTc2.js.map +0 -1
  171. package/dist/assets/app/messages-Cn8nHZic.js +0 -4
  172. package/dist/assets/app/messages-Cn8nHZic.js.map +0 -1
  173. package/dist/assets/app/messages-CtDywJUm.js +0 -4
  174. package/dist/assets/app/messages-CtDywJUm.js.map +0 -1
  175. package/dist/assets/app/messages-CurtIjBF.js +0 -4
  176. package/dist/assets/app/messages-CurtIjBF.js.map +0 -1
  177. package/dist/assets/app/messages-Cv6zIbaP.js +0 -4
  178. package/dist/assets/app/messages-Cv6zIbaP.js.map +0 -1
  179. package/dist/assets/app/messages-D1eLQuPE.js +0 -4
  180. package/dist/assets/app/messages-D1eLQuPE.js.map +0 -1
  181. package/dist/assets/app/messages-D8vHEaYW.js +0 -4
  182. package/dist/assets/app/messages-D8vHEaYW.js.map +0 -1
  183. package/dist/assets/app/messages-DJ1Q4GeC.js +0 -4
  184. package/dist/assets/app/messages-DJ1Q4GeC.js.map +0 -1
  185. package/dist/assets/app/messages-DRL3exqd.js +0 -4
  186. package/dist/assets/app/messages-DRL3exqd.js.map +0 -1
  187. package/dist/assets/app/messages-DWLPQRTp.js +0 -4
  188. package/dist/assets/app/messages-DWLPQRTp.js.map +0 -1
  189. package/dist/assets/app/messages-DjVaE9YE.js +0 -4
  190. package/dist/assets/app/messages-DjVaE9YE.js.map +0 -1
  191. package/dist/assets/app/messages-DqpMfFJR.js +0 -4
  192. package/dist/assets/app/messages-DqpMfFJR.js.map +0 -1
  193. package/dist/assets/app/messages-ETjhJBEN.js +0 -4
  194. package/dist/assets/app/messages-ETjhJBEN.js.map +0 -1
  195. package/dist/assets/app/messages-EUKrgrGn.js +0 -4
  196. package/dist/assets/app/messages-EUKrgrGn.js.map +0 -1
  197. package/dist/assets/app/messages-QQrOUcPW.js +0 -4
  198. package/dist/assets/app/messages-QQrOUcPW.js.map +0 -1
  199. package/dist/assets/app/messages-e2QGqFL6.js +0 -4
  200. package/dist/assets/app/messages-e2QGqFL6.js.map +0 -1
  201. package/dist/assets/app/messages-p61py7gD.js +0 -4
  202. package/dist/assets/app/messages-p61py7gD.js.map +0 -1
  203. package/dist/assets/asset.d.ts +0 -9
  204. package/dist/assets/asset.d.ts.map +0 -1
  205. package/dist/assets/asset.js +0 -3
  206. package/dist/assets/asset.js.map +0 -1
  207. package/dist/assets/index.d.ts +0 -5
  208. package/dist/assets/index.d.ts.map +0 -1
  209. package/dist/assets/index.js +0 -78
  210. package/dist/assets/index.js.map +0 -1
  211. package/rollup.config.js +0 -98
  212. package/src/assets/app/app.tsx +0 -43
  213. package/src/assets/app/backend-data.ts +0 -27
  214. package/src/assets/app/backend-types.ts +0 -66
  215. package/src/assets/app/components/forms/button-toggle-visibility.tsx +0 -43
  216. package/src/assets/app/components/forms/button.tsx +0 -60
  217. package/src/assets/app/components/forms/fieldset.tsx +0 -55
  218. package/src/assets/app/components/forms/form-card-async.tsx +0 -103
  219. package/src/assets/app/components/forms/form-card.tsx +0 -49
  220. package/src/assets/app/components/forms/input-checkbox.tsx +0 -73
  221. package/src/assets/app/components/forms/input-container.tsx +0 -107
  222. package/src/assets/app/components/forms/input-email-address.tsx +0 -66
  223. package/src/assets/app/components/forms/input-new-password.tsx +0 -62
  224. package/src/assets/app/components/forms/input-password.tsx +0 -88
  225. package/src/assets/app/components/forms/input-text.tsx +0 -76
  226. package/src/assets/app/components/forms/input-token.tsx +0 -94
  227. package/src/assets/app/components/forms/wizard-card.tsx +0 -116
  228. package/src/assets/app/components/layouts/layout-title-page.tsx +0 -77
  229. package/src/assets/app/components/layouts/layout-welcome.tsx +0 -73
  230. package/src/assets/app/components/utils/account-identifier.tsx +0 -23
  231. package/src/assets/app/components/utils/account-image.tsx +0 -33
  232. package/src/assets/app/components/utils/admonition.tsx +0 -52
  233. package/src/assets/app/components/utils/client-name.tsx +0 -45
  234. package/src/assets/app/components/utils/error-card.tsx +0 -93
  235. package/src/assets/app/components/utils/error-message.tsx +0 -62
  236. package/src/assets/app/components/utils/help-card.tsx +0 -46
  237. package/src/assets/app/components/utils/icons.tsx +0 -88
  238. package/src/assets/app/components/utils/link-anchor.tsx +0 -28
  239. package/src/assets/app/components/utils/link-title.tsx +0 -26
  240. package/src/assets/app/components/utils/multi-lang-string.tsx +0 -56
  241. package/src/assets/app/components/utils/password-strength-label.tsx +0 -37
  242. package/src/assets/app/components/utils/password-strength-meter.tsx +0 -58
  243. package/src/assets/app/components/utils/url-viewer.tsx +0 -73
  244. package/src/assets/app/cookies.ts +0 -11
  245. package/src/assets/app/hooks/use-api.ts +0 -178
  246. package/src/assets/app/hooks/use-async-action.ts +0 -120
  247. package/src/assets/app/hooks/use-bound-dispatch.ts +0 -5
  248. package/src/assets/app/hooks/use-browser-color-scheme.ts +0 -31
  249. package/src/assets/app/hooks/use-csrf-token.ts +0 -5
  250. package/src/assets/app/hooks/use-random-string.ts +0 -37
  251. package/src/assets/app/hooks/use-stepper.ts +0 -87
  252. package/src/assets/app/index.html +0 -182
  253. package/src/assets/app/lib/api.ts +0 -267
  254. package/src/assets/app/lib/clsx.ts +0 -6
  255. package/src/assets/app/lib/json-client.ts +0 -94
  256. package/src/assets/app/lib/password.ts +0 -98
  257. package/src/assets/app/lib/ref.ts +0 -17
  258. package/src/assets/app/lib/util.ts +0 -13
  259. package/src/assets/app/locales/an/messages.po +0 -492
  260. package/src/assets/app/locales/ast/messages.po +0 -492
  261. package/src/assets/app/locales/ca/messages.po +0 -492
  262. package/src/assets/app/locales/da/messages.po +0 -492
  263. package/src/assets/app/locales/de/messages.po +0 -492
  264. package/src/assets/app/locales/el/messages.po +0 -492
  265. package/src/assets/app/locales/en/messages.po +0 -492
  266. package/src/assets/app/locales/en-GB/messages.po +0 -492
  267. package/src/assets/app/locales/es/messages.po +0 -492
  268. package/src/assets/app/locales/eu/messages.po +0 -492
  269. package/src/assets/app/locales/fi/messages.po +0 -492
  270. package/src/assets/app/locales/fr/messages.po +0 -492
  271. package/src/assets/app/locales/ga/messages.po +0 -492
  272. package/src/assets/app/locales/gl/messages.po +0 -492
  273. package/src/assets/app/locales/hi/messages.po +0 -492
  274. package/src/assets/app/locales/hu/messages.po +0 -492
  275. package/src/assets/app/locales/ia/messages.po +0 -492
  276. package/src/assets/app/locales/id/messages.po +0 -492
  277. package/src/assets/app/locales/it/messages.po +0 -492
  278. package/src/assets/app/locales/ja/messages.po +0 -492
  279. package/src/assets/app/locales/km/messages.po +0 -492
  280. package/src/assets/app/locales/ko/messages.po +0 -492
  281. package/src/assets/app/locales/load.ts +0 -8
  282. package/src/assets/app/locales/locale-context.ts +0 -19
  283. package/src/assets/app/locales/locale-provider.tsx +0 -112
  284. package/src/assets/app/locales/locale-selector.tsx +0 -58
  285. package/src/assets/app/locales/locales.ts +0 -168
  286. package/src/assets/app/locales/ne/messages.po +0 -492
  287. package/src/assets/app/locales/nl/messages.po +0 -492
  288. package/src/assets/app/locales/pl/messages.po +0 -492
  289. package/src/assets/app/locales/pt-BR/messages.po +0 -492
  290. package/src/assets/app/locales/ro/messages.po +0 -492
  291. package/src/assets/app/locales/ru/messages.po +0 -492
  292. package/src/assets/app/locales/sv/messages.po +0 -492
  293. package/src/assets/app/locales/th/messages.po +0 -492
  294. package/src/assets/app/locales/tr/messages.po +0 -492
  295. package/src/assets/app/locales/uk/messages.po +0 -492
  296. package/src/assets/app/locales/vi/messages.po +0 -492
  297. package/src/assets/app/locales/zh-CN/messages.po +0 -492
  298. package/src/assets/app/locales/zh-HK/messages.po +0 -492
  299. package/src/assets/app/locales/zh-TW/messages.po +0 -492
  300. package/src/assets/app/main.css +0 -33
  301. package/src/assets/app/main.tsx +0 -44
  302. package/src/assets/app/views/authorize/accept/accept-form.tsx +0 -150
  303. package/src/assets/app/views/authorize/accept/accept-view.tsx +0 -70
  304. package/src/assets/app/views/authorize/authorize-view.tsx +0 -180
  305. package/src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx +0 -88
  306. package/src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx +0 -80
  307. package/src/assets/app/views/authorize/reset-password/reset-password-view.tsx +0 -127
  308. package/src/assets/app/views/authorize/sign-in/sign-in-form.tsx +0 -244
  309. package/src/assets/app/views/authorize/sign-in/sign-in-picker.tsx +0 -116
  310. package/src/assets/app/views/authorize/sign-in/sign-in-view.tsx +0 -145
  311. package/src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx +0 -140
  312. package/src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx +0 -51
  313. package/src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx +0 -289
  314. package/src/assets/app/views/authorize/sign-up/sign-up-hcaptcha-form.tsx +0 -108
  315. package/src/assets/app/views/authorize/sign-up/sign-up-view.tsx +0 -158
  316. package/src/assets/app/views/authorize/welcome/welcome-view.tsx +0 -56
  317. package/src/assets/app/views/error/error-view.tsx +0 -31
  318. package/src/assets/asset.ts +0 -9
  319. package/src/assets/index.ts +0 -86
  320. package/tailwind.config.js +0 -31
  321. package/tsconfig.frontend.json +0 -11
  322. package/tsconfig.frontend.tsbuildinfo +0 -1
  323. package/tsconfig.tools.json +0 -8
  324. package/tsconfig.tools.tsbuildinfo +0 -1
  325. package/vite.config.mjs +0 -16
package/rollup.config.js DELETED
@@ -1,98 +0,0 @@
1
- /* eslint-env node */
2
-
3
- const { default: commonjs } = require('@rollup/plugin-commonjs')
4
- const {
5
- default: dynamicImportVars,
6
- } = require('@rollup/plugin-dynamic-import-vars')
7
- const { default: nodeResolve } = require('@rollup/plugin-node-resolve')
8
- const { default: swc } = require('@rollup/plugin-swc')
9
- const { defineConfig } = require('rollup')
10
- const {
11
- default: manifest,
12
- } = require('@atproto-labs/rollup-plugin-bundle-manifest')
13
- const postcss = ((m) => m.default || m)(require('rollup-plugin-postcss'))
14
-
15
- module.exports = defineConfig((commandLineArguments) => {
16
- const NODE_ENV =
17
- process.env['NODE_ENV'] ??
18
- (commandLineArguments.watch ? 'development' : 'production')
19
-
20
- const devMode = NODE_ENV === 'development'
21
-
22
- return {
23
- input: ['src/assets/app/main.tsx', 'src/assets/app/main.css'],
24
- output: {
25
- manualChunks: undefined,
26
- sourcemap: true,
27
- dir: 'dist/assets/app',
28
- format: 'module',
29
- entryFileNames: 'main-[hash].js',
30
- },
31
- plugins: [
32
- {
33
- name: 'resolve-swc-helpers',
34
- resolveId(src) {
35
- // For some reason, "nodeResolve" doesn't resolve these:
36
- if (src.startsWith('@swc/helpers/')) return require.resolve(src)
37
- },
38
- },
39
- nodeResolve({
40
- preferBuiltins: false,
41
- browser: true,
42
- exportConditions: ['browser', 'module', 'import', 'default'],
43
- }),
44
- commonjs(),
45
- postcss({ config: true, extract: true, minimize: !devMode }),
46
- swc({
47
- swc: {
48
- swcrc: false,
49
- configFile: false,
50
- sourceMaps: true,
51
- minify: !devMode,
52
- jsc: {
53
- experimental: {
54
- // @NOTE Because of the experimental nature of SWC plugins, A
55
- // very particular version of @swc/core needs to be used. The
56
- // link below allows to determine with version of @swc/core is
57
- // compatible based on the version of @lingui/swc-plugin used
58
- // (click on the swc_core version in the right column to see
59
- // which version of the @swc/core is compatible)
60
- //
61
- // https://github.com/lingui/swc-plugin?tab=readme-ov-file#compatibility
62
- plugins: [['@lingui/swc-plugin', {}]],
63
- },
64
- minify: {
65
- compress: true,
66
- mangle: true,
67
- },
68
- externalHelpers: true,
69
- target: 'es2020',
70
- parser: { syntax: 'typescript', tsx: true },
71
- transform: {
72
- useDefineForClassFields: true,
73
- react: { runtime: 'automatic' },
74
- optimizer: {
75
- simplify: true,
76
- globals: {
77
- vars: { 'process.env.NODE_ENV': JSON.stringify(NODE_ENV) },
78
- },
79
- },
80
- },
81
- },
82
- },
83
- }),
84
- dynamicImportVars({ errorWhenNoFilesFound: true }),
85
-
86
- // Change `data` to `true` to include assets data in the manifest,
87
- // allowing for easier bundling of the backend code (eg. using esbuild) as
88
- // bundlers know how to bundle JSON files but not how to bundle assets
89
- // referenced at runtime.
90
- manifest({ data: false }),
91
- ],
92
- onwarn(warning, warn) {
93
- // 'use client' directives are fine
94
- if (warning.code === 'MODULE_LEVEL_DIRECTIVE') return
95
- warn(warning)
96
- },
97
- }
98
- })
@@ -1,43 +0,0 @@
1
- import { ErrorBoundary } from 'react-error-boundary'
2
- import type {
3
- AuthorizeData,
4
- AvailableLocales,
5
- CustomizationData,
6
- ErrorData,
7
- } from './backend-types.ts'
8
- import { LocaleProvider } from './locales/locale-provider.tsx'
9
- import { AuthorizeView } from './views/authorize/authorize-view.tsx'
10
- import { ErrorView } from './views/error/error-view.tsx'
11
-
12
- export type AppProps = {
13
- availableLocales?: AvailableLocales
14
- authorizeData?: AuthorizeData
15
- customizationData?: CustomizationData
16
- errorData?: ErrorData
17
- }
18
-
19
- export function App({
20
- availableLocales,
21
- authorizeData,
22
- customizationData,
23
- errorData,
24
- }: AppProps) {
25
- return (
26
- <LocaleProvider availableLocales={availableLocales}>
27
- <ErrorBoundary
28
- fallbackRender={({ error }) => (
29
- <ErrorView error={error} customizationData={customizationData} />
30
- )}
31
- >
32
- {errorData || !authorizeData ? (
33
- <ErrorView error={errorData} customizationData={customizationData} />
34
- ) : (
35
- <AuthorizeView
36
- customizationData={customizationData}
37
- authorizeData={authorizeData}
38
- />
39
- )}
40
- </ErrorBoundary>
41
- </LocaleProvider>
42
- )
43
- }
@@ -1,27 +0,0 @@
1
- import {
2
- AuthorizeData,
3
- AvailableLocales,
4
- CustomizationData,
5
- ErrorData,
6
- } from './backend-types.ts'
7
-
8
- function readBackendData<T>(key: string): T | undefined {
9
- const value = window[key] as T | undefined
10
- delete window[key] // Prevent accidental usage / potential leaks to dependencies
11
- return value
12
- }
13
-
14
- // These values are injected by the backend when it builds the
15
- // page HTML. See "declareBackendData()" in the backend.
16
-
17
- /** @deprecated Do not import directly. Only import this from main.tsx */
18
- export const availableLocales =
19
- readBackendData<AvailableLocales>('__availableLocales')
20
- /** @deprecated Do not import directly. Only import this from main.tsx */
21
- export const customizationData = readBackendData<CustomizationData>(
22
- '__customizationData',
23
- )
24
- /** @deprecated Do not import directly. Only import this from main.tsx */
25
- export const errorData = readBackendData<ErrorData>('__errorData')
26
- /** @deprecated Do not import directly. Only import this from main.tsx */
27
- export const authorizeData = readBackendData<AuthorizeData>('__authorizeData')
@@ -1,66 +0,0 @@
1
- import type { OAuthClientMetadata } from '@atproto/oauth-types'
2
-
3
- // @TODO: Find a way to share these types with the backend code
4
-
5
- export type Account = {
6
- sub: string
7
- aud: string | [string, ...string[]]
8
-
9
- email?: string
10
- email_verified?: boolean
11
- name?: string
12
- preferred_username?: string
13
- picture?: string
14
- }
15
-
16
- export type Session = {
17
- account: Account
18
- info?: never // Prevent relying on this in the frontend
19
-
20
- selected: boolean
21
- loginRequired: boolean
22
- consentRequired: boolean
23
- }
24
-
25
- export type LocalizedString = string | ({ en: string } & Record<string, string>)
26
-
27
- export type AvailableLocales = readonly string[]
28
-
29
- export type LinkDefinition = {
30
- title: LocalizedString
31
- href: string
32
- rel?: string
33
- }
34
-
35
- export type CustomizationData = {
36
- // Functional customization
37
- hcaptchaSiteKey?: string
38
- inviteCodeRequired?: boolean
39
- availableUserDomains?: string[]
40
-
41
- // Aesthetic customization
42
- name?: string
43
- logo?: string
44
- links?: LinkDefinition[]
45
- }
46
-
47
- export type ErrorData = {
48
- error: string
49
- error_description: string
50
- }
51
-
52
- export type ScopeDetail = {
53
- scope: string
54
- description?: string
55
- }
56
-
57
- export type AuthorizeData = {
58
- clientId: string
59
- clientMetadata: OAuthClientMetadata
60
- clientTrusted: boolean
61
- requestUri: string
62
- loginHint?: string
63
- scopeDetails?: ScopeDetail[]
64
- newSessionsRequireConsent: boolean
65
- sessions: Session[]
66
- }
@@ -1,43 +0,0 @@
1
- import { useLingui } from '@lingui/react/macro'
2
- import { Override } from '../../lib/util.ts'
3
- import { EyeIcon, EyeSlashIcon } from '../utils/icons.tsx'
4
- import { Button, ButtonProps } from './button.tsx'
5
-
6
- export type ButtonToggleVisibilityProps = Override<
7
- Omit<ButtonProps, 'aria-label' | 'square'>,
8
- {
9
- visible: boolean
10
- toggleVisible: () => void
11
- }
12
- >
13
-
14
- /**
15
- * Generic button to toggle visibility of an item (e.g. password).
16
- */
17
- export function ButtonToggleVisibility({
18
- visible,
19
- toggleVisible,
20
-
21
- // button
22
- onClick,
23
- ...props
24
- }: ButtonToggleVisibilityProps) {
25
- const { t } = useLingui()
26
- return (
27
- <Button
28
- {...props}
29
- square
30
- onClick={(event) => {
31
- onClick?.(event)
32
- if (!event.defaultPrevented) toggleVisible()
33
- }}
34
- aria-label={visible ? t`Hide` : t`Make visible`}
35
- >
36
- {visible ? (
37
- <EyeIcon className="w-5" aria-hidden />
38
- ) : (
39
- <EyeSlashIcon className="w-5" aria-hidden />
40
- )}
41
- </Button>
42
- )
43
- }
@@ -1,60 +0,0 @@
1
- import { JSX } from 'react'
2
- import { clsx } from '../../lib/clsx.ts'
3
- import { Override } from '../../lib/util.ts'
4
-
5
- export type ButtonProps = Override<
6
- JSX.IntrinsicElements['button'],
7
- {
8
- color?: 'brand' | 'grey'
9
- loading?: boolean
10
- transparent?: boolean
11
- square?: boolean
12
- }
13
- >
14
-
15
- export function Button({
16
- color = 'grey',
17
- transparent = false,
18
- loading = undefined,
19
- square = false,
20
-
21
- // button
22
- children,
23
- className,
24
- type = 'button',
25
- role = 'Button',
26
- disabled = false,
27
- ...props
28
- }: ButtonProps) {
29
- return (
30
- <button
31
- role={role}
32
- type={type}
33
- disabled={disabled || loading === true}
34
- {...props}
35
- className={clsx(
36
- 'rounded-lg truncate cursor-pointer touch-manipulation tracking-wide overflow-hidden',
37
- square ? 'p-2' : 'py-2 px-6',
38
- color === 'brand'
39
- ? clsx(
40
- 'accent-slate-100',
41
- transparent
42
- ? 'bg-transparent text-brand'
43
- : 'bg-brand text-brand-c',
44
- )
45
- : color === 'grey'
46
- ? clsx(
47
- 'accent-brand',
48
- 'text-slate-600 dark:text-slate-300',
49
- 'hover:bg-gray-200 dark:hover:bg-gray-700',
50
- transparent ? 'bg-transparent' : 'bg-gray-100 dark:bg-gray-800',
51
- )
52
- : undefined,
53
- 'disabled:opacity-50',
54
- className,
55
- )}
56
- >
57
- {children}
58
- </button>
59
- )
60
- }
@@ -1,55 +0,0 @@
1
- import { JSX, ReactNode, createContext, useMemo } from 'react'
2
- import { useRandomString } from '../../hooks/use-random-string.ts'
3
- import { Override } from '../../lib/util.ts'
4
-
5
- export type FieldsetContextValue = {
6
- disabled: boolean
7
- labelId?: string
8
- }
9
-
10
- export const FieldsetContext = createContext<FieldsetContextValue>({
11
- disabled: false,
12
- })
13
- FieldsetContext.displayName = 'FieldsetContext'
14
-
15
- export type FieldsetCardProps = Override<
16
- Omit<JSX.IntrinsicElements['fieldset'], 'aria-labelledby'>,
17
- {
18
- label?: ReactNode
19
- }
20
- >
21
-
22
- export function Fieldset({
23
- label,
24
- children,
25
- disabled,
26
- ...props
27
- }: FieldsetCardProps) {
28
- const labelId = useRandomString({ prefix: 'fieldset-' })
29
-
30
- const contextValue = useMemo(
31
- () => ({
32
- disabled: disabled ?? false,
33
- labelId: label ? labelId : undefined,
34
- }),
35
- [disabled, label, labelId],
36
- )
37
-
38
- return (
39
- <fieldset {...props} aria-labelledby={labelId} disabled={disabled}>
40
- {label && (
41
- <legend
42
- id={labelId}
43
- key="title"
44
- className="mb-1 text-slate-600 dark:text-slate-400 text-sm font-medium"
45
- >
46
- {label}
47
- </legend>
48
- )}
49
-
50
- <div className="flex flex-col space-y-4">
51
- <FieldsetContext value={contextValue}>{children}</FieldsetContext>
52
- </div>
53
- </fieldset>
54
- )
55
- }
@@ -1,103 +0,0 @@
1
- import { Trans } from '@lingui/react/macro'
2
- import { FormEvent, ReactNode, useCallback } from 'react'
3
- import {
4
- UseAsyncActionOptions,
5
- useAsyncAction,
6
- } from '../../hooks/use-async-action.ts'
7
- import { Override } from '../../lib/util.ts'
8
- import { ErrorCard } from '../utils/error-card.tsx'
9
- import { Button } from './button.tsx'
10
- import { FormCard, FormCardProps } from './form-card.tsx'
11
-
12
- export type { AsyncActionController } from '../../hooks/use-async-action.ts'
13
-
14
- export type ErrorRender = (data: { error: Error }) => ReactNode
15
- export const errorRenderDefault: ErrorRender = ({ error }) => (
16
- <ErrorCard error={error} />
17
- )
18
-
19
- export type FormCardAsyncProps = Override<
20
- Override<
21
- Omit<FormCardProps, 'cancel' | 'actions' | 'prepend'>,
22
- Pick<UseAsyncActionOptions, 'ref' | 'onLoading' | 'onError'>
23
- >,
24
- {
25
- invalid?: boolean
26
- disabled?: boolean
27
-
28
- onSubmit: (signal: AbortSignal) => void | PromiseLike<void>
29
- submitLabel?: ReactNode
30
-
31
- onCancel?: () => void
32
- cancelLabel?: ReactNode
33
-
34
- errorRender?: ErrorRender
35
- }
36
- >
37
-
38
- export function FormCardAsync({
39
- invalid,
40
- disabled,
41
-
42
- onSubmit,
43
- submitLabel,
44
-
45
- onCancel = undefined,
46
- cancelLabel,
47
-
48
- errorRender = errorRenderDefault,
49
-
50
- // UseAsyncActionOptions
51
- ref,
52
- onLoading,
53
- onError,
54
-
55
- // FormCardProps
56
- children,
57
- ...props
58
- }: FormCardAsyncProps) {
59
- const { run, loading, error } = useAsyncAction(onSubmit, {
60
- ref,
61
- onError,
62
- onLoading,
63
- })
64
-
65
- const doSubmit = useCallback(
66
- (event: FormEvent<HTMLFormElement>) => {
67
- event.preventDefault()
68
-
69
- if (!event.currentTarget.reportValidity()) return
70
-
71
- if (!disabled && !invalid) void run()
72
- },
73
- [disabled, invalid, run],
74
- )
75
-
76
- return (
77
- <FormCard
78
- {...props}
79
- onSubmit={doSubmit}
80
- disabled={disabled || loading}
81
- prepend={error != null ? errorRender({ error }) : undefined}
82
- cancel={
83
- onCancel && (
84
- <Button onClick={onCancel}>
85
- {cancelLabel || <Trans>Cancel</Trans>}
86
- </Button>
87
- )
88
- }
89
- actions={
90
- <Button
91
- color="brand"
92
- type="submit"
93
- loading={loading}
94
- disabled={disabled}
95
- >
96
- {submitLabel || <Trans>Submit</Trans>}
97
- </Button>
98
- }
99
- >
100
- {children}
101
- </FormCard>
102
- )
103
- }
@@ -1,49 +0,0 @@
1
- import { JSX, ReactNode } from 'react'
2
- import { Override } from '../../lib/util.ts'
3
-
4
- export type FormCardProps = Override<
5
- JSX.IntrinsicElements['form'],
6
- {
7
- disabled?: boolean
8
- append?: ReactNode
9
- prepend?: ReactNode
10
- cancel?: ReactNode
11
- actions?: ReactNode
12
- }
13
- >
14
-
15
- export function FormCard({
16
- actions,
17
- cancel,
18
- append,
19
- children,
20
- prepend,
21
- disabled,
22
-
23
- // form
24
- inert = disabled,
25
- ...props
26
- }: FormCardProps) {
27
- return (
28
- <form {...props} inert={inert} className="flex flex-col space-y-4">
29
- {prepend && <div key="prepend">{prepend}</div>}
30
-
31
- <div key="children" className="space-y-4">
32
- {children}
33
- </div>
34
-
35
- {append && <div key="append">{append}</div>}
36
-
37
- {(actions || cancel) && (
38
- <div
39
- key="buttons"
40
- className="flex flex-wrap flex-row-reverse items-center justify-end space-x-reverse space-x-2"
41
- >
42
- {actions}
43
- <div className="flex-auto" />
44
- {cancel}
45
- </div>
46
- )}
47
- </form>
48
- )
49
- }
@@ -1,73 +0,0 @@
1
- import { JSX, ReactNode, useContext, useRef } from 'react'
2
- import { useRandomString } from '../../hooks/use-random-string.ts'
3
- import { clsx } from '../../lib/clsx.ts'
4
- import { mergeRefs } from '../../lib/ref.ts'
5
- import { Override } from '../../lib/util.ts'
6
- import { FieldsetContext } from './fieldset.tsx'
7
- import { InputContainer } from './input-container.tsx'
8
-
9
- export type InputCheckboxProps = Override<
10
- Omit<JSX.IntrinsicElements['input'], 'className' | 'type' | 'children'>,
11
- {
12
- className?: string
13
- children?: ReactNode
14
- }
15
- >
16
-
17
- export function InputCheckbox({
18
- className,
19
- children,
20
-
21
- // input
22
- id,
23
- ref,
24
- disabled,
25
- 'aria-labelledby': ariaLabelledBy,
26
- ...props
27
- }: InputCheckboxProps) {
28
- const htmlFor = useRandomString('input-checkbox-')
29
- const containerRef = useRef<HTMLDivElement>(null)
30
- const inputRef = useRef<HTMLInputElement>(null)
31
- const ctx = useContext(FieldsetContext)
32
-
33
- const inputId = id ?? htmlFor
34
-
35
- return (
36
- <InputContainer
37
- ref={containerRef}
38
- className={clsx('cursor-pointer', className)}
39
- icon={
40
- <input
41
- {...props}
42
- disabled={disabled ?? ctx.disabled}
43
- aria-labelledby={
44
- children
45
- ? // Prefer the local "<label>" element (through "htmlFor") over the wrapping "<fieldset>" to describe the checkbox.
46
- undefined
47
- : ariaLabelledBy ?? ctx.labelId
48
- }
49
- ref={mergeRefs([ref, inputRef])}
50
- id={inputId}
51
- className="accent-brand outline-none"
52
- type="checkbox"
53
- />
54
- }
55
- tabIndex={-1}
56
- onClick={(event) => {
57
- if (event.target === containerRef.current && !event.defaultPrevented) {
58
- inputRef.current?.click()
59
- inputRef.current?.focus()
60
- }
61
- }}
62
- >
63
- {children && (
64
- <label
65
- htmlFor={inputId}
66
- className="block w-full leading-[1.6] select-none cursor-pointer"
67
- >
68
- {children}
69
- </label>
70
- )}
71
- </InputContainer>
72
- )
73
- }