license-cop 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "license-cop",
3
- "version": "1.5.0",
3
+ "version": "1.6.1",
4
4
  "type": "commonjs",
5
5
  "bin": {
6
6
  "license-cop": "./src/bin/license-cop"
@@ -15,10 +15,10 @@ const _joinstringarray = require("../utils/join-string-array");
15
15
  const Arborist = require("@npmcli/arborist");
16
16
  const npmDependencyScanning = async (options)=>{
17
17
  const { workingDirectory, allowedLicenses, allowedPackages, includeDevDependencies, devDependenciesOnly } = options;
18
- const foundAllowedPackages = new Set();
19
- const packagesWithAllowedLicenses = new Set();
20
- const packagesWithNoLicenses = new Set();
21
- const packagesWithForbiddenLicenses = new Set();
18
+ const foundAllowedPackages = new Map();
19
+ const packagesWithAllowedLicenses = new Map();
20
+ const packagesWithNoLicenses = new Map();
21
+ const packagesWithForbiddenLicenses = new Map();
22
22
  const arborist = new Arborist({
23
23
  path: workingDirectory
24
24
  });
@@ -38,7 +38,7 @@ const npmDependencyScanning = async (options)=>{
38
38
  const packageJson = await (0, _packagejson.readPackageJson)(packageJsonPath);
39
39
  if ((0, _packagerules.isAllowedPackage)(node.name, packageJson.version, allowedPackages)) {
40
40
  _logger.default.verbose(`Package ${packageJson.name} is an allowed package`);
41
- foundAllowedPackages.add({
41
+ foundAllowedPackages.set(node.pkgid, {
42
42
  name: packageJson.name,
43
43
  version: packageJson.version
44
44
  });
@@ -51,7 +51,7 @@ const npmDependencyScanning = async (options)=>{
51
51
  const licenseExpression = (0, _parselicenseexpression.parseLicenseExpression)(rawLicenseExpression);
52
52
  if (licenseExpression.type === "unlicensed") {
53
53
  _logger.default.verbose(`Package ${packageJson.name} is unlicensed`);
54
- packagesWithNoLicenses.add({
54
+ packagesWithNoLicenses.set(node.pkgid, {
55
55
  name: packageJson.name,
56
56
  version: packageJson.version
57
57
  });
@@ -64,7 +64,7 @@ const npmDependencyScanning = async (options)=>{
64
64
  const joinedIssues = (0, _joinstringarray.joinStringArray)(licenseIssues);
65
65
  if (licenseIssues.length > 0) {
66
66
  _logger.default.verbose(`Package ${packageJson.name} has the forbidden license: ${joinedIssues}`);
67
- packagesWithForbiddenLicenses.add({
67
+ packagesWithForbiddenLicenses.set(node.pkgid, {
68
68
  name: packageJson.name,
69
69
  version: packageJson.version,
70
70
  licenseIdentifiers: joinedIssues,
@@ -72,7 +72,7 @@ const npmDependencyScanning = async (options)=>{
72
72
  });
73
73
  } else {
74
74
  _logger.default.verbose(`Package ${packageJson.name} has the allowed license: ${rawLicenseExpression}`);
75
- packagesWithAllowedLicenses.add({
75
+ packagesWithAllowedLicenses.set(node.pkgid, {
76
76
  name: packageJson.name,
77
77
  version: packageJson.version,
78
78
  spdxExpression: rawLicenseExpression,
@@ -90,10 +90,10 @@ const npmDependencyScanning = async (options)=>{
90
90
  };
91
91
  await parseNodes(topNode.children.values());
92
92
  return {
93
- allowedPackages: foundAllowedPackages,
94
- allowedLicenses: packagesWithAllowedLicenses,
95
- noLicenses: packagesWithNoLicenses,
96
- forbiddenLicenses: packagesWithForbiddenLicenses
93
+ allowedPackages: new Set(foundAllowedPackages.values()),
94
+ allowedLicenses: new Set(packagesWithAllowedLicenses.values()),
95
+ noLicenses: new Set(packagesWithNoLicenses.values()),
96
+ forbiddenLicenses: new Set(packagesWithForbiddenLicenses.values())
97
97
  };
98
98
  };
99
99
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/license-cop/src/lib/dependency-scanning/npm.ts"],"sourcesContent":["import Arborist = require(\"@npmcli/arborist\");\nimport { Link, Node } from \"@npmcli/arborist\";\nimport { join } from \"node:path\";\nimport { getLicenseExpression, readPackageJson } from \"../dependency/package-json\";\nimport { isAllowedPackage } from \"../dependency/package-rules\";\nimport logger from \"../logger\";\nimport {\n AllowedPackage,\n CheckLicensesResult,\n ForbiddenLicenseResult,\n LicensedPackage,\n NoLicenseResult\n} from \"../result\";\nimport { calculateIssues } from \"../spdx/calculate-issues\";\nimport { parseLicenseExpression } from \"../spdx/parse-license-expression\";\nimport { joinStringArray } from \"../utils/join-string-array\";\nimport { DependencyScanningOptions } from \"./options\";\n\nexport const npmDependencyScanning = async (\n options: DependencyScanningOptions\n): Promise<CheckLicensesResult> => {\n const {\n workingDirectory,\n allowedLicenses,\n allowedPackages,\n includeDevDependencies,\n devDependenciesOnly\n } = options;\n\n const foundAllowedPackages = new Set<AllowedPackage>();\n const packagesWithAllowedLicenses = new Set<LicensedPackage>();\n const packagesWithNoLicenses = new Set<NoLicenseResult>();\n const packagesWithForbiddenLicenses = new Set<ForbiddenLicenseResult>();\n\n const arborist = new Arborist({ path: workingDirectory });\n\n const topNode = await arborist.loadActual();\n\n // This function is very similar to the one in pnpm.ts\n // If you change this, you probably want to change that one too\n const parseNode = async (node: Node | Link) => {\n logger.verbose(`Parsing node: ${node.name}`);\n\n const isDevDependency = node.dev;\n\n if (!includeDevDependencies && !devDependenciesOnly && isDevDependency) {\n return;\n }\n\n if (devDependenciesOnly && !isDevDependency) {\n return;\n }\n\n const packageJsonPath = join(node.realpath, \"package.json\");\n const packageJson = await readPackageJson(packageJsonPath);\n\n if (isAllowedPackage(node.name, packageJson.version, allowedPackages)) {\n logger.verbose(`Package ${packageJson.name} is an allowed package`);\n foundAllowedPackages.add({\n name: packageJson.name,\n version: packageJson.version\n });\n\n if (node.children.size > 0) {\n await parseNodes(node.children.values());\n }\n return;\n }\n\n const rawLicenseExpression = getLicenseExpression(packageJson);\n const licenseExpression = parseLicenseExpression(rawLicenseExpression);\n\n if (licenseExpression.type === \"unlicensed\") {\n logger.verbose(`Package ${packageJson.name} is unlicensed`);\n packagesWithNoLicenses.add({\n name: packageJson.name,\n version: packageJson.version\n });\n\n if (node.children.size > 0) {\n await parseNodes(node.children.values());\n }\n return;\n }\n\n const licenseIssues = calculateIssues(licenseExpression, allowedLicenses);\n const joinedIssues = joinStringArray(licenseIssues);\n\n if (licenseIssues.length > 0) {\n logger.verbose(`Package ${packageJson.name} has the forbidden license: ${joinedIssues}`);\n packagesWithForbiddenLicenses.add({\n name: packageJson.name,\n version: packageJson.version,\n licenseIdentifiers: joinedIssues,\n spdxExpression: rawLicenseExpression\n });\n } else {\n logger.verbose(\n `Package ${packageJson.name} has the allowed license: ${rawLicenseExpression}`\n );\n packagesWithAllowedLicenses.add({\n name: packageJson.name,\n version: packageJson.version,\n spdxExpression: rawLicenseExpression,\n licenses: licenseExpression\n });\n }\n\n if (node.children.size > 0) {\n parseNodes(node.children.values());\n }\n };\n\n const parseNodes = async (nodes: IterableIterator<Node | Link>) => {\n for (const node of nodes) {\n await parseNode(node);\n }\n };\n\n await parseNodes(topNode.children.values());\n\n return {\n allowedPackages: foundAllowedPackages,\n allowedLicenses: packagesWithAllowedLicenses,\n noLicenses: packagesWithNoLicenses,\n forbiddenLicenses: packagesWithForbiddenLicenses\n };\n};\n"],"names":["npmDependencyScanning","Arborist","options","workingDirectory","allowedLicenses","allowedPackages","includeDevDependencies","devDependenciesOnly","foundAllowedPackages","Set","packagesWithAllowedLicenses","packagesWithNoLicenses","packagesWithForbiddenLicenses","arborist","path","topNode","loadActual","parseNode","node","logger","verbose","name","isDevDependency","dev","packageJsonPath","join","realpath","packageJson","readPackageJson","isAllowedPackage","version","add","children","size","parseNodes","values","rawLicenseExpression","getLicenseExpression","licenseExpression","parseLicenseExpression","type","licenseIssues","calculateIssues","joinedIssues","joinStringArray","length","licenseIdentifiers","spdxExpression","licenses","nodes","noLicenses","forbiddenLicenses"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/license-cop/src/lib/dependency-scanning/npm.ts"],"sourcesContent":["import Arborist = require(\"@npmcli/arborist\");\nimport { Link, Node } from \"@npmcli/arborist\";\nimport { join } from \"node:path\";\nimport { getLicenseExpression, readPackageJson } from \"../dependency/package-json\";\nimport { isAllowedPackage } from \"../dependency/package-rules\";\nimport logger from \"../logger\";\nimport {\n AllowedPackage,\n CheckLicensesResult,\n ForbiddenLicenseResult,\n LicensedPackage,\n NoLicenseResult\n} from \"../result\";\nimport { calculateIssues } from \"../spdx/calculate-issues\";\nimport { parseLicenseExpression } from \"../spdx/parse-license-expression\";\nimport { joinStringArray } from \"../utils/join-string-array\";\nimport { DependencyScanningOptions } from \"./options\";\n\nexport const npmDependencyScanning = async (\n options: DependencyScanningOptions\n): Promise<CheckLicensesResult> => {\n const {\n workingDirectory,\n allowedLicenses,\n allowedPackages,\n includeDevDependencies,\n devDependenciesOnly\n } = options;\n\n const foundAllowedPackages = new Map<string, AllowedPackage>();\n const packagesWithAllowedLicenses = new Map<string, LicensedPackage>();\n const packagesWithNoLicenses = new Map<string, NoLicenseResult>();\n const packagesWithForbiddenLicenses = new Map<string, ForbiddenLicenseResult>();\n\n const arborist = new Arborist({ path: workingDirectory });\n\n const topNode = await arborist.loadActual();\n\n // This function is very similar to the one in pnpm.ts\n // If you change this, you probably want to change that one too\n const parseNode = async (node: Node | Link) => {\n logger.verbose(`Parsing node: ${node.name}`);\n\n const isDevDependency = node.dev;\n\n if (!includeDevDependencies && !devDependenciesOnly && isDevDependency) {\n return;\n }\n\n if (devDependenciesOnly && !isDevDependency) {\n return;\n }\n\n const packageJsonPath = join(node.realpath, \"package.json\");\n const packageJson = await readPackageJson(packageJsonPath);\n\n if (isAllowedPackage(node.name, packageJson.version, allowedPackages)) {\n logger.verbose(`Package ${packageJson.name} is an allowed package`);\n foundAllowedPackages.set(node.pkgid, {\n name: packageJson.name,\n version: packageJson.version\n });\n\n if (node.children.size > 0) {\n await parseNodes(node.children.values());\n }\n return;\n }\n\n const rawLicenseExpression = getLicenseExpression(packageJson);\n const licenseExpression = parseLicenseExpression(rawLicenseExpression);\n\n if (licenseExpression.type === \"unlicensed\") {\n logger.verbose(`Package ${packageJson.name} is unlicensed`);\n packagesWithNoLicenses.set(node.pkgid, {\n name: packageJson.name,\n version: packageJson.version\n });\n\n if (node.children.size > 0) {\n await parseNodes(node.children.values());\n }\n return;\n }\n\n const licenseIssues = calculateIssues(licenseExpression, allowedLicenses);\n const joinedIssues = joinStringArray(licenseIssues);\n\n if (licenseIssues.length > 0) {\n logger.verbose(`Package ${packageJson.name} has the forbidden license: ${joinedIssues}`);\n packagesWithForbiddenLicenses.set(node.pkgid, {\n name: packageJson.name,\n version: packageJson.version,\n licenseIdentifiers: joinedIssues,\n spdxExpression: rawLicenseExpression\n });\n } else {\n logger.verbose(\n `Package ${packageJson.name} has the allowed license: ${rawLicenseExpression}`\n );\n packagesWithAllowedLicenses.set(node.pkgid, {\n name: packageJson.name,\n version: packageJson.version,\n spdxExpression: rawLicenseExpression,\n licenses: licenseExpression\n });\n }\n\n if (node.children.size > 0) {\n parseNodes(node.children.values());\n }\n };\n\n const parseNodes = async (nodes: IterableIterator<Node | Link>) => {\n for (const node of nodes) {\n await parseNode(node);\n }\n };\n\n await parseNodes(topNode.children.values());\n\n return {\n allowedPackages: new Set(foundAllowedPackages.values()),\n allowedLicenses: new Set(packagesWithAllowedLicenses.values()),\n noLicenses: new Set(packagesWithNoLicenses.values()),\n forbiddenLicenses: new Set(packagesWithForbiddenLicenses.values())\n };\n};\n"],"names":["npmDependencyScanning","Arborist","options","workingDirectory","allowedLicenses","allowedPackages","includeDevDependencies","devDependenciesOnly","foundAllowedPackages","Map","packagesWithAllowedLicenses","packagesWithNoLicenses","packagesWithForbiddenLicenses","arborist","path","topNode","loadActual","parseNode","node","logger","verbose","name","isDevDependency","dev","packageJsonPath","join","realpath","packageJson","readPackageJson","isAllowedPackage","version","set","pkgid","children","size","parseNodes","values","rawLicenseExpression","getLicenseExpression","licenseExpression","parseLicenseExpression","type","licenseIssues","calculateIssues","joinedIssues","joinStringArray","length","licenseIdentifiers","spdxExpression","licenses","nodes","Set","noLicenses","forbiddenLicenses"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";+BAkBaA;;;eAAAA;;;0BAhBQ;6BACiC;8BACrB;wBACd;iCAQa;wCACO;iCACP;AAfhC,MAAOC,mBAAmB;AAkBnB,MAAMD,wBAAwB,OACnCE;IAEA,MAAM,EACJC,gBAAgB,EAChBC,eAAe,EACfC,eAAe,EACfC,sBAAsB,EACtBC,mBAAmB,EACpB,GAAGL;IAEJ,MAAMM,uBAAuB,IAAIC;IACjC,MAAMC,8BAA8B,IAAID;IACxC,MAAME,yBAAyB,IAAIF;IACnC,MAAMG,gCAAgC,IAAIH;IAE1C,MAAMI,WAAW,IAAIZ,SAAS;QAAEa,MAAMX;IAAiB;IAEvD,MAAMY,UAAU,MAAMF,SAASG,UAAU;IAEzC,sDAAsD;IACtD,+DAA+D;IAC/D,MAAMC,YAAY,OAAOC;QACvBC,eAAM,CAACC,OAAO,CAAC,CAAC,cAAc,EAAEF,KAAKG,IAAI,CAAC,CAAC;QAE3C,MAAMC,kBAAkBJ,KAAKK,GAAG;QAEhC,IAAI,CAACjB,0BAA0B,CAACC,uBAAuBe,iBAAiB;YACtE;QACF;QAEA,IAAIf,uBAAuB,CAACe,iBAAiB;YAC3C;QACF;QAEA,MAAME,kBAAkBC,IAAAA,cAAI,EAACP,KAAKQ,QAAQ,EAAE;QAC5C,MAAMC,cAAc,MAAMC,IAAAA,4BAAe,EAACJ;QAE1C,IAAIK,IAAAA,8BAAgB,EAACX,KAAKG,IAAI,EAAEM,YAAYG,OAAO,EAAEzB,kBAAkB;YACrEc,eAAM,CAACC,OAAO,CAAC,CAAC,QAAQ,EAAEO,YAAYN,IAAI,CAAC,sBAAsB,CAAC;YAClEb,qBAAqBuB,GAAG,CAACb,KAAKc,KAAK,EAAE;gBACnCX,MAAMM,YAAYN,IAAI;gBACtBS,SAASH,YAAYG,OAAO;YAC9B;YAEA,IAAIZ,KAAKe,QAAQ,CAACC,IAAI,GAAG,GAAG;gBAC1B,MAAMC,WAAWjB,KAAKe,QAAQ,CAACG,MAAM;YACvC;YACA;QACF;QAEA,MAAMC,uBAAuBC,IAAAA,iCAAoB,EAACX;QAClD,MAAMY,oBAAoBC,IAAAA,8CAAsB,EAACH;QAEjD,IAAIE,kBAAkBE,IAAI,KAAK,cAAc;YAC3CtB,eAAM,CAACC,OAAO,CAAC,CAAC,QAAQ,EAAEO,YAAYN,IAAI,CAAC,cAAc,CAAC;YAC1DV,uBAAuBoB,GAAG,CAACb,KAAKc,KAAK,EAAE;gBACrCX,MAAMM,YAAYN,IAAI;gBACtBS,SAASH,YAAYG,OAAO;YAC9B;YAEA,IAAIZ,KAAKe,QAAQ,CAACC,IAAI,GAAG,GAAG;gBAC1B,MAAMC,WAAWjB,KAAKe,QAAQ,CAACG,MAAM;YACvC;YACA;QACF;QAEA,MAAMM,gBAAgBC,IAAAA,gCAAe,EAACJ,mBAAmBnC;QACzD,MAAMwC,eAAeC,IAAAA,gCAAe,EAACH;QAErC,IAAIA,cAAcI,MAAM,GAAG,GAAG;YAC5B3B,eAAM,CAACC,OAAO,CAAC,CAAC,QAAQ,EAAEO,YAAYN,IAAI,CAAC,4BAA4B,EAAEuB,aAAa,CAAC;YACvFhC,8BAA8BmB,GAAG,CAACb,KAAKc,KAAK,EAAE;gBAC5CX,MAAMM,YAAYN,IAAI;gBACtBS,SAASH,YAAYG,OAAO;gBAC5BiB,oBAAoBH;gBACpBI,gBAAgBX;YAClB;QACF,OAAO;YACLlB,eAAM,CAACC,OAAO,CACZ,CAAC,QAAQ,EAAEO,YAAYN,IAAI,CAAC,0BAA0B,EAAEgB,qBAAqB,CAAC;YAEhF3B,4BAA4BqB,GAAG,CAACb,KAAKc,KAAK,EAAE;gBAC1CX,MAAMM,YAAYN,IAAI;gBACtBS,SAASH,YAAYG,OAAO;gBAC5BkB,gBAAgBX;gBAChBY,UAAUV;YACZ;QACF;QAEA,IAAIrB,KAAKe,QAAQ,CAACC,IAAI,GAAG,GAAG;YAC1BC,WAAWjB,KAAKe,QAAQ,CAACG,MAAM;QACjC;IACF;IAEA,MAAMD,aAAa,OAAOe;QACxB,KAAK,MAAMhC,QAAQgC,MAAO;YACxB,MAAMjC,UAAUC;QAClB;IACF;IAEA,MAAMiB,WAAWpB,QAAQkB,QAAQ,CAACG,MAAM;IAExC,OAAO;QACL/B,iBAAiB,IAAI8C,IAAI3C,qBAAqB4B,MAAM;QACpDhC,iBAAiB,IAAI+C,IAAIzC,4BAA4B0B,MAAM;QAC3DgB,YAAY,IAAID,IAAIxC,uBAAuByB,MAAM;QACjDiB,mBAAmB,IAAIF,IAAIvC,8BAA8BwB,MAAM;IACjE;AACF"}
@@ -15,10 +15,10 @@ const _parselicenseexpression = require("../spdx/parse-license-expression");
15
15
  const _joinstringarray = require("../utils/join-string-array");
16
16
  const pnpmDependencyScanning = async (options)=>{
17
17
  const { workingDirectory, allowedLicenses, allowedPackages, includeDevDependencies, devDependenciesOnly } = options;
18
- const foundAllowedPackages = new Set();
19
- const packagesWithAllowedLicenses = new Set();
20
- const packagesWithNoLicenses = new Set();
21
- const packagesWithForbiddenLicenses = new Set();
18
+ const foundAllowedPackages = new Map();
19
+ const packagesWithAllowedLicenses = new Map();
20
+ const packagesWithNoLicenses = new Map();
21
+ const packagesWithForbiddenLicenses = new Map();
22
22
  const dependencyHierarchies = await (0, _reviewingdependencieshierarchy.buildDependenciesHierarchy)([
23
23
  workingDirectory
24
24
  ], {
@@ -35,11 +35,12 @@ const pnpmDependencyScanning = async (options)=>{
35
35
  // If you change this, you probably want to change that one too
36
36
  const parseNode = async (node)=>{
37
37
  _logger.default.verbose(`Parsing node: ${node.name}`);
38
+ const pkgId = `${node.alias}@${node.version}`;
38
39
  const packageJsonPath = (0, _nodepath.join)(node.path, "package.json");
39
40
  const packageJson = await (0, _packagejson.readPackageJson)(packageJsonPath);
40
41
  if ((0, _packagerules.isAllowedPackage)(packageJson.name, packageJson.version, allowedPackages)) {
41
42
  _logger.default.verbose(`Package ${packageJson.name} is an allowed package`);
42
- foundAllowedPackages.add({
43
+ foundAllowedPackages.set(pkgId, {
43
44
  name: packageJson.name,
44
45
  version: packageJson.version
45
46
  });
@@ -50,7 +51,7 @@ const pnpmDependencyScanning = async (options)=>{
50
51
  const licenseExpression = (0, _parselicenseexpression.parseLicenseExpression)(rawLicenseExpression);
51
52
  if (licenseExpression.type === "unlicensed") {
52
53
  _logger.default.verbose(`Package ${packageJson.name} is unlicensed`);
53
- packagesWithNoLicenses.add({
54
+ packagesWithNoLicenses.set(pkgId, {
54
55
  name: packageJson.name,
55
56
  version: packageJson.version
56
57
  });
@@ -61,7 +62,7 @@ const pnpmDependencyScanning = async (options)=>{
61
62
  const joinedIssues = (0, _joinstringarray.joinStringArray)(licenseIssues);
62
63
  if (licenseIssues.length > 0) {
63
64
  _logger.default.verbose(`Package ${packageJson.name} has the forbidden license: ${joinedIssues}`);
64
- packagesWithForbiddenLicenses.add({
65
+ packagesWithForbiddenLicenses.set(pkgId, {
65
66
  name: packageJson.name,
66
67
  version: packageJson.version,
67
68
  licenseIdentifiers: joinedIssues,
@@ -69,7 +70,7 @@ const pnpmDependencyScanning = async (options)=>{
69
70
  });
70
71
  } else {
71
72
  _logger.default.verbose(`Package ${packageJson.name} has the allowed license: ${rawLicenseExpression}`);
72
- packagesWithAllowedLicenses.add({
73
+ packagesWithAllowedLicenses.set(pkgId, {
73
74
  name: packageJson.name,
74
75
  version: packageJson.version,
75
76
  spdxExpression: rawLicenseExpression,
@@ -93,10 +94,10 @@ const pnpmDependencyScanning = async (options)=>{
93
94
  await parseNodes(hierarchies.unsavedDependencies);
94
95
  }
95
96
  return {
96
- allowedPackages: foundAllowedPackages,
97
- allowedLicenses: packagesWithAllowedLicenses,
98
- noLicenses: packagesWithNoLicenses,
99
- forbiddenLicenses: packagesWithForbiddenLicenses
97
+ allowedPackages: new Set(foundAllowedPackages.values()),
98
+ allowedLicenses: new Set(packagesWithAllowedLicenses.values()),
99
+ noLicenses: new Set(packagesWithNoLicenses.values()),
100
+ forbiddenLicenses: new Set(packagesWithForbiddenLicenses.values())
100
101
  };
101
102
  };
102
103
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/license-cop/src/lib/dependency-scanning/pnpm.ts"],"sourcesContent":["import {\n buildDependenciesHierarchy,\n type PackageNode\n} from \"@pnpm/reviewing.dependencies-hierarchy\";\nimport { join } from \"node:path\";\nimport { getLicenseExpression, readPackageJson } from \"../dependency/package-json\";\nimport { isAllowedPackage } from \"../dependency/package-rules\";\nimport logger from \"../logger\";\nimport {\n AllowedPackage,\n CheckLicensesResult,\n ForbiddenLicenseResult,\n LicensedPackage,\n NoLicenseResult\n} from \"../result\";\nimport { calculateIssues } from \"../spdx/calculate-issues\";\nimport { parseLicenseExpression } from \"../spdx/parse-license-expression\";\nimport { joinStringArray } from \"../utils/join-string-array\";\nimport { DependencyScanningOptions } from \"./options\";\n\nexport const pnpmDependencyScanning = async (\n options: DependencyScanningOptions\n): Promise<CheckLicensesResult> => {\n const {\n workingDirectory,\n allowedLicenses,\n allowedPackages,\n includeDevDependencies,\n devDependenciesOnly\n } = options;\n\n const foundAllowedPackages = new Set<AllowedPackage>();\n const packagesWithAllowedLicenses = new Set<LicensedPackage>();\n const packagesWithNoLicenses = new Set<NoLicenseResult>();\n const packagesWithForbiddenLicenses = new Set<ForbiddenLicenseResult>();\n\n const dependencyHierarchies = await buildDependenciesHierarchy([workingDirectory], {\n depth: Infinity,\n include: {\n dependencies: !devDependenciesOnly,\n devDependencies: includeDevDependencies,\n optionalDependencies: false\n },\n lockfileDir: workingDirectory,\n virtualStoreDirMaxLength: Infinity\n });\n\n // This function is very similar to the one in npm.ts\n // If you change this, you probably want to change that one too\n const parseNode = async (node: PackageNode) => {\n logger.verbose(`Parsing node: ${node.name}`);\n\n const packageJsonPath = join(node.path, \"package.json\");\n const packageJson = await readPackageJson(packageJsonPath);\n\n if (isAllowedPackage(packageJson.name, packageJson.version, allowedPackages)) {\n logger.verbose(`Package ${packageJson.name} is an allowed package`);\n foundAllowedPackages.add({\n name: packageJson.name,\n version: packageJson.version\n });\n\n await parseNodes(node.dependencies);\n return;\n }\n\n const rawLicenseExpression = getLicenseExpression(packageJson);\n const licenseExpression = parseLicenseExpression(rawLicenseExpression);\n\n if (licenseExpression.type === \"unlicensed\") {\n logger.verbose(`Package ${packageJson.name} is unlicensed`);\n packagesWithNoLicenses.add({\n name: packageJson.name,\n version: packageJson.version\n });\n\n await parseNodes(node.dependencies);\n return;\n }\n\n const licenseIssues = calculateIssues(licenseExpression, allowedLicenses);\n const joinedIssues = joinStringArray(licenseIssues);\n\n if (licenseIssues.length > 0) {\n logger.verbose(`Package ${packageJson.name} has the forbidden license: ${joinedIssues}`);\n packagesWithForbiddenLicenses.add({\n name: packageJson.name,\n version: packageJson.version,\n licenseIdentifiers: joinedIssues,\n spdxExpression: rawLicenseExpression\n });\n } else {\n logger.verbose(\n `Package ${packageJson.name} has the allowed license: ${rawLicenseExpression}`\n );\n packagesWithAllowedLicenses.add({\n name: packageJson.name,\n version: packageJson.version,\n spdxExpression: rawLicenseExpression,\n licenses: licenseExpression\n });\n }\n\n await parseNodes(node.dependencies);\n };\n\n const parseNodes = async (nodes: PackageNode[] | undefined) => {\n if (!nodes) {\n return;\n }\n\n for (const node of nodes) {\n await parseNode(node);\n }\n };\n\n for (const hierarchies of Object.values(dependencyHierarchies)) {\n await parseNodes(hierarchies.dependencies);\n await parseNodes(hierarchies.devDependencies);\n await parseNodes(hierarchies.optionalDependencies);\n await parseNodes(hierarchies.unsavedDependencies);\n }\n\n return {\n allowedPackages: foundAllowedPackages,\n allowedLicenses: packagesWithAllowedLicenses,\n noLicenses: packagesWithNoLicenses,\n forbiddenLicenses: packagesWithForbiddenLicenses\n };\n};\n"],"names":["pnpmDependencyScanning","options","workingDirectory","allowedLicenses","allowedPackages","includeDevDependencies","devDependenciesOnly","foundAllowedPackages","Set","packagesWithAllowedLicenses","packagesWithNoLicenses","packagesWithForbiddenLicenses","dependencyHierarchies","buildDependenciesHierarchy","depth","Infinity","include","dependencies","devDependencies","optionalDependencies","lockfileDir","virtualStoreDirMaxLength","parseNode","node","logger","verbose","name","packageJsonPath","join","path","packageJson","readPackageJson","isAllowedPackage","version","add","parseNodes","rawLicenseExpression","getLicenseExpression","licenseExpression","parseLicenseExpression","type","licenseIssues","calculateIssues","joinedIssues","joinStringArray","length","licenseIdentifiers","spdxExpression","licenses","nodes","hierarchies","Object","values","unsavedDependencies","noLicenses","forbiddenLicenses"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/license-cop/src/lib/dependency-scanning/pnpm.ts"],"sourcesContent":["import {\n buildDependenciesHierarchy,\n type PackageNode\n} from \"@pnpm/reviewing.dependencies-hierarchy\";\nimport { join } from \"node:path\";\nimport { getLicenseExpression, readPackageJson } from \"../dependency/package-json\";\nimport { isAllowedPackage } from \"../dependency/package-rules\";\nimport logger from \"../logger\";\nimport {\n AllowedPackage,\n CheckLicensesResult,\n ForbiddenLicenseResult,\n LicensedPackage,\n NoLicenseResult\n} from \"../result\";\nimport { calculateIssues } from \"../spdx/calculate-issues\";\nimport { parseLicenseExpression } from \"../spdx/parse-license-expression\";\nimport { joinStringArray } from \"../utils/join-string-array\";\nimport { DependencyScanningOptions } from \"./options\";\n\nexport const pnpmDependencyScanning = async (\n options: DependencyScanningOptions\n): Promise<CheckLicensesResult> => {\n const {\n workingDirectory,\n allowedLicenses,\n allowedPackages,\n includeDevDependencies,\n devDependenciesOnly\n } = options;\n\n const foundAllowedPackages = new Map<string, AllowedPackage>();\n const packagesWithAllowedLicenses = new Map<string, LicensedPackage>();\n const packagesWithNoLicenses = new Map<string, NoLicenseResult>();\n const packagesWithForbiddenLicenses = new Map<string, ForbiddenLicenseResult>();\n\n const dependencyHierarchies = await buildDependenciesHierarchy([workingDirectory], {\n depth: Infinity,\n include: {\n dependencies: !devDependenciesOnly,\n devDependencies: includeDevDependencies,\n optionalDependencies: false\n },\n lockfileDir: workingDirectory,\n virtualStoreDirMaxLength: Infinity\n });\n\n // This function is very similar to the one in npm.ts\n // If you change this, you probably want to change that one too\n const parseNode = async (node: PackageNode) => {\n logger.verbose(`Parsing node: ${node.name}`);\n\n const pkgId = `${node.alias}@${node.version}`;\n const packageJsonPath = join(node.path, \"package.json\");\n const packageJson = await readPackageJson(packageJsonPath);\n\n if (isAllowedPackage(packageJson.name, packageJson.version, allowedPackages)) {\n logger.verbose(`Package ${packageJson.name} is an allowed package`);\n foundAllowedPackages.set(pkgId, {\n name: packageJson.name,\n version: packageJson.version\n });\n\n await parseNodes(node.dependencies);\n return;\n }\n\n const rawLicenseExpression = getLicenseExpression(packageJson);\n const licenseExpression = parseLicenseExpression(rawLicenseExpression);\n\n if (licenseExpression.type === \"unlicensed\") {\n logger.verbose(`Package ${packageJson.name} is unlicensed`);\n packagesWithNoLicenses.set(pkgId, {\n name: packageJson.name,\n version: packageJson.version\n });\n\n await parseNodes(node.dependencies);\n return;\n }\n\n const licenseIssues = calculateIssues(licenseExpression, allowedLicenses);\n const joinedIssues = joinStringArray(licenseIssues);\n\n if (licenseIssues.length > 0) {\n logger.verbose(`Package ${packageJson.name} has the forbidden license: ${joinedIssues}`);\n packagesWithForbiddenLicenses.set(pkgId, {\n name: packageJson.name,\n version: packageJson.version,\n licenseIdentifiers: joinedIssues,\n spdxExpression: rawLicenseExpression\n });\n } else {\n logger.verbose(\n `Package ${packageJson.name} has the allowed license: ${rawLicenseExpression}`\n );\n packagesWithAllowedLicenses.set(pkgId, {\n name: packageJson.name,\n version: packageJson.version,\n spdxExpression: rawLicenseExpression,\n licenses: licenseExpression\n });\n }\n\n await parseNodes(node.dependencies);\n };\n\n const parseNodes = async (nodes: PackageNode[] | undefined) => {\n if (!nodes) {\n return;\n }\n\n for (const node of nodes) {\n await parseNode(node);\n }\n };\n\n for (const hierarchies of Object.values(dependencyHierarchies)) {\n await parseNodes(hierarchies.dependencies);\n await parseNodes(hierarchies.devDependencies);\n await parseNodes(hierarchies.optionalDependencies);\n await parseNodes(hierarchies.unsavedDependencies);\n }\n\n return {\n allowedPackages: new Set(foundAllowedPackages.values()),\n allowedLicenses: new Set(packagesWithAllowedLicenses.values()),\n noLicenses: new Set(packagesWithNoLicenses.values()),\n forbiddenLicenses: new Set(packagesWithForbiddenLicenses.values())\n };\n};\n"],"names":["pnpmDependencyScanning","options","workingDirectory","allowedLicenses","allowedPackages","includeDevDependencies","devDependenciesOnly","foundAllowedPackages","Map","packagesWithAllowedLicenses","packagesWithNoLicenses","packagesWithForbiddenLicenses","dependencyHierarchies","buildDependenciesHierarchy","depth","Infinity","include","dependencies","devDependencies","optionalDependencies","lockfileDir","virtualStoreDirMaxLength","parseNode","node","logger","verbose","name","pkgId","alias","version","packageJsonPath","join","path","packageJson","readPackageJson","isAllowedPackage","set","parseNodes","rawLicenseExpression","getLicenseExpression","licenseExpression","parseLicenseExpression","type","licenseIssues","calculateIssues","joinedIssues","joinStringArray","length","licenseIdentifiers","spdxExpression","licenses","nodes","hierarchies","Object","values","unsavedDependencies","Set","noLicenses","forbiddenLicenses"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}