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.
- package/.github/PUBLISH.md +58 -0
- package/.github/workflows/publish.yml +78 -0
- package/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/createProject.d.ts +2 -0
- package/dist/createProject.d.ts.map +1 -0
- package/dist/createProject.js +70 -0
- package/dist/createProject.js.map +1 -0
- package/dist/generators/cursorRules.d.ts +2 -0
- package/dist/generators/cursorRules.d.ts.map +1 -0
- package/dist/generators/cursorRules.js +35 -0
- package/dist/generators/cursorRules.js.map +1 -0
- package/dist/generators/docker.d.ts +3 -0
- package/dist/generators/docker.d.ts.map +1 -0
- package/dist/generators/docker.js +119 -0
- package/dist/generators/docker.js.map +1 -0
- package/dist/generators/envExample.d.ts +3 -0
- package/dist/generators/envExample.d.ts.map +1 -0
- package/dist/generators/envExample.js +39 -0
- package/dist/generators/envExample.js.map +1 -0
- package/dist/generators/eslint.d.ts +2 -0
- package/dist/generators/eslint.d.ts.map +1 -0
- package/dist/generators/eslint.js +32 -0
- package/dist/generators/eslint.js.map +1 -0
- package/dist/generators/githubActions.d.ts +3 -0
- package/dist/generators/githubActions.d.ts.map +1 -0
- package/dist/generators/githubActions.js +68 -0
- package/dist/generators/githubActions.js.map +1 -0
- package/dist/generators/gitignore.d.ts +2 -0
- package/dist/generators/gitignore.d.ts.map +1 -0
- package/dist/generators/gitignore.js +50 -0
- package/dist/generators/gitignore.js.map +1 -0
- package/dist/generators/index.d.ts +3 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +34 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/jest.d.ts +2 -0
- package/dist/generators/jest.d.ts.map +1 -0
- package/dist/generators/jest.js +23 -0
- package/dist/generators/jest.js.map +1 -0
- package/dist/generators/packageJson.d.ts +3 -0
- package/dist/generators/packageJson.d.ts.map +1 -0
- package/dist/generators/packageJson.js +80 -0
- package/dist/generators/packageJson.js.map +1 -0
- package/dist/generators/prettier.d.ts +2 -0
- package/dist/generators/prettier.d.ts.map +1 -0
- package/dist/generators/prettier.js +14 -0
- package/dist/generators/prettier.js.map +1 -0
- package/dist/generators/prisma.d.ts +3 -0
- package/dist/generators/prisma.d.ts.map +1 -0
- package/dist/generators/prisma.js +55 -0
- package/dist/generators/prisma.js.map +1 -0
- package/dist/generators/sourceFiles.d.ts +3 -0
- package/dist/generators/sourceFiles.d.ts.map +1 -0
- package/dist/generators/sourceFiles.js +767 -0
- package/dist/generators/sourceFiles.js.map +1 -0
- package/dist/generators/tsconfig.d.ts +2 -0
- package/dist/generators/tsconfig.d.ts.map +1 -0
- package/dist/generators/tsconfig.js +32 -0
- package/dist/generators/tsconfig.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +3 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +56 -0
- package/dist/prompts.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/parseArgs.d.ts +2 -0
- package/dist/utils/parseArgs.d.ts.map +1 -0
- package/dist/utils/parseArgs.js +6 -0
- package/dist/utils/parseArgs.js.map +1 -0
- package/package.json +46 -0
- package/src/createProject.ts +86 -0
- package/src/generators/cursorRules.ts +39 -0
- package/src/generators/docker.ts +131 -0
- package/src/generators/envExample.ts +49 -0
- package/src/generators/eslint.ts +38 -0
- package/src/generators/githubActions.ts +79 -0
- package/src/generators/gitignore.ts +52 -0
- package/src/generators/index.ts +45 -0
- package/src/generators/jest.ts +29 -0
- package/src/generators/packageJson.ts +89 -0
- package/src/generators/prettier.ts +22 -0
- package/src/generators/prisma.ts +66 -0
- package/src/generators/sourceFiles.ts +840 -0
- package/src/generators/tsconfig.ts +34 -0
- package/src/index.ts +45 -0
- package/src/prompts.ts +62 -0
- package/src/types.ts +11 -0
- package/src/utils/parseArgs.ts +6 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ProjectConfig } from '../types.js';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
export async function generateGitHubActions(
|
|
6
|
+
projectPath: string,
|
|
7
|
+
config: ProjectConfig
|
|
8
|
+
): Promise<void> {
|
|
9
|
+
const workflowsDir = path.join(
|
|
10
|
+
projectPath,
|
|
11
|
+
'.github',
|
|
12
|
+
'workflows'
|
|
13
|
+
);
|
|
14
|
+
await fs.ensureDir(workflowsDir);
|
|
15
|
+
|
|
16
|
+
const ciYml = `name: CI
|
|
17
|
+
|
|
18
|
+
on:
|
|
19
|
+
push:
|
|
20
|
+
branches: [main, develop]
|
|
21
|
+
pull_request:
|
|
22
|
+
branches: [main, develop]
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
test:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
|
|
28
|
+
services:
|
|
29
|
+
${config.database === 'postgresql' ? ` postgres:
|
|
30
|
+
image: postgres:16
|
|
31
|
+
env:
|
|
32
|
+
POSTGRES_USER: user
|
|
33
|
+
POSTGRES_PASSWORD: password
|
|
34
|
+
POSTGRES_DB: testdb
|
|
35
|
+
options: >-
|
|
36
|
+
--health-cmd pg_isready
|
|
37
|
+
--health-interval 10s
|
|
38
|
+
--health-timeout 5s
|
|
39
|
+
--health-retries 5
|
|
40
|
+
ports:
|
|
41
|
+
- 5432:5432` : config.database === 'mysql' ? ` mysql:
|
|
42
|
+
image: mysql:8
|
|
43
|
+
env:
|
|
44
|
+
MYSQL_ROOT_PASSWORD: rootpassword
|
|
45
|
+
MYSQL_DATABASE: testdb
|
|
46
|
+
options: >-
|
|
47
|
+
--health-cmd="mysqladmin ping"
|
|
48
|
+
--health-interval=10s
|
|
49
|
+
--health-timeout=5s
|
|
50
|
+
--health-retries=5
|
|
51
|
+
ports:
|
|
52
|
+
- 3306:3306` : ''}
|
|
53
|
+
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v4
|
|
56
|
+
|
|
57
|
+
- uses: actions/setup-node@v4
|
|
58
|
+
with:
|
|
59
|
+
node-version: '20'
|
|
60
|
+
cache: '${config.packageManager}'
|
|
61
|
+
|
|
62
|
+
- name: Install dependencies
|
|
63
|
+
run: ${config.packageManager} install
|
|
64
|
+
|
|
65
|
+
- name: Run linter
|
|
66
|
+
run: ${config.packageManager} run lint
|
|
67
|
+
|
|
68
|
+
- name: Run tests
|
|
69
|
+
run: ${config.packageManager} run test
|
|
70
|
+
env:
|
|
71
|
+
DATABASE_URL: ${config.database === 'postgresql' ? '"postgresql://user:password@localhost:5432/testdb"' : config.database === 'mysql' ? '"mysql://root:rootpassword@localhost:3306/testdb"' : '"file:./test.db"'}
|
|
72
|
+
|
|
73
|
+
- name: Build
|
|
74
|
+
run: ${config.packageManager} run build
|
|
75
|
+
`;
|
|
76
|
+
|
|
77
|
+
await fs.writeFile(path.join(workflowsDir, 'ci.yml'), ciYml);
|
|
78
|
+
}
|
|
79
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
export async function generateGitIgnore(projectPath: string): Promise<void> {
|
|
5
|
+
const gitignore = `# Dependencies
|
|
6
|
+
node_modules/
|
|
7
|
+
.pnp
|
|
8
|
+
.pnp.js
|
|
9
|
+
|
|
10
|
+
# Testing
|
|
11
|
+
coverage/
|
|
12
|
+
.nyc_output
|
|
13
|
+
|
|
14
|
+
# Production
|
|
15
|
+
dist/
|
|
16
|
+
build/
|
|
17
|
+
|
|
18
|
+
# Environment variables
|
|
19
|
+
.env
|
|
20
|
+
.env.local
|
|
21
|
+
.env.*.local
|
|
22
|
+
|
|
23
|
+
# Logs
|
|
24
|
+
logs/
|
|
25
|
+
*.log
|
|
26
|
+
npm-debug.log*
|
|
27
|
+
yarn-debug.log*
|
|
28
|
+
yarn-error.log*
|
|
29
|
+
pnpm-debug.log*
|
|
30
|
+
|
|
31
|
+
# IDE
|
|
32
|
+
.vscode/
|
|
33
|
+
.idea/
|
|
34
|
+
*.swp
|
|
35
|
+
*.swo
|
|
36
|
+
*~
|
|
37
|
+
|
|
38
|
+
# OS
|
|
39
|
+
.DS_Store
|
|
40
|
+
Thumbs.db
|
|
41
|
+
|
|
42
|
+
# Prisma
|
|
43
|
+
*.db
|
|
44
|
+
*.db-journal
|
|
45
|
+
|
|
46
|
+
# TypeScript
|
|
47
|
+
*.tsbuildinfo
|
|
48
|
+
`;
|
|
49
|
+
|
|
50
|
+
await fs.writeFile(path.join(projectPath, '.gitignore'), gitignore);
|
|
51
|
+
}
|
|
52
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ProjectConfig } from '../types.js';
|
|
2
|
+
import { generatePackageJson } from './packageJson.js';
|
|
3
|
+
import { generateTsConfig } from './tsconfig.js';
|
|
4
|
+
import { generateEnvExample } from './envExample.js';
|
|
5
|
+
import { generateGitIgnore } from './gitignore.js';
|
|
6
|
+
import { generateEslintConfig } from './eslint.js';
|
|
7
|
+
import { generatePrettierConfig } from './prettier.js';
|
|
8
|
+
import { generateJestConfig } from './jest.js';
|
|
9
|
+
import { generateDockerFiles } from './docker.js';
|
|
10
|
+
import { generatePrismaSchema } from './prisma.js';
|
|
11
|
+
import { generateSourceFiles } from './sourceFiles.js';
|
|
12
|
+
import { generateGitHubActions } from './githubActions.js';
|
|
13
|
+
import { generateCursorRules } from './cursorRules.js';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import fs from 'fs-extra';
|
|
16
|
+
|
|
17
|
+
export async function generateProjectFiles(
|
|
18
|
+
projectPath: string,
|
|
19
|
+
config: ProjectConfig
|
|
20
|
+
): Promise<void> {
|
|
21
|
+
// Root files
|
|
22
|
+
await generatePackageJson(projectPath, config);
|
|
23
|
+
await generateTsConfig(projectPath);
|
|
24
|
+
await generateEnvExample(projectPath, config);
|
|
25
|
+
await generateGitIgnore(projectPath);
|
|
26
|
+
await generateEslintConfig(projectPath);
|
|
27
|
+
await generatePrettierConfig(projectPath);
|
|
28
|
+
await generateJestConfig(projectPath);
|
|
29
|
+
await generateCursorRules(projectPath);
|
|
30
|
+
|
|
31
|
+
// Docker
|
|
32
|
+
if (config.includeDocker) {
|
|
33
|
+
await generateDockerFiles(projectPath, config);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Prisma
|
|
37
|
+
await generatePrismaSchema(projectPath, config);
|
|
38
|
+
|
|
39
|
+
// Source files
|
|
40
|
+
await generateSourceFiles(projectPath, config);
|
|
41
|
+
|
|
42
|
+
// GitHub Actions
|
|
43
|
+
await generateGitHubActions(projectPath, config);
|
|
44
|
+
}
|
|
45
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
export async function generateJestConfig(projectPath: string): Promise<void> {
|
|
5
|
+
const jestConfig = {
|
|
6
|
+
preset: 'ts-jest',
|
|
7
|
+
testEnvironment: 'node',
|
|
8
|
+
roots: ['<rootDir>/tests'],
|
|
9
|
+
testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
|
|
10
|
+
transform: {
|
|
11
|
+
'^.+\\.ts$': 'ts-jest',
|
|
12
|
+
},
|
|
13
|
+
collectCoverageFrom: [
|
|
14
|
+
'src/**/*.ts',
|
|
15
|
+
'!src/**/*.d.ts',
|
|
16
|
+
'!src/index.ts',
|
|
17
|
+
],
|
|
18
|
+
moduleNameMapper: {
|
|
19
|
+
'^@/(.*)$': '<rootDir>/src/$1',
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
await fs.writeJSON(
|
|
24
|
+
path.join(projectPath, 'jest.config.js'),
|
|
25
|
+
jestConfig,
|
|
26
|
+
{ spaces: 2 }
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ProjectConfig } from '../types.js';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
export async function generatePackageJson(
|
|
6
|
+
projectPath: string,
|
|
7
|
+
config: ProjectConfig
|
|
8
|
+
): Promise<void> {
|
|
9
|
+
const dependencies: Record<string, string> = {
|
|
10
|
+
express: '^4.18.2',
|
|
11
|
+
'express-rate-limit': '^7.1.5',
|
|
12
|
+
cors: '^2.8.5',
|
|
13
|
+
helmet: '^7.1.0',
|
|
14
|
+
compression: '^1.7.4',
|
|
15
|
+
dotenv: '^16.4.1',
|
|
16
|
+
zod: '^3.22.4',
|
|
17
|
+
winston: '^3.11.0',
|
|
18
|
+
'@prisma/client': '^5.9.1',
|
|
19
|
+
'swagger-jsdoc': '^6.2.8',
|
|
20
|
+
'swagger-ui-express': '^5.0.0',
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
if (config.includeAuth) {
|
|
24
|
+
dependencies['jsonwebtoken'] = '^9.0.2';
|
|
25
|
+
dependencies['bcrypt'] = '^5.1.1';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const devDependencies: Record<string, string> = {
|
|
29
|
+
'@types/express': '^4.17.21',
|
|
30
|
+
'@types/cors': '^2.8.17',
|
|
31
|
+
'@types/compression': '^1.7.5',
|
|
32
|
+
'@types/node': '^20.11.5',
|
|
33
|
+
'@types/jsonwebtoken': '^9.0.5',
|
|
34
|
+
'@types/bcrypt': '^5.0.2',
|
|
35
|
+
'@types/swagger-jsdoc': '^6.0.4',
|
|
36
|
+
'@types/swagger-ui-express': '^4.1.6',
|
|
37
|
+
'@types/jest': '^29.5.11',
|
|
38
|
+
'@types/supertest': '^6.0.2',
|
|
39
|
+
'@typescript-eslint/eslint-plugin': '^6.19.1',
|
|
40
|
+
'@typescript-eslint/parser': '^6.19.1',
|
|
41
|
+
eslint: '^8.56.0',
|
|
42
|
+
prettier: '^3.2.4',
|
|
43
|
+
'ts-jest': '^29.1.2',
|
|
44
|
+
jest: '^29.7.0',
|
|
45
|
+
supertest: '^6.3.4',
|
|
46
|
+
tsx: '^4.7.1',
|
|
47
|
+
typescript: '^5.3.3',
|
|
48
|
+
prisma: '^5.9.1',
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const packageJson = {
|
|
52
|
+
name: config.projectName,
|
|
53
|
+
version: '1.0.0',
|
|
54
|
+
description: 'Production-ready backend API',
|
|
55
|
+
main: 'dist/index.js',
|
|
56
|
+
scripts: {
|
|
57
|
+
dev: 'tsx watch src/index.ts',
|
|
58
|
+
build: 'tsc',
|
|
59
|
+
start: 'node dist/index.js',
|
|
60
|
+
lint: 'eslint src --ext .ts',
|
|
61
|
+
'lint:fix': 'eslint src --ext .ts --fix',
|
|
62
|
+
format: 'prettier --write "src/**/*.ts"',
|
|
63
|
+
test: 'jest',
|
|
64
|
+
'test:watch': 'jest --watch',
|
|
65
|
+
'test:coverage': 'jest --coverage',
|
|
66
|
+
'db:push': 'prisma db push',
|
|
67
|
+
'db:migrate': 'prisma migrate dev',
|
|
68
|
+
'db:studio': 'prisma studio',
|
|
69
|
+
'db:generate': 'prisma generate',
|
|
70
|
+
...(config.includeDocker && {
|
|
71
|
+
'docker:up': 'docker-compose up -d',
|
|
72
|
+
'docker:down': 'docker-compose down',
|
|
73
|
+
}),
|
|
74
|
+
},
|
|
75
|
+
keywords: ['backend', 'api', 'express', 'typescript'],
|
|
76
|
+
author: '',
|
|
77
|
+
license: 'MIT',
|
|
78
|
+
dependencies,
|
|
79
|
+
devDependencies,
|
|
80
|
+
engines: {
|
|
81
|
+
node: '>=20.0.0',
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
await fs.writeJSON(path.join(projectPath, 'package.json'), packageJson, {
|
|
86
|
+
spaces: 2,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
export async function generatePrettierConfig(
|
|
5
|
+
projectPath: string
|
|
6
|
+
): Promise<void> {
|
|
7
|
+
const prettierConfig = {
|
|
8
|
+
semi: true,
|
|
9
|
+
trailingComma: 'es5' as const,
|
|
10
|
+
singleQuote: true,
|
|
11
|
+
printWidth: 80,
|
|
12
|
+
tabWidth: 2,
|
|
13
|
+
useTabs: false,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
await fs.writeJSON(
|
|
17
|
+
path.join(projectPath, '.prettierrc'),
|
|
18
|
+
prettierConfig,
|
|
19
|
+
{ spaces: 2 }
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ProjectConfig } from '../types.js';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
export async function generatePrismaSchema(
|
|
6
|
+
projectPath: string,
|
|
7
|
+
config: ProjectConfig
|
|
8
|
+
): Promise<void> {
|
|
9
|
+
const prismaDir = path.join(projectPath, 'prisma');
|
|
10
|
+
await fs.ensureDir(prismaDir);
|
|
11
|
+
|
|
12
|
+
let provider = '';
|
|
13
|
+
let url = '';
|
|
14
|
+
|
|
15
|
+
switch (config.database) {
|
|
16
|
+
case 'postgresql':
|
|
17
|
+
provider = 'postgresql';
|
|
18
|
+
url = 'env("DATABASE_URL")';
|
|
19
|
+
break;
|
|
20
|
+
case 'mysql':
|
|
21
|
+
provider = 'mysql';
|
|
22
|
+
url = 'env("DATABASE_URL")';
|
|
23
|
+
break;
|
|
24
|
+
case 'mongodb':
|
|
25
|
+
provider = 'mongodb';
|
|
26
|
+
url = 'env("DATABASE_URL")';
|
|
27
|
+
break;
|
|
28
|
+
case 'sqlite':
|
|
29
|
+
provider = 'sqlite';
|
|
30
|
+
url = 'env("DATABASE_URL")';
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let schema = `// This is your Prisma schema file,
|
|
35
|
+
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
36
|
+
|
|
37
|
+
generator client {
|
|
38
|
+
provider = "prisma-client-js"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
datasource db {
|
|
42
|
+
provider = "${provider}"
|
|
43
|
+
url = ${url}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
model User {
|
|
47
|
+
id String @id @default(cuid())
|
|
48
|
+
email String @unique
|
|
49
|
+
name String?
|
|
50
|
+
createdAt DateTime @default(now())
|
|
51
|
+
updatedAt DateTime @updatedAt
|
|
52
|
+
`;
|
|
53
|
+
|
|
54
|
+
if (config.includeAuth) {
|
|
55
|
+
schema += ` password String
|
|
56
|
+
`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
schema += `
|
|
60
|
+
@@map("users")
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
await fs.writeFile(path.join(prismaDir, 'schema.prisma'), schema);
|
|
65
|
+
}
|
|
66
|
+
|