diff --git a/package-lock.json b/package-lock.json index 66ac18a3..da3ad89b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "yup": "^0.32.11" }, "devDependencies": { + "@types/express": "^4.17.13", "@types/jest": "^28.1.1", "@types/jquery": "^3.5.14", "@types/lodash": "^4.14.182", @@ -53,6 +54,7 @@ "nodemon": "^2.0.16", "prettier": "^2.0.0", "ts-jest": "^28.0.2", + "ts-node": "^10.8.1", "typescript": "^4.6.4", "vite": "^2.9.9" } @@ -662,6 +664,28 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "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, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/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, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -1243,6 +1267,30 @@ "node": ">= 10" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "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 + }, + "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 + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -1284,6 +1332,48 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -1365,6 +1455,12 @@ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "node_modules/@types/node": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", @@ -1389,6 +1485,18 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", "dev": true }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, "node_modules/@types/react": { "version": "18.0.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.14.tgz", @@ -1415,6 +1523,16 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -1814,6 +1932,12 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2677,6 +2801,12 @@ "object-assign": "^4.1.1" } }, + "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 + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2903,6 +3033,15 @@ "node": ">=8" } }, + "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, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", @@ -8339,6 +8478,58 @@ } } }, + "node_modules/ts-node": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", + "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", + "dev": true, + "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/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -8601,6 +8792,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "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 + }, "node_modules/v8-to-istanbul": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", @@ -8937,6 +9134,15 @@ "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, + "engines": { + "node": ">=6" + } + }, "node_modules/yup": { "version": "0.32.11", "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", @@ -9424,6 +9630,27 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@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, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@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, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -9883,6 +10110,30 @@ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@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 + }, + "@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 + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, "@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -9924,6 +10175,48 @@ "@babel/types": "^7.3.0" } }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -10005,6 +10298,12 @@ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "@types/node": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", @@ -10029,6 +10328,18 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", "dev": true }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, "@types/react": { "version": "18.0.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.14.tgz", @@ -10055,6 +10366,16 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -10318,6 +10639,12 @@ "picomatch": "^2.0.4" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -10975,6 +11302,12 @@ "object-assign": "^4.1.1" } }, + "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 + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -11147,6 +11480,12 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", @@ -15113,6 +15452,35 @@ "yargs-parser": "^21.0.1" } }, + "ts-node": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", + "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + } + } + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -15313,6 +15681,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "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 + }, "v8-to-istanbul": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", @@ -15548,6 +15922,12 @@ "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "yup": { "version": "0.32.11", "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", diff --git a/package.json b/package.json index 4fac9d89..aadfce5a 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "scripts": { "lint": "eslint . --ext .ts,.tsx", - "format": "prettier --write app/**/*.ts app/**/*.tsx app/yui/**/*.js app/components/**/*.jsx stubs/**/*.js", + "format": "prettier --write app/**/*.ts app/**/*.tsx app/yui/**/*.js app/components/**/*.jsx stubs/**/*.ts", "compile": "tsc --noEmit", "dev": "concurrently \"npm run serve:app\" \"npm run serve:stubs\" \"npm run serve:assets\"", "test": "npm run compile && jest", @@ -28,7 +28,7 @@ "test:coverage": "jest --coverage", "build": "vite build && ln -s ../Lacuna-Assets ./dist/Lacuna-Assets", "serve:app": "vite", - "serve:stubs": "nodemon --exec \"node stubs/server.js\" --watch stubs", + "serve:stubs": "nodemon --config stubs/nodemon.json", "serve:assets": "http-server ./Lacuna-Assets --cors --port 3002", "prepare": "husky install" }, @@ -55,6 +55,7 @@ "yup": "^0.32.11" }, "devDependencies": { + "@types/express": "^4.17.13", "@types/jest": "^28.1.1", "@types/jquery": "^3.5.14", "@types/lodash": "^4.14.182", @@ -76,6 +77,7 @@ "nodemon": "^2.0.16", "prettier": "^2.0.0", "ts-jest": "^28.0.2", + "ts-node": "^10.8.1", "typescript": "^4.6.4", "vite": "^2.9.9" } diff --git a/stubs/nodemon.json b/stubs/nodemon.json new file mode 100644 index 00000000..099242a6 --- /dev/null +++ b/stubs/nodemon.json @@ -0,0 +1,6 @@ +{ + "exec": "node --loader ts-node/esm stubs/server.ts", + "ext": "js,mjs,json,ts", + "verbose": true, + "watch": "stubs" +} diff --git a/stubs/server.ts b/stubs/server.ts new file mode 100644 index 00000000..ab219881 --- /dev/null +++ b/stubs/server.ts @@ -0,0 +1,77 @@ +import express from 'express'; +import _ from 'lodash'; +import { fileURLToPath } from 'url'; +import { dirname } from 'path'; +import Routes from './src/routes.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = `${__dirname}/public`; + +const app = express(); +const port = 3001; + +// +// Middleware to enable CORS +// +app.use((req, res, next) => { + res.setHeader('Access-Control-Allow-Origin', req.get('origin') || ''); + res.setHeader('Access-Control-Allow-Headers', 'content-type,x-requested-with'); + next(); +}); + +app.use(express.json()); + +app.get('/', (req, res) => { + res.send('Hello World'); +}); + +app.get('/announcement', (req, res) => { + res.sendFile('announcement.html', { root }); +}); + +app.get('/captcha.png', (req, res) => { + res.sendFile('captcha.png', { root }); +}); + +app.get('/email_attachment.png', (req, res) => { + res.sendFile('email_attachment.png', { root }); +}); + +app.get('/server_overviewon', (req, res) => { + res.sendFile('server_overviewon', { root }); +}); + +app.post('/:module', (req, res) => { + const { module } = req.params; + const method = req.body?.method || ''; + const params = req.body?.params || ''; + + console.log(`${_.capitalize(module)}#${method} was called`, params); + + const result = Routes[module]?.[method]?.(req, res); + + if (result) { + return res.json({ + jsonrpc: '2.0', + id: 1, + result, + }); + } + + const message = + !!module && !!method + ? `Call to stubbed endpoint ${_.capitalize(module)}#${method} not implemented yet.` + : 'Invalid request.'; + + console.error(message); + + return res.status(500).json({ + jsonrpc: '2.0', + id: 1, + error: { message, data: null }, + }); +}); + +app.listen(port, () => { + console.log(`KA Stub Server listening on port ${port}`); +}); diff --git a/stubs/src/captcha.js b/stubs/src/captcha.js deleted file mode 100644 index 632815a1..00000000 --- a/stubs/src/captcha.js +++ /dev/null @@ -1,14 +0,0 @@ -const Captcha = { - fetch(req, res) { - return { - guid: '123456789', - url: `${req.protocol}://${req.get('host')}/captcha.png`, - }; - }, - - solve() { - return 1; - }, -}; - -export default Captcha; diff --git a/stubs/src/constants.js b/stubs/src/constants.ts similarity index 97% rename from stubs/src/constants.js rename to stubs/src/constants.ts index 0416c838..e6767605 100644 --- a/stubs/src/constants.js +++ b/stubs/src/constants.ts @@ -1,6 +1,6 @@ export const DATE_FORMAT = 'YYYY MM DD HH:mm:ss ZZ'; -export const BUILDING_TYPES = { +export const BUILDING_TYPES: { [index: string]: string } = { 'energy-reserve': 'Energy Reserve', 'food-reserve': 'Food Reserve', 'gas-giant-lab': 'Gas Giant Lab', @@ -145,7 +145,7 @@ export const BUILDING_TYPES = { wheat: 'Wheat Farm', }; -export const SHIP_TYPES = { +export const SHIP_TYPES: { [index: string]: string } = { barge: 'Barge', bleeder: 'Bleeder', cargo_ship: 'Cargo Ship', diff --git a/stubs/src/interfaces.ts b/stubs/src/interfaces.ts new file mode 100644 index 00000000..26ffce25 --- /dev/null +++ b/stubs/src/interfaces.ts @@ -0,0 +1,9 @@ +import { Request, Response } from 'express'; + +export interface Route { + [index: string]: (req: Request, res: Response) => any; +} + +export interface RouteMapping { + [index: string]: Route; +} diff --git a/stubs/src/body.js b/stubs/src/modules/body.ts similarity index 98% rename from stubs/src/body.js rename to stubs/src/modules/body.ts index 772690a7..b80fe3d8 100644 --- a/stubs/src/body.js +++ b/stubs/src/modules/body.ts @@ -2,12 +2,13 @@ import moment from 'moment'; import _ from 'lodash'; import Server from './server.js'; import Empire from './empire.js'; -import { DATE_FORMAT, BUILDING_TYPES } from './constants.js'; +import { DATE_FORMAT, BUILDING_TYPES } from './../constants.js'; +import { Route } from './../interfaces.js'; -const Body = { - get_buildings() { +const Body: Route = { + get_buildings(req, res) { return { - status: Body.get_status(), + status: this.get_status(req, res), body: { surface_image: 'surface-p35', }, @@ -1130,8 +1131,8 @@ const Body = { }; }, - get_buildable() { - const buildable = {}; + get_buildable(req, res) { + const buildable: any = {}; _.each(BUILDING_TYPES, (name, type) => { buildable[name] = { @@ -1169,29 +1170,29 @@ const Body = { max: 4, current: 3, }, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - get_status() { + get_status(req, res) { return { - server: Server.status_block(), - empire: Empire.status_block(), - body: Body.status_block(), + server: Server.status_block(req, res), + empire: Empire.status_block(req, res), + body: Body.status_block(req, res), }; }, - rearrange_buildings() { + rearrange_buildings(req, res) { return { moved: [], body: { surface_image: 'surface-p35', }, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - status_block() { + status_block(req, res) { return { id: 'id-goes-here', x: -40, diff --git a/stubs/src/buildings.js b/stubs/src/modules/buildings.ts similarity index 93% rename from stubs/src/buildings.js rename to stubs/src/modules/buildings.ts index 5c72c2bb..b1c48bbb 100644 --- a/stubs/src/buildings.js +++ b/stubs/src/modules/buildings.ts @@ -1,7 +1,8 @@ import Body from './body.js'; +import { Route } from './../interfaces.js'; -const Buildings = { - view() { +const Buildings: Route = { + view(req, res) { return { building: { id: 'id-goes-here', @@ -70,7 +71,7 @@ const Buildings = { image: 'command7', }, }, - status: Body.get_status(), + status: Body.get_status(req, res), }; }, }; diff --git a/stubs/src/modules/captcha.ts b/stubs/src/modules/captcha.ts new file mode 100644 index 00000000..a14fda0d --- /dev/null +++ b/stubs/src/modules/captcha.ts @@ -0,0 +1,17 @@ +import { Request, Response } from 'express'; +import { Route } from '../interfaces.js'; + +const Captcha: Route = { + fetch(req: Request, res: Response) { + return { + guid: '123456789', + url: `${req.protocol}://${req.get('host')}/captcha.png`, + }; + }, + + solve(req, res) { + return 1; + }, +}; + +export default Captcha; diff --git a/stubs/src/development.js b/stubs/src/modules/development.ts similarity index 76% rename from stubs/src/development.js rename to stubs/src/modules/development.ts index adf654f3..54fed4d7 100644 --- a/stubs/src/development.js +++ b/stubs/src/modules/development.ts @@ -1,7 +1,8 @@ import GenericBuilding from './genericBuilding.js'; import Empire from './empire.js'; +import { Route } from '../interfaces.js'; -const Development = { +const Development: Route = { view(req, res) { const response = GenericBuilding.view(req, res); @@ -30,12 +31,12 @@ const Development = { return response; }, - subsidize_build_queue() { - return { essentia_spent: 10, status: Empire.get_status() }; + subsidize_build_queue(req, res) { + return { essentia_spent: 10, status: Empire.get_status(req, res) }; }, - subsidize_one_build() { - return { essentia_spent: 10, status: Empire.get_status() }; + subsidize_one_build(req, res) { + return { essentia_spent: 10, status: Empire.get_status(req, res) }; }, cancel_build(req, res) { diff --git a/stubs/src/empire.js b/stubs/src/modules/empire.ts similarity index 80% rename from stubs/src/empire.js rename to stubs/src/modules/empire.ts index d8c950c2..f7368d27 100644 --- a/stubs/src/empire.js +++ b/stubs/src/modules/empire.ts @@ -1,39 +1,40 @@ import moment from 'moment'; import Server from './server.js'; import Captcha from './captcha.js'; -import { DATE_FORMAT } from './constants.js'; +import { DATE_FORMAT } from './../constants.js'; +import { Route } from '../interfaces.js'; -const Empire = { - create() { +const Empire: Route = { + create(req, res) { return { empire_id: 1, }; }, - update_species() { + update_species(req, res) { return { update_species: 1, }; }, - redefined_species() { + redefined_species(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - found() { + found(req, res) { return { session_id: 'this-is-a-session-id', welcome_message_id: 5, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - get_status() { + get_status(req, res) { return { - empire: this.status_block(), - server: Server.status_block(), + empire: this.status_block(req, res), + server: Server.status_block(req, res), }; }, @@ -41,20 +42,20 @@ const Empire = { return Captcha.fetch(req, res); }, - login() { + login(req, res) { return { session_id: 'this-is-a-session-id', - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - logout() { + logout(req, res) { return { logout: 1, }; }, - status_block() { + status_block(req, res) { const colonies = []; for (let i = 1; i <= 40; i++) { @@ -149,18 +150,18 @@ const Empire = { }; }, - get_invite_friend_url() { + get_invite_friend_url(req, res) { return { referral_url: 'https://demo.kenoantigen.com/', - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - view_profile() { - return this.get_own_profile(); + view_profile(req, res) { + return this.get_own_profile(req, res); }, - get_own_profile() { + get_own_profile(req, res) { return { profile: { id: 1234, @@ -205,23 +206,23 @@ const Empire = { email: 'hello@example.com', sitter_password: '', }, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - invite_friend() { + invite_friend(req, res) { return { sent: [], not_sent: [], - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - view_boosts() { - return this.get_boosts(); + view_boosts(req, res) { + return this.get_boosts(req, res); }, - get_boosts() { + get_boosts(req, res) { return { boosts: { food: moment().add(1, 'week').format(DATE_FORMAT), @@ -235,22 +236,22 @@ const Empire = { ship_speed: moment().subtract(2, 'days').format(DATE_FORMAT), spy_training: moment().subtract(2, 'days').format(DATE_FORMAT), }, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - edit_profile() { - return Empire.get_own_profile(); + edit_profile(req, res) { + return Empire.get_own_profile(req, res); }, - send_password_reset_message() { + send_password_reset_message(req, res) { return { sent: 1, }; }, - reset_password() { - return Empire.login(); + reset_password(req, res) { + return Empire.login(req, res); }, }; diff --git a/stubs/src/energyReserve.js b/stubs/src/modules/energyReserve.ts similarity index 55% rename from stubs/src/energyReserve.js rename to stubs/src/modules/energyReserve.ts index 6efa4a3a..e483de7f 100644 --- a/stubs/src/energyReserve.js +++ b/stubs/src/modules/energyReserve.ts @@ -1,12 +1,13 @@ import Empire from './empire.js'; import GenericBuilding from './genericBuilding.js'; +import { Route } from '../interfaces.js'; -const EnergyReserve = { +const EnergyReserve: Route = { ...GenericBuilding, - dump() { + dump(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, }; diff --git a/stubs/src/essentiaVein.js b/stubs/src/modules/essentiaVein.ts similarity index 80% rename from stubs/src/essentiaVein.js rename to stubs/src/modules/essentiaVein.ts index 047916ad..9fa5c882 100644 --- a/stubs/src/essentiaVein.js +++ b/stubs/src/modules/essentiaVein.ts @@ -1,6 +1,7 @@ import GenericBuilding from './genericBuilding.js'; +import { Route } from '../interfaces.js'; -const EssentiaVein = { +const EssentiaVein: Route = { view(req, res) { const response = GenericBuilding.view(req, res); response.building.drain_capable = 3; diff --git a/stubs/src/foodReserve.js b/stubs/src/modules/foodReserve.ts similarity index 83% rename from stubs/src/foodReserve.js rename to stubs/src/modules/foodReserve.ts index 6f1f91a3..a74db073 100644 --- a/stubs/src/foodReserve.js +++ b/stubs/src/modules/foodReserve.ts @@ -1,7 +1,8 @@ import GenericBuilding from './genericBuilding.js'; import Empire from './empire.js'; +import { Route } from '../interfaces.js'; -const FoodReserve = { +const FoodReserve: Route = { view(req, res) { const response = GenericBuilding.view(req, res); response.food_stored = { @@ -31,9 +32,9 @@ const FoodReserve = { return response; }, - dump() { + dump(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, }; diff --git a/stubs/src/genericBuilding.js b/stubs/src/modules/genericBuilding.ts similarity index 63% rename from stubs/src/genericBuilding.js rename to stubs/src/modules/genericBuilding.ts index c656fa5b..85a19b77 100644 --- a/stubs/src/genericBuilding.js +++ b/stubs/src/modules/genericBuilding.ts @@ -1,12 +1,12 @@ import Buildings from './buildings.js'; import Body from './body.js'; +import { Route } from '../interfaces.js'; -const { buildings } = Body.get_buildings(); - -const GenericBuilding = { +const GenericBuilding: Route = { view(req, res) { - const response = Buildings.view(); + const response = Buildings.view(req, res); const id = req.body.params[1]; + const { buildings } = Body.get_buildings(req, res); const b = buildings[id]; if (b) { diff --git a/stubs/src/inbox.js b/stubs/src/modules/inbox.ts similarity index 80% rename from stubs/src/inbox.js rename to stubs/src/modules/inbox.ts index b2cb31f4..e5fdc50c 100644 --- a/stubs/src/inbox.js +++ b/stubs/src/modules/inbox.ts @@ -1,8 +1,9 @@ import _ from 'lodash'; import Empire from './empire.js'; import Body from './body.js'; +import { Route } from '../interfaces.js'; -const Inbox = { +const Inbox: Route = { read_message(req, res) { return { message: { @@ -37,23 +38,23 @@ const Inbox = { ], map: { surface: 'surface-p6', - buildings: _.values(Body.get_buildings().buildings), + buildings: _.values(Body.get_buildings(req, res).buildings), }, }, }, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - view_archived() { + view_archived(req, res) { return { messages: [], message_count: 0, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - view_inbox() { + view_inbox(req, res) { return { messages: [ { @@ -71,31 +72,31 @@ const Inbox = { }, ], message_count: 4, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - view_sent() { + view_sent(req, res) { return { messages: [], message_count: 0, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - view_trashed() { + view_trashed(req, res) { return { messages: [], message_count: 0, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - view_unread() { + view_unread(req, res) { return { messages: [], message_count: 0, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, }; diff --git a/stubs/src/intelTraining.js b/stubs/src/modules/intelTraining.ts similarity index 80% rename from stubs/src/intelTraining.js rename to stubs/src/modules/intelTraining.ts index a5e6afa6..74ddf22d 100644 --- a/stubs/src/intelTraining.js +++ b/stubs/src/modules/intelTraining.ts @@ -1,6 +1,7 @@ import GenericBuilding from './genericBuilding.js'; +import { Route } from '../interfaces.js'; -const IntelTraining = { +const IntelTraining: Route = { view(req, res) { const response = GenericBuilding.view(req, res); response.building.spies = { diff --git a/stubs/src/intelligence.js b/stubs/src/modules/intelligence.ts similarity index 86% rename from stubs/src/intelligence.js rename to stubs/src/modules/intelligence.ts index a7fba4e2..fd740033 100644 --- a/stubs/src/intelligence.js +++ b/stubs/src/modules/intelligence.ts @@ -1,7 +1,8 @@ import GenericBuilding from './genericBuilding.js'; import Empire from './empire.js'; +import { Route } from '../interfaces.js'; -const Intelligence = { +const Intelligence: Route = { view(req, res) { const response = GenericBuilding.view(req, res); response.spies = { @@ -20,14 +21,14 @@ const Intelligence = { return response; }, - train_spy() { + train_spy(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), trained: 3, }; }, - view_spies() { + view_spies(req, res) { const spies = []; for (let i = 1; i <= 12; i++) { @@ -85,33 +86,33 @@ const Intelligence = { return { spies, spy_count: 12, - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - view_all_spies() { - return this.view_spies(); + view_all_spies(req, res) { + return this.view_spies(req, res); }, - burn_spy() { + burn_spy(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - name_spy() { + name_spy(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, - name_spies() { - return this.view_all_spies(); + name_spies(req, res) { + return this.view_all_spies(req, res); }, - assign_spy() { + assign_spy(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), mission: { result: 'Failure', message_id: 'id-goes-here', diff --git a/stubs/src/map.js b/stubs/src/modules/map.ts similarity index 90% rename from stubs/src/map.js rename to stubs/src/modules/map.ts index 6872a7b7..984a4afb 100644 --- a/stubs/src/map.js +++ b/stubs/src/modules/map.ts @@ -1,5 +1,7 @@ -const Map = { - get_star_map() { +import { Route } from '../interfaces.js'; + +const Map: Route = { + get_star_map(req, res) { return { stars: [ { diff --git a/stubs/src/mayhemTraining.js b/stubs/src/modules/mayhemTraining.ts similarity index 79% rename from stubs/src/mayhemTraining.js rename to stubs/src/modules/mayhemTraining.ts index a1d61f8d..ffa3045b 100644 --- a/stubs/src/mayhemTraining.js +++ b/stubs/src/modules/mayhemTraining.ts @@ -1,6 +1,7 @@ import GenericBuilding from './genericBuilding.js'; +import { Route } from '../interfaces.js'; -const MayhemTraining = { +const MayhemTraining: Route = { view(req, res) { const response = GenericBuilding.view(req, res); response.building.spies = { diff --git a/stubs/src/oreStorage.js b/stubs/src/modules/oreStorage.ts similarity index 84% rename from stubs/src/oreStorage.js rename to stubs/src/modules/oreStorage.ts index 1c2d424d..249dbb9a 100644 --- a/stubs/src/oreStorage.js +++ b/stubs/src/modules/oreStorage.ts @@ -1,7 +1,8 @@ import GenericBuilding from './genericBuilding.js'; import Empire from './empire.js'; +import { Route } from '../interfaces.js'; -const OreStorage = { +const OreStorage: Route = { view(req, res) { const response = GenericBuilding.view(req, res); response.ore_stored = { @@ -29,9 +30,9 @@ const OreStorage = { return response; }, - dump() { + dump(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, }; diff --git a/stubs/src/politicsTraining.js b/stubs/src/modules/politicsTraining.ts similarity index 79% rename from stubs/src/politicsTraining.js rename to stubs/src/modules/politicsTraining.ts index e23792da..b38adb37 100644 --- a/stubs/src/politicsTraining.js +++ b/stubs/src/modules/politicsTraining.ts @@ -1,6 +1,7 @@ import GenericBuilding from './genericBuilding.js'; +import { Route } from '../interfaces.js'; -const PoliticsTraining = { +const PoliticsTraining: Route = { view(req, res) { const response = GenericBuilding.view(req, res); response.building.spies = { diff --git a/stubs/src/server.js b/stubs/src/modules/server.ts similarity index 56% rename from stubs/src/server.js rename to stubs/src/modules/server.ts index 29bef4c4..25b3d73d 100644 --- a/stubs/src/server.js +++ b/stubs/src/modules/server.ts @@ -1,12 +1,13 @@ import moment from 'moment'; -import { DATE_FORMAT } from './constants.js'; +import { Route } from '../interfaces.js'; +import { DATE_FORMAT } from './../constants.js'; -const Server = { - get_status() { - return Server.status_block(); +const Server: Route = { + get_status(req, res) { + return Server.status_block(req, res); }, - status_block() { + status_block(req, res) { return { time: moment().format(DATE_FORMAT), version: '1.0', diff --git a/stubs/src/shipyard.js b/stubs/src/modules/shipyard.ts similarity index 83% rename from stubs/src/shipyard.js rename to stubs/src/modules/shipyard.ts index 30f5e633..63e52108 100644 --- a/stubs/src/shipyard.js +++ b/stubs/src/modules/shipyard.ts @@ -1,16 +1,17 @@ import Empire from './empire.js'; import GenericBuilding from './genericBuilding.js'; import moment from 'moment'; -import { DATE_FORMAT, SHIP_TYPES } from './constants.js'; +import { DATE_FORMAT, SHIP_TYPES } from './../constants.js'; +import { Route } from '../interfaces.js'; -const Shipyard = { +const Shipyard: Route = { view(req, res) { return GenericBuilding.view(req, res); }, - view_build_queue() { + view_build_queue(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), number_of_ships: 10, cost_to_subsidize: 30, ships_building: [ @@ -67,26 +68,26 @@ const Shipyard = { }; }, - subsidize_build_queue() { + subsidize_build_queue(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), number_of_ships: 0, cost_to_subsidize: 0, ships_building: [], }; }, - subsidize_ship() { + subsidize_ship(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), number_of_ships: 0, cost_to_subsidize: 0, ships_building: [], }; }, - get_buildable() { - const buildable = {}; + get_buildable(req, res) { + const buildable: any = {}; Object.keys(SHIP_TYPES).forEach((type) => { buildable[type] = { @@ -114,11 +115,11 @@ const Shipyard = { }; }); - return { buildable, docks_available: 200, status: Empire.get_status() }; + return { buildable, docks_available: 200, status: Empire.get_status(req, res) }; }, - build_ships() { - return this.view_build_queue(); + build_ships(req, res) { + return this.view_build_queue(req, res); }, }; diff --git a/stubs/src/spaceStationLab.js b/stubs/src/modules/spaceStationLab.ts similarity index 95% rename from stubs/src/spaceStationLab.js rename to stubs/src/modules/spaceStationLab.ts index 73030937..912428f2 100644 --- a/stubs/src/spaceStationLab.js +++ b/stubs/src/modules/spaceStationLab.ts @@ -1,6 +1,7 @@ +import { Route } from '../interfaces.js'; import GenericBuilding from './genericBuilding.js'; -const SpaceStationLab = { +const SpaceStationLab: Route = { view(req, res) { const level_costs = []; diff --git a/stubs/src/spaceport.js b/stubs/src/modules/spaceport.ts similarity index 62% rename from stubs/src/spaceport.js rename to stubs/src/modules/spaceport.ts index c23ff15b..41abc47f 100644 --- a/stubs/src/spaceport.js +++ b/stubs/src/modules/spaceport.ts @@ -1,9 +1,11 @@ -import _ from 'lodash'; import GenericBuilding from './genericBuilding.js'; import Empire from './empire.js'; +import { Route } from '../interfaces.js'; -const Spaceport = _.merge({}, GenericBuilding, { - get_ships_for() { +const Spaceport: Route = { + ...GenericBuilding, + + get_ships_for(req, res) { return { incoming: [], available: [], @@ -11,9 +13,9 @@ const Spaceport = _.merge({}, GenericBuilding, { orbiting: [], mining_platforms: [], fleet_send_limit: 20, - status: Empire.status_block(), + status: Empire.get_status(req, res), }; }, -}); +}; export default Spaceport; diff --git a/stubs/src/stats.js b/stubs/src/modules/stats.ts similarity index 92% rename from stubs/src/stats.js rename to stubs/src/modules/stats.ts index 3e962446..f09cea27 100644 --- a/stubs/src/stats.js +++ b/stubs/src/modules/stats.ts @@ -1,9 +1,10 @@ import Empire from './empire.js'; +import { Route } from '../interfaces.js'; -const Stats = { - alliance_rank() { +const Stats: Route = { + alliance_rank(req, res) { return { - status: Empire.status_block(), + status: Empire.get_status(req, res), alliances: [ { alliance_id: 'id-goes-here', // unique id @@ -26,9 +27,9 @@ const Stats = { }; }, - colony_rank() { + colony_rank(req, res) { return { - status: Empire.status_block(), + status: Empire.get_status(req, res), colonies: [ { empire_id: 'id-goes-here', // unique id @@ -44,7 +45,7 @@ const Stats = { }; }, - credits() { + credits(req, res) { return [ { 'Game Design': ['JT Smith', 'Jamie Vrbsky'] }, { @@ -127,9 +128,9 @@ const Stats = { ]; }, - empire_rank() { + empire_rank(req, res) { return { - status: Empire.status_block(), + status: Empire.get_status(req, res), empires: [ { empire_id: 'id-goes-here', // unique id @@ -151,9 +152,9 @@ const Stats = { }; }, - spy_rank() { + spy_rank(req, res) { return { - status: Empire.status_block(), + status: Empire.get_status(req, res), spies: [ { empire_id: 'id-goes-here', // unique id @@ -169,9 +170,9 @@ const Stats = { }; }, - weekly_medal_winners() { + weekly_medal_winners(req, res) { return { - status: Empire.status_block(), + status: Empire.get_status(req, res), winners: [ { empire_id: 'id-goes-here', diff --git a/stubs/src/theftTraining.js b/stubs/src/modules/theftTraining.ts similarity index 80% rename from stubs/src/theftTraining.js rename to stubs/src/modules/theftTraining.ts index bf3fdc77..6878efc9 100644 --- a/stubs/src/theftTraining.js +++ b/stubs/src/modules/theftTraining.ts @@ -1,6 +1,7 @@ import GenericBuilding from './genericBuilding.js'; +import { Route } from '../interfaces.js'; -const TheftTraining = { +const TheftTraining: Route = { view(req, res) { const response = GenericBuilding.view(req, res); response.building.spies = { diff --git a/stubs/src/waterStorage.js b/stubs/src/modules/waterStorage.ts similarity index 55% rename from stubs/src/waterStorage.js rename to stubs/src/modules/waterStorage.ts index 6cdb28ea..a1394607 100644 --- a/stubs/src/waterStorage.js +++ b/stubs/src/modules/waterStorage.ts @@ -1,12 +1,13 @@ import Empire from './empire.js'; import GenericBuilding from './genericBuilding.js'; +import { Route } from '../interfaces.js'; -const WaterSroage = { +const WaterSroage: Route = { ...GenericBuilding, - dump() { + dump(req, res) { return { - status: Empire.get_status(), + status: Empire.get_status(req, res), }; }, }; diff --git a/stubs/server.js b/stubs/src/routes.ts similarity index 62% rename from stubs/server.js rename to stubs/src/routes.ts index 7700408d..6beded50 100644 --- a/stubs/server.js +++ b/stubs/src/routes.ts @@ -1,36 +1,30 @@ -import express from 'express'; -import _ from 'lodash'; -import { fileURLToPath } from 'url'; -import { dirname } from 'path'; - -import Body from './src/body.js'; -import Buildings from './src/buildings.js'; -import Captcha from './src/captcha.js'; -import Development from './src/development.js'; -import Empire from './src/empire.js'; -import EnergyReserve from './src/energyReserve.js'; -import EssentiaVein from './src/essentiaVein.js'; -import FoodReserve from './src/foodReserve.js'; -import GenericBuilding from './src/genericBuilding.js'; -import Inbox from './src/inbox.js'; -import Intelligence from './src/intelligence.js'; -import IntelTraining from './src/intelTraining.js'; -import Map from './src/map.js'; -import MayhemTraining from './src/mayhemTraining.js'; -import OreStorage from './src/oreStorage.js'; -import PoliticsTraining from './src/politicsTraining.js'; -import Server from './src/server.js'; -import Shipyard from './src/shipyard.js'; -import Spaceport from './src/spaceport.js'; -import Stats from './src/stats.js'; -import TheftTraining from './src/theftTraining.js'; -import WaterStorage from './src/waterStorage.js'; -import SpaceStationLab from './src/spaceStationLab.js'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const root = `${__dirname}/public`; - -const modules = { +import Body from './modules/body.js'; +import Buildings from './modules/buildings.js'; +import Captcha from './modules/captcha.js'; +import Development from './modules/development.js'; +import Empire from './modules/empire.js'; +import EnergyReserve from './modules/energyReserve.js'; +import EssentiaVein from './modules/essentiaVein.js'; +import FoodReserve from './modules/foodReserve.js'; +import GenericBuilding from './modules/genericBuilding.js'; +import Inbox from './modules/inbox.js'; +import Intelligence from './modules/intelligence.js'; +import IntelTraining from './modules/intelTraining.js'; +import Map from './modules/map.js'; +import MayhemTraining from './modules/mayhemTraining.js'; +import OreStorage from './modules/oreStorage.js'; +import PoliticsTraining from './modules/politicsTraining.js'; +import Server from './modules/server.js'; +import Shipyard from './modules/shipyard.js'; +import Spaceport from './modules/spaceport.js'; +import Stats from './modules/stats.js'; +import TheftTraining from './modules/theftTraining.js'; +import WaterStorage from './modules/waterStorage.js'; +import SpaceStationLab from './modules/spaceStationLab.js'; + +import { RouteMapping } from './interfaces.js'; + +const Routes: RouteMapping = { body: Body, buildings: Buildings, captcha: Captcha, @@ -190,71 +184,4 @@ const modules = { wheat: GenericBuilding, }; -const app = express(); -const port = 3001; - -// -// Middleware to enable CORS -// -app.use((req, res, next) => { - res.setHeader('Access-Control-Allow-Origin', req.get('origin') || ''); - res.setHeader('Access-Control-Allow-Headers', 'content-type,x-requested-with'); - next(); -}); - -app.use(express.json()); - -app.get('/', (req, res) => { - res.send('Hello World'); -}); - -app.get('/announcement', (req, res) => { - res.sendFile('announcement.html', { root }); -}); - -app.get('/captcha.png', (req, res) => { - res.sendFile('captcha.png', { root }); -}); - -app.get('/email_attachment.png', (req, res) => { - res.sendFile('email_attachment.png', { root }); -}); - -app.get('/server_overview.json', (req, res) => { - res.sendFile('server_overview.json', { root }); -}); - -app.post('/:module', (req, res) => { - const { module } = req.params; - const method = req.body?.method || ''; - const params = req.body?.params || ''; - - console.log(`${_.capitalize(module)}#${method} was called`, params); - - const result = modules[module]?.[method]?.(req, res); - - if (result) { - return res.json({ - jsonrpc: '2.0', - id: 1, - result, - }); - } - - const message = - !!module && !!method - ? `Call to stubbed endpoint ${_.capitalize(module)}#${method} not implemented yet.` - : 'Invalid request.'; - - console.error(message); - - return res.status(500).json({ - jsonrpc: '2.0', - id: 1, - error: { message, data: null }, - }); -}); - -app.listen(port, () => { - console.log(`KA Stub Server listening on port ${port}`); -}); +export default Routes;