Compare normalized purls to account for encoding quirks

This commit is contained in:
Justin Holguín
2026-02-20 00:02:42 +00:00
committed by GitHub
parent 9284e0c621
commit 2ced98cbe8
6 changed files with 140 additions and 11 deletions
+42 -1
View File
@@ -1,5 +1,5 @@
import {expect, test} from '@jest/globals'
import {parsePURL} from '../src/purl'
import {parsePURL, purlsMatch} from '../src/purl'
test('parsePURL returns an error if the purl does not start with "pkg:"', () => {
const purl = 'not-a-purl'
@@ -184,3 +184,44 @@ test('parsePURL table test', () => {
expect(result).toEqual(example.expected)
}
})
test('purlsMatch matches identical PURLs', () => {
const a = parsePURL('pkg:npm/@scope/[email protected]')
const b = parsePURL('pkg:npm/@scope/[email protected]')
expect(purlsMatch(a, b)).toBe(true)
})
test('purlsMatch matches when namespace separator is percent-encoded', () => {
// %2F-encoded separator puts everything in name with no namespace
const encoded = parsePURL('pkg:npm/%40lancedb%2Flancedb')
// literal / splits into namespace + name
const literal = parsePURL('pkg:npm/%40lancedb/lancedb')
expect(purlsMatch(encoded, literal)).toBe(true)
})
test('purlsMatch matches scoped npm packages regardless of encoding', () => {
const a = parsePURL('pkg:npm/%40lancedb%2Flancedb')
const b = parsePURL('pkg:npm/@lancedb/lancedb')
const c = parsePURL('pkg:npm/%40lancedb/[email protected]')
expect(purlsMatch(a, b)).toBe(true)
expect(purlsMatch(a, c)).toBe(true)
expect(purlsMatch(b, c)).toBe(true)
})
test('purlsMatch does not match different packages', () => {
const a = parsePURL('pkg:npm/@scope/foo')
const b = parsePURL('pkg:npm/@scope/bar')
expect(purlsMatch(a, b)).toBe(false)
})
test('purlsMatch does not match different types', () => {
const a = parsePURL('pkg:npm/@scope/name')
const b = parsePURL('pkg:pypi/@scope/name')
expect(purlsMatch(a, b)).toBe(false)
})
test('purlsMatch matches packages without namespaces', () => {
const a = parsePURL('pkg:npm/[email protected]')
const b = parsePURL('pkg:npm/[email protected]')
expect(purlsMatch(a, b)).toBe(true)
})