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"
+ }
+}