license-cop 1.0.2 → 1.2.0

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.
Files changed (95) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +4 -0
  3. package/package.json +5 -5
  4. package/src/index.d.ts +2 -1
  5. package/src/index.js +16 -4
  6. package/src/index.js.map +1 -1
  7. package/src/lib/cli/commands/init.d.ts +4 -0
  8. package/src/lib/cli/commands/init.js +29 -0
  9. package/src/lib/cli/commands/init.js.map +1 -0
  10. package/src/lib/cli/commands/main.d.ts +6 -0
  11. package/src/lib/cli/commands/main.js +44 -0
  12. package/src/lib/cli/commands/main.js.map +1 -0
  13. package/src/lib/cli/commands/version.d.ts +4 -0
  14. package/src/lib/cli/commands/version.js +19 -0
  15. package/src/lib/cli/commands/version.js.map +1 -0
  16. package/src/lib/cli/create-command.d.ts +5 -0
  17. package/src/lib/cli/create-command.js +15 -0
  18. package/src/lib/cli/create-command.js.map +1 -0
  19. package/src/lib/cli/index.d.ts +1 -1
  20. package/src/lib/cli/index.js +8 -59
  21. package/src/lib/cli/index.js.map +1 -1
  22. package/src/lib/cli/report-failure.d.ts +2 -0
  23. package/src/lib/cli/report-failure.js +34 -0
  24. package/src/lib/cli/report-failure.js.map +1 -0
  25. package/src/lib/cli/report-success.d.ts +2 -0
  26. package/src/lib/cli/report-success.js +20 -0
  27. package/src/lib/cli/report-success.js.map +1 -0
  28. package/src/lib/config/config-error.d.ts +4 -0
  29. package/src/lib/config/config-error.js +25 -0
  30. package/src/lib/config/config-error.js.map +1 -0
  31. package/src/lib/config/config.js +2 -5
  32. package/src/lib/config/config.js.map +1 -1
  33. package/src/lib/config/find-config.js +9 -7
  34. package/src/lib/config/find-config.js.map +1 -1
  35. package/src/lib/config/load-config.js +4 -6
  36. package/src/lib/config/load-config.js.map +1 -1
  37. package/src/lib/config/load-parent-config.js +2 -4
  38. package/src/lib/config/load-parent-config.js.map +1 -1
  39. package/src/lib/config/parent-resolutions/github.d.ts +1 -1
  40. package/src/lib/config/parent-resolutions/github.js +12 -9
  41. package/src/lib/config/parent-resolutions/github.js.map +1 -1
  42. package/src/lib/config/parent-resolutions/http.js +3 -5
  43. package/src/lib/config/parent-resolutions/http.js.map +1 -1
  44. package/src/lib/config/parent-resolutions/npm.js +2 -3
  45. package/src/lib/config/parent-resolutions/npm.js.map +1 -1
  46. package/src/lib/config/parsers/json5.js +2 -6
  47. package/src/lib/config/parsers/json5.js.map +1 -1
  48. package/src/lib/license-cop.d.ts +2 -1
  49. package/src/lib/license-cop.js +70 -37
  50. package/src/lib/license-cop.js.map +1 -1
  51. package/src/lib/logger.d.ts +8 -0
  52. package/src/lib/logger.js +39 -0
  53. package/src/lib/logger.js.map +1 -0
  54. package/src/lib/package-json.d.ts +33 -3
  55. package/src/lib/package-json.js +41 -8
  56. package/src/lib/package-json.js.map +1 -1
  57. package/src/lib/package-rules.d.ts +0 -1
  58. package/src/lib/package-rules.js +3 -15
  59. package/src/lib/package-rules.js.map +1 -1
  60. package/src/lib/result.d.ts +27 -0
  61. package/src/lib/result.js +3 -0
  62. package/src/lib/result.js.map +1 -0
  63. package/src/lib/spdx/calculate-issues.d.ts +2 -0
  64. package/src/lib/spdx/calculate-issues.js +43 -0
  65. package/src/lib/spdx/calculate-issues.js.map +1 -0
  66. package/src/lib/spdx/get-tokens.d.ts +2 -0
  67. package/src/lib/spdx/get-tokens.js +52 -0
  68. package/src/lib/spdx/get-tokens.js.map +1 -0
  69. package/src/lib/spdx/parse-license-expression.d.ts +2 -0
  70. package/src/lib/spdx/parse-license-expression.js +18 -0
  71. package/src/lib/spdx/parse-license-expression.js.map +1 -0
  72. package/src/lib/spdx/parse-tokens.d.ts +3 -0
  73. package/src/lib/spdx/parse-tokens.js +118 -0
  74. package/src/lib/spdx/parse-tokens.js.map +1 -0
  75. package/src/lib/spdx/types/spdx-expression.d.ts +20 -0
  76. package/src/lib/spdx/types/spdx-expression.js +3 -0
  77. package/src/lib/spdx/types/spdx-expression.js.map +1 -0
  78. package/src/lib/spdx/types/token.d.ts +23 -0
  79. package/src/lib/spdx/types/token.js +25 -0
  80. package/src/lib/spdx/types/token.js.map +1 -0
  81. package/src/lib/utils/join-string-array.d.ts +1 -0
  82. package/src/lib/utils/join-string-array.js +26 -0
  83. package/src/lib/utils/join-string-array.js.map +1 -0
  84. package/src/lib/cli/arguments.d.ts +0 -18
  85. package/src/lib/cli/arguments.js +0 -23
  86. package/src/lib/cli/arguments.js.map +0 -1
  87. package/src/lib/cli/init.d.ts +0 -1
  88. package/src/lib/cli/init.js +0 -24
  89. package/src/lib/cli/init.js.map +0 -1
  90. package/src/lib/cli/version.d.ts +0 -1
  91. package/src/lib/cli/version.js +0 -17
  92. package/src/lib/cli/version.js.map +0 -1
  93. package/src/lib/violations-error.d.ts +0 -9
  94. package/src/lib/violations-error.js +0 -16
  95. package/src/lib/violations-error.js.map +0 -1
