create-nexo 1.0.0

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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/api/index.d.ts +196 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +390 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/bin/nexo.d.ts +3 -0
  8. package/dist/bin/nexo.d.ts.map +1 -0
  9. package/dist/bin/nexo.js +427 -0
  10. package/dist/bin/nexo.js.map +1 -0
  11. package/dist/configurators/core/framework.d.ts +3 -0
  12. package/dist/configurators/core/framework.d.ts.map +1 -0
  13. package/dist/configurators/core/framework.js +56 -0
  14. package/dist/configurators/core/framework.js.map +1 -0
  15. package/dist/configurators/core/index.d.ts +4 -0
  16. package/dist/configurators/core/index.d.ts.map +1 -0
  17. package/dist/configurators/core/index.js +4 -0
  18. package/dist/configurators/core/index.js.map +1 -0
  19. package/dist/configurators/core/language.d.ts +3 -0
  20. package/dist/configurators/core/language.d.ts.map +1 -0
  21. package/dist/configurators/core/language.js +59 -0
  22. package/dist/configurators/core/language.js.map +1 -0
  23. package/dist/configurators/core/variant.d.ts +3 -0
  24. package/dist/configurators/core/variant.d.ts.map +1 -0
  25. package/dist/configurators/core/variant.js +22 -0
  26. package/dist/configurators/core/variant.js.map +1 -0
  27. package/dist/configurators/index.d.ts +5 -0
  28. package/dist/configurators/index.d.ts.map +1 -0
  29. package/dist/configurators/index.js +6 -0
  30. package/dist/configurators/index.js.map +1 -0
  31. package/dist/configurators/project/auth.d.ts +3 -0
  32. package/dist/configurators/project/auth.d.ts.map +1 -0
  33. package/dist/configurators/project/auth.js +82 -0
  34. package/dist/configurators/project/auth.js.map +1 -0
  35. package/dist/configurators/project/cicd.d.ts +30 -0
  36. package/dist/configurators/project/cicd.d.ts.map +1 -0
  37. package/dist/configurators/project/cicd.js +289 -0
  38. package/dist/configurators/project/cicd.js.map +1 -0
  39. package/dist/configurators/project/i18n.d.ts +3 -0
  40. package/dist/configurators/project/i18n.d.ts.map +1 -0
  41. package/dist/configurators/project/i18n.js +67 -0
  42. package/dist/configurators/project/i18n.js.map +1 -0
  43. package/dist/configurators/project/index.d.ts +6 -0
  44. package/dist/configurators/project/index.d.ts.map +1 -0
  45. package/dist/configurators/project/index.js +6 -0
  46. package/dist/configurators/project/index.js.map +1 -0
  47. package/dist/configurators/project/mandatory.d.ts +3 -0
  48. package/dist/configurators/project/mandatory.d.ts.map +1 -0
  49. package/dist/configurators/project/mandatory.js +167 -0
  50. package/dist/configurators/project/mandatory.js.map +1 -0
  51. package/dist/configurators/project/structure.d.ts +3 -0
  52. package/dist/configurators/project/structure.d.ts.map +1 -0
  53. package/dist/configurators/project/structure.js +34 -0
  54. package/dist/configurators/project/structure.js.map +1 -0
  55. package/dist/configurators/state/dataFetching.d.ts +3 -0
  56. package/dist/configurators/state/dataFetching.d.ts.map +1 -0
  57. package/dist/configurators/state/dataFetching.js +23 -0
  58. package/dist/configurators/state/dataFetching.js.map +1 -0
  59. package/dist/configurators/state/forms.d.ts +3 -0
  60. package/dist/configurators/state/forms.d.ts.map +1 -0
  61. package/dist/configurators/state/forms.js +35 -0
  62. package/dist/configurators/state/forms.js.map +1 -0
  63. package/dist/configurators/state/index.d.ts +5 -0
  64. package/dist/configurators/state/index.d.ts.map +1 -0
  65. package/dist/configurators/state/index.js +5 -0
  66. package/dist/configurators/state/index.js.map +1 -0
  67. package/dist/configurators/state/routing.d.ts +3 -0
  68. package/dist/configurators/state/routing.d.ts.map +1 -0
  69. package/dist/configurators/state/routing.js +23 -0
  70. package/dist/configurators/state/routing.js.map +1 -0
  71. package/dist/configurators/state/state.d.ts +3 -0
  72. package/dist/configurators/state/state.d.ts.map +1 -0
  73. package/dist/configurators/state/state.js +91 -0
  74. package/dist/configurators/state/state.js.map +1 -0
  75. package/dist/configurators/styling/icons.d.ts +3 -0
  76. package/dist/configurators/styling/icons.d.ts.map +1 -0
  77. package/dist/configurators/styling/icons.js +27 -0
  78. package/dist/configurators/styling/icons.js.map +1 -0
  79. package/dist/configurators/styling/index.d.ts +4 -0
  80. package/dist/configurators/styling/index.d.ts.map +1 -0
  81. package/dist/configurators/styling/index.js +4 -0
  82. package/dist/configurators/styling/index.js.map +1 -0
  83. package/dist/configurators/styling/styling.d.ts +3 -0
  84. package/dist/configurators/styling/styling.d.ts.map +1 -0
  85. package/dist/configurators/styling/styling.js +62 -0
  86. package/dist/configurators/styling/styling.js.map +1 -0
  87. package/dist/configurators/styling/ui.d.ts +3 -0
  88. package/dist/configurators/styling/ui.d.ts.map +1 -0
  89. package/dist/configurators/styling/ui.js +188 -0
  90. package/dist/configurators/styling/ui.js.map +1 -0
  91. package/dist/core/index.d.ts +7 -0
  92. package/dist/core/index.d.ts.map +1 -0
  93. package/dist/core/index.js +7 -0
  94. package/dist/core/index.js.map +1 -0
  95. package/dist/core/lazy-loader.d.ts +57 -0
  96. package/dist/core/lazy-loader.d.ts.map +1 -0
  97. package/dist/core/lazy-loader.js +231 -0
  98. package/dist/core/lazy-loader.js.map +1 -0
  99. package/dist/core/parallel.d.ts +29 -0
  100. package/dist/core/parallel.d.ts.map +1 -0
  101. package/dist/core/parallel.js +127 -0
  102. package/dist/core/parallel.js.map +1 -0
  103. package/dist/core/presets.d.ts +10 -0
  104. package/dist/core/presets.d.ts.map +1 -0
  105. package/dist/core/presets.js +73 -0
  106. package/dist/core/presets.js.map +1 -0
  107. package/dist/core/prompts/core.d.ts +18 -0
  108. package/dist/core/prompts/core.d.ts.map +1 -0
  109. package/dist/core/prompts/core.js +420 -0
  110. package/dist/core/prompts/core.js.map +1 -0
  111. package/dist/core/prompts/filter.d.ts +34 -0
  112. package/dist/core/prompts/filter.d.ts.map +1 -0
  113. package/dist/core/prompts/filter.js +48 -0
  114. package/dist/core/prompts/filter.js.map +1 -0
  115. package/dist/core/prompts/index.d.ts +10 -0
  116. package/dist/core/prompts/index.d.ts.map +1 -0
  117. package/dist/core/prompts/index.js +16 -0
  118. package/dist/core/prompts/index.js.map +1 -0
  119. package/dist/core/prompts/optional.d.ts +15 -0
  120. package/dist/core/prompts/optional.d.ts.map +1 -0
  121. package/dist/core/prompts/optional.js +228 -0
  122. package/dist/core/prompts/optional.js.map +1 -0
  123. package/dist/core/prompts/utils.d.ts +37 -0
  124. package/dist/core/prompts/utils.d.ts.map +1 -0
  125. package/dist/core/prompts/utils.js +72 -0
  126. package/dist/core/prompts/utils.js.map +1 -0
  127. package/dist/core/prompts.d.ts +6 -0
  128. package/dist/core/prompts.d.ts.map +1 -0
  129. package/dist/core/prompts.js +6 -0
  130. package/dist/core/prompts.js.map +1 -0
  131. package/dist/core/setup.d.ts +28 -0
  132. package/dist/core/setup.d.ts.map +1 -0
  133. package/dist/core/setup.js +96 -0
  134. package/dist/core/setup.js.map +1 -0
  135. package/dist/core/wizard.d.ts +39 -0
  136. package/dist/core/wizard.d.ts.map +1 -0
  137. package/dist/core/wizard.js +259 -0
  138. package/dist/core/wizard.js.map +1 -0
  139. package/dist/errors/index.d.ts +67 -0
  140. package/dist/errors/index.d.ts.map +1 -0
  141. package/dist/errors/index.js +253 -0
  142. package/dist/errors/index.js.map +1 -0
  143. package/dist/errors/messages.d.ts +56 -0
  144. package/dist/errors/messages.d.ts.map +1 -0
  145. package/dist/errors/messages.js +234 -0
  146. package/dist/errors/messages.js.map +1 -0
  147. package/dist/generators/index.d.ts +86 -0
  148. package/dist/generators/index.d.ts.map +1 -0
  149. package/dist/generators/index.js +441 -0
  150. package/dist/generators/index.js.map +1 -0
  151. package/dist/index.d.ts +16 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +17 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/plugins/index.d.ts +48 -0
  156. package/dist/plugins/index.d.ts.map +1 -0
  157. package/dist/plugins/index.js +49 -0
  158. package/dist/plugins/index.js.map +1 -0
  159. package/dist/plugins/loader.d.ts +38 -0
  160. package/dist/plugins/loader.d.ts.map +1 -0
  161. package/dist/plugins/loader.js +229 -0
  162. package/dist/plugins/loader.js.map +1 -0
  163. package/dist/plugins/manager.d.ts +32 -0
  164. package/dist/plugins/manager.d.ts.map +1 -0
  165. package/dist/plugins/manager.js +220 -0
  166. package/dist/plugins/manager.js.map +1 -0
  167. package/dist/plugins/types.d.ts +186 -0
  168. package/dist/plugins/types.d.ts.map +1 -0
  169. package/dist/plugins/types.js +5 -0
  170. package/dist/plugins/types.js.map +1 -0
  171. package/dist/security/index.d.ts +59 -0
  172. package/dist/security/index.d.ts.map +1 -0
  173. package/dist/security/index.js +230 -0
  174. package/dist/security/index.js.map +1 -0
  175. package/dist/templates/entry.d.ts +9 -0
  176. package/dist/templates/entry.d.ts.map +1 -0
  177. package/dist/templates/entry.js +24 -0
  178. package/dist/templates/entry.js.map +1 -0
  179. package/dist/templates/index.d.ts +7 -0
  180. package/dist/templates/index.d.ts.map +1 -0
  181. package/dist/templates/index.js +10 -0
  182. package/dist/templates/index.js.map +1 -0
  183. package/dist/templates/main.d.ts +6 -0
  184. package/dist/templates/main.d.ts.map +1 -0
  185. package/dist/templates/main.js +72 -0
  186. package/dist/templates/main.js.map +1 -0
  187. package/dist/templates/readme.d.ts +3 -0
  188. package/dist/templates/readme.d.ts.map +1 -0
  189. package/dist/templates/readme.js +127 -0
  190. package/dist/templates/readme.js.map +1 -0
  191. package/dist/templates/styles.d.ts +6 -0
  192. package/dist/templates/styles.d.ts.map +1 -0
  193. package/dist/templates/styles.js +212 -0
  194. package/dist/templates/styles.js.map +1 -0
  195. package/dist/templates/welcome.d.ts +10 -0
  196. package/dist/templates/welcome.d.ts.map +1 -0
  197. package/dist/templates/welcome.js +322 -0
  198. package/dist/templates/welcome.js.map +1 -0
  199. package/dist/types/index.d.ts +46 -0
  200. package/dist/types/index.d.ts.map +1 -0
  201. package/dist/types/index.js +2 -0
  202. package/dist/types/index.js.map +1 -0
  203. package/dist/utils/batch-writer.d.ts +101 -0
  204. package/dist/utils/batch-writer.d.ts.map +1 -0
  205. package/dist/utils/batch-writer.js +232 -0
  206. package/dist/utils/batch-writer.js.map +1 -0
  207. package/dist/utils/cache.d.ts +60 -0
  208. package/dist/utils/cache.d.ts.map +1 -0
  209. package/dist/utils/cache.js +119 -0
  210. package/dist/utils/cache.js.map +1 -0
  211. package/dist/utils/fileTree.d.ts +3 -0
  212. package/dist/utils/fileTree.d.ts.map +1 -0
  213. package/dist/utils/fileTree.js +71 -0
  214. package/dist/utils/fileTree.js.map +1 -0
  215. package/dist/utils/fs.d.ts +22 -0
  216. package/dist/utils/fs.d.ts.map +1 -0
  217. package/dist/utils/fs.js +75 -0
  218. package/dist/utils/fs.js.map +1 -0
  219. package/dist/utils/helpers.d.ts +91 -0
  220. package/dist/utils/helpers.d.ts.map +1 -0
  221. package/dist/utils/helpers.js +192 -0
  222. package/dist/utils/helpers.js.map +1 -0
  223. package/dist/utils/index.d.ts +8 -0
  224. package/dist/utils/index.d.ts.map +1 -0
  225. package/dist/utils/index.js +8 -0
  226. package/dist/utils/index.js.map +1 -0
  227. package/dist/utils/progress.d.ts +85 -0
  228. package/dist/utils/progress.d.ts.map +1 -0
  229. package/dist/utils/progress.js +142 -0
  230. package/dist/utils/progress.js.map +1 -0
  231. package/dist/utils/spinner.d.ts +9 -0
  232. package/dist/utils/spinner.d.ts.map +1 -0
  233. package/dist/utils/spinner.js +56 -0
  234. package/dist/utils/spinner.js.map +1 -0
  235. package/dist/validation/index.d.ts +63 -0
  236. package/dist/validation/index.d.ts.map +1 -0
  237. package/dist/validation/index.js +262 -0
  238. package/dist/validation/index.js.map +1 -0
  239. package/package.json +71 -0
