@wasp.sh/wasp-cli-darwin-arm64-unknown 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @wasp.sh/wasp-cli-darwin-arm64-unknown might be problematic. Click here for more details.

Files changed (291) hide show
  1. package/data/Cli/bash-completion +5 -0
  2. package/data/Cli/starters/README.md +22 -0
  3. package/data/Cli/starters/basic/.prettierignore +2 -0
  4. package/data/Cli/starters/basic/.prettierrc +3 -0
  5. package/data/Cli/starters/basic/README.md +35 -0
  6. package/data/Cli/starters/basic/eslint.config.js +15 -0
  7. package/data/Cli/starters/basic/main.wasp +100 -0
  8. package/data/Cli/starters/basic/package.json +27 -0
  9. package/data/Cli/starters/basic/postcss.config.cjs +6 -0
  10. package/data/Cli/starters/basic/schema.prisma +42 -0
  11. package/data/Cli/starters/basic/src/App.css +13 -0
  12. package/data/Cli/starters/basic/src/App.tsx +12 -0
  13. package/data/Cli/starters/basic/src/assets/logo.svg +1 -0
  14. package/data/Cli/starters/basic/src/auth/AuthLayout.tsx +10 -0
  15. package/data/Cli/starters/basic/src/auth/email/EmailVerificationPage.tsx +19 -0
  16. package/data/Cli/starters/basic/src/auth/email/LoginPage.tsx +27 -0
  17. package/data/Cli/starters/basic/src/auth/email/PasswordResetPage.tsx +19 -0
  18. package/data/Cli/starters/basic/src/auth/email/RequestPasswordResetPage.tsx +10 -0
  19. package/data/Cli/starters/basic/src/auth/email/SignupPage.tsx +34 -0
  20. package/data/Cli/starters/basic/src/auth/email/userSignupFields.ts +13 -0
  21. package/data/Cli/starters/basic/src/shared/components/Button.tsx +90 -0
  22. package/data/Cli/starters/basic/src/shared/components/Dialog.tsx +85 -0
  23. package/data/Cli/starters/basic/src/shared/components/Header.tsx +39 -0
  24. package/data/Cli/starters/basic/src/shared/components/Input.tsx +36 -0
  25. package/data/Cli/starters/basic/src/shared/components/Portal.tsx +26 -0
  26. package/data/Cli/starters/basic/src/tags/actions.ts +23 -0
  27. package/data/Cli/starters/basic/src/tags/components/ColorRadioButton.tsx +44 -0
  28. package/data/Cli/starters/basic/src/tags/components/ColorRadioButtons.tsx +59 -0
  29. package/data/Cli/starters/basic/src/tags/components/CreateTagDialog.tsx +50 -0
  30. package/data/Cli/starters/basic/src/tags/components/CreateTagForm.tsx +100 -0
  31. package/data/Cli/starters/basic/src/tags/components/TagLabel.tsx +55 -0
  32. package/data/Cli/starters/basic/src/tags/components/colors.ts +8 -0
  33. package/data/Cli/starters/basic/src/tags/queries.ts +14 -0
  34. package/data/Cli/starters/basic/src/tasks/TasksPage.tsx +19 -0
  35. package/data/Cli/starters/basic/src/tasks/actions.ts +71 -0
  36. package/data/Cli/starters/basic/src/tasks/components/CreateTaskForm.tsx +103 -0
  37. package/data/Cli/starters/basic/src/tasks/components/TaskList.tsx +68 -0
  38. package/data/Cli/starters/basic/src/tasks/components/TaskListItem.tsx +56 -0
  39. package/data/Cli/starters/basic/src/tasks/queries.ts +21 -0
  40. package/data/Cli/starters/basic/tailwind.config.cjs +30 -0
  41. package/data/Cli/starters/basic/vite.config.ts +7 -0
  42. package/data/Cli/starters/minimal/main.wasp +14 -0
  43. package/data/Cli/starters/minimal/package.json +16 -0
  44. package/data/Cli/starters/minimal/schema.prisma +10 -0
  45. package/data/Cli/starters/minimal/src/Main.css +103 -0
  46. package/data/Cli/starters/minimal/src/MainPage.tsx +37 -0
  47. package/data/Cli/starters/minimal/src/assets/logo.svg +1 -0
  48. package/data/Cli/starters/minimal/vite.config.ts +7 -0
  49. package/data/Cli/starters/skeleton/.waspignore +4 -0
  50. package/data/Cli/starters/skeleton/.wasproot +1 -0
  51. package/data/Cli/starters/skeleton/public/.gitkeep +0 -0
  52. package/data/Cli/starters/skeleton/public/favicon.ico +0 -0
  53. package/data/Cli/starters/skeleton/src/vite-env.d.ts +7 -0
  54. package/data/Cli/starters/skeleton/tsconfig.json +28 -0
  55. package/data/Generator/templates/Dockerfile +72 -0
  56. package/data/Generator/templates/db/schema.prisma +24 -0
  57. package/data/Generator/templates/dockerignore +2 -0
  58. package/data/Generator/templates/react-app/README.md +21 -0
  59. package/data/Generator/templates/react-app/gitignore +23 -0
  60. package/data/Generator/templates/react-app/index.html +22 -0
  61. package/data/Generator/templates/react-app/netlify.toml +8 -0
  62. package/data/Generator/templates/react-app/npmrc +1 -0
  63. package/data/Generator/templates/react-app/package.json +30 -0
  64. package/data/Generator/templates/react-app/public/manifest.json +15 -0
  65. package/data/Generator/templates/react-app/src/auth/pages/OAuthCallback.tsx +96 -0
  66. package/data/Generator/templates/react-app/src/auth/pages/createAuthRequiredPage.jsx +40 -0
  67. package/data/Generator/templates/react-app/src/components/DefaultRootErrorBoundary.tsx +16 -0
  68. package/data/Generator/templates/react-app/src/components/FullPageWrapper.tsx +21 -0
  69. package/data/Generator/templates/react-app/src/components/Loader.module.css +37 -0
  70. package/data/Generator/templates/react-app/src/components/Loader.tsx +12 -0
  71. package/data/Generator/templates/react-app/src/components/Message.tsx +86 -0
  72. package/data/Generator/templates/react-app/src/index.tsx +47 -0
  73. package/data/Generator/templates/react-app/src/logo.png +0 -0
  74. package/data/Generator/templates/react-app/src/router.tsx +57 -0
  75. package/data/Generator/templates/react-app/src/stitches.config.js +33 -0
  76. package/data/Generator/templates/react-app/src/test/vitest/setup.ts +8 -0
  77. package/data/Generator/templates/react-app/src/utils.js +3 -0
  78. package/data/Generator/templates/react-app/src/vite-env.d.ts +1 -0
  79. package/data/Generator/templates/react-app/tsconfig.app.json +20 -0
  80. package/data/Generator/templates/react-app/tsconfig.json +11 -0
  81. package/data/Generator/templates/react-app/tsconfig.vite.json +16 -0
  82. package/data/Generator/templates/react-app/vite/detectServerImports.ts +53 -0
  83. package/data/Generator/templates/react-app/vite/validateEnv.ts +45 -0
  84. package/data/Generator/templates/react-app/vite.config.ts +74 -0
  85. package/data/Generator/templates/sdk/wasp/api/events.ts +11 -0
  86. package/data/Generator/templates/sdk/wasp/api/index.ts +136 -0
  87. package/data/Generator/templates/sdk/wasp/auth/email/actions/login.ts +13 -0
  88. package/data/Generator/templates/sdk/wasp/auth/email/actions/passwordReset.ts +22 -0
  89. package/data/Generator/templates/sdk/wasp/auth/email/actions/signup.ts +20 -0
  90. package/data/Generator/templates/sdk/wasp/auth/email/actions/verifyEmail.ts +14 -0
  91. package/data/Generator/templates/sdk/wasp/auth/email/index.ts +5 -0
  92. package/data/Generator/templates/sdk/wasp/auth/forms/Auth.tsx +108 -0
  93. package/data/Generator/templates/sdk/wasp/auth/forms/ForgotPassword.tsx +18 -0
  94. package/data/Generator/templates/sdk/wasp/auth/forms/Login.tsx +18 -0
  95. package/data/Generator/templates/sdk/wasp/auth/forms/ResetPassword.tsx +18 -0
  96. package/data/Generator/templates/sdk/wasp/auth/forms/Signup.tsx +24 -0
  97. package/data/Generator/templates/sdk/wasp/auth/forms/VerifyEmail.tsx +18 -0
  98. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Form.tsx +107 -0
  99. package/data/Generator/templates/sdk/wasp/auth/forms/internal/Message.tsx +21 -0
  100. package/data/Generator/templates/sdk/wasp/auth/forms/internal/common/LoginSignupForm.tsx +356 -0
  101. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ForgotPasswordForm.tsx +52 -0
  102. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/ResetPasswordForm.tsx +82 -0
  103. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/VerifyEmailForm.tsx +42 -0
  104. package/data/Generator/templates/sdk/wasp/auth/forms/internal/email/useEmail.ts +33 -0
  105. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialButton.tsx +33 -0
  106. package/data/Generator/templates/sdk/wasp/auth/forms/internal/social/SocialIcons.tsx +78 -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/types.ts +52 -0
  109. package/data/Generator/templates/sdk/wasp/auth/helpers/_Provider.tsx +17 -0
  110. package/data/Generator/templates/sdk/wasp/auth/helpers/user.ts +15 -0
  111. package/data/Generator/templates/sdk/wasp/auth/index.ts +9 -0
  112. package/data/Generator/templates/sdk/wasp/auth/jwt.ts +22 -0
  113. package/data/Generator/templates/sdk/wasp/auth/logout.ts +18 -0
  114. package/data/Generator/templates/sdk/wasp/auth/lucia.ts +53 -0
  115. package/data/Generator/templates/sdk/wasp/auth/password.ts +36 -0
  116. package/data/Generator/templates/sdk/wasp/auth/providers/index.ts +9 -0
  117. package/data/Generator/templates/sdk/wasp/auth/providers/types.ts +68 -0
  118. package/data/Generator/templates/sdk/wasp/auth/session.ts +78 -0
  119. package/data/Generator/templates/sdk/wasp/auth/types.ts +2 -0
  120. package/data/Generator/templates/sdk/wasp/auth/useAuth.ts +37 -0
  121. package/data/Generator/templates/sdk/wasp/auth/user.ts +63 -0
  122. package/data/Generator/templates/sdk/wasp/auth/username/actions/login.ts +13 -0
  123. package/data/Generator/templates/sdk/wasp/auth/username/actions/signup.ts +20 -0
  124. package/data/Generator/templates/sdk/wasp/auth/username/index.ts +2 -0
  125. package/data/Generator/templates/sdk/wasp/auth/utils.ts +369 -0
  126. package/data/Generator/templates/sdk/wasp/auth/validation.ts +83 -0
  127. package/data/Generator/templates/sdk/wasp/client/auth/discord.ts +2 -0
  128. package/data/Generator/templates/sdk/wasp/client/auth/email.ts +5 -0
  129. package/data/Generator/templates/sdk/wasp/client/auth/github.ts +2 -0
  130. package/data/Generator/templates/sdk/wasp/client/auth/google.ts +2 -0
  131. package/data/Generator/templates/sdk/wasp/client/auth/index.ts +29 -0
  132. package/data/Generator/templates/sdk/wasp/client/auth/keycloak.ts +2 -0
  133. package/data/Generator/templates/sdk/wasp/client/auth/slack.ts +2 -0
  134. package/data/Generator/templates/sdk/wasp/client/auth/ui.ts +32 -0
  135. package/data/Generator/templates/sdk/wasp/client/auth/username.ts +2 -0
  136. package/data/Generator/templates/sdk/wasp/client/config.ts +14 -0
  137. package/data/Generator/templates/sdk/wasp/client/crud/_crud.ts +89 -0
  138. package/data/Generator/templates/sdk/wasp/client/crud/index.ts +4 -0
  139. package/data/Generator/templates/sdk/wasp/client/crud/operationsHelpers.ts +21 -0
  140. package/data/Generator/templates/sdk/wasp/client/env/schema.ts +22 -0
  141. package/data/Generator/templates/sdk/wasp/client/env.ts +5 -0
  142. package/data/Generator/templates/sdk/wasp/client/index.ts +17 -0
  143. package/data/Generator/templates/sdk/wasp/client/operations/actions/core.ts +49 -0
  144. package/data/Generator/templates/sdk/wasp/client/operations/actions/index.ts +13 -0
  145. package/data/Generator/templates/sdk/wasp/client/operations/hooks.ts +347 -0
  146. package/data/Generator/templates/sdk/wasp/client/operations/index.ts +22 -0
  147. package/data/Generator/templates/sdk/wasp/client/operations/internal/index.ts +22 -0
  148. package/data/Generator/templates/sdk/wasp/client/operations/internal/resources.js +83 -0
  149. package/data/Generator/templates/sdk/wasp/client/operations/internal/updateHandlersMap.js +37 -0
  150. package/data/Generator/templates/sdk/wasp/client/operations/queries/core.ts +91 -0
  151. package/data/Generator/templates/sdk/wasp/client/operations/queries/index.ts +16 -0
  152. package/data/Generator/templates/sdk/wasp/client/operations/queryClient.ts +34 -0
  153. package/data/Generator/templates/sdk/wasp/client/operations/rpc.ts +96 -0
  154. package/data/Generator/templates/sdk/wasp/client/router/Link.tsx +21 -0
  155. package/data/Generator/templates/sdk/wasp/client/router/index.ts +53 -0
  156. package/data/Generator/templates/sdk/wasp/client/router/linkHelpers.ts +48 -0
  157. package/data/Generator/templates/sdk/wasp/client/router/types.ts +98 -0
  158. package/data/Generator/templates/sdk/wasp/client/test/index.ts +1 -0
  159. package/data/Generator/templates/sdk/wasp/client/test/vitest/helpers.tsx +95 -0
  160. package/data/Generator/templates/sdk/wasp/client/webSocket/WebSocketProvider.tsx +77 -0
  161. package/data/Generator/templates/sdk/wasp/client/webSocket/index.ts +39 -0
  162. package/data/Generator/templates/sdk/wasp/core/auth.ts +40 -0
  163. package/data/Generator/templates/sdk/wasp/core/serialization/custom-register.ts +21 -0
  164. package/data/Generator/templates/sdk/wasp/core/serialization/index.ts +56 -0
  165. package/data/Generator/templates/sdk/wasp/core/serialization/prisma.ts +54 -0
  166. package/data/Generator/templates/sdk/wasp/core/stitches.config.ts +39 -0
  167. package/data/Generator/templates/sdk/wasp/core/storage.ts +50 -0
  168. package/data/Generator/templates/sdk/wasp/dev/index.ts +19 -0
  169. package/data/Generator/templates/sdk/wasp/entities/index.ts +28 -0
  170. package/data/Generator/templates/sdk/wasp/env/index.ts +9 -0
  171. package/data/Generator/templates/sdk/wasp/env/validation.ts +38 -0
  172. package/data/Generator/templates/sdk/wasp/package.json +151 -0
  173. package/data/Generator/templates/sdk/wasp/prisma-runtime-library.d.ts +17 -0
  174. package/data/Generator/templates/sdk/wasp/server/HttpError.ts +30 -0
  175. package/data/Generator/templates/sdk/wasp/server/_types/index.ts +105 -0
  176. package/data/Generator/templates/sdk/wasp/server/_types/taggedEntities.ts +26 -0
  177. package/data/Generator/templates/sdk/wasp/server/api/index.ts +44 -0
  178. package/data/Generator/templates/sdk/wasp/server/auth/email/index.ts +20 -0
  179. package/data/Generator/templates/sdk/wasp/server/auth/email/utils.ts +104 -0
  180. package/data/Generator/templates/sdk/wasp/server/auth/hooks.ts +188 -0
  181. package/data/Generator/templates/sdk/wasp/server/auth/index.ts +49 -0
  182. package/data/Generator/templates/sdk/wasp/server/auth/oauth/index.ts +38 -0
  183. package/data/Generator/templates/sdk/wasp/server/auth/oauth/oneTimeCode.ts +50 -0
  184. package/data/Generator/templates/sdk/wasp/server/auth/oauth/provider.ts +20 -0
  185. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/discord.ts +22 -0
  186. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/github.ts +20 -0
  187. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/google.ts +22 -0
  188. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/keycloak.ts +23 -0
  189. package/data/Generator/templates/sdk/wasp/server/auth/oauth/providers/slack.ts +22 -0
  190. package/data/Generator/templates/sdk/wasp/server/auth/oauth/redirect.ts +43 -0
  191. package/data/Generator/templates/sdk/wasp/server/auth/user.ts +148 -0
  192. package/data/Generator/templates/sdk/wasp/server/auth/username.ts +1 -0
  193. package/data/Generator/templates/sdk/wasp/server/config.ts +47 -0
  194. package/data/Generator/templates/sdk/wasp/server/crud/_operationTypes.ts +134 -0
  195. package/data/Generator/templates/sdk/wasp/server/crud/index.ts +5 -0
  196. package/data/Generator/templates/sdk/wasp/server/dbClient.ts +35 -0
  197. package/data/Generator/templates/sdk/wasp/server/email/core/helpers.ts +40 -0
  198. package/data/Generator/templates/sdk/wasp/server/email/core/index.ts +17 -0
  199. package/data/Generator/templates/sdk/wasp/server/email/core/providers/dummy.ts +34 -0
  200. package/data/Generator/templates/sdk/wasp/server/email/core/providers/mailgun.ts +31 -0
  201. package/data/Generator/templates/sdk/wasp/server/email/core/providers/sendgrid.ts +44 -0
  202. package/data/Generator/templates/sdk/wasp/server/email/core/providers/smtp.ts +29 -0
  203. package/data/Generator/templates/sdk/wasp/server/email/core/types.ts +59 -0
  204. package/data/Generator/templates/sdk/wasp/server/email/index.ts +39 -0
  205. package/data/Generator/templates/sdk/wasp/server/env.ts +168 -0
  206. package/data/Generator/templates/sdk/wasp/server/index.ts +17 -0
  207. package/data/Generator/templates/sdk/wasp/server/jobs/_job.ts +39 -0
  208. package/data/Generator/templates/sdk/wasp/server/jobs/core/job.ts +28 -0
  209. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/index.ts +3 -0
  210. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/pgBoss.ts +76 -0
  211. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/pgBossJob.ts +230 -0
  212. package/data/Generator/templates/sdk/wasp/server/jobs/core/pgBoss/types.ts +9 -0
  213. package/data/Generator/templates/sdk/wasp/server/jobs/index.ts +5 -0
  214. package/data/Generator/templates/sdk/wasp/server/middleware/globalMiddleware.ts +8 -0
  215. package/data/Generator/templates/sdk/wasp/server/middleware/index.ts +1 -0
  216. package/data/Generator/templates/sdk/wasp/server/operations/actions/index.ts +41 -0
  217. package/data/Generator/templates/sdk/wasp/server/operations/actions/types.ts +35 -0
  218. package/data/Generator/templates/sdk/wasp/server/operations/index.ts +13 -0
  219. package/data/Generator/templates/sdk/wasp/server/operations/queries/index.ts +42 -0
  220. package/data/Generator/templates/sdk/wasp/server/operations/queries/types.ts +36 -0
  221. package/data/Generator/templates/sdk/wasp/server/operations/wrappers.ts +242 -0
  222. package/data/Generator/templates/sdk/wasp/server/types/index.ts +11 -0
  223. package/data/Generator/templates/sdk/wasp/server/utils.ts +38 -0
  224. package/data/Generator/templates/sdk/wasp/server/webSocket/index.ts +57 -0
  225. package/data/Generator/templates/sdk/wasp/tsconfig.json +114 -0
  226. package/data/Generator/templates/sdk/wasp/universal/ansiColors.ts +14 -0
  227. package/data/Generator/templates/sdk/wasp/universal/predicates.ts +3 -0
  228. package/data/Generator/templates/sdk/wasp/universal/types.ts +74 -0
  229. package/data/Generator/templates/sdk/wasp/universal/url.ts +5 -0
  230. package/data/Generator/templates/sdk/wasp/universal/validators.ts +21 -0
  231. package/data/Generator/templates/sdk/wasp/vite-env.d.ts +1 -0
  232. package/data/Generator/templates/server/README.md +1 -0
  233. package/data/Generator/templates/server/gitignore +6 -0
  234. package/data/Generator/templates/server/nodemon.json +13 -0
  235. package/data/Generator/templates/server/npmrc +1 -0
  236. package/data/Generator/templates/server/package.json +27 -0
  237. package/data/Generator/templates/server/rollup.config.js +44 -0
  238. package/data/Generator/templates/server/src/actions/_action.ts +18 -0
  239. package/data/Generator/templates/server/src/app.js +36 -0
  240. package/data/Generator/templates/server/src/auth/hooks.ts +135 -0
  241. package/data/Generator/templates/server/src/auth/providers/config/discord.ts +69 -0
  242. package/data/Generator/templates/server/src/auth/providers/config/email.ts +96 -0
  243. package/data/Generator/templates/server/src/auth/providers/config/github.ts +78 -0
  244. package/data/Generator/templates/server/src/auth/providers/config/google.ts +65 -0
  245. package/data/Generator/templates/server/src/auth/providers/config/keycloak.ts +67 -0
  246. package/data/Generator/templates/server/src/auth/providers/config/slack.ts +65 -0
  247. package/data/Generator/templates/server/src/auth/providers/config/username.ts +33 -0
  248. package/data/Generator/templates/server/src/auth/providers/email/login.ts +66 -0
  249. package/data/Generator/templates/server/src/auth/providers/email/requestPasswordReset.ts +74 -0
  250. package/data/Generator/templates/server/src/auth/providers/email/resetPassword.ts +48 -0
  251. package/data/Generator/templates/server/src/auth/providers/email/signup.ts +165 -0
  252. package/data/Generator/templates/server/src/auth/providers/email/verifyEmail.ts +42 -0
  253. package/data/Generator/templates/server/src/auth/providers/index.ts +32 -0
  254. package/data/Generator/templates/server/src/auth/providers/oauth/config.ts +19 -0
  255. package/data/Generator/templates/server/src/auth/providers/oauth/cookies.ts +35 -0
  256. package/data/Generator/templates/server/src/auth/providers/oauth/handler.ts +130 -0
  257. package/data/Generator/templates/server/src/auth/providers/oauth/oneTimeCode.ts +39 -0
  258. package/data/Generator/templates/server/src/auth/providers/oauth/state.ts +144 -0
  259. package/data/Generator/templates/server/src/auth/providers/oauth/types.ts +7 -0
  260. package/data/Generator/templates/server/src/auth/providers/oauth/user.ts +139 -0
  261. package/data/Generator/templates/server/src/auth/providers/username/login.ts +64 -0
  262. package/data/Generator/templates/server/src/auth/providers/username/signup.ts +59 -0
  263. package/data/Generator/templates/server/src/crud/_operations.ts +184 -0
  264. package/data/Generator/templates/server/src/dbSeed.ts +37 -0
  265. package/data/Generator/templates/server/src/jobs/_job.ts +9 -0
  266. package/data/Generator/templates/server/src/jobs/core/allJobs.ts +8 -0
  267. package/data/Generator/templates/server/src/middleware/globalMiddleware.ts +45 -0
  268. package/data/Generator/templates/server/src/middleware/index.ts +1 -0
  269. package/data/Generator/templates/server/src/middleware/operations.ts +28 -0
  270. package/data/Generator/templates/server/src/queries/_query.ts +18 -0
  271. package/data/Generator/templates/server/src/routes/apis/index.ts +67 -0
  272. package/data/Generator/templates/server/src/routes/auth/index.js +16 -0
  273. package/data/Generator/templates/server/src/routes/auth/logout.ts +12 -0
  274. package/data/Generator/templates/server/src/routes/auth/me.ts +10 -0
  275. package/data/Generator/templates/server/src/routes/crud/_crud.ts +46 -0
  276. package/data/Generator/templates/server/src/routes/crud/index.ts +12 -0
  277. package/data/Generator/templates/server/src/routes/index.js +37 -0
  278. package/data/Generator/templates/server/src/routes/operations/_action.js +5 -0
  279. package/data/Generator/templates/server/src/routes/operations/_query.js +5 -0
  280. package/data/Generator/templates/server/src/routes/operations/index.js +18 -0
  281. package/data/Generator/templates/server/src/server.ts +76 -0
  282. package/data/Generator/templates/server/src/webSocket/initialization.ts +59 -0
  283. package/data/Generator/templates/server/tsconfig.json +41 -0
  284. package/data/Lsp/templates/ts/action.fn.ts +12 -0
  285. package/data/Lsp/templates/ts/operation.fn.js +7 -0
  286. package/data/Lsp/templates/ts/page.component.jsx +9 -0
  287. package/data/Lsp/templates/ts/query.fn.ts +12 -0
  288. package/main.js +9 -0
  289. package/package.json +1 -0
  290. package/readme.md +3 -0
  291. package/wasp-bin +0 -0
