@ackee/create-node-app 1.0.1 → 2.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 (149) hide show
  1. package/AUTHORS +2 -1
  2. package/README.md +26 -18
  3. package/docs/development.md +42 -0
  4. package/lib/Bootstrap.js +106 -65
  5. package/lib/Bootstrap.js.map +1 -1
  6. package/lib/Builder.js +111 -0
  7. package/lib/Builder.js.map +1 -0
  8. package/lib/Files.js +21 -0
  9. package/lib/Files.js.map +1 -0
  10. package/lib/Logger.js +26 -8
  11. package/lib/Logger.js.map +1 -1
  12. package/lib/Mergers/ConfigMerger.js +22 -0
  13. package/lib/Mergers/ConfigMerger.js.map +1 -0
  14. package/lib/Mergers/ContainerMerger.js +172 -0
  15. package/lib/Mergers/ContainerMerger.js.map +1 -0
  16. package/lib/Mergers/EnvJsoncMerger.js +20 -0
  17. package/lib/Mergers/EnvJsoncMerger.js.map +1 -0
  18. package/lib/Mergers/Merger.js +36 -0
  19. package/lib/Mergers/Merger.js.map +1 -0
  20. package/lib/Mergers/PackageJsonMerger.js +36 -0
  21. package/lib/Mergers/PackageJsonMerger.js.map +1 -0
  22. package/lib/Npm.js +40 -12
  23. package/lib/Npm.js.map +1 -1
  24. package/lib/PackageJson.js +4 -4
  25. package/lib/PackageJson.js.map +1 -1
  26. package/lib/StarterLoader.js +86 -0
  27. package/lib/StarterLoader.js.map +1 -0
  28. package/package.json +8 -5
  29. package/src/Bootstrap.ts +123 -82
  30. package/src/Builder.ts +172 -0
  31. package/src/Files.ts +22 -0
  32. package/src/Logger.ts +26 -7
  33. package/src/Mergers/ConfigMerger.ts +28 -0
  34. package/src/Mergers/ContainerMerger.ts +241 -0
  35. package/src/Mergers/EnvJsoncMerger.ts +24 -0
  36. package/src/Mergers/Merger.ts +51 -0
  37. package/src/Mergers/PackageJsonMerger.ts +45 -0
  38. package/src/Npm.ts +60 -15
  39. package/src/PackageJson.ts +6 -4
  40. package/src/Starter.ts +2 -2
  41. package/src/StarterLoader.ts +148 -0
  42. package/starter/{cloudrun → _base}/.env.jsonc +1 -5
  43. package/starter/{cloudrun → _base}/.eslintrc.cjs +3 -2
  44. package/starter/_base/README.md +53 -0
  45. package/starter/_base/package.json +45 -0
  46. package/starter/{cloudrun → _base}/src/adapters/pino.logger.ts +1 -1
  47. package/starter/_base/src/config.ts +16 -0
  48. package/starter/{cloudrun-graphql → _base}/src/container.ts +3 -1
  49. package/starter/_base/src/index.ts +14 -0
  50. package/starter/{cloudrun → _base}/src/view/cli/README.md +2 -6
  51. package/starter/api/graphql/.env.jsonc +8 -0
  52. package/starter/{cloudrun-graphql → api/graphql}/.eslintrc.cjs +4 -5
  53. package/starter/api/graphql/node-app.jsonc +6 -0
  54. package/starter/api/graphql/package.json +36 -0
  55. package/starter/{cloudrun-graphql → api/graphql}/src/config.ts +0 -4
  56. package/starter/api/graphql/src/index.ts +11 -0
  57. package/starter/{cloudrun-graphql → api/graphql}/src/test/helloWorld.test.ts +14 -3
  58. package/starter/api/graphql/src/view/graphql/context-factory.ts +13 -0
  59. package/starter/{cloudrun-graphql → api/graphql}/src/view/server.ts +16 -6
  60. package/starter/api/rest/.env.jsonc +6 -0
  61. package/starter/api/rest/.eslintrc.cjs +8 -0
  62. package/starter/api/rest/node-app.jsonc +6 -0
  63. package/starter/api/rest/package.json +25 -0
  64. package/starter/{cloudrun → api/rest}/src/config.ts +0 -5
  65. package/starter/api/rest/src/container.ts +13 -0
  66. package/starter/{cloudrun → api/rest}/src/index.ts +4 -4
  67. package/starter/{cloudrun → api/rest}/src/test/health-check.test.ts +3 -5
  68. package/starter/{cloudrun → api/rest}/src/test/util/openapi-test.util.ts +3 -3
  69. package/starter/{cloudrun → api/rest}/src/view/rest/middleware/error-handler.ts +1 -1
  70. package/starter/{cloudrun → api/rest}/src/view/rest/routes.ts +1 -1
  71. package/starter/{cloudrun → api/rest}/src/view/rest/util/openapi.util.ts +19 -19
  72. package/starter/{cloudrun → api/rest}/src/view/server.ts +6 -4
  73. package/starter/infra/postgresql-knex/.env.jsonc +5 -0
  74. package/starter/{shared → infra/postgresql-knex}/docker-compose/docker-compose.yml +1 -1
  75. package/starter/infra/postgresql-knex/knexfile.ts +16 -0
  76. package/starter/infra/postgresql-knex/node-app.jsonc +6 -0
  77. package/starter/infra/postgresql-knex/package.json +13 -0
  78. package/starter/infra/postgresql-knex/src/adapters/knex.database.test.ts +21 -0
  79. package/starter/infra/postgresql-knex/src/adapters/knex.database.ts +14 -0
  80. package/starter/infra/postgresql-knex/src/adapters/repositories/migration.repository.ts +24 -0
  81. package/starter/infra/postgresql-knex/src/config.ts +14 -0
  82. package/starter/infra/postgresql-knex/src/container.ts +23 -0
  83. package/starter/infra/postgresql-knex/src/db/migration.template.ts +4 -0
  84. package/starter/infra/postgresql-knex/src/db/migrations/.gitkeep +0 -0
  85. package/starter/infra/postgresql-knex/src/db/seed.template.ts +3 -0
  86. package/starter/infra/postgresql-knex/src/db/seeds/.gitkeep +0 -0
  87. package/starter/infra/postgresql-knex/src/domain/ports/database.d.ts +4 -0
  88. package/starter/infra/postgresql-knex/src/domain/ports/repositories/migration.repository.d.ts +9 -0
  89. package/starter/infra/postgresql-knex/src/test/setup.ts +16 -0
  90. package/starter/{shared → pipeline/cloudrun-gitlab}/.gitlab-ci.yml +15 -6
  91. package/starter/pipeline/cloudrun-gitlab/node-app.jsonc +6 -0
  92. package/tsconfig.tsbuildinfo +1 -1
  93. package/lib/Toolbelt.js +0 -102
  94. package/lib/Toolbelt.js.map +0 -1
  95. package/lib/cloudrun/CloudRunStarter.js +0 -127
  96. package/lib/cloudrun/CloudRunStarter.js.map +0 -1
  97. package/lib/cloudrun-graphql/GraphQLStarter.js +0 -118
  98. package/lib/cloudrun-graphql/GraphQLStarter.js.map +0 -1
  99. package/src/Toolbelt.ts +0 -132
  100. package/src/cloudrun/CloudRunStarter.ts +0 -182
  101. package/src/cloudrun-graphql/GraphQLStarter.ts +0 -182
  102. package/starter/cloudrun/README.md +0 -69
  103. package/starter/cloudrun/src/container.ts +0 -18
  104. package/starter/cloudrun/src/context.ts +0 -39
  105. package/starter/cloudrun/src/domain/errors/codes.ts +0 -9
  106. package/starter/cloudrun/src/domain/errors/errors.ts +0 -25
  107. package/starter/cloudrun/src/domain/ports/logger.d.ts +0 -21
  108. package/starter/cloudrun-graphql/.env.jsonc +0 -12
  109. package/starter/cloudrun-graphql/README.md +0 -53
  110. package/starter/cloudrun-graphql/src/adapters/pino.logger.ts +0 -44
  111. package/starter/cloudrun-graphql/src/index.ts +0 -11
  112. package/starter/shared/.gitignore_ +0 -5
  113. package/starter/shared/ci-branch-config/common.env +0 -7
  114. package/starter/shared/ci-branch-config/development.env +0 -7
  115. package/starter/shared/ci-branch-config/master.env +0 -7
  116. package/starter/shared/ci-branch-config/stage.env +0 -7
  117. package/starter/shared/docker-compose/docker-compose.override.yml +0 -5
  118. package/starter/shared/jest.config.js +0 -12
  119. /package/starter/{shared → _base}/.dockerignore +0 -0
  120. /package/starter/{cloudrun → _base}/.eslint.tsconfig.json +0 -0
  121. /package/starter/{shared → _base}/.mocha-junit-config.json +0 -0
  122. /package/starter/{shared → _base}/.mocharc.json +0 -0
  123. /package/starter/{shared → _base}/.nvmrc +0 -0
  124. /package/starter/{shared → _base}/Dockerfile +0 -0
  125. /package/starter/{shared → _base}/prettier.config.cjs +0 -0
  126. /package/starter/{cloudrun-graphql → _base}/src/context.ts +0 -0
  127. /package/starter/{cloudrun-graphql → _base}/src/domain/errors/codes.ts +0 -0
  128. /package/starter/{cloudrun-graphql → _base}/src/domain/errors/errors.ts +0 -0
  129. /package/starter/{cloudrun-graphql → _base}/src/domain/ports/logger.d.ts +0 -0
  130. /package/starter/{shared → _base}/src/test/setup.ts +0 -0
  131. /package/starter/{cloudrun → _base}/src/view/cli/cli.ts +0 -0
  132. /package/starter/{shared → _base}/tsconfig.json +0 -0
  133. /package/starter/{cloudrun-graphql → api/graphql}/.eslint.tsconfig.json +0 -0
  134. /package/starter/{cloudrun-graphql → api/graphql}/codegen.yml +0 -0
  135. /package/starter/{cloudrun-graphql → api/graphql}/src/view/controller.ts +0 -0
  136. /package/starter/{cloudrun-graphql → api/graphql}/src/view/graphql/resolvers/greeting.resolver.ts +0 -0
  137. /package/starter/{cloudrun-graphql → api/graphql}/src/view/graphql/resolvers.ts +0 -0
  138. /package/starter/{cloudrun-graphql → api/graphql}/src/view/graphql/schema/schema.graphql +0 -0
  139. /package/starter/{cloudrun-graphql → api/graphql}/src/view/graphql/schema.ts +0 -0
  140. /package/starter/{cloudrun → api/rest}/src/domain/health-check.service.ts +0 -0
  141. /package/starter/{cloudrun → api/rest}/src/view/cli/openapi/generate.ts +0 -0
  142. /package/starter/{cloudrun/src/view/rest/controller → api/rest/src/view/rest/controllers}/health-check.controller.ts +0 -0
  143. /package/starter/{cloudrun → api/rest}/src/view/rest/middleware/context-middleware.ts +0 -0
  144. /package/starter/{cloudrun → api/rest}/src/view/rest/middleware/request-logger.ts +0 -0
  145. /package/starter/{cloudrun → api/rest}/src/view/rest/request.d.ts +0 -0
  146. /package/starter/{cloudrun → api/rest}/src/view/rest/spec/openapi.yml +0 -0
  147. /package/starter/{shared → infra/postgresql-knex}/docker-compose/docker-compose-entrypoint.sh +0 -0
  148. /package/starter/{shared → infra/postgresql-knex}/docker-compose/docker-compose.ci.yml +0 -0
  149. /package/starter/{shared → infra/postgresql-knex}/docker-compose/docker-compose.local.yml +0 -0
