nodejs-quickstart-structure 1.19.0 → 1.19.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/CHANGELOG.md +309 -301
- package/LICENSE +15 -15
- package/lib/generator.js +139 -139
- package/lib/modules/app-setup.js +401 -401
- package/lib/modules/config-files.js +151 -151
- package/lib/modules/database-setup.js +116 -116
- package/lib/modules/project-setup.js +32 -32
- package/lib/prompts.js +100 -100
- package/package.json +78 -78
- package/templates/clean-architecture/js/src/domain/models/User.js +9 -9
- package/templates/clean-architecture/js/src/errors/ApiError.js +14 -14
- package/templates/clean-architecture/js/src/index.js.ejs +55 -55
- package/templates/clean-architecture/js/src/infrastructure/config/env.js.ejs +47 -47
- package/templates/clean-architecture/js/src/infrastructure/log/logger.js +36 -36
- package/templates/clean-architecture/js/src/infrastructure/log/logger.spec.js.ejs +63 -63
- package/templates/clean-architecture/js/src/infrastructure/webserver/middleware/errorMiddleware.js +30 -30
- package/templates/clean-architecture/js/src/infrastructure/webserver/server.js.ejs +89 -89
- package/templates/clean-architecture/js/src/infrastructure/webserver/swagger.js.ejs +6 -6
- package/templates/clean-architecture/js/src/interfaces/graphql/context.js.ejs +13 -13
- package/templates/clean-architecture/js/src/interfaces/graphql/context.spec.js.ejs +31 -31
- package/templates/clean-architecture/js/src/interfaces/graphql/index.js.ejs +5 -5
- package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/index.js.ejs +6 -6
- package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/index.js.ejs +6 -6
- package/templates/clean-architecture/js/src/interfaces/routes/api.spec.js.ejs +38 -38
- package/templates/clean-architecture/js/src/usecases/CreateUser.js +14 -14
- package/templates/clean-architecture/js/src/usecases/CreateUser.spec.js.ejs +51 -51
- package/templates/clean-architecture/js/src/usecases/GetAllUsers.js +12 -12
- package/templates/clean-architecture/js/src/usecases/GetAllUsers.spec.js.ejs +61 -61
- package/templates/clean-architecture/js/src/utils/httpCodes.js +9 -9
- package/templates/clean-architecture/ts/src/config/env.ts.ejs +46 -46
- package/templates/clean-architecture/ts/src/config/swagger.ts.ejs +6 -6
- package/templates/clean-architecture/ts/src/domain/user.ts +7 -7
- package/templates/clean-architecture/ts/src/errors/ApiError.ts +15 -15
- package/templates/clean-architecture/ts/src/index.ts.ejs +139 -139
- package/templates/clean-architecture/ts/src/infrastructure/log/logger.spec.ts.ejs +63 -63
- package/templates/clean-architecture/ts/src/infrastructure/log/logger.ts +36 -36
- package/templates/clean-architecture/ts/src/interfaces/graphql/context.spec.ts.ejs +32 -32
- package/templates/clean-architecture/ts/src/interfaces/graphql/context.ts.ejs +17 -17
- package/templates/clean-architecture/ts/src/interfaces/graphql/index.ts.ejs +3 -3
- package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/index.ts.ejs +4 -4
- package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/index.ts.ejs +4 -4
- package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.spec.ts.ejs +40 -40
- package/templates/clean-architecture/ts/src/usecases/createUser.spec.ts.ejs +51 -51
- package/templates/clean-architecture/ts/src/usecases/createUser.ts +13 -13
- package/templates/clean-architecture/ts/src/usecases/getAllUsers.spec.ts.ejs +63 -63
- package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts +10 -10
- package/templates/clean-architecture/ts/src/utils/errorMiddleware.ts.ejs +27 -27
- package/templates/clean-architecture/ts/src/utils/httpCodes.ts +7 -7
- package/templates/common/.cursorrules.ejs +60 -60
- package/templates/common/.dockerignore +12 -12
- package/templates/common/.env.example.ejs +41 -41
- package/templates/common/.gitlab-ci.yml.ejs +86 -86
- package/templates/common/.lintstagedrc +6 -6
- package/templates/common/.prettierrc +7 -7
- package/templates/common/Dockerfile +73 -73
- package/templates/common/Jenkinsfile.ejs +87 -87
- package/templates/common/SECURITY.md +20 -20
- package/templates/common/_github/workflows/ci.yml.ejs +46 -46
- package/templates/common/_github/workflows/security.yml.ejs +36 -36
- package/templates/common/_gitignore +5 -5
- package/templates/common/_husky/pre-commit +4 -4
- package/templates/common/caching/clean/js/CreateUser.js.ejs +29 -29
- package/templates/common/caching/clean/js/GetAllUsers.js.ejs +37 -37
- package/templates/common/caching/clean/ts/createUser.ts.ejs +27 -27
- package/templates/common/caching/clean/ts/getAllUsers.ts.ejs +34 -34
- package/templates/common/caching/js/memoryCache.js.ejs +60 -60
- package/templates/common/caching/js/memoryCache.spec.js.ejs +101 -101
- package/templates/common/caching/js/redisClient.js.ejs +75 -75
- package/templates/common/caching/js/redisClient.spec.js.ejs +147 -147
- package/templates/common/caching/ts/memoryCache.spec.ts.ejs +102 -102
- package/templates/common/caching/ts/redisClient.spec.ts.ejs +157 -157
- package/templates/common/database/js/database.js.ejs +19 -19
- package/templates/common/database/js/database.spec.js.ejs +56 -56
- package/templates/common/database/js/mongoose.js.ejs +33 -33
- package/templates/common/database/js/mongoose.spec.js.ejs +43 -43
- package/templates/common/database/ts/database.spec.ts.ejs +56 -56
- package/templates/common/database/ts/database.ts.ejs +21 -21
- package/templates/common/database/ts/mongoose.spec.ts.ejs +42 -42
- package/templates/common/database/ts/mongoose.ts.ejs +28 -28
- package/templates/common/docker-compose.yml.ejs +159 -159
- package/templates/common/ecosystem.config.js.ejs +40 -40
- package/templates/common/eslint.config.mjs.ejs +77 -77
- package/templates/common/health/js/healthRoute.spec.js.ejs +70 -70
- package/templates/common/health/ts/healthRoute.spec.ts.ejs +76 -76
- package/templates/common/jest.config.js.ejs +32 -32
- package/templates/common/kafka/js/config/kafka.js +9 -9
- package/templates/common/kafka/js/config/kafka.spec.js.ejs +27 -27
- package/templates/common/kafka/js/messaging/baseConsumer.spec.js.ejs +58 -58
- package/templates/common/kafka/js/messaging/userEventSchema.spec.js.ejs +27 -27
- package/templates/common/kafka/js/services/kafkaService.spec.js.ejs +106 -106
- package/templates/common/kafka/ts/config/kafka.spec.ts.ejs +27 -27
- package/templates/common/kafka/ts/config/kafka.ts +7 -7
- package/templates/common/kafka/ts/messaging/baseConsumer.spec.ts.ejs +50 -50
- package/templates/common/kafka/ts/messaging/baseConsumer.ts.ejs +27 -27
- package/templates/common/kafka/ts/services/kafkaService.spec.ts.ejs +81 -81
- package/templates/common/migrate-mongo-config.js.ejs +31 -31
- package/templates/common/migrations/init.js.ejs +23 -23
- package/templates/common/package.json.ejs +119 -118
- package/templates/common/prompts/add-feature.md.ejs +26 -26
- package/templates/common/prompts/project-context.md.ejs +43 -43
- package/templates/common/prompts/troubleshoot.md.ejs +28 -28
- package/templates/common/public/css/style.css +147 -147
- package/templates/common/scripts/run-e2e.js.ejs +63 -63
- package/templates/common/sonar-project.properties.ejs +27 -27
- package/templates/common/src/utils/errorMiddleware.spec.js.ejs +79 -79
- package/templates/common/src/utils/errorMiddleware.spec.ts.ejs +94 -94
- package/templates/common/tsconfig.json +22 -22
- package/templates/common/views/ejs/index.ejs +55 -55
- package/templates/common/views/pug/index.pug +40 -40
- package/templates/mvc/js/src/config/env.js.ejs +46 -46
- package/templates/mvc/js/src/config/swagger.js.ejs +6 -6
- package/templates/mvc/js/src/errors/ApiError.js +14 -14
- package/templates/mvc/js/src/graphql/context.js.ejs +7 -7
- package/templates/mvc/js/src/graphql/context.spec.js.ejs +29 -29
- package/templates/mvc/js/src/graphql/index.js.ejs +5 -5
- package/templates/mvc/js/src/graphql/resolvers/index.js.ejs +6 -6
- package/templates/mvc/js/src/graphql/typeDefs/index.js.ejs +6 -6
- package/templates/mvc/js/src/index.js.ejs +136 -136
- package/templates/mvc/js/src/utils/errorMiddleware.js +29 -29
- package/templates/mvc/js/src/utils/httpCodes.js +9 -9
- package/templates/mvc/js/src/utils/logger.js +40 -40
- package/templates/mvc/js/src/utils/logger.spec.js.ejs +63 -63
- package/templates/mvc/ts/src/config/env.ts.ejs +45 -45
- package/templates/mvc/ts/src/config/swagger.ts.ejs +6 -6
- package/templates/mvc/ts/src/errors/ApiError.ts +15 -15
- package/templates/mvc/ts/src/graphql/context.spec.ts.ejs +30 -30
- package/templates/mvc/ts/src/graphql/context.ts.ejs +12 -12
- package/templates/mvc/ts/src/graphql/index.ts.ejs +3 -3
- package/templates/mvc/ts/src/graphql/resolvers/index.ts.ejs +4 -4
- package/templates/mvc/ts/src/graphql/typeDefs/index.ts.ejs +4 -4
- package/templates/mvc/ts/src/utils/errorMiddleware.ts.ejs +27 -27
- package/templates/mvc/ts/src/utils/httpCodes.ts +7 -7
- package/templates/mvc/ts/src/utils/logger.spec.ts.ejs +63 -63
- package/templates/mvc/ts/src/utils/logger.ts +36 -36
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# Application
|
|
2
|
-
PORT=3000
|
|
3
|
-
NODE_ENV=development
|
|
4
|
-
|
|
5
|
-
<%_ if (database !== 'None') { -%>
|
|
6
|
-
# Database
|
|
7
|
-
<%_ if (database === 'MySQL') { -%>
|
|
8
|
-
DB_HOST=localhost
|
|
9
|
-
DB_PORT=3306
|
|
10
|
-
DB_USER=root
|
|
11
|
-
DB_PASSWORD=root
|
|
12
|
-
DB_NAME=<%= dbName %>
|
|
13
|
-
<%_ } -%>
|
|
14
|
-
<%_ if (database === 'PostgreSQL') { -%>
|
|
15
|
-
DB_HOST=localhost
|
|
16
|
-
DB_PORT=5432
|
|
17
|
-
DB_USER=postgres
|
|
18
|
-
DB_PASSWORD=root
|
|
19
|
-
DB_NAME=<%= dbName %>
|
|
20
|
-
<%_ } -%>
|
|
21
|
-
<%_ if (database === 'MongoDB') { -%>
|
|
22
|
-
DB_HOST=localhost
|
|
23
|
-
DB_PORT=27017
|
|
24
|
-
DB_NAME=<%= dbName %>
|
|
25
|
-
<%_ } -%>
|
|
26
|
-
<%_ } -%>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
<%_ if (communication === 'Kafka') { -%>
|
|
30
|
-
# Communication
|
|
31
|
-
KAFKA_BROKER=localhost:9093
|
|
32
|
-
KAFKA_CLIENT_ID=<%= projectName %>
|
|
33
|
-
KAFKA_GROUP_ID=<%= projectName %>-group
|
|
34
|
-
<%_ } -%>
|
|
35
|
-
|
|
36
|
-
<%_ if (caching === 'Redis') { -%>
|
|
37
|
-
# Caching
|
|
38
|
-
REDIS_HOST=localhost
|
|
39
|
-
REDIS_PORT=6379
|
|
40
|
-
REDIS_PASSWORD=
|
|
41
|
-
<%_ } -%>
|
|
1
|
+
# Application
|
|
2
|
+
PORT=3000
|
|
3
|
+
NODE_ENV=development
|
|
4
|
+
|
|
5
|
+
<%_ if (database !== 'None') { -%>
|
|
6
|
+
# Database
|
|
7
|
+
<%_ if (database === 'MySQL') { -%>
|
|
8
|
+
DB_HOST=localhost
|
|
9
|
+
DB_PORT=3306
|
|
10
|
+
DB_USER=root
|
|
11
|
+
DB_PASSWORD=root
|
|
12
|
+
DB_NAME=<%= dbName %>
|
|
13
|
+
<%_ } -%>
|
|
14
|
+
<%_ if (database === 'PostgreSQL') { -%>
|
|
15
|
+
DB_HOST=localhost
|
|
16
|
+
DB_PORT=5432
|
|
17
|
+
DB_USER=postgres
|
|
18
|
+
DB_PASSWORD=root
|
|
19
|
+
DB_NAME=<%= dbName %>
|
|
20
|
+
<%_ } -%>
|
|
21
|
+
<%_ if (database === 'MongoDB') { -%>
|
|
22
|
+
DB_HOST=localhost
|
|
23
|
+
DB_PORT=27017
|
|
24
|
+
DB_NAME=<%= dbName %>
|
|
25
|
+
<%_ } -%>
|
|
26
|
+
<%_ } -%>
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
<%_ if (communication === 'Kafka') { -%>
|
|
30
|
+
# Communication
|
|
31
|
+
KAFKA_BROKER=localhost:9093
|
|
32
|
+
KAFKA_CLIENT_ID=<%= projectName %>
|
|
33
|
+
KAFKA_GROUP_ID=<%= projectName %>-group
|
|
34
|
+
<%_ } -%>
|
|
35
|
+
|
|
36
|
+
<%_ if (caching === 'Redis') { -%>
|
|
37
|
+
# Caching
|
|
38
|
+
REDIS_HOST=localhost
|
|
39
|
+
REDIS_PORT=6379
|
|
40
|
+
REDIS_PASSWORD=
|
|
41
|
+
<%_ } -%>
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
variables:
|
|
2
|
-
NODE_ENV: 'test'
|
|
3
|
-
|
|
4
|
-
stages:
|
|
5
|
-
- lint
|
|
6
|
-
- test
|
|
7
|
-
<% if (includeSecurity) { %>
|
|
8
|
-
- security
|
|
9
|
-
- quality
|
|
10
|
-
<% } %>
|
|
11
|
-
- build
|
|
12
|
-
|
|
13
|
-
cache:
|
|
14
|
-
paths:
|
|
15
|
-
- node_modules/
|
|
16
|
-
|
|
17
|
-
install_dependencies:
|
|
18
|
-
stage: .pre
|
|
19
|
-
image: node:22-slim
|
|
20
|
-
script:
|
|
21
|
-
- npm ci
|
|
22
|
-
|
|
23
|
-
lint_code:
|
|
24
|
-
stage: lint
|
|
25
|
-
image: node:22-slim
|
|
26
|
-
script:
|
|
27
|
-
- npm run lint
|
|
28
|
-
|
|
29
|
-
run_unit_tests:
|
|
30
|
-
stage: test
|
|
31
|
-
image: node:22-slim
|
|
32
|
-
script:
|
|
33
|
-
- npm run test:coverage
|
|
34
|
-
|
|
35
|
-
run_e2e_tests:
|
|
36
|
-
stage: test
|
|
37
|
-
image: docker:20.10.16
|
|
38
|
-
services:
|
|
39
|
-
- docker:20.10.16-dind
|
|
40
|
-
script:
|
|
41
|
-
- apk add --no-cache nodejs npm docker-compose
|
|
42
|
-
- npm ci
|
|
43
|
-
- npm run test:e2e
|
|
44
|
-
<% if (includeSecurity) { %>
|
|
45
|
-
snyk_scan:
|
|
46
|
-
stage: security
|
|
47
|
-
image: node:22-alpine
|
|
48
|
-
script:
|
|
49
|
-
- npm ci
|
|
50
|
-
- npm run snyk:test
|
|
51
|
-
only:
|
|
52
|
-
- main
|
|
53
|
-
|
|
54
|
-
snyk_container_scan:
|
|
55
|
-
stage: security
|
|
56
|
-
image: docker:20.10.16
|
|
57
|
-
services:
|
|
58
|
-
- docker:20.10.16-dind
|
|
59
|
-
script:
|
|
60
|
-
- apk add --no-cache nodejs npm
|
|
61
|
-
- npm install -g snyk
|
|
62
|
-
- docker build -t <%= projectName %>:latest .
|
|
63
|
-
- snyk container test <%= projectName %>:latest --file=Dockerfile --severity-threshold=high --skip-unused-projects
|
|
64
|
-
|
|
65
|
-
sonarqube_check:
|
|
66
|
-
stage: quality
|
|
67
|
-
image:
|
|
68
|
-
name: sonarsource/sonar-scanner-cli:latest
|
|
69
|
-
entrypoint: [""]
|
|
70
|
-
variables:
|
|
71
|
-
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
|
|
72
|
-
GIT_DEPTH: "0"
|
|
73
|
-
cache:
|
|
74
|
-
key: "${CI_JOB_NAME}"
|
|
75
|
-
paths:
|
|
76
|
-
- .sonar/cache
|
|
77
|
-
script:
|
|
78
|
-
- sonar-scanner
|
|
79
|
-
only:
|
|
80
|
-
- main
|
|
81
|
-
<% } %>
|
|
82
|
-
build_app:
|
|
83
|
-
stage: build
|
|
84
|
-
image: node:22-alpine
|
|
85
|
-
script:
|
|
86
|
-
- npm run build --if-present
|
|
1
|
+
variables:
|
|
2
|
+
NODE_ENV: 'test'
|
|
3
|
+
|
|
4
|
+
stages:
|
|
5
|
+
- lint
|
|
6
|
+
- test
|
|
7
|
+
<% if (includeSecurity) { %>
|
|
8
|
+
- security
|
|
9
|
+
- quality
|
|
10
|
+
<% } %>
|
|
11
|
+
- build
|
|
12
|
+
|
|
13
|
+
cache:
|
|
14
|
+
paths:
|
|
15
|
+
- node_modules/
|
|
16
|
+
|
|
17
|
+
install_dependencies:
|
|
18
|
+
stage: .pre
|
|
19
|
+
image: node:22-slim
|
|
20
|
+
script:
|
|
21
|
+
- npm ci
|
|
22
|
+
|
|
23
|
+
lint_code:
|
|
24
|
+
stage: lint
|
|
25
|
+
image: node:22-slim
|
|
26
|
+
script:
|
|
27
|
+
- npm run lint
|
|
28
|
+
|
|
29
|
+
run_unit_tests:
|
|
30
|
+
stage: test
|
|
31
|
+
image: node:22-slim
|
|
32
|
+
script:
|
|
33
|
+
- npm run test:coverage
|
|
34
|
+
|
|
35
|
+
run_e2e_tests:
|
|
36
|
+
stage: test
|
|
37
|
+
image: docker:20.10.16
|
|
38
|
+
services:
|
|
39
|
+
- docker:20.10.16-dind
|
|
40
|
+
script:
|
|
41
|
+
- apk add --no-cache nodejs npm docker-compose
|
|
42
|
+
- npm ci
|
|
43
|
+
- npm run test:e2e
|
|
44
|
+
<% if (includeSecurity) { %>
|
|
45
|
+
snyk_scan:
|
|
46
|
+
stage: security
|
|
47
|
+
image: node:22-alpine
|
|
48
|
+
script:
|
|
49
|
+
- npm ci
|
|
50
|
+
- npm run snyk:test
|
|
51
|
+
only:
|
|
52
|
+
- main
|
|
53
|
+
|
|
54
|
+
snyk_container_scan:
|
|
55
|
+
stage: security
|
|
56
|
+
image: docker:20.10.16
|
|
57
|
+
services:
|
|
58
|
+
- docker:20.10.16-dind
|
|
59
|
+
script:
|
|
60
|
+
- apk add --no-cache nodejs npm
|
|
61
|
+
- npm install -g snyk
|
|
62
|
+
- docker build -t <%= projectName %>:latest .
|
|
63
|
+
- snyk container test <%= projectName %>:latest --file=Dockerfile --severity-threshold=high --skip-unused-projects
|
|
64
|
+
|
|
65
|
+
sonarqube_check:
|
|
66
|
+
stage: quality
|
|
67
|
+
image:
|
|
68
|
+
name: sonarsource/sonar-scanner-cli:latest
|
|
69
|
+
entrypoint: [""]
|
|
70
|
+
variables:
|
|
71
|
+
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
|
|
72
|
+
GIT_DEPTH: "0"
|
|
73
|
+
cache:
|
|
74
|
+
key: "${CI_JOB_NAME}"
|
|
75
|
+
paths:
|
|
76
|
+
- .sonar/cache
|
|
77
|
+
script:
|
|
78
|
+
- sonar-scanner
|
|
79
|
+
only:
|
|
80
|
+
- main
|
|
81
|
+
<% } %>
|
|
82
|
+
build_app:
|
|
83
|
+
stage: build
|
|
84
|
+
image: node:22-alpine
|
|
85
|
+
script:
|
|
86
|
+
- npm run build --if-present
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
2
|
-
"*.{js,ts}": [
|
|
3
|
-
"eslint --fix",
|
|
4
|
-
"prettier --write"
|
|
5
|
-
]
|
|
6
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"*.{js,ts}": [
|
|
3
|
+
"eslint --fix",
|
|
4
|
+
"prettier --write"
|
|
5
|
+
]
|
|
6
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"semi": true,
|
|
3
|
-
"trailingComma": "all",
|
|
4
|
-
"singleQuote": true,
|
|
5
|
-
"printWidth": 100,
|
|
6
|
-
"tabWidth": 2
|
|
7
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"semi": true,
|
|
3
|
+
"trailingComma": "all",
|
|
4
|
+
"singleQuote": true,
|
|
5
|
+
"printWidth": 100,
|
|
6
|
+
"tabWidth": 2
|
|
7
|
+
}
|
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
# ==========================================
|
|
2
|
-
# Stage 1: Builder
|
|
3
|
-
# ==========================================
|
|
4
|
-
FROM node:22-alpine AS builder
|
|
5
|
-
|
|
6
|
-
# Upgrade OS packages to fix upstream vulnerabilities (Snyk-detected)
|
|
7
|
-
RUN apk update && apk upgrade && \
|
|
8
|
-
apk add --no-cache ca-certificates zlib>=1.3.2-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
|
|
9
|
-
|
|
10
|
-
WORKDIR /app
|
|
11
|
-
ENV NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
12
|
-
|
|
13
|
-
# Upgrade npm using corepack (safer in Alpine)
|
|
14
|
-
RUN corepack enable && corepack prepare npm@11.6.4 --activate
|
|
15
|
-
|
|
16
|
-
COPY package*.json ./
|
|
17
|
-
COPY tsconfig*.json ./
|
|
18
|
-
|
|
19
|
-
# Install ALL dependencies (including devDeps for build)
|
|
20
|
-
RUN npm ci --no-audit --no-fund || npm ci --no-audit --no-fund || npm ci --no-audit --no-fund
|
|
21
|
-
|
|
22
|
-
COPY . .
|
|
23
|
-
|
|
24
|
-
# Build for production
|
|
25
|
-
<% if (language === 'TypeScript') { %>RUN npm run build<% } %>
|
|
26
|
-
|
|
27
|
-
# ==========================================
|
|
28
|
-
# Stage 2: Production
|
|
29
|
-
# ==========================================
|
|
30
|
-
FROM node:22-alpine AS production
|
|
31
|
-
|
|
32
|
-
# Upgrade OS packages to fix upstream vulnerabilities (Snyk-detected)
|
|
33
|
-
RUN apk update && apk upgrade && \
|
|
34
|
-
apk add --no-cache ca-certificates zlib>=1.3.2-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
|
|
35
|
-
|
|
36
|
-
WORKDIR /app
|
|
37
|
-
|
|
38
|
-
ENV NODE_ENV=production
|
|
39
|
-
ENV NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
40
|
-
|
|
41
|
-
# Upgrade npm using corepack (safer in Alpine)
|
|
42
|
-
RUN corepack enable && corepack prepare npm@11.6.4 --activate
|
|
43
|
-
|
|
44
|
-
COPY package*.json ./
|
|
45
|
-
|
|
46
|
-
# Install ONLY production dependencies
|
|
47
|
-
RUN npm ci --only=production --ignore-scripts --no-audit --no-fund || npm ci --only=production --ignore-scripts --no-audit --no-fund || npm ci --only=production --ignore-scripts --no-audit --no-fund
|
|
48
|
-
|
|
49
|
-
# Remove npm and caches to achieve Zero-Vulnerability status in the final image
|
|
50
|
-
RUN rm -rf /usr/local/lib/node_modules/npm /usr/local/bin/npm /usr/local/bin/npx /root/.npm /root/.cache
|
|
51
|
-
|
|
52
|
-
# Copy built artifacts from builder
|
|
53
|
-
<% if (language === 'TypeScript') { %>
|
|
54
|
-
COPY --from=builder /app/dist ./dist
|
|
55
|
-
<% } else { %>
|
|
56
|
-
COPY --from=builder /app/src ./src
|
|
57
|
-
<% } %>
|
|
58
|
-
|
|
59
|
-
# Copy other necessary files (like views if MVC)
|
|
60
|
-
<% if (viewEngine && viewEngine !== 'None') { %>
|
|
61
|
-
COPY --from=builder /app/src/views ./dist/views
|
|
62
|
-
<% if (viewEngine && viewEngine !== 'None') { %>COPY --from=builder /app/public ./public<% } %>
|
|
63
|
-
<% } %>
|
|
64
|
-
|
|
65
|
-
EXPOSE 3000
|
|
66
|
-
|
|
67
|
-
# Create logs directory and give permissions to node user
|
|
68
|
-
RUN mkdir -p logs && chown -R node:node logs
|
|
69
|
-
|
|
70
|
-
USER node
|
|
71
|
-
|
|
72
|
-
# Start application directly with node (safe even without npm)
|
|
73
|
-
CMD ["node", "<% if (language === 'TypeScript') { %>dist/index.js<% } else { %>src/index.js<% } %>"]
|
|
1
|
+
# ==========================================
|
|
2
|
+
# Stage 1: Builder
|
|
3
|
+
# ==========================================
|
|
4
|
+
FROM node:22-alpine AS builder
|
|
5
|
+
|
|
6
|
+
# Upgrade OS packages to fix upstream vulnerabilities (Snyk-detected)
|
|
7
|
+
RUN apk update && apk upgrade && \
|
|
8
|
+
apk add --no-cache ca-certificates zlib>=1.3.2-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
|
|
9
|
+
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
ENV NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
12
|
+
|
|
13
|
+
# Upgrade npm using corepack (safer in Alpine)
|
|
14
|
+
RUN corepack enable && corepack prepare npm@11.6.4 --activate
|
|
15
|
+
|
|
16
|
+
COPY package*.json ./
|
|
17
|
+
COPY tsconfig*.json ./
|
|
18
|
+
|
|
19
|
+
# Install ALL dependencies (including devDeps for build)
|
|
20
|
+
RUN npm ci --no-audit --no-fund || npm ci --no-audit --no-fund || npm ci --no-audit --no-fund
|
|
21
|
+
|
|
22
|
+
COPY . .
|
|
23
|
+
|
|
24
|
+
# Build for production
|
|
25
|
+
<% if (language === 'TypeScript') { %>RUN npm run build<% } %>
|
|
26
|
+
|
|
27
|
+
# ==========================================
|
|
28
|
+
# Stage 2: Production
|
|
29
|
+
# ==========================================
|
|
30
|
+
FROM node:22-alpine AS production
|
|
31
|
+
|
|
32
|
+
# Upgrade OS packages to fix upstream vulnerabilities (Snyk-detected)
|
|
33
|
+
RUN apk update && apk upgrade && \
|
|
34
|
+
apk add --no-cache ca-certificates zlib>=1.3.2-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
|
|
35
|
+
|
|
36
|
+
WORKDIR /app
|
|
37
|
+
|
|
38
|
+
ENV NODE_ENV=production
|
|
39
|
+
ENV NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
40
|
+
|
|
41
|
+
# Upgrade npm using corepack (safer in Alpine)
|
|
42
|
+
RUN corepack enable && corepack prepare npm@11.6.4 --activate
|
|
43
|
+
|
|
44
|
+
COPY package*.json ./
|
|
45
|
+
|
|
46
|
+
# Install ONLY production dependencies
|
|
47
|
+
RUN npm ci --only=production --ignore-scripts --no-audit --no-fund || npm ci --only=production --ignore-scripts --no-audit --no-fund || npm ci --only=production --ignore-scripts --no-audit --no-fund
|
|
48
|
+
|
|
49
|
+
# Remove npm and caches to achieve Zero-Vulnerability status in the final image
|
|
50
|
+
RUN rm -rf /usr/local/lib/node_modules/npm /usr/local/bin/npm /usr/local/bin/npx /root/.npm /root/.cache
|
|
51
|
+
|
|
52
|
+
# Copy built artifacts from builder
|
|
53
|
+
<% if (language === 'TypeScript') { %>
|
|
54
|
+
COPY --from=builder /app/dist ./dist
|
|
55
|
+
<% } else { %>
|
|
56
|
+
COPY --from=builder /app/src ./src
|
|
57
|
+
<% } %>
|
|
58
|
+
|
|
59
|
+
# Copy other necessary files (like views if MVC)
|
|
60
|
+
<% if (viewEngine && viewEngine !== 'None') { %>
|
|
61
|
+
COPY --from=builder /app/src/views ./dist/views
|
|
62
|
+
<% if (viewEngine && viewEngine !== 'None') { %>COPY --from=builder /app/public ./public<% } %>
|
|
63
|
+
<% } %>
|
|
64
|
+
|
|
65
|
+
EXPOSE 3000
|
|
66
|
+
|
|
67
|
+
# Create logs directory and give permissions to node user
|
|
68
|
+
RUN mkdir -p logs && chown -R node:node logs
|
|
69
|
+
|
|
70
|
+
USER node
|
|
71
|
+
|
|
72
|
+
# Start application directly with node (safe even without npm)
|
|
73
|
+
CMD ["node", "<% if (language === 'TypeScript') { %>dist/index.js<% } else { %>src/index.js<% } %>"]
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
pipeline {
|
|
2
|
-
agent any
|
|
3
|
-
|
|
4
|
-
environment {
|
|
5
|
-
CI = 'true'
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
stages {
|
|
9
|
-
stage('Install Dependencies') {
|
|
10
|
-
steps {
|
|
11
|
-
// Use npm ci for clean install if package-lock.json exists, else npm install
|
|
12
|
-
sh 'if [ -f package-lock.json ]; then npm ci; else npm install; fi'
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
stage('Lint') {
|
|
17
|
-
steps {
|
|
18
|
-
sh 'npm run lint'
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
stage('Unit Test') {
|
|
23
|
-
steps {
|
|
24
|
-
sh 'npm run test:coverage'
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
stage('E2E Test') {
|
|
29
|
-
steps {
|
|
30
|
-
sh 'npm run test:e2e'
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
<% if (includeSecurity) { %>
|
|
35
|
-
stage('SonarQube Analysis') {
|
|
36
|
-
environment {
|
|
37
|
-
scannerHome = tool 'SonarScanner'
|
|
38
|
-
}
|
|
39
|
-
steps {
|
|
40
|
-
withSonarQubeEnv('SonarQube') {
|
|
41
|
-
sh "${scannerHome}/bin/sonar-scanner"
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
stage('Security Scan') {
|
|
47
|
-
steps {
|
|
48
|
-
sh 'npm audit --audit-level=high'
|
|
49
|
-
sh 'npm run snyk:test'
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
stage('Snyk Container Scan') {
|
|
54
|
-
steps {
|
|
55
|
-
script {
|
|
56
|
-
sh 'docker build -t <%= projectName %>:latest .'
|
|
57
|
-
sh 'snyk container test <%= projectName %>:latest --file=Dockerfile --severity-threshold=high --skip-unused-projects'
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
<% } %>
|
|
62
|
-
// stage('Docker Build & Push') {
|
|
63
|
-
// steps {
|
|
64
|
-
// script {
|
|
65
|
-
// docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {
|
|
66
|
-
// def appImage = docker.build("my-image:${env.BUILD_ID}")
|
|
67
|
-
// appImage.push()
|
|
68
|
-
// appImage.push("latest")
|
|
69
|
-
// }
|
|
70
|
-
// }
|
|
71
|
-
// }
|
|
72
|
-
// }
|
|
73
|
-
|
|
74
|
-
// stage('Deploy to Staging') {
|
|
75
|
-
// steps {
|
|
76
|
-
// sh './scripts/deploy.sh staging'
|
|
77
|
-
// }
|
|
78
|
-
// }
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
post {
|
|
82
|
-
always {
|
|
83
|
-
// Clean up workspace
|
|
84
|
-
cleanWs()
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
1
|
+
pipeline {
|
|
2
|
+
agent any
|
|
3
|
+
|
|
4
|
+
environment {
|
|
5
|
+
CI = 'true'
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
stages {
|
|
9
|
+
stage('Install Dependencies') {
|
|
10
|
+
steps {
|
|
11
|
+
// Use npm ci for clean install if package-lock.json exists, else npm install
|
|
12
|
+
sh 'if [ -f package-lock.json ]; then npm ci; else npm install; fi'
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
stage('Lint') {
|
|
17
|
+
steps {
|
|
18
|
+
sh 'npm run lint'
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
stage('Unit Test') {
|
|
23
|
+
steps {
|
|
24
|
+
sh 'npm run test:coverage'
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
stage('E2E Test') {
|
|
29
|
+
steps {
|
|
30
|
+
sh 'npm run test:e2e'
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
<% if (includeSecurity) { %>
|
|
35
|
+
stage('SonarQube Analysis') {
|
|
36
|
+
environment {
|
|
37
|
+
scannerHome = tool 'SonarScanner'
|
|
38
|
+
}
|
|
39
|
+
steps {
|
|
40
|
+
withSonarQubeEnv('SonarQube') {
|
|
41
|
+
sh "${scannerHome}/bin/sonar-scanner"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
stage('Security Scan') {
|
|
47
|
+
steps {
|
|
48
|
+
sh 'npm audit --audit-level=high'
|
|
49
|
+
sh 'npm run snyk:test'
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
stage('Snyk Container Scan') {
|
|
54
|
+
steps {
|
|
55
|
+
script {
|
|
56
|
+
sh 'docker build -t <%= projectName %>:latest .'
|
|
57
|
+
sh 'snyk container test <%= projectName %>:latest --file=Dockerfile --severity-threshold=high --skip-unused-projects'
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
<% } %>
|
|
62
|
+
// stage('Docker Build & Push') {
|
|
63
|
+
// steps {
|
|
64
|
+
// script {
|
|
65
|
+
// docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {
|
|
66
|
+
// def appImage = docker.build("my-image:${env.BUILD_ID}")
|
|
67
|
+
// appImage.push()
|
|
68
|
+
// appImage.push("latest")
|
|
69
|
+
// }
|
|
70
|
+
// }
|
|
71
|
+
// }
|
|
72
|
+
// }
|
|
73
|
+
|
|
74
|
+
// stage('Deploy to Staging') {
|
|
75
|
+
// steps {
|
|
76
|
+
// sh './scripts/deploy.sh staging'
|
|
77
|
+
// }
|
|
78
|
+
// }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
post {
|
|
82
|
+
always {
|
|
83
|
+
// Clean up workspace
|
|
84
|
+
cleanWs()
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
## Supported Versions
|
|
4
|
-
|
|
5
|
-
Only the latest `main` branch is supported for security updates.
|
|
6
|
-
|
|
7
|
-
| Version | Supported |
|
|
8
|
-
| ------- | ------------------ |
|
|
9
|
-
| 1.0.x | :white_check_mark: |
|
|
10
|
-
| < 1.0 | :x: |
|
|
11
|
-
|
|
12
|
-
## Reporting a Vulnerability
|
|
13
|
-
|
|
14
|
-
We take the security of this project seriously. If you believe you have found a security vulnerability, please report it following these steps:
|
|
15
|
-
|
|
16
|
-
1. **Do not open a public issue.**
|
|
17
|
-
2. Send an email to the project maintainers (see `package.json`).
|
|
18
|
-
3. Provide a detailed description of the vulnerability, including steps to reproduce.
|
|
19
|
-
|
|
20
|
-
We will acknowledge your report within 48 hours and work on a fix as soon as possible.
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
Only the latest `main` branch is supported for security updates.
|
|
6
|
+
|
|
7
|
+
| Version | Supported |
|
|
8
|
+
| ------- | ------------------ |
|
|
9
|
+
| 1.0.x | :white_check_mark: |
|
|
10
|
+
| < 1.0 | :x: |
|
|
11
|
+
|
|
12
|
+
## Reporting a Vulnerability
|
|
13
|
+
|
|
14
|
+
We take the security of this project seriously. If you believe you have found a security vulnerability, please report it following these steps:
|
|
15
|
+
|
|
16
|
+
1. **Do not open a public issue.**
|
|
17
|
+
2. Send an email to the project maintainers (see `package.json`).
|
|
18
|
+
3. Provide a detailed description of the vulnerability, including steps to reproduce.
|
|
19
|
+
|
|
20
|
+
We will acknowledge your report within 48 hours and work on a fix as soon as possible.
|