diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..e8dc8cb --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,20 @@ +name: Test + +on: + push: + branches: + - main + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version-file: ".nvmrc" + - name: Install dependencies + run: yarn + - name: Run prettier list + run: yarn prettier:list diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..cabf43b --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 \ No newline at end of file diff --git a/README.md b/README.md index 5e6c77b..442d5bd 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,11 @@ All commits to the `main` branch get auto-deployed to the live website [running The base branch is `next`. All PRs should target this branch. To initiate a release: -* Create a new branch, from `next` named `release/x.y.z` -* Bump the version in `package.json` to `x.y.z` -* Merge `release/x.y.z` to `main`. This will trigger the [deployment](#deployment). -* Merge `main` into `next` + +- Create a new branch, from `next` named `release/x.y.z` +- Bump the version in `package.json` to `x.y.z` +- Merge `release/x.y.z` to `main`. This will trigger the [deployment](#deployment). +- Merge `main` into `next` ## Getting Started @@ -35,7 +36,7 @@ Next, install the required dependencies and start the server: yarn install yarn start # Or, if you'd like a different port: -# PORT=5000 yarn start +# PORT=5000 yarn start ``` You can view your running local application at this URL: @@ -46,7 +47,7 @@ http://localhost:9000 ## Requirements -- [Node 17](https://nodejs.org/en/blog/release/v17.0.0/) +- [Node 24](https://nodejs.org/en/blog/release/v24.0.0/) - [Yarn](https://yarnpkg.com/cli/install) ## Contributions @@ -65,4 +66,4 @@ If you find bugs, have feature requests or questions, please Microformats Parser Website Node is dedicated to the public domain using Creative Commons -- CC0 1.0 Universal. -http://creativecommons.org/publicdomain/zero/1.0 \ No newline at end of file +http://creativecommons.org/publicdomain/zero/1.0 diff --git a/index.js b/index.js index 26d9c38..f909106 100644 --- a/index.js +++ b/index.js @@ -1,26 +1,33 @@ const express = require("express"); const { mf2 } = require("microformats-parser"); -const undici = require("undici"); const pkg = require("./package.json"); const app = express(); const port = process.env.PORT || 9000; function getDependencyVersion(dependencyName) { - const fs = require('fs'); - const lockfile = require('@yarnpkg/lockfile'); + const fs = require("fs"); + const lockfile = require("@yarnpkg/lockfile"); const parsed = lockfile.parse(fs.readFileSync("./yarn.lock", "utf-8")); if (parsed.type !== "success") return "unknown"; - const dependency = parsed.object[`${dependencyName}@${pkg.dependencies[dependencyName]}`]; + const dependency = + parsed.object[`${dependencyName}@${pkg.dependencies[dependencyName]}`]; if (dependency === undefined) return "unknown"; return dependency.version; } const mf2version = getDependencyVersion("microformats-parser"); function htmlToMf2(url, html, res) { - const body = mf2(html, { baseUrl: url }); - res - .header("content-type", "application/json; charset=UTF-8") - .send(JSON.stringify(body, null, 2)); + try { + const body = mf2(html, { baseUrl: url }); + res + .header("content-type", "application/json; charset=UTF-8") + .send(JSON.stringify(body, null, 2)); + } catch (err) { + res + .header("content-type", "application/json; charset=UTF-8") + .status(500) + .send(JSON.stringify({ error: err.message }, null, 2)); + } } app.set("view engine", "ejs"); @@ -28,15 +35,15 @@ app.use(express.static("public")); app.get("/", async (req, res) => { if (req.query.url) { const url = req.query.url; - const { body } = await undici.request(url, { - maxRedirections: 2, + await fetch(url, { headers: { accept: "text/html, text/mf2+html", }, method: "GET", + }).then(async (response) => { + const html = await response.text(); + htmlToMf2(url, html, res); }); - const text = await body.text(); - htmlToMf2(url, text, res); } else { res.render("index.html.ejs", { version: `${pkg.version} (lib: ${mf2version})`, diff --git a/package.json b/package.json index 296d47e..bee8087 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,24 @@ { "name": "microformats-website-node", "description": "A website written using Node to demonstrate Microformats2 usage", - "version": "1.1.0", + "version": "1.2.0", "license": "CC0-1.0", "engines": { - "node": "17.x", + "node": "24.x", "yarn": "1.x" }, "scripts": { - "start": "node index.js" + "start": "node index.js", + "prettier:list": "prettier '**/*.{js,ts,json,md,html}' --list-different", + "prettier:fix": "prettier '**/*.{js,ts,json,md,html}' --write" }, "dependencies": { "@yarnpkg/lockfile": "^1.1.0", - "ejs": "^3.1.8", - "express": "^4.18.1", - "microformats-parser": "^1.4.1", - "undici": "^5.6.1" + "ejs": "^6.0.1", + "express": "^5.2.1", + "microformats-parser": "^2.0.6" + }, + "devDependencies": { + "prettier": "^3.9.5" } } diff --git a/views/index.html.ejs b/views/index.html.ejs index 2fd7709..511a013 100644 --- a/views/index.html.ejs +++ b/views/index.html.ejs @@ -53,9 +53,7 @@
-

- Microformats Parser (Node) <%- version -%> -

+

Microformats Parser (Node) <%- version -%>

@@ -92,20 +90,26 @@ name="url" type="url" class="form-control form-control-lg" + required />
-
+

- Drag this link to your bookmarks toolbar to parse a page with one click!
+ Drag this link to your bookmarks toolbar to parse a page with one + click!

- mf2 parser - -
+ mf2 parser + +