Skip to content

Commit

Permalink
Add relaxed option to allow invalid licenses and exception names
Browse files Browse the repository at this point in the history
  • Loading branch information
motet-a committed Jun 16, 2017
1 parent 17c2f51 commit 768f682
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 23 deletions.
4 changes: 2 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var scan = require('./scan')
var parse = require('./parse')

module.exports = function (source) {
return parse(scan(source))
module.exports = function (source, options) {
return parse(scan(source), options)
}
20 changes: 16 additions & 4 deletions parse.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
var licenses = require('spdx-license-ids')
var exceptions = require('spdx-exceptions')

// The ABNF grammar in the spec is totally ambiguous.
//
// This parser follows the operator precedence defined in the
// `Order of Precedence and Parentheses` section.

module.exports = function (tokens) {
//
// options:
// - Set `relaxed` to `true` to accept invalid license or exception IDs.
module.exports = function (tokens, options) {
options = options || {}
var index = 0

function hasMore () {
Expand Down Expand Up @@ -32,7 +38,10 @@ module.exports = function (tokens) {
function parseWith () {
if (parseOperator('WITH')) {
var t = token()
if (t && t.type === 'EXCEPTION') {
if (t && t.type === 'IDENTIFIER') {
if (!options.relaxed && exceptions.indexOf(t.string) === -1) {
throw new Error('`' + t.string + '` is not a valid exception name')
}
next()
return t.string
}
Expand Down Expand Up @@ -65,7 +74,10 @@ module.exports = function (tokens) {

function parseLicense () {
var t = token()
if (t && t.type === 'LICENSE') {
if (t && t.type === 'IDENTIFIER') {
if (!options.relaxed && licenses.indexOf(t.string) === -1) {
throw new Error('`' + t.string + '` is not a valid license name')
}
next()
var node = {license: t.string}
if (parseOperator('+')) {
Expand Down
20 changes: 3 additions & 17 deletions scan.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
var licenses = require('spdx-license-ids')
var exceptions = require('spdx-exceptions')

module.exports = function (source) {
var index = 0

Expand Down Expand Up @@ -78,22 +75,11 @@ module.exports = function (source) {
}

function identifier () {
var begin = index
var string = idstring()

if (licenses.indexOf(string) !== -1) {
return {
type: 'LICENSE',
string: string
}
} else if (exceptions.indexOf(string) !== -1) {
return {
type: 'EXCEPTION',
string: string
}
return string && {
type: 'IDENTIFIER',
string: string
}

index = begin
}

// Tries to read the next token. Returns `undefined` if no token is
Expand Down
24 changes: 24 additions & 0 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,27 @@ it('parses `AND`, `OR` and `WITH` with the correct precedence', function () {
}
)
})

it('rejects invalid license and exception names by default', function () {
assert.throws(
function () { p('unknownLicense') },
/`unknownLicense` is not a valid license name/
)

assert.throws(
function () { p('MIT WITH unknownException') },
/`unknownException` is not a valid exception name/
)
})

it('accepts invalid license and exception names in relaxed mode', function () {
assert.deepEqual(
p('unknownLicense', {relaxed: true}),
{license: 'unknownLicense'}
)

assert.deepEqual(
p('MIT WITH unknownException', {relaxed: true}),
{license: 'MIT', exception: 'unknownException'}
)
})

0 comments on commit 768f682

Please sign in to comment.