diff --git a/client/app.ts b/client.ts similarity index 84% rename from client/app.ts rename to client.ts index fa557045..ba92adbf 100644 --- a/client/app.ts +++ b/client.ts @@ -1,13 +1,10 @@ import { createReadStream } from 'node:fs'; -import * as dotenv from 'dotenv'; import Koa from 'koa'; import serve from 'koa-static'; -dotenv.config(); - const app = new Koa(); -const port = 3000; +const port = 8080; const redirect = 'docs'; const subdir = 'public'; @@ -33,6 +30,6 @@ app context.body = createReadStream(`${redirect}/404.html`); } }) - .listen(port, () => console.log(`Koa is listening port: ${port}`)); + .listen(port, () => console.log(`Client port: ${port}`)); export default app; diff --git a/client/routes/requests/languages.ts b/client/routes/requests/languages.ts index 9cf28c2e..45e9511b 100644 --- a/client/routes/requests/languages.ts +++ b/client/routes/requests/languages.ts @@ -1,18 +1,22 @@ import axios from 'axios'; -import router from '../../../local'; - -const localToken = process.env.GH_PAT; +const { protocol, hostname } = window.location; +const isLocal = hostname !== 'gitlang'; +console.log('hostname:', hostname); const localApi = async (owner: string, repos: string[]) => { try { - const allLanguages = JSON.parse( - await router.langs(owner, repos, localToken), + const allLanguages: { data: { [key: string]: number }[] } = await axios.get( + `${protocol}//${hostname}:3000/gitlang/github/langs`, + { + params: { + owner, + repos: JSON.stringify(repos), + }, + }, ); - - if (allLanguages && allLanguages.length > 0) { - return allLanguages; - } + if (allLanguages && allLanguages.data && allLanguages.data.length > 0) + return allLanguages.data; return []; } catch (error) { console.error('Error getting token from auth api', error); @@ -40,6 +44,6 @@ const serverApi = async (owner: string, repos: string[]) => { } }; -const languages = localToken ? localApi : serverApi; +const languages = isLocal ? localApi : serverApi; export default languages; diff --git a/client/routes/requests/repositories.ts b/client/routes/requests/repositories.ts index af2ef02b..264098a9 100644 --- a/client/routes/requests/repositories.ts +++ b/client/routes/requests/repositories.ts @@ -1,14 +1,19 @@ import axios from 'axios'; -import router from '../../../local'; - -const localToken = process.env.GH_PAT; +const { protocol, hostname } = window.location; +const isLocal = hostname !== 'gitlang'; +console.log('hostname:', hostname); const localApi = async (username: string) => { try { - const allRepos = JSON.parse(await router.repos(username, localToken)); - if (allRepos && allRepos.length > 0) { - return allRepos; + const allRepos: { data: [] } = await axios.get( + `${protocol}//${hostname}:3000/gitlang/github/repos`, + { + params: { username }, + }, + ); + if (allRepos && allRepos.data && allRepos.data.length > 0) { + return allRepos.data; } return []; } catch (error) { @@ -35,6 +40,6 @@ const serverApi = async (username: string) => { } }; -const repositories = localToken ? localApi : serverApi; +const repositories = isLocal ? localApi : serverApi; export default repositories; diff --git a/gitlangRoutes/helpers/github/languages.ts b/gitlangRoutes/helpers/github/languages.ts index 4e5b9d13..218b957f 100644 --- a/gitlangRoutes/helpers/github/languages.ts +++ b/gitlangRoutes/helpers/github/languages.ts @@ -2,7 +2,7 @@ import { Octokit } from '@octokit/rest'; let octokit: Octokit; -const fetchLanguage = async (owner: string, repo: string, token?: string) => { +const fetchLanguage = async (owner: string, repo: string, token: string) => { try { if (!octokit) { if (!token) { @@ -20,7 +20,7 @@ const fetchLanguage = async (owner: string, repo: string, token?: string) => { } }; -const languages = async (owner: string, names: string[], token?: string) => { +const languages = async (owner: string, names: string[], token: string) => { const langs = []; for (const repo of names) { langs.push(await fetchLanguage(owner, repo, token)); diff --git a/gitlangRoutes/helpers/github/repositories.ts b/gitlangRoutes/helpers/github/repositories.ts index 6f7c65f1..51b76300 100644 --- a/gitlangRoutes/helpers/github/repositories.ts +++ b/gitlangRoutes/helpers/github/repositories.ts @@ -2,7 +2,7 @@ import { Octokit } from '@octokit/rest'; let octokit: Octokit; -const repositories = async (username: string, token?: string) => { +const repositories = async (username: string, token: string) => { try { if (!octokit) { if (!token) { diff --git a/gitlangRoutes/requests/gitlangLocal.ts b/gitlangRoutes/requests/gitlangLocal.ts deleted file mode 100644 index b6f32d45..00000000 --- a/gitlangRoutes/requests/gitlangLocal.ts +++ /dev/null @@ -1,30 +0,0 @@ -import languages from '../helpers/github/languages'; -import repositories from '../helpers/github/repositories'; - -const gitlangLocal = { - langs: async (owner: string, repos: string[], token?: string) => { - try { - const response = await languages(owner, repos, token); - if (response && response.length > 0) { - return JSON.stringify(response); - } - return JSON.stringify([]); - } catch { - return JSON.stringify([]); - } - }, - - repos: async (username: string, token?: string) => { - try { - const response = await repositories(username, token); - if (response && response.length > 0) { - return JSON.stringify(response); - } - return JSON.stringify([]); - } catch { - return JSON.stringify([]); - } - }, -}; - -export default gitlangLocal; diff --git a/gitlangRoutes/requests/gitlangRouter.ts b/gitlangRoutes/requests/gitlangRouter.ts index 05289abb..3296c175 100644 --- a/gitlangRoutes/requests/gitlangRouter.ts +++ b/gitlangRoutes/requests/gitlangRouter.ts @@ -4,6 +4,8 @@ import auth from '../helpers/github/auth'; import languages from '../helpers/github/languages'; import repositories from '../helpers/github/repositories'; +const environmentToken = process.env.GH_PAT; + const router = new Router({ prefix: '/github' }); router.get( @@ -13,7 +15,7 @@ router.get( response: { status: number; body: string }; }) => { try { - const token = await auth(); + const token = environmentToken || (await auth()); const { owner } = context.request.query; const { repos } = context.request.query; const repoList = JSON.parse(repos) as string[]; @@ -39,7 +41,7 @@ router.get( response: { status: number; body: string }; }) => { try { - const token = await auth(); + const token = environmentToken || (await auth()); const { username } = context.request.query; const response = await repositories(username, token); if (response && response.length > 0) { diff --git a/local.ts b/local.ts deleted file mode 100644 index a112b6e2..00000000 --- a/local.ts +++ /dev/null @@ -1,5 +0,0 @@ -import gitlangLocal from './gitlangRoutes/requests/gitlangLocal'; - -const router = gitlangLocal; - -export default router; diff --git a/package-lock.json b/package-lock.json index bad8e255..a8e6fb48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "d3-interpolate": "^3.0.1", "dotenv": "^16.0.1", "path": "^0.12.7", + "process": "^0.11.10", "svelte": "^3.49.0", "the-new-css-reset": "^1.7.3" }, @@ -28,14 +29,18 @@ "@octokit/rest": "^19.0.4", "@types/dotenv-webpack": "^7.0.3", "@types/koa": "^2.13.5", + "@types/koa__cors": "^3.3.0", "@types/koa__router": "^8.0.11", + "@types/koa-bodyparser": "^4.3.7", "@types/koa-static": "^4.0.2", "@types/mini-css-extract-plugin": "^2.5.0", "@types/node": "^18.7.8", "babel-loader": "^8.2.5", "css-loader": "^6.7.1", + "dotenv-webpack": "^8.0.1", "eslint": "^8.22.0", "koa": "^2.13.4", + "koa-bodyparser": "^4.3.0", "koa-static": "^5.0.0", "mini-css-extract-plugin": "^2.6.1", "nodemon": "^2.0.19", @@ -3610,6 +3615,15 @@ "@types/node": "*" } }, + "node_modules/@types/koa__cors": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-3.3.0.tgz", + "integrity": "sha512-FUN8YxcBakIs+walVe3+HcNP+Bxd0SB8BJHBWkglZ5C1XQWljlKcEFDG/dPiCIqwVCUbc5X0nYDlH62uEhdHMA==", + "dev": true, + "dependencies": { + "@types/koa": "*" + } + }, "node_modules/@types/koa__router": { "version": "8.0.11", "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.11.tgz", @@ -3619,6 +3633,15 @@ "@types/koa": "*" } }, + "node_modules/@types/koa-bodyparser": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/@types/koa-bodyparser/-/koa-bodyparser-4.3.7.tgz", + "integrity": "sha512-21NhEp7LjZm4zbNV5alHHmrNY4J+S7B8lYTO6CzRL8ShTMnl20Gd14dRgVhAxraLaW5iZMofox+BycbuiDvj2Q==", + "dev": true, + "dependencies": { + "@types/koa": "*" + } + }, "node_modules/@types/koa-compose": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", @@ -4886,6 +4909,15 @@ "node": ">=10" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cache-content-type": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", @@ -5123,6 +5155,18 @@ "node": ">= 0.12.0" } }, + "node_modules/co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "dev": true, + "dependencies": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -5271,6 +5315,12 @@ "node": ">= 0.8" } }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", + "dev": true + }, "node_modules/core-js": { "version": "3.24.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.0.tgz", @@ -5694,6 +5744,39 @@ "node": ">=12" } }, + "node_modules/dotenv-defaults": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz", + "integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==", + "dev": true, + "dependencies": { + "dotenv": "^8.2.0" + } + }, + "node_modules/dotenv-defaults/node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-webpack": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.0.1.tgz", + "integrity": "sha512-CdrgfhZOnx4uB18SgaoP9XHRN2v48BbjuXQsZY5ixs5A8579NxQkmMxRtI7aTwSiSQcM2ao12Fdu+L3ZS3bG4w==", + "dev": true, + "dependencies": { + "dotenv-defaults": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "webpack": "^4 || ^5" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -7709,6 +7792,18 @@ "npm": ">=1.3.7" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -7809,6 +7904,15 @@ "node": ">=8" } }, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -8509,6 +8613,19 @@ "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" } }, + "node_modules/koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "dev": true, + "dependencies": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/koa-compose": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", @@ -9965,7 +10082,7 @@ "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { "node": ">= 0.6.0" } @@ -10046,6 +10163,21 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10092,6 +10224,55 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -12076,6 +12257,15 @@ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", "dev": true }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -15297,6 +15487,15 @@ "@types/node": "*" } }, + "@types/koa__cors": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-3.3.0.tgz", + "integrity": "sha512-FUN8YxcBakIs+walVe3+HcNP+Bxd0SB8BJHBWkglZ5C1XQWljlKcEFDG/dPiCIqwVCUbc5X0nYDlH62uEhdHMA==", + "dev": true, + "requires": { + "@types/koa": "*" + } + }, "@types/koa__router": { "version": "8.0.11", "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.11.tgz", @@ -15306,6 +15505,15 @@ "@types/koa": "*" } }, + "@types/koa-bodyparser": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/@types/koa-bodyparser/-/koa-bodyparser-4.3.7.tgz", + "integrity": "sha512-21NhEp7LjZm4zbNV5alHHmrNY4J+S7B8lYTO6CzRL8ShTMnl20Gd14dRgVhAxraLaW5iZMofox+BycbuiDvj2Q==", + "dev": true, + "requires": { + "@types/koa": "*" + } + }, "@types/koa-compose": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", @@ -16303,6 +16511,12 @@ } } }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, "cache-content-type": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", @@ -16473,6 +16687,18 @@ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, + "co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "dev": true, + "requires": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -16596,6 +16822,12 @@ } } }, + "copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", + "dev": true + }, "core-js": { "version": "3.24.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.0.tgz", @@ -16910,6 +17142,32 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==" }, + "dotenv-defaults": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz", + "integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==", + "dev": true, + "requires": { + "dotenv": "^8.2.0" + }, + "dependencies": { + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true + } + } + }, + "dotenv-webpack": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.0.1.tgz", + "integrity": "sha512-CdrgfhZOnx4uB18SgaoP9XHRN2v48BbjuXQsZY5ixs5A8579NxQkmMxRtI7aTwSiSQcM2ao12Fdu+L3ZS3bG4w==", + "dev": true, + "requires": { + "dotenv-defaults": "^2.0.2" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -18380,6 +18638,15 @@ "sshpk": "^1.7.0" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -18448,6 +18715,12 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -18967,6 +19240,16 @@ } } }, + "koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "dev": true, + "requires": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + } + }, "koa-compose": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", @@ -20009,7 +20292,7 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, "promise-chains": { "version": "0.3.12", @@ -20072,6 +20355,15 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -20101,6 +20393,45 @@ "safe-buffer": "^5.1.0" } }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -21544,6 +21875,12 @@ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index ecd768c1..ba0abbde 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "build": "NODE_ENV=development webpack --mode development", "dev": "NODE_ENV=development webpack --mode development -w", "prod": "NODE_ENV=production webpack --mode production", - "start": "ts-node client/app.ts", - "nodemon": "nodemon client/app.ts" + "client": "nodemon client.ts", + "server": "nodemon server.ts" }, "dependencies": { "airbnb-browser-shims": "^3.3.0", @@ -16,6 +16,7 @@ "d3-interpolate": "^3.0.1", "dotenv": "^16.0.1", "path": "^0.12.7", + "process": "^0.11.10", "svelte": "^3.49.0", "the-new-css-reset": "^1.7.3" }, @@ -30,14 +31,18 @@ "@octokit/rest": "^19.0.4", "@types/dotenv-webpack": "^7.0.3", "@types/koa": "^2.13.5", + "@types/koa__cors": "^3.3.0", "@types/koa__router": "^8.0.11", + "@types/koa-bodyparser": "^4.3.7", "@types/koa-static": "^4.0.2", "@types/mini-css-extract-plugin": "^2.5.0", "@types/node": "^18.7.8", "babel-loader": "^8.2.5", "css-loader": "^6.7.1", + "dotenv-webpack": "^8.0.1", "eslint": "^8.22.0", "koa": "^2.13.4", + "koa-bodyparser": "^4.3.0", "koa-static": "^5.0.0", "mini-css-extract-plugin": "^2.6.1", "nodemon": "^2.0.19", diff --git a/server.ts b/server.ts new file mode 100644 index 00000000..69088add --- /dev/null +++ b/server.ts @@ -0,0 +1,26 @@ +import cors from '@koa/cors'; +import { config } from 'dotenv'; +import Koa from 'koa'; +import bodyParser from 'koa-bodyparser'; + +import gitlang from './gitlangRoutes/gitlang'; + +config(); + +const app = new Koa(); + +const port = 3000; + +const corsOptions = { + allowMethods: ['GET', 'POST'], + maxAge: 600, +}; + +app + .use(cors(corsOptions)) + .use(bodyParser()) + .use(gitlang.routes()) + .use(gitlang.allowedMethods()) + .listen(port, () => console.log(`Server port: ${port}`)); + +export default app; diff --git a/webpack.config.ts b/webpack.config.ts index efb6a477..21c2d9d5 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -11,7 +11,7 @@ const production = mode === 'production'; const SRC_DIR = path.join(path.resolve(), '/client/src'); const DIST_DIR = path.join(path.resolve(), '/docs/public/dist'); -const config: Configuration = { +const configuration: Configuration = { entry: `${SRC_DIR}/index.ts`, resolve: { fullySpecified: false, @@ -81,4 +81,4 @@ const config: Configuration = { }, }; -export default config; +export default configuration;