@code-pushup/ci 0.55.0 → 0.57.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 (85) hide show
  1. package/README.md +38 -16
  2. package/package.json +10 -8
  3. package/src/index.d.ts +4 -4
  4. package/src/index.js +3 -0
  5. package/src/index.js.map +1 -0
  6. package/src/lib/cli/commands/collect.d.ts +2 -3
  7. package/src/lib/cli/commands/collect.js +16 -0
  8. package/src/lib/cli/commands/collect.js.map +1 -0
  9. package/src/lib/cli/commands/compare.d.ts +2 -3
  10. package/src/lib/cli/commands/compare.js +20 -0
  11. package/src/lib/cli/commands/compare.js.map +1 -0
  12. package/src/lib/cli/commands/merge-diffs.d.ts +2 -3
  13. package/src/lib/cli/commands/merge-diffs.js +23 -0
  14. package/src/lib/cli/commands/merge-diffs.js.map +1 -0
  15. package/src/lib/cli/commands/print-config.d.ts +2 -2
  16. package/src/lib/cli/commands/print-config.js +26 -0
  17. package/src/lib/cli/commands/print-config.js.map +1 -0
  18. package/src/lib/cli/context.d.ts +3 -5
  19. package/src/lib/cli/context.js +9 -0
  20. package/src/lib/cli/context.js.map +1 -0
  21. package/src/lib/cli/index.d.ts +6 -6
  22. package/src/lib/cli/index.js +7 -0
  23. package/src/lib/cli/index.js.map +1 -0
  24. package/src/lib/cli/persist.d.ts +5 -26
  25. package/src/lib/cli/persist.js +24 -0
  26. package/src/lib/cli/persist.js.map +1 -0
  27. package/src/lib/comment.d.ts +1 -1
  28. package/src/lib/comment.js +29 -0
  29. package/src/lib/comment.js.map +1 -0
  30. package/src/lib/constants.d.ts +1 -1
  31. package/src/lib/constants.js +15 -0
  32. package/src/lib/constants.js.map +1 -0
  33. package/src/lib/git.js +99 -0
  34. package/src/lib/git.js.map +1 -0
  35. package/src/lib/issues.d.ts +1 -1
  36. package/src/lib/issues.js +96 -0
  37. package/src/lib/issues.js.map +1 -0
  38. package/src/lib/models.d.ts +10 -11
  39. package/src/lib/models.js +2 -0
  40. package/src/lib/models.js.map +1 -0
  41. package/src/lib/monorepo/detect-tool.d.ts +1 -1
  42. package/src/lib/monorepo/detect-tool.js +11 -0
  43. package/src/lib/monorepo/detect-tool.js.map +1 -0
  44. package/src/lib/monorepo/handlers/index.d.ts +1 -1
  45. package/src/lib/monorepo/handlers/index.js +20 -0
  46. package/src/lib/monorepo/handlers/index.js.map +1 -0
  47. package/src/lib/monorepo/handlers/npm.d.ts +1 -1
  48. package/src/lib/monorepo/handlers/npm.js +29 -0
  49. package/src/lib/monorepo/handlers/npm.js.map +1 -0
  50. package/src/lib/monorepo/handlers/nx.d.ts +1 -1
  51. package/src/lib/monorepo/handlers/nx.js +62 -0
  52. package/src/lib/monorepo/handlers/nx.js.map +1 -0
  53. package/src/lib/monorepo/handlers/pnpm.d.ts +1 -1
  54. package/src/lib/monorepo/handlers/pnpm.js +47 -0
  55. package/src/lib/monorepo/handlers/pnpm.js.map +1 -0
  56. package/src/lib/monorepo/handlers/turbo.d.ts +1 -1
  57. package/src/lib/monorepo/handlers/turbo.js +48 -0
  58. package/src/lib/monorepo/handlers/turbo.js.map +1 -0
  59. package/src/lib/monorepo/handlers/yarn.d.ts +1 -1
  60. package/src/lib/monorepo/handlers/yarn.js +44 -0
  61. package/src/lib/monorepo/handlers/yarn.js.map +1 -0
  62. package/src/lib/monorepo/index.d.ts +2 -2
  63. package/src/lib/monorepo/index.js +3 -0
  64. package/src/lib/monorepo/index.js.map +1 -0
  65. package/src/lib/monorepo/list-projects.d.ts +9 -3
  66. package/src/lib/monorepo/list-projects.js +99 -0
  67. package/src/lib/monorepo/list-projects.js.map +1 -0
  68. package/src/lib/monorepo/packages.js +50 -0
  69. package/src/lib/monorepo/packages.js.map +1 -0
  70. package/src/lib/monorepo/tools.d.ts +7 -0
  71. package/src/lib/monorepo/tools.js +5 -0
  72. package/src/lib/monorepo/tools.js.map +1 -0
  73. package/src/lib/run-monorepo.d.ts +3 -0
  74. package/src/lib/run-monorepo.js +141 -0
  75. package/src/lib/run-monorepo.js.map +1 -0
  76. package/src/lib/run-standalone.d.ts +3 -0
  77. package/src/lib/run-standalone.js +19 -0
  78. package/src/lib/run-standalone.js.map +1 -0
  79. package/src/lib/run-utils.d.ts +45 -0
  80. package/src/lib/run-utils.js +158 -0
  81. package/src/lib/run-utils.js.map +1 -0
  82. package/src/lib/run.d.ts +1 -1
  83. package/src/lib/run.js +24 -0
  84. package/src/lib/run.js.map +1 -0
  85. package/index.js +0 -1731
