@code-pushup/js-packages-plugin 0.56.0 → 0.58.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 (113) hide show
  1. package/package.json +9 -7
  2. package/src/bin.js +6 -0
  3. package/src/bin.js.map +1 -0
  4. package/src/index.d.ts +2 -2
  5. package/src/index.js +3 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/config.d.ts +4 -4
  8. package/src/lib/config.js +59 -0
  9. package/src/lib/config.js.map +1 -0
  10. package/src/lib/constants.d.ts +2 -2
  11. package/src/lib/constants.js +25 -0
  12. package/src/lib/constants.js.map +1 -0
  13. package/src/lib/js-packages-plugin.d.ts +1 -1
  14. package/src/lib/js-packages-plugin.js +101 -0
  15. package/src/lib/js-packages-plugin.js.map +1 -0
  16. package/src/lib/package-managers/constants.js +3 -0
  17. package/src/lib/package-managers/constants.js.map +1 -0
  18. package/src/lib/package-managers/derive-package-manager.d.ts +2 -2
  19. package/src/lib/package-managers/derive-package-manager.js +43 -0
  20. package/src/lib/package-managers/derive-package-manager.js.map +1 -0
  21. package/src/lib/package-managers/derive-yarn.js +16 -0
  22. package/src/lib/package-managers/derive-yarn.js.map +1 -0
  23. package/src/lib/package-managers/npm/audit-result.d.ts +2 -2
  24. package/src/lib/package-managers/npm/audit-result.js +65 -0
  25. package/src/lib/package-managers/npm/audit-result.js.map +1 -0
  26. package/src/lib/package-managers/npm/npm.d.ts +1 -1
  27. package/src/lib/package-managers/npm/npm.js +49 -0
  28. package/src/lib/package-managers/npm/npm.js.map +1 -0
  29. package/src/lib/package-managers/npm/outdated-result.d.ts +1 -1
  30. package/src/lib/package-managers/npm/outdated-result.js +16 -0
  31. package/src/lib/package-managers/npm/outdated-result.js.map +1 -0
  32. package/src/lib/package-managers/npm/types.d.ts +3 -3
  33. package/src/lib/package-managers/npm/types.js +2 -0
  34. package/src/lib/package-managers/npm/types.js.map +1 -0
  35. package/src/lib/package-managers/package-managers.d.ts +2 -2
  36. package/src/lib/package-managers/package-managers.js +11 -0
  37. package/src/lib/package-managers/package-managers.js.map +1 -0
  38. package/src/lib/package-managers/pnpm/audit-result.d.ts +1 -1
  39. package/src/lib/package-managers/pnpm/audit-result.js +34 -0
  40. package/src/lib/package-managers/pnpm/audit-result.js.map +1 -0
  41. package/src/lib/package-managers/pnpm/outdated-result.d.ts +1 -1
  42. package/src/lib/package-managers/pnpm/outdated-result.js +12 -0
  43. package/src/lib/package-managers/pnpm/outdated-result.js.map +1 -0
  44. package/src/lib/package-managers/pnpm/pnpm.d.ts +1 -1
  45. package/src/lib/package-managers/pnpm/pnpm.js +49 -0
  46. package/src/lib/package-managers/pnpm/pnpm.js.map +1 -0
  47. package/src/lib/package-managers/pnpm/types.d.ts +2 -2
  48. package/src/lib/package-managers/pnpm/types.js +2 -0
  49. package/src/lib/package-managers/pnpm/types.js.map +1 -0
  50. package/src/lib/package-managers/pnpm/utils.js +5 -0
  51. package/src/lib/package-managers/pnpm/utils.js.map +1 -0
  52. package/src/lib/package-managers/types.d.ts +3 -3
  53. package/src/lib/package-managers/types.js +2 -0
  54. package/src/lib/package-managers/types.js.map +1 -0
  55. package/src/lib/package-managers/yarn-classic/audit-result.d.ts +1 -1
  56. package/src/lib/package-managers/yarn-classic/audit-result.js +36 -0
  57. package/src/lib/package-managers/yarn-classic/audit-result.js.map +1 -0
  58. package/src/lib/package-managers/yarn-classic/constants.d.ts +2 -2
  59. package/src/lib/package-managers/yarn-classic/constants.js +14 -0
  60. package/src/lib/package-managers/yarn-classic/constants.js.map +1 -0
  61. package/src/lib/package-managers/yarn-classic/outdated-result.d.ts +1 -1
  62. package/src/lib/package-managers/yarn-classic/outdated-result.js +39 -0
  63. package/src/lib/package-managers/yarn-classic/outdated-result.js.map +1 -0
  64. package/src/lib/package-managers/yarn-classic/types.d.ts +1 -1
  65. package/src/lib/package-managers/yarn-classic/types.js +8 -0
  66. package/src/lib/package-managers/yarn-classic/types.js.map +1 -0
  67. package/src/lib/package-managers/yarn-classic/yarn-classic.d.ts +1 -1
  68. package/src/lib/package-managers/yarn-classic/yarn-classic.js +29 -0
  69. package/src/lib/package-managers/yarn-classic/yarn-classic.js.map +1 -0
  70. package/src/lib/package-managers/yarn-modern/audit-result.d.ts +1 -1
  71. package/src/lib/package-managers/yarn-modern/audit-result.js +25 -0
  72. package/src/lib/package-managers/yarn-modern/audit-result.js.map +1 -0
  73. package/src/lib/package-managers/yarn-modern/outdated-result.d.ts +1 -1
  74. package/src/lib/package-managers/yarn-modern/outdated-result.js +10 -0
  75. package/src/lib/package-managers/yarn-modern/outdated-result.js.map +1 -0
  76. package/src/lib/package-managers/yarn-modern/types.d.ts +2 -2
  77. package/src/lib/package-managers/yarn-modern/types.js +2 -0
  78. package/src/lib/package-managers/yarn-modern/types.js.map +1 -0
  79. package/src/lib/package-managers/yarn-modern/yarn-modern.d.ts +1 -1
  80. package/src/lib/package-managers/yarn-modern/yarn-modern.js +36 -0
  81. package/src/lib/package-managers/yarn-modern/yarn-modern.js.map +1 -0
  82. package/src/lib/runner/audit/constants.d.ts +1 -1
  83. package/src/lib/runner/audit/constants.js +10 -0
  84. package/src/lib/runner/audit/constants.js.map +1 -0
  85. package/src/lib/runner/audit/transform.d.ts +2 -2
  86. package/src/lib/runner/audit/transform.js +63 -0
  87. package/src/lib/runner/audit/transform.js.map +1 -0
  88. package/src/lib/runner/audit/types.d.ts +1 -1
  89. package/src/lib/runner/audit/types.js +2 -0
  90. package/src/lib/runner/audit/types.js.map +1 -0
  91. package/src/lib/runner/audit/utils.d.ts +1 -1
  92. package/src/lib/runner/audit/utils.js +4 -0
  93. package/src/lib/runner/audit/utils.js.map +1 -0
  94. package/src/lib/runner/index.d.ts +3 -3
  95. package/src/lib/runner/index.js +84 -0
  96. package/src/lib/runner/index.js.map +1 -0
  97. package/src/lib/runner/outdated/constants.js +13 -0
  98. package/src/lib/runner/outdated/constants.js.map +1 -0
  99. package/src/lib/runner/outdated/transform.d.ts +2 -2
  100. package/src/lib/runner/outdated/transform.js +60 -0
  101. package/src/lib/runner/outdated/transform.js.map +1 -0
  102. package/src/lib/runner/outdated/types.js +6 -0
  103. package/src/lib/runner/outdated/types.js.map +1 -0
  104. package/src/lib/runner/utils.d.ts +2 -2
  105. package/src/lib/runner/utils.js +56 -0
  106. package/src/lib/runner/utils.js.map +1 -0
  107. package/src/lib/utils.d.ts +3 -3
  108. package/src/lib/utils.js +17 -0
  109. package/src/lib/utils.js.map +1 -0
  110. package/bin.js +0 -1759
  111. package/index.js +0 -1651
  112. package/src/lib/package-managers/index.d.ts +0 -2
  113. package/src/lib/runner/constants.d.ts +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-js-packages/src/lib/runner/audit/utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CACrC,OAA0C;IAE1C,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { RunnerConfig } from '@code-pushup/models';
