diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index babd56d..e07183a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,6 +17,7 @@ on: jobs: test: - uses: fastify/workflows/.github/workflows/plugins-ci.yml@v3 + uses: fastify/workflows/.github/workflows/plugins-ci.yml@v4.2.0 with: license-check: true + node-versions: '["16", "18", "20"]' diff --git a/.github/workflows/package-manager-ci.yml b/.github/workflows/package-manager-ci.yml index 89d450f..113aad3 100644 --- a/.github/workflows/package-manager-ci.yml +++ b/.github/workflows/package-manager-ci.yml @@ -17,4 +17,4 @@ on: jobs: test: - uses: fastify/workflows/.github/workflows/plugins-ci-package-manager.yml@v3 + uses: fastify/workflows/.github/workflows/plugins-ci-package-manager.yml@v4.1.0 diff --git a/.taprc b/.taprc index d51127c..343ddd5 100644 --- a/.taprc +++ b/.taprc @@ -1 +1,3 @@ -check-coverage: false +disable-coverage: true +files: + - test/**/*.test.js diff --git a/lib/utils.js b/lib/utils.js index 9f5a14a..173b9fd 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -4,7 +4,7 @@ const { HEX } = require('./scopedChars') function normalizeIPv4 (host) { if (findToken(host, '.') < 3) { return { host, isIPV4: false } } - const matches = host.match(/^(\b[01]?\d{1,2}|\b2[0-4]\d|\b25[0-5])(\.([01]?\d{1,2}|2[0-4]\d|25[0-5])){3}$/u) || [] + const matches = host.match(/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/u) || [] const [address] = matches if (address) { return { host: stripLeadingZeros(address, '.'), isIPV4: true } diff --git a/package.json b/package.json index 44e13df..56877ed 100644 --- a/package.json +++ b/package.json @@ -17,20 +17,21 @@ "homepage": "https://github.com/fastify/fast-uri", "scripts": { "bench": "node benchmark.js", + "lint": "standard | snazzy", "lint:fix": "standard --fix", - "test:lint": "standard | snazzy", - "test:typescript": "tsd", - "test:unit": "tap -J test/*.test.js", - "test:unit:dev": "tap -J test/*.test.js --coverage-report=html", - "test": "npm run test:lint && npm run test:unit && npm run test:typescript", - "test:ci": "npm run test:lint && npm run test:unit -- --cov --coverage-report=lcovonly && npm run test:typescript" + "test": "npm run lint && npm run test:unit && npm run test:typescript", + "test:ci": "npm run lint && npm run test:unit -- --coverage-report=lcovonly && npm run test:typescript", + "test:unit": "tap", + "test:unit:dev": "npm run test:unit -- --coverage-report=html", + "test:typescript": "tsd" }, "devDependencies": { + "@fastify/pre-commit": "^2.1.0", "benchmark": "^2.1.4", "coveralls": "^3.1.1", "snazzy": "^9.0.0", - "standard": "^17.0.0", - "tap": "^16.0.0", + "standard": "^17.1.0", + "tap": "^18.7.2", "tsd": "^0.31.0", "uri-js": "^4.4.1" } diff --git a/test/compatibility.test.js b/test/compatibility.test.js index 5c5edc4..7da9e62 100644 --- a/test/compatibility.test.js +++ b/test/compatibility.test.js @@ -11,7 +11,7 @@ test('compatibility Parse', (t) => { 'https://fastify.org', '/definitions/Record%3Cstring%2CPerson%3E', '//10.10.10.10', - '//10.10.000.10', + // '//10.10.000.10', <-- not a valid URI per URI spec: https://datatracker.ietf.org/doc/html/rfc5954#section-4.1 '//[2001:db8::7%en0]', '//[2001:dbZ::1]:80', '//[2001:db8::1]:80', diff --git a/test/parse.test.js b/test/parse.test.js index 2fe2133..fe7c44e 100644 --- a/test/parse.test.js +++ b/test/parse.test.js @@ -174,12 +174,21 @@ test('URI parse', (t) => { t.equal(components.query, undefined, 'query') t.equal(components.fragment, undefined, 'fragment') - // IPv4address with unformated 0 - components = URI.parse('//10.10.000.10') + // IPv4address with unformated 0 stay as-is + components = URI.parse('//10.10.000.10') // not valid as per https://datatracker.ietf.org/doc/html/rfc5954#section-4.1 t.equal(components.error, undefined, 'IPv4address errors') t.equal(components.scheme, undefined, 'scheme') t.equal(components.userinfo, undefined, 'userinfo') - t.equal(components.host, '10.10.0.10', 'host') + t.equal(components.host, '10.10.000.10', 'host') + t.equal(components.port, undefined, 'port') + t.equal(components.path, '', 'path') + t.equal(components.query, undefined, 'query') + t.equal(components.fragment, undefined, 'fragment') + components = URI.parse('//01.01.01.01') // not valid in URIs: https://datatracker.ietf.org/doc/html/rfc3986#section-7.4 + t.equal(components.error, undefined, 'IPv4address errors') + t.equal(components.scheme, undefined, 'scheme') + t.equal(components.userinfo, undefined, 'userinfo') + t.equal(components.host, '01.01.01.01', 'host') t.equal(components.port, undefined, 'port') t.equal(components.path, '', 'path') t.equal(components.query, undefined, 'query')