@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 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 supported groups of dependencies (`prod`, `dev` and `optional`).
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 check only a subset of dependencies (e.g. run audit and outdated for production dependencies) or assign different weights to them, you can do so in the following way:
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
- prod: results.prod,
1359
- dev: filterAuditResult(results.dev, "name", results.prod),
1360
- optional: filterAuditResult(results.optional, "name", results.prod)
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
- prod: results.prod,
1456
- dev: results.dev,
1457
- optional: filterAuditResult(
1458
- filterAuditResult(results.optional, "id", results.prod),
1459
- "id",
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 { packageManager, checks, auditLevelMapping } = await readJsonFile(PLUGIN_CONFIG_PATH);
1857
- const auditResults = checks.includes("audit") ? await processAudit(packageManager, auditLevelMapping) : [];
1858
- const outdatedResults = checks.includes("outdated") ? await processOutdated(packageManager) : [];
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 dependencyGroups.map(
1874
- (depGroup) => outdatedResultToAuditOutput(normalizedResult, id, depGroup)
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 supportedDepGroups = pm.audit.supportedDepGroups ?? dependencyGroups;
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
- supportedDepGroups.map(
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 supportedDepGroups.map(
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.44.2";
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
- // eslint-disable-next-line no-magic-numbers
721
- prod: 3,
722
- dev: 1,
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
- prod: results.prod,
1288
- dev: filterAuditResult(results.dev, "name", results.prod),
1289
- optional: filterAuditResult(results.optional, "name", results.prod)
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
- prod: results.prod,
1385
- dev: results.dev,
1386
- optional: filterAuditResult(
1387
- filterAuditResult(results.optional, "id", results.prod),
1388
- "id",
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: supportedAuditDepGroups.map((depGroup) => ({
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: dependencyGroups.map((depGroup) => ({
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 supportedDepGroups = check === "audit" ? packageManagers[id].audit.supportedDepGroups ?? dependencyGroups : dependencyGroups;
1722
- return supportedDepGroups.map((depGroup) => ({
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.44.2",
3
+ "version": "0.45.0",
4
4
  "dependencies": {
5
- "@code-pushup/models": "0.44.2",
6
- "@code-pushup/utils": "0.44.2",
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
  },
@@ -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: Record<DependencyGroup, AuditResult>) => Record<DependencyGroup, AuditResult>;
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 type DependencyGroupLong = 'dependencies' | 'devDependencies' | 'optionalDependencies';
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>>;