@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,67 @@
1
+ {{={= =}=}}
2
+
3
+ import type { ProviderConfig } from "wasp/auth/providers/types";
4
+ import { keycloak } from "wasp/server/auth";
5
+ import { env } from "wasp/server";
6
+ import { mergeDefaultAndUserConfig } from "../oauth/config.js";
7
+ import { createOAuthProviderRouter } from "../oauth/handler.js";
8
+
9
+ {=# userSignupFields.isDefined =}
10
+ {=& userSignupFields.importStatement =}
11
+ const _waspUserSignupFields = {= userSignupFields.importIdentifier =}
12
+ {=/ userSignupFields.isDefined =}
13
+ {=^ userSignupFields.isDefined =}
14
+ const _waspUserSignupFields = undefined
15
+ {=/ userSignupFields.isDefined =}
16
+ {=# configFn.isDefined =}
17
+ {=& configFn.importStatement =}
18
+ const _waspUserDefinedConfigFn = {= configFn.importIdentifier =}
19
+ {=/ configFn.isDefined =}
20
+ {=^ configFn.isDefined =}
21
+ const _waspUserDefinedConfigFn = undefined
22
+ {=/ configFn.isDefined =}
23
+
24
+ const _waspConfig: ProviderConfig = {
25
+ id: keycloak.id,
26
+ displayName: keycloak.displayName,
27
+ createRouter(provider) {
28
+ const config = mergeDefaultAndUserConfig({
29
+ scopes: {=& requiredScopes =},
30
+ }, _waspUserDefinedConfigFn);
31
+
32
+ async function getKeycloakProfile(accessToken: string): Promise<{
33
+ providerProfile: unknown;
34
+ providerUserId: string;
35
+ }> {
36
+ const userInfoEndpoint = `${env.KEYCLOAK_REALM_URL}/protocol/openid-connect/userinfo`;
37
+ const response = await fetch(
38
+ userInfoEndpoint,
39
+ {
40
+ headers: {
41
+ Authorization: `Bearer ${accessToken}`,
42
+ },
43
+ }
44
+ );
45
+ const providerProfile = (await response.json()) as {
46
+ sub?: string;
47
+ };
48
+
49
+ if (!providerProfile.sub) {
50
+ throw new Error("Invalid profile");
51
+ }
52
+
53
+ return { providerProfile, providerUserId: providerProfile.sub };
54
+ }
55
+
56
+ return createOAuthProviderRouter({
57
+ provider,
58
+ oAuthType: 'OAuth2WithPKCE',
59
+ userSignupFields: _waspUserSignupFields,
60
+ getAuthorizationUrl: ({ state, codeVerifier }) => keycloak.oAuthClient.createAuthorizationURL(state, codeVerifier, config),
61
+ getProviderTokens: ({ code, codeVerifier }) => keycloak.oAuthClient.validateAuthorizationCode(code, codeVerifier),
62
+ getProviderInfo: ({ accessToken }) => getKeycloakProfile(accessToken),
63
+ });
64
+ },
65
+ }
66
+
67
+ export default _waspConfig;
@@ -0,0 +1,65 @@
1
+ {{={= =}=}}
2
+ import type { ProviderConfig } from "wasp/auth/providers/types";
3
+ import { slack } from "wasp/server/auth";
4
+ import { mergeDefaultAndUserConfig } from "../oauth/config.js";
5
+ import { createOAuthProviderRouter } from "../oauth/handler.js";
6
+
7
+ {=# userSignupFields.isDefined =}
8
+ {=& userSignupFields.importStatement =}
9
+ const _waspUserSignupFields = {= userSignupFields.importIdentifier =}
10
+ {=/ userSignupFields.isDefined =}
11
+ {=^ userSignupFields.isDefined =}
12
+ const _waspUserSignupFields = undefined
13
+ {=/ userSignupFields.isDefined =}
14
+ {=# configFn.isDefined =}
15
+ {=& configFn.importStatement =}
16
+ const _waspUserDefinedConfigFn = {= configFn.importIdentifier =}
17
+ {=/ configFn.isDefined =}
18
+ {=^ configFn.isDefined =}
19
+ const _waspUserDefinedConfigFn = undefined
20
+ {=/ configFn.isDefined =}
21
+
22
+ const _waspConfig: ProviderConfig = {
23
+ id: slack.id,
24
+ displayName: slack.displayName,
25
+ createRouter(provider) {
26
+ const config = mergeDefaultAndUserConfig({
27
+ scopes: {=& requiredScopes =},
28
+ }, _waspUserDefinedConfigFn);
29
+
30
+ async function getSlackProfile(accessToken: string): Promise<{
31
+ providerProfile: unknown;
32
+ providerUserId: string;
33
+ }> {
34
+ const response = await fetch("https://slack.com/api/openid.connect.userInfo", {
35
+ headers: {
36
+ Authorization: `Bearer ${accessToken}`,
37
+ },
38
+ });
39
+
40
+ const providerProfile = (await response.json()) as {
41
+ sub?: string;
42
+ email?: string;
43
+ name?: string;
44
+ picture?: string;
45
+ };
46
+
47
+ if (!providerProfile.sub) {
48
+ throw new Error("Invalid profile");
49
+ }
50
+
51
+ return { providerProfile, providerUserId: providerProfile.sub };
52
+ }
53
+
54
+ return createOAuthProviderRouter({
55
+ provider,
56
+ oAuthType: 'OAuth2',
57
+ userSignupFields: _waspUserSignupFields,
58
+ getAuthorizationUrl: ({ state }) => slack.oAuthClient.createAuthorizationURL(state, config),
59
+ getProviderTokens: ({ code }) => slack.oAuthClient.validateAuthorizationCode(code),
60
+ getProviderInfo: ({ accessToken }) => getSlackProfile(accessToken),
61
+ });
62
+ },
63
+ }
64
+
65
+ export default _waspConfig;
@@ -0,0 +1,33 @@
1
+ {{={= =}=}}
2
+
3
+ import { Router } from "express";
4
+
5
+ import login from "../username/login.js";
6
+ import { getSignupRoute } from "../username/signup.js";
7
+ import { ProviderConfig } from "wasp/auth/providers/types";
8
+
9
+ {=# userSignupFields.isDefined =}
10
+ {=& userSignupFields.importStatement =}
11
+ const _waspUserSignupFields = {= userSignupFields.importIdentifier =}
12
+ {=/ userSignupFields.isDefined =}
13
+ {=^ userSignupFields.isDefined =}
14
+ const _waspUserSignupFields = undefined
15
+ {=/ userSignupFields.isDefined =}
16
+
17
+ const config: ProviderConfig = {
18
+ id: "{= providerId =}",
19
+ displayName: "{= displayName =}",
20
+ createRouter() {
21
+ const router = Router();
22
+
23
+ router.post('/login', login);
24
+ const signupRoute = getSignupRoute({
25
+ userSignupFields: _waspUserSignupFields,
26
+ });
27
+ router.post('/signup', signupRoute);
28
+
29
+ return router;
30
+ },
31
+ }
32
+
33
+ export default config;
@@ -0,0 +1,66 @@
1
+ import { Request, Response } from 'express';
2
+ import { createInvalidCredentialsError } from 'wasp/auth/utils'
3
+ import { verifyPassword } from 'wasp/auth/password'
4
+ import {
5
+ createProviderId,
6
+ findAuthIdentity,
7
+ findAuthWithUserBy,
8
+ getProviderDataWithPassword,
9
+ } from 'wasp/auth/utils'
10
+ import { createSession } from 'wasp/auth/session'
11
+ import { ensureValidEmail, ensurePasswordIsPresent } from 'wasp/auth/validation'
12
+ import { onBeforeLoginHook, onAfterLoginHook } from '../../hooks.js';
13
+
14
+ export function getLoginRoute() {
15
+ return async function login(
16
+ req: Request<{ email: string; password: string; }>,
17
+ res: Response,
18
+ ): Promise<void> {
19
+ const fields = req.body ?? {}
20
+ ensureValidArgs(fields)
21
+
22
+ const providerId = createProviderId("email", fields.email)
23
+ const authIdentity = await findAuthIdentity(providerId)
24
+ if (!authIdentity) {
25
+ throw createInvalidCredentialsError()
26
+ }
27
+ const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData)
28
+ if (!providerData.isEmailVerified) {
29
+ throw createInvalidCredentialsError()
30
+ }
31
+ try {
32
+ await verifyPassword(providerData.hashedPassword, fields.password);
33
+ } catch(e) {
34
+ throw createInvalidCredentialsError()
35
+ }
36
+
37
+ const auth = await findAuthWithUserBy({ id: authIdentity.authId })
38
+
39
+ if (auth === null) {
40
+ throw createInvalidCredentialsError()
41
+ }
42
+
43
+ await onBeforeLoginHook({
44
+ req,
45
+ providerId,
46
+ user: auth.user,
47
+ })
48
+
49
+ const session = await createSession(auth.id)
50
+
51
+ await onAfterLoginHook({
52
+ req,
53
+ providerId,
54
+ user: auth.user,
55
+ })
56
+
57
+ res.json({
58
+ sessionId: session.id,
59
+ })
60
+ };
61
+ }
62
+
63
+ function ensureValidArgs(args: object): void {
64
+ ensureValidEmail(args);
65
+ ensurePasswordIsPresent(args);
66
+ }
@@ -0,0 +1,74 @@
1
+ import { Request, Response } from 'express';
2
+ import {
3
+ createProviderId,
4
+ findAuthIdentity,
5
+ doFakeWork,
6
+ getProviderDataWithPassword,
7
+ } from 'wasp/auth/utils';
8
+ import {
9
+ createPasswordResetLink,
10
+ sendPasswordResetEmail,
11
+ isEmailResendAllowed,
12
+ } from "wasp/server/auth/email/utils";
13
+ import { ensureValidEmail } from 'wasp/auth/validation';
14
+ import type { EmailFromField } from 'wasp/server/email/core/types';
15
+ import { GetPasswordResetEmailContentFn } from 'wasp/server/auth/email';
16
+ import { HttpError } from 'wasp/server';
17
+
18
+ export function getRequestPasswordResetRoute({
19
+ fromField,
20
+ clientRoute,
21
+ getPasswordResetEmailContent,
22
+ }: {
23
+ fromField: EmailFromField;
24
+ clientRoute: string;
25
+ getPasswordResetEmailContent: GetPasswordResetEmailContentFn;
26
+ }) {
27
+ return async function requestPasswordReset(
28
+ req: Request<{ email: string; }>,
29
+ res: Response,
30
+ ): Promise<void> {
31
+ const args = req.body ?? {};
32
+ ensureValidEmail(args);
33
+
34
+ const authIdentity = await findAuthIdentity(
35
+ createProviderId("email", args.email),
36
+ );
37
+
38
+ /**
39
+ * By doing fake work, we make it harder to enumerate users by measuring
40
+ * the time it takes to respond. If we would respond immediately, an attacker
41
+ * could measure the time it takes to respond and figure out if the user exists.
42
+ */
43
+
44
+ if (!authIdentity) {
45
+ await doFakeWork();
46
+ res.json({ success: true });
47
+ return
48
+ }
49
+
50
+ const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData);
51
+ const { isResendAllowed, timeLeft } = isEmailResendAllowed(providerData, 'passwordResetSentAt');
52
+ if (!isResendAllowed) {
53
+ throw new HttpError(400, `Please wait ${timeLeft} secs before trying again.`);
54
+ }
55
+
56
+ const passwordResetLink = await createPasswordResetLink(args.email, clientRoute);
57
+ try {
58
+ const email = authIdentity.providerUserId
59
+ await sendPasswordResetEmail(
60
+ email,
61
+ {
62
+ from: fromField,
63
+ to: email,
64
+ ...getPasswordResetEmailContent({ passwordResetLink }),
65
+ },
66
+ );
67
+ } catch (e: any) {
68
+ console.error("Failed to send password reset email:", e);
69
+ throw new HttpError(500, "Failed to send password reset email.");
70
+ }
71
+
72
+ res.json({ success: true });
73
+ };
74
+ }
@@ -0,0 +1,48 @@
1
+ import { Request, Response } from 'express';
2
+ import {
3
+ createProviderId,
4
+ findAuthIdentity,
5
+ updateAuthIdentityProviderData,
6
+ getProviderDataWithPassword,
7
+ } from 'wasp/auth/utils';
8
+ import { validateJWT } from 'wasp/auth/jwt'
9
+ import { ensureTokenIsPresent, ensurePasswordIsPresent, ensureValidPassword } from 'wasp/auth/validation';
10
+ import { HttpError } from 'wasp/server';
11
+
12
+ export async function resetPassword(
13
+ req: Request<{ token: string; password: string; }>,
14
+ res: Response,
15
+ ): Promise<void> {
16
+ const args = req.body ?? {};
17
+ ensureValidArgs(args);
18
+
19
+ const { token, password } = args;
20
+ const { email } = await validateJWT<{ email: string }>(token)
21
+ .catch(() => {
22
+ throw new HttpError(400, "Password reset failed, invalid token");
23
+ });
24
+
25
+ const providerId = createProviderId('email', email);
26
+ const authIdentity = await findAuthIdentity(providerId);
27
+ if (!authIdentity) {
28
+ throw new HttpError(400, "Password reset failed, invalid token");
29
+ }
30
+
31
+ const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData);
32
+
33
+ await updateAuthIdentityProviderData(providerId, providerData, {
34
+ // The act of resetting the password verifies the email
35
+ isEmailVerified: true,
36
+ // The password will be hashed when saving the providerData
37
+ // in the DB
38
+ hashedPassword: password,
39
+ });
40
+
41
+ res.json({ success: true });
42
+ };
43
+
44
+ function ensureValidArgs(args: object): void {
45
+ ensureTokenIsPresent(args);
46
+ ensurePasswordIsPresent(args);
47
+ ensureValidPassword(args);
48
+ }
@@ -0,0 +1,165 @@
1
+ import { Request, Response } from 'express'
2
+ import type { UserSignupFields } from 'wasp/auth/providers/types'
3
+ import {
4
+ createProviderId,
5
+ createUser,
6
+ deleteUserByAuthId,
7
+ doFakeWork,
8
+ findAuthIdentity,
9
+ getProviderDataWithPassword,
10
+ rethrowPossibleAuthError,
11
+ sanitizeAndSerializeProviderData,
12
+ validateAndGetUserFields,
13
+ } from 'wasp/auth/utils'
14
+ import {
15
+ ensurePasswordIsPresent,
16
+ ensureValidEmail,
17
+ ensureValidPassword,
18
+ } from 'wasp/auth/validation'
19
+ import { HttpError } from 'wasp/server'
20
+ import { GetVerificationEmailContentFn } from 'wasp/server/auth/email'
21
+ import {
22
+ createEmailVerificationLink,
23
+ isEmailResendAllowed,
24
+ sendEmailVerificationEmail,
25
+ } from 'wasp/server/auth/email/utils'
26
+ import { EmailFromField } from 'wasp/server/email/core/types'
27
+ import { onAfterSignupHook, onBeforeSignupHook } from '../../hooks.js'
28
+
29
+ export function getSignupRoute({
30
+ userSignupFields,
31
+ fromField,
32
+ clientRoute,
33
+ getVerificationEmailContent,
34
+ isEmailAutoVerified,
35
+ }: {
36
+ userSignupFields?: UserSignupFields
37
+ fromField: EmailFromField
38
+ clientRoute: string
39
+ getVerificationEmailContent: GetVerificationEmailContentFn
40
+ isEmailAutoVerified: boolean
41
+ }) {
42
+ return async function signup(
43
+ req: Request<{ email: string; password: string }>,
44
+ res: Response,
45
+ ): Promise<void> {
46
+ const fields = req.body
47
+ ensureValidArgs(fields)
48
+
49
+ const providerId = createProviderId('email', fields.email)
50
+ const existingAuthIdentity = await findAuthIdentity(providerId)
51
+
52
+ /**
53
+ *
54
+ * There are two cases to consider in the case of an existing user:
55
+ * - if we allow unverified login
56
+ * - if the user is already verified
57
+ *
58
+ * Let's see what happens when we **don't** allow unverified login:
59
+ *
60
+ * We are handling the case of an existing auth identity in two ways:
61
+ *
62
+ * 1. If the user already exists and is verified, we don't want
63
+ * to leak that piece of info and instead we pretend that the user
64
+ * was created successfully.
65
+ * - This prevents the attacker from learning which emails already have
66
+ * an account created.
67
+ *
68
+ * 2. If the user is not verified:
69
+ * - We check when we last sent a verification email and if it was less than X seconds ago,
70
+ * we don't send another one.
71
+ * - If it was more than X seconds ago, we delete the user and create a new one.
72
+ * - This prevents the attacker from creating an account with somebody
73
+ * else's email address and therefore permanently making that email
74
+ * address unavailable for later account creation (by real owner).
75
+ */
76
+ if (existingAuthIdentity) {
77
+ const providerData = getProviderDataWithPassword<'email'>(
78
+ existingAuthIdentity.providerData,
79
+ )
80
+
81
+ // TOOD: faking work makes sense if the time spent on faking the work matches the time
82
+ // it would take to send the email. Atm, the fake work takes obviously longer than sending
83
+ // the email!
84
+ if (providerData.isEmailVerified) {
85
+ await doFakeWork()
86
+ res.json({ success: true })
87
+ return
88
+ }
89
+
90
+ // TODO: we are still leaking information here since when we are faking work
91
+ // we are not checking if the email was sent or not!
92
+ const { isResendAllowed, timeLeft } = isEmailResendAllowed(
93
+ providerData,
94
+ 'passwordResetSentAt',
95
+ )
96
+ if (!isResendAllowed) {
97
+ throw new HttpError(
98
+ 400,
99
+ `Please wait ${timeLeft} secs before trying again.`,
100
+ )
101
+ }
102
+
103
+ try {
104
+ await deleteUserByAuthId(existingAuthIdentity.authId)
105
+ } catch (e: unknown) {
106
+ rethrowPossibleAuthError(e)
107
+ }
108
+ }
109
+
110
+ const userFields = await validateAndGetUserFields(fields, userSignupFields)
111
+
112
+ const newUserProviderData = await sanitizeAndSerializeProviderData<'email'>(
113
+ {
114
+ hashedPassword: fields.password,
115
+ isEmailVerified: isEmailAutoVerified ? true : false,
116
+ emailVerificationSentAt: null,
117
+ passwordResetSentAt: null,
118
+ },
119
+ )
120
+
121
+ try {
122
+ await onBeforeSignupHook({ req, providerId })
123
+ const user = await createUser(
124
+ providerId,
125
+ newUserProviderData,
126
+ // Using any here because we want to avoid TypeScript errors and
127
+ // rely on Prisma to validate the data.
128
+ userFields as any,
129
+ )
130
+ await onAfterSignupHook({ req, providerId, user })
131
+ } catch (e: unknown) {
132
+ rethrowPossibleAuthError(e)
133
+ }
134
+
135
+ // Wasp allows for auto-verification of emails in development mode to
136
+ // make writing e2e tests easier.
137
+ if (isEmailAutoVerified) {
138
+ res.json({ success: true })
139
+ return
140
+ }
141
+
142
+ const verificationLink = await createEmailVerificationLink(
143
+ fields.email,
144
+ clientRoute,
145
+ )
146
+ try {
147
+ await sendEmailVerificationEmail(fields.email, {
148
+ from: fromField,
149
+ to: fields.email,
150
+ ...getVerificationEmailContent({ verificationLink }),
151
+ })
152
+ } catch (e: unknown) {
153
+ console.error('Failed to send email verification email:', e)
154
+ throw new HttpError(500, 'Failed to send email verification email.')
155
+ }
156
+
157
+ res.json({ success: true })
158
+ }
159
+ }
160
+
161
+ function ensureValidArgs(args: object): void {
162
+ ensureValidEmail(args)
163
+ ensurePasswordIsPresent(args)
164
+ ensureValidPassword(args)
165
+ }
@@ -0,0 +1,42 @@
1
+ import { Request, Response } from 'express';
2
+ import { validateJWT } from 'wasp/auth/jwt';
3
+ import {
4
+ createProviderId,
5
+ findAuthIdentity,
6
+ findAuthWithUserBy,
7
+ getProviderDataWithPassword,
8
+ updateAuthIdentityProviderData,
9
+ } from 'wasp/auth/utils';
10
+ import { HttpError } from 'wasp/server';
11
+ import { onAfterEmailVerifiedHook } from '../../hooks.js';
12
+
13
+
14
+ export async function verifyEmail(
15
+ req: Request<{ token: string }>,
16
+ res: Response,
17
+ ): Promise<void> {
18
+ const { token } = req.body;
19
+ const { email } = await validateJWT<{ email: string }>(token)
20
+ .catch(() => {
21
+ throw new HttpError(400, "Email verification failed, invalid token");
22
+ });
23
+
24
+ const providerId = createProviderId('email', email);
25
+ const authIdentity = await findAuthIdentity(providerId);
26
+ if (!authIdentity) {
27
+ throw new HttpError(400, "Email verification failed, invalid token");
28
+ }
29
+
30
+ const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData);
31
+
32
+ await updateAuthIdentityProviderData(providerId, providerData, {
33
+ isEmailVerified: true,
34
+ });
35
+
36
+ const auth = await findAuthWithUserBy({ id: authIdentity.authId })
37
+
38
+ await onAfterEmailVerifiedHook({ req, email, user: auth.user });
39
+
40
+ res.json({ success: true });
41
+ };
42
+
@@ -0,0 +1,32 @@
1
+ {{={= =}=}}
2
+ import { Router } from "express";
3
+ {=# isExternalAuthEnabled =}
4
+ import { setupOneTimeCodeRoute } from "./oauth/oneTimeCode";
5
+ {=/ isExternalAuthEnabled =}
6
+
7
+ {=# providers =}
8
+ {=& importStatement =}
9
+ {=/ providers =}
10
+
11
+ const providers = [
12
+ {=# providers =}
13
+ {= importIdentifier =},
14
+ {=/ providers =}
15
+ ];
16
+
17
+ const router = Router();
18
+
19
+ {=# isExternalAuthEnabled =}
20
+ // Setting up a common route for all OAuth providers to exchange
21
+ // one-time code for a session.
22
+ setupOneTimeCodeRoute(router);
23
+ {=/ isExternalAuthEnabled =}
24
+
25
+ for (const provider of providers) {
26
+ const { createRouter } = provider;
27
+ const providerRouter = createRouter(provider);
28
+ router.use(`/${provider.id}`, providerRouter);
29
+ console.log(`🚀 "${provider.displayName}" auth initialized`);
30
+ }
31
+
32
+ export default router;
@@ -0,0 +1,19 @@
1
+ export function mergeDefaultAndUserConfig<DefaultConfig extends object, UserConfig extends object>(
2
+ defaultConfig: DefaultConfig,
3
+ userConfigFn: () => UserConfig,
4
+ ): DefaultConfig & UserConfig;
5
+ export function mergeDefaultAndUserConfig<DefaultConfig extends object, UserConfig extends object>(
6
+ defaultConfig: DefaultConfig
7
+ ): DefaultConfig;
8
+ export function mergeDefaultAndUserConfig<DefaultConfig extends object, UserConfig extends object>(
9
+ defaultConfig: DefaultConfig,
10
+ userConfigFn?: () => UserConfig,
11
+ ): DefaultConfig {
12
+ if (!userConfigFn) {
13
+ return defaultConfig;
14
+ }
15
+ return {
16
+ ...defaultConfig,
17
+ ...userConfigFn(),
18
+ }
19
+ }
@@ -0,0 +1,35 @@
1
+ import {
2
+ Request as ExpressRequest,
3
+ Response as ExpressResponse,
4
+ } from 'express';
5
+ import { parseCookies } from 'oslo/cookie';
6
+
7
+ import type { ProviderConfig } from 'wasp/auth/providers/types';
8
+ import { config } from 'wasp/server';
9
+
10
+ import type { OAuthStateFieldName } from './state';
11
+
12
+ export function setOAuthCookieValue(
13
+ provider: ProviderConfig,
14
+ res: ExpressResponse,
15
+ fieldName: OAuthStateFieldName,
16
+ value: string,
17
+ ): void {
18
+ const cookieName = `${provider.id}_${fieldName}`;
19
+ res.cookie(cookieName, value, {
20
+ httpOnly: true,
21
+ secure: !config.isDevelopment,
22
+ path: "/",
23
+ maxAge: 60 * 60 * 1000, // 1 hour
24
+ });
25
+ }
26
+
27
+ export function getOAuthCookieValue(
28
+ provider: ProviderConfig,
29
+ req: ExpressRequest,
30
+ fieldName: OAuthStateFieldName,
31
+ ): string {
32
+ const cookieName = `${provider.id}_${fieldName}`;
33
+ const cookies = parseCookies(req.headers.cookie ?? "");
34
+ return cookies.get(cookieName);
35
+ }