@wasp.sh/wasp-cli-darwin-x64-unknown 0.25.0 → 0.26.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 (255) hide show
  1. package/data/Cli/starters/README.md +2 -0
  2. package/data/Cli/starters/basic/README.md +3 -3
  3. package/data/Cli/starters/basic/src/tags/components/CreateTagForm.tsx +2 -3
  4. package/data/Cli/starters/basic/vite.config.ts +0 -3
  5. package/data/Cli/starters/minimal/package.json +4 -1
  6. package/data/Cli/starters/minimal/vite.config.ts +0 -3
  7. package/data/Cli/starters/skeleton/AGENTS.md +6 -0
  8. package/data/Cli/starters/skeleton/CLAUDE.md +6 -0
  9. package/data/Cli/starters/skeleton/tsconfig.src.json +1 -11
  10. package/data/Generator/libs/auth/wasp.sh-lib-auth-0.26.0.tgz +0 -0
  11. package/data/Generator/libs/sdk-core/node_modules/@wasp.sh/lib-auth/wasp.sh-lib-auth-0.26.0.tgz +0 -0
  12. package/data/Generator/libs/sdk-core/wasp.sh-lib-sdk-core-0.26.0.tgz +0 -0
  13. package/data/Generator/libs/vite-ssr/{wasp.sh-lib-vite-ssr-0.25.0.tgz → wasp.sh-lib-vite-ssr-0.26.0.tgz} +0 -0
  14. package/data/Generator/templates/Dockerfile +1 -0
  15. package/data/Generator/templates/sdk/wasp/api/index.ts +5 -86
  16. package/data/Generator/templates/sdk/wasp/auth/email/actions/login.ts +2 -2
  17. package/data/Generator/templates/sdk/wasp/auth/email/actions/passwordReset.ts +1 -1
  18. package/data/Generator/templates/sdk/wasp/auth/email/actions/signup.ts +7 -6
  19. package/data/Generator/templates/sdk/wasp/auth/email/actions/verifyEmail.ts +1 -1
  20. package/data/Generator/templates/sdk/wasp/auth/forms/Auth.tsx +12 -6
  21. package/data/Generator/templates/sdk/wasp/auth/forms/ForgotPassword.tsx +2 -1
  22. package/data/Generator/templates/sdk/wasp/auth/forms/Login.tsx +2 -1
  23. package/data/Generator/templates/sdk/wasp/auth/forms/ResetPassword.tsx +2 -1
  24. package/data/Generator/templates/sdk/wasp/auth/forms/Signup.tsx +5 -5
  25. package/data/Generator/templates/sdk/wasp/auth/forms/VerifyEmail.tsx +2 -1
  26. package/data/Generator/templates/sdk/wasp/auth/forms/internal/common/LoginSignupForm.tsx +34 -33
  27. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/DummyEmailSenderNotice.module.css +11 -0
  28. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/DummyEmailSenderNotice.tsx +17 -0
  29. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ForgotPasswordForm.tsx +9 -13
  30. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ResetPasswordForm.tsx +8 -9
  31. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/VerifyEmailForm.tsx +4 -8
  32. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/useEmail.ts +5 -5
  33. package/data/Generator/templates/sdk/wasp/auth/forms/internal/usernameAndPassword/useUsernameAndPassword.ts +6 -5
  34. package/data/Generator/templates/sdk/wasp/auth/forms/types.ts +0 -59
  35. package/data/Generator/templates/sdk/wasp/auth/helpers/_Provider.tsx +2 -2
  36. package/data/Generator/templates/sdk/wasp/auth/index.ts +1 -1
  37. package/data/Generator/templates/sdk/wasp/auth/logout.ts +1 -1
  38. package/data/Generator/templates/sdk/wasp/auth/providers/index.ts +4 -4
  39. package/data/Generator/templates/sdk/wasp/auth/providers/types.ts +20 -24
  40. package/data/Generator/templates/sdk/wasp/auth/useAuth.ts +5 -5
  41. package/data/Generator/templates/sdk/wasp/auth/user.ts +147 -14
  42. package/data/Generator/templates/sdk/wasp/auth/username/actions/login.ts +2 -2
  43. package/data/Generator/templates/sdk/wasp/auth/username/actions/signup.ts +6 -5
  44. package/data/Generator/templates/sdk/wasp/auth/validation.ts +1 -83
  45. package/data/Generator/templates/sdk/wasp/client/app/pages/OAuthCallback.tsx +8 -5
  46. package/data/Generator/templates/sdk/wasp/client/app/pages/createAuthRequiredPage.jsx +6 -4
  47. package/data/Generator/templates/sdk/wasp/client/app/router.tsx +2 -2
  48. package/data/Generator/templates/sdk/wasp/client/auth/ui.ts +2 -2
  49. package/data/Generator/templates/sdk/wasp/client/auth/username.ts +2 -2
  50. package/data/Generator/templates/sdk/wasp/client/config.ts +1 -6
  51. package/data/Generator/templates/sdk/wasp/client/crud/_crud.ts +129 -75
  52. package/data/Generator/templates/sdk/wasp/client/env/schema.ts +14 -7
  53. package/data/Generator/templates/sdk/wasp/client/env.ts +4 -3
  54. package/data/Generator/templates/sdk/wasp/client/index.ts +3 -12
  55. package/data/Generator/templates/sdk/wasp/client/operations/actions/core.ts +14 -10
  56. package/data/Generator/templates/sdk/wasp/client/operations/actions/index.ts +7 -4
  57. package/data/Generator/templates/sdk/wasp/client/operations/index.ts +5 -5
  58. package/data/Generator/templates/sdk/wasp/client/operations/internal/index.ts +1 -8
  59. package/data/Generator/templates/sdk/wasp/client/operations/queries/core.ts +13 -55
  60. package/data/Generator/templates/sdk/wasp/client/operations/queries/index.ts +7 -7
  61. package/data/Generator/templates/sdk/wasp/client/router/Link.tsx +8 -8
  62. package/data/Generator/templates/sdk/wasp/client/router/NavLink.tsx +8 -8
  63. package/data/Generator/templates/sdk/wasp/client/router/index.ts +15 -15
  64. package/data/Generator/templates/sdk/wasp/client/test/index.ts +2 -1
  65. package/data/Generator/templates/sdk/wasp/client/test/vitest/helpers.tsx +5 -36
  66. package/data/Generator/templates/sdk/wasp/client/vite/index.ts +2 -1
  67. package/data/Generator/templates/sdk/wasp/client/vite/plugins/virtualUserModules.ts +43 -0
  68. package/data/Generator/templates/sdk/wasp/client/vite/plugins/{virtualModules.ts → virtualWaspModules.ts} +4 -4
  69. package/data/Generator/templates/sdk/wasp/client/vite/plugins/wasp.ts +17 -14
  70. package/data/Generator/templates/sdk/wasp/client/vite/plugins/waspConfig.ts +60 -18
  71. package/data/Generator/templates/sdk/wasp/client/vite/virtual-files/files/client-entry.tsx +1 -1
  72. package/data/Generator/templates/sdk/wasp/client/vite/virtual-files/files/routes.tsx +1 -1
  73. package/data/Generator/templates/sdk/wasp/client/vite/virtual-files/files/ssr-entry.tsx +1 -1
  74. package/data/Generator/templates/sdk/wasp/client/webSocket/WebSocketProvider.tsx +3 -3
  75. package/data/Generator/templates/sdk/wasp/client/webSocket/index.ts +1 -1
  76. package/data/Generator/templates/sdk/wasp/core/serialization/index.ts +2 -47
  77. package/data/Generator/templates/sdk/wasp/core/serialization/prisma.ts +0 -1
  78. package/data/Generator/templates/sdk/wasp/entities/index.ts +6 -6
  79. package/data/Generator/templates/sdk/wasp/env/index.ts +1 -9
  80. package/data/Generator/templates/sdk/wasp/package.json +150 -104
  81. package/data/Generator/templates/sdk/wasp/server/_types/index.ts +8 -10
  82. package/data/Generator/templates/sdk/wasp/server/_types/taggedEntities.ts +4 -4
  83. package/data/Generator/templates/sdk/wasp/server/api/index.ts +5 -5
  84. package/data/Generator/templates/sdk/wasp/server/auth/email/index.ts +2 -12
  85. package/data/Generator/templates/sdk/wasp/server/auth/email/utils.ts +8 -30
  86. package/data/Generator/templates/sdk/wasp/server/auth/hooks.ts +5 -2
  87. package/data/Generator/templates/sdk/wasp/server/auth/index.ts +3 -3
  88. package/data/Generator/templates/sdk/wasp/{auth → server/auth}/jwt.ts +1 -1
  89. package/data/Generator/templates/sdk/wasp/{auth → server/auth}/lucia.ts +4 -4
  90. package/data/Generator/templates/sdk/wasp/server/auth/oauth/oneTimeCode.ts +1 -1
  91. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/discord.ts +1 -1
  92. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/github.ts +1 -1
  93. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/google.ts +1 -1
  94. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/keycloak.ts +1 -1
  95. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/microsoft.ts +1 -1
  96. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/slack.ts +1 -1
  97. package/data/Generator/templates/sdk/wasp/{auth → server/auth}/session.ts +17 -6
  98. package/data/Generator/templates/sdk/wasp/{auth → server/auth}/utils.ts +40 -183
  99. package/data/Generator/templates/sdk/wasp/server/config.ts +1 -1
  100. package/data/Generator/templates/sdk/wasp/{core → server/core}/auth.ts +3 -3
  101. package/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts +16 -63
  102. package/data/Generator/templates/sdk/wasp/server/dbClient.ts +15 -17
  103. package/data/Generator/templates/sdk/wasp/server/email/core/helpers.ts +3 -20
  104. package/data/Generator/templates/sdk/wasp/server/email/core/providers/dummy.ts +2 -2
  105. package/data/Generator/templates/sdk/wasp/server/email/core/providers/resend.ts +2 -1
  106. package/data/Generator/templates/sdk/wasp/server/email/core/providers/smtp.ts +2 -1
  107. package/data/Generator/templates/sdk/wasp/server/email/core/types.ts +2 -45
  108. package/data/Generator/templates/sdk/wasp/server/email/index.ts +1 -1
  109. package/data/Generator/templates/sdk/wasp/server/env.ts +20 -11
  110. package/data/Generator/templates/sdk/wasp/server/index.ts +3 -3
  111. package/data/Generator/templates/sdk/wasp/server/jobs/_job.ts +1 -1
  112. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/index.ts +1 -1
  113. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/pgBossJob.ts +4 -4
  114. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/types.ts +1 -1
  115. package/data/Generator/templates/sdk/wasp/server/middleware/index.ts +1 -1
  116. package/data/Generator/templates/sdk/wasp/server/operations/actions/index.ts +14 -8
  117. package/data/Generator/templates/sdk/wasp/server/operations/actions/types.ts +5 -5
  118. package/data/Generator/templates/sdk/wasp/server/operations/queries/index.ts +14 -8
  119. package/data/Generator/templates/sdk/wasp/server/operations/queries/types.ts +5 -5
  120. package/data/Generator/templates/sdk/wasp/server/operations/wrappers.ts +40 -14
  121. package/data/Generator/templates/sdk/wasp/server/types/index.ts +1 -11
  122. package/data/Generator/templates/sdk/wasp/server/utils.ts +5 -20
  123. package/data/Generator/templates/sdk/wasp/server/webSocket/index.ts +7 -7
  124. package/data/Generator/templates/sdk/wasp/tsconfig.json +20 -46
  125. package/data/Generator/templates/sdk/wasp/types/index.ts +8 -0
  126. package/data/Generator/templates/sdk/wasp/types/register.ts +21 -0
  127. package/data/Generator/templates/sdk/wasp/vite-env.d.ts +0 -9
  128. package/data/Generator/templates/sdk/wasp/wasp-ssr.d.ts +8 -0
  129. package/data/Generator/templates/sdk/wasp/wasp-user-virtual-modules.d.ts +20 -0
  130. package/data/Generator/templates/server/package.json +2 -1
  131. package/data/Generator/templates/server/rollup.config.js +2 -43
  132. package/data/Generator/templates/server/rollup.dbSeed.config.js +3 -0
  133. package/data/Generator/templates/server/src/app.js +2 -2
  134. package/data/Generator/templates/server/src/auth/providers/config/email.ts +5 -5
  135. package/data/Generator/templates/server/src/auth/providers/email/login.ts +4 -4
  136. package/data/Generator/templates/server/src/auth/providers/email/requestPasswordReset.ts +4 -4
  137. package/data/Generator/templates/server/src/auth/providers/email/resetPassword.ts +13 -5
  138. package/data/Generator/templates/server/src/auth/providers/email/signup.ts +29 -18
  139. package/data/Generator/templates/server/src/auth/providers/email/verifyEmail.ts +7 -2
  140. package/data/Generator/templates/server/src/auth/providers/oauth/cookies.ts +5 -1
  141. package/data/Generator/templates/server/src/auth/providers/oauth/handler.ts +1 -1
  142. package/data/Generator/templates/server/src/auth/providers/oauth/oneTimeCode.ts +2 -2
  143. package/data/Generator/templates/server/src/auth/providers/oauth/state.ts +55 -13
  144. package/data/Generator/templates/server/src/auth/providers/oauth/user.ts +6 -3
  145. package/data/Generator/templates/server/src/auth/providers/username/login.ts +4 -4
  146. package/data/Generator/templates/server/src/auth/providers/username/signup.ts +12 -4
  147. package/data/Generator/templates/server/src/createRollupBundle.js +47 -0
  148. package/data/Generator/templates/server/src/crud/_operations.ts +16 -16
  149. package/data/Generator/templates/server/src/plugins/virtualUserModules.js +40 -0
  150. package/data/Generator/templates/server/src/routes/apis/index.ts +3 -3
  151. package/data/Generator/templates/server/src/routes/auth/index.js +1 -1
  152. package/data/Generator/templates/server/src/routes/auth/logout.ts +2 -2
  153. package/data/Generator/templates/server/src/routes/crud/_crud.ts +1 -1
  154. package/data/Generator/templates/server/src/routes/index.js +18 -18
  155. package/data/Generator/templates/server/src/routes/operations/index.js +1 -1
  156. package/data/Generator/templates/server/src/webSocket/initialization.ts +1 -1
  157. package/data/Generator/templates/server/tsconfig.json +7 -13
  158. package/data/Generator/templates/types/app/sdk/register.ts +57 -0
  159. package/data/packages/deploy/dist/common/cliVersion.js +17 -0
  160. package/data/packages/deploy/dist/common/waspProject.js +1 -1
  161. package/data/packages/deploy/dist/common/zx.js +24 -6
  162. package/data/packages/deploy/dist/providers/fly/commands/createDb/createDb.js +13 -5
  163. package/data/packages/deploy/dist/providers/fly/flyCli.js +29 -17
  164. package/data/packages/deploy/dist/providers/fly/index.js +16 -8
  165. package/data/packages/deploy/dist/providers/railway/commands/setup/setup.js +19 -31
  166. package/data/packages/deploy/dist/providers/railway/index.js +11 -2
  167. package/data/packages/deploy/dist/providers/railway/jsonOutputSchemas.js +19 -34
  168. package/data/packages/deploy/dist/providers/railway/railwayCli.js +11 -20
  169. package/data/packages/deploy/dist/providers/railway/railwayEnvironment/cli.js +20 -0
  170. package/data/packages/deploy/dist/providers/railway/railwayProject/RailwayProject.js +4 -1
  171. package/data/packages/deploy/dist/providers/railway/railwayProject/cli.js +6 -14
  172. package/data/packages/deploy/dist/providers/railway/railwayService/database.js +88 -0
  173. package/data/packages/deploy/dist/providers/railway/railwayService/deployment.js +12 -25
  174. package/data/packages/deploy/dist/providers/railway/railwayService/nameGenerator.js +5 -4
  175. package/data/packages/deploy/dist/providers/railway/railwayService/serviceInstance.js +48 -0
  176. package/data/packages/deploy/dist/providers/railway/railwayService/url.js +9 -30
  177. package/data/packages/deploy/package-lock.json +2 -2
  178. package/data/packages/deploy/package.json +1 -1
  179. package/data/packages/prisma/package-lock.json +2 -2
  180. package/data/packages/prisma/package.json +1 -1
  181. package/data/packages/spec/dist/__tests__/spec/mapApp.unit.test.js +19 -15
  182. package/data/packages/spec/dist/__tests__/spec/tsAppSpec.test-d.js +6 -0
  183. package/data/packages/spec/dist/src/appSpec.d.ts +15 -2
  184. package/data/packages/spec/dist/src/appSpec.d.ts.map +1 -1
  185. package/data/packages/spec/dist/src/spec/mapper/app.d.ts +1 -0
  186. package/data/packages/spec/dist/src/spec/mapper/app.d.ts.map +1 -1
  187. package/data/packages/spec/dist/src/spec/mapper/app.js +8 -2
  188. package/data/packages/spec/dist/src/spec/mapper/context.js +4 -4
  189. package/data/packages/spec/dist/src/spec/mapper/specElements.js +9 -9
  190. package/data/packages/spec/dist/src/spec/publicApi/constructors.d.ts +11 -11
  191. package/data/packages/spec/dist/src/spec/publicApi/constructors.js +11 -11
  192. package/data/packages/spec/dist/src/spec/publicApi/register.d.ts +1 -1
  193. package/data/packages/spec/dist/src/spec/publicApi/waspSpec.d.ts +58 -38
  194. package/data/packages/spec/dist/src/spec/publicApi/waspSpec.d.ts.map +1 -1
  195. package/data/packages/spec/package-lock.json +2 -2
  196. package/data/packages/spec/package.json +1 -1
  197. package/data/packages/studio/package-lock.json +15 -23
  198. package/data/packages/studio/package.json +2 -2
  199. package/package.json +1 -1
  200. package/wasp-bin +0 -0
  201. package/data/Generator/libs/auth/wasp.sh-lib-auth-0.25.0.tgz +0 -0
  202. package/data/Generator/templates/sdk/wasp/api/events.ts +0 -11
  203. package/data/Generator/templates/sdk/wasp/auth/email/index.ts +0 -5
  204. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.module.css +0 -99
  205. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.tsx +0 -74
  206. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.module.css +0 -22
  207. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.tsx +0 -34
  208. package/data/Generator/templates/sdk/wasp/auth/forms/internal/auth-styles.css +0 -30
  209. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.module.css +0 -33
  210. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.tsx +0 -14
  211. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.module.css +0 -4
  212. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.tsx +0 -85
  213. package/data/Generator/templates/sdk/wasp/auth/forms/internal/util.ts +0 -16
  214. package/data/Generator/templates/sdk/wasp/auth/helpers/user.ts +0 -15
  215. package/data/Generator/templates/sdk/wasp/auth/responseSchemas.ts +0 -10
  216. package/data/Generator/templates/sdk/wasp/auth/types.ts +0 -2
  217. package/data/Generator/templates/sdk/wasp/auth/username/index.ts +0 -2
  218. package/data/Generator/templates/sdk/wasp/client/app/components/DefaultRootErrorBoundary.tsx +0 -16
  219. package/data/Generator/templates/sdk/wasp/client/app/components/FullPageWrapper.tsx +0 -21
  220. package/data/Generator/templates/sdk/wasp/client/app/components/Loader.module.css +0 -37
  221. package/data/Generator/templates/sdk/wasp/client/app/components/Loader.tsx +0 -12
  222. package/data/Generator/templates/sdk/wasp/client/app/components/Message.tsx +0 -86
  223. package/data/Generator/templates/sdk/wasp/client/crud/operationsHelpers.ts +0 -21
  224. package/data/Generator/templates/sdk/wasp/client/hooks.ts +0 -19
  225. package/data/Generator/templates/sdk/wasp/client/operations/hooks.ts +0 -347
  226. package/data/Generator/templates/sdk/wasp/client/operations/internal/resources.js +0 -85
  227. package/data/Generator/templates/sdk/wasp/client/operations/internal/updateHandlersMap.js +0 -37
  228. package/data/Generator/templates/sdk/wasp/client/operations/queryClient.ts +0 -34
  229. package/data/Generator/templates/sdk/wasp/client/operations/rpc.ts +0 -96
  230. package/data/Generator/templates/sdk/wasp/client/router/linkHelpers.ts +0 -48
  231. package/data/Generator/templates/sdk/wasp/client/router/types.ts +0 -98
  232. package/data/Generator/templates/sdk/wasp/client/vite/plugins/detectServerImports.ts +0 -50
  233. package/data/Generator/templates/sdk/wasp/client/vite/plugins/envFile.ts +0 -112
  234. package/data/Generator/templates/sdk/wasp/client/vite/plugins/typescriptCheck.ts +0 -36
  235. package/data/Generator/templates/sdk/wasp/client/vite/plugins/validateEnv.ts +0 -88
  236. package/data/Generator/templates/sdk/wasp/client/vite/virtual-files/resolver.ts +0 -35
  237. package/data/Generator/templates/sdk/wasp/core/serialization/custom-register.ts +0 -21
  238. package/data/Generator/templates/sdk/wasp/core/storage.ts +0 -73
  239. package/data/Generator/templates/sdk/wasp/env/validation.ts +0 -44
  240. package/data/Generator/templates/sdk/wasp/server/HttpError.ts +0 -30
  241. package/data/Generator/templates/sdk/wasp/server/auth/oauth/provider.ts +0 -20
  242. package/data/Generator/templates/sdk/wasp/server/auth/user.ts +0 -154
  243. package/data/Generator/templates/sdk/wasp/server/auth/username.ts +0 -1
  244. package/data/Generator/templates/sdk/wasp/server/jobs/core/job.ts +0 -28
  245. package/data/Generator/templates/sdk/wasp/server/middleware/globalMiddleware.ts +0 -8
  246. package/data/Generator/templates/sdk/wasp/universal/ansiColors.ts +0 -58
  247. package/data/Generator/templates/sdk/wasp/universal/predicates.ts +0 -3
  248. package/data/Generator/templates/sdk/wasp/universal/types.ts +0 -74
  249. package/data/Generator/templates/sdk/wasp/universal/url.ts +0 -9
  250. package/data/Generator/templates/sdk/wasp/universal/validators.ts +0 -21
  251. package/data/packages/ts-inspect/dist/exports.js +0 -82
  252. package/data/packages/ts-inspect/dist/index.js +0 -28
  253. package/data/packages/ts-inspect/package-lock.json +0 -4724
  254. package/data/packages/ts-inspect/package.json +0 -31
  255. /package/data/Generator/templates/sdk/wasp/{auth → server/auth}/password.ts +0 -0
