diff --git a/app/controllers/matrix.js b/app/controllers/matrix.ts similarity index 54% rename from app/controllers/matrix.js rename to app/controllers/matrix.ts index 225b061..3d0944b 100644 --- a/app/controllers/matrix.js +++ b/app/controllers/matrix.ts @@ -1,5 +1,11 @@ -const calcDeterminant = (req, res) => { - const matrix = JSON.parse(req.query.matrix) +import { VercelRequest, VercelResponse } from "@vercel/node" + +const calcDeterminant = (req: VercelRequest, res: VercelResponse) => { + let matrix + // string array + if (Array.isArray(req.query.matrix)) + matrix = JSON.parse(req.query.matrix.join()) + else matrix = JSON.parse(req.query.matrix) const rows = matrix.length const cols = matrix[0].length @@ -18,4 +24,6 @@ const calcDeterminant = (req, res) => { } } -module.exports = { calcDeterminant } +export default { + calcDeterminant, +} diff --git a/app/controllers/test.js b/app/controllers/test.js deleted file mode 100644 index aa65941..0000000 --- a/app/controllers/test.js +++ /dev/null @@ -1,5 +0,0 @@ -const test = (req, res) => { - res.send("API call successful") -} - -module.exports = { test } diff --git a/app/controllers/test.ts b/app/controllers/test.ts new file mode 100644 index 0000000..7048dcb --- /dev/null +++ b/app/controllers/test.ts @@ -0,0 +1,9 @@ +import { VercelRequest, VercelResponse } from "@vercel/node" + +const test = (req: VercelRequest, res: VercelResponse) => { + res.send("API call successful") +} + +export default { + test, +} diff --git a/app/tests/index.js b/app/tests/index.ts similarity index 77% rename from app/tests/index.js rename to app/tests/index.ts index 7d832db..b42f2d8 100644 --- a/app/tests/index.js +++ b/app/tests/index.ts @@ -1,17 +1,20 @@ // standard testing modules -const chai = require("chai") -const chaiHttp = require("chai-http") +import chai from "chai" +import chaiHttp from "chai-http" // modules that help testing serverless functions -const { createServer } = require("vercel-node-server") -const listen = require("test-listen") +import { createServer } from "vercel-node-server" +import listen from "test-listen" + +// types +import { Server } from "http" // import methods to be tested -const Test = require("../controllers/test") -const Matrix = require("../controllers/matrix") +import Test from "../controllers/test" +import Matrix from "../controllers/matrix" // beforeEach management -let route, method, server, url +let route: string, method, server: Server, url: string let testIndex = 0 const toTest = [ @@ -52,7 +55,7 @@ describe("API tests", () => { .request(url) .get(route) .then((res) => { - chai.expect(res.statusCode).to.equal(200) + chai.expect(res.status).to.equal(200) chai.expect(res.text).to.equal("API call successful") }) }) @@ -70,7 +73,7 @@ describe("API tests", () => { matrix: "[[1,2],[3,4]]", }) .then((res) => { - chai.expect(res.statusCode).to.equal(200) + chai.expect(res.status).to.equal(200) chai.expect(res.body).to.equal(-2) }) }) @@ -82,7 +85,7 @@ describe("API tests", () => { matrix: "[[1,2,3],[4,5,6],[7,8,9]]", }) .then((res) => { - chai.expect(res.statusCode).to.equal(500) + chai.expect(res.status).to.equal(500) chai.expect(res.body.message).to.equal("Unsupported") }) }) diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..c6643fd --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,3 @@ +/// +/// +/// diff --git a/package-lock.json b/package-lock.json index 2dd9ca2..04b0abd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,15 +18,21 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "test-listen": "^1.1.0", + "typescript": "^3.9.3", "vercel-node-server": "^2.2.1" }, "devDependencies": { "@commitlint/cli": "^13.1.0", "@commitlint/config-conventional": "^13.1.0", + "@types/mocha": "^9.0.0", + "@types/react": "^17.0.15", + "@types/test-listen": "^1.1.0", + "@vercel/node": "^1.11.1", "chai": "^4.3.4", "chai-http": "^4.3.0", "husky": "^7.0.1", - "mocha": "^9.0.3" + "mocha": "^9.0.3", + "ts-node": "^8.9.1" } }, "node_modules/@babel/code-frame": { @@ -2410,6 +2416,12 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, + "node_modules/@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, "node_modules/@types/node": { "version": "16.4.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.2.tgz", @@ -2426,6 +2438,29 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "node_modules/@types/prop-types": { + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "17.0.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.15.tgz", + "integrity": "sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "devOptional": true + }, "node_modules/@types/superagent": { "version": "3.8.7", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", @@ -2436,6 +2471,15 @@ "@types/node": "*" } }, + "node_modules/@types/test-listen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/test-listen/-/test-listen-1.1.0.tgz", + "integrity": "sha512-y6ZfbSzYHniCeY6ZAzsQjSAdJInNVoEz4Uhsb81W+RCoNYA59yoG/+XbqPqCPj2KCU3Wa6RFWSozutkGIHIsNQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/tinycolor2": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", @@ -9810,6 +9854,12 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, + "@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, "@types/node": { "version": "16.4.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.2.tgz", @@ -9826,6 +9876,29 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "@types/prop-types": { + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", + "devOptional": true + }, + "@types/react": { + "version": "17.0.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.15.tgz", + "integrity": "sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw==", + "devOptional": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "devOptional": true + }, "@types/superagent": { "version": "3.8.7", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", @@ -9836,6 +9909,15 @@ "@types/node": "*" } }, + "@types/test-listen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/test-listen/-/test-listen-1.1.0.tgz", + "integrity": "sha512-y6ZfbSzYHniCeY6ZAzsQjSAdJInNVoEz4Uhsb81W+RCoNYA59yoG/+XbqPqCPj2KCU3Wa6RFWSozutkGIHIsNQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/tinycolor2": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", diff --git a/package.json b/package.json index d93b6e8..c0ade40 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build": "next build", "start": "next start", "version": "auto-changelog -p -l 0 && git add CHANGELOG.md", - "test": "mocha app/tests/index.js" + "test": "mocha -r ts-node/register app/tests/index.ts" }, "repository": { "type": "git", @@ -31,14 +31,20 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "test-listen": "^1.1.0", + "typescript": "^3.9.3", "vercel-node-server": "^2.2.1" }, "devDependencies": { "@commitlint/cli": "^13.1.0", "@commitlint/config-conventional": "^13.1.0", + "@types/mocha": "^9.0.0", + "@types/react": "^17.0.15", + "@types/test-listen": "^1.1.0", + "@vercel/node": "^1.11.1", "chai": "^4.3.4", "chai-http": "^4.3.0", "husky": "^7.0.1", - "mocha": "^9.0.3" + "mocha": "^9.0.3", + "ts-node": "^8.9.1" } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3440dcb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["./app/**/*"], + "exclude": ["node_modules"], + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "outDir": "./build", + "baseUrl": "./", + "esModuleInterop": true, + "allowJs": true, + "noImplicitAny": true, + "lib": ["dom", "dom.iterable", "esnext"], + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + } +}