@atproto/oauth-provider 0.5.2 → 0.6.1

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 (310) hide show
  1. package/CHANGELOG.md +37 -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 +7 -0
  7. package/dist/account/account-store.d.ts.map +1 -1
  8. package/dist/account/account-store.js.map +1 -1
  9. package/dist/account/account.d.ts +1 -11
  10. package/dist/account/account.d.ts.map +1 -1
  11. package/dist/account/{sign-up-data.d.ts → sign-up-input.d.ts} +3 -3
  12. package/dist/account/sign-up-input.d.ts.map +1 -0
  13. package/dist/account/{sign-up-data.js → sign-up-input.js} +3 -3
  14. package/dist/account/sign-up-input.js.map +1 -0
  15. package/dist/assets/assets-middleware.d.ts +2 -0
  16. package/dist/assets/assets-middleware.d.ts.map +1 -1
  17. package/dist/assets/assets-middleware.js +12 -14
  18. package/dist/assets/assets-middleware.js.map +1 -1
  19. package/dist/lib/csp/index.d.ts +5 -6
  20. package/dist/lib/csp/index.d.ts.map +1 -1
  21. package/dist/lib/csp/index.js +14 -11
  22. package/dist/lib/csp/index.js.map +1 -1
  23. package/dist/lib/hcaptcha.d.ts +15 -12
  24. package/dist/lib/hcaptcha.d.ts.map +1 -1
  25. package/dist/lib/hcaptcha.js +11 -7
  26. package/dist/lib/hcaptcha.js.map +1 -1
  27. package/dist/lib/html/build-document.d.ts +2 -2
  28. package/dist/lib/html/build-document.d.ts.map +1 -1
  29. package/dist/lib/html/build-document.js +11 -7
  30. package/dist/lib/html/build-document.js.map +1 -1
  31. package/dist/lib/html/html.d.ts.map +1 -1
  32. package/dist/lib/html/html.js +10 -13
  33. package/dist/lib/html/html.js.map +1 -1
  34. package/dist/lib/html/util.d.ts +0 -1
  35. package/dist/lib/html/util.d.ts.map +1 -1
  36. package/dist/lib/html/util.js +0 -4
  37. package/dist/lib/html/util.js.map +1 -1
  38. package/dist/lib/http/response.d.ts +3 -1
  39. package/dist/lib/http/response.d.ts.map +1 -1
  40. package/dist/lib/http/response.js +3 -0
  41. package/dist/lib/http/response.js.map +1 -1
  42. package/dist/lib/http/security-headers.d.ts +48 -0
  43. package/dist/lib/http/security-headers.d.ts.map +1 -0
  44. package/dist/lib/http/security-headers.js +62 -0
  45. package/dist/lib/http/security-headers.js.map +1 -0
  46. package/dist/lib/util/type.d.ts +8 -0
  47. package/dist/lib/util/type.d.ts.map +1 -1
  48. package/dist/lib/util/type.js.map +1 -1
  49. package/dist/oauth-hooks.d.ts +4 -25
  50. package/dist/oauth-hooks.d.ts.map +1 -1
  51. package/dist/oauth-provider.js +2 -2
  52. package/dist/oauth-provider.js.map +1 -1
  53. package/dist/output/backend-data.d.ts +4 -0
  54. package/dist/output/backend-data.d.ts.map +1 -0
  55. package/dist/output/backend-data.js +19 -0
  56. package/dist/output/backend-data.js.map +1 -0
  57. package/dist/output/build-authorize-data.d.ts +3 -19
  58. package/dist/output/build-authorize-data.d.ts.map +1 -1
  59. package/dist/output/build-authorize-data.js.map +1 -1
  60. package/dist/output/build-customization-data.d.ts +11 -18
  61. package/dist/output/build-customization-data.d.ts.map +1 -1
  62. package/dist/output/build-customization-data.js +1 -1
  63. package/dist/output/build-customization-data.js.map +1 -1
  64. package/dist/output/build-error-data.d.ts +3 -0
  65. package/dist/output/build-error-data.d.ts.map +1 -0
  66. package/dist/output/build-error-data.js +10 -0
  67. package/dist/output/build-error-data.js.map +1 -0
  68. package/dist/output/build-error-payload.d.ts +2 -1
  69. package/dist/output/build-error-payload.d.ts.map +1 -1
  70. package/dist/output/build-error-payload.js.map +1 -1
  71. package/dist/output/output-manager.d.ts +10 -4
  72. package/dist/output/output-manager.d.ts.map +1 -1
  73. package/dist/output/output-manager.js +68 -39
  74. package/dist/output/output-manager.js.map +1 -1
  75. package/dist/output/send-web-page.d.ts +6 -10
  76. package/dist/output/send-web-page.d.ts.map +1 -1
  77. package/dist/output/send-web-page.js +27 -47
  78. package/dist/output/send-web-page.js.map +1 -1
  79. package/dist/signer/signed-token-payload.d.ts +3 -3
  80. package/dist/signer/signer.d.ts +2 -2
  81. package/package.json +8 -41
  82. package/src/account/account-manager.ts +55 -34
  83. package/src/account/account-store.ts +8 -0
  84. package/src/account/account.ts +1 -14
  85. package/src/account/{sign-up-data.ts → sign-up-input.ts} +2 -2
  86. package/src/assets/assets-middleware.ts +11 -17
  87. package/src/lib/csp/index.ts +16 -13
  88. package/src/lib/hcaptcha.ts +14 -10
  89. package/src/lib/html/build-document.ts +15 -8
  90. package/src/lib/html/html.ts +11 -18
  91. package/src/lib/html/util.ts +0 -4
  92. package/src/lib/http/response.ts +9 -1
  93. package/src/lib/http/security-headers.ts +91 -0
  94. package/src/lib/util/type.ts +18 -0
  95. package/src/oauth-hooks.ts +4 -25
  96. package/src/oauth-provider.ts +2 -2
  97. package/src/output/backend-data.ts +18 -0
  98. package/src/output/build-authorize-data.ts +3 -26
  99. package/src/output/build-customization-data.ts +2 -13
  100. package/src/output/build-error-data.ts +8 -0
  101. package/src/output/build-error-payload.ts +4 -2
  102. package/src/output/output-manager.ts +86 -47
  103. package/src/output/send-web-page.ts +29 -58
  104. package/tsconfig.backend.json +1 -2
  105. package/tsconfig.backend.tsbuildinfo +1 -1
  106. package/tsconfig.json +1 -5
  107. package/.linguirc +0 -57
  108. package/dist/account/sign-up-data.d.ts.map +0 -1
  109. package/dist/account/sign-up-data.js.map +0 -1
  110. package/dist/assets/app/bundle-manifest.json +0 -614
  111. package/dist/assets/app/index-DZHZ9kCP.js +0 -36
  112. package/dist/assets/app/index-DZHZ9kCP.js.map +0 -1
  113. package/dist/assets/app/main-B_dNxQo_.js +0 -4
  114. package/dist/assets/app/main-B_dNxQo_.js.map +0 -1
  115. package/dist/assets/app/main-Dr6y26KY.css +0 -3
  116. package/dist/assets/app/main-Dr6y26KY.js +0 -306
  117. package/dist/assets/app/main-Dr6y26KY.js.map +0 -1
  118. package/dist/assets/app/messages-6_mYuGzB.js +0 -4
  119. package/dist/assets/app/messages-6_mYuGzB.js.map +0 -1
  120. package/dist/assets/app/messages-7wdeBTpD.js +0 -4
  121. package/dist/assets/app/messages-7wdeBTpD.js.map +0 -1
  122. package/dist/assets/app/messages-B-YFoWKc.js +0 -4
  123. package/dist/assets/app/messages-B-YFoWKc.js.map +0 -1
  124. package/dist/assets/app/messages-B10DUOE-.js +0 -4
  125. package/dist/assets/app/messages-B10DUOE-.js.map +0 -1
  126. package/dist/assets/app/messages-B4AwFEeZ.js +0 -4
  127. package/dist/assets/app/messages-B4AwFEeZ.js.map +0 -1
  128. package/dist/assets/app/messages-BDP8MyEC.js +0 -4
  129. package/dist/assets/app/messages-BDP8MyEC.js.map +0 -1
  130. package/dist/assets/app/messages-BIS87lxQ.js +0 -4
  131. package/dist/assets/app/messages-BIS87lxQ.js.map +0 -1
  132. package/dist/assets/app/messages-BI_Wbjdt.js +0 -4
  133. package/dist/assets/app/messages-BI_Wbjdt.js.map +0 -1
  134. package/dist/assets/app/messages-BMAouhRx.js +0 -4
  135. package/dist/assets/app/messages-BMAouhRx.js.map +0 -1
  136. package/dist/assets/app/messages-BdckMnJj.js +0 -4
  137. package/dist/assets/app/messages-BdckMnJj.js.map +0 -1
  138. package/dist/assets/app/messages-BgBLzc46.js +0 -4
  139. package/dist/assets/app/messages-BgBLzc46.js.map +0 -1
  140. package/dist/assets/app/messages-BobD78yK.js +0 -4
  141. package/dist/assets/app/messages-BobD78yK.js.map +0 -1
  142. package/dist/assets/app/messages-BtThT9UZ.js +0 -4
  143. package/dist/assets/app/messages-BtThT9UZ.js.map +0 -1
  144. package/dist/assets/app/messages-BwKHkbeh.js +0 -4
  145. package/dist/assets/app/messages-BwKHkbeh.js.map +0 -1
  146. package/dist/assets/app/messages-C417YUvA.js +0 -4
  147. package/dist/assets/app/messages-C417YUvA.js.map +0 -1
  148. package/dist/assets/app/messages-C4CxO4bO.js +0 -4
  149. package/dist/assets/app/messages-C4CxO4bO.js.map +0 -1
  150. package/dist/assets/app/messages-C5vd04e6.js +0 -4
  151. package/dist/assets/app/messages-C5vd04e6.js.map +0 -1
  152. package/dist/assets/app/messages-CAri2Wnz.js +0 -4
  153. package/dist/assets/app/messages-CAri2Wnz.js.map +0 -1
  154. package/dist/assets/app/messages-CPtWTZeG.js +0 -4
  155. package/dist/assets/app/messages-CPtWTZeG.js.map +0 -1
  156. package/dist/assets/app/messages-CiaM5zm8.js +0 -4
  157. package/dist/assets/app/messages-CiaM5zm8.js.map +0 -1
  158. package/dist/assets/app/messages-CkL-L2R6.js +0 -4
  159. package/dist/assets/app/messages-CkL-L2R6.js.map +0 -1
  160. package/dist/assets/app/messages-Cy_4XLNe.js +0 -4
  161. package/dist/assets/app/messages-Cy_4XLNe.js.map +0 -1
  162. package/dist/assets/app/messages-D5_ad-Eo.js +0 -4
  163. package/dist/assets/app/messages-D5_ad-Eo.js.map +0 -1
  164. package/dist/assets/app/messages-DChMl9mT.js +0 -4
  165. package/dist/assets/app/messages-DChMl9mT.js.map +0 -1
  166. package/dist/assets/app/messages-DWX-DIfv.js +0 -4
  167. package/dist/assets/app/messages-DWX-DIfv.js.map +0 -1
  168. package/dist/assets/app/messages-DgfsOphe.js +0 -4
  169. package/dist/assets/app/messages-DgfsOphe.js.map +0 -1
  170. package/dist/assets/app/messages-Dj5B_DR6.js +0 -4
  171. package/dist/assets/app/messages-Dj5B_DR6.js.map +0 -1
  172. package/dist/assets/app/messages-Dwzqo4eA.js +0 -4
  173. package/dist/assets/app/messages-Dwzqo4eA.js.map +0 -1
  174. package/dist/assets/app/messages-ESCIXJR7.js +0 -4
  175. package/dist/assets/app/messages-ESCIXJR7.js.map +0 -1
  176. package/dist/assets/app/messages-dglB2edb.js +0 -4
  177. package/dist/assets/app/messages-dglB2edb.js.map +0 -1
  178. package/dist/assets/app/messages-e_ClRrWc.js +0 -4
  179. package/dist/assets/app/messages-e_ClRrWc.js.map +0 -1
  180. package/dist/assets/app/messages-evvDxmrP.js +0 -4
  181. package/dist/assets/app/messages-evvDxmrP.js.map +0 -1
  182. package/dist/assets/app/messages-pPbdLb5B.js +0 -4
  183. package/dist/assets/app/messages-pPbdLb5B.js.map +0 -1
  184. package/dist/assets/app/messages-tJv8gHL2.js +0 -4
  185. package/dist/assets/app/messages-tJv8gHL2.js.map +0 -1
  186. package/dist/assets/app/messages-vLRVEw96.js +0 -4
  187. package/dist/assets/app/messages-vLRVEw96.js.map +0 -1
  188. package/dist/assets/asset.d.ts +0 -9
  189. package/dist/assets/asset.d.ts.map +0 -1
  190. package/dist/assets/asset.js +0 -3
  191. package/dist/assets/asset.js.map +0 -1
  192. package/dist/assets/index.d.ts +0 -5
  193. package/dist/assets/index.d.ts.map +0 -1
  194. package/dist/assets/index.js +0 -78
  195. package/dist/assets/index.js.map +0 -1
  196. package/rollup.config.js +0 -98
  197. package/src/assets/app/app.tsx +0 -43
  198. package/src/assets/app/backend-data.ts +0 -27
  199. package/src/assets/app/backend-types.ts +0 -66
  200. package/src/assets/app/components/forms/button-toggle-visibility.tsx +0 -43
  201. package/src/assets/app/components/forms/button.tsx +0 -60
  202. package/src/assets/app/components/forms/fieldset.tsx +0 -55
  203. package/src/assets/app/components/forms/form-card-async.tsx +0 -103
  204. package/src/assets/app/components/forms/form-card.tsx +0 -49
  205. package/src/assets/app/components/forms/input-checkbox.tsx +0 -78
  206. package/src/assets/app/components/forms/input-container.tsx +0 -107
  207. package/src/assets/app/components/forms/input-email-address.tsx +0 -65
  208. package/src/assets/app/components/forms/input-new-password.tsx +0 -62
  209. package/src/assets/app/components/forms/input-password.tsx +0 -87
  210. package/src/assets/app/components/forms/input-text.tsx +0 -82
  211. package/src/assets/app/components/forms/input-token.tsx +0 -94
  212. package/src/assets/app/components/forms/wizard-card.tsx +0 -116
  213. package/src/assets/app/components/layouts/layout-title-page.tsx +0 -77
  214. package/src/assets/app/components/layouts/layout-welcome.tsx +0 -73
  215. package/src/assets/app/components/utils/account-identifier.tsx +0 -23
  216. package/src/assets/app/components/utils/account-image.tsx +0 -33
  217. package/src/assets/app/components/utils/admonition.tsx +0 -52
  218. package/src/assets/app/components/utils/client-name.tsx +0 -45
  219. package/src/assets/app/components/utils/error-card.tsx +0 -93
  220. package/src/assets/app/components/utils/error-message.tsx +0 -88
  221. package/src/assets/app/components/utils/help-card.tsx +0 -46
  222. package/src/assets/app/components/utils/icons.tsx +0 -88
  223. package/src/assets/app/components/utils/link-anchor.tsx +0 -28
  224. package/src/assets/app/components/utils/link-title.tsx +0 -26
  225. package/src/assets/app/components/utils/multi-lang-string.tsx +0 -56
  226. package/src/assets/app/components/utils/password-strength-label.tsx +0 -37
  227. package/src/assets/app/components/utils/password-strength-meter.tsx +0 -58
  228. package/src/assets/app/components/utils/url-viewer.tsx +0 -73
  229. package/src/assets/app/cookies.ts +0 -11
  230. package/src/assets/app/hooks/use-api.ts +0 -178
  231. package/src/assets/app/hooks/use-async-action.ts +0 -120
  232. package/src/assets/app/hooks/use-bound-dispatch.ts +0 -5
  233. package/src/assets/app/hooks/use-browser-color-scheme.ts +0 -31
  234. package/src/assets/app/hooks/use-csrf-token.ts +0 -5
  235. package/src/assets/app/hooks/use-random-string.ts +0 -37
  236. package/src/assets/app/hooks/use-stepper.ts +0 -87
  237. package/src/assets/app/index.html +0 -182
  238. package/src/assets/app/lib/api.ts +0 -289
  239. package/src/assets/app/lib/clsx.ts +0 -6
  240. package/src/assets/app/lib/json-client.ts +0 -94
  241. package/src/assets/app/lib/password.ts +0 -98
  242. package/src/assets/app/lib/ref.ts +0 -17
  243. package/src/assets/app/lib/util.ts +0 -13
  244. package/src/assets/app/locales/an/messages.po +0 -490
  245. package/src/assets/app/locales/ast/messages.po +0 -490
  246. package/src/assets/app/locales/ca/messages.po +0 -490
  247. package/src/assets/app/locales/da/messages.po +0 -490
  248. package/src/assets/app/locales/de/messages.po +0 -490
  249. package/src/assets/app/locales/el/messages.po +0 -490
  250. package/src/assets/app/locales/en/messages.po +0 -490
  251. package/src/assets/app/locales/en-GB/messages.po +0 -490
  252. package/src/assets/app/locales/es/messages.po +0 -490
  253. package/src/assets/app/locales/eu/messages.po +0 -490
  254. package/src/assets/app/locales/fi/messages.po +0 -490
  255. package/src/assets/app/locales/fr/messages.po +0 -490
  256. package/src/assets/app/locales/ga/messages.po +0 -490
  257. package/src/assets/app/locales/gl/messages.po +0 -490
  258. package/src/assets/app/locales/hi/messages.po +0 -490
  259. package/src/assets/app/locales/hu/messages.po +0 -490
  260. package/src/assets/app/locales/ia/messages.po +0 -490
  261. package/src/assets/app/locales/id/messages.po +0 -490
  262. package/src/assets/app/locales/it/messages.po +0 -490
  263. package/src/assets/app/locales/ja/messages.po +0 -490
  264. package/src/assets/app/locales/km/messages.po +0 -490
  265. package/src/assets/app/locales/ko/messages.po +0 -490
  266. package/src/assets/app/locales/load.ts +0 -8
  267. package/src/assets/app/locales/locale-context.ts +0 -19
  268. package/src/assets/app/locales/locale-provider.tsx +0 -112
  269. package/src/assets/app/locales/locale-selector.tsx +0 -58
  270. package/src/assets/app/locales/locales.ts +0 -168
  271. package/src/assets/app/locales/ne/messages.po +0 -490
  272. package/src/assets/app/locales/nl/messages.po +0 -490
  273. package/src/assets/app/locales/pl/messages.po +0 -490
  274. package/src/assets/app/locales/pt-BR/messages.po +0 -490
  275. package/src/assets/app/locales/ro/messages.po +0 -490
  276. package/src/assets/app/locales/ru/messages.po +0 -490
  277. package/src/assets/app/locales/sv/messages.po +0 -490
  278. package/src/assets/app/locales/th/messages.po +0 -490
  279. package/src/assets/app/locales/tr/messages.po +0 -490
  280. package/src/assets/app/locales/uk/messages.po +0 -490
  281. package/src/assets/app/locales/vi/messages.po +0 -490
  282. package/src/assets/app/locales/zh-CN/messages.po +0 -490
  283. package/src/assets/app/locales/zh-HK/messages.po +0 -490
  284. package/src/assets/app/locales/zh-TW/messages.po +0 -490
  285. package/src/assets/app/main.css +0 -33
  286. package/src/assets/app/main.tsx +0 -44
  287. package/src/assets/app/views/authorize/accept/accept-form.tsx +0 -150
  288. package/src/assets/app/views/authorize/accept/accept-view.tsx +0 -70
  289. package/src/assets/app/views/authorize/authorize-view.tsx +0 -180
  290. package/src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx +0 -88
  291. package/src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx +0 -80
  292. package/src/assets/app/views/authorize/reset-password/reset-password-view.tsx +0 -127
  293. package/src/assets/app/views/authorize/sign-in/sign-in-form.tsx +0 -242
  294. package/src/assets/app/views/authorize/sign-in/sign-in-picker.tsx +0 -116
  295. package/src/assets/app/views/authorize/sign-in/sign-in-view.tsx +0 -145
  296. package/src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx +0 -142
  297. package/src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx +0 -51
  298. package/src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx +0 -287
  299. package/src/assets/app/views/authorize/sign-up/sign-up-hcaptcha-form.tsx +0 -108
  300. package/src/assets/app/views/authorize/sign-up/sign-up-view.tsx +0 -158
  301. package/src/assets/app/views/authorize/welcome/welcome-view.tsx +0 -56
  302. package/src/assets/app/views/error/error-view.tsx +0 -31
  303. package/src/assets/asset.ts +0 -9
  304. package/src/assets/index.ts +0 -86
  305. package/tailwind.config.js +0 -31
  306. package/tsconfig.frontend.json +0 -11
  307. package/tsconfig.frontend.tsbuildinfo +0 -1
  308. package/tsconfig.tools.json +0 -8
  309. package/tsconfig.tools.tsbuildinfo +0 -1
  310. 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,78 +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
