@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.
Files changed (410) hide show
  1. package/data/Cli/starters/README.md +22 -0
  2. package/data/Cli/starters/basic/README.md +35 -0
  3. package/data/Cli/starters/basic/eslint.config.js +24 -0
  4. package/data/Cli/starters/basic/main.wasp +100 -0
  5. package/data/Cli/starters/basic/package.json +29 -0
  6. package/data/Cli/starters/basic/postcss.config.js +6 -0
  7. package/data/Cli/starters/basic/schema.prisma +42 -0
  8. package/data/Cli/starters/basic/src/App.css +13 -0
  9. package/data/Cli/starters/basic/src/App.tsx +12 -0
  10. package/data/Cli/starters/basic/src/assets/logo.svg +1 -0
  11. package/data/Cli/starters/basic/src/auth/AuthLayout.tsx +10 -0
  12. package/data/Cli/starters/basic/src/auth/email/EmailVerificationPage.tsx +19 -0
  13. package/data/Cli/starters/basic/src/auth/email/LoginPage.tsx +27 -0
  14. package/data/Cli/starters/basic/src/auth/email/PasswordResetPage.tsx +19 -0
  15. package/data/Cli/starters/basic/src/auth/email/RequestPasswordResetPage.tsx +10 -0
  16. package/data/Cli/starters/basic/src/auth/email/SignupPage.tsx +34 -0
  17. package/data/Cli/starters/basic/src/auth/email/userSignupFields.ts +13 -0
  18. package/data/Cli/starters/basic/src/shared/components/Button.tsx +90 -0
  19. package/data/Cli/starters/basic/src/shared/components/Dialog.tsx +85 -0
  20. package/data/Cli/starters/basic/src/shared/components/Header.tsx +39 -0
  21. package/data/Cli/starters/basic/src/shared/components/Input.tsx +36 -0
  22. package/data/Cli/starters/basic/src/shared/components/Portal.tsx +26 -0
  23. package/data/Cli/starters/basic/src/tags/actions.ts +23 -0
  24. package/data/Cli/starters/basic/src/tags/components/ColorRadioButton.tsx +44 -0
  25. package/data/Cli/starters/basic/src/tags/components/ColorRadioButtons.tsx +59 -0
  26. package/data/Cli/starters/basic/src/tags/components/CreateTagDialog.tsx +50 -0
  27. package/data/Cli/starters/basic/src/tags/components/CreateTagForm.tsx +100 -0
  28. package/data/Cli/starters/basic/src/tags/components/TagLabel.tsx +55 -0
  29. package/data/Cli/starters/basic/src/tags/components/colors.ts +8 -0
  30. package/data/Cli/starters/basic/src/tags/queries.ts +14 -0
  31. package/data/Cli/starters/basic/src/tasks/TasksPage.tsx +19 -0
  32. package/data/Cli/starters/basic/src/tasks/actions.ts +71 -0
  33. package/data/Cli/starters/basic/src/tasks/components/CreateTaskForm.tsx +103 -0
  34. package/data/Cli/starters/basic/src/tasks/components/TaskList.tsx +68 -0
  35. package/data/Cli/starters/basic/src/tasks/components/TaskListItem.tsx +56 -0
  36. package/data/Cli/starters/basic/src/tasks/queries.ts +21 -0
  37. package/data/Cli/starters/basic/tailwind.config.js +30 -0
  38. package/data/Cli/starters/basic/vite.config.ts +7 -0
  39. package/data/Cli/starters/minimal/main.wasp +14 -0
  40. package/data/Cli/starters/minimal/package.json +18 -0
  41. package/data/Cli/starters/minimal/schema.prisma +10 -0
  42. package/data/Cli/starters/minimal/src/Main.css +103 -0
  43. package/data/Cli/starters/minimal/src/MainPage.tsx +37 -0
  44. package/data/Cli/starters/minimal/src/assets/logo.svg +1 -0
  45. package/data/Cli/starters/minimal/vite.config.ts +7 -0
  46. package/data/Cli/starters/skeleton/public/favicon.ico +0 -0
  47. package/data/Cli/starters/skeleton/src/vite-env.d.ts +7 -0
  48. package/data/Cli/starters/skeleton/tsconfig.json +28 -0
  49. package/data/Generator/templates/Dockerfile +78 -0
  50. package/data/Generator/templates/db/schema.prisma +24 -0
  51. package/data/Generator/templates/dockerignore +2 -0
  52. package/data/Generator/templates/react-app/README.md +21 -0
  53. package/data/Generator/templates/react-app/gitignore +23 -0
  54. package/data/Generator/templates/react-app/index.html +22 -0
  55. package/data/Generator/templates/react-app/netlify.toml +8 -0
  56. package/data/Generator/templates/react-app/npmrc +1 -0
  57. package/data/Generator/templates/react-app/package.json +31 -0
  58. package/data/Generator/templates/react-app/public/manifest.json +15 -0
  59. package/data/Generator/templates/react-app/src/auth/pages/OAuthCallback.tsx +93 -0
  60. package/data/Generator/templates/react-app/src/auth/pages/createAuthRequiredPage.jsx +40 -0
  61. package/data/Generator/templates/react-app/src/components/DefaultRootErrorBoundary.tsx +16 -0
  62. package/data/Generator/templates/react-app/src/components/FullPageWrapper.tsx +21 -0
  63. package/data/Generator/templates/react-app/src/components/Loader.module.css +37 -0
  64. package/data/Generator/templates/react-app/src/components/Loader.tsx +12 -0
  65. package/data/Generator/templates/react-app/src/components/Message.tsx +86 -0
  66. package/data/Generator/templates/react-app/src/index.tsx +47 -0
  67. package/data/Generator/templates/react-app/src/logo.png +0 -0
  68. package/data/Generator/templates/react-app/src/router.tsx +59 -0
  69. package/data/Generator/templates/react-app/src/test/vitest/setup.ts +8 -0
  70. package/data/Generator/templates/react-app/src/utils.js +3 -0
  71. package/data/Generator/templates/react-app/src/vite-env.d.ts +1 -0
  72. package/data/Generator/templates/react-app/tsconfig.app.json +28 -0
  73. package/data/Generator/templates/react-app/tsconfig.json +11 -0
  74. package/data/Generator/templates/react-app/tsconfig.vite.json +16 -0
  75. package/data/Generator/templates/react-app/vite/detectServerImports.ts +53 -0
  76. package/data/Generator/templates/react-app/vite/validateEnv.ts +45 -0
  77. package/data/Generator/templates/react-app/vite.config.ts +74 -0
  78. package/data/Generator/templates/sdk/wasp/api/events.ts +11 -0
  79. package/data/Generator/templates/sdk/wasp/api/index.ts +136 -0
  80. package/data/Generator/templates/sdk/wasp/auth/email/actions/login.ts +13 -0
  81. package/data/Generator/templates/sdk/wasp/auth/email/actions/passwordReset.ts +22 -0
  82. package/data/Generator/templates/sdk/wasp/auth/email/actions/signup.ts +20 -0
  83. package/data/Generator/templates/sdk/wasp/auth/email/actions/verifyEmail.ts +14 -0
  84. package/data/Generator/templates/sdk/wasp/auth/email/index.ts +5 -0
  85. package/data/Generator/templates/sdk/wasp/auth/forms/Auth.module.css +16 -0
  86. package/data/Generator/templates/sdk/wasp/auth/forms/Auth.tsx +94 -0
  87. package/data/Generator/templates/sdk/wasp/auth/forms/ForgotPassword.tsx +18 -0
  88. package/data/Generator/templates/sdk/wasp/auth/forms/Login.tsx +18 -0
  89. package/data/Generator/templates/sdk/wasp/auth/forms/ResetPassword.tsx +18 -0
  90. package/data/Generator/templates/sdk/wasp/auth/forms/Signup.tsx +24 -0
  91. package/data/Generator/templates/sdk/wasp/auth/forms/VerifyEmail.tsx +18 -0
  92. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.module.css +99 -0
  93. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.tsx +74 -0
  94. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.module.css +22 -0
  95. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.tsx +34 -0
  96. package/data/Generator/templates/sdk/wasp/auth/forms/internal/auth-styles.css +30 -0
  97. package/data/Generator/templates/sdk/wasp/auth/forms/internal/common/LoginSignupForm.module.css +55 -0
  98. package/data/Generator/templates/sdk/wasp/auth/forms/internal/common/LoginSignupForm.tsx +291 -0
  99. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ForgotPasswordForm.tsx +52 -0
  100. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ResetPasswordForm.tsx +82 -0
  101. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/VerifyEmailForm.tsx +43 -0
  102. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/useEmail.ts +33 -0
  103. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.module.css +33 -0
  104. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.tsx +14 -0
  105. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.module.css +4 -0
  106. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.tsx +74 -0
  107. package/data/Generator/templates/sdk/wasp/auth/forms/internal/usernameAndPassword/useUsernameAndPassword.ts +29 -0
  108. package/data/Generator/templates/sdk/wasp/auth/forms/internal/util.ts +16 -0
  109. package/data/Generator/templates/sdk/wasp/auth/forms/types.ts +77 -0
  110. package/data/Generator/templates/sdk/wasp/auth/helpers/_Provider.tsx +17 -0
  111. package/data/Generator/templates/sdk/wasp/auth/helpers/user.ts +15 -0
  112. package/data/Generator/templates/sdk/wasp/auth/index.ts +9 -0
  113. package/data/Generator/templates/sdk/wasp/auth/jwt.ts +22 -0
  114. package/data/Generator/templates/sdk/wasp/auth/logout.ts +18 -0
  115. package/data/Generator/templates/sdk/wasp/auth/lucia.ts +53 -0
  116. package/data/Generator/templates/sdk/wasp/auth/password.ts +36 -0
  117. package/data/Generator/templates/sdk/wasp/auth/providers/index.ts +9 -0
  118. package/data/Generator/templates/sdk/wasp/auth/providers/types.ts +68 -0
  119. package/data/Generator/templates/sdk/wasp/auth/session.ts +78 -0
  120. package/data/Generator/templates/sdk/wasp/auth/types.ts +2 -0
  121. package/data/Generator/templates/sdk/wasp/auth/useAuth.ts +37 -0
  122. package/data/Generator/templates/sdk/wasp/auth/user.ts +63 -0
  123. package/data/Generator/templates/sdk/wasp/auth/username/actions/login.ts +13 -0
  124. package/data/Generator/templates/sdk/wasp/auth/username/actions/signup.ts +20 -0
  125. package/data/Generator/templates/sdk/wasp/auth/username/index.ts +2 -0
  126. package/data/Generator/templates/sdk/wasp/auth/utils.ts +369 -0
  127. package/data/Generator/templates/sdk/wasp/auth/validation.ts +83 -0
  128. package/data/Generator/templates/sdk/wasp/client/auth/discord.ts +2 -0
  129. package/data/Generator/templates/sdk/wasp/client/auth/email.ts +5 -0
  130. package/data/Generator/templates/sdk/wasp/client/auth/github.ts +2 -0
  131. package/data/Generator/templates/sdk/wasp/client/auth/google.ts +2 -0
  132. package/data/Generator/templates/sdk/wasp/client/auth/index.ts +29 -0
  133. package/data/Generator/templates/sdk/wasp/client/auth/keycloak.ts +2 -0
  134. package/data/Generator/templates/sdk/wasp/client/auth/slack.ts +2 -0
  135. package/data/Generator/templates/sdk/wasp/client/auth/ui.ts +32 -0
  136. package/data/Generator/templates/sdk/wasp/client/auth/username.ts +2 -0
  137. package/data/Generator/templates/sdk/wasp/client/config.ts +15 -0
  138. package/data/Generator/templates/sdk/wasp/client/crud/_crud.ts +89 -0
  139. package/data/Generator/templates/sdk/wasp/client/crud/index.ts +4 -0
  140. package/data/Generator/templates/sdk/wasp/client/crud/operationsHelpers.ts +21 -0
  141. package/data/Generator/templates/sdk/wasp/client/env/schema.ts +22 -0
  142. package/data/Generator/templates/sdk/wasp/client/env.ts +5 -0
  143. package/data/Generator/templates/sdk/wasp/client/hooks.ts +19 -0
  144. package/data/Generator/templates/sdk/wasp/client/index.ts +17 -0
  145. package/data/Generator/templates/sdk/wasp/client/operations/actions/core.ts +49 -0
  146. package/data/Generator/templates/sdk/wasp/client/operations/actions/index.ts +13 -0
  147. package/data/Generator/templates/sdk/wasp/client/operations/hooks.ts +347 -0
  148. package/data/Generator/templates/sdk/wasp/client/operations/index.ts +22 -0
  149. package/data/Generator/templates/sdk/wasp/client/operations/internal/index.ts +22 -0
  150. package/data/Generator/templates/sdk/wasp/client/operations/internal/resources.js +83 -0
  151. package/data/Generator/templates/sdk/wasp/client/operations/internal/updateHandlersMap.js +37 -0
  152. package/data/Generator/templates/sdk/wasp/client/operations/queries/core.ts +91 -0
  153. package/data/Generator/templates/sdk/wasp/client/operations/queries/index.ts +16 -0
  154. package/data/Generator/templates/sdk/wasp/client/operations/queryClient.ts +34 -0
  155. package/data/Generator/templates/sdk/wasp/client/operations/rpc.ts +96 -0
  156. package/data/Generator/templates/sdk/wasp/client/router/Link.tsx +21 -0
  157. package/data/Generator/templates/sdk/wasp/client/router/index.ts +53 -0
  158. package/data/Generator/templates/sdk/wasp/client/router/linkHelpers.ts +48 -0
  159. package/data/Generator/templates/sdk/wasp/client/router/types.ts +98 -0
  160. package/data/Generator/templates/sdk/wasp/client/test/index.ts +1 -0
  161. package/data/Generator/templates/sdk/wasp/client/test/vitest/helpers.tsx +95 -0
  162. package/data/Generator/templates/sdk/wasp/client/webSocket/WebSocketProvider.tsx +77 -0
  163. package/data/Generator/templates/sdk/wasp/client/webSocket/index.ts +39 -0
  164. package/data/Generator/templates/sdk/wasp/core/auth.ts +40 -0
  165. package/data/Generator/templates/sdk/wasp/core/serialization/custom-register.ts +21 -0
  166. package/data/Generator/templates/sdk/wasp/core/serialization/index.ts +56 -0
  167. package/data/Generator/templates/sdk/wasp/core/serialization/prisma.ts +54 -0
  168. package/data/Generator/templates/sdk/wasp/core/storage.ts +50 -0
  169. package/data/Generator/templates/sdk/wasp/dev/index.ts +19 -0
  170. package/data/Generator/templates/sdk/wasp/entities/index.ts +28 -0
  171. package/data/Generator/templates/sdk/wasp/env/index.ts +9 -0
  172. package/data/Generator/templates/sdk/wasp/env/validation.ts +38 -0
  173. package/data/Generator/templates/sdk/wasp/package.json +152 -0
  174. package/data/Generator/templates/sdk/wasp/prisma-runtime-library.d.ts +17 -0
  175. package/data/Generator/templates/sdk/wasp/scripts/copy-assets.js +14 -0
  176. package/data/Generator/templates/sdk/wasp/server/HttpError.ts +30 -0
  177. package/data/Generator/templates/sdk/wasp/server/_types/index.ts +105 -0
  178. package/data/Generator/templates/sdk/wasp/server/_types/taggedEntities.ts +26 -0
  179. package/data/Generator/templates/sdk/wasp/server/api/index.ts +44 -0
  180. package/data/Generator/templates/sdk/wasp/server/auth/email/index.ts +20 -0
  181. package/data/Generator/templates/sdk/wasp/server/auth/email/utils.ts +104 -0
  182. package/data/Generator/templates/sdk/wasp/server/auth/hooks.ts +188 -0
  183. package/data/Generator/templates/sdk/wasp/server/auth/index.ts +49 -0
  184. package/data/Generator/templates/sdk/wasp/server/auth/oauth/index.ts +38 -0
  185. package/data/Generator/templates/sdk/wasp/server/auth/oauth/oneTimeCode.ts +50 -0
  186. package/data/Generator/templates/sdk/wasp/server/auth/oauth/provider.ts +20 -0
  187. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/discord.ts +22 -0
  188. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/github.ts +20 -0
  189. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/google.ts +22 -0
  190. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/keycloak.ts +23 -0
  191. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/slack.ts +22 -0
  192. package/data/Generator/templates/sdk/wasp/server/auth/oauth/redirect.ts +43 -0
  193. package/data/Generator/templates/sdk/wasp/server/auth/user.ts +148 -0
  194. package/data/Generator/templates/sdk/wasp/server/auth/username.ts +1 -0
  195. package/data/Generator/templates/sdk/wasp/server/config.ts +47 -0
  196. package/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts +134 -0
  197. package/data/Generator/templates/sdk/wasp/server/crud/index.ts +5 -0
  198. package/data/Generator/templates/sdk/wasp/server/dbClient.ts +35 -0
  199. package/data/Generator/templates/sdk/wasp/server/email/core/helpers.ts +40 -0
  200. package/data/Generator/templates/sdk/wasp/server/email/core/index.ts +17 -0
  201. package/data/Generator/templates/sdk/wasp/server/email/core/providers/dummy.ts +34 -0
  202. package/data/Generator/templates/sdk/wasp/server/email/core/providers/mailgun.ts +31 -0
  203. package/data/Generator/templates/sdk/wasp/server/email/core/providers/sendgrid.ts +44 -0
  204. package/data/Generator/templates/sdk/wasp/server/email/core/providers/smtp.ts +29 -0
  205. package/data/Generator/templates/sdk/wasp/server/email/core/types.ts +59 -0
  206. package/data/Generator/templates/sdk/wasp/server/email/index.ts +39 -0
  207. package/data/Generator/templates/sdk/wasp/server/env.ts +173 -0
  208. package/data/Generator/templates/sdk/wasp/server/index.ts +17 -0
  209. package/data/Generator/templates/sdk/wasp/server/jobs/_job.ts +39 -0
  210. package/data/Generator/templates/sdk/wasp/server/jobs/core/job.ts +28 -0
  211. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/index.ts +3 -0
  212. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/pgBoss.ts +76 -0
  213. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/pgBossJob.ts +230 -0
  214. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/types.ts +9 -0
  215. package/data/Generator/templates/sdk/wasp/server/jobs/index.ts +5 -0
  216. package/data/Generator/templates/sdk/wasp/server/middleware/globalMiddleware.ts +8 -0
  217. package/data/Generator/templates/sdk/wasp/server/middleware/index.ts +1 -0
  218. package/data/Generator/templates/sdk/wasp/server/operations/actions/index.ts +41 -0
  219. package/data/Generator/templates/sdk/wasp/server/operations/actions/types.ts +35 -0
  220. package/data/Generator/templates/sdk/wasp/server/operations/index.ts +13 -0
  221. package/data/Generator/templates/sdk/wasp/server/operations/queries/index.ts +42 -0
  222. package/data/Generator/templates/sdk/wasp/server/operations/queries/types.ts +36 -0
  223. package/data/Generator/templates/sdk/wasp/server/operations/wrappers.ts +242 -0
  224. package/data/Generator/templates/sdk/wasp/server/types/index.ts +11 -0
  225. package/data/Generator/templates/sdk/wasp/server/utils.ts +38 -0
  226. package/data/Generator/templates/sdk/wasp/server/webSocket/index.ts +57 -0
  227. package/data/Generator/templates/sdk/wasp/tsconfig.json +102 -0
  228. package/data/Generator/templates/sdk/wasp/universal/ansiColors.ts +14 -0
  229. package/data/Generator/templates/sdk/wasp/universal/predicates.ts +3 -0
  230. package/data/Generator/templates/sdk/wasp/universal/types.ts +74 -0
  231. package/data/Generator/templates/sdk/wasp/universal/url.ts +9 -0
  232. package/data/Generator/templates/sdk/wasp/universal/validators.ts +21 -0
  233. package/data/Generator/templates/sdk/wasp/vite-env.d.ts +1 -0
  234. package/data/Generator/templates/server/README.md +1 -0
  235. package/data/Generator/templates/server/gitignore +6 -0
  236. package/data/Generator/templates/server/nodemon.json +13 -0
  237. package/data/Generator/templates/server/npmrc +1 -0
  238. package/data/Generator/templates/server/package.json +27 -0
  239. package/data/Generator/templates/server/rollup.config.js +44 -0
  240. package/data/Generator/templates/server/src/actions/_action.ts +18 -0
  241. package/data/Generator/templates/server/src/app.js +36 -0
  242. package/data/Generator/templates/server/src/auth/hooks.ts +135 -0
  243. package/data/Generator/templates/server/src/auth/providers/config/discord.ts +69 -0
  244. package/data/Generator/templates/server/src/auth/providers/config/email.ts +96 -0
  245. package/data/Generator/templates/server/src/auth/providers/config/github.ts +78 -0
  246. package/data/Generator/templates/server/src/auth/providers/config/google.ts +65 -0
  247. package/data/Generator/templates/server/src/auth/providers/config/keycloak.ts +67 -0
  248. package/data/Generator/templates/server/src/auth/providers/config/slack.ts +65 -0
  249. package/data/Generator/templates/server/src/auth/providers/config/username.ts +33 -0
  250. package/data/Generator/templates/server/src/auth/providers/email/login.ts +66 -0
  251. package/data/Generator/templates/server/src/auth/providers/email/requestPasswordReset.ts +74 -0
  252. package/data/Generator/templates/server/src/auth/providers/email/resetPassword.ts +48 -0
  253. package/data/Generator/templates/server/src/auth/providers/email/signup.ts +165 -0
  254. package/data/Generator/templates/server/src/auth/providers/email/verifyEmail.ts +42 -0
  255. package/data/Generator/templates/server/src/auth/providers/index.ts +32 -0
  256. package/data/Generator/templates/server/src/auth/providers/oauth/config.ts +19 -0
  257. package/data/Generator/templates/server/src/auth/providers/oauth/cookies.ts +35 -0
  258. package/data/Generator/templates/server/src/auth/providers/oauth/handler.ts +130 -0
  259. package/data/Generator/templates/server/src/auth/providers/oauth/oneTimeCode.ts +39 -0
  260. package/data/Generator/templates/server/src/auth/providers/oauth/state.ts +144 -0
  261. package/data/Generator/templates/server/src/auth/providers/oauth/types.ts +7 -0
  262. package/data/Generator/templates/server/src/auth/providers/oauth/user.ts +139 -0
  263. package/data/Generator/templates/server/src/auth/providers/username/login.ts +64 -0
  264. package/data/Generator/templates/server/src/auth/providers/username/signup.ts +59 -0
  265. package/data/Generator/templates/server/src/crud/_operations.ts +184 -0
  266. package/data/Generator/templates/server/src/dbSeed.ts +37 -0
  267. package/data/Generator/templates/server/src/jobs/_job.ts +9 -0
  268. package/data/Generator/templates/server/src/jobs/core/allJobs.ts +8 -0
  269. package/data/Generator/templates/server/src/middleware/globalMiddleware.ts +45 -0
  270. package/data/Generator/templates/server/src/middleware/index.ts +1 -0
  271. package/data/Generator/templates/server/src/middleware/operations.ts +28 -0
  272. package/data/Generator/templates/server/src/queries/_query.ts +18 -0
  273. package/data/Generator/templates/server/src/routes/apis/index.ts +67 -0
  274. package/data/Generator/templates/server/src/routes/auth/index.js +16 -0
  275. package/data/Generator/templates/server/src/routes/auth/logout.ts +12 -0
  276. package/data/Generator/templates/server/src/routes/auth/me.ts +10 -0
  277. package/data/Generator/templates/server/src/routes/crud/_crud.ts +46 -0
  278. package/data/Generator/templates/server/src/routes/crud/index.ts +12 -0
  279. package/data/Generator/templates/server/src/routes/index.js +55 -0
  280. package/data/Generator/templates/server/src/routes/operations/_action.js +5 -0
  281. package/data/Generator/templates/server/src/routes/operations/_query.js +5 -0
  282. package/data/Generator/templates/server/src/routes/operations/index.js +18 -0
  283. package/data/Generator/templates/server/src/server.ts +76 -0
  284. package/data/Generator/templates/server/src/views/wrong-port.ts +123 -0
  285. package/data/Generator/templates/server/src/webSocket/initialization.ts +59 -0
  286. package/data/Generator/templates/server/tsconfig.json +41 -0
  287. package/data/Lsp/templates/ts/action.fn.ts +12 -0
  288. package/data/Lsp/templates/ts/operation.fn.js +7 -0
  289. package/data/Lsp/templates/ts/page.component.jsx +9 -0
  290. package/data/Lsp/templates/ts/query.fn.ts +12 -0
  291. package/data/packages/deploy/dist/common/brandedTypes.js +2 -0
  292. package/data/packages/deploy/dist/common/clientApp.js +26 -0
  293. package/data/packages/deploy/dist/common/commander.js +8 -0
  294. package/data/packages/deploy/dist/common/random.js +5 -0
  295. package/data/packages/deploy/dist/common/terminal.js +24 -0
  296. package/data/packages/deploy/dist/common/typeUtils.js +2 -0
  297. package/data/packages/deploy/dist/common/validation.js +14 -0
  298. package/data/packages/deploy/dist/common/waspBuild.js +21 -0
  299. package/data/packages/deploy/dist/common/waspProject.js +43 -0
  300. package/data/packages/deploy/dist/common/zx.js +10 -0
  301. package/data/packages/deploy/dist/index.js +30 -0
  302. package/data/packages/deploy/dist/providers/fly/CommonCmdOptions.js +2 -0
  303. package/data/packages/deploy/dist/providers/fly/CommonOps.js +36 -0
  304. package/data/packages/deploy/dist/providers/fly/DeploymentInstructions.js +12 -0
  305. package/data/packages/deploy/dist/providers/fly/commands/cmd/CmdCmdOptions.js +2 -0
  306. package/data/packages/deploy/dist/providers/fly/commands/cmd/cmd.js +29 -0
  307. package/data/packages/deploy/dist/providers/fly/commands/createDb/CreateDbCmdOptions.js +2 -0
  308. package/data/packages/deploy/dist/providers/fly/commands/createDb/createDb.js +55 -0
  309. package/data/packages/deploy/dist/providers/fly/commands/deploy/DeployCmdOptions.js +2 -0
  310. package/data/packages/deploy/dist/providers/fly/commands/deploy/deploy.js +88 -0
  311. package/data/packages/deploy/dist/providers/fly/commands/launch/LaunchCmdOptions.js +2 -0
  312. package/data/packages/deploy/dist/providers/fly/commands/launch/launch.js +17 -0
  313. package/data/packages/deploy/dist/providers/fly/commands/setup/SetupCmdOptions.js +2 -0
  314. package/data/packages/deploy/dist/providers/fly/commands/setup/setup.js +141 -0
  315. package/data/packages/deploy/dist/providers/fly/flyAppUrl.js +4 -0
  316. package/data/packages/deploy/dist/providers/fly/flyCli.js +74 -0
  317. package/data/packages/deploy/dist/providers/fly/index.js +121 -0
  318. package/data/packages/deploy/dist/providers/fly/jsonOutputSchemas.js +37 -0
  319. package/data/packages/deploy/dist/providers/fly/tomlFile.js +65 -0
  320. package/data/packages/deploy/dist/providers/railway/DeploymentInstructions.js +11 -0
  321. package/data/packages/deploy/dist/providers/railway/brandedTypes.js +2 -0
  322. package/data/packages/deploy/dist/providers/railway/commands/deploy/DeployCmdOptions.js +2 -0
  323. package/data/packages/deploy/dist/providers/railway/commands/deploy/client.js +22 -0
  324. package/data/packages/deploy/dist/providers/railway/commands/deploy/common.js +40 -0
  325. package/data/packages/deploy/dist/providers/railway/commands/deploy/index.js +57 -0
  326. package/data/packages/deploy/dist/providers/railway/commands/deploy/server.js +17 -0
  327. package/data/packages/deploy/dist/providers/railway/commands/launch/LaunchCmdOptions.js +2 -0
  328. package/data/packages/deploy/dist/providers/railway/commands/launch/launch.js +9 -0
  329. package/data/packages/deploy/dist/providers/railway/commands/setup/SetupCmdOptions.js +2 -0
  330. package/data/packages/deploy/dist/providers/railway/commands/setup/setup.js +146 -0
  331. package/data/packages/deploy/dist/providers/railway/index.js +83 -0
  332. package/data/packages/deploy/dist/providers/railway/jsonOutputSchemas.js +19 -0
  333. package/data/packages/deploy/dist/providers/railway/ports.js +6 -0
  334. package/data/packages/deploy/dist/providers/railway/railwayCli.js +85 -0
  335. package/data/packages/deploy/dist/providers/railway/railwayProject/RailwayProject.js +14 -0
  336. package/data/packages/deploy/dist/providers/railway/railwayProject/cli.js +80 -0
  337. package/data/packages/deploy/dist/providers/railway/railwayProject/index.js +48 -0
  338. package/data/packages/deploy/dist/providers/railway/railwayService/nameGenerator.js +24 -0
  339. package/data/packages/deploy/dist/providers/railway/railwayService/url.js +32 -0
  340. package/data/packages/deploy/package-lock.json +3536 -0
  341. package/data/packages/deploy/package.json +29 -0
  342. package/data/packages/prisma/dist/format.js +35 -0
  343. package/data/packages/prisma/dist/index.js +33 -0
  344. package/data/packages/prisma/package-lock.json +5101 -0
  345. package/data/packages/prisma/package.json +30 -0
  346. package/data/packages/studio/dist/index.js +48 -0
  347. package/data/packages/studio/dist/public/assets/Flow-b5112d3d.js +26 -0
  348. package/data/packages/studio/dist/public/assets/index-17ce6ed4.css +1 -0
  349. package/data/packages/studio/dist/public/assets/index-62a9d21a.js +120 -0
  350. package/data/packages/studio/dist/public/index.html +14 -0
  351. package/data/packages/studio/package-lock.json +1866 -0
  352. package/data/packages/studio/package.json +33 -0
  353. package/data/packages/ts-inspect/dist/exports.js +82 -0
  354. package/data/packages/ts-inspect/dist/index.js +28 -0
  355. package/data/packages/ts-inspect/package-lock.json +4947 -0
  356. package/data/packages/ts-inspect/package.json +31 -0
  357. package/data/packages/wasp-config/dist/__tests__/appAnalyzer.unit.test.d.ts +2 -0
  358. package/data/packages/wasp-config/dist/__tests__/appAnalyzer.unit.test.d.ts.map +1 -0
  359. package/data/packages/wasp-config/dist/__tests__/appAnalyzer.unit.test.js +59 -0
  360. package/data/packages/wasp-config/dist/__tests__/cli.unit.test.d.ts +2 -0
  361. package/data/packages/wasp-config/dist/__tests__/cli.unit.test.d.ts.map +1 -0
  362. package/data/packages/wasp-config/dist/__tests__/cli.unit.test.js +65 -0
  363. package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.integration.test.d.ts +2 -0
  364. package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.integration.test.d.ts.map +1 -0
  365. package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.integration.test.js +126 -0
  366. package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.unit.test.d.ts +2 -0
  367. package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.unit.test.d.ts.map +1 -0
  368. package/data/packages/wasp-config/dist/__tests__/mapTsAppSpecToAppSpecDecls.unit.test.js +743 -0
  369. package/data/packages/wasp-config/dist/__tests__/testFixtures.d.ts +224 -0
  370. package/data/packages/wasp-config/dist/__tests__/testFixtures.d.ts.map +1 -0
  371. package/data/packages/wasp-config/dist/__tests__/testFixtures.js +656 -0
  372. package/data/packages/wasp-config/dist/__tests__/testFixtures.test-d.d.ts +2 -0
  373. package/data/packages/wasp-config/dist/__tests__/testFixtures.test-d.d.ts.map +1 -0
  374. package/data/packages/wasp-config/dist/__tests__/testFixtures.test-d.js +57 -0
  375. package/data/packages/wasp-config/dist/src/_private.d.ts +2 -0
  376. package/data/packages/wasp-config/dist/src/_private.d.ts.map +1 -0
  377. package/data/packages/wasp-config/dist/src/_private.js +1 -0
  378. package/data/packages/wasp-config/dist/src/appAnalyzer.d.ts +16 -0
  379. package/data/packages/wasp-config/dist/src/appAnalyzer.d.ts.map +1 -0
  380. package/data/packages/wasp-config/dist/src/appAnalyzer.js +34 -0
  381. package/data/packages/wasp-config/dist/src/appSpec.d.ts +223 -0
  382. package/data/packages/wasp-config/dist/src/appSpec.d.ts.map +1 -0
  383. package/data/packages/wasp-config/dist/src/appSpec.js +6 -0
  384. package/data/packages/wasp-config/dist/src/branded.d.ts +7 -0
  385. package/data/packages/wasp-config/dist/src/branded.d.ts.map +1 -0
  386. package/data/packages/wasp-config/dist/src/branded.js +1 -0
  387. package/data/packages/wasp-config/dist/src/cli.d.ts +6 -0
  388. package/data/packages/wasp-config/dist/src/cli.d.ts.map +1 -0
  389. package/data/packages/wasp-config/dist/src/cli.js +24 -0
  390. package/data/packages/wasp-config/dist/src/index.d.ts +8 -0
  391. package/data/packages/wasp-config/dist/src/index.d.ts.map +1 -0
  392. package/data/packages/wasp-config/dist/src/index.js +1 -0
  393. package/data/packages/wasp-config/dist/src/mapTsAppSpecToAppSpecDecls.d.ts +38 -0
  394. package/data/packages/wasp-config/dist/src/mapTsAppSpecToAppSpecDecls.d.ts.map +1 -0
  395. package/data/packages/wasp-config/dist/src/mapTsAppSpecToAppSpecDecls.js +294 -0
  396. package/data/packages/wasp-config/dist/src/publicApi/App.d.ts +24 -0
  397. package/data/packages/wasp-config/dist/src/publicApi/App.d.ts.map +1 -0
  398. package/data/packages/wasp-config/dist/src/publicApi/App.js +75 -0
  399. package/data/packages/wasp-config/dist/src/publicApi/tsAppSpec.d.ts +171 -0
  400. package/data/packages/wasp-config/dist/src/publicApi/tsAppSpec.d.ts.map +1 -0
  401. package/data/packages/wasp-config/dist/src/publicApi/tsAppSpec.js +1 -0
  402. package/data/packages/wasp-config/dist/src/run.d.ts +3 -0
  403. package/data/packages/wasp-config/dist/src/run.d.ts.map +1 -0
  404. package/data/packages/wasp-config/dist/src/run.js +18 -0
  405. package/data/packages/wasp-config/package-lock.json +3992 -0
  406. package/data/packages/wasp-config/package.json +39 -0
  407. package/main.js +9 -0
  408. package/package.json +1 -0
  409. package/readme.md +3 -0
  410. 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,7 @@
1
+ {{={= =}=}}
2
+
3
+ import type { Prisma } from "@prisma/client"
4
+
5
+ export type UserFieldsFromOAuthSignup = Prisma.{= userEntityName =}CreateInput
6
+
7
+ export type UserDefinedConfigFn = () => { [key: string]: any }
@@ -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
+ }