@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.
Files changed (76) hide show
  1. package/LICENSE-THIRD-PARTY +1820 -476
  2. package/executors.json +9 -0
  3. package/package.json +5 -1
  4. package/sdk/license.d.ts +8 -0
  5. package/sdk/license.js +13 -0
  6. package/sdk/license.js.map +1 -0
  7. package/src/license/__snapshots__/config.spec.ts.snap +23 -0
  8. package/src/license/config-types.d.ts +17 -0
  9. package/src/license/config.d.ts +63 -5
  10. package/src/license/config.js +315 -7
  11. package/src/license/config.js.map +1 -1
  12. package/src/license/dependency-check/check.d.ts +12 -0
  13. package/src/license/dependency-check/check.js +111 -0
  14. package/src/license/dependency-check/check.js.map +1 -0
  15. package/src/license/dependency-check/collectors/collector.d.ts +21 -0
  16. package/src/license/dependency-check/collectors/collector.js +76 -0
  17. package/src/license/dependency-check/collectors/collector.js.map +1 -0
  18. package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
  19. package/src/license/dependency-check/collectors/npm-collector.js +75 -0
  20. package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
  21. package/src/license/dependency-check/collectors/python-collector.d.ts +19 -0
  22. package/src/license/dependency-check/collectors/python-collector.js +121 -0
  23. package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
  24. package/src/license/dependency-check/evaluator.d.ts +9 -0
  25. package/src/license/dependency-check/evaluator.js +122 -0
  26. package/src/license/dependency-check/evaluator.js.map +1 -0
  27. package/src/license/dependency-check/executor-schema.json +6 -0
  28. package/src/license/dependency-check/executor.d.ts +9 -0
  29. package/src/license/dependency-check/executor.js +43 -0
  30. package/src/license/dependency-check/executor.js.map +1 -0
  31. package/src/license/dependency-check/pre-approved.d.ts +6 -0
  32. package/src/license/dependency-check/pre-approved.js +1280 -0
  33. package/src/license/dependency-check/pre-approved.js.map +1 -0
  34. package/src/license/dependency-check/types.d.ts +45 -0
  35. package/src/license/dependency-check/types.js +7 -0
  36. package/src/license/dependency-check/types.js.map +1 -0
  37. package/src/license/generator.js +110 -11
  38. package/src/license/generator.js.map +1 -1
  39. package/src/license/index.d.ts +8 -0
  40. package/src/license/index.js +13 -0
  41. package/src/license/index.js.map +1 -0
  42. package/src/license/known-exceptions.d.ts +7 -0
  43. package/src/license/known-exceptions.js +33 -0
  44. package/src/license/known-exceptions.js.map +1 -0
  45. package/src/license/schema.d.ts +5 -0
  46. package/src/license/schema.json +6 -0
  47. package/src/license/sync/generator.js +10 -10
  48. package/src/license/sync/generator.js.map +1 -1
  49. package/src/license/sync/project-file-sync.d.ts +2 -2
  50. package/src/license/sync/project-file-sync.js.map +1 -1
  51. package/src/py/agent/generator.js +5 -0
  52. package/src/py/agent/generator.js.map +1 -1
  53. package/src/py/mcp-server/generator.js +3 -0
  54. package/src/py/mcp-server/generator.js.map +1 -1
  55. package/src/py/project/generator.js +7 -0
  56. package/src/py/project/generator.js.map +1 -1
  57. package/src/ts/lib/ts-project-utils.js +6 -0
  58. package/src/ts/lib/ts-project-utils.js.map +1 -1
  59. package/src/ts/mcp-server/generator.js +3 -0
  60. package/src/ts/mcp-server/generator.js.map +1 -1
  61. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +22 -38
  62. package/src/ts/rdb/files/scripts/{docker-pull.ts.template → pull-image.ts.template} +1 -1
  63. package/src/ts/rdb/files/scripts/{docker-start.ts.template → start-container.ts.template} +23 -23
  64. package/src/ts/rdb/generator.js +8 -8
  65. package/src/ts/rdb/generator.js.map +1 -1
  66. package/src/utils/ast.d.ts +28 -0
  67. package/src/utils/ast.js +59 -1
  68. package/src/utils/ast.js.map +1 -1
  69. package/src/utils/config/utils.d.ts +11 -1
  70. package/src/utils/config/utils.js +37 -5
  71. package/src/utils/config/utils.js.map +1 -1
  72. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +4 -4
  73. package/src/utils/rdb-constructs/rdb-constructs.d.ts +1 -1
  74. package/src/utils/versions.d.ts +2 -1
  75. package/src/utils/versions.js +1 -0
  76. 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,6 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "type": "object",
4
+ "properties": {},
5
+ "additionalProperties": false
6
+ }
@@ -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
+ }>;