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,63 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ errors: string[];
4
+ warnings: string[];
5
+ suggestions: string[];
6
+ }
7
+ export interface CompatibilityRule {
8
+ name: string;
9
+ check: (selections: Record<string, string>) => boolean;
10
+ message: string;
11
+ suggestion?: string;
12
+ severity: 'error' | 'warning';
13
+ }
14
+ export declare const VALID_OPTIONS: {
15
+ readonly framework: readonly ["react", "vue", "svelte"];
16
+ readonly variant: readonly ["ts", "ts-compiler", "ts-swc", "js", "js-compiler", "js-swc"];
17
+ readonly language: readonly ["typescript", "javascript"];
18
+ readonly styling: readonly ["tailwind", "css-modules", "plain-css", "sass"];
19
+ readonly ui: readonly ["shadcn", "radix", "mantine", "heroui", "antd", "chakra", "none"];
20
+ readonly forms: readonly ["rhf-zod", "rhf-yup", "formik-zod", "formik-yup", "none"];
21
+ readonly state: readonly ["zustand", "redux", "jotai", "none"];
22
+ readonly routing: readonly ["react-router", "tanstack-router", "none"];
23
+ readonly dataFetching: readonly ["tanstack-query", "axios", "fetch", "none"];
24
+ readonly icons: readonly ["lucide", "heroicons", "fontawesome", "none"];
25
+ readonly structure: readonly ["feature-based", "fsd", "atomic", "clean", "mvc", "simple"];
26
+ readonly i18n: readonly ["i18next", "lingui", "none"];
27
+ readonly auth: readonly ["jwt", "authjs", "none"];
28
+ readonly testing: readonly ["vitest", "jest"];
29
+ readonly linting: readonly ["eslint-prettier", "biome"];
30
+ readonly api: readonly ["openapi", "graphql", "trpc"];
31
+ readonly animation: readonly ["framer-motion", "react-spring"];
32
+ readonly monorepo: readonly ["turborepo", "nx"];
33
+ };
34
+ export declare const compatibilityRules: CompatibilityRule[];
35
+ /**
36
+ * Validate project name
37
+ */
38
+ export declare const validateProjectName: (name: string) => ValidationResult;
39
+ /**
40
+ * Validate a single selection against valid options
41
+ */
42
+ export declare const validateOption: (key: string, value: string, validOptions?: readonly string[]) => ValidationResult;
43
+ /**
44
+ * Validate all selections
45
+ */
46
+ export declare const validateSelections: (selections: Record<string, unknown>) => ValidationResult;
47
+ /**
48
+ * Validate and throw if invalid
49
+ */
50
+ export declare const validateOrThrow: (selections: Record<string, unknown>) => void;
51
+ /**
52
+ * Check compatibility and throw if incompatible
53
+ */
54
+ export declare const checkCompatibilityOrThrow: (selections: Record<string, string>) => void;
55
+ /**
56
+ * Get compatibility warnings (non-blocking)
57
+ */
58
+ export declare const getCompatibilityWarnings: (selections: Record<string, string>) => string[];
59
+ /**
60
+ * Sanitize project name
61
+ */
62
+ export declare const sanitizeProjectName: (name: string) => string;
63
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAMD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;CAmBhB,CAAC;AAMX,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EAsFjD,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,gBA6ClD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,MAAM,EACX,OAAO,MAAM,EACb,eAAe,SAAS,MAAM,EAAE,KAC/B,gBAuBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAClC,gBAiDF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IASrE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,GAAI,YAAY,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,IAU9E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KACjC,MAAM,EAIR,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,MAOlD,CAAC"}
@@ -0,0 +1,262 @@
1
+ import { CompatibilityError, ValidationError } from '../errors/index.js';
2
+ // ============================================
3
+ // Valid Options
4
+ // ============================================
5
+ export const VALID_OPTIONS = {
6
+ framework: ['react', 'vue', 'svelte'],
7
+ variant: ['ts', 'ts-compiler', 'ts-swc', 'js', 'js-compiler', 'js-swc'],
8
+ language: ['typescript', 'javascript'],
9
+ styling: ['tailwind', 'css-modules', 'plain-css', 'sass'],
10
+ ui: ['shadcn', 'radix', 'mantine', 'heroui', 'antd', 'chakra', 'none'],
11
+ forms: ['rhf-zod', 'rhf-yup', 'formik-zod', 'formik-yup', 'none'],
12
+ state: ['zustand', 'redux', 'jotai', 'none'],
13
+ routing: ['react-router', 'tanstack-router', 'none'],
14
+ dataFetching: ['tanstack-query', 'axios', 'fetch', 'none'],
15
+ icons: ['lucide', 'heroicons', 'fontawesome', 'none'],
16
+ structure: ['feature-based', 'fsd', 'atomic', 'clean', 'mvc', 'simple'],
17
+ i18n: ['i18next', 'lingui', 'none'],
18
+ auth: ['jwt', 'authjs', 'none'],
19
+ testing: ['vitest', 'jest'],
20
+ linting: ['eslint-prettier', 'biome'],
21
+ api: ['openapi', 'graphql', 'trpc'],
22
+ animation: ['framer-motion', 'react-spring'],
23
+ monorepo: ['turborepo', 'nx'],
24
+ };
25
+ // ============================================
26
+ // Compatibility Rules
27
+ // ============================================
28
+ export const compatibilityRules = [
29
+ // UI Library requires specific styling
30
+ {
31
+ name: 'shadcn-requires-tailwind',
32
+ check: (s) => s.ui === 'shadcn' && s.styling !== 'tailwind',
33
+ message: 'shadcn/ui requires Tailwind CSS as the styling solution',
34
+ suggestion: 'Change styling to "tailwind" or choose a different UI library',
35
+ severity: 'error',
36
+ },
37
+ {
38
+ name: 'heroui-requires-tailwind',
39
+ check: (s) => s.ui === 'heroui' && s.styling !== 'tailwind',
40
+ message: 'HeroUI requires Tailwind CSS as the styling solution',
41
+ suggestion: 'Change styling to "tailwind" or choose a different UI library',
42
+ severity: 'error',
43
+ },
44
+ // React Compiler requirements
45
+ {
46
+ name: 'react-compiler-react-only',
47
+ check: (s) => s.variant?.includes('compiler') && s.framework !== 'react',
48
+ message: 'React Compiler is only available for React framework',
49
+ suggestion: 'Change framework to "react" or choose a different variant',
50
+ severity: 'error',
51
+ },
52
+ // SWC requirements
53
+ {
54
+ name: 'swc-react-only',
55
+ check: (s) => s.variant?.includes('swc') && s.framework !== 'react',
56
+ message: 'SWC plugin is currently only configured for React',
57
+ suggestion: 'Use default variant for non-React frameworks',
58
+ severity: 'warning',
59
+ },
60
+ // Routing recommendations
61
+ {
62
+ name: 'tanstack-router-typescript',
63
+ check: (s) => s.routing === 'tanstack-router' && !s.variant?.startsWith('ts'),
64
+ message: 'TanStack Router works best with TypeScript for full type safety',
65
+ suggestion: 'Consider using TypeScript variant for better DX',
66
+ severity: 'warning',
67
+ },
68
+ // Forms + Validation combinations
69
+ {
70
+ name: 'formik-yup-legacy-warning',
71
+ check: (s) => s.forms === 'formik-yup',
72
+ message: 'Formik + Yup is considered legacy - React Hook Form offers better performance',
73
+ suggestion: 'Consider using "rhf-zod" for better performance and type safety',
74
+ severity: 'warning',
75
+ },
76
+ // UI Library bundle warnings
77
+ {
78
+ name: 'antd-bundle-warning',
79
+ check: (s) => s.ui === 'antd',
80
+ message: 'Ant Design has a large bundle size (~120KB gzipped)',
81
+ suggestion: 'Consider shadcn/ui or Mantine for smaller bundle size',
82
+ severity: 'warning',
83
+ },
84
+ {
85
+ name: 'chakra-bundle-warning',
86
+ check: (s) => s.ui === 'chakra',
87
+ message: 'Chakra UI has a moderate bundle size (~80KB gzipped)',
88
+ suggestion: 'Consider shadcn/ui for smaller bundle with similar features',
89
+ severity: 'warning',
90
+ },
91
+ // Mantine doesn't need Tailwind
92
+ {
93
+ name: 'mantine-tailwind-redundant',
94
+ check: (s) => s.ui === 'mantine' && s.styling === 'tailwind',
95
+ message: 'Mantine has its own styling system - Tailwind may be redundant',
96
+ suggestion: 'Mantine works best with its built-in styles',
97
+ severity: 'warning',
98
+ },
99
+ // Structure recommendations
100
+ {
101
+ name: 'fsd-typescript-recommended',
102
+ check: (s) => s.structure === 'fsd' && !s.variant?.startsWith('ts'),
103
+ message: 'Feature-Sliced Design benefits greatly from TypeScript',
104
+ suggestion: 'Consider using TypeScript for better FSD experience',
105
+ severity: 'warning',
106
+ },
107
+ ];
108
+ // ============================================
109
+ // Validation Functions
110
+ // ============================================
111
+ /**
112
+ * Validate project name
113
+ */
114
+ export const validateProjectName = (name) => {
115
+ const errors = [];
116
+ const warnings = [];
117
+ const suggestions = [];
118
+ if (!name || name.trim().length === 0) {
119
+ errors.push('Project name is required');
120
+ }
121
+ else {
122
+ // Check length
123
+ if (name.length > 214) {
124
+ errors.push('Project name must be less than 214 characters');
125
+ }
126
+ // Check valid characters (npm naming rules)
127
+ if (!/^[a-z0-9]/.test(name)) {
128
+ errors.push('Project name must start with a lowercase letter or number');
129
+ }
130
+ if (!/^[a-z0-9._-]+$/.test(name)) {
131
+ errors.push('Project name can only contain lowercase letters, numbers, hyphens, underscores, and dots');
132
+ suggestions.push('Use kebab-case: my-project-name');
133
+ }
134
+ // Check for reserved names
135
+ const reserved = ['node_modules', 'favicon.ico', 'package', 'test'];
136
+ if (reserved.includes(name.toLowerCase())) {
137
+ errors.push(`"${name}" is a reserved name`);
138
+ }
139
+ // Warnings for non-ideal names
140
+ if (name.startsWith('.')) {
141
+ warnings.push('Project names starting with "." are hidden on Unix systems');
142
+ }
143
+ if (name.includes('..')) {
144
+ errors.push('Project name cannot contain ".."');
145
+ }
146
+ }
147
+ return {
148
+ valid: errors.length === 0,
149
+ errors,
150
+ warnings,
151
+ suggestions,
152
+ };
153
+ };
154
+ /**
155
+ * Validate a single selection against valid options
156
+ */
157
+ export const validateOption = (key, value, validOptions) => {
158
+ const errors = [];
159
+ const warnings = [];
160
+ const suggestions = [];
161
+ if (!value || value === '') {
162
+ // Some options allow empty/none
163
+ return { valid: true, errors, warnings, suggestions };
164
+ }
165
+ const options = validOptions || VALID_OPTIONS[key];
166
+ if (options && !options.includes(value)) {
167
+ errors.push(`Invalid ${key}: "${value}". Valid options: ${options.join(', ')}`);
168
+ suggestions.push(`Choose one of: ${options.join(', ')}`);
169
+ }
170
+ return {
171
+ valid: errors.length === 0,
172
+ errors,
173
+ warnings,
174
+ suggestions,
175
+ };
176
+ };
177
+ /**
178
+ * Validate all selections
179
+ */
180
+ export const validateSelections = (selections) => {
181
+ const allErrors = [];
182
+ const allWarnings = [];
183
+ const allSuggestions = [];
184
+ // Validate project name
185
+ if (selections.projectName) {
186
+ const nameResult = validateProjectName(selections.projectName);
187
+ allErrors.push(...nameResult.errors);
188
+ allWarnings.push(...nameResult.warnings);
189
+ allSuggestions.push(...nameResult.suggestions);
190
+ }
191
+ // Validate each option
192
+ const optionKeys = Object.keys(VALID_OPTIONS);
193
+ for (const key of optionKeys) {
194
+ const value = selections[key];
195
+ if (value !== undefined && value !== null) {
196
+ const result = validateOption(key, value);
197
+ allErrors.push(...result.errors);
198
+ allWarnings.push(...result.warnings);
199
+ allSuggestions.push(...result.suggestions);
200
+ }
201
+ }
202
+ // Check compatibility rules
203
+ const stringSelections = Object.fromEntries(Object.entries(selections).map(([k, v]) => [k, String(v)]));
204
+ for (const rule of compatibilityRules) {
205
+ if (rule.check(stringSelections)) {
206
+ if (rule.severity === 'error') {
207
+ allErrors.push(rule.message);
208
+ }
209
+ else {
210
+ allWarnings.push(rule.message);
211
+ }
212
+ if (rule.suggestion) {
213
+ allSuggestions.push(rule.suggestion);
214
+ }
215
+ }
216
+ }
217
+ return {
218
+ valid: allErrors.length === 0,
219
+ errors: [...new Set(allErrors)], // Remove duplicates
220
+ warnings: [...new Set(allWarnings)],
221
+ suggestions: [...new Set(allSuggestions)],
222
+ };
223
+ };
224
+ /**
225
+ * Validate and throw if invalid
226
+ */
227
+ export const validateOrThrow = (selections) => {
228
+ const result = validateSelections(selections);
229
+ if (!result.valid) {
230
+ throw new ValidationError(result.errors.join('; '), { errors: result.errors, selections });
231
+ }
232
+ };
233
+ /**
234
+ * Check compatibility and throw if incompatible
235
+ */
236
+ export const checkCompatibilityOrThrow = (selections) => {
237
+ const incompatible = compatibilityRules
238
+ .filter(rule => rule.severity === 'error' && rule.check(selections));
239
+ if (incompatible.length > 0) {
240
+ throw new CompatibilityError(incompatible.map(r => r.message).join('; '), selections);
241
+ }
242
+ };
243
+ /**
244
+ * Get compatibility warnings (non-blocking)
245
+ */
246
+ export const getCompatibilityWarnings = (selections) => {
247
+ return compatibilityRules
248
+ .filter(rule => rule.severity === 'warning' && rule.check(selections))
249
+ .map(rule => rule.message);
250
+ };
251
+ /**
252
+ * Sanitize project name
253
+ */
254
+ export const sanitizeProjectName = (name) => {
255
+ return name
256
+ .toLowerCase()
257
+ .replace(/[^a-z0-9._-]/g, '-')
258
+ .replace(/-+/g, '-')
259
+ .replace(/^-|-$/g, '')
260
+ .slice(0, 214);
261
+ };
262
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "create-nexo",
3
+ "version": "1.0.0",
4
+ "description": "NEXO — Next-generation scaffolding CLI for React projects (Next.js coming soon)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "nexo": "./dist/bin/nexo.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "dev": "tsc --watch",
19
+ "start": "node dist/bin/nexo.js",
20
+ "test": "vitest",
21
+ "test:run": "vitest run",
22
+ "test:coverage": "vitest run --coverage",
23
+ "test:snapshot": "vitest run tests/snapshots",
24
+ "bench": "vitest bench",
25
+ "type-check": "tsc --noEmit",
26
+ "prepublishOnly": "npm run build && npm run test:run"
27
+ },
28
+ "keywords": [
29
+ "cli",
30
+ "scaffold",
31
+ "scaffolding",
32
+ "vite",
33
+ "react",
34
+ "react19",
35
+ "nextjs",
36
+ "frontend",
37
+ "generator",
38
+ "create-react-app",
39
+ "boilerplate",
40
+ "starter",
41
+ "template",
42
+ "typescript",
43
+ "tailwind",
44
+ "shadcn"
45
+ ],
46
+ "author": "Mohamed Shaban",
47
+ "license": "MIT",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/Moshaban09/create-nexo.git"
51
+ },
52
+ "homepage": "https://github.com/Moshaban09/create-nexo#readme",
53
+ "bugs": {
54
+ "url": "https://github.com/Moshaban09/create-nexo/issues"
55
+ },
56
+ "dependencies": {
57
+ "@clack/prompts": "^0.7.0",
58
+ "commander": "^12.1.0",
59
+ "picocolors": "^1.1.0"
60
+ },
61
+ "devDependencies": {
62
+ "@types/node": "^22.0.0",
63
+ "@vitest/coverage-v8": "^2.1.0",
64
+ "typescript": "^5.4.2",
65
+ "vitest": "^2.1.0"
66
+ },
67
+ "engines": {
68
+ "node": ">=24.0.0"
69
+ }
70
+ }
71
+