@wasp.sh/wasp-cli-darwin-arm64-unknown 0.17.2
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.
Potentially problematic release.
This version of @wasp.sh/wasp-cli-darwin-arm64-unknown might be problematic. Click here for more details.
- package/data/Cli/bash-completion +5 -0
- package/data/Cli/starters/README.md +22 -0
- package/data/Cli/starters/basic/.prettierignore +2 -0
- package/data/Cli/starters/basic/.prettierrc +3 -0
- package/data/Cli/starters/basic/README.md +35 -0
- package/data/Cli/starters/basic/eslint.config.js +15 -0
- package/data/Cli/starters/basic/main.wasp +100 -0
- package/data/Cli/starters/basic/package.json +27 -0
- package/data/Cli/starters/basic/postcss.config.cjs +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.cjs +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 +16 -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/.waspignore +4 -0
- package/data/Cli/starters/skeleton/.wasproot +1 -0
- package/data/Cli/starters/skeleton/public/.gitkeep +0 -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 +72 -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 +30 -0
- package/data/Generator/templates/react-app/public/manifest.json +15 -0
- package/data/Generator/templates/react-app/src/auth/pages/OAuthCallback.tsx +96 -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 +57 -0
- package/data/Generator/templates/react-app/src/stitches.config.js +33 -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 +20 -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.tsx +108 -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.tsx +107 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.tsx +21 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/common/LoginSignupForm.tsx +356 -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 +42 -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.tsx +33 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.tsx +78 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/internal/usernameAndPassword/useUsernameAndPassword.ts +29 -0
- package/data/Generator/templates/sdk/wasp/auth/forms/types.ts +52 -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 +14 -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/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/stitches.config.ts +39 -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 +151 -0
- package/data/Generator/templates/sdk/wasp/prisma-runtime-library.d.ts +17 -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 +168 -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 +114 -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 +5 -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 +37 -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/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/main.js +9 -0
- package/package.json +1 -0
- package/readme.md +3 -0
- package/wasp-bin +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
// Wasp internally uses the types defined in this file for typing entity maps in
|
|
3
|
+
// operation contexts.
|
|
4
|
+
//
|
|
5
|
+
// We must explicitly tag all entities with their name to avoid issues with
|
|
6
|
+
// structural typing. See https://github.com/wasp-lang/wasp/pull/982 for details.
|
|
7
|
+
import {
|
|
8
|
+
type Entity,
|
|
9
|
+
type EntityName,
|
|
10
|
+
{=# entities =}
|
|
11
|
+
type {= name =},
|
|
12
|
+
{=/ entities =}
|
|
13
|
+
} from 'wasp/entities'
|
|
14
|
+
|
|
15
|
+
{=# entities =}
|
|
16
|
+
export type {= internalTypeName =} = WithName<{= name =}, "{= name =}">
|
|
17
|
+
{=/ entities =}
|
|
18
|
+
|
|
19
|
+
export type _Entity =
|
|
20
|
+
{=# entities =}
|
|
21
|
+
| {= internalTypeName =}
|
|
22
|
+
{=/ entities =}
|
|
23
|
+
| never
|
|
24
|
+
|
|
25
|
+
type WithName<E extends Entity, Name extends EntityName> =
|
|
26
|
+
E & { _entityName: Name }
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
|
|
3
|
+
import { type ParamsDictionary as ExpressParams, type Query as ExpressQuery } from 'express-serve-static-core'
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
{=# allEntities =}
|
|
7
|
+
type {= internalTypeName =},
|
|
8
|
+
{=/ allEntities =}
|
|
9
|
+
{=# shouldImportNonAuthenticatedApi =}
|
|
10
|
+
type Api,
|
|
11
|
+
{=/ shouldImportNonAuthenticatedApi =}
|
|
12
|
+
{=# shouldImportAuthenticatedApi =}
|
|
13
|
+
type AuthenticatedApi,
|
|
14
|
+
{=/ shouldImportAuthenticatedApi =}
|
|
15
|
+
} from '../_types'
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
// PUBLIC API
|
|
19
|
+
{=# apiRoutes =}
|
|
20
|
+
export type {= typeName =}<
|
|
21
|
+
P extends ExpressParams = ExpressParams,
|
|
22
|
+
ResBody = any,
|
|
23
|
+
ReqBody = any,
|
|
24
|
+
ReqQuery extends ExpressQuery = ExpressQuery,
|
|
25
|
+
Locals extends Record<string, any> = Record<string, any>
|
|
26
|
+
> =
|
|
27
|
+
{=# usesAuth =}
|
|
28
|
+
AuthenticatedApi<
|
|
29
|
+
{=/ usesAuth =}
|
|
30
|
+
{=^ usesAuth =}
|
|
31
|
+
Api<
|
|
32
|
+
{=/ usesAuth =}
|
|
33
|
+
[
|
|
34
|
+
{=# entities =}
|
|
35
|
+
{= internalTypeName =},
|
|
36
|
+
{=/ entities =}
|
|
37
|
+
],
|
|
38
|
+
P,
|
|
39
|
+
ResBody,
|
|
40
|
+
ReqBody,
|
|
41
|
+
ReqQuery,
|
|
42
|
+
Locals
|
|
43
|
+
>
|
|
44
|
+
{=/ apiRoutes =}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// PUBLIC API
|
|
2
|
+
export type GetVerificationEmailContentFn = (params: { verificationLink: string }) => EmailContent;
|
|
3
|
+
|
|
4
|
+
// PUBLIC API
|
|
5
|
+
export type GetPasswordResetEmailContentFn = (params: { passwordResetLink: string }) => EmailContent;
|
|
6
|
+
|
|
7
|
+
type EmailContent = {
|
|
8
|
+
subject: string;
|
|
9
|
+
html: string;
|
|
10
|
+
text: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
createEmailVerificationLink,
|
|
15
|
+
sendEmailVerificationEmail,
|
|
16
|
+
createPasswordResetLink,
|
|
17
|
+
sendPasswordResetEmail,
|
|
18
|
+
isEmailResendAllowed,
|
|
19
|
+
} from './utils.js'
|
|
20
|
+
export { ensureValidEmail } from '../../../auth/validation.js'
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { createJWT, TimeSpan } from 'wasp/auth/jwt'
|
|
3
|
+
import { emailSender } from 'wasp/server/email';
|
|
4
|
+
import { Email } from 'wasp/server/email/core/types';
|
|
5
|
+
import {
|
|
6
|
+
createProviderId,
|
|
7
|
+
updateAuthIdentityProviderData,
|
|
8
|
+
findAuthIdentity,
|
|
9
|
+
getProviderDataWithPassword,
|
|
10
|
+
type EmailProviderData,
|
|
11
|
+
} from 'wasp/auth/utils';
|
|
12
|
+
import { config as waspServerConfig } from 'wasp/server';
|
|
13
|
+
import { type {= userEntityUpper =}, type {= authEntityUpper =} } from 'wasp/entities'
|
|
14
|
+
|
|
15
|
+
// PUBLIC API
|
|
16
|
+
export async function createEmailVerificationLink(
|
|
17
|
+
email: string,
|
|
18
|
+
clientRoute: string,
|
|
19
|
+
): Promise<string> {
|
|
20
|
+
const { jwtToken } = await createEmailJWT(email);
|
|
21
|
+
return `${waspServerConfig.frontendUrl}${clientRoute}?token=${jwtToken}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// PUBLIC API
|
|
25
|
+
export async function createPasswordResetLink(
|
|
26
|
+
email: string,
|
|
27
|
+
clientRoute: string,
|
|
28
|
+
): Promise<string> {
|
|
29
|
+
const { jwtToken } = await createEmailJWT(email);
|
|
30
|
+
return `${waspServerConfig.frontendUrl}${clientRoute}?token=${jwtToken}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function createEmailJWT(email: string): Promise<{ jwtToken: string; }> {
|
|
34
|
+
const jwtToken = await createJWT({ email }, { expiresIn: new TimeSpan(30, "m") });
|
|
35
|
+
return { jwtToken };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// PUBLIC API
|
|
39
|
+
export async function sendPasswordResetEmail(
|
|
40
|
+
email: string,
|
|
41
|
+
content: Email,
|
|
42
|
+
): Promise<void> {
|
|
43
|
+
return sendEmailAndSaveMetadata(email, content, {
|
|
44
|
+
passwordResetSentAt: (new Date()).toISOString(),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// PUBLIC API
|
|
49
|
+
export async function sendEmailVerificationEmail(
|
|
50
|
+
email: string,
|
|
51
|
+
content: Email,
|
|
52
|
+
): Promise<void> {
|
|
53
|
+
return sendEmailAndSaveMetadata(email, content, {
|
|
54
|
+
emailVerificationSentAt: (new Date()).toISOString(),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function sendEmailAndSaveMetadata(
|
|
59
|
+
email: string,
|
|
60
|
+
content: Email,
|
|
61
|
+
metadata: Partial<EmailProviderData>,
|
|
62
|
+
): Promise<void> {
|
|
63
|
+
// Save the metadata (e.g. timestamp) first, and then send the email
|
|
64
|
+
// so the user can't send multiple requests while the email is being sent.
|
|
65
|
+
const providerId = createProviderId("email", email);
|
|
66
|
+
const authIdentity = await findAuthIdentity(providerId);
|
|
67
|
+
|
|
68
|
+
if (!authIdentity) {
|
|
69
|
+
throw new Error(`User with email: ${email} not found.`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData);
|
|
73
|
+
await updateAuthIdentityProviderData<'email'>(providerId, providerData, metadata);
|
|
74
|
+
|
|
75
|
+
emailSender.send(content).catch((e) => {
|
|
76
|
+
console.error('Failed to send email', e);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// PUBLIC API
|
|
81
|
+
export function isEmailResendAllowed<Field extends 'emailVerificationSentAt' | 'passwordResetSentAt'>(
|
|
82
|
+
fields: {
|
|
83
|
+
[field in Field]: string | null
|
|
84
|
+
},
|
|
85
|
+
field: Field,
|
|
86
|
+
resendInterval: number = 1000 * 60,
|
|
87
|
+
): {
|
|
88
|
+
isResendAllowed: boolean;
|
|
89
|
+
timeLeft: number;
|
|
90
|
+
} {
|
|
91
|
+
const sentAt = fields[field];
|
|
92
|
+
if (!sentAt) {
|
|
93
|
+
return {
|
|
94
|
+
isResendAllowed: true,
|
|
95
|
+
timeLeft: 0,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const now = new Date();
|
|
99
|
+
const diff = now.getTime() - new Date(sentAt).getTime();
|
|
100
|
+
const isResendAllowed = diff > resendInterval;
|
|
101
|
+
// Time left in seconds
|
|
102
|
+
const timeLeft = isResendAllowed ? 0 : Math.round((resendInterval - diff) / 1000);
|
|
103
|
+
return { isResendAllowed, timeLeft };
|
|
104
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import type { Request as ExpressRequest } from 'express'
|
|
3
|
+
import { type ProviderId, type CreateUserResult, type FindAuthWithUserResult } from '../../auth/utils.js'
|
|
4
|
+
import { prisma } from '../index.js'
|
|
5
|
+
import { Expand } from '../../universal/types.js'
|
|
6
|
+
|
|
7
|
+
// PUBLIC API
|
|
8
|
+
export type OnBeforeSignupHook = (
|
|
9
|
+
params: Expand<OnBeforeSignupHookParams>,
|
|
10
|
+
) => void | Promise<void>
|
|
11
|
+
|
|
12
|
+
// PUBLIC API
|
|
13
|
+
export type OnAfterSignupHook = (
|
|
14
|
+
params: Expand<OnAfterSignupHookParams>,
|
|
15
|
+
) => void | Promise<void>
|
|
16
|
+
|
|
17
|
+
// PUBLIC API
|
|
18
|
+
/**
|
|
19
|
+
* Use this type for typing your `onAfterEmailVerified` hook.
|
|
20
|
+
*
|
|
21
|
+
* Wasp calls this hook exactly once, after a user successfully verifies their email during the email verification flow.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* export const onAfterEmailVerified: OnAfterEmailVerifiedHook = async ({
|
|
26
|
+
* email,
|
|
27
|
+
* }) => {
|
|
28
|
+
* await emailSender.send({
|
|
29
|
+
* to: email,
|
|
30
|
+
* subject: 'Welcome to our platform!',
|
|
31
|
+
* text: `Your email ${email} has been verified successfully.`
|
|
32
|
+
* })
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export type OnAfterEmailVerifiedHook = (
|
|
37
|
+
params: Expand<OnAfterEmailVerifiedHookParams>,
|
|
38
|
+
) => void | Promise<void>
|
|
39
|
+
|
|
40
|
+
// PUBLIC API
|
|
41
|
+
/**
|
|
42
|
+
* @returns Object with a URL that the OAuth flow should redirect to.
|
|
43
|
+
*/
|
|
44
|
+
export type OnBeforeOAuthRedirectHook = (
|
|
45
|
+
params: Expand<OnBeforeOAuthRedirectHookParams>,
|
|
46
|
+
) => { url: URL } | Promise<{ url: URL }>
|
|
47
|
+
|
|
48
|
+
// PUBLIC API
|
|
49
|
+
export type OnBeforeLoginHook = (
|
|
50
|
+
params: Expand<OnBeforeLoginHookParams>,
|
|
51
|
+
) => void | Promise<void>
|
|
52
|
+
|
|
53
|
+
// PUBLIC API
|
|
54
|
+
export type OnAfterLoginHook = (
|
|
55
|
+
params: Expand<OnAfterLoginHookParams>,
|
|
56
|
+
) => void | Promise<void>
|
|
57
|
+
|
|
58
|
+
// PRIVATE API (used in the SDK and the server)
|
|
59
|
+
export type InternalAuthHookParams = {
|
|
60
|
+
/**
|
|
61
|
+
* Prisma instance that can be used to interact with the database.
|
|
62
|
+
*/
|
|
63
|
+
prisma: typeof prisma
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// NOTE: We should be exporting types that can be reached by users via other
|
|
67
|
+
// exported types (e.g. using the Parameters<T> Typescript helper).
|
|
68
|
+
// However, we are not exporting this type to keep the API surface smaller.
|
|
69
|
+
// This type is only used internally by the SDK. Exporting it might confuse
|
|
70
|
+
// users since the name is too similar to the exported function type.
|
|
71
|
+
// Same goes for all other *Params types in this file.
|
|
72
|
+
type OnBeforeSignupHookParams = {
|
|
73
|
+
/**
|
|
74
|
+
* Provider ID object that contains the provider name and the provider user ID.
|
|
75
|
+
*/
|
|
76
|
+
providerId: ProviderId
|
|
77
|
+
/**
|
|
78
|
+
* Request object that can be used to access the user's incoming signup request.
|
|
79
|
+
*/
|
|
80
|
+
req: ExpressRequest
|
|
81
|
+
} & InternalAuthHookParams
|
|
82
|
+
|
|
83
|
+
type OnAfterSignupHookParams = {
|
|
84
|
+
/**
|
|
85
|
+
* Provider ID object that contains the provider name and the provider user ID.
|
|
86
|
+
*/
|
|
87
|
+
providerId: ProviderId
|
|
88
|
+
/**
|
|
89
|
+
* User object that was created during the signup process.
|
|
90
|
+
*/
|
|
91
|
+
user: CreateUserResult
|
|
92
|
+
/**
|
|
93
|
+
* OAuth flow data that was generated during the OAuth flow. This is only
|
|
94
|
+
* available if the user signed up using OAuth.
|
|
95
|
+
*/
|
|
96
|
+
oauth?: OAuthData
|
|
97
|
+
/**
|
|
98
|
+
* Request object that can be used to access the user's incoming signup request.
|
|
99
|
+
*/
|
|
100
|
+
req: ExpressRequest
|
|
101
|
+
} & InternalAuthHookParams
|
|
102
|
+
|
|
103
|
+
type OnAfterEmailVerifiedHookParams = {
|
|
104
|
+
/**
|
|
105
|
+
* The email address that was verified.
|
|
106
|
+
*/
|
|
107
|
+
email: string
|
|
108
|
+
/**
|
|
109
|
+
* The user who completed email verification.
|
|
110
|
+
*/
|
|
111
|
+
user: FindAuthWithUserResult['user']
|
|
112
|
+
/**
|
|
113
|
+
* Request object that can be used to access the user's incoming verification request.
|
|
114
|
+
*/
|
|
115
|
+
req: ExpressRequest
|
|
116
|
+
} & InternalAuthHookParams
|
|
117
|
+
|
|
118
|
+
type OnBeforeOAuthRedirectHookParams = {
|
|
119
|
+
/**
|
|
120
|
+
* URL that the OAuth flow should redirect to.
|
|
121
|
+
*/
|
|
122
|
+
url: URL
|
|
123
|
+
/**
|
|
124
|
+
* Unique request ID that was generated during the OAuth flow.
|
|
125
|
+
*/
|
|
126
|
+
oauth: Pick<OAuthData, 'uniqueRequestId'>
|
|
127
|
+
/**
|
|
128
|
+
* Request object that can be used to access the user's incoming OAuth flow request.
|
|
129
|
+
*/
|
|
130
|
+
req: ExpressRequest
|
|
131
|
+
} & InternalAuthHookParams
|
|
132
|
+
|
|
133
|
+
type OnBeforeLoginHookParams = {
|
|
134
|
+
/**
|
|
135
|
+
* Provider ID object that contains the provider name and the provider user ID.
|
|
136
|
+
*/
|
|
137
|
+
providerId: ProviderId
|
|
138
|
+
/**
|
|
139
|
+
* User that is trying to log in.
|
|
140
|
+
*/
|
|
141
|
+
user: FindAuthWithUserResult['user']
|
|
142
|
+
/**
|
|
143
|
+
* Request object that can be used to access the user's incoming login request.
|
|
144
|
+
*/
|
|
145
|
+
req: ExpressRequest
|
|
146
|
+
} & InternalAuthHookParams
|
|
147
|
+
|
|
148
|
+
type OnAfterLoginHookParams = {
|
|
149
|
+
/**
|
|
150
|
+
* Provider ID object that contains the provider name and the provider user ID.
|
|
151
|
+
*/
|
|
152
|
+
providerId: ProviderId
|
|
153
|
+
/**
|
|
154
|
+
* User that is logged in.
|
|
155
|
+
*/
|
|
156
|
+
user: FindAuthWithUserResult['user']
|
|
157
|
+
/**
|
|
158
|
+
* OAuth flow data that was generated during the OAuth flow. This is only
|
|
159
|
+
* available if the user logged in using OAuth.
|
|
160
|
+
*/
|
|
161
|
+
oauth?: OAuthData
|
|
162
|
+
/**
|
|
163
|
+
* Request object that can be used to access the user's incoming login request.
|
|
164
|
+
*/
|
|
165
|
+
req: ExpressRequest
|
|
166
|
+
} & InternalAuthHookParams
|
|
167
|
+
|
|
168
|
+
// PUBLIC API
|
|
169
|
+
export type OAuthData = {
|
|
170
|
+
/**
|
|
171
|
+
* Unique request ID that was generated during the OAuth flow.
|
|
172
|
+
*/
|
|
173
|
+
uniqueRequestId: string
|
|
174
|
+
} & (
|
|
175
|
+
{=# enabledProviders.isGoogleAuthEnabled =}
|
|
176
|
+
| { providerName: 'google'; tokens: import('arctic').GoogleTokens }
|
|
177
|
+
{=/ enabledProviders.isGoogleAuthEnabled =}
|
|
178
|
+
{=# enabledProviders.isDiscordAuthEnabled =}
|
|
179
|
+
| { providerName: 'discord'; tokens: import('arctic').DiscordTokens }
|
|
180
|
+
{=/ enabledProviders.isDiscordAuthEnabled =}
|
|
181
|
+
{=# enabledProviders.isGitHubAuthEnabled =}
|
|
182
|
+
| { providerName: 'github'; tokens: import('arctic').GitHubTokens }
|
|
183
|
+
{=/ enabledProviders.isGitHubAuthEnabled =}
|
|
184
|
+
{=# enabledProviders.isKeycloakAuthEnabled =}
|
|
185
|
+
| { providerName: 'keycloak'; tokens: import('arctic').KeycloakTokens }
|
|
186
|
+
{=/ enabledProviders.isKeycloakAuthEnabled =}
|
|
187
|
+
| never
|
|
188
|
+
)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
export {
|
|
3
|
+
defineUserSignupFields,
|
|
4
|
+
} from '../../auth/providers/types.js'
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
createProviderId,
|
|
8
|
+
sanitizeAndSerializeProviderData,
|
|
9
|
+
updateAuthIdentityProviderData,
|
|
10
|
+
getProviderData,
|
|
11
|
+
getProviderDataWithPassword,
|
|
12
|
+
findAuthIdentity,
|
|
13
|
+
createUser,
|
|
14
|
+
type CreateUserResult,
|
|
15
|
+
type ProviderId,
|
|
16
|
+
type ProviderName,
|
|
17
|
+
type EmailProviderData,
|
|
18
|
+
type UsernameProviderData,
|
|
19
|
+
type OAuthProviderData,
|
|
20
|
+
} from '../../auth/utils.js'
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
ensurePasswordIsPresent,
|
|
24
|
+
ensureValidPassword,
|
|
25
|
+
ensureTokenIsPresent,
|
|
26
|
+
} from '../../auth/validation.js'
|
|
27
|
+
|
|
28
|
+
export type {
|
|
29
|
+
OnBeforeSignupHook,
|
|
30
|
+
OnAfterSignupHook,
|
|
31
|
+
OnAfterEmailVerifiedHook,
|
|
32
|
+
OnBeforeOAuthRedirectHook,
|
|
33
|
+
OnBeforeLoginHook,
|
|
34
|
+
OnAfterLoginHook,
|
|
35
|
+
InternalAuthHookParams,
|
|
36
|
+
OAuthData,
|
|
37
|
+
} from './hooks.js'
|
|
38
|
+
|
|
39
|
+
{=# isExternalAuthEnabled =}
|
|
40
|
+
export * from './oauth/index.js'
|
|
41
|
+
{=/ isExternalAuthEnabled =}
|
|
42
|
+
|
|
43
|
+
{=# enabledProviders.isEmailAuthEnabled =}
|
|
44
|
+
export * from './email/index.js'
|
|
45
|
+
{=/ enabledProviders.isEmailAuthEnabled =}
|
|
46
|
+
|
|
47
|
+
{=# enabledProviders.isUsernameAndPasswordAuthEnabled =}
|
|
48
|
+
export * from './username.js'
|
|
49
|
+
{=/ enabledProviders.isUsernameAndPasswordAuthEnabled =}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
{=# enabledProviders.isGoogleAuthEnabled =}
|
|
3
|
+
// PUBLIC API
|
|
4
|
+
export { google } from './providers/google.js';
|
|
5
|
+
{=/ enabledProviders.isGoogleAuthEnabled =}
|
|
6
|
+
|
|
7
|
+
{=# enabledProviders.isSlackAuthEnabled =}
|
|
8
|
+
// PUBLIC API
|
|
9
|
+
export { slack } from './providers/slack.js';
|
|
10
|
+
{=/ enabledProviders.isSlackAuthEnabled =}
|
|
11
|
+
|
|
12
|
+
{=# enabledProviders.isDiscordAuthEnabled =}
|
|
13
|
+
// PUBLIC API
|
|
14
|
+
export { discord } from './providers/discord.js';
|
|
15
|
+
{=/ enabledProviders.isDiscordAuthEnabled =}
|
|
16
|
+
|
|
17
|
+
{=# enabledProviders.isGitHubAuthEnabled =}
|
|
18
|
+
// PUBLIC API
|
|
19
|
+
export { github } from './providers/github.js';
|
|
20
|
+
{=/ enabledProviders.isGitHubAuthEnabled =}
|
|
21
|
+
{=# enabledProviders.isKeycloakAuthEnabled =}
|
|
22
|
+
// PUBLIC API
|
|
23
|
+
export { keycloak } from './providers/keycloak.js';
|
|
24
|
+
{=/ enabledProviders.isKeycloakAuthEnabled =}
|
|
25
|
+
|
|
26
|
+
// PRIVATE API
|
|
27
|
+
export {
|
|
28
|
+
loginPath,
|
|
29
|
+
callbackPath,
|
|
30
|
+
exchangeCodeForTokenPath,
|
|
31
|
+
handleOAuthErrorAndGetRedirectUri,
|
|
32
|
+
getRedirectUriForOneTimeCode,
|
|
33
|
+
} from './redirect.js'
|
|
34
|
+
|
|
35
|
+
// PRIVATE API
|
|
36
|
+
export {
|
|
37
|
+
tokenStore,
|
|
38
|
+
} from './oneTimeCode.js'
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createJWT, validateJWT, TimeSpan } from '../../../auth/jwt.js'
|
|
2
|
+
|
|
3
|
+
export const tokenStore = createTokenStore();
|
|
4
|
+
|
|
5
|
+
function createTokenStore() {
|
|
6
|
+
const usedTokens = new Map<string, number>();
|
|
7
|
+
|
|
8
|
+
const validFor = new TimeSpan(1, 'm') // 1 minute
|
|
9
|
+
const cleanupAfter = 1000 * 60 * 60; // 1 hour
|
|
10
|
+
|
|
11
|
+
function createToken(userId: string): Promise<string> {
|
|
12
|
+
return createJWT(
|
|
13
|
+
{
|
|
14
|
+
id: userId,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
expiresIn: validFor,
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function verifyToken(token: string): Promise<{ id: string }> {
|
|
23
|
+
return validateJWT(token);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isUsed(token: string): boolean {
|
|
27
|
+
return usedTokens.has(token);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function markUsed(token: string): void {
|
|
31
|
+
usedTokens.set(token, Date.now());
|
|
32
|
+
cleanUp();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function cleanUp(): void {
|
|
36
|
+
const now = Date.now();
|
|
37
|
+
for (const [token, timestamp] of usedTokens.entries()) {
|
|
38
|
+
if (now - timestamp > cleanupAfter) {
|
|
39
|
+
usedTokens.delete(token);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
createToken,
|
|
46
|
+
verifyToken,
|
|
47
|
+
isUsed,
|
|
48
|
+
markUsed,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { OAuth2Provider, OAuth2ProviderWithPKCE } from "arctic";
|
|
2
|
+
|
|
3
|
+
export function defineProvider<
|
|
4
|
+
OAuthClient extends OAuth2Provider | OAuth2ProviderWithPKCE,
|
|
5
|
+
const Id extends string
|
|
6
|
+
>({
|
|
7
|
+
id,
|
|
8
|
+
displayName,
|
|
9
|
+
oAuthClient,
|
|
10
|
+
}: {
|
|
11
|
+
id: Id;
|
|
12
|
+
displayName: string;
|
|
13
|
+
oAuthClient: OAuthClient;
|
|
14
|
+
}) {
|
|
15
|
+
return {
|
|
16
|
+
id,
|
|
17
|
+
displayName,
|
|
18
|
+
oAuthClient,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { Discord } from 'arctic';
|
|
3
|
+
|
|
4
|
+
import { defineProvider } from '../provider.js';
|
|
5
|
+
import { getRedirectUriForCallback } from '../redirect.js';
|
|
6
|
+
import { env } from '../../../env.js';
|
|
7
|
+
|
|
8
|
+
const id = '{= providerId =}';
|
|
9
|
+
const displayName = '{= displayName =}';
|
|
10
|
+
|
|
11
|
+
const oAuthClient = new Discord(
|
|
12
|
+
env.DISCORD_CLIENT_ID,
|
|
13
|
+
env.DISCORD_CLIENT_SECRET,
|
|
14
|
+
getRedirectUriForCallback(id).toString(),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
// PUBLIC API
|
|
18
|
+
export const discord = defineProvider({
|
|
19
|
+
id,
|
|
20
|
+
displayName,
|
|
21
|
+
oAuthClient,
|
|
22
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { GitHub } from 'arctic';
|
|
3
|
+
|
|
4
|
+
import { defineProvider } from '../provider.js';
|
|
5
|
+
import { env } from '../../../env.js';
|
|
6
|
+
|
|
7
|
+
const id = '{= providerId =}';
|
|
8
|
+
const displayName = '{= displayName =}';
|
|
9
|
+
|
|
10
|
+
const oAuthClient = new GitHub(
|
|
11
|
+
env.GITHUB_CLIENT_ID,
|
|
12
|
+
env.GITHUB_CLIENT_SECRET,
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
// PUBLIC API
|
|
16
|
+
export const github = defineProvider({
|
|
17
|
+
id,
|
|
18
|
+
displayName,
|
|
19
|
+
oAuthClient,
|
|
20
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { Google } from 'arctic';
|
|
3
|
+
|
|
4
|
+
import { getRedirectUriForCallback } from '../redirect.js';
|
|
5
|
+
import { defineProvider } from '../provider.js';
|
|
6
|
+
import { env } from '../../../env.js';
|
|
7
|
+
|
|
8
|
+
const id = '{= providerId =}';
|
|
9
|
+
const displayName = '{= displayName =}';
|
|
10
|
+
|
|
11
|
+
const oAuthClient = new Google(
|
|
12
|
+
env.GOOGLE_CLIENT_ID,
|
|
13
|
+
env.GOOGLE_CLIENT_SECRET,
|
|
14
|
+
getRedirectUriForCallback(id).toString(),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
// PUBLIC API
|
|
18
|
+
export const google = defineProvider({
|
|
19
|
+
id,
|
|
20
|
+
displayName,
|
|
21
|
+
oAuthClient,
|
|
22
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { Keycloak } from 'arctic';
|
|
3
|
+
|
|
4
|
+
import { getRedirectUriForCallback } from '../redirect.js';
|
|
5
|
+
import { defineProvider } from '../provider.js';
|
|
6
|
+
import { env } from '../../../env.js';
|
|
7
|
+
|
|
8
|
+
const id = '{= providerId =}';
|
|
9
|
+
const displayName = '{= displayName =}';
|
|
10
|
+
|
|
11
|
+
const oAuthClient = new Keycloak(
|
|
12
|
+
env.KEYCLOAK_REALM_URL,
|
|
13
|
+
env.KEYCLOAK_CLIENT_ID,
|
|
14
|
+
env.KEYCLOAK_CLIENT_SECRET,
|
|
15
|
+
getRedirectUriForCallback(id).toString(),
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
// PUBLIC API
|
|
19
|
+
export const keycloak = defineProvider({
|
|
20
|
+
id,
|
|
21
|
+
displayName,
|
|
22
|
+
oAuthClient,
|
|
23
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{{={= =}=}}
|
|
2
|
+
import { Slack } from 'arctic';
|
|
3
|
+
|
|
4
|
+
import { defineProvider } from '../provider.js';
|
|
5
|
+
import { getRedirectUriForCallback } from '../redirect.js';
|
|
6
|
+
import { env } from '../../../env.js';
|
|
7
|
+
|
|
8
|
+
const id = '{= providerId =}';
|
|
9
|
+
const displayName = '{= displayName =}';
|
|
10
|
+
|
|
11
|
+
const oAuthClient = new Slack(
|
|
12
|
+
env.SLACK_CLIENT_ID,
|
|
13
|
+
env.SLACK_CLIENT_SECRET,
|
|
14
|
+
getRedirectUriForCallback(id).toString(),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
// PUBLIC API
|
|
18
|
+
export const slack = defineProvider({
|
|
19
|
+
id,
|
|
20
|
+
displayName,
|
|
21
|
+
oAuthClient,
|
|
22
|
+
});
|