create-coreback 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/.github/PUBLISH.md +58 -0
  2. package/.github/workflows/publish.yml +78 -0
  3. package/LICENSE +21 -0
  4. package/README.md +62 -0
  5. package/dist/createProject.d.ts +2 -0
  6. package/dist/createProject.d.ts.map +1 -0
  7. package/dist/createProject.js +70 -0
  8. package/dist/createProject.js.map +1 -0
  9. package/dist/generators/cursorRules.d.ts +2 -0
  10. package/dist/generators/cursorRules.d.ts.map +1 -0
  11. package/dist/generators/cursorRules.js +35 -0
  12. package/dist/generators/cursorRules.js.map +1 -0
  13. package/dist/generators/docker.d.ts +3 -0
  14. package/dist/generators/docker.d.ts.map +1 -0
  15. package/dist/generators/docker.js +119 -0
  16. package/dist/generators/docker.js.map +1 -0
  17. package/dist/generators/envExample.d.ts +3 -0
  18. package/dist/generators/envExample.d.ts.map +1 -0
  19. package/dist/generators/envExample.js +39 -0
  20. package/dist/generators/envExample.js.map +1 -0
  21. package/dist/generators/eslint.d.ts +2 -0
  22. package/dist/generators/eslint.d.ts.map +1 -0
  23. package/dist/generators/eslint.js +32 -0
  24. package/dist/generators/eslint.js.map +1 -0
  25. package/dist/generators/githubActions.d.ts +3 -0
  26. package/dist/generators/githubActions.d.ts.map +1 -0
  27. package/dist/generators/githubActions.js +68 -0
  28. package/dist/generators/githubActions.js.map +1 -0
  29. package/dist/generators/gitignore.d.ts +2 -0
  30. package/dist/generators/gitignore.d.ts.map +1 -0
  31. package/dist/generators/gitignore.js +50 -0
  32. package/dist/generators/gitignore.js.map +1 -0
  33. package/dist/generators/index.d.ts +3 -0
  34. package/dist/generators/index.d.ts.map +1 -0
  35. package/dist/generators/index.js +34 -0
  36. package/dist/generators/index.js.map +1 -0
  37. package/dist/generators/jest.d.ts +2 -0
  38. package/dist/generators/jest.d.ts.map +1 -0
  39. package/dist/generators/jest.js +23 -0
  40. package/dist/generators/jest.js.map +1 -0
  41. package/dist/generators/packageJson.d.ts +3 -0
  42. package/dist/generators/packageJson.d.ts.map +1 -0
  43. package/dist/generators/packageJson.js +80 -0
  44. package/dist/generators/packageJson.js.map +1 -0
  45. package/dist/generators/prettier.d.ts +2 -0
  46. package/dist/generators/prettier.d.ts.map +1 -0
  47. package/dist/generators/prettier.js +14 -0
  48. package/dist/generators/prettier.js.map +1 -0
  49. package/dist/generators/prisma.d.ts +3 -0
  50. package/dist/generators/prisma.d.ts.map +1 -0
  51. package/dist/generators/prisma.js +55 -0
  52. package/dist/generators/prisma.js.map +1 -0
  53. package/dist/generators/sourceFiles.d.ts +3 -0
  54. package/dist/generators/sourceFiles.d.ts.map +1 -0
  55. package/dist/generators/sourceFiles.js +767 -0
  56. package/dist/generators/sourceFiles.js.map +1 -0
  57. package/dist/generators/tsconfig.d.ts +2 -0
  58. package/dist/generators/tsconfig.d.ts.map +1 -0
  59. package/dist/generators/tsconfig.js +32 -0
  60. package/dist/generators/tsconfig.js.map +1 -0
  61. package/dist/index.d.ts +3 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +42 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/prompts.d.ts +3 -0
  66. package/dist/prompts.d.ts.map +1 -0
  67. package/dist/prompts.js +56 -0
  68. package/dist/prompts.js.map +1 -0
  69. package/dist/types.d.ts +10 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +2 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/utils/parseArgs.d.ts +2 -0
  74. package/dist/utils/parseArgs.d.ts.map +1 -0
  75. package/dist/utils/parseArgs.js +6 -0
  76. package/dist/utils/parseArgs.js.map +1 -0
  77. package/package.json +46 -0
  78. package/src/createProject.ts +86 -0
  79. package/src/generators/cursorRules.ts +39 -0
  80. package/src/generators/docker.ts +131 -0
  81. package/src/generators/envExample.ts +49 -0
  82. package/src/generators/eslint.ts +38 -0
  83. package/src/generators/githubActions.ts +79 -0
  84. package/src/generators/gitignore.ts +52 -0
  85. package/src/generators/index.ts +45 -0
  86. package/src/generators/jest.ts +29 -0
  87. package/src/generators/packageJson.ts +89 -0
  88. package/src/generators/prettier.ts +22 -0
  89. package/src/generators/prisma.ts +66 -0
  90. package/src/generators/sourceFiles.ts +840 -0
  91. package/src/generators/tsconfig.ts +34 -0
  92. package/src/index.ts +45 -0
  93. package/src/prompts.ts +62 -0
  94. package/src/types.ts +11 -0
  95. package/src/utils/parseArgs.ts +6 -0
  96. package/tsconfig.json +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceFiles.js","sourceRoot":"","sources":["../../src/generators/sourceFiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function generateTsConfig(projectPath: string): Promise<void>;
