@aws/nx-plugin 1.0.0-rc.4 → 1.0.0-rc.5
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-THIRD-PARTY +1820 -476
- package/executors.json +9 -0
- package/package.json +5 -1
- package/sdk/license.d.ts +8 -0
- package/sdk/license.js +13 -0
- package/sdk/license.js.map +1 -0
- package/src/license/__snapshots__/config.spec.ts.snap +23 -0
- package/src/license/config-types.d.ts +17 -0
- package/src/license/config.d.ts +63 -5
- package/src/license/config.js +315 -7
- package/src/license/config.js.map +1 -1
- package/src/license/dependency-check/check.d.ts +12 -0
- package/src/license/dependency-check/check.js +111 -0
- package/src/license/dependency-check/check.js.map +1 -0
- package/src/license/dependency-check/collectors/collector.d.ts +21 -0
- package/src/license/dependency-check/collectors/collector.js +76 -0
- package/src/license/dependency-check/collectors/collector.js.map +1 -0
- package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
- package/src/license/dependency-check/collectors/npm-collector.js +75 -0
- package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
- package/src/license/dependency-check/collectors/python-collector.d.ts +19 -0
- package/src/license/dependency-check/collectors/python-collector.js +121 -0
- package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
- package/src/license/dependency-check/evaluator.d.ts +9 -0
- package/src/license/dependency-check/evaluator.js +122 -0
- package/src/license/dependency-check/evaluator.js.map +1 -0
- package/src/license/dependency-check/executor-schema.json +6 -0
- package/src/license/dependency-check/executor.d.ts +9 -0
- package/src/license/dependency-check/executor.js +43 -0
- package/src/license/dependency-check/executor.js.map +1 -0
- package/src/license/dependency-check/pre-approved.d.ts +6 -0
- package/src/license/dependency-check/pre-approved.js +1280 -0
- package/src/license/dependency-check/pre-approved.js.map +1 -0
- package/src/license/dependency-check/types.d.ts +45 -0
- package/src/license/dependency-check/types.js +7 -0
- package/src/license/dependency-check/types.js.map +1 -0
- package/src/license/generator.js +110 -11
- package/src/license/generator.js.map +1 -1
- package/src/license/index.d.ts +8 -0
- package/src/license/index.js +13 -0
- package/src/license/index.js.map +1 -0
- package/src/license/known-exceptions.d.ts +7 -0
- package/src/license/known-exceptions.js +33 -0
- package/src/license/known-exceptions.js.map +1 -0
- package/src/license/schema.d.ts +5 -0
- package/src/license/schema.json +6 -0
- package/src/license/sync/generator.js +10 -10
- package/src/license/sync/generator.js.map +1 -1
- package/src/license/sync/project-file-sync.d.ts +2 -2
- package/src/license/sync/project-file-sync.js.map +1 -1
- package/src/py/agent/generator.js +5 -0
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/mcp-server/generator.js +3 -0
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/project/generator.js +7 -0
- package/src/py/project/generator.js.map +1 -1
- package/src/ts/lib/ts-project-utils.js +6 -0
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/mcp-server/generator.js +3 -0
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +22 -38
- package/src/ts/rdb/files/scripts/{docker-pull.ts.template → pull-image.ts.template} +1 -1
- package/src/ts/rdb/files/scripts/{docker-start.ts.template → start-container.ts.template} +23 -23
- package/src/ts/rdb/generator.js +8 -8
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/utils/ast.d.ts +28 -0
- package/src/utils/ast.js +59 -1
- package/src/utils/ast.js.map +1 -1
- package/src/utils/config/utils.d.ts +11 -1
- package/src/utils/config/utils.js +37 -5
- package/src/utils/config/utils.js.map +1 -1
- package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +4 -4
- package/src/utils/rdb-constructs/rdb-constructs.d.ts +1 -1
- package/src/utils/versions.d.ts +2 -1
- package/src/utils/versions.js +1 -0
- package/src/utils/versions.js.map +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatReport = exports.runCheck = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
const evaluator_1 = require("./evaluator");
|
|
9
|
+
const collector_1 = require("./collectors/collector");
|
|
10
|
+
const utils_1 = require("../../utils/config/utils");
|
|
11
|
+
const findException = (exceptions, name, version) => {
|
|
12
|
+
if (!exceptions)
|
|
13
|
+
return undefined;
|
|
14
|
+
return exceptions.find((e) => e && e.package === name && (!e.version || e.version === version));
|
|
15
|
+
};
|
|
16
|
+
const runCheck = async (options) => {
|
|
17
|
+
const { projectRoot, config } = options;
|
|
18
|
+
const collectors = options.collectors ?? collector_1.DEFAULT_COLLECTORS;
|
|
19
|
+
const evaluator = (0, evaluator_1.createEvaluator)({ allow: config.allow });
|
|
20
|
+
const allDeps = await Promise.all(collectors.map((c) => c.collect({ workspaceRoot: projectRoot })));
|
|
21
|
+
const dependencies = [];
|
|
22
|
+
for (const deps of allDeps) {
|
|
23
|
+
for (const dep of deps) {
|
|
24
|
+
const exception = findException(config.exceptions, dep.name, dep.version);
|
|
25
|
+
const license = exception?.spdx ?? dep.rawLicense;
|
|
26
|
+
const status = exception ? 'PRE_APPROVED' : evaluator.evaluate(license);
|
|
27
|
+
config.onDependency?.({ package: dep.name, spdx: license });
|
|
28
|
+
dependencies.push({
|
|
29
|
+
name: dep.name,
|
|
30
|
+
version: dep.version,
|
|
31
|
+
ecosystem: dep.ecosystem,
|
|
32
|
+
rawLicense: dep.rawLicense,
|
|
33
|
+
status,
|
|
34
|
+
exception,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const pass = !dependencies.some((d) => d.status === 'NOT_APPROVED' || d.status === 'UNKNOWN');
|
|
39
|
+
return { pass, dependencies };
|
|
40
|
+
};
|
|
41
|
+
exports.runCheck = runCheck;
|
|
42
|
+
const formatReport = (result, options) => {
|
|
43
|
+
const groups = new Map();
|
|
44
|
+
for (const dep of result.dependencies) {
|
|
45
|
+
if (dep.status === 'PRE_APPROVED')
|
|
46
|
+
continue;
|
|
47
|
+
const arr = groups.get(dep.status) ?? [];
|
|
48
|
+
arr.push(dep);
|
|
49
|
+
groups.set(dep.status, arr);
|
|
50
|
+
}
|
|
51
|
+
if (groups.size === 0) {
|
|
52
|
+
const total = result.dependencies.length;
|
|
53
|
+
return `License check passed (${total} dependencies inspected).`;
|
|
54
|
+
}
|
|
55
|
+
const failing = [
|
|
56
|
+
...(groups.get('NOT_APPROVED') ?? []),
|
|
57
|
+
...(groups.get('UNKNOWN') ?? []),
|
|
58
|
+
];
|
|
59
|
+
const lines = ['License check failed:', ''];
|
|
60
|
+
for (const status of ['NOT_APPROVED', 'UNKNOWN']) {
|
|
61
|
+
const deps = groups.get(status);
|
|
62
|
+
if (!deps || deps.length === 0)
|
|
63
|
+
continue;
|
|
64
|
+
lines.push(` ${status}:`);
|
|
65
|
+
for (const dep of deps) {
|
|
66
|
+
const license = dep.rawLicense || '(no license declared)';
|
|
67
|
+
lines.push(` - ${dep.name}@${dep.version} [${dep.ecosystem}] ${license}`);
|
|
68
|
+
}
|
|
69
|
+
lines.push('');
|
|
70
|
+
}
|
|
71
|
+
const collectors = options?.collectors ?? collector_1.DEFAULT_COLLECTORS;
|
|
72
|
+
const activeEcosystems = new Set(result.dependencies.map((d) => d.ecosystem));
|
|
73
|
+
const traceCommands = collectors.filter((c) => {
|
|
74
|
+
if (!c.traceCommand)
|
|
75
|
+
return false;
|
|
76
|
+
const eco = c.name === 'python' ? 'pypi' : c.name;
|
|
77
|
+
return activeEcosystems.has(eco);
|
|
78
|
+
});
|
|
79
|
+
if (traceCommands.length > 0) {
|
|
80
|
+
lines.push('To trace the dependency chain:');
|
|
81
|
+
for (const c of traceCommands) {
|
|
82
|
+
lines.push(` ${c.name}: ${c.traceCommand}`);
|
|
83
|
+
}
|
|
84
|
+
lines.push('');
|
|
85
|
+
}
|
|
86
|
+
lines.push(`To fix, add exceptions to license.dependencies.exceptions in ${utils_1.AWS_NX_PLUGIN_CONFIG_FILE_NAME}:`);
|
|
87
|
+
lines.push('');
|
|
88
|
+
lines.push(' exceptions: [');
|
|
89
|
+
for (const dep of failing) {
|
|
90
|
+
lines.push(` { package: '${dep.name}', reason: '<your reason>' },`);
|
|
91
|
+
}
|
|
92
|
+
lines.push(' ]');
|
|
93
|
+
lines.push('');
|
|
94
|
+
const uniqueLicenses = [
|
|
95
|
+
...new Set(failing
|
|
96
|
+
.filter((d) => d.rawLicense && d.status === 'NOT_APPROVED')
|
|
97
|
+
.map((d) => d.rawLicense)),
|
|
98
|
+
];
|
|
99
|
+
if (uniqueLicenses.length > 0) {
|
|
100
|
+
lines.push('Or add the license to license.dependencies.allow if it should be broadly permitted:');
|
|
101
|
+
lines.push('');
|
|
102
|
+
lines.push(' allow: [');
|
|
103
|
+
for (const lic of uniqueLicenses) {
|
|
104
|
+
lines.push(` { spdxId: '${lic}', fullName: '${lic}', aliases: [] },`);
|
|
105
|
+
}
|
|
106
|
+
lines.push(' ]');
|
|
107
|
+
}
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
};
|
|
110
|
+
exports.formatReport = formatReport;
|
|
111
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/license/dependency-check/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
export interface CollectedDependency {
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
rawLicense: string;
|
|
9
|
+
ecosystem: string;
|
|
10
|
+
path?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface LicenseCollector {
|
|
13
|
+
name: string;
|
|
14
|
+
traceCommand?: string;
|
|
15
|
+
collect(options: {
|
|
16
|
+
workspaceRoot: string;
|
|
17
|
+
}): Promise<CollectedDependency[]>;
|
|
18
|
+
}
|
|
19
|
+
export declare const npmCollector: () => LicenseCollector;
|
|
20
|
+
export declare const pythonCollector: () => LicenseCollector;
|
|
21
|
+
export declare const DEFAULT_COLLECTORS: LicenseCollector[];
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.DEFAULT_COLLECTORS = exports.pythonCollector = exports.npmCollector = void 0;
|
|
41
|
+
const npmCollector = () => ({
|
|
42
|
+
name: 'npm',
|
|
43
|
+
get traceCommand() {
|
|
44
|
+
const { existsSync } = require('fs');
|
|
45
|
+
const { join } = require('path');
|
|
46
|
+
const { workspaceRoot } = require('@nx/devkit');
|
|
47
|
+
if (existsSync(join(workspaceRoot, 'yarn.lock')))
|
|
48
|
+
return 'yarn why <package>';
|
|
49
|
+
if (existsSync(join(workspaceRoot, 'bun.lockb')))
|
|
50
|
+
return 'bun pm why <package>';
|
|
51
|
+
if (existsSync(join(workspaceRoot, 'package-lock.json')))
|
|
52
|
+
return 'npm why <package>';
|
|
53
|
+
return 'pnpm why <package>';
|
|
54
|
+
},
|
|
55
|
+
async collect({ workspaceRoot }) {
|
|
56
|
+
const { collectNpmDependencies } = await Promise.resolve().then(() => __importStar(require('./npm-collector')));
|
|
57
|
+
return (await collectNpmDependencies({ start: workspaceRoot })).map((d) => ({ ...d, ecosystem: 'npm' }));
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
exports.npmCollector = npmCollector;
|
|
61
|
+
const pythonCollector = () => ({
|
|
62
|
+
name: 'python',
|
|
63
|
+
traceCommand: 'uv tree --invert --package <package>',
|
|
64
|
+
async collect({ workspaceRoot }) {
|
|
65
|
+
const { collectPythonDependencies } = await Promise.resolve().then(() => __importStar(require('./python-collector')));
|
|
66
|
+
const { findWorkspacePyProjectNames } = await Promise.resolve().then(() => __importStar(require('./python-collector')));
|
|
67
|
+
const excludePackages = await findWorkspacePyProjectNames(workspaceRoot);
|
|
68
|
+
return (await collectPythonDependencies({ start: workspaceRoot, excludePackages })).map((d) => ({ ...d, ecosystem: 'pypi' }));
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
exports.pythonCollector = pythonCollector;
|
|
72
|
+
exports.DEFAULT_COLLECTORS = [
|
|
73
|
+
(0, exports.npmCollector)(),
|
|
74
|
+
(0, exports.pythonCollector)(),
|
|
75
|
+
];
|
|
76
|
+
//# sourceMappingURL=collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/license/dependency-check/collectors/collector.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBI,MAAM,YAAY,GAAG,GAAqB,EAAE,CAAC,CAAC;IACnD,IAAI,EAAE,KAAK;IACX,IAAI,YAAY;QACd,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAC9C,OAAO,oBAAoB,CAAC;QAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAC9C,OAAO,sBAAsB,CAAC;QAChC,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;YACtD,OAAO,mBAAmB,CAAC;QAC7B,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE;QAC7B,MAAM,EAAE,sBAAsB,EAAE,GAAG,wDAAa,iBAAiB,GAAC,CAAC;QACnE,OAAO,CAAC,MAAM,sBAAsB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,GAAG,CACjE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CACpC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AApBU,QAAA,YAAY,gBAoBtB;AAEI,MAAM,eAAe,GAAG,GAAqB,EAAE,CAAC,CAAC;IACtD,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,sCAAsC;IACpD,KAAK,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE;QAC7B,MAAM,EAAE,yBAAyB,EAAE,GAAG,wDAAa,oBAAoB,GAAC,CAAC;QACzE,MAAM,EAAE,2BAA2B,EAAE,GAAG,wDAAa,oBAAoB,GAAC,CAAC;QAC3E,MAAM,eAAe,GAAG,MAAM,2BAA2B,CAAC,aAAa,CAAC,CAAC;QACzE,OAAO,CACL,MAAM,yBAAyB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAC3E,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC,CAAC;AAXU,QAAA,eAAe,mBAWzB;AAEU,QAAA,kBAAkB,GAAuB;IACpD,IAAA,oBAAY,GAAE;IACd,IAAA,uBAAe,GAAE;CAClB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface NpmDependency {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
rawLicense: string;
|
|
5
|
+
path?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface NpmCollectorOptions {
|
|
8
|
+
start: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const collectNpmDependencies: (options: NpmCollectorOptions) => Promise<NpmDependency[]>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectNpmDependencies = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
/**
|
|
6
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
7
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
8
|
+
*/
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const licenseChecker = tslib_1.__importStar(require("license-checker-rseidelsohn"));
|
|
12
|
+
const NAME_VERSION_RE = /^(@?[^@]+)@(.+)$/;
|
|
13
|
+
const splitNameVersion = (identifier) => {
|
|
14
|
+
const match = identifier.match(NAME_VERSION_RE);
|
|
15
|
+
if (!match) {
|
|
16
|
+
return { name: identifier, version: '0.0.0' };
|
|
17
|
+
}
|
|
18
|
+
return { name: match[1], version: match[2] };
|
|
19
|
+
};
|
|
20
|
+
const flattenLicense = (raw) => {
|
|
21
|
+
if (!raw)
|
|
22
|
+
return '';
|
|
23
|
+
if (Array.isArray(raw)) {
|
|
24
|
+
if (raw.length === 0)
|
|
25
|
+
return '';
|
|
26
|
+
if (raw.length === 1)
|
|
27
|
+
return raw[0];
|
|
28
|
+
return `(${raw.join(' OR ')})`;
|
|
29
|
+
}
|
|
30
|
+
return raw;
|
|
31
|
+
};
|
|
32
|
+
const collectNpmDependencies = async (options) => {
|
|
33
|
+
const nodeModules = (0, path_1.join)(options.start, 'node_modules');
|
|
34
|
+
if (!(0, fs_1.existsSync)(nodeModules)) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const exclude = new Set();
|
|
38
|
+
const projectPackageJson = (0, path_1.join)(options.start, 'package.json');
|
|
39
|
+
if ((0, fs_1.existsSync)(projectPackageJson)) {
|
|
40
|
+
try {
|
|
41
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)(projectPackageJson, 'utf-8'));
|
|
42
|
+
if (pkg.name)
|
|
43
|
+
exclude.add(pkg.name);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// ignore
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const packages = await new Promise((resolve, reject) => {
|
|
50
|
+
licenseChecker.init({
|
|
51
|
+
start: options.start,
|
|
52
|
+
excludePrivatePackages: true,
|
|
53
|
+
}, (err, results) => {
|
|
54
|
+
if (err)
|
|
55
|
+
reject(err);
|
|
56
|
+
else
|
|
57
|
+
resolve(results);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
const out = [];
|
|
61
|
+
for (const [identifier, info] of Object.entries(packages)) {
|
|
62
|
+
const { name, version } = splitNameVersion(identifier);
|
|
63
|
+
if (exclude.has(name))
|
|
64
|
+
continue;
|
|
65
|
+
out.push({
|
|
66
|
+
name,
|
|
67
|
+
version,
|
|
68
|
+
rawLicense: flattenLicense(info.licenses),
|
|
69
|
+
path: info.path,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
};
|
|
74
|
+
exports.collectNpmDependencies = collectNpmDependencies;
|
|
75
|
+
//# sourceMappingURL=npm-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-collector.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/license/dependency-check/collectors/npm-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface PythonDependency {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
rawLicense: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PythonCollectorOptions {
|
|
7
|
+
start: string;
|
|
8
|
+
excludePackages?: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Discover Python project names in the workspace (from pyproject.toml files)
|
|
12
|
+
* so they can be excluded from the license check.
|
|
13
|
+
*/
|
|
14
|
+
export declare const findWorkspacePyProjectNames: (start: string) => Promise<string[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Collect Python dependency licenses by invoking `uvx pip-licenses` against
|
|
17
|
+
* each discovered virtual environment.
|
|
18
|
+
*/
|
|
19
|
+
export declare const collectPythonDependencies: (options: PythonCollectorOptions) => Promise<PythonDependency[]>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectPythonDependencies = exports.findWorkspacePyProjectNames = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
/**
|
|
6
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
7
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
8
|
+
*/
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const child_process_1 = require("child_process");
|
|
12
|
+
const fast_glob_1 = require("fast-glob");
|
|
13
|
+
const toml_1 = tslib_1.__importDefault(require("@iarna/toml"));
|
|
14
|
+
const py_1 = require("../../../utils/py");
|
|
15
|
+
const isUsable = (value) => !!value && value !== 'UNKNOWN';
|
|
16
|
+
// Priority: License-Expression (PEP 639) > License-Metadata (legacy) > License-Classifier (deprecated classifiers)
|
|
17
|
+
const pickLicense = (entry) => {
|
|
18
|
+
if (isUsable(entry['License-Expression']))
|
|
19
|
+
return entry['License-Expression'];
|
|
20
|
+
if (isUsable(entry['License-Metadata']))
|
|
21
|
+
return entry['License-Metadata'];
|
|
22
|
+
if (isUsable(entry['License-Classifier']))
|
|
23
|
+
return entry['License-Classifier'];
|
|
24
|
+
return '';
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Discover Python project names in the workspace (from pyproject.toml files)
|
|
28
|
+
* so they can be excluded from the license check.
|
|
29
|
+
*/
|
|
30
|
+
const findWorkspacePyProjectNames = async (start) => {
|
|
31
|
+
const tomlFiles = await (0, fast_glob_1.glob)(['**/pyproject.toml'], {
|
|
32
|
+
cwd: start,
|
|
33
|
+
ignore: ['**/node_modules/**', '**/.venv/**', '**/venv/**', '**/dist/**'],
|
|
34
|
+
deep: 4,
|
|
35
|
+
suppressErrors: true,
|
|
36
|
+
});
|
|
37
|
+
const names = [];
|
|
38
|
+
for (const tomlFile of tomlFiles) {
|
|
39
|
+
try {
|
|
40
|
+
const content = (0, fs_1.readFileSync)((0, path_1.join)(start, tomlFile), 'utf-8');
|
|
41
|
+
const parsed = toml_1.default.parse(content);
|
|
42
|
+
const name = parsed.project?.name;
|
|
43
|
+
if (typeof name === 'string')
|
|
44
|
+
names.push(name);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// skip unreadable or malformed files
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return names;
|
|
51
|
+
};
|
|
52
|
+
exports.findWorkspacePyProjectNames = findWorkspacePyProjectNames;
|
|
53
|
+
const findVenvPythons = async (start) => {
|
|
54
|
+
const patterns = [
|
|
55
|
+
'**/.venv/bin/python',
|
|
56
|
+
'**/venv/bin/python',
|
|
57
|
+
'**/.venv/Scripts/python.exe',
|
|
58
|
+
'**/venv/Scripts/python.exe',
|
|
59
|
+
];
|
|
60
|
+
const candidates = await (0, fast_glob_1.glob)(patterns, {
|
|
61
|
+
cwd: start,
|
|
62
|
+
ignore: [
|
|
63
|
+
'**/node_modules/**',
|
|
64
|
+
'**/.nx/**',
|
|
65
|
+
'**/dist/**',
|
|
66
|
+
'**/build/**',
|
|
67
|
+
'**/.git/**',
|
|
68
|
+
],
|
|
69
|
+
deep: 6,
|
|
70
|
+
suppressErrors: true,
|
|
71
|
+
});
|
|
72
|
+
const pythons = candidates.map((c) => (0, path_1.join)(start, c));
|
|
73
|
+
if (process.env.UV_PROJECT_ENVIRONMENT) {
|
|
74
|
+
const envPython = (0, path_1.join)(process.env.UV_PROJECT_ENVIRONMENT, process.platform === 'win32' ? 'Scripts/python.exe' : 'bin/python');
|
|
75
|
+
if ((0, fs_1.existsSync)(envPython)) {
|
|
76
|
+
pythons.push(envPython);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return pythons.filter((p) => (0, fs_1.existsSync)(p));
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Collect Python dependency licenses by invoking `uvx pip-licenses` against
|
|
83
|
+
* each discovered virtual environment.
|
|
84
|
+
*/
|
|
85
|
+
const collectPythonDependencies = async (options) => {
|
|
86
|
+
const pythons = await findVenvPythons(options.start);
|
|
87
|
+
if (pythons.length === 0)
|
|
88
|
+
return [];
|
|
89
|
+
const seen = new Map();
|
|
90
|
+
const ignoreFlag = options.excludePackages?.length
|
|
91
|
+
? ` --ignore-packages ${options.excludePackages.join(' ')}`
|
|
92
|
+
: '';
|
|
93
|
+
const cmd = (0, py_1.uvxCommand)('pip-licenses', `--format json --from all${ignoreFlag}`);
|
|
94
|
+
for (const python of pythons) {
|
|
95
|
+
try {
|
|
96
|
+
const output = (0, child_process_1.execSync)(`${cmd} --python ${python}`, {
|
|
97
|
+
cwd: options.start,
|
|
98
|
+
encoding: 'utf-8',
|
|
99
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
100
|
+
timeout: 60_000,
|
|
101
|
+
});
|
|
102
|
+
const entries = JSON.parse(output);
|
|
103
|
+
for (const entry of entries) {
|
|
104
|
+
const key = `${entry.Name}@${entry.Version}`;
|
|
105
|
+
if (seen.has(key))
|
|
106
|
+
continue;
|
|
107
|
+
seen.set(key, {
|
|
108
|
+
name: entry.Name,
|
|
109
|
+
version: entry.Version,
|
|
110
|
+
rawLicense: pickLicense(entry),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// If pip-licenses fails for this venv, skip it
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return Array.from(seen.values());
|
|
119
|
+
};
|
|
120
|
+
exports.collectPythonDependencies = collectPythonDependencies;
|
|
121
|
+
//# sourceMappingURL=python-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-collector.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/license/dependency-check/collectors/python-collector.ts"],"names":[],"mappings":";;;;AAAA;;;GAGG;AACH,2BAA8C;AAC9C,+BAA4B;AAC5B,iDAAyC;AACzC,yCAA6C;AAC7C,+DAA+B;AAC/B,0CAA+C;AAqB/C,MAAM,QAAQ,GAAG,CAAC,KAAyB,EAAmB,EAAE,CAC9D,CAAC,CAAC,KAAK,IAAI,KAAK,KAAK,SAAS,CAAC;AAEjC,mHAAmH;AACnH,MAAM,WAAW,GAAG,CAAC,KAAuB,EAAU,EAAE;IACtD,IAAI,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9E,IAAI,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9E,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;GAGG;AACI,MAAM,2BAA2B,GAAG,KAAK,EAC9C,KAAa,EACM,EAAE;IACrB,MAAM,SAAS,GAAG,MAAM,IAAA,gBAAQ,EAAC,CAAC,mBAAmB,CAAC,EAAE;QACtD,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,CAAC,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,CAAC;QACzE,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IACH,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,cAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,IAAI,GAAI,MAAM,CAAC,OAAoC,EAAE,IAAI,CAAC;YAChE,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AArBW,QAAA,2BAA2B,+BAqBtC;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,KAAa,EAAqB,EAAE;IACjE,MAAM,QAAQ,GAAG;QACf,qBAAqB;QACrB,oBAAoB;QACpB,6BAA6B;QAC7B,4BAA4B;KAC7B,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,IAAA,gBAAQ,EAAC,QAAQ,EAAE;QAC1C,GAAG,EAAE,KAAK;QACV,MAAM,EAAE;YACN,oBAAoB;YACpB,WAAW;YACX,YAAY;YACZ,aAAa;YACb,YAAY;SACb;QACD,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,WAAI,EAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAEtD,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAA,WAAI,EACpB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAClC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,YAAY,CACnE,CAAC;QACF,IAAI,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,eAAU,EAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF;;;GAGG;AACI,MAAM,yBAAyB,GAAG,KAAK,EAC5C,OAA+B,EACF,EAAE;IAC/B,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAA4B,CAAC;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,MAAM;QAChD,CAAC,CAAC,sBAAsB,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAC3D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,GAAG,GAAG,IAAA,eAAU,EACpB,cAAc,EACd,2BAA2B,UAAU,EAAE,CACxC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,GAAG,GAAG,aAAa,MAAM,EAAE,EAAE;gBACnD,GAAG,EAAE,OAAO,CAAC,KAAK;gBAClB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAuB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACvD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC7C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC;AAxCW,QAAA,yBAAyB,6BAwCpC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AllowlistEntry, LicenseStatus } from './types';
|
|
2
|
+
export interface EvaluatorOptions {
|
|
3
|
+
allow: AllowlistEntry[];
|
|
4
|
+
}
|
|
5
|
+
interface Evaluator {
|
|
6
|
+
evaluate(rawLicense: string | undefined | null): LicenseStatus;
|
|
7
|
+
}
|
|
8
|
+
export declare const createEvaluator: (options: EvaluatorOptions) => Evaluator;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createEvaluator = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
/**
|
|
6
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
7
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
8
|
+
*/
|
|
9
|
+
const spdx_satisfies_1 = tslib_1.__importDefault(require("spdx-satisfies"));
|
|
10
|
+
const isUnknownToken = (raw) => {
|
|
11
|
+
if (!raw)
|
|
12
|
+
return true;
|
|
13
|
+
const trimmed = raw.trim();
|
|
14
|
+
if (!trimmed)
|
|
15
|
+
return true;
|
|
16
|
+
if (trimmed.toUpperCase() === 'UNKNOWN')
|
|
17
|
+
return true;
|
|
18
|
+
if (trimmed.toLowerCase().startsWith('custom:'))
|
|
19
|
+
return true;
|
|
20
|
+
if (trimmed.toLowerCase().startsWith('see license in'))
|
|
21
|
+
return true;
|
|
22
|
+
return false;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Strip the trailing `*` that license-checker adds when a license is guessed
|
|
26
|
+
* from file content rather than declared in package.json metadata.
|
|
27
|
+
*/
|
|
28
|
+
const normalise = (raw) => {
|
|
29
|
+
let s = raw.trim();
|
|
30
|
+
if (s.endsWith('*'))
|
|
31
|
+
s = s.slice(0, -1).trim();
|
|
32
|
+
return s;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Build a flat list of valid SPDX IDs from the allowlist for use with
|
|
36
|
+
* spdx-satisfies. Entries that aren't parseable as SPDX identifiers are
|
|
37
|
+
* excluded (they're still matched via the alias lookup).
|
|
38
|
+
*/
|
|
39
|
+
const buildSpdxIds = (allow) => {
|
|
40
|
+
const ids = [];
|
|
41
|
+
for (const entry of allow) {
|
|
42
|
+
if (!entry.spdxId)
|
|
43
|
+
continue;
|
|
44
|
+
try {
|
|
45
|
+
(0, spdx_satisfies_1.default)(entry.spdxId, [entry.spdxId]);
|
|
46
|
+
ids.push(entry.spdxId);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Not a valid SPDX identifier — skip for spdx-satisfies, still
|
|
50
|
+
// matched via alias lookup
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return ids;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Build a case-insensitive lookup for matching by full name or alias
|
|
57
|
+
* (for licenses that aren't valid SPDX but appear in package metadata).
|
|
58
|
+
*/
|
|
59
|
+
const buildAliasLookup = (allow) => {
|
|
60
|
+
const m = new Map();
|
|
61
|
+
for (const e of allow) {
|
|
62
|
+
if (e.spdxId)
|
|
63
|
+
m.set(e.spdxId.toLowerCase(), true);
|
|
64
|
+
if (e.fullName)
|
|
65
|
+
m.set(e.fullName.toLowerCase(), true);
|
|
66
|
+
for (const a of e.aliases ?? []) {
|
|
67
|
+
if (a)
|
|
68
|
+
m.set(a.toLowerCase(), true);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return m;
|
|
72
|
+
};
|
|
73
|
+
const evaluateToken = (token, spdxIds, aliasLookup) => {
|
|
74
|
+
const cleaned = normalise(token);
|
|
75
|
+
if (isUnknownToken(cleaned))
|
|
76
|
+
return 'UNKNOWN';
|
|
77
|
+
// Try spdx-satisfies for valid SPDX expressions
|
|
78
|
+
try {
|
|
79
|
+
if ((0, spdx_satisfies_1.default)(cleaned, spdxIds))
|
|
80
|
+
return 'PRE_APPROVED';
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Not a valid SPDX expression — fall through to alias matching
|
|
84
|
+
}
|
|
85
|
+
// Fall back to alias/fullName matching for non-SPDX strings
|
|
86
|
+
if (aliasLookup.has(cleaned.toLowerCase()))
|
|
87
|
+
return 'PRE_APPROVED';
|
|
88
|
+
return 'NOT_APPROVED';
|
|
89
|
+
};
|
|
90
|
+
const createEvaluator = (options) => {
|
|
91
|
+
const spdxIds = buildSpdxIds(options.allow);
|
|
92
|
+
const aliasLookup = buildAliasLookup(options.allow);
|
|
93
|
+
return {
|
|
94
|
+
evaluate(rawLicense) {
|
|
95
|
+
if (!rawLicense || rawLicense.trim().length === 0)
|
|
96
|
+
return 'UNKNOWN';
|
|
97
|
+
const normalised = normalise(rawLicense);
|
|
98
|
+
if (isUnknownToken(normalised))
|
|
99
|
+
return 'UNKNOWN';
|
|
100
|
+
// Python tooling emits "Apache Software License; BSD License" — split and treat as OR
|
|
101
|
+
if (normalised.includes(';')) {
|
|
102
|
+
const parts = normalised
|
|
103
|
+
.split(';')
|
|
104
|
+
.map((p) => p.trim())
|
|
105
|
+
.filter((p) => p.length > 0);
|
|
106
|
+
if (parts.length > 1) {
|
|
107
|
+
for (const part of parts) {
|
|
108
|
+
const status = evaluateToken(part, spdxIds, aliasLookup);
|
|
109
|
+
if (status === 'PRE_APPROVED')
|
|
110
|
+
return 'PRE_APPROVED';
|
|
111
|
+
}
|
|
112
|
+
if (parts.every((p) => isUnknownToken(normalise(p))))
|
|
113
|
+
return 'UNKNOWN';
|
|
114
|
+
return 'NOT_APPROVED';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return evaluateToken(normalised, spdxIds, aliasLookup);
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
exports.createEvaluator = createEvaluator;
|
|
122
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/license/dependency-check/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { ExecutorContext } from '@nx/devkit';
|
|
6
|
+
export type LicenseCheckExecutorSchema = Record<string, never>;
|
|
7
|
+
export default function runLicenseCheckExecutor(_options: LicenseCheckExecutorSchema, _context: ExecutorContext): Promise<{
|
|
8
|
+
success: boolean;
|
|
9
|
+
}>;
|