From 4295caaa30178888eb693c06f1fb8f1ec6cae320 Mon Sep 17 00:00:00 2001 From: Ben Larson Date: Fri, 8 Apr 2022 21:14:10 -0500 Subject: [PATCH] Initial commit --- Dockerfile | 9 +++++++++ README.md | 1 + package-lock.json | 12 ++++++++++++ package.json | 12 ++++++++++++ run.sh | 6 ++++++ server.js | 14 ++++++++++++++ src/index.js | 21 +++++++++++++++++++++ src/index.test.js | 29 +++++++++++++++++++++++++++++ 8 files changed, 104 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 run.sh create mode 100644 server.js create mode 100644 src/index.js create mode 100644 src/index.test.js diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5678ebd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM node:16-slim +WORKDIR /app +COPY ./package.json ./package.json +RUN npm install --only=production +COPY . . +EXPOSE 80 +ENV PORT=80 + +CMD [ "npm", "run", "start" ] diff --git a/README.md b/README.md new file mode 100644 index 0000000..3773bf6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# cc diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..354fc15 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12 @@ +{ + "name": "cc", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "1.0.0", + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0937dbc --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "cc", + "version": "1.0.0", + "description": "", + "main": "src/index.js", + "scripts": { + "start": "node server.js", + "test": "node src/index.test.js" + }, + "author": "", + "license": "ISC" +} diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..7043480 --- /dev/null +++ b/run.sh @@ -0,0 +1,6 @@ +NAME=cc +docker stop $NAME-container +docker rm $NAME-container +docker build -t $NAME-image . +docker run -ditp $1:80 --name $NAME-container $NAME-image +echo "\nRunning at http://localhost:$1/\n" diff --git a/server.js b/server.js new file mode 100644 index 0000000..9562353 --- /dev/null +++ b/server.js @@ -0,0 +1,14 @@ +const http = require("http"); +const { app } = require("./src"); + +const handler = (request, response) => { + const { status = 200, body = "", headers = {} } = app(request); + + response.writeHead(status, headers); + response.write(body); + response.end(); +}; + +http.createServer(handler).listen(80); + +console.log("Node.js web server is running.."); diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..30794f5 --- /dev/null +++ b/src/index.js @@ -0,0 +1,21 @@ +const redirectTo = ({ to }) => ({ + status: 301, + headers: { location: to }, +}); + +const match = (url1, url2) => + url1 === url2 || url1 + "/" === url2 || url1 === url2 + "/"; + +const redirects = [ + { from: "/", to: "https://www.benlarson.xyz/" }, + { from: "/so", to: "https://stackoverflow.com/users/10377586/ben-larson" }, +]; + +module.exports = { + app: ({ url }) => { + const redirect = redirects.find(({ from }) => match(url, from)); + if (redirect) return redirectTo(redirect); + + return { status: 404 }; + }, +}; diff --git a/src/index.test.js b/src/index.test.js new file mode 100644 index 0000000..3dd5d25 --- /dev/null +++ b/src/index.test.js @@ -0,0 +1,29 @@ +const { app } = require("."); + +const it = (assertion, callback) => { + try { + callback(); + } catch (error) { + console.log(`\n${assertion}\n-> ${error}\n`); + } +}; + +const assertEqual = (actual, expected) => { + if (actual !== expected) throw `expected ${expected} but got ${actual}`; +}; + +it("returns 404", () => { + const { status } = app({ url: "/nothing-here" }); + + assertEqual(status, 404); +}); + +it("redirects to benlarson.xyz", () => { + const { + status, + headers: { location }, + } = app({ url: "/" }); + + assertEqual(status, 301); + assertEqual(location, "https://www.benlarson.xyz/"); +}); -- 2.45.2