@code-pushup/js-packages-plugin 0.34.0 → 0.39.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.
Files changed (36) hide show
  1. package/CONTRIBUTING.md +15 -5
  2. package/README.md +17 -3
  3. package/bin.js +289 -195
  4. package/index.js +497 -97
  5. package/package.json +3 -3
  6. package/src/lib/config.d.ts +2 -2
  7. package/src/lib/constants.d.ts +3 -8
  8. package/src/lib/package-managers/constants.d.ts +2 -0
  9. package/src/lib/package-managers/index.d.ts +2 -0
  10. package/src/lib/package-managers/npm/audit-result.d.ts +5 -0
  11. package/src/lib/package-managers/npm/npm.d.ts +2 -0
  12. package/src/lib/package-managers/npm/outdated-result.d.ts +2 -0
  13. package/src/lib/package-managers/npm/types.d.ts +38 -0
  14. package/src/lib/package-managers/package-managers.d.ts +3 -0
  15. package/src/lib/package-managers/pnpm/audit-result.d.ts +3 -0
  16. package/src/lib/package-managers/pnpm/outdated-result.d.ts +2 -0
  17. package/src/lib/package-managers/pnpm/pnpm.d.ts +2 -0
  18. package/src/lib/package-managers/pnpm/types.d.ts +26 -0
  19. package/src/lib/package-managers/types.d.ts +26 -0
  20. package/src/lib/package-managers/yarn-classic/audit-result.d.ts +2 -0
  21. package/src/lib/package-managers/yarn-classic/outdated-result.d.ts +2 -0
  22. package/src/lib/package-managers/yarn-classic/types.d.ts +49 -0
  23. package/src/lib/package-managers/yarn-classic/yarn-classic.d.ts +2 -0
  24. package/src/lib/package-managers/yarn-modern/audit-result.d.ts +2 -0
  25. package/src/lib/package-managers/yarn-modern/outdated-result.d.ts +2 -0
  26. package/src/lib/package-managers/yarn-modern/types.d.ts +26 -0
  27. package/src/lib/package-managers/yarn-modern/yarn-modern.d.ts +2 -0
  28. package/src/lib/runner/audit/constants.d.ts +1 -5
  29. package/src/lib/runner/audit/transform.d.ts +2 -2
  30. package/src/lib/runner/audit/types.d.ts +0 -87
  31. package/src/lib/runner/audit/utils.d.ts +2 -0
  32. package/src/lib/runner/outdated/constants.d.ts +2 -5
  33. package/src/lib/runner/outdated/transform.d.ts +2 -2
  34. package/src/lib/runner/outdated/types.d.ts +0 -43
  35. package/src/lib/runner/audit/unify-type.d.ts +0 -8
  36. package/src/lib/runner/outdated/unify-type.d.ts +0 -5
package/bin.js CHANGED
@@ -578,10 +578,14 @@ function makeArraysComparisonSchema(diffSchema, resultSchema, description) {
578
578
  { description }
579
579
  );
580
580
  }
581
- var scorableMetaSchema = z14.object({ slug: slugSchema, title: titleSchema });
581
+ var scorableMetaSchema = z14.object({
582
+ slug: slugSchema,
583
+ title: titleSchema,
584
+ docsUrl: docsUrlSchema
585
+ });
582
586
  var scorableWithPluginMetaSchema = scorableMetaSchema.merge(
583
587
  z14.object({
584
- plugin: pluginMetaSchema.pick({ slug: true, title: true }).describe("Plugin which defines it")
588
+ plugin: pluginMetaSchema.pick({ slug: true, title: true, docsUrl: true }).describe("Plugin which defines it")
585
589
  })
586
590
  );
