license-cop 1.9.0 → 2.0.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.
- package/LICENSE.md +1 -1
- package/README.md +25 -5
- package/dist/bin.js +545 -0
- package/dist/bin.js.map +1 -0
- package/package.json +21 -14
- package/src/bin/license-cop +0 -4
- package/src/index.d.ts +0 -3
- package/src/index.js +0 -10
- package/src/index.js.map +0 -1
- package/src/lib/cli/commands/init.d.ts +0 -5
- package/src/lib/cli/commands/init.js +0 -39
- package/src/lib/cli/commands/init.js.map +0 -1
- package/src/lib/cli/commands/main.d.ts +0 -7
- package/src/lib/cli/commands/main.js +0 -61
- package/src/lib/cli/commands/main.js.map +0 -1
- package/src/lib/cli/commands/version.d.ts +0 -4
- package/src/lib/cli/commands/version.js +0 -21
- package/src/lib/cli/commands/version.js.map +0 -1
- package/src/lib/cli/create-command.d.ts +0 -5
- package/src/lib/cli/create-command.js +0 -17
- package/src/lib/cli/create-command.js.map +0 -1
- package/src/lib/cli/index.d.ts +0 -1
- package/src/lib/cli/index.js +0 -18
- package/src/lib/cli/index.js.map +0 -1
- package/src/lib/cli/report-failure.d.ts +0 -2
- package/src/lib/cli/report-failure.js +0 -36
- package/src/lib/cli/report-failure.js.map +0 -1
- package/src/lib/cli/report-success.d.ts +0 -2
- package/src/lib/cli/report-success.js +0 -22
- package/src/lib/cli/report-success.js.map +0 -1
- package/src/lib/config/config-error.d.ts +0 -4
- package/src/lib/config/config-error.js +0 -27
- package/src/lib/config/config-error.js.map +0 -1
- package/src/lib/config/config.d.ts +0 -25
- package/src/lib/config/config.js +0 -35
- package/src/lib/config/config.js.map +0 -1
- package/src/lib/config/find-config.d.ts +0 -1
- package/src/lib/config/find-config.js +0 -67
- package/src/lib/config/find-config.js.map +0 -1
- package/src/lib/config/load-config.d.ts +0 -7
- package/src/lib/config/load-config.js +0 -26
- package/src/lib/config/load-config.js.map +0 -1
- package/src/lib/config/load-parent-config.d.ts +0 -1
- package/src/lib/config/load-parent-config.js +0 -30
- package/src/lib/config/load-parent-config.js.map +0 -1
- package/src/lib/config/parent-resolutions/github.d.ts +0 -1
- package/src/lib/config/parent-resolutions/github.js +0 -28
- package/src/lib/config/parent-resolutions/github.js.map +0 -1
- package/src/lib/config/parent-resolutions/http.d.ts +0 -1
- package/src/lib/config/parent-resolutions/http.js +0 -20
- package/src/lib/config/parent-resolutions/http.js.map +0 -1
- package/src/lib/config/parent-resolutions/npm.d.ts +0 -2
- package/src/lib/config/parent-resolutions/npm.js +0 -32
- package/src/lib/config/parent-resolutions/npm.js.map +0 -1
- package/src/lib/config/parsers/json5.d.ts +0 -1
- package/src/lib/config/parsers/json5.js +0 -11
- package/src/lib/config/parsers/json5.js.map +0 -1
- package/src/lib/dependency/get-package-manager.d.ts +0 -2
- package/src/lib/dependency/get-package-manager.js +0 -52
- package/src/lib/dependency/get-package-manager.js.map +0 -1
- package/src/lib/dependency/package-json.d.ts +0 -18
- package/src/lib/dependency/package-json.js +0 -75
- package/src/lib/dependency/package-json.js.map +0 -1
- package/src/lib/dependency/package-rules.d.ts +0 -1
- package/src/lib/dependency/package-rules.js +0 -24
- package/src/lib/dependency/package-rules.js.map +0 -1
- package/src/lib/dependency-scanning/npm.d.ts +0 -3
- package/src/lib/dependency-scanning/npm.js +0 -100
- package/src/lib/dependency-scanning/npm.js.map +0 -1
- package/src/lib/dependency-scanning/options.d.ts +0 -2
- package/src/lib/dependency-scanning/options.js +0 -3
- package/src/lib/dependency-scanning/options.js.map +0 -1
- package/src/lib/dependency-scanning/pnpm.d.ts +0 -3
- package/src/lib/dependency-scanning/pnpm.js +0 -103
- package/src/lib/dependency-scanning/pnpm.js.map +0 -1
- package/src/lib/license-cop.d.ts +0 -9
- package/src/lib/license-cop.js +0 -51
- package/src/lib/license-cop.js.map +0 -1
- package/src/lib/logger.d.ts +0 -8
- package/src/lib/logger.js +0 -41
- package/src/lib/logger.js.map +0 -1
- package/src/lib/result.d.ts +0 -27
- package/src/lib/result.js +0 -3
- package/src/lib/result.js.map +0 -1
- package/src/lib/spdx/calculate-issues.d.ts +0 -2
- package/src/lib/spdx/calculate-issues.js +0 -45
- package/src/lib/spdx/calculate-issues.js.map +0 -1
- package/src/lib/spdx/get-tokens.d.ts +0 -2
- package/src/lib/spdx/get-tokens.js +0 -54
- package/src/lib/spdx/get-tokens.js.map +0 -1
- package/src/lib/spdx/parse-license-expression.d.ts +0 -2
- package/src/lib/spdx/parse-license-expression.js +0 -20
- package/src/lib/spdx/parse-license-expression.js.map +0 -1
- package/src/lib/spdx/parse-tokens.d.ts +0 -3
- package/src/lib/spdx/parse-tokens.js +0 -122
- package/src/lib/spdx/parse-tokens.js.map +0 -1
- package/src/lib/spdx/types/spdx-expression.d.ts +0 -20
- package/src/lib/spdx/types/spdx-expression.js +0 -3
- package/src/lib/spdx/types/spdx-expression.js.map +0 -1
- package/src/lib/spdx/types/token.d.ts +0 -23
- package/src/lib/spdx/types/token.js +0 -29
- package/src/lib/spdx/types/token.js.map +0 -1
- package/src/lib/utils/join-string-array.d.ts +0 -1
- package/src/lib/utils/join-string-array.js +0 -28
- package/src/lib/utils/join-string-array.js.map +0 -1
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "findConfig", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return findConfig;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _cosmiconfig = require("cosmiconfig");
|
|
9
|
-
const _configerror = require("./config-error");
|
|
10
|
-
const _json5 = require("./parsers/json5");
|
|
11
|
-
// cspell:disable-next-line
|
|
12
|
-
const moduleNames = [
|
|
13
|
-
"licenses",
|
|
14
|
-
"licences",
|
|
15
|
-
"licensesrc",
|
|
16
|
-
"licencesrc"
|
|
17
|
-
];
|
|
18
|
-
const generateSearchPlaces = (moduleName)=>[
|
|
19
|
-
`.${moduleName}`,
|
|
20
|
-
`.${moduleName}.json`,
|
|
21
|
-
`.${moduleName}.jsonc`,
|
|
22
|
-
`.${moduleName}.json5`,
|
|
23
|
-
`.${moduleName}.yaml`,
|
|
24
|
-
`.${moduleName}.yml`,
|
|
25
|
-
`.${moduleName}.js`,
|
|
26
|
-
`.${moduleName}.cjs`,
|
|
27
|
-
`.config/${moduleName}`,
|
|
28
|
-
`.config/${moduleName}.json`,
|
|
29
|
-
`.config/${moduleName}.jsonc`,
|
|
30
|
-
`.config/${moduleName}.json5`,
|
|
31
|
-
`.config/${moduleName}.yaml`,
|
|
32
|
-
`.config/${moduleName}.yml`,
|
|
33
|
-
`.config/${moduleName}.js`,
|
|
34
|
-
`.config/${moduleName}.cjs`,
|
|
35
|
-
`${moduleName}.config.js`,
|
|
36
|
-
`${moduleName}.config.cjs`
|
|
37
|
-
];
|
|
38
|
-
const searchPlaces = [
|
|
39
|
-
"package.json"
|
|
40
|
-
];
|
|
41
|
-
for (const moduleName of moduleNames){
|
|
42
|
-
searchPlaces.push(...generateSearchPlaces(moduleName));
|
|
43
|
-
}
|
|
44
|
-
const json5Loader = (_filepath, content)=>Promise.resolve((0, _json5.json5Parse)(content));
|
|
45
|
-
const findConfig = async (rootDir)=>{
|
|
46
|
-
const options = {
|
|
47
|
-
stopDir: rootDir,
|
|
48
|
-
searchPlaces,
|
|
49
|
-
loaders: {
|
|
50
|
-
".json": json5Loader,
|
|
51
|
-
".jsonc": json5Loader,
|
|
52
|
-
".json5": json5Loader
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
const explorer = (0, _cosmiconfig.cosmiconfig)("licensecop", options);
|
|
56
|
-
try {
|
|
57
|
-
const result = await explorer.search(rootDir);
|
|
58
|
-
if (!(result == null ? void 0 : result.config)) {
|
|
59
|
-
throw new Error("No config file found");
|
|
60
|
-
}
|
|
61
|
-
return result.config;
|
|
62
|
-
} catch (e) {
|
|
63
|
-
throw _configerror.ConfigError.fromUnknown(e);
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
//# sourceMappingURL=find-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/license-cop/src/lib/config/find-config.ts"],"sourcesContent":["import { cosmiconfig, Options as CosmiconfigOptions, Loader } from \"cosmiconfig\";\nimport { ConfigError } from \"./config-error\";\nimport { json5Parse } from \"./parsers/json5\";\n\n// cspell:disable-next-line\nconst moduleNames = [\"licenses\", \"licences\", \"licensesrc\", \"licencesrc\"];\n\nconst generateSearchPlaces = (moduleName: string): string[] => [\n `.${moduleName}`,\n `.${moduleName}.json`,\n `.${moduleName}.jsonc`,\n `.${moduleName}.json5`,\n `.${moduleName}.yaml`,\n `.${moduleName}.yml`,\n `.${moduleName}.js`,\n `.${moduleName}.cjs`,\n `.config/${moduleName}`,\n `.config/${moduleName}.json`,\n `.config/${moduleName}.jsonc`,\n `.config/${moduleName}.json5`,\n `.config/${moduleName}.yaml`,\n `.config/${moduleName}.yml`,\n `.config/${moduleName}.js`,\n `.config/${moduleName}.cjs`,\n `${moduleName}.config.js`,\n `${moduleName}.config.cjs`\n];\n\nconst searchPlaces: string[] = [\"package.json\"];\n\nfor (const moduleName of moduleNames) {\n searchPlaces.push(...generateSearchPlaces(moduleName));\n}\n\nconst json5Loader: Loader = (_filepath, content) => Promise.resolve(json5Parse(content));\n\nexport const findConfig = async (rootDir: string): Promise<unknown> => {\n const options: Partial<CosmiconfigOptions> = {\n stopDir: rootDir,\n searchPlaces,\n loaders: {\n \".json\": json5Loader,\n \".jsonc\": json5Loader,\n \".json5\": json5Loader\n }\n };\n\n const explorer = cosmiconfig(\"licensecop\", options);\n\n try {\n const result = await explorer.search(rootDir);\n\n if (!result?.config) {\n throw new Error(\"No config file found\");\n }\n\n return result.config;\n } catch (e) {\n throw ConfigError.fromUnknown(e);\n }\n};\n"],"names":["findConfig","moduleNames","generateSearchPlaces","moduleName","searchPlaces","push","json5Loader","_filepath","content","Promise","resolve","json5Parse","rootDir","options","stopDir","loaders","explorer","cosmiconfig","result","search","config","Error","e","ConfigError","fromUnknown"],"mappings":";+BAoCaA;;;eAAAA;;;6BApCsD;6BACvC;uBACD;AAE3B,2BAA2B;AAC3B,MAAMC,cAAc;IAAC;IAAY;IAAY;IAAc;CAAa;AAExE,MAAMC,uBAAuB,CAACC,aAAiC;QAC7D,CAAC,CAAC,EAAEA,YAAY;QAChB,CAAC,CAAC,EAAEA,WAAW,KAAK,CAAC;QACrB,CAAC,CAAC,EAAEA,WAAW,MAAM,CAAC;QACtB,CAAC,CAAC,EAAEA,WAAW,MAAM,CAAC;QACtB,CAAC,CAAC,EAAEA,WAAW,KAAK,CAAC;QACrB,CAAC,CAAC,EAAEA,WAAW,IAAI,CAAC;QACpB,CAAC,CAAC,EAAEA,WAAW,GAAG,CAAC;QACnB,CAAC,CAAC,EAAEA,WAAW,IAAI,CAAC;QACpB,CAAC,QAAQ,EAAEA,YAAY;QACvB,CAAC,QAAQ,EAAEA,WAAW,KAAK,CAAC;QAC5B,CAAC,QAAQ,EAAEA,WAAW,MAAM,CAAC;QAC7B,CAAC,QAAQ,EAAEA,WAAW,MAAM,CAAC;QAC7B,CAAC,QAAQ,EAAEA,WAAW,KAAK,CAAC;QAC5B,CAAC,QAAQ,EAAEA,WAAW,IAAI,CAAC;QAC3B,CAAC,QAAQ,EAAEA,WAAW,GAAG,CAAC;QAC1B,CAAC,QAAQ,EAAEA,WAAW,IAAI,CAAC;QAC3B,GAAGA,WAAW,UAAU,CAAC;QACzB,GAAGA,WAAW,WAAW,CAAC;KAC3B;AAED,MAAMC,eAAyB;IAAC;CAAe;AAE/C,KAAK,MAAMD,cAAcF,YAAa;IACpCG,aAAaC,IAAI,IAAIH,qBAAqBC;AAC5C;AAEA,MAAMG,cAAsB,CAACC,WAAWC,UAAYC,QAAQC,OAAO,CAACC,IAAAA,iBAAU,EAACH;AAExE,MAAMR,aAAa,OAAOY;IAC/B,MAAMC,UAAuC;QAC3CC,SAASF;QACTR;QACAW,SAAS;YACP,SAAST;YACT,UAAUA;YACV,UAAUA;QACZ;IACF;IAEA,MAAMU,WAAWC,IAAAA,wBAAW,EAAC,cAAcJ;IAE3C,IAAI;QACF,MAAMK,SAAS,MAAMF,SAASG,MAAM,CAACP;QAErC,IAAI,EAACM,0BAAAA,OAAQE,MAAM,GAAE;YACnB,MAAM,IAAIC,MAAM;QAClB;QAEA,OAAOH,OAAOE,MAAM;IACtB,EAAE,OAAOE,GAAG;QACV,MAAMC,wBAAW,CAACC,WAAW,CAACF;IAChC;AACF"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "loadConfig", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return loadConfig;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _deepmerge = require("deepmerge");
|
|
9
|
-
const _logger = require("../logger");
|
|
10
|
-
const _config = require("./config");
|
|
11
|
-
const _findconfig = require("./find-config");
|
|
12
|
-
const _loadparentconfig = require("./load-parent-config");
|
|
13
|
-
const loadConfig = async (rootDir)=>{
|
|
14
|
-
const foundConfig = await (0, _findconfig.findConfig)(rootDir);
|
|
15
|
-
let config = (0, _config.parseConfig)(foundConfig);
|
|
16
|
-
while(config.extends){
|
|
17
|
-
_logger.default.verbose(`Extending config with ${config.extends}`);
|
|
18
|
-
const loadedParentConfig = await (0, _loadparentconfig.loadParentConfig)(config.extends, rootDir);
|
|
19
|
-
const parsedParentConfig = (0, _config.parseConfig)(loadedParentConfig);
|
|
20
|
-
config = _deepmerge(parsedParentConfig, config);
|
|
21
|
-
config.extends = parsedParentConfig.extends;
|
|
22
|
-
}
|
|
23
|
-
return config;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
//# sourceMappingURL=load-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/license-cop/src/lib/config/load-config.ts"],"sourcesContent":["import * as deepMerge from \"deepmerge\";\nimport logger from \"../logger\";\nimport { parseConfig } from \"./config\";\nimport { findConfig } from \"./find-config\";\nimport { loadParentConfig } from \"./load-parent-config\";\n\nexport const loadConfig = async (rootDir: string) => {\n const foundConfig = await findConfig(rootDir);\n\n let config = parseConfig(foundConfig);\n\n while (config.extends) {\n logger.verbose(`Extending config with ${config.extends}`);\n const loadedParentConfig = await loadParentConfig(config.extends, rootDir);\n const parsedParentConfig = parseConfig(loadedParentConfig);\n\n config = deepMerge(parsedParentConfig, config);\n config.extends = parsedParentConfig.extends;\n }\n\n return config;\n};\n"],"names":["loadConfig","rootDir","foundConfig","findConfig","config","parseConfig","extends","logger","verbose","loadedParentConfig","loadParentConfig","parsedParentConfig","deepMerge"],"mappings":";+BAMaA;;;eAAAA;;;2BANc;wBACR;wBACS;4BACD;kCACM;AAE1B,MAAMA,aAAa,OAAOC;IAC/B,MAAMC,cAAc,MAAMC,IAAAA,sBAAU,EAACF;IAErC,IAAIG,SAASC,IAAAA,mBAAW,EAACH;IAEzB,MAAOE,OAAOE,OAAO,CAAE;QACrBC,eAAM,CAACC,OAAO,CAAC,CAAC,sBAAsB,EAAEJ,OAAOE,OAAO,EAAE;QACxD,MAAMG,qBAAqB,MAAMC,IAAAA,kCAAgB,EAACN,OAAOE,OAAO,EAAEL;QAClE,MAAMU,qBAAqBN,IAAAA,mBAAW,EAACI;QAEvCL,SAASQ,WAAUD,oBAAoBP;QACvCA,OAAOE,OAAO,GAAGK,mBAAmBL,OAAO;IAC7C;IAEA,OAAOF;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const loadParentConfig: (parentConfigPath: string, rootDir: string) => Promise<unknown>;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "loadParentConfig", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return loadParentConfig;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _configerror = require("./config-error");
|
|
9
|
-
const _github = require("./parent-resolutions/github");
|
|
10
|
-
const _http = require("./parent-resolutions/http");
|
|
11
|
-
const _npm = require("./parent-resolutions/npm");
|
|
12
|
-
const loadParentConfig = async (parentConfigPath, rootDir)=>{
|
|
13
|
-
if (parentConfigPath.startsWith("npm:")) {
|
|
14
|
-
const packageName = parentConfigPath.substring(4);
|
|
15
|
-
return await (0, _npm.npmResolution)(packageName, rootDir);
|
|
16
|
-
}
|
|
17
|
-
if (parentConfigPath.startsWith("github:")) {
|
|
18
|
-
const repo = parentConfigPath.substring(7);
|
|
19
|
-
return await (0, _github.githubResolution)(repo);
|
|
20
|
-
}
|
|
21
|
-
if (parentConfigPath.startsWith("http")) {
|
|
22
|
-
return await (0, _http.httpResolution)(parentConfigPath);
|
|
23
|
-
}
|
|
24
|
-
if (await (0, _npm.nodeModuleExists)(parentConfigPath, rootDir)) {
|
|
25
|
-
return await (0, _npm.npmResolution)(parentConfigPath, rootDir);
|
|
26
|
-
}
|
|
27
|
-
throw new _configerror.ConfigError(`Invalid parent config location: ${parentConfigPath}`);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
//# sourceMappingURL=load-parent-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/license-cop/src/lib/config/load-parent-config.ts"],"sourcesContent":["import { ConfigError } from \"./config-error\";\nimport { githubResolution } from \"./parent-resolutions/github\";\nimport { httpResolution } from \"./parent-resolutions/http\";\nimport { nodeModuleExists, npmResolution } from \"./parent-resolutions/npm\";\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;;;eAAAA;;;6BALe;wBACK;sBACF;qBACiB;AAEzC,MAAMA,mBAAmB,OAC9BC,kBACAC;IAEA,IAAID,iBAAiBE,UAAU,CAAC,SAAS;QACvC,MAAMC,cAAcH,iBAAiBI,SAAS,CAAC;QAC/C,OAAO,MAAMC,IAAAA,kBAAa,EAACF,aAAaF;IAC1C;IAEA,IAAID,iBAAiBE,UAAU,CAAC,YAAY;QAC1C,MAAMI,OAAON,iBAAiBI,SAAS,CAAC;QACxC,OAAO,MAAMG,IAAAA,wBAAgB,EAACD;IAChC;IAEA,IAAIN,iBAAiBE,UAAU,CAAC,SAAS;QACvC,OAAO,MAAMM,IAAAA,oBAAc,EAACR;IAC9B;IAEA,IAAI,MAAMS,IAAAA,qBAAgB,EAACT,kBAAkBC,UAAU;QACrD,OAAO,MAAMI,IAAAA,kBAAa,EAACL,kBAAkBC;IAC/C;IAEA,MAAM,IAAIS,wBAAW,CAAC,CAAC,gCAAgC,EAAEV,kBAAkB;AAC7E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const githubResolution: (repoId: string) => Promise<unknown>;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "githubResolution", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return githubResolution;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _gitfilesystem = require("git-filesystem");
|
|
9
|
-
const _logger = require("../../logger");
|
|
10
|
-
const _configerror = require("../config-error");
|
|
11
|
-
const _json5 = require("../parsers/json5");
|
|
12
|
-
const githubResolution = async (repoId)=>{
|
|
13
|
-
_logger.default.verbose(`Resolving config from GitHub repo: ${repoId}`);
|
|
14
|
-
const parts = repoId.split("/");
|
|
15
|
-
if (parts.length !== 2 || parts[0].length === 0 || parts[1].length === 0) {
|
|
16
|
-
throw new _configerror.ConfigError(`Invalid GitHub repo ID: ${repoId}`);
|
|
17
|
-
}
|
|
18
|
-
const [owner, repoName] = parts;
|
|
19
|
-
try {
|
|
20
|
-
const repo = new _gitfilesystem.GitHubClient(owner, "", "license-cop").getReadonlyRepository(repoName);
|
|
21
|
-
const fileContent = await repo.readFile(".licenses.json");
|
|
22
|
-
return (0, _json5.json5Parse)(fileContent);
|
|
23
|
-
} catch (e) {
|
|
24
|
-
throw new _configerror.ConfigError(`Could not resolve config from GitHub repo: ${repoId}, error: ${JSON.stringify(e)}`);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
//# sourceMappingURL=github.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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;;;eAAAA;;;+BALgB;wBACV;6BACS;uBACD;AAEpB,MAAMA,mBAAmB,OAAOC;IACrCC,eAAM,CAACC,OAAO,CAAC,CAAC,mCAAmC,EAAEF,QAAQ;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,QAAQ;IAC3D;IAEA,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,IAAI;IAEvF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const httpResolution: (url: string) => Promise<any>;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "httpResolution", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return httpResolution;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _axios = require("axios");
|
|
9
|
-
const _logger = require("../../logger");
|
|
10
|
-
const _json5 = require("../parsers/json5");
|
|
11
|
-
const httpResolution = async (url)=>{
|
|
12
|
-
_logger.default.verbose(`Resolving http config: ${url}`);
|
|
13
|
-
const response = await _axios.default.get(url);
|
|
14
|
-
if (typeof response.data === "string") {
|
|
15
|
-
return await (0, _json5.json5Parse)(response.data);
|
|
16
|
-
}
|
|
17
|
-
return response.data;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
//# sourceMappingURL=http.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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;;;eAAAA;;;uBAJK;wBACC;uBACQ;AAEpB,MAAMA,iBAAiB,OAAOC;IACnCC,eAAM,CAACC,OAAO,CAAC,CAAC,uBAAuB,EAAEF,KAAK;IAE9C,MAAMG,WAAW,MAAMC,cAAK,CAACC,GAAG,CAACL;IAEjC,IAAI,OAAOG,SAASG,IAAI,KAAK,UAAU;QACrC,OAAO,MAAMC,IAAAA,iBAAU,EAACJ,SAASG,IAAI;IACvC;IAEA,OAAOH,SAASG,IAAI;AACtB"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
function _export(target, all) {
|
|
3
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
4
|
-
enumerable: true,
|
|
5
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
6
|
-
});
|
|
7
|
-
}
|
|
8
|
-
_export(exports, {
|
|
9
|
-
get nodeModuleExists () {
|
|
10
|
-
return nodeModuleExists;
|
|
11
|
-
},
|
|
12
|
-
get npmResolution () {
|
|
13
|
-
return npmResolution;
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
const _promises = require("fs/promises");
|
|
17
|
-
const _path = require("path");
|
|
18
|
-
const _logger = require("../../logger");
|
|
19
|
-
const _findconfig = require("../find-config");
|
|
20
|
-
const npmResolution = async (packageName, rootDir)=>{
|
|
21
|
-
_logger.default.verbose(`Resolving npm package: ${packageName}`);
|
|
22
|
-
const packagePath = getPackagePath(rootDir, packageName);
|
|
23
|
-
return await (0, _findconfig.findConfig)(packagePath);
|
|
24
|
-
};
|
|
25
|
-
const nodeModuleExists = async (packageName, rootDir)=>{
|
|
26
|
-
const packagePath = getPackagePath(rootDir, packageName);
|
|
27
|
-
const statResult = await (0, _promises.stat)(packagePath);
|
|
28
|
-
return statResult.isDirectory();
|
|
29
|
-
};
|
|
30
|
-
const getPackagePath = (rootDir, packageName)=>(0, _path.join)(rootDir, "node_modules", packageName);
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=npm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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":["nodeModuleExists","npmResolution","packageName","rootDir","logger","verbose","packagePath","getPackagePath","findConfig","statResult","stat","isDirectory","join"],"mappings":";;;;;;;;QAYaA;eAAAA;;QAPAC;eAAAA;;;0BALQ;sBACA;wBACF;4BACQ;AAEpB,MAAMA,gBAAgB,OAAOC,aAAqBC;IACvDC,eAAM,CAACC,OAAO,CAAC,CAAC,uBAAuB,EAAEH,aAAa;IAEtD,MAAMI,cAAcC,eAAeJ,SAASD;IAC5C,OAAO,MAAMM,IAAAA,sBAAU,EAACF;AAC1B;AAEO,MAAMN,mBAAmB,OAAOE,aAAqBC;IAC1D,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 +0,0 @@
|
|
|
1
|
-
export declare const json5Parse: <T>(content: string) => T;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "json5Parse", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return json5Parse;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _json5 = require("json5");
|
|
9
|
-
const json5Parse = (content)=>_json5.parse(content);
|
|
10
|
-
|
|
11
|
-
//# sourceMappingURL=json5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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;;;eAAAA;;;uBAFU;AAEhB,MAAMA,aAAa,CAAIC,UAAuBC,OAAMC,KAAK,CAAIF"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "getPackageManager", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return getPackageManager;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _promises = require("node:fs/promises");
|
|
9
|
-
const _nodepath = require("node:path");
|
|
10
|
-
const _packagejson = require("./package-json");
|
|
11
|
-
const getPackageManager = async (workingDirectory)=>{
|
|
12
|
-
const packageJsonPath = (0, _nodepath.join)(workingDirectory, "package.json");
|
|
13
|
-
const packageJson = await (0, _packagejson.readPackageJson)(packageJsonPath);
|
|
14
|
-
if (packageJson.packageManager) {
|
|
15
|
-
const result = tryResolveFromPackageManager(packageJson.packageManager);
|
|
16
|
-
if (result) {
|
|
17
|
-
return result;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return await resolveFromLockFileDiscovery(workingDirectory);
|
|
21
|
-
};
|
|
22
|
-
const tryResolveFromPackageManager = (packageManager)=>{
|
|
23
|
-
if (packageManager.startsWith("npm")) {
|
|
24
|
-
return "npm";
|
|
25
|
-
}
|
|
26
|
-
if (packageManager.startsWith("yarn")) {
|
|
27
|
-
return "yarn";
|
|
28
|
-
}
|
|
29
|
-
if (packageManager.startsWith("pnpm")) {
|
|
30
|
-
return "pnpm";
|
|
31
|
-
}
|
|
32
|
-
return undefined;
|
|
33
|
-
};
|
|
34
|
-
const resolveFromLockFileDiscovery = async (workingDirectory)=>{
|
|
35
|
-
if (await fileExists((0, _nodepath.join)(workingDirectory, "yarn.lock"))) {
|
|
36
|
-
return "yarn";
|
|
37
|
-
}
|
|
38
|
-
if (await fileExists((0, _nodepath.join)(workingDirectory, "pnpm-lock.yaml"))) {
|
|
39
|
-
return "pnpm";
|
|
40
|
-
}
|
|
41
|
-
return "npm";
|
|
42
|
-
};
|
|
43
|
-
const fileExists = async (path)=>{
|
|
44
|
-
try {
|
|
45
|
-
await (0, _promises.access)(path);
|
|
46
|
-
return true;
|
|
47
|
-
} catch (error) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
//# sourceMappingURL=get-package-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/license-cop/src/lib/dependency/get-package-manager.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { readPackageJson } from \"./package-json\";\n\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\";\n\nexport const getPackageManager = async (workingDirectory: string): Promise<PackageManager> => {\n const packageJsonPath = join(workingDirectory, \"package.json\");\n const packageJson = await readPackageJson(packageJsonPath);\n\n if (packageJson.packageManager) {\n const result = tryResolveFromPackageManager(packageJson.packageManager);\n if (result) {\n return result;\n }\n }\n\n return await resolveFromLockFileDiscovery(workingDirectory);\n};\n\nconst tryResolveFromPackageManager = (packageManager: string): PackageManager | undefined => {\n if (packageManager.startsWith(\"npm\")) {\n return \"npm\";\n }\n\n if (packageManager.startsWith(\"yarn\")) {\n return \"yarn\";\n }\n\n if (packageManager.startsWith(\"pnpm\")) {\n return \"pnpm\";\n }\n\n return undefined;\n};\n\nconst resolveFromLockFileDiscovery = async (workingDirectory: string): Promise<PackageManager> => {\n if (await fileExists(join(workingDirectory, \"yarn.lock\"))) {\n return \"yarn\";\n }\n\n if (await fileExists(join(workingDirectory, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n\n return \"npm\";\n};\n\nconst fileExists = async (path: string): Promise<boolean> => {\n try {\n await access(path);\n return true;\n } catch (error) {\n return false;\n }\n};\n"],"names":["getPackageManager","workingDirectory","packageJsonPath","join","packageJson","readPackageJson","packageManager","result","tryResolveFromPackageManager","resolveFromLockFileDiscovery","startsWith","undefined","fileExists","path","access","error"],"mappings":";+BAMaA;;;eAAAA;;;0BANU;0BACF;6BACW;AAIzB,MAAMA,oBAAoB,OAAOC;IACtC,MAAMC,kBAAkBC,IAAAA,cAAI,EAACF,kBAAkB;IAC/C,MAAMG,cAAc,MAAMC,IAAAA,4BAAe,EAACH;IAE1C,IAAIE,YAAYE,cAAc,EAAE;QAC9B,MAAMC,SAASC,6BAA6BJ,YAAYE,cAAc;QACtE,IAAIC,QAAQ;YACV,OAAOA;QACT;IACF;IAEA,OAAO,MAAME,6BAA6BR;AAC5C;AAEA,MAAMO,+BAA+B,CAACF;IACpC,IAAIA,eAAeI,UAAU,CAAC,QAAQ;QACpC,OAAO;IACT;IAEA,IAAIJ,eAAeI,UAAU,CAAC,SAAS;QACrC,OAAO;IACT;IAEA,IAAIJ,eAAeI,UAAU,CAAC,SAAS;QACrC,OAAO;IACT;IAEA,OAAOC;AACT;AAEA,MAAMF,+BAA+B,OAAOR;IAC1C,IAAI,MAAMW,WAAWT,IAAAA,cAAI,EAACF,kBAAkB,eAAe;QACzD,OAAO;IACT;IAEA,IAAI,MAAMW,WAAWT,IAAAA,cAAI,EAACF,kBAAkB,oBAAoB;QAC9D,OAAO;IACT;IAEA,OAAO;AACT;AAEA,MAAMW,aAAa,OAAOC;IACxB,IAAI;QACF,MAAMC,IAAAA,gBAAM,EAACD;QACb,OAAO;IACT,EAAE,OAAOE,OAAO;QACd,OAAO;IACT;AACF"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
declare const packageJsonValidator: z.ZodObject<{
|
|
3
|
-
name: z.ZodString;
|
|
4
|
-
version: z.ZodString;
|
|
5
|
-
license: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
6
|
-
type: z.ZodString;
|
|
7
|
-
url: z.ZodOptional<z.ZodString>;
|
|
8
|
-
}, z.core.$strip>]>>;
|
|
9
|
-
licenses: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
10
|
-
type: z.ZodString;
|
|
11
|
-
url: z.ZodOptional<z.ZodString>;
|
|
12
|
-
}, z.core.$strip>>>;
|
|
13
|
-
packageManager: z.ZodOptional<z.ZodString>;
|
|
14
|
-
}, z.core.$strip>;
|
|
15
|
-
type PackageJson = z.infer<typeof packageJsonValidator>;
|
|
16
|
-
export declare const readPackageJson: (pathToPackageJson: string) => Promise<PackageJson>;
|
|
17
|
-
export declare const getLicenseExpression: (packageJson: PackageJson) => string;
|
|
18
|
-
export {};
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
function _export(target, all) {
|
|
3
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
4
|
-
enumerable: true,
|
|
5
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
6
|
-
});
|
|
7
|
-
}
|
|
8
|
-
_export(exports, {
|
|
9
|
-
get getLicenseExpression () {
|
|
10
|
-
return getLicenseExpression;
|
|
11
|
-
},
|
|
12
|
-
get readPackageJson () {
|
|
13
|
-
return readPackageJson;
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
const _promises = require("fs/promises");
|
|
17
|
-
const _zod = require("zod");
|
|
18
|
-
const _json5 = require("../config/parsers/json5");
|
|
19
|
-
const _logger = require("../logger");
|
|
20
|
-
const licenseSectionValidator = _zod.z.object({
|
|
21
|
-
type: _zod.z.string(),
|
|
22
|
-
url: _zod.z.string().optional()
|
|
23
|
-
});
|
|
24
|
-
const packageJsonValidator = _zod.z.object({
|
|
25
|
-
name: _zod.z.string(),
|
|
26
|
-
version: _zod.z.string(),
|
|
27
|
-
license: _zod.z.union([
|
|
28
|
-
_zod.z.string(),
|
|
29
|
-
licenseSectionValidator
|
|
30
|
-
]).optional(),
|
|
31
|
-
licenses: licenseSectionValidator.array().optional(),
|
|
32
|
-
packageManager: _zod.z.string().optional()
|
|
33
|
-
});
|
|
34
|
-
const readPackageJson = async (pathToPackageJson)=>{
|
|
35
|
-
const doesPackageJsonExist = await doesFileExist(pathToPackageJson);
|
|
36
|
-
if (!doesPackageJsonExist) {
|
|
37
|
-
_logger.default.verbose(`Cannot find the package.json: '${pathToPackageJson}'`);
|
|
38
|
-
throw new Error(`Cannot find the file: '${pathToPackageJson}'`);
|
|
39
|
-
}
|
|
40
|
-
const packageJsonAsString = await (0, _promises.readFile)(pathToPackageJson, {
|
|
41
|
-
encoding: "utf8"
|
|
42
|
-
});
|
|
43
|
-
const parsedFile = (0, _json5.json5Parse)(packageJsonAsString);
|
|
44
|
-
const packageJson = packageJsonValidator.safeParse(parsedFile);
|
|
45
|
-
if (!packageJson.success) {
|
|
46
|
-
throw new Error(`Unable to parse package.json: ${pathToPackageJson}: ${packageJson.error.message}`);
|
|
47
|
-
}
|
|
48
|
-
return packageJson.data;
|
|
49
|
-
};
|
|
50
|
-
const getLicenseExpression = (packageJson)=>{
|
|
51
|
-
if (packageJson.license && typeof packageJson.license === "string") {
|
|
52
|
-
return packageJson.license;
|
|
53
|
-
}
|
|
54
|
-
if (packageJson.license && typeof packageJson.license === "object") {
|
|
55
|
-
return packageJson.license.type;
|
|
56
|
-
}
|
|
57
|
-
if (packageJson.licenses) {
|
|
58
|
-
const licenses = packageJson.licenses.map((license)=>license.type);
|
|
59
|
-
if (licenses.length === 1) {
|
|
60
|
-
return licenses[0];
|
|
61
|
-
}
|
|
62
|
-
return `(${licenses.join(" AND ")})`;
|
|
63
|
-
}
|
|
64
|
-
return "UNLICENSED";
|
|
65
|
-
};
|
|
66
|
-
const doesFileExist = async (path)=>{
|
|
67
|
-
try {
|
|
68
|
-
const stats = await (0, _promises.stat)(path);
|
|
69
|
-
return stats.isFile();
|
|
70
|
-
} catch (unused) {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
//# sourceMappingURL=package-json.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/license-cop/src/lib/dependency/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 licenseSectionValidator = z.object({\n type: z.string(),\n url: z.string().optional()\n});\n\nconst packageJsonValidator = z.object({\n name: z.string(),\n version: z.string(),\n license: z.union([z.string(), licenseSectionValidator]).optional(),\n licenses: licenseSectionValidator.array().optional(),\n packageManager: z.string().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 && typeof packageJson.license === \"string\") {\n return packageJson.license;\n }\n\n if (packageJson.license && typeof packageJson.license === \"object\") {\n return packageJson.license.type;\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":["getLicenseExpression","readPackageJson","licenseSectionValidator","z","object","type","string","url","optional","packageJsonValidator","name","version","license","union","licenses","array","packageManager","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":";;;;;;;;QA2CaA;eAAAA;;QAtBAC;eAAAA;;;0BApBkB;qBACb;uBACS;wBACR;AAEnB,MAAMC,0BAA0BC,MAAC,CAACC,MAAM,CAAC;IACvCC,MAAMF,MAAC,CAACG,MAAM;IACdC,KAAKJ,MAAC,CAACG,MAAM,GAAGE,QAAQ;AAC1B;AAEA,MAAMC,uBAAuBN,MAAC,CAACC,MAAM,CAAC;IACpCM,MAAMP,MAAC,CAACG,MAAM;IACdK,SAASR,MAAC,CAACG,MAAM;IACjBM,SAAST,MAAC,CAACU,KAAK,CAAC;QAACV,MAAC,CAACG,MAAM;QAAIJ;KAAwB,EAAEM,QAAQ;IAChEM,UAAUZ,wBAAwBa,KAAK,GAAGP,QAAQ;IAClDQ,gBAAgBb,MAAC,CAACG,MAAM,GAAGE,QAAQ;AACrC;AAIO,MAAMP,kBAAkB,OAAOgB;IACpC,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;IAChE;IAEA,MAAMM,sBAA8B,MAAMC,IAAAA,kBAAQ,EAACP,mBAAmB;QAAEQ,UAAU;IAAO;IAEzF,MAAMC,aAAaC,IAAAA,iBAAU,EAAUJ;IAEvC,MAAMK,cAAcnB,qBAAqBoB,SAAS,CAACH;IAEnD,IAAI,CAACE,YAAYE,OAAO,EAAE;QACxB,MAAM,IAAIR,MACR,CAAC,8BAA8B,EAAEL,kBAAkB,EAAE,EAAEW,YAAYG,KAAK,CAACC,OAAO,EAAE;IAEtF;IAEA,OAAOJ,YAAYK,IAAI;AACzB;AAEO,MAAMjC,uBAAuB,CAAC4B;IACnC,IAAIA,YAAYhB,OAAO,IAAI,OAAOgB,YAAYhB,OAAO,KAAK,UAAU;QAClE,OAAOgB,YAAYhB,OAAO;IAC5B;IAEA,IAAIgB,YAAYhB,OAAO,IAAI,OAAOgB,YAAYhB,OAAO,KAAK,UAAU;QAClE,OAAOgB,YAAYhB,OAAO,CAACP,IAAI;IACjC;IAEA,IAAIuB,YAAYd,QAAQ,EAAE;QACxB,MAAMA,WAAWc,YAAYd,QAAQ,CAACoB,GAAG,CAAStB,CAAAA,UAAWA,QAAQP,IAAI;QAEzE,IAAIS,SAASqB,MAAM,KAAK,GAAG;YACzB,OAAOrB,QAAQ,CAAC,EAAE;QACpB;QAEA,OAAO,CAAC,CAAC,EAAEA,SAASsB,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC;IAEA,OAAO;AACT;AAEA,MAAMjB,gBAAgB,OAAOkB;IAC3B,IAAI;QACF,MAAMC,QAAe,MAAMC,IAAAA,cAAI,EAACF;QAChC,OAAOC,MAAME,MAAM;IACrB,EAAE,eAAM;QACN,OAAO;IACT;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const isAllowedPackage: (packageName: string, packageVersion: string, allowedPackages: string[]) => boolean;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "isAllowedPackage", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return isAllowedPackage;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _compareversions = require("compare-versions");
|
|
9
|
-
const isAllowedPackage = (packageName, packageVersion, allowedPackages)=>{
|
|
10
|
-
for (const allowedPackage of allowedPackages){
|
|
11
|
-
if (allowedPackage === packageName) {
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
if (allowedPackage.startsWith(packageName + "@")) {
|
|
15
|
-
const allowedPackageVersion = allowedPackage.substring(packageName.length + 1);
|
|
16
|
-
if ((0, _compareversions.satisfies)(packageVersion, allowedPackageVersion)) {
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
return false;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
//# sourceMappingURL=package-rules.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/license-cop/src/lib/dependency/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;;;eAAAA;;;iCAFa;AAEnB,MAAMA,mBAAmB,CAC9BC,aACAC,gBACAC;IAEA,KAAK,MAAMC,kBAAkBD,gBAAiB;QAC5C,IAAIC,mBAAmBH,aAAa;YAClC,OAAO;QACT;QAEA,IAAIG,eAAeC,UAAU,CAACJ,cAAc,MAAM;YAChD,MAAMK,wBAAwBF,eAAeG,SAAS,CAACN,YAAYO,MAAM,GAAG;YAE5E,IAAIC,IAAAA,0BAAS,EAACP,gBAAgBI,wBAAwB;gBACpD,OAAO;YACT;QACF;IACF;IAEA,OAAO;AACT"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "npmDependencyScanning", {
|
|
3
|
-
enumerable: true,
|
|
4
|
-
get: function() {
|
|
5
|
-
return npmDependencyScanning;
|
|
6
|
-
}
|
|
7
|
-
});
|
|
8
|
-
const _nodepath = require("node:path");
|
|
9
|
-
const _packagejson = require("../dependency/package-json");
|
|
10
|
-
const _packagerules = require("../dependency/package-rules");
|
|
11
|
-
const _logger = require("../logger");
|
|
12
|
-
const _calculateissues = require("../spdx/calculate-issues");
|
|
13
|
-
const _parselicenseexpression = require("../spdx/parse-license-expression");
|
|
14
|
-
const _joinstringarray = require("../utils/join-string-array");
|
|
15
|
-
const Arborist = require("@npmcli/arborist");
|
|
16
|
-
const npmDependencyScanning = async (options)=>{
|
|
17
|
-
const { workingDirectory, allowedLicenses, allowedPackages, includeDevDependencies, devDependenciesOnly } = options;
|
|
18
|
-
const foundAllowedPackages = new Map();
|
|
19
|
-
const packagesWithAllowedLicenses = new Map();
|
|
20
|
-
const packagesWithNoLicenses = new Map();
|
|
21
|
-
const packagesWithForbiddenLicenses = new Map();
|
|
22
|
-
const arborist = new Arborist({
|
|
23
|
-
path: workingDirectory
|
|
24
|
-
});
|
|
25
|
-
const topNode = await arborist.loadActual();
|
|
26
|
-
// This function is very similar to the one in pnpm.ts
|
|
27
|
-
// If you change this, you probably want to change that one too
|
|
28
|
-
const parseNode = async (node)=>{
|
|
29
|
-
_logger.default.verbose(`Parsing node: ${node.name}`);
|
|
30
|
-
const isDevDependency = node.dev;
|
|
31
|
-
if (!includeDevDependencies && !devDependenciesOnly && isDevDependency) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
if (devDependenciesOnly && !isDevDependency) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
const packageJsonPath = (0, _nodepath.join)(node.realpath, "package.json");
|
|
38
|
-
const packageJson = await (0, _packagejson.readPackageJson)(packageJsonPath);
|
|
39
|
-
if ((0, _packagerules.isAllowedPackage)(node.name, packageJson.version, allowedPackages)) {
|
|
40
|
-
_logger.default.verbose(`Package ${packageJson.name} is an allowed package`);
|
|
41
|
-
foundAllowedPackages.set(node.pkgid, {
|
|
42
|
-
name: packageJson.name,
|
|
43
|
-
version: packageJson.version
|
|
44
|
-
});
|
|
45
|
-
if (node.children.size > 0) {
|
|
46
|
-
await parseNodes(node.children.values());
|
|
47
|
-
}
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const rawLicenseExpression = (0, _packagejson.getLicenseExpression)(packageJson);
|
|
51
|
-
const licenseExpression = (0, _parselicenseexpression.parseLicenseExpression)(rawLicenseExpression);
|
|
52
|
-
if (licenseExpression.type === "unlicensed") {
|
|
53
|
-
_logger.default.verbose(`Package ${packageJson.name} is unlicensed`);
|
|
54
|
-
packagesWithNoLicenses.set(node.pkgid, {
|
|
55
|
-
name: packageJson.name,
|
|
56
|
-
version: packageJson.version
|
|
57
|
-
});
|
|
58
|
-
if (node.children.size > 0) {
|
|
59
|
-
await parseNodes(node.children.values());
|
|
60
|
-
}
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const licenseIssues = (0, _calculateissues.calculateIssues)(licenseExpression, allowedLicenses);
|
|
64
|
-
const joinedIssues = (0, _joinstringarray.joinStringArray)(licenseIssues);
|
|
65
|
-
if (licenseIssues.length > 0) {
|
|
66
|
-
_logger.default.verbose(`Package ${packageJson.name} has the forbidden license: ${joinedIssues}`);
|
|
67
|
-
packagesWithForbiddenLicenses.set(node.pkgid, {
|
|
68
|
-
name: packageJson.name,
|
|
69
|
-
version: packageJson.version,
|
|
70
|
-
licenseIdentifiers: joinedIssues,
|
|
71
|
-
spdxExpression: rawLicenseExpression
|
|
72
|
-
});
|
|
73
|
-
} else {
|
|
74
|
-
_logger.default.verbose(`Package ${packageJson.name} has the allowed license: ${rawLicenseExpression}`);
|
|
75
|
-
packagesWithAllowedLicenses.set(node.pkgid, {
|
|
76
|
-
name: packageJson.name,
|
|
77
|
-
version: packageJson.version,
|
|
78
|
-
spdxExpression: rawLicenseExpression,
|
|
79
|
-
licenses: licenseExpression
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
if (node.children.size > 0) {
|
|
83
|
-
parseNodes(node.children.values());
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
const parseNodes = async (nodes)=>{
|
|
87
|
-
for (const node of nodes){
|
|
88
|
-
await parseNode(node);
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
await parseNodes(topNode.children.values());
|
|
92
|
-
return {
|
|
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
|
-
};
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
//# sourceMappingURL=npm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"],"mappings":"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"}
|