@code-pushup/js-packages-plugin 0.44.2 → 0.45.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/README.md +5 -3
- package/bin.js +61 -30
- package/index.js +77 -64
- package/package.json +3 -3
- package/src/lib/config.d.ts +6 -0
- package/src/lib/package-managers/types.d.ts +2 -1
- package/src/lib/runner/outdated/transform.d.ts +1 -1
- package/src/lib/runner/outdated/types.d.ts +5 -1
- package/src/lib/runner/utils.d.ts +1 -0
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ It supports the following package managers:
|
|
|
59
59
|
// ...
|
|
60
60
|
plugins: [
|
|
61
61
|
// ...
|
|
62
|
-
await jsPackagesPlugin({ packageManager: ['yarn'], checks: ['audit'] }),
|
|
62
|
+
await jsPackagesPlugin({ packageManager: ['yarn-classic'], checks: ['audit'], dependencyGroups: ['prod'] }),
|
|
63
63
|
],
|
|
64
64
|
};
|
|
65
65
|
```
|
|
@@ -112,11 +112,13 @@ The plugin accepts the following parameters:
|
|
|
112
112
|
|
|
113
113
|
- `packageManager`: The package manager you are using. Supported values: `npm`, `yarn-classic` (v1), `yarn-modern` (v2+), `pnpm`.
|
|
114
114
|
- (optional) `checks`: Array of checks to be run. Supported commands: `audit`, `outdated`. Both are configured by default.
|
|
115
|
+
- (optional) `dependencyGroups`: Array of dependency groups to be checked. `prod` and `dev` are configured by default. `optional` are opt-in.
|
|
116
|
+
- (optional) `packageJsonPath`: File path to `package.json`. Defaults to current folder. Multiple `package.json` files are currently not supported.
|
|
115
117
|
- (optional) `auditLevelMapping`: If you wish to set a custom level of issue severity based on audit vulnerability level, you may do so here. Any omitted values will be filled in by defaults. Audit levels are: `critical`, `high`, `moderate`, `low` and `info`. Issue severities are: `error`, `warn` and `info`. By default the mapping is as follows: `critical` and `high` → `error`; `moderate` and `low` → `warning`; `info` → `info`.
|
|
116
118
|
|
|
117
119
|
### Audits and group
|
|
118
120
|
|
|
119
|
-
This plugin provides a group per check for a convenient declaration in your config. Each group contains audits for all
|
|
121
|
+
This plugin provides a group per check for a convenient declaration in your config. Each group contains audits for all selected groups of dependencies that are supported (`prod`, `dev` or `optional`).
|
|
120
122
|
|
|
121
123
|
```ts
|
|
122
124
|
// ...
|
|
@@ -144,7 +146,7 @@ This plugin provides a group per check for a convenient declaration in your conf
|
|
|
144
146
|
],
|
|
145
147
|
```
|
|
146
148
|
|
|
147
|
-
Each dependency group has its own audit. If you want to
|
|
149
|
+
Each dependency group has its own audit. If you want to assign different weights to the audits or record different dependency groups for different checks (the bigger set needs to be included in the plugin configuration), you can do so in the following way:
|
|
148
150
|
|
|
149
151
|
```ts
|
|
150
152
|
// ...
|
package/bin.js
CHANGED
|
@@ -1186,6 +1186,7 @@ var dependencyGroupToLong = {
|
|
|
1186
1186
|
|
|
1187
1187
|
// packages/plugin-js-packages/src/lib/config.ts
|
|
1188
1188
|
var dependencyGroups = ["prod", "dev", "optional"];
|
|
1189
|
+
var dependencyGroupSchema = z16.enum(dependencyGroups);
|
|
1189
1190
|
var packageCommandSchema = z16.enum(["audit", "outdated"]);
|
|
1190
1191
|
var packageManagerIdSchema = z16.enum([
|
|
1191
1192
|
"npm",
|
|
@@ -1217,9 +1218,11 @@ var jsPackagesPluginConfigSchema = z16.object({
|
|
|
1217
1218
|
packageManager: packageManagerIdSchema.describe(
|
|
1218
1219
|
"Package manager to be used."
|
|
1219
1220
|
),
|
|
1221
|
+
dependencyGroups: z16.array(dependencyGroupSchema).min(1).default(["prod", "dev"]),
|
|
1220
1222
|
auditLevelMapping: z16.record(packageAuditLevelSchema, issueSeveritySchema, {
|
|
1221
1223
|
description: "Mapping of audit levels to issue severity. Custom mapping or overrides may be entered manually, otherwise has a default preset."
|
|
1222
|
-
}).default(defaultAuditLevelMapping).transform(fillAuditLevelMapping)
|
|
1224
|
+
}).default(defaultAuditLevelMapping).transform(fillAuditLevelMapping),
|
|
1225
|
+
packageJsonPath: z16.string().describe("File path to package.json. Defaults to current folder.").default("package.json")
|
|
1223
1226
|
});
|
|
1224
1227
|
|
|
1225
1228
|
// packages/plugin-js-packages/src/lib/runner/utils.ts
|
|
@@ -1253,6 +1256,15 @@ function filterAuditResult(result, key, referenceResult) {
|
|
|
1253
1256
|
summary: uniqueResult.summary
|
|
1254
1257
|
};
|
|
1255
1258
|
}
|
|
1259
|
+
async function getTotalDependencies(packageJsonPath) {
|
|
1260
|
+
const packageJson = await readJsonFile(packageJsonPath);
|
|
1261
|
+
return objectFromEntries(
|
|
1262
|
+
dependencyGroups.map((depGroup) => {
|
|
1263
|
+
const deps = packageJson[dependencyGroupToLong[depGroup]];
|
|
1264
|
+
return [depGroup, deps == null ? 0 : objectToKeys(deps).length];
|
|
1265
|
+
})
|
|
1266
|
+
);
|
|
1267
|
+
}
|
|
1256
1268
|
|
|
1257
1269
|
// packages/plugin-js-packages/src/lib/package-managers/constants.ts
|
|
1258
1270
|
var COMMON_AUDIT_ARGS = ["audit", "--json"];
|
|
@@ -1354,11 +1366,16 @@ var npmPackageManager = {
|
|
|
1354
1366
|
],
|
|
1355
1367
|
unifyResult: npmToAuditResult,
|
|
1356
1368
|
// prod dependencies need to be filtered out manually since v10
|
|
1357
|
-
postProcessResult: (results) =>
|
|
1358
|
-
|
|
1359
|
-
dev
|
|
1360
|
-
optional
|
|
1361
|
-
|
|
1369
|
+
postProcessResult: (results) => {
|
|
1370
|
+
const depGroups = objectToKeys(results);
|
|
1371
|
+
const devFilter = results.dev && results.prod ? filterAuditResult(results.dev, "name", results.prod) : results.dev;
|
|
1372
|
+
const optionalFilter = results.optional && results.prod ? filterAuditResult(results.optional, "name", results.prod) : results.optional;
|
|
1373
|
+
return {
|
|
1374
|
+
...depGroups.includes("prod") && { prod: results.prod },
|
|
1375
|
+
...depGroups.includes("dev") && { dev: devFilter },
|
|
1376
|
+
...depGroups.includes("optional") && { optional: optionalFilter }
|
|
1377
|
+
};
|
|
1378
|
+
}
|
|
1362
1379
|
},
|
|
1363
1380
|
outdated: {
|
|
1364
1381
|
commandArgs: [...COMMON_OUTDATED_ARGS, "--long"],
|
|
@@ -1451,15 +1468,16 @@ var pnpmPackageManager = {
|
|
|
1451
1468
|
ignoreExitCode: true,
|
|
1452
1469
|
unifyResult: pnpmToAuditResult,
|
|
1453
1470
|
// optional dependencies don't have an exclusive option so they need duplicates filtered out
|
|
1454
|
-
postProcessResult: (results) =>
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
"
|
|
1460
|
-
results.dev
|
|
1461
|
-
|
|
1462
|
-
|
|
1471
|
+
postProcessResult: (results) => {
|
|
1472
|
+
const depGroups = objectToKeys(results);
|
|
1473
|
+
const prodFilter = results.optional && results.prod ? filterAuditResult(results.optional, "id", results.prod) : results.optional;
|
|
1474
|
+
const devFilter = prodFilter && results.dev ? filterAuditResult(prodFilter, "id", results.dev) : results.optional;
|
|
1475
|
+
return {
|
|
1476
|
+
...depGroups.includes("prod") && { prod: results.prod },
|
|
1477
|
+
...depGroups.includes("dev") && { dev: results.dev },
|
|
1478
|
+
...results.optional && { optional: devFilter }
|
|
1479
|
+
};
|
|
1480
|
+
}
|
|
1463
1481
|
},
|
|
1464
1482
|
outdated: {
|
|
1465
1483
|
commandArgs: COMMON_OUTDATED_ARGS,
|
|
@@ -1785,7 +1803,7 @@ var outdatedSeverity = {
|
|
|
1785
1803
|
var RELEASE_TYPES = objectToKeys(outdatedSeverity);
|
|
1786
1804
|
|
|
1787
1805
|
// packages/plugin-js-packages/src/lib/runner/outdated/transform.ts
|
|
1788
|
-
function outdatedResultToAuditOutput(result, packageManager, depGroup) {
|
|
1806
|
+
function outdatedResultToAuditOutput(result, packageManager, depGroup, totalDeps) {
|
|
1789
1807
|
const relevantDependencies = result.filter(
|
|
1790
1808
|
(dep) => dep.type === dependencyGroupToLong[depGroup]
|
|
1791
1809
|
);
|
|
@@ -1809,10 +1827,7 @@ function outdatedResultToAuditOutput(result, packageManager, depGroup) {
|
|
|
1809
1827
|
const issues = outdatedDependencies.length === 0 ? [] : outdatedToIssues(outdatedDependencies);
|
|
1810
1828
|
return {
|
|
1811
1829
|
slug: `${packageManager}-outdated-${depGroup}`,
|
|
1812
|
-
score: calculateOutdatedScore(
|
|
1813
|
-
outdatedStats.major,
|
|
1814
|
-
relevantDependencies.length
|
|
1815
|
-
),
|
|
1830
|
+
score: calculateOutdatedScore(outdatedStats.major, totalDeps),
|
|
1816
1831
|
value: outdatedDependencies.length,
|
|
1817
1832
|
displayValue: outdatedToDisplayValue(outdatedStats),
|
|
1818
1833
|
details: { issues }
|
|
@@ -1853,14 +1868,20 @@ function outdatedToIssues(dependencies) {
|
|
|
1853
1868
|
|
|
1854
1869
|
// packages/plugin-js-packages/src/lib/runner/index.ts
|
|
1855
1870
|
async function executeRunner() {
|
|
1856
|
-
const {
|
|
1857
|
-
|
|
1858
|
-
|
|
1871
|
+
const {
|
|
1872
|
+
packageManager,
|
|
1873
|
+
checks,
|
|
1874
|
+
auditLevelMapping,
|
|
1875
|
+
packageJsonPath,
|
|
1876
|
+
dependencyGroups: depGroups
|
|
1877
|
+
} = await readJsonFile(PLUGIN_CONFIG_PATH);
|
|
1878
|
+
const auditResults = checks.includes("audit") ? await processAudit(packageManager, depGroups, auditLevelMapping) : [];
|
|
1879
|
+
const outdatedResults = checks.includes("outdated") ? await processOutdated(packageManager, depGroups, packageJsonPath) : [];
|
|
1859
1880
|
const checkResults = [...auditResults, ...outdatedResults];
|
|
1860
1881
|
await ensureDirectoryExists(dirname(RUNNER_OUTPUT_PATH));
|
|
1861
1882
|
await writeFile(RUNNER_OUTPUT_PATH, JSON.stringify(checkResults));
|
|
1862
1883
|
}
|
|
1863
|
-
async function processOutdated(id) {
|
|
1884
|
+
async function processOutdated(id, depGroups, packageJsonPath) {
|
|
1864
1885
|
const pm = packageManagers[id];
|
|
1865
1886
|
const { stdout } = await executeProcess({
|
|
1866
1887
|
command: pm.command,
|
|
@@ -1869,16 +1890,25 @@ async function processOutdated(id) {
|
|
|
1869
1890
|
ignoreExitCode: true
|
|
1870
1891
|
// outdated returns exit code 1 when outdated dependencies are found
|
|
1871
1892
|
});
|
|
1893
|
+
const depTotals = await getTotalDependencies(packageJsonPath);
|
|
1872
1894
|
const normalizedResult = pm.outdated.unifyResult(stdout);
|
|
1873
|
-
return
|
|
1874
|
-
(depGroup) => outdatedResultToAuditOutput(
|
|
1895
|
+
return depGroups.map(
|
|
1896
|
+
(depGroup) => outdatedResultToAuditOutput(
|
|
1897
|
+
normalizedResult,
|
|
1898
|
+
id,
|
|
1899
|
+
depGroup,
|
|
1900
|
+
depTotals[depGroup]
|
|
1901
|
+
)
|
|
1875
1902
|
);
|
|
1876
1903
|
}
|
|
1877
|
-
async function processAudit(id, auditLevelMapping) {
|
|
1904
|
+
async function processAudit(id, depGroups, auditLevelMapping) {
|
|
1878
1905
|
const pm = packageManagers[id];
|
|
1879
|
-
const
|
|
1906
|
+
const supportedAuditDepGroups = pm.audit.supportedDepGroups ?? dependencyGroups;
|
|
1907
|
+
const compatibleAuditDepGroups = depGroups.filter(
|
|
1908
|
+
(group) => supportedAuditDepGroups.includes(group)
|
|
1909
|
+
);
|
|
1880
1910
|
const auditResults = await Promise.allSettled(
|
|
1881
|
-
|
|
1911
|
+
compatibleAuditDepGroups.map(
|
|
1882
1912
|
async (depGroup) => {
|
|
1883
1913
|
const { stdout } = await executeProcess({
|
|
1884
1914
|
command: pm.command,
|
|
@@ -1901,8 +1931,9 @@ async function processAudit(id, auditLevelMapping) {
|
|
|
1901
1931
|
auditResults.filter(isPromiseFulfilledResult).map((x) => x.value)
|
|
1902
1932
|
);
|
|
1903
1933
|
const uniqueResults = pm.audit.postProcessResult?.(fulfilled) ?? fulfilled;
|
|
1904
|
-
return
|
|
1934
|
+
return compatibleAuditDepGroups.map(
|
|
1905
1935
|
(depGroup) => auditResultToAuditOutput(
|
|
1936
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1906
1937
|
uniqueResults[depGroup],
|
|
1907
1938
|
id,
|
|
1908
1939
|
depGroup,
|
package/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { fileURLToPath } from "node:url";
|
|
|
4
4
|
|
|
5
5
|
// packages/plugin-js-packages/package.json
|
|
6
6
|
var name = "@code-pushup/js-packages-plugin";
|
|
7
|
-
var version = "0.
|
|
7
|
+
var version = "0.45.0";
|
|
8
8
|
|
|
9
9
|
// packages/plugin-js-packages/src/lib/config.ts
|
|
10
10
|
import { z as z16 } from "zod";
|
|
@@ -717,10 +717,9 @@ var dependencyGroupToLong = {
|
|
|
717
717
|
optional: "optionalDependencies"
|
|
718
718
|
};
|
|
719
719
|
var dependencyGroupWeights = {
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
optional: 1
|
|
720
|
+
prod: 80,
|
|
721
|
+
dev: 15,
|
|
722
|
+
optional: 5
|
|
724
723
|
};
|
|
725
724
|
var dependencyDocs = {
|
|
726
725
|
prod: "https://classic.yarnpkg.com/docs/dependency-types#toc-dependencies",
|
|
@@ -730,6 +729,7 @@ var dependencyDocs = {
|
|
|
730
729
|
|
|
731
730
|
// packages/plugin-js-packages/src/lib/config.ts
|
|
732
731
|
var dependencyGroups = ["prod", "dev", "optional"];
|
|
732
|
+
var dependencyGroupSchema = z16.enum(dependencyGroups);
|
|
733
733
|
var packageCommandSchema = z16.enum(["audit", "outdated"]);
|
|
734
734
|
var packageManagerIdSchema = z16.enum([
|
|
735
735
|
"npm",
|
|
@@ -761,47 +761,13 @@ var jsPackagesPluginConfigSchema = z16.object({
|
|
|
761
761
|
packageManager: packageManagerIdSchema.describe(
|
|
762
762
|
"Package manager to be used."
|
|
763
763
|
),
|
|
764
|
+
dependencyGroups: z16.array(dependencyGroupSchema).min(1).default(["prod", "dev"]),
|
|
764
765
|
auditLevelMapping: z16.record(packageAuditLevelSchema, issueSeveritySchema, {
|
|
765
766
|
description: "Mapping of audit levels to issue severity. Custom mapping or overrides may be entered manually, otherwise has a default preset."
|
|
766
|
-
}).default(defaultAuditLevelMapping).transform(fillAuditLevelMapping)
|
|
767
|
+
}).default(defaultAuditLevelMapping).transform(fillAuditLevelMapping),
|
|
768
|
+
packageJsonPath: z16.string().describe("File path to package.json. Defaults to current folder.").default("package.json")
|
|
767
769
|
});
|
|
768
770
|
|
|
769
|
-
// packages/plugin-js-packages/src/lib/runner/utils.ts
|
|
770
|
-
function filterAuditResult(result, key, referenceResult) {
|
|
771
|
-
if (result.vulnerabilities.length === 0) {
|
|
772
|
-
return result;
|
|
773
|
-
}
|
|
774
|
-
const uniqueResult = result.vulnerabilities.reduce(
|
|
775
|
-
(acc, ref) => {
|
|
776
|
-
const matchReference = referenceResult ?? acc;
|
|
777
|
-
const isMatch = matchReference.vulnerabilities.map((vulnerability) => vulnerability[key]).includes(ref[key]);
|
|
778
|
-
if (isMatch) {
|
|
779
|
-
return {
|
|
780
|
-
vulnerabilities: acc.vulnerabilities,
|
|
781
|
-
summary: {
|
|
782
|
-
...acc.summary,
|
|
783
|
-
[ref.severity]: acc.summary[ref.severity] - 1,
|
|
784
|
-
total: acc.summary.total - 1
|
|
785
|
-
}
|
|
786
|
-
};
|
|
787
|
-
}
|
|
788
|
-
return {
|
|
789
|
-
vulnerabilities: [...acc.vulnerabilities, ref],
|
|
790
|
-
summary: acc.summary
|
|
791
|
-
};
|
|
792
|
-
},
|
|
793
|
-
{ vulnerabilities: [], summary: result.summary }
|
|
794
|
-
);
|
|
795
|
-
return {
|
|
796
|
-
vulnerabilities: uniqueResult.vulnerabilities,
|
|
797
|
-
summary: uniqueResult.summary
|
|
798
|
-
};
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
// packages/plugin-js-packages/src/lib/package-managers/constants.ts
|
|
802
|
-
var COMMON_AUDIT_ARGS = ["audit", "--json"];
|
|
803
|
-
var COMMON_OUTDATED_ARGS = ["outdated", "--json"];
|
|
804
|
-
|
|
805
771
|
// packages/utils/src/lib/text-formats/constants.ts
|
|
806
772
|
var NEW_LINE = "\n";
|
|
807
773
|
var TAB = " ";
|
|
@@ -1187,6 +1153,42 @@ var { details: details3 } = html;
|
|
|
1187
1153
|
// packages/utils/src/lib/reports/log-stdout-summary.ts
|
|
1188
1154
|
import chalk4 from "chalk";
|
|
1189
1155
|
|
|
1156
|
+
// packages/plugin-js-packages/src/lib/runner/utils.ts
|
|
1157
|
+
function filterAuditResult(result, key, referenceResult) {
|
|
1158
|
+
if (result.vulnerabilities.length === 0) {
|
|
1159
|
+
return result;
|
|
1160
|
+
}
|
|
1161
|
+
const uniqueResult = result.vulnerabilities.reduce(
|
|
1162
|
+
(acc, ref) => {
|
|
1163
|
+
const matchReference = referenceResult ?? acc;
|
|
1164
|
+
const isMatch = matchReference.vulnerabilities.map((vulnerability) => vulnerability[key]).includes(ref[key]);
|
|
1165
|
+
if (isMatch) {
|
|
1166
|
+
return {
|
|
1167
|
+
vulnerabilities: acc.vulnerabilities,
|
|
1168
|
+
summary: {
|
|
1169
|
+
...acc.summary,
|
|
1170
|
+
[ref.severity]: acc.summary[ref.severity] - 1,
|
|
1171
|
+
total: acc.summary.total - 1
|
|
1172
|
+
}
|
|
1173
|
+
};
|
|
1174
|
+
}
|
|
1175
|
+
return {
|
|
1176
|
+
vulnerabilities: [...acc.vulnerabilities, ref],
|
|
1177
|
+
summary: acc.summary
|
|
1178
|
+
};
|
|
1179
|
+
},
|
|
1180
|
+
{ vulnerabilities: [], summary: result.summary }
|
|
1181
|
+
);
|
|
1182
|
+
return {
|
|
1183
|
+
vulnerabilities: uniqueResult.vulnerabilities,
|
|
1184
|
+
summary: uniqueResult.summary
|
|
1185
|
+
};
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
// packages/plugin-js-packages/src/lib/package-managers/constants.ts
|
|
1189
|
+
var COMMON_AUDIT_ARGS = ["audit", "--json"];
|
|
1190
|
+
var COMMON_OUTDATED_ARGS = ["outdated", "--json"];
|
|
1191
|
+
|
|
1190
1192
|
// packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.ts
|
|
1191
1193
|
function npmToAuditResult(output) {
|
|
1192
1194
|
const npmAudit = JSON.parse(output);
|
|
@@ -1283,11 +1285,16 @@ var npmPackageManager = {
|
|
|
1283
1285
|
],
|
|
1284
1286
|
unifyResult: npmToAuditResult,
|
|
1285
1287
|
// prod dependencies need to be filtered out manually since v10
|
|
1286
|
-
postProcessResult: (results) =>
|
|
1287
|
-
|
|
1288
|
-
dev
|
|
1289
|
-
optional
|
|
1290
|
-
|
|
1288
|
+
postProcessResult: (results) => {
|
|
1289
|
+
const depGroups = objectToKeys(results);
|
|
1290
|
+
const devFilter = results.dev && results.prod ? filterAuditResult(results.dev, "name", results.prod) : results.dev;
|
|
1291
|
+
const optionalFilter = results.optional && results.prod ? filterAuditResult(results.optional, "name", results.prod) : results.optional;
|
|
1292
|
+
return {
|
|
1293
|
+
...depGroups.includes("prod") && { prod: results.prod },
|
|
1294
|
+
...depGroups.includes("dev") && { dev: devFilter },
|
|
1295
|
+
...depGroups.includes("optional") && { optional: optionalFilter }
|
|
1296
|
+
};
|
|
1297
|
+
}
|
|
1291
1298
|
},
|
|
1292
1299
|
outdated: {
|
|
1293
1300
|
commandArgs: [...COMMON_OUTDATED_ARGS, "--long"],
|
|
@@ -1380,15 +1387,16 @@ var pnpmPackageManager = {
|
|
|
1380
1387
|
ignoreExitCode: true,
|
|
1381
1388
|
unifyResult: pnpmToAuditResult,
|
|
1382
1389
|
// optional dependencies don't have an exclusive option so they need duplicates filtered out
|
|
1383
|
-
postProcessResult: (results) =>
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
"
|
|
1389
|
-
results.dev
|
|
1390
|
-
|
|
1391
|
-
|
|
1390
|
+
postProcessResult: (results) => {
|
|
1391
|
+
const depGroups = objectToKeys(results);
|
|
1392
|
+
const prodFilter = results.optional && results.prod ? filterAuditResult(results.optional, "id", results.prod) : results.optional;
|
|
1393
|
+
const devFilter = prodFilter && results.dev ? filterAuditResult(prodFilter, "id", results.dev) : results.optional;
|
|
1394
|
+
return {
|
|
1395
|
+
...depGroups.includes("prod") && { prod: results.prod },
|
|
1396
|
+
...depGroups.includes("dev") && { dev: results.dev },
|
|
1397
|
+
...results.optional && { optional: devFilter }
|
|
1398
|
+
};
|
|
1399
|
+
}
|
|
1392
1400
|
},
|
|
1393
1401
|
outdated: {
|
|
1394
1402
|
commandArgs: COMMON_OUTDATED_ARGS,
|
|
@@ -1669,6 +1677,7 @@ async function createRunnerConfig(scriptPath, config) {
|
|
|
1669
1677
|
async function jsPackagesPlugin(config) {
|
|
1670
1678
|
const jsPackagesPluginConfig = jsPackagesPluginConfigSchema.parse(config);
|
|
1671
1679
|
const checks = [...new Set(jsPackagesPluginConfig.checks)];
|
|
1680
|
+
const depGroups = [...new Set(jsPackagesPluginConfig.dependencyGroups)];
|
|
1672
1681
|
const id = jsPackagesPluginConfig.packageManager;
|
|
1673
1682
|
const pm = packageManagers[id];
|
|
1674
1683
|
const runnerScriptPath = join3(
|
|
@@ -1683,21 +1692,24 @@ async function jsPackagesPlugin(config) {
|
|
|
1683
1692
|
docsUrl: pm.docs.homepage,
|
|
1684
1693
|
packageName: name,
|
|
1685
1694
|
version,
|
|
1686
|
-
audits: createAudits(id, checks),
|
|
1687
|
-
groups: createGroups(id, checks),
|
|
1695
|
+
audits: createAudits(id, checks, depGroups),
|
|
1696
|
+
groups: createGroups(id, checks, depGroups),
|
|
1688
1697
|
runner: await createRunnerConfig(runnerScriptPath, jsPackagesPluginConfig)
|
|
1689
1698
|
};
|
|
1690
1699
|
}
|
|
1691
|
-
function createGroups(id, checks) {
|
|
1700
|
+
function createGroups(id, checks, depGroups) {
|
|
1692
1701
|
const pm = packageManagers[id];
|
|
1693
1702
|
const supportedAuditDepGroups = pm.audit.supportedDepGroups ?? dependencyGroups;
|
|
1703
|
+
const compatibleAuditDepGroups = depGroups.filter(
|
|
1704
|
+
(group) => supportedAuditDepGroups.includes(group)
|
|
1705
|
+
);
|
|
1694
1706
|
const groups = {
|
|
1695
1707
|
audit: {
|
|
1696
1708
|
slug: `${pm.slug}-audit`,
|
|
1697
1709
|
title: `${pm.name} audit`,
|
|
1698
1710
|
description: `Group containing ${pm.name} vulnerabilities.`,
|
|
1699
1711
|
docsUrl: pm.docs.audit,
|
|
1700
|
-
refs:
|
|
1712
|
+
refs: compatibleAuditDepGroups.map((depGroup) => ({
|
|
1701
1713
|
slug: `${pm.slug}-audit-${depGroup}`,
|
|
1702
1714
|
weight: dependencyGroupWeights[depGroup]
|
|
1703
1715
|
}))
|
|
@@ -1707,7 +1719,7 @@ function createGroups(id, checks) {
|
|
|
1707
1719
|
title: `${pm.name} outdated dependencies`,
|
|
1708
1720
|
description: `Group containing outdated ${pm.name} dependencies.`,
|
|
1709
1721
|
docsUrl: pm.docs.outdated,
|
|
1710
|
-
refs:
|
|
1722
|
+
refs: depGroups.map((depGroup) => ({
|
|
1711
1723
|
slug: `${pm.slug}-outdated-${depGroup}`,
|
|
1712
1724
|
weight: dependencyGroupWeights[depGroup]
|
|
1713
1725
|
}))
|
|
@@ -1715,11 +1727,12 @@ function createGroups(id, checks) {
|
|
|
1715
1727
|
};
|
|
1716
1728
|
return checks.map((check) => groups[check]);
|
|
1717
1729
|
}
|
|
1718
|
-
function createAudits(id, checks) {
|
|
1730
|
+
function createAudits(id, checks, depGroups) {
|
|
1719
1731
|
const { slug } = packageManagers[id];
|
|
1720
1732
|
return checks.flatMap((check) => {
|
|
1721
|
-
const
|
|
1722
|
-
|
|
1733
|
+
const supportedAuditDepGroups = packageManagers[id].audit.supportedDepGroups ?? dependencyGroups;
|
|
1734
|
+
const compatibleDepGroups = check === "audit" ? depGroups.filter((group) => supportedAuditDepGroups.includes(group)) : depGroups;
|
|
1735
|
+
return compatibleDepGroups.map((depGroup) => ({
|
|
1723
1736
|
slug: `${slug}-${check}-${depGroup}`,
|
|
1724
1737
|
title: getAuditTitle(slug, check, depGroup),
|
|
1725
1738
|
description: getAuditDescription(check, depGroup),
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/js-packages-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.0",
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@code-pushup/models": "0.
|
|
6
|
-
"@code-pushup/utils": "0.
|
|
5
|
+
"@code-pushup/models": "0.45.0",
|
|
6
|
+
"@code-pushup/utils": "0.45.0",
|
|
7
7
|
"semver": "^7.6.0",
|
|
8
8
|
"zod": "^3.22.4"
|
|
9
9
|
},
|
package/src/lib/config.d.ts
CHANGED
|
@@ -14,15 +14,21 @@ export declare function fillAuditLevelMapping(mapping: Partial<AuditSeverity>):
|
|
|
14
14
|
export declare const jsPackagesPluginConfigSchema: z.ZodObject<{
|
|
15
15
|
checks: z.ZodDefault<z.ZodArray<z.ZodEnum<["audit", "outdated"]>, "many">>;
|
|
16
16
|
packageManager: z.ZodEnum<["npm", "yarn-classic", "yarn-modern", "pnpm"]>;
|
|
17
|
+
dependencyGroups: z.ZodDefault<z.ZodArray<z.ZodEnum<["prod", "dev", "optional"]>, "many">>;
|
|
17
18
|
auditLevelMapping: z.ZodEffects<z.ZodDefault<z.ZodRecord<z.ZodEnum<["critical", "high", "moderate", "low", "info"]>, z.ZodEnum<["info", "warning", "error"]>>>, AuditSeverity, Partial<Record<"info" | "critical" | "high" | "moderate" | "low", "error" | "info" | "warning">> | undefined>;
|
|
19
|
+
packageJsonPath: z.ZodDefault<z.ZodString>;
|
|
18
20
|
}, "strip", z.ZodTypeAny, {
|
|
19
21
|
checks: ("audit" | "outdated")[];
|
|
20
22
|
packageManager: "npm" | "pnpm" | "yarn-classic" | "yarn-modern";
|
|
23
|
+
dependencyGroups: ("prod" | "dev" | "optional")[];
|
|
21
24
|
auditLevelMapping: AuditSeverity;
|
|
25
|
+
packageJsonPath: string;
|
|
22
26
|
}, {
|
|
23
27
|
packageManager: "npm" | "pnpm" | "yarn-classic" | "yarn-modern";
|
|
24
28
|
checks?: ("audit" | "outdated")[] | undefined;
|
|
29
|
+
dependencyGroups?: ("prod" | "dev" | "optional")[] | undefined;
|
|
25
30
|
auditLevelMapping?: Partial<Record<"info" | "critical" | "high" | "moderate" | "low", "error" | "info" | "warning">> | undefined;
|
|
31
|
+
packageJsonPath?: string | undefined;
|
|
26
32
|
}>;
|
|
27
33
|
export type JSPackagesPluginConfig = z.input<typeof jsPackagesPluginConfigSchema>;
|
|
28
34
|
export type FinalJSPackagesPluginConfig = z.infer<typeof jsPackagesPluginConfigSchema>;
|
|
@@ -2,6 +2,7 @@ import type { MaterialIcon } from '@code-pushup/models';
|
|
|
2
2
|
import { DependencyGroup, PackageManagerId } from '../config';
|
|
3
3
|
import { AuditResult } from '../runner/audit/types';
|
|
4
4
|
import { OutdatedResult } from '../runner/outdated/types';
|
|
5
|
+
export type AuditResults = Partial<Record<DependencyGroup, AuditResult>>;
|
|
5
6
|
export type PackageManager = {
|
|
6
7
|
slug: PackageManagerId;
|
|
7
8
|
name: string;
|
|
@@ -17,7 +18,7 @@ export type PackageManager = {
|
|
|
17
18
|
ignoreExitCode?: boolean;
|
|
18
19
|
supportedDepGroups?: DependencyGroup[];
|
|
19
20
|
unifyResult: (output: string) => AuditResult;
|
|
20
|
-
postProcessResult?: (result:
|
|
21
|
+
postProcessResult?: (result: AuditResults) => AuditResults;
|
|
21
22
|
};
|
|
22
23
|
outdated: {
|
|
23
24
|
commandArgs: string[];
|
|
@@ -2,7 +2,7 @@ import { ReleaseType } from 'semver';
|
|
|
2
2
|
import type { AuditOutput, Issue } from '@code-pushup/models';
|
|
3
3
|
import { DependencyGroup, PackageManagerId } from '../../config';
|
|
4
4
|
import { OutdatedResult } from './types';
|
|
5
|
-
export declare function outdatedResultToAuditOutput(result: OutdatedResult, packageManager: PackageManagerId, depGroup: DependencyGroup): AuditOutput;
|
|
5
|
+
export declare function outdatedResultToAuditOutput(result: OutdatedResult, packageManager: PackageManagerId, depGroup: DependencyGroup, totalDeps: number): AuditOutput;
|
|
6
6
|
export declare function calculateOutdatedScore(majorOutdated: number, totalDeps: number): number;
|
|
7
7
|
export declare function outdatedToDisplayValue(stats: Record<ReleaseType, number>): string;
|
|
8
8
|
export declare function outdatedToIssues(dependencies: OutdatedResult): Issue[];
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { ReleaseType } from 'semver';
|
|
2
2
|
export type PackageVersion = Record<ReleaseType, number>;
|
|
3
|
-
export
|
|
3
|
+
export declare const dependencyGroupLong: readonly ["dependencies", "devDependencies", "optionalDependencies"];
|
|
4
|
+
export type DependencyGroupLong = (typeof dependencyGroupLong)[number];
|
|
5
|
+
type PackageJsonDependencies = Record<string, string>;
|
|
6
|
+
export type PackageJson = Partial<Record<DependencyGroupLong, PackageJsonDependencies>>;
|
|
4
7
|
export type OutdatedDependency = {
|
|
5
8
|
name: string;
|
|
6
9
|
current: string;
|
|
@@ -9,3 +12,4 @@ export type OutdatedDependency = {
|
|
|
9
12
|
url?: string;
|
|
10
13
|
};
|
|
11
14
|
export type OutdatedResult = OutdatedDependency[];
|
|
15
|
+
export {};
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { AuditResult, Vulnerability } from './audit/types';
|
|
2
2
|
export declare function filterAuditResult(result: AuditResult, key: keyof Vulnerability, referenceResult?: AuditResult): AuditResult;
|
|
3
|
+
export declare function getTotalDependencies(packageJsonPath: string): Promise<Record<"prod" | "dev" | "optional", number>>;
|