587
591
  var scorableDiffSchema = scorableMetaSchema.merge(
@@ -725,7 +729,7 @@ async function ensureDirectoryExists(baseDir) {
725
729
  await mkdir(baseDir, { recursive: true });
726
730
  return;
727
731
  } catch (error) {
728
- ui().logger.error(error.message);
732
+ ui().logger.info(error.message);
729
733
  if (error.code !== "EEXIST") {
730
734
  throw error;
731
735
  }
@@ -832,17 +836,11 @@ var dependencyGroupToLong = {
832
836
  dev: "devDependencies",
833
837
  optional: "optionalDependencies"
834
838
  };
835
- var pkgManagerCommands = {
836
- npm: "npm",
837
- "yarn-classic": "yarn",
838
- "yarn-modern": "yarn",
839
- pnpm: "pnpm"
840
- };
841
839
 
842
840
  // packages/plugin-js-packages/src/lib/config.ts
843
841
  var dependencyGroups = ["prod", "dev", "optional"];
844
842
  var packageCommandSchema = z15.enum(["audit", "outdated"]);
845
- var packageManagerSchema = z15.enum([
843
+ var packageManagerIdSchema = z15.enum([
846
844
  "npm",
847
845
  "yarn-classic",
848
846
  "yarn-modern",
@@ -869,7 +867,9 @@ var jsPackagesPluginConfigSchema = z15.object({
869
867
  checks: z15.array(packageCommandSchema, {
870
868
  description: "Package manager commands to be run. Defaults to both audit and outdated."
871
869
  }).min(1).default(["audit", "outdated"]),
872
- packageManager: packageManagerSchema.describe("Package manager to be used."),
870
+ packageManager: packageManagerIdSchema.describe(
871
+ "Package manager to be used."
872
+ ),
873
873
  auditLevelMapping: z15.record(packageAuditLevelSchema, issueSeveritySchema, {
874
874
  description: "Mapping of audit levels to issue severity. Custom mapping or overrides may be entered manually, otherwise has a default preset."
875
875
  }).default(defaultAuditLevelMapping).transform(fillAuditLevelMapping)
@@ -907,7 +907,11 @@ function filterAuditResult(result, key, referenceResult) {
907
907
  };
908
908
  }
909
909
 
910
- // packages/plugin-js-packages/src/lib/runner/audit/unify-type.ts
910
+ // packages/plugin-js-packages/src/lib/package-managers/constants.ts
911
+ var COMMON_AUDIT_ARGS = ["audit", "--json"];
912
+ var COMMON_OUTDATED_ARGS = ["outdated", "--json"];
913
+
914
+ // packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.ts
911
915
  function npmToAuditResult(output) {
912
916
  const npmAudit = JSON.parse(output);
913
917
  const vulnerabilities = objectToEntries(npmAudit.vulnerabilities).map(
@@ -964,6 +968,159 @@ function npmToAdvisory(name, vulnerabilities, prevNodes = /* @__PURE__ */ new Se
964
968
  }
965
969
  return null;
966
970
  }
971
+
972
+ // packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.ts
973
+ function npmToOutdatedResult(output) {
974
+ const npmOutdated = JSON.parse(output);
975
+ return objectToEntries(npmOutdated).filter(
976
+ (entry) => entry[1].current != null
977
+ ).map(([name, overview]) => ({
978
+ name,
979
+ current: overview.current,
980
+ latest: overview.latest,
981
+ type: overview.type,
982
+ ...overview.homepage != null && { url: overview.homepage }
983
+ }));
984
+ }
985
+
986
+ // packages/plugin-js-packages/src/lib/package-managers/npm/npm.ts
987
+ var npmDependencyOptions = {
988
+ prod: ["--omit=dev", "--omit=optional"],
989
+ dev: ["--include=dev", "--omit=optional"],
990
+ optional: ["--include=optional", "--omit=dev"]
991
+ };
992
+ var npmPackageManager = {
993
+ slug: "npm",
994
+ name: "NPM",
995
+ command: "npm",
996
+ icon: "npm",
997
+ docs: {
998
+ homepage: "https://docs.npmjs.com/",
999
+ audit: "https://docs.npmjs.com/cli/commands/npm-audit",
1000
+ outdated: "https://docs.npmjs.com/cli/commands/npm-outdated"
1001
+ },
1002
+ audit: {
1003
+ getCommandArgs: (groupDep) => [
1004
+ ...COMMON_AUDIT_ARGS,
1005
+ ...npmDependencyOptions[groupDep],
1006
+ "--audit-level=none"
1007
+ ],
1008
+ unifyResult: npmToAuditResult,
1009
+ // prod dependencies need to be filtered out manually since v10
1010
+ postProcessResult: (results) => ({
1011
+ prod: results.prod,
1012
+ dev: filterAuditResult(results.dev, "name", results.prod),
1013
+ optional: filterAuditResult(results.optional, "name", results.prod)
1014
+ })
1015
+ },
1016
+ outdated: {
1017
+ commandArgs: [...COMMON_OUTDATED_ARGS, "--long"],
1018
+ unifyResult: npmToOutdatedResult
1019
+ }
1020
+ };
1021
+
1022
+ // packages/plugin-js-packages/src/lib/runner/audit/utils.ts
1023
+ function getVulnerabilitiesTotal(summary) {
1024
+ return Object.values(summary).reduce((acc, value) => acc + value, 0);
1025
+ }
1026
+
1027
+ // packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.ts
1028
+ function pnpmToAuditResult(output) {
1029
+ const pnpmResult = JSON.parse(output);
1030
+ const vulnerabilities = Object.values(pnpmResult.advisories).map(
1031
+ ({
1032
+ module_name: name,
1033
+ id,
1034
+ title,
1035
+ url,
1036
+ severity,
1037
+ vulnerable_versions: versionRange,
1038
+ recommendation: fixInformation,
1039
+ findings
1040
+ }) => {
1041
+ const path = findings[0]?.paths[0];
1042
+ return {
1043
+ name,
1044
+ id,
1045
+ title,
1046
+ url,
1047
+ severity,
1048
+ versionRange,
1049
+ directDependency: path == null ? true : pnpmToDirectDependency(path),
1050
+ fixInformation
1051
+ };
1052
+ }
1053
+ );
1054
+ return {
1055
+ vulnerabilities,
1056
+ summary: {
1057
+ ...pnpmResult.metadata.vulnerabilities,
1058
+ total: getVulnerabilitiesTotal(pnpmResult.metadata.vulnerabilities)
1059
+ }
1060
+ };
1061
+ }
1062
+ function pnpmToDirectDependency(path) {
1063
+ const deps = path.split(" > ").slice(1);
1064
+ if (deps.length <= 1) {
1065
+ return true;
1066
+ }
1067
+ return deps[0]?.split("@")[0] ?? true;
1068
+ }
1069
+
1070
+ // packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.ts
1071
+ function pnpmToOutdatedResult(output) {
1072
+ const pnpmOutdated = JSON.parse(output);
1073
+ return objectToEntries(pnpmOutdated).map(
1074
+ ([name, { current, latest, dependencyType: type }]) => ({
1075
+ name,
1076
+ current,
1077
+ latest,
1078
+ type
1079
+ })
1080
+ );
1081
+ }
1082
+
1083
+ // packages/plugin-js-packages/src/lib/package-managers/pnpm/pnpm.ts
1084
+ var pnpmDependencyOptions = {
1085
+ prod: ["--prod", "--no-optional"],
1086
+ dev: ["--dev", "--no-optional"],
1087
+ optional: []
1088
+ };
1089
+ var pnpmPackageManager = {
1090
+ slug: "pnpm",
1091
+ name: "pnpm",
1092
+ command: "pnpm",
1093
+ icon: "pnpm",
1094
+ docs: {
1095
+ homepage: "https://pnpm.io/pnpm-cli",
1096
+ audit: "https://pnpm.io/cli/audit/",
1097
+ outdated: "https://pnpm.io/cli/outdated"
1098
+ },
1099
+ audit: {
1100
+ getCommandArgs: (groupDep) => [
1101
+ ...COMMON_AUDIT_ARGS,
1102
+ ...pnpmDependencyOptions[groupDep]
1103
+ ],
1104
+ ignoreExitCode: true,
1105
+ unifyResult: pnpmToAuditResult,
1106
+ // optional dependencies don't have an exclusive option so they need duplicates filtered out
1107
+ postProcessResult: (results) => ({
1108
+ prod: results.prod,
1109
+ dev: results.dev,
1110
+ optional: filterAuditResult(
1111
+ filterAuditResult(results.optional, "id", results.prod),
1112
+ "id",
1113
+ results.dev
1114
+ )
1115
+ })
1116
+ },
1117
+ outdated: {
1118
+ commandArgs: COMMON_OUTDATED_ARGS,
1119
+ unifyResult: pnpmToOutdatedResult
1120
+ }
1121
+ };
1122
+
1123
+ // packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.ts
967
1124
  function yarnv1ToAuditResult(output) {
968
1125
  const yarnv1Result = fromJsonLines(output);
969
1126
  const [yarnv1Advisory, yarnv1Summary] = validateYarnv1Result(yarnv1Result);
@@ -1010,6 +1167,47 @@ function validateYarnv1Result(result) {
1010
1167
  );
1011
1168
  return [vulnerabilities, summary];
1012
1169
  }
1170
+
1171
+ // packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.ts
1172
+ function yarnv1ToOutdatedResult(output) {
1173
+ const yarnv1Outdated = fromJsonLines(output);
1174
+ const dependencies = yarnv1Outdated[1].data.body;
1175
+ return dependencies.map(([name, current, _, latest, __, type, url]) => ({
1176
+ name,
1177
+ current,
1178
+ latest,
1179
+ type,
1180
+ url
1181
+ }));
1182
+ }
1183
+
1184
+ // packages/plugin-js-packages/src/lib/package-managers/yarn-classic/yarn-classic.ts
1185
+ var yarnv1PackageManager = {
1186
+ slug: "yarn-classic",
1187
+ name: "Yarn v1",
1188
+ command: "yarn",
1189
+ icon: "yarn",
1190
+ docs: {
1191
+ homepage: "https://classic.yarnpkg.com/docs/",
1192
+ audit: "https://classic.yarnpkg.com/docs/cli/audit",
1193
+ outdated: "https://classic.yarnpkg.com/docs/cli/outdated/"
1194
+ },
1195
+ audit: {
1196
+ getCommandArgs: (groupDep) => [
1197
+ ...COMMON_AUDIT_ARGS,
1198
+ "--groups",
1199
+ dependencyGroupToLong[groupDep]
1200
+ ],
1201
+ ignoreExitCode: true,
1202
+ unifyResult: yarnv1ToAuditResult
1203
+ },
1204
+ outdated: {
1205
+ commandArgs: COMMON_OUTDATED_ARGS,
1206
+ unifyResult: yarnv1ToOutdatedResult
1207
+ }
1208
+ };
1209
+
1210
+ // packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.ts
1013
1211
  function yarnv2ToAuditResult(output) {
1014
1212
  const yarnv2Audit = JSON.parse(output);
1015
1213
  const vulnerabilities = Object.values(yarnv2Audit.advisories).map(
@@ -1042,50 +1240,58 @@ function yarnv2ToAuditResult(output) {
1042
1240
  }
1043
1241
  };
1044
1242
  }
1045
- function pnpmToAuditResult(output) {
1046
- const pnpmResult = JSON.parse(output);
1047
- const vulnerabilities = Object.values(pnpmResult.advisories).map(
1048
- ({
1049
- module_name: name,
1050
- id,
1051
- title,
1052
- url,
1053
- severity,
1054
- vulnerable_versions: versionRange,
1055
- recommendation: fixInformation,
1056
- findings
1057
- }) => {
1058
- const path = findings[0]?.paths[0];
1059
- return {
1060
- name,
1061
- id,
1062
- title,
1063
- url,
1064
- severity,
1065
- versionRange,
1066
- directDependency: path == null ? true : pnpmToDirectDependency(path),
1067
- fixInformation
1068
- };
1069
- }
1070
- );
1071
- return {
1072
- vulnerabilities,
1073
- summary: {
1074
- ...pnpmResult.metadata.vulnerabilities,
1075
- total: getVulnerabilitiesTotal(pnpmResult.metadata.vulnerabilities)
1076
- }
1077
- };
1243
+
1244
+ // packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.ts
1245
+ function yarnv2ToOutdatedResult(output) {
1246
+ const npmOutdated = JSON.parse(output);
1247
+ return npmOutdated.map(({ name, current, latest, type }) => ({
1248
+ name,
1249
+ current,
1250
+ latest,
1251
+ type
1252
+ }));
1078
1253
  }
1079
- function pnpmToDirectDependency(path) {
1080
- const deps = path.split(" > ").slice(1);
1081
- if (deps.length <= 1) {
1082
- return true;
1254
+
1255
+ // packages/plugin-js-packages/src/lib/package-managers/yarn-modern/yarn-modern.ts
1256
+ var yarnv2EnvironmentOptions = {
1257
+ prod: "production",
1258
+ dev: "development",
1259
+ optional: ""
1260
+ };
1261
+ var yarnv2PackageManager = {
1262
+ slug: "yarn-modern",
1263
+ name: "yarn-modern",
1264
+ command: "yarn",
1265
+ icon: "yarn",
1266
+ docs: {
1267
+ homepage: "https://yarnpkg.com/getting-started",
1268
+ audit: "https://yarnpkg.com/cli/npm/audit",
1269
+ outdated: "https://github.com/mskelton/yarn-plugin-outdated"
1270
+ },
1271
+ audit: {
1272
+ getCommandArgs: (groupDep) => [
1273
+ "npm",
1274
+ ...COMMON_AUDIT_ARGS,
1275
+ "--environment",
1276
+ yarnv2EnvironmentOptions[groupDep]
1277
+ ],
1278
+ supportedDepGroups: ["prod", "dev"],
1279
+ // Yarn v2 does not support audit for optional dependencies
1280
+ unifyResult: yarnv2ToAuditResult
1281
+ },
1282
+ outdated: {
1283
+ commandArgs: COMMON_OUTDATED_ARGS,
1284
+ unifyResult: yarnv2ToOutdatedResult
1083
1285
  }
1084
- return deps[0]?.split("@")[0] ?? true;
1085
- }
1086
- function getVulnerabilitiesTotal(summary) {
1087
- return Object.values(summary).reduce((acc, value) => acc + value, 0);
1088
- }
1286
+ };
1287
+
1288
+ // packages/plugin-js-packages/src/lib/package-managers/package-managers.ts
1289
+ var packageManagers = {
1290
+ npm: npmPackageManager,
1291
+ "yarn-classic": yarnv1PackageManager,
1292
+ "yarn-modern": yarnv2PackageManager,
1293
+ pnpm: pnpmPackageManager
1294
+ };
1089
1295
 
1090
1296
  // packages/plugin-js-packages/src/lib/runner/audit/constants.ts
1091
1297
  var auditScoreModifiers = {
@@ -1095,62 +1301,15 @@ var auditScoreModifiers = {
1095
1301
  low: 0.02,
1096
1302
  info: 0.01
1097
1303
  };
1098
- var normalizeAuditMapper = {
1099
- npm: npmToAuditResult,
1100
- "yarn-classic": yarnv1ToAuditResult,
1101
- "yarn-modern": yarnv2ToAuditResult,
1102
- pnpm: pnpmToAuditResult
1103
- };
1104
- var filterNpmAuditResults = (results) => ({
1105
- prod: results.prod,
1106
- dev: filterAuditResult(results.dev, "name", results.prod),
1107
- optional: filterAuditResult(results.optional, "name", results.prod)
1108
- });
1109
- var filterPnpmAuditResults = (results) => ({
1110
- prod: results.prod,
1111
- dev: results.dev,
1112
- optional: filterAuditResult(
1113
- filterAuditResult(results.optional, "id", results.prod),
1114
- "id",
1115
- results.dev
1116
- )
1117
- });
1118
- var postProcessingAuditMapper = {
1119
- npm: filterNpmAuditResults,
1120
- // prod dependencies need to be filtered out manually since v10
1121
- pnpm: filterPnpmAuditResults
1122
- // optional dependencies don't have an exclusive option so they need duplicates filtered out
1123
- };
1124
- var npmDependencyOptions = {
1125
- prod: ["--omit=dev", "--omit=optional"],
1126
- dev: ["--include=dev", "--omit=optional"],
1127
- optional: ["--include=optional", "--omit=dev"]
1128
- };
1129
- var yarnv2EnvironmentOptions = {
1130
- prod: "production",
1131
- dev: "development",
1132
- optional: ""
1133
- };
1134
- var pnpmDependencyOptions = {
1135
- prod: ["--prod", "--no-optional"],
1136
- dev: ["--dev", "--no-optional"],
1137
- optional: []
1138
- };
1139
- var auditArgs = (groupDep) => ({
1140
- npm: [...npmDependencyOptions[groupDep], "--audit-level=none"],
1141
- "yarn-classic": ["--groups", dependencyGroupToLong[groupDep]],
1142
- "yarn-modern": ["--environment", yarnv2EnvironmentOptions[groupDep]],
1143
- pnpm: [...pnpmDependencyOptions[groupDep]]
1144
- });
1145
1304
 
1146
1305
  // packages/plugin-js-packages/src/lib/runner/audit/transform.ts
1147
- function auditResultToAuditOutput(result, packageManager, dependenciesType, auditLevelMapping) {
1306
+ function auditResultToAuditOutput(result, id, depGroup, auditLevelMapping) {
1148
1307
  const issues = vulnerabilitiesToIssues(
1149
1308
  result.vulnerabilities,
1150
1309
  auditLevelMapping
1151
1310
  );
1152
1311
  return {
1153
- slug: `${packageManager}-audit-${dependenciesType}`,
1312
+ slug: `${id}-audit-${depGroup}`,
1154
1313
  score: calculateAuditScore(result.summary),
1155
1314
  value: result.summary.total,
1156
1315
  displayValue: summaryToDisplayValue(result.summary),
@@ -1207,80 +1366,23 @@ var PLUGIN_CONFIG_PATH = join2(
1207
1366
  "plugin-config.json"
1208
1367
  );
1209
1368
 
1210
- // packages/plugin-js-packages/src/lib/runner/outdated/unify-type.ts
1211
- function npmToOutdatedResult(output) {
1212
- const npmOutdated = JSON.parse(output);
1213
- return objectToEntries(npmOutdated).filter(
1214
- (entry) => entry[1].current != null
1215
- ).map(([name, overview]) => ({
1216
- name,
1217
- current: overview.current,
1218
- latest: overview.latest,
1219
- type: overview.type,
1220
- ...overview.homepage != null && { url: overview.homepage }
1221
- }));
1222
- }
1223
- function yarnv1ToOutdatedResult(output) {
1224
- const yarnv1Outdated = fromJsonLines(output);
1225
- const dependencies = yarnv1Outdated[1].data.body;
1226
- return dependencies.map(([name, current, _, latest, __, type, url]) => ({
1227
- name,
1228
- current,
1229
- latest,
1230
- type,
1231
- url
1232
- }));
1233
- }
1234
- function yarnv2ToOutdatedResult(output) {
1235
- const npmOutdated = JSON.parse(output);
1236
- return npmOutdated.map(({ name, current, latest, type }) => ({
1237
- name,
1238
- current,
1239
- latest,
1240
- type
1241
- }));
1242
- }
1243
- function pnpmToOutdatedResult(output) {
1244
- const pnpmOutdated = JSON.parse(output);
1245
- return objectToEntries(pnpmOutdated).map(
1246
- ([name, { current, latest, dependencyType: type }]) => ({
1247
- name,
1248
- current,
1249
- latest,
1250
- type
1251
- })
1252
- );
1253
- }
1254
-
1255
1369
  // packages/plugin-js-packages/src/lib/runner/outdated/constants.ts
1256
1370
  var outdatedSeverity = {
1257
1371
  major: "error",
1258
1372
  minor: "warning",
1259
1373
  patch: "info"
1260
1374
  };
1261
- var normalizeOutdatedMapper = {
1262
- npm: npmToOutdatedResult,
1263
- "yarn-classic": yarnv1ToOutdatedResult,
1264
- "yarn-modern": yarnv2ToOutdatedResult,
1265
- pnpm: pnpmToOutdatedResult
1266
- };
1267
- var outdatedArgs = {
1268
- npm: ["--long"],
1269
- "yarn-classic": [],
1270
- "yarn-modern": [],
1271
- pnpm: []
1272
- };
1273
1375
 
1274
1376
  // packages/plugin-js-packages/src/lib/runner/outdated/types.ts
1275
1377
  var versionType = ["major", "minor", "patch"];
1276
1378
 
1277
1379
  // packages/plugin-js-packages/src/lib/runner/outdated/transform.ts
1278
- function outdatedResultToAuditOutput(result, packageManager, dependencyGroup) {
1380
+ function outdatedResultToAuditOutput(result, packageManager, depGroup) {
1279
1381
  const relevantDependencies = result.filter(
1280
- (dep) => dep.type === dependencyGroupToLong[dependencyGroup]
1382
+ (dep) => dep.type === dependencyGroupToLong[depGroup]
1281
1383
  );
1282
- const outdatedDependencies = relevantDependencies.filter(
1283
- (dep) => dep.current !== dep.latest
1384
+ const outdatedDependencies = relevantDependencies.filter((dep) => dep.current !== dep.latest).filter(
1385
+ (dep) => dep.current.split("-")[0]?.toString() !== dep.latest.split("-")[0]?.toString()
1284
1386
  );
1285
1387
  const outdatedStats = outdatedDependencies.reduce(
1286
1388
  (acc, dep) => {
@@ -1291,7 +1393,7 @@ function outdatedResultToAuditOutput(result, packageManager, dependencyGroup) {
1291
1393
  );
1292
1394
  const issues = outdatedDependencies.length === 0 ? [] : outdatedToIssues(outdatedDependencies);
1293
1395
  return {
1294
- slug: `${packageManager}-outdated-${dependencyGroup}`,
1396
+ slug: `${packageManager}-outdated-${depGroup}`,
1295
1397
  score: calculateOutdatedScore(
1296
1398
  outdatedStats.major,
1297
1399
  relevantDependencies.length
@@ -1346,7 +1448,8 @@ function getOutdatedLevel(currentFullVersion, latestFullVersion) {
1346
1448
  throw new Error("Package is not outdated.");
1347
1449
  }
1348
1450
  function splitPackageVersion(fullVersion) {
1349
- const [major, minor, patch] = fullVersion.split(".").map(Number);
1451
+ const semanticVersion = String(fullVersion.split("-")[0]);
1452
+ const [major, minor, patch] = semanticVersion.split(".").map(Number);
1350
1453
  if (major == null || minor == null || patch == null) {
1351
1454
  throw new Error(`Invalid version description ${fullVersion}`);
1352
1455
  }
@@ -1362,32 +1465,33 @@ async function executeRunner() {
1362
1465
  await ensureDirectoryExists(dirname(RUNNER_OUTPUT_PATH));
1363
1466
  await writeFile(RUNNER_OUTPUT_PATH, JSON.stringify(checkResults));
1364
1467
  }
1365
- async function processOutdated(packageManager) {
1468
+ async function processOutdated(id) {
1469
+ const pm = packageManagers[id];
1366
1470
  const { stdout } = await executeProcess({
1367
- command: pkgManagerCommands[packageManager],
1368
- args: ["outdated", "--json", ...outdatedArgs[packageManager]],
1471
+ command: pm.command,
1472
+ args: pm.outdated.commandArgs,
1369
1473
  cwd: process.cwd(),
1370
1474
  ignoreExitCode: true
1371
1475
  // outdated returns exit code 1 when outdated dependencies are found
1372
1476
  });
1373
- const normalizedResult = normalizeOutdatedMapper[packageManager](stdout);
1477
+ const normalizedResult = pm.outdated.unifyResult(stdout);
1374
1478
  return dependencyGroups.map(
1375
- (dep) => outdatedResultToAuditOutput(normalizedResult, packageManager, dep)
1479
+ (depGroup) => outdatedResultToAuditOutput(normalizedResult, id, depGroup)
1376
1480
  );
1377
1481
  }
1378
- async function processAudit(packageManager, auditLevelMapping) {
1379
- const supportedDepGroups = packageManager === "yarn-modern" ? dependencyGroups.filter((dep) => dep !== "optional") : dependencyGroups;
1482
+ async function processAudit(id, auditLevelMapping) {
1483
+ const pm = packageManagers[id];
1484
+ const supportedDepGroups = pm.audit.supportedDepGroups ?? dependencyGroups;
1380
1485
  const auditResults = await Promise.allSettled(
1381
1486
  supportedDepGroups.map(
1382
- async (dep) => {
1487
+ async (depGroup) => {
1383
1488
  const { stdout } = await executeProcess({
1384
- command: pkgManagerCommands[packageManager],
1385
- args: getAuditCommandArgs(packageManager, dep),
1489
+ command: pm.command,
1490
+ args: pm.audit.getCommandArgs(depGroup),
1386
1491
  cwd: process.cwd(),
1387
- ignoreExitCode: packageManager === "yarn-classic" || packageManager === "pnpm"
1388
- // yarn v1 and PNPM do not have exit code configuration
1492
+ ignoreExitCode: pm.audit.ignoreExitCode
1389
1493
  });
1390
- return [dep, normalizeAuditMapper[packageManager](stdout)];
1494
+ return [depGroup, pm.audit.unifyResult(stdout)];
1391
1495
  }
1392
1496
  )
1393
1497
  );
@@ -1396,31 +1500,21 @@ async function processAudit(packageManager, auditLevelMapping) {
1396
1500
  rejected.map((result) => {
1397
1501
  console.error(result.reason);
1398
1502
  });
1399
- throw new Error(
1400
- `JS Packages plugin: Running ${pkgManagerCommands[packageManager]} audit failed.`
1401
- );
1503
+ throw new Error(`JS Packages plugin: Running ${pm.name} audit failed.`);
1402
1504
  }
1403
1505
  const fulfilled = objectFromEntries(
1404
1506
  auditResults.filter(isPromiseFulfilledResult).map((x) => x.value)
1405
1507
  );
1406
- const uniqueResults = postProcessingAuditMapper[packageManager]?.(fulfilled) ?? fulfilled;
1508
+ const uniqueResults = pm.audit.postProcessResult?.(fulfilled) ?? fulfilled;
1407
1509
  return supportedDepGroups.map(
1408
- (group) => auditResultToAuditOutput(
1409
- uniqueResults[group],
1410
- packageManager,
1411
- group,
1510
+ (depGroup) => auditResultToAuditOutput(
1511
+ uniqueResults[depGroup],
1512
+ id,
1513
+ depGroup,
1412
1514
  auditLevelMapping
1413
1515
  )
1414
1516
  );
1415
1517
  }
1416
- function getAuditCommandArgs(packageManager, group) {
1417
- return [
1418
- ...packageManager === "yarn-modern" ? ["npm"] : [],
1419
- "audit",
1420
- "--json",
1421
- ...auditArgs(group)[packageManager]
1422
- ];
1423
- }
1424
1518
 
1425
1519
  // packages/plugin-js-packages/src/bin.ts
1426
1520
  await executeRunner();