112 lines
3.1 KiB
JavaScript
112 lines
3.1 KiB
JavaScript
const path = require("path");
|
|
const { promisify } = require("util");
|
|
|
|
const checker = require("license-checker");
|
|
|
|
const { version } = require("../package.json");
|
|
|
|
/**
|
|
* A list of all the allowed licenses that production dependencies can have.
|
|
*/
|
|
const ALLOWED_LICENSES = [
|
|
"(Apache-2.0 OR MPL-1.1)",
|
|
"(AFL-2.1 OR BSD-3-Clause)",
|
|
"(AFLv2.1 OR BSD)",
|
|
"(BSD-2-Clause OR MIT OR Apache-2.0)",
|
|
"(BSD-3-Clause AND Apache-2.0)",
|
|
"(BSD-3-Clause OR GPL-2.0)",
|
|
"(CC-BY-4.0 AND MIT)",
|
|
"(MIT OR Apache-2.0)",
|
|
"(MIT OR CC0-1.0)",
|
|
"(MIT OR GPL-3.0)",
|
|
"(MIT OR GPL-3.0-or-later)",
|
|
"(MIT OR WTFPL)",
|
|
"(MIT AND CC-BY-3.0)",
|
|
"(MIT AND BSD-3-Clause)",
|
|
"(MIT AND Zlib)",
|
|
"(WTFPL OR MIT)",
|
|
"BSD-3-Clause OR MIT",
|
|
"0BSD",
|
|
"Apache",
|
|
"Apache-2.0",
|
|
"BSD",
|
|
"BSD-2-Clause",
|
|
"BSD-3-Clause",
|
|
"CC0-1.0",
|
|
"CC-BY-3.0",
|
|
"CC-BY-4.0",
|
|
"ISC",
|
|
"MIT",
|
|
"MPL-2.0",
|
|
"Public Domain",
|
|
"Python-2.0",
|
|
"Unlicense",
|
|
"WTFPL",
|
|
];
|
|
|
|
/**
|
|
* Licenses that should be allowed only for dev dependencies.
|
|
*/
|
|
const ALLOWED_DEV_LICENSES = [...ALLOWED_LICENSES, "ODC-By-1.0", "MPL-2.0"];
|
|
|
|
/**
|
|
* A list of all packages that should be excluded from license checking.
|
|
*/
|
|
const IGNORED_PACKAGES = [`airbyte-webapp@${version}`];
|
|
|
|
/**
|
|
* Overwrite licenses for specific packages manually, e.g. because they can't be detected properly.
|
|
*/
|
|
const LICENSE_OVERWRITES = {
|
|
"glob-to-regexp@0.3.0": "BSD-3-Clause",
|
|
"trim@0.0.1": "MIT",
|
|
"backslash@0.2.0": "MIT",
|
|
"browser-assert@1.2.1": "MIT", // via README (https://github.com/socialally/browser-assert/tree/v1.2.1)
|
|
};
|
|
|
|
const checkLicenses = promisify(checker.init);
|
|
const params = {
|
|
start: path.join(__dirname, ".."),
|
|
excludePackages: IGNORED_PACKAGES.join(";"),
|
|
unknown: true,
|
|
};
|
|
|
|
function validateLicenes(licenses, allowedLicenes, usedOverwrites) {
|
|
let licensesValid = true;
|
|
for (const [pkg, info] of Object.entries(licenses)) {
|
|
let license = Array.isArray(info.licenses) ? `(${info.licenses.join(" OR ")})` : info.licenses;
|
|
if (LICENSE_OVERWRITES[pkg]) {
|
|
license = LICENSE_OVERWRITES[pkg];
|
|
usedOverwrites.add(pkg);
|
|
}
|
|
if (license.endsWith("*")) {
|
|
license = license.substr(0, license.length - 1);
|
|
console.log(`Guessed license for package ${pkg}: ${license}`);
|
|
}
|
|
if (!license || !allowedLicenes.includes(license)) {
|
|
licensesValid = false;
|
|
console.error(`Package ${pkg} has incompatible license: ${license}`);
|
|
}
|
|
}
|
|
|
|
return licensesValid;
|
|
}
|
|
|
|
Promise.all([checkLicenses({ ...params, production: true }), checkLicenses({ ...params, development: true })]).then(
|
|
([prod, dev]) => {
|
|
const usedOverwrites = new Set();
|
|
const prodLicensesValid = validateLicenes(prod, ALLOWED_LICENSES, usedOverwrites);
|
|
const devLicensesValid = validateLicenes(dev, ALLOWED_DEV_LICENSES, usedOverwrites);
|
|
|
|
for (const overwrite of Object.keys(LICENSE_OVERWRITES)) {
|
|
if (!usedOverwrites.has(overwrite)) {
|
|
console.warn(`License overwrite for ${overwrite} is no longer needed and can be deleted.`);
|
|
}
|
|
}
|
|
|
|
if (!prodLicensesValid || !devLicensesValid) {
|
|
process.exit(1);
|
|
}
|
|
}
|
|
);
|