@jonathan0823/pi-sonarqube 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Key, matchesKey, truncateToWidth } from "@earendil-works/pi-tui";
1
+ import { Input, Key, matchesKey, truncateToWidth, } from "@earendil-works/pi-tui";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { resolve } from "node:path";
4
4
  import { issueFilterLabel, fetchIssues, createAnalysisState, normalizeIssueFilters, fetchCleanCodeMode, } from "./api.js";
@@ -108,52 +108,136 @@ export function startAnalysisUi(ctx, projectKey) {
108
108
  },
109
109
  };
110
110
  }
111
- // ── Issue Browser UI component ──────────────────────────────────────────────
112
- export class IssueBrowser {
113
- state;
111
+ // ── Searchable browser helpers ─────────────────────────────────────────────
112
+ function normalizeSearchQuery(query) {
113
+ return query.trim().toLowerCase().split(/\s+/).filter(Boolean);
114
+ }
115
+ function matchesSearchQuery(haystack, query) {
116
+ const tokens = normalizeSearchQuery(query);
117
+ if (tokens.length === 0)
118
+ return true;
119
+ const text = haystack.toLowerCase();
120
+ return tokens.every((token) => text.includes(token));
121
+ }
122
+ function filterSearchItems(items, query, searchText) {
123
+ if (!query.trim())
124
+ return [...items];
125
+ return items.filter((item) => matchesSearchQuery(searchText(item), query));
126
+ }
127
+ class SearchableListBrowser {
128
+ items;
114
129
  theme;
115
130
  done;
131
+ config;
116
132
  selected = 0;
117
- constructor(state, theme, done) {
118
- this.state = state;
133
+ query = "";
134
+ filteredItems;
135
+ _focused = false;
136
+ searchInput = new Input();
137
+ constructor(items, theme, done, config) {
138
+ this.items = items;
119
139
  this.theme = theme;
120
140
  this.done = done;
141
+ this.config = config;
142
+ this.filteredItems = [...items];
143
+ }
144
+ get focused() {
145
+ return this._focused;
146
+ }
147
+ set focused(value) {
148
+ this._focused = value;
149
+ this.searchInput.focused = value;
150
+ }
151
+ invalidate() {
152
+ this.searchInput.invalidate();
121
153
  }
122
- invalidate() { } // NOSONAR - required by TUI interface
123
154
  handleInput(data) {
124
- this.selected = handleListBrowserInput(data, this.selected, this.state.issues.length, this.done);
155
+ if (matchesKey(data, Key.escape) || matchesKey(data, "ctrl+c")) {
156
+ this.done(null);
157
+ return;
158
+ }
159
+ if (matchesKey(data, Key.up)) {
160
+ this.selected = Math.max(0, this.selected - 1);
161
+ return;
162
+ }
163
+ if (matchesKey(data, Key.down)) {
164
+ this.selected = Math.min(Math.max(0, this.filteredItems.length - 1), this.selected + 1);
165
+ return;
166
+ }
167
+ if (matchesKey(data, Key.enter)) {
168
+ if (this.filteredItems.length > 0)
169
+ this.done(this.selected);
170
+ return;
171
+ }
172
+ this.searchInput.handleInput(data);
173
+ this.syncFilter();
125
174
  }
126
175
  render(width) {
127
- const filterSuffix = this.state.filters
128
- ? ` • ${issueFilterLabel(this.state.filters)}`
176
+ const subtitle = this.config.subtitle(this.query, this.items.length, this.filteredItems.length);
177
+ return [
178
+ truncateToWidth(this.theme.fg("dim", this.config.searchHint), width),
179
+ ...this.searchInput.render(width),
180
+ "",
181
+ ...renderListBrowser(this.theme, width, {
182
+ title: this.config.title,
183
+ subtitle,
184
+ items: this.filteredItems,
185
+ selected: this.selected,
186
+ pageSize: this.config.pageSize,
187
+ emptyMessage: this.config.emptyMessage,
188
+ footer: this.config.footer,
189
+ renderItem: this.config.renderItem,
190
+ }),
191
+ ];
192
+ }
193
+ syncFilter() {
194
+ const nextQuery = this.searchInput.getValue();
195
+ if (nextQuery === this.query)
196
+ return;
197
+ this.query = nextQuery;
198
+ this.filteredItems = filterSearchItems(this.items, nextQuery, this.config.searchText);
199
+ this.selected = 0;
200
+ }
201
+ }
202
+ export class IssueBrowser extends SearchableListBrowser {
203
+ constructor(state, theme, done) {
204
+ const filterSuffix = state.filters
205
+ ? ` • ${issueFilterLabel(state.filters)}`
129
206
  : "";
130
- return renderListBrowser(this.theme, width, {
207
+ super(state.issues, theme, done, {
131
208
  title: "SonarQube Issues",
132
- subtitle: `${this.state.projectKey} • ${this.state.totalIssues} issue(s)${filterSuffix}`,
133
- items: this.state.issues,
134
- selected: this.selected,
135
- pageSize: 20,
136
- emptyMessage: "No open issues found.",
209
+ subtitle: (_query, totalCount, filteredCount) => `${state.projectKey} • ${totalCount} issue(s) • ${filteredCount} match(es)${filterSuffix}`,
210
+ searchHint: "Search issues by file, rule, severity, status, or message",
211
+ emptyMessage: "No matching issues found.",
137
212
  footer: "Up/Down to move, Enter to preview, Esc to close",
213
+ pageSize: 20,
214
+ searchText: (issue) => [
215
+ issue.filePath,
216
+ issue.rule,
217
+ issue.ruleName ?? "",
218
+ issue.severity,
219
+ issue.status ?? "",
220
+ issue.message,
221
+ ].join(" "),
138
222
  renderItem: (issue, issueIndex, isSelected) => {
139
223
  const marker = isSelected
140
- ? this.theme.fg("accent", ">")
141
- : this.theme.fg("dim", " ");
224
+ ? theme.fg("accent", ">")
225
+ : theme.fg("dim", " ");
142
226
  const location = issue.line
143
227
  ? `${issue.filePath}:${issue.line}`
144
228
  : issue.filePath;
145
229
  const rule = issue.ruleName
146
230
  ? `${issue.rule} (${issue.ruleName})`
147
231
  : issue.rule;
148
- const severity = severityColor(this.theme, issue.severity);
232
+ const severity = severityColor(theme, issue.severity);
149
233
  return [
150
234
  marker,
151
235
  String(issueIndex + 1).padStart(2, " "),
152
236
  ".",
153
237
  severity,
154
- this.theme.fg("accent", location),
155
- this.theme.fg("muted", rule),
156
- this.theme.fg("text", `— ${issue.message}`),
238
+ theme.fg("accent", location),
239
+ theme.fg("muted", rule),
240
+ theme.fg("text", `— ${issue.message}`),
157
241
  ].join(" ");
158
242
  },
159
243
  });
@@ -173,22 +257,6 @@ function severityColor(theme, severity) {
173
257
  return theme.fg("muted", severity);
174
258
  }
175
259
  }
176
- function handleListBrowserInput(data, selected, count, done) {
177
- if (matchesKey(data, Key.escape) || matchesKey(data, "ctrl+c")) {
178
- done(null);
179
- return selected;
180
- }
181
- if (matchesKey(data, Key.up)) {
182
- return Math.max(0, selected - 1);
183
- }
184
- if (matchesKey(data, Key.down)) {
185
- return Math.min(Math.max(0, count - 1), selected + 1);
186
- }
187
- if (matchesKey(data, Key.enter)) {
188
- done(selected);
189
- }
190
- return selected;
191
- }
192
260
  function getBrowserWindow(selected, total, pageSize) {
193
261
  const halfWindow = Math.floor(pageSize / 2);
194
262
  const maxStart = Math.max(0, total - pageSize);
@@ -222,44 +290,64 @@ function renderListBrowser(theme, width, config) {
222
290
  lines.push("", truncateToWidth(theme.fg("dim", config.footer), width));
223
291
  return lines;
224
292
  }
225
- // ── Duplication browser (used by index.ts) ─────────────────────────────────
226
- export class DuplicationBrowser {
227
- files;
228
- theme;
229
- done;
230
- selected = 0;
231
- constructor(files, theme, done) {
232
- this.files = files;
233
- this.theme = theme;
234
- this.done = done;
235
- }
236
- invalidate() { } // NOSONAR - required by TUI interface
237
- handleInput(data) {
238
- this.selected = handleListBrowserInput(data, this.selected, this.files.length, this.done);
239
- }
240
- render(width) {
241
- return renderListBrowser(this.theme, width, {
293
+ export class DuplicationBrowser extends SearchableListBrowser {
294
+ constructor(files, theme, done, scopeLabel) {
295
+ const scopeSuffix = scopeLabel ? ` • ${scopeLabel}` : "";
296
+ super(files, theme, done, {
242
297
  title: "SonarQube Duplications",
243
- subtitle: `${this.files.length} file(s) with duplicate code`,
244
- items: this.files,
245
- selected: this.selected,
246
- pageSize: 15,
247
- emptyMessage: "No duplicate code found.",
298
+ subtitle: (_query, totalCount, filteredCount) => `${totalCount} file(s) with duplicate code${scopeSuffix} • ${filteredCount} match(es)`,
299
+ searchHint: "Search duplications by file path, duplicated lines, blocks, or density",
300
+ emptyMessage: "No matching duplicated files found.",
248
301
  footer: "Up/Down to move, Enter for details, Esc to close",
302
+ pageSize: 15,
303
+ searchText: (file) => [
304
+ file.filePath,
305
+ `dup%=${file.duplicatedLinesDensity.toFixed(1)}`,
306
+ `blocks=${file.duplicatedBlocks}`,
307
+ `lines=${file.duplicatedLines}`,
308
+ ].join(" "),
249
309
  renderItem: (file, index, isSelected) => {
250
310
  const marker = isSelected
251
- ? this.theme.fg("accent", ">")
252
- : this.theme.fg("dim", " ");
311
+ ? theme.fg("accent", ">")
312
+ : theme.fg("dim", " ");
253
313
  const detail = `dup%=${file.duplicatedLinesDensity.toFixed(1)} blocks=${file.duplicatedBlocks} lines=${file.duplicatedLines}`;
254
- return `${marker} ${String(index + 1).padStart(2, " ")}. ${this.theme.fg("accent", file.filePath)} ${this.theme.fg("dim", detail)}`;
314
+ return `${marker} ${String(index + 1).padStart(2, " ")}. ${theme.fg("accent", file.filePath)} ${theme.fg("dim", detail)}`;
255
315
  },
256
316
  });
257
317
  }
258
318
  }
259
- export async function showDuplicationBrowser(ctx, files) {
319
+ export async function showDuplicationBrowser(ctx, files, scopeLabel) {
260
320
  if (ctx.mode !== "tui" || files.length === 0)
261
321
  return null;
262
- return await ctx.ui.custom((_tui, theme, _kb, done) => new DuplicationBrowser(files, theme, done));
322
+ return await ctx.ui.custom((_tui, theme, _kb, done) => new DuplicationBrowser(files, theme, done, scopeLabel));
323
+ }
324
+ // ── Workspace selector browser ────────────────────────────────────────────
325
+ export class WorkspaceBrowser extends SearchableListBrowser {
326
+ constructor(workspaces, theme, done) {
327
+ super(workspaces, theme, done, {
328
+ title: "SonarQube Workspaces",
329
+ subtitle: (_query, totalCount, filteredCount) => `${totalCount} workspace(s) • ${filteredCount} match(es)`,
330
+ searchHint: "Search workspaces by alias or path",
331
+ emptyMessage: "No matching workspaces found.",
332
+ footer: "Up/Down to move, Enter to select, Esc to cancel",
333
+ pageSize: 15,
334
+ searchText: (ws) => `${ws.alias} ${ws.path}`,
335
+ renderItem: (ws, index, isSelected) => {
336
+ const marker = isSelected
337
+ ? theme.fg("accent", ">")
338
+ : theme.fg("dim", " ");
339
+ return `${marker} ${String(index + 1).padStart(2, " ")}. ${theme.fg("accent", ws.alias.padEnd(20))} ${theme.fg("dim", ws.path)}`;
340
+ },
341
+ });
342
+ }
343
+ }
344
+ export async function showWorkspaceBrowser(ctx, workspaces) {
345
+ if (ctx.mode !== "tui" || workspaces.length === 0)
346
+ return null;
347
+ const choice = await ctx.ui.custom((_tui, theme, _kb, done) => new WorkspaceBrowser(workspaces, theme, done));
348
+ if (choice == null)
349
+ return null;
350
+ return workspaces[choice].alias;
263
351
  }
264
352
  // ── Issue browser / preview helpers (used by index.ts) ──────────────────────
265
353
  export async function showIssueBrowser(ctx, state) {
@@ -282,7 +370,7 @@ export async function openIssuePreview(ctx, state, issue) {
282
370
  export async function loadProjectIssuesFromApi(ctx, inputPath, filters) {
283
371
  const config = await resolveConfig(ctx, inputPath);
284
372
  const normalizedFilters = normalizeIssueFilters(filters);
285
- const issues = await fetchIssues(config.serverUrl, config.token, config.projectKey, ctx.signal, normalizedFilters);
373
+ const issues = await fetchIssues(config.serverUrl, config.token, config.projectKey, ctx.signal, normalizedFilters, config.baseDir);
286
374
  const cleanCodeMode = await fetchCleanCodeMode(config.serverUrl, config.token, ctx.signal);
287
375
  return createAnalysisState(config, issues, {
288
376
  filters: normalizedFilters,
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jonathan0823/pi-sonarqube",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "SonarQube extension for Pi — run local analysis and browse issues.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/api.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
2
  import { readFile } from "node:fs/promises";
3
- import { resolve } from "node:path";
3
+ import { relative, resolve } from "node:path";
4
4
  import type {
5
5
  SonarIssue,
6
6
  SonarAnalysisState,
@@ -18,18 +18,19 @@ import {
18
18
  SONAR_TYPES,
19
19
  SONAR_SOFTWARE_QUALITIES,
20
20
  SONAR_IMPACT_SEVERITIES,
21
+ CleanCodeMode,
21
22
  } from "./types.js";
22
23
  import { parseProperties } from "./config.js";
23
24
 
24
25
  // ── Clean code mode detection ────────────────────────────────────────────────
25
26
 
26
- const cleanCodeModeCache = new Map<string, "STANDARD" | "MQR">();
27
+ const cleanCodeModeCache = new Map<string, CleanCodeMode>();
27
28
 
28
29
  export async function fetchCleanCodeMode(
29
30
  serverUrl: string,
30
31
  token?: string,
31
32
  signal?: AbortSignal,
32
- ): Promise<"STANDARD" | "MQR" | undefined> {
33
+ ): Promise<CleanCodeMode | undefined> {
33
34
  const cached = cleanCodeModeCache.get(serverUrl);
34
35
  if (cached) return cached;
35
36
  try {
@@ -114,13 +115,17 @@ export function normalizeIssueFilters(
114
115
  rules: normalizeIssueList(filters?.rules),
115
116
  softwareQualities: normalizeIssueList(filters?.softwareQualities, true),
116
117
  impactSeverities: normalizeIssueList(filters?.impactSeverities, true),
118
+ pathScope: filters?.pathScope,
119
+ componentKeys: filters?.componentKeys,
117
120
  };
118
121
  return normalized.severities ||
119
122
  normalized.statuses ||
120
123
  normalized.types ||
121
124
  normalized.rules ||
122
125
  normalized.softwareQualities ||
123
- normalized.impactSeverities
126
+ normalized.impactSeverities ||
127
+ normalized.pathScope ||
128
+ normalized.componentKeys?.length
124
129
  ? normalized
125
130
  : undefined;
126
131
  }
@@ -178,6 +183,9 @@ export function parseIssueFilterToken(
178
183
  case "impactseverity":
179
184
  case "impactseverities":
180
185
  return { impactSeverities: values.map((v) => v.toUpperCase()) };
186
+ case "in":
187
+ case "path":
188
+ return { pathScope: values[0] };
181
189
  default:
182
190
  return undefined;
183
191
  }
@@ -238,30 +246,32 @@ export function parseSonarIssueArgs(
238
246
  return { targetInput, issueIndex, filters: mergeFilters(...filters) };
239
247
  }
240
248
 
249
+ function mergeFilterField<T>(
250
+ merged: T[] | undefined,
251
+ incoming?: T[],
252
+ ): T[] | undefined {
253
+ return incoming?.length ? [...(merged ?? []), ...incoming] : merged;
254
+ }
255
+
241
256
  function mergeFilters(
242
257
  ...filters: Array<Partial<SonarIssueFetchOptions> | undefined>
243
258
  ): SonarIssueFetchOptions | undefined {
244
259
  const merged: SonarIssueFetchOptions = {};
245
260
  for (const filter of filters) {
246
261
  if (!filter) continue;
247
- if (filter.severities?.length)
248
- merged.severities = [...(merged.severities ?? []), ...filter.severities];
249
- if (filter.statuses?.length)
250
- merged.statuses = [...(merged.statuses ?? []), ...filter.statuses];
251
- if (filter.types?.length)
252
- merged.types = [...(merged.types ?? []), ...filter.types];
253
- if (filter.rules?.length)
254
- merged.rules = [...(merged.rules ?? []), ...filter.rules];
255
- if (filter.softwareQualities?.length)
256
- merged.softwareQualities = [
257
- ...(merged.softwareQualities ?? []),
258
- ...filter.softwareQualities,
259
- ];
260
- if (filter.impactSeverities?.length)
261
- merged.impactSeverities = [
262
- ...(merged.impactSeverities ?? []),
263
- ...filter.impactSeverities,
264
- ];
262
+ merged.severities = mergeFilterField(merged.severities, filter.severities);
263
+ merged.statuses = mergeFilterField(merged.statuses, filter.statuses);
264
+ merged.types = mergeFilterField(merged.types, filter.types);
265
+ merged.rules = mergeFilterField(merged.rules, filter.rules);
266
+ merged.softwareQualities = mergeFilterField(
267
+ merged.softwareQualities,
268
+ filter.softwareQualities,
269
+ );
270
+ merged.impactSeverities = mergeFilterField(
271
+ merged.impactSeverities,
272
+ filter.impactSeverities,
273
+ );
274
+ if (filter.pathScope) merged.pathScope = filter.pathScope;
265
275
  }
266
276
  return normalizeIssueFilters(merged);
267
277
  }
@@ -279,9 +289,23 @@ export function issueFilterLabel(filters?: SonarIssueFetchOptions): string {
279
289
  parts.push(`qualities=${filters.softwareQualities.join(",")}`);
280
290
  if (filters.impactSeverities?.length)
281
291
  parts.push(`impactSeverities=${filters.impactSeverities.join(",")}`);
292
+ if (filters.pathScope) parts.push(`in:${filters.pathScope}`);
282
293
  return parts.join(" • ");
283
294
  }
284
295
 
296
+ export function resolvePathScope(
297
+ baseDir: string,
298
+ projectKey: string,
299
+ pathScope: string,
300
+ ): string {
301
+ const raw = pathScope.replace(/^@/, "");
302
+ const absPath = resolve(baseDir, raw);
303
+ const relPath = relative(baseDir, absPath);
304
+ if (relPath === "" || relPath === ".") return projectKey;
305
+ const cleanRel = relPath.replace(/[\\/]+$/, "");
306
+ return `${projectKey}:${cleanRel}`;
307
+ }
308
+
285
309
  function severitySortRank(severity: string): number {
286
310
  switch (severity.toUpperCase()) {
287
311
  case "BLOCKER":
@@ -505,6 +529,8 @@ function buildIssueSearchUrl(
505
529
  "impactSeverities",
506
530
  filters.impactSeverities.join(","),
507
531
  );
532
+ if (filters?.componentKeys?.length)
533
+ url.searchParams.set("componentKeys", filters.componentKeys.join(","));
508
534
  return url.toString();
509
535
  }
510
536
 
@@ -574,9 +600,19 @@ export async function fetchIssues(
574
600
  projectKey: string,
575
601
  signal?: AbortSignal,
576
602
  filters?: SonarIssueFetchOptions,
603
+ baseDir?: string,
577
604
  ): Promise<SonarIssue[]> {
578
605
  assertFiltersNotAmbiguous(filters);
579
606
  const normalizedFilters = normalizeIssueFilters(filters);
607
+
608
+ if (normalizedFilters?.pathScope && baseDir) {
609
+ const componentKey = resolvePathScope(
610
+ baseDir,
611
+ projectKey,
612
+ normalizedFilters.pathScope,
613
+ );
614
+ normalizedFilters.componentKeys = [componentKey];
615
+ }
580
616
  const issues: SonarIssue[] = [];
581
617
  const ruleNames = new Map<string, string | undefined>();
582
618
  let page = 1;
@@ -614,6 +650,58 @@ export async function fetchIssues(
614
650
  return issues;
615
651
  }
616
652
 
653
+ // ── Rule autocomplete helpers ───────────────────────────────────────────
654
+
655
+ export async function fetchProjectProfiles(
656
+ serverUrl: string,
657
+ token: string | undefined,
658
+ projectKey: string,
659
+ signal?: AbortSignal,
660
+ ): Promise<Array<{ key: string; language: string; name: string }>> {
661
+ try {
662
+ const result = await fetchJson<{
663
+ profiles: Array<{ key?: string; language?: string; name?: string }>;
664
+ }>(
665
+ `${serverUrl}/api/qualityprofiles/search?project=${encodeURIComponent(projectKey)}`,
666
+ token,
667
+ signal,
668
+ );
669
+ return (result.profiles ?? []).map((p) => ({
670
+ key: p.key ?? "",
671
+ language: p.language ?? "",
672
+ name: p.name ?? "",
673
+ }));
674
+ } catch {
675
+ return [];
676
+ }
677
+ }
678
+
679
+ export async function fetchRuleSearch(
680
+ serverUrl: string,
681
+ token: string | undefined,
682
+ query: string,
683
+ languages?: string[],
684
+ signal?: AbortSignal,
685
+ ): Promise<Array<{ key: string; name?: string }>> {
686
+ try {
687
+ const params = new URLSearchParams();
688
+ if (query) params.set("q", query);
689
+ params.set("ps", "20");
690
+ params.set("p", "1");
691
+ if (languages?.length) params.set("languages", languages.join(","));
692
+
693
+ const result = await fetchJson<{
694
+ rules: Array<{ key?: string; name?: string }>;
695
+ }>(`${serverUrl}/api/rules/search?${params.toString()}`, token, signal);
696
+ return (result.rules ?? []).map((r) => ({
697
+ key: r.key ?? "",
698
+ name: r.name,
699
+ }));
700
+ } catch {
701
+ return [];
702
+ }
703
+ }
704
+
617
705
  export async function fetchRuleName(
618
706
  serverUrl: string,
619
707
  token: string | undefined,
@@ -709,7 +797,7 @@ export async function fetchIssueSeverityCounts(
709
797
  token: string | undefined,
710
798
  projectKey: string,
711
799
  signal?: AbortSignal,
712
- mode?: "STANDARD" | "MQR",
800
+ mode?: CleanCodeMode,
713
801
  ): Promise<IssueSeverityCounts | undefined> {
714
802
  try {
715
803
  const facetKey = mode === "MQR" ? "impactSeverities" : "severities";
@@ -785,6 +873,8 @@ export async function fetchFileDuplications(
785
873
  token: string | undefined,
786
874
  projectKey: string,
787
875
  signal?: AbortSignal,
876
+ pathScope?: string,
877
+ baseDir?: string,
788
878
  ): Promise<FileDuplication[]> {
789
879
  const treeUrl = `${serverUrl}/api/measures/component_tree?component=${encodeURIComponent(projectKey)}&qualifiers=FIL&metricKeys=duplicated_lines,duplicated_lines_density,duplicated_blocks&ps=500`;
790
880
  const treeResult = await fetchJson<{
@@ -796,7 +886,7 @@ export async function fetchFileDuplications(
796
886
  }>;
797
887
  }>(treeUrl, token, signal);
798
888
 
799
- const results = (treeResult.components ?? [])
889
+ let results = (treeResult.components ?? [])
800
890
  .map((component) => {
801
891
  const measures = component.measures ?? [];
802
892
  const getValue = (metric: string): number => {
@@ -817,15 +907,22 @@ export async function fetchFileDuplications(
817
907
  duplicatedBlocks,
818
908
  };
819
909
  })
820
- .filter((f): f is FileDuplication => f !== null)
821
- .sort((left, right) => {
822
- const densityDiff =
823
- right.duplicatedLinesDensity - left.duplicatedLinesDensity;
824
- if (densityDiff !== 0) return densityDiff;
825
- const linesDiff = right.duplicatedLines - left.duplicatedLines;
826
- if (linesDiff !== 0) return linesDiff;
827
- return left.filePath.localeCompare(right.filePath);
828
- });
910
+ .filter((f): f is FileDuplication => f !== null);
911
+
912
+ if (pathScope && baseDir) {
913
+ const absPath = resolve(baseDir, pathScope);
914
+ const relPrefix = relative(baseDir, absPath);
915
+ results = results.filter((f) => f.filePath.startsWith(relPrefix));
916
+ }
917
+
918
+ results.sort((left, right) => {
919
+ const densityDiff =
920
+ right.duplicatedLinesDensity - left.duplicatedLinesDensity;
921
+ if (densityDiff !== 0) return densityDiff;
922
+ const linesDiff = right.duplicatedLines - left.duplicatedLines;
923
+ if (linesDiff !== 0) return linesDiff;
924
+ return left.filePath.localeCompare(right.filePath);
925
+ });
829
926
 
830
927
  return results;
831
928
  }