projects-init-cli 1.1.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.
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateReact = generateReact;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ async function generateReact(frontendPath, config) {
10
+ const packageJson = {
11
+ name: `${config.projectName}-frontend`,
12
+ version: '0.1.0',
13
+ private: true,
14
+ scripts: {
15
+ dev: 'vite',
16
+ build: 'tsc && vite build',
17
+ preview: 'vite preview',
18
+ lint: 'eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0',
19
+ test: 'vitest',
20
+ 'test:ui': 'vitest --ui',
21
+ 'test:coverage': 'vitest --coverage'
22
+ },
23
+ dependencies: {
24
+ react: '^18.3.1',
25
+ 'react-dom': '^18.3.1'
26
+ },
27
+ devDependencies: {
28
+ '@types/react': '^18.3.12',
29
+ '@types/react-dom': '^18.3.1',
30
+ '@typescript-eslint/eslint-plugin': '^8.15.0',
31
+ '@typescript-eslint/parser': '^8.15.0',
32
+ '@vitejs/plugin-react': '^4.3.2',
33
+ eslint: '^9.15.0',
34
+ 'eslint-plugin-react-hooks': '^5.1.0',
35
+ 'eslint-plugin-react-refresh': '^0.4.14',
36
+ typescript: '^5.6.3',
37
+ vite: '^6.0.1',
38
+ 'tailwindcss': '^3.4.14',
39
+ 'postcss': '^8.4.47',
40
+ 'autoprefixer': '^10.4.20',
41
+ 'vitest': '^2.1.3',
42
+ '@vitest/ui': '^2.1.3',
43
+ '@testing-library/react': '^16.0.1',
44
+ '@testing-library/jest-dom': '^6.6.3',
45
+ 'jsdom': '^25.0.1',
46
+ '@vitest/coverage-v8': '^2.1.3'
47
+ }
48
+ };
49
+ await fs_extra_1.default.writeJSON(path_1.default.join(frontendPath, 'package.json'), packageJson, { spaces: 2 });
50
+ // Create Vite config
51
+ const viteConfig = `import { defineConfig } from 'vite'
52
+ import react from '@vitejs/plugin-react'
53
+
54
+ export default defineConfig({
55
+ plugins: [react()],
56
+ test: {
57
+ globals: true,
58
+ environment: 'jsdom',
59
+ setupFiles: './src/test/setup.ts',
60
+ coverage: {
61
+ provider: 'v8',
62
+ reporter: ['text', 'json', 'html'],
63
+ },
64
+ },
65
+ })
66
+ `;
67
+ await fs_extra_1.default.writeFile(path_1.default.join(frontendPath, 'vite.config.ts'), viteConfig);
68
+ // Create Tailwind config
69
+ const tailwindConfig = `/** @type {import('tailwindcss').Config} */
70
+ export default {
71
+ content: [
72
+ "./index.html",
73
+ "./src/**/*.{js,ts,jsx,tsx}",
74
+ ],
75
+ theme: {
76
+ extend: {},
77
+ },
78
+ plugins: [],
79
+ }
80
+ `;
81
+ await fs_extra_1.default.writeFile(path_1.default.join(frontendPath, 'tailwind.config.js'), tailwindConfig);
82
+ // Create PostCSS config
83
+ const postcssConfig = `export default {
84
+ plugins: {
85
+ tailwindcss: {},
86
+ autoprefixer: {},
87
+ },
88
+ }
89
+ `;
90
+ await fs_extra_1.default.writeFile(path_1.default.join(frontendPath, 'postcss.config.js'), postcssConfig);
91
+ // Create TypeScript config
92
+ const tsconfig = {
93
+ compilerOptions: {
94
+ target: 'ES2020',
95
+ useDefineForClassFields: true,
96
+ lib: ['ES2020', 'DOM', 'DOM.Iterable'],
97
+ module: 'ESNext',
98
+ skipLibCheck: true,
99
+ moduleResolution: 'bundler',
100
+ allowImportingTsExtensions: true,
101
+ resolveJsonModule: true,
102
+ isolatedModules: true,
103
+ noEmit: true,
104
+ jsx: 'react-jsx',
105
+ strict: true,
106
+ noUnusedLocals: true,
107
+ noUnusedParameters: true,
108
+ noFallthroughCasesInSwitch: true
109
+ },
110
+ include: ['src'],
111
+ references: [{ path: './tsconfig.node.json' }]
112
+ };
113
+ await fs_extra_1.default.writeJSON(path_1.default.join(frontendPath, 'tsconfig.json'), tsconfig, { spaces: 2 });
114
+ const tsconfigNode = {
115
+ compilerOptions: {
116
+ composite: true,
117
+ skipLibCheck: true,
118
+ module: 'ESNext',
119
+ moduleResolution: 'bundler',
120
+ allowSyntheticDefaultImports: true
121
+ },
122
+ include: ['vite.config.ts']
123
+ };
124
+ await fs_extra_1.default.writeJSON(path_1.default.join(frontendPath, 'tsconfig.node.json'), tsconfigNode, { spaces: 2 });
125
+ // Create index.html
126
+ const indexHtml = `<!doctype html>
127
+ <html lang="en">
128
+ <head>
129
+ <meta charset="UTF-8" />
130
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
131
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
132
+ <title>${config.projectName}</title>
133
+ </head>
134
+ <body>
135
+ <div id="root"></div>
136
+ <script type="module" src="/src/main.tsx"></script>
137
+ </body>
138
+ </html>
139
+ `;
140
+ await fs_extra_1.default.writeFile(path_1.default.join(frontendPath, 'index.html'), indexHtml);
141
+ // Create src directory
142
+ const srcPath = path_1.default.join(frontendPath, 'src');
143
+ await fs_extra_1.default.ensureDir(srcPath);
144
+ // Create main.tsx
145
+ const mainTsx = `import React from 'react'
146
+ import ReactDOM from 'react-dom/client'
147
+ import App from './App.tsx'
148
+ import './index.css'
149
+
150
+ ReactDOM.createRoot(document.getElementById('root')!).render(
151
+ <React.StrictMode>
152
+ <App />
153
+ </React.StrictMode>,
154
+ )
155
+ `;
156
+ await fs_extra_1.default.writeFile(path_1.default.join(srcPath, 'main.tsx'), mainTsx);
157
+ // Create App.tsx
158
+ const appTsx = `function App() {
159
+ return (
160
+ <main className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 flex items-center justify-center">
161
+ <div className="bg-white rounded-lg shadow-xl p-8 max-w-md w-full">
162
+ <h1 className="text-4xl font-bold text-gray-800 mb-4">
163
+ Welcome to ${config.projectName}
164
+ </h1>
165
+ <p className="text-gray-600 mb-6">
166
+ Your React application with Tailwind CSS is ready!
167
+ </p>
168
+ <div className="space-y-2">
169
+ <div className="flex items-center text-sm text-gray-500">
170
+ <span className="w-2 h-2 bg-green-500 rounded-full mr-2"></span>
171
+ React 18
172
+ </div>
173
+ <div className="flex items-center text-sm text-gray-500">
174
+ <span className="w-2 h-2 bg-green-500 rounded-full mr-2"></span>
175
+ Vite
176
+ </div>
177
+ <div className="flex items-center text-sm text-gray-500">
178
+ <span className="w-2 h-2 bg-green-500 rounded-full mr-2"></span>
179
+ Tailwind CSS
180
+ </div>
181
+ <div className="flex items-center text-sm text-gray-500">
182
+ <span className="w-2 h-2 bg-green-500 rounded-full mr-2"></span>
183
+ TypeScript
184
+ </div>
185
+ </div>
186
+ </div>
187
+ </main>
188
+ )
189
+ }
190
+
191
+ export default App
192
+ `;
193
+ await fs_extra_1.default.writeFile(path_1.default.join(srcPath, 'App.tsx'), appTsx);
194
+ // Create index.css
195
+ const indexCss = `@tailwind base;
196
+ @tailwind components;
197
+ @tailwind utilities;
198
+ `;
199
+ await fs_extra_1.default.writeFile(path_1.default.join(srcPath, 'index.css'), indexCss);
200
+ // Create test directory and setup
201
+ const testPath = path_1.default.join(srcPath, 'test');
202
+ await fs_extra_1.default.ensureDir(testPath);
203
+ const testSetup = `import '@testing-library/jest-dom'
204
+ `;
205
+ await fs_extra_1.default.writeFile(path_1.default.join(testPath, 'setup.ts'), testSetup);
206
+ // Create example test
207
+ const testExample = `import { describe, it, expect } from 'vitest'
208
+ import { render, screen } from '@testing-library/react'
209
+ import App from '../App'
210
+
211
+ describe('App', () => {
212
+ it('renders welcome message', () => {
213
+ render(<App />)
214
+ expect(screen.getByText(/Welcome to ${config.projectName}/i)).toBeInTheDocument()
215
+ })
216
+ })
217
+ `;
218
+ await fs_extra_1.default.writeFile(path_1.default.join(testPath, 'App.test.tsx'), testExample);
219
+ // Create deployment files
220
+ await generateFrontendDeployment(frontendPath, config);
221
+ }
222
+ async function generateFrontendDeployment(frontendPath, config) {
223
+ // Netlify configuration
224
+ const netlifyToml = `[build]
225
+ command = "npm run build"
226
+ publish = "dist"
227
+
228
+ [[redirects]]
229
+ from = "/*"
230
+ to = "/index.html"
231
+ status = 200
232
+
233
+ [build.environment]
234
+ NODE_VERSION = "20"
235
+ `;
236
+ await fs_extra_1.default.writeFile(path_1.default.join(frontendPath, 'netlify.toml'), netlifyToml);
237
+ // Render configuration
238
+ const renderYaml = `services:
239
+ - type: web
240
+ name: ${config.projectName}-frontend
241
+ env: node
242
+ buildCommand: npm install && npm run build
243
+ staticPublishPath: ./dist
244
+ envVars:
245
+ - key: NODE_ENV
246
+ value: production
247
+ `;
248
+ await fs_extra_1.default.writeFile(path_1.default.join(frontendPath, 'render.yaml'), renderYaml);
249
+ }
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateFrontend = generateFrontend;
7
+ exports.generateBackend = generateBackend;
8
+ exports.generateMonorepoConfig = generateMonorepoConfig;
9
+ exports.generateRootFiles = generateRootFiles;
10
+ const frontend_1 = require("./frontend");
11
+ const express_1 = require("./backend/express");
12
+ const nestjs_1 = require("./backend/nestjs");
13
+ const fastapi_1 = require("./backend/fastapi");
14
+ const cdk_1 = require("./backend/cdk");
15
+ const sam_1 = require("./backend/sam");
16
+ const fs_extra_1 = __importDefault(require("fs-extra"));
17
+ const path_1 = __importDefault(require("path"));
18
+ async function generateFrontend(projectPath, config) {
19
+ const frontendPath = path_1.default.join(projectPath, 'frontend');
20
+ await fs_extra_1.default.ensureDir(frontendPath);
21
+ switch (config.frontend) {
22
+ case 'nextjs':
23
+ await (0, frontend_1.generateNextJS)(frontendPath, config);
24
+ break;
25
+ case 'react':
26
+ await (0, frontend_1.generateReact)(frontendPath, config);
27
+ break;
28
+ case 'html':
29
+ await (0, frontend_1.generateHTML)(frontendPath, config);
30
+ break;
31
+ }
32
+ }
33
+ async function generateBackend(projectPath, config) {
34
+ const backendPath = path_1.default.join(projectPath, 'backend');
35
+ await fs_extra_1.default.ensureDir(backendPath);
36
+ switch (config.backend) {
37
+ case 'express':
38
+ await (0, express_1.generateExpress)(backendPath, config);
39
+ break;
40
+ case 'nest':
41
+ await (0, nestjs_1.generateNestJS)(backendPath, config);
42
+ break;
43
+ case 'fastapi':
44
+ await (0, fastapi_1.generateFastAPI)(backendPath, config);
45
+ break;
46
+ case 'cdk':
47
+ await (0, cdk_1.generateCDK)(backendPath, config);
48
+ break;
49
+ case 'sam':
50
+ await (0, sam_1.generateSAM)(backendPath, config);
51
+ break;
52
+ }
53
+ }
54
+ async function generateMonorepoConfig(projectPath, config) {
55
+ const rootPackageJson = {
56
+ name: config.projectName,
57
+ version: '1.0.0',
58
+ private: true,
59
+ workspaces: ['frontend', 'backend'],
60
+ scripts: {
61
+ dev: 'concurrently "npm run dev --workspace=frontend" "npm run dev --workspace=backend"',
62
+ build: 'npm run build --workspaces',
63
+ install: 'npm install --workspaces'
64
+ },
65
+ devDependencies: {
66
+ concurrently: '^8.2.2'
67
+ }
68
+ };
69
+ await fs_extra_1.default.writeJSON(path_1.default.join(projectPath, 'package.json'), rootPackageJson, { spaces: 2 });
70
+ }
71
+ async function generateRootFiles(projectPath, config) {
72
+ // Generate README
73
+ const readme = `# ${config.projectName}
74
+
75
+ ## Project Structure
76
+
77
+ This is a monorepo project with the following structure:
78
+
79
+ - \`frontend/\` - ${config.frontend === 'nextjs' ? 'Next.js' : config.frontend === 'react' ? 'React' : 'HTML'} application with Tailwind CSS
80
+ - \`backend/\` - ${config.backend === 'express' ? 'Express.js' : config.backend === 'nest' ? 'NestJS' : config.backend === 'fastapi' ? 'FastAPI' : config.backend === 'cdk' ? 'AWS CDK' : 'AWS SAM'} backend
81
+
82
+ ## Getting Started
83
+
84
+ 1. Install dependencies:
85
+ \`\`\`bash
86
+ npm install
87
+ \`\`\`
88
+
89
+ 2. Start development servers:
90
+ \`\`\`bash
91
+ npm run dev
92
+ \`\`\`
93
+
94
+ ## Tech Stack
95
+
96
+ - Frontend: ${config.frontend === 'nextjs' ? 'Next.js' : config.frontend === 'react' ? 'React' : 'HTML'} + Tailwind CSS
97
+ - Backend: ${config.backend === 'express' ? 'Express.js' : config.backend === 'nest' ? 'NestJS' : config.backend === 'fastapi' ? 'FastAPI' : config.backend === 'cdk' ? 'AWS CDK' : 'AWS SAM'}
98
+ - Storage: ${config.storage === 'cdk' ? 'CDK Database' : config.storage === 'local-sqlite' ? 'Local SQLite' : 'External Database'}
99
+ ${config.databaseType ? `- Database: ${config.databaseType === 'sql' ? 'SQL' : 'NoSQL'}` : ''}
100
+ ${config.apiType ? `- API: ${config.apiType === 'rest' ? 'REST' : 'GraphQL'}` : ''}
101
+ `;
102
+ await fs_extra_1.default.writeFile(path_1.default.join(projectPath, 'README.md'), readme);
103
+ // Generate .gitignore
104
+ const gitignore = `node_modules/
105
+ dist/
106
+ build/
107
+ .env
108
+ .env.local
109
+ *.log
110
+ .DS_Store
111
+ .idea/
112
+ .vscode/
113
+ *.pyc
114
+ __pycache__/
115
+ .venv/
116
+ venv/
117
+ cdk.out/
118
+ .sam/
119
+ data/
120
+ *.db
121
+ *.sqlite
122
+ *.sqlite3
123
+ `;
124
+ await fs_extra_1.default.writeFile(path_1.default.join(projectPath, '.gitignore'), gitignore);
125
+ // Generate CI/CD workflows
126
+ await generateCICD(projectPath, config);
127
+ }
128
+ async function generateCICD(projectPath, config) {
129
+ const workflowsPath = path_1.default.join(projectPath, '.github', 'workflows');
130
+ await fs_extra_1.default.ensureDir(workflowsPath);
131
+ // Main CI workflow
132
+ const ciWorkflow = `name: CI
133
+
134
+ on:
135
+ push:
136
+ branches: [ main, develop ]
137
+ pull_request:
138
+ branches: [ main, develop ]
139
+
140
+ jobs:
141
+ test:
142
+ runs-on: ubuntu-latest
143
+
144
+ strategy:
145
+ matrix:
146
+ node-version: [20.x]
147
+
148
+ steps:
149
+ - uses: actions/checkout@v4
150
+
151
+ - name: Use Node.js \${{ matrix.node-version }}
152
+ uses: actions/setup-node@v4
153
+ with:
154
+ node-version: \${{ matrix.node-version }}
155
+ cache: 'npm'
156
+
157
+ - name: Install dependencies
158
+ run: npm ci
159
+
160
+ - name: Run frontend tests
161
+ run: npm run test --workspace=frontend
162
+ continue-on-error: ${config.frontend === 'html' ? 'true' : 'false'}
163
+
164
+ - name: Run backend tests
165
+ run: npm run test --workspace=backend
166
+ continue-on-error: ${config.backend === 'fastapi' || config.backend === 'cdk' || config.backend === 'sam' ? 'true' : 'false'}
167
+
168
+ - name: Build frontend
169
+ run: npm run build --workspace=frontend
170
+ continue-on-error: ${config.frontend === 'html' ? 'true' : 'false'}
171
+
172
+ - name: Build backend
173
+ run: npm run build --workspace=backend
174
+ continue-on-error: ${config.backend === 'fastapi' || config.backend === 'cdk' || config.backend === 'sam' ? 'true' : 'false'}
175
+
176
+ lint:
177
+ runs-on: ubuntu-latest
178
+
179
+ steps:
180
+ - uses: actions/checkout@v4
181
+
182
+ - name: Use Node.js
183
+ uses: actions/setup-node@v4
184
+ with:
185
+ node-version: '20.x'
186
+ cache: 'npm'
187
+
188
+ - name: Install dependencies
189
+ run: npm ci
190
+
191
+ - name: Run linter
192
+ run: npm run lint --workspaces --if-present
193
+ continue-on-error: true
194
+ `;
195
+ await fs_extra_1.default.writeFile(path_1.default.join(workflowsPath, 'ci.yml'), ciWorkflow);
196
+ // Deployment workflow
197
+ let deployWorkflow = `name: Deploy
198
+
199
+ on:
200
+ push:
201
+ branches: [ main ]
202
+ workflow_dispatch:
203
+
204
+ jobs:
205
+ deploy-frontend:
206
+ runs-on: ubuntu-latest
207
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
208
+
209
+ steps:
210
+ - uses: actions/checkout@v4
211
+
212
+ - name: Use Node.js
213
+ uses: actions/setup-node@v4
214
+ with:
215
+ node-version: '20.x'
216
+ cache: 'npm'
217
+
218
+ - name: Install dependencies
219
+ run: npm ci --workspace=frontend
220
+
221
+ - name: Build frontend
222
+ run: npm run build --workspace=frontend
223
+
224
+ - name: Deploy to Netlify
225
+ uses: netlify/actions/cli@master
226
+ env:
227
+ NETLIFY_AUTH_TOKEN: \${{ secrets.NETLIFY_AUTH_TOKEN }}
228
+ NETLIFY_SITE_ID: \${{ secrets.NETLIFY_SITE_ID }}
229
+ with:
230
+ args: deploy --dir=frontend/.next --prod
231
+ continue-on-error: true
232
+
233
+ - name: Deploy to Render
234
+ run: |
235
+ echo "Deploy to Render by connecting your GitHub repository"
236
+ echo "Or use: render deploy --service=\${{ secrets.RENDER_SERVICE_ID }}"
237
+ continue-on-error: true
238
+
239
+ deploy-backend:
240
+ runs-on: ubuntu-latest
241
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
242
+ `;
243
+ // Add backend deployment steps based on backend type
244
+ if (config.backend === 'cdk') {
245
+ deployWorkflow += `
246
+ steps:
247
+ - uses: actions/checkout@v4
248
+
249
+ - name: Use Node.js
250
+ uses: actions/setup-node@v4
251
+ with:
252
+ node-version: '20.x'
253
+ cache: 'npm'
254
+
255
+ - name: Install dependencies
256
+ run: npm ci --workspace=backend
257
+
258
+ - name: Configure AWS credentials
259
+ uses: aws-actions/configure-aws-credentials@v4
260
+ with:
261
+ aws-access-key-id: \${{ secrets.AWS_ACCESS_KEY_ID }}
262
+ aws-secret-access-key: \${{ secrets.AWS_SECRET_ACCESS_KEY }}
263
+ aws-region: \${{ secrets.AWS_REGION || 'us-east-1' }}
264
+
265
+ - name: Build CDK
266
+ run: npm run build --workspace=backend
267
+
268
+ - name: Deploy CDK Stack
269
+ run: |
270
+ cd backend
271
+ npm run cdk deploy -- --require-approval never --all
272
+ `;
273
+ }
274
+ else if (config.backend === 'sam') {
275
+ deployWorkflow += `
276
+ steps:
277
+ - uses: actions/checkout@v4
278
+
279
+ - name: Use Node.js
280
+ uses: actions/setup-node@v4
281
+ with:
282
+ node-version: '20.x'
283
+ cache: 'npm'
284
+
285
+ - name: Install dependencies
286
+ run: npm ci --workspace=backend
287
+
288
+ - name: Setup Python
289
+ uses: actions/setup-python@v5
290
+ with:
291
+ python-version: '3.11'
292
+
293
+ - name: Install SAM CLI
294
+ run: |
295
+ pip install aws-sam-cli
296
+
297
+ - name: Configure AWS credentials
298
+ uses: aws-actions/configure-aws-credentials@v4
299
+ with:
300
+ aws-access-key-id: \${{ secrets.AWS_ACCESS_KEY_ID }}
301
+ aws-secret-access-key: \${{ secrets.AWS_SECRET_ACCESS_KEY }}
302
+ aws-region: \${{ secrets.AWS_REGION || 'us-east-1' }}
303
+
304
+ - name: Build SAM application
305
+ run: |
306
+ cd backend
307
+ sam build
308
+
309
+ - name: Deploy SAM application
310
+ run: |
311
+ cd backend
312
+ sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
313
+ `;
314
+ }
315
+ else {
316
+ deployWorkflow += `
317
+ steps:
318
+ - uses: actions/checkout@v4
319
+
320
+ - name: Use Node.js
321
+ uses: actions/setup-node@v4
322
+ with:
323
+ node-version: '20.x'
324
+ cache: 'npm'
325
+
326
+ - name: Install dependencies
327
+ run: npm ci --workspace=backend
328
+
329
+ - name: Build backend
330
+ run: npm run build --workspace=backend
331
+
332
+ - name: Deploy to Render
333
+ run: |
334
+ echo "Deploy to Render by connecting your GitHub repository"
335
+ echo "Or use: render deploy --service=\${{ secrets.RENDER_SERVICE_ID }}"
336
+ continue-on-error: true
337
+ `;
338
+ }
339
+ deployWorkflow += `\n`;
340
+ await fs_extra_1.default.writeFile(path_1.default.join(workflowsPath, 'deploy.yml'), deployWorkflow);
341
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "projects-init-cli",
3
+ "version": "1.1.0",
4
+ "description": "CLI tool to initialize projects with customizable frontend, backend, and storage options",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "projects-init": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "start": "node dist/index.js",
12
+ "dev": "ts-node src/index.ts",
13
+ "prepublishOnly": "npm run build",
14
+ "prepack": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "cli",
18
+ "scaffold",
19
+ "project-generator",
20
+ "nextjs",
21
+ "react",
22
+ "express",
23
+ "nestjs",
24
+ "fastapi"
25
+ ],
26
+ "author": "",
27
+ "license": "MIT",
28
+ "files": [
29
+ "dist",
30
+ "README.md"
31
+ ],
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/yourusername/projects-init-cli.git"
35
+ },
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "dependencies": {
40
+ "commander": "^11.1.0",
41
+ "inquirer": "^9.2.12",
42
+ "chalk": "^4.1.2",
43
+ "fs-extra": "^11.2.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/inquirer": "^9.0.7",
47
+ "@types/node": "^20.10.6",
48
+ "@types/fs-extra": "^11.0.4",
49
+ "typescript": "^5.3.3",
50
+ "ts-node": "^10.9.2"
51
+ }
52
+ }