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,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
+