create-backlist 7.3.1 → 9.0.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.
Files changed (46) hide show
  1. package/bin/index.js +901 -471
  2. package/bin/qa.js +191 -0
  3. package/package.json +27 -18
  4. package/src/ai-agent.js +581 -124
  5. package/src/analyzer.js +628 -528
  6. package/src/env-resolver.js +70 -70
  7. package/src/generators/dotnet.js +134 -134
  8. package/src/generators/java.js +248 -248
  9. package/src/generators/js.js +345 -345
  10. package/src/generators/nestjs.js +277 -277
  11. package/src/generators/python.js +86 -86
  12. package/src/project-detector.js +131 -131
  13. package/src/qa/qa-engine.js +1187 -0
  14. package/src/templates/dotnet/partials/Dockerfile.ejs +27 -27
  15. package/src/templates/dotnet/partials/docker-compose.yml.ejs +33 -33
  16. package/src/templates/js-express/base/server.js +59 -59
  17. package/src/templates/js-express/partials/Dockerfile.ejs +12 -12
  18. package/src/templates/js-express/partials/auth.controller.js.ejs +66 -66
  19. package/src/templates/js-express/partials/auth.middleware.js.ejs +19 -19
  20. package/src/templates/js-express/partials/auth.routes.js.ejs +9 -9
  21. package/src/templates/js-express/partials/controller.js.ejs +53 -53
  22. package/src/templates/js-express/partials/db.js.ejs +19 -19
  23. package/src/templates/js-express/partials/docker-compose.yml.ejs +46 -46
  24. package/src/templates/js-express/partials/model.js.ejs +18 -18
  25. package/src/templates/js-express/partials/package.json.ejs +17 -17
  26. package/src/templates/js-express/partials/prisma.schema.ejs +21 -21
  27. package/src/templates/js-express/partials/routes.js.ejs +19 -19
  28. package/src/templates/js-express/partials/seeder.js.ejs +103 -103
  29. package/src/templates/js-express/partials/service.js.ejs +51 -51
  30. package/src/templates/js-express/partials/swagger.js.ejs +30 -30
  31. package/src/templates/js-express/partials/test.js.ejs +46 -46
  32. package/src/templates/nestjs/base/app.module.ts +9 -9
  33. package/src/templates/nestjs/base/main.ts +23 -23
  34. package/src/templates/nestjs/base/tsconfig.json +21 -21
  35. package/src/templates/nestjs/partials/auth.controller.ts.ejs +17 -17
  36. package/src/templates/nestjs/partials/auth.module.ts.ejs +17 -17
  37. package/src/templates/nestjs/partials/auth.service.ts.ejs +70 -70
  38. package/src/templates/nestjs/partials/controller.ts.ejs +34 -34
  39. package/src/templates/nestjs/partials/create-dto.ts.ejs +22 -22
  40. package/src/templates/nestjs/partials/jwt-guard.ts.ejs +24 -24
  41. package/src/templates/nestjs/partials/module.ts.ejs +10 -10
  42. package/src/templates/nestjs/partials/package.json.ejs +27 -27
  43. package/src/templates/nestjs/partials/prisma.service.ts.ejs +13 -13
  44. package/src/templates/nestjs/partials/schema.ts.ejs +19 -19
  45. package/src/templates/nestjs/partials/service.ts.ejs +67 -67
  46. package/src/templates/nestjs/partials/update-dto.ts.ejs +4 -4
