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 "' ); 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 }; } };