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,58 @@
1
+ # Publishing to NPM
2
+
3
+ This project uses GitHub Actions to automatically publish to NPM when you create a release.
4
+
5
+ ## Setup
6
+
7
+ 1. **Create an NPM token:**
8
+ - Go to https://www.npmjs.com/settings/YOUR_USERNAME/tokens
9
+ - Click "Generate New Token" → "Automation"
10
+ - Copy the token
11
+
12
+ 2. **Add the token to GitHub Secrets:**
13
+ - Go to your repository on GitHub
14
+ - Settings → Secrets and variables → Actions
15
+ - Click "New repository secret"
16
+ - Name: `NPM_TOKEN`
17
+ - Value: Paste your NPM token
18
+ - Click "Add secret"
19
+
20
+ ## How to Publish
21
+
22
+ ### Option 1: Create a Release (Recommended)
23
+
24
+ 1. Go to your repository on GitHub
25
+ 2. Click "Releases" → "Create a new release"
26
+ 3. Choose a tag (e.g., `v1.0.0`, `v1.1.0`, `v2.0.0`)
27
+ - If the tag doesn't exist, GitHub will create it
28
+ - Tag format: `v1.0.0` (the `v` prefix is optional)
29
+ 4. Fill in the release title and description
30
+ 5. Click "Publish release"
31
+
32
+ The workflow will automatically:
33
+ - Extract the version from the tag (removes `v` prefix if present)
34
+ - Update `package.json` with the new version
35
+ - Build the project
36
+ - Publish to NPM
37
+
38
+ ### Option 2: Push a Tag
39
+
40
+ ```bash
41
+ git tag v1.0.0
42
+ git push origin v1.0.0
43
+ ```
44
+
45
+ The workflow will trigger and publish automatically.
46
+
47
+ ## Version Format
48
+
49
+ - Use semantic versioning: `MAJOR.MINOR.PATCH`
50
+ - Examples: `1.0.0`, `1.1.0`, `2.0.0`
51
+ - The `v` prefix is optional: `v1.0.0` or `1.0.0` both work
52
+
53
+ ## Notes
54
+
55
+ - You don't need to manually update the version in `package.json`
56
+ - The workflow automatically updates it based on the release tag
57
+ - The package will be published as `create-coreback`
58
+
@@ -0,0 +1,78 @@
1
+ name: Publish to NPM
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ publish:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: write
12
+
13
+ steps:
14
+ - name: Checkout code
15
+ uses: actions/checkout@v4
16
+ with:
17
+ fetch-depth: 0
18
+
19
+ - name: Setup Node.js
20
+ uses: actions/setup-node@v4
21
+ with:
22
+ node-version: '20'
23
+ registry-url: 'https://registry.npmjs.org/'
24
+
25
+ - name: Extract version from tag
26
+ id: version
27
+ run: |
28
+ VERSION="${{ github.event.release.tag_name }}"
29
+ # Remove 'v' prefix if present
30
+ VERSION=${VERSION#v}
31
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
32
+ echo "=== Extracted version: $VERSION ==="
33
+
34
+ - name: Update package.json version
35
+ run: |
36
+ VERSION="${{ steps.version.outputs.version }}"
37
+ npm version $VERSION --no-git-tag-version --allow-same-version
38
+ echo "=== Updated version to: $VERSION ==="
39
+ cat package.json | grep '"version"'
40
+
41
+ - name: Commit version update
42
+ run: |
43
+ git config user.name "github-actions[bot]"
44
+ git config user.email "github-actions[bot]@users.noreply.github.com"
45
+ git add package.json package-lock.json
46
+ if git diff --staged --quiet; then
47
+ echo "No changes to commit"
48
+ else
49
+ git commit -m "chore: bump version to ${{ steps.version.outputs.version }}"
50
+ git pull --rebase origin main || true
51
+ git push origin HEAD:main || echo "Push failed, continuing..."
52
+ fi
53
+
54
+ - name: Install dependencies
55
+ run: npm ci
56
+
57
+ - name: Build project
58
+ run: npm run build
59
+
60
+ - name: Publish to NPM
61
+ env:
62
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
63
+ run: |
64
+ echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" > ~/.npmrc
65
+ echo "=== Verificando autenticación ==="
66
+ npm whoami || (echo "ERROR: No se pudo autenticar con NPM" && exit 1)
67
+ echo "=== Verificando información del paquete ==="
68
+ npm view create-coreback --json 2>&1 | head -20 || echo "Paquete no existe aún o no se puede acceder"
69
+ echo "=== Verificando versión en package.json ==="
70
+ cat package.json | grep '"version"'
71
+ echo "=== Verificando si la versión ya existe ==="
72
+ CURRENT_VERSION=$(cat package.json | grep '"version"' | cut -d'"' -f4)
73
+ if npm view create-coreback@$CURRENT_VERSION version 2>/dev/null; then
74
+ echo "⚠️ La versión $CURRENT_VERSION ya existe en npm. Saltando publicación."
75
+ exit 0
76
+ fi
77
+ echo "=== Intentando publicar ==="
78
+ npm publish --access public
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # create-coreback
2
+
3
+ CLI tool to generate production-ready backend projects with Node.js, TypeScript, and Express.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g create-coreback
9
+ # or
10
+ pnpm add -g create-coreback
11
+ # or
12
+ yarn global add create-coreback
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```bash
18
+ # Interactive mode
19
+ pnpm create coreback
20
+
21
+ # With project name
22
+ pnpm create coreback my-api
23
+ ```
24
+
25
+ ## Features
26
+
27
+ - 🚀 **Production-ready** - Includes all best practices and security measures
28
+ - 🎯 **Interactive CLI** - Easy setup with guided prompts
29
+ - 🗄️ **Multiple Databases** - PostgreSQL, MySQL, MongoDB, SQLite support
30
+ - 🔐 **JWT Authentication** - Optional authentication system
31
+ - 🐳 **Docker Support** - Ready-to-use Docker configuration
32
+ - 📚 **Swagger/OpenAPI** - Auto-generated API documentation
33
+ - 🧪 **Testing Setup** - Jest configured with examples
34
+ - 🔧 **TypeScript** - Strict TypeScript configuration
35
+ - 📦 **Clean Architecture** - Organized folder structure
36
+
37
+ ## Generated Project Structure
38
+
39
+ ```
40
+ my-backend/
41
+ ├── src/
42
+ │ ├── config/ # Configuration files
43
+ │ ├── controllers/ # HTTP handlers
44
+ │ ├── services/ # Business logic
45
+ │ ├── repositories/ # Data access layer
46
+ │ ├── middlewares/ # Express middlewares
47
+ │ ├── routes/ # Route definitions
48
+ │ ├── types/ # TypeScript types
49
+ │ ├── utils/ # Utility functions
50
+ │ └── validators/ # Zod schemas
51
+ ├── prisma/
52
+ │ └── schema.prisma # Database schema
53
+ ├── tests/
54
+ │ ├── unit/ # Unit tests
55
+ │ └── integration/ # Integration tests
56
+ └── ...
57
+ ```
58
+
59
+ ## License
60
+
61
+ MIT
62
+
@@ -0,0 +1,2 @@
1
+ export declare function createProject(defaultName?: string): Promise<void>;
2
+ //# sourceMappingURL=createProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.d.ts","sourceRoot":"","sources":["../src/createProject.ts"],"names":[],"mappings":"AAcA,wBAAsB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,iBA2DvD"}
@@ -0,0 +1,70 @@
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 { promptProjectConfig } from './prompts.js';
9
+ import { generateProjectFiles } from './generators/index.js';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ export async function createProject(defaultName) {
13
+ const config = await promptProjectConfig(defaultName);
14
+ const projectPath = path.resolve(process.cwd(), config.projectName);
15
+ if (existsSync(projectPath)) {
16
+ throw new Error(`Directory ${config.projectName} already exists`);
17
+ }
18
+ const spinner = ora('Creating project structure...').start();
19
+ try {
20
+ // Create project directory
21
+ await fs.ensureDir(projectPath);
22
+ spinner.text = 'Generating project files...';
23
+ await generateProjectFiles(projectPath, config);
24
+ spinner.text = 'Installing dependencies...';
25
+ spinner.stop();
26
+ const installSpinner = ora('Installing dependencies (this may take a while)...').start();
27
+ const originalCwd = process.cwd();
28
+ try {
29
+ process.chdir(projectPath);
30
+ const installCommand = getInstallCommand(config.packageManager);
31
+ execSync(installCommand, { stdio: 'inherit' });
32
+ if (config.database !== 'sqlite') {
33
+ installSpinner.text = 'Generating Prisma client...';
34
+ execSync(`${config.packageManager} run db:generate`, { stdio: 'inherit' });
35
+ }
36
+ installSpinner.succeed('Dependencies installed successfully');
37
+ }
38
+ finally {
39
+ process.chdir(originalCwd);
40
+ }
41
+ // Success message
42
+ console.log(chalk.green.bold('\n✅ Project created successfully!\n'));
43
+ console.log(chalk.cyan('Next steps:'));
44
+ console.log(chalk.white(` cd ${config.projectName}`));
45
+ console.log(chalk.white(' cp .env.example .env'));
46
+ if (config.database !== 'sqlite') {
47
+ console.log(chalk.white(` ${config.packageManager} run db:push`));
48
+ }
49
+ console.log(chalk.white(` ${config.packageManager} run dev\n`));
50
+ console.log(chalk.cyan('📚 Docs will be available at: http://localhost:3000/api-docs\n'));
51
+ }
52
+ catch (error) {
53
+ spinner.fail('Failed to create project');
54
+ if (existsSync(projectPath)) {
55
+ await fs.remove(projectPath);
56
+ }
57
+ throw error;
58
+ }
59
+ }
60
+ function getInstallCommand(packageManager) {
61
+ switch (packageManager) {
62
+ case 'pnpm':
63
+ return 'pnpm install';
64
+ case 'yarn':
65
+ return 'yarn install';
66
+ default:
67
+ return 'npm install';
68
+ }
69
+ }
70
+ //# sourceMappingURL=createProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.js","sourceRoot":"","sources":["../src/createProject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function generateCursorRules(projectPath: string): Promise<void>;
2
+ //# sourceMappingURL=cursorRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorRules.d.ts","sourceRoot":"","sources":["../../src/generators/cursorRules.ts"],"names":[],"mappings":"AAGA,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -0,0 +1,35 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export async function generateCursorRules(projectPath) {
4
+ const cursorRules = `Proyecto: Backend API con Clean Architecture
5
+ Stack: Node.js + TypeScript + Express + Prisma
6
+
7
+ Arquitectura:
8
+ - Controllers: Solo manejo HTTP (req, res, next)
9
+ - Services: Lógica de negocio pura
10
+ - Repositories: Acceso a datos con Prisma
11
+
12
+ Reglas:
13
+ - SIEMPRE validar con Zod antes de procesar datos
14
+ - SIEMPRE usar try-catch y pasar errores a next()
15
+ - NUNCA poner lógica de negocio en controllers
16
+ - Usar imports absolutos con alias @/ para src/
17
+ - Logging con winston para todos los errores
18
+ - Tests obligatorios para servicios críticos
19
+
20
+ Prisma:
21
+ - Usar transacciones para operaciones múltiples
22
+ - Siempre incluir select para optimizar queries
23
+
24
+ Auth:
25
+ - JWT en header Authorization: Bearer <token>
26
+ - Passwords hasheados con bcrypt (10 rounds)
27
+ - Refresh tokens en base de datos
28
+
29
+ Swagger:
30
+ - Documentar TODOS los endpoints con JSDoc
31
+ - Incluir ejemplos de request/response
32
+ `;
33
+ await fs.writeFile(path.join(projectPath, '.cursorrules'), cursorRules);
34
+ }
35
+ //# sourceMappingURL=cursorRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorRules.js","sourceRoot":"","sources":["../../src/generators/cursorRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB;IAEnB,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BrB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,WAAW,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../types.js';
2
+ export declare function generateDockerFiles(projectPath: string, config: ProjectConfig): Promise<void>;
3
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/generators/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Hf"}
@@ -0,0 +1,119 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export async function generateDockerFiles(projectPath, config) {
4
+ // Dockerfile
5
+ const dockerfile = `FROM node:20-alpine AS builder
6
+ WORKDIR /app
7
+ COPY package*.json ./
8
+ RUN npm ci
9
+ COPY . .
10
+ RUN npm run build && npm run db:generate
11
+
12
+ FROM node:20-alpine
13
+ WORKDIR /app
14
+ COPY package*.json ./
15
+ RUN npm ci --production
16
+ COPY --from=builder /app/dist ./dist
17
+ COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma
18
+ EXPOSE 3000
19
+ CMD ["npm", "start"]
20
+ `;
21
+ await fs.writeFile(path.join(projectPath, 'Dockerfile'), dockerfile);
22
+ // docker-compose.yml
23
+ let dockerCompose = `version: '3.8'
24
+
25
+ services:
26
+ app:
27
+ build: .
28
+ ports:
29
+ - "3000:3000"
30
+ environment:
31
+ - NODE_ENV=production
32
+ - DATABASE_URL=\${DATABASE_URL}
33
+ depends_on:
34
+ `;
35
+ switch (config.database) {
36
+ case 'postgresql':
37
+ dockerCompose += ` - postgres
38
+ networks:
39
+ - backend
40
+
41
+ postgres:
42
+ image: postgres:16-alpine
43
+ environment:
44
+ - POSTGRES_USER=user
45
+ - POSTGRES_PASSWORD=password
46
+ - POSTGRES_DB=mydb
47
+ ports:
48
+ - "5432:5432"
49
+ volumes:
50
+ - postgres_data:/var/lib/postgresql/data
51
+ networks:
52
+ - backend
53
+
54
+ volumes:
55
+ postgres_data:
56
+
57
+ networks:
58
+ backend:
59
+ `;
60
+ break;
61
+ case 'mysql':
62
+ dockerCompose += ` - mysql
63
+ networks:
64
+ - backend
65
+
66
+ mysql:
67
+ image: mysql:8
68
+ environment:
69
+ - MYSQL_ROOT_PASSWORD=rootpassword
70
+ - MYSQL_DATABASE=mydb
71
+ - MYSQL_USER=user
72
+ - MYSQL_PASSWORD=password
73
+ ports:
74
+ - "3306:3306"
75
+ volumes:
76
+ - mysql_data:/var/lib/mysql
77
+ networks:
78
+ - backend
79
+
80
+ volumes:
81
+ mysql_data:
82
+
83
+ networks:
84
+ backend:
85
+ `;
86
+ break;
87
+ case 'mongodb':
88
+ dockerCompose += ` - mongodb
89
+ networks:
90
+ - backend
91
+
92
+ mongodb:
93
+ image: mongo:7
94
+ ports:
95
+ - "27017:27017"
96
+ volumes:
97
+ - mongo_data:/data/db
98
+ networks:
99
+ - backend
100
+
101
+ volumes:
102
+ mongo_data:
103
+
104
+ networks:
105
+ backend:
106
+ `;
107
+ break;
108
+ default:
109
+ dockerCompose += ` - app
110
+ networks:
111
+ - backend
112
+
113
+ networks:
114
+ backend:
115
+ `;
116
+ }
117
+ await fs.writeFile(path.join(projectPath, 'docker-compose.yml'), dockerCompose);
118
+ }
119
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/generators/docker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,MAAqB;IAErB,aAAa;IACb,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;CAepB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;IAErE,qBAAqB;IACrB,IAAI,aAAa,GAAG;;;;;;;;;;;CAWrB,CAAC;IAEA,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,aAAa,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBtB,CAAC;YACI,MAAM;QACR,KAAK,OAAO;YACV,aAAa,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAuBtB,CAAC;YACI,MAAM;QACR,KAAK,SAAS;YACZ,aAAa,IAAI;;;;;;;;;;;;;;;;;;CAkBtB,CAAC;YACI,MAAM;QACR;YACE,aAAa,IAAI;;;;;;CAMtB,CAAC;IACA,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAC5C,aAAa,CACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../types.js';
2
+ export declare function generateEnvExample(projectPath: string, config: ProjectConfig): Promise<void>;
3
+ //# sourceMappingURL=envExample.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envExample.d.ts","sourceRoot":"","sources":["../../src/generators/envExample.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAwCf"}
@@ -0,0 +1,39 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export async function generateEnvExample(projectPath, config) {
4
+ let databaseUrl = '';
5
+ switch (config.database) {
6
+ case 'postgresql':
7
+ databaseUrl = 'postgresql://user:password@localhost:5432/mydb';
8
+ break;
9
+ case 'mysql':
10
+ databaseUrl = 'mysql://user:password@localhost:3306/mydb';
11
+ break;
12
+ case 'mongodb':
13
+ databaseUrl = 'mongodb://localhost:27017/mydb';
14
+ break;
15
+ case 'sqlite':
16
+ databaseUrl = 'file:./dev.db';
17
+ break;
18
+ }
19
+ let envContent = `NODE_ENV=development
20
+ PORT=3000
21
+
22
+ # Database
23
+ DATABASE_URL="${databaseUrl}"
24
+ `;
25
+ if (config.includeAuth) {
26
+ envContent += `
27
+ # JWT
28
+ JWT_SECRET=your-super-secret-key-change-this-in-production
29
+ JWT_EXPIRES_IN=7d
30
+ `;
31
+ }
32
+ envContent += `
33
+ # Rate Limit
34
+ RATE_LIMIT_WINDOW_MS=900000
35
+ RATE_LIMIT_MAX=100
36
+ `;
37
+ await fs.writeFile(path.join(projectPath, '.env.example'), envContent);
38
+ }
39
+ //# sourceMappingURL=envExample.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envExample.js","sourceRoot":"","sources":["../../src/generators/envExample.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,MAAqB;IAErB,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,WAAW,GAAG,gDAAgD,CAAC;YAC/D,MAAM;QACR,KAAK,OAAO;YACV,WAAW,GAAG,2CAA2C,CAAC;YAC1D,MAAM;QACR,KAAK,SAAS;YACZ,WAAW,GAAG,gCAAgC,CAAC;YAC/C,MAAM;QACR,KAAK,QAAQ;YACX,WAAW,GAAG,eAAe,CAAC;YAC9B,MAAM;IACV,CAAC;IAED,IAAI,UAAU,GAAG;;;;gBAIH,WAAW;CAC1B,CAAC;IAEA,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,UAAU,IAAI;;;;CAIjB,CAAC;IACA,CAAC;IAED,UAAU,IAAI;;;;CAIf,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generateEslintConfig(projectPath: string): Promise<void>;
2
+ //# sourceMappingURL=eslint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.d.ts","sourceRoot":"","sources":["../../src/generators/eslint.ts"],"names":[],"mappings":"AAGA,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC7E"}
@@ -0,0 +1,32 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export async function generateEslintConfig(projectPath) {
4
+ const eslintConfig = {
5
+ parser: '@typescript-eslint/parser',
6
+ parserOptions: {
7
+ ecmaVersion: 2022,
8
+ sourceType: 'module',
9
+ project: './tsconfig.json',
10
+ },
11
+ plugins: ['@typescript-eslint'],
12
+ extends: [
13
+ 'eslint:recommended',
14
+ 'plugin:@typescript-eslint/recommended',
15
+ 'plugin:@typescript-eslint/recommended-requiring-type-checking',
16
+ ],
17
+ root: true,
18
+ env: {
19
+ node: true,
20
+ jest: true,
21
+ },
22
+ ignorePatterns: ['.eslintrc.json', 'dist', 'node_modules'],
23
+ rules: {
24
+ '@typescript-eslint/interface-name-prefix': 'off',
25
+ '@typescript-eslint/explicit-function-return-type': 'off',
26
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
27
+ '@typescript-eslint/no-explicit-any': 'warn',
28
+ },
29
+ };
30
+ await fs.writeJSON(path.join(projectPath, '.eslintrc.json'), eslintConfig, { spaces: 2 });
31
+ }
32
+ //# sourceMappingURL=eslint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../../src/generators/eslint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,YAAY,GAAG;QACnB,MAAM,EAAE,2BAA2B;QACnC,aAAa,EAAE;YACb,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,iBAAiB;SAC3B;QACD,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,OAAO,EAAE;YACP,oBAAoB;YACpB,uCAAuC;YACvC,+DAA+D;SAChE;QACD,IAAI,EAAE,IAAI;QACV,GAAG,EAAE;YACH,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI;SACX;QACD,cAAc,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,cAAc,CAAC;QAC1D,KAAK,EAAE;YACL,0CAA0C,EAAE,KAAK;YACjD,kDAAkD,EAAE,KAAK;YACzD,mDAAmD,EAAE,KAAK;YAC1D,oCAAoC,EAAE,MAAM;SAC7C;KACF,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,EACxC,YAAY,EACZ,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../types.js';
2
+ export declare function generateGitHubActions(projectPath: string, config: ProjectConfig): Promise<void>;
3
+ //# sourceMappingURL=githubActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubActions.d.ts","sourceRoot":"","sources":["../../src/generators/githubActions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAsEf"}
@@ -0,0 +1,68 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export async function generateGitHubActions(projectPath, config) {
4
+ const workflowsDir = path.join(projectPath, '.github', 'workflows');
5
+ await fs.ensureDir(workflowsDir);
6
+ const ciYml = `name: CI
7
+
8
+ on:
9
+ push:
10
+ branches: [main, develop]
11
+ pull_request:
12
+ branches: [main, develop]
13
+
14
+ jobs:
15
+ test:
16
+ runs-on: ubuntu-latest
17
+
18
+ services:
19
+ ${config.database === 'postgresql' ? ` postgres:
20
+ image: postgres:16
21
+ env:
22
+ POSTGRES_USER: user
23
+ POSTGRES_PASSWORD: password
24
+ POSTGRES_DB: testdb
25
+ options: >-
26
+ --health-cmd pg_isready
27
+ --health-interval 10s
28
+ --health-timeout 5s
29
+ --health-retries 5
30
+ ports:
31
+ - 5432:5432` : config.database === 'mysql' ? ` mysql:
32
+ image: mysql:8
33
+ env:
34
+ MYSQL_ROOT_PASSWORD: rootpassword
35
+ MYSQL_DATABASE: testdb
36
+ options: >-
37
+ --health-cmd="mysqladmin ping"
38
+ --health-interval=10s
39
+ --health-timeout=5s
40
+ --health-retries=5
41
+ ports:
42
+ - 3306:3306` : ''}
43
+
44
+ steps:
45
+ - uses: actions/checkout@v4
46
+
47
+ - uses: actions/setup-node@v4
48
+ with:
49
+ node-version: '20'
50
+ cache: '${config.packageManager}'
51
+
52
+ - name: Install dependencies
53
+ run: ${config.packageManager} install
54
+
55
+ - name: Run linter
56
+ run: ${config.packageManager} run lint
57
+
58
+ - name: Run tests
59
+ run: ${config.packageManager} run test
60
+ env:
61
+ DATABASE_URL: ${config.database === 'postgresql' ? '"postgresql://user:password@localhost:5432/testdb"' : config.database === 'mysql' ? '"mysql://root:rootpassword@localhost:3306/testdb"' : '"file:./test.db"'}
62
+
63
+ - name: Build
64
+ run: ${config.packageManager} run build
65
+ `;
66
+ await fs.writeFile(path.join(workflowsDir, 'ci.yml'), ciYml);
67
+ }
68
+ //# sourceMappingURL=githubActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubActions.js","sourceRoot":"","sources":["../../src/generators/githubActions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,MAAqB;IAErB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,WAAW,EACX,SAAS,EACT,WAAW,CACZ,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG;;;;;;;;;;;;;EAad,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC;;;;;;;;;;;;sBAYf,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC;;;;;;;;;;;sBAWjC,CAAC,CAAC,CAAC,EAAE;;;;;;;;oBAQP,MAAM,CAAC,cAAc;;;eAG1B,MAAM,CAAC,cAAc;;;eAGrB,MAAM,CAAC,cAAc;;;eAGrB,MAAM,CAAC,cAAc;;0BAEV,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,kBAAkB;;;eAG3M,MAAM,CAAC,cAAc;CACnC,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC"}