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
Fix #11.
  • Loading branch information
motet-a committed Jun 26, 2017
1 parent 6b1625e commit 6926d6a
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
Expand Up @@ -3,6 +3,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,11 +1,17 @@
'use strict'

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 @@ -34,7 +40,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 @@ -67,7 +76,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,8 +1,5 @@
'use strict'

var licenses = require('spdx-license-ids')
var exceptions = require('spdx-exceptions')

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

Expand Down Expand Up @@ -80,22 +77,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 @@ -83,3 +83,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 6926d6a

Please sign in to comment.