| var parse = require('spdx-expression-parse'); |
| var correct = require('spdx-correct'); |
| |
| var genericWarning = ( |
| 'license should be ' + |
| 'a valid SPDX license expression (without "LicenseRef"), ' + |
| '"UNLICENSED", or ' + |
| '"SEE LICENSE IN <filename>"' |
| ); |
| |
| var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; |
| |
| function startsWith(prefix, string) { |
| return string.slice(0, prefix.length) === prefix; |
| } |
| |
| function usesLicenseRef(ast) { |
| if (ast.hasOwnProperty('license')) { |
| var license = ast.license; |
| return ( |
| startsWith('LicenseRef', license) || |
| startsWith('DocumentRef', license) |
| ); |
| } else { |
| return ( |
| usesLicenseRef(ast.left) || |
| usesLicenseRef(ast.right) |
| ); |
| } |
| } |
| |
| module.exports = function(argument) { |
| var ast; |
| |
| try { |
| ast = parse(argument); |
| } catch (e) { |
| var match |
| if ( |
| argument === 'UNLICENSED' || |
| argument === 'UNLICENCED' |
| ) { |
| return { |
| validForOldPackages: true, |
| validForNewPackages: true, |
| unlicensed: true |
| }; |
| } else if (match = fileReferenceRE.exec(argument)) { |
| return { |
| validForOldPackages: true, |
| validForNewPackages: true, |
| inFile: match[1] |
| }; |
| } else { |
| var result = { |
| validForOldPackages: false, |
| validForNewPackages: false, |
| warnings: [genericWarning] |
| }; |
| if (argument.trim().length !== 0) { |
| var corrected = correct(argument); |
| if (corrected) { |
| result.warnings.push( |
| 'license is similar to the valid expression "' + corrected + '"' |
| ); |
| } |
| } |
| return result; |
| } |
| } |
| |
| if (usesLicenseRef(ast)) { |
| return { |
| validForNewPackages: false, |
| validForOldPackages: false, |
| spdx: true, |
| warnings: [genericWarning] |
| }; |
| } else { |
| return { |
| validForNewPackages: true, |
| validForOldPackages: true, |
| spdx: true |
| }; |
| } |
| }; |