@stone-js/starters 0.8.3

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 (352) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -0
  3. package/basic-react-declarative/LICENSE +21 -0
  4. package/basic-react-declarative/README.md +39 -0
  5. package/basic-react-declarative/app/Application.tsx +89 -0
  6. package/basic-react-declarative/assets/css/index.css +26 -0
  7. package/basic-react-declarative/package.json +39 -0
  8. package/basic-react-declarative/public/logo.png +0 -0
  9. package/basic-react-declarative/tests/Application.spec.ts +96 -0
  10. package/basic-react-declarative/tests/__snapshots__/Application.spec.ts.snap +3 -0
  11. package/basic-react-declarative/tsconfig.json +33 -0
  12. package/basic-react-declarative/vitest.config.ts +24 -0
  13. package/basic-react-imperative/LICENSE +21 -0
  14. package/basic-react-imperative/README.md +39 -0
  15. package/basic-react-imperative/app/Application.tsx +89 -0
  16. package/basic-react-imperative/assets/css/index.css +26 -0
  17. package/basic-react-imperative/package.json +39 -0
  18. package/basic-react-imperative/public/logo.png +0 -0
  19. package/basic-react-imperative/tests/Application.spec.ts +80 -0
  20. package/basic-react-imperative/tests/__snapshots__/Application.spec.ts.snap +3 -0
  21. package/basic-react-imperative/tsconfig.json +33 -0
  22. package/basic-react-imperative/vitest.config.ts +24 -0
  23. package/basic-service-declarative/LICENSE +21 -0
  24. package/basic-service-declarative/README.md +39 -0
  25. package/basic-service-declarative/app/Application.ts +56 -0
  26. package/basic-service-declarative/package.json +34 -0
  27. package/basic-service-declarative/tests/Application.spec.ts +60 -0
  28. package/basic-service-declarative/tsconfig.json +25 -0
  29. package/basic-service-declarative/vitest.config.ts +24 -0
  30. package/basic-service-imperative/LICENSE +21 -0
  31. package/basic-service-imperative/README.md +39 -0
  32. package/basic-service-imperative/app/Application.ts +60 -0
  33. package/basic-service-imperative/package.json +34 -0
  34. package/basic-service-imperative/tests/Application.spec.ts +52 -0
  35. package/basic-service-imperative/tsconfig.json +25 -0
  36. package/basic-service-imperative/vitest.config.ts +24 -0
  37. package/continuum-showcase/README.md +44 -0
  38. package/continuum-showcase/app/env.d.ts +34 -0
  39. package/continuum-showcase/app/layouts/MainLayout.tsx +20 -0
  40. package/continuum-showcase/app/pages/BlogPostPage.tsx +62 -0
  41. package/continuum-showcase/app/pages/HomePage.tsx +58 -0
  42. package/continuum-showcase/package.json +25 -0
  43. package/continuum-showcase/stone.config.mjs +20 -0
  44. package/full-react-declarative/.env.example +1 -0
  45. package/full-react-declarative/.env.public.example +1 -0
  46. package/full-react-declarative/LICENSE +21 -0
  47. package/full-react-declarative/README.md +39 -0
  48. package/full-react-declarative/app/Application.ts +85 -0
  49. package/full-react-declarative/app/clients/AxiosClient.ts +136 -0
  50. package/full-react-declarative/app/clients/CommentClient.ts +61 -0
  51. package/full-react-declarative/app/clients/PostClient.ts +90 -0
  52. package/full-react-declarative/app/clients/SecurityClient.ts +66 -0
  53. package/full-react-declarative/app/clients/UserClient.ts +97 -0
  54. package/full-react-declarative/app/components/ChangePasswordForm/ChangePasswordForm.tsx +50 -0
  55. package/full-react-declarative/app/components/CommentForm/CommentForm.tsx +37 -0
  56. package/full-react-declarative/app/components/CommentItem/CommentItem.tsx +42 -0
  57. package/full-react-declarative/app/components/CommentWidget/CommentWidget.tsx +95 -0
  58. package/full-react-declarative/app/components/LoginForm/LoginForm.css +0 -0
  59. package/full-react-declarative/app/components/LoginForm/LoginForm.tsx +71 -0
  60. package/full-react-declarative/app/components/PostDetails/PostDetails.tsx +44 -0
  61. package/full-react-declarative/app/components/PostForm/PostForm.css +0 -0
  62. package/full-react-declarative/app/components/PostForm/PostForm.tsx +47 -0
  63. package/full-react-declarative/app/components/PostItem/PostItem.css +0 -0
  64. package/full-react-declarative/app/components/PostItem/PostItem.tsx +34 -0
  65. package/full-react-declarative/app/components/RegisterForm/RegisterForm.tsx +110 -0
  66. package/full-react-declarative/app/components/UserForm/UserForm.tsx +47 -0
  67. package/full-react-declarative/app/configurations/AppConfiguration.ts +17 -0
  68. package/full-react-declarative/app/error-pages/DefaultErrorPage/DefaultErrorPage.css +0 -0
  69. package/full-react-declarative/app/error-pages/DefaultErrorPage/DefaultErrorPage.tsx +52 -0
  70. package/full-react-declarative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.css +0 -0
  71. package/full-react-declarative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.tsx +53 -0
  72. package/full-react-declarative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.css +0 -0
  73. package/full-react-declarative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.tsx +54 -0
  74. package/full-react-declarative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.css +0 -0
  75. package/full-react-declarative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.tsx +53 -0
  76. package/full-react-declarative/app/errors/ForbiddenError.ts +11 -0
  77. package/full-react-declarative/app/errors/PostNotFoundError.ts +11 -0
  78. package/full-react-declarative/app/errors/UnauthorizedError.ts +11 -0
  79. package/full-react-declarative/app/errors/UserNotFoundError.ts +11 -0
  80. package/full-react-declarative/app/events/UserEvent.ts +18 -0
  81. package/full-react-declarative/app/layout/AppLayout/AppLayout.css +20 -0
  82. package/full-react-declarative/app/layout/AppLayout/AppLayout.tsx +101 -0
  83. package/full-react-declarative/app/layout/ErrorLayout/ErrorLayout.css +0 -0
  84. package/full-react-declarative/app/layout/ErrorLayout/ErrorLayout.tsx +41 -0
  85. package/full-react-declarative/app/layout/SecurityLayout/SecurityLayout.css +0 -0
  86. package/full-react-declarative/app/layout/SecurityLayout/SecurityLayout.tsx +39 -0
  87. package/full-react-declarative/app/middleware/AuthMiddleware.ts +85 -0
  88. package/full-react-declarative/app/models/Comment.ts +31 -0
  89. package/full-react-declarative/app/models/Post.ts +22 -0
  90. package/full-react-declarative/app/models/User.ts +62 -0
  91. package/full-react-declarative/app/pages/home/HomePage.tsx +44 -0
  92. package/full-react-declarative/app/pages/login/LoginPage.css +0 -0
  93. package/full-react-declarative/app/pages/login/LoginPage.tsx +73 -0
  94. package/full-react-declarative/app/pages/posts/CreatePostPage/CreatePostPage.css +0 -0
  95. package/full-react-declarative/app/pages/posts/CreatePostPage/CreatePostPage.tsx +67 -0
  96. package/full-react-declarative/app/pages/posts/PostPage/PostPage.tsx +60 -0
  97. package/full-react-declarative/app/pages/posts/ShowPostPage/ShowPostPage.tsx +83 -0
  98. package/full-react-declarative/app/pages/posts/UpdatePostPage/UpdatePostPage.tsx +77 -0
  99. package/full-react-declarative/app/pages/register/RegisterPage.tsx +68 -0
  100. package/full-react-declarative/app/pages/users/CreateUserPage.tsx +48 -0
  101. package/full-react-declarative/app/pages/users/ShowUserPage.tsx +62 -0
  102. package/full-react-declarative/app/pages/users/UpdateUserPage.tsx +57 -0
  103. package/full-react-declarative/app/pages/users/UserPage.tsx +57 -0
  104. package/full-react-declarative/app/providers/AppServiceProvider.ts +43 -0
  105. package/full-react-declarative/app/services/CommentService.ts +59 -0
  106. package/full-react-declarative/app/services/PostService.ts +108 -0
  107. package/full-react-declarative/app/services/SecurityService.ts +80 -0
  108. package/full-react-declarative/app/services/TokenService.ts +116 -0
  109. package/full-react-declarative/app/services/UserService.ts +126 -0
  110. package/full-react-declarative/app/utils.ts +17 -0
  111. package/full-react-declarative/assets/css/index.css +301 -0
  112. package/full-react-declarative/assets/img/logo.png +0 -0
  113. package/full-react-declarative/package.json +46 -0
  114. package/full-react-declarative/public/logo.png +0 -0
  115. package/full-react-declarative/public/vite.svg +1 -0
  116. package/full-react-declarative/stone.config.mjs +12 -0
  117. package/full-react-declarative/tsconfig.json +29 -0
  118. package/full-react-declarative/vitest.config.ts +24 -0
  119. package/full-react-imperative/.env.example +1 -0
  120. package/full-react-imperative/.env.public.example +1 -0
  121. package/full-react-imperative/LICENSE +21 -0
  122. package/full-react-imperative/README.md +39 -0
  123. package/full-react-imperative/app/Application.ts +79 -0
  124. package/full-react-imperative/app/clients/AxiosClient.ts +124 -0
  125. package/full-react-imperative/app/clients/CommentClient.ts +57 -0
  126. package/full-react-imperative/app/clients/PostClient.ts +86 -0
  127. package/full-react-imperative/app/clients/SecurityClient.ts +60 -0
  128. package/full-react-imperative/app/clients/UserClient.ts +93 -0
  129. package/full-react-imperative/app/clients/contracts/IAxiosClient.ts +97 -0
  130. package/full-react-imperative/app/clients/contracts/ICommentClient.ts +31 -0
  131. package/full-react-imperative/app/clients/contracts/IPostClient.ts +55 -0
  132. package/full-react-imperative/app/clients/contracts/ISecurityClient.ts +33 -0
  133. package/full-react-imperative/app/clients/contracts/IUserClient.ts +61 -0
  134. package/full-react-imperative/app/components/ChangePasswordForm/ChangePasswordForm.tsx +50 -0
  135. package/full-react-imperative/app/components/CommentForm/CommentForm.css +35 -0
  136. package/full-react-imperative/app/components/CommentForm/CommentForm.tsx +45 -0
  137. package/full-react-imperative/app/components/CommentItem/CommentItem.css +74 -0
  138. package/full-react-imperative/app/components/CommentItem/CommentItem.tsx +62 -0
  139. package/full-react-imperative/app/components/CommentWidget/CommentWidget.css +25 -0
  140. package/full-react-imperative/app/components/CommentWidget/CommentWidget.tsx +119 -0
  141. package/full-react-imperative/app/components/Dropdown/Dropdown.css +52 -0
  142. package/full-react-imperative/app/components/Dropdown/Dropdown.tsx +40 -0
  143. package/full-react-imperative/app/components/LayoutHeader/LayoutHeader.css +62 -0
  144. package/full-react-imperative/app/components/LayoutHeader/LayoutHeader.tsx +61 -0
  145. package/full-react-imperative/app/components/LayoutLeftMenu/LayoutLeftMenu.css +25 -0
  146. package/full-react-imperative/app/components/LayoutLeftMenu/LayoutLeftMenu.tsx +32 -0
  147. package/full-react-imperative/app/components/LoginForm/LoginForm.css +0 -0
  148. package/full-react-imperative/app/components/LoginForm/LoginForm.tsx +71 -0
  149. package/full-react-imperative/app/components/NotificationBadge/NotificationBadge.css +41 -0
  150. package/full-react-imperative/app/components/NotificationBadge/NotificationBadge.tsx +63 -0
  151. package/full-react-imperative/app/components/PostCard/PostCard.css +129 -0
  152. package/full-react-imperative/app/components/PostCard/PostCard.tsx +65 -0
  153. package/full-react-imperative/app/components/PostForm/PostForm.css +92 -0
  154. package/full-react-imperative/app/components/PostForm/PostForm.tsx +76 -0
  155. package/full-react-imperative/app/components/PostSkeleton/PostSkeleton.css +65 -0
  156. package/full-react-imperative/app/components/PostSkeleton/PostSkeleton.tsx +25 -0
  157. package/full-react-imperative/app/components/PostWidget/PostWidget.tsx +95 -0
  158. package/full-react-imperative/app/components/ProfileForm/ProfileForm.css +84 -0
  159. package/full-react-imperative/app/components/ProfileForm/ProfileForm.tsx +79 -0
  160. package/full-react-imperative/app/components/RegisterForm/RegisterForm.tsx +110 -0
  161. package/full-react-imperative/app/components/RightAsidePanel/RightAsidePanel.css +32 -0
  162. package/full-react-imperative/app/components/RightAsidePanel/RightAsidePanel.tsx +62 -0
  163. package/full-react-imperative/app/components/SettingsForm/SettingsForm.css +126 -0
  164. package/full-react-imperative/app/components/SettingsForm/SettingsForm.tsx +86 -0
  165. package/full-react-imperative/app/components/UserAvatar/UserAvatar.css +18 -0
  166. package/full-react-imperative/app/components/UserAvatar/UserAvatar.tsx +60 -0
  167. package/full-react-imperative/app/components/UserBadge/UserBadge.css +33 -0
  168. package/full-react-imperative/app/components/UserBadge/UserBadge.tsx +49 -0
  169. package/full-react-imperative/app/components/UserCard/UserCard.css +70 -0
  170. package/full-react-imperative/app/components/UserCard/UserCard.tsx +43 -0
  171. package/full-react-imperative/app/configurations/AppConfiguration.ts +19 -0
  172. package/full-react-imperative/app/error-pages/DefaultErrorPage/DefaultErrorPage.css +0 -0
  173. package/full-react-imperative/app/error-pages/DefaultErrorPage/DefaultErrorPage.tsx +41 -0
  174. package/full-react-imperative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.css +0 -0
  175. package/full-react-imperative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.tsx +42 -0
  176. package/full-react-imperative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.css +0 -0
  177. package/full-react-imperative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.tsx +49 -0
  178. package/full-react-imperative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.css +0 -0
  179. package/full-react-imperative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.tsx +42 -0
  180. package/full-react-imperative/app/errors/ForbiddenError.ts +11 -0
  181. package/full-react-imperative/app/errors/PostNotFoundError.ts +11 -0
  182. package/full-react-imperative/app/errors/UnauthorizedError.ts +11 -0
  183. package/full-react-imperative/app/errors/UserNotFoundError.ts +11 -0
  184. package/full-react-imperative/app/events/UserEvent.ts +18 -0
  185. package/full-react-imperative/app/layout/AppLayout/AppLayout.css +106 -0
  186. package/full-react-imperative/app/layout/AppLayout/AppLayout.tsx +48 -0
  187. package/full-react-imperative/app/layout/ErrorLayout/ErrorLayout.css +0 -0
  188. package/full-react-imperative/app/layout/ErrorLayout/ErrorLayout.tsx +45 -0
  189. package/full-react-imperative/app/layout/SecurityLayout/SecurityLayout.css +0 -0
  190. package/full-react-imperative/app/layout/SecurityLayout/SecurityLayout.tsx +43 -0
  191. package/full-react-imperative/app/layout/SettingsLayout/SettingsLayout.css +99 -0
  192. package/full-react-imperative/app/layout/SettingsLayout/SettingsLayout.tsx +44 -0
  193. package/full-react-imperative/app/middleware/AuthMiddleware.ts +56 -0
  194. package/full-react-imperative/app/models/Comment.ts +35 -0
  195. package/full-react-imperative/app/models/Post.ts +27 -0
  196. package/full-react-imperative/app/models/User.ts +68 -0
  197. package/full-react-imperative/app/pages/Settings/SettingsPage.tsx +23 -0
  198. package/full-react-imperative/app/pages/home/HomePage.tsx +58 -0
  199. package/full-react-imperative/app/pages/login/LoginPage.css +0 -0
  200. package/full-react-imperative/app/pages/login/LoginPage.tsx +65 -0
  201. package/full-react-imperative/app/pages/posts/ShowPostPage/ShowPostPage.tsx +64 -0
  202. package/full-react-imperative/app/pages/posts/UpdatePostPage/UpdatePostPage.tsx +56 -0
  203. package/full-react-imperative/app/pages/register/RegisterPage.tsx +71 -0
  204. package/full-react-imperative/app/pages/users/ShowUserPage/ShowUserPage.css +64 -0
  205. package/full-react-imperative/app/pages/users/ShowUserPage/ShowUserPage.tsx +104 -0
  206. package/full-react-imperative/app/pages/users/UpdateUserPage/UpdateUserPage.css +0 -0
  207. package/full-react-imperative/app/pages/users/UpdateUserPage/UpdateUserPage.tsx +43 -0
  208. package/full-react-imperative/app/pages/users/UserPage/UserPage.css +31 -0
  209. package/full-react-imperative/app/pages/users/UserPage/UserPage.tsx +59 -0
  210. package/full-react-imperative/app/pages/utils.ts +67 -0
  211. package/full-react-imperative/app/providers/AppServiceProvider.ts +40 -0
  212. package/full-react-imperative/app/services/CommentService.ts +53 -0
  213. package/full-react-imperative/app/services/PostService.ts +102 -0
  214. package/full-react-imperative/app/services/SecurityService.ts +72 -0
  215. package/full-react-imperative/app/services/TokenService.ts +108 -0
  216. package/full-react-imperative/app/services/UserService.ts +115 -0
  217. package/full-react-imperative/app/services/contracts/ICommentService.ts +30 -0
  218. package/full-react-imperative/app/services/contracts/IPostService.ts +65 -0
  219. package/full-react-imperative/app/services/contracts/ISecurityService.ts +39 -0
  220. package/full-react-imperative/app/services/contracts/ITokenService.ts +44 -0
  221. package/full-react-imperative/app/services/contracts/IUserService.ts +70 -0
  222. package/full-react-imperative/app/utils.ts +31 -0
  223. package/full-react-imperative/assets/css/index.css +301 -0
  224. package/full-react-imperative/assets/img/logo.png +0 -0
  225. package/full-react-imperative/package.json +48 -0
  226. package/full-react-imperative/public/logo.png +0 -0
  227. package/full-react-imperative/public/vite.svg +1 -0
  228. package/full-react-imperative/stone.config.mjs +12 -0
  229. package/full-react-imperative/tsconfig.json +29 -0
  230. package/full-react-imperative/vitest.config.ts +24 -0
  231. package/full-service-declarative/.env.example +2 -0
  232. package/full-service-declarative/LICENSE +21 -0
  233. package/full-service-declarative/README.md +65 -0
  234. package/full-service-declarative/app/Application.ts +327 -0
  235. package/full-service-declarative/app/commands/ListSessionsCommand.ts +70 -0
  236. package/full-service-declarative/app/commands/ListUsersCommand.ts +56 -0
  237. package/full-service-declarative/app/configurations/AppConfiguration.ts +52 -0
  238. package/full-service-declarative/app/configurations/UserLiveConfiguration.ts +28 -0
  239. package/full-service-declarative/app/database/DatabaseClient.ts +43 -0
  240. package/full-service-declarative/app/database/schema.ts +43 -0
  241. package/full-service-declarative/app/error-handlers/SecurityErrorHandler.ts +61 -0
  242. package/full-service-declarative/app/errors/CredentialsError.ts +12 -0
  243. package/full-service-declarative/app/events/UserEvent.ts +17 -0
  244. package/full-service-declarative/app/handlers/CommentEventHandler.ts +103 -0
  245. package/full-service-declarative/app/handlers/PostEventHandler.ts +104 -0
  246. package/full-service-declarative/app/handlers/SecurityEventHandler.ts +108 -0
  247. package/full-service-declarative/app/handlers/UserEventHandler.ts +159 -0
  248. package/full-service-declarative/app/listeners/UserEventListener.ts +35 -0
  249. package/full-service-declarative/app/middleware/AuthMiddleware.ts +54 -0
  250. package/full-service-declarative/app/models/Comment.ts +38 -0
  251. package/full-service-declarative/app/models/Post.ts +50 -0
  252. package/full-service-declarative/app/models/Session.ts +14 -0
  253. package/full-service-declarative/app/models/User.ts +77 -0
  254. package/full-service-declarative/app/providers/DrizzleServiceProvider.ts +59 -0
  255. package/full-service-declarative/app/repositories/CommentRepository.ts +155 -0
  256. package/full-service-declarative/app/repositories/PostRepository.ts +138 -0
  257. package/full-service-declarative/app/repositories/SessionRepository.ts +123 -0
  258. package/full-service-declarative/app/repositories/UserRepository.ts +99 -0
  259. package/full-service-declarative/app/services/CommentService.ts +112 -0
  260. package/full-service-declarative/app/services/PostService.ts +100 -0
  261. package/full-service-declarative/app/services/SecurityService.ts +232 -0
  262. package/full-service-declarative/app/services/SessionService.ts +130 -0
  263. package/full-service-declarative/app/services/UserService.ts +110 -0
  264. package/full-service-declarative/app/subscribers/UserEventSubscriber.ts +38 -0
  265. package/full-service-declarative/drizzle.config.ts +13 -0
  266. package/full-service-declarative/package.json +48 -0
  267. package/full-service-declarative/stone.config.mjs +12 -0
  268. package/full-service-declarative/tsconfig.json +25 -0
  269. package/full-service-declarative/vitest.config.ts +24 -0
  270. package/full-service-imperative/.env.example +2 -0
  271. package/full-service-imperative/LICENSE +21 -0
  272. package/full-service-imperative/README.md +65 -0
  273. package/full-service-imperative/app/Application.ts +317 -0
  274. package/full-service-imperative/app/commands/ListSessionsCommand.ts +54 -0
  275. package/full-service-imperative/app/commands/ListUsersCommand.ts +42 -0
  276. package/full-service-imperative/app/configurations/AppConfiguration.ts +44 -0
  277. package/full-service-imperative/app/configurations/UserLiveConfiguration.ts +26 -0
  278. package/full-service-imperative/app/database/DatabaseClient.ts +39 -0
  279. package/full-service-imperative/app/database/schema.ts +43 -0
  280. package/full-service-imperative/app/error-handlers/SecurityErrorHandler.ts +58 -0
  281. package/full-service-imperative/app/errors/CredentialsError.ts +12 -0
  282. package/full-service-imperative/app/events/UserEvent.ts +17 -0
  283. package/full-service-imperative/app/handlers/CommentEventHandler.ts +99 -0
  284. package/full-service-imperative/app/handlers/PostEventHandler.ts +99 -0
  285. package/full-service-imperative/app/handlers/SecurityEventHandler.ts +83 -0
  286. package/full-service-imperative/app/handlers/UserEventHandler.ts +132 -0
  287. package/full-service-imperative/app/listeners/UserEventListener.ts +23 -0
  288. package/full-service-imperative/app/middleware/AuthMiddleware.ts +44 -0
  289. package/full-service-imperative/app/models/Comment.ts +38 -0
  290. package/full-service-imperative/app/models/Post.ts +50 -0
  291. package/full-service-imperative/app/models/Session.ts +14 -0
  292. package/full-service-imperative/app/models/User.ts +77 -0
  293. package/full-service-imperative/app/providers/DrizzleServiceProvider.ts +56 -0
  294. package/full-service-imperative/app/repositories/CommentRepository.ts +148 -0
  295. package/full-service-imperative/app/repositories/PostRepository.ts +130 -0
  296. package/full-service-imperative/app/repositories/SessionRepository.ts +115 -0
  297. package/full-service-imperative/app/repositories/UserRepository.ts +91 -0
  298. package/full-service-imperative/app/repositories/contracts/ICommentRepository.ts +72 -0
  299. package/full-service-imperative/app/repositories/contracts/IPostRepository.ts +63 -0
  300. package/full-service-imperative/app/repositories/contracts/ISessionRepository.ts +65 -0
  301. package/full-service-imperative/app/repositories/contracts/IUserRepository.ts +55 -0
  302. package/full-service-imperative/app/services/CommentService.ts +109 -0
  303. package/full-service-imperative/app/services/PostService.ts +97 -0
  304. package/full-service-imperative/app/services/SecurityService.ts +224 -0
  305. package/full-service-imperative/app/services/SessionService.ts +124 -0
  306. package/full-service-imperative/app/services/UserService.ts +105 -0
  307. package/full-service-imperative/app/services/contracts/ICommentService.ts +62 -0
  308. package/full-service-imperative/app/services/contracts/IPostService.ts +53 -0
  309. package/full-service-imperative/app/services/contracts/ISecurityService.ts +97 -0
  310. package/full-service-imperative/app/services/contracts/ISessionService.ts +73 -0
  311. package/full-service-imperative/app/services/contracts/IUserService.ts +57 -0
  312. package/full-service-imperative/app/subscribers/UserEventSubscriber.ts +28 -0
  313. package/full-service-imperative/drizzle.config.ts +13 -0
  314. package/full-service-imperative/package.json +48 -0
  315. package/full-service-imperative/stone.config.mjs +12 -0
  316. package/full-service-imperative/tsconfig.json +25 -0
  317. package/full-service-imperative/vitest.config.ts +24 -0
  318. package/package.json +225 -0
  319. package/standard-react-declarative/LICENSE +21 -0
  320. package/standard-react-declarative/README.md +39 -0
  321. package/standard-react-declarative/app/Application.ts +45 -0
  322. package/standard-react-declarative/app/pages/welcome/WelcomePage.tsx +57 -0
  323. package/standard-react-declarative/app/services/WelcomeService.ts +38 -0
  324. package/standard-react-declarative/assets/css/index.css +26 -0
  325. package/standard-react-declarative/package.json +42 -0
  326. package/standard-react-declarative/tsconfig.json +33 -0
  327. package/standard-react-declarative/vitest.config.ts +24 -0
  328. package/standard-react-imperative/LICENSE +21 -0
  329. package/standard-react-imperative/README.md +39 -0
  330. package/standard-react-imperative/app/Application.ts +41 -0
  331. package/standard-react-imperative/app/pages/welcome/WelcomePage.tsx +50 -0
  332. package/standard-react-imperative/app/services/WelcomeService.ts +38 -0
  333. package/standard-react-imperative/assets/css/index.css +26 -0
  334. package/standard-react-imperative/package.json +42 -0
  335. package/standard-react-imperative/tsconfig.json +33 -0
  336. package/standard-react-imperative/vitest.config.ts +24 -0
  337. package/standard-service-declarative/LICENSE +21 -0
  338. package/standard-service-declarative/README.md +39 -0
  339. package/standard-service-declarative/app/Application.ts +39 -0
  340. package/standard-service-declarative/app/handlers/WelcomeEventHandler.ts +45 -0
  341. package/standard-service-declarative/app/services/WelcomeService.ts +38 -0
  342. package/standard-service-declarative/package.json +36 -0
  343. package/standard-service-declarative/tsconfig.json +25 -0
  344. package/standard-service-declarative/vitest.config.ts +24 -0
  345. package/standard-service-imperative/LICENSE +21 -0
  346. package/standard-service-imperative/README.md +39 -0
  347. package/standard-service-imperative/app/Application.ts +11 -0
  348. package/standard-service-imperative/app/handlers/welcomeEventHandler.ts +31 -0
  349. package/standard-service-imperative/app/services/welcomeService.ts +38 -0
  350. package/standard-service-imperative/package.json +35 -0
  351. package/standard-service-imperative/tsconfig.json +25 -0
  352. package/standard-service-imperative/vitest.config.ts +24 -0