@@ -1,7 +1,7 @@
1
1
  version: '3.8'
2
2
  services:
3
3
  postgres:
4
- image: postgres:15
4
+ image: postgres:17
5
5
  environment:
6
6
  - POSTGRES_DB={{PROJECT_NAME}}_docker
7
7
  - POSTGRES_USER={{PROJECT_NAME}}_docker
@@ -0,0 +1,16 @@
1
+ import { config } from './src/config.js'
2
+
3
+ module.exports = {
4
+ client: 'pg',
5
+ connection: config.db.connectionString,
6
+ migrations: {
7
+ directory: './src/db/migrations',
8
+ stub: './src/db/migration.template.ts',
9
+ extension: 'ts',
10
+ },
11
+ seeds: {
12
+ directory: './src/db/seeds',
13
+ stub: './src/db/seed.template.ts',
14
+ extension: 'ts',
15
+ },
16
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "module": "database",
3
+ "id": "postgres-knex",
4
+ "name": "PostgreSQL with Knex",
5
+ "replace": ["docker-compose/docker-compose.yml", ".env.jsonc"]
6
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "infra-knex-postgresql",
3
+ "version": "1.0.0",
4
+ "description": "PostgreSQL infrastructure with Knex",
5
+ "main": "index.js",
6
+ "scripts": {},
7
+ "author": "",
8
+ "license": "ISC",
9
+ "dependencies": {
10
+ "knex": "^3.1.0",
11
+ "pg": "^8.13.1"
12
+ }
13
+ }
@@ -0,0 +1,21 @@
1
+ import { knexConnection } from './knex.database.js'
2
+ import { config } from '../config.js'
3
+ import { describe, test } from 'mocha'
4
+ import assert from 'node:assert'
5
+ import { Knex } from 'knex'
6
+
7
+ describe('knexConnection', () => {
8
+ test('connects to PostgreSQL and prints version', async () => {
9
+ let db: Knex | undefined
10
+
11
+ await assert.doesNotReject(
12
+ knexConnection.connect(config.db.connectionString).then(connection => {
13
+ db = connection
14
+ })
15
+ )
16
+ assert(db)
17
+ const version = await db.raw('SELECT version()')
18
+ assert(version.rows.length === 1)
19
+ await assert.doesNotReject(knexConnection.disconnect(db))
20
+ })
21
+ })
@@ -0,0 +1,14 @@
1
+ import { DbConnection } from '../domain/ports/database.js'
2
+ import knex, { Knex } from 'knex'
3
+
4
+ export const knexConnection: DbConnection<Knex> = {
5
+ connect: async (connectionString: string) => {
6
+ return knex({
7
+ client: 'pg',
8
+ connection: connectionString,
9
+ })
10
+ },
11
+ disconnect: async (db: Knex) => {
12
+ await db.destroy()
13
+ },
14
+ }
@@ -0,0 +1,24 @@
1
+ import {
2
+ Migration,
3
+ MigrationRepository,
4
+ } from '../../domain/ports/repositories/migration.repository.js'
5
+ import { Knex } from 'knex'
6
+
7
+ const TABLE = 'knex_migrations'
8
+
9
+ const mapMigrationToDomain = (migration: any): Migration => {
10
+ return {
11
+ id: migration.id,
12
+ name: migration.name,
13
+ executedAt: migration.migration_time,
14
+ }
15
+ }
16
+
17
+ export const createMigrationsRepository: (knex: Knex) => MigrationRepository = (
18
+ knex: Knex
19
+ ) => ({
20
+ list: async () => {
21
+ const migrations = await knex.select('*').from(TABLE)
22
+ return migrations.map(mapMigrationToDomain)
23
+ },
24
+ })
@@ -0,0 +1,14 @@
1
+ import { createLoader, maskedValues, values } from 'configuru'
2
+
3
+ const loader = createLoader({
4
+ defaultConfigPath: '.env.jsonc',
5
+ })
6
+
7
+ const configSchema = {
8
+ db: {
9
+ connectionString: loader.string('DB_CONNECTION_STRING'),
10
+ },
11
+ }
12
+
13
+ export const config = values(configSchema)
14
+ export const safeConfig = maskedValues(configSchema)
@@ -0,0 +1,23 @@
1
+ import { Knex } from 'knex'
2
+ import { knexConnection } from './adapters/knex.database.js'
3
+ import { createMigrationsRepository } from './adapters/repositories/migration.repository.js'
4
+ import { config } from './config.js'
5
+ import { MigrationRepository } from './domain/ports/repositories/migration.repository.js'
6
+
7
+ export interface Container {
8
+ database: Knex
9
+ repositories: {
10
+ migrations: MigrationRepository
11
+ }
12
+ }
13
+
14
+ export const createContainer = async (): Promise<Container> => {
15
+ const database = await knexConnection.connect(config.db.connectionString)
16
+
17
+ return {
18
+ database,
19
+ repositories: {
20
+ migrations: createMigrationsRepository(database),
21
+ },
22
+ }
23
+ }
@@ -0,0 +1,4 @@
1
+ import { Knex } from 'knex'
2
+
3
+ export const up = (knex: Knex) => knex
4
+ export const down = () => Promise.resolve(/* no-op */)
@@ -0,0 +1,3 @@
1
+ import { Knex } from 'knex'
2
+
3
+ export const seed = (knex: Knex) => knex
@@ -0,0 +1,4 @@
1
+ export interface DbConnection<Db> {
2
+ connect: (connectionString: string) => Promise<Db>
3
+ disconnect: (db: Db) => Promise<void>
4
+ }
@@ -0,0 +1,9 @@
1
+ export interface Migration {
2
+ id: number
3
+ name: string
4
+ executedAt: Date
5
+ }
6
+
7
+ export interface MigrationRepository {
8
+ list: () => Promise<Migration[]>
9
+ }
@@ -0,0 +1,16 @@
1
+ import { knexConnection } from '../adapters/knex.database.js'
2
+ import { config } from '../config.js'
3
+ import { Knex } from 'knex'
4
+ import { before, after } from 'mocha'
5
+
6
+ let db: Knex
7
+
8
+ before(async () => {
9
+ db = await knexConnection.connect(config.db.connectionString)
10
+ })
11
+
12
+ after(async () => {
13
+ if (db) {
14
+ await knexConnection.disconnect(db)
15
+ }
16
+ })
@@ -1,6 +1,14 @@
1
+ # Define environments in GitLab UI with vars according to the branches for the pipeline
2
+ # ENVIRONMENT={{develpoment/stage/production}}
3
+ # GCP_PROJECT_ID={{PROJECT_NAME}}
4
+ # GCP_REGION={{europe-west3}}
5
+ # GCP_SECRETS_NAME={{PROJECT_NAME}}
6
+ # GCP_SECRETS_VERSION=latest
7
+ # GCP_SA_KEY={{base64 encoded string with SA key to deploy Cloud Run}}
8
+ # GCP_CLOUD_RUN_SA_NAME={{name of the service account for Cloud Run}}
9
+
1
10
  variables:
