diff --git a/.dockerignore b/.dockerignore index f0fc08d..98d4f0e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,12 +1,21 @@ +.vscode .github buildspecs cdk node_modules scripts test +coverage Dockerfile dev.sh docker-build.sh jest.config.js tsconfig.test.json -example.yml \ No newline at end of file +example.yml +babel.config.json +.eslintrc +eslintrc.test.json +get-runtime-dependencies.sh +jest.config.json +local.sh +staging.sh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 3626452..4399b6b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,6 +29,8 @@ RUN bash ./install-cli-tools.sh RUN if [ ! -z "${DEPENDENCIES}" ]; then npm i $DEPENDENCIES; fi; RUN npm run clean-build RUN rm -rf ./src +RUN rm -rf ./install-cli-tools.sh +RUN npm dedupe RUN npm prune --production diff --git a/install-cli-tools.sh b/install-cli-tools.sh index 5257918..f277eee 100644 --- a/install-cli-tools.sh +++ b/install-cli-tools.sh @@ -21,6 +21,7 @@ if [[ "$ARCH" == "arm" ]]; ./aws/install \ || exit 1; fi +rm awscliv2.zip echo Y | apt-get install dpkg || exit 1 diff --git a/package-lock.json b/package-lock.json index 3837557..073a6c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,12 +13,9 @@ "@aws-sdk/credential-providers": "^3.282.0", "@tinystacks/ops-core": "^0.4.0", "@tinystacks/ops-model": "^0.5.0", - "@types/react": "^18.0.28", "body-parser": "^1.20.1", "cached": "^6.1.0", "cors": "^2.8.5", - "cross-env": "^7.0.3", - "dotenv": "^16.0.3", "express": "^4.18.2", "express-openapi": "^12.1.0", "http-errors": "^2.0.0", @@ -31,7 +28,6 @@ "lodash.isnil": "^4.0.0", "lodash.isobject": "^3.0.2", "lodash.upperfirst": "^4.3.1", - "react": "^18.2.0", "swagger-ui-express": "^4.6.0", "yamljs": "^0.3.0" }, @@ -54,13 +50,16 @@ "@types/lodash.isobject": "^3.0.7", "@types/lodash.upperfirst": "^4.3.7", "@types/node": "^18.11.18", + "@types/react": "^18.2.14", "@types/swagger-ui-express": "^4.1.3", "@types/yamljs": "^0.2.31", "@typescript-eslint/eslint-plugin": "^5.49.0", "@typescript-eslint/parser": "^5.49.0", "babel-jest": "^29.5.0", + "cross-env": "^7.0.3", "dayjs": "^1.11.7", "depcheck": "^1.4.3", + "dotenv": "^16.3.1", "eslint": "^8.32.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-tsdoc": "^0.2.17", @@ -68,6 +67,7 @@ "jest": "^29.4.0", "lodash.clonedeep": "^4.5.0", "lodash.isempty": "^4.4.0", + "react": "^18.2.0", "ts-jest": "^29.0.5", "ts-jest-resolver": "^2.0.0", "typescript": "^4.9.4" @@ -4509,9 +4509,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5856,6 +5856,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.1" }, @@ -5873,6 +5874,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6161,11 +6163,15 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/ee-first": { @@ -7999,7 +8005,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -9727,7 +9734,8 @@ "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", @@ -9963,6 +9971,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -10669,6 +10678,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -10934,6 +10944,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -11369,6 +11380,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -11380,6 +11392,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -12172,6 +12185,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -15885,9 +15899,9 @@ "dev": true }, "@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -16888,6 +16902,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, "requires": { "cross-spawn": "^7.0.1" } @@ -16896,6 +16911,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -17111,9 +17127,10 @@ } }, "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true }, "ee-first": { "version": "1.1.1", @@ -18485,7 +18502,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -19775,7 +19793,8 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "4.1.0", @@ -19971,6 +19990,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } @@ -20529,7 +20549,8 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "path-loader": { "version": "1.0.12", @@ -20709,6 +20730,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, "requires": { "loose-envify": "^1.1.0" } @@ -21027,6 +21049,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -21034,7 +21057,8 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "side-channel": { "version": "1.0.4", @@ -21605,6 +21629,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index 863c90b..622f669 100644 --- a/package.json +++ b/package.json @@ -48,13 +48,16 @@ "@types/lodash.isobject": "^3.0.7", "@types/lodash.upperfirst": "^4.3.7", "@types/node": "^18.11.18", + "@types/react": "^18.2.14", "@types/swagger-ui-express": "^4.1.3", "@types/yamljs": "^0.2.31", "@typescript-eslint/eslint-plugin": "^5.49.0", "@typescript-eslint/parser": "^5.49.0", "babel-jest": "^29.5.0", + "cross-env": "^7.0.3", "dayjs": "^1.11.7", "depcheck": "^1.4.3", + "dotenv": "^16.3.1", "eslint": "^8.32.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-tsdoc": "^0.2.17", @@ -62,6 +65,7 @@ "jest": "^29.4.0", "lodash.clonedeep": "^4.5.0", "lodash.isempty": "^4.4.0", + "react": "^18.2.0", "ts-jest": "^29.0.5", "ts-jest-resolver": "^2.0.0", "typescript": "^4.9.4" @@ -72,12 +76,9 @@ "@aws-sdk/credential-providers": "^3.282.0", "@tinystacks/ops-core": "^0.4.0", "@tinystacks/ops-model": "^0.5.0", - "@types/react": "^18.0.28", "body-parser": "^1.20.1", "cached": "^6.1.0", "cors": "^2.8.5", - "cross-env": "^7.0.3", - "dotenv": "^16.0.3", "express": "^4.18.2", "express-openapi": "^12.1.0", "http-errors": "^2.0.0", @@ -90,7 +91,6 @@ "lodash.isnil": "^4.0.0", "lodash.isobject": "^3.0.2", "lodash.upperfirst": "^4.3.1", - "react": "^18.2.0", "swagger-ui-express": "^4.6.0", "yamljs": "^0.3.0" } diff --git a/src/server.ts b/src/server.ts index f1a21b3..f123178 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,7 +1,7 @@ import express, { Application, Request, Response } from 'express'; import BodyParser from 'body-parser'; import { initialize } from 'express-openapi'; -import yaml from 'yamljs'; +import yaml from 'js-yaml'; import { readFileSync, rmSync } from 'fs'; import path, { resolve } from 'path'; import { resolveRefsAt } from 'json-refs'; @@ -61,12 +61,12 @@ async function startServer () { console.debug('Constructing the swagger docs and open api spec.'); const rootDocLocation = require.resolve('@tinystacks/ops-model/src/index.yml'); console.debug('rootDocLocation: ', rootDocLocation); - const apiDoc = yaml.parse(readFileSync(rootDocLocation, 'utf-8')); + const apiDoc = yaml.load(readFileSync(rootDocLocation, 'utf-8')) as any; const swaggerSpec = await resolveRefsAt(rootDocLocation, { loaderOptions : { processContent: (res: any, callback: any) => { - callback(null, yaml.parse(res.text)); + callback(null, yaml.load(res.text)); } } });