Skip to content

Commit 7b25f6e

Browse files
committed
chore: add rsdoctor diff action
1 parent ae336e4 commit 7b25f6e

4 files changed

Lines changed: 135 additions & 17 deletions

File tree

dist/index.js

Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95857,6 +95857,24 @@ var __webpack_exports__ = {};
9585795857
return null;
9585895858
}
9585995859
}
95860+
async findPRsByCommit(commitHash) {
95861+
const { owner, repo } = this.repository;
95862+
try {
95863+
const { data: prs } = await this.octokit.rest.repos.listPullRequestsAssociatedWithCommit({
95864+
owner,
95865+
repo,
95866+
commit_sha: commitHash
95867+
});
95868+
return prs.map((pr)=>({
95869+
number: pr.number,
95870+
title: pr.title,
95871+
url: pr.html_url
95872+
}));
95873+
} catch (error) {
95874+
console.warn(`⚠️ Failed to find PRs for commit ${commitHash}: ${error}`);
95875+
return [];
95876+
}
95877+
}
9586095878
async updateOrCreateComment(prNumber, body) {
9586195879
const { owner, repo } = this.repository;
9586295880
const commentPrefix = '## Rsdoctor Bundle Diff Analysis';
@@ -96114,10 +96132,20 @@ var __webpack_exports__ = {};
9611496132
emoji: '📉'
9611596133
};
9611696134
}
96117-
function generateProjectMarkdown(projectName, filePath, current, baseline) {
96135+
function generateProjectMarkdown(projectName, filePath, current, baseline, baselineCommitHash, baselinePRs) {
9611896136
let markdown = `### 📁 ${projectName}\n\n`;
9611996137
markdown += `**Path:** \`${filePath}\`\n\n`;
96120-
if (!baseline) markdown += '> ⚠️ **No baseline data found** - Unable to perform comparison analysis\n\n';
96138+
if (baseline) {
96139+
if (baselineCommitHash) {
96140+
const commitLink = `${process.env.GITHUB_SERVER_URL || 'https://github.com'}/${process.env.GITHUB_REPOSITORY}/commit/${baselineCommitHash}`;
96141+
let baselineInfo = `> 📌 **Baseline Commit:** [\`${baselineCommitHash}\`](${commitLink})`;
96142+
if (baselinePRs && baselinePRs.length > 0) {
96143+
const prLinks = baselinePRs.map((pr)=>`[#${pr.number}](${pr.url})`).join(', ');
96144+
baselineInfo += ` | **PR:** ${prLinks}`;
96145+
}
96146+
markdown += `${baselineInfo}\n\n`;
96147+
}
96148+
} else markdown += '> ⚠️ **No baseline data found** - Unable to perform comparison analysis\n\n';
9612196149
markdown += '| Metric | Current | Baseline | Change |\n';
9612296150
markdown += '|--------|---------|----------|--------|\n';
9612396151
markdown += `| 📊 Total Size | ${formatBytes(current.totalSize)} | ${baseline ? formatBytes(baseline.totalSize) : '-'} | ${baseline ? calculateDiff(current.totalSize, baseline.totalSize).value : '-'} |\n`;
@@ -96128,9 +96156,19 @@ var __webpack_exports__ = {};
9612896156
markdown += '\n';
9612996157
return markdown;
9613096158
}
96131-
async function generateBundleAnalysisReport(current, baseline, writeSummary = true) {
96132-
if (baseline) await core.summary.addSeparator();
96133-
else await core.summary.addRaw('> ⚠️ **No baseline data found** - Unable to perform comparison analysis').addSeparator();
96159+
async function generateBundleAnalysisReport(current, baseline, writeSummary = true, baselineCommitHash, baselinePRs) {
96160+
if (baseline) {
96161+
if (baselineCommitHash) {
96162+
const commitLink = `${process.env.GITHUB_SERVER_URL || 'https://github.com'}/${process.env.GITHUB_REPOSITORY}/commit/${baselineCommitHash}`;
96163+
let baselineInfo = `> 📌 **Baseline Commit:** [\`${baselineCommitHash}\`](${commitLink})`;
96164+
if (baselinePRs && baselinePRs.length > 0) {
96165+
const prLinks = baselinePRs.map((pr)=>`[#${pr.number}](${pr.url})`).join(', ');
96166+
baselineInfo += ` | **PR:** ${prLinks}`;
96167+
}
96168+
await core.summary.addRaw(baselineInfo);
96169+
}
96170+
await core.summary.addSeparator();
96171+
} else await core.summary.addRaw('> ⚠️ **No baseline data found** - Unable to perform comparison analysis').addSeparator();
9613496172
const mainTable = [
9613596173
[
9613696174
{
@@ -96418,6 +96456,7 @@ var __webpack_exports__ = {};
9641896456
}
9641996457
report.current = currentBundleAnalysis;
9642096458
let baselineJsonPath = null;
96459+
let baselinePRs = [];
9642196460
if (targetCommitHash) try {
9642296461
console.log(`📥 Attempting to download baseline for ${projectName}...`);
9642396462
const downloadResult = await downloadArtifactByCommitHash(targetCommitHash, fileName, fullPath);
@@ -96426,6 +96465,17 @@ var __webpack_exports__ = {};
9642696465
const baselineBundleAnalysis = parseRsdoctorData(baselineJsonPath);
9642796466
if (baselineBundleAnalysis) {
9642896467
report.baseline = baselineBundleAnalysis;
96468+
report.baselineCommitHash = targetCommitHash;
96469+
try {
96470+
const githubService = new GitHubService();
96471+
baselinePRs = await githubService.findPRsByCommit(targetCommitHash);
96472+
if (baselinePRs.length > 0) {
96473+
report.baselinePRs = baselinePRs;
96474+
console.log(`📎 Found ${baselinePRs.length} PR(s) associated with baseline commit ${targetCommitHash}`);
96475+
}
96476+
} catch (prError) {
96477+
console.log(`ℹ️ Could not find PRs for baseline commit: ${prError}`);
96478+
}
9642996479
console.log(`✅ Successfully downloaded and parsed baseline for ${projectName}`);
9643096480
}
9643196481
} catch (downloadError) {
@@ -96540,13 +96590,13 @@ var __webpack_exports__ = {};
9654096590
}
9654196591
if (projectReports.length > 0) if (1 === projectReports.length) {
9654296592
const report = projectReports[0];
96543-
if (report.current) await generateBundleAnalysisReport(report.current);
96593+
if (report.current) await generateBundleAnalysisReport(report.current, void 0, true, null, void 0);
9654496594
} else {
9654596595
await core.summary.addHeading('📦 Monorepo Bundle Analysis', 2);
9654696596
for (const report of projectReports)if (report.current) {
9654796597
await core.summary.addHeading(`📁 ${report.projectName}`, 3);
9654896598
await core.summary.addRaw(`**Path:** \`${report.filePath}\``);
96549-
await generateBundleAnalysisReport(report.current, void 0, false);
96599+
await generateBundleAnalysisReport(report.current, void 0, false, null, void 0);
9655096600
}
9655196601
await core.summary.write();
9655296602
}
@@ -96558,13 +96608,13 @@ var __webpack_exports__ = {};
9655896608
}
9655996609
if (projectReports.length > 0) if (1 === projectReports.length) {
9656096610
const report = projectReports[0];
96561-
if (report.current) await generateBundleAnalysisReport(report.current, report.baseline || void 0);
96611+
if (report.current) await generateBundleAnalysisReport(report.current, report.baseline || void 0, true, report.baselineCommitHash, report.baselinePRs);
9656296612
} else {
9656396613
await core.summary.addHeading('📦 Monorepo Bundle Analysis', 2);
9656496614
for (const report of projectReports)if (report.current) {
9656596615
await core.summary.addHeading(`📁 ${report.projectName}`, 3);
9656696616
await core.summary.addRaw(`**Path:** \`${report.filePath}\``);
96567-
await generateBundleAnalysisReport(report.current, report.baseline || void 0, false);
96617+
await generateBundleAnalysisReport(report.current, report.baseline || void 0, false, report.baselineCommitHash, report.baselinePRs);
9656896618
}
9656996619
await core.summary.write();
9657096620
}
@@ -96574,7 +96624,7 @@ var __webpack_exports__ = {};
9657496624
let commentBody = '## Rsdoctor Bundle Diff Analysis\n\n';
9657596625
if (projectReports.length > 1) commentBody += `Found ${projectReports.length} project(s) in monorepo.\n\n`;
9657696626
for (const report of projectReports)if (report.current) {
96577-
commentBody += generateProjectMarkdown(report.projectName, report.filePath, report.current, report.baseline || void 0);
96627+
commentBody += generateProjectMarkdown(report.projectName, report.filePath, report.current, report.baseline || void 0, report.baselineCommitHash, report.baselinePRs);
9657896628
if (report.diffHtmlArtifactId) {
9657996629
const artifactDownloadLink = `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}/artifacts/${report.diffHtmlArtifactId}`;
9658096630
commentBody += `\n📦 **Download Diff Report**: [${report.projectName} Bundle Diff](${artifactDownloadLink})\n\n`;

src/github.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,30 @@ export class GitHubService {
253253
}
254254
}
255255

256+
/**
257+
* Find PRs associated with a commit
258+
*/
259+
async findPRsByCommit(commitHash: string): Promise<Array<{ number: number; title: string; url: string }>> {
260+
const { owner, repo } = this.repository;
261+
262+
try {
263+
const { data: prs } = await this.octokit.rest.repos.listPullRequestsAssociatedWithCommit({
264+
owner,
265+
repo,
266+
commit_sha: commitHash,
267+
});
268+
269+
return prs.map((pr: any) => ({
270+
number: pr.number,
271+
title: pr.title,
272+
url: pr.html_url
273+
}));
274+
} catch (error) {
275+
console.warn(`⚠️ Failed to find PRs for commit ${commitHash}: ${error}`);
276+
return [];
277+
}
278+
}
279+
256280
async updateOrCreateComment(prNumber: number, body: string): Promise<void> {
257281
const { owner, repo } = this.repository;
258282
const commentPrefix = '## Rsdoctor Bundle Diff Analysis';

src/index.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ interface ProjectReport {
8080
filePath: string;
8181
current: BundleAnalysis | null;
8282
baseline: BundleAnalysis | null;
83+
baselineCommitHash?: string | null;
84+
baselinePRs?: Array<{ number: number; title: string; url: string }>;
8385
diffHtmlPath?: string;
8486
diffHtmlArtifactId?: number;
8587
}
@@ -147,6 +149,7 @@ async function processSingleFile(
147149
report.current = currentBundleAnalysis;
148150

149151
let baselineJsonPath: string | null = null;
152+
let baselinePRs: Array<{ number: number; title: string; url: string }> = [];
150153
if (targetCommitHash) {
151154
try {
152155
console.log(`📥 Attempting to download baseline for ${projectName}...`);
@@ -158,6 +161,20 @@ async function processSingleFile(
158161
const baselineBundleAnalysis = parseRsdoctorData(baselineJsonPath);
159162
if (baselineBundleAnalysis) {
160163
report.baseline = baselineBundleAnalysis;
164+
report.baselineCommitHash = targetCommitHash;
165+
166+
// Try to find associated PRs for the baseline commit
167+
try {
168+
const githubService = new GitHubService();
169+
baselinePRs = await githubService.findPRsByCommit(targetCommitHash);
170+
if (baselinePRs.length > 0) {
171+
report.baselinePRs = baselinePRs;
172+
console.log(`📎 Found ${baselinePRs.length} PR(s) associated with baseline commit ${targetCommitHash}`);
173+
}
174+
} catch (prError) {
175+
console.log(`ℹ️ Could not find PRs for baseline commit: ${prError}`);
176+
}
177+
161178
console.log(`✅ Successfully downloaded and parsed baseline for ${projectName}`);
162179
}
163180
} catch (downloadError) {
@@ -313,7 +330,7 @@ async function processSingleFile(
313330
// Single project: use existing report format
314331
const report = projectReports[0];
315332
if (report.current) {
316-
await generateBundleAnalysisReport(report.current);
333+
await generateBundleAnalysisReport(report.current, undefined, true, null, undefined);
317334
}
318335
} else {
319336
await summary.addHeading('📦 Monorepo Bundle Analysis', 2);
@@ -323,7 +340,7 @@ async function processSingleFile(
323340

324341
await summary.addHeading(`📁 ${report.projectName}`, 3);
325342
await summary.addRaw(`**Path:** \`${report.filePath}\``);
326-
await generateBundleAnalysisReport(report.current, undefined, false);
343+
await generateBundleAnalysisReport(report.current, undefined, false, null, undefined);
327344
}
328345

329346
await summary.write();
@@ -342,7 +359,7 @@ async function processSingleFile(
342359
if (projectReports.length === 1) {
343360
const report = projectReports[0];
344361
if (report.current) {
345-
await generateBundleAnalysisReport(report.current, report.baseline || undefined);
362+
await generateBundleAnalysisReport(report.current, report.baseline || undefined, true, report.baselineCommitHash, report.baselinePRs);
346363
}
347364
} else {
348365
await summary.addHeading('📦 Monorepo Bundle Analysis', 2);
@@ -353,7 +370,7 @@ async function processSingleFile(
353370
await summary.addHeading(`📁 ${report.projectName}`, 3);
354371
await summary.addRaw(`**Path:** \`${report.filePath}\``);
355372

356-
await generateBundleAnalysisReport(report.current, report.baseline || undefined, false);
373+
await generateBundleAnalysisReport(report.current, report.baseline || undefined, false, report.baselineCommitHash, report.baselinePRs);
357374
}
358375

359376
await summary.write();
@@ -374,7 +391,7 @@ async function processSingleFile(
374391
for (const report of projectReports) {
375392
if (!report.current) continue;
376393

377-
commentBody += generateProjectMarkdown(report.projectName, report.filePath, report.current, report.baseline || undefined);
394+
commentBody += generateProjectMarkdown(report.projectName, report.filePath, report.current, report.baseline || undefined, report.baselineCommitHash, report.baselinePRs);
378395

379396
// Add diff HTML link if available
380397
if (report.diffHtmlArtifactId) {

src/report.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,26 @@ export function generateProjectMarkdown(
184184
projectName: string,
185185
filePath: string,
186186
current: BundleAnalysis,
187-
baseline?: BundleAnalysis
187+
baseline?: BundleAnalysis,
188+
baselineCommitHash?: string | null,
189+
baselinePRs?: Array<{ number: number; title: string; url: string }>
188190
): string {
189191
let markdown = `### 📁 ${projectName}\n\n`;
190192
markdown += `**Path:** \`${filePath}\`\n\n`;
191193

192194
if (!baseline) {
193195
markdown += '> ⚠️ **No baseline data found** - Unable to perform comparison analysis\n\n';
196+
} else if (baselineCommitHash) {
197+
const commitLink = `${process.env.GITHUB_SERVER_URL || 'https://github.com'}/${process.env.GITHUB_REPOSITORY}/commit/${baselineCommitHash}`;
198+
let baselineInfo = `> 📌 **Baseline Commit:** [\`${baselineCommitHash}\`](${commitLink})`;
199+
200+
// Add PR links if available
201+
if (baselinePRs && baselinePRs.length > 0) {
202+
const prLinks = baselinePRs.map(pr => `[#${pr.number}](${pr.url})`).join(', ');
203+
baselineInfo += ` | **PR:** ${prLinks}`;
204+
}
205+
206+
markdown += `${baselineInfo}\n\n`;
194207
}
195208

196209
markdown += '| Metric | Current | Baseline | Change |\n';
@@ -208,13 +221,27 @@ export function generateProjectMarkdown(
208221
export async function generateBundleAnalysisReport(
209222
current: BundleAnalysis,
210223
baseline?: BundleAnalysis,
211-
writeSummary: boolean = true
224+
writeSummary: boolean = true,
225+
baselineCommitHash?: string | null,
226+
baselinePRs?: Array<{ number: number; title: string; url: string }>
212227
): Promise<void> {
213228
if (!baseline) {
214229
await summary
215230
.addRaw('> ⚠️ **No baseline data found** - Unable to perform comparison analysis')
216231
.addSeparator();
217232
} else {
233+
if (baselineCommitHash) {
234+
const commitLink = `${process.env.GITHUB_SERVER_URL || 'https://github.com'}/${process.env.GITHUB_REPOSITORY}/commit/${baselineCommitHash}`;
235+
let baselineInfo = `> 📌 **Baseline Commit:** [\`${baselineCommitHash}\`](${commitLink})`;
236+
237+
// Add PR links if available
238+
if (baselinePRs && baselinePRs.length > 0) {
239+
const prLinks = baselinePRs.map(pr => `[#${pr.number}](${pr.url})`).join(', ');
240+
baselineInfo += ` | **PR:** ${prLinks}`;
241+
}
242+
243+
await summary.addRaw(baselineInfo);
244+
}
218245
await summary.addSeparator();
219246
}
220247

0 commit comments

Comments
 (0)