@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.
- package/data/Cli/starters/README.md +2 -0
- package/data/Cli/starters/basic/README.md +3 -3
- package/data/Cli/starters/basic/src/tags/components/CreateTagForm.tsx +2 -3
- package/data/Cli/starters/basic/vite.config.ts +0 -3
- package/data/Cli/starters/minimal/package.json +4 -1
- package/data/Cli/starters/minimal/vite.config.ts +0 -3
- package/data/Cli/starters/skeleton/AGENTS.md +6 -0
- package/data/Cli/starters/skeleton/CLAUDE.md +6 -0
- package/data/Cli/starters/skeleton/tsconfig.src.json +1 -11
- package/data/Generator/libs/auth/wasp.sh-lib-auth-0.26.0.tgz +0 -0
- package/data/Generator/libs/sdk-core/node_modules/@wasp.sh/lib-auth/wasp.sh-lib-auth-0.26.0.tgz +0 -0
- package/data/Generator/libs/sdk-core/wasp.sh-lib-sdk-core-0.26.0.tgz +0 -0
- 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
- package/data/Generator/templates/Dockerfile +1 -0
- package/data/Generator/templates/sdk/wasp/api/index.ts +5 -86
- package/data/Generator/templates/sdk/wasp/auth/email/actions/login.ts +2 -2
- package/data/Generator/templates/sdk/wasp/auth/email/actions/passwordReset.ts +1 -1
- package/data/Generator/templates/sdk/wasp/auth/email/actions/signup.ts +7 -6
- package/data/Generator/templates/sdk/wasp/auth/email/actions/verifyEmail.ts +1 -1
- package/data/Generator/templates/sdk/wasp/auth/forms/Auth.tsx +12 -6
- package/data/Generator/templates/sdk/wasp/auth/forms/ForgotPassword.tsx +2 -1
- package/data/Generator/templates/sdk/wasp/auth/forms/Login.tsx +2 -1
- package/data/Generator/templates/sdk/wasp/auth/forms/ResetPassword.tsx +2 -1
- package/data/Generator/templates/sdk/wasp/auth/forms/Signup.tsx +5 -5
- package/data/Generator/templates/sdk/wasp/auth/forms/VerifyEmail.tsx +2 -1
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/common/LoginSignupForm.tsx +34 -33
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/DummyEmailSenderNotice.module.css +11 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/DummyEmailSenderNotice.tsx +17 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ForgotPasswordForm.tsx +9 -13
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ResetPasswordForm.tsx +8 -9
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/VerifyEmailForm.tsx +4 -8
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/useEmail.ts +5 -5
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/usernameAndPassword/useUsernameAndPassword.ts +6 -5
- package/data/Generator/templates/sdk/wasp/auth/forms/types.ts +0 -59
- package/data/Generator/templates/sdk/wasp/auth/helpers/_Provider.tsx +2 -2
- package/data/Generator/templates/sdk/wasp/auth/index.ts +1 -1
- package/data/Generator/templates/sdk/wasp/auth/logout.ts +1 -1
- package/data/Generator/templates/sdk/wasp/auth/providers/index.ts +4 -4
- package/data/Generator/templates/sdk/wasp/auth/providers/types.ts +20 -24
- package/data/Generator/templates/sdk/wasp/auth/useAuth.ts +5 -5
- package/data/Generator/templates/sdk/wasp/auth/user.ts +147 -14
- package/data/Generator/templates/sdk/wasp/auth/username/actions/login.ts +2 -2
- package/data/Generator/templates/sdk/wasp/auth/username/actions/signup.ts +6 -5
- package/data/Generator/templates/sdk/wasp/auth/validation.ts +1 -83
- package/data/Generator/templates/sdk/wasp/client/app/pages/OAuthCallback.tsx +8 -5
- package/data/Generator/templates/sdk/wasp/client/app/pages/createAuthRequiredPage.jsx +6 -4
- package/data/Generator/templates/sdk/wasp/client/app/router.tsx +2 -2
- package/data/Generator/templates/sdk/wasp/client/auth/ui.ts +2 -2
- package/data/Generator/templates/sdk/wasp/client/auth/username.ts +2 -2
- package/data/Generator/templates/sdk/wasp/client/config.ts +1 -6
- package/data/Generator/templates/sdk/wasp/client/crud/_crud.ts +129 -75
- package/data/Generator/templates/sdk/wasp/client/env/schema.ts +14 -7
- package/data/Generator/templates/sdk/wasp/client/env.ts +4 -3
- package/data/Generator/templates/sdk/wasp/client/index.ts +3 -12
- package/data/Generator/templates/sdk/wasp/client/operations/actions/core.ts +14 -10
- package/data/Generator/templates/sdk/wasp/client/operations/actions/index.ts +7 -4
- package/data/Generator/templates/sdk/wasp/client/operations/index.ts +5 -5
- package/data/Generator/templates/sdk/wasp/client/operations/internal/index.ts +1 -8
- package/data/Generator/templates/sdk/wasp/client/operations/queries/core.ts +13 -55
- package/data/Generator/templates/sdk/wasp/client/operations/queries/index.ts +7 -7
- package/data/Generator/templates/sdk/wasp/client/router/Link.tsx +8 -8
- package/data/Generator/templates/sdk/wasp/client/router/NavLink.tsx +8 -8
- package/data/Generator/templates/sdk/wasp/client/router/index.ts +15 -15
- package/data/Generator/templates/sdk/wasp/client/test/index.ts +2 -1
- package/data/Generator/templates/sdk/wasp/client/test/vitest/helpers.tsx +5 -36
- package/data/Generator/templates/sdk/wasp/client/vite/index.ts +2 -1
- package/data/Generator/templates/sdk/wasp/client/vite/plugins/virtualUserModules.ts +43 -0
- package/data/Generator/templates/sdk/wasp/client/vite/plugins/{virtualModules.ts → virtualWaspModules.ts} +4 -4
- package/data/Generator/templates/sdk/wasp/client/vite/plugins/wasp.ts +17 -14
- package/data/Generator/templates/sdk/wasp/client/vite/plugins/waspConfig.ts +60 -18
- package/data/Generator/templates/sdk/wasp/client/vite/virtual-files/files/client-entry.tsx +1 -1
- package/data/Generator/templates/sdk/wasp/client/vite/virtual-files/files/routes.tsx +1 -1
- package/data/Generator/templates/sdk/wasp/client/vite/virtual-files/files/ssr-entry.tsx +1 -1
- package/data/Generator/templates/sdk/wasp/client/webSocket/WebSocketProvider.tsx +3 -3
- package/data/Generator/templates/sdk/wasp/client/webSocket/index.ts +1 -1
- package/data/Generator/templates/sdk/wasp/core/serialization/index.ts +2 -47
- package/data/Generator/templates/sdk/wasp/core/serialization/prisma.ts +0 -1
- package/data/Generator/templates/sdk/wasp/entities/index.ts +6 -6
- package/data/Generator/templates/sdk/wasp/env/index.ts +1 -9
- package/data/Generator/templates/sdk/wasp/package.json +150 -104
- package/data/Generator/templates/sdk/wasp/server/_types/index.ts +8 -10
- package/data/Generator/templates/sdk/wasp/server/_types/taggedEntities.ts +4 -4
- package/data/Generator/templates/sdk/wasp/server/api/index.ts +5 -5
- package/data/Generator/templates/sdk/wasp/server/auth/email/index.ts +2 -12
- package/data/Generator/templates/sdk/wasp/server/auth/email/utils.ts +8 -30
- package/data/Generator/templates/sdk/wasp/server/auth/hooks.ts +5 -2
- package/data/Generator/templates/sdk/wasp/server/auth/index.ts +3 -3
- package/data/Generator/templates/sdk/wasp/{auth → server/auth}/jwt.ts +1 -1
- package/data/Generator/templates/sdk/wasp/{auth → server/auth}/lucia.ts +4 -4
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/oneTimeCode.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/discord.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/github.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/google.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/keycloak.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/microsoft.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/slack.ts +1 -1
- package/data/Generator/templates/sdk/wasp/{auth → server/auth}/session.ts +17 -6
- package/data/Generator/templates/sdk/wasp/{auth → server/auth}/utils.ts +40 -183
- package/data/Generator/templates/sdk/wasp/server/config.ts +1 -1
- package/data/Generator/templates/sdk/wasp/{core → server/core}/auth.ts +3 -3
- package/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts +16 -63
- package/data/Generator/templates/sdk/wasp/server/dbClient.ts +15 -17
- package/data/Generator/templates/sdk/wasp/server/email/core/helpers.ts +3 -20
- package/data/Generator/templates/sdk/wasp/server/email/core/providers/dummy.ts +2 -2
- package/data/Generator/templates/sdk/wasp/server/email/core/providers/resend.ts +2 -1
- package/data/Generator/templates/sdk/wasp/server/email/core/providers/smtp.ts +2 -1
- package/data/Generator/templates/sdk/wasp/server/email/core/types.ts +2 -45
- package/data/Generator/templates/sdk/wasp/server/email/index.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/env.ts +20 -11
- package/data/Generator/templates/sdk/wasp/server/index.ts +3 -3
- package/data/Generator/templates/sdk/wasp/server/jobs/_job.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/index.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/pgBossJob.ts +4 -4
- package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/types.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/middleware/index.ts +1 -1
- package/data/Generator/templates/sdk/wasp/server/operations/actions/index.ts +14 -8
- package/data/Generator/templates/sdk/wasp/server/operations/actions/types.ts +5 -5
- package/data/Generator/templates/sdk/wasp/server/operations/queries/index.ts +14 -8
- package/data/Generator/templates/sdk/wasp/server/operations/queries/types.ts +5 -5
- package/data/Generator/templates/sdk/wasp/server/operations/wrappers.ts +40 -14
- package/data/Generator/templates/sdk/wasp/server/types/index.ts +1 -11
- package/data/Generator/templates/sdk/wasp/server/utils.ts +5 -20
- package/data/Generator/templates/sdk/wasp/server/webSocket/index.ts +7 -7
- package/data/Generator/templates/sdk/wasp/tsconfig.json +20 -46
- package/data/Generator/templates/sdk/wasp/types/index.ts +8 -0
- package/data/Generator/templates/sdk/wasp/types/register.ts +21 -0
- package/data/Generator/templates/sdk/wasp/vite-env.d.ts +0 -9
- package/data/Generator/templates/sdk/wasp/wasp-ssr.d.ts +8 -0
- package/data/Generator/templates/sdk/wasp/wasp-user-virtual-modules.d.ts +20 -0
- package/data/Generator/templates/server/package.json +2 -1
- package/data/Generator/templates/server/rollup.config.js +2 -43
- package/data/Generator/templates/server/rollup.dbSeed.config.js +3 -0
- package/data/Generator/templates/server/src/app.js +2 -2
- package/data/Generator/templates/server/src/auth/providers/config/email.ts +5 -5
- package/data/Generator/templates/server/src/auth/providers/email/login.ts +4 -4
- package/data/Generator/templates/server/src/auth/providers/email/requestPasswordReset.ts +4 -4
- package/data/Generator/templates/server/src/auth/providers/email/resetPassword.ts +13 -5
- package/data/Generator/templates/server/src/auth/providers/email/signup.ts +29 -18
- package/data/Generator/templates/server/src/auth/providers/email/verifyEmail.ts +7 -2
- package/data/Generator/templates/server/src/auth/providers/oauth/cookies.ts +5 -1
- package/data/Generator/templates/server/src/auth/providers/oauth/handler.ts +1 -1
- package/data/Generator/templates/server/src/auth/providers/oauth/oneTimeCode.ts +2 -2
- package/data/Generator/templates/server/src/auth/providers/oauth/state.ts +55 -13
- package/data/Generator/templates/server/src/auth/providers/oauth/user.ts +6 -3
- package/data/Generator/templates/server/src/auth/providers/username/login.ts +4 -4
- package/data/Generator/templates/server/src/auth/providers/username/signup.ts +12 -4
- package/data/Generator/templates/server/src/createRollupBundle.js +47 -0
- package/data/Generator/templates/server/src/crud/_operations.ts +16 -16
- package/data/Generator/templates/server/src/plugins/virtualUserModules.js +40 -0
- package/data/Generator/templates/server/src/routes/apis/index.ts +3 -3
- package/data/Generator/templates/server/src/routes/auth/index.js +1 -1
- package/data/Generator/templates/server/src/routes/auth/logout.ts +2 -2
- package/data/Generator/templates/server/src/routes/crud/_crud.ts +1 -1
- package/data/Generator/templates/server/src/routes/index.js +18 -18
- package/data/Generator/templates/server/src/routes/operations/index.js +1 -1
- package/data/Generator/templates/server/src/webSocket/initialization.ts +1 -1
- package/data/Generator/templates/server/tsconfig.json +7 -13
- package/data/Generator/templates/types/app/sdk/register.ts +57 -0
- package/data/packages/deploy/dist/common/cliVersion.js +17 -0
- package/data/packages/deploy/dist/common/waspProject.js +1 -1
- package/data/packages/deploy/dist/common/zx.js +24 -6
- package/data/packages/deploy/dist/providers/fly/commands/createDb/createDb.js +13 -5
- package/data/packages/deploy/dist/providers/fly/flyCli.js +29 -17
- package/data/packages/deploy/dist/providers/fly/index.js +16 -8
- package/data/packages/deploy/dist/providers/railway/commands/setup/setup.js +19 -31
- package/data/packages/deploy/dist/providers/railway/index.js +11 -2
- package/data/packages/deploy/dist/providers/railway/jsonOutputSchemas.js +19 -34
- package/data/packages/deploy/dist/providers/railway/railwayCli.js +11 -20
- package/data/packages/deploy/dist/providers/railway/railwayEnvironment/cli.js +20 -0
- package/data/packages/deploy/dist/providers/railway/railwayProject/RailwayProject.js +4 -1
- package/data/packages/deploy/dist/providers/railway/railwayProject/cli.js +6 -14
- package/data/packages/deploy/dist/providers/railway/railwayService/database.js +88 -0
- package/data/packages/deploy/dist/providers/railway/railwayService/deployment.js +12 -25
- package/data/packages/deploy/dist/providers/railway/railwayService/nameGenerator.js +5 -4
- package/data/packages/deploy/dist/providers/railway/railwayService/serviceInstance.js +48 -0
- package/data/packages/deploy/dist/providers/railway/railwayService/url.js +9 -30
- package/data/packages/deploy/package-lock.json +2 -2
- package/data/packages/deploy/package.json +1 -1
- package/data/packages/prisma/package-lock.json +2 -2
- package/data/packages/prisma/package.json +1 -1
- package/data/packages/spec/dist/__tests__/spec/mapApp.unit.test.js +19 -15
- package/data/packages/spec/dist/__tests__/spec/tsAppSpec.test-d.js +6 -0
- package/data/packages/spec/dist/src/appSpec.d.ts +15 -2
- package/data/packages/spec/dist/src/appSpec.d.ts.map +1 -1
- package/data/packages/spec/dist/src/spec/mapper/app.d.ts +1 -0
- package/data/packages/spec/dist/src/spec/mapper/app.d.ts.map +1 -1
- package/data/packages/spec/dist/src/spec/mapper/app.js +8 -2
- package/data/packages/spec/dist/src/spec/mapper/context.js +4 -4
- package/data/packages/spec/dist/src/spec/mapper/specElements.js +9 -9
- package/data/packages/spec/dist/src/spec/publicApi/constructors.d.ts +11 -11
- package/data/packages/spec/dist/src/spec/publicApi/constructors.js +11 -11
- package/data/packages/spec/dist/src/spec/publicApi/register.d.ts +1 -1
- package/data/packages/spec/dist/src/spec/publicApi/waspSpec.d.ts +58 -38
- package/data/packages/spec/dist/src/spec/publicApi/waspSpec.d.ts.map +1 -1
- package/data/packages/spec/package-lock.json +2 -2
- package/data/packages/spec/package.json +1 -1
- package/data/packages/studio/package-lock.json +15 -23
- package/data/packages/studio/package.json +2 -2
- package/package.json +1 -1
- package/wasp-bin +0 -0
- package/data/Generator/libs/auth/wasp.sh-lib-auth-0.25.0.tgz +0 -0
- package/data/Generator/templates/sdk/wasp/api/events.ts +0 -11
- package/data/Generator/templates/sdk/wasp/auth/email/index.ts +0 -5
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.module.css +0 -99
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.tsx +0 -74
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.module.css +0 -22
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.tsx +0 -34
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/auth-styles.css +0 -30
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.module.css +0 -33
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.tsx +0 -14
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.module.css +0 -4
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.tsx +0 -85
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/util.ts +0 -16
- package/data/Generator/templates/sdk/wasp/auth/helpers/user.ts +0 -15
- package/data/Generator/templates/sdk/wasp/auth/responseSchemas.ts +0 -10
- package/data/Generator/templates/sdk/wasp/auth/types.ts +0 -2
- package/data/Generator/templates/sdk/wasp/auth/username/index.ts +0 -2
- package/data/Generator/templates/sdk/wasp/client/app/components/DefaultRootErrorBoundary.tsx +0 -16
- package/data/Generator/templates/sdk/wasp/client/app/components/FullPageWrapper.tsx +0 -21
- package/data/Generator/templates/sdk/wasp/client/app/components/Loader.module.css +0 -37
- package/data/Generator/templates/sdk/wasp/client/app/components/Loader.tsx +0 -12
- package/data/Generator/templates/sdk/wasp/client/app/components/Message.tsx +0 -86
- package/data/Generator/templates/sdk/wasp/client/crud/operationsHelpers.ts +0 -21
- package/data/Generator/templates/sdk/wasp/client/hooks.ts +0 -19
- package/data/Generator/templates/sdk/wasp/client/operations/hooks.ts +0 -347
- package/data/Generator/templates/sdk/wasp/client/operations/internal/resources.js +0 -85
- package/data/Generator/templates/sdk/wasp/client/operations/internal/updateHandlersMap.js +0 -37
- package/data/Generator/templates/sdk/wasp/client/operations/queryClient.ts +0 -34
- package/data/Generator/templates/sdk/wasp/client/operations/rpc.ts +0 -96
- package/data/Generator/templates/sdk/wasp/client/router/linkHelpers.ts +0 -48
- package/data/Generator/templates/sdk/wasp/client/router/types.ts +0 -98
- package/data/Generator/templates/sdk/wasp/client/vite/plugins/detectServerImports.ts +0 -50
- package/data/Generator/templates/sdk/wasp/client/vite/plugins/envFile.ts +0 -112
- package/data/Generator/templates/sdk/wasp/client/vite/plugins/typescriptCheck.ts +0 -36
- package/data/Generator/templates/sdk/wasp/client/vite/plugins/validateEnv.ts +0 -88
- package/data/Generator/templates/sdk/wasp/client/vite/virtual-files/resolver.ts +0 -35
- package/data/Generator/templates/sdk/wasp/core/serialization/custom-register.ts +0 -21
- package/data/Generator/templates/sdk/wasp/core/storage.ts +0 -73
- package/data/Generator/templates/sdk/wasp/env/validation.ts +0 -44
- package/data/Generator/templates/sdk/wasp/server/HttpError.ts +0 -30
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/provider.ts +0 -20
- package/data/Generator/templates/sdk/wasp/server/auth/user.ts +0 -154
- package/data/Generator/templates/sdk/wasp/server/auth/username.ts +0 -1
- package/data/Generator/templates/sdk/wasp/server/jobs/core/job.ts +0 -28
- package/data/Generator/templates/sdk/wasp/server/middleware/globalMiddleware.ts +0 -8
- package/data/Generator/templates/sdk/wasp/universal/ansiColors.ts +0 -58
- package/data/Generator/templates/sdk/wasp/universal/predicates.ts +0 -3
- package/data/Generator/templates/sdk/wasp/universal/types.ts +0 -74
- package/data/Generator/templates/sdk/wasp/universal/url.ts +0 -9
- package/data/Generator/templates/sdk/wasp/universal/validators.ts +0 -21
- package/data/packages/ts-inspect/dist/exports.js +0 -82
- package/data/packages/ts-inspect/dist/index.js +0 -28
- package/data/packages/ts-inspect/package-lock.json +0 -4724
- package/data/packages/ts-inspect/package.json +0 -31
- /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 '
|
|
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:
|
|
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 (
|
|
26
|
-
onError(
|
|
25
|
+
} catch (error: unknown) {
|
|
26
|
+
onError(error);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { login
|
|
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:
|
|
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 (
|
|
22
|
-
onError(
|
|
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 '
|
|
5
|
-
import * as SocialIcons from '
|
|
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 =}`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { api, removeLocalUserData } from '../api/index.js'
|
|
2
|
-
import { invalidateAndRemoveQueries } from '
|
|
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
|
-
{=#
|
|
3
|
+
{=# isEmailUserSignupFieldsDefined =}
|
|
4
4
|
export type { UserEmailSignupFields } from './types';
|
|
5
|
-
{=/
|
|
5
|
+
{=/ isEmailUserSignupFieldsDefined =}
|
|
6
6
|
|
|
7
|
-
{=#
|
|
7
|
+
{=# isUsernameAndPasswordUserSignupFieldsDefined =}
|
|
8
8
|
export type { UserUsernameAndPasswordSignupFields } from './types';
|
|
9
|
-
{=/
|
|
9
|
+
{=/ isUsernameAndPasswordUserSignupFieldsDefined =}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
{{={= =}=}}
|
|
2
|
-
import type
|
|
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,
|
|
5
|
-
|
|
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<
|
|
18
|
-
|
|
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<
|
|
24
|
-
|
|
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 {
|
|
4
|
-
import type { QueryFunction, Query } from '
|
|
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 '
|
|
8
|
-
import { makeAuthUserIfPossible } from '
|
|
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
|
-
|
|
1
|
+
{{={= =}=}}
|
|
2
2
|
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '../
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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]
|
|
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
|
-
|
|
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
|
|
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 '
|
|
4
|
-
import { SessionResponseSchema } from '
|
|
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
|
-
{=#
|
|
4
|
-
import {
|
|
5
|
-
{=/
|
|
3
|
+
{=# isUsernameAndPasswordUserSignupFieldsDefined =}
|
|
4
|
+
import type { UserUsernameAndPasswordSignupFields } from '../../providers'
|
|
5
|
+
{=/ isUsernameAndPasswordUserSignupFieldsDefined =}
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
// PRIVATE API
|
|
8
|
+
export type UsernameSignupData = {
|
|
8
9
|
username: string
|
|
9
10
|
password: string
|
|
10
|
-
}{=#
|
|
11
|
+
}{=# isUsernameAndPasswordUserSignupFieldsDefined =} & UserUsernameAndPasswordSignupFields{=/ isUsernameAndPasswordUserSignupFieldsDefined =}
|
|
11
12
|
|
|
12
13
|
// PUBLIC API
|
|
13
14
|
export async function signup(data: UsernameSignupData): Promise<void> {
|
|
@@ -1,83 +1 @@
|
|
|
1
|
-
|
|
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 {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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=
|
|
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 {
|
|
8
|
-
|
|
9
|
-
|
|
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=
|
|
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 '
|
|
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 =}",
|