@ackee/create-node-app 1.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.
- package/.eslintrc.cjs +10 -0
- package/AUTHORS +3 -0
- package/LICENSE.txt +22 -0
- package/README.md +39 -0
- package/bin/create-node-app.js +6 -0
- package/lib/Bootstrap.js +79 -0
- package/lib/Bootstrap.js.map +1 -0
- package/lib/Logger.js +12 -0
- package/lib/Logger.js.map +1 -0
- package/lib/Npm.js +33 -0
- package/lib/Npm.js.map +1 -0
- package/lib/PackageJson.js +39 -0
- package/lib/PackageJson.js.map +1 -0
- package/lib/Starter.js +2 -0
- package/lib/Starter.js.map +1 -0
- package/lib/Toolbelt.js +102 -0
- package/lib/Toolbelt.js.map +1 -0
- package/lib/cloudrun/CloudRunStarter.js +126 -0
- package/lib/cloudrun/CloudRunStarter.js.map +1 -0
- package/lib/cloudrun-graphql/GraphQLStarter.js +118 -0
- package/lib/cloudrun-graphql/GraphQLStarter.js.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/logo.png +0 -0
- package/package.json +42 -0
- package/prettier.config.cjs +1 -0
- package/src/Bootstrap.ts +99 -0
- package/src/Logger.ts +11 -0
- package/src/Npm.ts +38 -0
- package/src/PackageJson.ts +47 -0
- package/src/Starter.ts +7 -0
- package/src/Toolbelt.ts +132 -0
- package/src/cloudrun/CloudRunStarter.ts +181 -0
- package/src/cloudrun-graphql/GraphQLStarter.ts +182 -0
- package/src/types.ts +1 -0
- package/starter/cloudrun/.env.jsonc +10 -0
- package/starter/cloudrun/.eslint.tsconfig.json +4 -0
- package/starter/cloudrun/.eslintrc.cjs +8 -0
- package/starter/cloudrun/README.md +69 -0
- package/starter/cloudrun/src/adapters/pino.logger.ts +44 -0
- package/starter/cloudrun/src/config.ts +22 -0
- package/starter/cloudrun/src/container.ts +18 -0
- package/starter/cloudrun/src/context.ts +39 -0
- package/starter/cloudrun/src/domain/errors/codes.ts +9 -0
- package/starter/cloudrun/src/domain/errors/errors.ts +25 -0
- package/starter/cloudrun/src/domain/health-check.service.ts +15 -0
- package/starter/cloudrun/src/domain/ports/logger.d.ts +21 -0
- package/starter/cloudrun/src/index.ts +17 -0
- package/starter/cloudrun/src/test/health-check.test.ts +25 -0
- package/starter/cloudrun/src/test/util/openapi-test.util.ts +71 -0
- package/starter/cloudrun/src/view/cli/README.md +17 -0
- package/starter/cloudrun/src/view/cli/cli.ts +94 -0
- package/starter/cloudrun/src/view/cli/openapi/generate.ts +64 -0
- package/starter/cloudrun/src/view/rest/controller/health-check.controller.ts +33 -0
- package/starter/cloudrun/src/view/rest/middleware/context-middleware.ts +28 -0
- package/starter/cloudrun/src/view/rest/middleware/error-handler.ts +60 -0
- package/starter/cloudrun/src/view/rest/middleware/request-logger.ts +37 -0
- package/starter/cloudrun/src/view/rest/request.d.ts +9 -0
- package/starter/cloudrun/src/view/rest/routes.ts +15 -0
- package/starter/cloudrun/src/view/rest/spec/openapi.yml +65 -0
- package/starter/cloudrun/src/view/rest/util/openapi.util.ts +310 -0
- package/starter/cloudrun/src/view/server.ts +25 -0
- package/starter/cloudrun-graphql/.env.jsonc +12 -0
- package/starter/cloudrun-graphql/.eslint.tsconfig.json +4 -0
- package/starter/cloudrun-graphql/.eslintrc.cjs +43 -0
- package/starter/cloudrun-graphql/README.md +53 -0
- package/starter/cloudrun-graphql/codegen.yml +11 -0
- package/starter/cloudrun-graphql/src/adapters/pino.logger.ts +44 -0
- package/starter/cloudrun-graphql/src/config.ts +21 -0
- package/starter/cloudrun-graphql/src/container.ts +15 -0
- package/starter/cloudrun-graphql/src/context.ts +39 -0
- package/starter/cloudrun-graphql/src/domain/errors/codes.ts +9 -0
- package/starter/cloudrun-graphql/src/domain/errors/errors.ts +25 -0
- package/starter/cloudrun-graphql/src/domain/ports/logger.d.ts +21 -0
- package/starter/cloudrun-graphql/src/index.ts +11 -0
- package/starter/cloudrun-graphql/src/test/helloWorld.test.ts +23 -0
- package/starter/cloudrun-graphql/src/view/controller.ts +42 -0
- package/starter/cloudrun-graphql/src/view/graphql/resolvers/greeting.resolver.ts +5 -0
- package/starter/cloudrun-graphql/src/view/graphql/resolvers.ts +6 -0
- package/starter/cloudrun-graphql/src/view/graphql/schema/schema.graphql +6 -0
- package/starter/cloudrun-graphql/src/view/graphql/schema.ts +7 -0
- package/starter/cloudrun-graphql/src/view/server.ts +45 -0
- package/starter/shared/.dockerignore +19 -0
- package/starter/shared/.gitignore_ +5 -0
- package/starter/shared/.gitlab-ci.yml +199 -0
- package/starter/shared/.mocha-junit-config.json +6 -0
- package/starter/shared/.mocharc.json +8 -0
- package/starter/shared/.nvmrc +1 -0
- package/starter/shared/Dockerfile +40 -0
- package/starter/shared/ci-branch-config/common.env +7 -0
- package/starter/shared/ci-branch-config/development.env +7 -0
- package/starter/shared/ci-branch-config/master.env +7 -0
- package/starter/shared/ci-branch-config/stage.env +7 -0
- package/starter/shared/docker-compose/docker-compose-entrypoint.sh +7 -0
- package/starter/shared/docker-compose/docker-compose.ci.yml +19 -0
- package/starter/shared/docker-compose/docker-compose.local.yml +5 -0
- package/starter/shared/docker-compose/docker-compose.override.yml +5 -0
- package/starter/shared/docker-compose/docker-compose.yml +8 -0
- package/starter/shared/jest.config.js +12 -0
- package/starter/shared/prettier.config.cjs +1 -0
- package/starter/shared/src/test/setup.ts +1 -0
- package/starter/shared/tsconfig.json +22 -0
- package/tsconfig.json +19 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import express from 'express'
|
|
2
|
+
import { Handler, RequestHandler } from 'express'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* pipeMiddleware takes multiple middlewares and creates and merges them into
|
|
6
|
+
* one using express Router.
|
|
7
|
+
*/
|
|
8
|
+
export const pipeMiddleware = (...middlewares: RequestHandler[]) => {
|
|
9
|
+
const router = express.Router({ mergeParams: true })
|
|
10
|
+
middlewares.forEach(m => router.use(m))
|
|
11
|
+
return router
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const asyncHandler =
|
|
15
|
+
(controllerHandler: Handler): Handler =>
|
|
16
|
+
async (req, res, next) => {
|
|
17
|
+
try {
|
|
18
|
+
await controllerHandler(req, res, next)
|
|
19
|
+
} catch (err) {
|
|
20
|
+
next(err)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* ctrl is a scoped object for controller functions
|
|
26
|
+
*/
|
|
27
|
+
export const ctrl = {
|
|
28
|
+
json: pipeMiddleware(
|
|
29
|
+
express.json(),
|
|
30
|
+
// Monkeypatch res.json to assign the body to res.out first in order
|
|
31
|
+
// to log it by pino
|
|
32
|
+
(_req, res, next) => {
|
|
33
|
+
const resJson = res.json.bind(res)
|
|
34
|
+
res.json = (body?: any) => {
|
|
35
|
+
;(res as any).out = body
|
|
36
|
+
return resJson(body)
|
|
37
|
+
}
|
|
38
|
+
next()
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
asyncHandler,
|
|
42
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ApolloServer } from '@apollo/server'
|
|
2
|
+
import { makeExecutableSchema } from '@graphql-tools/schema'
|
|
3
|
+
import { resolvers } from './graphql/resolvers.js'
|
|
4
|
+
import { config } from '../config.js'
|
|
5
|
+
import { schema } from './graphql/schema.js'
|
|
6
|
+
import express from 'express'
|
|
7
|
+
import { ctrl } from './controller.js'
|
|
8
|
+
import { expressMiddleware } from '@as-integrations/express5'
|
|
9
|
+
import { Container } from '../container.js'
|
|
10
|
+
|
|
11
|
+
export const clientSchema = makeExecutableSchema({
|
|
12
|
+
typeDefs: schema,
|
|
13
|
+
resolvers,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
export const createAppServer = () => {
|
|
17
|
+
const app = express()
|
|
18
|
+
app.disable('x-powered-by')
|
|
19
|
+
|
|
20
|
+
const server = new ApolloServer({
|
|
21
|
+
schema: clientSchema,
|
|
22
|
+
includeStacktraceInErrorResponses: config.server.allowResponseErrors,
|
|
23
|
+
introspection: config.server.enableIntrospection,
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
return { app, server }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function startServer({
|
|
30
|
+
app,
|
|
31
|
+
server,
|
|
32
|
+
container,
|
|
33
|
+
}: ReturnType<typeof createAppServer> & { container: Container }) {
|
|
34
|
+
const { logger } = container
|
|
35
|
+
|
|
36
|
+
await server.start()
|
|
37
|
+
|
|
38
|
+
app.use('/api/graphql', ctrl.json, expressMiddleware(server))
|
|
39
|
+
|
|
40
|
+
app.listen({ port: config.server.port }, () =>
|
|
41
|
+
logger.info({}, `Server started, port=${config.server.port}`)
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
return { app, server }
|
|
45
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
.editorconfig
|
|
2
|
+
.git
|
|
3
|
+
.gitignore
|
|
4
|
+
.gitlab
|
|
5
|
+
.gitlab-ci.yml
|
|
6
|
+
.huskyrc.json
|
|
7
|
+
.npm
|
|
8
|
+
Dockerfile
|
|
9
|
+
LICENSE
|
|
10
|
+
README.md
|
|
11
|
+
ci-branch-config
|
|
12
|
+
commitlint.config.js
|
|
13
|
+
dist
|
|
14
|
+
docker-compose
|
|
15
|
+
docs
|
|
16
|
+
docs-output
|
|
17
|
+
helm
|
|
18
|
+
node_modules
|
|
19
|
+
prettier.config.js
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
variables:
|
|
2
|
+
# Default configuration, check .export_variables job for calculated env variables based on branch config
|
|
3
|
+
|
|
4
|
+
# Node image for pipeline runner
|
|
5
|
+
NODE_BASE_IMAGE: node:24.5.0
|
|
6
|
+
# Where to store json secrets from Cloud provider
|
|
7
|
+
SECRETS_PATH: '/config/secrets.json'
|
|
8
|
+
|
|
9
|
+
## GCP configuration ##
|
|
10
|
+
# Where to temporary store Google service account
|
|
11
|
+
GCP_SA_KEY_JSON_PATH: /tmp/key.json
|
|
12
|
+
|
|
13
|
+
## Docker artifact registry configuration ##
|
|
14
|
+
# Project name for docker compose CI job runs
|
|
15
|
+
DOCKER_COMPOSE_PROJECT_NAME: $CI_PROJECT_NAME-job-$CI_JOB_ID
|
|
16
|
+
# Build docker version tag
|
|
17
|
+
DOCKER_IMAGE_TAG: $CI_COMMIT_SHORT_SHA
|
|
18
|
+
|
|
19
|
+
default:
|
|
20
|
+
image: ackee/gitlab-builder
|
|
21
|
+
before_script:
|
|
22
|
+
- echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc
|
|
23
|
+
- echo "//${CI_SERVER_HOST}/api/v4/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc;
|
|
24
|
+
|
|
25
|
+
cache: &docker_cache
|
|
26
|
+
key: "$CI_COMMIT_REF_NAME"
|
|
27
|
+
paths:
|
|
28
|
+
- app_image*.tar
|
|
29
|
+
policy: pull
|
|
30
|
+
|
|
31
|
+
stages:
|
|
32
|
+
- build
|
|
33
|
+
- test
|
|
34
|
+
- deploy
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# HELPERS
|
|
38
|
+
##
|
|
39
|
+
# Before script extension that exports ci-branch-config environment variables and stores the GCP service
|
|
40
|
+
# account on the disk to be used by another jobs in the CI. This should be extended by every job that uses
|
|
41
|
+
# any of the branch configuration, docker image or CI SA
|
|
42
|
+
.export_variables:
|
|
43
|
+
before_script:
|
|
44
|
+
- source ci-branch-config/common.env
|
|
45
|
+
- |
|
|
46
|
+
if [ -f "ci-branch-config/${CI_COMMIT_REF_NAME}.env" ]; then
|
|
47
|
+
source ci-branch-config/${CI_COMMIT_REF_NAME}.env
|
|
48
|
+
fi
|
|
49
|
+
- export DOCKER_REGISTRY_URL="$GCP_REGION-docker.pkg.dev"
|
|
50
|
+
- export DOCKER_IMAGE_NAME="$DOCKER_REGISTRY_URL/$GCP_PROJECT_ID/${GCP_PROJECT_ID}-docker/$CI_PROJECT_NAME"
|
|
51
|
+
- export DOCKER_IMAGE_BUILDER_NAME="$DOCKER_IMAGE_NAME-builder"
|
|
52
|
+
- echo "$GCP_SA_KEY" | base64 -d > "$GCP_SA_KEY_JSON_PATH"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# Fetches built docker builder image from remote storage or cache
|
|
56
|
+
.fetch_build_image: &fetch_build_image
|
|
57
|
+
- |
|
|
58
|
+
if ! docker inspect --type=image "$DOCKER_IMAGE_BUILDER_NAME:$DOCKER_IMAGE_TAG" >/dev/null; then
|
|
59
|
+
docker load -i app_image_builder.tar
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
# BUILD STAGE
|
|
64
|
+
##
|
|
65
|
+
# Builds the builder docker image that can be used for running jobs using the CI docker dependencies and
|
|
66
|
+
# configuration (tests, lint, audit, ...)
|
|
67
|
+
build image:
|
|
68
|
+
stage: build
|
|
69
|
+
interruptible: true
|
|
70
|
+
extends: .export_variables
|
|
71
|
+
script:
|
|
72
|
+
- |
|
|
73
|
+
echo "app_image*" >> .dockerignore
|
|
74
|
+
docker build --target builder \
|
|
75
|
+
-t "$DOCKER_IMAGE_BUILDER_NAME:$DOCKER_IMAGE_TAG" .
|
|
76
|
+
- docker save "$DOCKER_IMAGE_BUILDER_NAME:$DOCKER_IMAGE_TAG" > app_image_builder.tar
|
|
77
|
+
cache:
|
|
78
|
+
<<: *docker_cache
|
|
79
|
+
policy: push
|
|
80
|
+
when: on_success
|
|
81
|
+
|
|
82
|
+
##
|
|
83
|
+
# TEST STAGE
|
|
84
|
+
##
|
|
85
|
+
# Performs npm ci-lint script in builder image.
|
|
86
|
+
# Make sure the ci-lint outputs json file "output/checkstyle-result.json" that reports the result of the linter
|
|
87
|
+
lint:
|
|
88
|
+
stage: test
|
|
89
|
+
interruptible: true
|
|
90
|
+
extends: .export_variables
|
|
91
|
+
script:
|
|
92
|
+
- if [ "$SKIP_LINT" == "true" ]; then warn "Lint skipped."; exit 0; fi
|
|
93
|
+
- *fetch_build_image
|
|
94
|
+
- cd "$CI_PROJECT_DIR/docker-compose"
|
|
95
|
+
- |
|
|
96
|
+
DOCKER_IMAGE_NAME="$DOCKER_IMAGE_BUILDER_NAME" docker-compose -p "$DOCKER_COMPOSE_PROJECT_NAME" \
|
|
97
|
+
-f docker-compose.yml -f docker-compose.ci.yml \
|
|
98
|
+
run --rm --no-deps app npm run ci-lint
|
|
99
|
+
needs:
|
|
100
|
+
- build image
|
|
101
|
+
artifacts:
|
|
102
|
+
reports:
|
|
103
|
+
codequality: output/checkstyle-result.json
|
|
104
|
+
|
|
105
|
+
# Npm audit run inside of builder image
|
|
106
|
+
npm audit:
|
|
107
|
+
stage: test
|
|
108
|
+
interruptible: true
|
|
109
|
+
extends: .export_variables
|
|
110
|
+
script:
|
|
111
|
+
- if [ "$SKIP_AUDIT" == "true" ]; then warn "Audit skipped."; exit 0; fi
|
|
112
|
+
- *fetch_build_image
|
|
113
|
+
- cd "$CI_PROJECT_DIR/docker-compose"
|
|
114
|
+
- |
|
|
115
|
+
DOCKER_IMAGE_NAME="$DOCKER_IMAGE_BUILDER_NAME" docker-compose -p "$DOCKER_COMPOSE_PROJECT_NAME" \
|
|
116
|
+
-f docker-compose.yml -f docker-compose.ci.yml \
|
|
117
|
+
run --rm --no-deps app npm audit --production --audit-level=high
|
|
118
|
+
needs:
|
|
119
|
+
- build image
|
|
120
|
+
|
|
121
|
+
# Test job running npm ci-test script. Make sure the ci-test script exports two files on disk:
|
|
122
|
+
# output/test.xml - jUnit reporter with test results
|
|
123
|
+
# output/cobertura-coverage.xml - Test coverage results
|
|
124
|
+
test:
|
|
125
|
+
stage: test
|
|
126
|
+
interruptible: true
|
|
127
|
+
extends: .export_variables
|
|
128
|
+
script:
|
|
129
|
+
- if [ "$SKIP_TESTS" == "true" ]; then warn "Tests skipped."; exit 0; fi
|
|
130
|
+
- *fetch_build_image
|
|
131
|
+
- cd "$CI_PROJECT_DIR/docker-compose"
|
|
132
|
+
- |
|
|
133
|
+
DOCKER_IMAGE_NAME="$DOCKER_IMAGE_BUILDER_NAME" \
|
|
134
|
+
docker-compose -p "$DOCKER_COMPOSE_PROJECT_NAME" \
|
|
135
|
+
-f docker-compose.yml -f docker-compose.ci.yml \
|
|
136
|
+
run --rm -e RUN_DOCKER_COMPOSE_DEPS=true -e DB_HOST=postgres app npm run ci-test
|
|
137
|
+
artifacts:
|
|
138
|
+
when: always
|
|
139
|
+
reports:
|
|
140
|
+
junit: output/test.xml
|
|
141
|
+
coverage_report:
|
|
142
|
+
coverage_format: cobertura
|
|
143
|
+
path: output/cobertura-coverage.xml
|
|
144
|
+
needs:
|
|
145
|
+
- build image
|
|
146
|
+
|
|
147
|
+
##
|
|
148
|
+
# DEPLOY STAGE
|
|
149
|
+
##
|
|
150
|
+
# Build production image and push to registry
|
|
151
|
+
# Signs in with GCP SA key from pipeline, perform build of the image and pushes it to remote registry
|
|
152
|
+
# Make sure /ci-branch-config-name/{branch} exists when adding new branches to "only" field
|
|
153
|
+
build and push to registry:
|
|
154
|
+
stage: deploy
|
|
155
|
+
extends: .export_variables
|
|
156
|
+
script:
|
|
157
|
+
- docker login -u _json_key --password-stdin $DOCKER_REGISTRY_URL < "$GCP_SA_KEY_JSON_PATH"
|
|
158
|
+
- set -a && source ci-branch-config/${CI_COMMIT_REF_NAME}.env && set +a
|
|
159
|
+
- |
|
|
160
|
+
docker build \
|
|
161
|
+
-t "$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG" \
|
|
162
|
+
$(for var in $(cat ci-branch-config/${CI_COMMIT_REF_NAME}.env | sed 's/=.*//'); do echo "--build-arg $var=${!var} "; done) \
|
|
163
|
+
--build-arg "SECRETS_PATH=$SECRETS_PATH" \
|
|
164
|
+
.
|
|
165
|
+
- docker push "$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG"
|
|
166
|
+
needs:
|
|
167
|
+
- build image
|
|
168
|
+
- npm audit
|
|
169
|
+
- test
|
|
170
|
+
only:
|
|
171
|
+
- stage
|
|
172
|
+
- master
|
|
173
|
+
|
|
174
|
+
# Deploy to Google Cloud Run based on image stored on remote registry
|
|
175
|
+
deploy cloud run:
|
|
176
|
+
stage: deploy
|
|
177
|
+
image: google/cloud-sdk:slim
|
|
178
|
+
extends: .export_variables
|
|
179
|
+
script:
|
|
180
|
+
- gcloud auth activate-service-account --key-file "$GCP_SA_KEY_JSON_PATH"
|
|
181
|
+
- gcloud config set project $GCP_PROJECT_ID
|
|
182
|
+
- gcloud auth configure-docker
|
|
183
|
+
- |
|
|
184
|
+
gcloud run deploy wake-arena-project-api \
|
|
185
|
+
--image "$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG" \
|
|
186
|
+
--project "$GCP_PROJECT_ID" \
|
|
187
|
+
--platform managed \
|
|
188
|
+
--port 3000 \
|
|
189
|
+
--region "$GCP_REGION" \
|
|
190
|
+
--allow-unauthenticated \
|
|
191
|
+
--memory "$GCP_CLOUD_RUN_ALLOCATED_MEMORY" \
|
|
192
|
+
--service-account="$GCP_CLOUD_RUN_SA_NAME" \
|
|
193
|
+
--set-secrets=$SECRETS_PATH="$GCP_SECRETS_NAME:$GCP_SECRETS_VERSION" \
|
|
194
|
+
--set-cloudsql-instances="$GCP_PROJECT_ID:$GCP_REGION:$GCP_SQL_INSTANCE_NAME"
|
|
195
|
+
only:
|
|
196
|
+
- stage
|
|
197
|
+
- master
|
|
198
|
+
needs:
|
|
199
|
+
- build and push to registry
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
24.5.0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# BUILDER IMAGE
|
|
2
|
+
FROM node:24.5.0 AS builder
|
|
3
|
+
ARG NPM_TOKEN
|
|
4
|
+
ENV NODE_PATH=.
|
|
5
|
+
ENV JOBS="max"
|
|
6
|
+
WORKDIR /usr/src/app
|
|
7
|
+
|
|
8
|
+
ENV DOCKERIZE_VERSION v0.6.1
|
|
9
|
+
RUN wget -q "https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz" && \
|
|
10
|
+
tar -C /usr/local/bin -xzvf "dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz" && \
|
|
11
|
+
rm "dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz"
|
|
12
|
+
|
|
13
|
+
ENV TINI_VERSION v0.19.0
|
|
14
|
+
RUN wget -q https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini -O /tini && \
|
|
15
|
+
chmod +x /tini
|
|
16
|
+
|
|
17
|
+
# important, otherwise postinstall hook fails
|
|
18
|
+
RUN npm set progress=false
|
|
19
|
+
RUN npm set loglevel=error
|
|
20
|
+
# copy all relevant files
|
|
21
|
+
COPY . .
|
|
22
|
+
# RUN echo "//registry.npmjs.org//:_authToken=$NPM_TOKEN" >> .npmrc
|
|
23
|
+
# install dependencies
|
|
24
|
+
RUN npm ci
|
|
25
|
+
# compile typescript
|
|
26
|
+
RUN npm run build
|
|
27
|
+
|
|
28
|
+
# MAIN IMAGE
|
|
29
|
+
FROM node:24.5.0-slim
|
|
30
|
+
|
|
31
|
+
ENV NODE_PATH=dist
|
|
32
|
+
ENV CFG_JSON_PATH="/config/secrets.json"
|
|
33
|
+
WORKDIR /usr/src/app
|
|
34
|
+
COPY --from=builder /usr/src/app /usr/src/app
|
|
35
|
+
COPY --from=builder /tini /tini
|
|
36
|
+
COPY --from=builder /usr/local/bin/dockerize /usr/local/bin/dockerize
|
|
37
|
+
EXPOSE 3000
|
|
38
|
+
USER node
|
|
39
|
+
ENTRYPOINT ["/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
|
|
40
|
+
CMD [ "node", "-r", "source-map-support/register", "dist/index.js"]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
services:
|
|
3
|
+
app:
|
|
4
|
+
build:
|
|
5
|
+
context: ..
|
|
6
|
+
image: '$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG'
|
|
7
|
+
user: root
|
|
8
|
+
depends_on:
|
|
9
|
+
- postgres
|
|
10
|
+
volumes:
|
|
11
|
+
- '$CI_PROJECT_DIR/docs-output:/usr/src/app/docs-output'
|
|
12
|
+
- '$CI_PROJECT_DIR/output:/usr/src/app/output'
|
|
13
|
+
- '$CI_PROJECT_DIR/secrets-test.json:/usr/src/app/secrets-test.json:ro'
|
|
14
|
+
- '$PWD/docker-compose-entrypoint.sh:/docker-entrypoint.sh:ro'
|
|
15
|
+
entrypoint: /docker-entrypoint.sh
|
|
16
|
+
environment:
|
|
17
|
+
- NODE_PATH=.
|
|
18
|
+
- ENABLE_TESTS=true
|
|
19
|
+
- CFG_JSON_PATH=secrets-test.json
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
preset: 'ts-jest',
|
|
3
|
+
roots: ['<rootDir>/src'],
|
|
4
|
+
transform: {
|
|
5
|
+
'^.+\\.(t|j)sx?$': 'ts-jest',
|
|
6
|
+
},
|
|
7
|
+
testEnvironment: 'node',
|
|
8
|
+
testMatch: ['<rootDir>/src/**/*.test.ts'],
|
|
9
|
+
collectCoverageFrom: ['<rootDir>/src/app/**/*.(t|j)s'],
|
|
10
|
+
moduleFileExtensions: ['ts', 'js', 'json', 'node'],
|
|
11
|
+
modulePaths: ['<rootDir>/src/'],
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('@ackee/styleguide-backend-config/prettier')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// Add setup for tests (db connection, ...) if needed
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"include": ["src/**/*"],
|
|
3
|
+
"exclude": ["dangerfile.ts"],
|
|
4
|
+
"ts-node": {
|
|
5
|
+
"files": true
|
|
6
|
+
},
|
|
7
|
+
"compilerOptions": {
|
|
8
|
+
"target": "ES2021",
|
|
9
|
+
"module": "node16",
|
|
10
|
+
"lib": ["ES2021", "DOM"],
|
|
11
|
+
"allowJs": true,
|
|
12
|
+
"incremental": true,
|
|
13
|
+
"checkJs": true,
|
|
14
|
+
"sourceMap": true,
|
|
15
|
+
"outDir": "dist",
|
|
16
|
+
"rootDir": "src",
|
|
17
|
+
"strict": true,
|
|
18
|
+
"moduleResolution": "node16",
|
|
19
|
+
"useUnknownInCatchVariables": false,
|
|
20
|
+
"esModuleInterop": true
|
|
21
|
+
}
|
|
22
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"include": ["src/**/*"],
|
|
3
|
+
"exclude": ["dangerfile.ts"],
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"target": "ES2021",
|
|
6
|
+
"module": "node16",
|
|
7
|
+
"lib": ["ES2021", "DOM"],
|
|
8
|
+
"allowJs": true,
|
|
9
|
+
"incremental": true,
|
|
10
|
+
"checkJs": true,
|
|
11
|
+
"sourceMap": true,
|
|
12
|
+
"outDir": "lib",
|
|
13
|
+
"rootDir": "src",
|
|
14
|
+
"strict": true,
|
|
15
|
+
"moduleResolution": "node16",
|
|
16
|
+
"useUnknownInCatchVariables": false,
|
|
17
|
+
"esModuleInterop": true
|
|
18
|
+
}
|
|
19
|
+
}
|