@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.
- package/LICENSE +21 -0
- package/README.md +101 -0
- package/basic-react-declarative/LICENSE +21 -0
- package/basic-react-declarative/README.md +39 -0
- package/basic-react-declarative/app/Application.tsx +89 -0
- package/basic-react-declarative/assets/css/index.css +26 -0
- package/basic-react-declarative/package.json +39 -0
- package/basic-react-declarative/public/logo.png +0 -0
- package/basic-react-declarative/tests/Application.spec.ts +96 -0
- package/basic-react-declarative/tests/__snapshots__/Application.spec.ts.snap +3 -0
- package/basic-react-declarative/tsconfig.json +33 -0
- package/basic-react-declarative/vitest.config.ts +24 -0
- package/basic-react-imperative/LICENSE +21 -0
- package/basic-react-imperative/README.md +39 -0
- package/basic-react-imperative/app/Application.tsx +89 -0
- package/basic-react-imperative/assets/css/index.css +26 -0
- package/basic-react-imperative/package.json +39 -0
- package/basic-react-imperative/public/logo.png +0 -0
- package/basic-react-imperative/tests/Application.spec.ts +80 -0
- package/basic-react-imperative/tests/__snapshots__/Application.spec.ts.snap +3 -0
- package/basic-react-imperative/tsconfig.json +33 -0
- package/basic-react-imperative/vitest.config.ts +24 -0
- package/basic-service-declarative/LICENSE +21 -0
- package/basic-service-declarative/README.md +39 -0
- package/basic-service-declarative/app/Application.ts +56 -0
- package/basic-service-declarative/package.json +34 -0
- package/basic-service-declarative/tests/Application.spec.ts +60 -0
- package/basic-service-declarative/tsconfig.json +25 -0
- package/basic-service-declarative/vitest.config.ts +24 -0
- package/basic-service-imperative/LICENSE +21 -0
- package/basic-service-imperative/README.md +39 -0
- package/basic-service-imperative/app/Application.ts +60 -0
- package/basic-service-imperative/package.json +34 -0
- package/basic-service-imperative/tests/Application.spec.ts +52 -0
- package/basic-service-imperative/tsconfig.json +25 -0
- package/basic-service-imperative/vitest.config.ts +24 -0
- package/continuum-showcase/README.md +44 -0
- package/continuum-showcase/app/env.d.ts +34 -0
- package/continuum-showcase/app/layouts/MainLayout.tsx +20 -0
- package/continuum-showcase/app/pages/BlogPostPage.tsx +62 -0
- package/continuum-showcase/app/pages/HomePage.tsx +58 -0
- package/continuum-showcase/package.json +25 -0
- package/continuum-showcase/stone.config.mjs +20 -0
- package/full-react-declarative/.env.example +1 -0
- package/full-react-declarative/.env.public.example +1 -0
- package/full-react-declarative/LICENSE +21 -0
- package/full-react-declarative/README.md +39 -0
- package/full-react-declarative/app/Application.ts +85 -0
- package/full-react-declarative/app/clients/AxiosClient.ts +136 -0
- package/full-react-declarative/app/clients/CommentClient.ts +61 -0
- package/full-react-declarative/app/clients/PostClient.ts +90 -0
- package/full-react-declarative/app/clients/SecurityClient.ts +66 -0
- package/full-react-declarative/app/clients/UserClient.ts +97 -0
- package/full-react-declarative/app/components/ChangePasswordForm/ChangePasswordForm.tsx +50 -0
- package/full-react-declarative/app/components/CommentForm/CommentForm.tsx +37 -0
- package/full-react-declarative/app/components/CommentItem/CommentItem.tsx +42 -0
- package/full-react-declarative/app/components/CommentWidget/CommentWidget.tsx +95 -0
- package/full-react-declarative/app/components/LoginForm/LoginForm.css +0 -0
- package/full-react-declarative/app/components/LoginForm/LoginForm.tsx +71 -0
- package/full-react-declarative/app/components/PostDetails/PostDetails.tsx +44 -0
- package/full-react-declarative/app/components/PostForm/PostForm.css +0 -0
- package/full-react-declarative/app/components/PostForm/PostForm.tsx +47 -0
- package/full-react-declarative/app/components/PostItem/PostItem.css +0 -0
- package/full-react-declarative/app/components/PostItem/PostItem.tsx +34 -0
- package/full-react-declarative/app/components/RegisterForm/RegisterForm.tsx +110 -0
- package/full-react-declarative/app/components/UserForm/UserForm.tsx +47 -0
- package/full-react-declarative/app/configurations/AppConfiguration.ts +17 -0
- package/full-react-declarative/app/error-pages/DefaultErrorPage/DefaultErrorPage.css +0 -0
- package/full-react-declarative/app/error-pages/DefaultErrorPage/DefaultErrorPage.tsx +52 -0
- package/full-react-declarative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.css +0 -0
- package/full-react-declarative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.tsx +53 -0
- package/full-react-declarative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.css +0 -0
- package/full-react-declarative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.tsx +54 -0
- package/full-react-declarative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.css +0 -0
- package/full-react-declarative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.tsx +53 -0
- package/full-react-declarative/app/errors/ForbiddenError.ts +11 -0
- package/full-react-declarative/app/errors/PostNotFoundError.ts +11 -0
- package/full-react-declarative/app/errors/UnauthorizedError.ts +11 -0
- package/full-react-declarative/app/errors/UserNotFoundError.ts +11 -0
- package/full-react-declarative/app/events/UserEvent.ts +18 -0
- package/full-react-declarative/app/layout/AppLayout/AppLayout.css +20 -0
- package/full-react-declarative/app/layout/AppLayout/AppLayout.tsx +101 -0
- package/full-react-declarative/app/layout/ErrorLayout/ErrorLayout.css +0 -0
- package/full-react-declarative/app/layout/ErrorLayout/ErrorLayout.tsx +41 -0
- package/full-react-declarative/app/layout/SecurityLayout/SecurityLayout.css +0 -0
- package/full-react-declarative/app/layout/SecurityLayout/SecurityLayout.tsx +39 -0
- package/full-react-declarative/app/middleware/AuthMiddleware.ts +85 -0
- package/full-react-declarative/app/models/Comment.ts +31 -0
- package/full-react-declarative/app/models/Post.ts +22 -0
- package/full-react-declarative/app/models/User.ts +62 -0
- package/full-react-declarative/app/pages/home/HomePage.tsx +44 -0
- package/full-react-declarative/app/pages/login/LoginPage.css +0 -0
- package/full-react-declarative/app/pages/login/LoginPage.tsx +73 -0
- package/full-react-declarative/app/pages/posts/CreatePostPage/CreatePostPage.css +0 -0
- package/full-react-declarative/app/pages/posts/CreatePostPage/CreatePostPage.tsx +67 -0
- package/full-react-declarative/app/pages/posts/PostPage/PostPage.tsx +60 -0
- package/full-react-declarative/app/pages/posts/ShowPostPage/ShowPostPage.tsx +83 -0
- package/full-react-declarative/app/pages/posts/UpdatePostPage/UpdatePostPage.tsx +77 -0
- package/full-react-declarative/app/pages/register/RegisterPage.tsx +68 -0
- package/full-react-declarative/app/pages/users/CreateUserPage.tsx +48 -0
- package/full-react-declarative/app/pages/users/ShowUserPage.tsx +62 -0
- package/full-react-declarative/app/pages/users/UpdateUserPage.tsx +57 -0
- package/full-react-declarative/app/pages/users/UserPage.tsx +57 -0
- package/full-react-declarative/app/providers/AppServiceProvider.ts +43 -0
- package/full-react-declarative/app/services/CommentService.ts +59 -0
- package/full-react-declarative/app/services/PostService.ts +108 -0
- package/full-react-declarative/app/services/SecurityService.ts +80 -0
- package/full-react-declarative/app/services/TokenService.ts +116 -0
- package/full-react-declarative/app/services/UserService.ts +126 -0
- package/full-react-declarative/app/utils.ts +17 -0
- package/full-react-declarative/assets/css/index.css +301 -0
- package/full-react-declarative/assets/img/logo.png +0 -0
- package/full-react-declarative/package.json +46 -0
- package/full-react-declarative/public/logo.png +0 -0
- package/full-react-declarative/public/vite.svg +1 -0
- package/full-react-declarative/stone.config.mjs +12 -0
- package/full-react-declarative/tsconfig.json +29 -0
- package/full-react-declarative/vitest.config.ts +24 -0
- package/full-react-imperative/.env.example +1 -0
- package/full-react-imperative/.env.public.example +1 -0
- package/full-react-imperative/LICENSE +21 -0
- package/full-react-imperative/README.md +39 -0
- package/full-react-imperative/app/Application.ts +79 -0
- package/full-react-imperative/app/clients/AxiosClient.ts +124 -0
- package/full-react-imperative/app/clients/CommentClient.ts +57 -0
- package/full-react-imperative/app/clients/PostClient.ts +86 -0
- package/full-react-imperative/app/clients/SecurityClient.ts +60 -0
- package/full-react-imperative/app/clients/UserClient.ts +93 -0
- package/full-react-imperative/app/clients/contracts/IAxiosClient.ts +97 -0
- package/full-react-imperative/app/clients/contracts/ICommentClient.ts +31 -0
- package/full-react-imperative/app/clients/contracts/IPostClient.ts +55 -0
- package/full-react-imperative/app/clients/contracts/ISecurityClient.ts +33 -0
- package/full-react-imperative/app/clients/contracts/IUserClient.ts +61 -0
- package/full-react-imperative/app/components/ChangePasswordForm/ChangePasswordForm.tsx +50 -0
- package/full-react-imperative/app/components/CommentForm/CommentForm.css +35 -0
- package/full-react-imperative/app/components/CommentForm/CommentForm.tsx +45 -0
- package/full-react-imperative/app/components/CommentItem/CommentItem.css +74 -0
- package/full-react-imperative/app/components/CommentItem/CommentItem.tsx +62 -0
- package/full-react-imperative/app/components/CommentWidget/CommentWidget.css +25 -0
- package/full-react-imperative/app/components/CommentWidget/CommentWidget.tsx +119 -0
- package/full-react-imperative/app/components/Dropdown/Dropdown.css +52 -0
- package/full-react-imperative/app/components/Dropdown/Dropdown.tsx +40 -0
- package/full-react-imperative/app/components/LayoutHeader/LayoutHeader.css +62 -0
- package/full-react-imperative/app/components/LayoutHeader/LayoutHeader.tsx +61 -0
- package/full-react-imperative/app/components/LayoutLeftMenu/LayoutLeftMenu.css +25 -0
- package/full-react-imperative/app/components/LayoutLeftMenu/LayoutLeftMenu.tsx +32 -0
- package/full-react-imperative/app/components/LoginForm/LoginForm.css +0 -0
- package/full-react-imperative/app/components/LoginForm/LoginForm.tsx +71 -0
- package/full-react-imperative/app/components/NotificationBadge/NotificationBadge.css +41 -0
- package/full-react-imperative/app/components/NotificationBadge/NotificationBadge.tsx +63 -0
- package/full-react-imperative/app/components/PostCard/PostCard.css +129 -0
- package/full-react-imperative/app/components/PostCard/PostCard.tsx +65 -0
- package/full-react-imperative/app/components/PostForm/PostForm.css +92 -0
- package/full-react-imperative/app/components/PostForm/PostForm.tsx +76 -0
- package/full-react-imperative/app/components/PostSkeleton/PostSkeleton.css +65 -0
- package/full-react-imperative/app/components/PostSkeleton/PostSkeleton.tsx +25 -0
- package/full-react-imperative/app/components/PostWidget/PostWidget.tsx +95 -0
- package/full-react-imperative/app/components/ProfileForm/ProfileForm.css +84 -0
- package/full-react-imperative/app/components/ProfileForm/ProfileForm.tsx +79 -0
- package/full-react-imperative/app/components/RegisterForm/RegisterForm.tsx +110 -0
- package/full-react-imperative/app/components/RightAsidePanel/RightAsidePanel.css +32 -0
- package/full-react-imperative/app/components/RightAsidePanel/RightAsidePanel.tsx +62 -0
- package/full-react-imperative/app/components/SettingsForm/SettingsForm.css +126 -0
- package/full-react-imperative/app/components/SettingsForm/SettingsForm.tsx +86 -0
- package/full-react-imperative/app/components/UserAvatar/UserAvatar.css +18 -0
- package/full-react-imperative/app/components/UserAvatar/UserAvatar.tsx +60 -0
- package/full-react-imperative/app/components/UserBadge/UserBadge.css +33 -0
- package/full-react-imperative/app/components/UserBadge/UserBadge.tsx +49 -0
- package/full-react-imperative/app/components/UserCard/UserCard.css +70 -0
- package/full-react-imperative/app/components/UserCard/UserCard.tsx +43 -0
- package/full-react-imperative/app/configurations/AppConfiguration.ts +19 -0
- package/full-react-imperative/app/error-pages/DefaultErrorPage/DefaultErrorPage.css +0 -0
- package/full-react-imperative/app/error-pages/DefaultErrorPage/DefaultErrorPage.tsx +41 -0
- package/full-react-imperative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.css +0 -0
- package/full-react-imperative/app/error-pages/ForbiddenErrorPage/ForbiddenErrorPage.tsx +42 -0
- package/full-react-imperative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.css +0 -0
- package/full-react-imperative/app/error-pages/NotFoundErrorPage/NotFoundErrorPage.tsx +49 -0
- package/full-react-imperative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.css +0 -0
- package/full-react-imperative/app/error-pages/UnauthorizedErrorPage/UnauthorizedErrorPage.tsx +42 -0
- package/full-react-imperative/app/errors/ForbiddenError.ts +11 -0
- package/full-react-imperative/app/errors/PostNotFoundError.ts +11 -0
- package/full-react-imperative/app/errors/UnauthorizedError.ts +11 -0
- package/full-react-imperative/app/errors/UserNotFoundError.ts +11 -0
- package/full-react-imperative/app/events/UserEvent.ts +18 -0
- package/full-react-imperative/app/layout/AppLayout/AppLayout.css +106 -0
- package/full-react-imperative/app/layout/AppLayout/AppLayout.tsx +48 -0
- package/full-react-imperative/app/layout/ErrorLayout/ErrorLayout.css +0 -0
- package/full-react-imperative/app/layout/ErrorLayout/ErrorLayout.tsx +45 -0
- package/full-react-imperative/app/layout/SecurityLayout/SecurityLayout.css +0 -0
- package/full-react-imperative/app/layout/SecurityLayout/SecurityLayout.tsx +43 -0
- package/full-react-imperative/app/layout/SettingsLayout/SettingsLayout.css +99 -0
- package/full-react-imperative/app/layout/SettingsLayout/SettingsLayout.tsx +44 -0
- package/full-react-imperative/app/middleware/AuthMiddleware.ts +56 -0
- package/full-react-imperative/app/models/Comment.ts +35 -0
- package/full-react-imperative/app/models/Post.ts +27 -0
- package/full-react-imperative/app/models/User.ts +68 -0
- package/full-react-imperative/app/pages/Settings/SettingsPage.tsx +23 -0
- package/full-react-imperative/app/pages/home/HomePage.tsx +58 -0
- package/full-react-imperative/app/pages/login/LoginPage.css +0 -0
- package/full-react-imperative/app/pages/login/LoginPage.tsx +65 -0
- package/full-react-imperative/app/pages/posts/ShowPostPage/ShowPostPage.tsx +64 -0
- package/full-react-imperative/app/pages/posts/UpdatePostPage/UpdatePostPage.tsx +56 -0
- package/full-react-imperative/app/pages/register/RegisterPage.tsx +71 -0
- package/full-react-imperative/app/pages/users/ShowUserPage/ShowUserPage.css +64 -0
- package/full-react-imperative/app/pages/users/ShowUserPage/ShowUserPage.tsx +104 -0
- package/full-react-imperative/app/pages/users/UpdateUserPage/UpdateUserPage.css +0 -0
- package/full-react-imperative/app/pages/users/UpdateUserPage/UpdateUserPage.tsx +43 -0
- package/full-react-imperative/app/pages/users/UserPage/UserPage.css +31 -0
- package/full-react-imperative/app/pages/users/UserPage/UserPage.tsx +59 -0
- package/full-react-imperative/app/pages/utils.ts +67 -0
- package/full-react-imperative/app/providers/AppServiceProvider.ts +40 -0
- package/full-react-imperative/app/services/CommentService.ts +53 -0
- package/full-react-imperative/app/services/PostService.ts +102 -0
- package/full-react-imperative/app/services/SecurityService.ts +72 -0
- package/full-react-imperative/app/services/TokenService.ts +108 -0
- package/full-react-imperative/app/services/UserService.ts +115 -0
- package/full-react-imperative/app/services/contracts/ICommentService.ts +30 -0
- package/full-react-imperative/app/services/contracts/IPostService.ts +65 -0
- package/full-react-imperative/app/services/contracts/ISecurityService.ts +39 -0
- package/full-react-imperative/app/services/contracts/ITokenService.ts +44 -0
- package/full-react-imperative/app/services/contracts/IUserService.ts +70 -0
- package/full-react-imperative/app/utils.ts +31 -0
- package/full-react-imperative/assets/css/index.css +301 -0
- package/full-react-imperative/assets/img/logo.png +0 -0
- package/full-react-imperative/package.json +48 -0
- package/full-react-imperative/public/logo.png +0 -0
- package/full-react-imperative/public/vite.svg +1 -0
- package/full-react-imperative/stone.config.mjs +12 -0
- package/full-react-imperative/tsconfig.json +29 -0
- package/full-react-imperative/vitest.config.ts +24 -0
- package/full-service-declarative/.env.example +2 -0
- package/full-service-declarative/LICENSE +21 -0
- package/full-service-declarative/README.md +65 -0
- package/full-service-declarative/app/Application.ts +327 -0
- package/full-service-declarative/app/commands/ListSessionsCommand.ts +70 -0
- package/full-service-declarative/app/commands/ListUsersCommand.ts +56 -0
- package/full-service-declarative/app/configurations/AppConfiguration.ts +52 -0
- package/full-service-declarative/app/configurations/UserLiveConfiguration.ts +28 -0
- package/full-service-declarative/app/database/DatabaseClient.ts +43 -0
- package/full-service-declarative/app/database/schema.ts +43 -0
- package/full-service-declarative/app/error-handlers/SecurityErrorHandler.ts +61 -0
- package/full-service-declarative/app/errors/CredentialsError.ts +12 -0
- package/full-service-declarative/app/events/UserEvent.ts +17 -0
- package/full-service-declarative/app/handlers/CommentEventHandler.ts +103 -0
- package/full-service-declarative/app/handlers/PostEventHandler.ts +104 -0
- package/full-service-declarative/app/handlers/SecurityEventHandler.ts +108 -0
- package/full-service-declarative/app/handlers/UserEventHandler.ts +159 -0
- package/full-service-declarative/app/listeners/UserEventListener.ts +35 -0
- package/full-service-declarative/app/middleware/AuthMiddleware.ts +54 -0
- package/full-service-declarative/app/models/Comment.ts +38 -0
- package/full-service-declarative/app/models/Post.ts +50 -0
- package/full-service-declarative/app/models/Session.ts +14 -0
- package/full-service-declarative/app/models/User.ts +77 -0
- package/full-service-declarative/app/providers/DrizzleServiceProvider.ts +59 -0
- package/full-service-declarative/app/repositories/CommentRepository.ts +155 -0
- package/full-service-declarative/app/repositories/PostRepository.ts +138 -0
- package/full-service-declarative/app/repositories/SessionRepository.ts +123 -0
- package/full-service-declarative/app/repositories/UserRepository.ts +99 -0
- package/full-service-declarative/app/services/CommentService.ts +112 -0
- package/full-service-declarative/app/services/PostService.ts +100 -0
- package/full-service-declarative/app/services/SecurityService.ts +232 -0
- package/full-service-declarative/app/services/SessionService.ts +130 -0
- package/full-service-declarative/app/services/UserService.ts +110 -0
- package/full-service-declarative/app/subscribers/UserEventSubscriber.ts +38 -0
- package/full-service-declarative/drizzle.config.ts +13 -0
- package/full-service-declarative/package.json +48 -0
- package/full-service-declarative/stone.config.mjs +12 -0
- package/full-service-declarative/tsconfig.json +25 -0
- package/full-service-declarative/vitest.config.ts +24 -0
- package/full-service-imperative/.env.example +2 -0
- package/full-service-imperative/LICENSE +21 -0
- package/full-service-imperative/README.md +65 -0
- package/full-service-imperative/app/Application.ts +317 -0
- package/full-service-imperative/app/commands/ListSessionsCommand.ts +54 -0
- package/full-service-imperative/app/commands/ListUsersCommand.ts +42 -0
- package/full-service-imperative/app/configurations/AppConfiguration.ts +44 -0
- package/full-service-imperative/app/configurations/UserLiveConfiguration.ts +26 -0
- package/full-service-imperative/app/database/DatabaseClient.ts +39 -0
- package/full-service-imperative/app/database/schema.ts +43 -0
- package/full-service-imperative/app/error-handlers/SecurityErrorHandler.ts +58 -0
- package/full-service-imperative/app/errors/CredentialsError.ts +12 -0
- package/full-service-imperative/app/events/UserEvent.ts +17 -0
- package/full-service-imperative/app/handlers/CommentEventHandler.ts +99 -0
- package/full-service-imperative/app/handlers/PostEventHandler.ts +99 -0
- package/full-service-imperative/app/handlers/SecurityEventHandler.ts +83 -0
- package/full-service-imperative/app/handlers/UserEventHandler.ts +132 -0
- package/full-service-imperative/app/listeners/UserEventListener.ts +23 -0
- package/full-service-imperative/app/middleware/AuthMiddleware.ts +44 -0
- package/full-service-imperative/app/models/Comment.ts +38 -0
- package/full-service-imperative/app/models/Post.ts +50 -0
- package/full-service-imperative/app/models/Session.ts +14 -0
- package/full-service-imperative/app/models/User.ts +77 -0
- package/full-service-imperative/app/providers/DrizzleServiceProvider.ts +56 -0
- package/full-service-imperative/app/repositories/CommentRepository.ts +148 -0
- package/full-service-imperative/app/repositories/PostRepository.ts +130 -0
- package/full-service-imperative/app/repositories/SessionRepository.ts +115 -0
- package/full-service-imperative/app/repositories/UserRepository.ts +91 -0
- package/full-service-imperative/app/repositories/contracts/ICommentRepository.ts +72 -0
- package/full-service-imperative/app/repositories/contracts/IPostRepository.ts +63 -0
- package/full-service-imperative/app/repositories/contracts/ISessionRepository.ts +65 -0
- package/full-service-imperative/app/repositories/contracts/IUserRepository.ts +55 -0
- package/full-service-imperative/app/services/CommentService.ts +109 -0
- package/full-service-imperative/app/services/PostService.ts +97 -0
- package/full-service-imperative/app/services/SecurityService.ts +224 -0
- package/full-service-imperative/app/services/SessionService.ts +124 -0
- package/full-service-imperative/app/services/UserService.ts +105 -0
- package/full-service-imperative/app/services/contracts/ICommentService.ts +62 -0
- package/full-service-imperative/app/services/contracts/IPostService.ts +53 -0
- package/full-service-imperative/app/services/contracts/ISecurityService.ts +97 -0
- package/full-service-imperative/app/services/contracts/ISessionService.ts +73 -0
- package/full-service-imperative/app/services/contracts/IUserService.ts +57 -0
- package/full-service-imperative/app/subscribers/UserEventSubscriber.ts +28 -0
- package/full-service-imperative/drizzle.config.ts +13 -0
- package/full-service-imperative/package.json +48 -0
- package/full-service-imperative/stone.config.mjs +12 -0
- package/full-service-imperative/tsconfig.json +25 -0
- package/full-service-imperative/vitest.config.ts +24 -0
- package/package.json +225 -0
- package/standard-react-declarative/LICENSE +21 -0
- package/standard-react-declarative/README.md +39 -0
- package/standard-react-declarative/app/Application.ts +45 -0
- package/standard-react-declarative/app/pages/welcome/WelcomePage.tsx +57 -0
- package/standard-react-declarative/app/services/WelcomeService.ts +38 -0
- package/standard-react-declarative/assets/css/index.css +26 -0
- package/standard-react-declarative/package.json +42 -0
- package/standard-react-declarative/tsconfig.json +33 -0
- package/standard-react-declarative/vitest.config.ts +24 -0
- package/standard-react-imperative/LICENSE +21 -0
- package/standard-react-imperative/README.md +39 -0
- package/standard-react-imperative/app/Application.ts +41 -0
- package/standard-react-imperative/app/pages/welcome/WelcomePage.tsx +50 -0
- package/standard-react-imperative/app/services/WelcomeService.ts +38 -0
- package/standard-react-imperative/assets/css/index.css +26 -0
- package/standard-react-imperative/package.json +42 -0
- package/standard-react-imperative/tsconfig.json +33 -0
- package/standard-react-imperative/vitest.config.ts +24 -0
- package/standard-service-declarative/LICENSE +21 -0
- package/standard-service-declarative/README.md +39 -0
- package/standard-service-declarative/app/Application.ts +39 -0
- package/standard-service-declarative/app/handlers/WelcomeEventHandler.ts +45 -0
- package/standard-service-declarative/app/services/WelcomeService.ts +38 -0
- package/standard-service-declarative/package.json +36 -0
- package/standard-service-declarative/tsconfig.json +25 -0
- package/standard-service-declarative/vitest.config.ts +24 -0
- package/standard-service-imperative/LICENSE +21 -0
- package/standard-service-imperative/README.md +39 -0
- package/standard-service-imperative/app/Application.ts +11 -0
- package/standard-service-imperative/app/handlers/welcomeEventHandler.ts +31 -0
- package/standard-service-imperative/app/services/welcomeService.ts +38 -0
- package/standard-service-imperative/package.json +35 -0
- package/standard-service-imperative/tsconfig.json +25 -0
- 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
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
|
+
[](https://stonejs.dev)
|
|
5
|
+
[](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
|
+
}
|
|
Binary file
|
|
@@ -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,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
|
+
}
|