2
11
  # Default configuration, check .export_variables job for calculated env variables based on branch config
3
-
4
12
  # Node image for pipeline runner
5
13
  NODE_BASE_IMAGE: node:24.5.0
6
14
  # Where to store json secrets from Cloud provider
@@ -41,11 +49,6 @@ stages:
41
49
  # any of the branch configuration, docker image or CI SA
42
50
  .export_variables:
43
51
  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
52
  - export DOCKER_REGISTRY_URL="$GCP_REGION-docker.pkg.dev"
50
53
  - export DOCKER_IMAGE_NAME="$DOCKER_REGISTRY_URL/$GCP_PROJECT_ID/${GCP_PROJECT_ID}-docker/$CI_PROJECT_NAME"
51
54
  - export DOCKER_IMAGE_BUILDER_NAME="$DOCKER_IMAGE_NAME-builder"
@@ -167,7 +170,10 @@ build and push to registry:
167
170
  - build image
168
171
  - npm audit
169
172
  - test
173
+ environment:
174
+ name: $CI_COMMIT_REF_NAME
170
175
  only:
176
+ - development
171
177
  - stage
172
178
  - master
173
179
 
@@ -193,7 +199,10 @@ deploy cloud run:
193
199
  --set-secrets=$SECRETS_PATH="$GCP_SECRETS_NAME:$GCP_SECRETS_VERSION" \
194
200
  --set-cloudsql-instances="$GCP_PROJECT_ID:$GCP_REGION:$GCP_SQL_INSTANCE_NAME"
195
201
  only:
202
+ - development
196
203
  - stage
197
204
  - master
205
+ environment:
206
+ name: $CI_COMMIT_REF_NAME
198
207
  needs:
199
208
  - build and push to registry
@@ -0,0 +1,6 @@
1
+ {
2
+ "module": "pipeline",
3
+ "id": "cloudrun-gitlab",
4
+ "name": "CloudRun for GitLab",
5
+ "replace": [".gitlab-ci.yml"]
6
+ }