2
- import { type FinalJSPackagesPluginConfig } from '../config';
1
+ import type { RunnerConfig, RunnerFilesPaths } from '@code-pushup/models';
2
+ import { type FinalJSPackagesPluginConfig } from '../config.js';
3
3
  export declare function createRunnerConfig(scriptPath: string, config: FinalJSPackagesPluginConfig): Promise<RunnerConfig>;
4
- export declare function executeRunner(): Promise<void>;
4
+ export declare function executeRunner({ runnerConfigPath, runnerOutputPath, }: RunnerFilesPaths): Promise<void>;
@@ -0,0 +1,84 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { createRunnerFiles, ensureDirectoryExists, executeProcess, filePathToCliArg, isPromiseFulfilledResult, isPromiseRejectedResult, objectFromEntries, objectToCliArgs, readJsonFile, } from '@code-pushup/utils';
4
+ import { dependencyGroups, } from '../config.js';
5
+ import { dependencyGroupToLong } from '../constants.js';
6
+ import { packageManagers } from '../package-managers/package-managers.js';
7
+ import { auditResultToAuditOutput } from './audit/transform.js';
8
+ import { outdatedResultToAuditOutput } from './outdated/transform.js';
9
+ import { findAllPackageJson, getTotalDependencies } from './utils.js';
10
+ export async function createRunnerConfig(scriptPath, config) {
11
+ const { runnerConfigPath, runnerOutputPath } = await createRunnerFiles('js-packages', JSON.stringify(config));
12
+ return {
13
+ command: 'node',
14
+ args: [
15
+ filePathToCliArg(scriptPath),
16
+ ...objectToCliArgs({ runnerConfigPath, runnerOutputPath }),
17
+ ],
18
+ configFile: runnerConfigPath,
19
+ outputFile: runnerOutputPath,
20
+ };
21
+ }
22
+ export async function executeRunner({ runnerConfigPath, runnerOutputPath, }) {
23
+ const { packageManager, checks, auditLevelMapping, packageJsonPaths, dependencyGroups: depGroups, } = await readJsonFile(runnerConfigPath);
24
+ const auditResults = checks.includes('audit')
25
+ ? await processAudit(packageManager, depGroups, auditLevelMapping)
26
+ : [];
27
+ const outdatedResults = checks.includes('outdated')
28
+ ? await processOutdated(packageManager, depGroups, packageJsonPaths)
29
+ : [];
30
+ const checkResults = [...auditResults, ...outdatedResults];
31
+ await ensureDirectoryExists(path.dirname(runnerOutputPath));
32
+ await writeFile(runnerOutputPath, JSON.stringify(checkResults));
33
+ }
34
+ async function processOutdated(id, depGroups, packageJsonPaths) {
35
+ const pm = packageManagers[id];
36
+ const { stdout, stderr } = await executeProcess({
37
+ command: pm.command,
38
+ args: pm.outdated.commandArgs,
39
+ cwd: process.cwd(),
40
+ ignoreExitCode: true, // outdated returns exit code 1 when outdated dependencies are found
41
+ });
42
+ // Successful outdated check has empty stderr
43
+ if (stderr) {
44
+ throw new Error(`JS packages plugin: outdated error: ${stderr}`);
45
+ }
46
+ // Locate all package.json files in the repository if not provided
47
+ const finalPaths = Array.isArray(packageJsonPaths)
48
+ ? packageJsonPaths
49
+ : await findAllPackageJson();
50
+ const depTotals = await getTotalDependencies(finalPaths);
51
+ const normalizedResult = pm.outdated.unifyResult(stdout);
52
+ return depGroups.map(depGroup => outdatedResultToAuditOutput(normalizedResult, id, depGroup, depTotals[dependencyGroupToLong[depGroup]]));
53
+ }
54
+ async function processAudit(id, depGroups, auditLevelMapping) {
55
+ const pm = packageManagers[id];
56
+ const supportedAuditDepGroups = pm.audit.supportedDepGroups ?? dependencyGroups;
57
+ const compatibleAuditDepGroups = depGroups.filter(group => supportedAuditDepGroups.includes(group));
58
+ const auditResults = await Promise.allSettled(compatibleAuditDepGroups.map(async (depGroup) => {
59
+ const { stdout, stderr } = await executeProcess({
60
+ command: pm.command,
61
+ args: pm.audit.getCommandArgs(depGroup),
62
+ cwd: process.cwd(),
63
+ ignoreExitCode: pm.audit.ignoreExitCode,
64
+ });
65
+ // Successful audit check has empty stderr
66
+ if (stderr) {
67
+ throw new Error(`JS packages plugin: audit error: ${stderr}`);
68
+ }
69
+ return [depGroup, pm.audit.unifyResult(stdout)];
70
+ }));
71
+ const rejected = auditResults.filter(isPromiseRejectedResult);
72
+ if (rejected.length > 0) {
73
+ rejected.forEach(result => {
74
+ console.error(result.reason);
75
+ });
76
+ throw new Error(`JS Packages plugin: Running ${pm.name} audit failed.`);
77
+ }
78
+ const fulfilled = objectFromEntries(auditResults.filter(isPromiseFulfilledResult).map(x => x.value));
79
+ const uniqueResults = pm.audit.postProcessResult?.(fulfilled) ?? fulfilled;
80
+ return compatibleAuditDepGroups.map(depGroup => auditResultToAuditOutput(
81
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
82
+ uniqueResults[depGroup], id, depGroup, auditLevelMapping));
83
+ }
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugin-js-packages/src/lib/runner/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { objectToKeys } from '@code-pushup/utils';
2
+ export const outdatedSeverity = {
3
+ major: 'error',
4
+ premajor: 'info',
5
+ minor: 'warning',
6
+ preminor: 'info',
7
+ patch: 'info',
8
+ prepatch: 'info',
9
+ prerelease: 'info',
10
+ };
11
+ // RELEASE_TYPES directly exported from semver don't work out of the box
12
+ export const RELEASE_TYPES = objectToKeys(outdatedSeverity);
13
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-js-packages/src/lib/runner/outdated/constants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAuC;IAClE,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,wEAAwE;AACxE,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { AuditOutput, Issue } from '@code-pushup/models';
2
- import type { DependencyGroup, PackageManagerId } from '../../config';
3
- import type { OutdatedResult, PackageVersion } from './types';
2
+ import type { DependencyGroup, PackageManagerId } from '../../config.js';
3
+ import type { OutdatedResult, PackageVersion } from './types.js';
4
4
  export declare function outdatedResultToAuditOutput(result: OutdatedResult, packageManager: PackageManagerId, depGroup: DependencyGroup, totalDeps: number): AuditOutput;