@@ -1,46 +1,46 @@
1
- version: '3.8'
2
-
3
- services:
4
- app:
5
- build: .
6
- container_name: <%= projectName %>-app
7
- ports:
8
- - '<%= port %>:<%= port %>'
9
- env_file:
10
- - .env
11
- depends_on:
12
- <% if (dbType === 'mongoose') { %>
13
- - mongo
14
- <% } else { %>
15
- - postgres
16
- <% } %>
17
- restart: unless-stopped
18
-
19
- <% if (dbType === 'mongoose') { %>
20
- mongo:
21
- image: mongo:7
22
- container_name: <%= projectName %>-mongo
23
- ports:
24
- - '27017:27017'
25
- volumes:
26
- - mongo_data:/data/db
27
- <% } else { %>
28
- postgres:
29
- image: postgres:16-alpine
30
- container_name: <%= projectName %>-postgres
31
- ports:
32
- - '5432:5432'
33
- environment:
34
- POSTGRES_USER: user
35
- POSTGRES_PASSWORD: password
36
- POSTGRES_DB: <%= projectName %>
37
- volumes:
38
- - pg_data:/var/lib/postgresql/data
39
- <% } %>
40
-
41
- volumes:
42
- <% if (dbType === 'mongoose') { %>
43
- mongo_data:
44
- <% } else { %>
45
- pg_data:
46
- <% } %>
1
+ version: '3.8'
2
+
3
+ services:
4
+ app:
5
+ build: .
6
+ container_name: <%= projectName %>-app
7
+ ports:
8
+ - '<%= port %>:<%= port %>'
9
+ env_file:
10
+ - .env
11
+ depends_on:
12
+ <% if (dbType === 'mongoose') { %>
13
+ - mongo
14
+ <% } else { %>
15
+ - postgres
16
+ <% } %>
17
+ restart: unless-stopped
18
+
19
+ <% if (dbType === 'mongoose') { %>
20
+ mongo:
21
+ image: mongo:7
22
+ container_name: <%= projectName %>-mongo
23
+ ports:
24
+ - '27017:27017'
25
+ volumes:
26
+ - mongo_data:/data/db
27
+ <% } else { %>
28
+ postgres:
29
+ image: postgres:16-alpine
30
+ container_name: <%= projectName %>-postgres
31
+ ports:
32
+ - '5432:5432'
33
+ environment:
34
+ POSTGRES_USER: user
35
+ POSTGRES_PASSWORD: password
36
+ POSTGRES_DB: <%= projectName %>
37
+ volumes:
38
+ - pg_data:/var/lib/postgresql/data
39
+ <% } %>
40
+
41
+ volumes:
42
+ <% if (dbType === 'mongoose') { %>
43
+ mongo_data:
44
+ <% } else { %>
45
+ pg_data:
46
+ <% } %>
@@ -1,18 +1,18 @@
1
- import mongoose from 'mongoose';
2
-
3
- const <%= modelName %>Schema = new mongoose.Schema({
4
- <% fields.forEach((field, i) => { -%>
5
- <%= field.name %>: {
6
- type: <%= field.type %>,
7
- <% if (field.isUnique) { -%>
8
- unique: true,
9
- <% } -%>
10
- <% if (field.name === 'email') { -%>
11
- lowercase: true,
12
- trim: true,
13
- <% } -%>
14
- },
15
- <% }); -%>
16
- }, { timestamps: true });
17
-
18
- export default mongoose.model('<%= modelName %>', <%= modelName %>Schema);
1
+ import mongoose from 'mongoose';
2
+
3
+ const <%= modelName %>Schema = new mongoose.Schema({
4
+ <% fields.forEach((field, i) => { -%>
5
+ <%= field.name %>: {
6
+ type: <%= field.type %>,
7
+ <% if (field.isUnique) { -%>
8
+ unique: true,
9
+ <% } -%>
10
+ <% if (field.name === 'email') { -%>
11
+ lowercase: true,
12
+ trim: true,
13
+ <% } -%>
14
+ },
15
+ <% }); -%>
16
+ }, { timestamps: true });
17
+
18
+ export default mongoose.model('<%= modelName %>', <%= modelName %>Schema);
@@ -1,17 +1,17 @@
1
- <%= JSON.stringify({
2
- name: projectName,
3
- version: "1.0.0",
4
- type: "module",
5
- scripts: {
6
- start: "node src/server.js",
7
- dev: "node --watch src/server.js"
8
- },
9
- dependencies: {
10
- express: "^4.18.2",
11
- cors: "^2.8.5",
12
- dotenv: "^16.3.1",
13
- helmet: "^7.1.0",
14
- morgan: "^1.10.0"
15
- },
16
- devDependencies: {}
17
- }, null, 2) %>
1
+ <%= JSON.stringify({
2
+ name: projectName,
3
+ version: "1.0.0",
4
+ type: "module",
5
+ scripts: {
6
+ start: "node src/server.js",
7
+ dev: "node --watch src/server.js"
8
+ },
9
+ dependencies: {
10
+ express: "^4.18.2",
11
+ cors: "^2.8.5",
12
+ dotenv: "^16.3.1",
13
+ helmet: "^7.1.0",
14
+ morgan: "^1.10.0"
15
+ },
16
+ devDependencies: {}
17
+ }, null, 2) %>
@@ -1,21 +1,21 @@
1
- generator client {
2
- provider = "prisma-client-js"
3
- }
4
-
5
- datasource db {
6
- provider = "postgresql"
7
- url = env("DATABASE_URL")
8
- }
9
-
10
- <% models.forEach(model => { %>
11
- model <%= model.name %> {
12
- id String @id @default(cuid())
13
- <% model.fields.forEach(field => { %>
14
- <% const prismaType = field.type === 'Number' ? 'Int' : field.type === 'Boolean' ? 'Boolean' : 'String'; %>
15
- <%= field.name.padEnd(10) %> <%= prismaType %><%= field.isUnique ? ' @unique' : '' %>
16
- <% }); %>
17
- createdAt DateTime @default(now())
18
- updatedAt DateTime @updatedAt
19
- }
20
-
21
- <% }); %>
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ url = env("DATABASE_URL")
8
+ }
9
+
10
+ <% models.forEach(model => { %>
11
+ model <%= model.name %> {
12
+ id String @id @default(cuid())
13
+ <% model.fields.forEach(field => { %>
14
+ <% const prismaType = field.type === 'Number' ? 'Int' : field.type === 'Boolean' ? 'Boolean' : 'String'; %>
15
+ <%= field.name.padEnd(10) %> <%= prismaType %><%= field.isUnique ? ' @unique' : '' %>
16
+ <% }); %>
17
+ createdAt DateTime @default(now())
18
+ updatedAt DateTime @updatedAt
19
+ }
20
+
21
+ <% }); %>
@@ -1,19 +1,19 @@
1
- import { Router } from 'express';
2
- <% endpoints.forEach(ep => { %>
3
- import { <%= ep.controllerName %>Controller } from '../controllers/<%= ep.controllerName %>.controller.js';
4
- <% }); %>
5
-
6
- const router = Router();
7
-
8
- <% const grouped = {}; endpoints.forEach(ep => { if (!grouped[ep.controllerName]) grouped[ep.controllerName] = []; grouped[ep.controllerName].push(ep); }); %>
9
- <% Object.entries(grouped).forEach(([ctrl, eps]) => { %>
10
- // --- <%= ctrl %> routes ---
11
- <% eps.forEach(ep => {
12
- const method = ep.method.toLowerCase();
13
- const routePath = ep.route.replace(/^\/api/, '');
14
- %>
15
- router.<%= method %>('<%= routePath %>', <%= ctrl %>Controller.<%= ep.functionName %>);
16
- <% }); %>
17
- <% }); %>
18
-
19
- export default router;
1
+ import { Router } from 'express';
2
+ <% endpoints.forEach(ep => { %>
3
+ import { <%= ep.controllerName %>Controller } from '../controllers/<%= ep.controllerName %>.controller.js';
4
+ <% }); %>
5
+
6
+ const router = Router();
7
+
8
+ <% const grouped = {}; endpoints.forEach(ep => { if (!grouped[ep.controllerName]) grouped[ep.controllerName] = []; grouped[ep.controllerName].push(ep); }); %>
9
+ <% Object.entries(grouped).forEach(([ctrl, eps]) => { %>
10
+ // --- <%= ctrl %> routes ---
11
+ <% eps.forEach(ep => {
12
+ const method = ep.method.toLowerCase();
13
+ const routePath = ep.route.replace(/^\/api/, '');
14
+ %>
15
+ router.<%= method %>('<%= routePath %>', <%= ctrl %>Controller.<%= ep.functionName %>);
16
+ <% }); %>
17
+ <% }); %>
18
+
19
+ export default router;
@@ -1,103 +1,103 @@
1
- import { faker } from '@faker-js/faker';
2
- <% if (dbType === 'mongoose') { %>
3
- import mongoose from 'mongoose';
4
- <% models.forEach(m => { %>
5
- import <%= m.name %> from '../src/models/<%= m.name %>.model.js';
6
- <% }); %>
7
-
8
- const MONGO_URI = process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/<%= projectName %>';
9
-
10
- async function seed() {
11
- await mongoose.connect(MONGO_URI);
12
- console.log('Connected to MongoDB for seeding...');
13
-
14
- <% models.forEach(m => { %>
15
- await <%= m.name %>.deleteMany({});
16
- const <%= m.name.toLowerCase() %>Data = Array.from({ length: 10 }, () => ({
17
- <% m.fields.forEach(f => { %>
18
- <% if (f.name === 'email') { %>
19
- email: faker.internet.email(),
20
- <% } else if (f.name === 'name') { %>
21
- name: faker.person.fullName(),
22
- <% } else if (f.name === 'password') { %>
23
- password: faker.internet.password(),
24
- <% } else if (f.type === 'Number') { %>
25
- <%= f.name %>: faker.number.int({ min: 1, max: 1000 }),
26
- <% } else if (f.type === 'Boolean') { %>
27
- <%= f.name %>: faker.datatype.boolean(),
28
- <% } else { %>
29
- <%= f.name %>: faker.lorem.word(),
30
- <% } %>
31
- <% }); %>
32
- }));
33
- await <%= m.name %>.insertMany(<%= m.name.toLowerCase() %>Data);
34
- console.log('<%= m.name %>: seeded 10 records');
35
- <% }); %>
36
-
37
- await mongoose.disconnect();
38
- console.log('Seeding complete.');
39
- }
40
- <% } else { %>
41
- import { prisma } from '../src/db.js';
42
-
43
- async function seed() {
44
- console.log('Seeding database...');
45
-
46
- <% models.forEach(m => { %>
47
- await prisma.<%= m.name.charAt(0).toLowerCase() + m.name.slice(1) %>.deleteMany({});
48
- for (let i = 0; i < 10; i++) {
49
- await prisma.<%= m.name.charAt(0).toLowerCase() + m.name.slice(1) %>.create({
50
- data: {
51
- <% m.fields.forEach(f => { %>
52
- <% if (f.name === 'email') { %>
53
- email: faker.internet.email(),
54
- <% } else if (f.name === 'name') { %>
55
- name: faker.person.fullName(),
56
- <% } else if (f.name === 'password') { %>
57
- password: faker.internet.password(),
58
- <% } else if (f.type === 'Number' || f.type === 'Int') { %>
59
- <%= f.name %>: faker.number.int({ min: 1, max: 1000 }),
60
- <% } else if (f.type === 'Boolean') { %>
61
- <%= f.name %>: faker.datatype.boolean(),
62
- <% } else { %>
63
- <%= f.name %>: faker.lorem.word(),
64
- <% } %>
65
- <% }); %>
66
- },
67
- });
68
- }
69
- console.log('<%= m.name %>: seeded 10 records');
70
- <% }); %>
71
-
72
- await prisma.$disconnect();
73
- console.log('Seeding complete.');
74
- }
75
- <% } %>
76
-
77
- const isDestroy = process.argv.includes('-d');
78
-
79
- if (isDestroy) {
80
- <% if (dbType === 'mongoose') { %>
81
- import('mongoose').then(async (m) => {
82
- await m.default.connect(process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/<%= projectName %>');
83
- <% models.forEach(m => { %>
84
- await <%= m.name %>.deleteMany({});
85
- <% }); %>
86
- await m.default.disconnect();
87
- console.log('All data destroyed.');
88
- });
89
- <% } else { %>
90
- (async () => {
91
- <% models.forEach(m => { %>
92
- await prisma.<%= m.name.charAt(0).toLowerCase() + m.name.slice(1) %>.deleteMany({});
93
- <% }); %>
94
- await prisma.$disconnect();
95
- console.log('All data destroyed.');
96
- })();
97
- <% } %>
98
- } else {
99
- seed().catch(err => {
100
- console.error(err);
101
- process.exit(1);
102
- });
103
- }
1
+ import { faker } from '@faker-js/faker';
2
+ <% if (dbType === 'mongoose') { %>
3
+ import mongoose from 'mongoose';
4
+ <% models.forEach(m => { %>
5
+ import <%= m.name %> from '../src/models/<%= m.name %>.model.js';
6
+ <% }); %>
7
+
8
+ const MONGO_URI = process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/<%= projectName %>';
9
+
10
+ async function seed() {
11
+ await mongoose.connect(MONGO_URI);
12
+ console.log('Connected to MongoDB for seeding...');
13
+
14
+ <% models.forEach(m => { %>
15
+ await <%= m.name %>.deleteMany({});
16
+ const <%= m.name.toLowerCase() %>Data = Array.from({ length: 10 }, () => ({
17
+ <% m.fields.forEach(f => { %>
18
+ <% if (f.name === 'email') { %>
19
+ email: faker.internet.email(),
20
+ <% } else if (f.name === 'name') { %>
21
+ name: faker.person.fullName(),
22
+ <% } else if (f.name === 'password') { %>
23
+ password: faker.internet.password(),
24
+ <% } else if (f.type === 'Number') { %>
25
+ <%= f.name %>: faker.number.int({ min: 1, max: 1000 }),
26
+ <% } else if (f.type === 'Boolean') { %>
27
+ <%= f.name %>: faker.datatype.boolean(),
28
+ <% } else { %>
29
+ <%= f.name %>: faker.lorem.word(),
30
+ <% } %>
31
+ <% }); %>
32
+ }));
33
+ await <%= m.name %>.insertMany(<%= m.name.toLowerCase() %>Data);
34
+ console.log('<%= m.name %>: seeded 10 records');
35
+ <% }); %>
36
+
37
+ await mongoose.disconnect();
38
+ console.log('Seeding complete.');
39
+ }
40
+ <% } else { %>
41
+ import { prisma } from '../src/db.js';
42
+
43
+ async function seed() {
44
+ console.log('Seeding database...');
45
+
46
+ <% models.forEach(m => { %>
47
+ await prisma.<%= m.name.charAt(0).toLowerCase() + m.name.slice(1) %>.deleteMany({});
48
+ for (let i = 0; i < 10; i++) {
49
+ await prisma.<%= m.name.charAt(0).toLowerCase() + m.name.slice(1) %>.create({
50
+ data: {
51
+ <% m.fields.forEach(f => { %>
52
+ <% if (f.name === 'email') { %>
53
+ email: faker.internet.email(),
54
+ <% } else if (f.name === 'name') { %>
55
+ name: faker.person.fullName(),
56
+ <% } else if (f.name === 'password') { %>
57
+ password: faker.internet.password(),
58
+ <% } else if (f.type === 'Number' || f.type === 'Int') { %>
59
+ <%= f.name %>: faker.number.int({ min: 1, max: 1000 }),
60
+ <% } else if (f.type === 'Boolean') { %>
61
+ <%= f.name %>: faker.datatype.boolean(),
62
+ <% } else { %>
63
+ <%= f.name %>: faker.lorem.word(),
64
+ <% } %>
65
+ <% }); %>
66
+ },
67
+ });
68
+ }
69
+ console.log('<%= m.name %>: seeded 10 records');
70
+ <% }); %>
71
+
72
+ await prisma.$disconnect();
73
+ console.log('Seeding complete.');
74
+ }
75
+ <% } %>
76
+
77
+ const isDestroy = process.argv.includes('-d');
78
+
79
+ if (isDestroy) {
80
+ <% if (dbType === 'mongoose') { %>
81
+ import('mongoose').then(async (m) => {
82
+ await m.default.connect(process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/<%= projectName %>');
83
+ <% models.forEach(m => { %>
84
+ await <%= m.name %>.deleteMany({});
85
+ <% }); %>
86
+ await m.default.disconnect();
87
+ console.log('All data destroyed.');
88
+ });
89
+ <% } else { %>
90
+ (async () => {
91
+ <% models.forEach(m => { %>
92
+ await prisma.<%= m.name.charAt(0).toLowerCase() + m.name.slice(1) %>.deleteMany({});
93
+ <% }); %>
94
+ await prisma.$disconnect();
95
+ console.log('All data destroyed.');
96
+ })();
97
+ <% } %>
98
+ } else {
99
+ seed().catch(err => {
100
+ console.error(err);
101
+ process.exit(1);
102
+ });
103
+ }
@@ -1,51 +1,51 @@
1
- <% if (dbType === 'mongoose') { %>
2
- import <%= modelName %> from '../models/<%= modelName %>.model.js';
3
-
4
- export class <%= modelName %>Service {
5
-
6
- static async getAll() {
7
- return <%= modelName %>.find();
8
- }
9
-
10
- static async getById(id) {
11
- return <%= modelName %>.findById(id);
12
- }
13
-
14
- static async create(data) {
15
- return <%= modelName %>.create(data);
16
- }
17
-
18
- static async update(id, data) {
19
- return <%= modelName %>.findByIdAndUpdate(id, data, { new: true, runValidators: true });
20
- }
21
-
22
- static async delete(id) {
23
- return <%= modelName %>.findByIdAndDelete(id);
24
- }
25
- }
26
- <% } else { %>
27
- import { prisma } from '../db.js';
28
-
29
- export class <%= modelName %>Service {
30
-
31
- static async getAll() {
32
- return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.findMany();
33
- }
34
-
35
- static async getById(id) {
36
- return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.findUnique({ where: { id } });
37
- }
38
-
39
- static async create(data) {
40
- return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.create({ data });
41
- }
42
-
43
- static async update(id, data) {
44
- return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.update({ where: { id }, data });
45
- }
46
-
47
- static async delete(id) {
48
- return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.delete({ where: { id } });
49
- }
50
- }
51
- <% } %>
1
+ <% if (dbType === 'mongoose') { %>
2
+ import <%= modelName %> from '../models/<%= modelName %>.model.js';
3
+
4
+ export class <%= modelName %>Service {
5
+
6
+ static async getAll() {
7
+ return <%= modelName %>.find();
8
+ }
9
+
10
+ static async getById(id) {
11
+ return <%= modelName %>.findById(id);
12
+ }
13
+
14
+ static async create(data) {
15
+ return <%= modelName %>.create(data);
16
+ }
17
+
18
+ static async update(id, data) {
19
+ return <%= modelName %>.findByIdAndUpdate(id, data, { new: true, runValidators: true });
20
+ }
21
+
22
+ static async delete(id) {
23
+ return <%= modelName %>.findByIdAndDelete(id);
24
+ }
25
+ }
26
+ <% } else { %>
27
+ import { prisma } from '../db.js';
28
+
29
+ export class <%= modelName %>Service {
30
+
31
+ static async getAll() {
32
+ return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.findMany();
33
+ }
34
+
35
+ static async getById(id) {
36
+ return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.findUnique({ where: { id } });
37
+ }
38
+
39
+ static async create(data) {
40
+ return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.create({ data });
41
+ }
42
+
43
+ static async update(id, data) {
44
+ return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.update({ where: { id }, data });
45
+ }
46
+
47
+ static async delete(id) {
48
+ return prisma.<%= modelName.charAt(0).toLowerCase() + modelName.slice(1) %>.delete({ where: { id } });
49
+ }
50
+ }
51
+ <% } %>
@@ -1,30 +1,30 @@
1
- import swaggerJsdoc from 'swagger-jsdoc';
2
- import swaggerUi from 'swagger-ui-express';
3
-
4
- const options = {
5
- definition: {
6
- openapi: '3.0.0',
7
- info: {
8
- title: '<%= projectName %> API',
9
- version: '1.0.0',
10
- description: 'Auto-generated API documentation by create-backlist',
11
- },
12
- servers: [{ url: `http://localhost:${process.env.PORT || <%= port %>}` }],
13
- <% if (addAuth) { %>
14
- components: {
15
- securitySchemes: {
16
- bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
17
- },
18
- },
19
- security: [{ bearerAuth: [] }],
20
- <% } %>
21
- },
22
- apis: ['./src/routes*.js', './src/controllers/**/*.js'],
23
- };
24
-
25
- const swaggerSpec = swaggerJsdoc(options);
26
-
27
- export function setupSwagger(app) {
28
- app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
29
- console.log(`Swagger docs available at /api-docs`);
30
- }
1
+ import swaggerJsdoc from 'swagger-jsdoc';
2
+ import swaggerUi from 'swagger-ui-express';
3
+
4
+ const options = {
5
+ definition: {
6
+ openapi: '3.0.0',
7
+ info: {
8
+ title: '<%= projectName %> API',
9
+ version: '1.0.0',
10
+ description: 'Auto-generated API documentation by create-backlist',
11
+ },
12
+ servers: [{ url: `http://localhost:${process.env.PORT || <%= port %>}` }],
13
+ <% if (addAuth) { %>
14
+ components: {
15
+ securitySchemes: {
16
+ bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
17
+ },
18
+ },
19
+ security: [{ bearerAuth: [] }],
20
+ <% } %>
21
+ },
22
+ apis: ['./src/routes*.js', './src/controllers/**/*.js'],
23
+ };
24
+
25
+ const swaggerSpec = swaggerJsdoc(options);
26
+
27
+ export function setupSwagger(app) {
28
+ app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
29
+ console.log(`Swagger docs available at /api-docs`);
30
+ }