@@ -0,0 +1,99 @@
1
+ import { glob } from 'glob';
2
+ import path from 'node:path';
3
+ import { detectMonorepoTool } from './detect-tool.js';
4
+ import { getToolHandler } from './handlers/index.js';
5
+ import { listPackages } from './packages.js';
6
+ export async function listMonorepoProjects(settings) {
7
+ const logger = settings.logger;
8
+ const options = createMonorepoHandlerOptions(settings);
9
+ const tool = await resolveMonorepoTool(settings, options);
10
+ if (tool) {
11
+ const handler = getToolHandler(tool);
12
+ const projects = await handler.listProjects(options);
13
+ logger.info(`Found ${projects.length} projects in ${tool} monorepo`);
14
+ logger.debug(`Projects: ${projects.map(({ name }) => name).join(', ')}`);
15
+ return {
16
+ tool,
17
+ projects,
18
+ runManyCommand: onlyProjects => handler.createRunManyCommand(options, {
19
+ all: projects,
20
+ ...(onlyProjects?.length && { only: onlyProjects }),
21
+ }),
22
+ };
23
+ }
24
+ if (settings.projects) {
25
+ const projects = await listProjectsByGlobs({
26
+ patterns: settings.projects,
27
+ cwd: options.cwd,
28
+ bin: settings.bin,
29
+ logger,
30
+ });
31
+ return { tool, projects };
32
+ }
33
+ const projects = await listProjectsByNpmPackages({
34
+ cwd: options.cwd,
35
+ bin: settings.bin,
36
+ logger,
37
+ });
38
+ return { tool, projects };
39
+ }
40
+ async function resolveMonorepoTool(settings, options) {
41
+ if (!settings.monorepo) {
42
+ // shouldn't happen, handled by caller
43
+ throw new Error('Monorepo mode not enabled');
44
+ }
45
+ const logger = settings.logger;
46
+ if (typeof settings.monorepo === 'string') {
47
+ logger.info(`Using monorepo tool "${settings.monorepo}" from inputs`);
48
+ return settings.monorepo;
49
+ }
50
+ const tool = await detectMonorepoTool(options);
51
+ if (tool) {
52
+ logger.info(`Auto-detected monorepo tool ${tool}`);
53
+ }
54
+ else {
55
+ logger.info("Couldn't auto-detect any supported monorepo tool");
56
+ }
57
+ return tool;
58
+ }
59
+ function createMonorepoHandlerOptions(settings) {
60
+ return {
61
+ task: settings.task,
62
+ cwd: settings.directory,
63
+ parallel: settings.parallel,
64
+ nxProjectsFilter: settings.nxProjectsFilter,
65
+ ...(!settings.silent && {
66
+ observer: {
67
+ onStdout: stdout => {
68
+ console.info(stdout);
69
+ },
70
+ onStderr: stderr => {
71
+ console.warn(stderr);
72
+ },
73
+ },
74
+ }),
75
+ };
76
+ }
77
+ async function listProjectsByGlobs(args) {
78
+ const { patterns, cwd, bin, logger } = args;
79
+ const directories = await glob(patterns.map(pattern => pattern.replace(/\/$/, '/')), { cwd });
80
+ logger.info(`Found ${directories.length} project folders matching "${patterns.join(', ')}" from configuration`);
81
+ logger.debug(`Projects: ${directories.join(', ')}`);
82
+ return directories.toSorted().map(directory => ({
83
+ name: directory,
84
+ bin,
85
+ directory: path.join(cwd, directory),
86
+ }));
87
+ }
88
+ async function listProjectsByNpmPackages(args) {
89
+ const { cwd, bin, logger } = args;
90
+ const packages = await listPackages(cwd);
91
+ logger.info(`Found ${packages.length} NPM packages in repository`);
92
+ logger.debug(`Projects: ${packages.map(({ name }) => name).join(', ')}`);
93
+ return packages.map(({ name, directory }) => ({
94
+ name,
95
+ bin,
96
+ directory,
97
+ }));
98
+ }
99
+ //# sourceMappingURL=list-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../../../../../packages/ci/src/lib/monorepo/list-projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { glob } from 'glob';
2
+ import path from 'node:path';
3
+ import { readJsonFile } from '@code-pushup/utils';
4
+ export async function listPackages(cwd, patterns = ['**']) {
5
+ const files = await glob(patterns.map(pattern => pattern.replace(/\/?$/, '/package.json')), { cwd });
6
+ return Promise.all(files.toSorted().map(async (file) => {
7
+ const packageJson = await readJsonFile(path.join(cwd, file));
8
+ const directory = path.join(cwd, path.dirname(file));
9
+ const name = packageJson.name || path.basename(directory);
10
+ return { name, directory, packageJson };
11
+ }));
12
+ }
13
+ export async function listWorkspaces(cwd) {
14
+ const rootPackageJson = await readRootPackageJson(cwd);
15
+ const patterns = Array.isArray(rootPackageJson.workspaces)
16
+ ? rootPackageJson.workspaces
17
+ : rootPackageJson.workspaces?.packages;
18
+ return {
19
+ workspaces: await listPackages(cwd, patterns),
20
+ rootPackageJson,
21
+ };
22
+ }
23
+ export async function hasWorkspacesEnabled(cwd) {
24
+ const packageJson = await readRootPackageJson(cwd);
25
+ if (!packageJson.private) {
26
+ return false;
27
+ }
28
+ if (Array.isArray(packageJson.workspaces)) {
29
+ return packageJson.workspaces.length > 0;
30
+ }
31
+ if (typeof packageJson.workspaces === 'object') {
32
+ return Boolean(packageJson.workspaces.packages?.length);
33
+ }
34
+ return false;
35
+ }
36
+ export async function readRootPackageJson(cwd) {
37
+ return await readJsonFile(path.join(cwd, 'package.json'));
38
+ }
39
+ export function hasDependency(packageJson, name) {
40
+ const { dependencies = {}, devDependencies = {} } = packageJson;
41
+ return name in devDependencies || name in dependencies;
42
+ }
43
+ export function hasScript(packageJson, script) {
44
+ const { scripts = {} } = packageJson;
45
+ return script in scripts;
46
+ }
47
+ export function hasCodePushUpDependency(packageJson) {
48
+ return hasDependency(packageJson, '@code-pushup/cli');
49
+ }
50
+ //# sourceMappingURL=packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.js","sourceRoot":"","sources":["../../../../../../packages/ci/src/lib/monorepo/packages.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,18 @@ export type MonorepoToolHandler = {
5
5
  tool: MonorepoTool;
