@idealyst/cli 1.1.9 → 1.2.1

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 (324) hide show
  1. package/dist/commands/add.js +233 -0
  2. package/dist/commands/add.js.map +1 -0
  3. package/dist/commands/index.js +13 -0
  4. package/dist/commands/index.js.map +1 -0
  5. package/dist/commands/info.js +193 -0
  6. package/dist/commands/info.js.map +1 -0
  7. package/dist/commands/init.js +155 -0
  8. package/dist/commands/init.js.map +1 -0
  9. package/dist/constants.js +119 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/generators/core/index.js +23 -0
  12. package/dist/generators/core/index.js.map +1 -0
  13. package/dist/generators/core/mobile.js +286 -0
  14. package/dist/generators/core/mobile.js.map +1 -0
  15. package/dist/generators/core/shared.js +207 -0
  16. package/dist/generators/core/shared.js.map +1 -0
  17. package/dist/generators/core/web.js +377 -0
  18. package/dist/generators/core/web.js.map +1 -0
  19. package/dist/generators/extensions/api.js +223 -0
  20. package/dist/generators/extensions/api.js.map +1 -0
  21. package/dist/generators/extensions/devcontainer.js +510 -0
  22. package/dist/generators/extensions/devcontainer.js.map +1 -0
  23. package/dist/generators/extensions/graphql.js +202 -0
  24. package/dist/generators/extensions/graphql.js.map +1 -0
  25. package/dist/generators/extensions/index.js +17 -0
  26. package/dist/generators/extensions/index.js.map +1 -0
  27. package/dist/generators/extensions/prisma.js +249 -0
  28. package/dist/generators/extensions/prisma.js.map +1 -0
  29. package/dist/generators/extensions/trpc.js +258 -0
  30. package/dist/generators/extensions/trpc.js.map +1 -0
  31. package/dist/generators/index.js +106 -4
  32. package/dist/generators/index.js.map +1 -1
  33. package/dist/generators/reactNative.js +177 -0
  34. package/dist/generators/reactNative.js.map +1 -0
  35. package/dist/generators/workspace.js +272 -0
  36. package/dist/generators/workspace.js.map +1 -0
  37. package/dist/identifiers/android.js +75 -0
  38. package/dist/identifiers/android.js.map +1 -0
  39. package/dist/identifiers/index.js +35 -0
  40. package/dist/identifiers/index.js.map +1 -0
  41. package/dist/identifiers/ios.js +65 -0
  42. package/dist/identifiers/ios.js.map +1 -0
  43. package/dist/index.js +41 -319
  44. package/dist/index.js.map +1 -1
  45. package/dist/templates/copier.js +135 -0
  46. package/dist/templates/copier.js.map +1 -0
  47. package/dist/templates/index.js +23 -0
  48. package/dist/templates/index.js.map +1 -0
  49. package/dist/templates/merger.js +113 -0
  50. package/dist/templates/merger.js.map +1 -0
  51. package/dist/templates/processor.js +142 -0
  52. package/dist/templates/processor.js.map +1 -0
  53. package/dist/types/commands/add.d.ts +14 -0
  54. package/dist/types/commands/index.d.ts +6 -0
  55. package/dist/types/commands/info.d.ts +10 -0
  56. package/dist/types/commands/init.d.ts +19 -0
  57. package/dist/types/constants.d.ts +76 -0
  58. package/dist/types/generators/core/index.d.ts +6 -0
  59. package/dist/types/generators/core/mobile.d.ts +13 -0
  60. package/dist/types/generators/core/shared.d.ts +8 -0
  61. package/dist/types/generators/core/web.d.ts +8 -0
  62. package/dist/types/generators/extensions/api.d.ts +8 -0
  63. package/dist/types/generators/extensions/devcontainer.d.ts +15 -0
  64. package/dist/types/generators/extensions/graphql.d.ts +8 -0
  65. package/dist/types/generators/extensions/index.d.ts +8 -0
  66. package/dist/types/generators/extensions/prisma.d.ts +8 -0
  67. package/dist/types/generators/extensions/trpc.d.ts +9 -0
  68. package/dist/types/generators/index.d.ts +11 -3
  69. package/dist/types/generators/reactNative.d.ts +19 -0
  70. package/dist/types/generators/workspace.d.ts +8 -0
  71. package/dist/types/identifiers/android.d.ts +26 -0
  72. package/dist/types/identifiers/index.d.ts +26 -0
  73. package/dist/types/identifiers/ios.d.ts +21 -0
  74. package/dist/types/index.d.ts +3 -0
  75. package/dist/types/templates/copier.d.ts +24 -0
  76. package/dist/types/templates/index.d.ts +6 -0
  77. package/dist/types/templates/merger.d.ts +43 -0
  78. package/dist/types/templates/processor.d.ts +39 -0
  79. package/dist/types/types.d.ts +153 -5
  80. package/dist/types/utils/filesystem.d.ts +56 -0
  81. package/dist/types/utils/index.d.ts +7 -0
  82. package/dist/types/utils/logger.d.ts +58 -0
  83. package/dist/types/utils/shell.d.ts +35 -0
  84. package/dist/types/utils/validation.d.ts +32 -0
  85. package/dist/types/wizard/index.d.ts +20 -0
  86. package/dist/types/wizard/steps/apiExtension.d.ts +5 -0
  87. package/dist/types/wizard/steps/appDisplayName.d.ts +5 -0
  88. package/dist/types/wizard/steps/devcontainerExtension.d.ts +5 -0
  89. package/dist/types/wizard/steps/graphqlExtension.d.ts +5 -0
  90. package/dist/types/wizard/steps/index.d.ts +12 -0
  91. package/dist/types/wizard/steps/orgDomain.d.ts +5 -0
  92. package/dist/types/wizard/steps/prismaExtension.d.ts +5 -0
  93. package/dist/types/wizard/steps/projectName.d.ts +5 -0
  94. package/dist/types/wizard/steps/summary.d.ts +5 -0
  95. package/dist/types/wizard/steps/trpcExtension.d.ts +5 -0
  96. package/dist/types/wizard/validators.d.ts +17 -0
  97. package/dist/types.js +41 -0
  98. package/dist/types.js.map +1 -1
  99. package/dist/utils/filesystem.js +173 -0
  100. package/dist/utils/filesystem.js.map +1 -0
  101. package/dist/utils/index.js +24 -0
  102. package/dist/utils/index.js.map +1 -0
  103. package/dist/utils/logger.js +95 -0
  104. package/dist/utils/logger.js.map +1 -0
  105. package/dist/utils/shell.js +113 -0
  106. package/dist/utils/shell.js.map +1 -0
  107. package/dist/utils/validation.js +196 -0
  108. package/dist/utils/validation.js.map +1 -0
  109. package/dist/wizard/index.js +177 -0
  110. package/dist/wizard/index.js.map +1 -0
  111. package/dist/wizard/steps/apiExtension.js +33 -0
  112. package/dist/wizard/steps/apiExtension.js.map +1 -0
  113. package/dist/wizard/steps/appDisplayName.js +53 -0
  114. package/dist/wizard/steps/appDisplayName.js.map +1 -0
  115. package/dist/wizard/steps/devcontainerExtension.js +78 -0
  116. package/dist/wizard/steps/devcontainerExtension.js.map +1 -0
  117. package/dist/wizard/steps/graphqlExtension.js +37 -0
  118. package/dist/wizard/steps/graphqlExtension.js.map +1 -0
  119. package/dist/wizard/steps/index.js +25 -0
  120. package/dist/wizard/steps/index.js.map +1 -0
  121. package/dist/wizard/steps/orgDomain.js +40 -0
  122. package/dist/wizard/steps/orgDomain.js.map +1 -0
  123. package/dist/wizard/steps/prismaExtension.js +33 -0
  124. package/dist/wizard/steps/prismaExtension.js.map +1 -0
  125. package/dist/wizard/steps/projectName.js +40 -0
  126. package/dist/wizard/steps/projectName.js.map +1 -0
  127. package/dist/wizard/steps/summary.js +107 -0
  128. package/dist/wizard/steps/summary.js.map +1 -0
  129. package/dist/wizard/steps/trpcExtension.js +37 -0
  130. package/dist/wizard/steps/trpcExtension.js.map +1 -0
  131. package/dist/wizard/validators.js +35 -0
  132. package/dist/wizard/validators.js.map +1 -0
  133. package/package.json +6 -19
  134. package/README.md +0 -110
  135. package/dist/generators/init.js +0 -268
  136. package/dist/generators/init.js.map +0 -1
  137. package/dist/generators/utils.js +0 -682
  138. package/dist/generators/utils.js.map +0 -1
  139. package/dist/scripts/configure-react-native-monorepo.js +0 -144
  140. package/dist/scripts/configure-react-native-monorepo.js.map +0 -1
  141. package/dist/template/.devcontainer/Dockerfile +0 -26
  142. package/dist/template/.devcontainer/devcontainer.json +0 -113
  143. package/dist/template/.devcontainer/docker-compose.yml +0 -59
  144. package/dist/template/.devcontainer/figma-mcp.sh +0 -32
  145. package/dist/template/.devcontainer/gitignore.template +0 -2
  146. package/dist/template/.devcontainer/setup.sh +0 -45
  147. package/dist/template/DOCKER.md +0 -0
  148. package/dist/template/Dockerfile +0 -111
  149. package/dist/template/README.md +0 -233
  150. package/dist/template/docker/nginx/prod.conf +0 -238
  151. package/dist/template/docker/nginx.conf +0 -131
  152. package/dist/template/docker/postgres/init.sql +0 -41
  153. package/dist/template/docker/prometheus/prometheus.yml +0 -52
  154. package/dist/template/docker-compose.prod.yml +0 -146
  155. package/dist/template/docker-compose.yml +0 -143
  156. package/dist/template/dockerignore.template +0 -151
  157. package/dist/template/env.example.template +0 -36
  158. package/dist/template/gitignore.template +0 -56
  159. package/dist/template/jest.config.js +0 -20
  160. package/dist/template/mcp.json.template +0 -8
  161. package/dist/template/package.json +0 -45
  162. package/dist/template/packages/api/README.md +0 -510
  163. package/dist/template/packages/api/__tests__/api.test.ts +0 -26
  164. package/dist/template/packages/api/env.example.template +0 -6
  165. package/dist/template/packages/api/gitignore.template +0 -35
  166. package/dist/template/packages/api/jest.config.js +0 -23
  167. package/dist/template/packages/api/jest.setup.js +0 -9
  168. package/dist/template/packages/api/package.json +0 -66
  169. package/dist/template/packages/api/src/context.ts +0 -52
  170. package/dist/template/packages/api/src/controllers/TestController.ts +0 -0
  171. package/dist/template/packages/api/src/graphql/builder.ts +0 -75
  172. package/dist/template/packages/api/src/graphql/generated.ts +0 -64
  173. package/dist/template/packages/api/src/graphql/index.ts +0 -75
  174. package/dist/template/packages/api/src/graphql/types/index.ts +0 -44
  175. package/dist/template/packages/api/src/graphql/types/test.ts +0 -245
  176. package/dist/template/packages/api/src/index.ts +0 -26
  177. package/dist/template/packages/api/src/lib/database.ts +0 -23
  178. package/dist/template/packages/api/src/router/index.ts +0 -163
  179. package/dist/template/packages/api/src/routers/test.ts +0 -161
  180. package/dist/template/packages/api/src/server.ts +0 -68
  181. package/dist/template/packages/api/src/trpc.ts +0 -28
  182. package/dist/template/packages/api/tsconfig.json +0 -44
  183. package/dist/template/packages/database/README.md +0 -162
  184. package/dist/template/packages/database/gitignore.template +0 -41
  185. package/dist/template/packages/database/package.json +0 -49
  186. package/dist/template/packages/database/prisma/seed.ts +0 -64
  187. package/dist/template/packages/database/schema.prisma +0 -107
  188. package/dist/template/packages/database/src/index.ts +0 -15
  189. package/dist/template/packages/database/src/validators.ts +0 -10
  190. package/dist/template/packages/database/tsconfig.json +0 -18
  191. package/dist/template/packages/mobile/README.md +0 -86
  192. package/dist/template/packages/mobile/__tests__/App.test.tsx +0 -156
  193. package/dist/template/packages/mobile/__tests__/components.test.tsx +0 -300
  194. package/dist/template/packages/mobile/app.json +0 -5
  195. package/dist/template/packages/mobile/babel.config.js +0 -10
  196. package/dist/template/packages/mobile/gitignore.template +0 -73
  197. package/dist/template/packages/mobile/index.js +0 -6
  198. package/dist/template/packages/mobile/jest.config.js +0 -21
  199. package/dist/template/packages/mobile/jest.setup.js +0 -12
  200. package/dist/template/packages/mobile/metro.config.js +0 -36
  201. package/dist/template/packages/mobile/package.json +0 -60
  202. package/dist/template/packages/mobile/src/App.tsx +0 -8
  203. package/dist/template/packages/mobile/src/utils/trpc.ts +0 -7
  204. package/dist/template/packages/mobile/tsconfig.json +0 -28
  205. package/dist/template/packages/shared/README.md +0 -135
  206. package/dist/template/packages/shared/__tests__/shared.test.ts +0 -51
  207. package/dist/template/packages/shared/gitignore.template +0 -35
  208. package/dist/template/packages/shared/jest.config.js +0 -22
  209. package/dist/template/packages/shared/package.json +0 -68
  210. package/dist/template/packages/shared/src/components/App.tsx +0 -57
  211. package/dist/template/packages/shared/src/components/HelloWorld.tsx +0 -531
  212. package/dist/template/packages/shared/src/components/index.ts +0 -1
  213. package/dist/template/packages/shared/src/graphql/client.ts +0 -34
  214. package/dist/template/packages/shared/src/index.ts +0 -22
  215. package/dist/template/packages/shared/src/navigation/AppRouter.tsx +0 -565
  216. package/dist/template/packages/shared/src/trpc/client.ts +0 -44
  217. package/dist/template/packages/shared/tsconfig.json +0 -22
  218. package/dist/template/packages/web/README.md +0 -131
  219. package/dist/template/packages/web/__tests__/App.test.tsx +0 -342
  220. package/dist/template/packages/web/__tests__/components.test.tsx +0 -564
  221. package/dist/template/packages/web/gitignore.template +0 -35
  222. package/dist/template/packages/web/index.html +0 -13
  223. package/dist/template/packages/web/jest.config.js +0 -27
  224. package/dist/template/packages/web/jest.setup.js +0 -24
  225. package/dist/template/packages/web/package.json +0 -69
  226. package/dist/template/packages/web/src/App.tsx +0 -14
  227. package/dist/template/packages/web/src/components/TestDemo.tsx +0 -164
  228. package/dist/template/packages/web/src/main.tsx +0 -25
  229. package/dist/template/packages/web/src/utils/trpc.ts +0 -7
  230. package/dist/template/packages/web/tsconfig.json +0 -26
  231. package/dist/template/packages/web/vite.config.ts +0 -98
  232. package/dist/template/setup.sh +0 -30
  233. package/dist/template/tsconfig.json +0 -22
  234. package/dist/template/yarnrc.yml.template +0 -4
  235. package/dist/types/generators/init.d.ts +0 -5
  236. package/dist/types/generators/utils.d.ts +0 -45
  237. package/dist/types/scripts/configure-react-native-monorepo.d.ts +0 -23
  238. package/template/.devcontainer/Dockerfile +0 -26
  239. package/template/.devcontainer/devcontainer.json +0 -113
  240. package/template/.devcontainer/docker-compose.yml +0 -59
  241. package/template/.devcontainer/figma-mcp.sh +0 -32
  242. package/template/.devcontainer/setup.sh +0 -45
  243. package/template/.dockerignore +0 -151
  244. package/template/.env.example +0 -36
  245. package/template/.env.production +0 -56
  246. package/template/DOCKER.md +0 -0
  247. package/template/Dockerfile +0 -111
  248. package/template/README.md +0 -233
  249. package/template/docker/nginx/prod.conf +0 -238
  250. package/template/docker/nginx.conf +0 -131
  251. package/template/docker/postgres/init.sql +0 -41
  252. package/template/docker/prometheus/prometheus.yml +0 -52
  253. package/template/docker-compose.prod.yml +0 -146
  254. package/template/docker-compose.yml +0 -143
  255. package/template/jest.config.js +0 -20
  256. package/template/package.json +0 -45
  257. package/template/packages/api/.env.example +0 -6
  258. package/template/packages/api/README.md +0 -510
  259. package/template/packages/api/__tests__/api.test.ts +0 -26
  260. package/template/packages/api/jest.config.js +0 -23
  261. package/template/packages/api/jest.setup.js +0 -9
  262. package/template/packages/api/package.json +0 -66
  263. package/template/packages/api/src/context.ts +0 -52
  264. package/template/packages/api/src/controllers/TestController.ts +0 -0
  265. package/template/packages/api/src/graphql/builder.ts +0 -75
  266. package/template/packages/api/src/graphql/generated.ts +0 -64
  267. package/template/packages/api/src/graphql/index.ts +0 -75
  268. package/template/packages/api/src/graphql/types/index.ts +0 -44
  269. package/template/packages/api/src/graphql/types/test.ts +0 -245
  270. package/template/packages/api/src/index.ts +0 -26
  271. package/template/packages/api/src/lib/database.ts +0 -23
  272. package/template/packages/api/src/router/index.ts +0 -163
  273. package/template/packages/api/src/routers/test.ts +0 -161
  274. package/template/packages/api/src/server.ts +0 -68
  275. package/template/packages/api/src/trpc.ts +0 -28
  276. package/template/packages/api/tsconfig.json +0 -44
  277. package/template/packages/database/README.md +0 -162
  278. package/template/packages/database/package.json +0 -49
  279. package/template/packages/database/prisma/seed.ts +0 -64
  280. package/template/packages/database/schema.prisma +0 -107
  281. package/template/packages/database/src/index.ts +0 -15
  282. package/template/packages/database/src/validators.ts +0 -10
  283. package/template/packages/database/tsconfig.json +0 -18
  284. package/template/packages/mobile/README.md +0 -86
  285. package/template/packages/mobile/__tests__/App.test.tsx +0 -156
  286. package/template/packages/mobile/__tests__/components.test.tsx +0 -300
  287. package/template/packages/mobile/app.json +0 -5
  288. package/template/packages/mobile/babel.config.js +0 -26
  289. package/template/packages/mobile/index.js +0 -8
  290. package/template/packages/mobile/jest.config.js +0 -21
  291. package/template/packages/mobile/jest.setup.js +0 -12
  292. package/template/packages/mobile/metro.config.js +0 -36
  293. package/template/packages/mobile/package.json +0 -60
  294. package/template/packages/mobile/src/App.tsx +0 -8
  295. package/template/packages/mobile/src/utils/trpc.ts +0 -7
  296. package/template/packages/mobile/tsconfig.json +0 -28
  297. package/template/packages/shared/README.md +0 -135
  298. package/template/packages/shared/__tests__/shared.test.ts +0 -51
  299. package/template/packages/shared/jest.config.js +0 -22
  300. package/template/packages/shared/package.json +0 -68
  301. package/template/packages/shared/src/components/App.tsx +0 -57
  302. package/template/packages/shared/src/components/HelloWorld.tsx +0 -531
  303. package/template/packages/shared/src/components/index.ts +0 -1
  304. package/template/packages/shared/src/graphql/client.ts +0 -34
  305. package/template/packages/shared/src/index.ts +0 -25
  306. package/template/packages/shared/src/navigation/AppRouter.tsx +0 -565
  307. package/template/packages/shared/src/trpc/client.ts +0 -44
  308. package/template/packages/shared/src/unistyles.ts +0 -50
  309. package/template/packages/shared/tsconfig.json +0 -22
  310. package/template/packages/web/README.md +0 -131
  311. package/template/packages/web/__tests__/App.test.tsx +0 -342
  312. package/template/packages/web/__tests__/components.test.tsx +0 -564
  313. package/template/packages/web/index.html +0 -13
  314. package/template/packages/web/jest.config.js +0 -27
  315. package/template/packages/web/jest.setup.js +0 -24
  316. package/template/packages/web/package.json +0 -69
  317. package/template/packages/web/src/App.tsx +0 -14
  318. package/template/packages/web/src/components/TestDemo.tsx +0 -164
  319. package/template/packages/web/src/main.tsx +0 -27
  320. package/template/packages/web/src/utils/trpc.ts +0 -7
  321. package/template/packages/web/tsconfig.json +0 -26
  322. package/template/packages/web/vite.config.ts +0 -114
  323. package/template/setup.sh +0 -30
  324. package/template/tsconfig.json +0 -22
