From 89216e91a687fa2ba059deb7da4d8ef13ae1b1ec Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Mon, 23 Mar 2026 16:38:09 -0400 Subject: [PATCH 1/9] Upgrade jsonld & http-client to latest. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 86c59ce..e3d10e0 100644 --- a/package.json +++ b/package.json @@ -33,11 +33,11 @@ "lib/**/*.js" ], "dependencies": { - "@digitalbazaar/http-client": "^3.2.0", + "@digitalbazaar/http-client": "^4.3.0", "@xmldom/xmldom": "^0.8.2", "content-type": "^1.0.4", "get-stdin": "^9.0.0", - "jsonld": "^8.1.0", + "jsonld": "^9.0.0", "rdfa": "^0.0.10" }, "devDependencies": { From 12cfe60d052f1de4301250128b65796d740efe46 Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Mon, 23 Mar 2026 16:42:44 -0400 Subject: [PATCH 2/9] Update engines.node. Calculated via https://github.com/smarlhens/npm-check-engines --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e3d10e0..7ea96fc 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "eslint": "^9.39.4" }, "engines": { - "node": ">=14.13.1" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "keywords": [ "JSON", From 619786dc827dcaf25edb99b1171f407605421618 Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Tue, 24 Mar 2026 10:05:55 -0400 Subject: [PATCH 3/9] Ignore node_modules. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fc42ab9..f53f58b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ coverage node_modules v8.log package-lock.json +node_modules/ From 0744a34eee19c8ce89017ee2249609a36b9ebbf8 Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Tue, 24 Mar 2026 14:42:54 -0400 Subject: [PATCH 4/9] Add mocha/chai tests for stdin, files, & HTTP. --- package.json | 7 +++- test/fixtures/sample.jsonld | 9 ++++ test/jsonld-request.test.js | 83 +++++++++++++++++++++++++++++++++++++ test/runner-stdin.js | 14 +++++++ 4 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/sample.jsonld create mode 100644 test/jsonld-request.test.js create mode 100644 test/runner-stdin.js diff --git a/package.json b/package.json index 7ea96fc..298257e 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,9 @@ }, "devDependencies": { "@digitalbazaar/eslint-config": "^8.0.1", - "eslint": "^9.39.4" + "eslint": "^9.39.4", + "mocha": "^11.7.5", + "chai": "^6.2.2" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24.0.0" @@ -57,6 +59,7 @@ "jsonld" ], "scripts": { - "lint": "eslint ." + "lint": "eslint .", + "test": "mocha \"test/**/*.test.js\"" } } diff --git a/test/fixtures/sample.jsonld b/test/fixtures/sample.jsonld new file mode 100644 index 0000000..ab123b5 --- /dev/null +++ b/test/fixtures/sample.jsonld @@ -0,0 +1,9 @@ +{ + "@context": "https://www.w3.org/2018/credentials/v1", + "id": "urn:uuid:0000-0000-0000-0000", + "type": ["VerifiableCredential"], + "credentialSubject": { + "id": "did:example:123", + "name": "Example" + } +} diff --git a/test/jsonld-request.test.js b/test/jsonld-request.test.js new file mode 100644 index 0000000..87d4599 --- /dev/null +++ b/test/jsonld-request.test.js @@ -0,0 +1,83 @@ +import * as chai from 'chai'; +import {fileURLToPath} from 'node:url'; +import {promises as fs} from 'node:fs'; +import http from 'node:http'; +import {jsonldRequest} from '../lib/index.js'; +import path from 'node:path'; +import {spawn} from 'node:child_process'; + +const should = chai.should(); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +describe('jsonldRequest', function() { + this.timeout(10000); + + let fixturePath; + let fixtureData; + + before(async () => { + fixturePath = path.join(__dirname, 'fixtures', 'sample.jsonld'); + fixtureData = await fs.readFile(fixturePath, 'utf8'); + }); + + it('loads a local file (file://) and parses JSON-LD', async () => { + const fileUrl = `file://${fixturePath}`; + const {data} = await jsonldRequest(fileUrl, {allow: ['file']}); + should.exist(data); + data.should.be.an('object'); + data.should.have.property('@context'); + }); + + it('loads JSON-LD over HTTP and parses it', async () => { + // start local HTTP server to serve the fixture + const server = http.createServer((req, res) => { + const headers = { + 'Content-Type': 'application/ld+json; charset=utf-8' + }; + res.writeHead(200, headers); + res.end(fixtureData); + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + const addr = server.address(); + const url = `http://127.0.0.1:${addr.port}/fixture.json`; + try { + const {data} = await jsonldRequest(url, {allow: ['http', 'https']}); + should.exist(data); + data.should.be.an('object'); + data.should.have.property('@context'); + } finally { + server.close(); + } + }); + + it('reads JSON-LD from stdin (child process runner)', async () => { + const runner = path.join(__dirname, 'runner-stdin.js'); + const child = spawn( + process.execPath, + [runner, '-'] + ); + + let stdout = ''; + let stderr = ''; + child.stdout.on('data', d => { + stdout += d.toString(); + }); + child.stderr.on('data', d => { + stderr += d.toString(); + }); + + // write fixture to child's stdin + child.stdin.write(fixtureData); + child.stdin.end(); + + const exitCode = await new Promise(resolve => child.on('close', resolve)); + if(exitCode !== 0) { + throw new Error(`Runner exited with ${exitCode}: ${stderr}`); + } + const parsed = JSON.parse(stdout); + should.exist(parsed); + parsed.should.be.an('object'); + parsed.should.have.property('@context'); + }); +}); diff --git a/test/runner-stdin.js b/test/runner-stdin.js new file mode 100644 index 0000000..cb4a886 --- /dev/null +++ b/test/runner-stdin.js @@ -0,0 +1,14 @@ +#!/usr/bin/env node +import {jsonldRequest} from '../lib/index.js'; + +const loc = process.argv[2] || '-'; +const options = {allow: ['stdin']}; + +jsonldRequest(loc, options).then(({data}) => { + // print only the data as JSON to stdout + console.log(JSON.stringify(data)); +}).catch(err => { + // print error to stderr + console.error(err && err.stack ? err.stack : String(err)); + process.exit(1); +}); From b44161338828e475c02a0294b8896105c3dcfc9c Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Thu, 26 Mar 2026 13:40:24 -0400 Subject: [PATCH 5/9] Make test input data more real. --- test/fixtures/sample.jsonld | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/fixtures/sample.jsonld b/test/fixtures/sample.jsonld index ab123b5..d7c6c25 100644 --- a/test/fixtures/sample.jsonld +++ b/test/fixtures/sample.jsonld @@ -1,6 +1,6 @@ { - "@context": "https://www.w3.org/2018/credentials/v1", - "id": "urn:uuid:0000-0000-0000-0000", + "@context": "https://www.w3.org/ns/credentials/v2", + "id": "urn:uuid:2a1d4ddb-bbda-43cb-8886-fda9855bcf5d", "type": ["VerifiableCredential"], "credentialSubject": { "id": "did:example:123", From 0b293f9acc7fc7933123c9a37637cdafb82bd162 Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Thu, 26 Mar 2026 13:41:06 -0400 Subject: [PATCH 6/9] Rename folder from `fixtures` to `data`. --- test/{fixtures => data}/sample.jsonld | 0 test/jsonld-request.test.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename test/{fixtures => data}/sample.jsonld (100%) diff --git a/test/fixtures/sample.jsonld b/test/data/sample.jsonld similarity index 100% rename from test/fixtures/sample.jsonld rename to test/data/sample.jsonld diff --git a/test/jsonld-request.test.js b/test/jsonld-request.test.js index 87d4599..59615fd 100644 --- a/test/jsonld-request.test.js +++ b/test/jsonld-request.test.js @@ -17,7 +17,7 @@ describe('jsonldRequest', function() { let fixtureData; before(async () => { - fixturePath = path.join(__dirname, 'fixtures', 'sample.jsonld'); + fixturePath = path.join(__dirname, 'data', 'sample.jsonld'); fixtureData = await fs.readFile(fixturePath, 'utf8'); }); From 64e70797a251f1550efc8892f96742424d1eb694 Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Thu, 26 Mar 2026 13:42:55 -0400 Subject: [PATCH 7/9] Remove use of old school aliases. --- test/jsonld-request.test.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/test/jsonld-request.test.js b/test/jsonld-request.test.js index 59615fd..dce7cc6 100644 --- a/test/jsonld-request.test.js +++ b/test/jsonld-request.test.js @@ -1,5 +1,4 @@ import * as chai from 'chai'; -import {fileURLToPath} from 'node:url'; import {promises as fs} from 'node:fs'; import http from 'node:http'; import {jsonldRequest} from '../lib/index.js'; @@ -7,8 +6,6 @@ import path from 'node:path'; import {spawn} from 'node:child_process'; const should = chai.should(); -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); describe('jsonldRequest', function() { this.timeout(10000); @@ -17,7 +14,7 @@ describe('jsonldRequest', function() { let fixtureData; before(async () => { - fixturePath = path.join(__dirname, 'data', 'sample.jsonld'); + fixturePath = path.join(import.meta.dirname, 'data', 'sample.jsonld'); fixtureData = await fs.readFile(fixturePath, 'utf8'); }); @@ -52,7 +49,7 @@ describe('jsonldRequest', function() { }); it('reads JSON-LD from stdin (child process runner)', async () => { - const runner = path.join(__dirname, 'runner-stdin.js'); + const runner = path.join(import.meta.dirname, 'runner-stdin.js'); const child = spawn( process.execPath, [runner, '-'] From c3b2b3e79be3025ac398755cf9c444890892af21 Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Thu, 26 Mar 2026 13:44:45 -0400 Subject: [PATCH 8/9] Remove timeout. --- test/jsonld-request.test.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/jsonld-request.test.js b/test/jsonld-request.test.js index dce7cc6..f4f4efe 100644 --- a/test/jsonld-request.test.js +++ b/test/jsonld-request.test.js @@ -8,8 +8,6 @@ import {spawn} from 'node:child_process'; const should = chai.should(); describe('jsonldRequest', function() { - this.timeout(10000); - let fixturePath; let fixtureData; From 00e4a0e35b8a4296f0dcd0d6abc16acd0a883dcc Mon Sep 17 00:00:00 2001 From: Benjamin Young Date: Thu, 26 Mar 2026 14:08:04 -0400 Subject: [PATCH 9/9] Use deep.equal instaed of item checks. --- test/jsonld-request.test.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/jsonld-request.test.js b/test/jsonld-request.test.js index f4f4efe..23e7de4 100644 --- a/test/jsonld-request.test.js +++ b/test/jsonld-request.test.js @@ -19,9 +19,7 @@ describe('jsonldRequest', function() { it('loads a local file (file://) and parses JSON-LD', async () => { const fileUrl = `file://${fixturePath}`; const {data} = await jsonldRequest(fileUrl, {allow: ['file']}); - should.exist(data); - data.should.be.an('object'); - data.should.have.property('@context'); + data.should.deep.equal(JSON.parse(fixtureData)); }); it('loads JSON-LD over HTTP and parses it', async () => {