From 7955dc43c073226a53d4308c2e41d445e1527d10 Mon Sep 17 00:00:00 2001 From: Mark Hopkin Date: Tue, 28 Jun 2022 17:44:27 +0100 Subject: [PATCH] Add ability to allow a license for a particular package (#135336) --- .../{valid.test.js => valid.test.ts} | 24 +++++++++++++++++++ src/dev/license_checker/valid.ts | 15 ++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) rename src/dev/license_checker/{valid.test.js => valid.test.ts} (72%) diff --git a/src/dev/license_checker/valid.test.js b/src/dev/license_checker/valid.test.ts similarity index 72% rename from src/dev/license_checker/valid.test.js rename to src/dev/license_checker/valid.test.ts index 228219c42ddb9..efd376c5c043d 100644 --- a/src/dev/license_checker/valid.test.js +++ b/src/dev/license_checker/valid.test.ts @@ -41,6 +41,30 @@ describe('tasks/lib/licenses', () => { }).toThrow(PACKAGE.name); }); + it('throw an error when the packages license is invalid and not overriden', () => { + expect(() => { + assertLicensesValid({ + packages: [PACKAGE], + validLicenses: [`not ${PACKAGE.licenses[0]}`], + perPackageOverrides: { + [`${PACKAGE.name}-${PACKAGE.version}`]: [`also not ${PACKAGE.licenses[0]}`], + }, + }); + }).toThrow(PACKAGE.name); + }); + + it('should return undefined if the package license is invalid but has an ovveride', () => { + expect( + assertLicensesValid({ + packages: [PACKAGE], + validLicenses: [`not ${PACKAGE.licenses[0]}`], + perPackageOverrides: { + [`${PACKAGE.name}-${PACKAGE.version}`]: PACKAGE.licenses, + }, + }) + ).toEqual(undefined); + }); + it('throws an error when the package has no licenses', () => { expect(() => { assertLicensesValid({ diff --git a/src/dev/license_checker/valid.ts b/src/dev/license_checker/valid.ts index bfe34680e19d2..afda6f7b6989b 100644 --- a/src/dev/license_checker/valid.ts +++ b/src/dev/license_checker/valid.ts @@ -17,6 +17,7 @@ interface Options { licenses: string[]; }>; validLicenses: string[]; + perPackageOverrides?: Record; } /** @@ -24,9 +25,19 @@ interface Options { * options, either throws an error with details about * violations or returns undefined. */ -export function assertLicensesValid({ packages, validLicenses }: Options) { +export function assertLicensesValid({ + packages, + validLicenses, + perPackageOverrides = {}, +}: Options) { const invalidMsgs = packages.reduce((acc, pkg) => { - const invalidLicenses = pkg.licenses.filter((license) => !validLicenses.includes(license)); + const isValidLicense = (license: string) => validLicenses.includes(license); + const isValidLicenseForPackage = (license: string) => + (perPackageOverrides[`${pkg.name}-${pkg.version}`] || []).includes(license); + + const invalidLicenses = pkg.licenses.filter( + (license) => !isValidLicense(license) && !isValidLicenseForPackage(license) + ); if (pkg.licenses.length && !invalidLicenses.length) { return acc;