@@ -0,0 +1,26 @@
1
+ {{={= =}=}}
2
+ // Wasp internally uses the types defined in this file for typing entity maps in
3
+ // operation contexts.
4
+ //
5
+ // We must explicitly tag all entities with their name to avoid issues with
6
+ // structural typing. See https://github.com/wasp-lang/wasp/pull/982 for details.
7
+ import {
8
+ type Entity,
9
+ type EntityName,
10
+ {=# entities =}
11
+ type {= name =},
12
+ {=/ entities =}
13
+ } from 'wasp/entities'
14
+
15
+ {=# entities =}
16
+ export type {= internalTypeName =} = WithName<{= name =}, "{= name =}">
17
+ {=/ entities =}
18
+
19
+ export type _Entity =
20
+ {=# entities =}
21
+ | {= internalTypeName =}
22
+ {=/ entities =}
23
+ | never
24
+
25
+ type WithName<E extends Entity, Name extends EntityName> =
26
+ E & { _entityName: Name }
@@ -0,0 +1,44 @@
1
+ {{={= =}=}}
2
+
3
+ import { type ParamsDictionary as ExpressParams, type Query as ExpressQuery } from 'express-serve-static-core'
4
+
5
+ import {
6
+ {=# allEntities =}
7
+ type {= internalTypeName =},
8
+ {=/ allEntities =}
9
+ {=# shouldImportNonAuthenticatedApi =}
10
+ type Api,
11
+ {=/ shouldImportNonAuthenticatedApi =}
12
+ {=# shouldImportAuthenticatedApi =}
13
+ type AuthenticatedApi,
14
+ {=/ shouldImportAuthenticatedApi =}
15
+ } from '../_types'
16
+
17
+
18
+ // PUBLIC API
19
+ {=# apiRoutes =}
20
+ export type {= typeName =}<
21
+ P extends ExpressParams = ExpressParams,
22
+ ResBody = any,
23
+ ReqBody = any,
24
+ ReqQuery extends ExpressQuery = ExpressQuery,
25
+ Locals extends Record<string, any> = Record<string, any>
26
+ > =
27
+ {=# usesAuth =}
28
+ AuthenticatedApi<
29
+ {=/ usesAuth =}
30
+ {=^ usesAuth =}
31
+ Api<
32
+ {=/ usesAuth =}
33
+ [
34
+ {=# entities =}
35
+ {= internalTypeName =},
36
+ {=/ entities =}
37
+ ],
38
+ P,
39
+ ResBody,
40
+ ReqBody,
41
+ ReqQuery,
42
+ Locals
43
+ >
44
+ {=/ apiRoutes =}
@@ -0,0 +1,20 @@
1
+ // PUBLIC API
2
+ export type GetVerificationEmailContentFn = (params: { verificationLink: string }) => EmailContent;
3
+
4
+ // PUBLIC API
5
+ export type GetPasswordResetEmailContentFn = (params: { passwordResetLink: string }) => EmailContent;
6
+
7
+ type EmailContent = {
8
+ subject: string;
9
+ html: string;
10
+ text: string;
11
+ }
12
+
13
+ export {
14
+ createEmailVerificationLink,
15
+ sendEmailVerificationEmail,
16
+ createPasswordResetLink,
17
+ sendPasswordResetEmail,
18
+ isEmailResendAllowed,
19
+ } from './utils.js'
20
+ export { ensureValidEmail } from '../../../auth/validation.js'
@@ -0,0 +1,104 @@
1
+ {{={= =}=}}
2
+ import { createJWT, TimeSpan } from 'wasp/auth/jwt'
3
+ import { emailSender } from 'wasp/server/email';
4
+ import { Email } from 'wasp/server/email/core/types';
5
+ import {
6
+ createProviderId,
7
+ updateAuthIdentityProviderData,
8
+ findAuthIdentity,
9
+ getProviderDataWithPassword,
10
+ type EmailProviderData,
11
+ } from 'wasp/auth/utils';
12
+ import { config as waspServerConfig } from 'wasp/server';
13
+ import { type {= userEntityUpper =}, type {= authEntityUpper =} } from 'wasp/entities'
14
+
15
+ // PUBLIC API
16
+ export async function createEmailVerificationLink(
17
+ email: string,
18
+ clientRoute: string,
19
+ ): Promise<string> {
20
+ const { jwtToken } = await createEmailJWT(email);
21
+ return `${waspServerConfig.frontendUrl}${clientRoute}?token=${jwtToken}`;
22
+ }
23
+
24
+ // PUBLIC API
25
+ export async function createPasswordResetLink(
26
+ email: string,
27
+ clientRoute: string,
28
+ ): Promise<string> {
29
+ const { jwtToken } = await createEmailJWT(email);
30
+ return `${waspServerConfig.frontendUrl}${clientRoute}?token=${jwtToken}`;
31
+ }
32
+
33
+ async function createEmailJWT(email: string): Promise<{ jwtToken: string; }> {
34
+ const jwtToken = await createJWT({ email }, { expiresIn: new TimeSpan(30, "m") });
35
+ return { jwtToken };
36
+ }
37
+
38
+ // PUBLIC API
39
+ export async function sendPasswordResetEmail(
40
+ email: string,
41
+ content: Email,
42
+ ): Promise<void> {
43
+ return sendEmailAndSaveMetadata(email, content, {
44
+ passwordResetSentAt: (new Date()).toISOString(),
45
+ });
46
+ }
47
+
48
+ // PUBLIC API
49
+ export async function sendEmailVerificationEmail(
50
+ email: string,
51
+ content: Email,
52
+ ): Promise<void> {
53
+ return sendEmailAndSaveMetadata(email, content, {
54
+ emailVerificationSentAt: (new Date()).toISOString(),
55
+ });
56
+ }
57
+
58
+ async function sendEmailAndSaveMetadata(
59
+ email: string,
60
+ content: Email,
61
+ metadata: Partial<EmailProviderData>,
62
+ ): Promise<void> {
63
+ // Save the metadata (e.g. timestamp) first, and then send the email
64
+ // so the user can't send multiple requests while the email is being sent.
65
+ const providerId = createProviderId("email", email);
66
+ const authIdentity = await findAuthIdentity(providerId);
67
+
68
+ if (!authIdentity) {
69
+ throw new Error(`User with email: ${email} not found.`);
70
+ }
71
+
72
+ const providerData = getProviderDataWithPassword<'email'>(authIdentity.providerData);
73
+ await updateAuthIdentityProviderData<'email'>(providerId, providerData, metadata);
74
+
75
+ emailSender.send(content).catch((e) => {
76
+ console.error('Failed to send email', e);
77
+ });
78
+ }
79
+
80
+ // PUBLIC API
81
+ export function isEmailResendAllowed<Field extends 'emailVerificationSentAt' | 'passwordResetSentAt'>(
82
+ fields: {
83
+ [field in Field]: string | null
84
+ },
85
+ field: Field,
86
+ resendInterval: number = 1000 * 60,
87
+ ): {
88
+ isResendAllowed: boolean;
89
+ timeLeft: number;
90
+ } {
91
+ const sentAt = fields[field];
92
+ if (!sentAt) {
93
+ return {
94
+ isResendAllowed: true,
95
+ timeLeft: 0,
96
+ };
97
+ }
98
+ const now = new Date();
99
+ const diff = now.getTime() - new Date(sentAt).getTime();
100
+ const isResendAllowed = diff > resendInterval;
101
+ // Time left in seconds
102
+ const timeLeft = isResendAllowed ? 0 : Math.round((resendInterval - diff) / 1000);
103
+ return { isResendAllowed, timeLeft };
104
+ }
@@ -0,0 +1,188 @@
1
+ {{={= =}=}}
2
+ import type { Request as ExpressRequest } from 'express'
3
+ import { type ProviderId, type CreateUserResult, type FindAuthWithUserResult } from '../../auth/utils.js'
4
+ import { prisma } from '../index.js'
5
+ import { Expand } from '../../universal/types.js'
6
+
7
+ // PUBLIC API
8
+ export type OnBeforeSignupHook = (
9
+ params: Expand<OnBeforeSignupHookParams>,
10
+ ) => void | Promise<void>
11
+
12
+ // PUBLIC API
13
+ export type OnAfterSignupHook = (
14
+ params: Expand<OnAfterSignupHookParams>,
15
+ ) => void | Promise<void>
16
+
17
+ // PUBLIC API
18
+ /**
19
+ * Use this type for typing your `onAfterEmailVerified` hook.
20
+ *
21
+ * Wasp calls this hook exactly once, after a user successfully verifies their email during the email verification flow.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * export const onAfterEmailVerified: OnAfterEmailVerifiedHook = async ({
26
+ * email,
27
+ * }) => {
28
+ * await emailSender.send({
29
+ * to: email,
30
+ * subject: 'Welcome to our platform!',
31
+ * text: `Your email ${email} has been verified successfully.`
32
+ * })
33
+ * }
34
+ * ```
35
+ */
36
+ export type OnAfterEmailVerifiedHook = (
37
+ params: Expand<OnAfterEmailVerifiedHookParams>,
38
+ ) => void | Promise<void>
39
+
40
+ // PUBLIC API
41
+ /**
42
+ * @returns Object with a URL that the OAuth flow should redirect to.
43
+ */
44
+ export type OnBeforeOAuthRedirectHook = (
45
+ params: Expand<OnBeforeOAuthRedirectHookParams>,
46
+ ) => { url: URL } | Promise<{ url: URL }>
47
+
48
+ // PUBLIC API
49
+ export type OnBeforeLoginHook = (
50
+ params: Expand<OnBeforeLoginHookParams>,
51
+ ) => void | Promise<void>
52
+
53
+ // PUBLIC API
54
+ export type OnAfterLoginHook = (
55
+ params: Expand<OnAfterLoginHookParams>,
56
+ ) => void | Promise<void>
57
+
58
+ // PRIVATE API (used in the SDK and the server)
59
+ export type InternalAuthHookParams = {
60
+ /**
61
+ * Prisma instance that can be used to interact with the database.
62
+ */
63
+ prisma: typeof prisma
64
+ }
65
+
66
+ // NOTE: We should be exporting types that can be reached by users via other
67
+ // exported types (e.g. using the Parameters<T> Typescript helper).
68
+ // However, we are not exporting this type to keep the API surface smaller.
69
+ // This type is only used internally by the SDK. Exporting it might confuse
70
+ // users since the name is too similar to the exported function type.
71
+ // Same goes for all other *Params types in this file.
72
+ type OnBeforeSignupHookParams = {
73
+ /**
74
+ * Provider ID object that contains the provider name and the provider user ID.
75
+ */
76
+ providerId: ProviderId
77
+ /**
78
+ * Request object that can be used to access the user's incoming signup request.
79
+ */
80
+ req: ExpressRequest
81
+ } & InternalAuthHookParams
82
+
83
+ type OnAfterSignupHookParams = {
84
+ /**
85
+ * Provider ID object that contains the provider name and the provider user ID.
86
+ */
87
+ providerId: ProviderId
88
+ /**
89
+ * User object that was created during the signup process.
90
+ */
91
+ user: CreateUserResult
92
+ /**
93
+ * OAuth flow data that was generated during the OAuth flow. This is only
94
+ * available if the user signed up using OAuth.
95
+ */
96
+ oauth?: OAuthData
97
+ /**
98
+ * Request object that can be used to access the user's incoming signup request.
99
+ */
100
+ req: ExpressRequest
101
+ } & InternalAuthHookParams
102
+
103
+ type OnAfterEmailVerifiedHookParams = {
104
+ /**
105
+ * The email address that was verified.
106
+ */
107
+ email: string
108
+ /**
109
+ * The user who completed email verification.
110
+ */
111
+ user: FindAuthWithUserResult['user']
112
+ /**
113
+ * Request object that can be used to access the user's incoming verification request.
114
+ */
115
+ req: ExpressRequest
116
+ } & InternalAuthHookParams
117
+
118
+ type OnBeforeOAuthRedirectHookParams = {
119
+ /**
120
+ * URL that the OAuth flow should redirect to.
121
+ */
122
+ url: URL
123
+ /**
124
+ * Unique request ID that was generated during the OAuth flow.
125
+ */
126
+ oauth: Pick<OAuthData, 'uniqueRequestId'>
127
+ /**
128
+ * Request object that can be used to access the user's incoming OAuth flow request.
129
+ */
130
+ req: ExpressRequest
131
+ } & InternalAuthHookParams
132
+
133
+ type OnBeforeLoginHookParams = {
134
+ /**
135
+ * Provider ID object that contains the provider name and the provider user ID.
136
+ */
137
+ providerId: ProviderId
138
+ /**
139
+ * User that is trying to log in.
140
+ */
141
+ user: FindAuthWithUserResult['user']
142
+ /**
143
+ * Request object that can be used to access the user's incoming login request.
144
+ */
145
+ req: ExpressRequest
146
+ } & InternalAuthHookParams
147
+
148
+ type OnAfterLoginHookParams = {
149
+ /**
150
+ * Provider ID object that contains the provider name and the provider user ID.
151
+ */
152
+ providerId: ProviderId
153
+ /**
154
+ * User that is logged in.
155
+ */
156
+ user: FindAuthWithUserResult['user']
157
+ /**
158
+ * OAuth flow data that was generated during the OAuth flow. This is only
159
+ * available if the user logged in using OAuth.
160
+ */
161
+ oauth?: OAuthData
162
+ /**
163
+ * Request object that can be used to access the user's incoming login request.
164
+ */
165
+ req: ExpressRequest
166
+ } & InternalAuthHookParams
167
+
168
+ // PUBLIC API
169
+ export type OAuthData = {
170
+ /**
171
+ * Unique request ID that was generated during the OAuth flow.
172
+ */
173
+ uniqueRequestId: string
174
+ } & (
175
+ {=# enabledProviders.isGoogleAuthEnabled =}
176
+ | { providerName: 'google'; tokens: import('arctic').GoogleTokens }
177
+ {=/ enabledProviders.isGoogleAuthEnabled =}
178
+ {=# enabledProviders.isDiscordAuthEnabled =}
179
+ | { providerName: 'discord'; tokens: import('arctic').DiscordTokens }
180
+ {=/ enabledProviders.isDiscordAuthEnabled =}
181
+ {=# enabledProviders.isGitHubAuthEnabled =}
182
+ | { providerName: 'github'; tokens: import('arctic').GitHubTokens }
183
+ {=/ enabledProviders.isGitHubAuthEnabled =}
184
+ {=# enabledProviders.isKeycloakAuthEnabled =}
185
+ | { providerName: 'keycloak'; tokens: import('arctic').KeycloakTokens }
186
+ {=/ enabledProviders.isKeycloakAuthEnabled =}
187
+ | never
188
+ )
@@ -0,0 +1,49 @@
1
+ {{={= =}=}}
2
+ export {
3
+ defineUserSignupFields,
4
+ } from '../../auth/providers/types.js'
5
+
6
+ export {
7
+ createProviderId,
8
+ sanitizeAndSerializeProviderData,
9
+ updateAuthIdentityProviderData,
10
+ getProviderData,
11
+ getProviderDataWithPassword,
12
+ findAuthIdentity,
13
+ createUser,
14
+ type CreateUserResult,
15
+ type ProviderId,
16
+ type ProviderName,
17
+ type EmailProviderData,
18
+ type UsernameProviderData,
19
+ type OAuthProviderData,
20
+ } from '../../auth/utils.js'
21
+
22
+ export {
23
+ ensurePasswordIsPresent,
24
+ ensureValidPassword,
25
+ ensureTokenIsPresent,
26
+ } from '../../auth/validation.js'
27
+
28
+ export type {
29
+ OnBeforeSignupHook,
30
+ OnAfterSignupHook,
31
+ OnAfterEmailVerifiedHook,
32
+ OnBeforeOAuthRedirectHook,
33
+ OnBeforeLoginHook,
34
+ OnAfterLoginHook,
35
+ InternalAuthHookParams,
36
+ OAuthData,
37
+ } from './hooks.js'
38
+
39
+ {=# isExternalAuthEnabled =}
40
+ export * from './oauth/index.js'
41
+ {=/ isExternalAuthEnabled =}
42
+
43
+ {=# enabledProviders.isEmailAuthEnabled =}
44
+ export * from './email/index.js'
45
+ {=/ enabledProviders.isEmailAuthEnabled =}
46
+
47
+ {=# enabledProviders.isUsernameAndPasswordAuthEnabled =}
48
+ export * from './username.js'
49
+ {=/ enabledProviders.isUsernameAndPasswordAuthEnabled =}
@@ -0,0 +1,38 @@
1
+ {{={= =}=}}
2
+ {=# enabledProviders.isGoogleAuthEnabled =}
3
+ // PUBLIC API
4
+ export { google } from './providers/google.js';
5
+ {=/ enabledProviders.isGoogleAuthEnabled =}
6
+
7
+ {=# enabledProviders.isSlackAuthEnabled =}
8
+ // PUBLIC API
9
+ export { slack } from './providers/slack.js';
10
+ {=/ enabledProviders.isSlackAuthEnabled =}
11
+
12
+ {=# enabledProviders.isDiscordAuthEnabled =}
13
+ // PUBLIC API
14
+ export { discord } from './providers/discord.js';
15
+ {=/ enabledProviders.isDiscordAuthEnabled =}
16
+
17
+ {=# enabledProviders.isGitHubAuthEnabled =}
18
+ // PUBLIC API
19
+ export { github } from './providers/github.js';
20
+ {=/ enabledProviders.isGitHubAuthEnabled =}
21
+ {=# enabledProviders.isKeycloakAuthEnabled =}
22
+ // PUBLIC API
23
+ export { keycloak } from './providers/keycloak.js';
24
+ {=/ enabledProviders.isKeycloakAuthEnabled =}
25
+
26
+ // PRIVATE API
27
+ export {
28
+ loginPath,
29
+ callbackPath,
30
+ exchangeCodeForTokenPath,
31
+ handleOAuthErrorAndGetRedirectUri,
32
+ getRedirectUriForOneTimeCode,
33
+ } from './redirect.js'
34
+
35
+ // PRIVATE API
36
+ export {
37
+ tokenStore,
38
+ } from './oneTimeCode.js'
@@ -0,0 +1,50 @@
1
+ import { createJWT, validateJWT, TimeSpan } from '../../../auth/jwt.js'
2
+
3
+ export const tokenStore = createTokenStore();
4
+
5
+ function createTokenStore() {
6
+ const usedTokens = new Map<string, number>();
7
+
8
+ const validFor = new TimeSpan(1, 'm') // 1 minute
9
+ const cleanupAfter = 1000 * 60 * 60; // 1 hour
10
+
11
+ function createToken(userId: string): Promise<string> {
12
+ return createJWT(
13
+ {
14
+ id: userId,
15
+ },
16
+ {
17
+ expiresIn: validFor,
18
+ }
19
+ );
20
+ }
21
+
22
+ function verifyToken(token: string): Promise<{ id: string }> {
23
+ return validateJWT(token);
24
+ }
25
+
26
+ function isUsed(token: string): boolean {
27
+ return usedTokens.has(token);
28
+ }
29
+
30
+ function markUsed(token: string): void {
31
+ usedTokens.set(token, Date.now());
32
+ cleanUp();
33
+ }
34
+
35
+ function cleanUp(): void {
36
+ const now = Date.now();
37
+ for (const [token, timestamp] of usedTokens.entries()) {
38
+ if (now - timestamp > cleanupAfter) {
39
+ usedTokens.delete(token);
40
+ }
41
+ }
42
+ }
43
+
44
+ return {
45
+ createToken,
46
+ verifyToken,
47
+ isUsed,
48
+ markUsed,
49
+ };
50
+ }
@@ -0,0 +1,20 @@
1
+ import { OAuth2Provider, OAuth2ProviderWithPKCE } from "arctic";
2
+
3
+ export function defineProvider<
4
+ OAuthClient extends OAuth2Provider | OAuth2ProviderWithPKCE,
5
+ const Id extends string
6
+ >({
7
+ id,
8
+ displayName,
9
+ oAuthClient,
10
+ }: {
11
+ id: Id;
12
+ displayName: string;
13
+ oAuthClient: OAuthClient;
14
+ }) {
15
+ return {
16
+ id,
17
+ displayName,
18
+ oAuthClient,
19
+ };
20
+ }
@@ -0,0 +1,22 @@
1
+ {{={= =}=}}
2
+ import { Discord } from 'arctic';
3
+
4
+ import { defineProvider } from '../provider.js';
5
+ import { getRedirectUriForCallback } from '../redirect.js';
6
+ import { env } from '../../../env.js';
7
+
8
+ const id = '{= providerId =}';
9
+ const displayName = '{= displayName =}';
10
+
11
+ const oAuthClient = new Discord(
12
+ env.DISCORD_CLIENT_ID,
13
+ env.DISCORD_CLIENT_SECRET,
14
+ getRedirectUriForCallback(id).toString(),
15
+ );
16
+
17
+ // PUBLIC API
18
+ export const discord = defineProvider({
19
+ id,
20
+ displayName,
21
+ oAuthClient,
22
+ });
@@ -0,0 +1,20 @@
1
+ {{={= =}=}}
2
+ import { GitHub } from 'arctic';
3
+
4
+ import { defineProvider } from '../provider.js';
5
+ import { env } from '../../../env.js';
6
+
7
+ const id = '{= providerId =}';
8
+ const displayName = '{= displayName =}';
9
+
10
+ const oAuthClient = new GitHub(
11
+ env.GITHUB_CLIENT_ID,
12
+ env.GITHUB_CLIENT_SECRET,
13
+ );
14
+
15
+ // PUBLIC API
16
+ export const github = defineProvider({
17
+ id,
18
+ displayName,
19
+ oAuthClient,
20
+ });
@@ -0,0 +1,22 @@
1
+ {{={= =}=}}
2
+ import { Google } from 'arctic';
3
+
4
+ import { getRedirectUriForCallback } from '../redirect.js';
5
+ import { defineProvider } from '../provider.js';
6
+ import { env } from '../../../env.js';
7
+
8
+ const id = '{= providerId =}';
9
+ const displayName = '{= displayName =}';
10
+
11
+ const oAuthClient = new Google(
12
+ env.GOOGLE_CLIENT_ID,
13
+ env.GOOGLE_CLIENT_SECRET,
14
+ getRedirectUriForCallback(id).toString(),
15
+ );
16
+
17
+ // PUBLIC API
18
+ export const google = defineProvider({
19
+ id,
20
+ displayName,
21
+ oAuthClient,
22
+ });
@@ -0,0 +1,23 @@
1
+ {{={= =}=}}
2
+ import { Keycloak } from 'arctic';
3
+
4
+ import { getRedirectUriForCallback } from '../redirect.js';
5
+ import { defineProvider } from '../provider.js';
6
+ import { env } from '../../../env.js';
7
+
8
+ const id = '{= providerId =}';
9
+ const displayName = '{= displayName =}';
10
+
11
+ const oAuthClient = new Keycloak(
12
+ env.KEYCLOAK_REALM_URL,
13
+ env.KEYCLOAK_CLIENT_ID,
14
+ env.KEYCLOAK_CLIENT_SECRET,
15
+ getRedirectUriForCallback(id).toString(),
16
+ );
17
+
18
+ // PUBLIC API
19
+ export const keycloak = defineProvider({
20
+ id,
21
+ displayName,
22
+ oAuthClient,
23
+ });
@@ -0,0 +1,22 @@
1
+ {{={= =}=}}
2
+ import { Slack } from 'arctic';
3
+
4
+ import { defineProvider } from '../provider.js';
5
+ import { getRedirectUriForCallback } from '../redirect.js';
6
+ import { env } from '../../../env.js';
7
+
8
+ const id = '{= providerId =}';
9
+ const displayName = '{= displayName =}';
10
+
11
+ const oAuthClient = new Slack(
12
+ env.SLACK_CLIENT_ID,
13
+ env.SLACK_CLIENT_SECRET,
14
+ getRedirectUriForCallback(id).toString(),
15
+ );
16
+
17
+ // PUBLIC API
18
+ export const slack = defineProvider({
19
+ id,
20
+ displayName,
21
+ oAuthClient,
22
+ });