5
5
  export declare function calculateOutdatedScore(majorOutdated: number, totalDeps: number): number;
6
6
  export declare function outdatedToDisplayValue(stats: PackageVersion): string;
@@ -0,0 +1,60 @@
1
+ import { md } from 'build-md';
2
+ import { clean, diff, neq } from 'semver';
3
+ import { objectFromEntries, pluralize } from '@code-pushup/utils';
4
+ import { dependencyGroupToLong } from '../../constants.js';
5
+ import { RELEASE_TYPES, outdatedSeverity } from './constants.js';
6
+ export function outdatedResultToAuditOutput(result, packageManager, depGroup, totalDeps) {
7
+ const relevantDependencies = result.filter(dep => dep.type === dependencyGroupToLong[depGroup]);
8
+ const validDependencies = relevantDependencies
9
+ .map(dep => ({
10
+ ...dep,
11
+ current: clean(dep.current),
12
+ latest: clean(dep.latest),
13
+ }))
14
+ .filter((dep) => dep.current != null && dep.latest != null);
15
+ const outdatedDependencies = validDependencies.filter(dep => neq(dep.current, dep.latest));
16
+ const outdatedStats = outdatedDependencies.reduce((acc, dep) => {
17
+ const outdatedLevel = diff(dep.current, dep.latest);
18
+ if (outdatedLevel == null) {
19
+ return acc;
20
+ }
21
+ return { ...acc, [outdatedLevel]: acc[outdatedLevel] + 1 };
22
+ }, objectFromEntries(RELEASE_TYPES.map(versionType => [versionType, 0])));
23
+ const issues = outdatedDependencies.length === 0
24
+ ? []
25
+ : outdatedToIssues(outdatedDependencies);
26
+ return {
27
+ slug: `${packageManager}-outdated-${depGroup}`,
28
+ score: calculateOutdatedScore(outdatedStats.major, totalDeps),
29
+ value: outdatedDependencies.length,
30
+ displayValue: outdatedToDisplayValue(outdatedStats),
31
+ details: { issues },
32
+ };
33
+ }
34
+ export function calculateOutdatedScore(majorOutdated, totalDeps) {
35
+ return totalDeps > 0 ? (totalDeps - majorOutdated) / totalDeps : 1;
36
+ }
37
+ export function outdatedToDisplayValue(stats) {
38
+ const total = Object.values(stats).reduce((acc, value) => acc + value, 0);
39
+ const versionBreakdown = RELEASE_TYPES.map(version => stats[version] > 0 ? `${stats[version]} ${version}` : '').filter(text => text !== '');
40
+ if (versionBreakdown.length === 0) {
41
+ return 'all dependencies are up to date';
42
+ }
43
+ if (versionBreakdown.length > 1) {
44
+ return `${total} outdated package versions (${versionBreakdown.join(', ')})`;
45
+ }
46
+ return `${versionBreakdown[0]} outdated package ${pluralize('version', total)}`;
47
+ }
48
+ export function outdatedToIssues(dependencies) {
49
+ return dependencies.map(dep => {
50
+ const { name, current, latest, url } = dep;
51
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
52
+ const outdatedLevel = diff(current, latest);
53
+ const packageReference = url == null ? md.code(name) : md.link(url, md.code(name));
54
+ return {
55
+ message: md `Package ${packageReference} requires a ${md.bold(outdatedLevel)} update from ${md.bold(current)} to ${md.bold(latest)}.`.toString(),
56
+ severity: outdatedSeverity[outdatedLevel],
57
+ };
58
+ });
59
+ }
60
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-js-packages/src/lib/runner/outdated/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export const dependencyGroupLong = [
2
+ 'dependencies',
3
+ 'devDependencies',
4
+ 'optionalDependencies',
5
+ ];
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-js-packages/src/lib/runner/outdated/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,cAAc;IACd,iBAAiB;IACjB,sBAAsB;CACd,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { AuditResult, Vulnerability } from './audit/types';
2
- import { type DependencyTotals } from './outdated/types';
1
+ import type { AuditResult, Vulnerability } from './audit/types.js';
2
+ import { type DependencyTotals } from './outdated/types.js';
3
3
  export declare function filterAuditResult(result: AuditResult, key: keyof Vulnerability, referenceResult?: AuditResult): AuditResult;
