diff --git a/.eslintrc.json b/.eslintrc.json index 86d2612..ad4d5da 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,7 +6,8 @@ }, "extends": "eslint:recommended", "parserOptions": { - "ecmaVersion": "latest" + "ecmaVersion": "latest", + "sourceType": "module" }, "rules": { "eqeqeq": ["error"], diff --git a/app/configs/config.js b/app/configs/config.js deleted file mode 100644 index 2ee8bce..0000000 --- a/app/configs/config.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -const common = require('app/configs/environments/common'); -const environment = require(`app/configs/environments/${process.env.NODE_ENV}`); - -const config = { - ...common, - ...environment -}; - -module.exports = config; diff --git a/app/configs/environments/development.js b/app/configs/environments/development.js deleted file mode 100644 index 9b83469..0000000 --- a/app/configs/environments/development.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -const Knex = require('knex'); -const os = require('os'); - -const mysqlConnectionString = { - host: '', - user: '', - password: '', - database: '', - port: 3306 -}; - -const KNEX_CONFIG = { - client: 'mysql', - connection: mysqlConnectionString -}; - -const knex = Knex(KNEX_CONFIG); - -const MORGAN_LOG_PATH = `${os.homedir()}/.logs`; - -const HEALTHCHECKS = { - DEPLOY_BASE_URL: 'http://localhost:3000', - URL: 'https://hc-ping.com/uuid' -}; - -const config = { - knex: knex, - MORGAN_LOG_PATH: MORGAN_LOG_PATH, - HEALTHCHECKS: HEALTHCHECKS -}; - -module.exports = config; diff --git a/app/configs/environments/production.js b/app/configs/environments/production.js deleted file mode 100644 index 9b83469..0000000 --- a/app/configs/environments/production.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -const Knex = require('knex'); -const os = require('os'); - -const mysqlConnectionString = { - host: '', - user: '', - password: '', - database: '', - port: 3306 -}; - -const KNEX_CONFIG = { - client: 'mysql', - connection: mysqlConnectionString -}; - -const knex = Knex(KNEX_CONFIG); - -const MORGAN_LOG_PATH = `${os.homedir()}/.logs`; - -const HEALTHCHECKS = { - DEPLOY_BASE_URL: 'http://localhost:3000', - URL: 'https://hc-ping.com/uuid' -}; - -const config = { - knex: knex, - MORGAN_LOG_PATH: MORGAN_LOG_PATH, - HEALTHCHECKS: HEALTHCHECKS -}; - -module.exports = config; diff --git a/app/configs/environments/staging.js b/app/configs/environments/staging.js deleted file mode 100644 index 9b83469..0000000 --- a/app/configs/environments/staging.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -const Knex = require('knex'); -const os = require('os'); - -const mysqlConnectionString = { - host: '', - user: '', - password: '', - database: '', - port: 3306 -}; - -const KNEX_CONFIG = { - client: 'mysql', - connection: mysqlConnectionString -}; - -const knex = Knex(KNEX_CONFIG); - -const MORGAN_LOG_PATH = `${os.homedir()}/.logs`; - -const HEALTHCHECKS = { - DEPLOY_BASE_URL: 'http://localhost:3000', - URL: 'https://hc-ping.com/uuid' -}; - -const config = { - knex: knex, - MORGAN_LOG_PATH: MORGAN_LOG_PATH, - HEALTHCHECKS: HEALTHCHECKS -}; - -module.exports = config; diff --git a/app/configs/environments/test.js b/app/configs/environments/test.js deleted file mode 100644 index 9b83469..0000000 --- a/app/configs/environments/test.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -const Knex = require('knex'); -const os = require('os'); - -const mysqlConnectionString = { - host: '', - user: '', - password: '', - database: '', - port: 3306 -}; - -const KNEX_CONFIG = { - client: 'mysql', - connection: mysqlConnectionString -}; - -const knex = Knex(KNEX_CONFIG); - -const MORGAN_LOG_PATH = `${os.homedir()}/.logs`; - -const HEALTHCHECKS = { - DEPLOY_BASE_URL: 'http://localhost:3000', - URL: 'https://hc-ping.com/uuid' -}; - -const config = { - knex: knex, - MORGAN_LOG_PATH: MORGAN_LOG_PATH, - HEALTHCHECKS: HEALTHCHECKS -}; - -module.exports = config; diff --git a/app/controllers/healthchecks.js b/app/controllers/healthchecks.js deleted file mode 100644 index d936453..0000000 --- a/app/controllers/healthchecks.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -const healthchecksService = require('app/services/healthchecks'); -const wrapperService = require('app/services/wrapper'); - -// eslint-disable-next-line no-unused-vars -const healthchecks = async (req, res, next) => { - let healthchecksParams = {}; - - let result = await healthchecksService.healthchecks(healthchecksParams); - return res.json(result); -}; - -module.exports = { - healthchecks: wrapperService.wrap(healthchecks) -}; diff --git a/app/middlewares/auths.js b/app/middlewares/auths.js deleted file mode 100644 index 30b29d6..0000000 --- a/app/middlewares/auths.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -const middleware = (req, res, next) => { - return next(); -}; - -module.exports = middleware; diff --git a/app/models/healthchecks.js b/app/models/healthchecks.js deleted file mode 100644 index f439731..0000000 --- a/app/models/healthchecks.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -const config = require('app/configs/config'); - -const utilsService = require('app/services/utils'); -const wrapperService = require('app/services/wrapper'); - -const check = async () => { - const checkQuery = config.knex.select(config.knex.raw('now()')); - - let result = await checkQuery; - - return utilsService.sanitizeSqlResult(result[0]); -}; - -module.exports = { - check: wrapperService.wrap(check) -}; diff --git a/app/routes/healthchecks.js b/app/routes/healthchecks.js deleted file mode 100644 index 34fa025..0000000 --- a/app/routes/healthchecks.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -const express = require('express'); -const router = express.Router(); - -const controller = require('app/controllers/healthchecks'); - -router.get('/', controller.healthchecks); - -module.exports = router; diff --git a/app/services/placeholder.js b/app/services/placeholder.js deleted file mode 100644 index a104ccd..0000000 --- a/app/services/placeholder.js +++ /dev/null @@ -1,84 +0,0 @@ -'use strict'; - -const status = require('app/configs/status'); - -const wrapperService = require('app/services/wrapper'); - -const placeholderModel = require('app/models/placeholder'); - -const createPlaceholder = async (params) => { - if (!params.param1) { - throw new Error('input_missing'); - } - - let placeholderParams = {}; - placeholderParams.param1 = params.param1; - - let result = await placeholderModel.createPlaceholder(placeholderParams); - - let response = status.getStatus('success'); - response.data = {}; - response.data.placeholder = result; - - return response; -}; - -const getPlaceholders = async (params) => { - let placeholderParams = {}; - params.param1 ? (placeholderParams.param1 = params.param1) : null; - - let result = await placeholderModel.getPlaceholders(placeholderParams); - - let response = status.getStatus('success'); - response.data = {}; - response.data.placeholders = result; - - return response; -}; - -const getPlaceholder = async (params) => { - if (!params.placeholderId) { - throw new Error('input_missing'); - } - - let placeholderParams = {}; - placeholderParams.placeholderId = params.placeholderId; - - let result = await placeholderModel.getPlaceholder(placeholderParams); - - let response = status.getStatus('success'); - response.data = {}; - response.data.placeholder = result; - - return response; -}; - -const updatePlaceholder = async (params) => { - if (!params.placeholderId || !params.param1) { - throw new Error('input_missing'); - } - - let placeholderParams = {}; - placeholderParams.placeholderId = params.placeholderId; - placeholderParams.param1 = params.param1; - - await placeholderModel.updatePlaceholder(placeholderParams); - - placeholderParams = {}; - placeholderParams.param1 = params.param1; - - let result = await placeholderModel.getPlaceholder(placeholderParams); - - let response = status.getStatus('success'); - response.data = {}; - response.data.placeholder = result; - - return response; -}; - -module.exports = { - createPlaceholder: wrapperService.wrap(createPlaceholder), - getPlaceholders: wrapperService.wrap(getPlaceholders), - getPlaceholder: wrapperService.wrap(getPlaceholder), - updatePlaceholder: wrapperService.wrap(updatePlaceholder) -}; diff --git a/app/services/wrapper.js b/app/services/wrapper.js deleted file mode 100644 index b823c0b..0000000 --- a/app/services/wrapper.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -const status = require('app/configs/status'); - -function wrap(inputFunction) { - return async function () { - try { - return await inputFunction.apply(this, arguments); - } catch (e) { - let cb; - if (arguments.length !== 1) { - cb = arguments[arguments.length - 1]; - } - - // console.log(e.message); - if (e.hasOwnProperty('message')) { - console.log(new Date().toISOString(), status.getStatus(e.message)); - return cb ? cb(status.getStatus(e.message)) : status.getStatus(e.message); - } else { - return cb ? cb(status.getStatus('generic_fail')) : status.getStatus('generic_fail'); - } - } - }; -} - -module.exports = { - wrap: wrap -}; diff --git a/package-lock.json b/package-lock.json index 7c959bb..94e0285 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,14 +14,23 @@ "eslint": "^8.13.0", "express": "^4.19.2", "knex": "^2.5.1", + "module-alias": "^2.2.3", "morgan": "^1.10.0", - "mysql": "^2.18.1" + "mysql": "^2.18.1", + "typescript": "^5.8.3" }, "devDependencies": { "@stoplight/spectral-cli": "^6.14.1", + "@types/body-parser": "^1.19.6", + "@types/compression": "^1.8.1", + "@types/express": "^5.0.3", + "@types/morgan": "^1.9.10", "esbuild": "^0.25.5", "husky": "^7.0.4", - "prettier": "^2.8.8" + "prettier": "^2.8.8", + "ts-loader": "^9.5.2", + "ts-node": "^10.9.2", + "tslint": "^5.20.1" } }, "node_modules/@asyncapi/specs": { @@ -34,6 +43,44 @@ "@types/json-schema": "^7.0.11" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", @@ -550,6 +597,82 @@ "deprecated": "Use @eslint/object-schema instead", "license": "BSD-3-Clause" }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@jsep-plugin/assignment": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", @@ -1300,6 +1423,66 @@ "node": "^12.20 || >=14.13" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/es-aggregate-error": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz", @@ -1310,6 +1493,30 @@ "@types/node": "*" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -1317,6 +1524,38 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1331,6 +1570,23 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/morgan": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.10.tgz", + "integrity": "sha512-sS4A1zheMvsADRVfT0lYbJ4S9lmsey8Zo2F7cnbYjWHP67Q0AwMYuuzLlkIM2N8gAbb9cubhIVFwcIN2XyYCkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "22.9.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", @@ -1341,6 +1597,20 @@ "undici-types": "~6.19.8" } }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/sarif": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", @@ -1348,6 +1618,29 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, "node_modules/@types/urijs": { "version": "1.19.25", "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz", @@ -1361,6 +1654,198 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "license": "ISC" }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -1388,9 +1873,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1408,6 +1893,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1490,6 +1988,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1680,21 +2185,73 @@ "node": ">=8" } }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/call-bind": { "version": "1.0.7", @@ -1724,6 +2281,28 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1740,6 +2319,17 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1914,6 +2504,13 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2076,6 +2673,16 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2094,6 +2701,14 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.179", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", + "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2110,6 +2725,20 @@ "node": ">= 0.8" } }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/es-abstract": { "version": "1.23.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", @@ -2215,6 +2844,14 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -2303,9 +2940,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -2438,6 +3075,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -2506,6 +3157,17 @@ "node": ">=6" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -2960,6 +3622,14 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -3536,6 +4206,46 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3564,6 +4274,14 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3734,6 +4452,17 @@ "node": ">= 0.8.0" } }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3778,6 +4507,13 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/markdown-escape": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-escape/-/markdown-escape-2.0.0.tgz", @@ -3803,6 +4539,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3890,6 +4634,35 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-alias": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", + "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", + "license": "MIT" + }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -3969,6 +4742,14 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/nimma": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz", @@ -4010,6 +4791,14 @@ } } }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/node-sarif-builder": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-2.0.3.tgz", @@ -4208,6 +4997,13 @@ "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==", "license": "MIT" }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4336,6 +5132,17 @@ ], "license": "MIT" }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4604,6 +5411,80 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -4658,6 +5539,17 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -4774,6 +5666,18 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -4782,6 +5686,13 @@ "dev": true, "license": "MIT" }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/sqlstring": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", @@ -4935,6 +5846,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/tarn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", @@ -4944,6 +5865,82 @@ "node": ">=8.0.0" } }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4988,6 +5985,81 @@ "dev": true, "license": "MIT" }, + "node_modules/ts-loader": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -4995,6 +6067,183 @@ "dev": true, "license": "0BSD" }, + "node_modules/tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" + } + }, + "node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tslint/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tslint/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5109,6 +6358,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -5151,6 +6413,38 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -5192,6 +6486,13 @@ "node": ">= 0.4.0" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, "node_modules/validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", @@ -5211,6 +6512,21 @@ "node": ">= 0.8" } }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -5218,6 +6534,100 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/webpack": { + "version": "5.99.9", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", + "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -5368,6 +6778,16 @@ "node": ">=12" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index b6eeb33..da57aa9 100644 --- a/package.json +++ b/package.json @@ -13,25 +13,37 @@ "eslint": "^8.13.0", "express": "^4.19.2", "knex": "^2.5.1", + "module-alias": "^2.2.3", "morgan": "^1.10.0", - "mysql": "^2.18.1" + "mysql": "^2.18.1", + "typescript": "^5.8.3" }, "devDependencies": { "@stoplight/spectral-cli": "^6.14.1", + "@types/body-parser": "^1.19.6", + "@types/compression": "^1.8.1", + "@types/express": "^5.0.3", + "@types/morgan": "^1.9.10", "esbuild": "^0.25.5", "husky": "^7.0.4", - "prettier": "^2.8.8" + "prettier": "^2.8.8", + "ts-loader": "^9.5.2", + "ts-node": "^10.9.2", + "tslint": "^5.20.1" }, "scripts": { "test": "./scripts/tests.sh", "test-server": "NODE_ENV=test;node server.js", - "start": "node server.js", + "start": "ts-node -r tsconfig-paths/register app/server.ts", + "build": "tsc", "git-check": "./scripts/npm/git-check.sh", "beautify": "./scripts/beautify.sh", "dist": "./scripts/dist.sh", "prepare": "husky install", - "lint-docs": "./node_modules/@stoplight/spectral-cli/dist/index.js lint docs/api/spec.yaml --ruleset spectral.yaml" + "lint-docs": "./node_modules/@stoplight/spectral-cli/dist/index.js lint docs/api/spec.yaml --ruleset spectral.yaml", + "webpack": "webpack --config webpack.config.js" }, + "": {}, "repository": { "type": "git", "url": "git+https://github.com/sahilnarain/node-api-boilerplate" diff --git a/scripts/build.js b/scripts/build.js index ef06294..4d39440 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -3,11 +3,11 @@ const esbuild = require('esbuild'); const fs = require('fs'); -!fs.existsSync(`${__dirname}/../node_modules/app`) ? fs.symlinkSync(`${__dirname}/../app`, `${__dirname}/../node_modules/app`) : null; +!fs.existsSync(`${__dirname}/../node_modules/app`) ? fs.symlinkSync(`${__dirname}/../dist/app`, `${__dirname}/../node_modules/app`) : null; const build = async () => { await esbuild.build({ - entryPoints: ['./server.js'], + entryPoints: ['./dist/server.js'], bundle: true, platform: 'node', outfile: '.server.js', diff --git a/scripts/package.sh b/scripts/package.sh new file mode 100644 index 0000000..5f0d394 --- /dev/null +++ b/scripts/package.sh @@ -0,0 +1,5 @@ +rm -rf dist +npm run build + +cp -r node_modules dist/node_modules +ln -s ../app dist/node_modules/app diff --git a/src/app/configs/config.ts b/src/app/configs/config.ts new file mode 100644 index 0000000..d2584b2 --- /dev/null +++ b/src/app/configs/config.ts @@ -0,0 +1,10 @@ +import common from 'app/configs/environments/common'; +import type { EnviornmentConfig, Config } from 'types'; +const environment: EnviornmentConfig = require(`app/configs/environments/${process.env.NODE_ENV}`); + +export const config: Config = { + ...common, + ...environment +}; + +export default config; \ No newline at end of file diff --git a/app/configs/environments/common.js b/src/app/configs/environments/common.ts similarity index 60% rename from app/configs/environments/common.js rename to src/app/configs/environments/common.ts index fe71c82..a857b40 100644 --- a/app/configs/environments/common.js +++ b/src/app/configs/environments/common.ts @@ -1,10 +1,11 @@ 'use strict'; +import type { CommonConfig } from 'types'; const IPV6 = true; const config = { SERVER_IP: IPV6 ? '::' : '0.0.0.0', SERVER_PORT: process.env.PORT || 3000 -}; +} as CommonConfig; -module.exports = config; +export default config; \ No newline at end of file diff --git a/src/app/configs/environments/development.ts b/src/app/configs/environments/development.ts new file mode 100644 index 0000000..4994d9a --- /dev/null +++ b/src/app/configs/environments/development.ts @@ -0,0 +1,35 @@ +import { EnviornmentConfig, HealthChecksConfig, KnexConfig, MysqlConnectionString } from 'types'; + +import Knex from 'knex'; +import os from 'os'; + +const mysqlConnectionString: MysqlConnectionString = { + host: '', + user: '', + password: '', + database: '', + port: 3306 +}; + +const KNEX_CONFIG: KnexConfig = { + client: 'mysql', + connection: mysqlConnectionString +}; + +const knex = Knex(KNEX_CONFIG); + +const MORGAN_LOG_PATH: string = `${os.homedir()}/.logs`; + +const HEALTHCHECKS: HealthChecksConfig = { + DEPLOY_BASE_URL: 'http://localhost:3000', + URL: 'https://hc-ping.com/uuid' +}; + +const config: EnviornmentConfig = { + knex: knex, + MORGAN_LOG_PATH: MORGAN_LOG_PATH, + HEALTHCHECKS: HEALTHCHECKS +}; + +export default config; +module.exports = config; \ No newline at end of file diff --git a/src/app/configs/environments/production.ts b/src/app/configs/environments/production.ts new file mode 100644 index 0000000..6a3942c --- /dev/null +++ b/src/app/configs/environments/production.ts @@ -0,0 +1,36 @@ + +import { EnviornmentConfig, HealthChecksConfig, KnexConfig, MysqlConnectionString } from 'types'; + +import Knex from 'knex'; +import os from 'os'; + +const mysqlConnectionString: MysqlConnectionString = { + host: '', + user: '', + password: '', + database: '', + port: 3306 +}; + +const KNEX_CONFIG: KnexConfig = { + client: 'mysql', + connection: mysqlConnectionString +}; + +const knex = Knex(KNEX_CONFIG); + +const MORGAN_LOG_PATH: string = `${os.homedir()}/.logs`; + +const HEALTHCHECKS: HealthChecksConfig = { + DEPLOY_BASE_URL: 'http://localhost:3000', + URL: 'https://hc-ping.com/uuid' +}; + +const config: EnviornmentConfig = { + knex: knex, + MORGAN_LOG_PATH: MORGAN_LOG_PATH, + HEALTHCHECKS: HEALTHCHECKS +}; + +export default config; +module.exports = config; \ No newline at end of file diff --git a/src/app/configs/environments/staging.ts b/src/app/configs/environments/staging.ts new file mode 100644 index 0000000..4994d9a --- /dev/null +++ b/src/app/configs/environments/staging.ts @@ -0,0 +1,35 @@ +import { EnviornmentConfig, HealthChecksConfig, KnexConfig, MysqlConnectionString } from 'types'; + +import Knex from 'knex'; +import os from 'os'; + +const mysqlConnectionString: MysqlConnectionString = { + host: '', + user: '', + password: '', + database: '', + port: 3306 +}; + +const KNEX_CONFIG: KnexConfig = { + client: 'mysql', + connection: mysqlConnectionString +}; + +const knex = Knex(KNEX_CONFIG); + +const MORGAN_LOG_PATH: string = `${os.homedir()}/.logs`; + +const HEALTHCHECKS: HealthChecksConfig = { + DEPLOY_BASE_URL: 'http://localhost:3000', + URL: 'https://hc-ping.com/uuid' +}; + +const config: EnviornmentConfig = { + knex: knex, + MORGAN_LOG_PATH: MORGAN_LOG_PATH, + HEALTHCHECKS: HEALTHCHECKS +}; + +export default config; +module.exports = config; \ No newline at end of file diff --git a/src/app/configs/environments/test.ts b/src/app/configs/environments/test.ts new file mode 100644 index 0000000..48c366d --- /dev/null +++ b/src/app/configs/environments/test.ts @@ -0,0 +1,36 @@ +import { EnviornmentConfig, HealthChecksConfig, KnexConfig, MysqlConnectionString } from 'types'; + +import Knex from 'knex'; +import os from 'os'; + + +const mysqlConnectionString: MysqlConnectionString = { + host: '', + user: '', + password: '', + database: '', + port: 3306 +}; + +const KNEX_CONFIG: KnexConfig = { + client: 'mysql', + connection: mysqlConnectionString +}; + +const knex = Knex(KNEX_CONFIG); + +const MORGAN_LOG_PATH: string = `${os.homedir()}/.logs`; + +const HEALTHCHECKS: HealthChecksConfig = { + DEPLOY_BASE_URL: 'http://localhost:3000', + URL: 'https://hc-ping.com/uuid' +}; + +const config: EnviornmentConfig = { + knex: knex, + MORGAN_LOG_PATH: MORGAN_LOG_PATH, + HEALTHCHECKS: HEALTHCHECKS +}; + +export default config; +module.exports = config; \ No newline at end of file diff --git a/app/configs/logger.js b/src/app/configs/logger.ts similarity index 80% rename from app/configs/logger.js rename to src/app/configs/logger.ts index 7f8e730..5a11994 100644 --- a/app/configs/logger.js +++ b/src/app/configs/logger.ts @@ -1,22 +1,20 @@ -'use strict'; +import fs from 'fs'; +import logger from 'morgan'; +import config from 'app/configs/config' -const fs = require('fs'); -const logger = require('morgan'); - -const config = require('app/configs/config'); // Create log file if it doesn't exist fs.existsSync(`${config.MORGAN_LOG_PATH}`) ? null : fs.mkdirSync(`${config.MORGAN_LOG_PATH}`, { - recursive: true - }); + recursive: true + }); let _logFile = `${config.MORGAN_LOG_PATH}/morgan.log`; fs.existsSync(_logFile) ? null : fs.writeFileSync(_logFile, new Date().toISOString()); // Configure logging // eslint-disable-next-line no-unused-vars -logger.token('req-body', (req, res) => { +logger.token('req-body', (req: any, res: any) => { return JSON.stringify({ params: req.query, body: req.body @@ -29,12 +27,12 @@ logger.token('req-headers', (req, res) => { }); // eslint-disable-next-line no-unused-vars -logger.token('tracking', (req, res) => { +logger.token('tracking', (req: any, res) => { return req.headers['x-device-id'] ? req.headers['x-device-id'] : 'DEFAULT'; }); // eslint-disable-next-line no-unused-vars -logger.token('uri', (req, res) => { +logger.token('uri', (req: any, res) => { return req.originalUrl.split('?')[0]; }); @@ -49,7 +47,7 @@ const _customLogFormat = logger(customLogFormat, { const _devLogStream = logger('dev'); -module.exports = { +export default { customLogFormat: _customLogFormat, devLogStream: _devLogStream -}; +} diff --git a/app/configs/status.js b/src/app/configs/status.ts similarity index 80% rename from app/configs/status.js rename to src/app/configs/status.ts index 8309501..7626b0c 100644 --- a/app/configs/status.js +++ b/src/app/configs/status.ts @@ -1,7 +1,7 @@ -'use strict'; +import type { Status } from 'types'; -const getStatus = (code) => { - let status = null; +export const getStatus = (code: string): Status => { + let status = null as Status | null; switch (code) { case 'success': @@ -41,6 +41,6 @@ const getStatus = (code) => { return status; }; -module.exports = { - getStatus: getStatus -}; +export default { + getStatus +} \ No newline at end of file diff --git a/src/app/controllers/healthchecks.ts b/src/app/controllers/healthchecks.ts new file mode 100644 index 0000000..19ae8f6 --- /dev/null +++ b/src/app/controllers/healthchecks.ts @@ -0,0 +1,16 @@ +import healthchecksService from "app/services/healthchecks"; +import wrapperService from "app/services/wrapper"; +import { Controller } from 'types'; + + +const healthchecks: Controller = async (req, res) => { + + let result = await healthchecksService.healthchecks(); + return res.json(result); +}; + + +export default { + healthchecks: wrapperService.wrap(healthchecks) +} + diff --git a/app/controllers/placeholder.js b/src/app/controllers/placeholder.ts similarity index 50% rename from app/controllers/placeholder.js rename to src/app/controllers/placeholder.ts index 124abb1..df3edf2 100644 --- a/app/controllers/placeholder.js +++ b/src/app/controllers/placeholder.ts @@ -1,16 +1,17 @@ -'use strict'; +import placeholderService from "app/services/placeholder"; +import wrapperService from "app/services/wrapper"; +import { Controller, CreatePlaceholderRequest, GetPlaceholdersRequest, GetPlaceholderRequest, UpdatePlaceholderRequest, CreatePlaceholderResponse, GetPlaceholersResponse, GetPlaceholderResponse, UpdatePlaceholderResponse, APIResponse } from 'types'; -const placeholderService = require('app/services/placeholder'); -const wrapperService = require('app/services/wrapper'); -// eslint-disable-next-line no-unused-vars -const createPlaceholder = async (req, res, next) => { - if (!req.body.param1) { +const createPlaceholder: Controller = async (req: CreatePlaceholderRequest, res) => { + const params = req.body; + if (!params.param1) { throw new Error('input_missing'); } - let placeholderParams = {}; - placeholderParams.param1 = req.body.param1; + let placeholderParams = { + param1: params.param1 + } let result = await placeholderService.createPlaceholder(placeholderParams); @@ -18,8 +19,13 @@ const createPlaceholder = async (req, res, next) => { }; // eslint-disable-next-line no-unused-vars -const getPlaceholders = async (req, res, next) => { - let placeholderParams = {}; +const getPlaceholders: Controller = async (req: GetPlaceholdersRequest, res) => { + const params = req.body + + let placeholderParams = { + placeholderId: params.placeholder_id + } + let result = await placeholderService.getPlaceholders(placeholderParams); @@ -27,13 +33,14 @@ const getPlaceholders = async (req, res, next) => { }; // eslint-disable-next-line no-unused-vars -const getPlaceholder = async (req, res, next) => { +const getPlaceholder: Controller = async (req: GetPlaceholderRequest, res) => { if (!req.params.placeholder_id) { throw new Error('input_missing'); } - let placeholderParams = {}; - placeholderParams.placeholderId = parseInt(req.params.placeholder_id); + let placeholderParams = { + placeholderId: req.params.placeholder_id + }; let result = await placeholderService.getPlaceholder(placeholderParams); @@ -41,12 +48,12 @@ const getPlaceholder = async (req, res, next) => { }; // eslint-disable-next-line no-unused-vars -const updatePlaceholder = async (req, res, next) => { +const updatePlaceholder: Controller = async (req: UpdatePlaceholderRequest, res) => { if (!req.params.placeholder_id) { throw new Error('input_missing'); } - let placeholderParams = {}; + let placeholderParams: any = {}; placeholderParams.placeholderId = parseInt(req.params.placeholder_id); req.body.param1 ? (placeholderParams.param1 = req.body.param1) : null; @@ -55,9 +62,9 @@ const updatePlaceholder = async (req, res, next) => { return res.json(result); }; -module.exports = { +export default { createPlaceholder: wrapperService.wrap(createPlaceholder), getPlaceholders: wrapperService.wrap(getPlaceholders), getPlaceholder: wrapperService.wrap(getPlaceholder), updatePlaceholder: wrapperService.wrap(updatePlaceholder) -}; +} \ No newline at end of file diff --git a/src/app/middlewares/auths.ts b/src/app/middlewares/auths.ts new file mode 100644 index 0000000..e76514d --- /dev/null +++ b/src/app/middlewares/auths.ts @@ -0,0 +1,7 @@ +import { Middleware } from 'types'; + +const middleware: Middleware = (req, res, next) => { + return next(); +}; + +export default middleware diff --git a/src/app/models/healthchecks.ts b/src/app/models/healthchecks.ts new file mode 100644 index 0000000..31c831b --- /dev/null +++ b/src/app/models/healthchecks.ts @@ -0,0 +1,17 @@ +import config from "app/configs/config"; +import utilsService from "app/services/utils"; +import wrapperService from "app/services/wrapper"; +import { JSONValue } from 'types'; + + +const check = async (): Promise => { + const checkQuery = config.knex.select(config.knex.raw('now()')); + + let result = await checkQuery; + + return utilsService.sanitizeSqlResult(result[0]); +}; + +export default { + check: wrapperService.wrap(check) +} \ No newline at end of file diff --git a/app/models/placeholder.js b/src/app/models/placeholder.ts similarity index 52% rename from app/models/placeholder.js rename to src/app/models/placeholder.ts index b3557b8..e7f1a6b 100644 --- a/app/models/placeholder.js +++ b/src/app/models/placeholder.ts @@ -1,11 +1,10 @@ -'use strict'; +import config from "app/configs/config"; +import utilsService from "app/services/utils"; +import wrapperService from "app/services/wrapper"; +import type {CreatePlaceholderOperation, GetPlaceholdersOperation, GetPlaceholderOperation, UpdatePlaceholderOperation, Placeholder} from 'types'; -const utilsService = require('app/services/utils'); -const wrapperService = require('app/services/wrapper'); -const config = require('app/configs/config'); - -const createPlaceholder = async (params) => { +const createPlaceholder = async (params: CreatePlaceholderOperation): Promise => { if (!params.param1) { throw new Error('input_missing'); } @@ -18,28 +17,25 @@ const createPlaceholder = async (params) => { let result = await createPlaceholderQuery; - return result[0].insertId; + return result[0]; }; -const getPlaceholders = async (params) => { - let getPlaceholdersQuery = config.knex.select('id').from('placeholders').orderBy('id', 'desc'); +const getPlaceholders = async (params: GetPlaceholdersOperation): Promise => { + let getPlaceholdersQuery = config.knex.select('id').select('param1').select('active').select('created_at').select('updated_at').select('deleted_at').from('placeholders').orderBy('id', 'desc'); params.placeholderId ? getPlaceholdersQuery.where('id', params.placeholderId) : null; - let result = await getPlaceholdersQuery; + let result: Placeholder[] = await getPlaceholdersQuery; return utilsService.sanitizeSqlResult(result); }; -const getPlaceholder = async (params) => { +const getPlaceholder = async (params: GetPlaceholderOperation): Promise => { if (!params.placeholderId) { throw new Error('input_missing'); } - let placeholderParams = {}; - placeholderParams.placeholderId = params.placeholderId; - - let result = await getPlaceholders(placeholderParams); + let result = await getPlaceholders(params); if (!result) { return null; } @@ -47,14 +43,15 @@ const getPlaceholder = async (params) => { return result[0]; }; -const updatePlaceholder = async (params) => { +const updatePlaceholder = async (params: UpdatePlaceholderOperation): Promise => { if (!params.placeholderId) { throw new Error('input_missing'); } - let _update = { + let _update: any = { updated_at: new Date().toISOString() }; + params.param1 ? (_update.param1 = params.param1) : null; let updatePlaceholderQuery = config.knex('placeholders').update(_update).where('id', params.placeholderId); @@ -64,9 +61,9 @@ const updatePlaceholder = async (params) => { return true; }; -module.exports = { +export default { createPlaceholder: wrapperService.wrap(createPlaceholder), getPlaceholders: wrapperService.wrap(getPlaceholders), getPlaceholder: wrapperService.wrap(getPlaceholder), updatePlaceholder: wrapperService.wrap(updatePlaceholder) -}; +} diff --git a/src/app/routes/healthchecks.ts b/src/app/routes/healthchecks.ts new file mode 100644 index 0000000..13dc5ae --- /dev/null +++ b/src/app/routes/healthchecks.ts @@ -0,0 +1,8 @@ +import { Router } from 'express'; +import controller from 'app/controllers/healthchecks'; + +const router = Router(); + +router.get('/', controller.healthchecks); + +export default router; \ No newline at end of file diff --git a/app/routes/placeholder.js b/src/app/routes/placeholder.ts similarity index 56% rename from app/routes/placeholder.js rename to src/app/routes/placeholder.ts index 6a905e2..8206002 100644 --- a/app/routes/placeholder.js +++ b/src/app/routes/placeholder.ts @@ -1,13 +1,12 @@ -'use strict'; +import { Router } from 'express'; +import controller from 'app/controllers/placeholder' -const express = require('express'); -const router = express.Router(); +const router = Router() -const controller = require('app/controllers/placeholder'); router.post('/', controller.createPlaceholder); router.get('/', controller.getPlaceholders); router.get('/:placeholder_id', controller.getPlaceholder); router.get('/:placeholder_id', controller.updatePlaceholder); -module.exports = router; +export default router \ No newline at end of file diff --git a/app/services/healthchecks.js b/src/app/services/healthchecks.ts similarity index 75% rename from app/services/healthchecks.js rename to src/app/services/healthchecks.ts index 3f12fe5..a71c6c6 100644 --- a/app/services/healthchecks.js +++ b/src/app/services/healthchecks.ts @@ -1,11 +1,8 @@ -'use strict'; - -const config = require('app/configs/config'); -const status = require('app/configs/status'); - -const wrapperService = require('app/services/wrapper'); - -const healthchecksModel = require('app/models/healthchecks'); +import config from "app/configs/config"; +import status from "app/configs/status"; +import wrapperService from 'app/services/wrapper'; +import healthchecksModel from 'app/models/healthchecks'; +import type { Status } from 'types'; const init = async () => { if (`${process.env.NODE_ENV}` === 'test') { @@ -36,7 +33,7 @@ const init = async () => { }, 30000); }; -const healthchecks = async () => { +const healthchecks = async (): Promise => { let result = await healthchecksModel.check(); if (!result) { @@ -47,7 +44,7 @@ const healthchecks = async () => { return response; }; -module.exports = { +export default { init: wrapperService.wrap(init), healthchecks: wrapperService.wrap(healthchecks) -}; +} \ No newline at end of file diff --git a/src/app/services/placeholder.ts b/src/app/services/placeholder.ts new file mode 100644 index 0000000..45af2db --- /dev/null +++ b/src/app/services/placeholder.ts @@ -0,0 +1,83 @@ +import status from 'app/configs/status'; +import wrapperService from 'app/services/wrapper'; +import placeholderModel from 'app/models/placeholder'; +import {CreatePlaceholderOperation, GetPlaceholdersOperation, GetPlaceholderOperation, UpdatePlaceholderOperation, APIResponse, CreatePlaceholderResponse } from 'types'; + +const createPlaceholder = async (params: CreatePlaceholderOperation): Promise> => { + if (!params.param1) { + throw new Error('input_missing'); + } + + let placeholderId = await placeholderModel.createPlaceholder(params); + + let result = await placeholderModel.getPlaceholder({ placeholderId }); + if (!result) { + throw new Error + } + + let response = status.getStatus('success') as APIResponse; + response.data = { + placeholder: result + } + return response; +}; + +const getPlaceholders = async (params: GetPlaceholdersOperation): Promise => { + let placeholderParams: GetPlaceholdersOperation = {}; + params.placeholderId ? (placeholderParams.placeholderId = params.placeholderId) : null; + + let result = await placeholderModel.getPlaceholders(placeholderParams); + + let response = status.getStatus('success') as APIResponse; + response.data = {}; + response.data.placeholders = result; + + return response; +}; + +const getPlaceholder = async (params: GetPlaceholderOperation): Promise => { + if (!params.placeholderId) { + throw new Error('input_missing'); + } + + let placeholderParams: any = {}; + placeholderParams.placeholderId = params.placeholderId; + + let result = await placeholderModel.getPlaceholder(placeholderParams); + + let response = status.getStatus('success') as APIResponse; + response.data = {}; + response.data.placeholder = result; + + return response; +}; + +const updatePlaceholder = async (params: UpdatePlaceholderOperation): Promise => { + if (!params.placeholderId || !params.param1) { + throw new Error('input_missing'); + } + + let placeholderParams: any = {}; + placeholderParams.placeholderId = params.placeholderId; + placeholderParams.param1 = params.param1; + + await placeholderModel.updatePlaceholder(placeholderParams); + + placeholderParams = {}; + placeholderParams.param1 = params.param1; + + let result = await placeholderModel.getPlaceholder(placeholderParams); + + let response = status.getStatus('success') as APIResponse; + response.data = {}; + response.data.placeholder = result; + + return response; +}; + +export default { + createPlaceholder: wrapperService.wrap(createPlaceholder), + getPlaceholders: wrapperService.wrap(getPlaceholders), + getPlaceholder: wrapperService.wrap(getPlaceholder), + updatePlaceholder: wrapperService.wrap(updatePlaceholder) +} \ No newline at end of file diff --git a/app/services/utils.js b/src/app/services/utils.ts similarity index 66% rename from app/services/utils.js rename to src/app/services/utils.ts index 6f53a43..3772ea2 100644 --- a/app/services/utils.js +++ b/src/app/services/utils.ts @@ -1,18 +1,16 @@ -'use strict'; +import https from 'https' +import config from "app/configs/config"; +import { JSONValue } from 'types'; -const https = require('https'); - -const config = require('app/configs/config'); - -const sanitizeSqlResult = (result) => { +const sanitizeSqlResult = (result: T): JSONValue => { return JSON.parse(JSON.stringify(result)); }; -const addDays = (date, numberOfDays) => { +const addDays = (date: Date, numberOfDays: number) => { return new Date(date.setDate(date.getDate() + numberOfDays)); }; -const createHierarchy = (input) => { +const createHierarchy = (input: [any]) => { for (let i = input.length - 1; i >= 0; i--) { if (input[i].parent_id) { let _index = input.indexOf(input.filter((inp) => inp.id === input[i].parent_id)[0]); @@ -29,11 +27,11 @@ const createHierarchy = (input) => { return input; }; -const sortByDesc = (key) => { - return (array1, array2) => (array1[key] < array2[key] ? 1 : array2[key] < array1[key] ? -1 : 0); +const sortByDesc = (key: keyof T) => { + return (array1: T, array2: T) => (array1[key] < array2[key] ? 1 : array2[key] < array1[key] ? -1 : 0); }; -const prepareFetchOptions = (options) => { +const prepareFetchOptions = (options: any) => { if (options.method.toUpperCase() === 'GET') { delete options.body; options.qs && Object.keys(options.qs).length ? (options.url += '?' + new URLSearchParams(options.qs)) : null; @@ -43,15 +41,15 @@ const prepareFetchOptions = (options) => { options.headers ? (options.headers['Content-Type'] = 'application/json') : null; options.body ? (options.body = JSON.stringify(options.body)) : null; - config.IPV6 ? (options.agent = new https.Agent({family: 6})) : null; + config.IPV6 ? (options.agent = new https.Agent({ family: 6 })) : null; return options; }; -module.exports = { +export default { sanitizeSqlResult: sanitizeSqlResult, addDays: addDays, createHierarchy: createHierarchy, sortByDesc: sortByDesc, prepareFetchOptions: prepareFetchOptions -}; +} \ No newline at end of file diff --git a/src/app/services/wrapper.ts b/src/app/services/wrapper.ts new file mode 100644 index 0000000..2756b5f --- /dev/null +++ b/src/app/services/wrapper.ts @@ -0,0 +1,31 @@ +import status from 'app/configs/status'; + +type wrappedFunction any> = T & { + lastArgs?: Parameters; +}; + +function wrap any>(fn: T): wrappedFunction { + return async function (...args: Parameters) { + try { + return await fn(...args) + } catch (e: any) { + let cb + if (args.length !== 1) { + cb = args[args.length - 1]; + } + if (`${process.env.NODE_ENV}` !== 'production') { + console.log(e) + } + if (e.hasOwnProperty('message')) { + console.log(new Date().toISOString(), status.getStatus(e.message)); + return cb ? cb(status.getStatus(e.message)) : status.getStatus(e.message); + } else { + return cb ? cb(status.getStatus('generic_fail')) : status.getStatus('generic_fail'); + } + } + } as wrappedFunction +} + +export default { + wrap: wrap +} \ No newline at end of file diff --git a/server.js b/src/server.ts similarity index 72% rename from server.js rename to src/server.ts index ff795bd..3e7c37e 100644 --- a/server.js +++ b/src/server.ts @@ -1,31 +1,29 @@ -'use strict'; // Include core libraries -const express = require('express'); -const bodyParser = require('body-parser'); -const fs = require('fs'); -const compression = require('compression'); +import express from 'express'; +import bodyParser from 'body-parser'; +import compression from 'compression'; -!fs.existsSync(`${__dirname}/node_modules/app`) ? fs.symlinkSync(`${__dirname}/app`, `${__dirname}/node_modules/app`) : null; -const healthchecks = require('app/services/healthchecks'); +import authsMiddleware from 'app/middlewares/auths'; +import healthchecks from 'app/services/healthchecks'; -const app = express(); // Include config files -const config = require('app/configs/config'); -const status = require('app/configs/status'); -const loggerConfig = require('app/configs/logger'); +import config from 'app/configs/config'; +import status from 'app/configs/status'; +import loggerConfig from 'app/configs/logger'; + +const app = express(); const isDeveloping = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test'; app.disable('x-powered-by'); // Include middleware -const authsMiddleware = require('app/middlewares/auths'); // Include routers -const healthchecksRouter = require('app/routes/healthchecks'); -const placeholderRouter = require('app/routes/placeholder'); +import healthchecksRouter from 'app/routes/healthchecks'; +import placeholderRouter from 'app/routes/placeholder'; // Use JSON body parser app.use(compression()); @@ -54,11 +52,11 @@ const dbSelfCheck = async () => { console.log('MySQL connection error', e); } }; -dbSelfCheck(); +// dbSelfCheck(); // Set allowed headers // eslint-disable-next-line no-unused-vars -app.use((req, res, next) => { +app.use((req: any, res: any, next: any) => { res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,Content-Type,Authorization,User-Agent,X-Auth,X-Version'); @@ -72,7 +70,7 @@ app.use((req, res, next) => { // Healthcheck routes healthchecks.init(); app.use('/healthchecks', healthchecksRouter); -app.get('/ping', (req, res) => { +app.get('/ping', (req: any, res: any) => { res.send('pong'); }); @@ -92,14 +90,14 @@ app.use('/placeholder', placeholderRouter); // Catch 404s // eslint-disable-next-line no-unused-vars -app.use((req, res, next) => { +app.use((req: any, res: any, next: any) => { res.statusCode = 404; res.json(status.getStatus('url_missing')); }); // Global error handler // eslint-disable-next-line no-unused-vars -app.use((err, req, res, next) => { +app.use((err: any, req: any, res: any, next: any) => { if (err) { console.log(new Date().toISOString(), err); } diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..cf801d3 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,145 @@ +import { Knex } from 'knex'; +import { type Request, type Response, type NextFunction, request } from 'express'; + +export type JSONValue = + | string + | number + | boolean + | null + | { [x: string]: JSONValue } + | JSONValue[] + | T + +export type Controller = (req: Request, res: Response>) => any; + + +export type Middleware = (req: Request, res: Response, next: NextFunction) => any; + + +export interface CommonConfig { + SERVER_IP: string; + SERVER_PORT: number; + IPV6?: boolean; +} + +export interface EnviornmentConfig { + knex: Knex; + MORGAN_LOG_PATH: string; + HEALTHCHECKS: HealthChecksConfig; +} + +export type KnexConfig = { client: 'mysql', connection: MysqlConnectionString }; + +export type MysqlConnectionString = { + host: string; + user: string; + password: string; + database: string; + port: number; +} + +export type HealthChecksConfig = { + DEPLOY_BASE_URL: string; + URL: string; +} + +export interface Config extends CommonConfig, EnviornmentConfig { }; + +export type getStatusFn = (code: string) => Status; + +export type Status = { + code: string; + error: boolean; + message: string; +} + +export interface APIResponse extends Status { + data?: T; +} + +/** + * Entity Types + */ + +export type Placeholder = { + id: number; + param1: string; + active: boolean; + created_at: Date; + updated_at: Date; + deleted_at: Date; +} + + + + +/** + * Operation + */ + +export type CreatePlaceholderOperation = { + param1: string; +} + +export type GetPlaceholdersOperation = { + placeholderId?: number; +} + +export type GetPlaceholderOperation = { + placeholderId: number; +} + +export type UpdatePlaceholderOperation = { + placeholderId: number; + param1: string; +} + + +/** + * Controller + */ + + +export interface CreatePlaceholderRequest extends Request { + body: { + param1: string; + } +} + +export interface CreatePlaceholderResponse { + placeholder: Placeholder; +} + + +export interface GetPlaceholdersRequest extends Request { + body: { + placeholder_id?: number; + } +} + +export interface GetPlaceholersResponse { + placeholder: Placeholder[]; +} + +export interface GetPlaceholderRequest extends Request { + params: { + placeholder_id: number; + } +} + +export interface GetPlaceholderResponse { + placeholder: Placeholder; +} + +export interface UpdatePlaceholderRequest extends Request { + body: { + param1?: string; + placeholder_id?: number; + } +} + +export interface UpdatePlaceholderResponse { + placeholder: Placeholder; +} + + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..831b97d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "outDir": "./dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "checkJs": false, + "declaration": true, + "rootDir": "src", + "moduleResolution": "node", + "resolveJsonModule": true, + "baseUrl": ".", + "paths": { + "app/*": ["src/app/*"], + "types": ["src/types.ts"] + }, + "preserveSymlinks": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +}