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.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/api/index.d.ts +196 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +390 -0
- package/dist/api/index.js.map +1 -0
- package/dist/bin/nexo.d.ts +3 -0
- package/dist/bin/nexo.d.ts.map +1 -0
- package/dist/bin/nexo.js +427 -0
- package/dist/bin/nexo.js.map +1 -0
- package/dist/configurators/core/framework.d.ts +3 -0
- package/dist/configurators/core/framework.d.ts.map +1 -0
- package/dist/configurators/core/framework.js +56 -0
- package/dist/configurators/core/framework.js.map +1 -0
- package/dist/configurators/core/index.d.ts +4 -0
- package/dist/configurators/core/index.d.ts.map +1 -0
- package/dist/configurators/core/index.js +4 -0
- package/dist/configurators/core/index.js.map +1 -0
- package/dist/configurators/core/language.d.ts +3 -0
- package/dist/configurators/core/language.d.ts.map +1 -0
- package/dist/configurators/core/language.js +59 -0
- package/dist/configurators/core/language.js.map +1 -0
- package/dist/configurators/core/variant.d.ts +3 -0
- package/dist/configurators/core/variant.d.ts.map +1 -0
- package/dist/configurators/core/variant.js +22 -0
- package/dist/configurators/core/variant.js.map +1 -0
- package/dist/configurators/index.d.ts +5 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +6 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/project/auth.d.ts +3 -0
- package/dist/configurators/project/auth.d.ts.map +1 -0
- package/dist/configurators/project/auth.js +82 -0
- package/dist/configurators/project/auth.js.map +1 -0
- package/dist/configurators/project/cicd.d.ts +30 -0
- package/dist/configurators/project/cicd.d.ts.map +1 -0
- package/dist/configurators/project/cicd.js +289 -0
- package/dist/configurators/project/cicd.js.map +1 -0
- package/dist/configurators/project/i18n.d.ts +3 -0
- package/dist/configurators/project/i18n.d.ts.map +1 -0
- package/dist/configurators/project/i18n.js +67 -0
- package/dist/configurators/project/i18n.js.map +1 -0
- package/dist/configurators/project/index.d.ts +6 -0
- package/dist/configurators/project/index.d.ts.map +1 -0
- package/dist/configurators/project/index.js +6 -0
- package/dist/configurators/project/index.js.map +1 -0
- package/dist/configurators/project/mandatory.d.ts +3 -0
- package/dist/configurators/project/mandatory.d.ts.map +1 -0
- package/dist/configurators/project/mandatory.js +167 -0
- package/dist/configurators/project/mandatory.js.map +1 -0
- package/dist/configurators/project/structure.d.ts +3 -0
- package/dist/configurators/project/structure.d.ts.map +1 -0
- package/dist/configurators/project/structure.js +34 -0
- package/dist/configurators/project/structure.js.map +1 -0
- package/dist/configurators/state/dataFetching.d.ts +3 -0
- package/dist/configurators/state/dataFetching.d.ts.map +1 -0
- package/dist/configurators/state/dataFetching.js +23 -0
- package/dist/configurators/state/dataFetching.js.map +1 -0
- package/dist/configurators/state/forms.d.ts +3 -0
- package/dist/configurators/state/forms.d.ts.map +1 -0
- package/dist/configurators/state/forms.js +35 -0
- package/dist/configurators/state/forms.js.map +1 -0
- package/dist/configurators/state/index.d.ts +5 -0
- package/dist/configurators/state/index.d.ts.map +1 -0
- package/dist/configurators/state/index.js +5 -0
- package/dist/configurators/state/index.js.map +1 -0
- package/dist/configurators/state/routing.d.ts +3 -0
- package/dist/configurators/state/routing.d.ts.map +1 -0
- package/dist/configurators/state/routing.js +23 -0
- package/dist/configurators/state/routing.js.map +1 -0
- package/dist/configurators/state/state.d.ts +3 -0
- package/dist/configurators/state/state.d.ts.map +1 -0
- package/dist/configurators/state/state.js +91 -0
- package/dist/configurators/state/state.js.map +1 -0
- package/dist/configurators/styling/icons.d.ts +3 -0
- package/dist/configurators/styling/icons.d.ts.map +1 -0
- package/dist/configurators/styling/icons.js +27 -0
- package/dist/configurators/styling/icons.js.map +1 -0
- package/dist/configurators/styling/index.d.ts +4 -0
- package/dist/configurators/styling/index.d.ts.map +1 -0
- package/dist/configurators/styling/index.js +4 -0
- package/dist/configurators/styling/index.js.map +1 -0
- package/dist/configurators/styling/styling.d.ts +3 -0
- package/dist/configurators/styling/styling.d.ts.map +1 -0
- package/dist/configurators/styling/styling.js +62 -0
- package/dist/configurators/styling/styling.js.map +1 -0
- package/dist/configurators/styling/ui.d.ts +3 -0
- package/dist/configurators/styling/ui.d.ts.map +1 -0
- package/dist/configurators/styling/ui.js +188 -0
- package/dist/configurators/styling/ui.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lazy-loader.d.ts +57 -0
- package/dist/core/lazy-loader.d.ts.map +1 -0
- package/dist/core/lazy-loader.js +231 -0
- package/dist/core/lazy-loader.js.map +1 -0
- package/dist/core/parallel.d.ts +29 -0
- package/dist/core/parallel.d.ts.map +1 -0
- package/dist/core/parallel.js +127 -0
- package/dist/core/parallel.js.map +1 -0
- package/dist/core/presets.d.ts +10 -0
- package/dist/core/presets.d.ts.map +1 -0
- package/dist/core/presets.js +73 -0
- package/dist/core/presets.js.map +1 -0
- package/dist/core/prompts/core.d.ts +18 -0
- package/dist/core/prompts/core.d.ts.map +1 -0
- package/dist/core/prompts/core.js +420 -0
- package/dist/core/prompts/core.js.map +1 -0
- package/dist/core/prompts/filter.d.ts +34 -0
- package/dist/core/prompts/filter.d.ts.map +1 -0
- package/dist/core/prompts/filter.js +48 -0
- package/dist/core/prompts/filter.js.map +1 -0
- package/dist/core/prompts/index.d.ts +10 -0
- package/dist/core/prompts/index.d.ts.map +1 -0
- package/dist/core/prompts/index.js +16 -0
- package/dist/core/prompts/index.js.map +1 -0
- package/dist/core/prompts/optional.d.ts +15 -0
- package/dist/core/prompts/optional.d.ts.map +1 -0
- package/dist/core/prompts/optional.js +228 -0
- package/dist/core/prompts/optional.js.map +1 -0
- package/dist/core/prompts/utils.d.ts +37 -0
- package/dist/core/prompts/utils.d.ts.map +1 -0
- package/dist/core/prompts/utils.js +72 -0
- package/dist/core/prompts/utils.js.map +1 -0
- package/dist/core/prompts.d.ts +6 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +6 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/setup.d.ts +28 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +96 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/wizard.d.ts +39 -0
- package/dist/core/wizard.d.ts.map +1 -0
- package/dist/core/wizard.js +259 -0
- package/dist/core/wizard.js.map +1 -0
- package/dist/errors/index.d.ts +67 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +253 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/messages.d.ts +56 -0
- package/dist/errors/messages.d.ts.map +1 -0
- package/dist/errors/messages.js +234 -0
- package/dist/errors/messages.js.map +1 -0
- package/dist/generators/index.d.ts +86 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +441 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.d.ts +48 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +49 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +38 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +229 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manager.d.ts +32 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +220 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/types.d.ts +186 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +5 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/security/index.d.ts +59 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +230 -0
- package/dist/security/index.js.map +1 -0
- package/dist/templates/entry.d.ts +9 -0
- package/dist/templates/entry.d.ts.map +1 -0
- package/dist/templates/entry.js +24 -0
- package/dist/templates/entry.js.map +1 -0
- package/dist/templates/index.d.ts +7 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +10 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/main.d.ts +6 -0
- package/dist/templates/main.d.ts.map +1 -0
- package/dist/templates/main.js +72 -0
- package/dist/templates/main.js.map +1 -0
- package/dist/templates/readme.d.ts +3 -0
- package/dist/templates/readme.d.ts.map +1 -0
- package/dist/templates/readme.js +127 -0
- package/dist/templates/readme.js.map +1 -0
- package/dist/templates/styles.d.ts +6 -0
- package/dist/templates/styles.d.ts.map +1 -0
- package/dist/templates/styles.js +212 -0
- package/dist/templates/styles.js.map +1 -0
- package/dist/templates/welcome.d.ts +10 -0
- package/dist/templates/welcome.d.ts.map +1 -0
- package/dist/templates/welcome.js +322 -0
- package/dist/templates/welcome.js.map +1 -0
- package/dist/types/index.d.ts +46 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/batch-writer.d.ts +101 -0
- package/dist/utils/batch-writer.d.ts.map +1 -0
- package/dist/utils/batch-writer.js +232 -0
- package/dist/utils/batch-writer.js.map +1 -0
- package/dist/utils/cache.d.ts +60 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +119 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/fileTree.d.ts +3 -0
- package/dist/utils/fileTree.d.ts.map +1 -0
- package/dist/utils/fileTree.js +71 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/fs.d.ts +22 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +75 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/helpers.d.ts +91 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +192 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/progress.d.ts +85 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +142 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/spinner.d.ts +9 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +56 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/validation/index.d.ts +63 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +262 -0
- package/dist/validation/index.js.map +1 -0
- 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
|
+
|