@@ -0,0 +1,53 @@
1
+ import { defineStone } from '@stone-js/core'
2
+ import { Comment, CommentInput } from '../models/Comment'
3
+ import { ICommentService } from './contracts/ICommentService'
4
+ import { ICommentClient } from '../clients/contracts/ICommentClient'
5
+
6
+ /**
7
+ * Comment Service Options
8
+ */
9
+ export interface CommentServiceOptions {
10
+ commentClient: ICommentClient
11
+ }
12
+
13
+ /**
14
+ * Comment Service
15
+ */
16
+ export const CommentService = ({ commentClient }: CommentServiceOptions): ICommentService => ({
17
+ /**
18
+ * List comments
19
+ *
20
+ * @param postId - The id of the post to list comments
21
+ * @param limit - The limit of comments to list
22
+ */
23
+ async list (postId: number, limit: number = 10): Promise<Comment[]> {
24
+ return await commentClient.list(postId, limit)
25
+ },
26
+
27
+ /**
28
+ * Create a comment
29
+ *
30
+ * @param postId - The id of the post to create the comment for
31
+ * @param comment - The comment to create
32
+ */
33
+ async create (postId: number, comment: CommentInput): Promise<void> {
34
+ await commentClient.create(postId, comment)
35
+ },
36
+
37
+ /**
38
+ * Delete a comment
39
+ *
40
+ * @param id - The id of the comment to delete
41
+ */
42
+ async delete (id: number): Promise<void> {
43
+ await commentClient.delete(id)
44
+ }
45
+ })
46
+
47
+ /**
48
+ * Comment Service blueprint.
49
+ *
50
+ * The alias is required to get benefits of desctructuring Dependency Injection.
51
+ * And because the front-end class will be minified, we need to use alias to keep the class name.
52
+ */
53
+ export const CommentServiceBlueprint = defineStone(CommentService, { alias: 'commentService' })
@@ -0,0 +1,102 @@
1
+ import { defineService } from '@stone-js/core'
2
+ import { Post, PostInput } from '../models/Post'
3
+ import { IPostService } from './contracts/IPostService'
4
+ import { IPostClient } from '../clients/contracts/IPostClient'
5
+ import { PostNotFoundError } from '../errors/PostNotFoundError'
6
+
7
+ /**
8
+ * Post Service Options
9
+ */
10
+ export interface PostServiceOptions {
11
+ postClient: IPostClient
12
+ }
13
+
14
+ /**
15
+ * Post Service
16
+ */
17
+ export const PostService = ({ postClient }: PostServiceOptions): IPostService => ({
18
+ /**
19
+ * List posts
20
+ *
21
+ * @param limit - The limit of posts to list
22
+ */
23
+ async list (limit: number = 10): Promise<Post[]> {
24
+ return await postClient.list(limit)
25
+ },
26
+
27
+ /**
28
+ * List posts by author
29
+ *
30
+ * @param id - The id of the author to list posts
31
+ * @param limit - The limit of posts to list
32
+ */
33
+ async listbyAuthor (id: number, limit: number = 10): Promise<Post[]> {
34
+ return await postClient.listByAuthor(id, limit)
35
+ },
36
+
37
+ /**
38
+ * Find a post
39
+ *
40
+ * @param conditions - The conditions to find the post
41
+ * @returns The found post
42
+ */
43
+ async find (conditions: Record<string, any>): Promise<Post> {
44
+ try {
45
+ return await postClient.find(conditions.id)
46
+ } catch (error: any) {
47
+ if (error.status === 404) {
48
+ throw new PostNotFoundError(error.message, { cause: error })
49
+ } else {
50
+ throw error
51
+ }
52
+ }
53
+ },
54
+
55
+ /**
56
+ * Find a post by key
57
+ *
58
+ * @param key - The key to find the post
59
+ * @param value - The value to find the post
60
+ * @returns The found post
61
+ * @throws PostNotFoundError
62
+ */
63
+ async findBy (key: string, value: string): Promise<Post | undefined> {
64
+ return await this.find({ [key]: value })
65
+ },
66
+
67
+ /**
68
+ * Create a post
69
+ *
70
+ * @param post - The post to create
71
+ */
72
+ async create (post: PostInput): Promise<Post> {
73
+ return await postClient.create(post)
74
+ },
75
+
76
+ /**
77
+ * Update a post
78
+ *
79
+ * @param id - The id of the post to update
80
+ * @param post - The post data to update
81
+ */
82
+ async update (id: number, post: PostInput): Promise<Post> {
83
+ return await postClient.update(id, post)
84
+ },
85
+
86
+ /**
87
+ * Delete a post
88
+ *
89
+ * @param id - The id of the post to delete
90
+ */
91
+ async delete (id: number): Promise<void> {
92
+ await postClient.delete(id)
93
+ }
94
+ })
95
+
96
+ /**
97
+ * Post Service Blueprint
98
+ *
99
+ * The alias is required to get benefits of desctructuring Dependency Injection.
100
+ * And because the front-end class will be minified, we need to use alias to keep the class name.
101
+ */
102
+ export const PostServiceBlueprint = defineService(PostService, { alias: 'postService', isFactory: true })
@@ -0,0 +1,72 @@
1
+ import { defineService } from '@stone-js/core'
2
+ import { ITokenService } from './contracts/ITokenService'
3
+ import { ISecurityService } from './contracts/ISecurityService'
4
+ import { ISecurityClient } from '../clients/contracts/ISecurityClient'
5
+ import { UserChangePassword, UserLogin, UserRegister } from '../models/User'
6
+
7
+ /**
8
+ * Security Service Options
9
+ */
10
+ export interface SecurityServiceOptions {
11
+ tokenService: ITokenService
12
+ securityClient: ISecurityClient
13
+ }
14
+
15
+ /**
16
+ * Security Service
17
+ */
18
+ export const SecurityService = ({ tokenService, securityClient }: SecurityServiceOptions): ISecurityService => ({
19
+ /**
20
+ * Login a user
21
+ *
22
+ * @param user - The user to login
23
+ * @returns The user token
24
+ */
25
+ async login (user: UserLogin): Promise<void> {
26
+ const token = await securityClient.login(user)
27
+ tokenService.saveToken(token)
28
+ },
29
+
30
+ /**
31
+ * Logout a user
32
+ */
33
+ async logout (): Promise<void> {
34
+ await securityClient.logout()
35
+ tokenService.removeToken()
36
+ },
37
+
38
+ /**
39
+ * Register a user
40
+ *
41
+ * @param user - The user to register
42
+ */
43
+ async register (user: UserRegister): Promise<void> {
44
+ await securityClient.register(user)
45
+ },
46
+
47
+ /**
48
+ * Change the user password
49
+ *
50
+ * @param password - The password to change
51
+ */
52
+ async changePassword (password: UserChangePassword): Promise<void> {
53
+ await securityClient.changePassword(password)
54
+ },
55
+
56
+ /**
57
+ * Check if the user is authenticated
58
+ *
59
+ * @returns True if the user is authenticated, false otherwise
60
+ */
61
+ isAuthenticated (): boolean {
62
+ return tokenService.isAuthenticated()
63
+ }
64
+ })
65
+
66
+ /**
67
+ * Security Service Blueprint
68
+ *
69
+ * The alias is required to get benefits of desctructuring Dependency Injection.
70
+ * And because the front-end class will be minified, we need to use alias to keep the class name.
71
+ */
72
+ export const SecurityServiceBlueprint = defineService(SecurityService, { alias: 'securityService', isFactory: true })
@@ -0,0 +1,108 @@
1
+ import { Axios } from 'axios'
2
+ import { UserToken } from '../models/User'
3
+ import { ReactIncomingEvent } from '@stone-js/use-react'
4
+ import { ITokenService } from './contracts/ITokenService'
5
+ import { defineService, IContainer, isNotEmpty } from '@stone-js/core'
6
+
7
+ /**
8
+ * Token Service Options
9
+ */
10
+ export interface TokenServiceOptions {
11
+ axios: Axios
12
+ container: IContainer
13
+ }
14
+
15
+ /**
16
+ * Token Service
17
+ */
18
+ export const TokenService = ({ container, axios }: TokenServiceOptions): ITokenService => ({
19
+ /**
20
+ * Refresh the user token
21
+ */
22
+ async refresh (): Promise<void> {
23
+ const headers = {
24
+ Accept: 'application/json',
25
+ 'Content-Type': 'application/json',
26
+ Authorization: `Bearer ${String(this.getAccessToken())}`
27
+ }
28
+ const response = await axios.post<UserToken>('/refresh', {}, { headers })
29
+
30
+ this.saveToken(response.data)
31
+ },
32
+
33
+ /**
34
+ * Set the token
35
+ *
36
+ * The event must be resolved on demand
37
+ * because the event is not available at the time of service creation.
38
+ * The event is available only when the request is made.
39
+ *
40
+ * @param token - The token to set
41
+ */
42
+ saveToken (token: UserToken): void {
43
+ container.make<ReactIncomingEvent>('event').cookies.add(
44
+ 'token',
45
+ { ...token, createdAt: Date.now() },
46
+ {
47
+ path: '/',
48
+ secure: true,
49
+ httpOnly: false,
50
+ maxAge: token.expiresIn
51
+ }
52
+ )
53
+ },
54
+
55
+ /**
56
+ * Remove the token
57
+ */
58
+ removeToken (): void {
59
+ container.make<ReactIncomingEvent>('event').cookies.remove(
60
+ 'token',
61
+ {
62
+ path: '/',
63
+ secure: true,
64
+ httpOnly: false
65
+ }
66
+ )
67
+ },
68
+
69
+ /**
70
+ * Get the token
71
+ *
72
+ * The event must be resolved on demand
73
+ * because the event is not available at the time of service creation.
74
+ * The event is available only when the request is made.
75
+ *
76
+ * @returns The token
77
+ */
78
+ getToken (): UserToken | undefined {
79
+ return container.make<ReactIncomingEvent>('event').cookies.getValue('token')
80
+ },
81
+
82
+ /**
83
+ * Get the access token
84
+ *
85
+ * @returns The access token
86
+ */
87
+ getAccessToken (): string | undefined {
88
+ return this.getToken()?.accessToken
89
+ },
90
+
91
+ /**
92
+ * Check if the user is authenticated
93
+ *
94
+ * @returns True if the user is authenticated, false otherwise
95
+ */
96
+ isAuthenticated (): boolean {
97
+ const token = this.getToken()
98
+ return isNotEmpty<UserToken>(token) && (token.createdAt + (token.expiresIn * 1000)) > Date.now()
99
+ }
100
+ })
101
+
102
+ /**
103
+ * Token Service Blueprint
104
+ *
105
+ * The alias is required to get benefits of desctructuring Dependency Injection.
106
+ * And because the front-end class will be minified, we need to use alias to keep the class name.
107
+ */
108
+ export const TokenServiceBlueprint = defineService(TokenService, { alias: 'tokenService', isFactory: true })
@@ -0,0 +1,115 @@
1
+ import { UserEvent } from '../events/UserEvent'
2
+ import { User, UserInput } from '../models/User'
3
+ import { ReactRuntime } from '@stone-js/use-react'
4
+ import { IUserService } from './contracts/IUserService'
5
+ import { defineService, EventEmitter } from '@stone-js/core'
6
+ import { IUserClient } from '../clients/contracts/IUserClient'
7
+ import { UserNotFoundError } from '../errors/UserNotFoundError'
8
+
9
+ /**
10
+ * User Service Options
11
+ */
12
+ export interface UserServiceOptions {
13
+ userClient: IUserClient
14
+ reactRuntime: ReactRuntime
15
+ eventEmitter: EventEmitter
16
+ }
17
+
18
+ /**
19
+ * User Service
20
+ */
21
+ export const UserService = ({ userClient, reactRuntime, eventEmitter }: UserServiceOptions): IUserService => {
22
+ return {
23
+ /**
24
+ * List users
25
+ *
26
+ * @param limit - The limit of users to list
27
+ */
28
+ async list (limit: number = 10): Promise<User[]> {
29
+ return await userClient.list(limit)
30
+ },
31
+
32
+ /**
33
+ * Get the current user
34
+ */
35
+ async current (): Promise<User> {
36
+ return await userClient.currentUser()
37
+ },
38
+
39
+ /**
40
+ * Find a user
41
+ *
42
+ * @param conditions - The conditions to find the user
43
+ * @returns The found user
44
+ */
45
+ async find (conditions: Record<string, any>): Promise<User> {
46
+ try {
47
+ return await userClient.find(conditions.id)
48
+ } catch (error: any) {
49
+ if (error.status === 404) {
50
+ throw new UserNotFoundError(error.message, { cause: error })
51
+ } else {
52
+ throw error
53
+ }
54
+ }
55
+ },
56
+
57
+ /**
58
+ * Find a user by key
59
+ *
60
+ * @param key - The key to find the user
61
+ * @param value - The value to find the user
62
+ * @returns The found user
63
+ * @throws UserNotFoundError
64
+ */
65
+ async findBy (key: string, value: any): Promise<User | undefined> {
66
+ return await reactRuntime.snapshot(`user-${String(key)}-${String(value)}`, async () => await this.find({ [key]: value }))
67
+ },
68
+
69
+ /**
70
+ * Create a user
71
+ *
72
+ * @param user - The user to create
73
+ */
74
+ async create (user: UserInput): Promise<void> {
75
+ await eventEmitter.emit(new UserEvent(user))
76
+ await userClient.create(user)
77
+ },
78
+
79
+ /**
80
+ * Update the current user
81
+ *
82
+ * @param user - The user data to update
83
+ */
84
+ async updateCurrent (user: UserInput): Promise<User> {
85
+ return await userClient.updateCurrent(user)
86
+ },
87
+
88
+ /**
89
+ * Update a user
90
+ *
91
+ * @param id - The id of the user to update
92
+ * @param user - The user data to update
93
+ */
94
+ async update (id: number, user: UserInput): Promise<User> {
95
+ return await userClient.update(id, user)
96
+ },
97
+
98
+ /**
99
+ * Delete a user
100
+ *
101
+ * @param id - The id of the user to delete
102
+ */
103
+ async delete (id: number): Promise<void> {
104
+ await userClient.delete(id)
105
+ }
106
+ }
107
+ }
108
+
109
+ /**
110
+ * User Service Blueprint
111
+ *
112
+ * The alias is required to get benefits of desctructuring Dependency Injection.
113
+ * And because the front-end class will be minified, we need to use alias to keep the class name.
114
+ */
115
+ export const UserServiceBlueprint = defineService(UserService, { alias: 'userService', isFactory: true })
@@ -0,0 +1,30 @@
1
+ import { Comment, CommentInput } from '../../models/Comment'
2
+
3
+ /**
4
+ * Comment Service contract
5
+ */
6
+ export interface ICommentService {
7
+ /**
8
+ * List comments for a given post.
9
+ *
10
+ * @param postId - The ID of the post to list comments for.
11
+ * @param limit - Optional number of comments to return (default: 10).
12
+ * @returns The list of comments.
13
+ */
14
+ list: (postId: number, limit?: number) => Promise<Comment[]>
15
+
16
+ /**
17
+ * Create a new comment for a post.
18
+ *
19
+ * @param postId - The ID of the post.
20
+ * @param comment - The comment data.
21
+ */
22
+ create: (postId: number, comment: CommentInput) => Promise<void>
23
+
24
+ /**
25
+ * Delete a comment by its ID.
26
+ *
27
+ * @param id - The ID of the comment to delete.
28
+ */
29
+ delete: (id: number) => Promise<void>
30
+ }
@@ -0,0 +1,65 @@
1
+ import { Post, PostInput } from '../../models/Post'
2
+
3
+ /**
4
+ * Post Service contract
5
+ */
6
+ export interface IPostService {
7
+ /**
8
+ * List posts.
9
+ *
10
+ * @param limit - Optional limit of posts to list (default: 10).
11
+ * @returns The list of posts.
12
+ */
13
+ list: (limit?: number) => Promise<Post[]>
14
+
15
+ /**
16
+ * List posts by author.
17
+ *
18
+ * @param id - The author ID.
19
+ * @param limit - Optional limit of posts (default: 10).
20
+ * @returns The list of posts.
21
+ */
22
+ listbyAuthor: (id: number, limit?: number) => Promise<Post[]>
23
+
24
+ /**
25
+ * Find a post by conditions (e.g., ID).
26
+ *
27
+ * @param conditions - Key-value map to identify the post (e.g., `{ id: 42 }`).
28
+ * @returns The found post.
29
+ * @throws PostNotFoundError if not found.
30
+ */
31
+ find: (conditions: Record<string, any>) => Promise<Post>
32
+
33
+ /**
34
+ * Find a post by a specific key and value.
35
+ *
36
+ * @param key - The key to filter by.
37
+ * @param value - The value to match.
38
+ * @returns The post or throws PostNotFoundError.
39
+ */
40
+ findBy: (key: string, value: string) => Promise<Post | undefined>
41
+
42
+ /**
43
+ * Create a post.
44
+ *
45
+ * @param post - The post data to create.
46
+ * @returns The created post.
47
+ */
48
+ create: (post: PostInput) => Promise<Post>
49
+
50
+ /**
51
+ * Update a post.
52
+ *
53
+ * @param id - The ID of the post to update.
54
+ * @param post - The post data to update.
55
+ * @returns The updated post.
56
+ */
57
+ update: (id: number, post: PostInput) => Promise<Post>
58
+
59
+ /**
60
+ * Delete a post by ID.
61
+ *
62
+ * @param id - The ID of the post to delete.
63
+ */
64
+ delete: (id: number) => Promise<void>
65
+ }
@@ -0,0 +1,39 @@
1
+ import { UserLogin, UserRegister, UserChangePassword } from '../../models/User'
2
+
3
+ /**
4
+ * Security Service contract
5
+ */
6
+ export interface ISecurityService {
7
+ /**
8
+ * Login a user and store their token.
9
+ *
10
+ * @param user - The user login credentials.
11
+ */
12
+ login: (user: UserLogin) => Promise<void>
13
+
14
+ /**
15
+ * Logout the user and clear the token.
16
+ */
17
+ logout: () => Promise<void>
18
+
19
+ /**
20
+ * Register a new user.
21
+ *
22
+ * @param user - The user registration data.
23
+ */
24
+ register: (user: UserRegister) => Promise<void>
25
+
26
+ /**
27
+ * Change the user's password.
28
+ *
29
+ * @param password - The password payload.
30
+ */
31
+ changePassword: (password: UserChangePassword) => Promise<void>
32
+
33
+ /**
34
+ * Check if the user is currently authenticated.
35
+ *
36
+ * @returns `true` if authenticated, `false` otherwise.
37
+ */
38
+ isAuthenticated: () => boolean
39
+ }
@@ -0,0 +1,44 @@
1
+ import { UserToken } from '../../models/User'
2
+
3
+ /**
4
+ * Token Service contract
5
+ */
6
+ export interface ITokenService {
7
+ /**
8
+ * Refresh the user token by making a call to the refresh endpoint.
9
+ */
10
+ refresh: () => Promise<void>
11
+
12
+ /**
13
+ * Save the token in the cookies.
14
+ *
15
+ * @param token - The token to store.
16
+ */
17
+ saveToken: (token: UserToken) => void
18
+
19
+ /**
20
+ * Remove the token from cookies.
21
+ */
22
+ removeToken: () => void
23
+
24
+ /**
25
+ * Get the full token object from cookies.
26
+ *
27
+ * @returns The stored token, or `undefined` if not found.
28
+ */
29
+ getToken: () => UserToken | undefined
30
+
31
+ /**
32
+ * Get only the access token string from the stored token.
33
+ *
34
+ * @returns The access token string, or `undefined`.
35
+ */
36
+ getAccessToken: () => string | undefined
37
+
38
+ /**
39
+ * Check if the user is currently authenticated based on token expiry.
40
+ *
41
+ * @returns `true` if the user is authenticated, otherwise `false`.
42
+ */
43
+ isAuthenticated: () => boolean
44
+ }
@@ -0,0 +1,70 @@
1
+ import { User, UserInput } from '../../models/User'
2
+
3
+ /**
4
+ * User Service contract
5
+ */
6
+ export interface IUserService {
7
+ /**
8
+ * List users.
9
+ *
10
+ * @param limit - The number of users to list (default: 10).
11
+ * @returns The list of users.
12
+ */
13
+ list: (limit?: number) => Promise<User[]>
14
+
15
+ /**
16
+ * Get the currently authenticated user.
17
+ *
18
+ * @returns The current user.
19
+ */
20
+ current: () => Promise<User>
21
+
22
+ /**
23
+ * Find a user by conditions (e.g., by ID).
24
+ *
25
+ * @param conditions - Conditions to identify the user (e.g., `{ id: number }`).
26
+ * @returns The found user.
27
+ * @throws UserNotFoundError if the user is not found.
28
+ */
29
+ find: (conditions: Record<string, any>) => Promise<User>
30
+
31
+ /**
32
+ * Find a user by key-value pair with snapshot caching.
33
+ *
34
+ * @param key - The key to filter by (e.g., `"email"`).
35
+ * @param value - The value to match.
36
+ * @returns The found user or throws UserNotFoundError.
37
+ */
38
+ findBy: (key: string, value: any) => Promise<User | undefined>
39
+
40
+ /**
41
+ * Create a new user.
42
+ *
43
+ * @param user - The user data to create.
44
+ */
45
+ create: (user: UserInput) => Promise<void>
46
+
47
+ /**
48
+ * Update the currently authenticated user.
49
+ *
50
+ * @param user - The updated user data.
51
+ * @returns The updated user.
52
+ */
53
+ updateCurrent: (user: UserInput) => Promise<User>
54
+
55
+ /**
56
+ * Update a user by ID.
57
+ *
58
+ * @param id - The ID of the user to update.
59
+ * @param user - The updated user data.
60
+ * @returns The updated user.
61
+ */
62
+ update: (id: number, user: UserInput) => Promise<User>
63
+
64
+ /**
65
+ * Delete a user by ID.
66
+ *
67
+ * @param id - The ID of the user to delete.
68
+ */
69
+ delete: (id: number) => Promise<void>
70
+ }