- title,
26
- 'aria-label': ariaLabel = title,
27
- 'aria-labelledby': ariaLabelledBy,
28
- ...props
29
- }: InputCheckboxProps) {
30
- const htmlFor = useRandomString('input-checkbox-')
31
- const labelRef = useRef<HTMLLabelElement>(null)
32
- const inputRef = useRef<HTMLInputElement>(null)
33
- const ctx = useContext(FieldsetContext)
34
-
35
- const inputId = id ?? htmlFor
36
-
37
- return (
38
- <InputContainer
39
- className={clsx('cursor-pointer', className)}
40
- icon={
41
- <input
42
- {...props}
43
- disabled={disabled ?? ctx.disabled}
44
- title={title}
45
- aria-label={ariaLabel}
46
- aria-labelledby={
47
- children
48
- ? // Prefer the local "<label>" element (through "htmlFor") over the wrapping "<fieldset>" to describe the checkbox.
49
- undefined
50
- : ariaLabelledBy ?? ctx.labelId
51
- }
52
- ref={mergeRefs([ref, inputRef])}
53
- id={inputId}
54
- className="accent-brand outline-none"
55
- type="checkbox"
56
- />
57
- }
58
- tabIndex={-1}
59
- onClick={({ target }) => {
60
- // Native behavior of clicking the label should toggle the checkbox.
61
- if (target === labelRef.current) return
62
- if (target === inputRef.current) return
63
-
64
- inputRef.current?.click()
65
- }}
66
- >
67
- {children && (
68
- <label
69
- ref={labelRef}
70
- htmlFor={inputId}
71
- className="block w-full leading-[1.6] select-none cursor-pointer"
72
- >
73
- {children}
74
- </label>
75
- )}
76
- </InputContainer>
77
- )
78
- }