@@ -1,7 +1,4 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
2
  Object.defineProperty(exports, "loadParentConfig", {
6
3
  enumerable: true,
7
4
  get: ()=>loadParentConfig
@@ -9,6 +6,7 @@ Object.defineProperty(exports, "loadParentConfig", {
9
6
  const _github = require("./parent-resolutions/github");
10
7
  const _npm = require("./parent-resolutions/npm");
11
8
  const _http = require("./parent-resolutions/http");
9
+ const _configError = require("./config-error");
12
10
  const loadParentConfig = async (parentConfigPath, rootDir)=>{
13
11
  if (parentConfigPath.startsWith("npm:")) {
14
12
  const packageName = parentConfigPath.substring(4);
@@ -24,7 +22,7 @@ const loadParentConfig = async (parentConfigPath, rootDir)=>{
24
22
  if (await (0, _npm.nodeModuleExists)(parentConfigPath, rootDir)) {
25
23
  return await (0, _npm.npmResolution)(parentConfigPath, rootDir);
26
24
  }
27
- throw new Error(`Invalid parent config location: ${parentConfigPath}`);
25
+ throw new _configError.ConfigError(`Invalid parent config location: ${parentConfigPath}`);
28
26
  };
29
27
 
30
28
  //# sourceMappingURL=load-parent-config.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/license-cop/src/lib/config/load-parent-config.ts"],"sourcesContent":["import { githubResolution } from \"./parent-resolutions/github\";\nimport { nodeModuleExists, npmResolution } from \"./parent-resolutions/npm\";\nimport { httpResolution } from \"./parent-resolutions/http\";\n\nexport const loadParentConfig = async (\n parentConfigPath: string,\n rootDir: string\n): Promise<unknown> => {\n if (parentConfigPath.startsWith(\"npm:\")) {\n const packageName = parentConfigPath.substring(4);\n return await npmResolution(packageName, rootDir);\n }\n\n if (parentConfigPath.startsWith(\"github:\")) {\n const repo = parentConfigPath.substring(7);\n return await githubResolution(repo);\n }\n\n if (parentConfigPath.startsWith(\"http\")) {\n return await httpResolution(parentConfigPath);\n }\n\n if (await nodeModuleExists(parentConfigPath, rootDir)) {\n return await npmResolution(parentConfigPath, rootDir);\n }\n\n throw new Error(`Invalid parent config location: ${parentConfigPath}`);\n};\n"],"names":["loadParentConfig","parentConfigPath","rootDir","startsWith","packageName","substring","npmResolution","repo","githubResolution","httpResolution","nodeModuleExists","Error"],"mappings":";;;;+BAIaA;;aAAAA;;wBAJoB;qBACe;sBACjB;AAExB,MAAMA,mBAAmB,OAC9BC,kBACAC,UACqB;IACrB,IAAID,iBAAiBE,UAAU,CAAC,SAAS;QACvC,MAAMC,cAAcH,iBAAiBI,SAAS,CAAC;QAC/C,OAAO,MAAMC,IAAAA,kBAAa,EAACF,aAAaF;IAC1C,CAAC;IAED,IAAID,iBAAiBE,UAAU,CAAC,YAAY;QAC1C,MAAMI,OAAON,iBAAiBI,SAAS,CAAC;QACxC,OAAO,MAAMG,IAAAA,wBAAgB,EAACD;IAChC,CAAC;IAED,IAAIN,iBAAiBE,UAAU,CAAC,SAAS;QACvC,OAAO,MAAMM,IAAAA,oBAAc,EAACR;IAC9B,CAAC;IAED,IAAI,MAAMS,IAAAA,qBAAgB,EAACT,kBAAkBC,UAAU;QACrD,OAAO,MAAMI,IAAAA,kBAAa,EAACL,kBAAkBC;IAC/C,CAAC;IAED,MAAM,IAAIS,MAAM,CAAC,gCAAgC,EAAEV,iBAAiB,CAAC,EAAE;AACzE"}
1
+ {"version":3,"sources":["../../../../../../packages/license-cop/src/lib/config/load-parent-config.ts"],"sourcesContent":["import { githubResolution } from \"./parent-resolutions/github\";\nimport { nodeModuleExists, npmResolution } from \"./parent-resolutions/npm\";\nimport { httpResolution } from \"./parent-resolutions/http\";\nimport { ConfigError } from \"./config-error\";\n\nexport const loadParentConfig = async (\n parentConfigPath: string,\n rootDir: string\n): Promise<unknown> => {\n if (parentConfigPath.startsWith(\"npm:\")) {\n const packageName = parentConfigPath.substring(4);\n return await npmResolution(packageName, rootDir);\n }\n\n if (parentConfigPath.startsWith(\"github:\")) {\n const repo = parentConfigPath.substring(7);\n return await githubResolution(repo);\n }\n\n if (parentConfigPath.startsWith(\"http\")) {\n return await httpResolution(parentConfigPath);\n }\n\n if (await nodeModuleExists(parentConfigPath, rootDir)) {\n return await npmResolution(parentConfigPath, rootDir);\n }\n\n throw new ConfigError(`Invalid parent config location: ${parentConfigPath}`);\n};\n"],"names":["loadParentConfig","parentConfigPath","rootDir","startsWith","packageName","substring","npmResolution","repo","githubResolution","httpResolution","nodeModuleExists","ConfigError"],"mappings":";+BAKaA;;aAAAA;;wBALoB;qBACe;sBACjB;6BACH;AAErB,MAAMA,mBAAmB,OAC9BC,kBACAC,UACqB;IACrB,IAAID,iBAAiBE,UAAU,CAAC,SAAS;QACvC,MAAMC,cAAcH,iBAAiBI,SAAS,CAAC;QAC/C,OAAO,MAAMC,IAAAA,kBAAa,EAACF,aAAaF;IAC1C,CAAC;IAED,IAAID,iBAAiBE,UAAU,CAAC,YAAY;QAC1C,MAAMI,OAAON,iBAAiBI,SAAS,CAAC;QACxC,OAAO,MAAMG,IAAAA,wBAAgB,EAACD;IAChC,CAAC;IAED,IAAIN,iBAAiBE,UAAU,CAAC,SAAS;QACvC,OAAO,MAAMM,IAAAA,oBAAc,EAACR;IAC9B,CAAC;IAED,IAAI,MAAMS,IAAAA,qBAAgB,EAACT,kBAAkBC,UAAU;QACrD,OAAO,MAAMI,IAAAA,kBAAa,EAACL,kBAAkBC;IAC/C,CAAC;IAED,MAAM,IAAIS,wBAAW,CAAC,CAAC,gCAAgC,EAAEV,iBAAiB,CAAC,EAAE;AAC/E"}
@@ -1 +1 @@
1
- export declare const githubResolution: (repoId: string) => Promise<any>;
1
+ export declare const githubResolution: (repoId: string) => Promise<unknown>;
@@ -1,23 +1,26 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
2
  Object.defineProperty(exports, "githubResolution", {
6
3
  enumerable: true,
7
4
  get: ()=>githubResolution
8
5
  });
9
- const _interopRequireDefault = require("@swc/helpers/lib/_interop_require_default.js").default;
10
6
  const _gitFilesystem = require("git-filesystem");
11
- const _json5 = /*#__PURE__*/ _interopRequireDefault(require("json5"));
7
+ const _logger = require("../../logger");
8
+ const _configError = require("../config-error");
9
+ const _json5 = require("../parsers/json5");
12
10
  const githubResolution = async (repoId)=>{
11
+ _logger.default.verbose(`Resolving config from GitHub repo: ${repoId}`);
13
12
  const parts = repoId.split("/");
14
13
  if (parts.length !== 2 || parts[0].length === 0 || parts[1].length === 0) {
15
- throw new Error(`Invalid GitHub repo ID: ${repoId}`);
14
+ throw new _configError.ConfigError(`Invalid GitHub repo ID: ${repoId}`);
16
15
  }
17
16
  const [owner, repoName] = parts;
18
- const repo = new _gitFilesystem.GitHubClient(owner, "", "license-cop").getReadonlyRepository(repoName);
19
- const fileContent = await repo.readFile(".licenses.json");
20
- return _json5.default.parse(fileContent);
17
+ try {
18
+ const repo = new _gitFilesystem.GitHubClient(owner, "", "license-cop").getReadonlyRepository(repoName);
19
+ const fileContent = await repo.readFile(".licenses.json");
20
+ return (0, _json5.json5Parse)(fileContent);
21
+ } catch (e) {
22
+ throw new _configError.ConfigError(`Could not resolve config from GitHub repo: ${repoId}, error: ${JSON.stringify(e)}`);
23
+ }
21
24
  };
22
25
 
23
26
  //# sourceMappingURL=github.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/license-cop/src/lib/config/parent-resolutions/github.ts"],"sourcesContent":["import { GitHubClient } from \"git-filesystem\";\nimport JSON5 from \"json5\";\n\nexport const githubResolution = async (repoId: string) => {\n const parts = repoId.split(\"/\");\n\n if (parts.length !== 2 || parts[0].length === 0 || parts[1].length === 0) {\n throw new Error(`Invalid GitHub repo ID: ${repoId}`);\n }\n\n const [owner, repoName] = parts;\n\n const repo = new GitHubClient(owner, \"\", \"license-cop\").getReadonlyRepository(repoName);\n const fileContent = await repo.readFile(\".licenses.json\");\n\n return JSON5.parse(fileContent);\n};\n"],"names":["githubResolution","repoId","parts","split","length","Error","owner","repoName","repo","GitHubClient","getReadonlyRepository","fileContent","readFile","JSON5","parse"],"mappings":";;;;+BAGaA;;aAAAA;;;+BAHgB;4DACX;AAEX,MAAMA,mBAAmB,OAAOC,SAAmB;IACxD,MAAMC,QAAQD,OAAOE,KAAK,CAAC;IAE3B,IAAID,MAAME,MAAM,KAAK,KAAKF,KAAK,CAAC,EAAE,CAACE,MAAM,KAAK,KAAKF,KAAK,CAAC,EAAE,CAACE,MAAM,KAAK,GAAG;QACxE,MAAM,IAAIC,MAAM,CAAC,wBAAwB,EAAEJ,OAAO,CAAC,EAAE;IACvD,CAAC;IAED,MAAM,CAACK,OAAOC,SAAS,GAAGL;IAE1B,MAAMM,OAAO,IAAIC,2BAAY,CAACH,OAAO,IAAI,eAAeI,qBAAqB,CAACH;IAC9E,MAAMI,cAAc,MAAMH,KAAKI,QAAQ,CAAC;IAExC,OAAOC,cAAK,CAACC,KAAK,CAACH;AACrB"}
1
+ {"version":3,"sources":["../../../../../../../packages/license-cop/src/lib/config/parent-resolutions/github.ts"],"sourcesContent":["import { GitHubClient } from \"git-filesystem\";\nimport logger from \"../../logger\";\nimport { ConfigError } from \"../config-error\";\nimport { json5Parse } from \"../parsers/json5\";\n\nexport const githubResolution = async (repoId: string) => {\n logger.verbose(`Resolving config from GitHub repo: ${repoId}`);\n\n const parts = repoId.split(\"/\");\n\n if (parts.length !== 2 || parts[0].length === 0 || parts[1].length === 0) {\n throw new ConfigError(`Invalid GitHub repo ID: ${repoId}`);\n }\n\n const [owner, repoName] = parts;\n\n try {\n const repo = new GitHubClient(owner, \"\", \"license-cop\").getReadonlyRepository(repoName);\n const fileContent = await repo.readFile(\".licenses.json\");\n\n return json5Parse(fileContent);\n } catch (e) {\n throw new ConfigError(\n `Could not resolve config from GitHub repo: ${repoId}, error: ${JSON.stringify(e)}`\n );\n }\n};\n"],"names":["githubResolution","repoId","logger","verbose","parts","split","length","ConfigError","owner","repoName","repo","GitHubClient","getReadonlyRepository","fileContent","readFile","json5Parse","e","JSON","stringify"],"mappings":";+BAKaA;;aAAAA;;+BALgB;wBACV;6BACS;uBACD;AAEpB,MAAMA,mBAAmB,OAAOC,SAAmB;IACxDC,eAAM,CAACC,OAAO,CAAC,CAAC,mCAAmC,EAAEF,OAAO,CAAC;IAE7D,MAAMG,QAAQH,OAAOI,KAAK,CAAC;IAE3B,IAAID,MAAME,MAAM,KAAK,KAAKF,KAAK,CAAC,EAAE,CAACE,MAAM,KAAK,KAAKF,KAAK,CAAC,EAAE,CAACE,MAAM,KAAK,GAAG;QACxE,MAAM,IAAIC,wBAAW,CAAC,CAAC,wBAAwB,EAAEN,OAAO,CAAC,EAAE;IAC7D,CAAC;IAED,MAAM,CAACO,OAAOC,SAAS,GAAGL;IAE1B,IAAI;QACF,MAAMM,OAAO,IAAIC,2BAAY,CAACH,OAAO,IAAI,eAAeI,qBAAqB,CAACH;QAC9E,MAAMI,cAAc,MAAMH,KAAKI,QAAQ,CAAC;QAExC,OAAOC,IAAAA,iBAAU,EAACF;IACpB,EAAE,OAAOG,GAAG;QACV,MAAM,IAAIT,wBAAW,CACnB,CAAC,2CAA2C,EAAEN,OAAO,SAAS,EAAEgB,KAAKC,SAAS,CAACF,GAAG,CAAC,EACnF;IACJ;AACF"}
@@ -1,15 +1,13 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
2
  Object.defineProperty(exports, "httpResolution", {
6
3
  enumerable: true,
7
4
  get: ()=>httpResolution
8
5
  });
9
- const _interopRequireDefault = require("@swc/helpers/lib/_interop_require_default.js").default;
10
- const _axios = /*#__PURE__*/ _interopRequireDefault(require("axios"));
6
+ const _axios = require("axios");
7
+ const _logger = require("../../logger");
11
8
  const _json5 = require("../parsers/json5");
12
9
  const httpResolution = async (url)=>{
10
+ _logger.default.verbose(`Resolving http config: ${url}`);
13
11
  const response = await _axios.default.get(url);
14
12
  if (typeof response.data === "string") {
15
13
  return await (0, _json5.json5Parse)(response.data);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/license-cop/src/lib/config/parent-resolutions/http.ts"],"sourcesContent":["import axios from \"axios\";\nimport { json5Parse } from \"../parsers/json5\";\n\nexport const httpResolution = async (url: string) => {\n const response = await axios.get(url);\n\n if (typeof response.data === \"string\") {\n return await json5Parse(response.data);\n }\n\n return response.data;\n};\n"],"names":["httpResolution","url","response","axios","get","data","json5Parse"],"mappings":";;;;+BAGaA;;aAAAA;;;4DAHK;uBACS;AAEpB,MAAMA,iBAAiB,OAAOC,MAAgB;IACnD,MAAMC,WAAW,MAAMC,cAAK,CAACC,GAAG,CAACH;IAEjC,IAAI,OAAOC,SAASG,IAAI,KAAK,UAAU;QACrC,OAAO,MAAMC,IAAAA,iBAAU,EAACJ,SAASG,IAAI;IACvC,CAAC;IAED,OAAOH,SAASG,IAAI;AACtB"}
1
+ {"version":3,"sources":["../../../../../../../packages/license-cop/src/lib/config/parent-resolutions/http.ts"],"sourcesContent":["import axios from \"axios\";\nimport logger from \"../../logger\";\nimport { json5Parse } from \"../parsers/json5\";\n\nexport const httpResolution = async (url: string) => {\n logger.verbose(`Resolving http config: ${url}`);\n\n const response = await axios.get(url);\n\n if (typeof response.data === \"string\") {\n return await json5Parse(response.data);\n }\n\n return response.data;\n};\n"],"names":["httpResolution","url","logger","verbose","response","axios","get","data","json5Parse"],"mappings":";+BAIaA;;aAAAA;;uBAJK;wBACC;uBACQ;AAEpB,MAAMA,iBAAiB,OAAOC,MAAgB;IACnDC,eAAM,CAACC,OAAO,CAAC,CAAC,uBAAuB,EAAEF,IAAI,CAAC;IAE9C,MAAMG,WAAW,MAAMC,cAAK,CAACC,GAAG,CAACL;IAEjC,IAAI,OAAOG,SAASG,IAAI,KAAK,UAAU;QACrC,OAAO,MAAMC,IAAAA,iBAAU,EAACJ,SAASG,IAAI;IACvC,CAAC;IAED,OAAOH,SAASG,IAAI;AACtB"}
@@ -1,7 +1,4 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
2
  function _export(target, all) {
6
3
  for(var name in all)Object.defineProperty(target, name, {
7
4
  enumerable: true,
@@ -14,8 +11,10 @@ _export(exports, {
14
11
  });
15
12
  const _promises = require("fs/promises");
16
13
  const _path = require("path");
14
+ const _logger = require("../../logger");
17
15
  const _findConfig = require("../find-config");
18
16
  const npmResolution = async (packageName, rootDir)=>{
17
+ _logger.default.verbose(`Resolving npm package: ${packageName}`);
19
18
  const packagePath = getPackagePath(rootDir, packageName);
20
19
  return await (0, _findConfig.findConfig)(packagePath);
21
20
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/license-cop/src/lib/config/parent-resolutions/npm.ts"],"sourcesContent":["import { stat } from \"fs/promises\";\nimport { join } from \"path\";\nimport { findConfig } from \"../find-config\";\n\nexport const npmResolution = async (packageName: string, rootDir: string) => {\n const packagePath = getPackagePath(rootDir, packageName);\n return await findConfig(packagePath);\n};\n\nexport const nodeModuleExists = async (packageName: string, rootDir: string) => {\n const packagePath = getPackagePath(rootDir, packageName);\n\n const statResult = await stat(packagePath);\n return statResult.isDirectory();\n};\n\nconst getPackagePath = (rootDir: string, packageName: string) =>\n join(rootDir, \"node_modules\", packageName);\n"],"names":["npmResolution","nodeModuleExists","packageName","rootDir","packagePath","getPackagePath","findConfig","statResult","stat","isDirectory","join"],"mappings":";;;;;;;;;;;IAIaA,aAAa,MAAbA;IAKAC,gBAAgB,MAAhBA;;0BATQ;sBACA;4BACM;AAEpB,MAAMD,gBAAgB,OAAOE,aAAqBC,UAAoB;IAC3E,MAAMC,cAAcC,eAAeF,SAASD;IAC5C,OAAO,MAAMI,IAAAA,sBAAU,EAACF;AAC1B;AAEO,MAAMH,mBAAmB,OAAOC,aAAqBC,UAAoB;IAC9E,MAAMC,cAAcC,eAAeF,SAASD;IAE5C,MAAMK,aAAa,MAAMC,IAAAA,cAAI,EAACJ;IAC9B,OAAOG,WAAWE,WAAW;AAC/B;AAEA,MAAMJ,iBAAiB,CAACF,SAAiBD,cACvCQ,IAAAA,UAAI,EAACP,SAAS,gBAAgBD"}
1
+ {"version":3,"sources":["../../../../../../../packages/license-cop/src/lib/config/parent-resolutions/npm.ts"],"sourcesContent":["import { stat } from \"fs/promises\";\nimport { join } from \"path\";\nimport logger from \"../../logger\";\nimport { findConfig } from \"../find-config\";\n\nexport const npmResolution = async (packageName: string, rootDir: string) => {\n logger.verbose(`Resolving npm package: ${packageName}`);\n\n const packagePath = getPackagePath(rootDir, packageName);\n return await findConfig(packagePath);\n};\n\nexport const nodeModuleExists = async (packageName: string, rootDir: string) => {\n const packagePath = getPackagePath(rootDir, packageName);\n\n const statResult = await stat(packagePath);\n return statResult.isDirectory();\n};\n\nconst getPackagePath = (rootDir: string, packageName: string) =>\n join(rootDir, \"node_modules\", packageName);\n"],"names":["npmResolution","nodeModuleExists","packageName","rootDir","logger","verbose","packagePath","getPackagePath","findConfig","statResult","stat","isDirectory","join"],"mappings":";;;;;;;;IAKaA,aAAa,MAAbA;IAOAC,gBAAgB,MAAhBA;;0BAZQ;sBACA;wBACF;4BACQ;AAEpB,MAAMD,gBAAgB,OAAOE,aAAqBC,UAAoB;IAC3EC,eAAM,CAACC,OAAO,CAAC,CAAC,uBAAuB,EAAEH,YAAY,CAAC;IAEtD,MAAMI,cAAcC,eAAeJ,SAASD;IAC5C,OAAO,MAAMM,IAAAA,sBAAU,EAACF;AAC1B;AAEO,MAAML,mBAAmB,OAAOC,aAAqBC,UAAoB;IAC9E,MAAMG,cAAcC,eAAeJ,SAASD;IAE5C,MAAMO,aAAa,MAAMC,IAAAA,cAAI,EAACJ;IAC9B,OAAOG,WAAWE,WAAW;AAC/B;AAEA,MAAMJ,iBAAiB,CAACJ,SAAiBD,cACvCU,IAAAA,UAAI,EAACT,SAAS,gBAAgBD"}
@@ -1,13 +1,9 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
2
  Object.defineProperty(exports, "json5Parse", {
6
3
  enumerable: true,
7
4
  get: ()=>json5Parse
8
5
  });
9
- const _interopRequireDefault = require("@swc/helpers/lib/_interop_require_default.js").default;
10
- const _json5 = /*#__PURE__*/ _interopRequireDefault(require("json5"));
11
- const json5Parse = (content)=>_json5.default.parse(content);
6
+ const _json5 = require("json5");
7
+ const json5Parse = (content)=>_json5.parse(content);
12
8
 
13
9
  //# sourceMappingURL=json5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/license-cop/src/lib/config/parsers/json5.ts"],"sourcesContent":["import JSON5 from \"json5\";\n\nexport const json5Parse = <T>(content: string): T => JSON5.parse<T>(content);\n"],"names":["json5Parse","content","JSON5","parse"],"mappings":";;;;+BAEaA;;aAAAA;;;4DAFK;AAEX,MAAMA,aAAa,CAAIC,UAAuBC,cAAK,CAACC,KAAK,CAAIF"}
1
+ {"version":3,"sources":["../../../../../../../packages/license-cop/src/lib/config/parsers/json5.ts"],"sourcesContent":["import * as JSON5 from \"json5\";\n\nexport const json5Parse = <T>(content: string): T => JSON5.parse<T>(content);\n"],"names":["json5Parse","content","JSON5","parse"],"mappings":";+BAEaA;;aAAAA;;uBAFU;AAEhB,MAAMA,aAAa,CAAIC,UAAuBC,OAAMC,KAAK,CAAIF"}
@@ -1,3 +1,4 @@
1
+ import { CheckLicensesResult } from "./result";
1
2
  export interface LicenseCopOptions {
2
3
  allowedLicenses: string[];
3
4
  allowedPackages: string[];
@@ -5,4 +6,4 @@ export interface LicenseCopOptions {
5
6
  includeDevDependencies?: boolean;
6
7
  devDependenciesOnly?: boolean;
7
8
  }
8
- export declare const checkLicenses: (options: LicenseCopOptions) => Promise<void>;
9
+ export declare const checkLicenses: (options: LicenseCopOptions) => Promise<CheckLicensesResult>;
@@ -1,60 +1,93 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
2
  Object.defineProperty(exports, "checkLicenses", {
6
3
  enumerable: true,
7
4
  get: ()=>checkLicenses
8
5
  });
9
- const _interopRequireDefault = require("@swc/helpers/lib/_interop_require_default.js").default;
10
- const _arborist = /*#__PURE__*/ _interopRequireDefault(require("@npmcli/arborist"));
6
+ const _arborist = require("@npmcli/arborist");
11
7
  const _path = require("path");
8
+ const _logger = require("./logger");
12
9
  const _packageJson = require("./package-json");
13
10
  const _packageRules = require("./package-rules");
14
- const _violationsError = require("./violations-error");
11
+ const _calculateIssues = require("./spdx/calculate-issues");
12
+ const _joinStringArray = require("./utils/join-string-array");
13
+ const _parseLicenseExpression = require("./spdx/parse-license-expression");
15
14
  const checkLicenses = async (options)=>{
16
15
  const { workingDirectory , allowedLicenses , allowedPackages , includeDevDependencies , devDependenciesOnly } = options;
17
- const allLicenses = new Set();
18
- const packageViolations = new Set();
16
+ const foundAllowedPackages = new Set();
17
+ const packagesWithAllowedLicenses = new Set();
18
+ const packagesWithNoLicenses = new Set();
19
+ const packagesWithForbiddenLicenses = new Set();
19
20
  const path = resolvePath(workingDirectory);
20
- const arborist = new _arborist.default({
21
+ const arborist = new _arborist({
21
22
  path
22
23
  });
23
24
  const topNode = await arborist.loadActual();
24
- console.log("Scanning dependencies of:", topNode.name);
25
- const parseNodes = async (nodes)=>{
26
- for (const node of nodes){
27
- const isDevDependency = node.dev || node.devOptional;
28
- if (!includeDevDependencies && !devDependenciesOnly && isDevDependency) {
29
- continue;
30
- }
31
- if (devDependenciesOnly && !isDevDependency) {
32
- continue;
33
- }
34
- const packageJsonPath = (0, _path.join)(node.realpath, "package.json");
35
- const packageJson = await (0, _packageJson.readPackageJson)(packageJsonPath);
36
- var _packageJson_license;
37
- const license = (_packageJson_license = packageJson.license) != null ? _packageJson_license : "UNLICENSED";
38
- allLicenses.add(license);
39
- if ((0, _packageRules.isAllowedPackage)(node.name, packageJson.version, allowedPackages)) {
40
- continue;
41
- }
42
- if (!(0, _packageRules.isAllowedLicense)(license, allowedLicenses)) {
43
- packageViolations.add({
44
- packageName: node.name,
45
- packageVersion: packageJson.version,
46
- license
47
- });
25
+ const parseNode = async (node)=>{
26
+ _logger.default.verbose(`Parsing node: ${node.name}`);
27
+ const isDevDependency = node.dev;
28
+ if (!includeDevDependencies && !devDependenciesOnly && isDevDependency) {
29
+ return;
30
+ }
31
+ if (devDependenciesOnly && !isDevDependency) {
32
+ return;
33
+ }
34
+ const packageJsonPath = (0, _path.join)(node.realpath, "package.json");
35
+ const packageJson = await (0, _packageJson.readPackageJson)(packageJsonPath);
36
+ if ((0, _packageRules.isAllowedPackage)(node.name, packageJson.version, allowedPackages)) {
37
+ foundAllowedPackages.add({
38
+ name: packageJson.name,
39
+ version: packageJson.version
40
+ });
41
+ if (node.children.size > 0) {
42
+ await parseNodes(node.children.values());
48
43
  }
44
+ return;
45
+ }
46
+ const rawLicenseExpression = (0, _packageJson.getLicenseExpression)(packageJson);
47
+ const licenseExpression = (0, _parseLicenseExpression.parseLicenseExpression)(rawLicenseExpression);
48
+ if (licenseExpression.type === "unlicensed") {
49
+ packagesWithNoLicenses.add({
50
+ name: packageJson.name,
51
+ version: packageJson.version
52
+ });
49
53
  if (node.children.size > 0) {
50
- parseNodes(node.children.values());
54
+ await parseNodes(node.children.values());
51
55
  }
56
+ return;
57
+ }
58
+ const licenseIssues = (0, _calculateIssues.calculateIssues)(licenseExpression, allowedLicenses);
59
+ const joinedIssues = (0, _joinStringArray.joinStringArray)(licenseIssues);
60
+ if (licenseIssues.length > 0) {
61
+ packagesWithForbiddenLicenses.add({
62
+ name: packageJson.name,
63
+ version: packageJson.version,
64
+ licenseIdentifiers: joinedIssues,
65
+ spdxExpression: rawLicenseExpression
66
+ });
67
+ } else {
68
+ packagesWithAllowedLicenses.add({
69
+ name: packageJson.name,
70
+ version: packageJson.version,
71
+ spdxExpression: rawLicenseExpression,
72
+ licenses: licenseExpression
73
+ });
74
+ }
75
+ if (node.children.size > 0) {
76
+ parseNodes(node.children.values());
77
+ }
78
+ };
79
+ const parseNodes = async (nodes)=>{
80
+ for (const node of nodes){
81
+ await parseNode(node);
52
82
  }
53
83
  };
54
84
  await parseNodes(topNode.children.values());
55
- if (packageViolations.size > 0) {
56
- throw new _violationsError.ViolationsError(packageViolations);
57
- }
85
+ return {
86
+ allowedPackages: foundAllowedPackages,
87
+ allowedLicenses: packagesWithAllowedLicenses,
88
+ noLicenses: packagesWithNoLicenses,
89
+ forbiddenLicenses: packagesWithForbiddenLicenses
90
+ };
58
91
  };
59
92
  const resolvePath = (path)=>{
60
93
  if (!path) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/license-cop/src/lib/license-cop.ts"],"sourcesContent":["import Arborist, { Node, Link } from \"@npmcli/arborist\";\nimport { isAbsolute, join } from \"path\";\nimport { readPackageJson } from \"./package-json\";\nimport { isAllowedLicense, isAllowedPackage } from \"./package-rules\";\nimport { Violation, ViolationsError } from \"./violations-error\";\n\nexport interface LicenseCopOptions {\n allowedLicenses: string[];\n allowedPackages: string[];\n workingDirectory?: string;\n includeDevDependencies?: boolean;\n devDependenciesOnly?: boolean;\n}\n\nexport const checkLicenses = async (options: LicenseCopOptions): Promise<void> => {\n const {\n workingDirectory,\n allowedLicenses,\n allowedPackages,\n includeDevDependencies,\n devDependenciesOnly\n } = options;\n\n const allLicenses = new Set<string>();\n const packageViolations = new Set<Violation>();\n\n const path = resolvePath(workingDirectory);\n\n const arborist = new Arborist({\n path\n });\n\n const topNode = await arborist.loadActual();\n\n console.log(\"Scanning dependencies of:\", topNode.name);\n\n const parseNodes = async (nodes: IterableIterator<Node | Link>) => {\n for (const node of nodes) {\n const isDevDependency = node.dev || node.devOptional;\n\n if (!includeDevDependencies && !devDependenciesOnly && isDevDependency) {\n continue;\n }\n\n if (devDependenciesOnly && !isDevDependency) {\n continue;\n }\n\n const packageJsonPath = join(node.realpath, \"package.json\");\n const packageJson = await readPackageJson(packageJsonPath);\n\n const license = packageJson.license ?? \"UNLICENSED\";\n\n allLicenses.add(license);\n\n if (isAllowedPackage(node.name, packageJson.version, allowedPackages)) {\n continue;\n }\n\n if (!isAllowedLicense(license, allowedLicenses)) {\n packageViolations.add({\n packageName: node.name,\n packageVersion: packageJson.version,\n license\n });\n }\n\n if (node.children.size > 0) {\n parseNodes(node.children.values());\n }\n }\n };\n\n await parseNodes(topNode.children.values());\n\n if (packageViolations.size > 0) {\n throw new ViolationsError(packageViolations);\n }\n};\n\nconst resolvePath = (path?: string): string => {\n if (!path) {\n return process.cwd();\n }\n\n return isAbsolute(path) ? path : join(process.cwd(), path);\n};\n"],"names":["checkLicenses","options","workingDirectory","allowedLicenses","allowedPackages","includeDevDependencies","devDependenciesOnly","allLicenses","Set","packageViolations","path","resolvePath","arborist","Arborist","topNode","loadActual","console","log","name","parseNodes","nodes","node","isDevDependency","dev","devOptional","packageJsonPath","join","realpath","packageJson","readPackageJson","license","add","isAllowedPackage","version","isAllowedLicense","packageName","packageVersion","children","size","values","ViolationsError","process","cwd","isAbsolute"],"mappings":";;;;+BAcaA;;aAAAA;;;+DAdwB;sBACJ;6BACD;8BACmB;iCACR;AAUpC,MAAMA,gBAAgB,OAAOC,UAA8C;IAChF,MAAM,EACJC,iBAAgB,EAChBC,gBAAe,EACfC,gBAAe,EACfC,uBAAsB,EACtBC,oBAAmB,EACpB,GAAGL;IAEJ,MAAMM,cAAc,IAAIC;IACxB,MAAMC,oBAAoB,IAAID;IAE9B,MAAME,OAAOC,YAAYT;IAEzB,MAAMU,WAAW,IAAIC,iBAAQ,CAAC;QAC5BH;IACF;IAEA,MAAMI,UAAU,MAAMF,SAASG,UAAU;IAEzCC,QAAQC,GAAG,CAAC,6BAA6BH,QAAQI,IAAI;IAErD,MAAMC,aAAa,OAAOC,QAAyC;QACjE,KAAK,MAAMC,QAAQD,MAAO;YACxB,MAAME,kBAAkBD,KAAKE,GAAG,IAAIF,KAAKG,WAAW;YAEpD,IAAI,CAACnB,0BAA0B,CAACC,uBAAuBgB,iBAAiB;gBACtE,QAAS;YACX,CAAC;YAED,IAAIhB,uBAAuB,CAACgB,iBAAiB;gBAC3C,QAAS;YACX,CAAC;YAED,MAAMG,kBAAkBC,IAAAA,UAAI,EAACL,KAAKM,QAAQ,EAAE;YAC5C,MAAMC,cAAc,MAAMC,IAAAA,4BAAe,EAACJ;gBAE1BG;YAAhB,MAAME,UAAUF,CAAAA,uBAAAA,YAAYE,OAAO,YAAnBF,uBAAuB,YAAY;YAEnDrB,YAAYwB,GAAG,CAACD;YAEhB,IAAIE,IAAAA,8BAAgB,EAACX,KAAKH,IAAI,EAAEU,YAAYK,OAAO,EAAE7B,kBAAkB;gBACrE,QAAS;YACX,CAAC;YAED,IAAI,CAAC8B,IAAAA,8BAAgB,EAACJ,SAAS3B,kBAAkB;gBAC/CM,kBAAkBsB,GAAG,CAAC;oBACpBI,aAAad,KAAKH,IAAI;oBACtBkB,gBAAgBR,YAAYK,OAAO;oBACnCH;gBACF;YACF,CAAC;YAED,IAAIT,KAAKgB,QAAQ,CAACC,IAAI,GAAG,GAAG;gBAC1BnB,WAAWE,KAAKgB,QAAQ,CAACE,MAAM;YACjC,CAAC;QACH;IACF;IAEA,MAAMpB,WAAWL,QAAQuB,QAAQ,CAACE,MAAM;IAExC,IAAI9B,kBAAkB6B,IAAI,GAAG,GAAG;QAC9B,MAAM,IAAIE,gCAAe,CAAC/B,mBAAmB;IAC/C,CAAC;AACH;AAEA,MAAME,cAAc,CAACD,OAA0B;IAC7C,IAAI,CAACA,MAAM;QACT,OAAO+B,QAAQC,GAAG;IACpB,CAAC;IAED,OAAOC,IAAAA,gBAAU,EAACjC,QAAQA,OAAOgB,IAAAA,UAAI,EAACe,QAAQC,GAAG,IAAIhC,KAAK;AAC5D"}
1
+ {"version":3,"sources":["../../../../../packages/license-cop/src/lib/license-cop.ts"],"sourcesContent":["import { Node, Link } from \"@npmcli/arborist\";\nimport * as Arborist from \"@npmcli/arborist\";\nimport { isAbsolute, join } from \"path\";\nimport logger from \"./logger\";\nimport { getLicenseExpression, readPackageJson } from \"./package-json\";\nimport { isAllowedPackage } from \"./package-rules\";\nimport { calculateIssues } from \"./spdx/calculate-issues\";\nimport { joinStringArray } from \"./utils/join-string-array\";\nimport { parseLicenseExpression } from \"./spdx/parse-license-expression\";\nimport {\n AllowedPackage,\n CheckLicensesResult,\n ForbiddenLicenseResult,\n LicensedPackage,\n NoLicenseResult\n} from \"./result\";\n\nexport interface LicenseCopOptions {\n allowedLicenses: string[];\n allowedPackages: string[];\n workingDirectory?: string;\n includeDevDependencies?: boolean;\n devDependenciesOnly?: boolean;\n}\n\nexport const checkLicenses = async (options: LicenseCopOptions): 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 path = resolvePath(workingDirectory);\n const arborist = new Arborist({ path });\n\n const topNode = await arborist.loadActual();\n\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 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 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 packagesWithForbiddenLicenses.add({\n name: packageJson.name,\n version: packageJson.version,\n licenseIdentifiers: joinedIssues,\n spdxExpression: rawLicenseExpression\n });\n } else {\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\nconst resolvePath = (path?: string): string => {\n if (!path) {\n return process.cwd();\n }\n\n return isAbsolute(path) ? path : join(process.cwd(), path);\n};\n"],"names":["checkLicenses","options","workingDirectory","allowedLicenses","allowedPackages","includeDevDependencies","devDependenciesOnly","foundAllowedPackages","Set","packagesWithAllowedLicenses","packagesWithNoLicenses","packagesWithForbiddenLicenses","path","resolvePath","arborist","Arborist","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","process","cwd","isAbsolute"],"mappings":";+BAyBaA;;aAAAA;;0BAxBa;sBACO;wBACd;6BACmC;8BACrB;iCACD;iCACA;wCACO;AAiBhC,MAAMA,gBAAgB,OAAOC,UAA6D;IAC/F,MAAM,EACJC,iBAAgB,EAChBC,gBAAe,EACfC,gBAAe,EACfC,uBAAsB,EACtBC,oBAAmB,EACpB,GAAGL;IAEJ,MAAMM,uBAAuB,IAAIC;IACjC,MAAMC,8BAA8B,IAAID;IACxC,MAAME,yBAAyB,IAAIF;IACnC,MAAMG,gCAAgC,IAAIH;IAE1C,MAAMI,OAAOC,YAAYX;IACzB,MAAMY,WAAW,IAAIC,UAAS;QAAEH;IAAK;IAErC,MAAMI,UAAU,MAAMF,SAASG,UAAU;IAEzC,MAAMC,YAAY,OAAOC,OAAsB;QAC7CC,eAAM,CAACC,OAAO,CAAC,CAAC,cAAc,EAAEF,KAAKG,IAAI,CAAC,CAAC;QAE3C,MAAMC,kBAAkBJ,KAAKK,GAAG;QAEhC,IAAI,CAACnB,0BAA0B,CAACC,uBAAuBiB,iBAAiB;YACtE;QACF,CAAC;QAED,IAAIjB,uBAAuB,CAACiB,iBAAiB;YAC3C;QACF,CAAC;QAED,MAAME,kBAAkBC,IAAAA,UAAI,EAACP,KAAKQ,QAAQ,EAAE;QAC5C,MAAMC,cAAc,MAAMC,IAAAA,4BAAe,EAACJ;QAE1C,IAAIK,IAAAA,8BAAgB,EAACX,KAAKG,IAAI,EAAEM,YAAYG,OAAO,EAAE3B,kBAAkB;YACrEG,qBAAqByB,GAAG,CAAC;gBACvBV,MAAMM,YAAYN,IAAI;gBACtBS,SAASH,YAAYG,OAAO;YAC9B;YAEA,IAAIZ,KAAKc,QAAQ,CAACC,IAAI,GAAG,GAAG;gBAC1B,MAAMC,WAAWhB,KAAKc,QAAQ,CAACG,MAAM;YACvC,CAAC;YACD;QACF,CAAC;QAED,MAAMC,uBAAuBC,IAAAA,iCAAoB,EAACV;QAClD,MAAMW,oBAAoBC,IAAAA,8CAAsB,EAACH;QAEjD,IAAIE,kBAAkBE,IAAI,KAAK,cAAc;YAC3C/B,uBAAuBsB,GAAG,CAAC;gBACzBV,MAAMM,YAAYN,IAAI;gBACtBS,SAASH,YAAYG,OAAO;YAC9B;YAEA,IAAIZ,KAAKc,QAAQ,CAACC,IAAI,GAAG,GAAG;gBAC1B,MAAMC,WAAWhB,KAAKc,QAAQ,CAACG,MAAM;YACvC,CAAC;YACD;QACF,CAAC;QAED,MAAMM,gBAAgBC,IAAAA,gCAAe,EAACJ,mBAAmBpC;QACzD,MAAMyC,eAAeC,IAAAA,gCAAe,EAACH;QAErC,IAAIA,cAAcI,MAAM,GAAG,GAAG;YAC5BnC,8BAA8BqB,GAAG,CAAC;gBAChCV,MAAMM,YAAYN,IAAI;gBACtBS,SAASH,YAAYG,OAAO;gBAC5BgB,oBAAoBH;gBACpBI,gBAAgBX;YAClB;QACF,OAAO;YACL5B,4BAA4BuB,GAAG,CAAC;gBAC9BV,MAAMM,YAAYN,IAAI;gBACtBS,SAASH,YAAYG,OAAO;gBAC5BiB,gBAAgBX;gBAChBY,UAAUV;YACZ;QACF,CAAC;QAED,IAAIpB,KAAKc,QAAQ,CAACC,IAAI,GAAG,GAAG;YAC1BC,WAAWhB,KAAKc,QAAQ,CAACG,MAAM;QACjC,CAAC;IACH;IAEA,MAAMD,aAAa,OAAOe,QAAyC;QACjE,KAAK,MAAM/B,QAAQ+B,MAAO;YACxB,MAAMhC,UAAUC;QAClB;IACF;IAEA,MAAMgB,WAAWnB,QAAQiB,QAAQ,CAACG,MAAM;IAExC,OAAO;QACLhC,iBAAiBG;QACjBJ,iBAAiBM;QACjB0C,YAAYzC;QACZ0C,mBAAmBzC;IACrB;AACF;AAEA,MAAME,cAAc,CAACD,OAA0B;IAC7C,IAAI,CAACA,MAAM;QACT,OAAOyC,QAAQC,GAAG;IACpB,CAAC;IAED,OAAOC,IAAAA,gBAAU,EAAC3C,QAAQA,OAAOc,IAAAA,UAAI,EAAC2B,QAAQC,GAAG,IAAI1C,KAAK;AAC5D"}
@@ -0,0 +1,8 @@
1
+ declare const logger: {
2
+ enableLogging: () => void;
3
+ enableVerboseLogging: () => void;
4
+ log: (message: string) => void;
5
+ verbose: (message: string) => void;
6
+ error: (message: string) => void;
7
+ };
8
+ export default logger;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "default", {
3
+ enumerable: true,
4
+ get: ()=>_default
5
+ });
6
+ let loggerEnabled = false;
7
+ let verboseEnabled = false;
8
+ const enableLogging = ()=>{
9
+ loggerEnabled = true;
10
+ };
11
+ const enableVerboseLogging = ()=>{
12
+ verboseEnabled = true;
13
+ verbose("Verbose logging enabled");
14
+ };
15
+ const log = (message)=>{
16
+ if (loggerEnabled) {
17
+ console.log(message);
18
+ }
19
+ };
20
+ const verbose = (message)=>{
21
+ if (loggerEnabled && verboseEnabled) {
22
+ log(message);
23
+ }
24
+ };
25
+ const error = (message)=>{
26
+ if (loggerEnabled) {
27
+ console.error(message);
28
+ }
29
+ };
30
+ const logger = {
31
+ enableLogging,
32
+ enableVerboseLogging,
33
+ log,
34
+ verbose,
35
+ error
36
+ };
37
+ const _default = logger;
38
+
39
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../packages/license-cop/src/lib/logger.ts"],"sourcesContent":["let loggerEnabled = false;\nlet verboseEnabled = false;\n\nconst enableLogging = () => {\n loggerEnabled = true;\n};\n\nconst enableVerboseLogging = () => {\n verboseEnabled = true;\n\n verbose(\"Verbose logging enabled\");\n};\n\nconst log = (message: string) => {\n if (loggerEnabled) {\n console.log(message);\n }\n};\n\nconst verbose = (message: string) => {\n if (loggerEnabled && verboseEnabled) {\n log(message);\n }\n};\n\nconst error = (message: string) => {\n if (loggerEnabled) {\n console.error(message);\n }\n};\n\nconst logger = {\n enableLogging,\n enableVerboseLogging,\n log,\n verbose,\n error\n};\n\nexport default logger;\n"],"names":["loggerEnabled","verboseEnabled","enableLogging","enableVerboseLogging","verbose","log","message","console","error","logger"],"mappings":";+BAuCA;;aAAA;;AAvCA,IAAIA,gBAAgB,KAAK;AACzB,IAAIC,iBAAiB,KAAK;AAE1B,MAAMC,gBAAgB,IAAM;IAC1BF,gBAAgB,IAAI;AACtB;AAEA,MAAMG,uBAAuB,IAAM;IACjCF,iBAAiB,IAAI;IAErBG,QAAQ;AACV;AAEA,MAAMC,MAAM,CAACC,UAAoB;IAC/B,IAAIN,eAAe;QACjBO,QAAQF,GAAG,CAACC;IACd,CAAC;AACH;AAEA,MAAMF,UAAU,CAACE,UAAoB;IACnC,IAAIN,iBAAiBC,gBAAgB;QACnCI,IAAIC;IACN,CAAC;AACH;AAEA,MAAME,QAAQ,CAACF,UAAoB;IACjC,IAAIN,eAAe;QACjBO,QAAQC,KAAK,CAACF;IAChB,CAAC;AACH;AAEA,MAAMG,SAAS;IACbP;IACAC;IACAE;IACAD;IACAI;AACF;MAEA,WAAeC"}
@@ -1,6 +1,36 @@
1
- interface PackageJson {
1
+ import { z } from "zod";
2
+ declare const packageJsonValidator: z.ZodObject<{
3
+ name: z.ZodString;
4
+ version: z.ZodString;
5
+ license: z.ZodOptional<z.ZodString>;
6
+ licenses: z.ZodOptional<z.ZodArray<z.ZodObject<{
7
+ type: z.ZodString;
8
+ url: z.ZodOptional<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ type: string;
11
+ url?: string | undefined;
12
+ }, {
13
+ type: string;
14
+ url?: string | undefined;
15
+ }>, "many">>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ name: string;
2
18
  version: string;
3
- license?: string;
4
- }
19
+ license?: string | undefined;
20
+ licenses?: {
21
+ type: string;
22
+ url?: string | undefined;
23
+ }[] | undefined;
24
+ }, {
25
+ name: string;
26
+ version: string;
27
+ license?: string | undefined;
28
+ licenses?: {
29
+ type: string;
30
+ url?: string | undefined;
31
+ }[] | undefined;
32
+ }>;
33
+ type PackageJson = z.infer<typeof packageJsonValidator>;
5
34
  export declare const readPackageJson: (pathToPackageJson: string) => Promise<PackageJson>;
35
+ export declare const getLicenseExpression: (packageJson: PackageJson) => string;
6
36
  export {};
@@ -1,22 +1,55 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "readPackageJson", {
6
- enumerable: true,
7
- get: ()=>readPackageJson
2
+ function _export(target, all) {
3
+ for(var name in all)Object.defineProperty(target, name, {
4
+ enumerable: true,
5
+ get: all[name]
6
+ });
7
+ }
8
+ _export(exports, {
9
+ readPackageJson: ()=>readPackageJson,
10
+ getLicenseExpression: ()=>getLicenseExpression
8
11
  });
9
12
  const _promises = require("fs/promises");
13
+ const _zod = require("zod");
14
+ const _json5 = require("./config/parsers/json5");
15
+ const _logger = require("./logger");
16
+ const packageJsonValidator = _zod.z.object({
17
+ name: _zod.z.string(),
18
+ version: _zod.z.string(),
19
+ license: _zod.z.string().optional(),
20
+ licenses: _zod.z.object({
21
+ type: _zod.z.string(),
22
+ url: _zod.z.string().optional()
23
+ }).array().optional()
24
+ });
10
25
  const readPackageJson = async (pathToPackageJson)=>{
11
26
  const doesPackageJsonExist = await doesFileExist(pathToPackageJson);
12
27
  if (!doesPackageJsonExist) {
28
+ _logger.default.verbose(`Cannot find the package.json: '${pathToPackageJson}'`);
13
29
  throw new Error(`Cannot find the file: '${pathToPackageJson}'`);
14
30
  }
15
31
  const packageJsonAsString = await (0, _promises.readFile)(pathToPackageJson, {
16
32
  encoding: "utf8"
17
33
  });
18
- const packageJson = JSON.parse(packageJsonAsString);
19
- return packageJson;
34
+ const parsedFile = (0, _json5.json5Parse)(packageJsonAsString);
35
+ const packageJson = packageJsonValidator.safeParse(parsedFile);
36
+ if (!packageJson.success) {
37
+ throw new Error(`Unable to parse package.json: ${pathToPackageJson}: ${packageJson.error.message}`);
38
+ }
39
+ return packageJson.data;
40
+ };
41
+ const getLicenseExpression = (packageJson)=>{
42
+ if (packageJson.license) {
43
+ return packageJson.license;
44
+ }
45
+ if (packageJson.licenses) {
46
+ const licenses = packageJson.licenses.map((license)=>license.type);
47
+ if (licenses.length === 1) {
48
+ return licenses[0];
49
+ }
50
+ return `(${licenses.join(" AND ")})`;
51
+ }
52
+ return "UNLICENSED";
20
53
  };
21
54
  const doesFileExist = async (path)=>{
22
55
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/license-cop/src/lib/package-json.ts"],"sourcesContent":["import { Stats } from \"fs\";\nimport { readFile, stat } from \"fs/promises\";\n\ninterface PackageJson {\n version: string;\n license?: string;\n}\n\nexport const readPackageJson = async (pathToPackageJson: string): Promise<PackageJson> => {\n const doesPackageJsonExist = await doesFileExist(pathToPackageJson);\n if (!doesPackageJsonExist) {\n throw new Error(`Cannot find the file: '${pathToPackageJson}'`);\n }\n\n const packageJsonAsString: string = await readFile(pathToPackageJson, { encoding: \"utf8\" });\n\n const packageJson: PackageJson = JSON.parse(packageJsonAsString);\n return packageJson;\n};\n\nconst doesFileExist = async (path: string): Promise<boolean> => {\n try {\n const stats: Stats = await stat(path);\n return stats.isFile();\n } catch {\n return false;\n }\n};\n"],"names":["readPackageJson","pathToPackageJson","doesPackageJsonExist","doesFileExist","Error","packageJsonAsString","readFile","encoding","packageJson","JSON","parse","path","stats","stat","isFile"],"mappings":";;;;+BAQaA;;aAAAA;;0BAPkB;AAOxB,MAAMA,kBAAkB,OAAOC,oBAAoD;IACxF,MAAMC,uBAAuB,MAAMC,cAAcF;IACjD,IAAI,CAACC,sBAAsB;QACzB,MAAM,IAAIE,MAAM,CAAC,uBAAuB,EAAEH,kBAAkB,CAAC,CAAC,EAAE;IAClE,CAAC;IAED,MAAMI,sBAA8B,MAAMC,IAAAA,kBAAQ,EAACL,mBAAmB;QAAEM,UAAU;IAAO;IAEzF,MAAMC,cAA2BC,KAAKC,KAAK,CAACL;IAC5C,OAAOG;AACT;AAEA,MAAML,gBAAgB,OAAOQ,OAAmC;IAC9D,IAAI;QACF,MAAMC,QAAe,MAAMC,IAAAA,cAAI,EAACF;QAChC,OAAOC,MAAME,MAAM;IACrB,EAAE,UAAM;QACN,OAAO,KAAK;IACd;AACF"}
1
+ {"version":3,"sources":["../../../../../packages/license-cop/src/lib/package-json.ts"],"sourcesContent":["import { Stats } from \"fs\";\nimport { readFile, stat } from \"fs/promises\";\nimport { z } from \"zod\";\nimport { json5Parse } from \"./config/parsers/json5\";\nimport logger from \"./logger\";\n\nconst packageJsonValidator = z.object({\n name: z.string(),\n version: z.string(),\n license: z.string().optional(),\n licenses: z\n .object({\n type: z.string(),\n url: z.string().optional()\n })\n .array()\n .optional()\n});\n\ntype PackageJson = z.infer<typeof packageJsonValidator>;\n\nexport const readPackageJson = async (pathToPackageJson: string): Promise<PackageJson> => {\n const doesPackageJsonExist = await doesFileExist(pathToPackageJson);\n if (!doesPackageJsonExist) {\n logger.verbose(`Cannot find the package.json: '${pathToPackageJson}'`);\n throw new Error(`Cannot find the file: '${pathToPackageJson}'`);\n }\n\n const packageJsonAsString: string = await readFile(pathToPackageJson, { encoding: \"utf8\" });\n\n const parsedFile = json5Parse<unknown>(packageJsonAsString);\n\n const packageJson = packageJsonValidator.safeParse(parsedFile);\n\n if (!packageJson.success) {\n throw new Error(\n `Unable to parse package.json: ${pathToPackageJson}: ${packageJson.error.message}`\n );\n }\n\n return packageJson.data;\n};\n\nexport const getLicenseExpression = (packageJson: PackageJson): string => {\n if (packageJson.license) {\n return packageJson.license;\n }\n\n if (packageJson.licenses) {\n const licenses = packageJson.licenses.map<string>(license => license.type);\n\n if (licenses.length === 1) {\n return licenses[0];\n }\n\n return `(${licenses.join(\" AND \")})`;\n }\n\n return \"UNLICENSED\";\n};\n\nconst doesFileExist = async (path: string): Promise<boolean> => {\n try {\n const stats: Stats = await stat(path);\n return stats.isFile();\n } catch {\n return false;\n }\n};\n"],"names":["readPackageJson","getLicenseExpression","packageJsonValidator","z","object","name","string","version","license","optional","licenses","type","url","array","pathToPackageJson","doesPackageJsonExist","doesFileExist","logger","verbose","Error","packageJsonAsString","readFile","encoding","parsedFile","json5Parse","packageJson","safeParse","success","error","message","data","map","length","join","path","stats","stat","isFile"],"mappings":";;;;;;;;IAqBaA,eAAe,MAAfA;IAsBAC,oBAAoB,MAApBA;;0BA1CkB;qBACb;uBACS;wBACR;AAEnB,MAAMC,uBAAuBC,MAAC,CAACC,MAAM,CAAC;IACpCC,MAAMF,MAAC,CAACG,MAAM;IACdC,SAASJ,MAAC,CAACG,MAAM;IACjBE,SAASL,MAAC,CAACG,MAAM,GAAGG,QAAQ;IAC5BC,UAAUP,MAAC,CACRC,MAAM,CAAC;QACNO,MAAMR,MAAC,CAACG,MAAM;QACdM,KAAKT,MAAC,CAACG,MAAM,GAAGG,QAAQ;IAC1B,GACCI,KAAK,GACLJ,QAAQ;AACb;AAIO,MAAMT,kBAAkB,OAAOc,oBAAoD;IACxF,MAAMC,uBAAuB,MAAMC,cAAcF;IACjD,IAAI,CAACC,sBAAsB;QACzBE,eAAM,CAACC,OAAO,CAAC,CAAC,+BAA+B,EAAEJ,kBAAkB,CAAC,CAAC;QACrE,MAAM,IAAIK,MAAM,CAAC,uBAAuB,EAAEL,kBAAkB,CAAC,CAAC,EAAE;IAClE,CAAC;IAED,MAAMM,sBAA8B,MAAMC,IAAAA,kBAAQ,EAACP,mBAAmB;QAAEQ,UAAU;IAAO;IAEzF,MAAMC,aAAaC,IAAAA,iBAAU,EAAUJ;IAEvC,MAAMK,cAAcvB,qBAAqBwB,SAAS,CAACH;IAEnD,IAAI,CAACE,YAAYE,OAAO,EAAE;QACxB,MAAM,IAAIR,MACR,CAAC,8BAA8B,EAAEL,kBAAkB,EAAE,EAAEW,YAAYG,KAAK,CAACC,OAAO,CAAC,CAAC,EAClF;IACJ,CAAC;IAED,OAAOJ,YAAYK,IAAI;AACzB;AAEO,MAAM7B,uBAAuB,CAACwB,cAAqC;IACxE,IAAIA,YAAYjB,OAAO,EAAE;QACvB,OAAOiB,YAAYjB,OAAO;IAC5B,CAAC;IAED,IAAIiB,YAAYf,QAAQ,EAAE;QACxB,MAAMA,WAAWe,YAAYf,QAAQ,CAACqB,GAAG,CAASvB,CAAAA,UAAWA,QAAQG,IAAI;QAEzE,IAAID,SAASsB,MAAM,KAAK,GAAG;YACzB,OAAOtB,QAAQ,CAAC,EAAE;QACpB,CAAC;QAED,OAAO,CAAC,CAAC,EAAEA,SAASuB,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,OAAO;AACT;AAEA,MAAMjB,gBAAgB,OAAOkB,OAAmC;IAC9D,IAAI;QACF,MAAMC,QAAe,MAAMC,IAAAA,cAAI,EAACF;QAChC,OAAOC,MAAME,MAAM;IACrB,EAAE,UAAM;QACN,OAAO,KAAK;IACd;AACF"}
@@ -1,2 +1 @@
1
1
  export declare const isAllowedPackage: (packageName: string, packageVersion: string, allowedPackages: string[]) => boolean;
2
- export declare const isAllowedLicense: (license: string, allowedLicenses: string[]) => boolean;
@@ -1,16 +1,7 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- isAllowedPackage: ()=>isAllowedPackage,
13
- isAllowedLicense: ()=>isAllowedLicense
2
+ Object.defineProperty(exports, "isAllowedPackage", {
3
+ enumerable: true,
4
+ get: ()=>isAllowedPackage
14
5
  });
15
6
  const _compareVersions = require("compare-versions");
16
7
  const isAllowedPackage = (packageName, packageVersion, allowedPackages)=>{
@@ -27,8 +18,5 @@ const isAllowedPackage = (packageName, packageVersion, allowedPackages)=>{
27
18
  }
28
19
  return false;
29
20
  };
30
- const isAllowedLicense = (license, allowedLicenses)=>{
31
- return allowedLicenses.includes(license);
32
- };
33
21
 
34
22
  //# sourceMappingURL=package-rules.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/license-cop/src/lib/package-rules.ts"],"sourcesContent":["import { satisfies } from \"compare-versions\";\n\nexport const isAllowedPackage = (\n packageName: string,\n packageVersion: string,\n allowedPackages: string[]\n) => {\n for (const allowedPackage of allowedPackages) {\n if (allowedPackage === packageName) {\n return true;\n }\n\n if (allowedPackage.startsWith(packageName + \"@\")) {\n const allowedPackageVersion = allowedPackage.substring(packageName.length + 1);\n\n if (satisfies(packageVersion, allowedPackageVersion)) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nexport const isAllowedLicense = (license: string, allowedLicenses: string[]) => {\n return allowedLicenses.includes(license);\n};\n"],"names":["isAllowedPackage","isAllowedLicense","packageName","packageVersion","allowedPackages","allowedPackage","startsWith","allowedPackageVersion","substring","length","satisfies","license","allowedLicenses","includes"],"mappings":";;;;;;;;;;;IAEaA,gBAAgB,MAAhBA;IAsBAC,gBAAgB,MAAhBA;;iCAxBa;AAEnB,MAAMD,mBAAmB,CAC9BE,aACAC,gBACAC,kBACG;IACH,KAAK,MAAMC,kBAAkBD,gBAAiB;QAC5C,IAAIC,mBAAmBH,aAAa;YAClC,OAAO,IAAI;QACb,CAAC;QAED,IAAIG,eAAeC,UAAU,CAACJ,cAAc,MAAM;YAChD,MAAMK,wBAAwBF,eAAeG,SAAS,CAACN,YAAYO,MAAM,GAAG;YAE5E,IAAIC,IAAAA,0BAAS,EAACP,gBAAgBI,wBAAwB;gBACpD,OAAO,IAAI;YACb,CAAC;QACH,CAAC;IACH;IAEA,OAAO,KAAK;AACd;AAEO,MAAMN,mBAAmB,CAACU,SAAiBC,kBAA8B;IAC9E,OAAOA,gBAAgBC,QAAQ,CAACF;AAClC"}
1
+ {"version":3,"sources":["../../../../../packages/license-cop/src/lib/package-rules.ts"],"sourcesContent":["import { satisfies } from \"compare-versions\";\n\nexport const isAllowedPackage = (\n packageName: string,\n packageVersion: string,\n allowedPackages: string[]\n) => {\n for (const allowedPackage of allowedPackages) {\n if (allowedPackage === packageName) {\n return true;\n }\n\n if (allowedPackage.startsWith(packageName + \"@\")) {\n const allowedPackageVersion = allowedPackage.substring(packageName.length + 1);\n\n if (satisfies(packageVersion, allowedPackageVersion)) {\n return true;\n }\n }\n }\n\n return false;\n};\n"],"names":["isAllowedPackage","packageName","packageVersion","allowedPackages","allowedPackage","startsWith","allowedPackageVersion","substring","length","satisfies"],"mappings":";+BAEaA;;aAAAA;;iCAFa;AAEnB,MAAMA,mBAAmB,CAC9BC,aACAC,gBACAC,kBACG;IACH,KAAK,MAAMC,kBAAkBD,gBAAiB;QAC5C,IAAIC,mBAAmBH,aAAa;YAClC,OAAO,IAAI;QACb,CAAC;QAED,IAAIG,eAAeC,UAAU,CAACJ,cAAc,MAAM;YAChD,MAAMK,wBAAwBF,eAAeG,SAAS,CAACN,YAAYO,MAAM,GAAG;YAE5E,IAAIC,IAAAA,0BAAS,EAACP,gBAAgBI,wBAAwB;gBACpD,OAAO,IAAI;YACb,CAAC;QACH,CAAC;IACH;IAEA,OAAO,KAAK;AACd"}
@@ -0,0 +1,27 @@
1
+ import { SpdxExpression } from "./spdx/types/spdx-expression";
2
+ export interface CheckLicensesResult {
3
+ allowedPackages: Set<AllowedPackage>;
4
+ allowedLicenses: Set<LicensedPackage>;
5
+ noLicenses: Set<NoLicenseResult>;
6
+ forbiddenLicenses: Set<ForbiddenLicenseResult>;
7
+ }
8
+ export interface AllowedPackage {
9
+ name: string;
10
+ version: string;
11
+ }
12
+ export interface LicensedPackage {
13
+ name: string;
14
+ version: string;
15
+ spdxExpression: string;
16
+ licenses: SpdxExpression;
17
+ }
18
+ export interface NoLicenseResult {
19
+ name: string;
20
+ version: string;
21
+ }
22
+ export interface ForbiddenLicenseResult {
23
+ name: string;
24
+ version: string;
25
+ spdxExpression: string;
26
+ licenseIdentifiers: string;
27
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+
3
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../packages/license-cop/src/lib/result.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import { SpdxExpression } from "./types/spdx-expression";
2
+ export declare const calculateIssues: (license: SpdxExpression, allowedLicenses: string[]) => string[];