diff --git a/.dockerignore b/.dockerignore index eb06441..a8513ab 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,23 @@ -*/coverage -*/dist -*/node_modules -*/.DS_Store -*/**/config.json \ No newline at end of file +.act +.git +.github +.husky +.vscode +docker +!docker/nginx +docs +node_modules +.gitignore +.DS_Store +.release-please-manifest.json +CHANGELOG*.md +release-please-config.json + +*/config/*.json +coverage +dist +*/.eslintrc.js +*/jest.config.json + +packages/config/config/*.json +!packages/config/config/*.template.json \ No newline at end of file diff --git a/.github/labeler.yml b/.github/labeler.yml index e9a1b56..cd0cded 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -2,11 +2,15 @@ API: api/** UI: ui/** PACKAGE: packages/** +'Authentication API': api/authentication/** 'GraphQL API': api/graphql/** -"Hiker's Book": ui/hikers-book/** +'Stages API': api/stages/** +'Trips API': api/trips/** +"Hiker's Book UI": ui/hikers-book/** '@hikers-book/cli-tools': packages/cli-tools/** '@hikers-book/config': packages/config/** '@hikers-book/eslint-config': packages/eslint-config/** +'@hikers-book/tsed-swagger': packages/tsed-swagger/** ci: .github/** deps: '**/package.json' diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 4623e3f..9ce1477 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -9,6 +9,13 @@ permissions: contents: write pull-requests: write +env: + IMAGE_API_AUTHENTICATION: radoslavirha/hikers-book-api-authentication + IMAGE_API_GRAPHQL: radoslavirha/hikers-book-api-graphql + IMAGE_API_STAGES: radoslavirha/hikers-book-api-stages + IMAGE_API_TRIPS: radoslavirha/hikers-book-api-trips + IMAGE_UI_HIKERS_BOOK: radoslavirha/hikers-book-ui-hikers-book + jobs: release-please: name: Release please @@ -25,31 +32,16 @@ jobs: with: command: manifest - api-graphql: - name: Build & Publish GraphQL API to Docker Hub - runs-on: ubuntu-latest - needs: release-please - if: needs.release-please.outputs.release - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push Docker image - uses: docker/build-push-action@v5 - with: - context: . - file: ./docker/Dockerfile.api.graphql.dockerfile - push: true - tags: radoslavirha/hikers-book-api-graphql:${{ needs.release-please.outputs.version }},radoslavirha/hikers-book-api-graphql:latest - - ui-hikers-book: - name: Build & Publish Hiker's Book UI to Docker Hub + docker: + name: Build & Publish ${{ matrix.docker.name }} to Docker Hub + strategy: + matrix: + docker: + - { name: Hiker's Book UI, target: ui-hikers-book, image: $IMAGE_UI_HIKERS_BOOK } + - { name: Authentication API, target: api-authentication, image: $IMAGE_API_AUTHENTICATION } + - { name: GraphQL API, target: api-graphql, image: $IMAGE_API_GRAPHQL } + - { name: Stages API, target: api-stages, image: $IMAGE_API_STAGES } + - { name: Trips API, target: api-trips, image: $IMAGE_API_TRIPS } runs-on: ubuntu-latest needs: release-please if: needs.release-please.outputs.release @@ -67,6 +59,7 @@ jobs: uses: docker/build-push-action@v5 with: context: . - file: ./docker/Dockerfile.ui.hikers-book.dockerfile + file: ./docker/Dockerfile + target: ${{ matrix.docker.target }} push: true - tags: radoslavirha/hikers-book-ui-hikers-book:${{ needs.release-please.outputs.version }},radoslavirha/hikers-book-ui-hikers-book:latest \ No newline at end of file + tags: ${{ matrix.docker.image }}:${{ needs.release-please.outputs.version }},${{ matrix.docker.image }}:latest diff --git a/.gitignore b/.gitignore index 4e3d3ab..1b17525 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ **/coverage **/dist **/node_modules -*/.DS_Store \ No newline at end of file +*/.DS_Store +api/**/config/*.json \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..e9884e8 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +pnpm run lint diff --git a/api/authentication/.barrelsby.json b/api/authentication/.barrelsby.json new file mode 100644 index 0000000..444a220 --- /dev/null +++ b/api/authentication/.barrelsby.json @@ -0,0 +1,13 @@ +{ + "directory": [ + "./src/docs/controllers/pages", + "./src/v1/controllers" + ], + "exclude": [ + "__mock__", + "__mocks__", + ".spec.ts" + ], + "delete": true, + "singleQuotes": true +} diff --git a/api/authentication/.eslintrc.js b/api/authentication/.eslintrc.js new file mode 100644 index 0000000..347084c --- /dev/null +++ b/api/authentication/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['@hikers-book/eslint-config'] +}; diff --git a/api/authentication/README.md b/api/authentication/README.md new file mode 100644 index 0000000..64ff734 --- /dev/null +++ b/api/authentication/README.md @@ -0,0 +1,36 @@ +# Hiker's Book Authentication API + +## Getting started + +```sh +# install dependencies +pnpm install + +# serve +pnpm start + +# build for production +pnpm build +pnpm start:prod +``` + +## Barrelsby + +This project uses [barrelsby](https://www.npmjs.com/package/barrelsby) to generate index files to import the controllers. + +Edit `.barreslby.json` to customize it: + +```json +{ + "directory": [ + "./src/controllers/rest", + "./src/controllers/pages" + ], + "exclude": [ + "__mock__", + "__mocks__", + ".spec.ts" + ], + "delete": true +} +``` diff --git a/api/graphql/views/.gitkeep b/api/authentication/config/.gitkeep similarity index 100% rename from api/graphql/views/.gitkeep rename to api/authentication/config/.gitkeep diff --git a/api/authentication/jest.config.js b/api/authentication/jest.config.js new file mode 100644 index 0000000..8de7075 --- /dev/null +++ b/api/authentication/jest.config.js @@ -0,0 +1,21 @@ +module.exports = { + clearMocks: true, + collectCoverage: true, + coverageDirectory: 'coverage', + coveragePathIgnorePatterns: ['index.ts', '/node_modules/'], + coverageThreshold: { + global: { + branches: 70, + functions: 70, + lines: 70, + statements: 70 + } + }, + globalTeardown: './scripts/jest/teardown.js', + moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node'], + testEnvironment: 'node', + testMatch: ['**/src/**/__tests__/**/*.[jt]s?(x)', '**/src/**/?(*.)+(spec|test).[tj]s?(x)'], + transform: { + '\\.(ts)$': 'ts-jest' + } +}; diff --git a/api/authentication/package.json b/api/authentication/package.json new file mode 100644 index 0000000..47d0573 --- /dev/null +++ b/api/authentication/package.json @@ -0,0 +1,105 @@ +{ + "name": "@hikers-book/authentication-api", + "version": "0.4.0", + "description": "Hiker's Book Authentication API", + "author": "radoslav.irha@gmail.com", + "license": "MIT", + "scripts": { + "build": "pnpm run barrels && tsc --project tsconfig.compile.json", + "barrels": "barrelsby --config .barrelsby.json", + "start": "pnpm run barrels && tsnd --inspect --exit-child --cls --ignore-watch node_modules --respawn --transpile-only -r tsconfig-paths/register src/index.ts", + "start:prod": "cross-env NODE_ENV=production node dist/index.js", + "format": "eslint --ext .ts --fix src", + "lint": "eslint --ext .ts src", + "test": "pnpm run test:coverage", + "test:unit": "cross-env NODE_ENV=test jest", + "test:coverage": "pnpm run test:unit", + "config": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/api.authentication.json -t config/default.json -f json || true", + "config:test": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/api.authentication.json -t config/test.json -f json || true", + "config:env": "hikers-book-config-cli -s node_modules/@hikers-book/config/environment-variables/api.authentication.json -t config/custom-environment-variables.json -f json || true", + "config:clear": "find ./config -name '*.json' -type f -delete", + "config:all": "pnpm run config:env && pnpm run config && pnpm run config:test", + "postinstall": "pnpm run config:all" + }, + "dependencies": { + "@hikers-book/tsed-swagger": "workspace:*", + "@tsed/ajv": "^7.36.8", + "@tsed/common": "^7.36.8", + "@tsed/core": "^7.36.8", + "@tsed/di": "^7.36.8", + "@tsed/engines": "^7.36.8", + "@tsed/exceptions": "^7.36.8", + "@tsed/json-mapper": "^7.36.8", + "@tsed/logger": "^6.6.3", + "@tsed/logger-file": "^6.6.3", + "@tsed/mongoose": "^7.36.8", + "@tsed/platform-cache": "^7.36.8", + "@tsed/platform-exceptions": "^7.36.8", + "@tsed/platform-express": "^7.36.8", + "@tsed/platform-log-middleware": "^7.36.8", + "@tsed/platform-middlewares": "^7.36.8", + "@tsed/platform-params": "^7.36.8", + "@tsed/platform-response-filter": "^7.36.8", + "@tsed/platform-views": "^7.36.8", + "@tsed/schema": "^7.36.8", + "@tsed/swagger": "^7.36.8", + "ajv": "^8.12.0", + "barrelsby": "^2.8.1", + "body-parser": "^1.20.2", + "class-validator": "^0.13.2", + "compression": "^1.7.4", + "config": "^3.3.9", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "dotenv": "^16.3.1", + "dotenv-expand": "^10.0.0", + "dotenv-flow": "^3.3.0", + "express": "^4.18.2", + "helmet": "^7.0.0", + "method-override": "^3.0.0", + "mongoose": "^7.5.0" + }, + "devDependencies": { + "@hikers-book/cli-tools": "workspace:*", + "@hikers-book/config": "workspace:*", + "@hikers-book/eslint-config": "workspace:*", + "@tsed/cli-plugin-eslint": "4.6.4", + "@tsed/cli-plugin-jest": "4.6.4", + "@tsed/cli-plugin-mongoose": "4.6.4", + "@tsed/testing-mongoose": "^7.36.8", + "@types/body-parser": "^1.19.3", + "@types/compression": "^1.7.3", + "@types/config": "^3.3.1", + "@types/cookie-parser": "^1.4.4", + "@types/cors": "^2.8.14", + "@types/express": "^4.17.18", + "@types/jest": "^29.5.5", + "@types/method-override": "^0.0.33", + "@types/multer": "^1.4.8", + "@types/node": "^20.5.7", + "@types/supertest": "^2.0.14", + "@types/validator": "^13.11.2", + "jest": "^29.7.0", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "ts-node-dev": "^2.0.0", + "tsconfig-paths": "^4.2.0", + "tslib": "^2.6.2", + "typescript": "^5.2.2" + }, + "tsed": { + "convention": "conv_default", + "architecture": "arc_default", + "packageManager": "pnpm" + }, + "engines": { + "node": ">= 18.0.0", + "pnpm": ">= 8.7.0" + }, + "os": [ + "darwin", + "linux" + ] +} \ No newline at end of file diff --git a/api/authentication/scripts/jest/teardown.js b/api/authentication/scripts/jest/teardown.js new file mode 100644 index 0000000..80565fd --- /dev/null +++ b/api/authentication/scripts/jest/teardown.js @@ -0,0 +1,3 @@ +module.exports = async () => { + (await global.__MONGOD__) && global.__MONGOD__.stop(); +}; diff --git a/api/authentication/src/Server.integration.spec.ts b/api/authentication/src/Server.integration.spec.ts new file mode 100644 index 0000000..43ae22e --- /dev/null +++ b/api/authentication/src/Server.integration.spec.ts @@ -0,0 +1,26 @@ +import { PlatformTest } from '@tsed/common'; +import { TestMongooseContext } from '@tsed/testing-mongoose'; +import SuperTest from 'supertest'; +import { Server } from './Server'; + +describe('Server', () => { + let request: SuperTest.SuperTest; + + beforeEach(TestMongooseContext.bootstrap(Server)); + beforeEach(() => { + request = SuperTest(PlatformTest.callback()); + }); + + afterEach(TestMongooseContext.reset); + + it('should call GET /rest', async () => { + const response = await request.get('/rest').expect(404); + + expect(response.body).toEqual({ + errors: [], + message: 'Resource "/rest" not found', + name: 'NOT_FOUND', + status: 404 + }); + }); +}); diff --git a/api/authentication/src/Server.ts b/api/authentication/src/Server.ts new file mode 100644 index 0000000..b1eee2f --- /dev/null +++ b/api/authentication/src/Server.ts @@ -0,0 +1,62 @@ +import { getHelmetDirectives, getSwaggerConfig } from '@hikers-book/tsed-swagger'; +import '@tsed/ajv'; +import { PlatformApplication } from '@tsed/common'; +import { Configuration, Inject } from '@tsed/di'; +import '@tsed/mongoose'; +import '@tsed/platform-express'; // /!\ keep this import +import bodyParser from 'body-parser'; +import compress from 'compression'; +import cookieParser from 'cookie-parser'; +import cors from 'cors'; +import helmet from 'helmet'; +import methodOverride from 'method-override'; +import { join } from 'path'; +import { config } from './config/index'; +import * as docs from './docs/controllers/pages/index'; +import * as v1 from './v1/controllers/index'; + +@Configuration({ + ...config, + acceptMimes: ['application/json'], + disableComponentsScan: true, + mount: { + '/v1': [...Object.values(v1)], + '/': [...Object.values(docs)] + }, + swagger: getSwaggerConfig(join(__dirname, '../package.json')), + views: { + root: join(process.cwd(), '../views'), + extensions: { + ejs: 'ejs' + } + }, + exclude: ['**/*.spec.ts'] +}) +export class Server { + @Inject() + protected app!: PlatformApplication; + + @Configuration() + protected settings!: Configuration; + + $beforeRoutesInit(): void { + this.app + .use( + helmet({ + contentSecurityPolicy: { + directives: getHelmetDirectives() + } + }) + ) + .use(cors()) + .use(cookieParser()) + .use(compress({})) + .use(methodOverride()) + .use(bodyParser.json()) + .use( + bodyParser.urlencoded({ + extended: true + }) + ); + } +} diff --git a/api/authentication/src/config/envs/index.ts b/api/authentication/src/config/envs/index.ts new file mode 100644 index 0000000..b0d967e --- /dev/null +++ b/api/authentication/src/config/envs/index.ts @@ -0,0 +1,9 @@ +import dotenv from 'dotenv'; + +export const envs = { + ...process.env, + // eslint-disable-next-line import/no-named-as-default-member + ...dotenv.config().parsed +}; + +export const isProduction = process.env.NODE_ENV === 'production'; diff --git a/api/authentication/src/config/index.ts b/api/authentication/src/config/index.ts new file mode 100644 index 0000000..ca1115b --- /dev/null +++ b/api/authentication/src/config/index.ts @@ -0,0 +1,16 @@ +import cfg from 'config'; +import { readFileSync } from 'fs'; +import { envs } from './envs/index'; +import loggerConfig from './logger/index'; +import mongooseConfig from './mongoose/index'; + +const pkg = JSON.parse(readFileSync('./package.json', { encoding: 'utf8' })); + +export const config: Partial = { + version: pkg.version, + httpPort: cfg.get('server.httpPort'), + httpsPort: cfg.get('server.httpsPort'), + envs, + logger: loggerConfig, + mongoose: mongooseConfig +}; diff --git a/api/authentication/src/config/logger/index.ts b/api/authentication/src/config/logger/index.ts new file mode 100644 index 0000000..3c4c66d --- /dev/null +++ b/api/authentication/src/config/logger/index.ts @@ -0,0 +1,24 @@ +import { $log, PlatformLoggerSettings } from '@tsed/common'; +import { isProduction } from '../envs/index'; + +if (isProduction) { + $log.appenders.set('stdout', { + type: 'stdout', + levels: ['info', 'debug'], + layout: { + type: 'json' + } + }); + + $log.appenders.set('stderr', { + levels: ['trace', 'fatal', 'error', 'warn'], + type: 'stderr', + layout: { + type: 'json' + } + }); +} + +export default { + disableRoutesSummary: isProduction +}; diff --git a/api/authentication/src/config/mongoose/index.ts b/api/authentication/src/config/mongoose/index.ts new file mode 100644 index 0000000..e284bd6 --- /dev/null +++ b/api/authentication/src/config/mongoose/index.ts @@ -0,0 +1,10 @@ +import cfg from 'config'; +import { ConnectOptions } from 'mongoose'; + +export default [ + { + id: 'authentication', + url: cfg.get('mongodb.url'), + connectionOptions: cfg.get('mongodb.connectionOptions') + } +]; diff --git a/api/authentication/src/docs/controllers/pages/SwaggerController.integration.spec.ts b/api/authentication/src/docs/controllers/pages/SwaggerController.integration.spec.ts new file mode 100644 index 0000000..b4ab1fb --- /dev/null +++ b/api/authentication/src/docs/controllers/pages/SwaggerController.integration.spec.ts @@ -0,0 +1,28 @@ +import { PlatformTest } from '@tsed/common'; +import { TestMongooseContext } from '@tsed/testing-mongoose'; +import SuperTest from 'supertest'; +import { Server } from '../../../Server'; +import { SwaggerController } from './SwaggerController'; + +describe('IndexController (swagger)', () => { + let request: SuperTest.SuperTest; + + beforeEach( + TestMongooseContext.bootstrap(Server, { + mount: { + '/': [SwaggerController] + } + }) + ); + beforeEach(() => { + request = SuperTest(PlatformTest.callback()); + }); + + afterEach(TestMongooseContext.reset); + + it('should call GET /', async () => { + const response = await request.get('/').expect(200); + + expect(response.text).toContain(`Ts.ED`); + }); +}); diff --git a/api/authentication/src/docs/controllers/pages/SwaggerController.ts b/api/authentication/src/docs/controllers/pages/SwaggerController.ts new file mode 100644 index 0000000..a53c63a --- /dev/null +++ b/api/authentication/src/docs/controllers/pages/SwaggerController.ts @@ -0,0 +1,29 @@ +import { Constant, Controller } from '@tsed/di'; +import { HeaderParams } from '@tsed/platform-params'; +import { View } from '@tsed/platform-views'; +import { Get, Hidden, Returns } from '@tsed/schema'; +import { SwaggerSettings } from '@tsed/swagger'; + +@Hidden() +@Controller('/') +export class SwaggerController { + @Constant('swagger') + private swagger!: SwaggerSettings[]; + + @Get('/') + @View('swagger.ejs') + @Returns(200, String).ContentType('text/html') + get(@HeaderParams('x-forwarded-proto') protocol: string, @HeaderParams('host') host: string) { + const hostUrl = `${protocol || 'http'}://${host}`; + + return { + BASE_URL: hostUrl, + docs: this.swagger.map((conf) => { + return { + url: hostUrl + conf.path, + ...conf + }; + }) + }; + } +} diff --git a/api/authentication/src/docs/controllers/pages/index.ts b/api/authentication/src/docs/controllers/pages/index.ts new file mode 100644 index 0000000..f45c26c --- /dev/null +++ b/api/authentication/src/docs/controllers/pages/index.ts @@ -0,0 +1,5 @@ +/** + * @file Automatically generated by barrelsby. + */ + +export * from './SwaggerController'; diff --git a/api/authentication/src/index.ts b/api/authentication/src/index.ts new file mode 100644 index 0000000..68d4a91 --- /dev/null +++ b/api/authentication/src/index.ts @@ -0,0 +1,18 @@ +import { $log } from '@tsed/common'; +import { PlatformExpress } from '@tsed/platform-express'; +import { Server } from './Server'; + +async function bootstrap() { + try { + const platform = await PlatformExpress.bootstrap(Server); + await platform.listen(); + + process.on('SIGINT', () => { + platform.stop(); + }); + } catch (error) { + $log.error({ event: 'SERVER_BOOTSTRAP_ERROR', message: (error as Error).message, stack: (error as Error).stack }); + } +} + +bootstrap(); diff --git a/api/graphql/src/controllers/rest/HelloWorldController.integration.spec.ts b/api/authentication/src/v1/controllers/HelloWorldController.integration.spec.ts similarity index 100% rename from api/graphql/src/controllers/rest/HelloWorldController.integration.spec.ts rename to api/authentication/src/v1/controllers/HelloWorldController.integration.spec.ts diff --git a/api/graphql/src/controllers/rest/HelloWorldController.spec.ts b/api/authentication/src/v1/controllers/HelloWorldController.spec.ts similarity index 100% rename from api/graphql/src/controllers/rest/HelloWorldController.spec.ts rename to api/authentication/src/v1/controllers/HelloWorldController.spec.ts diff --git a/api/graphql/src/controllers/rest/HelloWorldController.ts b/api/authentication/src/v1/controllers/HelloWorldController.ts similarity index 100% rename from api/graphql/src/controllers/rest/HelloWorldController.ts rename to api/authentication/src/v1/controllers/HelloWorldController.ts diff --git a/api/graphql/src/controllers/rest/index.ts b/api/authentication/src/v1/controllers/index.ts similarity index 100% rename from api/graphql/src/controllers/rest/index.ts rename to api/authentication/src/v1/controllers/index.ts diff --git a/api/authentication/tsconfig.compile.json b/api/authentication/tsconfig.compile.json new file mode 100644 index 0000000..e18df4e --- /dev/null +++ b/api/authentication/tsconfig.compile.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "./dist", + "moduleResolution": "node", + "declaration": false, + "noResolve": false, + "preserveConstEnums": true, + "sourceMap": true, + "noEmit": false, + "emitDeclarationOnly": false, + "inlineSources": true + } +} diff --git a/api/authentication/tsconfig.json b/api/authentication/tsconfig.json new file mode 100644 index 0000000..37c6383 --- /dev/null +++ b/api/authentication/tsconfig.json @@ -0,0 +1,38 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "sourceRoot": "src", + "module": "commonjs", + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "moduleResolution": "node", + "isolatedModules": false, + "suppressImplicitAnyIndexErrors": false, + "noImplicitAny": true, + "strictNullChecks": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "allowSyntheticDefaultImports": true, + "importHelpers": true, + "newLine": "LF", + "noEmit": true, + "resolveJsonModule": true, + "lib": [ + "es7", + "dom", + "ESNext.AsyncIterable" + ], + "typeRoots": [ + "./node_modules/@types" + ] + }, + "include": [ + "src" + ], + "linterOptions": { + "exclude": [] + } +} diff --git a/api/authentication/views/swagger.ejs b/api/authentication/views/swagger.ejs new file mode 100644 index 0000000..66b9ed5 --- /dev/null +++ b/api/authentication/views/swagger.ejs @@ -0,0 +1,100 @@ + + + + + + + + client + + + + +
+
+ + + +
+
+ + + diff --git a/api/graphql/.barrelsby.json b/api/graphql/.barrelsby.json index 7fff9a7..33abc58 100644 --- a/api/graphql/.barrelsby.json +++ b/api/graphql/.barrelsby.json @@ -1,5 +1,5 @@ { - "directory": ["./src/controllers/rest","./src/resolvers"], + "directory": ["./src/v1/resolvers"], "exclude": [ "__mock__", "__mocks__", diff --git a/api/graphql/.gitignore b/api/graphql/.gitignore deleted file mode 100644 index 152116b..0000000 --- a/api/graphql/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config/*.json \ No newline at end of file diff --git a/api/graphql/jest.config.js b/api/graphql/jest.config.js index 32ed6ca..8de7075 100644 --- a/api/graphql/jest.config.js +++ b/api/graphql/jest.config.js @@ -1,23 +1,8 @@ -// For a detailed explanation regarding each configuration property, visit: -// https://jestjs.io/docs/en/configuration.html - module.exports = { - // Automatically clear mock calls and instances between every test clearMocks: true, - - // Indicates whether the coverage information should be collected while executing the test collectCoverage: true, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - // collectCoverageFrom: undefined, - - // The directory where Jest should output its coverage files coverageDirectory: 'coverage', - - // An array of regexp pattern strings used to skip coverage collection coveragePathIgnorePatterns: ['index.ts', '/node_modules/'], - - // An object that configures minimum threshold enforcement for coverage results coverageThreshold: { global: { branches: 70, @@ -27,16 +12,9 @@ module.exports = { } }, globalTeardown: './scripts/jest/teardown.js', - - // An array of file extensions your modules use moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node'], - - // The test environment that will be used for testing testEnvironment: 'node', - - // The glob patterns Jest uses to detect test files testMatch: ['**/src/**/__tests__/**/*.[jt]s?(x)', '**/src/**/?(*.)+(spec|test).[tj]s?(x)'], - // A map from regular expressions to paths to transformers transform: { '\\.(ts)$': 'ts-jest' } diff --git a/api/graphql/package.json b/api/graphql/package.json index 7c1c5be..c7c0b0f 100644 --- a/api/graphql/package.json +++ b/api/graphql/package.json @@ -1,7 +1,7 @@ { "name": "@hikers-book/graphql-api", "version": "0.4.0", - "description": "GraphQL API", + "description": "Hiker's Book GraphQL API", "author": "radoslav.irha@gmail.com", "license": "MIT", "scripts": { @@ -17,37 +17,37 @@ "config": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/api.graphql.json -t config/default.json -f json || true", "config:test": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/api.graphql.json -t config/test.json -f json || true", "config:env": "hikers-book-config-cli -s node_modules/@hikers-book/config/environment-variables/api.graphql.json -t config/custom-environment-variables.json -f json || true", - "postinstall": "pnpm run config:env && pnpm run config && pnpm run config:test" + "config:clear": "find ./config -name '*.json' -type f -delete", + "config:all": "pnpm run config:env && pnpm run config && pnpm run config:test", + "postinstall": "pnpm run config:all" }, "dependencies": { - "@tsed/ajv": "^7.34.6", - "@tsed/common": "^7.34.6", - "@tsed/core": "^7.34.6", - "@tsed/di": "^7.34.6", - "@tsed/engines": "^7.34.6", - "@tsed/exceptions": "^7.34.6", - "@tsed/json-mapper": "^7.34.6", - "@tsed/logger": "^6.6.2", - "@tsed/logger-file": "^6.6.2", - "@tsed/mongoose": "^7.34.6", - "@tsed/openspec": "^7.34.6", - "@tsed/platform-cache": "^7.34.6", - "@tsed/platform-exceptions": "^7.34.6", - "@tsed/platform-express": "^7.34.6", - "@tsed/platform-log-middleware": "^7.34.6", - "@tsed/platform-middlewares": "^7.34.6", - "@tsed/platform-params": "^7.34.6", - "@tsed/platform-response-filter": "^7.34.6", - "@tsed/platform-views": "^7.34.6", - "@tsed/schema": "^7.34.6", - "@tsed/swagger": "^7.34.6", - "@tsed/typegraphql": "^7.34.6", + "@tsed/ajv": "^7.36.8", + "@tsed/common": "^7.36.8", + "@tsed/core": "^7.36.8", + "@tsed/di": "^7.36.8", + "@tsed/engines": "^7.36.8", + "@tsed/exceptions": "^7.36.8", + "@tsed/json-mapper": "^7.36.8", + "@tsed/logger": "^6.6.3", + "@tsed/logger-file": "^6.6.3", + "@tsed/mongoose": "^7.36.8", + "@tsed/platform-cache": "^7.36.8", + "@tsed/platform-exceptions": "^7.36.8", + "@tsed/platform-express": "^7.36.8", + "@tsed/platform-log-middleware": "^7.36.8", + "@tsed/platform-middlewares": "^7.36.8", + "@tsed/platform-params": "^7.36.8", + "@tsed/platform-response-filter": "^7.36.8", + "@tsed/platform-views": "^7.36.8", + "@tsed/schema": "^7.36.8", + "@tsed/typegraphql": "^7.36.8", "ajv": "^8.12.0", "apollo-datasource": "^3.3.2", "apollo-datasource-rest": "^3.7.0", "apollo-server-core": "^3.12.1", "apollo-server-express": "3.12.1", - "barrelsby": "^2.8.0", + "barrelsby": "^2.8.1", "body-parser": "^1.20.2", "class-validator": "^0.13.2", "compression": "^1.7.4", @@ -60,6 +60,7 @@ "dotenv-flow": "^3.3.0", "express": "^4.18.2", "graphql": "^15.7.2", + "helmet": "^7.0.0", "method-override": "^3.0.0", "mongoose": "^7.5.0", "type-graphql": "^1.1.1" @@ -68,26 +69,27 @@ "@hikers-book/cli-tools": "workspace:*", "@hikers-book/config": "workspace:*", "@hikers-book/eslint-config": "workspace:*", - "@tsed/apollo": "^7.34.6", + "@tsed/apollo": "^7.36.8", "@tsed/cli-plugin-eslint": "4.6.4", "@tsed/cli-plugin-jest": "4.6.4", "@tsed/cli-plugin-mongoose": "4.6.4", "@tsed/cli-plugin-typegraphql": "4.6.4", - "@tsed/testing-mongoose": "^7.34.6", - "@types/compression": "^1.7.2", + "@tsed/testing-mongoose": "^7.36.8", + "@types/body-parser": "^1.19.3", + "@types/compression": "^1.7.3", "@types/config": "^3.3.1", - "@types/cookie-parser": "^1.4.3", - "@types/cors": "^2.8.13", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.4", - "@types/method-override": "^0.0.32", - "@types/multer": "^1.4.7", + "@types/cookie-parser": "^1.4.4", + "@types/cors": "^2.8.14", + "@types/express": "^4.17.18", + "@types/jest": "^29.5.5", + "@types/method-override": "^0.0.33", + "@types/multer": "^1.4.8", "@types/node": "^20.5.7", - "@types/supertest": "^2.0.12", - "@types/validator": "^13.11.1", + "@types/supertest": "^2.0.14", + "@types/validator": "^13.11.2", "apollo-server-testing": "^2.25.3", "graphql-tag": "^2.12.6", - "jest": "^29.6.4", + "jest": "^29.7.0", "supertest": "^6.3.3", "ts-jest": "^29.1.1", "ts-node": "^10.9.1", diff --git a/api/graphql/src/Server.ts b/api/graphql/src/Server.ts index fcb5a2a..4f114d9 100644 --- a/api/graphql/src/Server.ts +++ b/api/graphql/src/Server.ts @@ -3,66 +3,20 @@ import { PlatformApplication } from '@tsed/common'; import { Configuration, Inject } from '@tsed/di'; import '@tsed/mongoose'; import '@tsed/platform-express'; // /!\ keep this import -import '@tsed/swagger'; -import '@tsed/typegraphql'; -import { join } from 'path'; +import bodyParser from 'body-parser'; +import compress from 'compression'; +import cookieParser from 'cookie-parser'; +import cors from 'cors'; +import helmet from 'helmet'; +import methodOverride from 'method-override'; import { config } from './config/index'; -import * as pages from './controllers/pages/index'; -import * as rest from './controllers/rest/index'; -import './resolvers/index'; +import './v1/GraphQLModule'; @Configuration({ ...config, acceptMimes: ['application/json'], disableComponentsScan: true, - mount: { - '/rest': [...Object.values(rest)], - '/': [...Object.values(pages)] - }, - swagger: [ - { - path: '/doc', - specVersion: '3.0.1' - } - ], - middlewares: [ - 'cors', - 'cookie-parser', - 'compression', - 'method-override', - 'json-parser', - { use: 'urlencoded-parser', options: { extended: true } } - ], - views: { - root: join(process.cwd(), '../views'), - extensions: { - ejs: 'ejs' - } - }, - exclude: ['**/*.spec.ts'], - typegraphql: { - default: { - // GraphQL server configuration - path: '/', - playground: true, // enable playground GraphQL IDE. Set false to use Apollo Studio - - // resolvers?: (Function | string)[]; - // dataSources?: Function; - // server?: (config: Config) => ApolloServer; - - // Apollo Server options - // See options descriptions on https://www.apollographql.com/docs/apollo-server/api/apollo-server.html - serverConfig: { - plugins: [] - } - - // middlewareOptions?: ServerRegistration; - - // type-graphql - // See options descriptions on https://19majkel94.github.io/type-graphql/ - // buildSchemaOptions?: Partial; - } - } + exclude: ['**/*.spec.ts'] }) export class Server { @Inject() @@ -70,4 +24,19 @@ export class Server { @Configuration() protected settings!: Configuration; + + $beforeRoutesInit(): void { + this.app + .use(helmet()) + .use(cors()) + .use(cookieParser()) + .use(compress({})) + .use(methodOverride()) + .use(bodyParser.json()) + .use( + bodyParser.urlencoded({ + extended: true + }) + ); + } } diff --git a/api/graphql/src/config/index.ts b/api/graphql/src/config/index.ts index ba9cc3c..ca1115b 100644 --- a/api/graphql/src/config/index.ts +++ b/api/graphql/src/config/index.ts @@ -12,12 +12,5 @@ export const config: Partial = { httpsPort: cfg.get('server.httpsPort'), envs, logger: loggerConfig, - mongoose: mongooseConfig, - graphql: { - default: { - path: '/graphql', - buildSchemaOptions: {} - } - } - // additional shared configuration + mongoose: mongooseConfig }; diff --git a/api/graphql/src/controllers/pages/index.ts b/api/graphql/src/controllers/pages/index.ts deleted file mode 100644 index ff8b4c5..0000000 --- a/api/graphql/src/controllers/pages/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default {}; diff --git a/api/graphql/src/v1/GraphQLModule.ts b/api/graphql/src/v1/GraphQLModule.ts new file mode 100644 index 0000000..e7d6a3b --- /dev/null +++ b/api/graphql/src/v1/GraphQLModule.ts @@ -0,0 +1,26 @@ +import { ApolloServer } from '@tsed/apollo'; +import { Inject, Module } from '@tsed/di'; +import { TypeGraphQLService } from '@tsed/typegraphql'; +import * as resolvers from './resolvers'; + +@Module({ + graphql: { + v1: { + path: '/v1/', + playground: true, + buildSchemaOptions: { + resolvers: [resolvers] + } + } + } +}) +export class GraphQLModule { + @Inject() + protected typeGraphQLService!: TypeGraphQLService; + + private server!: ApolloServer; + + public $onReady(): void | Promise { + this.server = this.typeGraphQLService.get('v1') as ApolloServer; + } +} diff --git a/api/graphql/src/errors/TripNotFoundError.spec.ts b/api/graphql/src/v1/errors/TripNotFoundError.spec.ts similarity index 100% rename from api/graphql/src/errors/TripNotFoundError.spec.ts rename to api/graphql/src/v1/errors/TripNotFoundError.spec.ts diff --git a/api/graphql/src/errors/TripNotFoundError.ts b/api/graphql/src/v1/errors/TripNotFoundError.ts similarity index 100% rename from api/graphql/src/errors/TripNotFoundError.ts rename to api/graphql/src/v1/errors/TripNotFoundError.ts diff --git a/api/graphql/src/models/Comment.spec.ts b/api/graphql/src/v1/models/Comment.spec.ts similarity index 100% rename from api/graphql/src/models/Comment.spec.ts rename to api/graphql/src/v1/models/Comment.spec.ts diff --git a/api/graphql/src/models/Comment.ts b/api/graphql/src/v1/models/Comment.ts similarity index 78% rename from api/graphql/src/models/Comment.ts rename to api/graphql/src/v1/models/Comment.ts index aea5d20..859598d 100644 --- a/api/graphql/src/models/Comment.ts +++ b/api/graphql/src/v1/models/Comment.ts @@ -1,7 +1,7 @@ -import { Model, ObjectID, Ref } from '@tsed/mongoose'; +import { Model, ObjectID } from '@tsed/mongoose'; import { Required } from '@tsed/schema'; import { Field, ID, InputType, ObjectType } from 'type-graphql'; -import { Trip } from './Trip'; +// import { Trip } from './Trip'; @Model({ schemaOptions: { timestamps: true } }) @ObjectType({ description: 'Comment model' }) @@ -14,9 +14,9 @@ export class Comment { @Field() content!: string; - @Ref(() => Trip) - @Field(() => String) - trip!: Ref; + // @Ref(() => Trip) + // @Field(() => String) + // trip!: Ref; @Field() createdAt?: Date; diff --git a/api/graphql/src/models/Trip.spec.ts b/api/graphql/src/v1/models/Trip.spec.ts similarity index 100% rename from api/graphql/src/models/Trip.spec.ts rename to api/graphql/src/v1/models/Trip.spec.ts diff --git a/api/graphql/src/models/Trip.ts b/api/graphql/src/v1/models/Trip.ts similarity index 71% rename from api/graphql/src/models/Trip.ts rename to api/graphql/src/v1/models/Trip.ts index f3e5935..695f3fb 100644 --- a/api/graphql/src/models/Trip.ts +++ b/api/graphql/src/v1/models/Trip.ts @@ -1,7 +1,7 @@ -import { Model, ObjectID, Ref } from '@tsed/mongoose'; -import { CollectionOf, Property, Required } from '@tsed/schema'; +import { Model, ObjectID } from '@tsed/mongoose'; +import { Property, Required } from '@tsed/schema'; import { Field, ID, InputType, ObjectType } from 'type-graphql'; -import { Comment } from './Comment'; +// import { Comment } from './Comment'; @Model({ schemaOptions: { timestamps: true } }) @ObjectType({ description: 'Trip model' }) @@ -18,9 +18,9 @@ export class Trip { @Field() description?: string; - @Ref(() => Comment) - @CollectionOf(() => Comment) - comments?: Ref[]; + // @Ref(() => Comment) + // @CollectionOf(() => Comment) + // comments?: Ref[]; @Field() createdAt?: Date; diff --git a/api/graphql/src/resolvers/Comment.spec.ts b/api/graphql/src/v1/resolvers/Comment.spec.ts similarity index 94% rename from api/graphql/src/resolvers/Comment.spec.ts rename to api/graphql/src/v1/resolvers/Comment.spec.ts index cb68579..881ce82 100644 --- a/api/graphql/src/resolvers/Comment.spec.ts +++ b/api/graphql/src/v1/resolvers/Comment.spec.ts @@ -2,7 +2,7 @@ import { TestMongooseContext } from '@tsed/testing-mongoose'; import { TypeGraphQLService } from '@tsed/typegraphql'; import { ApolloServerTestClient, createTestClient } from 'apollo-server-testing'; import gql from 'graphql-tag'; -import { Server } from '../Server'; +import { Server } from '../../Server'; import { CommentService } from '../services/Comment'; const GET_TRIP_COMMENTS = gql` @@ -19,7 +19,7 @@ describe('Comment', () => { beforeAll(TestMongooseContext.bootstrap(Server)); beforeAll(() => { - const server = TestMongooseContext.get(TypeGraphQLService).get('default')!; + const server = TestMongooseContext.get(TypeGraphQLService).get('v1')!; const service = TestMongooseContext.get(CommentService); // @ts-expect-error apollo-server-testing types are wrong diff --git a/api/graphql/src/resolvers/Comment.ts b/api/graphql/src/v1/resolvers/Comment.ts similarity index 100% rename from api/graphql/src/resolvers/Comment.ts rename to api/graphql/src/v1/resolvers/Comment.ts diff --git a/api/graphql/src/resolvers/Trip.spec.ts b/api/graphql/src/v1/resolvers/Trip.spec.ts similarity index 76% rename from api/graphql/src/resolvers/Trip.spec.ts rename to api/graphql/src/v1/resolvers/Trip.spec.ts index 3e14a1a..8b8d08d 100644 --- a/api/graphql/src/resolvers/Trip.spec.ts +++ b/api/graphql/src/v1/resolvers/Trip.spec.ts @@ -2,9 +2,9 @@ import { TestMongooseContext } from '@tsed/testing-mongoose'; import { TypeGraphQLService } from '@tsed/typegraphql'; import { ApolloServerTestClient, createTestClient } from 'apollo-server-testing'; import gql from 'graphql-tag'; -import { Server } from '../Server'; +import { Server } from '../../Server'; import { TripNotFoundError } from '../errors/TripNotFoundError'; -import { Comment } from '../models/Comment'; +// import { Comment } from '../models/Comment'; import { Trip } from '../models/Trip'; import { TripService } from '../services/Trip'; @@ -32,13 +32,13 @@ const CREATE_TRIP = gql` } `; -const ADD_COMMENT_TO_TRIP = gql` - mutation AddCommentToTrip($id: String!, $data: AddCommentInput!) { - AddCommentToTrip(id: $id, data: $data) { - content - } - } -`; +// const ADD_COMMENT_TO_TRIP = gql` +// mutation AddCommentToTrip($id: String!, $data: AddCommentInput!) { +// AddCommentToTrip(id: $id, data: $data) { +// content +// } +// } +// `; describe('Trip', () => { let request: ApolloServerTestClient; @@ -47,7 +47,7 @@ describe('Trip', () => { beforeAll(TestMongooseContext.bootstrap(Server)); beforeAll(() => { - const server = TestMongooseContext.get(TypeGraphQLService).get('default')!; + const server = TestMongooseContext.get(TypeGraphQLService).get('v1')!; service = TestMongooseContext.get(TripService); // @ts-expect-error apollo-server-testing types are wrong @@ -112,22 +112,22 @@ describe('Trip', () => { expect(spy).toBeCalledWith(trip); }); - it('Should create trip', async () => { - const spy = jest.spyOn(service, 'addComment').mockResolvedValue({ content: 'comment' } as Comment); - const comment = { - content: 'comment' - }, - id = '64f1e2813c860fa45e7a54d7'; - - const response = await request.query({ - query: ADD_COMMENT_TO_TRIP, - variables: { - id, - data: comment - } - }); - - expect(response.data).toEqual({ AddCommentToTrip: { content: 'comment' } }); - expect(spy).toBeCalledWith(id, comment); - }); + // it('Should add comment', async () => { + // const spy = jest.spyOn(service, 'addComment').mockResolvedValue({ content: 'comment' } as Comment); + // const comment = { + // content: 'comment' + // }, + // id = '64f1e2813c860fa45e7a54d7'; + + // const response = await request.query({ + // query: ADD_COMMENT_TO_TRIP, + // variables: { + // id, + // data: comment + // } + // }); + + // expect(response.data).toEqual({ AddCommentToTrip: { content: 'comment' } }); + // expect(spy).toBeCalledWith(id, comment); + // }); }); diff --git a/api/graphql/src/resolvers/Trip.ts b/api/graphql/src/v1/resolvers/Trip.ts similarity index 67% rename from api/graphql/src/resolvers/Trip.ts rename to api/graphql/src/v1/resolvers/Trip.ts index 9906414..c1064f1 100644 --- a/api/graphql/src/resolvers/Trip.ts +++ b/api/graphql/src/v1/resolvers/Trip.ts @@ -2,7 +2,7 @@ import { Inject } from '@tsed/di'; import { ResolverController } from '@tsed/typegraphql'; import { Arg, Mutation, Query } from 'type-graphql'; import { TripNotFoundError } from '../errors/TripNotFoundError'; -import { AddCommentInput, Comment } from '../models/Comment'; +// import { AddCommentInput, Comment } from '../models/Comment'; import { AddTripInput, Trip } from '../models/Trip'; import { TripService } from '../services/Trip'; @@ -28,12 +28,12 @@ export class TripResolver { } @Mutation(() => Trip, { description: 'Create a new trip' }) - async CreateTrip(@Arg('data') event: AddTripInput) { - return this.tripService.create(event); + async CreateTrip(@Arg('data') data: AddTripInput) { + return this.tripService.create(data); } - @Mutation(() => Comment, { description: 'Add new comment to trip' }) - async AddCommentToTrip(@Arg('id', { description: 'MongoDB _id' }) id: string, @Arg('data') event: AddCommentInput) { - return this.tripService.addComment(id, event); - } + // @Mutation(() => Comment, { description: 'Add new comment to trip' }) + // async AddCommentToTrip(@Arg('id', { description: 'MongoDB _id' }) id: string, @Arg('data') event: AddCommentInput) { + // return this.tripService.addComment(id, event); + // } } diff --git a/api/graphql/src/resolvers/index.ts b/api/graphql/src/v1/resolvers/index.ts similarity index 100% rename from api/graphql/src/resolvers/index.ts rename to api/graphql/src/v1/resolvers/index.ts diff --git a/api/graphql/src/services/Comment.spec.ts b/api/graphql/src/v1/services/Comment.spec.ts similarity index 100% rename from api/graphql/src/services/Comment.spec.ts rename to api/graphql/src/v1/services/Comment.spec.ts diff --git a/api/graphql/src/services/Comment.ts b/api/graphql/src/v1/services/Comment.ts similarity index 100% rename from api/graphql/src/services/Comment.ts rename to api/graphql/src/v1/services/Comment.ts diff --git a/api/graphql/src/services/Trip.spec.ts b/api/graphql/src/v1/services/Trip.spec.ts similarity index 64% rename from api/graphql/src/services/Trip.spec.ts rename to api/graphql/src/v1/services/Trip.spec.ts index 833e526..9bf73e0 100644 --- a/api/graphql/src/services/Trip.spec.ts +++ b/api/graphql/src/v1/services/Trip.spec.ts @@ -1,7 +1,7 @@ import { PlatformTest } from '@tsed/common'; import { MongooseModel } from '@tsed/mongoose'; import { TestMongooseContext } from '@tsed/testing-mongoose'; -import { Comment } from '../models/Comment'; +// import { Comment } from '../models/Comment'; import { Trip } from '../models/Trip'; import { TripService } from './Trip'; @@ -56,25 +56,25 @@ describe('TripService', () => { }); }); - describe('addComment(id, data)', () => { - it('Should pass', async () => { - const tripId = '64f1e2813c860fa45e7a54d7'; - const service = PlatformTest.get(TripService); - const model = PlatformTest.get>(Trip); - const modelComment = PlatformTest.get>(Comment); - const trip = { id: tripId, label: 'test', comments: [], save: jest.fn() }; - const comment = { content: 'comment' }; - const spyTripFindById = jest.spyOn(model, 'findById').mockResolvedValue(trip); - const spyTripSave = jest.spyOn(trip, 'save'); - // @ts-expect-error return dummy model - const spyCreateComment = jest.spyOn(modelComment, 'create').mockResolvedValue(comment); + // describe('addComment(id, data)', () => { + // it('Should pass', async () => { + // const tripId = '64f1e2813c860fa45e7a54d7'; + // const service = PlatformTest.get(TripService); + // const model = PlatformTest.get>(Trip); + // const modelComment = PlatformTest.get>(Comment); + // const trip = { id: tripId, label: 'test', comments: [], save: jest.fn() }; + // const comment = { content: 'comment' }; + // const spyTripFindById = jest.spyOn(model, 'findById').mockResolvedValue(trip); + // const spyTripSave = jest.spyOn(trip, 'save'); + // // @ts-expect-error return dummy model + // const spyCreateComment = jest.spyOn(modelComment, 'create').mockResolvedValue(comment); - const result = await service.addComment(tripId, comment); + // const result = await service.addComment(tripId, comment); - expect(spyTripFindById).toBeCalledWith(tripId); - expect(spyCreateComment).toBeCalledWith({ trip: tripId, ...comment }); - expect(spyTripSave).toBeCalled(); - expect(result).toEqual(comment); - }); - }); + // expect(spyTripFindById).toBeCalledWith(tripId); + // expect(spyCreateComment).toBeCalledWith({ trip: tripId, ...comment }); + // expect(spyTripSave).toBeCalled(); + // expect(result).toEqual(comment); + // }); + // }); }); diff --git a/api/graphql/src/services/Trip.ts b/api/graphql/src/v1/services/Trip.ts similarity index 52% rename from api/graphql/src/services/Trip.ts rename to api/graphql/src/v1/services/Trip.ts index 96965d7..fee1c01 100644 --- a/api/graphql/src/services/Trip.ts +++ b/api/graphql/src/v1/services/Trip.ts @@ -1,6 +1,6 @@ import { Inject, Service } from '@tsed/common'; import { MongooseModel } from '@tsed/mongoose'; -import { AddCommentInput, Comment } from '../models/Comment'; +// import { AddCommentInput, Comment } from '../models/Comment'; import { AddTripInput, Trip } from '../models/Trip'; @Service() @@ -8,8 +8,8 @@ export class TripService { @Inject(Trip) private Trip!: MongooseModel; - @Inject(Comment) - private Comment!: MongooseModel; + // @Inject(Comment) + // private Comment!: MongooseModel; async findById(id: string): Promise { return this.Trip.findById(id).exec(); @@ -23,15 +23,15 @@ export class TripService { return this.Trip.create(trip); } - async addComment(id: string, data: AddCommentInput): Promise { - return this.Trip.findById(id).then(async (trip) => { - const comment = await this.Comment.create({ trip: id, ...data }); + // async addComment(id: string, data: AddCommentInput): Promise { + // return this.Trip.findById(id).then(async (trip) => { + // const comment = await this.Comment.create({ trip: id, ...data }); - trip?.comments?.push(comment._id); + // trip?.comments?.push(comment._id); - await trip?.save(); + // await trip?.save(); - return comment; - }); - } + // return comment; + // }); + // } } diff --git a/api/stages/.barrelsby.json b/api/stages/.barrelsby.json new file mode 100644 index 0000000..444a220 --- /dev/null +++ b/api/stages/.barrelsby.json @@ -0,0 +1,13 @@ +{ + "directory": [ + "./src/docs/controllers/pages", + "./src/v1/controllers" + ], + "exclude": [ + "__mock__", + "__mocks__", + ".spec.ts" + ], + "delete": true, + "singleQuotes": true +} diff --git a/api/stages/.eslintrc.js b/api/stages/.eslintrc.js new file mode 100644 index 0000000..347084c --- /dev/null +++ b/api/stages/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['@hikers-book/eslint-config'] +}; diff --git a/api/stages/README.md b/api/stages/README.md new file mode 100644 index 0000000..bf5d5fc --- /dev/null +++ b/api/stages/README.md @@ -0,0 +1,36 @@ +# Hiker's Book Comments API + +## Getting started + +```sh +# install dependencies +pnpm install + +# serve +pnpm start + +# build for production +pnpm build +pnpm start:prod +``` + +## Barrelsby + +This project uses [barrelsby](https://www.npmjs.com/package/barrelsby) to generate index files to import the controllers. + +Edit `.barreslby.json` to customize it: + +```json +{ + "directory": [ + "./src/controllers/rest", + "./src/controllers/pages" + ], + "exclude": [ + "__mock__", + "__mocks__", + ".spec.ts" + ], + "delete": true +} +``` diff --git a/api/stages/config/.gitkeep b/api/stages/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/api/stages/jest.config.js b/api/stages/jest.config.js new file mode 100644 index 0000000..8de7075 --- /dev/null +++ b/api/stages/jest.config.js @@ -0,0 +1,21 @@ +module.exports = { + clearMocks: true, + collectCoverage: true, + coverageDirectory: 'coverage', + coveragePathIgnorePatterns: ['index.ts', '/node_modules/'], + coverageThreshold: { + global: { + branches: 70, + functions: 70, + lines: 70, + statements: 70 + } + }, + globalTeardown: './scripts/jest/teardown.js', + moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node'], + testEnvironment: 'node', + testMatch: ['**/src/**/__tests__/**/*.[jt]s?(x)', '**/src/**/?(*.)+(spec|test).[tj]s?(x)'], + transform: { + '\\.(ts)$': 'ts-jest' + } +}; diff --git a/api/stages/package.json b/api/stages/package.json new file mode 100644 index 0000000..98ea55b --- /dev/null +++ b/api/stages/package.json @@ -0,0 +1,105 @@ +{ + "name": "@hikers-book/stages-api", + "version": "0.4.0", + "description": "Hiker's Book Stages API", + "author": "radoslav.irha@gmail.com", + "license": "MIT", + "scripts": { + "build": "pnpm run barrels && tsc --project tsconfig.compile.json", + "barrels": "barrelsby --config .barrelsby.json", + "start": "pnpm run barrels && tsnd --inspect --exit-child --cls --ignore-watch node_modules --respawn --transpile-only -r tsconfig-paths/register src/index.ts", + "start:prod": "cross-env NODE_ENV=production node dist/index.js", + "format": "eslint --ext .ts --fix src", + "lint": "eslint --ext .ts src", + "test": "pnpm run test:coverage", + "test:unit": "cross-env NODE_ENV=test jest", + "test:coverage": "pnpm run test:unit", + "config": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/api.stages.json -t config/default.json -f json || true", + "config:test": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/api.stages.json -t config/test.json -f json || true", + "config:env": "hikers-book-config-cli -s node_modules/@hikers-book/config/environment-variables/api.stages.json -t config/custom-environment-variables.json -f json || true", + "config:clear": "find ./config -name '*.json' -type f -delete", + "config:all": "pnpm run config:env && pnpm run config && pnpm run config:test", + "postinstall": "pnpm run config:all" + }, + "dependencies": { + "@hikers-book/tsed-swagger": "workspace:*", + "@tsed/ajv": "^7.36.8", + "@tsed/common": "^7.36.8", + "@tsed/core": "^7.36.8", + "@tsed/di": "^7.36.8", + "@tsed/engines": "^7.36.8", + "@tsed/exceptions": "^7.36.8", + "@tsed/json-mapper": "^7.36.8", + "@tsed/logger": "^6.6.3", + "@tsed/logger-file": "^6.6.3", + "@tsed/mongoose": "^7.36.8", + "@tsed/platform-cache": "^7.36.8", + "@tsed/platform-exceptions": "^7.36.8", + "@tsed/platform-express": "^7.36.8", + "@tsed/platform-log-middleware": "^7.36.8", + "@tsed/platform-middlewares": "^7.36.8", + "@tsed/platform-params": "^7.36.8", + "@tsed/platform-response-filter": "^7.36.8", + "@tsed/platform-views": "^7.36.8", + "@tsed/schema": "^7.36.8", + "@tsed/swagger": "^7.36.8", + "ajv": "^8.12.0", + "barrelsby": "^2.8.1", + "body-parser": "^1.20.2", + "class-validator": "^0.13.2", + "compression": "^1.7.4", + "config": "^3.3.9", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "dotenv": "^16.3.1", + "dotenv-expand": "^10.0.0", + "dotenv-flow": "^3.3.0", + "express": "^4.18.2", + "helmet": "^7.0.0", + "method-override": "^3.0.0", + "mongoose": "^7.5.0" + }, + "devDependencies": { + "@hikers-book/cli-tools": "workspace:*", + "@hikers-book/config": "workspace:*", + "@hikers-book/eslint-config": "workspace:*", + "@tsed/cli-plugin-eslint": "4.6.4", + "@tsed/cli-plugin-jest": "4.6.4", + "@tsed/cli-plugin-mongoose": "4.6.4", + "@tsed/testing-mongoose": "^7.36.8", + "@types/body-parser": "^1.19.3", + "@types/compression": "^1.7.3", + "@types/config": "^3.3.1", + "@types/cookie-parser": "^1.4.4", + "@types/cors": "^2.8.14", + "@types/express": "^4.17.18", + "@types/jest": "^29.5.5", + "@types/method-override": "^0.0.33", + "@types/multer": "^1.4.8", + "@types/node": "^20.5.7", + "@types/supertest": "^2.0.14", + "@types/validator": "^13.11.2", + "jest": "^29.7.0", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "ts-node-dev": "^2.0.0", + "tsconfig-paths": "^4.2.0", + "tslib": "^2.6.2", + "typescript": "^5.2.2" + }, + "tsed": { + "convention": "conv_default", + "architecture": "arc_default", + "packageManager": "pnpm" + }, + "engines": { + "node": ">= 18.0.0", + "pnpm": ">= 8.7.0" + }, + "os": [ + "darwin", + "linux" + ] +} \ No newline at end of file diff --git a/api/stages/scripts/jest/teardown.js b/api/stages/scripts/jest/teardown.js new file mode 100644 index 0000000..80565fd --- /dev/null +++ b/api/stages/scripts/jest/teardown.js @@ -0,0 +1,3 @@ +module.exports = async () => { + (await global.__MONGOD__) && global.__MONGOD__.stop(); +}; diff --git a/api/stages/src/Server.integration.spec.ts b/api/stages/src/Server.integration.spec.ts new file mode 100644 index 0000000..43ae22e --- /dev/null +++ b/api/stages/src/Server.integration.spec.ts @@ -0,0 +1,26 @@ +import { PlatformTest } from '@tsed/common'; +import { TestMongooseContext } from '@tsed/testing-mongoose'; +import SuperTest from 'supertest'; +import { Server } from './Server'; + +describe('Server', () => { + let request: SuperTest.SuperTest; + + beforeEach(TestMongooseContext.bootstrap(Server)); + beforeEach(() => { + request = SuperTest(PlatformTest.callback()); + }); + + afterEach(TestMongooseContext.reset); + + it('should call GET /rest', async () => { + const response = await request.get('/rest').expect(404); + + expect(response.body).toEqual({ + errors: [], + message: 'Resource "/rest" not found', + name: 'NOT_FOUND', + status: 404 + }); + }); +}); diff --git a/api/stages/src/Server.ts b/api/stages/src/Server.ts new file mode 100644 index 0000000..6af5f0c --- /dev/null +++ b/api/stages/src/Server.ts @@ -0,0 +1,62 @@ +import { getHelmetDirectives, getSwaggerConfig } from '@hikers-book/tsed-swagger'; +import '@tsed/ajv'; +import { PlatformApplication } from '@tsed/common'; +import { Configuration, Inject } from '@tsed/di'; +import '@tsed/mongoose'; +import '@tsed/platform-express'; // /!\ keep this import +import bodyParser from 'body-parser'; +import compress from 'compression'; +import cookieParser from 'cookie-parser'; +import cors from 'cors'; +import helmet from 'helmet'; +import methodOverride from 'method-override'; +import { join } from 'path'; +import { config } from './config/index'; +import * as docs from './docs/controllers/pages/index'; +import * as rest from './v1/controllers/index'; + +@Configuration({ + ...config, + acceptMimes: ['application/json'], + disableComponentsScan: true, + mount: { + '/v1': [...Object.values(rest)], + '/': [...Object.values(docs)] + }, + swagger: getSwaggerConfig(join(__dirname, '../package.json')), + views: { + root: join(process.cwd(), '../views'), + extensions: { + ejs: 'ejs' + } + }, + exclude: ['**/*.spec.ts'] +}) +export class Server { + @Inject() + protected app!: PlatformApplication; + + @Configuration() + protected settings!: Configuration; + + $beforeRoutesInit(): void { + this.app + .use( + helmet({ + contentSecurityPolicy: { + directives: getHelmetDirectives() + } + }) + ) + .use(cors()) + .use(cookieParser()) + .use(compress({})) + .use(methodOverride()) + .use(bodyParser.json()) + .use( + bodyParser.urlencoded({ + extended: true + }) + ); + } +} diff --git a/api/stages/src/config/envs/index.ts b/api/stages/src/config/envs/index.ts new file mode 100644 index 0000000..b0d967e --- /dev/null +++ b/api/stages/src/config/envs/index.ts @@ -0,0 +1,9 @@ +import dotenv from 'dotenv'; + +export const envs = { + ...process.env, + // eslint-disable-next-line import/no-named-as-default-member + ...dotenv.config().parsed +}; + +export const isProduction = process.env.NODE_ENV === 'production'; diff --git a/api/stages/src/config/index.ts b/api/stages/src/config/index.ts new file mode 100644 index 0000000..ca1115b --- /dev/null +++ b/api/stages/src/config/index.ts @@ -0,0 +1,16 @@ +import cfg from 'config'; +import { readFileSync } from 'fs'; +import { envs } from './envs/index'; +import loggerConfig from './logger/index'; +import mongooseConfig from './mongoose/index'; + +const pkg = JSON.parse(readFileSync('./package.json', { encoding: 'utf8' })); + +export const config: Partial = { + version: pkg.version, + httpPort: cfg.get('server.httpPort'), + httpsPort: cfg.get('server.httpsPort'), + envs, + logger: loggerConfig, + mongoose: mongooseConfig +}; diff --git a/api/stages/src/config/logger/index.ts b/api/stages/src/config/logger/index.ts new file mode 100644 index 0000000..3c4c66d --- /dev/null +++ b/api/stages/src/config/logger/index.ts @@ -0,0 +1,24 @@ +import { $log, PlatformLoggerSettings } from '@tsed/common'; +import { isProduction } from '../envs/index'; + +if (isProduction) { + $log.appenders.set('stdout', { + type: 'stdout', + levels: ['info', 'debug'], + layout: { + type: 'json' + } + }); + + $log.appenders.set('stderr', { + levels: ['trace', 'fatal', 'error', 'warn'], + type: 'stderr', + layout: { + type: 'json' + } + }); +} + +export default { + disableRoutesSummary: isProduction +}; diff --git a/api/stages/src/config/mongoose/index.ts b/api/stages/src/config/mongoose/index.ts new file mode 100644 index 0000000..a90ca62 --- /dev/null +++ b/api/stages/src/config/mongoose/index.ts @@ -0,0 +1,10 @@ +import cfg from 'config'; +import { ConnectOptions } from 'mongoose'; + +export default [ + { + id: 'stages', + url: cfg.get('mongodb.url'), + connectionOptions: cfg.get('mongodb.connectionOptions') + } +]; diff --git a/api/stages/src/docs/controllers/pages/SwaggerController.integration.spec.ts b/api/stages/src/docs/controllers/pages/SwaggerController.integration.spec.ts new file mode 100644 index 0000000..b4ab1fb --- /dev/null +++ b/api/stages/src/docs/controllers/pages/SwaggerController.integration.spec.ts @@ -0,0 +1,28 @@ +import { PlatformTest } from '@tsed/common'; +import { TestMongooseContext } from '@tsed/testing-mongoose'; +import SuperTest from 'supertest'; +import { Server } from '../../../Server'; +import { SwaggerController } from './SwaggerController'; + +describe('IndexController (swagger)', () => { + let request: SuperTest.SuperTest; + + beforeEach( + TestMongooseContext.bootstrap(Server, { + mount: { + '/': [SwaggerController] + } + }) + ); + beforeEach(() => { + request = SuperTest(PlatformTest.callback()); + }); + + afterEach(TestMongooseContext.reset); + + it('should call GET /', async () => { + const response = await request.get('/').expect(200); + + expect(response.text).toContain(`Ts.ED`); + }); +}); diff --git a/api/stages/src/docs/controllers/pages/SwaggerController.ts b/api/stages/src/docs/controllers/pages/SwaggerController.ts new file mode 100644 index 0000000..a53c63a --- /dev/null +++ b/api/stages/src/docs/controllers/pages/SwaggerController.ts @@ -0,0 +1,29 @@ +import { Constant, Controller } from '@tsed/di'; +import { HeaderParams } from '@tsed/platform-params'; +import { View } from '@tsed/platform-views'; +import { Get, Hidden, Returns } from '@tsed/schema'; +import { SwaggerSettings } from '@tsed/swagger'; + +@Hidden() +@Controller('/') +export class SwaggerController { + @Constant('swagger') + private swagger!: SwaggerSettings[]; + + @Get('/') + @View('swagger.ejs') + @Returns(200, String).ContentType('text/html') + get(@HeaderParams('x-forwarded-proto') protocol: string, @HeaderParams('host') host: string) { + const hostUrl = `${protocol || 'http'}://${host}`; + + return { + BASE_URL: hostUrl, + docs: this.swagger.map((conf) => { + return { + url: hostUrl + conf.path, + ...conf + }; + }) + }; + } +} diff --git a/api/stages/src/docs/controllers/pages/index.ts b/api/stages/src/docs/controllers/pages/index.ts new file mode 100644 index 0000000..f45c26c --- /dev/null +++ b/api/stages/src/docs/controllers/pages/index.ts @@ -0,0 +1,5 @@ +/** + * @file Automatically generated by barrelsby. + */ + +export * from './SwaggerController'; diff --git a/api/stages/src/index.ts b/api/stages/src/index.ts new file mode 100644 index 0000000..68d4a91 --- /dev/null +++ b/api/stages/src/index.ts @@ -0,0 +1,18 @@ +import { $log } from '@tsed/common'; +import { PlatformExpress } from '@tsed/platform-express'; +import { Server } from './Server'; + +async function bootstrap() { + try { + const platform = await PlatformExpress.bootstrap(Server); + await platform.listen(); + + process.on('SIGINT', () => { + platform.stop(); + }); + } catch (error) { + $log.error({ event: 'SERVER_BOOTSTRAP_ERROR', message: (error as Error).message, stack: (error as Error).stack }); + } +} + +bootstrap(); diff --git a/api/stages/src/v1/controllers/HelloWorldController.integration.spec.ts b/api/stages/src/v1/controllers/HelloWorldController.integration.spec.ts new file mode 100644 index 0000000..2f44dee --- /dev/null +++ b/api/stages/src/v1/controllers/HelloWorldController.integration.spec.ts @@ -0,0 +1,27 @@ +import { TestMongooseContext } from '@tsed/testing-mongoose'; +import SuperTest from 'supertest'; +import { Server } from '../../Server'; +import { HelloWorldController } from './HelloWorldController'; + +describe('HelloWorldController', () => { + let request: SuperTest.SuperTest; + + beforeEach( + TestMongooseContext.bootstrap(Server, { + mount: { + '/': [HelloWorldController] + } + }) + ); + beforeEach(() => { + request = SuperTest(TestMongooseContext.callback()); + }); + + afterEach(TestMongooseContext.reset); + + it('should call GET /hello-world', async () => { + const response = await request.get('/hello-world').expect(200); + + expect(response.text).toEqual('hello'); + }); +}); diff --git a/api/stages/src/v1/controllers/HelloWorldController.spec.ts b/api/stages/src/v1/controllers/HelloWorldController.spec.ts new file mode 100644 index 0000000..e8cefef --- /dev/null +++ b/api/stages/src/v1/controllers/HelloWorldController.spec.ts @@ -0,0 +1,14 @@ +import { PlatformTest } from '@tsed/common'; +import { HelloWorldController } from './HelloWorldController'; + +describe('HelloWorldController', () => { + beforeEach(PlatformTest.create); + afterEach(PlatformTest.reset); + + it('should do something', () => { + const instance = PlatformTest.get(HelloWorldController); + // const instance = PlatformTest.invoke(HelloWorldController); // get fresh instance + + expect(instance).toBeInstanceOf(HelloWorldController); + }); +}); diff --git a/api/stages/src/v1/controllers/HelloWorldController.ts b/api/stages/src/v1/controllers/HelloWorldController.ts new file mode 100644 index 0000000..5e4e5ef --- /dev/null +++ b/api/stages/src/v1/controllers/HelloWorldController.ts @@ -0,0 +1,10 @@ +import { Controller } from '@tsed/di'; +import { Get } from '@tsed/schema'; + +@Controller('/hello-world') +export class HelloWorldController { + @Get('/') + get() { + return 'hello'; + } +} diff --git a/api/stages/src/v1/controllers/index.ts b/api/stages/src/v1/controllers/index.ts new file mode 100644 index 0000000..3333dae --- /dev/null +++ b/api/stages/src/v1/controllers/index.ts @@ -0,0 +1,5 @@ +/** + * @file Automatically generated by barrelsby. + */ + +export * from './HelloWorldController'; diff --git a/api/stages/tsconfig.compile.json b/api/stages/tsconfig.compile.json new file mode 100644 index 0000000..e18df4e --- /dev/null +++ b/api/stages/tsconfig.compile.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "./dist", + "moduleResolution": "node", + "declaration": false, + "noResolve": false, + "preserveConstEnums": true, + "sourceMap": true, + "noEmit": false, + "emitDeclarationOnly": false, + "inlineSources": true + } +} diff --git a/api/stages/tsconfig.json b/api/stages/tsconfig.json new file mode 100644 index 0000000..37c6383 --- /dev/null +++ b/api/stages/tsconfig.json @@ -0,0 +1,38 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "sourceRoot": "src", + "module": "commonjs", + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "moduleResolution": "node", + "isolatedModules": false, + "suppressImplicitAnyIndexErrors": false, + "noImplicitAny": true, + "strictNullChecks": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "allowSyntheticDefaultImports": true, + "importHelpers": true, + "newLine": "LF", + "noEmit": true, + "resolveJsonModule": true, + "lib": [ + "es7", + "dom", + "ESNext.AsyncIterable" + ], + "typeRoots": [ + "./node_modules/@types" + ] + }, + "include": [ + "src" + ], + "linterOptions": { + "exclude": [] + } +} diff --git a/api/stages/views/swagger.ejs b/api/stages/views/swagger.ejs new file mode 100644 index 0000000..66b9ed5 --- /dev/null +++ b/api/stages/views/swagger.ejs @@ -0,0 +1,100 @@ + + + + + + + + client + + + + +
+
+ + + +
+
+ + + diff --git a/api/trips/.barrelsby.json b/api/trips/.barrelsby.json new file mode 100644 index 0000000..444a220 --- /dev/null +++ b/api/trips/.barrelsby.json @@ -0,0 +1,13 @@ +{ + "directory": [ + "./src/docs/controllers/pages", + "./src/v1/controllers" + ], + "exclude": [ + "__mock__", + "__mocks__", + ".spec.ts" + ], + "delete": true, + "singleQuotes": true +} diff --git a/api/trips/.eslintrc.js b/api/trips/.eslintrc.js new file mode 100644 index 0000000..347084c --- /dev/null +++ b/api/trips/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['@hikers-book/eslint-config'] +}; diff --git a/api/trips/README.md b/api/trips/README.md new file mode 100644 index 0000000..9f3045e --- /dev/null +++ b/api/trips/README.md @@ -0,0 +1,36 @@ +# Hiker's Book Trips API + +## Getting started + +```sh +# install dependencies +pnpm install + +# serve +pnpm start + +# build for production +pnpm build +pnpm start:prod +``` + +## Barrelsby + +This project uses [barrelsby](https://www.npmjs.com/package/barrelsby) to generate index files to import the controllers. + +Edit `.barreslby.json` to customize it: + +```json +{ + "directory": [ + "./src/controllers/rest", + "./src/controllers/pages" + ], + "exclude": [ + "__mock__", + "__mocks__", + ".spec.ts" + ], + "delete": true +} +``` diff --git a/api/trips/config/.gitkeep b/api/trips/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/api/trips/jest.config.js b/api/trips/jest.config.js new file mode 100644 index 0000000..8de7075 --- /dev/null +++ b/api/trips/jest.config.js @@ -0,0 +1,21 @@ +module.exports = { + clearMocks: true, + collectCoverage: true, + coverageDirectory: 'coverage', + coveragePathIgnorePatterns: ['index.ts', '/node_modules/'], + coverageThreshold: { + global: { + branches: 70, + functions: 70, + lines: 70, + statements: 70 + } + }, + globalTeardown: './scripts/jest/teardown.js', + moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node'], + testEnvironment: 'node', + testMatch: ['**/src/**/__tests__/**/*.[jt]s?(x)', '**/src/**/?(*.)+(spec|test).[tj]s?(x)'], + transform: { + '\\.(ts)$': 'ts-jest' + } +}; diff --git a/api/trips/package.json b/api/trips/package.json new file mode 100644 index 0000000..a0d814f --- /dev/null +++ b/api/trips/package.json @@ -0,0 +1,105 @@ +{ + "name": "@hikers-book/trips-api", + "version": "0.4.0", + "description": "Hiker's Book Trips API", + "author": "radoslav.irha@gmail.com", + "license": "MIT", + "scripts": { + "build": "pnpm run barrels && tsc --project tsconfig.compile.json", + "barrels": "barrelsby --config .barrelsby.json", + "start": "pnpm run barrels && tsnd --inspect --exit-child --cls --ignore-watch node_modules --respawn --transpile-only -r tsconfig-paths/register src/index.ts", + "start:prod": "cross-env NODE_ENV=production node dist/index.js", + "format": "eslint --ext .ts --fix src", + "lint": "eslint --ext .ts src", + "test": "pnpm run test:coverage", + "test:unit": "cross-env NODE_ENV=test jest", + "test:coverage": "pnpm run test:unit", + "config": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/api.trips.json -t config/default.json -f json || true", + "config:test": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/api.trips.json -t config/test.json -f json || true", + "config:env": "hikers-book-config-cli -s node_modules/@hikers-book/config/environment-variables/api.trips.json -t config/custom-environment-variables.json -f json || true", + "config:clear": "find ./config -name '*.json' -type f -delete", + "config:all": "pnpm run config:env && pnpm run config && pnpm run config:test", + "postinstall": "pnpm run config:all" + }, + "dependencies": { + "@hikers-book/tsed-swagger": "workspace:*", + "@tsed/ajv": "^7.36.8", + "@tsed/common": "^7.36.8", + "@tsed/core": "^7.36.8", + "@tsed/di": "^7.36.8", + "@tsed/engines": "^7.36.8", + "@tsed/exceptions": "^7.36.8", + "@tsed/json-mapper": "^7.36.8", + "@tsed/logger": "^6.6.3", + "@tsed/logger-file": "^6.6.3", + "@tsed/mongoose": "^7.36.8", + "@tsed/platform-cache": "^7.36.8", + "@tsed/platform-exceptions": "^7.36.8", + "@tsed/platform-express": "^7.36.8", + "@tsed/platform-log-middleware": "^7.36.8", + "@tsed/platform-middlewares": "^7.36.8", + "@tsed/platform-params": "^7.36.8", + "@tsed/platform-response-filter": "^7.36.8", + "@tsed/platform-views": "^7.36.8", + "@tsed/schema": "^7.36.8", + "@tsed/swagger": "^7.36.8", + "ajv": "^8.12.0", + "barrelsby": "^2.8.1", + "body-parser": "^1.20.2", + "class-validator": "^0.13.2", + "compression": "^1.7.4", + "config": "^3.3.9", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "dotenv": "^16.3.1", + "dotenv-expand": "^10.0.0", + "dotenv-flow": "^3.3.0", + "express": "^4.18.2", + "helmet": "^7.0.0", + "method-override": "^3.0.0", + "mongoose": "^7.5.0" + }, + "devDependencies": { + "@hikers-book/cli-tools": "workspace:*", + "@hikers-book/config": "workspace:*", + "@hikers-book/eslint-config": "workspace:*", + "@tsed/cli-plugin-eslint": "4.6.4", + "@tsed/cli-plugin-jest": "4.6.4", + "@tsed/cli-plugin-mongoose": "4.6.4", + "@tsed/testing-mongoose": "^7.36.8", + "@types/body-parser": "^1.19.3", + "@types/compression": "^1.7.3", + "@types/config": "^3.3.1", + "@types/cookie-parser": "^1.4.4", + "@types/cors": "^2.8.14", + "@types/express": "^4.17.18", + "@types/jest": "^29.5.5", + "@types/method-override": "^0.0.33", + "@types/multer": "^1.4.8", + "@types/node": "^20.5.7", + "@types/supertest": "^2.0.14", + "@types/validator": "^13.11.2", + "jest": "^29.7.0", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "ts-node-dev": "^2.0.0", + "tsconfig-paths": "^4.2.0", + "tslib": "^2.6.2", + "typescript": "^5.2.2" + }, + "tsed": { + "convention": "conv_default", + "architecture": "arc_default", + "packageManager": "pnpm" + }, + "engines": { + "node": ">= 18.0.0", + "pnpm": ">= 8.7.0" + }, + "os": [ + "darwin", + "linux" + ] +} \ No newline at end of file diff --git a/api/trips/scripts/jest/teardown.js b/api/trips/scripts/jest/teardown.js new file mode 100644 index 0000000..80565fd --- /dev/null +++ b/api/trips/scripts/jest/teardown.js @@ -0,0 +1,3 @@ +module.exports = async () => { + (await global.__MONGOD__) && global.__MONGOD__.stop(); +}; diff --git a/api/trips/src/Server.integration.spec.ts b/api/trips/src/Server.integration.spec.ts new file mode 100644 index 0000000..43ae22e --- /dev/null +++ b/api/trips/src/Server.integration.spec.ts @@ -0,0 +1,26 @@ +import { PlatformTest } from '@tsed/common'; +import { TestMongooseContext } from '@tsed/testing-mongoose'; +import SuperTest from 'supertest'; +import { Server } from './Server'; + +describe('Server', () => { + let request: SuperTest.SuperTest; + + beforeEach(TestMongooseContext.bootstrap(Server)); + beforeEach(() => { + request = SuperTest(PlatformTest.callback()); + }); + + afterEach(TestMongooseContext.reset); + + it('should call GET /rest', async () => { + const response = await request.get('/rest').expect(404); + + expect(response.body).toEqual({ + errors: [], + message: 'Resource "/rest" not found', + name: 'NOT_FOUND', + status: 404 + }); + }); +}); diff --git a/api/trips/src/Server.ts b/api/trips/src/Server.ts new file mode 100644 index 0000000..6af5f0c --- /dev/null +++ b/api/trips/src/Server.ts @@ -0,0 +1,62 @@ +import { getHelmetDirectives, getSwaggerConfig } from '@hikers-book/tsed-swagger'; +import '@tsed/ajv'; +import { PlatformApplication } from '@tsed/common'; +import { Configuration, Inject } from '@tsed/di'; +import '@tsed/mongoose'; +import '@tsed/platform-express'; // /!\ keep this import +import bodyParser from 'body-parser'; +import compress from 'compression'; +import cookieParser from 'cookie-parser'; +import cors from 'cors'; +import helmet from 'helmet'; +import methodOverride from 'method-override'; +import { join } from 'path'; +import { config } from './config/index'; +import * as docs from './docs/controllers/pages/index'; +import * as rest from './v1/controllers/index'; + +@Configuration({ + ...config, + acceptMimes: ['application/json'], + disableComponentsScan: true, + mount: { + '/v1': [...Object.values(rest)], + '/': [...Object.values(docs)] + }, + swagger: getSwaggerConfig(join(__dirname, '../package.json')), + views: { + root: join(process.cwd(), '../views'), + extensions: { + ejs: 'ejs' + } + }, + exclude: ['**/*.spec.ts'] +}) +export class Server { + @Inject() + protected app!: PlatformApplication; + + @Configuration() + protected settings!: Configuration; + + $beforeRoutesInit(): void { + this.app + .use( + helmet({ + contentSecurityPolicy: { + directives: getHelmetDirectives() + } + }) + ) + .use(cors()) + .use(cookieParser()) + .use(compress({})) + .use(methodOverride()) + .use(bodyParser.json()) + .use( + bodyParser.urlencoded({ + extended: true + }) + ); + } +} diff --git a/api/trips/src/config/envs/index.ts b/api/trips/src/config/envs/index.ts new file mode 100644 index 0000000..b0d967e --- /dev/null +++ b/api/trips/src/config/envs/index.ts @@ -0,0 +1,9 @@ +import dotenv from 'dotenv'; + +export const envs = { + ...process.env, + // eslint-disable-next-line import/no-named-as-default-member + ...dotenv.config().parsed +}; + +export const isProduction = process.env.NODE_ENV === 'production'; diff --git a/api/trips/src/config/index.ts b/api/trips/src/config/index.ts new file mode 100644 index 0000000..ca1115b --- /dev/null +++ b/api/trips/src/config/index.ts @@ -0,0 +1,16 @@ +import cfg from 'config'; +import { readFileSync } from 'fs'; +import { envs } from './envs/index'; +import loggerConfig from './logger/index'; +import mongooseConfig from './mongoose/index'; + +const pkg = JSON.parse(readFileSync('./package.json', { encoding: 'utf8' })); + +export const config: Partial = { + version: pkg.version, + httpPort: cfg.get('server.httpPort'), + httpsPort: cfg.get('server.httpsPort'), + envs, + logger: loggerConfig, + mongoose: mongooseConfig +}; diff --git a/api/trips/src/config/logger/index.ts b/api/trips/src/config/logger/index.ts new file mode 100644 index 0000000..3c4c66d --- /dev/null +++ b/api/trips/src/config/logger/index.ts @@ -0,0 +1,24 @@ +import { $log, PlatformLoggerSettings } from '@tsed/common'; +import { isProduction } from '../envs/index'; + +if (isProduction) { + $log.appenders.set('stdout', { + type: 'stdout', + levels: ['info', 'debug'], + layout: { + type: 'json' + } + }); + + $log.appenders.set('stderr', { + levels: ['trace', 'fatal', 'error', 'warn'], + type: 'stderr', + layout: { + type: 'json' + } + }); +} + +export default { + disableRoutesSummary: isProduction +}; diff --git a/api/trips/src/config/mongoose/index.ts b/api/trips/src/config/mongoose/index.ts new file mode 100644 index 0000000..d07e3c8 --- /dev/null +++ b/api/trips/src/config/mongoose/index.ts @@ -0,0 +1,10 @@ +import cfg from 'config'; +import { ConnectOptions } from 'mongoose'; + +export default [ + { + id: 'trips', + url: cfg.get('mongodb.url'), + connectionOptions: cfg.get('mongodb.connectionOptions') + } +]; diff --git a/api/trips/src/docs/controllers/pages/SwaggerController.integration.spec.ts b/api/trips/src/docs/controllers/pages/SwaggerController.integration.spec.ts new file mode 100644 index 0000000..b4ab1fb --- /dev/null +++ b/api/trips/src/docs/controllers/pages/SwaggerController.integration.spec.ts @@ -0,0 +1,28 @@ +import { PlatformTest } from '@tsed/common'; +import { TestMongooseContext } from '@tsed/testing-mongoose'; +import SuperTest from 'supertest'; +import { Server } from '../../../Server'; +import { SwaggerController } from './SwaggerController'; + +describe('IndexController (swagger)', () => { + let request: SuperTest.SuperTest; + + beforeEach( + TestMongooseContext.bootstrap(Server, { + mount: { + '/': [SwaggerController] + } + }) + ); + beforeEach(() => { + request = SuperTest(PlatformTest.callback()); + }); + + afterEach(TestMongooseContext.reset); + + it('should call GET /', async () => { + const response = await request.get('/').expect(200); + + expect(response.text).toContain(`Ts.ED`); + }); +}); diff --git a/api/trips/src/docs/controllers/pages/SwaggerController.ts b/api/trips/src/docs/controllers/pages/SwaggerController.ts new file mode 100644 index 0000000..a53c63a --- /dev/null +++ b/api/trips/src/docs/controllers/pages/SwaggerController.ts @@ -0,0 +1,29 @@ +import { Constant, Controller } from '@tsed/di'; +import { HeaderParams } from '@tsed/platform-params'; +import { View } from '@tsed/platform-views'; +import { Get, Hidden, Returns } from '@tsed/schema'; +import { SwaggerSettings } from '@tsed/swagger'; + +@Hidden() +@Controller('/') +export class SwaggerController { + @Constant('swagger') + private swagger!: SwaggerSettings[]; + + @Get('/') + @View('swagger.ejs') + @Returns(200, String).ContentType('text/html') + get(@HeaderParams('x-forwarded-proto') protocol: string, @HeaderParams('host') host: string) { + const hostUrl = `${protocol || 'http'}://${host}`; + + return { + BASE_URL: hostUrl, + docs: this.swagger.map((conf) => { + return { + url: hostUrl + conf.path, + ...conf + }; + }) + }; + } +} diff --git a/api/trips/src/docs/controllers/pages/index.ts b/api/trips/src/docs/controllers/pages/index.ts new file mode 100644 index 0000000..f45c26c --- /dev/null +++ b/api/trips/src/docs/controllers/pages/index.ts @@ -0,0 +1,5 @@ +/** + * @file Automatically generated by barrelsby. + */ + +export * from './SwaggerController'; diff --git a/api/trips/src/index.ts b/api/trips/src/index.ts new file mode 100644 index 0000000..68d4a91 --- /dev/null +++ b/api/trips/src/index.ts @@ -0,0 +1,18 @@ +import { $log } from '@tsed/common'; +import { PlatformExpress } from '@tsed/platform-express'; +import { Server } from './Server'; + +async function bootstrap() { + try { + const platform = await PlatformExpress.bootstrap(Server); + await platform.listen(); + + process.on('SIGINT', () => { + platform.stop(); + }); + } catch (error) { + $log.error({ event: 'SERVER_BOOTSTRAP_ERROR', message: (error as Error).message, stack: (error as Error).stack }); + } +} + +bootstrap(); diff --git a/api/trips/src/v1/controllers/HelloWorldController.integration.spec.ts b/api/trips/src/v1/controllers/HelloWorldController.integration.spec.ts new file mode 100644 index 0000000..2f44dee --- /dev/null +++ b/api/trips/src/v1/controllers/HelloWorldController.integration.spec.ts @@ -0,0 +1,27 @@ +import { TestMongooseContext } from '@tsed/testing-mongoose'; +import SuperTest from 'supertest'; +import { Server } from '../../Server'; +import { HelloWorldController } from './HelloWorldController'; + +describe('HelloWorldController', () => { + let request: SuperTest.SuperTest; + + beforeEach( + TestMongooseContext.bootstrap(Server, { + mount: { + '/': [HelloWorldController] + } + }) + ); + beforeEach(() => { + request = SuperTest(TestMongooseContext.callback()); + }); + + afterEach(TestMongooseContext.reset); + + it('should call GET /hello-world', async () => { + const response = await request.get('/hello-world').expect(200); + + expect(response.text).toEqual('hello'); + }); +}); diff --git a/api/trips/src/v1/controllers/HelloWorldController.spec.ts b/api/trips/src/v1/controllers/HelloWorldController.spec.ts new file mode 100644 index 0000000..e8cefef --- /dev/null +++ b/api/trips/src/v1/controllers/HelloWorldController.spec.ts @@ -0,0 +1,14 @@ +import { PlatformTest } from '@tsed/common'; +import { HelloWorldController } from './HelloWorldController'; + +describe('HelloWorldController', () => { + beforeEach(PlatformTest.create); + afterEach(PlatformTest.reset); + + it('should do something', () => { + const instance = PlatformTest.get(HelloWorldController); + // const instance = PlatformTest.invoke(HelloWorldController); // get fresh instance + + expect(instance).toBeInstanceOf(HelloWorldController); + }); +}); diff --git a/api/trips/src/v1/controllers/HelloWorldController.ts b/api/trips/src/v1/controllers/HelloWorldController.ts new file mode 100644 index 0000000..5e4e5ef --- /dev/null +++ b/api/trips/src/v1/controllers/HelloWorldController.ts @@ -0,0 +1,10 @@ +import { Controller } from '@tsed/di'; +import { Get } from '@tsed/schema'; + +@Controller('/hello-world') +export class HelloWorldController { + @Get('/') + get() { + return 'hello'; + } +} diff --git a/api/trips/src/v1/controllers/index.ts b/api/trips/src/v1/controllers/index.ts new file mode 100644 index 0000000..3333dae --- /dev/null +++ b/api/trips/src/v1/controllers/index.ts @@ -0,0 +1,5 @@ +/** + * @file Automatically generated by barrelsby. + */ + +export * from './HelloWorldController'; diff --git a/api/trips/tsconfig.compile.json b/api/trips/tsconfig.compile.json new file mode 100644 index 0000000..e18df4e --- /dev/null +++ b/api/trips/tsconfig.compile.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "./dist", + "moduleResolution": "node", + "declaration": false, + "noResolve": false, + "preserveConstEnums": true, + "sourceMap": true, + "noEmit": false, + "emitDeclarationOnly": false, + "inlineSources": true + } +} diff --git a/api/trips/tsconfig.json b/api/trips/tsconfig.json new file mode 100644 index 0000000..37c6383 --- /dev/null +++ b/api/trips/tsconfig.json @@ -0,0 +1,38 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "sourceRoot": "src", + "module": "commonjs", + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "moduleResolution": "node", + "isolatedModules": false, + "suppressImplicitAnyIndexErrors": false, + "noImplicitAny": true, + "strictNullChecks": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "allowSyntheticDefaultImports": true, + "importHelpers": true, + "newLine": "LF", + "noEmit": true, + "resolveJsonModule": true, + "lib": [ + "es7", + "dom", + "ESNext.AsyncIterable" + ], + "typeRoots": [ + "./node_modules/@types" + ] + }, + "include": [ + "src" + ], + "linterOptions": { + "exclude": [] + } +} diff --git a/api/trips/views/swagger.ejs b/api/trips/views/swagger.ejs new file mode 100644 index 0000000..66b9ed5 --- /dev/null +++ b/api/trips/views/swagger.ejs @@ -0,0 +1,100 @@ + + + + + + + + client + + + + +
+
+ + + +
+
+ + + diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..1e0c520 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,59 @@ +FROM node:18-slim AS base + +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" + +RUN corepack enable +RUN apt-get update && apt-get install -y build-essential python3 + +WORKDIR /app + +COPY . . + +# INSATLL PRODUCTION DEPENDENCIES +FROM base AS prod-deps +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile + +# BUILD EVERYTHING +FROM base AS build +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile +RUN pnpm run -r build + +# COPY PACKAGES +FROM base AS packages +ENV NODE_ENV production +COPY --from=prod-deps /app/node_modules /app/node_modules +COPY --from=prod-deps /app/packages /app/packages + +# COMPLETE AUTHENTICATION API +FROM packages AS api-authentication +COPY --from=prod-deps /app/api/authentication/node_modules/ /app/api/authentication/node_modules +COPY --from=build /app/api/authentication/dist /app/api/authentication/dist +WORKDIR /app/api/authentication +CMD [ "pnpm", "start:prod" ] + +# COMPLETE GRAPHQL API +FROM packages AS api-graphql +COPY --from=prod-deps /app/api/graphql/node_modules/ /app/api/graphql/node_modules +COPY --from=build /app/api/graphql/dist /app/api/graphql/dist +WORKDIR /app/api/graphql +CMD [ "pnpm", "start:prod" ] + +# COMPLETE STAGES API +FROM packages AS api-stages +COPY --from=prod-deps /app/api/stages/node_modules/ /app/api/stages/node_modules +COPY --from=build /app/api/stages/dist /app/api/stages/dist +WORKDIR /app/api/stages +CMD [ "pnpm", "start:prod" ] + +# COMPLETE TRIPS API +FROM packages AS api-trips +COPY --from=prod-deps /app/api/trips/node_modules/ /app/api/trips/node_modules +COPY --from=build /app/api/trips/dist /app/api/trips/dist +WORKDIR /app/api/trips +CMD [ "pnpm", "start:prod" ] + +# COMPLETE HIKER'S BOOK UI +FROM nginx:1.25 AS ui-hikers-book +COPY --from=build /app/ui/hikers-book/dist/ /usr/share/nginx/html +COPY ./docker/nginx/hikers-book.conf /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/docker/Dockerfile.api.graphql.dockerfile b/docker/Dockerfile.api.graphql.dockerfile deleted file mode 100644 index 3a59bc0..0000000 --- a/docker/Dockerfile.api.graphql.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM node:18 as build-stage -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable - -WORKDIR /app - -COPY package.json . -COPY pnpm-lock.yaml . -COPY pnpm-workspace.yaml . -COPY tsconfig.json . - -COPY api/graphql/package.json api/graphql/package.json - -RUN pnpm --filter graphql-api install - -COPY api/graphql api/graphql - -RUN pnpm --filter graphql-api run build - -WORKDIR /app/api/graphql - -CMD [ "pnpm", "start:prod" ] \ No newline at end of file diff --git a/docker/Dockerfile.ui.hikers-book.dockerfile b/docker/Dockerfile.ui.hikers-book.dockerfile deleted file mode 100644 index 4a219a1..0000000 --- a/docker/Dockerfile.ui.hikers-book.dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM node:18 as build-stage -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable -RUN pnpm install -g @angular/cli - -WORKDIR /app - -COPY package.json . -COPY pnpm-lock.yaml . -COPY pnpm-workspace.yaml . -COPY tsconfig.json . - -COPY ui/hikers-book/package.json ui/hikers-book/package.json - -RUN pnpm --filter hikers-book-ui install - -COPY ui/hikers-book ui/hikers-book - -RUN pnpm --filter hikers-book-ui run build - -FROM nginx:1.25 -COPY --from=build-stage /app/ui/hikers-book/dist/ /usr/share/nginx/html -COPY ./docker/nginx/hikers-book.conf /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/docker/Readme.md b/docker/Readme.md index afa2462..471078a 100644 --- a/docker/Readme.md +++ b/docker/Readme.md @@ -6,14 +6,12 @@ ## Build Hiker's Book containers -Just prepend package.json scripts with `VERSION=major.minor.patch`. Note that the Docker files are written as if they expect context at the root of this repository, `docker build` has path set to `../` - ```sh -VERSION=latest pnpm run build:ui:hikers-book +pnpm run docker:build ``` ## Run Hiker's Book containers ```sh -VERSION=latest pnpm run run:ui:hikers-book +pnpm run docker:up ``` diff --git a/docker/config/api.authentication.json b/docker/config/api.authentication.json new file mode 100644 index 0000000..745a005 --- /dev/null +++ b/docker/config/api.authentication.json @@ -0,0 +1,10 @@ +{ + "mongodb": { + "url": "mongodb://hiker:hikers_password@mongo:27017/hikers-book", + "connectionOptions": {} + }, + "server": { + "httpPort": 5501, + "httpsPort": false + } +} \ No newline at end of file diff --git a/docker/config/api.graphql.json b/docker/config/api.graphql.json index 42e0fac..4c1a997 100644 --- a/docker/config/api.graphql.json +++ b/docker/config/api.graphql.json @@ -4,7 +4,7 @@ "connectionOptions": {} }, "server": { - "httpPort": 8083, + "httpPort": 5502, "httpsPort": false } } \ No newline at end of file diff --git a/docker/config/api.stages.json b/docker/config/api.stages.json new file mode 100644 index 0000000..158136a --- /dev/null +++ b/docker/config/api.stages.json @@ -0,0 +1,10 @@ +{ + "mongodb": { + "url": "mongodb://hiker:hikers_password@mongo:27017/hikers-book", + "connectionOptions": {} + }, + "server": { + "httpPort": 5503, + "httpsPort": false + } +} \ No newline at end of file diff --git a/docker/config/api.trips.json b/docker/config/api.trips.json new file mode 100644 index 0000000..17ba667 --- /dev/null +++ b/docker/config/api.trips.json @@ -0,0 +1,10 @@ +{ + "mongodb": { + "url": "mongodb://hiker:hikers_password@mongo:27017/hikers-book", + "connectionOptions": {} + }, + "server": { + "httpPort": 5504, + "httpsPort": false + } +} \ No newline at end of file diff --git a/docker/config/ui.hikers-book.json b/docker/config/ui.hikers-book.json index f53af95..5819ecc 100644 --- a/docker/config/ui.hikers-book.json +++ b/docker/config/ui.hikers-book.json @@ -1,5 +1,8 @@ { "api": { - "graphql": "http://localhost:8083/graphql" + "authentication": "http://localhost:5501/v1", + "graphql": "http://localhost:5502/v1/graphql", + "stages": "http://localhost:5503/v1", + "trips": "http://localhost:5504/v1" } } \ No newline at end of file diff --git a/docker/docker-compose.hikers-book.build.yml b/docker/docker-compose.hikers-book.build.yml new file mode 100644 index 0000000..e89b332 --- /dev/null +++ b/docker/docker-compose.hikers-book.build.yml @@ -0,0 +1,40 @@ +version: '3.5' +services: + ui-hikers-book: + image: radoslavirha/hikers-book-ui-hikers-book:latest + build: + context: ../ + dockerfile: ./docker/Dockerfile + target: ui-hikers-book + api-authentication: + image: radoslavirha/hikers-book-api-authentication:latest + build: + context: ../ + dockerfile: ./docker/Dockerfile + target: api-authentication + depends_on: + - ui-hikers-book + api-graphql: + image: radoslavirha/hikers-book-api-graphql:latest + build: + context: ../ + dockerfile: ./docker/Dockerfile + target: api-graphql + depends_on: + - api-authentication + api-stages: + image: radoslavirha/hikers-book-api-stages:latest + build: + context: ../ + dockerfile: ./docker/Dockerfile + target: api-stages + depends_on: + - api-graphql + api-trips: + image: radoslavirha/hikers-book-api-trips:latest + build: + context: ../ + dockerfile: ./docker/Dockerfile + target: api-trips + depends_on: + - api-stages diff --git a/docker/docker-compose.hikers-book.yml b/docker/docker-compose.hikers-book.yml index 8c7e133..1683d01 100644 --- a/docker/docker-compose.hikers-book.yml +++ b/docker/docker-compose.hikers-book.yml @@ -1,12 +1,10 @@ version: '3.5' services: - hikers-book-ui-hikers-book: - image: radoslavirha/hikers-book-ui-hikers-book:$VERSION + ui-hikers-book: + image: radoslavirha/hikers-book-ui-hikers-book:latest container_name: hikers-book-ui-hikers-book hostname: hikers-book-ui-hikers-book restart: always - depends_on: - - hikers-book-api-graphql environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: password @@ -15,12 +13,39 @@ services: - 80:80 volumes: - ./config/ui.hikers-book.json:/usr/share/nginx/html/config.json:ro - hikers-book-api-graphql: - image: radoslavirha/hikers-book-api-graphql:$VERSION + api-authentication: + image: radoslavirha/hikers-book-api-authentication:latest + container_name: hikers-book-api-authentication + hostname: hikers-book-api-authentication + restart: always + ports: + - 5501:5501 + volumes: + - ./config/api.authentication.json:/app/api/authentication/config/production.json:ro + api-graphql: + image: radoslavirha/hikers-book-api-graphql:latest container_name: hikers-book-api-graphql hostname: hikers-book-api-graphql restart: always ports: - - 8083:8083 + - 5502:5502 + volumes: + - ./config/api.graphql.json:/app/api/graphql/config/production.json:ro + api-stages: + image: radoslavirha/hikers-book-api-stages:latest + container_name: hikers-book-api-stages + hostname: hikers-book-api-stages + restart: always + ports: + - 5503:5503 + volumes: + - ./config/api.stages.json:/app/api/stages/config/production.json:ro + api-trips: + image: radoslavirha/hikers-book-api-trips:latest + container_name: hikers-book-api-trips + hostname: hikers-book-api-trips + restart: always + ports: + - 5504:5504 volumes: - - ./config/api.graphql.json:/app/api/graphql/config/production.json:ro \ No newline at end of file + - ./config/api.trips.json:/app/api/trips/config/production.json:ro \ No newline at end of file diff --git a/docker/package.json b/docker/package.json index bbad688..ea28440 100644 --- a/docker/package.json +++ b/docker/package.json @@ -3,9 +3,7 @@ "version": "1.0.0", "description": "", "scripts": { - "build": "pnpm run build:ui:hikers-book && pnpm run build:api:graphql", - "build:api:graphql": "docker build -f Dockerfile.api.graphql.dockerfile -t radoslavirha/hikers-book-api-graphql:$VERSION ../", - "build:ui:hikers-book": "docker build -f Dockerfile.ui.hikers-book.dockerfile -t radoslavirha/hikers-book-ui-hikers-book:$VERSION ../", - "run": "docker compose -f docker-compose.hikers-book.yml up" + "docker:up": "docker compose -f docker-compose.hikers-book.yml up", + "docker:build": "docker compose -f docker-compose.hikers-book.build.yml build" } } diff --git a/package.json b/package.json index 7047b4e..f593517 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,18 @@ "scripts": { "build": "pnpm --stream -r run build", "clean": "rm -rf .parcel-cache && pnpm -r run clean", + "config": "pnpm --filter '@hikers-book/config' run config && pnpm --filter=!'@hikers-book/config' run config:all", + "config:clear": "pnpm --stream -r run config:clear", "lint": "pnpm --stream -r run lint", "format": "pnpm --stream -r run format", "test": "pnpm --stream -r run test", "changelog": "conventional-changelog -p conventionalcommits -i CHANGELOG.md -s && git add CHANGELOG.md", - "ci:version": "pnpm changelog && pnpm changeset version && pnpm install --no-frozen-lockfile && git add ." + "ci:version": "pnpm changelog && pnpm changeset version && pnpm install --no-frozen-lockfile && git add .", + "prepare": "husky install" + }, + "dependencies": { + "husky": "^8.0.3" }, - "devDependencies": {}, "engines": { "node": ">= 18.0.0", "pnpm": ">= 8.7.0" @@ -22,4 +27,4 @@ "darwin", "linux" ] -} \ No newline at end of file +} diff --git a/packages/cli-tools/package.json b/packages/cli-tools/package.json index b50cbb3..217e8ea 100644 --- a/packages/cli-tools/package.json +++ b/packages/cli-tools/package.json @@ -10,7 +10,7 @@ "build": "npx tsc", "format": "eslint --ext .ts --fix src", "lint": "eslint --ext .ts src", - "postinstall": "yarn build || true" + "postinstall": "pnpm build || true" }, "dependencies": { "chalk": "4.1.2", diff --git a/packages/config/config/api.authentication.template.json b/packages/config/config/api.authentication.template.json new file mode 100644 index 0000000..9a304e0 --- /dev/null +++ b/packages/config/config/api.authentication.template.json @@ -0,0 +1,10 @@ +{ + "mongodb": { + "url": "mongodb://hiker:hikers_password@localhost:27017/hikers-book", + "connectionOptions": {} + }, + "server": { + "httpPort": 5501, + "httpsPort": false + } +} \ No newline at end of file diff --git a/packages/config/config/api.graphql.template.json b/packages/config/config/api.graphql.template.json index f40ee93..4076805 100644 --- a/packages/config/config/api.graphql.template.json +++ b/packages/config/config/api.graphql.template.json @@ -4,7 +4,7 @@ "connectionOptions": {} }, "server": { - "httpPort": 8083, + "httpPort": 5502, "httpsPort": false } } \ No newline at end of file diff --git a/packages/config/config/api.stages.template.json b/packages/config/config/api.stages.template.json new file mode 100644 index 0000000..36adebb --- /dev/null +++ b/packages/config/config/api.stages.template.json @@ -0,0 +1,10 @@ +{ + "mongodb": { + "url": "mongodb://hiker:hikers_password@localhost:27017/hikers-book", + "connectionOptions": {} + }, + "server": { + "httpPort": 5503, + "httpsPort": false + } +} \ No newline at end of file diff --git a/packages/config/config/api.trips.template.json b/packages/config/config/api.trips.template.json new file mode 100644 index 0000000..be9652f --- /dev/null +++ b/packages/config/config/api.trips.template.json @@ -0,0 +1,10 @@ +{ + "mongodb": { + "url": "mongodb://hiker:hikers_password@localhost:27017/hikers-book", + "connectionOptions": {} + }, + "server": { + "httpPort": 5504, + "httpsPort": false + } +} \ No newline at end of file diff --git a/packages/config/config/ui.hikers-book.template.json b/packages/config/config/ui.hikers-book.template.json index f53af95..5819ecc 100644 --- a/packages/config/config/ui.hikers-book.template.json +++ b/packages/config/config/ui.hikers-book.template.json @@ -1,5 +1,8 @@ { "api": { - "graphql": "http://localhost:8083/graphql" + "authentication": "http://localhost:5501/v1", + "graphql": "http://localhost:5502/v1/graphql", + "stages": "http://localhost:5503/v1", + "trips": "http://localhost:5504/v1" } } \ No newline at end of file diff --git a/packages/config/environment-variables/api.authentication.json b/packages/config/environment-variables/api.authentication.json new file mode 100644 index 0000000..aab3fbe --- /dev/null +++ b/packages/config/environment-variables/api.authentication.json @@ -0,0 +1,13 @@ +{ + "mongodb": { + "url": "MONGODB_URL", + "connectionOptions": { + "__name": "MONGODB_CONNECTION_OPTIONS", + "__format": "json" + } + }, + "server": { + "httpPort": "SERVER_HTTP_PORT", + "httpsPort": "SERVER_HTTPS_PORT" + } +} \ No newline at end of file diff --git a/packages/config/environment-variables/api.stages.json b/packages/config/environment-variables/api.stages.json new file mode 100644 index 0000000..aab3fbe --- /dev/null +++ b/packages/config/environment-variables/api.stages.json @@ -0,0 +1,13 @@ +{ + "mongodb": { + "url": "MONGODB_URL", + "connectionOptions": { + "__name": "MONGODB_CONNECTION_OPTIONS", + "__format": "json" + } + }, + "server": { + "httpPort": "SERVER_HTTP_PORT", + "httpsPort": "SERVER_HTTPS_PORT" + } +} \ No newline at end of file diff --git a/packages/config/environment-variables/api.trips.json b/packages/config/environment-variables/api.trips.json new file mode 100644 index 0000000..aab3fbe --- /dev/null +++ b/packages/config/environment-variables/api.trips.json @@ -0,0 +1,13 @@ +{ + "mongodb": { + "url": "MONGODB_URL", + "connectionOptions": { + "__name": "MONGODB_CONNECTION_OPTIONS", + "__format": "json" + } + }, + "server": { + "httpPort": "SERVER_HTTP_PORT", + "httpsPort": "SERVER_HTTPS_PORT" + } +} \ No newline at end of file diff --git a/packages/config/package.json b/packages/config/package.json index 8af5dbf..84d959f 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -3,9 +3,13 @@ "version": "0.4.0", "description": "Hiker's Book configs", "scripts": { - "config": "pnpm run config:ui:hikers-book && pnpm run config:api:graphql", + "config": "pnpm run config:ui:hikers-book && pnpm run config:api:authentication && pnpm run config:api:graphql && pnpm run config:api:stages && pnpm run config:api:trips", + "config:api:authentication": "hikers-book-config-cli -s config/api.authentication.template.json -t config/api.authentication.json -f json", "config:api:graphql": "hikers-book-config-cli -s config/api.graphql.template.json -t config/api.graphql.json -f json", + "config:api:stages": "hikers-book-config-cli -s config/api.stages.template.json -t config/api.stages.json -f json", + "config:api:trips": "hikers-book-config-cli -s config/api.trips.template.json -t config/api.trips.json -f json", "config:ui:hikers-book": "hikers-book-config-cli -s config/ui.hikers-book.template.json -t config/ui.hikers-book.json -f json", + "config:clear": "find ./config -name '*.json' -and -not -name '*.template.json' -type f -delete", "postinstall": "pnpm run config" }, "dependencies": { diff --git a/packages/tsed-swagger/.eslintrc.js b/packages/tsed-swagger/.eslintrc.js new file mode 100644 index 0000000..347084c --- /dev/null +++ b/packages/tsed-swagger/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['@hikers-book/eslint-config'] +}; diff --git a/packages/tsed-swagger/Readme.md b/packages/tsed-swagger/Readme.md new file mode 100644 index 0000000..92ef996 --- /dev/null +++ b/packages/tsed-swagger/Readme.md @@ -0,0 +1 @@ +# Hiker's Book Ts.ED Swagger config diff --git a/packages/tsed-swagger/package.json b/packages/tsed-swagger/package.json new file mode 100644 index 0000000..f04de6f --- /dev/null +++ b/packages/tsed-swagger/package.json @@ -0,0 +1,30 @@ +{ + "name": "@hikers-book/tsed-swagger", + "version": "0.4.0", + "description": "Hiker's Book Ts.ED Swagger", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "npx tsc", + "format": "eslint --ext .ts --fix src", + "lint": "eslint --ext .ts src", + "postinstall": "pnpm build || true" + }, + "dependencies": { + "@tsed/openspec": "^7.36.8", + "@tsed/swagger": "^7.36.8" + }, + "devDependencies": { + "@hikers-book/eslint-config": "workspace:*", + "@types/node": "^20.5.7", + "typescript": "^5.2.2" + }, + "engines": { + "node": ">= 18.0.0", + "pnpm": ">= 8.7.0" + }, + "os": [ + "darwin", + "linux" + ] +} diff --git a/packages/tsed-swagger/src/index.ts b/packages/tsed-swagger/src/index.ts new file mode 100644 index 0000000..15ae194 --- /dev/null +++ b/packages/tsed-swagger/src/index.ts @@ -0,0 +1,58 @@ +import { OpenSpec2, OpenSpec3, OpenSpecInfo } from '@tsed/openspec'; +// eslint-disable-next-line import/no-duplicates +import '@tsed/swagger'; +// eslint-disable-next-line import/no-duplicates +import { SwaggerSettings } from '@tsed/swagger'; +import { readFileSync } from 'fs'; + +export const getSwaggerConfig = (path: string): SwaggerSettings[] => { + const pkg = JSON.parse(readFileSync(path, { encoding: 'utf8' })); + + const info: OpenSpecInfo = { + title: pkg.name, + version: pkg.version, + description: pkg.description + }; + + const specOS2: Partial = { + info, + securityDefinitions: { + basic: { + type: 'basic' + } + } + }; + + const specOS3: Partial = { + info, + components: { + securitySchemes: { + basic: { + type: 'http', + scheme: 'basic', + bearerFormat: '' + } + } + } + }; + + return [ + { + path: '/v2/docs', + specVersion: '2.0', + spec: specOS2 + }, + { + path: '/v3/docs', + specVersion: '3.0.1', + spec: specOS3 + } + ]; +}; + +export const getHelmetDirectives = () => ({ + defaultSrc: [`'self'`], + styleSrc: [`'self'`, `'unsafe-inline'`], + imgSrc: [`'self'`, 'data:', 'validator.swagger.io'], + scriptSrc: [`'self'`, `https: 'unsafe-inline'`] +}); diff --git a/packages/tsed-swagger/tsconfig.json b/packages/tsed-swagger/tsconfig.json new file mode 100644 index 0000000..0e7cead --- /dev/null +++ b/packages/tsed-swagger/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "src", + "module": "commonjs", + "declaration": true, + "incremental": false + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d8afde..41facbe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,76 +6,270 @@ settings: importers: - .: {} + .: + dependencies: + husky: + specifier: ^8.0.3 + version: 8.0.3 - api/graphql: + api/authentication: dependencies: + '@hikers-book/tsed-swagger': + specifier: workspace:* + version: link:../../packages/tsed-swagger '@tsed/ajv': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6)(ajv-errors@3.0.0)(ajv@8.12.0) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8)(ajv-errors@3.0.0)(ajv@8.12.0) '@tsed/common': - specifier: ^7.34.6 - version: 7.34.6(@tsed/engines@7.34.6)(@tsed/logger-file@6.6.2)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8) '@tsed/core': - specifier: ^7.34.6 - version: 7.34.6 + specifier: ^7.36.8 + version: 7.36.8 '@tsed/di': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) '@tsed/engines': - specifier: ^7.34.6 - version: 7.34.6 + specifier: ^7.36.8 + version: 7.36.8 '@tsed/exceptions': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8) '@tsed/json-mapper': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) '@tsed/logger': - specifier: ^6.6.2 - version: 6.6.2 + specifier: ^6.6.3 + version: 6.6.3 '@tsed/logger-file': - specifier: ^6.6.2 - version: 6.6.2(@tsed/logger@6.6.2) + specifier: ^6.6.3 + version: 6.6.3(@tsed/logger@6.6.3) '@tsed/mongoose': - specifier: ^7.34.6 - version: 7.34.6(@tsed/ajv@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6)(mongoose@7.5.0) - '@tsed/openspec': - specifier: ^7.34.6 - version: 7.34.6 + specifier: ^7.36.8 + version: 7.36.8(@tsed/ajv@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8)(mongoose@7.5.0) '@tsed/platform-cache': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) '@tsed/platform-exceptions': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) '@tsed/platform-express': - specifier: ^7.34.6 - version: 7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6)(@tsed/platform-views@7.34.6)(@tsed/schema@7.34.6)(@types/multer@1.4.7)(body-parser@1.20.2)(multer@1.4.5-lts.1) + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8)(@tsed/platform-views@7.36.8)(@tsed/schema@7.36.8)(@types/multer@1.4.8)(body-parser@1.20.2)(multer@1.4.5-lts.1) '@tsed/platform-log-middleware': - specifier: ^7.34.6 - version: 7.34.6(@tsed/di@7.34.6)(@tsed/platform-middlewares@7.34.6)(@tsed/platform-params@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/di@7.36.8)(@tsed/platform-middlewares@7.36.8)(@tsed/platform-params@7.36.8) '@tsed/platform-middlewares': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/schema@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/schema@7.36.8) '@tsed/platform-params': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) '@tsed/platform-response-filter': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) '@tsed/platform-views': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/engines@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/engines@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) '@tsed/schema': - specifier: ^7.34.6 - version: 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) '@tsed/swagger': - specifier: ^7.34.6 - version: 7.34.6(@tsed/common@7.34.6) + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8) + ajv: + specifier: ^8.12.0 + version: 8.12.0 + barrelsby: + specifier: ^2.8.1 + version: 2.8.1 + body-parser: + specifier: ^1.20.2 + version: 1.20.2 + class-validator: + specifier: ^0.13.2 + version: 0.13.2 + compression: + specifier: ^1.7.4 + version: 1.7.4 + config: + specifier: ^3.3.9 + version: 3.3.9 + cookie-parser: + specifier: ^1.4.6 + version: 1.4.6 + cors: + specifier: ^2.8.5 + version: 2.8.5 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + dotenv-expand: + specifier: ^10.0.0 + version: 10.0.0 + dotenv-flow: + specifier: ^3.3.0 + version: 3.3.0 + express: + specifier: ^4.18.2 + version: 4.18.2 + helmet: + specifier: ^7.0.0 + version: 7.0.0 + method-override: + specifier: ^3.0.0 + version: 3.0.0 + mongoose: + specifier: ^7.5.0 + version: 7.5.0 + devDependencies: + '@hikers-book/cli-tools': + specifier: workspace:* + version: link:../../packages/cli-tools + '@hikers-book/config': + specifier: workspace:* + version: link:../../packages/config + '@hikers-book/eslint-config': + specifier: workspace:* + version: link:../../packages/eslint-config + '@tsed/cli-plugin-eslint': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/cli-plugin-jest': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/cli-plugin-mongoose': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/testing-mongoose': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/mongoose@7.36.8)(mongoose@7.5.0) + '@types/body-parser': + specifier: ^1.19.3 + version: 1.19.3 + '@types/compression': + specifier: ^1.7.3 + version: 1.7.3 + '@types/config': + specifier: ^3.3.1 + version: 3.3.1 + '@types/cookie-parser': + specifier: ^1.4.4 + version: 1.4.4 + '@types/cors': + specifier: ^2.8.14 + version: 2.8.14 + '@types/express': + specifier: ^4.17.18 + version: 4.17.18 + '@types/jest': + specifier: ^29.5.5 + version: 29.5.5 + '@types/method-override': + specifier: ^0.0.33 + version: 0.0.33 + '@types/multer': + specifier: ^1.4.8 + version: 1.4.8 + '@types/node': + specifier: ^20.5.7 + version: 20.5.7 + '@types/supertest': + specifier: ^2.0.14 + version: 2.0.14 + '@types/validator': + specifier: ^13.11.2 + version: 13.11.2 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) + supertest: + specifier: ^6.3.3 + version: 6.3.3 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.22.9)(jest@29.7.0)(typescript@5.2.2) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.5.7)(typescript@5.2.2) + ts-node-dev: + specifier: ^2.0.0 + version: 2.0.0(@types/node@20.5.7)(typescript@5.2.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + tslib: + specifier: ^2.6.2 + version: 2.6.2 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + + api/graphql: + dependencies: + '@tsed/ajv': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8)(ajv-errors@3.0.0)(ajv@8.12.0) + '@tsed/common': + specifier: ^7.36.8 + version: 7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8) + '@tsed/core': + specifier: ^7.36.8 + version: 7.36.8 + '@tsed/di': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/engines': + specifier: ^7.36.8 + version: 7.36.8 + '@tsed/exceptions': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8) + '@tsed/json-mapper': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/logger': + specifier: ^6.6.3 + version: 6.6.3 + '@tsed/logger-file': + specifier: ^6.6.3 + version: 6.6.3(@tsed/logger@6.6.3) + '@tsed/mongoose': + specifier: ^7.36.8 + version: 7.36.8(@tsed/ajv@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8)(mongoose@7.5.0) + '@tsed/platform-cache': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-exceptions': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-express': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8)(@tsed/platform-views@7.36.8)(@tsed/schema@7.36.8)(@types/multer@1.4.8)(body-parser@1.20.2)(multer@1.4.5-lts.1) + '@tsed/platform-log-middleware': + specifier: ^7.36.8 + version: 7.36.8(@tsed/di@7.36.8)(@tsed/platform-middlewares@7.36.8)(@tsed/platform-params@7.36.8) + '@tsed/platform-middlewares': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-params': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-response-filter': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-views': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/engines@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) '@tsed/typegraphql': - specifier: ^7.34.6 - version: 7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/logger@6.6.2)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(class-validator@0.13.2)(graphql@15.8.0)(type-graphql@1.1.1) + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/logger@6.6.3)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(class-validator@0.13.2)(graphql@15.8.0)(type-graphql@1.1.1) ajv: specifier: ^8.12.0 version: 8.12.0 @@ -92,8 +286,8 @@ importers: specifier: 3.12.1 version: 3.12.1(express@4.18.2)(graphql@15.8.0) barrelsby: - specifier: ^2.8.0 - version: 2.8.0 + specifier: ^2.8.1 + version: 2.8.1 body-parser: specifier: ^1.20.2 version: 1.20.2 @@ -130,6 +324,9 @@ importers: graphql: specifier: ^15.7.2 version: 15.8.0 + helmet: + specifier: ^7.0.0 + version: 7.0.0 method-override: specifier: ^3.0.0 version: 3.0.0 @@ -150,8 +347,8 @@ importers: specifier: workspace:* version: link:../../packages/eslint-config '@tsed/apollo': - specifier: ^7.34.6 - version: 7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/logger@6.6.2)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(graphql@15.8.0) + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/logger@6.6.3)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(graphql@15.8.0) '@tsed/cli-plugin-eslint': specifier: 4.6.4 version: 4.6.4 @@ -165,41 +362,44 @@ importers: specifier: 4.6.4 version: 4.6.4(@tsed/cli-core@4.6.4)(@tsed/cli@4.6.4) '@tsed/testing-mongoose': - specifier: ^7.34.6 - version: 7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/mongoose@7.34.6)(mongoose@7.5.0) + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/mongoose@7.36.8)(mongoose@7.5.0) + '@types/body-parser': + specifier: ^1.19.3 + version: 1.19.3 '@types/compression': - specifier: ^1.7.2 - version: 1.7.2 + specifier: ^1.7.3 + version: 1.7.3 '@types/config': specifier: ^3.3.1 version: 3.3.1 '@types/cookie-parser': - specifier: ^1.4.3 - version: 1.4.3 + specifier: ^1.4.4 + version: 1.4.4 '@types/cors': - specifier: ^2.8.13 - version: 2.8.13 + specifier: ^2.8.14 + version: 2.8.14 '@types/express': - specifier: ^4.17.17 - version: 4.17.17 + specifier: ^4.17.18 + version: 4.17.18 '@types/jest': - specifier: ^29.5.4 - version: 29.5.4 + specifier: ^29.5.5 + version: 29.5.5 '@types/method-override': - specifier: ^0.0.32 - version: 0.0.32 + specifier: ^0.0.33 + version: 0.0.33 '@types/multer': - specifier: ^1.4.7 - version: 1.4.7 + specifier: ^1.4.8 + version: 1.4.8 '@types/node': specifier: ^20.5.7 version: 20.5.7 '@types/supertest': - specifier: ^2.0.12 - version: 2.0.12 + specifier: ^2.0.14 + version: 2.0.14 '@types/validator': - specifier: ^13.11.1 - version: 13.11.1 + specifier: ^13.11.2 + version: 13.11.2 apollo-server-testing: specifier: ^2.25.3 version: 2.25.3(graphql@15.8.0) @@ -207,14 +407,406 @@ importers: specifier: ^2.12.6 version: 2.12.6(graphql@15.8.0) jest: - specifier: ^29.6.4 - version: 29.6.4(@types/node@20.5.7)(ts-node@10.9.1) + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) + supertest: + specifier: ^6.3.3 + version: 6.3.3 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.22.9)(jest@29.7.0)(typescript@5.2.2) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.5.7)(typescript@5.2.2) + ts-node-dev: + specifier: ^2.0.0 + version: 2.0.0(@types/node@20.5.7)(typescript@5.2.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + tslib: + specifier: ^2.6.2 + version: 2.6.2 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + + api/stages: + dependencies: + '@hikers-book/tsed-swagger': + specifier: workspace:* + version: link:../../packages/tsed-swagger + '@tsed/ajv': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8)(ajv-errors@3.0.0)(ajv@8.12.0) + '@tsed/common': + specifier: ^7.36.8 + version: 7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8) + '@tsed/core': + specifier: ^7.36.8 + version: 7.36.8 + '@tsed/di': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/engines': + specifier: ^7.36.8 + version: 7.36.8 + '@tsed/exceptions': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8) + '@tsed/json-mapper': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/logger': + specifier: ^6.6.3 + version: 6.6.3 + '@tsed/logger-file': + specifier: ^6.6.3 + version: 6.6.3(@tsed/logger@6.6.3) + '@tsed/mongoose': + specifier: ^7.36.8 + version: 7.36.8(@tsed/ajv@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8)(mongoose@7.5.0) + '@tsed/platform-cache': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-exceptions': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-express': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8)(@tsed/platform-views@7.36.8)(@tsed/schema@7.36.8)(@types/multer@1.4.8)(body-parser@1.20.2)(multer@1.4.5-lts.1) + '@tsed/platform-log-middleware': + specifier: ^7.36.8 + version: 7.36.8(@tsed/di@7.36.8)(@tsed/platform-middlewares@7.36.8)(@tsed/platform-params@7.36.8) + '@tsed/platform-middlewares': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-params': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-response-filter': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-views': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/engines@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) + '@tsed/swagger': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8) + ajv: + specifier: ^8.12.0 + version: 8.12.0 + barrelsby: + specifier: ^2.8.1 + version: 2.8.1 + body-parser: + specifier: ^1.20.2 + version: 1.20.2 + class-validator: + specifier: ^0.13.2 + version: 0.13.2 + compression: + specifier: ^1.7.4 + version: 1.7.4 + config: + specifier: ^3.3.9 + version: 3.3.9 + cookie-parser: + specifier: ^1.4.6 + version: 1.4.6 + cors: + specifier: ^2.8.5 + version: 2.8.5 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + dotenv-expand: + specifier: ^10.0.0 + version: 10.0.0 + dotenv-flow: + specifier: ^3.3.0 + version: 3.3.0 + express: + specifier: ^4.18.2 + version: 4.18.2 + helmet: + specifier: ^7.0.0 + version: 7.0.0 + method-override: + specifier: ^3.0.0 + version: 3.0.0 + mongoose: + specifier: ^7.5.0 + version: 7.5.0 + devDependencies: + '@hikers-book/cli-tools': + specifier: workspace:* + version: link:../../packages/cli-tools + '@hikers-book/config': + specifier: workspace:* + version: link:../../packages/config + '@hikers-book/eslint-config': + specifier: workspace:* + version: link:../../packages/eslint-config + '@tsed/cli-plugin-eslint': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/cli-plugin-jest': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/cli-plugin-mongoose': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/testing-mongoose': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/mongoose@7.36.8)(mongoose@7.5.0) + '@types/body-parser': + specifier: ^1.19.3 + version: 1.19.3 + '@types/compression': + specifier: ^1.7.3 + version: 1.7.3 + '@types/config': + specifier: ^3.3.1 + version: 3.3.1 + '@types/cookie-parser': + specifier: ^1.4.4 + version: 1.4.4 + '@types/cors': + specifier: ^2.8.14 + version: 2.8.14 + '@types/express': + specifier: ^4.17.18 + version: 4.17.18 + '@types/jest': + specifier: ^29.5.5 + version: 29.5.5 + '@types/method-override': + specifier: ^0.0.33 + version: 0.0.33 + '@types/multer': + specifier: ^1.4.8 + version: 1.4.8 + '@types/node': + specifier: ^20.5.7 + version: 20.5.7 + '@types/supertest': + specifier: ^2.0.14 + version: 2.0.14 + '@types/validator': + specifier: ^13.11.2 + version: 13.11.2 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) + supertest: + specifier: ^6.3.3 + version: 6.3.3 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.22.9)(jest@29.7.0)(typescript@5.2.2) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.5.7)(typescript@5.2.2) + ts-node-dev: + specifier: ^2.0.0 + version: 2.0.0(@types/node@20.5.7)(typescript@5.2.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + tslib: + specifier: ^2.6.2 + version: 2.6.2 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + + api/trips: + dependencies: + '@hikers-book/tsed-swagger': + specifier: workspace:* + version: link:../../packages/tsed-swagger + '@tsed/ajv': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8)(ajv-errors@3.0.0)(ajv@8.12.0) + '@tsed/common': + specifier: ^7.36.8 + version: 7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8) + '@tsed/core': + specifier: ^7.36.8 + version: 7.36.8 + '@tsed/di': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/engines': + specifier: ^7.36.8 + version: 7.36.8 + '@tsed/exceptions': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8) + '@tsed/json-mapper': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/logger': + specifier: ^6.6.3 + version: 6.6.3 + '@tsed/logger-file': + specifier: ^6.6.3 + version: 6.6.3(@tsed/logger@6.6.3) + '@tsed/mongoose': + specifier: ^7.36.8 + version: 7.36.8(@tsed/ajv@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8)(mongoose@7.5.0) + '@tsed/platform-cache': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-exceptions': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-express': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8)(@tsed/platform-views@7.36.8)(@tsed/schema@7.36.8)(@types/multer@1.4.8)(body-parser@1.20.2)(multer@1.4.5-lts.1) + '@tsed/platform-log-middleware': + specifier: ^7.36.8 + version: 7.36.8(@tsed/di@7.36.8)(@tsed/platform-middlewares@7.36.8)(@tsed/platform-params@7.36.8) + '@tsed/platform-middlewares': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-params': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-response-filter': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-views': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/engines@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': + specifier: ^7.36.8 + version: 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) + '@tsed/swagger': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8) + ajv: + specifier: ^8.12.0 + version: 8.12.0 + barrelsby: + specifier: ^2.8.1 + version: 2.8.1 + body-parser: + specifier: ^1.20.2 + version: 1.20.2 + class-validator: + specifier: ^0.13.2 + version: 0.13.2 + compression: + specifier: ^1.7.4 + version: 1.7.4 + config: + specifier: ^3.3.9 + version: 3.3.9 + cookie-parser: + specifier: ^1.4.6 + version: 1.4.6 + cors: + specifier: ^2.8.5 + version: 2.8.5 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + dotenv-expand: + specifier: ^10.0.0 + version: 10.0.0 + dotenv-flow: + specifier: ^3.3.0 + version: 3.3.0 + express: + specifier: ^4.18.2 + version: 4.18.2 + helmet: + specifier: ^7.0.0 + version: 7.0.0 + method-override: + specifier: ^3.0.0 + version: 3.0.0 + mongoose: + specifier: ^7.5.0 + version: 7.5.0 + devDependencies: + '@hikers-book/cli-tools': + specifier: workspace:* + version: link:../../packages/cli-tools + '@hikers-book/config': + specifier: workspace:* + version: link:../../packages/config + '@hikers-book/eslint-config': + specifier: workspace:* + version: link:../../packages/eslint-config + '@tsed/cli-plugin-eslint': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/cli-plugin-jest': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/cli-plugin-mongoose': + specifier: 4.6.4 + version: 4.6.4 + '@tsed/testing-mongoose': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/mongoose@7.36.8)(mongoose@7.5.0) + '@types/body-parser': + specifier: ^1.19.3 + version: 1.19.3 + '@types/compression': + specifier: ^1.7.3 + version: 1.7.3 + '@types/config': + specifier: ^3.3.1 + version: 3.3.1 + '@types/cookie-parser': + specifier: ^1.4.4 + version: 1.4.4 + '@types/cors': + specifier: ^2.8.14 + version: 2.8.14 + '@types/express': + specifier: ^4.17.18 + version: 4.17.18 + '@types/jest': + specifier: ^29.5.5 + version: 29.5.5 + '@types/method-override': + specifier: ^0.0.33 + version: 0.0.33 + '@types/multer': + specifier: ^1.4.8 + version: 1.4.8 + '@types/node': + specifier: ^20.5.7 + version: 20.5.7 + '@types/supertest': + specifier: ^2.0.14 + version: 2.0.14 + '@types/validator': + specifier: ^13.11.2 + version: 13.11.2 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) supertest: specifier: ^6.3.3 version: 6.3.3 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.22.9)(jest@29.6.4)(typescript@5.2.2) + version: 29.1.1(@babel/core@7.22.9)(jest@29.7.0)(typescript@5.2.2) ts-node: specifier: ^10.9.1 version: 10.9.1(@types/node@20.5.7)(typescript@5.2.2) @@ -293,6 +885,25 @@ importers: specifier: ^3.2.3 version: 3.2.3(prettier@3.0.3)(typescript@5.2.2) + packages/tsed-swagger: + dependencies: + '@tsed/openspec': + specifier: ^7.36.8 + version: 7.36.8 + '@tsed/swagger': + specifier: ^7.36.8 + version: 7.36.8(@tsed/common@7.36.8) + devDependencies: + '@hikers-book/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/node': + specifier: ^20.5.7 + version: 20.5.7 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + ui/hikers-book: dependencies: '@angular/animations': @@ -1212,7 +1823,7 @@ packages: peerDependencies: graphql: 0.13.1 - 15 dependencies: - '@types/express': 4.17.17 + '@types/express': 4.17.18 '@types/fs-capacitor': 2.0.0 '@types/koa': 2.13.8 busboy: 0.3.1 @@ -1829,15 +2440,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) '@babel/helpers': 7.23.1 '@babel/parser': 7.23.0 - '@babel/template': 7.22.5 + '@babel/template': 7.22.15 '@babel/traverse': 7.23.0 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -4461,20 +5072,20 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console@29.6.4: - resolution: {integrity: sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==} + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 20.5.7 chalk: 4.1.2 - jest-message-util: 29.6.3 - jest-util: 29.6.3 + jest-message-util: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 dev: true - /@jest/core@29.6.4(ts-node@10.9.1): - resolution: {integrity: sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==} + /@jest/core@29.7.0(ts-node@10.9.1): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -4482,10 +5093,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.6.4 - '@jest/reporters': 29.6.4 - '@jest/test-result': 29.6.4 - '@jest/transform': 29.6.4 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.5.7 ansi-escapes: 4.3.2 @@ -4493,21 +5104,21 @@ packages: ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 29.6.3 - jest-config: 29.6.4(@types/node@20.5.7)(ts-node@10.9.1) - jest-haste-map: 29.6.4 - jest-message-util: 29.6.3 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 jest-regex-util: 29.6.3 - jest-resolve: 29.6.4 - jest-resolve-dependencies: 29.6.4 - jest-runner: 29.6.4 - jest-runtime: 29.6.4 - jest-snapshot: 29.6.4 - jest-util: 29.6.3 - jest-validate: 29.6.3 - jest-watcher: 29.6.4 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 micromatch: 4.0.5 - pretty-format: 29.6.3 + pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -4516,59 +5127,59 @@ packages: - ts-node dev: true - /@jest/environment@29.6.4: - resolution: {integrity: sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==} + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.6.4 + '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.5.7 - jest-mock: 29.6.3 + jest-mock: 29.7.0 dev: true - /@jest/expect-utils@29.6.4: - resolution: {integrity: sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==} + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 dev: true - /@jest/expect@29.6.4: - resolution: {integrity: sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==} + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.6.4 - jest-snapshot: 29.6.4 + expect: 29.7.0 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers@29.6.4: - resolution: {integrity: sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==} + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 '@types/node': 20.5.7 - jest-message-util: 29.6.3 - jest-mock: 29.6.3 - jest-util: 29.6.3 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 dev: true - /@jest/globals@29.6.4: - resolution: {integrity: sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==} + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.6.4 - '@jest/expect': 29.6.4 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 '@jest/types': 29.6.3 - jest-mock: 29.6.3 + jest-mock: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters@29.6.4: - resolution: {integrity: sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==} + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -4577,9 +5188,9 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.6.4 - '@jest/test-result': 29.6.4 - '@jest/transform': 29.6.4 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 '@types/node': 20.5.7 @@ -4593,9 +5204,9 @@ packages: istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.5 - jest-message-util: 29.6.3 - jest-util: 29.6.3 - jest-worker: 29.6.4 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -4620,28 +5231,28 @@ packages: graceful-fs: 4.2.11 dev: true - /@jest/test-result@29.6.4: - resolution: {integrity: sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==} + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.6.4 + '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer@29.6.4: - resolution: {integrity: sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==} + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.6.4 + '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 - jest-haste-map: 29.6.4 + jest-haste-map: 29.7.0 slash: 3.0.0 dev: true - /@jest/transform@29.6.4: - resolution: {integrity: sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==} + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.22.9 @@ -4652,9 +5263,9 @@ packages: convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.6.4 + jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 - jest-util: 29.6.3 + jest-util: 29.7.0 micromatch: 4.0.5 pirates: 4.0.6 slash: 3.0.0 @@ -6224,58 +6835,58 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@tsed/ajv@7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6)(ajv-errors@3.0.0)(ajv@8.12.0): - resolution: {integrity: sha512-ZbUjU1GZe/QEo3E4z+nwD9v1AmrwI4NBwP8dE+smYAFt2D9KgY9Jx1H/RAXlnNyYWuOwt1LwfKp/GMk2JNJ4Gw==} + /@tsed/ajv@7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8)(ajv-errors@3.0.0)(ajv@8.12.0): + resolution: {integrity: sha512-jiy1pYjcKWbBDfeeO6H+b2ClfodKCRzM78xwhhL3NNXVXFh269cZQpKQ6PejVAgEEG6ZmcJpTUuYGEH1IJgwAg==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/exceptions': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/exceptions': ^7.36.8 + '@tsed/schema': ^7.36.8 ajv: '>=8.9.0' ajv-errors: '>=3.0.0' dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/exceptions': 7.34.6(@tsed/core@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/exceptions': 7.36.8(@tsed/core@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) ajv: 8.12.0 ajv-errors: 3.0.0(ajv@8.12.0) ajv-formats: 2.1.1(ajv@8.12.0) tslib: 2.5.0 - /@tsed/apollo@7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/logger@6.6.2)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(graphql@15.8.0): - resolution: {integrity: sha512-9Oag12c0DRK+n0mR/UbuxAe2z2TEFO9ZoOsthazjB3S+/QDbDF+pztnDGmboXVXtrExpTcVUhXJ5+jAv34xkYA==} + /@tsed/apollo@7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/logger@6.6.3)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(graphql@15.8.0): + resolution: {integrity: sha512-BkTQ2bSyJjfRtVZ6+Flr5oQsU3x+0z9AtY0CU3d6xEVJ4uVtYsIzuG4BKirg8P8BGYHl3tfLfAeEGzAN/MnUeA==} peerDependencies: - '@tsed/common': ^7.34.6 - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 + '@tsed/common': ^7.36.8 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 '@tsed/logger': '>=6.2.2' apollo-datasource: '>=3.0.0' apollo-datasource-rest: '>=3.0.0' apollo-server-core: '>=3.0.0' graphql: '>15.0.0' dependencies: - '@tsed/common': 7.34.6(@tsed/engines@7.34.6)(@tsed/logger-file@6.6.2)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6) - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/logger': 6.6.2 + '@tsed/common': 7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/logger': 6.6.3 apollo-datasource: 3.3.2 apollo-datasource-rest: 3.7.0(graphql@15.8.0) apollo-server-core: 3.12.1(graphql@15.8.0) graphql: 15.8.0 tslib: 2.5.0 - /@tsed/cli-core@4.6.4(@babel/core@7.22.9)(@tsed/core@7.34.6)(@tsed/di@7.34.6): + /@tsed/cli-core@4.6.4(@babel/core@7.22.9)(@tsed/core@7.36.8)(@tsed/di@7.36.8): resolution: {integrity: sha512-EOHSCpM58f5++TNSAHBpwO3T1lgQvoK5oKtDLqZadfNKe7LOYDBM6xxm0Bp0XZCt3pqC/KE5XSbFMCHdcTmV/g==} peerDependencies: '@tsed/core': '>=7.14.2' '@tsed/di': '>=7.14.2' dependencies: '@npmcli/run-script': 3.0.1 - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/logger': 6.6.2 - '@tsed/normalize-path': 7.34.6 + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/logger': 6.6.3 + '@tsed/normalize-path': 7.36.8 '@types/fs-extra': 9.0.13 '@types/inquirer': 8.2.6 ajv: 8.11.0 @@ -6387,12 +6998,12 @@ packages: '@tsed/cli': ^4.6.4 '@tsed/cli-core': ^4.6.4 dependencies: - '@tsed/cli': 4.6.4(@tsed/cli-core@4.6.4)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6)(@tsed/schema@7.34.6) - '@tsed/cli-core': 4.6.4(@babel/core@7.22.9)(@tsed/core@7.34.6)(@tsed/di@7.34.6) + '@tsed/cli': 4.6.4(@tsed/cli-core@4.6.4)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8)(@tsed/schema@7.36.8) + '@tsed/cli-core': 4.6.4(@babel/core@7.22.9)(@tsed/core@7.36.8)(@tsed/di@7.36.8) tslib: 2.3.1 dev: true - /@tsed/cli@4.6.4(@tsed/cli-core@4.6.4)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6)(@tsed/schema@7.34.6): + /@tsed/cli@4.6.4(@tsed/cli-core@4.6.4)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8)(@tsed/schema@7.36.8): resolution: {integrity: sha512-PKk1Rm4dK+b4N3jsOGa2akrCbshagXAb7aI8Y816iFKXuApKIxEBGnuinFuyqpE0jP0DzFRHwyHOBCXxD7zSKQ==} engines: {node: '>=14'} hasBin: true @@ -6404,12 +7015,12 @@ packages: '@tsed/openspec': '>=7.14.2' '@tsed/schema': '>=7.14.2' dependencies: - '@tsed/cli-core': 4.6.4(@babel/core@7.22.9)(@tsed/core@7.34.6)(@tsed/di@7.34.6) - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/logger': 6.6.2 - '@tsed/openspec': 7.34.6 - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/cli-core': 4.6.4(@babel/core@7.22.9)(@tsed/core@7.36.8)(@tsed/di@7.36.8) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/logger': 6.6.3 + '@tsed/openspec': 7.36.8 + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) chalk: 4.1.2 change-case: 4.1.2 filedirname: 2.7.0 @@ -6421,26 +7032,26 @@ packages: tslib: 2.3.1 dev: true - /@tsed/common@7.34.6(@tsed/engines@7.34.6)(@tsed/logger-file@6.6.2)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6): - resolution: {integrity: sha512-gmPwiQm2QgOPLvDBzxymg4zMAi7D41IOT3RbDl7TN6a/09rVJ6YRly1JAlGIlU2WIkPfUQUM3ZyhIyMqPpsdtQ==} + /@tsed/common@7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8): + resolution: {integrity: sha512-ySmWiXH/rpR/Ii/Impl2Hp1PI76jabPFiBNwavtYhGOTForkPAp1Be7+/LcQjscEeu4cLccPQFZUTyPx+ACl0w==} peerDependencies: '@tsed/logger': '>=6.2.2' '@tsed/logger-file': '>=6.2.2' dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/exceptions': 7.34.6(@tsed/core@7.34.6) - '@tsed/json-mapper': 7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6) - '@tsed/logger': 6.6.2 - '@tsed/logger-file': 6.6.2(@tsed/logger@6.6.2) - '@tsed/platform-exceptions': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6) - '@tsed/platform-log-middleware': 7.34.6(@tsed/di@7.34.6)(@tsed/platform-middlewares@7.34.6)(@tsed/platform-params@7.34.6) - '@tsed/platform-middlewares': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/schema@7.34.6) - '@tsed/platform-params': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6) - '@tsed/platform-response-filter': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6) - '@tsed/platform-router': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/platform-params@7.34.6)(@tsed/schema@7.34.6) - '@tsed/platform-views': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/engines@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/exceptions': 7.36.8(@tsed/core@7.36.8) + '@tsed/json-mapper': 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/logger': 6.6.3 + '@tsed/logger-file': 6.6.3(@tsed/logger@6.6.3) + '@tsed/platform-exceptions': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-log-middleware': 7.36.8(@tsed/di@7.36.8)(@tsed/platform-middlewares@7.36.8)(@tsed/platform-params@7.36.8) + '@tsed/platform-middlewares': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-params': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-response-filter': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-router': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/platform-params@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-views': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/engines@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) '@types/json-schema': 7.0.11 accepts: 1.3.8 tslib: 2.5.0 @@ -6449,142 +7060,142 @@ packages: - '@tsed/engines' - '@tsed/openspec' - /@tsed/core@7.34.6: - resolution: {integrity: sha512-TfogwXoMM0eb1RQ2JxGhio7X5PbHirH7GxKY/yu0OKDwfd3Kl2bFTkVUPLLaYL7X0WVne14fQ5qLL+51KhOQUw==} + /@tsed/core@7.36.8: + resolution: {integrity: sha512-i3JFCh1DoMXVwjS3L2ElKBdEWN2kcUSYaVXF5IVmpMSYhmDb2BrPZdWZTgSWPrLqv/5X3J05oZBzEW3jaZOrrg==} dependencies: reflect-metadata: 0.1.13 tslib: 2.5.0 - /@tsed/di@7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-/u5yWSUyOo60bE4PEpnzy5wZhcm4GCm6Jpa9G+yrIWg+/4J0vON5Bhi3B2tEiInKTEZ+tEyTYgYkpTqZd4//9w==} + /@tsed/di@7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-YiCgBVkq4nCxeR7VNYL84jDg4+EbcOh9tW83scyT+0nRLxob8piRIh7EwOa0JoK4Bi3wI8mGaKM8kO8WePA8xQ==} peerDependencies: - '@tsed/core': ^7.34.6 + '@tsed/core': ^7.36.8 '@tsed/logger': '>=6.2.2' - '@tsed/schema': ^7.34.6 + '@tsed/schema': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 - '@tsed/logger': 6.6.2 - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/logger': 6.6.3 + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) tslib: 2.5.0 - /@tsed/engines@7.34.6: - resolution: {integrity: sha512-55TYFf6ix1NydDYXkA38rqu9RzNcaO3ceh1amQXE2Py7sc55/2xoFJ9RLIh0Sup+KvwO9wog1KbKZmCY5qw8uw==} + /@tsed/engines@7.36.8: + resolution: {integrity: sha512-HlUn5UrQjHWUStZUSCfpZsXdQ5e0JXZQLToe81ZqnEAfrGgSAFFvKQkpvy28cpZcsPKx2oYr4liXZVUgW69HdA==} dependencies: filedirname: 2.7.0 fs-extra: 10.0.1 tslib: 2.5.0 - /@tsed/exceptions@7.34.6(@tsed/core@7.34.6): - resolution: {integrity: sha512-Pf4nOMCCoc/8UmhJD1R4L3aAJATyHUkSRErp7StlOrgFl5FBXmMQUGLP9Sc7D0GkmlA/18s8wHPqEMjHNDbS/Q==} + /@tsed/exceptions@7.36.8(@tsed/core@7.36.8): + resolution: {integrity: sha512-zPLfulnWaTQj4mGCHn0MRz5m58SDhP1idUwum1cw95FflFNSGSRArTU13RErv1uddkeXTl5Kao5EOfvlR/12fQ==} peerDependencies: - '@tsed/core': ^7.34.6 + '@tsed/core': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 + '@tsed/core': 7.36.8 change-case: 4.1.2 statuses: 2.0.1 tslib: 2.5.0 - /@tsed/json-mapper@7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-YhH6YufTVFjOipvniH8ZM5utyIOTRPJ5/Ik1ZleXIq+yQxknpr6UttqQoPHILdmIAc9+pdGyz/YWnDd/+akTzw==} + /@tsed/json-mapper@7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-9lLkv1/3Va4L96JQ9KZCe5yvzjpSbGDNwaHzKgle4LDLg7k68JiVUzjTvcy4ZVWCb83G02LQwAVBdVZ6wRRD+Q==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/schema': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) tslib: 2.5.0 - /@tsed/logger-file@6.6.2(@tsed/logger@6.6.2): - resolution: {integrity: sha512-UCn+SXTzbI/Y4MQr28CCuXM5D0E9foU3e3Sgv76wwV2s8FLbM9PjtoTappvkvrNfZTbO1d8iKk4F5E82K4QoPQ==} + /@tsed/logger-file@6.6.3(@tsed/logger@6.6.3): + resolution: {integrity: sha512-b0UZJcJqFmcB6XULd68qOmQJC5H30yzN308EZtZneLxl09lgk7GRteI73K3IL5T7VLFLZeXU3/h718+CbBO0Ow==} peerDependencies: - '@tsed/logger': 6.6.2 + '@tsed/logger': 6.6.3 dependencies: - '@tsed/logger': 6.6.2 + '@tsed/logger': 6.6.3 streamroller: 3.1.5 tslib: 2.3.1 transitivePeerDependencies: - supports-color - /@tsed/logger@6.6.2: - resolution: {integrity: sha512-gW/BhxJuxGUXLeiNVRCZcrFIz5DFwjiXFpA73hyNtS2u3Yin5Qva5wm63IDK1EPOf0FMe0FWLregay09Jwaiuw==} + /@tsed/logger@6.6.3: + resolution: {integrity: sha512-TwJDWQ3nnZ++A6Si/pHFdCGDoewRSDdmBpN6vwnFRXRjJrkHqITwCMGMG74ZMVBXl8KMI6ngNma2qbIuhKFUyw==} dependencies: colors: 1.4.0 date-format: 4.0.14 semver: 7.5.4 tslib: 2.3.1 - /@tsed/mongoose@7.34.6(@tsed/ajv@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6)(mongoose@7.5.0): - resolution: {integrity: sha512-FJp4Ky7xzP9cy0KbKg018sk2RKiLUxfwvGUGL9MmEYkozOH4wU60NblAtBwBvenL82Q0yR7kX1gWovyL/Qym6w==} + /@tsed/mongoose@7.36.8(@tsed/ajv@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8)(mongoose@7.5.0): + resolution: {integrity: sha512-BZsapc3lCm9+DBTVLeJ40Qulm5l1PlY9PFlCo8HXZJ1gl9yozhArC3ZP4V9c4F+sFM4wy2slZfpfgX8fN6TitA==} peerDependencies: - '@tsed/ajv': ^7.34.6 - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/json-mapper': ^7.34.6 + '@tsed/ajv': ^7.36.8 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/json-mapper': ^7.36.8 '@tsed/logger': '>=6.2.2' - '@tsed/schema': ^7.34.6 + '@tsed/schema': ^7.36.8 mongoose: '>=6.0.0' dependencies: - '@tsed/ajv': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6)(ajv-errors@3.0.0)(ajv@8.12.0) - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/json-mapper': 7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6) - '@tsed/logger': 6.6.2 - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/ajv': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8)(ajv-errors@3.0.0)(ajv@8.12.0) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/json-mapper': 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/logger': 6.6.3 + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) change-case: 4.1.2 mongoose: 7.5.0 tslib: 2.5.0 - /@tsed/normalize-path@7.34.6: - resolution: {integrity: sha512-klc1Ls8/EUnwb/ilVVt0t4oyEpr5l0FHXsig0fRd7SltrTuHvQX/FfWiAOJWWw3gjIz5ry9WkJWa2kJ+uneZ3w==} + /@tsed/normalize-path@7.36.8: + resolution: {integrity: sha512-5H1lRvZ9togU9dgV+7W98S8E6y6XdPSvn+qyaXd+l7jL5T+9hVoK+wNJZwV3S7CEMw89tLMArIE7nq9NHl7/Zw==} dependencies: normalize-path: 3.0.0 tslib: 2.5.0 - /@tsed/openspec@7.34.6: - resolution: {integrity: sha512-eMNMHuwVxY6hzE2Il9Oa0vxuxgCuF0dokY9p4vVSibn5p7xlnm1aI9Yu8K9GUK/2IB54a4U8FRLNNS3NeywIew==} + /@tsed/openspec@7.36.8: + resolution: {integrity: sha512-PtmPLWusfad5ylstEFFNHOjx5Wt2uQldB56Efk/sV4/8XyU87j5nj1kzYN/t59OWCk+ZrMhfEi2hUzXt/TZWDg==} - /@tsed/platform-cache@7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-YvE8BhE2mPOmV3dx/PQGey7iys5d4Bfl4WMdtqW1QNsNchXxLMk4SBm7n3HiRNi+yOXuI12BWk0CmsyqV+hvcQ==} + /@tsed/platform-cache@7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-c8Jbu7M0+Nr77eTBikTBMH5CBMn/TKXVpxEC78tdc8siyeKwjL3sbbSM7mKMiwauaRrMS5bRRwpvT22ixSMeNA==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/json-mapper': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/json-mapper': ^7.36.8 + '@tsed/schema': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/json-mapper': 7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/json-mapper': 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) cache-manager: 5.2.3 micromatch: 4.0.5 tslib: 2.5.0 dev: false - /@tsed/platform-exceptions@7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-G0Vqp+Vxmwnb2/BO78gtpLxwo1hm/0wrTwObOHkxGgp6b6buQG0D+1d/O/ABfqy3LTRUyYUM2eZJvh7+32ApHA==} + /@tsed/platform-exceptions@7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-8dz9290UN2/DumSQfuEDnp/ORkgLxlA5IaGXRyiblgBo0f7XauhQ7N3RjNfWKkuN7PdQ7SW//BxlsTiqeV3CmQ==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/exceptions': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/exceptions': ^7.36.8 + '@tsed/schema': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/exceptions': 7.34.6(@tsed/core@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/exceptions': 7.36.8(@tsed/core@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) tslib: 2.5.0 - /@tsed/platform-express@7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6)(@tsed/platform-views@7.34.6)(@tsed/schema@7.34.6)(@types/multer@1.4.7)(body-parser@1.20.2)(multer@1.4.5-lts.1): - resolution: {integrity: sha512-E4an5ucbwTVUGB5bRhswMjVi/QNCBiam2qlHRTrt47qXvLi4R2RqZj/KJoU4CBD4mIrcxqLROHt9zg6esD6YLQ==} + /@tsed/platform-express@7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8)(@tsed/platform-views@7.36.8)(@tsed/schema@7.36.8)(@types/multer@1.4.8)(body-parser@1.20.2)(multer@1.4.5-lts.1): + resolution: {integrity: sha512-gQcD+KrJ8J9vVxBJ99G/GnKvwIPaQSXdiTXNlztPv0V5Po2I1ISkNbPJOq71Dty5e2O6zKEl9qEIgPWl4NI7WQ==} peerDependencies: - '@tsed/common': ^7.34.6 - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/json-mapper': ^7.34.6 + '@tsed/common': ^7.36.8 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/json-mapper': ^7.36.8 '@tsed/logger': '>=6.2.2' - '@tsed/openspec': ^7.34.6 - '@tsed/platform-views': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/openspec': ^7.36.8 + '@tsed/platform-views': ^7.36.8 + '@tsed/schema': ^7.36.8 '@types/multer': ^1.4.5 body-parser: ^1.19.0 multer: ^1.4.5-lts.1 @@ -6592,15 +7203,15 @@ packages: '@tsed/platform-views': optional: true dependencies: - '@tsed/common': 7.34.6(@tsed/engines@7.34.6)(@tsed/logger-file@6.6.2)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6) - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/json-mapper': 7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6) - '@tsed/logger': 6.6.2 - '@tsed/openspec': 7.34.6 - '@tsed/platform-views': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/engines@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) - '@types/multer': 1.4.7 + '@tsed/common': 7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/json-mapper': 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/logger': 6.6.3 + '@tsed/openspec': 7.36.8 + '@tsed/platform-views': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/engines@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) + '@types/multer': 1.4.8 body-parser: 1.20.2 express: 4.18.2 multer: 1.4.5-lts.1 @@ -6609,24 +7220,24 @@ packages: - supports-color dev: false - /@tsed/platform-log-middleware@7.34.6(@tsed/di@7.34.6)(@tsed/platform-middlewares@7.34.6)(@tsed/platform-params@7.34.6): - resolution: {integrity: sha512-uMbEfBlRXDt22eiGJyaHVmPYqCfgF/71Jpcm7hbxqYj97f9LU9RIK9o2xQmZR4utFLieWN8LjpjZedPiF1JGPQ==} + /@tsed/platform-log-middleware@7.36.8(@tsed/di@7.36.8)(@tsed/platform-middlewares@7.36.8)(@tsed/platform-params@7.36.8): + resolution: {integrity: sha512-yCE8rz1QeSV7IgPGZuiUNiNyrM23WX3yyz5kGgjLQXXSzoQ/qFjyPBy2teKs8O42U2r4xnewzFn7iml91ywZ3g==} peerDependencies: - '@tsed/di': ^7.34.6 - '@tsed/platform-middlewares': ^7.34.6 - '@tsed/platform-params': ^7.34.6 + '@tsed/di': ^7.36.8 + '@tsed/platform-middlewares': ^7.36.8 + '@tsed/platform-params': ^7.36.8 dependencies: - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/platform-middlewares': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/schema@7.34.6) - '@tsed/platform-params': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6) + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/platform-middlewares': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-params': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) tslib: 2.5.0 - /@tsed/platform-middlewares@7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-ptB0+ud/HJlWmak0T4SSwyHHK1e+BXD+dAdnGmX/ONm4fO2+SvT+ivd0lpD2AmUtIHQG9UqowD5rH7WffD00iw==} + /@tsed/platform-middlewares@7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-dYS0ZP/PKJUmkMUVPUBSba8p4TlCJc9pkJIurUAW/m35mfFjPkSVVYBb97GRwqtB0A/Bv+M+klUDO/QCttZSfg==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/schema': ^7.36.8 peerDependenciesMeta: '@tsed/core': optional: true @@ -6635,86 +7246,86 @@ packages: '@tsed/schema': optional: true dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) tslib: 2.5.0 - /@tsed/platform-params@7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-niMW94OyBdARaojXYY3cokLosYseRVVpABYz6rOlHMNnLJm0+WuonmH8wfNXN2psb9T8aWwXXhMXn+plERkfZQ==} + /@tsed/platform-params@7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-ZtsFF+VX/5VQeuhL56AVxFmpwYYYu4Xi49sD9WVXKApyl1M9UqJ9orQ8s1Vad2N5WcGaxauc1DQ9NP5pvJlx0A==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/exceptions': ^7.34.6 - '@tsed/json-mapper': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/exceptions': ^7.36.8 + '@tsed/json-mapper': ^7.36.8 + '@tsed/schema': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/exceptions': 7.34.6(@tsed/core@7.34.6) - '@tsed/json-mapper': 7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/exceptions': 7.36.8(@tsed/core@7.36.8) + '@tsed/json-mapper': 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) tslib: 2.5.0 - /@tsed/platform-response-filter@7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-xNMfgowhqYYeqzIqrwd55QNIXZTCiA0tuj/jLFBowlw/64SG0UGEH0SZ6k210719gqwSIsMqE2hOLWrrGT4Ccw==} + /@tsed/platform-response-filter@7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-7CXieUpfRy88ia3XGp15J53YktwzmNksr7A/aZ7kEyBdTqj6BOqFul1pbiMq91ZBIGURBAvuMfn4iGxbd5A8NQ==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/exceptions': ^7.34.6 - '@tsed/json-mapper': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/exceptions': ^7.36.8 + '@tsed/json-mapper': ^7.36.8 + '@tsed/schema': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/exceptions': 7.34.6(@tsed/core@7.34.6) - '@tsed/json-mapper': 7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/exceptions': 7.36.8(@tsed/core@7.36.8) + '@tsed/json-mapper': 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) tslib: 2.5.0 - /@tsed/platform-router@7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/platform-params@7.34.6)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-uFvpLvR3Qk9UHpg++7PkFgY9xVkUWGASxnMMMz2mSNqaykfKFTaOOdW0qxPDLHpZ+7y2Z6XllyJDXR7HQ7TFfw==} - peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/exceptions': ^7.34.6 - '@tsed/json-mapper': ^7.34.6 - '@tsed/platform-params': ^7.34.6 - '@tsed/schema': ^7.34.6 - dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/exceptions': 7.34.6(@tsed/core@7.34.6) - '@tsed/json-mapper': 7.34.6(@tsed/core@7.34.6)(@tsed/schema@7.34.6) - '@tsed/platform-params': 7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/schema@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + /@tsed/platform-router@7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/platform-params@7.36.8)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-t1C9mm9teJ3Smk59sYgVDlB1NZvMlRQhucItpgmHDDQaazGTdVbVaY/dKaqikSCpNoDqLp4oAkDR28u/55f4Lg==} + peerDependencies: + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/exceptions': ^7.36.8 + '@tsed/json-mapper': ^7.36.8 + '@tsed/platform-params': ^7.36.8 + '@tsed/schema': ^7.36.8 + dependencies: + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/exceptions': 7.36.8(@tsed/core@7.36.8) + '@tsed/json-mapper': 7.36.8(@tsed/core@7.36.8)(@tsed/schema@7.36.8) + '@tsed/platform-params': 7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/schema@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) tslib: 2.5.0 - /@tsed/platform-views@7.34.6(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/engines@7.34.6)(@tsed/exceptions@7.34.6)(@tsed/schema@7.34.6): - resolution: {integrity: sha512-9kM38H2sJli3AC9bB2XokHPztPQBKTCvYoErd6OPWqfZ1ppD6Js+mqdh49LPWbjwQulvF4258bIoSzoojHUQXg==} + /@tsed/platform-views@7.36.8(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/engines@7.36.8)(@tsed/exceptions@7.36.8)(@tsed/schema@7.36.8): + resolution: {integrity: sha512-2zafGbd6nSQzhhUdUpeXqOcs6HEH0e0A/0DkYCe1TgSXg1l3EVSHXzUEOJzFAuD4AV3UvoE6DaBX8Qqr8ndWBQ==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/di': ^7.34.6 - '@tsed/engines': ^7.34.6 - '@tsed/exceptions': ^7.34.6 - '@tsed/schema': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/di': ^7.36.8 + '@tsed/engines': ^7.36.8 + '@tsed/exceptions': ^7.36.8 + '@tsed/schema': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 - '@tsed/di': 7.34.6(@tsed/core@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6) - '@tsed/engines': 7.34.6 - '@tsed/exceptions': 7.34.6(@tsed/core@7.34.6) - '@tsed/schema': 7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6) + '@tsed/core': 7.36.8 + '@tsed/di': 7.36.8(@tsed/core@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8) + '@tsed/engines': 7.36.8 + '@tsed/exceptions': 7.36.8(@tsed/core@7.36.8) + '@tsed/schema': 7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8) ejs: 3.1.9 tslib: 2.5.0 - /@tsed/schema@7.34.6(@tsed/core@7.34.6)(@tsed/openspec@7.34.6): - resolution: {integrity: sha512-Ds+mlnBbYU6Ce1kGtbOq/gROSV8lkF6PHrsOsrx7ydspjKe37bFvDMCyrxyTuGl66eu5AlY8ZS4dQmKNpqmMzQ==} + /@tsed/schema@7.36.8(@tsed/core@7.36.8)(@tsed/openspec@7.36.8): + resolution: {integrity: sha512-Yqn1nYJMbK2udEipdN7ldlHtzzeCVEquLcPxVGZ7cwOkdS6fi5aUlP5QRHGAMfzFGxyYXQxRnz+gNpiYfxZczQ==} peerDependencies: - '@tsed/core': ^7.34.6 - '@tsed/openspec': ^7.34.6 + '@tsed/core': ^7.36.8 + '@tsed/openspec': ^7.36.8 dependencies: - '@tsed/core': 7.34.6 - '@tsed/openspec': 7.34.6 + '@tsed/core': 7.36.8 + '@tsed/openspec': 7.36.8 change-case: 4.1.2 fs-extra: 10.1.0 json-schema: 0.4.0 @@ -6722,14 +7333,14 @@ packages: statuses: 2.0.1 tslib: 2.5.0 - /@tsed/swagger@7.34.6(@tsed/common@7.34.6): - resolution: {integrity: sha512-vxB9645ojReIo/Zd6Do01sC+3MNMjRuHcC+mY6YnbZki16NdGYKtnXvGyZnT23O+Xbsebv9rT70h17voRJG9jg==} + /@tsed/swagger@7.36.8(@tsed/common@7.36.8): + resolution: {integrity: sha512-y185M/w2LtNyjzqmf14XKLcoKqoC26o/IJSSDcpVH2BWLobfMwS0aixWHQgWc/uwHEYWGP9RJcsImNhqhWu+mw==} peerDependencies: - '@tsed/common': ^7.34.6 + '@tsed/common': ^7.36.8 dependencies: - '@tsed/common': 7.34.6(@tsed/engines@7.34.6)(@tsed/logger-file@6.6.2)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6) - '@tsed/normalize-path': 7.34.6 - '@tsed/openspec': 7.34.6 + '@tsed/common': 7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8) + '@tsed/normalize-path': 7.36.8 + '@tsed/openspec': 7.36.8 filedirname: 2.7.0 fs-extra: 10.0.1 micromatch: 4.0.5 @@ -6737,17 +7348,17 @@ packages: tslib: 2.5.0 dev: false - /@tsed/testing-mongoose@7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/mongoose@7.34.6)(mongoose@7.5.0): - resolution: {integrity: sha512-OlMWOM9hzvhsxp++3Az+OdZRZEzV5TFyv7iKKCj+FDsnxCnGKWlxfioz7Hx6KY97rQuSvjsB4sdMJIq3Ru1EZw==} + /@tsed/testing-mongoose@7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/mongoose@7.36.8)(mongoose@7.5.0): + resolution: {integrity: sha512-VwEX94YhqC/QdMzSxX48NcYnS8iTxkgvyOuE6F2N7GxmdoUA2MZ55Io4MtAynjntL5UiI/7llSK39pk7uqFh6A==} peerDependencies: - '@tsed/common': ^7.34.6 - '@tsed/core': ^7.34.6 - '@tsed/mongoose': ^7.34.6 + '@tsed/common': ^7.36.8 + '@tsed/core': ^7.36.8 + '@tsed/mongoose': ^7.36.8 mongoose: ^6.1.7 dependencies: - '@tsed/common': 7.34.6(@tsed/engines@7.34.6)(@tsed/logger-file@6.6.2)(@tsed/logger@6.6.2)(@tsed/openspec@7.34.6) - '@tsed/core': 7.34.6 - '@tsed/mongoose': 7.34.6(@tsed/ajv@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/json-mapper@7.34.6)(@tsed/logger@6.6.2)(@tsed/schema@7.34.6)(mongoose@7.5.0) + '@tsed/common': 7.36.8(@tsed/engines@7.36.8)(@tsed/logger-file@6.6.3)(@tsed/logger@6.6.3)(@tsed/openspec@7.36.8) + '@tsed/core': 7.36.8 + '@tsed/mongoose': 7.36.8(@tsed/ajv@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/json-mapper@7.36.8)(@tsed/logger@6.6.3)(@tsed/schema@7.36.8)(mongoose@7.5.0) mongodb-memory-server: 8.15.1 mongoose: 7.5.0 semver: 7.5.4 @@ -6757,8 +7368,8 @@ packages: - supports-color dev: true - /@tsed/typegraphql@7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/logger@6.6.2)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(class-validator@0.13.2)(graphql@15.8.0)(type-graphql@1.1.1): - resolution: {integrity: sha512-pLy8LPaMnRyRGHhmWJpON4Z4fIX98DHz8pNkJfHMbE7pSxK0qL6ivRxIDCm6+v8hqalYP0r5wjBgvJoSsysE2A==} + /@tsed/typegraphql@7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/logger@6.6.3)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(class-validator@0.13.2)(graphql@15.8.0)(type-graphql@1.1.1): + resolution: {integrity: sha512-4k55nqiJ99kisjkJ8QDbIiPnDn7WNcFqjT0FSH0lzaqtLxgnNpXvTmbHBMj/plNdkOJWJWs4qhnY1OUxxfWqVw==} peerDependencies: apollo-datasource: '>=3.0.0' apollo-datasource-rest: '>=3.0.0' @@ -6766,7 +7377,7 @@ packages: graphql: '>=15.0.0' type-graphql: '>=1.0.0' dependencies: - '@tsed/apollo': 7.34.6(@tsed/common@7.34.6)(@tsed/core@7.34.6)(@tsed/di@7.34.6)(@tsed/logger@6.6.2)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(graphql@15.8.0) + '@tsed/apollo': 7.36.8(@tsed/common@7.36.8)(@tsed/core@7.36.8)(@tsed/di@7.36.8)(@tsed/logger@6.6.3)(apollo-datasource-rest@3.7.0)(apollo-datasource@3.3.2)(apollo-server-core@3.12.1)(graphql@15.8.0) apollo-datasource: 3.3.2 apollo-datasource-rest: 3.7.0(graphql@15.8.0) class-validator: 0.13.2 @@ -6833,6 +7444,13 @@ packages: dependencies: '@types/connect': 3.4.35 '@types/node': 20.5.7 + dev: false + + /@types/body-parser@1.19.3: + resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 20.5.7 /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} @@ -6840,10 +7458,10 @@ packages: '@types/node': 20.5.7 dev: true - /@types/compression@1.7.2: - resolution: {integrity: sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==} + /@types/compression@1.7.3: + resolution: {integrity: sha512-rKquEGjebqizyHNMOpaE/4FdYR5VQiWFeesqYfvJU0seSEyB4625UGhNOO/qIkH10S3wftiV7oefc8WdLZ/gCQ==} dependencies: - '@types/express': 4.17.17 + '@types/express': 4.17.18 dev: true /@types/config@3.3.1: @@ -6866,10 +7484,10 @@ packages: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true - /@types/cookie-parser@1.4.3: - resolution: {integrity: sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==} + /@types/cookie-parser@1.4.4: + resolution: {integrity: sha512-Var+aj5I6ZgIqsQ05N2V8q5OBrFfZXtIGWWDSrEYLIbMw758obagSwdGcLCjwh1Ga7M7+wj0SDIAaAC/WT7aaA==} dependencies: - '@types/express': 4.17.17 + '@types/express': 4.17.18 dev: true /@types/cookie@0.4.1: @@ -6884,7 +7502,7 @@ packages: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.35 - '@types/express': 4.17.17 + '@types/express': 4.17.18 '@types/keygrip': 1.0.2 '@types/node': 20.5.7 dev: true @@ -6893,8 +7511,8 @@ packages: resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} dev: false - /@types/cors@2.8.13: - resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + /@types/cors@2.8.14: + resolution: {integrity: sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==} dependencies: '@types/node': 20.5.7 dev: true @@ -6936,16 +7554,16 @@ packages: /@types/express@4.17.14: resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} dependencies: - '@types/body-parser': 1.19.2 + '@types/body-parser': 1.19.3 '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 '@types/serve-static': 1.15.2 dev: false - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + /@types/express@4.17.18: + resolution: {integrity: sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==} dependencies: - '@types/body-parser': 1.19.2 + '@types/body-parser': 1.19.3 '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 '@types/serve-static': 1.15.2 @@ -7015,11 +7633,11 @@ packages: resolution: {integrity: sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g==} dev: true - /@types/jest@29.5.4: - resolution: {integrity: sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==} + /@types/jest@29.5.5: + resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} dependencies: - expect: 29.6.4 - pretty-format: 29.6.3 + expect: 29.7.0 + pretty-format: 29.7.0 dev: true /@types/js-yaml@4.0.5: @@ -7072,10 +7690,10 @@ packages: /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - /@types/method-override@0.0.32: - resolution: {integrity: sha512-Vf9AohOlANmhNswCbkdRG3p+tYcq1+63O+ex1UoNIVYWW3tO8Mx6Z+5G1R8DENeC6/t1SiDJS+ph6ACKpryokg==} + /@types/method-override@0.0.33: + resolution: {integrity: sha512-H6hK7AZdUOCmboTTUlhfDG3uT0XDljjrk3vIb+GJ3ylkogXu5s/NncGB85r3rtCz6sxZBWF62dlf7I04sIQA5A==} dependencies: - '@types/express': 4.17.17 + '@types/express': 4.17.18 dev: true /@types/mime@1.3.2: @@ -7088,10 +7706,10 @@ packages: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: false - /@types/multer@1.4.7: - resolution: {integrity: sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==} + /@types/multer@1.4.8: + resolution: {integrity: sha512-VMZOW6mnmMMhA5m3fsCdXBwFwC+a+27/8gctNMuQC4f7UtWcF79KAFGoIfKZ4iqrElgWIa3j5vhMJDp0iikQ1g==} dependencies: - '@types/express': 4.17.17 + '@types/express': 4.17.18 /@types/node@10.17.60: resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} @@ -7131,7 +7749,7 @@ packages: /@types/serve-index@1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} dependencies: - '@types/express': 4.17.17 + '@types/express': 4.17.18 dev: true /@types/serve-static@1.15.2: @@ -7166,8 +7784,8 @@ packages: '@types/node': 20.5.7 dev: true - /@types/supertest@2.0.12: - resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} + /@types/supertest@2.0.14: + resolution: {integrity: sha512-Q900DeeHNFF3ZYYepf/EyJfZDA2JrnWLaSQ0YNV7+2GTo8IlJzauEnDGhya+hauncpBYTYGpVHwGdssJeAQ7eA==} dependencies: '@types/superagent': 4.1.18 dev: true @@ -7178,8 +7796,8 @@ packages: '@types/node': 20.5.7 dev: true - /@types/validator@13.11.1: - resolution: {integrity: sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==} + /@types/validator@13.11.2: + resolution: {integrity: sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==} dev: true /@types/webidl-conversions@7.0.0: @@ -8490,14 +9108,14 @@ packages: deep-equal: 2.2.1 dev: true - /babel-jest@29.6.4(@babel/core@7.22.9): - resolution: {integrity: sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==} + /babel-jest@29.7.0(@babel/core@7.22.9): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: '@babel/core': 7.22.9 - '@jest/transform': 29.6.4 + '@jest/transform': 29.7.0 '@types/babel__core': 7.20.1 babel-plugin-istanbul: 6.1.1 babel-preset-jest: 29.6.3(@babel/core@7.22.9) @@ -8659,8 +9277,8 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /barrelsby@2.8.0: - resolution: {integrity: sha512-jOwPx2TlXvJgD5gOl7uqq9MUC7qlD5vRz4DhFA+WxsUZsA2VA3y8kTNpZqmzp6EC5TlzefdH6uS80Cadd5a4cw==} + /barrelsby@2.8.1: + resolution: {integrity: sha512-barN2MVKqUVwmjRy3JLSMYufrBDcdWUc2pjlR0V9P8S3aMvvJ4StFz1GJMzEi5GBoQlnBIWOcCxBDzI2xfaaGw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: @@ -9603,6 +10221,25 @@ packages: lazy-cache: 2.0.2 dev: true + /create-jest@29.7.0(@types/node@20.5.7)(ts-node@10.9.1): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -10167,7 +10804,7 @@ packages: engines: {node: '>=10.2.0'} dependencies: '@types/cookie': 0.4.1 - '@types/cors': 2.8.13 + '@types/cors': 2.8.14 '@types/node': 20.5.7 accepts: 1.3.8 base64id: 2.0.0 @@ -10740,15 +11377,15 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect@29.6.4: - resolution: {integrity: sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==} + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.6.4 + '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 - jest-matcher-utils: 29.6.4 - jest-message-util: 29.6.3 - jest-util: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 dev: true /exponential-backoff@3.1.1: @@ -11654,6 +12291,11 @@ packages: capital-case: 1.0.4 tslib: 2.6.2 + /helmet@7.0.0: + resolution: {integrity: sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ==} + engines: {node: '>=16.0.0'} + dev: false + /hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} @@ -11783,7 +12425,7 @@ packages: - supports-color dev: true - /http-proxy-middleware@2.0.6(@types/express@4.17.17): + /http-proxy-middleware@2.0.6(@types/express@4.17.18): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -11792,7 +12434,7 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.17 + '@types/express': 4.17.18 '@types/http-proxy': 1.17.11 http-proxy: 1.18.1 is-glob: 4.0.3 @@ -11848,6 +12490,12 @@ packages: ms: 2.1.3 dev: true + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: false + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -12491,36 +13139,36 @@ packages: resolution: {integrity: sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==} dev: true - /jest-changed-files@29.6.3: - resolution: {integrity: sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==} + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 - jest-util: 29.6.3 + jest-util: 29.7.0 p-limit: 3.1.0 dev: true - /jest-circus@29.6.4: - resolution: {integrity: sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==} + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.6.4 - '@jest/expect': 29.6.4 - '@jest/test-result': 29.6.4 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.5.7 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 is-generator-fn: 2.1.0 - jest-each: 29.6.3 - jest-matcher-utils: 29.6.4 - jest-message-util: 29.6.3 - jest-runtime: 29.6.4 - jest-snapshot: 29.6.4 - jest-util: 29.6.3 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 p-limit: 3.1.0 - pretty-format: 29.6.3 + pretty-format: 29.7.0 pure-rand: 6.0.2 slash: 3.0.0 stack-utils: 2.0.6 @@ -12529,8 +13177,8 @@ packages: - supports-color dev: true - /jest-cli@29.6.4(@types/node@20.5.7)(ts-node@10.9.1): - resolution: {integrity: sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==} + /jest-cli@29.7.0(@types/node@20.5.7)(ts-node@10.9.1): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -12539,17 +13187,16 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.6.4(ts-node@10.9.1) - '@jest/test-result': 29.6.4 + '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) exit: 0.1.2 - graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.6.4(@types/node@20.5.7)(ts-node@10.9.1) - jest-util: 29.6.3 - jest-validate: 29.6.3 - prompts: 2.4.2 + jest-config: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) + jest-util: 29.7.0 + jest-validate: 29.7.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -12558,8 +13205,8 @@ packages: - ts-node dev: true - /jest-config@29.6.4(@types/node@20.5.7)(ts-node@10.9.1): - resolution: {integrity: sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==} + /jest-config@29.7.0(@types/node@20.5.7)(ts-node@10.9.1): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -12571,26 +13218,26 @@ packages: optional: true dependencies: '@babel/core': 7.22.9 - '@jest/test-sequencer': 29.6.4 + '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.5.7 - babel-jest: 29.6.4(@babel/core@7.22.9) + babel-jest: 29.7.0(@babel/core@7.22.9) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.6.4 - jest-environment-node: 29.6.4 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 - jest-resolve: 29.6.4 - jest-runner: 29.6.4 - jest-util: 29.6.3 - jest-validate: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.6.3 + pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 ts-node: 10.9.1(@types/node@20.5.7)(typescript@5.2.2) @@ -12599,44 +13246,44 @@ packages: - supports-color dev: true - /jest-diff@29.6.4: - resolution: {integrity: sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==} + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 - pretty-format: 29.6.3 + pretty-format: 29.7.0 dev: true - /jest-docblock@29.6.3: - resolution: {integrity: sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==} + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each@29.6.3: - resolution: {integrity: sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==} + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 jest-get-type: 29.6.3 - jest-util: 29.6.3 - pretty-format: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 dev: true - /jest-environment-node@29.6.4: - resolution: {integrity: sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==} + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.6.4 - '@jest/fake-timers': 29.6.4 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.5.7 - jest-mock: 29.6.3 - jest-util: 29.6.3 + jest-mock: 29.7.0 + jest-util: 29.7.0 dev: true /jest-get-type@29.6.3: @@ -12644,8 +13291,8 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map@29.6.4: - resolution: {integrity: sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==} + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 @@ -12655,34 +13302,34 @@ packages: fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 - jest-util: 29.6.3 - jest-worker: 29.6.4 + jest-util: 29.7.0 + jest-worker: 29.7.0 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: true - /jest-leak-detector@29.6.3: - resolution: {integrity: sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==} + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 - pretty-format: 29.6.3 + pretty-format: 29.7.0 dev: true - /jest-matcher-utils@29.6.4: - resolution: {integrity: sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==} + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - jest-diff: 29.6.4 + jest-diff: 29.7.0 jest-get-type: 29.6.3 - pretty-format: 29.6.3 + pretty-format: 29.7.0 dev: true - /jest-message-util@29.6.3: - resolution: {integrity: sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==} + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/code-frame': 7.22.13 @@ -12691,21 +13338,21 @@ packages: chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.5 - pretty-format: 29.6.3 + pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 dev: true - /jest-mock@29.6.3: - resolution: {integrity: sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==} + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 20.5.7 - jest-util: 29.6.3 + jest-util: 29.7.0 dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.6.4): + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -12714,7 +13361,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.6.4 + jest-resolve: 29.7.0 dev: true /jest-regex-util@29.6.3: @@ -12722,70 +13369,70 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies@29.6.4: - resolution: {integrity: sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==} + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-regex-util: 29.6.3 - jest-snapshot: 29.6.4 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /jest-resolve@29.6.4: - resolution: {integrity: sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==} + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.6.4 - jest-pnp-resolver: 1.2.3(jest-resolve@29.6.4) - jest-util: 29.6.3 - jest-validate: 29.6.3 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 resolve: 1.22.2 resolve.exports: 2.0.2 slash: 3.0.0 dev: true - /jest-runner@29.6.4: - resolution: {integrity: sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==} + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.6.4 - '@jest/environment': 29.6.4 - '@jest/test-result': 29.6.4 - '@jest/transform': 29.6.4 + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.5.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 29.6.3 - jest-environment-node: 29.6.4 - jest-haste-map: 29.6.4 - jest-leak-detector: 29.6.3 - jest-message-util: 29.6.3 - jest-resolve: 29.6.4 - jest-runtime: 29.6.4 - jest-util: 29.6.3 - jest-watcher: 29.6.4 - jest-worker: 29.6.4 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime@29.6.4: - resolution: {integrity: sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==} + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.6.4 - '@jest/fake-timers': 29.6.4 - '@jest/globals': 29.6.4 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 '@jest/source-map': 29.6.3 - '@jest/test-result': 29.6.4 - '@jest/transform': 29.6.4 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.5.7 chalk: 4.1.2 @@ -12793,21 +13440,21 @@ packages: collect-v8-coverage: 1.0.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 29.6.4 - jest-message-util: 29.6.3 - jest-mock: 29.6.3 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 jest-regex-util: 29.6.3 - jest-resolve: 29.6.4 - jest-snapshot: 29.6.4 - jest-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /jest-snapshot@29.6.4: - resolution: {integrity: sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==} + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.22.9 @@ -12815,20 +13462,20 @@ packages: '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.9) '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.9) '@babel/types': 7.23.0 - '@jest/expect-utils': 29.6.4 - '@jest/transform': 29.6.4 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.9) chalk: 4.1.2 - expect: 29.6.4 + expect: 29.7.0 graceful-fs: 4.2.11 - jest-diff: 29.6.4 + jest-diff: 29.7.0 jest-get-type: 29.6.3 - jest-matcher-utils: 29.6.4 - jest-message-util: 29.6.3 - jest-util: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 natural-compare: 1.4.0 - pretty-format: 29.6.3 + pretty-format: 29.7.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -12846,8 +13493,20 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate@29.6.3: - resolution: {integrity: sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==} + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.5.7 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 @@ -12855,20 +13514,20 @@ packages: chalk: 4.1.2 jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.6.3 + pretty-format: 29.7.0 dev: true - /jest-watcher@29.6.4: - resolution: {integrity: sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==} + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.6.4 + '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.5.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.6.3 + jest-util: 29.7.0 string-length: 4.0.2 dev: true @@ -12881,18 +13540,18 @@ packages: supports-color: 8.1.1 dev: true - /jest-worker@29.6.4: - resolution: {integrity: sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==} + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/node': 20.5.7 - jest-util: 29.6.3 + jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.6.4(@types/node@20.5.7)(ts-node@10.9.1): - resolution: {integrity: sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==} + /jest@29.7.0(@types/node@20.5.7)(ts-node@10.9.1): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -12901,10 +13560,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.6.4(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.6.4(@types/node@20.5.7)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15004,8 +15663,8 @@ packages: engines: {node: '>=6'} dev: true - /pretty-format@29.6.3: - resolution: {integrity: sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==} + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 @@ -16464,7 +17123,7 @@ packages: tslib: 1.14.1 dev: true - /ts-jest@29.1.1(@babel/core@7.22.9)(jest@29.6.4)(typescript@5.2.2): + /ts-jest@29.1.1(@babel/core@7.22.9)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -16488,7 +17147,7 @@ packages: '@babel/core': 7.22.9 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.6.4(@types/node@20.5.7)(ts-node@10.9.1) + jest: 29.7.0(@types/node@20.5.7)(ts-node@10.9.1) jest-util: 29.6.3 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17203,7 +17862,7 @@ packages: dependencies: '@types/bonjour': 3.5.10 '@types/connect-history-api-fallback': 1.5.0 - '@types/express': 4.17.17 + '@types/express': 4.17.18 '@types/serve-index': 1.9.1 '@types/serve-static': 1.15.2 '@types/sockjs': 0.3.33 @@ -17218,7 +17877,7 @@ packages: express: 4.18.2 graceful-fs: 4.2.11 html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.17) + http-proxy-middleware: 2.0.6(@types/express@4.17.18) ipaddr.js: 2.1.0 launch-editor: 2.6.0 open: 8.4.2 diff --git a/ui/hikers-book/.gitignore b/ui/hikers-book/.gitignore index 16d5e66..87b0281 100644 --- a/ui/hikers-book/.gitignore +++ b/ui/hikers-book/.gitignore @@ -9,7 +9,6 @@ # Node /node_modules npm-debug.log -yarn-error.log # IDEs and editors .idea/ diff --git a/ui/hikers-book/package.json b/ui/hikers-book/package.json index 15f4775..a4979ca 100644 --- a/ui/hikers-book/package.json +++ b/ui/hikers-book/package.json @@ -12,6 +12,7 @@ "lint": "eslint src", "generate": "graphql-codegen", "config": "hikers-book-config-cli -s node_modules/@hikers-book/config/config/ui.hikers-book.json -t src/assets/config.json -f json || true", + "config:clear": "find ./src/assets -name '*.json' -type f -delete", "postinstall": "pnpm run config" }, "private": true, diff --git a/ui/hikers-book/src/assets/.gitkeep b/ui/hikers-book/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29