@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
|
@@ -9,7 +9,7 @@ import { getSignupRoute } from "../email/signup.js";
|
|
|
9
9
|
import { getRequestPasswordResetRoute } from "../email/requestPasswordReset.js";
|
|
10
10
|
import { resetPassword } from "../email/resetPassword.js";
|
|
11
11
|
import { verifyEmail } from "../email/verifyEmail.js";
|
|
12
|
-
import { GetVerificationEmailContentFn, GetPasswordResetEmailContentFn } from "wasp/server/auth
|
|
12
|
+
import { GetVerificationEmailContentFn, GetPasswordResetEmailContentFn } from "wasp/server/auth";
|
|
13
13
|
import { defineHandler } from "wasp/server/utils";
|
|
14
14
|
import { env } from "wasp/server";
|
|
15
15
|
|
|
@@ -52,8 +52,8 @@ const _waspGetPasswordResetEmailContent: GetPasswordResetEmailContentFn = ({ pas
|
|
|
52
52
|
{=/ getPasswordResetEmailContent.isDefined =}
|
|
53
53
|
|
|
54
54
|
const fromField: EmailFromField = {
|
|
55
|
-
name:
|
|
56
|
-
email:
|
|
55
|
+
name: {=& fromField.name =},
|
|
56
|
+
email: {=& fromField.email =},
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
const config: ProviderConfig = {
|
|
@@ -68,7 +68,7 @@ const config: ProviderConfig = {
|
|
|
68
68
|
const signupRoute = defineHandler(getSignupRoute({
|
|
69
69
|
userSignupFields: _waspUserSignupFields,
|
|
70
70
|
fromField,
|
|
71
|
-
clientRoute:
|
|
71
|
+
clientRoute: {=& emailVerificationClientRoute =},
|
|
72
72
|
getVerificationEmailContent: _waspGetVerificationEmailContent,
|
|
73
73
|
{=# isDevelopment =}
|
|
74
74
|
isEmailAutoVerified: env.SKIP_EMAIL_VERIFICATION_IN_DEV,
|
|
@@ -81,7 +81,7 @@ const config: ProviderConfig = {
|
|
|
81
81
|
|
|
82
82
|
const requestPasswordResetRoute = defineHandler(getRequestPasswordResetRoute({
|
|
83
83
|
fromField,
|
|
84
|
-
clientRoute:
|
|
84
|
+
clientRoute: {=& passwordResetClientRoute =},
|
|
85
85
|
getPasswordResetEmailContent: _waspGetPasswordResetEmailContent,
|
|
86
86
|
}));
|
|
87
87
|
router.post('/request-password-reset', requestPasswordResetRoute);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
|
-
import { createInvalidCredentialsError } from 'wasp/auth/utils'
|
|
3
|
-
import { verifyPassword } from 'wasp/auth/password'
|
|
2
|
+
import { createInvalidCredentialsError } from 'wasp/server/auth/utils'
|
|
3
|
+
import { verifyPassword } from 'wasp/server/auth/password'
|
|
4
4
|
import {
|
|
5
5
|
createProviderId,
|
|
6
6
|
findAuthIdentity,
|
|
7
7
|
findAuthWithUserBy,
|
|
8
8
|
getProviderDataWithPassword,
|
|
9
|
-
} from 'wasp/auth/utils'
|
|
10
|
-
import { createSession } from 'wasp/auth/session'
|
|
9
|
+
} from 'wasp/server/auth/utils'
|
|
10
|
+
import { createSession } from 'wasp/server/auth/session'
|
|
11
11
|
import { ensureValidEmail, ensurePasswordIsPresent } from 'wasp/auth/validation'
|
|
12
12
|
import { onBeforeLoginHook, onAfterLoginHook } from '../../hooks.js';
|
|
13
13
|
|
|
@@ -4,15 +4,15 @@ import {
|
|
|
4
4
|
findAuthIdentity,
|
|
5
5
|
doFakeWork,
|
|
6
6
|
getProviderDataWithPassword,
|
|
7
|
-
} from 'wasp/auth/utils';
|
|
7
|
+
} from 'wasp/server/auth/utils';
|
|
8
8
|
import {
|
|
9
|
+
GetPasswordResetEmailContentFn,
|
|
9
10
|
createPasswordResetLink,
|
|
10
11
|
sendPasswordResetEmail,
|
|
11
12
|
isEmailResendAllowed,
|
|
12
|
-
} from "wasp/server/auth
|
|
13
|
+
} from "wasp/server/auth";
|
|
13
14
|
import { ensureValidEmail } from 'wasp/auth/validation';
|
|
14
15
|
import type { EmailFromField } from 'wasp/server/email/core/types';
|
|
15
|
-
import { GetPasswordResetEmailContentFn } from 'wasp/server/auth/email';
|
|
16
16
|
import { HttpError } from 'wasp/server';
|
|
17
17
|
|
|
18
18
|
export function getRequestPasswordResetRoute({
|
|
@@ -64,7 +64,7 @@ export function getRequestPasswordResetRoute({
|
|
|
64
64
|
...getPasswordResetEmailContent({ passwordResetLink }),
|
|
65
65
|
},
|
|
66
66
|
);
|
|
67
|
-
} catch (e:
|
|
67
|
+
} catch (e: unknown) {
|
|
68
68
|
console.error("Failed to send password reset email:", e);
|
|
69
69
|
throw new HttpError(500, "Failed to send password reset email.");
|
|
70
70
|
}
|
|
@@ -4,8 +4,9 @@ import {
|
|
|
4
4
|
findAuthIdentity,
|
|
5
5
|
updateAuthIdentityProviderData,
|
|
6
6
|
getProviderDataWithPassword,
|
|
7
|
-
} from 'wasp/auth/utils';
|
|
8
|
-
import { validateJWT } from 'wasp/auth/jwt'
|
|
7
|
+
} from 'wasp/server/auth/utils';
|
|
8
|
+
import { validateJWT } from 'wasp/server/auth/jwt'
|
|
9
|
+
import { invalidateAllSessionsForAuthId } from 'wasp/server/auth/session'
|
|
9
10
|
import { ensureTokenIsPresent, ensurePasswordIsPresent, ensureValidPassword } from 'wasp/auth/validation';
|
|
10
11
|
import { HttpError } from 'wasp/server';
|
|
11
12
|
|
|
@@ -14,7 +15,9 @@ export async function resetPassword(
|
|
|
14
15
|
res: Response,
|
|
15
16
|
): Promise<void> {
|
|
16
17
|
const args = req.body ?? {};
|
|
17
|
-
|
|
18
|
+
// NOTE: The token is validated before the password so that an unauthenticated
|
|
19
|
+
// caller with an invalid token can't learn the deployment's password policy.
|
|
20
|
+
ensureTokenIsPresent(args);
|
|
18
21
|
|
|
19
22
|
const { token, password } = args;
|
|
20
23
|
const { email } = await validateJWT<{ email: string }>(token)
|
|
@@ -22,6 +25,8 @@ export async function resetPassword(
|
|
|
22
25
|
throw new HttpError(400, "Password reset failed, invalid token");
|
|
23
26
|
});
|
|
24
27
|
|
|
28
|
+
ensureValidPasswordArg(args);
|
|
29
|
+
|
|
25
30
|
const providerId = createProviderId('email', email);
|
|
26
31
|
const authIdentity = await findAuthIdentity(providerId);
|
|
27
32
|
if (!authIdentity) {
|
|
@@ -38,11 +43,14 @@ export async function resetPassword(
|
|
|
38
43
|
hashedPassword: password,
|
|
39
44
|
});
|
|
40
45
|
|
|
46
|
+
// Changing the password invalidates all the existing sessions, so that
|
|
47
|
+
// somebody who got hold of a session can't keep using it.
|
|
48
|
+
await invalidateAllSessionsForAuthId(authIdentity.authId);
|
|
49
|
+
|
|
41
50
|
res.json({ success: true });
|
|
42
51
|
};
|
|
43
52
|
|
|
44
|
-
function
|
|
45
|
-
ensureTokenIsPresent(args);
|
|
53
|
+
function ensureValidPasswordArg(args: object): void {
|
|
46
54
|
ensurePasswordIsPresent(args);
|
|
47
55
|
ensureValidPassword(args);
|
|
48
56
|
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import { Request, Response } from 'express'
|
|
2
2
|
import type { UserSignupFields } from 'wasp/auth/providers/types'
|
|
3
|
-
import {
|
|
4
|
-
createProviderId,
|
|
5
|
-
createUser,
|
|
6
|
-
deleteUserByAuthId,
|
|
7
|
-
doFakeWork,
|
|
8
|
-
findAuthIdentity,
|
|
9
|
-
getProviderDataWithPassword,
|
|
10
|
-
rethrowPossibleAuthError,
|
|
11
|
-
sanitizeAndSerializeProviderData,
|
|
12
|
-
validateAndGetUserFields,
|
|
13
|
-
} from 'wasp/auth/utils'
|
|
14
3
|
import {
|
|
15
4
|
ensurePasswordIsPresent,
|
|
16
5
|
ensureValidEmail,
|
|
17
6
|
ensureValidPassword,
|
|
18
7
|
} from 'wasp/auth/validation'
|
|
19
8
|
import { HttpError } from 'wasp/server'
|
|
20
|
-
import { GetVerificationEmailContentFn } from 'wasp/server/auth/email'
|
|
21
9
|
import {
|
|
10
|
+
GetVerificationEmailContentFn,
|
|
22
11
|
createEmailVerificationLink,
|
|
23
12
|
isEmailResendAllowed,
|
|
24
13
|
sendEmailVerificationEmail,
|
|
25
|
-
} from 'wasp/server/auth
|
|
14
|
+
} from 'wasp/server/auth'
|
|
15
|
+
import {
|
|
16
|
+
createProviderId,
|
|
17
|
+
createUser,
|
|
18
|
+
deleteUserByAuthId,
|
|
19
|
+
doFakeWork,
|
|
20
|
+
findAuthIdentity,
|
|
21
|
+
getProviderDataWithPassword,
|
|
22
|
+
rethrowPossibleAuthError,
|
|
23
|
+
sanitizeAndSerializeProviderData,
|
|
24
|
+
validateAndGetUserFields,
|
|
25
|
+
} from 'wasp/server/auth/utils'
|
|
26
26
|
import { EmailFromField } from 'wasp/server/email/core/types'
|
|
27
27
|
import { onAfterSignupHook, onBeforeSignupHook } from '../../hooks.js'
|
|
28
28
|
|
|
@@ -91,7 +91,7 @@ export function getSignupRoute({
|
|
|
91
91
|
// we are not checking if the email was sent or not!
|
|
92
92
|
const { isResendAllowed, timeLeft } = isEmailResendAllowed(
|
|
93
93
|
providerData,
|
|
94
|
-
'
|
|
94
|
+
'emailVerificationSentAt',
|
|
95
95
|
)
|
|
96
96
|
if (!isResendAllowed) {
|
|
97
97
|
throw new HttpError(
|
|
@@ -107,6 +107,14 @@ export function getSignupRoute({
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
// The hook runs first so it can veto the signup (by throwing) before the
|
|
111
|
+
// developer's `userSignupFields` getters run.
|
|
112
|
+
try {
|
|
113
|
+
await onBeforeSignupHook({ req, providerId })
|
|
114
|
+
} catch (e: unknown) {
|
|
115
|
+
rethrowPossibleAuthError(e)
|
|
116
|
+
}
|
|
117
|
+
|
|
110
118
|
const userFields = await validateAndGetUserFields(fields, userSignupFields)
|
|
111
119
|
|
|
112
120
|
const newUserProviderData = await sanitizeAndSerializeProviderData<'email'>(
|
|
@@ -119,7 +127,6 @@ export function getSignupRoute({
|
|
|
119
127
|
)
|
|
120
128
|
|
|
121
129
|
try {
|
|
122
|
-
await onBeforeSignupHook({ req, providerId })
|
|
123
130
|
const user = await createUser(
|
|
124
131
|
providerId,
|
|
125
132
|
newUserProviderData,
|
|
@@ -139,14 +146,18 @@ export function getSignupRoute({
|
|
|
139
146
|
return
|
|
140
147
|
}
|
|
141
148
|
|
|
149
|
+
// We send the verification link to the normalized address that we stored.
|
|
150
|
+
// This way the address that proves ownership is the same one password reset later
|
|
151
|
+
// sends the reset link to.
|
|
152
|
+
const email = providerId.providerUserId
|
|
142
153
|
const verificationLink = await createEmailVerificationLink(
|
|
143
|
-
|
|
154
|
+
email,
|
|
144
155
|
clientRoute,
|
|
145
156
|
)
|
|
146
157
|
try {
|
|
147
|
-
await sendEmailVerificationEmail(
|
|
158
|
+
await sendEmailVerificationEmail(email, {
|
|
148
159
|
from: fromField,
|
|
149
|
-
to:
|
|
160
|
+
to: email,
|
|
150
161
|
...getVerificationEmailContent({ verificationLink }),
|
|
151
162
|
})
|
|
152
163
|
} catch (e: unknown) {
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
|
-
import { validateJWT } from 'wasp/auth/jwt';
|
|
2
|
+
import { validateJWT } from 'wasp/server/auth/jwt';
|
|
3
3
|
import {
|
|
4
|
+
createInvalidCredentialsError,
|
|
4
5
|
createProviderId,
|
|
5
6
|
findAuthIdentity,
|
|
6
7
|
findAuthWithUserBy,
|
|
7
8
|
getProviderDataWithPassword,
|
|
8
9
|
updateAuthIdentityProviderData,
|
|
9
|
-
} from 'wasp/auth/utils';
|
|
10
|
+
} from 'wasp/server/auth/utils';
|
|
10
11
|
import { HttpError } from 'wasp/server';
|
|
11
12
|
import { onAfterEmailVerifiedHook } from '../../hooks.js';
|
|
12
13
|
|
|
@@ -35,6 +36,10 @@ export async function verifyEmail(
|
|
|
35
36
|
|
|
36
37
|
const auth = await findAuthWithUserBy({ id: authIdentity.authId })
|
|
37
38
|
|
|
39
|
+
if (auth === null) {
|
|
40
|
+
throw createInvalidCredentialsError();
|
|
41
|
+
}
|
|
42
|
+
|
|
38
43
|
await onAfterEmailVerifiedHook({ req, email, user: auth.user });
|
|
39
44
|
|
|
40
45
|
res.json({ success: true });
|
|
@@ -19,6 +19,10 @@ export function setOAuthCookieValue(
|
|
|
19
19
|
res.cookie(cookieName, value, {
|
|
20
20
|
httpOnly: true,
|
|
21
21
|
secure: !config.isDevelopment,
|
|
22
|
+
// The OAuth callback is a top-level GET navigation, which `lax` permits.
|
|
23
|
+
// We set it explicitly because an omitted `sameSite` is not `lax` in every
|
|
24
|
+
// browser.
|
|
25
|
+
sameSite: "lax",
|
|
22
26
|
path: "/",
|
|
23
27
|
maxAge: 60 * 60 * 1000, // 1 hour
|
|
24
28
|
});
|
|
@@ -28,7 +32,7 @@ export function getOAuthCookieValue(
|
|
|
28
32
|
provider: ProviderConfig,
|
|
29
33
|
req: ExpressRequest,
|
|
30
34
|
fieldName: OAuthStateFieldName,
|
|
31
|
-
): string {
|
|
35
|
+
): string | undefined {
|
|
32
36
|
const cookieName = `${provider.id}_${fieldName}`;
|
|
33
37
|
const cookies = parseCookies(req.headers.cookie ?? "");
|
|
34
38
|
return cookies.get(cookieName);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Router } from 'express'
|
|
2
2
|
|
|
3
3
|
import { defineHandler, redirect } from 'wasp/server/utils'
|
|
4
|
-
import { rethrowPossibleAuthError } from 'wasp/auth/utils'
|
|
4
|
+
import { rethrowPossibleAuthError } from 'wasp/server/auth/utils'
|
|
5
5
|
import {
|
|
6
6
|
type UserSignupFields,
|
|
7
7
|
type ProviderConfig,
|
|
@@ -2,8 +2,8 @@ import { Router } from "express";
|
|
|
2
2
|
|
|
3
3
|
import { HttpError } from 'wasp/server';
|
|
4
4
|
import { defineHandler } from 'wasp/server/utils';
|
|
5
|
-
import { findAuthWithUserBy } from 'wasp/auth/utils'
|
|
6
|
-
import { createSession } from 'wasp/auth/session'
|
|
5
|
+
import { findAuthWithUserBy } from 'wasp/server/auth/utils'
|
|
6
|
+
import { createSession } from 'wasp/server/auth/session'
|
|
7
7
|
import { exchangeCodeForTokenPath, tokenStore } from "wasp/server/auth";
|
|
8
8
|
|
|
9
9
|
export function setupOneTimeCodeRoute(router: Router) {
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
import * as arctic from 'arctic';
|
|
6
6
|
|
|
7
7
|
import type { ProviderConfig } from 'wasp/auth/providers/types';
|
|
8
|
+
import { HttpError } from 'wasp/server';
|
|
8
9
|
|
|
9
10
|
import { setOAuthCookieValue, getOAuthCookieValue } from './cookies.js';
|
|
10
11
|
|
|
@@ -68,15 +69,16 @@ export function validateAndGetOAuthState<OT extends OAuthType>({
|
|
|
68
69
|
provider: ProviderConfig,
|
|
69
70
|
req: ExpressRequest
|
|
70
71
|
}): OAuthStateWithCodeFor<OT> {
|
|
71
|
-
const state:
|
|
72
|
-
...getCode(req),
|
|
72
|
+
const state: OAuthStateFor<OT> = {
|
|
73
73
|
...getState(req),
|
|
74
74
|
...(oAuthType === 'OAuth2WithPKCE' && getCodeVerifier(provider, req)),
|
|
75
75
|
};
|
|
76
76
|
|
|
77
|
+
// We validate the state before reading anything else from the callback,
|
|
78
|
+
// so only a callback for a login this browser started gets handled.
|
|
77
79
|
validateOAuthState(provider, req, state);
|
|
78
80
|
|
|
79
|
-
return state;
|
|
81
|
+
return { ...state, ...getCode(provider, req) };
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
function storeOAuthState(
|
|
@@ -93,22 +95,27 @@ function storeOAuthState(
|
|
|
93
95
|
function validateOAuthState(
|
|
94
96
|
provider: ProviderConfig,
|
|
95
97
|
req: ExpressRequest,
|
|
96
|
-
state:
|
|
98
|
+
state: OAuthStateFor<OAuthType>
|
|
97
99
|
): void {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
|
|
100
|
+
// This fails when the login outlived the cookies, was finished in a
|
|
101
|
+
// different browser, or was replaced by a newer login attempt.
|
|
102
102
|
const storedState = getOAuthCookieValue(provider, req, 'state');
|
|
103
103
|
if (!state.state || !storedState || storedState !== state.state) {
|
|
104
|
-
throw
|
|
104
|
+
throw createLoginExpiredError(provider);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
if (isOAuthStateWithPKCE(state) && !state.codeVerifier) {
|
|
108
|
-
throw
|
|
108
|
+
throw createLoginExpiredError(provider);
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
+
function createLoginExpiredError(provider: ProviderConfig): HttpError {
|
|
113
|
+
return new HttpError(
|
|
114
|
+
400,
|
|
115
|
+
`Your login attempt with ${provider.displayName} expired. Please try again.`
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
112
119
|
function generateState(): { state: string } {
|
|
113
120
|
return { state: arctic.generateState() };
|
|
114
121
|
}
|
|
@@ -117,8 +124,39 @@ function generateCodeVerifier(): { codeVerifier: string } {
|
|
|
117
124
|
return { codeVerifier: arctic.generateCodeVerifier() };
|
|
118
125
|
}
|
|
119
126
|
|
|
120
|
-
function getCode(
|
|
121
|
-
|
|
127
|
+
function getCode(
|
|
128
|
+
provider: ProviderConfig,
|
|
129
|
+
req: ExpressRequest
|
|
130
|
+
): { code: string } {
|
|
131
|
+
const { code, error, error_description } = req.query;
|
|
132
|
+
|
|
133
|
+
// The provider's error is meant for developers, so we only log it (the
|
|
134
|
+
// handler logs `data`) and never show it to the user.
|
|
135
|
+
const providerErrorDetails = {
|
|
136
|
+
providerError: error,
|
|
137
|
+
providerErrorDescription: error_description,
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// Providers send `access_denied` when the user cancels on the consent screen,
|
|
141
|
+
// but some (e.g. Keycloak, Auth0) also send it when their own policy denies
|
|
142
|
+
// the login.
|
|
143
|
+
if (error === 'access_denied') {
|
|
144
|
+
throw new HttpError(
|
|
145
|
+
400,
|
|
146
|
+
`Login with ${provider.displayName} was cancelled or denied.`,
|
|
147
|
+
providerErrorDetails
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (error !== undefined || typeof code !== 'string' || code === '') {
|
|
152
|
+
throw new HttpError(
|
|
153
|
+
400,
|
|
154
|
+
`Unable to log in with ${provider.displayName}. Please try again later.`,
|
|
155
|
+
providerErrorDetails
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return { code };
|
|
122
160
|
}
|
|
123
161
|
|
|
124
162
|
function getState(req: ExpressRequest): { state: string } {
|
|
@@ -134,7 +172,11 @@ function getCodeVerifier(
|
|
|
134
172
|
req,
|
|
135
173
|
'codeVerifier'
|
|
136
174
|
);
|
|
137
|
-
|
|
175
|
+
// The cookie can be missing (dropped by the browser, or expired while the user
|
|
176
|
+
// sat on the consent screen). `validateOAuthState` rejects an empty code
|
|
177
|
+
// verifier, so we normalize the missing case into one instead of lying about
|
|
178
|
+
// the type.
|
|
179
|
+
return { codeVerifier: codeVerifier ?? '' };
|
|
138
180
|
}
|
|
139
181
|
|
|
140
182
|
function isOAuthStateWithPKCE(
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
validateAndGetUserFields,
|
|
8
8
|
createProviderId,
|
|
9
9
|
findAuthWithUserBy,
|
|
10
|
-
} from 'wasp/auth/utils'
|
|
10
|
+
} from 'wasp/server/auth/utils'
|
|
11
11
|
import { type {= authEntityUpper =} } from 'wasp/entities'
|
|
12
12
|
import { prisma } from 'wasp/server'
|
|
13
13
|
import { type UserSignupFields, type ProviderConfig } from 'wasp/auth/providers/types'
|
|
@@ -111,6 +111,10 @@ async function getAuthIdFromProviderDetails({
|
|
|
111
111
|
|
|
112
112
|
return authId
|
|
113
113
|
} else {
|
|
114
|
+
// The hook runs first so it can veto the signup (by throwing) before the
|
|
115
|
+
// developer's `userSignupFields` getters run.
|
|
116
|
+
await onBeforeSignupHook({ req, providerId })
|
|
117
|
+
|
|
114
118
|
const userFields = await validateAndGetUserFields(
|
|
115
119
|
{ profile: providerProfile },
|
|
116
120
|
userSignupFields,
|
|
@@ -118,8 +122,7 @@ async function getAuthIdFromProviderDetails({
|
|
|
118
122
|
|
|
119
123
|
// For now, we don't have any extra data for the oauth providers, so we just pass an empty object.
|
|
120
124
|
const providerData = await sanitizeAndSerializeProviderData({})
|
|
121
|
-
|
|
122
|
-
await onBeforeSignupHook({ req, providerId })
|
|
125
|
+
|
|
123
126
|
const user = await createUser(
|
|
124
127
|
providerId,
|
|
125
128
|
providerData,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{{={= =}=}}
|
|
2
|
-
import { createInvalidCredentialsError } from 'wasp/auth/utils'
|
|
2
|
+
import { createInvalidCredentialsError } from 'wasp/server/auth/utils'
|
|
3
3
|
import { defineHandler } from 'wasp/server/utils'
|
|
4
|
-
import { verifyPassword } from 'wasp/auth/password'
|
|
4
|
+
import { verifyPassword } from 'wasp/server/auth/password'
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
7
|
createProviderId,
|
|
8
8
|
findAuthIdentity,
|
|
9
9
|
findAuthWithUserBy,
|
|
10
10
|
getProviderDataWithPassword,
|
|
11
|
-
} from 'wasp/auth/utils'
|
|
12
|
-
import { createSession } from 'wasp/auth/session'
|
|
11
|
+
} from 'wasp/server/auth/utils'
|
|
12
|
+
import { createSession } from 'wasp/server/auth/session'
|
|
13
13
|
import { ensureValidUsername, ensurePasswordIsPresent } from 'wasp/auth/validation'
|
|
14
14
|
import { onBeforeLoginHook, onAfterLoginHook } from '../../hooks.js';
|
|
15
15
|
|
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
createUser,
|
|
6
6
|
rethrowPossibleAuthError,
|
|
7
7
|
sanitizeAndSerializeProviderData,
|
|
8
|
-
} from 'wasp/auth/utils'
|
|
8
|
+
} from 'wasp/server/auth/utils'
|
|
9
9
|
import {
|
|
10
10
|
ensureValidUsername,
|
|
11
11
|
ensurePasswordIsPresent,
|
|
12
12
|
ensureValidPassword,
|
|
13
13
|
} from 'wasp/auth/validation'
|
|
14
|
-
import { validateAndGetUserFields } from 'wasp/auth/utils'
|
|
14
|
+
import { validateAndGetUserFields } from 'wasp/server/auth/utils'
|
|
15
15
|
import type { UserSignupFields } from 'wasp/auth/providers/types'
|
|
16
16
|
import { onBeforeSignupHook, onAfterSignupHook } from '../../hooks.js';
|
|
17
17
|
|
|
@@ -24,18 +24,26 @@ export function getSignupRoute({
|
|
|
24
24
|
const fields = req.body ?? {}
|
|
25
25
|
ensureValidArgs(fields)
|
|
26
26
|
|
|
27
|
+
const providerId = createProviderId('username', fields.username)
|
|
28
|
+
|
|
29
|
+
// The hook runs first so it can veto the signup (by throwing) before the
|
|
30
|
+
// developer's `userSignupFields` getters run.
|
|
31
|
+
try {
|
|
32
|
+
await onBeforeSignupHook({ req, providerId })
|
|
33
|
+
} catch (e: unknown) {
|
|
34
|
+
rethrowPossibleAuthError(e)
|
|
35
|
+
}
|
|
36
|
+
|
|
27
37
|
const userFields = await validateAndGetUserFields(
|
|
28
38
|
fields,
|
|
29
39
|
userSignupFields,
|
|
30
40
|
);
|
|
31
41
|
|
|
32
|
-
const providerId = createProviderId('username', fields.username)
|
|
33
42
|
const providerData = await sanitizeAndSerializeProviderData<'username'>({
|
|
34
43
|
hashedPassword: fields.password,
|
|
35
44
|
})
|
|
36
45
|
|
|
37
46
|
try {
|
|
38
|
-
await onBeforeSignupHook({ req, providerId })
|
|
39
47
|
const user = await createUser(
|
|
40
48
|
providerId,
|
|
41
49
|
providerData,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import resolve from "@rollup/plugin-node-resolve";
|
|
2
|
+
import esbuild from "rollup-plugin-esbuild";
|
|
3
|
+
import { virtualUserModules } from "./plugins/virtualUserModules.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @param {string} inputFilePath
|
|
7
|
+
* @param {string} outputFilePath
|
|
8
|
+
* @returns {import("rollup").RollupOptions}
|
|
9
|
+
*/
|
|
10
|
+
export function createRollupBundle(inputFilePath, outputFilePath) {
|
|
11
|
+
return {
|
|
12
|
+
input: inputFilePath,
|
|
13
|
+
output: {
|
|
14
|
+
file: outputFilePath,
|
|
15
|
+
format: "es",
|
|
16
|
+
sourcemap: true,
|
|
17
|
+
},
|
|
18
|
+
plugins: [
|
|
19
|
+
virtualUserModules(),
|
|
20
|
+
// We added `".ts"` to the default `extensions` array value
|
|
21
|
+
// (default is `[".mjs", ".js", ".json", ".node"]`).
|
|
22
|
+
// This is because the `virtualUserModules` plugin
|
|
23
|
+
// can resolve user virtual modules to TypeScript files.
|
|
24
|
+
resolve({ extensions: [".mjs", ".js", ".ts", ".json", ".node"] }),
|
|
25
|
+
esbuild({
|
|
26
|
+
target: "esnext",
|
|
27
|
+
}),
|
|
28
|
+
],
|
|
29
|
+
// We don't want to bundle any of the node_module deps because we want to
|
|
30
|
+
// keep them as external dependencies.
|
|
31
|
+
external: /node_modules/,
|
|
32
|
+
// 'preserveSymlinks: false' tells Rollup to fully follow symlinks when
|
|
33
|
+
// resolving modules. This is the default option, but we're setting it
|
|
34
|
+
// explicitly because we rely on it.
|
|
35
|
+
//
|
|
36
|
+
// With this set to 'false', the 'wasp' package resolves to
|
|
37
|
+
// '.wasp/out/sdk/wasp' (not 'node_modules/wasp'), preventing Rollup from
|
|
38
|
+
// viewing it as an external dependency and ensuring it gets bundled.
|
|
39
|
+
//
|
|
40
|
+
// We need to bundle 'wasp' to support fully extensionless relative
|
|
41
|
+
// imports. See https://github.com/wasp-lang/wasp/issues/2492 for more
|
|
42
|
+
// details.
|
|
43
|
+
//
|
|
44
|
+
// Source: https://rollupjs.org/configuration-options/#preservesymlinks
|
|
45
|
+
preserveSymlinks: false,
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
import { prisma } from 'wasp/server'
|
|
3
3
|
|
|
4
4
|
{=# isAuthEnabled =}
|
|
5
|
-
import { createInvalidCredentialsError } from 'wasp/auth/utils'
|
|
5
|
+
import { createInvalidCredentialsError } from 'wasp/server/auth/utils'
|
|
6
6
|
{=/ isAuthEnabled =}
|
|
7
7
|
import type {
|
|
8
8
|
{=# crud.operations.GetAll =}
|
|
9
|
-
|
|
9
|
+
RegisteredGetAllQuery,
|
|
10
10
|
{=/ crud.operations.GetAll =}
|
|
11
11
|
{=# crud.operations.Get =}
|
|
12
|
-
|
|
12
|
+
RegisteredGetQuery,
|
|
13
13
|
{=/ crud.operations.Get =}
|
|
14
14
|
{=# crud.operations.Create =}
|
|
15
|
-
|
|
15
|
+
RegisteredCreateAction,
|
|
16
16
|
{=/ crud.operations.Create =}
|
|
17
17
|
{=# crud.operations.Update =}
|
|
18
|
-
|
|
18
|
+
RegisteredUpdateAction,
|
|
19
19
|
{=/ crud.operations.Update =}
|
|
20
20
|
{=# crud.operations.Delete =}
|
|
21
|
-
|
|
21
|
+
RegisteredDeleteAction,
|
|
22
22
|
{=/ crud.operations.Delete =}
|
|
23
23
|
} from 'wasp/server/crud/{= crud.name =}'
|
|
24
24
|
{=# overrides.GetAll.isDefined =}
|
|
@@ -50,7 +50,7 @@ const entities = {
|
|
|
50
50
|
// 1. We either use the default implementation of the operation...
|
|
51
51
|
=}
|
|
52
52
|
{=^ overrides.GetAll.isDefined =}
|
|
53
|
-
const _waspGetAllQuery:
|
|
53
|
+
const _waspGetAllQuery: RegisteredGetAllQuery = ((args, context) => {
|
|
54
54
|
{=^ crud.operations.GetAll.isPublic =}
|
|
55
55
|
throwIfNotAuthenticated(context)
|
|
56
56
|
{=/ crud.operations.GetAll.isPublic =}
|
|
@@ -78,11 +78,11 @@ export async function getAllFn(args, context) {
|
|
|
78
78
|
{=!
|
|
79
79
|
// That's it! It is similar for all other operations.
|
|
80
80
|
=}
|
|
81
|
-
|
|
82
81
|
{=# crud.operations.Get =}
|
|
82
|
+
|
|
83
83
|
// Get query
|
|
84
84
|
{=^ overrides.Get.isDefined =}
|
|
85
|
-
const _waspGetQuery:
|
|
85
|
+
const _waspGetQuery: RegisteredGetQuery = ((args, context) => {
|
|
86
86
|
{=^ crud.operations.Get.isPublic =}
|
|
87
87
|
throwIfNotAuthenticated(context)
|
|
88
88
|
{=/ crud.operations.Get.isPublic =}
|
|
@@ -100,11 +100,11 @@ export async function getFn(args, context) {
|
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
102
|
{=/ crud.operations.Get =}
|
|
103
|
-
|
|
104
103
|
{=# crud.operations.Create =}
|
|
104
|
+
|
|
105
105
|
// Create action
|
|
106
106
|
{=^ overrides.Create.isDefined =}
|
|
107
|
-
const _waspCreateAction:
|
|
107
|
+
const _waspCreateAction: RegisteredCreateAction = ((args, context) => {
|
|
108
108
|
{=^ crud.operations.Create.isPublic =}
|
|
109
109
|
throwIfNotAuthenticated(context)
|
|
110
110
|
{=/ crud.operations.Create.isPublic =}
|
|
@@ -122,11 +122,11 @@ export async function createFn(args, context) {
|
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
124
|
{=/ crud.operations.Create =}
|
|
125
|
-
|
|
126
125
|
{=# crud.operations.Update =}
|
|
126
|
+
|
|
127
127
|
// Update action
|
|
128
128
|
{=^ overrides.Update.isDefined =}
|
|
129
|
-
const _waspUpdateAction:
|
|
129
|
+
const _waspUpdateAction: RegisteredUpdateAction = ((args, context) => {
|
|
130
130
|
{=^ crud.operations.Update.isPublic =}
|
|
131
131
|
throwIfNotAuthenticated(context)
|
|
132
132
|
{=/ crud.operations.Update.isPublic =}
|
|
@@ -148,11 +148,11 @@ export async function updateFn(args, context) {
|
|
|
148
148
|
});
|
|
149
149
|
}
|
|
150
150
|
{=/ crud.operations.Update =}
|
|
151
|
-
|
|
152
151
|
{=# crud.operations.Delete =}
|
|
152
|
+
|
|
153
153
|
// Delete action
|
|
154
154
|
{=^ overrides.Delete.isDefined =}
|
|
155
|
-
const _waspDeleteAction:
|
|
155
|
+
const _waspDeleteAction: RegisteredDeleteAction = ((args, context) => {
|
|
156
156
|
{=^ crud.operations.Delete.isPublic =}
|
|
157
157
|
throwIfNotAuthenticated(context)
|
|
158
158
|
{=/ crud.operations.Delete.isPublic =}
|
|
@@ -181,4 +181,4 @@ function throwIfNotAuthenticated (context) {
|
|
|
181
181
|
{=^ isAuthEnabled =}
|
|
182
182
|
// Auth is not enabled
|
|
183
183
|
{=/ isAuthEnabled =}
|
|
184
|
-
}
|
|
184
|
+
}
|