From 1ad9c8b3792371005f96f08fd78fb5b5ed4d98ba Mon Sep 17 00:00:00 2001 From: Mickael Jeanroy Date: Fri, 22 May 2020 16:09:01 +0200 Subject: [PATCH] fix: handle internal package.json file, with a non valid package name Close #553 --- package.json | 1 + src/license-plugin.js | 7 +++- test/fixtures/fake-package-6/index.js | 1 + .../fixtures/fake-package-6/internal/index.js | 3 ++ .../fake-package-6/internal/package.json | 4 +++ test/fixtures/fake-package-6/package.json | 15 ++++++++ test/fixtures/fake-package-7/index.js | 1 + .../fixtures/fake-package-7/internal/index.js | 3 ++ .../fake-package-7/internal/package.json | 5 +++ test/fixtures/fake-package-7/package.json | 15 ++++++++ test/license-plugin.spec.js | 34 +++++++++++++++++++ 11 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/fake-package-6/index.js create mode 100644 test/fixtures/fake-package-6/internal/index.js create mode 100644 test/fixtures/fake-package-6/internal/package.json create mode 100644 test/fixtures/fake-package-6/package.json create mode 100644 test/fixtures/fake-package-7/index.js create mode 100644 test/fixtures/fake-package-7/internal/index.js create mode 100644 test/fixtures/fake-package-7/internal/package.json create mode 100644 test/fixtures/fake-package-7/package.json diff --git a/package.json b/package.json index 1d682adf..cfac7f38 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "magic-string": "0.25.7", "mkdirp": "0.5.1", "moment": "2.24.0", + "package-name-regex": "1.0.8", "spdx-expression-validate": "2.0.0", "spdx-satisfies": "5.0.0" }, diff --git a/src/license-plugin.js b/src/license-plugin.js index 0848ab4b..f6cae233 100644 --- a/src/license-plugin.js +++ b/src/license-plugin.js @@ -29,6 +29,7 @@ import _ from 'lodash'; import moment from 'moment'; import MagicString from 'magic-string'; import glob from 'glob'; +import packageNameRegex from 'package-name-regex'; import {Dependency} from './dependency.js'; import {generateBlockComment} from './generate-block-comment.js'; @@ -176,7 +177,11 @@ class LicensePlugin { // We are probably in a package.json specifying the type of package (module, cjs). // Nevertheless, if the package name is not defined, we must not use this `package.json` descriptor. - if (pkgJson.name) { + const license = pkgJson.license || pkgJson.licenses; + const hasLicense = license && license.length > 0; + const name = pkgJson.name; + const isValidPackageName = name && packageNameRegex.test(name); + if (isValidPackageName || hasLicense) { // We found it! pkg = pkgJson; diff --git a/test/fixtures/fake-package-6/index.js b/test/fixtures/fake-package-6/index.js new file mode 100644 index 00000000..799c2430 --- /dev/null +++ b/test/fixtures/fake-package-6/index.js @@ -0,0 +1 @@ +export {test} from './internal/index'; diff --git a/test/fixtures/fake-package-6/internal/index.js b/test/fixtures/fake-package-6/internal/index.js new file mode 100644 index 00000000..b005c3d3 --- /dev/null +++ b/test/fixtures/fake-package-6/internal/index.js @@ -0,0 +1,3 @@ +export function test() { + return true; +} diff --git a/test/fixtures/fake-package-6/internal/package.json b/test/fixtures/fake-package-6/internal/package.json new file mode 100644 index 00000000..e612426f --- /dev/null +++ b/test/fixtures/fake-package-6/internal/package.json @@ -0,0 +1,4 @@ +{ + "name": "@fake-package/core/internal", + "private": true +} \ No newline at end of file diff --git a/test/fixtures/fake-package-6/package.json b/test/fixtures/fake-package-6/package.json new file mode 100644 index 00000000..9e08f39b --- /dev/null +++ b/test/fixtures/fake-package-6/package.json @@ -0,0 +1,15 @@ +{ + "name": "fake-package", + "version": "1.0.0", + "description": "Fake package used in unit tests", + "main": "src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Mickael Jeanroy ", + "license": "MIT", + "private": true, + "dependencies": { + "lodash": "*" + } +} diff --git a/test/fixtures/fake-package-7/index.js b/test/fixtures/fake-package-7/index.js new file mode 100644 index 00000000..799c2430 --- /dev/null +++ b/test/fixtures/fake-package-7/index.js @@ -0,0 +1 @@ +export {test} from './internal/index'; diff --git a/test/fixtures/fake-package-7/internal/index.js b/test/fixtures/fake-package-7/internal/index.js new file mode 100644 index 00000000..b005c3d3 --- /dev/null +++ b/test/fixtures/fake-package-7/internal/index.js @@ -0,0 +1,3 @@ +export function test() { + return true; +} diff --git a/test/fixtures/fake-package-7/internal/package.json b/test/fixtures/fake-package-7/internal/package.json new file mode 100644 index 00000000..7e764642 --- /dev/null +++ b/test/fixtures/fake-package-7/internal/package.json @@ -0,0 +1,5 @@ +{ + "name": "@fake-package/core/internal", + "private": true, + "license": "MIT" +} \ No newline at end of file diff --git a/test/fixtures/fake-package-7/package.json b/test/fixtures/fake-package-7/package.json new file mode 100644 index 00000000..9e08f39b --- /dev/null +++ b/test/fixtures/fake-package-7/package.json @@ -0,0 +1,15 @@ +{ + "name": "fake-package", + "version": "1.0.0", + "description": "Fake package used in unit tests", + "main": "src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Mickael Jeanroy ", + "license": "MIT", + "private": true, + "dependencies": { + "lodash": "*" + } +} diff --git a/test/license-plugin.spec.js b/test/license-plugin.spec.js index 0d76ca27..ab385ec3 100644 --- a/test/license-plugin.spec.js +++ b/test/license-plugin.spec.js @@ -144,6 +144,40 @@ describe('LicensePlugin', () => { }); }); + it('should load pkg and going up directories until a valid package name is found', () => { + const id = path.join(__dirname, 'fixtures', 'fake-package-6', 'internal', 'index.js'); + const result = plugin.scanDependency(id); + + expect(result).not.toBeDefined(); + expect(addDependency).toHaveBeenCalled(); + expect(plugin._dependencies).toEqual({ + 'fake-package': fakePackage, + }); + }); + + it('should load pkg and going up directories until a package name with a license is found even with a non valid package name', () => { + const id = path.join(__dirname, 'fixtures', 'fake-package-7', 'internal', 'index.js'); + const result = plugin.scanDependency(id); + + expect(result).not.toBeDefined(); + expect(addDependency).toHaveBeenCalled(); + expect(plugin._dependencies).toEqual({ + '@fake-package/core/internal': { + name: '@fake-package/core/internal', + maintainers: [], + version: null, + description: null, + repository: null, + homepage: null, + private: true, + license: 'MIT', + licenseText: null, + author: null, + contributors: [], + }, + }); + }); + it('should load pkg including license text from LICENSE.md file', () => { const id = path.join(__dirname, 'fixtures', 'fake-package-2', 'src', 'index.js'); const result = plugin.scanDependency(id);