@wasp.sh/wasp-cli-darwin-x64-unknown 0.20.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 +22 -0
- package/data/Cli/starters/basic/README.md +35 -0
- package/data/Cli/starters/basic/eslint.config.js +24 -0
- package/data/Cli/starters/basic/main.wasp +100 -0
- package/data/Cli/starters/basic/package.json +29 -0
- package/data/Cli/starters/basic/postcss.config.js +6 -0
- package/data/Cli/starters/basic/schema.prisma +42 -0
- package/data/Cli/starters/basic/src/App.css +13 -0
- package/data/Cli/starters/basic/src/App.tsx +12 -0
- package/data/Cli/starters/basic/src/assets/logo.svg +1 -0
- package/data/Cli/starters/basic/src/auth/AuthLayout.tsx +10 -0
- package/data/Cli/starters/basic/src/auth/email/EmailVerificationPage.tsx +19 -0
- package/data/Cli/starters/basic/src/auth/email/LoginPage.tsx +27 -0
- package/data/Cli/starters/basic/src/auth/email/PasswordResetPage.tsx +19 -0
- package/data/Cli/starters/basic/src/auth/email/RequestPasswordResetPage.tsx +10 -0
- package/data/Cli/starters/basic/src/auth/email/SignupPage.tsx +34 -0
- package/data/Cli/starters/basic/src/auth/email/userSignupFields.ts +13 -0
- package/data/Cli/starters/basic/src/shared/components/Button.tsx +90 -0
- package/data/Cli/starters/basic/src/shared/components/Dialog.tsx +85 -0
- package/data/Cli/starters/basic/src/shared/components/Header.tsx +39 -0
- package/data/Cli/starters/basic/src/shared/components/Input.tsx +36 -0
- package/data/Cli/starters/basic/src/shared/components/Portal.tsx +26 -0
- package/data/Cli/starters/basic/src/tags/actions.ts +23 -0
- package/data/Cli/starters/basic/src/tags/components/ColorRadioButton.tsx +44 -0
- package/data/Cli/starters/basic/src/tags/components/ColorRadioButtons.tsx +59 -0
- package/data/Cli/starters/basic/src/tags/components/CreateTagDialog.tsx +50 -0
- package/data/Cli/starters/basic/src/tags/components/CreateTagForm.tsx +100 -0
- package/data/Cli/starters/basic/src/tags/components/TagLabel.tsx +55 -0
- package/data/Cli/starters/basic/src/tags/components/colors.ts +8 -0
- package/data/Cli/starters/basic/src/tags/queries.ts +14 -0
- package/data/Cli/starters/basic/src/tasks/TasksPage.tsx +19 -0
- package/data/Cli/starters/basic/src/tasks/actions.ts +71 -0
- package/data/Cli/starters/basic/src/tasks/components/CreateTaskForm.tsx +103 -0
- package/data/Cli/starters/basic/src/tasks/components/TaskList.tsx +68 -0
- package/data/Cli/starters/basic/src/tasks/components/TaskListItem.tsx +56 -0
- package/data/Cli/starters/basic/src/tasks/queries.ts +21 -0
- package/data/Cli/starters/basic/tailwind.config.js +30 -0
- package/data/Cli/starters/basic/vite.config.ts +7 -0
- package/data/Cli/starters/minimal/main.wasp +14 -0
- package/data/Cli/starters/minimal/package.json +18 -0
- package/data/Cli/starters/minimal/schema.prisma +10 -0
- package/data/Cli/starters/minimal/src/Main.css +103 -0
- package/data/Cli/starters/minimal/src/MainPage.tsx +37 -0
- package/data/Cli/starters/minimal/src/assets/logo.svg +1 -0
- package/data/Cli/starters/minimal/vite.config.ts +7 -0
- package/data/Cli/starters/skeleton/public/favicon.ico +0 -0
- package/data/Cli/starters/skeleton/src/vite-env.d.ts +7 -0
- package/data/Cli/starters/skeleton/tsconfig.json +28 -0
- package/data/Generator/templates/Dockerfile +78 -0
- package/data/Generator/templates/db/schema.prisma +24 -0
- package/data/Generator/templates/dockerignore +2 -0
- package/data/Generator/templates/react-app/README.md +21 -0
- package/data/Generator/templates/react-app/gitignore +23 -0
- package/data/Generator/templates/react-app/index.html +22 -0
- package/data/Generator/templates/react-app/netlify.toml +8 -0
- package/data/Generator/templates/react-app/npmrc +1 -0
- package/data/Generator/templates/react-app/package.json +31 -0
- package/data/Generator/templates/react-app/public/manifest.json +15 -0
- package/data/Generator/templates/react-app/src/auth/pages/OAuthCallback.tsx +93 -0
- package/data/Generator/templates/react-app/src/auth/pages/createAuthRequiredPage.jsx +40 -0
- package/data/Generator/templates/react-app/src/components/DefaultRootErrorBoundary.tsx +16 -0
- package/data/Generator/templates/react-app/src/components/FullPageWrapper.tsx +21 -0
- package/data/Generator/templates/react-app/src/components/Loader.module.css +37 -0
- package/data/Generator/templates/react-app/src/components/Loader.tsx +12 -0
- package/data/Generator/templates/react-app/src/components/Message.tsx +86 -0
- package/data/Generator/templates/react-app/src/index.tsx +47 -0
- package/data/Generator/templates/react-app/src/logo.png +0 -0
- package/data/Generator/templates/react-app/src/router.tsx +59 -0
- package/data/Generator/templates/react-app/src/test/vitest/setup.ts +8 -0
- package/data/Generator/templates/react-app/src/utils.js +3 -0
- package/data/Generator/templates/react-app/src/vite-env.d.ts +1 -0
- package/data/Generator/templates/react-app/tsconfig.app.json +28 -0
- package/data/Generator/templates/react-app/tsconfig.json +11 -0
- package/data/Generator/templates/react-app/tsconfig.vite.json +16 -0
- package/data/Generator/templates/react-app/vite/detectServerImports.ts +53 -0
- package/data/Generator/templates/react-app/vite/validateEnv.ts +45 -0
- package/data/Generator/templates/react-app/vite.config.ts +74 -0
- package/data/Generator/templates/sdk/wasp/api/events.ts +11 -0
- package/data/Generator/templates/sdk/wasp/api/index.ts +136 -0
- package/data/Generator/templates/sdk/wasp/auth/email/actions/login.ts +13 -0
- package/data/Generator/templates/sdk/wasp/auth/email/actions/passwordReset.ts +22 -0
- package/data/Generator/templates/sdk/wasp/auth/email/actions/signup.ts +20 -0
- package/data/Generator/templates/sdk/wasp/auth/email/actions/verifyEmail.ts +14 -0
- package/data/Generator/templates/sdk/wasp/auth/email/index.ts +5 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/Auth.module.css +16 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/Auth.tsx +94 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/ForgotPassword.tsx +18 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/Login.tsx +18 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/ResetPassword.tsx +18 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/Signup.tsx +24 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/VerifyEmail.tsx +18 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.module.css +99 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.tsx +74 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.module.css +22 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.tsx +34 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/auth-styles.css +30 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/common/LoginSignupForm.module.css +55 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/common/LoginSignupForm.tsx +291 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ForgotPasswordForm.tsx +52 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ResetPasswordForm.tsx +82 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/VerifyEmailForm.tsx +43 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/useEmail.ts +33 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.module.css +33 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.tsx +14 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.module.css +4 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.tsx +74 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/usernameAndPassword/useUsernameAndPassword.ts +29 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/util.ts +16 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/types.ts +77 -0
- package/data/Generator/templates/sdk/wasp/auth/helpers/_Provider.tsx +17 -0
- package/data/Generator/templates/sdk/wasp/auth/helpers/user.ts +15 -0
- package/data/Generator/templates/sdk/wasp/auth/index.ts +9 -0
- package/data/Generator/templates/sdk/wasp/auth/jwt.ts +22 -0
- package/data/Generator/templates/sdk/wasp/auth/logout.ts +18 -0
- package/data/Generator/templates/sdk/wasp/auth/lucia.ts +53 -0
- package/data/Generator/templates/sdk/wasp/auth/password.ts +36 -0
- package/data/Generator/templates/sdk/wasp/auth/providers/index.ts +9 -0
- package/data/Generator/templates/sdk/wasp/auth/providers/types.ts +68 -0
- package/data/Generator/templates/sdk/wasp/auth/session.ts +78 -0
- package/data/Generator/templates/sdk/wasp/auth/types.ts +2 -0
- package/data/Generator/templates/sdk/wasp/auth/useAuth.ts +37 -0
- package/data/Generator/templates/sdk/wasp/auth/user.ts +63 -0
- package/data/Generator/templates/sdk/wasp/auth/username/actions/login.ts +13 -0
- package/data/Generator/templates/sdk/wasp/auth/username/actions/signup.ts +20 -0
- package/data/Generator/templates/sdk/wasp/auth/username/index.ts +2 -0
- package/data/Generator/templates/sdk/wasp/auth/utils.ts +369 -0
- package/data/Generator/templates/sdk/wasp/auth/validation.ts +83 -0
- package/data/Generator/templates/sdk/wasp/client/auth/discord.ts +2 -0
- package/data/Generator/templates/sdk/wasp/client/auth/email.ts +5 -0
- package/data/Generator/templates/sdk/wasp/client/auth/github.ts +2 -0
- package/data/Generator/templates/sdk/wasp/client/auth/google.ts +2 -0
- package/data/Generator/templates/sdk/wasp/client/auth/index.ts +29 -0
- package/data/Generator/templates/sdk/wasp/client/auth/keycloak.ts +2 -0
- package/data/Generator/templates/sdk/wasp/client/auth/slack.ts +2 -0
- package/data/Generator/templates/sdk/wasp/client/auth/ui.ts +32 -0
- package/data/Generator/templates/sdk/wasp/client/auth/username.ts +2 -0
- package/data/Generator/templates/sdk/wasp/client/config.ts +15 -0
- package/data/Generator/templates/sdk/wasp/client/crud/_crud.ts +89 -0
- package/data/Generator/templates/sdk/wasp/client/crud/index.ts +4 -0
- package/data/Generator/templates/sdk/wasp/client/crud/operationsHelpers.ts +21 -0
- package/data/Generator/templates/sdk/wasp/client/env/schema.ts +22 -0
- package/data/Generator/templates/sdk/wasp/client/env.ts +5 -0
- package/data/Generator/templates/sdk/wasp/client/hooks.ts +19 -0
- package/data/Generator/templates/sdk/wasp/client/index.ts +17 -0
- package/data/Generator/templates/sdk/wasp/client/operations/actions/core.ts +49 -0
- package/data/Generator/templates/sdk/wasp/client/operations/actions/index.ts +13 -0
- package/data/Generator/templates/sdk/wasp/client/operations/hooks.ts +347 -0
- package/data/Generator/templates/sdk/wasp/client/operations/index.ts +22 -0
- package/data/Generator/templates/sdk/wasp/client/operations/internal/index.ts +22 -0
- package/data/Generator/templates/sdk/wasp/client/operations/internal/resources.js +83 -0
- package/data/Generator/templates/sdk/wasp/client/operations/internal/updateHandlersMap.js +37 -0
- package/data/Generator/templates/sdk/wasp/client/operations/queries/core.ts +91 -0
- package/data/Generator/templates/sdk/wasp/client/operations/queries/index.ts +16 -0
- package/data/Generator/templates/sdk/wasp/client/operations/queryClient.ts +34 -0
- package/data/Generator/templates/sdk/wasp/client/operations/rpc.ts +96 -0
- package/data/Generator/templates/sdk/wasp/client/router/Link.tsx +21 -0
- package/data/Generator/templates/sdk/wasp/client/router/index.ts +53 -0
- package/data/Generator/templates/sdk/wasp/client/router/linkHelpers.ts +48 -0
- package/data/Generator/templates/sdk/wasp/client/router/types.ts +98 -0
- package/data/Generator/templates/sdk/wasp/client/test/index.ts +1 -0
- package/data/Generator/templates/sdk/wasp/client/test/vitest/helpers.tsx +95 -0
- package/data/Generator/templates/sdk/wasp/client/webSocket/WebSocketProvider.tsx +77 -0
- package/data/Generator/templates/sdk/wasp/client/webSocket/index.ts +39 -0
- package/data/Generator/templates/sdk/wasp/core/auth.ts +40 -0
- package/data/Generator/templates/sdk/wasp/core/serialization/custom-register.ts +21 -0
- package/data/Generator/templates/sdk/wasp/core/serialization/index.ts +56 -0
- package/data/Generator/templates/sdk/wasp/core/serialization/prisma.ts +54 -0
- package/data/Generator/templates/sdk/wasp/core/storage.ts +50 -0
- package/data/Generator/templates/sdk/wasp/dev/index.ts +19 -0
- package/data/Generator/templates/sdk/wasp/entities/index.ts +28 -0
- package/data/Generator/templates/sdk/wasp/env/index.ts +9 -0
- package/data/Generator/templates/sdk/wasp/env/validation.ts +38 -0
- package/data/Generator/templates/sdk/wasp/package.json +152 -0
- package/data/Generator/templates/sdk/wasp/prisma-runtime-library.d.ts +17 -0
- package/data/Generator/templates/sdk/wasp/scripts/copy-assets.js +14 -0
- package/data/Generator/templates/sdk/wasp/server/HttpError.ts +30 -0
- package/data/Generator/templates/sdk/wasp/server/_types/index.ts +105 -0
- package/data/Generator/templates/sdk/wasp/server/_types/taggedEntities.ts +26 -0
- package/data/Generator/templates/sdk/wasp/server/api/index.ts +44 -0
- package/data/Generator/templates/sdk/wasp/server/auth/email/index.ts +20 -0
- package/data/Generator/templates/sdk/wasp/server/auth/email/utils.ts +104 -0
- package/data/Generator/templates/sdk/wasp/server/auth/hooks.ts +188 -0
- package/data/Generator/templates/sdk/wasp/server/auth/index.ts +49 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/index.ts +38 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/oneTimeCode.ts +50 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/provider.ts +20 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/discord.ts +22 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/github.ts +20 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/google.ts +22 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/keycloak.ts +23 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/slack.ts +22 -0
- package/data/Generator/templates/sdk/wasp/server/auth/oauth/redirect.ts +43 -0
- package/data/Generator/templates/sdk/wasp/server/auth/user.ts +148 -0
- package/data/Generator/templates/sdk/wasp/server/auth/username.ts +1 -0
- package/data/Generator/templates/sdk/wasp/server/config.ts +47 -0
- package/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts +134 -0
- package/data/Generator/templates/sdk/wasp/server/crud/index.ts +5 -0
- package/data/Generator/templates/sdk/wasp/server/dbClient.ts +35 -0
- package/data/Generator/templates/sdk/wasp/server/email/core/helpers.ts +40 -0
- package/data/Generator/templates/sdk/wasp/server/email/core/index.ts +17 -0
- package/data/Generator/templates/sdk/wasp/server/email/core/providers/dummy.ts +34 -0
- package/data/Generator/templates/sdk/wasp/server/email/core/providers/mailgun.ts +31 -0
- package/data/Generator/templates/sdk/wasp/server/email/core/providers/sendgrid.ts +44 -0
- package/data/Generator/templates/sdk/wasp/server/email/core/providers/smtp.ts +29 -0
- package/data/Generator/templates/sdk/wasp/server/email/core/types.ts +59 -0
- package/data/Generator/templates/sdk/wasp/server/email/index.ts +39 -0
- package/data/Generator/templates/sdk/wasp/server/env.ts +173 -0
- package/data/Generator/templates/sdk/wasp/server/index.ts +17 -0
- package/data/Generator/templates/sdk/wasp/server/jobs/_job.ts +39 -0
- package/data/Generator/templates/sdk/wasp/server/jobs/core/job.ts +28 -0
- package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/index.ts +3 -0
- package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/pgBoss.ts +76 -0
- package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/pgBossJob.ts +230 -0
- package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/types.ts +9 -0
- package/data/Generator/templates/sdk/wasp/server/jobs/index.ts +5 -0
- package/data/Generator/templates/sdk/wasp/server/middleware/globalMiddleware.ts +8 -0
- package/data/Generator/templates/sdk/wasp/server/middleware/index.ts +1 -0
- package/data/Generator/templates/sdk/wasp/server/operations/actions/index.ts +41 -0
- package/data/Generator/templates/sdk/wasp/server/operations/actions/types.ts +35 -0
- package/data/Generator/templates/sdk/wasp/server/operations/index.ts +13 -0
- package/data/Generator/templates/sdk/wasp/server/operations/queries/index.ts +42 -0
- package/data/Generator/templates/sdk/wasp/server/operations/queries/types.ts +36 -0
- package/data/Generator/templates/sdk/wasp/server/operations/wrappers.ts +242 -0
- package/data/Generator/templates/sdk/wasp/server/types/index.ts +11 -0
- package/data/Generator/templates/sdk/wasp/server/utils.ts +38 -0
- package/data/Generator/templates/sdk/wasp/server/webSocket/index.ts +57 -0
- package/data/Generator/templates/sdk/wasp/tsconfig.json +102 -0
- package/data/Generator/templates/sdk/wasp/universal/ansiColors.ts +14 -0
- package/data/Generator/templates/sdk/wasp/universal/predicates.ts +3 -0
- package/data/Generator/templates/sdk/wasp/universal/types.ts +74 -0
- package/data/Generator/templates/sdk/wasp/universal/url.ts +9 -0
- package/data/Generator/templates/sdk/wasp/universal/validators.ts +21 -0
- package/data/Generator/templates/sdk/wasp/vite-env.d.ts +1 -0
- package/data/Generator/templates/server/README.md +1 -0
- package/data/Generator/templates/server/gitignore +6 -0
- package/data/Generator/templates/server/nodemon.json +13 -0
- package/data/Generator/templates/server/npmrc +1 -0
- package/data/Generator/templates/server/package.json +27 -0
- package/data/Generator/templates/server/rollup.config.js +44 -0
- package/data/Generator/templates/server/src/actions/_action.ts +18 -0
- package/data/Generator/templates/server/src/app.js +36 -0
- package/data/Generator/templates/server/src/auth/hooks.ts +135 -0
- package/data/Generator/templates/server/src/auth/providers/config/discord.ts +69 -0
- package/data/Generator/templates/server/src/auth/providers/config/email.ts +96 -0
- package/data/Generator/templates/server/src/auth/providers/config/github.ts +78 -0
- package/data/Generator/templates/server/src/auth/providers/config/google.ts +65 -0
- package/data/Generator/templates/server/src/auth/providers/config/keycloak.ts +67 -0
- package/data/Generator/templates/server/src/auth/providers/config/slack.ts +65 -0
- package/data/Generator/templates/server/src/auth/providers/config/username.ts +33 -0
- package/data/Generator/templates/server/src/auth/providers/email/login.ts +66 -0
- package/data/Generator/templates/server/src/auth/providers/email/requestPasswordReset.ts +74 -0
- package/data/Generator/templates/server/src/auth/providers/email/resetPassword.ts +48 -0
- package/data/Generator/templates/server/src/auth/providers/email/signup.ts +165 -0
- package/data/Generator/templates/server/src/auth/providers/email/verifyEmail.ts +42 -0
- package/data/Generator/templates/server/src/auth/providers/index.ts +32 -0
- package/data/Generator/templates/server/src/auth/providers/oauth/config.ts +19 -0
- package/data/Generator/templates/server/src/auth/providers/oauth/cookies.ts +35 -0
- package/data/Generator/templates/server/src/auth/providers/oauth/handler.ts +130 -0
- package/data/Generator/templates/server/src/auth/providers/oauth/oneTimeCode.ts +39 -0
- package/data/Generator/templates/server/src/auth/providers/oauth/state.ts +144 -0
- package/data/Generator/templates/server/src/auth/providers/oauth/types.ts +7 -0
- package/data/Generator/templates/server/src/auth/providers/oauth/user.ts +139 -0
- package/data/Generator/templates/server/src/auth/providers/username/login.ts +64 -0
- package/data/Generator/templates/server/src/auth/providers/username/signup.ts +59 -0
- package/data/Generator/templates/server/src/crud/_operations.ts +184 -0
- package/data/Generator/templates/server/src/dbSeed.ts +37 -0
- package/data/Generator/templates/server/src/jobs/_job.ts +9 -0
- package/data/Generator/templates/server/src/jobs/core/allJobs.ts +8 -0
- package/data/Generator/templates/server/src/middleware/globalMiddleware.ts +45 -0
- package/data/Generator/templates/server/src/middleware/index.ts +1 -0
- package/data/Generator/templates/server/src/middleware/operations.ts +28 -0
- package/data/Generator/templates/server/src/queries/_query.ts +18 -0
- package/data/Generator/templates/server/src/routes/apis/index.ts +67 -0
- package/data/Generator/templates/server/src/routes/auth/index.js +16 -0
- package/data/Generator/templates/server/src/routes/auth/logout.ts +12 -0
- package/data/Generator/templates/server/src/routes/auth/me.ts +10 -0
- package/data/Generator/templates/server/src/routes/crud/_crud.ts +46 -0
- package/data/Generator/templates/server/src/routes/crud/index.ts +12 -0
- package/data/Generator/templates/server/src/routes/index.js +55 -0
- package/data/Generator/templates/server/src/routes/operations/_action.js +5 -0
- package/data/Generator/templates/server/src/routes/operations/_query.js +5 -0
- package/data/Generator/templates/server/src/routes/operations/index.js +18 -0
- package/data/Generator/templates/server/src/server.ts +76 -0
- package/data/Generator/templates/server/src/views/wrong-port.ts +123 -0
- package/data/Generator/templates/server/src/webSocket/initialization.ts +59 -0
- package/data/Generator/templates/server/tsconfig.json +41 -0
- package/data/Lsp/templates/ts/action.fn.ts +12 -0
- package/data/Lsp/templates/ts/operation.fn.js +7 -0
- package/data/Lsp/templates/ts/page.component.jsx +9 -0
- package/data/Lsp/templates/ts/query.fn.ts +12 -0
- package/data/packages/deploy/dist/common/brandedTypes.js +2 -0
- package/data/packages/deploy/dist/common/clientApp.js +26 -0
- package/data/packages/deploy/dist/common/commander.js +8 -0
- package/data/packages/deploy/dist/common/random.js +5 -0
- package/data/packages/deploy/dist/common/terminal.js +24 -0
- package/data/packages/deploy/dist/common/typeUtils.js +2 -0
- package/data/packages/deploy/dist/common/validation.js +14 -0
- package/data/packages/deploy/dist/common/waspBuild.js +21 -0
- package/data/packages/deploy/dist/common/waspProject.js +43 -0
- package/data/packages/deploy/dist/common/zx.js +10 -0
- package/data/packages/deploy/dist/index.js +30 -0
- package/data/packages/deploy/dist/providers/fly/CommonCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/fly/CommonOps.js +36 -0
- package/data/packages/deploy/dist/providers/fly/DeploymentInstructions.js +12 -0
- package/data/packages/deploy/dist/providers/fly/commands/cmd/CmdCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/fly/commands/cmd/cmd.js +29 -0
- package/data/packages/deploy/dist/providers/fly/commands/createDb/CreateDbCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/fly/commands/createDb/createDb.js +55 -0
- package/data/packages/deploy/dist/providers/fly/commands/deploy/DeployCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/fly/commands/deploy/deploy.js +88 -0
- package/data/packages/deploy/dist/providers/fly/commands/launch/LaunchCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/fly/commands/launch/launch.js +17 -0
- package/data/packages/deploy/dist/providers/fly/commands/setup/SetupCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/fly/commands/setup/setup.js +141 -0
- package/data/packages/deploy/dist/providers/fly/flyAppUrl.js +4 -0
- package/data/packages/deploy/dist/providers/fly/flyCli.js +74 -0
- package/data/packages/deploy/dist/providers/fly/index.js +121 -0
- package/data/packages/deploy/dist/providers/fly/jsonOutputSchemas.js +37 -0
- package/data/packages/deploy/dist/providers/fly/tomlFile.js +65 -0
- package/data/packages/deploy/dist/providers/railway/DeploymentInstructions.js +11 -0
- package/data/packages/deploy/dist/providers/railway/brandedTypes.js +2 -0
- package/data/packages/deploy/dist/providers/railway/commands/deploy/DeployCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/railway/commands/deploy/client.js +22 -0
- package/data/packages/deploy/dist/providers/railway/commands/deploy/common.js +40 -0
- package/data/packages/deploy/dist/providers/railway/commands/deploy/index.js +57 -0
- package/data/packages/deploy/dist/providers/railway/commands/deploy/server.js +17 -0
- package/data/packages/deploy/dist/providers/railway/commands/launch/LaunchCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/railway/commands/launch/launch.js +9 -0
- package/data/packages/deploy/dist/providers/railway/commands/setup/SetupCmdOptions.js +2 -0
- package/data/packages/deploy/dist/providers/railway/commands/setup/setup.js +146 -0
- package/data/packages/deploy/dist/providers/railway/index.js +83 -0
- package/data/packages/deploy/dist/providers/railway/jsonOutputSchemas.js +19 -0
- package/data/packages/deploy/dist/providers/railway/ports.js +6 -0
- package/data/packages/deploy/dist/providers/railway/railwayCli.js +85 -0
- package/data/packages/deploy/dist/providers/railway/railwayProject/RailwayProject.js +14 -0
- package/data/packages/deploy/dist/providers/railway/railwayProject/cli.js +80 -0
- package/data/packages/deploy/dist/providers/railway/railwayProject/index.js +48 -0
- package/data/packages/deploy/dist/providers/railway/railwayService/nameGenerator.js +24 -0
- package/data/packages/deploy/dist/providers/railway/railwayService/url.js +32 -0
- package/data/packages/deploy/package-lock.json +3536 -0
- package/data/packages/deploy/package.json +29 -0
- package/data/packages/prisma/dist/format.js +35 -0
- package/data/packages/prisma/dist/index.js +33 -0
- package/data/packages/prisma/package-lock.json +5101 -0
- package/data/packages/prisma/package.json +30 -0
- package/data/packages/studio/dist/index.js +48 -0
- package/data/packages/studio/dist/public/assets/Flow-b5112d3d.js +26 -0
- package/data/packages/studio/dist/public/assets/index-17ce6ed4.css +1 -0
- package/data/packages/studio/dist/public/assets/index-62a9d21a.js +120 -0
- package/data/packages/studio/dist/public/index.html +14 -0
- package/data/packages/studio/package-lock.json +1866 -0
- package/data/packages/studio/package.json +33 -0
- package/data/packages/ts-inspect/dist/exports.js +82 -0
- package/data/packages/ts-inspect/dist/index.js +28 -0
- package/data/packages/ts-inspect/package-lock.json +4947 -0
- package/data/packages/ts-inspect/package.json +31 -0
- package/data/packages/wasp-config/dist/__tests__/appAnalyzer.unit.test.d.ts +2 -0
- package/data/packages/wasp-config/dist/__tests__/appAnalyzer.unit.test.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/__tests__/appAnalyzer.unit.test.js +59 -0
- package/data/packages/wasp-config/dist/__tests__/cli.unit.test.d.ts +2 -0
- package/data/packages/wasp-config/dist/__tests__/cli.unit.test.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/__tests__/cli.unit.test.js +65 -0
- package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.integration.test.d.ts +2 -0
- package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.integration.test.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.integration.test.js +126 -0
- package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.unit.test.d.ts +2 -0
- package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.unit.test.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.unit.test.js +743 -0
- package/data/packages/wasp-config/dist/__tests__/testFixtures.d.ts +224 -0
- package/data/packages/wasp-config/dist/__tests__/testFixtures.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/__tests__/testFixtures.js +656 -0
- package/data/packages/wasp-config/dist/__tests__/testFixtures.test-d.d.ts +2 -0
- package/data/packages/wasp-config/dist/__tests__/testFixtures.test-d.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/__tests__/testFixtures.test-d.js +57 -0
- package/data/packages/wasp-config/dist/src/_private.d.ts +2 -0
- package/data/packages/wasp-config/dist/src/_private.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/_private.js +1 -0
- package/data/packages/wasp-config/dist/src/appAnalyzer.d.ts +16 -0
- package/data/packages/wasp-config/dist/src/appAnalyzer.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/appAnalyzer.js +34 -0
- package/data/packages/wasp-config/dist/src/appSpec.d.ts +223 -0
- package/data/packages/wasp-config/dist/src/appSpec.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/appSpec.js +6 -0
- package/data/packages/wasp-config/dist/src/branded.d.ts +7 -0
- package/data/packages/wasp-config/dist/src/branded.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/branded.js +1 -0
- package/data/packages/wasp-config/dist/src/cli.d.ts +6 -0
- package/data/packages/wasp-config/dist/src/cli.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/cli.js +24 -0
- package/data/packages/wasp-config/dist/src/index.d.ts +8 -0
- package/data/packages/wasp-config/dist/src/index.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/index.js +1 -0
- package/data/packages/wasp-config/dist/src/mapTsAppSpecToAppSpecDecls.d.ts +38 -0
- package/data/packages/wasp-config/dist/src/mapTsAppSpecToAppSpecDecls.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/mapTsAppSpecToAppSpecDecls.js +294 -0
- package/data/packages/wasp-config/dist/src/publicApi/App.d.ts +24 -0
- package/data/packages/wasp-config/dist/src/publicApi/App.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/publicApi/App.js +75 -0
- package/data/packages/wasp-config/dist/src/publicApi/tsAppSpec.d.ts +171 -0
- package/data/packages/wasp-config/dist/src/publicApi/tsAppSpec.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/publicApi/tsAppSpec.js +1 -0
- package/data/packages/wasp-config/dist/src/run.d.ts +3 -0
- package/data/packages/wasp-config/dist/src/run.d.ts.map +1 -0
- package/data/packages/wasp-config/dist/src/run.js +18 -0
- package/data/packages/wasp-config/package-lock.json +3992 -0
- package/data/packages/wasp-config/package.json +39 -0
- package/main.js +9 -0
- package/package.json +1 -0
- package/readme.md +3 -0
- package/wasp-bin +0 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
|
|
3
|
+
import type { ProviderConfig } from "wasp/auth/providers/types";
|
|
4
|
+
import { keycloak } from "wasp/server/auth";
|
|
5
|
+
import { env } from "wasp/server";
|
|
6
|
+
import { mergeDefaultAndUserConfig } from "../oauth/config.js";
|
|
7
|
+
import { createOAuthProviderRouter } from "../oauth/handler.js";
|
|
8
|
+
|
|
9
|
+
{=# userSignupFields.isDefined =}
|
|
10
|
+
{=& userSignupFields.importStatement =}
|
|
11
|
+
const _waspUserSignupFields = {= userSignupFields.importIdentifier =}
|
|
12
|
+
{=/ userSignupFields.isDefined =}
|
|
13
|
+
{=^ userSignupFields.isDefined =}
|
|
14
|
+
const _waspUserSignupFields = undefined
|
|
15
|
+
{=/ userSignupFields.isDefined =}
|
|
16
|
+
{=# configFn.isDefined =}
|
|
17
|
+
{=& configFn.importStatement =}
|
|
18
|
+
const _waspUserDefinedConfigFn = {= configFn.importIdentifier =}
|
|
19
|
+
{=/ configFn.isDefined =}
|
|
20
|
+
{=^ configFn.isDefined =}
|
|
21
|
+
const _waspUserDefinedConfigFn = undefined
|
|
22
|
+
{=/ configFn.isDefined =}
|
|
23
|
+
|
|
24
|
+
const _waspConfig: ProviderConfig = {
|
|
25
|
+
id: keycloak.id,
|
|
26
|
+
displayName: keycloak.displayName,
|
|
27
|
+
createRouter(provider) {
|
|
28
|
+
const config = mergeDefaultAndUserConfig({
|
|
29
|
+
scopes: {=& requiredScopes =},
|
|
30
|
+
}, _waspUserDefinedConfigFn);
|
|
31
|
+
|
|
32
|
+
async function getKeycloakProfile(accessToken: string): Promise<{
|
|
33
|
+
providerProfile: unknown;
|
|
34
|
+
providerUserId: string;
|
|
35
|
+
}> {
|
|
36
|
+
const userInfoEndpoint = `${env.KEYCLOAK_REALM_URL}/protocol/openid-connect/userinfo`;
|
|
37
|
+
const response = await fetch(
|
|
38
|
+
userInfoEndpoint,
|
|
39
|
+
{
|
|
40
|
+
headers: {
|
|
41
|
+
Authorization: `Bearer ${accessToken}`,
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
const providerProfile = (await response.json()) as {
|
|
46
|
+
sub?: string;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
if (!providerProfile.sub) {
|
|
50
|
+
throw new Error("Invalid profile");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return { providerProfile, providerUserId: providerProfile.sub };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return createOAuthProviderRouter({
|
|
57
|
+
provider,
|
|
58
|
+
oAuthType: 'OAuth2WithPKCE',
|
|
59
|
+
userSignupFields: _waspUserSignupFields,
|
|
60
|
+
getAuthorizationUrl: ({ state, codeVerifier }) => keycloak.oAuthClient.createAuthorizationURL(state, codeVerifier, config),
|
|
61
|
+
getProviderTokens: ({ code, codeVerifier }) => keycloak.oAuthClient.validateAuthorizationCode(code, codeVerifier),
|
|
62
|
+
getProviderInfo: ({ accessToken }) => getKeycloakProfile(accessToken),
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export default _waspConfig;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import type { ProviderConfig } from "wasp/auth/providers/types";
|
|
3
|
+
import { slack } from "wasp/server/auth";
|
|
4
|
+
import { mergeDefaultAndUserConfig } from "../oauth/config.js";
|
|
5
|
+
import { createOAuthProviderRouter } from "../oauth/handler.js";
|
|
6
|
+
|
|
7
|
+
{=# userSignupFields.isDefined =}
|
|
8
|
+
{=& userSignupFields.importStatement =}
|
|
9
|
+
const _waspUserSignupFields = {= userSignupFields.importIdentifier =}
|
|
10
|
+
{=/ userSignupFields.isDefined =}
|
|
11
|
+
{=^ userSignupFields.isDefined =}
|
|
12
|
+
const _waspUserSignupFields = undefined
|
|
13
|
+
{=/ userSignupFields.isDefined =}
|
|
14
|
+
{=# configFn.isDefined =}
|
|
15
|
+
{=& configFn.importStatement =}
|
|
16
|
+
const _waspUserDefinedConfigFn = {= configFn.importIdentifier =}
|
|
17
|
+
{=/ configFn.isDefined =}
|
|
18
|
+
{=^ configFn.isDefined =}
|
|
19
|
+
const _waspUserDefinedConfigFn = undefined
|
|
20
|
+
{=/ configFn.isDefined =}
|
|
21
|
+
|
|
22
|
+
const _waspConfig: ProviderConfig = {
|
|
23
|
+
id: slack.id,
|
|
24
|
+
displayName: slack.displayName,
|
|
25
|
+
createRouter(provider) {
|
|
26
|
+
const config = mergeDefaultAndUserConfig({
|
|
27
|
+
scopes: {=& requiredScopes =},
|
|
28
|
+
}, _waspUserDefinedConfigFn);
|
|
29
|
+
|
|
30
|
+
async function getSlackProfile(accessToken: string): Promise<{
|
|
31
|
+
providerProfile: unknown;
|
|
32
|
+
providerUserId: string;
|
|
33
|
+
}> {
|
|
34
|
+
const response = await fetch("https://slack.com/api/openid.connect.userInfo", {
|
|
35
|
+
headers: {
|
|
36
|
+
Authorization: `Bearer ${accessToken}`,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const providerProfile = (await response.json()) as {
|
|
41
|
+
sub?: string;
|
|
42
|
+
email?: string;
|
|
43
|
+
name?: string;
|
|
44
|
+
picture?: string;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
if (!providerProfile.sub) {
|
|
48
|
+
throw new Error("Invalid profile");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return { providerProfile, providerUserId: providerProfile.sub };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return createOAuthProviderRouter({
|
|
55
|
+
provider,
|
|
56
|
+
oAuthType: 'OAuth2',
|
|
57
|
+
userSignupFields: _waspUserSignupFields,
|
|
58
|
+
getAuthorizationUrl: ({ state }) => slack.oAuthClient.createAuthorizationURL(state, config),
|
|
59
|
+
getProviderTokens: ({ code }) => slack.oAuthClient.validateAuthorizationCode(code),
|
|
60
|
+
getProviderInfo: ({ accessToken }) => getSlackProfile(accessToken),
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default _waspConfig;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
|
|
3
|
+
import { Router } from "express";
|
|
4
|
+
|
|
5
|
+
import login from "../username/login.js";
|
|
6
|
+
import { getSignupRoute } from "../username/signup.js";
|
|
7
|
+
import { ProviderConfig } from "wasp/auth/providers/types";
|
|
8
|
+
|
|
9
|
+
{=# userSignupFields.isDefined =}
|
|
10
|
+
{=& userSignupFields.importStatement =}
|
|
11
|
+
const _waspUserSignupFields = {= userSignupFields.importIdentifier =}
|
|
12
|
+
{=/ userSignupFields.isDefined =}
|
|
13
|
+
{=^ userSignupFields.isDefined =}
|
|
14
|
+
const _waspUserSignupFields = undefined
|
|
15
|
+
{=/ userSignupFields.isDefined =}
|
|
16
|
+
|
|
17
|
+
const config: ProviderConfig = {
|
|
18
|
+
id: "{= providerId =}",
|
|
19
|
+
displayName: "{= displayName =}",
|
|
20
|
+
createRouter() {
|
|
21
|
+
const router = Router();
|
|
22
|
+
|
|
23
|
+
router.post('/login', login);
|
|
24
|
+
const signupRoute = getSignupRoute({
|
|
25
|
+
userSignupFields: _waspUserSignupFields,
|
|
26
|
+
});
|
|
27
|
+
router.post('/signup', signupRoute);
|
|
28
|
+
|
|
29
|
+
return router;
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default config;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { createInvalidCredentialsError } from 'wasp/auth/utils'
|
|
3
|
+
import { verifyPassword } from 'wasp/auth/password'
|
|
4
|
+
import {
|
|
5
|
+
createProviderId,
|
|
6
|
+
findAuthIdentity,
|
|
7
|
+
findAuthWithUserBy,
|
|
8
|
+
getProviderDataWithPassword,
|
|
9
|
+
} from 'wasp/auth/utils'
|
|
10
|
+
import { createSession } from 'wasp/auth/session'
|
|
11
|
+
import { ensureValidEmail, ensurePasswordIsPresent } from 'wasp/auth/validation'
|
|
12
|
+
import { onBeforeLoginHook, onAfterLoginHook } from '../../hooks.js';
|
|
13
|
+
|
|
14
|
+
export function getLoginRoute() {
|
|
15
|
+
return async function login(
|
|
16
|
+
req: Request<{ email: string; password: string; }>,
|
|
17
|
+
res: Response,
|
|
18
|
+
): Promise<void> {
|
|
19
|
+
const fields = req.body ?? {}
|
|
20
|
+
ensureValidArgs(fields)
|
|
21
|
+
|
|
22
|
+
const providerId = createProviderId("email", fields.email)
|
|
23
|
+
const authIdentity = await findAuthIdentity(providerId)
|
|
24
|
+
if (!authIdentity) {
|
|
25
|
+
throw createInvalidCredentialsError()
|
|
26
|
+
}
|
|
27
|
+
const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData)
|
|
28
|
+
if (!providerData.isEmailVerified) {
|
|
29
|
+
throw createInvalidCredentialsError()
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await verifyPassword(providerData.hashedPassword, fields.password);
|
|
33
|
+
} catch(e) {
|
|
34
|
+
throw createInvalidCredentialsError()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const auth = await findAuthWithUserBy({ id: authIdentity.authId })
|
|
38
|
+
|
|
39
|
+
if (auth === null) {
|
|
40
|
+
throw createInvalidCredentialsError()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
await onBeforeLoginHook({
|
|
44
|
+
req,
|
|
45
|
+
providerId,
|
|
46
|
+
user: auth.user,
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
const session = await createSession(auth.id)
|
|
50
|
+
|
|
51
|
+
await onAfterLoginHook({
|
|
52
|
+
req,
|
|
53
|
+
providerId,
|
|
54
|
+
user: auth.user,
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
res.json({
|
|
58
|
+
sessionId: session.id,
|
|
59
|
+
})
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function ensureValidArgs(args: object): void {
|
|
64
|
+
ensureValidEmail(args);
|
|
65
|
+
ensurePasswordIsPresent(args);
|
|
66
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import {
|
|
3
|
+
createProviderId,
|
|
4
|
+
findAuthIdentity,
|
|
5
|
+
doFakeWork,
|
|
6
|
+
getProviderDataWithPassword,
|
|
7
|
+
} from 'wasp/auth/utils';
|
|
8
|
+
import {
|
|
9
|
+
createPasswordResetLink,
|
|
10
|
+
sendPasswordResetEmail,
|
|
11
|
+
isEmailResendAllowed,
|
|
12
|
+
} from "wasp/server/auth/email/utils";
|
|
13
|
+
import { ensureValidEmail } from 'wasp/auth/validation';
|
|
14
|
+
import type { EmailFromField } from 'wasp/server/email/core/types';
|
|
15
|
+
import { GetPasswordResetEmailContentFn } from 'wasp/server/auth/email';
|
|
16
|
+
import { HttpError } from 'wasp/server';
|
|
17
|
+
|
|
18
|
+
export function getRequestPasswordResetRoute({
|
|
19
|
+
fromField,
|
|
20
|
+
clientRoute,
|
|
21
|
+
getPasswordResetEmailContent,
|
|
22
|
+
}: {
|
|
23
|
+
fromField: EmailFromField;
|
|
24
|
+
clientRoute: string;
|
|
25
|
+
getPasswordResetEmailContent: GetPasswordResetEmailContentFn;
|
|
26
|
+
}) {
|
|
27
|
+
return async function requestPasswordReset(
|
|
28
|
+
req: Request<{ email: string; }>,
|
|
29
|
+
res: Response,
|
|
30
|
+
): Promise<void> {
|
|
31
|
+
const args = req.body ?? {};
|
|
32
|
+
ensureValidEmail(args);
|
|
33
|
+
|
|
34
|
+
const authIdentity = await findAuthIdentity(
|
|
35
|
+
createProviderId("email", args.email),
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* By doing fake work, we make it harder to enumerate users by measuring
|
|
40
|
+
* the time it takes to respond. If we would respond immediately, an attacker
|
|
41
|
+
* could measure the time it takes to respond and figure out if the user exists.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
if (!authIdentity) {
|
|
45
|
+
await doFakeWork();
|
|
46
|
+
res.json({ success: true });
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData);
|
|
51
|
+
const { isResendAllowed, timeLeft } = isEmailResendAllowed(providerData, 'passwordResetSentAt');
|
|
52
|
+
if (!isResendAllowed) {
|
|
53
|
+
throw new HttpError(400, `Please wait ${timeLeft} secs before trying again.`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const passwordResetLink = await createPasswordResetLink(args.email, clientRoute);
|
|
57
|
+
try {
|
|
58
|
+
const email = authIdentity.providerUserId
|
|
59
|
+
await sendPasswordResetEmail(
|
|
60
|
+
email,
|
|
61
|
+
{
|
|
62
|
+
from: fromField,
|
|
63
|
+
to: email,
|
|
64
|
+
...getPasswordResetEmailContent({ passwordResetLink }),
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
} catch (e: any) {
|
|
68
|
+
console.error("Failed to send password reset email:", e);
|
|
69
|
+
throw new HttpError(500, "Failed to send password reset email.");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
res.json({ success: true });
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import {
|
|
3
|
+
createProviderId,
|
|
4
|
+
findAuthIdentity,
|
|
5
|
+
updateAuthIdentityProviderData,
|
|
6
|
+
getProviderDataWithPassword,
|
|
7
|
+
} from 'wasp/auth/utils';
|
|
8
|
+
import { validateJWT } from 'wasp/auth/jwt'
|
|
9
|
+
import { ensureTokenIsPresent, ensurePasswordIsPresent, ensureValidPassword } from 'wasp/auth/validation';
|
|
10
|
+
import { HttpError } from 'wasp/server';
|
|
11
|
+
|
|
12
|
+
export async function resetPassword(
|
|
13
|
+
req: Request<{ token: string; password: string; }>,
|
|
14
|
+
res: Response,
|
|
15
|
+
): Promise<void> {
|
|
16
|
+
const args = req.body ?? {};
|
|
17
|
+
ensureValidArgs(args);
|
|
18
|
+
|
|
19
|
+
const { token, password } = args;
|
|
20
|
+
const { email } = await validateJWT<{ email: string }>(token)
|
|
21
|
+
.catch(() => {
|
|
22
|
+
throw new HttpError(400, "Password reset failed, invalid token");
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const providerId = createProviderId('email', email);
|
|
26
|
+
const authIdentity = await findAuthIdentity(providerId);
|
|
27
|
+
if (!authIdentity) {
|
|
28
|
+
throw new HttpError(400, "Password reset failed, invalid token");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData);
|
|
32
|
+
|
|
33
|
+
await updateAuthIdentityProviderData(providerId, providerData, {
|
|
34
|
+
// The act of resetting the password verifies the email
|
|
35
|
+
isEmailVerified: true,
|
|
36
|
+
// The password will be hashed when saving the providerData
|
|
37
|
+
// in the DB
|
|
38
|
+
hashedPassword: password,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
res.json({ success: true });
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
function ensureValidArgs(args: object): void {
|
|
45
|
+
ensureTokenIsPresent(args);
|
|
46
|
+
ensurePasswordIsPresent(args);
|
|
47
|
+
ensureValidPassword(args);
|
|
48
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Request, Response } from 'express'
|
|
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
|
+
import {
|
|
15
|
+
ensurePasswordIsPresent,
|
|
16
|
+
ensureValidEmail,
|
|
17
|
+
ensureValidPassword,
|
|
18
|
+
} from 'wasp/auth/validation'
|
|
19
|
+
import { HttpError } from 'wasp/server'
|
|
20
|
+
import { GetVerificationEmailContentFn } from 'wasp/server/auth/email'
|
|
21
|
+
import {
|
|
22
|
+
createEmailVerificationLink,
|
|
23
|
+
isEmailResendAllowed,
|
|
24
|
+
sendEmailVerificationEmail,
|
|
25
|
+
} from 'wasp/server/auth/email/utils'
|
|
26
|
+
import { EmailFromField } from 'wasp/server/email/core/types'
|
|
27
|
+
import { onAfterSignupHook, onBeforeSignupHook } from '../../hooks.js'
|
|
28
|
+
|
|
29
|
+
export function getSignupRoute({
|
|
30
|
+
userSignupFields,
|
|
31
|
+
fromField,
|
|
32
|
+
clientRoute,
|
|
33
|
+
getVerificationEmailContent,
|
|
34
|
+
isEmailAutoVerified,
|
|
35
|
+
}: {
|
|
36
|
+
userSignupFields?: UserSignupFields
|
|
37
|
+
fromField: EmailFromField
|
|
38
|
+
clientRoute: string
|
|
39
|
+
getVerificationEmailContent: GetVerificationEmailContentFn
|
|
40
|
+
isEmailAutoVerified: boolean
|
|
41
|
+
}) {
|
|
42
|
+
return async function signup(
|
|
43
|
+
req: Request<{ email: string; password: string }>,
|
|
44
|
+
res: Response,
|
|
45
|
+
): Promise<void> {
|
|
46
|
+
const fields = req.body
|
|
47
|
+
ensureValidArgs(fields)
|
|
48
|
+
|
|
49
|
+
const providerId = createProviderId('email', fields.email)
|
|
50
|
+
const existingAuthIdentity = await findAuthIdentity(providerId)
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
*
|
|
54
|
+
* There are two cases to consider in the case of an existing user:
|
|
55
|
+
* - if we allow unverified login
|
|
56
|
+
* - if the user is already verified
|
|
57
|
+
*
|
|
58
|
+
* Let's see what happens when we **don't** allow unverified login:
|
|
59
|
+
*
|
|
60
|
+
* We are handling the case of an existing auth identity in two ways:
|
|
61
|
+
*
|
|
62
|
+
* 1. If the user already exists and is verified, we don't want
|
|
63
|
+
* to leak that piece of info and instead we pretend that the user
|
|
64
|
+
* was created successfully.
|
|
65
|
+
* - This prevents the attacker from learning which emails already have
|
|
66
|
+
* an account created.
|
|
67
|
+
*
|
|
68
|
+
* 2. If the user is not verified:
|
|
69
|
+
* - We check when we last sent a verification email and if it was less than X seconds ago,
|
|
70
|
+
* we don't send another one.
|
|
71
|
+
* - If it was more than X seconds ago, we delete the user and create a new one.
|
|
72
|
+
* - This prevents the attacker from creating an account with somebody
|
|
73
|
+
* else's email address and therefore permanently making that email
|
|
74
|
+
* address unavailable for later account creation (by real owner).
|
|
75
|
+
*/
|
|
76
|
+
if (existingAuthIdentity) {
|
|
77
|
+
const providerData = getProviderDataWithPassword<'email'>(
|
|
78
|
+
existingAuthIdentity.providerData,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
// TOOD: faking work makes sense if the time spent on faking the work matches the time
|
|
82
|
+
// it would take to send the email. Atm, the fake work takes obviously longer than sending
|
|
83
|
+
// the email!
|
|
84
|
+
if (providerData.isEmailVerified) {
|
|
85
|
+
await doFakeWork()
|
|
86
|
+
res.json({ success: true })
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// TODO: we are still leaking information here since when we are faking work
|
|
91
|
+
// we are not checking if the email was sent or not!
|
|
92
|
+
const { isResendAllowed, timeLeft } = isEmailResendAllowed(
|
|
93
|
+
providerData,
|
|
94
|
+
'passwordResetSentAt',
|
|
95
|
+
)
|
|
96
|
+
if (!isResendAllowed) {
|
|
97
|
+
throw new HttpError(
|
|
98
|
+
400,
|
|
99
|
+
`Please wait ${timeLeft} secs before trying again.`,
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
await deleteUserByAuthId(existingAuthIdentity.authId)
|
|
105
|
+
} catch (e: unknown) {
|
|
106
|
+
rethrowPossibleAuthError(e)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const userFields = await validateAndGetUserFields(fields, userSignupFields)
|
|
111
|
+
|
|
112
|
+
const newUserProviderData = await sanitizeAndSerializeProviderData<'email'>(
|
|
113
|
+
{
|
|
114
|
+
hashedPassword: fields.password,
|
|
115
|
+
isEmailVerified: isEmailAutoVerified ? true : false,
|
|
116
|
+
emailVerificationSentAt: null,
|
|
117
|
+
passwordResetSentAt: null,
|
|
118
|
+
},
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
await onBeforeSignupHook({ req, providerId })
|
|
123
|
+
const user = await createUser(
|
|
124
|
+
providerId,
|
|
125
|
+
newUserProviderData,
|
|
126
|
+
// Using any here because we want to avoid TypeScript errors and
|
|
127
|
+
// rely on Prisma to validate the data.
|
|
128
|
+
userFields as any,
|
|
129
|
+
)
|
|
130
|
+
await onAfterSignupHook({ req, providerId, user })
|
|
131
|
+
} catch (e: unknown) {
|
|
132
|
+
rethrowPossibleAuthError(e)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Wasp allows for auto-verification of emails in development mode to
|
|
136
|
+
// make writing e2e tests easier.
|
|
137
|
+
if (isEmailAutoVerified) {
|
|
138
|
+
res.json({ success: true })
|
|
139
|
+
return
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const verificationLink = await createEmailVerificationLink(
|
|
143
|
+
fields.email,
|
|
144
|
+
clientRoute,
|
|
145
|
+
)
|
|
146
|
+
try {
|
|
147
|
+
await sendEmailVerificationEmail(fields.email, {
|
|
148
|
+
from: fromField,
|
|
149
|
+
to: fields.email,
|
|
150
|
+
...getVerificationEmailContent({ verificationLink }),
|
|
151
|
+
})
|
|
152
|
+
} catch (e: unknown) {
|
|
153
|
+
console.error('Failed to send email verification email:', e)
|
|
154
|
+
throw new HttpError(500, 'Failed to send email verification email.')
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
res.json({ success: true })
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function ensureValidArgs(args: object): void {
|
|
162
|
+
ensureValidEmail(args)
|
|
163
|
+
ensurePasswordIsPresent(args)
|
|
164
|
+
ensureValidPassword(args)
|
|
165
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { validateJWT } from 'wasp/auth/jwt';
|
|
3
|
+
import {
|
|
4
|
+
createProviderId,
|
|
5
|
+
findAuthIdentity,
|
|
6
|
+
findAuthWithUserBy,
|
|
7
|
+
getProviderDataWithPassword,
|
|
8
|
+
updateAuthIdentityProviderData,
|
|
9
|
+
} from 'wasp/auth/utils';
|
|
10
|
+
import { HttpError } from 'wasp/server';
|
|
11
|
+
import { onAfterEmailVerifiedHook } from '../../hooks.js';
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
export async function verifyEmail(
|
|
15
|
+
req: Request<{ token: string }>,
|
|
16
|
+
res: Response,
|
|
17
|
+
): Promise<void> {
|
|
18
|
+
const { token } = req.body;
|
|
19
|
+
const { email } = await validateJWT<{ email: string }>(token)
|
|
20
|
+
.catch(() => {
|
|
21
|
+
throw new HttpError(400, "Email verification failed, invalid token");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const providerId = createProviderId('email', email);
|
|
25
|
+
const authIdentity = await findAuthIdentity(providerId);
|
|
26
|
+
if (!authIdentity) {
|
|
27
|
+
throw new HttpError(400, "Email verification failed, invalid token");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData);
|
|
31
|
+
|
|
32
|
+
await updateAuthIdentityProviderData(providerId, providerData, {
|
|
33
|
+
isEmailVerified: true,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const auth = await findAuthWithUserBy({ id: authIdentity.authId })
|
|
37
|
+
|
|
38
|
+
await onAfterEmailVerifiedHook({ req, email, user: auth.user });
|
|
39
|
+
|
|
40
|
+
res.json({ success: true });
|
|
41
|
+
};
|
|
42
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { Router } from "express";
|
|
3
|
+
{=# isExternalAuthEnabled =}
|
|
4
|
+
import { setupOneTimeCodeRoute } from "./oauth/oneTimeCode";
|
|
5
|
+
{=/ isExternalAuthEnabled =}
|
|
6
|
+
|
|
7
|
+
{=# providers =}
|
|
8
|
+
{=& importStatement =}
|
|
9
|
+
{=/ providers =}
|
|
10
|
+
|
|
11
|
+
const providers = [
|
|
12
|
+
{=# providers =}
|
|
13
|
+
{= importIdentifier =},
|
|
14
|
+
{=/ providers =}
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const router = Router();
|
|
18
|
+
|
|
19
|
+
{=# isExternalAuthEnabled =}
|
|
20
|
+
// Setting up a common route for all OAuth providers to exchange
|
|
21
|
+
// one-time code for a session.
|
|
22
|
+
setupOneTimeCodeRoute(router);
|
|
23
|
+
{=/ isExternalAuthEnabled =}
|
|
24
|
+
|
|
25
|
+
for (const provider of providers) {
|
|
26
|
+
const { createRouter } = provider;
|
|
27
|
+
const providerRouter = createRouter(provider);
|
|
28
|
+
router.use(`/${provider.id}`, providerRouter);
|
|
29
|
+
console.log(`🚀 "${provider.displayName}" auth initialized`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default router;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function mergeDefaultAndUserConfig<DefaultConfig extends object, UserConfig extends object>(
|
|
2
|
+
defaultConfig: DefaultConfig,
|
|
3
|
+
userConfigFn: () => UserConfig,
|
|
4
|
+
): DefaultConfig & UserConfig;
|
|
5
|
+
export function mergeDefaultAndUserConfig<DefaultConfig extends object, UserConfig extends object>(
|
|
6
|
+
defaultConfig: DefaultConfig
|
|
7
|
+
): DefaultConfig;
|
|
8
|
+
export function mergeDefaultAndUserConfig<DefaultConfig extends object, UserConfig extends object>(
|
|
9
|
+
defaultConfig: DefaultConfig,
|
|
10
|
+
userConfigFn?: () => UserConfig,
|
|
11
|
+
): DefaultConfig {
|
|
12
|
+
if (!userConfigFn) {
|
|
13
|
+
return defaultConfig;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
...defaultConfig,
|
|
17
|
+
...userConfigFn(),
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Request as ExpressRequest,
|
|
3
|
+
Response as ExpressResponse,
|
|
4
|
+
} from 'express';
|
|
5
|
+
import { parseCookies } from 'oslo/cookie';
|
|
6
|
+
|
|
7
|
+
import type { ProviderConfig } from 'wasp/auth/providers/types';
|
|
8
|
+
import { config } from 'wasp/server';
|
|
9
|
+
|
|
10
|
+
import type { OAuthStateFieldName } from './state';
|
|
11
|
+
|
|
12
|
+
export function setOAuthCookieValue(
|
|
13
|
+
provider: ProviderConfig,
|
|
14
|
+
res: ExpressResponse,
|
|
15
|
+
fieldName: OAuthStateFieldName,
|
|
16
|
+
value: string,
|
|
17
|
+
): void {
|
|
18
|
+
const cookieName = `${provider.id}_${fieldName}`;
|
|
19
|
+
res.cookie(cookieName, value, {
|
|
20
|
+
httpOnly: true,
|
|
21
|
+
secure: !config.isDevelopment,
|
|
22
|
+
path: "/",
|
|
23
|
+
maxAge: 60 * 60 * 1000, // 1 hour
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function getOAuthCookieValue(
|
|
28
|
+
provider: ProviderConfig,
|
|
29
|
+
req: ExpressRequest,
|
|
30
|
+
fieldName: OAuthStateFieldName,
|
|
31
|
+
): string {
|
|
32
|
+
const cookieName = `${provider.id}_${fieldName}`;
|
|
33
|
+
const cookies = parseCookies(req.headers.cookie ?? "");
|
|
34
|
+
return cookies.get(cookieName);
|
|
35
|
+
}
|