@@ -1,8 +1,7 @@
1
- import { useLocation } from 'react-router'
2
1
  import { useAuthContext } from '@wasp.sh/lib-auth/browser'
2
+ import { useLocation } from 'react-router'
3
3
  import { verifyEmail } from '../../../email/actions/verifyEmail.js'
4
- import { Message } from '../Message'
5
- import { useEffectOnce } from '../../../../client/hooks.js'
4
+ import { Message, useEffectOnce, getAuthErrorMessage } from '@wasp.sh/lib-sdk-core/browser'
6
5
 
7
6
  // PRIVATE API
8
7
  export const VerifyEmailForm = () => {
@@ -24,11 +23,8 @@ export const VerifyEmailForm = () => {
24
23
  try {
25
24
  await verifyEmail({ token })
26
25
  setSuccessMessage('Your email has been verified. You can now log in.')
27
- } catch (error) {
28
- setErrorMessage({
29
- title: error.message,
30
- description: error.data?.data?.message,
31
- })
26
+ } catch (error: unknown) {
27
+ setErrorMessage(getAuthErrorMessage(error));
32
28
  } finally {
33
29
  setIsLoading(false)
34
30
  }
@@ -1,4 +1,4 @@
1
- import { signup } from '../../../email/actions/signup'
1
+ import { signup, type EmailSignupData } from '../../../email/actions/signup'
2
2
  import { login } from '../../../email/actions/login'
3
3
 
4
4
  // PRIVATE API
@@ -8,12 +8,12 @@ export function useEmail({
8
8
  onLoginSuccess,
9
9
  isLogin,
10
10
  }: {
11
- onError: (error: Error) => void
11
+ onError: (error: unknown) => void
12
12
  showEmailVerificationPending: () => void
13
13
  onLoginSuccess: () => void
14
14
  isLogin: boolean
15
15
  }) {
16
- async function handleSubmit(data) {
16
+ async function handleSubmit(data: EmailSignupData): Promise<void> {
17
17
  try {
18
18
  if (isLogin) {
19
19
  await login(data)
@@ -22,8 +22,8 @@ export function useEmail({
22
22
  await signup(data)
23
23
  showEmailVerificationPending()
24
24
  }
25
- } catch (err: unknown) {
26
- onError(err as Error)
25
+ } catch (error: unknown) {
26
+ onError(error);
27
27
  }
28
28
  }
29
29
 
@@ -1,4 +1,5 @@
1
- import { login, signup } from '../../../username'
1
+ import { login } from '../../../username/actions/login'
2
+ import { signup, type UsernameSignupData } from '../../../username/actions/signup'
2
3
 
3
4
  // PRIVATE API
4
5
  export function useUsernameAndPassword({
@@ -6,11 +7,11 @@ export function useUsernameAndPassword({
6
7
  onSuccess,
7
8
  isLogin,
8
9
  }: {
9
- onError: (error: Error) => void
10
+ onError: (error: unknown) => void
10
11
  onSuccess: () => void
11
12
  isLogin: boolean
12
13
  }) {
13
- async function handleSubmit(data) {
14
+ async function handleSubmit(data: UsernameSignupData): Promise<void> {
14
15
  try {
15
16
  if (!isLogin) {
16
17
  await signup(data)
@@ -18,8 +19,8 @@ export function useUsernameAndPassword({
18
19
  await login(data)
19
20
 
20
21
  onSuccess()
21
- } catch (err: unknown) {
22
- onError(err as Error)
22
+ } catch (error: unknown) {
23
+ onError(error);
23
24
  }
24
25
  }
25
26
 
@@ -1,6 +1,4 @@
1
1
  {{={= =}=}}
2
- import { UseFormReturn, RegisterOptions } from 'react-hook-form'
3
- import type { LoginSignupFormFields } from './internal/common/LoginSignupForm'
4
2
 
5
3
  // PRIVATE API
6
4
  export enum State {
@@ -12,60 +10,3 @@ export enum State {
12
10
  VerifyEmail = 'verify-email',
13
11
  {=/ isEmailAuthEnabled =}
14
12
  }
15
-
16
- // PUBLIC API
17
- export type CustomizationOptions = {
18
- logo?: string
19
- socialLayout?: 'horizontal' | 'vertical'
20
- appearance?: {
21
- // ATTENTION: Keep this list in sync with the one at `./internal/auth-styles.css`
22
- colors?: {
23
- waspYellow?: string,
24
- gray700?: string,
25
- gray600?: string,
26
- gray500?: string,
27
- gray400?: string,
28
- red?: string,
29
- darkRed?: string,
30
- green?: string,
31
-
32
- brand?: string,
33
- brandAccent?: string,
34
- errorBackground?: string,
35
- errorText?: string,
36
- successBackground?: string,
37
- successText?: string,
38
-
39
- submitButtonText?: string,
40
-
41
- formErrorText?: string,
42
- },
43
- fontSizes?: {
44
- sm?: string,
45
- },
46
- }
47
- }
48
-
49
- // PRIVATE API
50
- export type FormState = {
51
- isLoading: boolean
52
- }
53
-
54
- // PRIVATE API
55
- export type AdditionalSignupFieldRenderFn = (
56
- hookForm: UseFormReturn<LoginSignupFormFields>,
57
- formState: FormState
58
- ) => React.ReactNode
59
-
60
- // PRIVATE API
61
- export type AdditionalSignupField = {
62
- name: string
63
- label: string
64
- type: 'input' | 'textarea'
65
- validations?: RegisterOptions<LoginSignupFormFields>
66
- }
67
-
68
- // PRIVATE API
69
- export type AdditionalSignupFields =
70
- | (AdditionalSignupField | AdditionalSignupFieldRenderFn)[]
71
- | AdditionalSignupFieldRenderFn
@@ -1,8 +1,8 @@
1
1
  {{={= =}=}}
2
2
 
3
3
  import { config } from '../../client/index.js'
4
- import { SocialButton } from '../forms/internal/social/SocialButton'
5
- import * as SocialIcons from '../forms/internal/social/SocialIcons'
4
+ import { SocialButton } from '@wasp.sh/lib-sdk-core/browser'
5
+ import * as SocialIcons from '@wasp.sh/lib-sdk-core/browser'
6
6
 
7
7
  // PUBLIC API
8
8
  export const signInUrl: string = `${config.apiUrl}{= signInPath =}`
@@ -6,4 +6,4 @@ export {
6
6
  } from './user.js'
7
7
 
8
8
  // PUBLIC API
9
- export { type AuthUser } from '../server/auth/user.js'
9
+ export type { AuthUser } from './user.js'
@@ -1,5 +1,5 @@
1
1
  import { api, removeLocalUserData } from '../api/index.js'
2
- import { invalidateAndRemoveQueries } from '../client/operations/internal/resources.js'
2
+ import { invalidateAndRemoveQueries } from '@wasp.sh/lib-sdk-core/browser'
3
3
 
4
4
  // PUBLIC API
5
5
  export default async function logout(): Promise<void> {
@@ -1,9 +1,9 @@
1
1
  {{={= =}=}}
2
2
 
3
- {=# emailUserSignupFields.isDefined =}
3
+ {=# isEmailUserSignupFieldsDefined =}
4
4
  export type { UserEmailSignupFields } from './types';
5
- {=/ emailUserSignupFields.isDefined =}
5
+ {=/ isEmailUserSignupFieldsDefined =}
6
6
 
7
- {=# usernameAndPasswordUserSignupFields.isDefined =}
7
+ {=# isUsernameAndPasswordUserSignupFieldsDefined =}
8
8
  export type { UserUsernameAndPasswordSignupFields } from './types';
9
- {=/ usernameAndPasswordUserSignupFields.isDefined =}
9
+ {=/ isUsernameAndPasswordUserSignupFieldsDefined =}
@@ -1,8 +1,15 @@
1
1
  {{={= =}=}}
2
- import type { Router, Request } from 'express'
2
+ import { type ProviderConfig, type RequestWithWasp } from '@wasp.sh/lib-sdk-core/node'
3
+ export { type ProviderConfig, type RequestWithWasp } from '@wasp.sh/lib-sdk-core/node'
4
+
3
5
  import type { Prisma } from '@prisma/client'
4
- import type { Expand, Exact } from '../../universal/types.js'
5
- import type { ProviderName } from '../utils'
6
+ import type { Exact, Expand, ProviderName } from '@wasp.sh/lib-sdk-core'
7
+ {=# isEmailUserSignupFieldsDefined =}
8
+ import type { FromRegister } from '../../types/register'
9
+ {=/ isEmailUserSignupFieldsDefined =}
10
+ {=# isUsernameAndPasswordUserSignupFieldsDefined =}
11
+ import type { FromRegister } from '../../types/register'
12
+ {=/ isUsernameAndPasswordUserSignupFieldsDefined =}
6
13
 
7
14
  // PUBLIC API
8
15
  export function defineUserSignupFields<T extends UserSignupFields>(
@@ -10,18 +17,20 @@ export function defineUserSignupFields<T extends UserSignupFields>(
10
17
  ): T {
11
18
  return fields
12
19
  }
20
+ {=# isEmailUserSignupFieldsDefined =}
13
21
 
14
- {=# emailUserSignupFields.isDefined =}
15
- {=& emailUserSignupFields.importStatement =}
16
22
  // PUBLIC API
17
- export type UserEmailSignupFields = InferUserSignupFields<typeof {= emailUserSignupFields.importIdentifier =}>;
18
- {=/ emailUserSignupFields.isDefined =}
23
+ export type UserEmailSignupFields = InferUserSignupFields<RegisteredEmailSignupFields>;
24
+
25
+ type RegisteredEmailSignupFields = FromRegister<"emailUserSignupFields", {}>;
26
+ {=/ isEmailUserSignupFieldsDefined =}
27
+ {=# isUsernameAndPasswordUserSignupFieldsDefined =}
19
28
 
20
- {=# usernameAndPasswordUserSignupFields.isDefined =}
21
- {=& usernameAndPasswordUserSignupFields.importStatement =}
22
29
  // PUBLIC API
23
- export type UserUsernameAndPasswordSignupFields = InferUserSignupFields<typeof {= usernameAndPasswordUserSignupFields.importIdentifier =}>;
24
- {=/ usernameAndPasswordUserSignupFields.isDefined =}
30
+ export type UserUsernameAndPasswordSignupFields = InferUserSignupFields<RegisteredUsernameAndPasswordSignupFields>;
31
+
32
+ type RegisteredUsernameAndPasswordSignupFields = FromRegister<"usernameAndPasswordUserSignupFields", {}>
33
+ {=/ isUsernameAndPasswordUserSignupFieldsDefined =}
25
34
 
26
35
  /**
27
36
  * Extracts the result types from a UserSignupFields object.
@@ -38,19 +47,6 @@ type InferUserSignupFields<T extends UserSignupFields> = {
38
47
 
39
48
  type UserEntityCreateInput = Prisma.{= userEntityUpper =}CreateInput
40
49
 
41
- // PRIVATE API
42
- export type ProviderConfig = {
43
- // Unique provider identifier, used as part of URL paths
44
- id: ProviderName;
45
- displayName: string;
46
- // Every provider must have a setupRouter method which returns the Express router.
47
- // In this function we are flexibile to do what ever is necessary to make the provider work.
48
- createRouter(provider: ProviderConfig): Router;
49
- };
50
-
51
- // PRIVATE API
52
- export type RequestWithWasp = Request & { wasp?: { [key: string]: any } }
53
-
54
50
  // PRIVATE API
55
51
  export type PossibleUserFields = Expand<Partial<UserEntityCreateInput>>
56
52
 
@@ -1,12 +1,12 @@
1
1
  {{={= =}=}}
2
2
  import { deserialize } from '../core/serialization/index.js'
3
- import { useQuery, buildAndRegisterQuery } from '../client/operations/index.js'
4
- import type { QueryFunction, Query } from '../client/operations/rpc.js'
3
+ import { buildAndRegisterQuery, useQuery } from '@wasp.sh/lib-sdk-core/browser'
4
+ import type { QueryFunction, Query } from '@wasp.sh/lib-sdk-core'
5
5
  import { api, handleApiError } from '../api/index.js'
6
6
  import { HttpMethod } from '../client/index.js'
7
- import type { AuthUser, AuthUserData } from '../server/auth/user.js'
8
- import { makeAuthUserIfPossible } from '../auth/user.js'
9
- import { UseQueryResult } from '@tanstack/react-query'
7
+ import type { AuthUser, AuthUserData } from './user.js'
8
+ import { makeAuthUserIfPossible } from './user.js'
9
+ import type { UseQueryResult } from '@tanstack/react-query'
10
10
 
11
11
  // PUBLIC API
12
12
  export const getMe: Query<void, AuthUser | null> = createUserGetter()
@@ -1,15 +1,16 @@
1
- import { type ProviderName } from '../server/_types/index.js'
1
+ {{={= =}=}}
2
2
  import type {
3
- AuthUserData,
4
- AuthUser,
5
- UserEntityWithAuth,
6
- } from '../server/auth/user.js'
7
- import { isNotNull } from '../universal/predicates.js'
8
-
9
- /**
10
- * We split the user.ts code into two files to avoid some server-only
11
- * code (Oslo's hashing functions) being imported on the client.
12
- */
3
+ {= userEntityName =},
4
+ {= authEntityName =},
5
+ {= authIdentityEntityName =},
6
+ } from '../entities/index.js'
7
+ import {
8
+ type PossibleProviderData,
9
+ type ProviderName,
10
+ getProviderData,
11
+ isNotNull,
12
+ type Expand,
13
+ } from '@wasp.sh/lib-sdk-core'
13
14
 
14
15
  // PUBLIC API
15
16
  export function getEmail(user: UserEntityWithAuth): string | null {
@@ -27,11 +28,81 @@ export function getFirstProviderUserId(user?: UserEntityWithAuth): string | null
27
28
  return null;
28
29
  }
29
30
 
30
- return user.auth.identities[0].providerUserId ?? null;
31
+ return user.auth.identities[0]?.providerUserId ?? null;
32
+ }
33
+
34
+ // PUBLIC API
35
+ export type AuthUser = AuthUserData & {
36
+ getFirstProviderUserId: () => string | null,
31
37
  }
32
38
 
33
39
  // PRIVATE API (used in SDK and server)
34
- export type { AuthUserData, AuthUser } from '../server/auth/user.js'
40
+ /*
41
+ * We write this type out instead of using `ReturnType<typeof createAuthUserData>`
42
+ * because `Expand` makes editors show each identity's fields on hover. The
43
+ * inferred type would show `UserFacingProviderData<"email">` instead.
44
+ */
45
+ export type AuthUserData = Omit<CompleteUserEntityWithAuth, '{= authFieldOnUserEntityName =}'> & {
46
+ identities: {
47
+ {=# enabledProviders.isEmailAuthEnabled =}
48
+ email: Expand<UserFacingProviderData<'email'>> | null
49
+ {=/ enabledProviders.isEmailAuthEnabled =}
50
+ {=# enabledProviders.isUsernameAndPasswordAuthEnabled =}
51
+ username: Expand<UserFacingProviderData<'username'>> | null
52
+ {=/ enabledProviders.isUsernameAndPasswordAuthEnabled =}
53
+ {=# enabledProviders.isSlackAuthEnabled =}
54
+ slack: Expand<UserFacingProviderData<'slack'>> | null
55
+ {=/ enabledProviders.isSlackAuthEnabled =}
56
+ {=# enabledProviders.isDiscordAuthEnabled =}
57
+ discord: Expand<UserFacingProviderData<'discord'>> | null
58
+ {=/ enabledProviders.isDiscordAuthEnabled =}
59
+ {=# enabledProviders.isGoogleAuthEnabled =}
60
+ google: Expand<UserFacingProviderData<'google'>> | null
61
+ {=/ enabledProviders.isGoogleAuthEnabled =}
62
+ {=# enabledProviders.isKeycloakAuthEnabled =}
63
+ keycloak: Expand<UserFacingProviderData<'keycloak'>> | null
64
+ {=/ enabledProviders.isKeycloakAuthEnabled =}
65
+ {=# enabledProviders.isGitHubAuthEnabled =}
66
+ github: Expand<UserFacingProviderData<'github'>> | null
67
+ {=/ enabledProviders.isGitHubAuthEnabled =}
68
+ {=# enabledProviders.isMicrosoftAuthEnabled =}
69
+ microsoft: Expand<UserFacingProviderData<'microsoft'>> | null
70
+ {=/ enabledProviders.isMicrosoftAuthEnabled =}
71
+ },
72
+ }
73
+
74
+ type UserFacingProviderData<PN extends ProviderName> = {
75
+ id: string
76
+ } & Omit<PossibleProviderData[PN], 'hashedPassword'>
77
+
78
+ // PRIVATE API
79
+ export type CompleteUserEntityWithAuth =
80
+ MakeUserEntityWithAuth<CompleteAuthEntityWithIdentities>
81
+
82
+ // PRIVATE API
83
+ export type CompleteAuthEntityWithIdentities =
84
+ MakeAuthEntityWithIdentities<{= authIdentityEntityName =}>
85
+
86
+ // PRIVATE API
87
+ /**
88
+ * User entity with all of the auth related data that's needed for the user facing
89
+ * helper functions like `getUsername` and `getEmail`.
90
+ */
91
+ export type UserEntityWithAuth = MakeUserEntityWithAuth<
92
+ MakeAuthEntityWithIdentities<
93
+ // It's constructed like the Complete* types, but only with the fields needed
94
+ // for the user facing functions.
95
+ Pick<{= authIdentityEntityName =}, 'providerName' | 'providerUserId'>
96
+ >
97
+ >
98
+
99
+ type MakeUserEntityWithAuth<AuthType> = {= userEntityName =} & {
100
+ {= authFieldOnUserEntityName =}: AuthType | null
101
+ }
102
+
103
+ type MakeAuthEntityWithIdentities<IdentityType> = {= authEntityName =} & {
104
+ {= identitiesFieldOnAuthEntityName =}: IdentityType[]
105
+ }
35
106
 
36
107
  // PRIVATE API (used in SDK and server)
37
108
  export function makeAuthUserIfPossible(user: null): null
@@ -48,11 +119,73 @@ function makeAuthUser(data: AuthUserData): AuthUser {
48
119
  ...data,
49
120
  getFirstProviderUserId: () => {
50
121
  const identities = Object.values(data.identities).filter(isNotNull);
51
- return identities.length > 0 ? identities[0].id : null;
122
+ return identities[0]?.id ?? null;
52
123
  },
53
124
  };
54
125
  }
55
126
 
127
+ // PRIVATE API
128
+ export function createAuthUserData(user: CompleteUserEntityWithAuth): AuthUserData {
129
+ const { {= authFieldOnUserEntityName =}, ...rest } = user
130
+ if (!{= authFieldOnUserEntityName =}) {
131
+ throw new Error(`🐝 Error: trying to create a user without auth data.
132
+ This should never happen, but it did which means there is a bug in the code.`)
133
+ }
134
+ const identities = {
135
+ {=# enabledProviders.isEmailAuthEnabled =}
136
+ email: getProviderInfo<'email'>({= authFieldOnUserEntityName =}, 'email'),
137
+ {=/ enabledProviders.isEmailAuthEnabled =}
138
+ {=# enabledProviders.isUsernameAndPasswordAuthEnabled =}
139
+ username: getProviderInfo<'username'>({= authFieldOnUserEntityName =}, 'username'),
140
+ {=/ enabledProviders.isUsernameAndPasswordAuthEnabled =}
141
+ {=# enabledProviders.isSlackAuthEnabled =}
142
+ slack: getProviderInfo<'slack'>({= authFieldOnUserEntityName =}, 'slack'),
143
+ {=/ enabledProviders.isSlackAuthEnabled =}
144
+ {=# enabledProviders.isDiscordAuthEnabled =}
145
+ discord: getProviderInfo<'discord'>({= authFieldOnUserEntityName =}, 'discord'),
146
+ {=/ enabledProviders.isDiscordAuthEnabled =}
147
+ {=# enabledProviders.isGoogleAuthEnabled =}
148
+ google: getProviderInfo<'google'>({= authFieldOnUserEntityName =}, 'google'),
149
+ {=/ enabledProviders.isGoogleAuthEnabled =}
150
+ {=# enabledProviders.isKeycloakAuthEnabled =}
151
+ keycloak: getProviderInfo<'keycloak'>({= authFieldOnUserEntityName =}, 'keycloak'),
152
+ {=/ enabledProviders.isKeycloakAuthEnabled =}
153
+ {=# enabledProviders.isGitHubAuthEnabled =}
154
+ github: getProviderInfo<'github'>({= authFieldOnUserEntityName =}, 'github'),
155
+ {=/ enabledProviders.isGitHubAuthEnabled =}
156
+ {=# enabledProviders.isMicrosoftAuthEnabled =}
157
+ microsoft: getProviderInfo<'microsoft'>({= authFieldOnUserEntityName =}, 'microsoft'),
158
+ {=/ enabledProviders.isMicrosoftAuthEnabled =}
159
+ }
160
+ return {
161
+ ...rest,
162
+ identities,
163
+ }
164
+ }
165
+
166
+ function getProviderInfo<PN extends ProviderName>(
167
+ auth: CompleteAuthEntityWithIdentities,
168
+ providerName: PN
169
+ ):
170
+ | UserFacingProviderData<PN>
171
+ | null {
172
+ const identity = getIdentity(auth, providerName)
173
+ if (!identity) {
174
+ return null
175
+ }
176
+ return {
177
+ ...getProviderData<PN>(identity.providerData),
178
+ id: identity.providerUserId,
179
+ }
180
+ }
181
+
182
+ function getIdentity(
183
+ auth: CompleteAuthEntityWithIdentities,
184
+ providerName: ProviderName
185
+ ): {= authIdentityEntityName =} | null {
186
+ return auth.{= identitiesFieldOnAuthEntityName =}.find((i) => i.providerName === providerName) ?? null
187
+ }
188
+
56
189
  function findUserIdentity(user: UserEntityWithAuth, providerName: ProviderName): NonNullable<UserEntityWithAuth['auth']>['identities'][number] | null {
57
190
  if (!user.auth) {
58
191
  return null;
@@ -1,7 +1,7 @@
1
1
  {{={= =}=}}
2
2
  import { api, handleApiError } from '../../../api/index.js'
3
- import { initSession } from '../../helpers/user'
4
- import { SessionResponseSchema } from '../../responseSchemas'
3
+ import { initSession } from '@wasp.sh/lib-sdk-core/browser'
4
+ import { SessionResponseSchema } from '@wasp.sh/lib-sdk-core'
5
5
 
6
6
  export async function login(data: { username: string, password: string }): Promise<void> {
7
7
  try {
@@ -1,13 +1,14 @@
1
1
  {{={= =}=}}
2
2
  import { api, handleApiError } from '../../../api/index.js'
3
- {=# usernameAndPasswordUserSignupFields.isDefined =}
4
- import { type UserUsernameAndPasswordSignupFields } from '../../providers'
5
- {=/ usernameAndPasswordUserSignupFields.isDefined =}
3
+ {=# isUsernameAndPasswordUserSignupFieldsDefined =}
4
+ import type { UserUsernameAndPasswordSignupFields } from '../../providers'
5
+ {=/ isUsernameAndPasswordUserSignupFieldsDefined =}
6
6
 
7
- type UsernameSignupData = {
7
+ // PRIVATE API
8
+ export type UsernameSignupData = {
8
9
  username: string
9
10
  password: string
10
- }{=# usernameAndPasswordUserSignupFields.isDefined =} & UserUsernameAndPasswordSignupFields{=/ usernameAndPasswordUserSignupFields.isDefined =}
11
+ }{=# isUsernameAndPasswordUserSignupFieldsDefined =} & UserUsernameAndPasswordSignupFields{=/ isUsernameAndPasswordUserSignupFieldsDefined =}
11
12
 
12
13
  // PUBLIC API
13
14
  export async function signup(data: UsernameSignupData): Promise<void> {
@@ -1,83 +1 @@
1
- import { HttpError } from '../server/index.js';
2
-
3
- export const PASSWORD_FIELD = 'password';
4
- const USERNAME_FIELD = 'username';
5
- const EMAIL_FIELD = 'email';
6
- const TOKEN_FIELD = 'token';
7
-
8
- // PUBLIC API
9
- export function ensureValidEmail(args: object): void {
10
- validate(args, [
11
- { validates: EMAIL_FIELD, message: 'email must be present', validator: email => !!email },
12
- { validates: EMAIL_FIELD, message: 'email must be a valid email', validator: email => isValidEmail(email) },
13
- ]);
14
- }
15
-
16
- // PUBLIC API
17
- export function ensureValidUsername(args: object): void {
18
- validate(args, [
19
- { validates: USERNAME_FIELD, message: 'username must be present', validator: username => !!username }
20
- ]);
21
- }
22
-
23
- // PUBLIC API
24
- export function ensurePasswordIsPresent(args: object): void {
25
- validate(args, [
26
- { validates: PASSWORD_FIELD, message: 'password must be present', validator: password => !!password },
27
- ]);
28
- }
29
-
30
- // PUBLIC API
31
- export function ensureValidPassword(args: object): void {
32
- validate(args, [
33
- { validates: PASSWORD_FIELD, message: 'password must be at least 8 characters', validator: password => isMinLength(password, 8) },
34
- { validates: PASSWORD_FIELD, message: 'password must contain a number', validator: password => containsNumber(password) },
35
- ]);
36
- }
37
-
38
- // PUBLIC API
39
- export function ensureTokenIsPresent(args: object): void {
40
- validate(args, [
41
- { validates: TOKEN_FIELD, message: 'token must be present', validator: token => !!token },
42
- ]);
43
- }
44
-
45
- // PRIVATE API
46
- export function throwValidationError(message: string): void {
47
- throw new HttpError(422, 'Validation failed', { message })
48
- }
49
-
50
- function validate(args: object, validators: { validates: string, message: string, validator: (value: unknown) => boolean }[]): void {
51
- for (const { validates, message, validator } of validators) {
52
- if (!validator(args[validates])) {
53
- throwValidationError(message);
54
- }
55
- }
56
- }
57
-
58
- // NOTE(miho): it would be good to replace our custom validations with e.g. Zod
59
-
60
- const validEmailRegex = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/
61
- function isValidEmail(input: unknown): boolean {
62
- if (typeof input !== 'string') {
63
- return false
64
- }
65
-
66
- return input.match(validEmailRegex) !== null
67
- }
68
-
69
- function isMinLength(input: unknown, minLength: number): boolean {
70
- if (typeof input !== 'string') {
71
- return false
72
- }
73
-
74
- return input.length >= minLength
75
- }
76
-
77
- function containsNumber(input: unknown): boolean {
78
- if (typeof input !== 'string') {
79
- return false
80
- }
81
-
82
- return /\d/.test(input)
83
- }
1
+ export { ensurePasswordIsPresent, ensureTokenIsPresent, ensureValidEmail, ensureValidPassword, ensureValidUsername, PASSWORD_FIELD, throwValidationError } from '@wasp.sh/lib-sdk-core'
@@ -3,10 +3,13 @@ import { useState } from "react";
3
3
  import { Navigate, useLocation } from 'react-router'
4
4
  import { useAuth } from "../../auth";
5
5
  import { api } from "../../../api";
6
- import { initSession } from "../../../auth/helpers/user";
7
- import { useEffectOnce } from "../../hooks";
8
- import { MessageLoading, MessageError } from "../components/Message";
9
- import { FullPageWrapper } from "../components/FullPageWrapper";
6
+ import {
7
+ FullPageWrapper,
8
+ initSession,
9
+ MessageError,
10
+ MessageLoading,
11
+ useEffectOnce,
12
+ } from "@wasp.sh/lib-sdk-core/browser";
10
13
 
11
14
  const oAuthCallbackWrapperClassName = "wasp-oauth-callback-wrapper";
12
15
 
@@ -14,7 +17,7 @@ export function OAuthCallbackPage() {
14
17
  const { error, user } = useOAuthCallbackHandler();
15
18
 
16
19
  if (user !== undefined && user !== null) {
17
- return <Navigate to="{= onAuthSucceededRedirectTo =}" replace />;
20
+ return <Navigate to={{=& onAuthSucceededRedirectTo =}} replace />;
18
21
  }
19
22
 
20
23
 
@@ -4,9 +4,11 @@ import * as React from 'react'
4
4
  import { Navigate } from 'react-router'
5
5
  import { useAuth } from '../../auth'
6
6
 
7
- import { Loader } from '../components/Loader'
8
- import { MessageError } from '../components/Message'
9
- import { FullPageWrapper } from '../components/FullPageWrapper'
7
+ import {
8
+ FullPageWrapper,
9
+ Loader,
10
+ MessageError,
11
+ } from '@wasp.sh/lib-sdk-core/browser'
10
12
 
11
13
  export const createAuthRequiredPage = (Page) => {
12
14
  return (props) => {
@@ -17,7 +19,7 @@ export const createAuthRequiredPage = (Page) => {
17
19
  if (user) {
18
20
  return <Page {...props} user={user} />
19
21
  } else {
20
- return <Navigate to="{= onAuthFailedRedirectTo =}" replace />
22
+ return <Navigate to={{=& onAuthFailedRedirectTo =}} replace />
21
23
  }
22
24
  case 'loading':
23
25
  return (
@@ -6,7 +6,7 @@ import type { RouteObject } from 'react-router'
6
6
  import { OAuthCallbackPage } from "./pages/OAuthCallback"
7
7
  {=/ isExternalAuthEnabled =}
8
8
 
9
- import { DefaultRootErrorBoundary } from './components/DefaultRootErrorBoundary'
9
+ import { DefaultRootErrorBoundary } from '@wasp.sh/lib-sdk-core/browser'
10
10
 
11
11
  import { routes } from '../router/index'
12
12
 
@@ -19,7 +19,7 @@ export function getRouteObjects({
19
19
  routesMapping: RouteMapping,
20
20
  rootElement: ReactNode,
21
21
  }): RouteObject[] {
22
- const waspDefinedRoutes = [
22
+ const waspDefinedRoutes: RouteObject[] = [
23
23
  {=# isExternalAuthEnabled =}
24
24
  {
25
25
  path: "{= oAuthCallbackPath =}",