@@ -0,0 +1,167 @@
1
+ import { exec } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { promisify } from 'node:util';
4
+ import { addDependency, ensureDir, getPackageJson, savePackageJson, writeFile } from '../../utils/index.js';
5
+ const execAsync = promisify(exec);
6
+ export const mandatoryConfigurator = async (ctx) => {
7
+ const pkg = await getPackageJson(ctx);
8
+ const { projectName, variant } = ctx.selections;
9
+ const isTypeScript = variant.startsWith('ts');
10
+ // PWA - using @vite-pwa/vite for Vite 6 support
11
+ addDependency(pkg, '@vite-pwa/assets-generator', '^0.2.0', true);
12
+ addDependency(pkg, 'workbox-window', '^7.1.0');
13
+ await savePackageJson(ctx, pkg);
14
+ // Create manifest.json
15
+ const manifest = {
16
+ name: projectName,
17
+ short_name: projectName,
18
+ theme_color: '#ffffff',
19
+ background_color: '#ffffff',
20
+ display: 'standalone',
21
+ start_url: '/',
22
+ icons: [
23
+ {
24
+ src: '/icon-192.png',
25
+ sizes: '192x192',
26
+ type: 'image/png',
27
+ },
28
+ {
29
+ src: '/icon-512.png',
30
+ sizes: '512x512',
31
+ type: 'image/png',
32
+ },
33
+ ],
34
+ };
35
+ await ensureDir(path.join(ctx.projectPath, 'public'));
36
+ await writeFile(path.join(ctx.projectPath, 'public', 'manifest.json'), JSON.stringify(manifest, null, 2));
37
+ // MIT License
38
+ const year = new Date().getFullYear();
39
+ const license = `MIT License
40
+
41
+ Copyright (c) ${year} ${projectName}
42
+
43
+ Permission is hereby granted, free of charge, to any person obtaining a copy
44
+ of this software and associated documentation files (the "Software"), to deal
45
+ in the Software without restriction, including without limitation the rights
46
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
47
+ copies of the Software, and to permit persons to whom the Software is
48
+ furnished to do so, subject to the following conditions:
49
+
50
+ The above copyright notice and this permission notice shall be included in all
51
+ copies or substantial portions of the Software.
52
+
53
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
54
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
55
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
56
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
57
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
58
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
59
+ SOFTWARE.
60
+ `;
61
+ await writeFile(path.join(ctx.projectPath, 'LICENSE'), license);
62
+ // CI/CD
63
+ await ensureDir(path.join(ctx.projectPath, '.github', 'workflows'));
64
+ const ciWorkflow = `name: CI
65
+
66
+ on:
67
+ push:
68
+ branches: [main]
69
+ pull_request:
70
+ branches: [main]
71
+
72
+ jobs:
73
+ build:
74
+ runs-on: ubuntu-latest
75
+
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+
79
+ - name: Setup Node.js
80
+ uses: actions/setup-node@v4
81
+ with:
82
+ node-version: '24'
83
+ cache: 'npm'
84
+
85
+ - name: Install dependencies
86
+ run: npm ci
87
+
88
+ - name: Build
89
+ run: npm run build
90
+
91
+ - name: Lint
92
+ run: npm run lint || true
93
+ `;
94
+ await writeFile(path.join(ctx.projectPath, '.github', 'workflows', 'ci.yml'), ciWorkflow);
95
+ // .gitignore
96
+ const gitignore = `# Dependencies
97
+ node_modules
98
+
99
+ # Build output
100
+ dist
101
+ dist-ssr
102
+
103
+ # Editor directories and files
104
+ .vscode/*
105
+ !.vscode/extensions.json
106
+ .idea
107
+ *.suo
108
+ *.ntvs*
109
+ *.njsproj
110
+ *.sln
111
+ *.sw?
112
+
113
+ # Environment files
114
+ .env
115
+ .env.local
116
+ .env.*.local
117
+
118
+ # Logs
119
+ npm-debug.log*
120
+ yarn-debug.log*
121
+ yarn-error.log*
122
+
123
+ # OS generated files
124
+ .DS_Store
125
+ Thumbs.db
126
+
127
+ # TypeScript cache
128
+ *.tsbuildinfo
129
+
130
+ # Testing
131
+ coverage
132
+ `;
133
+ await writeFile(path.join(ctx.projectPath, '.gitignore'), gitignore);
134
+ // README.md
135
+ const readme = `# ${projectName}
136
+
137
+ Built with [NEXO](https://github.com/nexo-cli) — Next-generation scaffolding CLI.
138
+
139
+ ## Getting Started
140
+
141
+ \`\`\`bash
142
+ npm install
143
+ npm run dev
144
+ \`\`\`
145
+
146
+ ## Scripts
147
+
148
+ - \`npm run dev\` - Start development server
149
+ - \`npm run build\` - Build for production
150
+ - \`npm run preview\` - Preview production build
151
+
152
+ ## License
153
+
154
+ MIT
155
+ `;
156
+ await writeFile(path.join(ctx.projectPath, 'README.md'), readme);
157
+ // Git init
158
+ try {
159
+ await execAsync('git init', { cwd: ctx.projectPath });
160
+ await execAsync('git add -A', { cwd: ctx.projectPath });
161
+ await execAsync('git commit -m "Initial commit from NEXO"', { cwd: ctx.projectPath });
162
+ }
163
+ catch (e) {
164
+ // Git might not be available, ignore errors
165
+ }
166
+ };
167
+ //# sourceMappingURL=mandatory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mandatory.js","sourceRoot":"","sources":["../../../src/configurators/project/mandatory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ConfiguratorContext } from '../../types/index.js';
2
+ export declare const structureConfigurator: (ctx: ConfiguratorContext) => Promise<void>;
3
+ //# sourceMappingURL=structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../src/configurators/project/structure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,eAAO,MAAM,qBAAqB,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAkFlF,CAAC"}
@@ -0,0 +1,34 @@
1
+ import path from 'node:path';
2
+ import { ensureDir } from '../../utils/index.js';
3
+ export const structureConfigurator = async (ctx) => {
4
+ const dirs = [];
5
+ switch (ctx.selections.structure) {
6
+ case 'feature-based':
7
+ dirs.push('src/app', 'src/features', 'src/shared/components', 'src/shared/hooks', 'src/shared/utils', 'src/shared/types');
8
+ break;
9
+ case 'fsd':
10
+ // Feature-Sliced Design
11
+ dirs.push('src/app', 'src/pages', 'src/widgets', 'src/features', 'src/entities', 'src/shared/api', 'src/shared/config', 'src/shared/lib', 'src/shared/ui');
12
+ break;
13
+ case 'atomic':
14
+ dirs.push('src/components/atoms', 'src/components/molecules', 'src/components/organisms', 'src/components/templates', 'src/hooks', 'src/utils');
15
+ break;
16
+ case 'clean':
17
+ // Clean Architecture
18
+ dirs.push('src/domain/entities', 'src/domain/usecases', 'src/application/services', 'src/infrastructure/api', 'src/infrastructure/storage', 'src/presentation/components', 'src/presentation/pages', 'src/presentation/hooks');
19
+ break;
20
+ case 'mvc':
21
+ // MVC Pattern
22
+ dirs.push('src/models', 'src/views/components', 'src/views/pages', 'src/controllers', 'src/services', 'src/utils');
23
+ break;
24
+ case 'simple':
25
+ default:
26
+ dirs.push('src/components', 'src/hooks', 'src/utils', 'src/assets');
27
+ break;
28
+ }
29
+ for (const dir of dirs) {
30
+ const fullPath = path.join(ctx.projectPath, dir);
31
+ await ensureDir(fullPath);
32
+ }
33
+ };
34
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../../src/configurators/project/structure.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,GAAwB,EAAiB,EAAE;IACrF,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,QAAQ,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACjC,KAAK,eAAe;YAClB,IAAI,CAAC,IAAI,CACP,SAAS,EACT,cAAc,EACd,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,CACnB,CAAC;YACF,MAAM;QAER,KAAK,KAAK;YACR,wBAAwB;YACxB,IAAI,CAAC,IAAI,CACP,SAAS,EACT,WAAW,EACX,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,CAChB,CAAC;YACF,MAAM;QAER,KAAK,QAAQ;YACX,IAAI,CAAC,IAAI,CACP,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,0BAA0B,EAC1B,WAAW,EACX,WAAW,CACZ,CAAC;YACF,MAAM;QAER,KAAK,OAAO;YACV,qBAAqB;YACrB,IAAI,CAAC,IAAI,CACP,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,4BAA4B,EAC5B,6BAA6B,EAC7B,wBAAwB,EACxB,wBAAwB,CACzB,CAAC;YACF,MAAM;QAER,KAAK,KAAK;YACR,cAAc;YACd,IAAI,CAAC,IAAI,CACP,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,WAAW,CACZ,CAAC;YACF,MAAM;QAER,KAAK,QAAQ,CAAC;QACd;YACE,IAAI,CAAC,IAAI,CACP,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,YAAY,CACb,CAAC;YACF,MAAM;IACV,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ConfiguratorContext } from '../../types/index.js';
2
+ export declare const dataFetchingConfigurator: (ctx: ConfiguratorContext) => Promise<void>;
3
+ //# sourceMappingURL=dataFetching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataFetching.d.ts","sourceRoot":"","sources":["../../../src/configurators/state/dataFetching.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,eAAO,MAAM,wBAAwB,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAwBrF,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { addDependency, getPackageJson, savePackageJson } from '../../utils/index.js';
2
+ export const dataFetchingConfigurator = async (ctx) => {
3
+ const { dataFetching, framework } = ctx.selections;
4
+ if (!dataFetching || dataFetching === 'none')
5
+ return;
6
+ const pkg = await getPackageJson(ctx);
7
+ switch (dataFetching) {
8
+ case 'tanstack-query':
9
+ if (framework === 'react') {
10
+ addDependency(pkg, '@tanstack/react-query', '^5.60.0');
11
+ addDependency(pkg, '@tanstack/react-query-devtools', '^5.60.0');
12
+ }
13
+ break;
14
+ case 'axios':
15
+ addDependency(pkg, 'axios', '^1.7.0');
16
+ break;
17
+ case 'fetch':
18
+ // Native fetch, no dependencies needed
19
+ break;
20
+ }
21
+ await savePackageJson(ctx, pkg);
22
+ };
23
+ //# sourceMappingURL=dataFetching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataFetching.js","sourceRoot":"","sources":["../../../src/configurators/state/dataFetching.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAAE,GAAwB,EAAiB,EAAE;IACxF,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;IACnD,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,MAAM;QAAE,OAAO;IAErD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,gBAAgB;YACnB,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC1B,aAAa,CAAC,GAAG,EAAE,uBAAuB,EAAE,SAAS,CAAC,CAAC;gBACvD,aAAa,CAAC,GAAG,EAAE,gCAAgC,EAAE,SAAS,CAAC,CAAC;YAClE,CAAC;YACD,MAAM;QAER,KAAK,OAAO;YACV,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtC,MAAM;QAER,KAAK,OAAO;YACV,uCAAuC;YACvC,MAAM;IACV,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ConfiguratorContext } from '../../types/index.js';
2
+ export declare const formsConfigurator: (ctx: ConfiguratorContext) => Promise<void>;
3
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/configurators/state/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAyB3D,eAAO,MAAM,iBAAiB,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAa9E,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { addDependency, getPackageJson, savePackageJson } from '../../utils/index.js';
2
+ const FORMS_CONFIGS = {
3
+ 'rhf-zod': {
4
+ 'react-hook-form': '^7.54.0',
5
+ 'zod': '^3.24.0',
6
+ '@hookform/resolvers': '^3.9.0',
7
+ },
8
+ 'rhf-yup': {
9
+ 'react-hook-form': '^7.54.0',
10
+ 'yup': '^1.6.0',
11
+ '@hookform/resolvers': '^3.9.0',
12
+ },
13
+ 'formik-zod': {
14
+ 'formik': '^2.4.6',
15
+ 'zod': '^3.24.0',
16
+ 'zod-formik-adapter': '^1.3.0',
17
+ },
18
+ 'formik-yup': {
19
+ 'formik': '^2.4.6',
20
+ 'yup': '^1.6.0',
21
+ },
22
+ };
23
+ export const formsConfigurator = async (ctx) => {
24
+ if (ctx.selections.forms === 'none')
25
+ return;
26
+ const config = FORMS_CONFIGS[ctx.selections.forms];
27
+ if (!config)
28
+ return;
29
+ const pkg = await getPackageJson(ctx);
30
+ for (const [name, version] of Object.entries(config)) {
31
+ addDependency(pkg, name, version);
32
+ }
33
+ await savePackageJson(ctx, pkg);
34
+ };
35
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../../src/configurators/state/forms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,MAAM,aAAa,GAA2C;IAC5D,SAAS,EAAE;QACT,iBAAiB,EAAE,SAAS;QAC5B,KAAK,EAAE,SAAS;QAChB,qBAAqB,EAAE,QAAQ;KAChC;IACD,SAAS,EAAE;QACT,iBAAiB,EAAE,SAAS;QAC5B,KAAK,EAAE,QAAQ;QACf,qBAAqB,EAAE,QAAQ;KAChC;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;QAChB,oBAAoB,EAAE,QAAQ;KAC/B;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,QAAQ;KAChB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAwB,EAAiB,EAAE;IACjF,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO;IAE5C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { dataFetchingConfigurator } from './dataFetching.js';
2
+ export { formsConfigurator } from './forms.js';
3
+ export { routingConfigurator } from './routing.js';
4
+ export { stateConfigurator } from './state.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/configurators/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { dataFetchingConfigurator } from './dataFetching.js';
2
+ export { formsConfigurator } from './forms.js';
3
+ export { routingConfigurator } from './routing.js';
4
+ export { stateConfigurator } from './state.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/configurators/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ConfiguratorContext } from '../../types/index.js';
2
+ export declare const routingConfigurator: (ctx: ConfiguratorContext) => Promise<void>;
3
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/configurators/state/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAa3D,eAAO,MAAM,mBAAmB,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAahF,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { addDependency, getPackageJson, savePackageJson } from '../../utils/index.js';
2
+ const ROUTING_CONFIGS = {
3
+ 'react-router': {
4
+ 'react-router-dom': '^7.1.0',
5
+ },
6
+ 'tanstack-router': {
7
+ '@tanstack/react-router': '^1.95.0',
8
+ '@tanstack/react-router-devtools': '^1.95.0',
9
+ },
10
+ };
11
+ export const routingConfigurator = async (ctx) => {
12
+ if (ctx.selections.framework !== 'react')
13
+ return;
14
+ const config = ROUTING_CONFIGS[ctx.selections.routing];
15
+ if (!config)
16
+ return;
17
+ const pkg = await getPackageJson(ctx);
18
+ for (const [name, version] of Object.entries(config)) {
19
+ addDependency(pkg, name, version);
20
+ }
21
+ await savePackageJson(ctx, pkg);
22
+ };
23
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/configurators/state/routing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,MAAM,eAAe,GAA2C;IAC9D,cAAc,EAAE;QACd,kBAAkB,EAAE,QAAQ;KAC7B;IACD,iBAAiB,EAAE;QACjB,wBAAwB,EAAE,SAAS;QACnC,iCAAiC,EAAE,SAAS;KAC7C;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,GAAwB,EAAiB,EAAE;IACnF,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,KAAK,OAAO;QAAE,OAAO;IAEjD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ConfiguratorContext } from '../../types/index.js';
2
+ export declare const stateConfigurator: (ctx: ConfiguratorContext) => Promise<void>;
3
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/configurators/state/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAgB3D,eAAO,MAAM,iBAAiB,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAmF9E,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { addDependency, getPackageJson, savePackageJson } from '../../utils/index.js';
2
+ const STATE_CONFIGS = {
3
+ zustand: {
4
+ 'zustand': '^5.0.0',
5
+ },
6
+ redux: {
7
+ '@reduxjs/toolkit': '^2.5.0',
8
+ 'react-redux': '^9.2.0',
9
+ },
10
+ jotai: {
11
+ 'jotai': '^2.11.0',
12
+ },
13
+ };
14
+ export const stateConfigurator = async (ctx) => {
15
+ if (ctx.selections.state === 'none')
16
+ return;
17
+ const config = STATE_CONFIGS[ctx.selections.state];
18
+ if (!config)
19
+ return;
20
+ const pkg = await getPackageJson(ctx);
21
+ for (const [name, version] of Object.entries(config)) {
22
+ addDependency(pkg, name, version);
23
+ }
24
+ await savePackageJson(ctx, pkg);
25
+ if (ctx.selections.state === 'redux') {
26
+ const isTypeScript = ctx.selections.variant.startsWith('ts');
27
+ const ext = isTypeScript ? 'ts' : 'js';
28
+ const { writeFile, ensureDir } = await import('../../utils/index.js');
29
+ const path = await import('node:path');
30
+ await ensureDir(path.join(ctx.projectPath, 'src/store'));
31
+ // Create store
32
+ const storeContent = `import { configureStore } from '@reduxjs/toolkit'
33
+ import counterReducer from './counterSlice'
34
+
35
+ export const store = configureStore({
36
+ reducer: {
37
+ counter: counterReducer,
38
+ },
39
+ })
40
+
41
+ ${isTypeScript ? `export type RootState = ReturnType<typeof store.getState>
42
+ export type AppDispatch = typeof store.dispatch` : ''}
43
+ `;
44
+ await writeFile(path.join(ctx.projectPath, 'src/store', `store.${ext}`), storeContent);
45
+ // Create example slice
46
+ const sliceContent = `import { createSlice } from '@reduxjs/toolkit'
47
+ ${isTypeScript ? "import type { PayloadAction } from '@reduxjs/toolkit'\n\nexport interface CounterState {\n value: number\n}" : ''}
48
+
49
+ const initialState${isTypeScript ? ': CounterState' : ''} = {
50
+ value: 0,
51
+ }
52
+
53
+ export const counterSlice = createSlice({
54
+ name: 'counter',
55
+ initialState,
56
+ reducers: {
57
+ increment: (state) => {
58
+ state.value += 1
59
+ },
60
+ decrement: (state) => {
61
+ state.value -= 1
62
+ },
63
+ incrementByAmount: (state, action${isTypeScript ? ': PayloadAction<number>' : ''}) => {
64
+ state.value += action.payload
65
+ },
66
+ },
67
+ })
68
+
69
+ export const { increment, decrement, incrementByAmount } = counterSlice.actions
70
+
71
+ export default counterSlice.reducer
72
+ `;
73
+ await writeFile(path.join(ctx.projectPath, 'src/store', `counterSlice.${ext}`), sliceContent);
74
+ // Create hooks
75
+ const hooksContent = isTypeScript
76
+ ? `import { useDispatch, useSelector } from 'react-redux'
77
+ import type { TypedUseSelectorHook } from 'react-redux'
78
+ import type { RootState, AppDispatch } from './store'
79
+
80
+ export const useAppDispatch: () => AppDispatch = useDispatch
81
+ export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
82
+ `
83
+ : `import { useDispatch, useSelector } from 'react-redux'
84
+
85
+ export const useAppDispatch = useDispatch
86
+ export const useAppSelector = useSelector
87
+ `;
88
+ await writeFile(path.join(ctx.projectPath, 'src/store', `hooks.${ext}`), hooksContent);
89
+ }
90
+ };
91
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/configurators/state/state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,MAAM,aAAa,GAA2C;IAC5D,OAAO,EAAE;QACP,SAAS,EAAE,QAAQ;KACpB;IACD,KAAK,EAAE;QACL,kBAAkB,EAAE,QAAQ;QAC5B,aAAa,EAAE,QAAQ;KACxB;IACD,KAAK,EAAE;QACL,OAAO,EAAE,SAAS;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAwB,EAAiB,EAAE;IACjF,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO;IAE5C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEhC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;QAEzD,eAAe;QACf,MAAM,YAAY,GAAG;;;;;;;;;EASvB,YAAY,CAAC,CAAC,CAAC;gDAC+B,CAAC,CAAC,CAAC,EAAE;CACpD,CAAC;QACE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAEvF,uBAAuB;QACvB,MAAM,YAAY,GAAG;EACvB,YAAY,CAAC,CAAC,CAAC,8GAA8G,CAAC,CAAC,CAAC,EAAE;;oBAEhH,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;uCAcjB,YAAY,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;CASnF,CAAC;QACE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAE9F,eAAe;QACf,MAAM,YAAY,GAAG,YAAY;YAC/B,CAAC,CAAC;;;;;;CAMP;YACK,CAAC,CAAC;;;;CAIP,CAAC;QACE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;IACzF,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ConfiguratorContext } from '../../types/index.js';
2
+ export declare const iconsConfigurator: (ctx: ConfiguratorContext) => Promise<void>;
3
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/configurators/styling/icons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAiB3D,eAAO,MAAM,iBAAiB,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAa9E,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { addDependency, getPackageJson, savePackageJson } from '../../utils/index.js';
2
+ const ICONS_CONFIGS = {
3
+ lucide: {
4
+ 'lucide-react': '^0.474.0',
5
+ },
6
+ heroicons: {
7
+ '@heroicons/react': '^2.2.0',
8
+ },
9
+ fontawesome: {
10
+ '@fortawesome/fontawesome-svg-core': '^6.7.0',
11
+ '@fortawesome/free-solid-svg-icons': '^6.7.0',
12
+ '@fortawesome/react-fontawesome': '^0.2.2',
13
+ },
14
+ };
15
+ export const iconsConfigurator = async (ctx) => {
16
+ if (ctx.selections.icons === 'none')
17
+ return;
18
+ const config = ICONS_CONFIGS[ctx.selections.icons];
19
+ if (!config)
20
+ return;
21
+ const pkg = await getPackageJson(ctx);
22
+ for (const [name, version] of Object.entries(config)) {
23
+ addDependency(pkg, name, version);
24
+ }
25
+ await savePackageJson(ctx, pkg);
26
+ };
27
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../src/configurators/styling/icons.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,MAAM,aAAa,GAA2C;IAC5D,MAAM,EAAE;QACN,cAAc,EAAE,UAAU;KAC3B;IACD,SAAS,EAAE;QACT,kBAAkB,EAAE,QAAQ;KAC7B;IACD,WAAW,EAAE;QACX,mCAAmC,EAAE,QAAQ;QAC7C,mCAAmC,EAAE,QAAQ;QAC7C,gCAAgC,EAAE,QAAQ;KAC3C;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAwB,EAAiB,EAAE;IACjF,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO;IAE5C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { iconsConfigurator } from './icons.js';
2
+ export { stylingConfigurator } from './styling.js';
3
+ export { uiConfigurator } from './ui.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/configurators/styling/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { iconsConfigurator } from './icons.js';
2
+ export { stylingConfigurator } from './styling.js';
3
+ export { uiConfigurator } from './ui.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/configurators/styling/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ConfiguratorContext } from '../../types/index.js';
2
+ export declare const stylingConfigurator: (ctx: ConfiguratorContext) => Promise<void>;
3
+ //# sourceMappingURL=styling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styling.d.ts","sourceRoot":"","sources":["../../../src/configurators/styling/styling.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,eAAO,MAAM,mBAAmB,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAqFhF,CAAC"}
@@ -0,0 +1,62 @@
1
+ import path from 'node:path';
2
+ import { addDependency, ensureDir, getPackageJson, savePackageJson, writeFile } from '../../utils/index.js';
3
+ export const stylingConfigurator = async (ctx) => {
4
+ const pkg = await getPackageJson(ctx);
5
+ const { variant } = ctx.selections;
6
+ const isTypeScript = variant.startsWith('ts');
7
+ const configExt = isTypeScript ? 'ts' : 'js';
8
+ switch (ctx.selections.styling) {
9
+ case 'tailwind':
10
+ // Tailwind CSS v4 setup
11
+ addDependency(pkg, 'tailwindcss', '^4.0.0', true);
12
+ addDependency(pkg, '@tailwindcss/vite', '^4.0.0', true);
13
+ await savePackageJson(ctx, pkg);
14
+ // Update vite.config with @tailwindcss/vite plugin
15
+ // We read the existing file content or assume structure if we just created it
16
+ // A safer approach is to read and inject, but we know exact structure from framework.ts
17
+ const vitePluginImport = variant.includes('swc')
18
+ ? "import react from '@vitejs/plugin-react-swc'"
19
+ : "import react from '@vitejs/plugin-react'";
20
+ const viteConfig = `${vitePluginImport}
21
+ import { defineConfig } from 'vite'
22
+ import tailwindcss from '@tailwindcss/vite'
23
+
24
+ export default defineConfig({
25
+ plugins: [
26
+ react(),
27
+ tailwindcss(),
28
+ ],
29
+ })
30
+ `;
31
+ await writeFile(path.join(ctx.projectPath, `vite.config.${configExt}`), viteConfig);
32
+ const cssContent = `@import "tailwindcss";`;
33
+ await ensureDir(path.join(ctx.projectPath, 'src'));
34
+ await writeFile(path.join(ctx.projectPath, 'src', 'index.css'), cssContent);
35
+ break;
36
+ case 'css-modules':
37
+ await savePackageJson(ctx, pkg);
38
+ await ensureDir(path.join(ctx.projectPath, 'src'));
39
+ await writeFile(path.join(ctx.projectPath, 'src', 'index.css'), `/* CSS Modules - import styles from './Component.module.css' */\n:root {\n font-family: system-ui, sans-serif;\n}\n`);
40
+ break;
41
+ case 'plain-css':
42
+ await savePackageJson(ctx, pkg);
43
+ await ensureDir(path.join(ctx.projectPath, 'src'));
44
+ await writeFile(path.join(ctx.projectPath, 'src', 'index.css'), `/* Plain CSS */\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n:root {\n font-family: system-ui, -apple-system, sans-serif;\n line-height: 1.5;\n color: #213547;\n background-color: #ffffff;\n}\n`);
45
+ break;
46
+ case 'sass':
47
+ addDependency(pkg, 'sass', '^1.77.0', true);
48
+ await savePackageJson(ctx, pkg);
49
+ await ensureDir(path.join(ctx.projectPath, 'src'));
50
+ await ensureDir(path.join(ctx.projectPath, 'src', 'styles'));
51
+ // Create main SCSS file
52
+ await writeFile(path.join(ctx.projectPath, 'src', 'index.scss'), `// Import variables and mixins\n@import './styles/variables';\n@import './styles/mixins';\n\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n:root {\n font-family: $font-family;\n line-height: 1.5;\n}\n`);
53
+ // Create variables file
54
+ await writeFile(path.join(ctx.projectPath, 'src', 'styles', '_variables.scss'), `// Colors\n$primary: #646cff;\n$secondary: #535bf2;\n$background: #ffffff;\n$text: #213547;\n\n// Typography\n$font-family: system-ui, -apple-system, sans-serif;\n$font-size-base: 16px;\n\n// Spacing\n$spacing-unit: 8px;\n`);
55
+ // Create mixins file
56
+ await writeFile(path.join(ctx.projectPath, 'src', 'styles', '_mixins.scss'), `// Responsive breakpoints\n@mixin mobile {\n @media (max-width: 768px) {\n @content;\n }\n}\n\n@mixin tablet {\n @media (max-width: 1024px) {\n @content;\n }\n}\n\n// Flexbox helpers\n@mixin flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n`);
57
+ break;
58
+ default:
59
+ await savePackageJson(ctx, pkg);
60
+ }
61
+ };
62
+ //# sourceMappingURL=styling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styling.js","sourceRoot":"","sources":["../../../src/configurators/styling/styling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ConfiguratorContext } from '../../types/index.js';
2
+ export declare const uiConfigurator: (ctx: ConfiguratorContext) => Promise<void>;
3
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/configurators/styling/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAmC3D,eAAO,MAAM,cAAc,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAmK3E,CAAC"}