@@ -1,131 +0,0 @@
1
- # {{projectName}}
2
-
3
- {{description}}
4
-
5
- ## Getting Started
6
-
7
- This is a React web application built with the Idealyst Framework and Vite, with full-stack capabilities including database and API integration.
8
-
9
- ### Prerequisites
10
-
11
- - Node.js 18+
12
- - Yarn
13
-
14
- ### Installation
15
-
16
- Install dependencies:
17
- ```bash
18
- yarn install
19
- ```
20
-
21
- ### Database Setup
22
-
23
- If your project includes a database, set it up:
24
-
25
- ```bash
26
- # Navigate to the database package
27
- cd packages/database
28
-
29
- # Install dependencies
30
- yarn install
31
-
32
- # Generate Prisma client
33
- yarn prisma:generate
34
-
35
- # Run database migrations
36
- yarn prisma:migrate
37
-
38
- # Seed the database with sample data
39
- yarn prisma:seed
40
- ```
41
-
42
- ### API Setup
43
-
44
- If your project includes an API, start the API server:
45
-
46
- ```bash
47
- # Navigate to the API package
48
- cd packages/api
49
-
50
- # Install dependencies
51
- yarn install
52
-
53
- # Start the API server (usually on port 3000)
54
- yarn dev
55
- ```
56
-
57
- ### Development
58
-
59
- Start the web development server:
60
- ```bash
61
- yarn dev
62
- ```
63
-
64
- The app will be available at `http://localhost:3000`
65
-
66
- If you have both database and API packages, make sure to start them first before starting the web app for full functionality.
67
-
68
- ### Building for Production
69
-
70
- Build the app:
71
- ```bash
72
- yarn build
73
- ```
74
-
75
- Preview the production build:
76
- ```bash
77
- yarn preview
78
- ```
79
-
80
- ### Project Structure
81
-
82
- ```
83
- {{projectName}}/
84
- ├── packages/
85
- │ ├── database/ # Database schema and migrations (if included)
86
- │ ├── api/ # tRPC API server (if included)
87
- │ ├── shared/ # Shared components and utilities
88
- │ └── web/ # React web application
89
- ├── src/
90
- │ ├── App.tsx # Main app component
91
- │ ├── main.tsx # App entry point
92
- │ ├── components/ # React components
93
- │ └── utils/ # Utility functions and tRPC client
94
- ├── index.html # HTML template
95
- ├── vite.config.ts # Vite configuration
96
- └── tsconfig.json # TypeScript configuration
97
- ```
98
-
99
- ### Features
100
-
101
- - **Full-Stack Type Safety**: End-to-end TypeScript from database to frontend
102
- - **tRPC Integration**: Type-safe API calls with automatic TypeScript inference
103
- - **Database Integration**: Prisma ORM with SQLite for development
104
- - **Idealyst Components**: Cross-platform UI components
105
- - **Idealyst Navigation**: Consistent navigation system
106
- - **Idealyst Theme**: Unified theming across platforms
107
- - **React 19.1**: Latest React version
108
- - **Vite**: Fast build tool and dev server
109
- - **React Native Web**: Use React Native components on the web
110
-
111
- ### API Demo
112
-
113
- If your project includes the API demo, you can access it at `/test-demo` to see:
114
- - Real-time database queries
115
- - CRUD operations (Create, Read, Update, Delete)
116
- - Type-safe tRPC integration
117
- - Form handling with validation
118
-
119
- ### Development
120
-
121
- The app uses the Idealyst Framework for consistent UI and navigation that works across web and mobile platforms.
122
-
123
- Edit `src/App.tsx` to start building your application.
124
-
125
- ### Learn More
126
-
127
- - [Idealyst Framework Documentation](https://github.com/your-username/idealyst-framework)
128
- - [tRPC Documentation](https://trpc.io/)
129
- - [Prisma Documentation](https://prisma.io/)
130
- - [React Documentation](https://react.dev/)
131
- - [Vite Documentation](https://vitejs.dev/)
@@ -1,342 +0,0 @@
1
- import React from 'react';
2
- import { render, screen, fireEvent, waitFor } from '@testing-library/react';
3
- import userEvent from '@testing-library/user-event';
4
- import { MemoryRouter } from 'react-router-dom';
5
- import App from '../src/App';
6
-
7
- // Mock the NavigatorProvider to avoid complex setup
8
- jest.mock('@idealyst/navigation', () => ({
9
- NavigatorProvider: ({ children }: { children?: React.ReactNode }) => (
10
- <div data-testid="navigator-provider">{children || 'Navigator Content'}</div>
11
- ),
12
- }));
13
-
14
- jest.mock('@idealyst/navigation/examples', () => ({
15
- ExampleStackRouter: {},
16
- }));
17
-
18
- describe('App Component', () => {
19
- it('renders without crashing', () => {
20
- render(
21
- <MemoryRouter>
22
- <App />
23
- </MemoryRouter>
24
- );
25
-
26
- expect(screen.getByTestId('navigator-provider')).toBeInTheDocument();
27
- });
28
-
29
- it('contains the App class', () => {
30
- const { container } = render(
31
- <MemoryRouter>
32
- <App />
33
- </MemoryRouter>
34
- );
35
-
36
- expect(container.querySelector('.App')).toBeInTheDocument();
37
- });
38
-
39
- it('renders NavigatorProvider with BrowserRouter', () => {
40
- render(
41
- <MemoryRouter>
42
- <App />
43
- </MemoryRouter>
44
- );
45
-
46
- const navigatorProvider = screen.getByTestId('navigator-provider');
47
- expect(navigatorProvider).toBeInTheDocument();
48
- expect(navigatorProvider).toHaveTextContent('Navigator Content');
49
- });
50
- });
51
-
52
- describe('Sample React Component Tests', () => {
53
- // Example functional component for testing
54
- const Button = ({
55
- children,
56
- onClick,
57
- disabled = false,
58
- variant = 'primary'
59
- }: {
60
- children: React.ReactNode;
61
- onClick: () => void;
62
- disabled?: boolean;
63
- variant?: 'primary' | 'secondary';
64
- }) => (
65
- <button
66
- data-testid="custom-button"
67
- onClick={onClick}
68
- disabled={disabled}
69
- className={`btn btn-${variant}`}
70
- >
71
- {children}
72
- </button>
73
- );
74
-
75
- it('renders button with correct text', () => {
76
- const mockClick = jest.fn();
77
- render(<Button onClick={mockClick}>Click me</Button>);
78
-
79
- const button = screen.getByTestId('custom-button');
80
- expect(button).toBeInTheDocument();
81
- expect(button).toHaveTextContent('Click me');
82
- });
83
-
84
- it('calls onClick when clicked', async () => {
85
- const user = userEvent.setup();
86
- const mockClick = jest.fn();
87
-
88
- render(<Button onClick={mockClick}>Click me</Button>);
89
-
90
- const button = screen.getByTestId('custom-button');
91
- await user.click(button);
92
-
93
- expect(mockClick).toHaveBeenCalledTimes(1);
94
- });
95
-
96
- it('is disabled when disabled prop is true', () => {
97
- const mockClick = jest.fn();
98
- render(
99
- <Button onClick={mockClick} disabled>
100
- Disabled Button
101
- </Button>
102
- );
103
-
104
- const button = screen.getByTestId('custom-button');
105
- expect(button).toBeDisabled();
106
- });
107
-
108
- it('applies correct CSS classes based on variant', () => {
109
- const mockClick = jest.fn();
110
- const { rerender } = render(
111
- <Button onClick={mockClick} variant="primary">
112
- Primary Button
113
- </Button>
114
- );
115
-
116
- let button = screen.getByTestId('custom-button');
117
- expect(button).toHaveClass('btn', 'btn-primary');
118
-
119
- rerender(
120
- <Button onClick={mockClick} variant="secondary">
121
- Secondary Button
122
- </Button>
123
- );
124
-
125
- button = screen.getByTestId('custom-button');
126
- expect(button).toHaveClass('btn', 'btn-secondary');
127
- });
128
- });
129
-
130
- describe('Component with State', () => {
131
- const Counter = ({ initialCount = 0 }: { initialCount?: number }) => {
132
- const [count, setCount] = React.useState(initialCount);
133
-
134
- return (
135
- <div data-testid="counter">
136
- <span data-testid="count-display">Count: {count}</span>
137
- <button
138
- data-testid="increment-button"
139
- onClick={() => setCount(c => c + 1)}
140
- >
141
- Increment
142
- </button>
143
- <button
144
- data-testid="decrement-button"
145
- onClick={() => setCount(c => c - 1)}
146
- >
147
- Decrement
148
- </button>
149
- <button
150
- data-testid="reset-button"
151
- onClick={() => setCount(initialCount)}
152
- >
153
- Reset
154
- </button>
155
- </div>
156
- );
157
- };
158
-
159
- it('renders with initial count', () => {
160
- render(<Counter initialCount={5} />);
161
-
162
- expect(screen.getByTestId('count-display')).toHaveTextContent('Count: 5');
163
- });
164
-
165
- it('increments count when increment button is clicked', async () => {
166
- const user = userEvent.setup();
167
- render(<Counter />);
168
-
169
- const incrementButton = screen.getByTestId('increment-button');
170
- const countDisplay = screen.getByTestId('count-display');
171
-
172
- expect(countDisplay).toHaveTextContent('Count: 0');
173
-
174
- await user.click(incrementButton);
175
- expect(countDisplay).toHaveTextContent('Count: 1');
176
-
177
- await user.click(incrementButton);
178
- expect(countDisplay).toHaveTextContent('Count: 2');
179
- });
180
-
181
- it('decrements count when decrement button is clicked', async () => {
182
- const user = userEvent.setup();
183
- render(<Counter initialCount={5} />);
184
-
185
- const decrementButton = screen.getByTestId('decrement-button');
186
- const countDisplay = screen.getByTestId('count-display');
187
-
188
- expect(countDisplay).toHaveTextContent('Count: 5');
189
-
190
- await user.click(decrementButton);
191
- expect(countDisplay).toHaveTextContent('Count: 4');
192
- });
193
-
194
- it('resets count to initial value', async () => {
195
- const user = userEvent.setup();
196
- render(<Counter initialCount={10} />);
197
-
198
- const incrementButton = screen.getByTestId('increment-button');
199
- const resetButton = screen.getByTestId('reset-button');
200
- const countDisplay = screen.getByTestId('count-display');
201
-
202
- // Increment a few times
203
- await user.click(incrementButton);
204
- await user.click(incrementButton);
205
- expect(countDisplay).toHaveTextContent('Count: 12');
206
-
207
- // Reset
208
- await user.click(resetButton);
209
- expect(countDisplay).toHaveTextContent('Count: 10');
210
- });
211
- });
212
-
213
- describe('Async Component Testing', () => {
214
- const AsyncDataComponent = () => {
215
- const [data, setData] = React.useState<string | null>(null);
216
- const [loading, setLoading] = React.useState(false);
217
- const [error, setError] = React.useState<string | null>(null);
218
-
219
- const fetchData = async () => {
220
- setLoading(true);
221
- setError(null);
222
-
223
- try {
224
- // Simulate API call
225
- await new Promise(resolve => setTimeout(resolve, 100));
226
- setData('Fetched data successfully');
227
- } catch (err) {
228
- setError('Failed to fetch data');
229
- } finally {
230
- setLoading(false);
231
- }
232
- };
233
-
234
- return (
235
- <div data-testid="async-component">
236
- <button data-testid="fetch-button" onClick={fetchData}>
237
- Fetch Data
238
- </button>
239
-
240
- {loading && <div data-testid="loading">Loading...</div>}
241
- {error && <div data-testid="error">{error}</div>}
242
- {data && <div data-testid="data">{data}</div>}
243
- </div>
244
- );
245
- };
246
-
247
- it('fetches and displays data', async () => {
248
- const user = userEvent.setup();
249
- render(<AsyncDataComponent />);
250
-
251
- const fetchButton = screen.getByTestId('fetch-button');
252
-
253
- // Initially no data, loading, or error
254
- expect(screen.queryByTestId('data')).not.toBeInTheDocument();
255
- expect(screen.queryByTestId('loading')).not.toBeInTheDocument();
256
- expect(screen.queryByTestId('error')).not.toBeInTheDocument();
257
-
258
- // Click fetch button
259
- await user.click(fetchButton);
260
-
261
- // Loading should appear
262
- expect(screen.getByTestId('loading')).toBeInTheDocument();
263
-
264
- // Wait for data to load
265
- await waitFor(() => {
266
- expect(screen.getByTestId('data')).toBeInTheDocument();
267
- });
268
-
269
- expect(screen.getByTestId('data')).toHaveTextContent('Fetched data successfully');
270
- expect(screen.queryByTestId('loading')).not.toBeInTheDocument();
271
- });
272
- });
273
-
274
- describe('Form Component Testing', () => {
275
- const ContactForm = ({ onSubmit }: { onSubmit: (data: { name: string; email: string }) => void }) => {
276
- const [name, setName] = React.useState('');
277
- const [email, setEmail] = React.useState('');
278
-
279
- const handleSubmit = (e: React.FormEvent) => {
280
- e.preventDefault();
281
- onSubmit({ name, email });
282
- };
283
-
284
- return (
285
- <form data-testid="contact-form" onSubmit={handleSubmit}>
286
- <input
287
- data-testid="name-input"
288
- type="text"
289
- placeholder="Name"
290
- value={name}
291
- onChange={(e) => setName(e.target.value)}
292
- />
293
- <input
294
- data-testid="email-input"
295
- type="email"
296
- placeholder="Email"
297
- value={email}
298
- onChange={(e) => setEmail(e.target.value)}
299
- />
300
- <button data-testid="submit-button" type="submit">
301
- Submit
302
- </button>
303
- </form>
304
- );
305
- };
306
-
307
- it('submits form with correct data', async () => {
308
- const user = userEvent.setup();
309
- const mockSubmit = jest.fn();
310
-
311
- render(<ContactForm onSubmit={mockSubmit} />);
312
-
313
- const nameInput = screen.getByTestId('name-input');
314
- const emailInput = screen.getByTestId('email-input');
315
- const submitButton = screen.getByTestId('submit-button');
316
-
317
- // Fill out form
318
- await user.type(nameInput, 'John Doe');
319
- await user.type(emailInput, 'john@example.com');
320
-
321
- // Submit form
322
- await user.click(submitButton);
323
-
324
- expect(mockSubmit).toHaveBeenCalledWith({
325
- name: 'John Doe',
326
- email: 'john@example.com'
327
- });
328
- });
329
-
330
- it('updates input values as user types', async () => {
331
- const user = userEvent.setup();
332
- const mockSubmit = jest.fn();
333
-
334
- render(<ContactForm onSubmit={mockSubmit} />);
335
-
336
- const nameInput = screen.getByTestId('name-input') as HTMLInputElement;
337
-
338
- await user.type(nameInput, 'Test Name');
339
-
340
- expect(nameInput.value).toBe('Test Name');
341
- });
342
- });