4
4
  export declare function findAllPackageJson(): Promise<string[]>;
5
5
  export declare function getTotalDependencies(packageJsonPaths: string[]): Promise<DependencyTotals>;
@@ -0,0 +1,56 @@
1
+ import path from 'node:path';
2
+ import { crawlFileSystem, objectFromEntries, objectToKeys, readJsonFile, } from '@code-pushup/utils';
3
+ import { dependencyGroupLong, } from './outdated/types.js';
4
+ export function filterAuditResult(result, key, referenceResult) {
5
+ if (result.vulnerabilities.length === 0) {
6
+ return result;
7
+ }
8
+ const uniqueResult = result.vulnerabilities.reduce((acc, ref) => {
9
+ const matchReference = referenceResult ?? acc;
10
+ const isMatch = matchReference.vulnerabilities
11
+ .map(vulnerability => vulnerability[key])
12
+ .includes(ref[key]);
13
+ if (isMatch) {
14
+ return {
15
+ vulnerabilities: acc.vulnerabilities,
16
+ summary: {
17
+ ...acc.summary,
18
+ [ref.severity]: acc.summary[ref.severity] - 1,
19
+ total: acc.summary.total - 1,
20
+ },
21
+ };
22
+ }
23
+ return {
24
+ vulnerabilities: [...acc.vulnerabilities, ref],
25
+ summary: acc.summary,
26
+ };
27
+ }, { vulnerabilities: [], summary: result.summary });
28
+ return {
29
+ vulnerabilities: uniqueResult.vulnerabilities,
30
+ summary: uniqueResult.summary,
31
+ };
32
+ }
33
+ // TODO: use .gitignore
34
+ export async function findAllPackageJson() {
35
+ return (await crawlFileSystem({
36
+ directory: '.',
37
+ pattern: /(^|[\\/])package\.json$/,
38
+ })).filter(filePath => !filePath.startsWith(`node_modules${path.sep}`) &&
39
+ !filePath.includes(`${path.sep}node_modules${path.sep}`) &&
40
+ !filePath.startsWith(`.nx${path.sep}`));
41
+ }
42
+ export async function getTotalDependencies(packageJsonPaths) {
43
+ const parsedDeps = await Promise.all(packageJsonPaths.map((readJsonFile)));
44
+ const mergedDeps = parsedDeps.reduce((acc, depMapper) => objectFromEntries(dependencyGroupLong.map(group => {
45
+ const deps = depMapper[group];
46
+ return [
47
+ group,
48
+ [...acc[group], ...(deps == null ? [] : objectToKeys(deps))],
49
+ ];
50
+ })), { dependencies: [], devDependencies: [], optionalDependencies: [] });
51
+ return objectFromEntries(objectToKeys(mergedDeps).map(deps => [
52
+ deps,
53
+ new Set(mergedDeps[deps]).size,
54
+ ]));
55
+ }
56
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../packages/plugin-js-packages/src/lib/runner/utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAIL,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,iBAAiB,CAC/B,MAAmB,EACnB,GAAwB,EACxB,eAA6B;IAE7B,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAChD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,MAAM,cAAc,GAAG,eAAe,IAAI,GAAG,CAAC;QAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,eAAe;aAC3C,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;aACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;gBACL,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,OAAO,EAAE;oBACP,GAAG,GAAG,CAAC,OAAO;oBACd,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAC7C,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC;iBAC7B;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,eAAe,EAAE,CAAC,GAAG,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC;YAC9C,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC,EACD,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CACjD,CAAC;IAEF,OAAO;QACL,eAAe,EAAE,YAAY,CAAC,eAAe;QAC7C,OAAO,EAAE,YAAY,CAAC,OAAO;KAC9B,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,OAAO,CACL,MAAM,eAAe,CAAC;QACpB,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,yBAAyB;KACnC,CAAC,CACH,CAAC,MAAM,CACN,QAAQ,CAAC,EAAE,CACT,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/C,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC;QACxD,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,gBAA0B;IAE1B,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,gBAAgB,CAAC,GAAG,CAAC,CAAA,YAAyB,CAAA,CAAC,CAChD,CAAC;IAEF,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CACjB,iBAAiB,CACf,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO;YACL,KAAK;YACL,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;SAC7D,CAAC;IACJ,CAAC,CAAC,CACH,EACH,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,CACpE,CAAC;IACF,OAAO,iBAAiB,CACtB,YAAY,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI;QACJ,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;KAC/B,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -1,9 +1,9 @@
1
- import { type JSPackagesPluginConfig } from './config';
1
+ import { type JSPackagesPluginConfig } from './config.js';
2
2
  export declare function normalizeConfig(config?: JSPackagesPluginConfig): Promise<{
3
- packageManager: import("./package-managers").PackageManager;
3
+ packageManager: import("./package-managers/types.js").PackageManager;
4
4
  checks: ("audit" | "outdated")[];
5
5
  depGroups: ("prod" | "dev" | "optional")[];
6
- auditLevelMapping: import("./config").AuditSeverity;
6
+ auditLevelMapping: import("./config.js").AuditSeverity;
7
7
  packageJsonPaths: string[] | {
8
8
  autoSearch: true;
9
9
  };
@@ -0,0 +1,17 @@
1
+ import { jsPackagesPluginConfigSchema, } from './config.js';
2
+ import { derivePackageManager } from './package-managers/derive-package-manager.js';
3
+ import { packageManagers } from './package-managers/package-managers.js';
4
+ export async function normalizeConfig(config) {
5
+ const jsPackagesPluginConfig = jsPackagesPluginConfigSchema.parse(config ?? {});
6
+ const { packageManager, dependencyGroups: dependencyGroupsCfg = [], checks: checksCfg = [], ...jsPackagesPluginConfigRest } = jsPackagesPluginConfig;
7
+ const checks = [...new Set(checksCfg)];
8
+ const depGroups = [...new Set(dependencyGroupsCfg)];
9
+ const pm = packageManagers[packageManager ?? (await derivePackageManager())];
10
+ return {
11
+ ...jsPackagesPluginConfigRest,
12
+ packageManager: pm,
13
+ checks,
14
+ depGroups,
15
+ };
16
+ }
17
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../packages/plugin-js-packages/src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAA+B;IACnE,MAAM,sBAAsB,GAAG,4BAA4B,CAAC,KAAK,CAC/D,MAAM,IAAI,EAAE,CACb,CAAC;IAEF,MAAM,EACJ,cAAc,EACd,gBAAgB,EAAE,mBAAmB,GAAG,EAAE,EAC1C,MAAM,EAAE,SAAS,GAAG,EAAE,EACtB,GAAG,0BAA0B,EAC9B,GAAG,sBAAsB,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,eAAe,CAAC,cAAc,IAAI,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC,CAAC;IAE7E,OAAO;QACL,GAAG,0BAA0B;QAC7B,cAAc,EAAE,EAAE;QAClB,MAAM;QACN,SAAS;KACV,CAAC;AACJ,CAAC"}