@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,130 @@
|
|
|
1
|
+
import { Router } from 'express'
|
|
2
|
+
|
|
3
|
+
import { defineHandler, redirect } from 'wasp/server/utils'
|
|
4
|
+
import { rethrowPossibleAuthError } from 'wasp/auth/utils'
|
|
5
|
+
import {
|
|
6
|
+
type UserSignupFields,
|
|
7
|
+
type ProviderConfig,
|
|
8
|
+
} from 'wasp/auth/providers/types'
|
|
9
|
+
import {
|
|
10
|
+
type OAuthType,
|
|
11
|
+
type OAuthStateFor,
|
|
12
|
+
type OAuthStateWithCodeFor,
|
|
13
|
+
generateAndStoreOAuthState,
|
|
14
|
+
validateAndGetOAuthState,
|
|
15
|
+
} from '../oauth/state.js'
|
|
16
|
+
import { finishOAuthFlowAndGetRedirectUri } from '../oauth/user.js'
|
|
17
|
+
import {
|
|
18
|
+
callbackPath,
|
|
19
|
+
loginPath,
|
|
20
|
+
handleOAuthErrorAndGetRedirectUri,
|
|
21
|
+
} from 'wasp/server/auth'
|
|
22
|
+
import { OAuthData } from 'wasp/server/auth'
|
|
23
|
+
import { onBeforeOAuthRedirectHook } from '../../hooks.js'
|
|
24
|
+
|
|
25
|
+
export function createOAuthProviderRouter<OT extends OAuthType, Tokens extends OAuthData['tokens'] = never>({
|
|
26
|
+
provider,
|
|
27
|
+
oAuthType,
|
|
28
|
+
userSignupFields,
|
|
29
|
+
getAuthorizationUrl,
|
|
30
|
+
getProviderTokens,
|
|
31
|
+
getProviderInfo,
|
|
32
|
+
}: {
|
|
33
|
+
provider: ProviderConfig
|
|
34
|
+
/*
|
|
35
|
+
- OAuth state is used to validate the callback to ensure the user
|
|
36
|
+
that requested the login is the same that is completing it.
|
|
37
|
+
- It includes "state" and an optional "codeVerifier" for PKCE.
|
|
38
|
+
*/
|
|
39
|
+
oAuthType: OT
|
|
40
|
+
userSignupFields: UserSignupFields | undefined
|
|
41
|
+
/*
|
|
42
|
+
The function that returns the URL to redirect the user to the
|
|
43
|
+
provider's login page.
|
|
44
|
+
*/
|
|
45
|
+
getAuthorizationUrl: (
|
|
46
|
+
oAuthState: OAuthStateFor<OT>,
|
|
47
|
+
) => Promise<URL>
|
|
48
|
+
/*
|
|
49
|
+
The function that returns the access token and refresh token from the
|
|
50
|
+
provider's callback.
|
|
51
|
+
*/
|
|
52
|
+
getProviderTokens: (
|
|
53
|
+
oAuthState: OAuthStateWithCodeFor<OT>,
|
|
54
|
+
) => Promise<Tokens>
|
|
55
|
+
/*
|
|
56
|
+
The function that returns the user's profile and ID using the access
|
|
57
|
+
token.
|
|
58
|
+
*/
|
|
59
|
+
getProviderInfo: (tokens: Tokens) => Promise<{
|
|
60
|
+
providerUserId: string
|
|
61
|
+
providerProfile: unknown
|
|
62
|
+
}>
|
|
63
|
+
}): Router {
|
|
64
|
+
const router = Router()
|
|
65
|
+
|
|
66
|
+
router.get(
|
|
67
|
+
`/${loginPath}`,
|
|
68
|
+
defineHandler(async (req, res) => {
|
|
69
|
+
const oAuthState = generateAndStoreOAuthState({
|
|
70
|
+
oAuthType,
|
|
71
|
+
provider,
|
|
72
|
+
res,
|
|
73
|
+
})
|
|
74
|
+
const redirectUrl = await getAuthorizationUrl(oAuthState)
|
|
75
|
+
const { url: redirectUrlAfterHook } = await onBeforeOAuthRedirectHook({
|
|
76
|
+
req,
|
|
77
|
+
url: redirectUrl,
|
|
78
|
+
oauth: { uniqueRequestId: oAuthState.state }
|
|
79
|
+
})
|
|
80
|
+
redirect(res, redirectUrlAfterHook.toString())
|
|
81
|
+
}),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
router.get(
|
|
85
|
+
`/${callbackPath}`,
|
|
86
|
+
defineHandler(async (req, res) => {
|
|
87
|
+
try {
|
|
88
|
+
const oAuthState = validateAndGetOAuthState({
|
|
89
|
+
oAuthType,
|
|
90
|
+
provider,
|
|
91
|
+
req,
|
|
92
|
+
})
|
|
93
|
+
const tokens = await getProviderTokens(oAuthState)
|
|
94
|
+
|
|
95
|
+
const { providerProfile, providerUserId } = await getProviderInfo(tokens)
|
|
96
|
+
try {
|
|
97
|
+
const redirectUri = await finishOAuthFlowAndGetRedirectUri({
|
|
98
|
+
provider,
|
|
99
|
+
providerProfile,
|
|
100
|
+
providerUserId,
|
|
101
|
+
userSignupFields,
|
|
102
|
+
req,
|
|
103
|
+
oauth: {
|
|
104
|
+
uniqueRequestId: oAuthState.state,
|
|
105
|
+
// OAuth params are built as a discriminated union
|
|
106
|
+
// of provider names and their respective tokens.
|
|
107
|
+
// We are using a generic ProviderConfig and tokens type
|
|
108
|
+
// is inferred from the getProviderTokens function.
|
|
109
|
+
// Instead of building complex TS machinery to ensure that
|
|
110
|
+
// the providerName and tokens match, we are using any here.
|
|
111
|
+
providerName: provider.id as any,
|
|
112
|
+
tokens,
|
|
113
|
+
},
|
|
114
|
+
})
|
|
115
|
+
// Redirect to the client with the one time code
|
|
116
|
+
redirect(res, redirectUri.toString())
|
|
117
|
+
} catch (e) {
|
|
118
|
+
rethrowPossibleAuthError(e)
|
|
119
|
+
}
|
|
120
|
+
} catch (e) {
|
|
121
|
+
console.error(e)
|
|
122
|
+
const redirectUri = handleOAuthErrorAndGetRedirectUri(e)
|
|
123
|
+
// Redirect to the client with the error
|
|
124
|
+
redirect(res, redirectUri.toString())
|
|
125
|
+
}
|
|
126
|
+
}),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
return router
|
|
130
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Router } from "express";
|
|
2
|
+
|
|
3
|
+
import { HttpError } from 'wasp/server';
|
|
4
|
+
import { defineHandler } from 'wasp/server/utils';
|
|
5
|
+
import { findAuthWithUserBy } from 'wasp/auth/utils'
|
|
6
|
+
import { createSession } from 'wasp/auth/session'
|
|
7
|
+
import { exchangeCodeForTokenPath, tokenStore } from "wasp/server/auth";
|
|
8
|
+
|
|
9
|
+
export function setupOneTimeCodeRoute(router: Router) {
|
|
10
|
+
router.post(
|
|
11
|
+
`/${exchangeCodeForTokenPath}`,
|
|
12
|
+
defineHandler(async (req, res) => {
|
|
13
|
+
const { code } = req.body;
|
|
14
|
+
|
|
15
|
+
if (code === undefined) {
|
|
16
|
+
throw new HttpError(400, "Unable to login with the OAuth provider. The code is missing.");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (tokenStore.isUsed(code)) {
|
|
20
|
+
throw new HttpError(400, "Unable to login with the OAuth provider. The code has already been used.");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const { id: authId } = await tokenStore.verifyToken(code);
|
|
24
|
+
const auth = await findAuthWithUserBy({ id: authId })
|
|
25
|
+
|
|
26
|
+
if (auth === null) {
|
|
27
|
+
throw new HttpError(400, "Unable to login with the OAuth provider. The code is invalid.");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const session = await createSession(auth.id);
|
|
31
|
+
|
|
32
|
+
tokenStore.markUsed(code);
|
|
33
|
+
|
|
34
|
+
res.json({
|
|
35
|
+
sessionId: session.id,
|
|
36
|
+
});
|
|
37
|
+
})
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Response as ExpressResponse,
|
|
3
|
+
Request as ExpressRequest,
|
|
4
|
+
} from 'express';
|
|
5
|
+
import * as arctic from 'arctic';
|
|
6
|
+
|
|
7
|
+
import type { ProviderConfig } from 'wasp/auth/providers/types';
|
|
8
|
+
|
|
9
|
+
import { setOAuthCookieValue, getOAuthCookieValue } from './cookies.js';
|
|
10
|
+
|
|
11
|
+
export type OAuthStateFor<
|
|
12
|
+
OT extends OAuthType
|
|
13
|
+
> = OAuthStateForOAuthType[OT];
|
|
14
|
+
|
|
15
|
+
export type OAuthStateWithCodeFor<OT extends OAuthType> = OAuthStateFor<OT> & OAuthCode
|
|
16
|
+
|
|
17
|
+
export type OAuthType = keyof OAuthStateForOAuthType;
|
|
18
|
+
|
|
19
|
+
export type OAuthStateFieldName = keyof OAuthState | keyof OAuthStateWithPKCE;
|
|
20
|
+
|
|
21
|
+
type OAuthStateForOAuthType = {
|
|
22
|
+
OAuth2: OAuthState,
|
|
23
|
+
OAuth2WithPKCE: OAuthStateWithPKCE,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
type OAuthState = {
|
|
27
|
+
state: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
type OAuthStateWithPKCE = {
|
|
31
|
+
state: string;
|
|
32
|
+
codeVerifier: string;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* When the OAuth flow is completed, the OAuth provider will redirect the user back to the app
|
|
37
|
+
* with a code. This code is then exchanged for an access token.
|
|
38
|
+
*/
|
|
39
|
+
type OAuthCode = {
|
|
40
|
+
code: string;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export function generateAndStoreOAuthState<OT extends OAuthType>({
|
|
44
|
+
oAuthType,
|
|
45
|
+
provider,
|
|
46
|
+
res,
|
|
47
|
+
}: {
|
|
48
|
+
oAuthType: OT,
|
|
49
|
+
provider: ProviderConfig,
|
|
50
|
+
res: ExpressResponse
|
|
51
|
+
}): OAuthStateFor<OT> {
|
|
52
|
+
const state: OAuthStateFor<OT> = {
|
|
53
|
+
...generateState(),
|
|
54
|
+
...(oAuthType === 'OAuth2WithPKCE' && generateCodeVerifier()),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
storeOAuthState(provider, res, state);
|
|
58
|
+
|
|
59
|
+
return state;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function validateAndGetOAuthState<OT extends OAuthType>({
|
|
63
|
+
oAuthType,
|
|
64
|
+
provider,
|
|
65
|
+
req,
|
|
66
|
+
}: {
|
|
67
|
+
oAuthType: OT,
|
|
68
|
+
provider: ProviderConfig,
|
|
69
|
+
req: ExpressRequest
|
|
70
|
+
}): OAuthStateWithCodeFor<OT> {
|
|
71
|
+
const state: OAuthStateWithCodeFor<OT> = {
|
|
72
|
+
...getCode(req),
|
|
73
|
+
...getState(req),
|
|
74
|
+
...(oAuthType === 'OAuth2WithPKCE' && getCodeVerifier(provider, req)),
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
validateOAuthState(provider, req, state);
|
|
78
|
+
|
|
79
|
+
return state;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function storeOAuthState(
|
|
83
|
+
provider: ProviderConfig,
|
|
84
|
+
res: ExpressResponse,
|
|
85
|
+
state: OAuthStateFor<OAuthType>
|
|
86
|
+
): void {
|
|
87
|
+
let key: keyof typeof state;
|
|
88
|
+
for (key in state) {
|
|
89
|
+
setOAuthCookieValue(provider, res, key, state[key]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function validateOAuthState(
|
|
94
|
+
provider: ProviderConfig,
|
|
95
|
+
req: ExpressRequest,
|
|
96
|
+
state: OAuthStateWithCodeFor<OAuthType>
|
|
97
|
+
): void {
|
|
98
|
+
if (typeof state.code !== 'string') {
|
|
99
|
+
throw new Error('Invalid code');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const storedState = getOAuthCookieValue(provider, req, 'state');
|
|
103
|
+
if (!state.state || !storedState || storedState !== state.state) {
|
|
104
|
+
throw new Error('Invalid state');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (isOAuthStateWithPKCE(state) && !state.codeVerifier) {
|
|
108
|
+
throw new Error('Missing code verifier');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function generateState(): { state: string } {
|
|
113
|
+
return { state: arctic.generateState() };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function generateCodeVerifier(): { codeVerifier: string } {
|
|
117
|
+
return { codeVerifier: arctic.generateCodeVerifier() };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function getCode(req: ExpressRequest): { code: string } {
|
|
121
|
+
return { code: `${req.query.code}` };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function getState(req: ExpressRequest): { state: string } {
|
|
125
|
+
return { state: `${req.query.state}` };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function getCodeVerifier(
|
|
129
|
+
provider: ProviderConfig,
|
|
130
|
+
req: ExpressRequest
|
|
131
|
+
): { codeVerifier: string } {
|
|
132
|
+
const codeVerifier = getOAuthCookieValue(
|
|
133
|
+
provider,
|
|
134
|
+
req,
|
|
135
|
+
'codeVerifier'
|
|
136
|
+
);
|
|
137
|
+
return { codeVerifier };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function isOAuthStateWithPKCE(
|
|
141
|
+
state: OAuthState | OAuthStateWithPKCE
|
|
142
|
+
): state is OAuthStateWithPKCE {
|
|
143
|
+
return 'codeVerifier' in state;
|
|
144
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { Request as ExpressRequest } from 'express'
|
|
3
|
+
import {
|
|
4
|
+
type ProviderId,
|
|
5
|
+
createUser,
|
|
6
|
+
sanitizeAndSerializeProviderData,
|
|
7
|
+
validateAndGetUserFields,
|
|
8
|
+
createProviderId,
|
|
9
|
+
findAuthWithUserBy,
|
|
10
|
+
} from 'wasp/auth/utils'
|
|
11
|
+
import { type {= authEntityUpper =} } from 'wasp/entities'
|
|
12
|
+
import { prisma } from 'wasp/server'
|
|
13
|
+
import { type UserSignupFields, type ProviderConfig } from 'wasp/auth/providers/types'
|
|
14
|
+
import { type OAuthData } from 'wasp/server/auth'
|
|
15
|
+
import { getRedirectUriForOneTimeCode, tokenStore } from 'wasp/server/auth'
|
|
16
|
+
import {
|
|
17
|
+
onBeforeSignupHook,
|
|
18
|
+
onAfterSignupHook,
|
|
19
|
+
onBeforeLoginHook,
|
|
20
|
+
onAfterLoginHook,
|
|
21
|
+
} from '../../hooks.js'
|
|
22
|
+
|
|
23
|
+
export async function finishOAuthFlowAndGetRedirectUri({
|
|
24
|
+
provider,
|
|
25
|
+
providerProfile,
|
|
26
|
+
providerUserId,
|
|
27
|
+
userSignupFields,
|
|
28
|
+
req,
|
|
29
|
+
oauth
|
|
30
|
+
}: {
|
|
31
|
+
provider: ProviderConfig;
|
|
32
|
+
providerProfile: unknown;
|
|
33
|
+
providerUserId: string;
|
|
34
|
+
userSignupFields: UserSignupFields | undefined;
|
|
35
|
+
req: ExpressRequest;
|
|
36
|
+
oauth: OAuthData;
|
|
37
|
+
}): Promise<URL> {
|
|
38
|
+
const providerId = createProviderId(provider.id, providerUserId);
|
|
39
|
+
|
|
40
|
+
const authId = await getAuthIdFromProviderDetails({
|
|
41
|
+
providerId,
|
|
42
|
+
providerProfile,
|
|
43
|
+
userSignupFields,
|
|
44
|
+
req,
|
|
45
|
+
oauth,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const oneTimeCode = await tokenStore.createToken(authId)
|
|
49
|
+
|
|
50
|
+
return getRedirectUriForOneTimeCode(oneTimeCode)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// We need a user id to create the auth token, so we either find an existing user
|
|
54
|
+
// or create a new one if none exists for this provider.
|
|
55
|
+
async function getAuthIdFromProviderDetails({
|
|
56
|
+
providerId,
|
|
57
|
+
providerProfile,
|
|
58
|
+
userSignupFields,
|
|
59
|
+
req,
|
|
60
|
+
oauth,
|
|
61
|
+
}: {
|
|
62
|
+
providerId: ProviderId;
|
|
63
|
+
providerProfile: any;
|
|
64
|
+
userSignupFields: UserSignupFields | undefined;
|
|
65
|
+
req: ExpressRequest;
|
|
66
|
+
oauth: OAuthData;
|
|
67
|
+
}): Promise<{= authEntityUpper =}['id']> {
|
|
68
|
+
const existingAuthIdentity = await prisma.{= authIdentityEntityLower =}.findUnique({
|
|
69
|
+
where: {
|
|
70
|
+
providerName_providerUserId: providerId,
|
|
71
|
+
},
|
|
72
|
+
include: {
|
|
73
|
+
{= authFieldOnAuthIdentityEntityName =}: {
|
|
74
|
+
include: {
|
|
75
|
+
{= userFieldOnAuthEntityName =}: true
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
if (existingAuthIdentity) {
|
|
82
|
+
const authId = existingAuthIdentity.{= authFieldOnAuthIdentityEntityName =}.id
|
|
83
|
+
|
|
84
|
+
// NOTE: Fetching the user to pass it to the login hooks - it's a bit wasteful
|
|
85
|
+
// but we wanted to keep the onAfterLoginHook params consistent for all auth providers.
|
|
86
|
+
const auth = await findAuthWithUserBy({ id: authId })
|
|
87
|
+
|
|
88
|
+
if (auth === null) {
|
|
89
|
+
throw new Error('Auth entity not found while trying to log in with OAuth')
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// NOTE: We are calling login hooks here even though we didn't log in the user yet.
|
|
93
|
+
// It's because we have access to the OAuth tokens here and we want to pass them to the hooks.
|
|
94
|
+
// We could have stored the tokens temporarily and called the hooks after the session is created,
|
|
95
|
+
// but this keeps the implementation simpler.
|
|
96
|
+
// The downside of this approach is that we can't provide the session to the login hooks, but this is
|
|
97
|
+
// an okay trade-off because OAuth tokens are more valuable to users than the session ID.
|
|
98
|
+
await onBeforeLoginHook({
|
|
99
|
+
req,
|
|
100
|
+
providerId,
|
|
101
|
+
user: auth.user,
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
// NOTE: check the comment above onBeforeLoginHook for the explanation why we call onAfterLoginHook here.
|
|
105
|
+
await onAfterLoginHook({
|
|
106
|
+
req,
|
|
107
|
+
providerId,
|
|
108
|
+
oauth,
|
|
109
|
+
user: auth.user,
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
return authId
|
|
113
|
+
} else {
|
|
114
|
+
const userFields = await validateAndGetUserFields(
|
|
115
|
+
{ profile: providerProfile },
|
|
116
|
+
userSignupFields,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
// For now, we don't have any extra data for the oauth providers, so we just pass an empty object.
|
|
120
|
+
const providerData = await sanitizeAndSerializeProviderData({})
|
|
121
|
+
|
|
122
|
+
await onBeforeSignupHook({ req, providerId })
|
|
123
|
+
const user = await createUser(
|
|
124
|
+
providerId,
|
|
125
|
+
providerData,
|
|
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({
|
|
131
|
+
req,
|
|
132
|
+
providerId,
|
|
133
|
+
user,
|
|
134
|
+
oauth,
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
return user.auth.id
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { createInvalidCredentialsError } from 'wasp/auth/utils'
|
|
3
|
+
import { defineHandler } from 'wasp/server/utils'
|
|
4
|
+
import { verifyPassword } from 'wasp/auth/password'
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
createProviderId,
|
|
8
|
+
findAuthIdentity,
|
|
9
|
+
findAuthWithUserBy,
|
|
10
|
+
getProviderDataWithPassword,
|
|
11
|
+
} from 'wasp/auth/utils'
|
|
12
|
+
import { createSession } from 'wasp/auth/session'
|
|
13
|
+
import { ensureValidUsername, ensurePasswordIsPresent } from 'wasp/auth/validation'
|
|
14
|
+
import { onBeforeLoginHook, onAfterLoginHook } from '../../hooks.js';
|
|
15
|
+
|
|
16
|
+
export default defineHandler(async (req, res) => {
|
|
17
|
+
const fields = req.body ?? {}
|
|
18
|
+
ensureValidArgs(fields)
|
|
19
|
+
|
|
20
|
+
const providerId = createProviderId('username', fields.username)
|
|
21
|
+
const authIdentity = await findAuthIdentity(providerId)
|
|
22
|
+
if (!authIdentity) {
|
|
23
|
+
throw createInvalidCredentialsError()
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const providerData = getProviderDataWithPassword<'username'>(authIdentity.providerData)
|
|
28
|
+
|
|
29
|
+
await verifyPassword(providerData.hashedPassword, fields.password)
|
|
30
|
+
} catch(e) {
|
|
31
|
+
throw createInvalidCredentialsError()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const auth = await findAuthWithUserBy({
|
|
35
|
+
id: authIdentity.authId
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
if (auth === null) {
|
|
39
|
+
throw createInvalidCredentialsError()
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
await onBeforeLoginHook({
|
|
43
|
+
req,
|
|
44
|
+
providerId,
|
|
45
|
+
user: auth.user,
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const session = await createSession(auth.id)
|
|
49
|
+
|
|
50
|
+
await onAfterLoginHook({
|
|
51
|
+
req,
|
|
52
|
+
providerId,
|
|
53
|
+
user: auth.user,
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
res.json({
|
|
57
|
+
sessionId: session.id,
|
|
58
|
+
})
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
function ensureValidArgs(args: object): void {
|
|
62
|
+
ensureValidUsername(args);
|
|
63
|
+
ensurePasswordIsPresent(args);
|
|
64
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { defineHandler } from 'wasp/server/utils'
|
|
3
|
+
import {
|
|
4
|
+
createProviderId,
|
|
5
|
+
createUser,
|
|
6
|
+
rethrowPossibleAuthError,
|
|
7
|
+
sanitizeAndSerializeProviderData,
|
|
8
|
+
} from 'wasp/auth/utils'
|
|
9
|
+
import {
|
|
10
|
+
ensureValidUsername,
|
|
11
|
+
ensurePasswordIsPresent,
|
|
12
|
+
ensureValidPassword,
|
|
13
|
+
} from 'wasp/auth/validation'
|
|
14
|
+
import { validateAndGetUserFields } from 'wasp/auth/utils'
|
|
15
|
+
import type { UserSignupFields } from 'wasp/auth/providers/types'
|
|
16
|
+
import { onBeforeSignupHook, onAfterSignupHook } from '../../hooks.js';
|
|
17
|
+
|
|
18
|
+
export function getSignupRoute({
|
|
19
|
+
userSignupFields,
|
|
20
|
+
}: {
|
|
21
|
+
userSignupFields?: UserSignupFields;
|
|
22
|
+
}) {
|
|
23
|
+
return defineHandler(async function signup(req, res) {
|
|
24
|
+
const fields = req.body ?? {}
|
|
25
|
+
ensureValidArgs(fields)
|
|
26
|
+
|
|
27
|
+
const userFields = await validateAndGetUserFields(
|
|
28
|
+
fields,
|
|
29
|
+
userSignupFields,
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
const providerId = createProviderId('username', fields.username)
|
|
33
|
+
const providerData = await sanitizeAndSerializeProviderData<'username'>({
|
|
34
|
+
hashedPassword: fields.password,
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
await onBeforeSignupHook({ req, providerId })
|
|
39
|
+
const user = await createUser(
|
|
40
|
+
providerId,
|
|
41
|
+
providerData,
|
|
42
|
+
// Using any here because we want to avoid TypeScript errors and
|
|
43
|
+
// rely on Prisma to validate the data.
|
|
44
|
+
userFields as any
|
|
45
|
+
)
|
|
46
|
+
await onAfterSignupHook({ req, providerId, user })
|
|
47
|
+
} catch (e: unknown) {
|
|
48
|
+
rethrowPossibleAuthError(e)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
res.json({ success: true })
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function ensureValidArgs(args: object): void {
|
|
56
|
+
ensureValidUsername(args)
|
|
57
|
+
ensurePasswordIsPresent(args)
|
|
58
|
+
ensureValidPassword(args)
|
|
59
|
+
}
|