2
+ //# sourceMappingURL=tsconfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig.d.ts","sourceRoot":"","sources":["../../src/generators/tsconfig.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BzE"}
@@ -0,0 +1,32 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export async function generateTsConfig(projectPath) {
4
+ const tsconfig = {
5
+ compilerOptions: {
6
+ target: 'ES2022',
7
+ module: 'ES2022',
8
+ lib: ['ES2022'],
9
+ moduleResolution: 'node',
10
+ outDir: './dist',
11
+ rootDir: './src',
12
+ strict: true,
13
+ esModuleInterop: true,
14
+ skipLibCheck: true,
15
+ forceConsistentCasingInFileNames: true,
16
+ resolveJsonModule: true,
17
+ declaration: true,
18
+ declarationMap: true,
19
+ sourceMap: true,
20
+ baseUrl: '.',
21
+ paths: {
22
+ '@/*': ['src/*'],
23
+ },
24
+ },
25
+ include: ['src/**/*'],
26
+ exclude: ['node_modules', 'dist', 'tests'],
27
+ };
28
+ await fs.writeJSON(path.join(projectPath, 'tsconfig.json'), tsconfig, {
29
+ spaces: 2,
30
+ });
31
+ }
32
+ //# sourceMappingURL=tsconfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig.js","sourceRoot":"","sources":["../../src/generators/tsconfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAG;QACf,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,CAAC,QAAQ,CAAC;YACf,gBAAgB,EAAE,MAAM;YACxB,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,gCAAgC,EAAE,IAAI;YACtC,iBAAiB,EAAE,IAAI;YACvB,WAAW,EAAE,IAAI;YACjB,cAAc,EAAE,IAAI;YACpB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE;gBACL,KAAK,EAAE,CAAC,OAAO,CAAC;aACjB;SACF;QACD,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;KAC3C,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE;QACpE,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import { createProject } from './createProject.js';
3
+ import { parseArgs } from './utils/parseArgs.js';
4
+ import chalk from 'chalk';
5
+ const banner = `
6
+ ${chalk.cyan.bold('╔═══════════════════════════════════════════════════════════════╗')}
7
+ ${chalk.cyan.bold('║')} ${chalk.cyan.bold('║')}
8
+ ${chalk.cyan.bold('║')} ${chalk.white.bold(' ██████╗ ██████╗ ██████╗ ███████╗')} ${chalk.cyan.bold('║')}
9
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('██╔════╝██╔═══██╗██╔══██╗██╔════╝')} ${chalk.cyan.bold('║')}
10
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('██║ ██║ ██║██████╔╝█████╗ ')} ${chalk.cyan.bold('║')}
11
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('██║ ██║ ██║██╔══██╗██╔══╝ ')} ${chalk.cyan.bold('║')}
12
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('╚██████╗╚██████╝ ██║ ██║███████╗')} ${chalk.cyan.bold('║')}
13
+ ${chalk.cyan.bold('║')} ${chalk.cyan.bold('║')}
14
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('██████╗ █████╗ ██████╗██╗ ██╗')} ${chalk.cyan.bold('║')}
15
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('██╔══██╗██╔══██╗██╔════╝██║ ██╔╝')} ${chalk.cyan.bold('║')}
16
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('██████╔╝███████║██║ █████╔╝ ')} ${chalk.cyan.bold('║')}
17
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('██╔══██╗██╔══██║██║ ██╔═██╗ ')} ${chalk.cyan.bold('║')}
18
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('██████╔╝██║ ██║╚██████╗██║ ██╗')} ${chalk.cyan.bold('║')}
19
+ ${chalk.cyan.bold('║')} ${chalk.white.bold('╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝')} ${chalk.cyan.bold('║')}
20
+ ${chalk.cyan.bold('║')} ${chalk.cyan.bold('║')}
21
+ ${chalk.cyan.bold('║')} ${chalk.gray(' Production-Ready Backend Generator')} ${chalk.cyan.bold('║')}
22
+ ${chalk.cyan.bold('║')} ${chalk.cyan.bold('║')}
23
+ ${chalk.cyan.bold('╚═══════════════════════════════════════════════════════════════╝')}
24
+ `;
25
+ async function main() {
26
+ try {
27
+ console.log(banner);
28
+ const projectName = parseArgs();
29
+ await createProject(projectName);
30
+ }
31
+ catch (error) {
32
+ if (error instanceof Error) {
33
+ console.error(chalk.red('\n❌ Error:'), error.message);
34
+ }
35
+ else {
36
+ console.error(chalk.red('\n❌ Unexpected error occurred'));
37
+ }
38
+ process.exit(1);
39
+ }
40
+ }
41
+ main();
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from './types.js';
2
+ export declare function promptProjectConfig(defaultName?: string): Promise<ProjectConfig>;
3
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAgC,MAAM,YAAY,CAAC;AAEzE,wBAAsB,mBAAmB,CACvC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CAsDxB"}
@@ -0,0 +1,56 @@
1
+ import inquirer from 'inquirer';
2
+ export async function promptProjectConfig(defaultName) {
3
+ const answers = await inquirer.prompt([
4
+ {
5
+ type: 'input',
6
+ name: 'projectName',
7
+ message: 'Project name:',
8
+ default: defaultName || 'my-backend',
9
+ validate: (input) => {
10
+ if (!input.trim()) {
11
+ return 'Project name cannot be empty';
12
+ }
13
+ if (!/^[a-z0-9-]+$/.test(input)) {
14
+ return 'Project name must be lowercase, alphanumeric, and can contain hyphens';
15
+ }
16
+ return true;
17
+ },
18
+ filter: (input) => input.toLowerCase().trim(),
19
+ },
20
+ {
21
+ type: 'list',
22
+ name: 'database',
23
+ message: 'Select database:',
24
+ choices: [
25
+ { name: 'PostgreSQL', value: 'postgresql' },
26
+ { name: 'MySQL', value: 'mysql' },
27
+ { name: 'MongoDB', value: 'mongodb' },
28
+ { name: 'SQLite', value: 'sqlite' },
29
+ ],
30
+ },
31
+ {
32
+ type: 'confirm',
33
+ name: 'includeAuth',
34
+ message: 'Include JWT authentication?',
35
+ default: true,
36
+ },
37
+ {
38
+ type: 'confirm',
39
+ name: 'includeDocker',
40
+ message: 'Include Docker configuration?',
41
+ default: true,
42
+ },
43
+ {
44
+ type: 'list',
45
+ name: 'packageManager',
46
+ message: 'Select package manager:',
47
+ choices: [
48
+ { name: 'npm', value: 'npm' },
49
+ { name: 'pnpm', value: 'pnpm' },
50
+ { name: 'yarn', value: 'yarn' },
51
+ ],
52
+ },
53
+ ]);
54
+ return answers;
55
+ }
56
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAIhC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,WAAW,IAAI,YAAY;YACpC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClB,OAAO,8BAA8B,CAAC;gBACxC,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,OAAO,uEAAuE,CAAC;gBACjF,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;SACtD;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;gBAC3C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;gBACjC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;aACpC;SACF;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,6BAA6B;YACtC,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,yBAAyB;YAClC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;SACF;KACF,CAAC,CAAC;IAEH,OAAO,OAAwB,CAAC;AAClC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type DatabaseType = 'postgresql' | 'mysql' | 'mongodb' | 'sqlite';
2
+ export type PackageManager = 'npm' | 'pnpm' | 'yarn';
3
+ export interface ProjectConfig {
4
+ projectName: string;
5
+ database: DatabaseType;
6
+ includeAuth: boolean;
7
+ includeDocker: boolean;
8
+ packageManager: PackageManager;
9
+ }
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AACzE,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;CAChC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function parseArgs(): string | undefined;
2
+ //# sourceMappingURL=parseArgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseArgs.d.ts","sourceRoot":"","sources":["../../src/utils/parseArgs.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAI9C"}
@@ -0,0 +1,6 @@
1
+ export function parseArgs() {
2
+ const args = process.argv.slice(2);
3
+ const projectName = args.find(arg => !arg.startsWith('-'));
4
+ return projectName;
5
+ }
6
+ //# sourceMappingURL=parseArgs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseArgs.js","sourceRoot":"","sources":["../../src/utils/parseArgs.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,WAAW,CAAC;AACrB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "create-coreback",
3
+ "version": "1.0.1",
4
+ "description": "CLI to generate production-ready backend projects with Node.js, TypeScript and Express",
5
+ "type": "module",
6
+ "bin": {
7
+ "create-coreback": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx watch src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "cli",
18
+ "backend",
19
+ "express",
20
+ "typescript",
21
+ "nodejs",
22
+ "scaffold",
23
+ "generator"
24
+ ],
25
+ "author": "",
26
+ "license": "MIT",
27
+ "dependencies": {
28
+ "chalk": "^5.3.0",
29
+ "inquirer": "^9.2.15",
30
+ "ora": "^7.0.1",
31
+ "fs-extra": "^11.2.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/fs-extra": "^11.0.4",
35
+ "@types/inquirer": "^9.0.7",
36
+ "@types/node": "^20.11.5",
37
+ "tsx": "^4.7.1",
38
+ "typescript": "^5.3.3"
39
+ },
40
+ "engines": {
41
+ "node": ">=20.0.0"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ }
46
+ }
@@ -0,0 +1,86 @@
1
+ import { execSync } from 'child_process';
2
+ import { existsSync } from 'fs';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import fs from 'fs-extra';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { ProjectConfig } from './types.js';
9
+ import { promptProjectConfig } from './prompts.js';
10
+ import { generateProjectFiles } from './generators/index.js';
11
+
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = path.dirname(__filename);
14
+
15
+ export async function createProject(defaultName?: string) {
16
+ const config = await promptProjectConfig(defaultName);
17
+ const projectPath = path.resolve(process.cwd(), config.projectName);
18
+
19
+ if (existsSync(projectPath)) {
20
+ throw new Error(`Directory ${config.projectName} already exists`);
21
+ }
22
+
23
+ const spinner = ora('Creating project structure...').start();
24
+
25
+ try {
26
+ // Create project directory
27
+ await fs.ensureDir(projectPath);
28
+
29
+ spinner.text = 'Generating project files...';
30
+ await generateProjectFiles(projectPath, config);
31
+
32
+ spinner.text = 'Installing dependencies...';
33
+ spinner.stop();
34
+
35
+ const installSpinner = ora('Installing dependencies (this may take a while)...').start();
36
+
37
+ const originalCwd = process.cwd();
38
+ try {
39
+ process.chdir(projectPath);
40
+
41
+ const installCommand = getInstallCommand(config.packageManager);
42
+ execSync(installCommand, { stdio: 'inherit' });
43
+
44
+ if (config.database !== 'sqlite') {
45
+ installSpinner.text = 'Generating Prisma client...';
46
+ execSync(`${config.packageManager} run db:generate`, { stdio: 'inherit' });
47
+ }
48
+
49
+ installSpinner.succeed('Dependencies installed successfully');
50
+ } finally {
51
+ process.chdir(originalCwd);
52
+ }
53
+
54
+ // Success message
55
+ console.log(chalk.green.bold('\n✅ Project created successfully!\n'));
56
+ console.log(chalk.cyan('Next steps:'));
57
+ console.log(chalk.white(` cd ${config.projectName}`));
58
+ console.log(chalk.white(' cp .env.example .env'));
59
+
60
+ if (config.database !== 'sqlite') {
61
+ console.log(chalk.white(` ${config.packageManager} run db:push`));
62
+ }
63
+
64
+ console.log(chalk.white(` ${config.packageManager} run dev\n`));
65
+ console.log(chalk.cyan('📚 Docs will be available at: http://localhost:3000/api-docs\n'));
66
+
67
+ } catch (error) {
68
+ spinner.fail('Failed to create project');
69
+ if (existsSync(projectPath)) {
70
+ await fs.remove(projectPath);
71
+ }
72
+ throw error;
73
+ }
74
+ }
75
+
76
+ function getInstallCommand(packageManager: string): string {
77
+ switch (packageManager) {
78
+ case 'pnpm':
79
+ return 'pnpm install';
80
+ case 'yarn':
81
+ return 'yarn install';
82
+ default:
83
+ return 'npm install';
84
+ }
85
+ }
86
+
@@ -0,0 +1,39 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+
4
+ export async function generateCursorRules(
5
+ projectPath: string
6
+ ): Promise<void> {
7
+ const cursorRules = `Proyecto: Backend API con Clean Architecture
8
+ Stack: Node.js + TypeScript + Express + Prisma
9
+
10
+ Arquitectura:
11
+ - Controllers: Solo manejo HTTP (req, res, next)
12
+ - Services: Lógica de negocio pura
13
+ - Repositories: Acceso a datos con Prisma
14
+
15
+ Reglas:
16
+ - SIEMPRE validar con Zod antes de procesar datos
17
+ - SIEMPRE usar try-catch y pasar errores a next()
18
+ - NUNCA poner lógica de negocio en controllers
19
+ - Usar imports absolutos con alias @/ para src/
20
+ - Logging con winston para todos los errores
21
+ - Tests obligatorios para servicios críticos
22
+
23
+ Prisma:
24
+ - Usar transacciones para operaciones múltiples
25
+ - Siempre incluir select para optimizar queries
26
+
27
+ Auth:
28
+ - JWT en header Authorization: Bearer <token>
29
+ - Passwords hasheados con bcrypt (10 rounds)
30
+ - Refresh tokens en base de datos
31
+
32
+ Swagger:
33
+ - Documentar TODOS los endpoints con JSDoc
34
+ - Incluir ejemplos de request/response
35
+ `;
36
+
37
+ await fs.writeFile(path.join(projectPath, '.cursorrules'), cursorRules);
38
+ }
39
+
@@ -0,0 +1,131 @@
1
+ import { ProjectConfig } from '../types.js';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+
5
+ export async function generateDockerFiles(
6
+ projectPath: string,
7
+ config: ProjectConfig
8
+ ): Promise<void> {
9
+ // Dockerfile
10
+ const dockerfile = `FROM node:20-alpine AS builder
11
+ WORKDIR /app
12
+ COPY package*.json ./
13
+ RUN npm ci
14
+ COPY . .
15
+ RUN npm run build && npm run db:generate
16
+
17
+ FROM node:20-alpine
18
+ WORKDIR /app
19
+ COPY package*.json ./
20
+ RUN npm ci --production
21
+ COPY --from=builder /app/dist ./dist
22
+ COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma
23
+ EXPOSE 3000
24
+ CMD ["npm", "start"]
25
+ `;
26
+
27
+ await fs.writeFile(path.join(projectPath, 'Dockerfile'), dockerfile);
28
+
29
+ // docker-compose.yml
30
+ let dockerCompose = `version: '3.8'
31
+
32
+ services:
33
+ app:
34
+ build: .
35
+ ports:
36
+ - "3000:3000"
37
+ environment:
38
+ - NODE_ENV=production
39
+ - DATABASE_URL=\${DATABASE_URL}
40
+ depends_on:
41
+ `;
42
+
43
+ switch (config.database) {
44
+ case 'postgresql':
45
+ dockerCompose += ` - postgres
46
+ networks:
47
+ - backend
48
+
49
+ postgres:
50
+ image: postgres:16-alpine
51
+ environment:
52
+ - POSTGRES_USER=user
53
+ - POSTGRES_PASSWORD=password
54
+ - POSTGRES_DB=mydb
55
+ ports:
56
+ - "5432:5432"
57
+ volumes:
58
+ - postgres_data:/var/lib/postgresql/data
59
+ networks:
60
+ - backend
61
+
62
+ volumes:
63
+ postgres_data:
64
+
65
+ networks:
66
+ backend:
67
+ `;
68
+ break;
69
+ case 'mysql':
70
+ dockerCompose += ` - mysql
71
+ networks:
72
+ - backend
73
+
74
+ mysql:
75
+ image: mysql:8
76
+ environment:
77
+ - MYSQL_ROOT_PASSWORD=rootpassword
78
+ - MYSQL_DATABASE=mydb
79
+ - MYSQL_USER=user
80
+ - MYSQL_PASSWORD=password
81
+ ports:
82
+ - "3306:3306"
83
+ volumes:
84
+ - mysql_data:/var/lib/mysql
85
+ networks:
86
+ - backend
87
+
88
+ volumes:
89
+ mysql_data:
90
+
91
+ networks:
92
+ backend:
93
+ `;
94
+ break;
95
+ case 'mongodb':
96
+ dockerCompose += ` - mongodb
97
+ networks:
98
+ - backend
99
+
100
+ mongodb:
101
+ image: mongo:7
102
+ ports:
103
+ - "27017:27017"
104
+ volumes:
105
+ - mongo_data:/data/db
106
+ networks:
107
+ - backend
108
+
109
+ volumes:
110
+ mongo_data:
111
+
112
+ networks:
113
+ backend:
114
+ `;
115
+ break;
116
+ default:
117
+ dockerCompose += ` - app
118
+ networks:
119
+ - backend
120
+
121
+ networks:
122
+ backend:
123
+ `;
124
+ }
125
+
126
+ await fs.writeFile(
127
+ path.join(projectPath, 'docker-compose.yml'),
128
+ dockerCompose
129
+ );
130
+ }
131
+
@@ -0,0 +1,49 @@
1
+ import { ProjectConfig } from '../types.js';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+
5
+ export async function generateEnvExample(
6
+ projectPath: string,
7
+ config: ProjectConfig
8
+ ): Promise<void> {
9
+ let databaseUrl = '';
10
+
11
+ switch (config.database) {
12
+ case 'postgresql':
13
+ databaseUrl = 'postgresql://user:password@localhost:5432/mydb';
14
+ break;
15
+ case 'mysql':
16
+ databaseUrl = 'mysql://user:password@localhost:3306/mydb';
17
+ break;
18
+ case 'mongodb':
19
+ databaseUrl = 'mongodb://localhost:27017/mydb';
20
+ break;
21
+ case 'sqlite':
22
+ databaseUrl = 'file:./dev.db';
23
+ break;
24
+ }
25
+
26
+ let envContent = `NODE_ENV=development
27
+ PORT=3000
28
+
29
+ # Database
30
+ DATABASE_URL="${databaseUrl}"
31
+ `;
32
+
33
+ if (config.includeAuth) {
34
+ envContent += `
35
+ # JWT
36
+ JWT_SECRET=your-super-secret-key-change-this-in-production
37
+ JWT_EXPIRES_IN=7d
38
+ `;
39
+ }
40
+
41
+ envContent += `
42
+ # Rate Limit
43
+ RATE_LIMIT_WINDOW_MS=900000
44
+ RATE_LIMIT_MAX=100
45
+ `;
46
+
47
+ await fs.writeFile(path.join(projectPath, '.env.example'), envContent);
48
+ }
49
+
@@ -0,0 +1,38 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+
4
+ export async function generateEslintConfig(projectPath: string): Promise<void> {
5
+ const eslintConfig = {
6
+ parser: '@typescript-eslint/parser',
7
+ parserOptions: {
8
+ ecmaVersion: 2022,
9
+ sourceType: 'module',
10
+ project: './tsconfig.json',
11
+ },
12
+ plugins: ['@typescript-eslint'],
13
+ extends: [
14
+ 'eslint:recommended',
15
+ 'plugin:@typescript-eslint/recommended',
16
+ 'plugin:@typescript-eslint/recommended-requiring-type-checking',
17
+ ],
18
+ root: true,
19
+ env: {
20
+ node: true,
21
+ jest: true,
22
+ },
23
+ ignorePatterns: ['.eslintrc.json', 'dist', 'node_modules'],
24
+ rules: {
25
+ '@typescript-eslint/interface-name-prefix': 'off',
26
+ '@typescript-eslint/explicit-function-return-type': 'off',
27
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
28
+ '@typescript-eslint/no-explicit-any': 'warn',
29
+ },
30
+ };
31
+
32
+ await fs.writeJSON(
33
+ path.join(projectPath, '.eslintrc.json'),
34
+ eslintConfig,
35
+ { spaces: 2 }
36
+ );
37
+ }
38
+