@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright © 2026 Stone Foundation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # Stone.js - Starters
2
+
3
+ [![License: MIT](https://img.shields.io/npm/l/@stone-js/starters)](https://opensource.org/licenses/MIT)
4
+ [![Maintenance](https://img.shields.io/maintenance/yes/2026)](https://stonejs.dev)
5
+ [![Used by Stone CLI](https://img.shields.io/badge/Used%20by-Stone%20CLI-blue)](https://github.com/stone-foundation/stone-js-cli)
6
+
7
+ This repository contains official **starter templates** for Stone.js applications.
8
+
9
+ ---
10
+
11
+ ## Overview
12
+
13
+ It is used internally by the Stone CLI to generate scaffolded projects for both **microservices** and **frontend React apps**, with three predefined levels of complexity: **basic**, **standard**, and **full**.
14
+
15
+ ## Available Starters
16
+
17
+ Each starter reflects a different level of complexity and domain (microservice or React), with both declarative and imperative styles available. You can pick the one that matches your architecture preferences and scale needs.
18
+
19
+ ### Microservice Starters
20
+
21
+ | Name | Description |
22
+ | ------------------------------ | ------------------------------------------------------------------ |
23
+ | `basic-service-declarative` | Minimal Stone.js microservice using class and decorators |
24
+ | `basic-service-imperative` | Minimal functional microservice with handler and blueprint |
25
+ | `standard-service-declarative` | Adds routing, DI, and hooks with a clean declarative structure |
26
+ | `standard-service-imperative` | Functional routing setup with middleware and service container |
27
+ | `full-service-declarative` | Production-grade setup: lifecycle hooks, DI, error handling, tests |
28
+ | `full-service-imperative` | Complete functional microservice with config, tests, and events |
29
+
30
+ ### React App Starters
31
+
32
+ | Name | Description |
33
+ | ---------------------------- | ------------------------------------------------------------------------ |
34
+ | `basic-react-declarative` | Minimal React + Stone.js (SPA/SSR-ready) using class-based API |
35
+ | `basic-react-imperative` | Minimal React app using functional API and manual config |
36
+ | `standard-react-declarative` | Adds layout, routing, and lifecycle via decorators |
37
+ | `standard-react-imperative` | Function-based setup with routing, layout system, and render control |
38
+ | `full-react-declarative` | Enterprise-ready app with head config, hydration, and complete structure |
39
+ | `full-react-imperative` | Full functional React app with SSR, hooks, tests, and platform config |
40
+
41
+ You can combine complexity level (`basic`, `standard`, `full`), domain (`react`, `service`), and style (`declarative`, `imperative`) to find the right starter, for example: `standard-react-imperative`.
42
+
43
+
44
+ ## How It's Used
45
+
46
+ These starters are **not meant to be installed manually**.
47
+
48
+ Instead, the `@stone-js/cli` automatically pulls from this repository during:
49
+
50
+ ```bash
51
+ npm create @stone-js
52
+ ````
53
+
54
+ or
55
+
56
+ ```bash
57
+ stone init
58
+ ```
59
+
60
+ The CLI fetches the appropriate template based on user choices and sets up a ready-to-run project in seconds.
61
+
62
+ ## Starter Structure
63
+
64
+ Each starter is a self-contained folder containing:
65
+
66
+ * `app/`, `asset/`, `public/`, `tests/` depending on the type
67
+ * Minimal `stone.config.mjs` or framework config
68
+ * Preset integration (e.g. adapters, blueprint, lifecycle)
69
+ * Preconfigured TypeScript + Vitest (for standard/full)
70
+ * Working example of event handler or route
71
+
72
+ ## Maintaining the Starters
73
+
74
+ To update or add a new starter:
75
+
76
+ 1. Fork or clone this repository.
77
+ 2. Add or modify the corresponding folder (e.g., `react-full`, `micro-basic`).
78
+ 3. Keep external dependencies minimal.
79
+ 4. Test the template using the CLI locally.
80
+ 5. Submit a PR following the [Contributing Guide](./CONTRIBUTING.md).
81
+
82
+ > The Stone CLI will always fetch the latest `main` branch when scaffolding.
83
+
84
+ ## Why Three Levels?
85
+
86
+ Stone.js follows a **progressive complexity** approach.
87
+ These templates help developers grow their app without needing to eject or reconfigure from scratch.
88
+
89
+ * **Basic**: Hello world in 10 seconds.
90
+ * **Standard**: Real-world app features with good defaults.
91
+ * **Full**: Production-grade architecture with opinions.
92
+
93
+ ## Learn More
94
+
95
+ This package is part of the Stone.js ecosystem, a modern JavaScript framework built around the Continuum Architecture.
96
+
97
+ Explore the full documentation: [https://stonejs.dev](https://stonejs.dev)
98
+
99
+ ## Contributing
100
+
101
+ See [Contributing Guide](https://github.com/stone-foundation/stone-js-starters/blob/main/CONTRIBUTING.md)
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright © 2026 Stone Foundation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,39 @@
1
+ # Stone.js - Basic starter
2
+
3
+ Stone.js's basic starter to create react app using declarative API.
4
+
5
+ ## Project Setup
6
+
7
+ ```sh
8
+ npm install
9
+ ```
10
+
11
+ ### Compile and Hot-Reload for Development
12
+
13
+ ```sh
14
+ npm run dev
15
+ ```
16
+
17
+ ### Compile and Bundle for Production
18
+
19
+ ```sh
20
+ npm run build
21
+ ```
22
+
23
+ ### Run the Production build
24
+
25
+ ```sh
26
+ npm run preview
27
+ ```
28
+
29
+ ### Run tests
30
+
31
+ ```sh
32
+ npm run test
33
+ ```
34
+
35
+ ### Run tests with coverage
36
+
37
+ ```sh
38
+ npm run test:cvg
39
+ ```
@@ -0,0 +1,89 @@
1
+ import { JSX } from 'react'
2
+ import { Browser } from '@stone-js/browser-adapter'
3
+ import { NodeConsole } from '@stone-js/node-cli-adapter'
4
+ import { ILogger, LogLevel, Promiseable, StoneApp } from '@stone-js/core'
5
+ import { ReactIncomingEvent, UseReact, HeadContext, IPage, PageHeadContext, PageRenderContext } from '@stone-js/use-react'
6
+
7
+ /**
8
+ * Application
9
+ *
10
+ * This is the main application entry point.
11
+ *
12
+ * @UseReact() is used to enable React.
13
+ * @Browser() is used to enable the Browser adapter.
14
+ * @StoneApp() is used to enable the Stone application, it is required.
15
+ */
16
+ @Browser()
17
+ @UseReact()
18
+ @NodeConsole()
19
+ @StoneApp({ logger: { level: LogLevel.INFO } })
20
+ export class Application implements IPage<ReactIncomingEvent> {
21
+ /**
22
+ * Logger is a service for logging.
23
+ */
24
+ private readonly logger: ILogger
25
+
26
+ /**
27
+ * Create a new instance of Application
28
+ * At this point, all the dependencies are resolved and injected.
29
+ * You can access the container and all the services.
30
+ *
31
+ * @param logger - Logger service.
32
+ */
33
+ constructor ({ logger }: { logger: ILogger }) {
34
+ this.logger = logger
35
+ }
36
+
37
+ /**
38
+ * Handle incoming events
39
+ *
40
+ * @param event Incoming event
41
+ * @returns response
42
+ */
43
+ handle (event: ReactIncomingEvent): ResponseData {
44
+ // Get the name from the event
45
+ const message = `Hello ${String(event.get<string>('name', 'World'))}!`
46
+
47
+ // Log a message
48
+ this.logger.info(message)
49
+
50
+ // Return a JSON response
51
+ return { message }
52
+ }
53
+
54
+ /**
55
+ * Set the page head tags, like title, meta, link, script, style.
56
+ *
57
+ * @returns The head context.
58
+ */
59
+ head ({ event }: PageHeadContext): Promiseable<HeadContext> {
60
+ return {
61
+ title: `Hello ${String(event.get<string>('name', 'World'))}!`,
62
+ description: 'This is a simple example of a React application using Stone.js',
63
+ metas: [
64
+ { name: 'author', content: 'Stone.js' },
65
+ { name: 'keywords', content: 'stonejs,js,react,example' }
66
+ ]
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Render the component.
72
+ *
73
+ * @returns The rendered component.
74
+ */
75
+ render ({ data }: PageRenderContext<ResponseData>): JSX.Element {
76
+ return (
77
+ <section className='container'>
78
+ <h1 className='h1 text-center mt-64'>{data?.message}</h1>
79
+ </section>
80
+ )
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Response data
86
+ */
87
+ export interface ResponseData {
88
+ message: string
89
+ }
@@ -0,0 +1,26 @@
1
+ body {
2
+ margin: 0;
3
+ padding: 0;
4
+ color: #333;
5
+ font-size: 14px;
6
+ line-height: 1.5;
7
+ background-color: #fff;
8
+ font-family: 'Roboto', sans-serif;
9
+ }
10
+ .h1 {
11
+ margin: 0;
12
+ font-size: 3rem;
13
+ font-weight: 500;
14
+ font-weight: bold;
15
+ }
16
+ .container {
17
+ width: 100vw;
18
+ display: flex;
19
+ justify-content: center;
20
+ }
21
+ .text-center {
22
+ text-align: center;
23
+ }
24
+ .mt-64 {
25
+ margin-top: 64px;
26
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "basic-react-declarative",
3
+ "private": true,
4
+ "version": "1.0.0",
5
+ "description": "Stone.js's basic starter to create react app using declarative API.",
6
+ "author": "Mr. Stone <evensstone@gmail.com>",
7
+ "license": "MIT",
8
+ "type": "module",
9
+ "engines": {
10
+ "node": ">=20.0.0"
11
+ },
12
+ "scripts": {
13
+ "dev": "stone dev",
14
+ "build": "stone build",
15
+ "preview": "stone preview",
16
+ "build:ssr": "stone build --ssr",
17
+ "test": "vitest run",
18
+ "test:cvg": "npm run test -- --coverage"
19
+ },
20
+ "dependencies": {
21
+ "react": "^19.0.0",
22
+ "react-dom": "^19.0.0",
23
+ "@stone-js/core": "^0.8.3",
24
+ "@stone-js/use-react": "^0.8.3",
25
+ "@stone-js/browser-adapter": "^0.8.3",
26
+ "@stone-js/node-cli-adapter": "^0.8.3"
27
+ },
28
+ "devDependencies": {
29
+ "@babel/plugin-proposal-decorators": "^7.25.9",
30
+ "@babel/preset-env": "^7.26.9",
31
+ "@babel/preset-typescript": "^7.27.0",
32
+ "@stone-js/cli": "^0.8.3",
33
+ "@types/node": "^24.0.7",
34
+ "@types/react": "^19.0.7",
35
+ "@types/react-dom": "^19.0.3",
36
+ "@vitest/coverage-v8": "^3.0.9",
37
+ "vitest": "^3.0.9"
38
+ }
39
+ }
@@ -0,0 +1,96 @@
1
+ import { ILogger } from '@stone-js/core'
2
+ import { Application } from '../app/Application'
3
+ import { renderToString } from 'react-dom/server'
4
+ import { ReactIncomingEvent } from '@stone-js/use-react'
5
+
6
+ // We must mock decorators to lighten the test environment
7
+ vi.mock('@stone-js/core', async (importOriginal) => {
8
+ const actual: any = await importOriginal()
9
+ return {
10
+ ...actual,
11
+ StoneApp: vi.fn(() => vi.fn()),
12
+ }
13
+ })
14
+
15
+ // We must mock decorators to lighten the test environment
16
+ vi.mock('@stone-js/node-cli-adapter', async (importOriginal) => {
17
+ const actual: any = await importOriginal()
18
+ return {
19
+ ...actual,
20
+ NodeConsole: vi.fn(() => vi.fn()),
21
+ }
22
+ })
23
+
24
+ // We must mock decorators to lighten the test environment
25
+ vi.mock('@stone-js/browser-adapter', async (importOriginal) => {
26
+ const actual: any = await importOriginal()
27
+ return {
28
+ ...actual,
29
+ Browser: vi.fn(() => vi.fn()),
30
+ }
31
+ })
32
+
33
+ // We must mock decorators to lighten the test environment
34
+ vi.mock('@stone-js/use-react', async (importOriginal) => {
35
+ const actual: any = await importOriginal()
36
+ return {
37
+ ...actual,
38
+ UseReact: vi.fn(() => vi.fn()),
39
+ }
40
+ })
41
+
42
+ describe('Application', () => {
43
+ let app: Application
44
+ let mockedLogger: ILogger
45
+
46
+ beforeEach(() => {
47
+ mockedLogger = {
48
+ info: vi.fn(),
49
+ } as unknown as ILogger
50
+
51
+ app = new Application({ logger: mockedLogger })
52
+ })
53
+
54
+ it('should create an application instance', () => {
55
+ // Assert
56
+ expect(app).toBeInstanceOf(Application)
57
+ })
58
+
59
+ it('get head values', async () => {
60
+ // Arrange
61
+ const expectedMessage = 'Hello World!'
62
+ const event = { get: () => 'World' } as unknown as ReactIncomingEvent
63
+
64
+ // Act
65
+ const head = await app.head({ event })
66
+
67
+ // Assert
68
+ expect(head).toHaveProperty('metas')
69
+ expect(head.title).toBe(expectedMessage)
70
+ expect(head).toHaveProperty('description')
71
+ })
72
+
73
+ it('should handle incoming events', () => {
74
+ // Arrange
75
+ const expectedMessage = 'Hello World!'
76
+ const event = { get: () => 'World' } as unknown as ReactIncomingEvent
77
+
78
+ // Act
79
+ const response = app.handle(event) as { message: string }
80
+
81
+ // Assert
82
+ expect(response.message).toBe(expectedMessage)
83
+ expect(mockedLogger.info).toHaveBeenCalledWith(expectedMessage)
84
+ })
85
+
86
+ it('should render component', () => {
87
+ // Arrange
88
+ const message = 'Hello World!'
89
+
90
+ // Act
91
+ const response = renderToString(app.render({ data: { message } } as any))
92
+
93
+ // Assert
94
+ expect(response).toMatchSnapshot()
95
+ })
96
+ })
@@ -0,0 +1,3 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`Application > should render component 1`] = `"<section class="container"><h1 class="h1 text-center mt-64">Hello World!</h1></section>"`;
@@ -0,0 +1,33 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "module": "ESNext",
6
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
7
+ "skipLibCheck": true,
8
+ "experimentalDecorators": true,
9
+
10
+ /* Bundler mode */
11
+ "moduleResolution": "bundler",
12
+ "allowImportingTsExtensions": true,
13
+ "isolatedModules": true,
14
+ "moduleDetection": "force",
15
+ "noEmit": true,
16
+ "jsx": "react-jsx",
17
+ "resolveJsonModule": true,
18
+
19
+ /* Linting */
20
+ "strict": true,
21
+ "noUnusedLocals": true,
22
+ "noUnusedParameters": true,
23
+ "noFallthroughCasesInSwitch": true,
24
+ "noUncheckedSideEffectImports": true,
25
+
26
+ "types": ["node", "vite/client", "vitest/globals"],
27
+ },
28
+ "include": [
29
+ "app",
30
+ "tests",
31
+ "vitest.config.ts"
32
+ ]
33
+ }
@@ -0,0 +1,24 @@
1
+ import { defineConfig } from 'vitest/config'
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ globals: true,
6
+ environment: 'node',
7
+ include: ['./tests/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
8
+ coverage: {
9
+ provider: 'v8',
10
+ include: ['app/**/*.ts', 'app/**/*.tsx'],
11
+ reporter: ['text', 'html'],
12
+ reportsDirectory: './coverage',
13
+ thresholds: {
14
+ 100: true
15
+ },
16
+ watermarks: {
17
+ statements: [60, 80],
18
+ functions: [60, 80],
19
+ branches: [60, 80],
20
+ lines: [60, 80]
21
+ }
22
+ },
23
+ }
24
+ });
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright © 2026 Stone Foundation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,39 @@
1
+ # Stone.js - Basic starter
2
+
3
+ Stone.js's basic starter to create react app using imperative API.
4
+
5
+ ## Project Setup
6
+
7
+ ```sh
8
+ npm install
9
+ ```
10
+
11
+ ### Compile and Hot-Reload for Development
12
+
13
+ ```sh
14
+ npm run dev
15
+ ```
16
+
17
+ ### Compile and Bundle for Production
18
+
19
+ ```sh
20
+ npm run build
21
+ ```
22
+
23
+ ### Run the Production build
24
+
25
+ ```sh
26
+ npm run preview
27
+ ```
28
+
29
+ ### Run tests
30
+
31
+ ```sh
32
+ npm run test
33
+ ```
34
+
35
+ ### Run tests with coverage
36
+
37
+ ```sh
38
+ npm run test:cvg
39
+ ```
@@ -0,0 +1,89 @@
1
+ import { JSX } from 'react'
2
+ import { browserAdapterBlueprint } from '@stone-js/browser-adapter'
3
+ import { defineConfig, IBlueprint, ILogger, isNotEmpty, Promiseable } from '@stone-js/core'
4
+ import { defineCommand, FactoryCommandHandler, NODE_CONSOLE_PLATFORM, nodeConsoleAdapterBlueprint } from '@stone-js/node-cli-adapter'
5
+ import { defineStoneReactApp, HeadContext, IPage, PageHeadContext, PageRenderContext, ReactIncomingEvent } from '@stone-js/use-react'
6
+
7
+ /**
8
+ * Create an handler using the factory handler.
9
+ */
10
+ export const FactoryHandler = ({ logger }: AppOptions): IPage<ReactIncomingEvent> => {
11
+ return {
12
+ handle (event: ReactIncomingEvent): ResponseData {
13
+ // Get the name from the event
14
+ const message = `Hello ${String(event.get<string>('name', 'World'))}!`
15
+
16
+ // Log a message
17
+ logger.info(message)
18
+
19
+ // Return a JSON response
20
+ return { message }
21
+ },
22
+
23
+ /**
24
+ * Set the page head tags, like title, meta, link, script, style.
25
+ *
26
+ * @returns The head context.
27
+ */
28
+ head ({ event }: PageHeadContext): Promiseable<HeadContext> {
29
+ return {
30
+ title: `Hello ${String(event.get<string>('name', 'World'))}!`,
31
+ description: 'This is a simple example of a React application using Stone.js',
32
+ metas: [
33
+ { name: 'author', content: 'Stone.js' },
34
+ { name: 'keywords', content: 'stonejs,js,react,example' }
35
+ ]
36
+ }
37
+ },
38
+
39
+ /**
40
+ * Render the component.
41
+ *
42
+ * @returns The rendered component.
43
+ */
44
+ render ({ data }: PageRenderContext<ResponseData>): JSX.Element {
45
+ return (
46
+ <section className='container'>
47
+ <h1 className='h1 text-center mt-64'>{data?.message}</h1>
48
+ </section>
49
+ )
50
+ }
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Stone-React application.
56
+ */
57
+ export const Application = defineStoneReactApp(
58
+ FactoryHandler,
59
+ { debug: true, isFactory: true },
60
+ [browserAdapterBlueprint, nodeConsoleAdapterBlueprint]
61
+ )
62
+
63
+ /**
64
+ * Application configuration.
65
+ */
66
+ export const AppConfig = defineConfig({
67
+ afterConfigure (blueprint: IBlueprint) {
68
+ if (
69
+ isNotEmpty<FactoryCommandHandler>(FactoryHandler) &&
70
+ blueprint.is('stone.adapter.platform', NODE_CONSOLE_PLATFORM)
71
+ ) {
72
+ blueprint.set(defineCommand(FactoryHandler, { name: '*', isFactory: true }))
73
+ }
74
+ }
75
+ })
76
+
77
+ /**
78
+ * Application options.
79
+ */
80
+ interface AppOptions {
81
+ logger: ILogger
82
+ }
83
+
84
+ /**
85
+ * Response data
86
+ */
87
+ interface ResponseData {
88
+ message: string
89
+ }
@@ -0,0 +1,26 @@
1
+ body {
2
+ margin: 0;
3
+ padding: 0;
4
+ color: #333;
5
+ font-size: 14px;
6
+ line-height: 1.5;
7
+ background-color: #fff;
8
+ font-family: 'Roboto', sans-serif;
9
+ }
10
+ .h1 {
11
+ margin: 0;
12
+ font-size: 3rem;
13
+ font-weight: 500;
14
+ font-weight: bold;
15
+ }
16
+ .container {
17
+ width: 100vw;
18
+ display: flex;
19
+ justify-content: center;
20
+ }
21
+ .text-center {
22
+ text-align: center;
23
+ }
24
+ .mt-64 {
25
+ margin-top: 64px;
26
+ }