6
6
  isConfigured: (options: MonorepoHandlerOptions) => Promise<boolean>;
7
7
  listProjects: (options: MonorepoHandlerOptions) => Promise<ProjectConfig[]>;
8
+ createRunManyCommand: (options: MonorepoHandlerOptions, projects: MonorepoHandlerProjectsContext) => string | Promise<string>;
8
9
  };
9
10
  export type MonorepoHandlerOptions = {
10
11
  task: string;
11
12
  cwd: string;
13
+ parallel: boolean | number;
12
14
  observer?: ProcessObserver;
15
+ nxProjectsFilter: string | string[];
16
+ };
17
+ export type MonorepoHandlerProjectsContext = {
18
+ only?: string[];
19
+ all: ProjectConfig[];
13
20
  };
14
21
  export type ProjectConfig = {
15
22
  name: string;
@@ -0,0 +1,5 @@
1
+ export const MONOREPO_TOOLS = ['nx', 'turbo', 'yarn', 'pnpm', 'npm'];
2
+ export function isMonorepoTool(value) {
3
+ return MONOREPO_TOOLS.includes(value);
4
+ }
5
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../../packages/ci/src/lib/monorepo/tools.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;AAgC9E,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,cAAc,CAAC,QAAQ,CAAC,KAAqB,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MonorepoRunResult } from './models.js';
2
+ import { type RunEnv } from './run-utils.js';
3
+ export declare function runInMonorepoMode(env: RunEnv): Promise<MonorepoRunResult>;
@@ -0,0 +1,141 @@
1
+ import { copyFile, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DEFAULT_PERSIST_OUTPUT_DIR, } from '@code-pushup/models';
4
+ import { hasNoNullableProps, } from '@code-pushup/utils';
5
+ import { createCommandContext, persistedFilesFromConfig, runCollect, runMergeDiffs, } from './cli/index.js';
6
+ import { commentOnPR } from './comment.js';
7
+ import { listMonorepoProjects, } from './monorepo/index.js';
8
+ import { checkPrintConfig, compareReports, loadCachedBaseReport, printPersistConfig, runInBaseBranch, runOnProject, } from './run-utils.js';
9
+ export async function runInMonorepoMode(env) {
10
+ const { api, settings } = env;
11
+ const { logger, directory } = settings;
12
+ logger.info('Running Code PushUp in monorepo mode');
13
+ const { projects, runManyCommand } = await listMonorepoProjects(settings);
14
+ const projectResults = runManyCommand
15
+ ? await runProjectsInBulk(projects, runManyCommand, env)
16
+ : await runProjectsIndividually(projects, env);
17
+ const diffJsonPaths = projectResults
18
+ .map(({ files }) => files.diff?.json)
19
+ .filter((file) => file != null);
20
+ if (diffJsonPaths.length > 0) {
21
+ const tmpDiffPath = await runMergeDiffs(diffJsonPaths, createCommandContext(settings, projects[0]));
22
+ logger.debug(`Merged ${diffJsonPaths.length} diffs into ${tmpDiffPath}`);
23
+ const diffPath = path.join(directory, DEFAULT_PERSIST_OUTPUT_DIR, path.basename(tmpDiffPath));
24
+ if (tmpDiffPath !== diffPath) {
25
+ await copyFile(tmpDiffPath, diffPath);
26
+ logger.debug(`Copied ${tmpDiffPath} to ${diffPath}`);
27
+ }
28
+ const commentId = await commentOnPR(tmpDiffPath, api, logger);
29
+ return {
30
+ mode: 'monorepo',
31
+ projects: projectResults,
32
+ commentId,
33
+ diffPath,
34
+ };
35
+ }
36
+ return { mode: 'monorepo', projects: projectResults };
37
+ }
38
+ function runProjectsIndividually(projects, env) {
39
+ env.settings.logger.info(`Running on ${projects.length} projects individually`);
40
+ return projects.reduce(async (acc, project) => [...(await acc), await runOnProject(project, env)], Promise.resolve([]));
41
+ }
42
+ async function runProjectsInBulk(projects, runManyCommand, env) {
43
+ const { refs: { base }, settings, } = env;
44
+ const logger = settings.logger;
45
+ logger.info(`Running on ${projects.length} projects in bulk (parallel: ${settings.parallel})`);
46
+ await collectMany(runManyCommand, env);
47
+ const currProjectReports = await Promise.all(projects.map(async (project) => {
48
+ const ctx = createCommandContext(settings, project);
49
+ const config = await printPersistConfig(ctx, settings);
50
+ const reports = persistedFilesFromConfig(config, ctx);
51
+ return { project, reports, config, ctx };
52
+ }));
53
+ logger.debug(`Loaded ${currProjectReports.length} persist configs by running print-config command for each project`);
54
+ if (base == null) {
55
+ return finalizeProjectReports(currProjectReports);
56
+ }
57
+ return compareProjectsInBulk(currProjectReports, base, runManyCommand, env);
58
+ }
59
+ async function compareProjectsInBulk(currProjectReports, base, runManyCommand, env) {
60
+ const projectReportsWithCache = await Promise.all(currProjectReports.map(async ({ project, ctx, reports, config }) => {
61
+ const args = { project, base, ctx, env };
62
+ return {
63
+ ...args,
64
+ config,
65
+ currReport: await readFile(reports.json, 'utf8'),
66
+ prevReport: await loadCachedBaseReport(args),
67
+ };
68
+ }));
69
+ const uncachedProjectReports = projectReportsWithCache.filter(({ prevReport }) => !prevReport);
70
+ env.settings.logger.info(`${currProjectReports.length - uncachedProjectReports.length} out of ${currProjectReports.length} projects loaded previous report from artifact cache`);
71
+ const collectedPrevReports = await collectPreviousReports(base, uncachedProjectReports, runManyCommand, env);
72
+ const projectsToCompare = projectReportsWithCache
73
+ .map(args => ({
74
+ ...args,
75
+ prevReport: args.prevReport || collectedPrevReports[args.project.name],
76
+ }))
77
+ .filter(hasNoNullableProps);
78
+ const projectComparisons = await projectsToCompare.reduce(async (acc, args) => ({
79
+ ...(await acc),
80
+ [args.project.name]: await compareReports(args),
81
+ }), Promise.resolve({}));
82
+ return finalizeProjectReports(currProjectReports, projectComparisons);
83
+ }
84
+ function finalizeProjectReports(projectReports, projectComparisons) {
85
+ return projectReports.map(({ project, reports }) => {
86
+ const comparison = projectComparisons?.[project.name];
87
+ return {
88
+ name: project.name,
89
+ files: {
90
+ report: reports,
91
+ ...(comparison && { diff: comparison.files }),
92
+ },
93
+ ...(comparison?.newIssues && { newIssues: comparison.newIssues }),
94
+ };
95
+ });
96
+ }
97
+ async function collectPreviousReports(base, uncachedProjectReports, runManyCommand, env) {
98
+ const { settings: { logger }, } = env;
99
+ if (uncachedProjectReports.length === 0) {
100
+ return {};
101
+ }
102
+ return runInBaseBranch(base, env, async () => {
103
+ const uncachedProjectConfigs = await Promise.all(uncachedProjectReports.map(async (args) => ({
104
+ name: args.project.name,
105
+ ctx: args.ctx,
106
+ config: await checkPrintConfig(args),
107
+ })));
108
+ const validProjectConfigs = uncachedProjectConfigs.filter(hasNoNullableProps);
109
+ const onlyProjects = validProjectConfigs.map(({ name }) => name);
110
+ const invalidProjects = uncachedProjectConfigs
111
+ .map(({ name }) => name)
112
+ .filter(name => !onlyProjects.includes(name));
113
+ if (invalidProjects.length > 0) {
114
+ logger.debug(`Printing config failed for ${invalidProjects.length} projects - ${invalidProjects.join(', ')}`);
115
+ logger.info(`Skipping ${invalidProjects.length} projects which aren't configured in base branch ${base.ref}`);
116
+ }
117
+ if (onlyProjects.length > 0) {
118
+ logger.info(`Collecting previous reports for ${onlyProjects.length} projects`);
119
+ await collectMany(runManyCommand, env, onlyProjects);
120
+ }
121
+ const projectFiles = validProjectConfigs.map(async ({ name, ctx, config }) => [
122
+ name,
123
+ await readFile(persistedFilesFromConfig(config, ctx).json, 'utf8'),
124
+ ]);
125
+ return Object.fromEntries(await Promise.all(projectFiles));
126
+ });
127
+ }
128
+ async function collectMany(runManyCommand, env, onlyProjects) {
129
+ const { settings } = env;
130
+ const command = await runManyCommand(onlyProjects);
131
+ const ctx = {
132
+ ...createCommandContext(settings, null),
133
+ bin: command,
134
+ };
135
+ await runCollect(ctx);
136
+ const countText = onlyProjects
137
+ ? `${onlyProjects.length} previous`
138
+ : 'all current';
139
+ settings.logger.debug(`Collected ${countText} reports using command \`${command}\``);
140
+ }
141
+ //# sourceMappingURL=run-monorepo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-monorepo.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-monorepo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { StandaloneRunResult } from './models.js';
2
+ import { type RunEnv } from './run-utils.js';
3
+ export declare function runInStandaloneMode(env: RunEnv): Promise<StandaloneRunResult>;
@@ -0,0 +1,19 @@
1
+ import { commentOnPR } from './comment.js';
2
+ import { runOnProject } from './run-utils.js';
3
+ export async function runInStandaloneMode(env) {
4
+ const { api, settings: { logger }, } = env;
5
+ logger.info('Running Code PushUp in standalone project mode');
6
+ const { files, newIssues } = await runOnProject(null, env);
7
+ const commentMdPath = files.diff?.md;
8
+ if (commentMdPath) {
9
+ const commentId = await commentOnPR(commentMdPath, api, logger);
10
+ return {
11
+ mode: 'standalone',
12
+ files,
13
+ commentId,
14
+ newIssues,
15
+ };
16
+ }
17
+ return { mode: 'standalone', files, newIssues };
18
+ }
19
+ //# sourceMappingURL=run-standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-standalone.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW;IAEX,MAAM,EACJ,GAAG,EACH,QAAQ,EAAE,EAAE,MAAM,EAAE,GACrB,GAAG,GAAG,CAAC;IAER,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAE9D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE3D,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;IACrC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,KAAK;YACL,SAAS;YACT,SAAS;SACV,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { SimpleGit } from 'simple-git';
2
+ import type { CoreConfig } from '@code-pushup/models';
3
+ import { type CommandContext } from './cli/index.js';
4
+ import { type SourceFileIssue } from './issues.js';
5
+ import type { GitBranch, GitRefs, Logger, OutputFiles, ProjectRunResult, ProviderAPIClient, Settings } from './models.js';
6
+ import type { ProjectConfig } from './monorepo/index.js';
7
+ export type RunEnv = {
8
+ refs: GitRefs;
9
+ api: ProviderAPIClient;
10
+ settings: Settings;
11
+ git: SimpleGit;
12
+ };
13
+ export type CompareReportsArgs = {
14
+ project: ProjectConfig | null;
15
+ env: RunEnv;
16
+ base: GitBranch;
17
+ currReport: string;
18
+ prevReport: string;
19
+ config: Pick<CoreConfig, 'persist'>;
20
+ };
21
+ export type CompareReportsResult = {
22
+ files: OutputFiles;
23
+ newIssues?: SourceFileIssue[];
24
+ };
25
+ export type BaseReportArgs = {
26
+ project: ProjectConfig | null;
27
+ env: RunEnv;
28
+ base: GitBranch;
29
+ ctx: CommandContext;
30
+ };
31
+ export declare function runOnProject(project: ProjectConfig | null, env: RunEnv): Promise<ProjectRunResult>;
32
+ export declare function compareReports(args: CompareReportsArgs): Promise<CompareReportsResult>;
33
+ export declare function collectPreviousReport(args: BaseReportArgs): Promise<string | null>;
34
+ export declare function loadCachedBaseReport(args: BaseReportArgs): Promise<string | null>;
35
+ export declare function runInBaseBranch<T>(base: GitBranch, env: RunEnv, fn: () => Promise<T>): Promise<T>;
36
+ export declare function checkPrintConfig(args: BaseReportArgs): Promise<Pick<CoreConfig, 'persist'> | null>;
37
+ export declare function printPersistConfig(ctx: CommandContext, settings: Settings): Promise<Pick<CoreConfig, 'persist'>>;
38
+ export declare function findNewIssues(args: {
39
+ base: GitBranch;
40
+ currReport: string;
41
+ prevReport: string;
42
+ comparisonFiles: OutputFiles;
43
+ logger: Logger;
44
+ git: SimpleGit;
45
+ }): Promise<SourceFileIssue[]>;
@@ -0,0 +1,158 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { stringifyError } from '@code-pushup/utils';
4
+ import { createCommandContext, persistedFilesFromConfig, runCollect, runCompare, runPrintConfig, } from './cli/index.js';
5
+ import { parsePersistConfig } from './cli/persist.js';
6
+ import { listChangedFiles } from './git.js';
7
+ import { filterRelevantIssues } from './issues.js';
8
+ export async function runOnProject(project, env) {
9
+ const { refs: { head, base }, settings, } = env;
10
+ const logger = settings.logger;
11
+ const ctx = createCommandContext(settings, project);
12
+ if (project) {
13
+ logger.info(`Running Code PushUp on monorepo project ${project.name}`);
14
+ }
15
+ const config = await printPersistConfig(ctx, settings);
16
+ logger.debug(`Loaded persist config from print-config command - ${JSON.stringify(config.persist)}`);
17
+ await runCollect(ctx);
18
+ const reportFiles = persistedFilesFromConfig(config, ctx);
19
+ const currReport = await readFile(reportFiles.json, 'utf8');
20
+ logger.debug(`Collected current report at ${reportFiles.json}`);
21
+ const noDiffOutput = {
22
+ name: project?.name ?? '-',
23
+ files: {
24
+ report: reportFiles,
25
+ },
26
+ };
27
+ if (base == null) {
28
+ return noDiffOutput;
29
+ }
30
+ logger.info(`PR/MR detected, preparing to compare base branch ${base.ref} to head ${head.ref}`);
31
+ const prevReport = await collectPreviousReport({ project, env, base, ctx });
32
+ if (!prevReport) {
33
+ return noDiffOutput;
34
+ }
35
+ const compareArgs = { project, env, base, config, currReport, prevReport };
36
+ const { files: diffFiles, newIssues } = await compareReports(compareArgs);
37
+ return {
38
+ ...noDiffOutput,
39
+ files: {
40
+ ...noDiffOutput.files,
41
+ diff: diffFiles,
42
+ },
43
+ ...(newIssues && { newIssues }),
44
+ };
45
+ }
46
+ export async function compareReports(args) {
47
+ const { project, env: { settings, git }, base, currReport, prevReport, config, } = args;
48
+ const logger = settings.logger;
49
+ const ctx = createCommandContext(settings, project);
50
+ const reportsDir = path.join(settings.directory, '.code-pushup');
51
+ const currPath = path.join(reportsDir, 'curr-report.json');
52
+ const prevPath = path.join(reportsDir, 'prev-report.json');
53
+ await mkdir(reportsDir, { recursive: true });
54
+ await writeFile(currPath, currReport);
55
+ await writeFile(prevPath, prevReport);
56
+ logger.debug(`Saved reports to ${currPath} and ${prevPath}`);
57
+ await runCompare({ before: prevPath, after: currPath, label: project?.name }, ctx);
58
+ const comparisonFiles = persistedFilesFromConfig(config, {
59
+ directory: ctx.directory,
60
+ isDiff: true,
61
+ });
62
+ logger.info('Compared reports and generated diff files');
63
+ logger.debug(`Generated diff files at ${comparisonFiles.json} and ${comparisonFiles.md}`);
64
+ if (!settings.detectNewIssues) {
65
+ return { files: comparisonFiles };
66
+ }
67
+ const newIssues = await findNewIssues({
68
+ base,
69
+ currReport,
70
+ prevReport,
71
+ comparisonFiles,
72
+ logger,
73
+ git,
74
+ });
75
+ return { files: comparisonFiles, newIssues };
76
+ }
77
+ export async function collectPreviousReport(args) {
78
+ const { ctx, env, base } = args;
79
+ const cachedBaseReport = await loadCachedBaseReport(args);
80
+ if (cachedBaseReport) {
81
+ return cachedBaseReport;
82
+ }
83
+ return runInBaseBranch(base, env, async () => {
84
+ const config = await checkPrintConfig(args);
85
+ if (!config) {
86
+ return null;
87
+ }
88
+ await runCollect(ctx);
89
+ const { json: prevReportPath } = persistedFilesFromConfig(config, ctx);
90
+ const prevReport = await readFile(prevReportPath, 'utf8');
91
+ env.settings.logger.debug(`Collected previous report at ${prevReportPath}`);
92
+ return prevReport;
93
+ });
94
+ }
95
+ export async function loadCachedBaseReport(args) {
96
+ const { project, env: { api, settings: { logger }, }, } = args;
97
+ const cachedBaseReport = await api
98
+ .downloadReportArtifact?.(project?.name)
99
+ .catch((error) => {
100
+ logger.warn(`Error when downloading previous report artifact, skipping - ${stringifyError(error)}`);
101
+ });
102
+ if (api.downloadReportArtifact != null) {
103
+ logger.info(`Previous report artifact ${cachedBaseReport ? 'found' : 'not found'}`);
104
+ if (cachedBaseReport) {
105
+ logger.debug(`Previous report artifact downloaded to ${cachedBaseReport}`);
106
+ }
107
+ }
108
+ if (cachedBaseReport) {
109
+ return readFile(cachedBaseReport, 'utf8');
110
+ }
111
+ return null;
112
+ }
113
+ export async function runInBaseBranch(base, env, fn) {
114
+ const { git, settings: { logger }, } = env;
115
+ await git.fetch('origin', base.ref, ['--depth=1']);
116
+ await git.checkout(['-f', base.ref]);
117
+ logger.info(`Switched to base branch ${base.ref}`);
118
+ const result = await fn();
119
+ await git.checkout(['-f', '-']);
120
+ logger.info('Switched back to PR/MR branch');
121
+ return result;
122
+ }
123
+ export async function checkPrintConfig(args) {
124
+ const { project, ctx, base, env: { settings }, } = args;
125
+ const { logger } = settings;
126
+ const operation = project
127
+ ? `Executing print-config for project ${project.name}`
128
+ : 'Executing print-config';
129
+ try {
130
+ const config = await printPersistConfig(ctx, settings);
131
+ logger.debug(`${operation} verified code-pushup installed in base branch ${base.ref}`);
132
+ return config;
133
+ }
134
+ catch (error) {
135
+ logger.debug(`Error from print-config - ${stringifyError(error)}`);
136
+ logger.info(`${operation} failed, assuming code-pushup not installed in base branch ${base.ref} and skipping comparison`);
137
+ return null;
138
+ }
139
+ }
140
+ export async function printPersistConfig(ctx, settings) {
141
+ const json = await runPrintConfig({ ...ctx, silent: !settings.debug });
142
+ return parsePersistConfig(json);
143
+ }
144
+ export async function findNewIssues(args) {
145
+ const { base, currReport, prevReport, comparisonFiles, logger, git } = args;
146
+ await git.fetch('origin', base.ref, ['--depth=1']);
147
+ const reportsDiff = await readFile(comparisonFiles.json, 'utf8');
148
+ const changedFiles = await listChangedFiles({ base: 'FETCH_HEAD', head: 'HEAD' }, git);
149
+ const issues = filterRelevantIssues({
150
+ currReport: JSON.parse(currReport),
151
+ prevReport: JSON.parse(prevReport),
152
+ reportsDiff: JSON.parse(reportsDiff),
153
+ changedFiles,
154
+ });
155
+ logger.debug(`Found ${issues.length} relevant issues for ${Object.keys(changedFiles).length} changed files`);
156
+ return issues;
157
+ }
158
+ //# sourceMappingURL=run-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-utils.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-utils.ts"],"names":[],"mappings":"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"}
package/src/lib/run.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type SimpleGit } from 'simple-git';
2
- import type { GitRefs, Options, ProviderAPIClient, RunResult } from './models';
2
+ import type { GitRefs, Options, ProviderAPIClient, RunResult } from './models.js';
3
3
  /**
4
4
  * Runs Code PushUp in CI environment.
5
5
  * @param refs Git branches (head and optional base)
package/src/lib/run.js ADDED
@@ -0,0 +1,24 @@
1
+ import { simpleGit } from 'simple-git';
2
+ import { DEFAULT_SETTINGS } from './constants.js';
3
+ import { runInMonorepoMode } from './run-monorepo.js';
4
+ import { runInStandaloneMode } from './run-standalone.js';
5
+ /**
6
+ * Runs Code PushUp in CI environment.
7
+ * @param refs Git branches (head and optional base)
8
+ * @param api API client for given provider
9
+ * @param options Additional options (e.g. monorepo mode)
10
+ * @param git instance of simple-git - useful for testing
11
+ * @returns result of run (standalone or monorepo)
12
+ */
13
+ export async function runInCI(refs, api, options, git = simpleGit()) {
14
+ const settings = {
15
+ ...DEFAULT_SETTINGS,
16
+ ...options,
17
+ };
18
+ const env = { refs, api, settings, git };
19
+ if (settings.monorepo) {
20
+ return runInMonorepoMode(env);
21
+ }
22
+ return runInStandaloneMode(env);
23
+ }
24
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAQlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAa,EACb,GAAsB,EACtB,OAAiB,EACjB,MAAiB,SAAS,EAAE;IAE5B,MAAM,QAAQ,GAAa;QACzB,GAAG,gBAAgB;QACnB,GAAG,OAAO;KACX,CAAC;IAEF,MAAM,GAAG,GAAW,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAEjD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC"}