inup 1.6.7 → 1.6.8

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 (66) hide show
  1. package/README.md +9 -2
  2. package/dist/app/interactive-ui.js +17 -15
  3. package/dist/app/upgrade-runner.js +11 -16
  4. package/dist/cli.js +12 -13
  5. package/dist/features/audit/headless-audit.js +4 -11
  6. package/dist/features/audit/index.js +9 -9
  7. package/dist/features/audit/presenter.js +0 -2
  8. package/dist/features/audit/vulnerability-audit-controller.js +3 -3
  9. package/dist/features/audit/vulnerability-checker.js +1 -5
  10. package/dist/features/changelog/clients/github-client.js +9 -7
  11. package/dist/features/changelog/index.js +1 -1
  12. package/dist/features/changelog/services/package-metadata-service.js +1 -1
  13. package/dist/features/changelog/services/release-notes-service.js +3 -2
  14. package/dist/features/debug/index.js +2 -2
  15. package/dist/features/debug/perf-logger.js +14 -14
  16. package/dist/features/headless/headless-runner.js +22 -9
  17. package/dist/features/headless/index.js +1 -1
  18. package/dist/features/interactive/index.js +10 -10
  19. package/dist/features/interactive/input-handler.js +3 -3
  20. package/dist/features/interactive/modal/index.js +1 -1
  21. package/dist/features/interactive/modal/layout.js +3 -3
  22. package/dist/features/interactive/modal/package-info-sections/index.js +1 -1
  23. package/dist/features/interactive/modal/package-info-sections/release-notes.js +1 -1
  24. package/dist/features/interactive/modal/package-info-sections/sections.js +5 -5
  25. package/dist/features/interactive/modal/package-info-sections/text.js +1 -1
  26. package/dist/features/interactive/modal/package-info.js +15 -18
  27. package/dist/features/interactive/renderer/confirmation.js +6 -3
  28. package/dist/features/interactive/renderer/help-modal.js +3 -3
  29. package/dist/features/interactive/renderer/index.js +3 -3
  30. package/dist/features/interactive/renderer/package-list/index.js +1 -1
  31. package/dist/features/interactive/renderer/package-list/interface.js +9 -9
  32. package/dist/features/interactive/renderer/package-list/rows.js +8 -9
  33. package/dist/features/interactive/renderer/performance-modal.js +2 -2
  34. package/dist/features/interactive/renderer/version-format.js +4 -4
  35. package/dist/features/interactive/session/action-dispatcher.js +2 -2
  36. package/dist/features/interactive/session/index.js +4 -4
  37. package/dist/features/interactive/session/interactive-session.js +9 -8
  38. package/dist/features/interactive/session/selection-state-builder.js +5 -4
  39. package/dist/features/interactive/state/filter-manager.js +1 -1
  40. package/dist/features/interactive/state/index.js +7 -7
  41. package/dist/features/interactive/state/state-manager.js +4 -4
  42. package/dist/features/interactive/state/theme-manager.js +4 -6
  43. package/dist/features/interactive/themes-colors.js +4 -5
  44. package/dist/features/upgrade/package-detector.js +30 -12
  45. package/dist/features/upgrade/upgrader.js +28 -37
  46. package/dist/shared/config/project-config.js +10 -11
  47. package/dist/shared/config/user-config.js +8 -8
  48. package/dist/shared/debug-logger.js +9 -9
  49. package/dist/shared/exec.js +4 -4
  50. package/dist/shared/fs/index.js +1 -1
  51. package/dist/shared/fs/io.js +3 -4
  52. package/dist/shared/fs/paths.js +4 -4
  53. package/dist/shared/fs/scan.js +21 -21
  54. package/dist/shared/git.js +3 -3
  55. package/dist/shared/http/resizable-semaphore.js +3 -1
  56. package/dist/shared/local-env.js +7 -7
  57. package/dist/shared/package-manager.js +25 -24
  58. package/dist/shared/registry/npm-registry.js +12 -10
  59. package/dist/shared/registry/version-checker.js +1 -1
  60. package/dist/shared/terminal/cursor.js +1 -1
  61. package/dist/shared/terminal/index.js +5 -5
  62. package/dist/shared/terminal/terminal-input.js +6 -2
  63. package/dist/shared/terminal/text.js +1 -1
  64. package/dist/shared/types/index.js +1 -1
  65. package/dist/shared/versions.js +37 -33
  66. package/package.json +10 -6
@@ -1,21 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderReadmeKeyTable = exports.PackageInfoModalController = exports.selectionKey = exports.createUpgradeChoices = exports.createPendingSelectionStates = exports.createSelectionStates = exports.runInteractiveSession = exports.StateManager = exports.UIRenderer = exports.ConfirmationInputHandler = exports.InputHandler = void 0;
3
+ exports.StateManager = exports.selectionKey = exports.runInteractiveSession = exports.createUpgradeChoices = exports.createSelectionStates = exports.createPendingSelectionStates = exports.UIRenderer = exports.renderReadmeKeyTable = exports.InputHandler = exports.ConfirmationInputHandler = exports.PackageInfoModalController = void 0;
4
+ var controllers_1 = require("./controllers");
5
+ Object.defineProperty(exports, "PackageInfoModalController", { enumerable: true, get: function () { return controllers_1.PackageInfoModalController; } });
4
6
  var input_handler_1 = require("./input-handler");
5
- Object.defineProperty(exports, "InputHandler", { enumerable: true, get: function () { return input_handler_1.InputHandler; } });
6
7
  Object.defineProperty(exports, "ConfirmationInputHandler", { enumerable: true, get: function () { return input_handler_1.ConfirmationInputHandler; } });
8
+ Object.defineProperty(exports, "InputHandler", { enumerable: true, get: function () { return input_handler_1.InputHandler; } });
9
+ var keymap_1 = require("./keymap");
10
+ Object.defineProperty(exports, "renderReadmeKeyTable", { enumerable: true, get: function () { return keymap_1.renderReadmeKeyTable; } });
7
11
  var renderer_1 = require("./renderer");
8
12
  Object.defineProperty(exports, "UIRenderer", { enumerable: true, get: function () { return renderer_1.UIRenderer; } });
9
- var state_1 = require("./state");
10
- Object.defineProperty(exports, "StateManager", { enumerable: true, get: function () { return state_1.StateManager; } });
11
13
  var session_1 = require("./session");
12
- Object.defineProperty(exports, "runInteractiveSession", { enumerable: true, get: function () { return session_1.runInteractiveSession; } });
13
- Object.defineProperty(exports, "createSelectionStates", { enumerable: true, get: function () { return session_1.createSelectionStates; } });
14
14
  Object.defineProperty(exports, "createPendingSelectionStates", { enumerable: true, get: function () { return session_1.createPendingSelectionStates; } });
15
+ Object.defineProperty(exports, "createSelectionStates", { enumerable: true, get: function () { return session_1.createSelectionStates; } });
15
16
  Object.defineProperty(exports, "createUpgradeChoices", { enumerable: true, get: function () { return session_1.createUpgradeChoices; } });
17
+ Object.defineProperty(exports, "runInteractiveSession", { enumerable: true, get: function () { return session_1.runInteractiveSession; } });
16
18
  Object.defineProperty(exports, "selectionKey", { enumerable: true, get: function () { return session_1.selectionKey; } });
17
- var controllers_1 = require("./controllers");
18
- Object.defineProperty(exports, "PackageInfoModalController", { enumerable: true, get: function () { return controllers_1.PackageInfoModalController; } });
19
- var keymap_1 = require("./keymap");
20
- Object.defineProperty(exports, "renderReadmeKeyTable", { enumerable: true, get: function () { return keymap_1.renderReadmeKeyTable; } });
19
+ var state_1 = require("./state");
20
+ Object.defineProperty(exports, "StateManager", { enumerable: true, get: function () { return state_1.StateManager; } });
21
21
  //# sourceMappingURL=index.js.map
@@ -21,7 +21,7 @@ class InputHandler {
21
21
  if (!key && !str) {
22
22
  return;
23
23
  }
24
- if (key && key.ctrl && key.name === 'c') {
24
+ if (key?.ctrl && key.name === 'c') {
25
25
  this.onCancel();
26
26
  process.exit(0);
27
27
  }
@@ -201,7 +201,7 @@ class InputHandler {
201
201
  }
202
202
  // Normal mode (not in filter mode). Keys resolve through the keymap so that
203
203
  // dispatch, the help overlay, the footer, and the README share one source.
204
- if (!key || !key.name) {
204
+ if (!key?.name) {
205
205
  return;
206
206
  }
207
207
  // Enter confirms the selection (guarding against an empty selection). It runs
@@ -249,7 +249,7 @@ class ConfirmationInputHandler {
249
249
  if (!key && !str) {
250
250
  return;
251
251
  }
252
- if (key && key.ctrl && key.name === 'c') {
252
+ if (key?.ctrl && key.name === 'c') {
253
253
  // onConfirm runs the normal cleanup path (cursor show, raw-mode off, listener
254
254
  // removal). The 'exit' listener registered by confirmUpgrade is a final backstop.
255
255
  this.onConfirm(false);
@@ -14,9 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./types"), exports);
18
17
  __exportStar(require("./layout"), exports);
19
18
  __exportStar(require("./package-info"), exports);
20
19
  __exportStar(require("./package-info-sections"), exports);
21
20
  __exportStar(require("./theme-selector"), exports);
21
+ __exportStar(require("./types"), exports);
22
22
  //# sourceMappingURL=index.js.map
@@ -27,7 +27,7 @@ function renderModalRow(padding, modalWidth, text) {
27
27
  chalk_1.default.gray('│'));
28
28
  }
29
29
  function renderModalSeparator(padding, modalWidth) {
30
- return ' '.repeat(padding) + chalk_1.default.gray('├' + '─'.repeat(modalWidth - 2) + '┤');
30
+ return ' '.repeat(padding) + chalk_1.default.gray(`├${'─'.repeat(modalWidth - 2)}┤`);
31
31
  }
32
32
  function fitModalSections(sections, maxHeight, trimOrder) {
33
33
  const activeSections = sections.map((section) => ({ ...section, rows: [...section.rows] }));
@@ -69,7 +69,7 @@ function renderModalFrame(sections, options) {
69
69
  for (let i = 0; i < topPadding; i++) {
70
70
  lines.push('');
71
71
  }
72
- lines.push(' '.repeat(padding) + chalk_1.default.gray('╭' + '─'.repeat(modalWidth - 2) + '╮'));
72
+ lines.push(' '.repeat(padding) + chalk_1.default.gray(`╭${'─'.repeat(modalWidth - 2)}╮`));
73
73
  sections.forEach((section, index) => {
74
74
  if (index > 0) {
75
75
  lines.push(renderModalSeparator(padding, modalWidth));
@@ -78,7 +78,7 @@ function renderModalFrame(sections, options) {
78
78
  lines.push(renderModalRow(padding, modalWidth, row));
79
79
  });
80
80
  });
81
- lines.push(' '.repeat(padding) + chalk_1.default.gray('╰' + '─'.repeat(modalWidth - 2) + '╯'));
81
+ lines.push(' '.repeat(padding) + chalk_1.default.gray(`╰${'─'.repeat(modalWidth - 2)}╯`));
82
82
  return lines;
83
83
  }
84
84
  //# sourceMappingURL=layout.js.map
@@ -14,6 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./sections"), exports);
18
17
  __exportStar(require("./release-notes"), exports);
18
+ __exportStar(require("./sections"), exports);
19
19
  //# sourceMappingURL=index.js.map
@@ -114,7 +114,7 @@ function buildReleaseNotesSections(state, modalWidth) {
114
114
  });
115
115
  return sections;
116
116
  }
117
- if (!loaded || !loaded.has(currentVersion)) {
117
+ if (!loaded?.has(currentVersion)) {
118
118
  sections.push({
119
119
  key: 'release-pending',
120
120
  rows: [chalk_1.default.gray(`Press ←/→ to load release notes for v${currentVersion}`)],
@@ -7,18 +7,18 @@ exports.buildUsedBySections = buildUsedBySections;
7
7
  exports.buildPackageInfoSections = buildPackageInfoSections;
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const chalk_1 = __importDefault(require("chalk"));
10
- const themes_colors_1 = require("../../themes-colors");
11
- const audit_1 = require("../../../audit");
12
- const terminal_1 = require("../../../../shared/terminal");
13
10
  const engines_1 = require("../../../../shared/engines");
11
+ const terminal_1 = require("../../../../shared/terminal");
12
+ const audit_1 = require("../../../audit");
13
+ const themes_colors_1 = require("../../themes-colors");
14
14
  const release_notes_1 = require("./release-notes");
15
15
  function formatNumber(num) {
16
16
  if (!num)
17
17
  return 'N/A';
18
18
  if (num >= 1000000)
19
- return (num / 1000000).toFixed(1) + 'M';
19
+ return `${(num / 1000000).toFixed(1)}M`;
20
20
  if (num >= 1000)
21
- return (num / 1000).toFixed(1) + 'K';
21
+ return `${(num / 1000).toFixed(1)}K`;
22
22
  return num.toString();
23
23
  }
24
24
  function getUsedByPaths(state) {
@@ -33,7 +33,7 @@ function linkifyContributorMentions(text) {
33
33
  }
34
34
  function linkifyRepositoryReferences(text, repositoryUrl) {
35
35
  const repoBaseUrl = getRepositoryBaseUrl(repositoryUrl);
36
- if (!repoBaseUrl || !repoBaseUrl.includes('github.com')) {
36
+ if (!repoBaseUrl?.includes('github.com')) {
37
37
  return text;
38
38
  }
39
39
  return text
@@ -51,22 +51,20 @@ function renderPackageInfoModal(state, terminalWidth = 80, terminalHeight = 24,
51
51
  }
52
52
  const fixedModalHeight = maxHeight;
53
53
  const padding = Math.floor((terminalWidth - modalWidth) / 2);
54
- // Every section built by buildPackageInfoSections declares a behavior; the
55
- // '?? pinned' fallbacks are type-level safety nets for hand-built sections.
56
- const pinnedSections = allSections.filter(
57
- /* v8 ignore next */
58
- (section) => (section.behavior ?? 'pinned') === 'pinned');
59
- const bodySections = allSections.filter(
60
- /* v8 ignore next */
61
- (section) => (section.behavior ?? 'pinned') !== 'pinned');
54
+ // Every section built by buildPackageInfoSections declares a behavior, so we
55
+ // partition directly: 'pinned' stays fixed, everything else scrolls.
56
+ const pinnedSections = allSections.filter((section) => section.behavior === 'pinned');
57
+ const bodySections = allSections.filter((section) => section.behavior !== 'pinned');
62
58
  const minBodyRows = 3;
63
- // Reaching this point requires a 'body' section (hasScrollableBody above),
64
- // so bodySections is never empty here; the ':0' arms are unreachable.
65
- const reservedBodyRows = minBodyRows + (bodySections.length > 0 ? 1 : /* v8 ignore next */ 0);
59
+ // hasScrollableBody guaranteed a 'body' section above, so bodySections is
60
+ // non-empty and always reserves its separator row.
61
+ const reservedBodyRows = minBodyRows + 1;
66
62
  const maxPinnedHeight = Math.max(6, fixedModalHeight - reservedBodyRows);
67
63
  const fittedPinned = (0, layout_1.fitModalSections)(pinnedSections, maxPinnedHeight, trimOrder);
68
64
  const pinnedRowCount = (0, layout_1.getModalSectionRowCount)(fittedPinned);
69
- const availableForBody = Math.max(minBodyRows, fixedModalHeight - 2 - pinnedRowCount - (bodySections.length > 0 ? 1 : /* v8 ignore next */ 0));
65
+ // bodySections is non-empty here (see reservedBodyRows), so its separator
66
+ // row is always subtracted.
67
+ const availableForBody = Math.max(minBodyRows, fixedModalHeight - 2 - pinnedRowCount - 1);
70
68
  const bodyRows = [];
71
69
  bodySections.forEach((section, index) => {
72
70
  if (index > 0) {
@@ -116,7 +114,7 @@ function renderPackageInfoModal(state, terminalWidth = 80, terminalHeight = 24,
116
114
  for (let i = 0; i < topPadding; i++) {
117
115
  lines.push('');
118
116
  }
119
- lines.push(' '.repeat(padding) + chalk_1.default.gray('╭' + '─'.repeat(modalWidth - 2) + '╮'));
117
+ lines.push(' '.repeat(padding) + chalk_1.default.gray(`╭${'─'.repeat(modalWidth - 2)}╮`));
120
118
  fittedPinned.forEach((section, sectionIndex) => {
121
119
  if (sectionIndex > 0) {
122
120
  lines.push((0, layout_1.renderModalSeparator)(padding, modalWidth));
@@ -138,10 +136,9 @@ function renderPackageInfoModal(state, terminalWidth = 80, terminalHeight = 24,
138
136
  }
139
137
  renderedScrollRows++;
140
138
  }
141
- const usedContentRows = pinnedRowCount +
142
- (bodySections.length > 0 ? 1 : /* v8 ignore next */ 0) +
143
- renderedScrollRows +
144
- (resolvedFooterStatus ? 1 : 0);
139
+ const usedContentRows =
140
+ // bodySections is non-empty on this path, so its separator row always counts.
141
+ pinnedRowCount + 1 + renderedScrollRows + (resolvedFooterStatus ? 1 : 0);
145
142
  const totalContentSlots = fixedModalHeight - 2;
146
143
  // The scroll path is only entered when content overflows the frame, so the
147
144
  // window is always full and there are never filler rows to add.
@@ -154,7 +151,7 @@ function renderPackageInfoModal(state, terminalWidth = 80, terminalHeight = 24,
154
151
  if (resolvedFooterStatus) {
155
152
  lines.push((0, layout_1.renderModalRow)(padding, modalWidth, resolvedFooterStatus));
156
153
  }
157
- lines.push(' '.repeat(padding) + chalk_1.default.gray('╰' + '─'.repeat(modalWidth - 2) + '╯'));
154
+ lines.push(' '.repeat(padding) + chalk_1.default.gray(`╰${'─'.repeat(modalWidth - 2)}╯`));
158
155
  return {
159
156
  lines,
160
157
  maxScrollOffset: maxScroll,
@@ -15,10 +15,13 @@ function renderConfirmation(choices) {
15
15
  // Group choices by package name to show unique packages
16
16
  const packagesByName = new Map();
17
17
  choices.forEach((choice) => {
18
- if (!packagesByName.has(choice.name)) {
19
- packagesByName.set(choice.name, []);
18
+ const group = packagesByName.get(choice.name);
19
+ if (group) {
20
+ group.push(choice);
21
+ }
22
+ else {
23
+ packagesByName.set(choice.name, [choice]);
20
24
  }
21
- packagesByName.get(choice.name).push(choice);
22
25
  });
23
26
  let output = chalk_1.default.bold(`\n🚀 Ready to upgrade ${packagesByName.size} package(s):\n`);
24
27
  packagesByName.forEach((packageChoices, packageName) => {
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.renderHelpModal = renderHelpModal;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
- const modal_1 = require("../modal");
9
8
  const keymap_1 = require("../keymap");
9
+ const modal_1 = require("../modal");
10
10
  const themes_colors_1 = require("../themes-colors");
11
11
  const KEY_COLUMN_WIDTH = 9;
12
12
  /**
@@ -46,7 +46,7 @@ function renderHelpModal(terminalWidth, terminalHeight, scrollOffset = 0) {
46
46
  const topPadding = Math.max(0, Math.floor((terminalHeight - fixedModalHeight) / 2));
47
47
  for (let i = 0; i < topPadding; i++)
48
48
  lines.push('');
49
- lines.push(' '.repeat(padding) + chalk_1.default.gray('╭' + '─'.repeat(modalWidth - 2) + '╮'));
49
+ lines.push(' '.repeat(padding) + chalk_1.default.gray(`╭${'─'.repeat(modalWidth - 2)}╮`));
50
50
  for (const row of pinnedRows) {
51
51
  lines.push((0, modal_1.renderModalRow)(padding, modalWidth, row));
52
52
  }
@@ -64,7 +64,7 @@ function renderHelpModal(terminalWidth, terminalHeight, scrollOffset = 0) {
64
64
  lines.push((0, modal_1.renderModalRow)(padding, modalWidth, ''));
65
65
  if (footer)
66
66
  lines.push((0, modal_1.renderModalRow)(padding, modalWidth, footer));
67
- lines.push(' '.repeat(padding) + chalk_1.default.gray('╰' + '─'.repeat(modalWidth - 2) + '╯'));
67
+ lines.push(' '.repeat(padding) + chalk_1.default.gray(`╰${'─'.repeat(modalWidth - 2)}╯`));
68
68
  return {
69
69
  lines,
70
70
  maxScrollOffset: maxScroll,
@@ -37,9 +37,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.UIRenderer = void 0;
40
- const PackageList = __importStar(require("./package-list"));
41
- const Confirmation = __importStar(require("./confirmation"));
42
40
  const Modal = __importStar(require("../modal"));
41
+ const Confirmation = __importStar(require("./confirmation"));
42
+ const PackageList = __importStar(require("./package-list"));
43
43
  /**
44
44
  * Main UI renderer class that composes all rendering parts
45
45
  */
@@ -70,7 +70,7 @@ class UIRenderer {
70
70
  }
71
71
  }
72
72
  exports.UIRenderer = UIRenderer;
73
+ __exportStar(require("./confirmation"), exports);
73
74
  // Re-export all functions for direct use if needed
74
75
  __exportStar(require("./package-list"), exports);
75
- __exportStar(require("./confirmation"), exports);
76
76
  //# sourceMappingURL=index.js.map
@@ -14,6 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./rows"), exports);
18
17
  __exportStar(require("./interface"), exports);
18
+ __exportStar(require("./rows"), exports);
19
19
  //# sourceMappingURL=index.js.map
@@ -6,11 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.renderInterface = renderInterface;
7
7
  exports.renderPackagesTable = renderPackagesTable;
8
8
  const chalk_1 = __importDefault(require("chalk"));
9
- const version_format_1 = require("../version-format");
10
- const themes_colors_1 = require("../../themes-colors");
11
9
  const config_1 = require("../../../../shared/config");
12
- const rows_1 = require("./rows");
13
10
  const keymap_1 = require("../../keymap");
11
+ const themes_colors_1 = require("../../themes-colors");
12
+ const version_format_1 = require("../version-format");
13
+ const rows_1 = require("./rows");
14
14
  function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _forceFullRender, renderableItems, activeFilterLabel, packageManager, filterMode, filterQuery, totalPackagesBeforeFilter, terminalWidth = 80, loadingProgress, auditProgress, options = {}, notice) {
15
15
  const output = [];
16
16
  if (packageManager) {
@@ -35,7 +35,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
35
35
  output.push(fullHeaderLine + ' '.repeat(headerPadding));
36
36
  }
37
37
  else {
38
- const headerLine = ' ' + chalk_1.default.bold.blue('🚀 ') + (0, themes_colors_1.coloredInupLogo)();
38
+ const headerLine = ` ${chalk_1.default.bold.blue('🚀 ')}${(0, themes_colors_1.coloredInupLogo)()}`;
39
39
  const fullHeaderLine = activeFilterLabel
40
40
  ? headerLine +
41
41
  (0, themes_colors_1.getThemeColor)('textSecondary')(' - ') +
@@ -63,9 +63,9 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
63
63
  }
64
64
  else {
65
65
  const hintLine = (0, keymap_1.getFooterHints)()
66
- .map(({ keyLabel, label }) => chalk_1.default.bold.white(keyLabel + ' ') + (0, themes_colors_1.getThemeColor)('textSecondary')(label))
66
+ .map(({ keyLabel, label }) => chalk_1.default.bold.white(`${keyLabel} `) + (0, themes_colors_1.getThemeColor)('textSecondary')(label))
67
67
  .join(' ');
68
- output.push(' ' + hintLine);
68
+ output.push(` ${hintLine}`);
69
69
  }
70
70
  const totalPackages = states.length;
71
71
  const totalBeforeFilter = totalPackagesBeforeFilter || totalPackages;
@@ -107,7 +107,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
107
107
  const matchCount = totalVisualItems > maxVisibleItems
108
108
  ? (0, themes_colors_1.getThemeColor)('textSecondary')(`Showing ${chalk_1.default.white(startItem)}-${chalk_1.default.white(endItem)} of ${chalk_1.default.white(totalPackages)} matches`)
109
109
  : (0, themes_colors_1.getThemeColor)('textSecondary')(`Showing all ${chalk_1.default.white(totalPackages)} matches`);
110
- statusLine = matchCount + ' ' + chalk_1.default.bold.white('Esc ') + chalk_1.default.gray('Clear filter');
110
+ statusLine = `${matchCount} ${chalk_1.default.bold.white('Esc ')}${chalk_1.default.gray('Clear filter')}`;
111
111
  }
112
112
  else {
113
113
  if (totalVisualItems > maxVisibleItems) {
@@ -129,12 +129,12 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
129
129
  const auditLabel = auditProgress.isRunning
130
130
  ? `Audit ${auditProgress.completed}/${auditProgress.total}`
131
131
  : `Audit ${auditProgress.total}/${auditProgress.total}`;
132
- statusLine += ' ' + (0, themes_colors_1.getThemeColor)('textSecondary')(auditLabel);
132
+ statusLine += ` ${(0, themes_colors_1.getThemeColor)('textSecondary')(auditLabel)}`;
133
133
  }
134
134
  // A one-shot notice (e.g. "nothing selected") replaces the status line for a
135
135
  // single render so the layout height stays constant.
136
136
  const statusContent = notice ? (0, themes_colors_1.getThemeColor)('warning')(notice) : statusLine;
137
- const statusLineFull = ' ' + statusContent;
137
+ const statusLineFull = ` ${statusContent}`;
138
138
  const statusPadding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(statusLineFull));
139
139
  output.push(statusLineFull + ' '.repeat(statusPadding));
140
140
  output.push('');
@@ -8,10 +8,10 @@ exports.renderPackageLine = renderPackageLine;
8
8
  exports.renderSectionHeader = renderSectionHeader;
9
9
  exports.renderSpacer = renderSpacer;
10
10
  const chalk_1 = __importDefault(require("chalk"));
11
- const version_format_1 = require("../version-format");
12
- const themes_colors_1 = require("../../themes-colors");
13
11
  const audit_1 = require("../../../audit");
14
12
  const health_1 = require("../../presenters/health");
13
+ const themes_colors_1 = require("../../themes-colors");
14
+ const version_format_1 = require("../version-format");
15
15
  function padLineToWidth(line, terminalWidth) {
16
16
  const padding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(line));
17
17
  return line + ' '.repeat(padding);
@@ -24,7 +24,6 @@ function getTypeBadge(type) {
24
24
  return (0, themes_colors_1.getThemeColor)('textSecondary')('[P]');
25
25
  case 'optionalDependencies':
26
26
  return (0, themes_colors_1.getThemeColor)('textSecondary')('[O]');
27
- case 'dependencies':
28
27
  default:
29
28
  return '';
30
29
  }
@@ -44,10 +43,10 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
44
43
  if (isCurrentRow) {
45
44
  packageName =
46
45
  chalk_1.default.bold((0, themes_colors_1.getThemeColor)('packageAuthor')(author)) +
47
- (0, themes_colors_1.getThemeColor)('packageName')('/' + packagePart);
46
+ (0, themes_colors_1.getThemeColor)('packageName')(`/${packagePart}`);
48
47
  }
49
48
  else {
50
- packageName = chalk_1.default.bold.white(author) + chalk_1.default.white('/' + packagePart);
49
+ packageName = chalk_1.default.bold.white(author) + chalk_1.default.white(`/${packagePart}`);
51
50
  }
52
51
  }
53
52
  else {
@@ -145,7 +144,7 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
145
144
  const currentPaddingText = shouldShowDashes(currentPadding)
146
145
  ? dashColor('-').repeat(currentPadding)
147
146
  : ' '.repeat(currentPadding);
148
- const currentWithPadding = currentSection + ' ' + currentPaddingText;
147
+ const currentWithPadding = `${currentSection} ${currentPaddingText}`;
149
148
  let rangeSection = '';
150
149
  if (isPending || isFailed || state.hasRangeUpdate) {
151
150
  rangeSection = `${rangeDot} ${rangeVersionText}`;
@@ -154,7 +153,7 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
154
153
  const rangePaddingText = shouldShowDashes(rangePadding)
155
154
  ? dashColor('-').repeat(rangePadding)
156
155
  : ' '.repeat(rangePadding);
157
- rangeSection += ' ' + rangePaddingText;
156
+ rangeSection += ` ${rangePaddingText}`;
158
157
  }
159
158
  else {
160
159
  rangeSection = ' '.repeat(rangeColumnWidth);
@@ -167,7 +166,7 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
167
166
  const latestPaddingText = shouldShowDashes(latestPadding)
168
167
  ? dashColor('-').repeat(latestPadding)
169
168
  : ' '.repeat(latestPadding);
170
- latestSection += ' ' + latestPaddingText;
169
+ latestSection += ` ${latestPaddingText}`;
171
170
  }
172
171
  else {
173
172
  latestSection = ' '.repeat(latestColumnWidth);
@@ -176,7 +175,7 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
176
175
  }
177
176
  function renderSectionHeader(title, sectionType) {
178
177
  const colorFn = sectionType === 'main' ? chalk_1.default.cyan : sectionType === 'peer' ? chalk_1.default.magenta : chalk_1.default.yellow;
179
- return ' ' + colorFn.bold(title);
178
+ return ` ${colorFn.bold(title)}`;
180
179
  }
181
180
  function renderSpacer() {
182
181
  return '';
@@ -122,7 +122,7 @@ function renderPerformanceModal(snapshot, terminalWidth = 80, terminalHeight = 2
122
122
  for (let i = 0; i < topPadding; i++) {
123
123
  lines.push('');
124
124
  }
125
- lines.push(' '.repeat(padding) + chalk_1.default.gray('╭' + '─'.repeat(modalWidth - 2) + '╮'));
125
+ lines.push(' '.repeat(padding) + chalk_1.default.gray(`╭${'─'.repeat(modalWidth - 2)}╮`));
126
126
  for (const section of pinned) {
127
127
  for (const row of section.rows) {
128
128
  lines.push((0, modal_1.renderModalRow)(padding, modalWidth, row));
@@ -146,7 +146,7 @@ function renderPerformanceModal(snapshot, terminalWidth = 80, terminalHeight = 2
146
146
  if (footer) {
147
147
  lines.push((0, modal_1.renderModalRow)(padding, modalWidth, footer));
148
148
  }
149
- lines.push(' '.repeat(padding) + chalk_1.default.gray('╰' + '─'.repeat(modalWidth - 2) + '╯'));
149
+ lines.push(' '.repeat(padding) + chalk_1.default.gray(`╰${'─'.repeat(modalWidth - 2)}╯`));
150
150
  return {
151
151
  lines,
152
152
  maxScrollOffset: maxScroll,
@@ -3,13 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.VersionUtils = exports.applyVersionPrefix = exports.getVisualLength = exports.stripAnsi = void 0;
6
+ exports.VersionUtils = exports.stripAnsi = exports.getVisualLength = exports.applyVersionPrefix = void 0;
7
7
  exports.truncateMiddle = truncateMiddle;
8
8
  exports.formatVersionDiff = formatVersionDiff;
9
9
  const chalk_1 = __importDefault(require("chalk"));
10
10
  const text_1 = require("../../../shared/terminal/text");
11
- Object.defineProperty(exports, "stripAnsi", { enumerable: true, get: function () { return text_1.stripAnsi; } });
12
11
  Object.defineProperty(exports, "getVisualLength", { enumerable: true, get: function () { return text_1.getVisualLength; } });
12
+ Object.defineProperty(exports, "stripAnsi", { enumerable: true, get: function () { return text_1.stripAnsi; } });
13
13
  const versions_1 = require("../../../shared/versions");
14
14
  Object.defineProperty(exports, "applyVersionPrefix", { enumerable: true, get: function () { return versions_1.applyVersionPrefix; } });
15
15
  function truncateMiddle(str, maxLength) {
@@ -30,8 +30,8 @@ function formatVersionDiff(current, target, colorFn) {
30
30
  if (current === target) {
31
31
  return chalk_1.default.white(target);
32
32
  }
33
- const currentParts = current.split('.').map((part) => parseInt(part) || 0);
34
- const targetParts = target.split('.').map((part) => parseInt(part) || 0);
33
+ const currentParts = current.split('.').map((part) => parseInt(part, 10) || 0);
34
+ const targetParts = target.split('.').map((part) => parseInt(part, 10) || 0);
35
35
  let firstDiffSegment = -1;
36
36
  const maxLength = Math.max(currentParts.length, targetParts.length);
37
37
  for (let i = 0; i < maxLength; i++) {
@@ -96,7 +96,7 @@ function dispatchAction(action, ctx) {
96
96
  renderInterface();
97
97
  if (stateManager.getInfoModalSessionId() === modalSessionId &&
98
98
  packageInfoModalController.getVersionCount(currentState) > 0) {
99
- packageInfoModalController.loadVersionAtIndex(currentState, 0, () => {
99
+ void packageInfoModalController.loadVersionAtIndex(currentState, 0, () => {
100
100
  if (!isResolved())
101
101
  renderInterface();
102
102
  });
@@ -158,7 +158,7 @@ function dispatchAction(action, ctx) {
158
158
  if (newIndex >= 0) {
159
159
  stateManager.resetInfoModalScroll();
160
160
  if (!packageInfoModalController.isVersionLoaded(currentState, newIndex)) {
161
- packageInfoModalController.loadVersionAtIndex(currentState, newIndex, () => {
161
+ void packageInfoModalController.loadVersionAtIndex(currentState, newIndex, () => {
162
162
  if (!isResolved())
163
163
  renderInterface();
164
164
  });
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dispatchAction = exports.selectionKey = exports.deduplicatePackages = exports.createUpgradeChoices = exports.createPendingSelectionStates = exports.createSelectionStates = exports.runInteractiveSession = void 0;
3
+ exports.selectionKey = exports.deduplicatePackages = exports.createUpgradeChoices = exports.createSelectionStates = exports.createPendingSelectionStates = exports.runInteractiveSession = exports.dispatchAction = void 0;
4
+ var action_dispatcher_1 = require("./action-dispatcher");
5
+ Object.defineProperty(exports, "dispatchAction", { enumerable: true, get: function () { return action_dispatcher_1.dispatchAction; } });
4
6
  var interactive_session_1 = require("./interactive-session");
5
7
  Object.defineProperty(exports, "runInteractiveSession", { enumerable: true, get: function () { return interactive_session_1.runInteractiveSession; } });
6
8
  var selection_state_builder_1 = require("./selection-state-builder");
7
- Object.defineProperty(exports, "createSelectionStates", { enumerable: true, get: function () { return selection_state_builder_1.createSelectionStates; } });
8
9
  Object.defineProperty(exports, "createPendingSelectionStates", { enumerable: true, get: function () { return selection_state_builder_1.createPendingSelectionStates; } });
10
+ Object.defineProperty(exports, "createSelectionStates", { enumerable: true, get: function () { return selection_state_builder_1.createSelectionStates; } });
9
11
  Object.defineProperty(exports, "createUpgradeChoices", { enumerable: true, get: function () { return selection_state_builder_1.createUpgradeChoices; } });
10
12
  Object.defineProperty(exports, "deduplicatePackages", { enumerable: true, get: function () { return selection_state_builder_1.deduplicatePackages; } });
11
13
  Object.defineProperty(exports, "selectionKey", { enumerable: true, get: function () { return selection_state_builder_1.selectionKey; } });
12
- var action_dispatcher_1 = require("./action-dispatcher");
13
- Object.defineProperty(exports, "dispatchAction", { enumerable: true, get: function () { return action_dispatcher_1.dispatchAction; } });
14
14
  //# sourceMappingURL=index.js.map
@@ -5,15 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.runInteractiveSession = runInteractiveSession;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
- const state_1 = require("../state");
9
- const input_handler_1 = require("../input-handler");
8
+ const user_config_1 = require("../../../shared/config/user-config");
10
9
  const terminal_1 = require("../../../shared/terminal");
11
10
  const cursor_1 = require("../../../shared/terminal/cursor");
12
- const themes_colors_1 = require("../themes-colors");
13
11
  const debug_1 = require("../../debug");
14
- const performance_modal_1 = require("../renderer/performance-modal");
12
+ const input_handler_1 = require("../input-handler");
15
13
  const help_modal_1 = require("../renderer/help-modal");
16
- const user_config_1 = require("../../../shared/config/user-config");
14
+ const performance_modal_1 = require("../renderer/performance-modal");
15
+ const state_1 = require("../state");
16
+ const themes_colors_1 = require("../themes-colors");
17
17
  const action_dispatcher_1 = require("./action-dispatcher");
18
18
  function getTerminalHeight() {
19
19
  if (process.stdout.isTTY && typeof process.stdout.rows === 'number' && process.stdout.rows > 0) {
@@ -52,6 +52,7 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
52
52
  terminal_1.CursorUtils.exitAlternateScreen();
53
53
  ownsAlternateScreen = false;
54
54
  };
55
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: matches ANSI escape sequences by design
55
56
  const resetAnsiPattern = /\x1b\[(?:0|49)m/g;
56
57
  const packageListRenderOptions = {
57
58
  showPeerDependencyVulnerabilities: options.showPeerDependencyVulnerabilities,
@@ -69,9 +70,9 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
69
70
  closeHelp: key('? / Esc ') + hint('Close'),
70
71
  };
71
72
  const buildModalHeaderLines = (shortcutLabel) => [
72
- ' ' + chalk_1.default.bold('🚀 ') + (0, themes_colors_1.coloredInupLogo)(),
73
+ ` ${chalk_1.default.bold('🚀 ')}${(0, themes_colors_1.coloredInupLogo)()}`,
73
74
  '',
74
- ' ' + shortcutLabel,
75
+ ` ${shortcutLabel}`,
75
76
  '',
76
77
  ];
77
78
  const buildRemainingViewport = (terminalWidth, terminalHeight, usedLines) => {
@@ -287,7 +288,7 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
287
288
  renderInterface();
288
289
  });
289
290
  }
290
- catch (error) {
291
+ catch {
291
292
  onRefreshViewReady?.(undefined);
292
293
  process.off('exit', emergencyCleanup);
293
294
  releaseInteractiveScreen();
@@ -53,15 +53,16 @@ function deduplicatePackages(packages) {
53
53
  const uniquePackages = new Map();
54
54
  for (const pkg of packages) {
55
55
  const key = selectionKey(pkg.name, pkg.currentVersion, pkg.type, pkg.catalog);
56
- if (!uniquePackages.has(key)) {
56
+ const existing = uniquePackages.get(key);
57
+ if (existing) {
58
+ existing.packageJsonPaths.add(pkg.packageJsonPath);
59
+ }
60
+ else {
57
61
  uniquePackages.set(key, {
58
62
  pkg,
59
63
  packageJsonPaths: new Set([pkg.packageJsonPath]),
60
64
  });
61
65
  }
62
- else {
63
- uniquePackages.get(key).packageJsonPaths.add(pkg.packageJsonPath);
64
- }
65
66
  }
66
67
  return new Map(Array.from(uniquePackages.entries()).sort(([, a], [, b]) => {
67
68
  const aIsScoped = a.pkg.name.startsWith('@');
@@ -92,7 +92,7 @@ class FilterManager {
92
92
  if (activeTypes.length === 0)
93
93
  return 'None';
94
94
  const label = activeTypes.join(', ');
95
- return this.state.showOnlyVulnerable ? label + ' (vulnerable only)' : label;
95
+ return this.state.showOnlyVulnerable ? `${label} (vulnerable only)` : label;
96
96
  }
97
97
  getFilteredStates(allStates, options = {}) {
98
98
  let filtered = allStates;
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FilterManager = exports.ModalManager = exports.NavigationManager = exports.StateManager = void 0;
4
- var state_manager_1 = require("./state-manager");
5
- Object.defineProperty(exports, "StateManager", { enumerable: true, get: function () { return state_manager_1.StateManager; } });
6
- var navigation_manager_1 = require("./navigation-manager");
7
- Object.defineProperty(exports, "NavigationManager", { enumerable: true, get: function () { return navigation_manager_1.NavigationManager; } });
8
- var modal_manager_1 = require("./modal-manager");
9
- Object.defineProperty(exports, "ModalManager", { enumerable: true, get: function () { return modal_manager_1.ModalManager; } });
3
+ exports.StateManager = exports.NavigationManager = exports.ModalManager = exports.FilterManager = void 0;
10
4
  var filter_manager_1 = require("./filter-manager");
11
5
  Object.defineProperty(exports, "FilterManager", { enumerable: true, get: function () { return filter_manager_1.FilterManager; } });
6
+ var modal_manager_1 = require("./modal-manager");
7
+ Object.defineProperty(exports, "ModalManager", { enumerable: true, get: function () { return modal_manager_1.ModalManager; } });
8
+ var navigation_manager_1 = require("./navigation-manager");
9
+ Object.defineProperty(exports, "NavigationManager", { enumerable: true, get: function () { return navigation_manager_1.NavigationManager; } });
10
+ var state_manager_1 = require("./state-manager");
11
+ Object.defineProperty(exports, "StateManager", { enumerable: true, get: function () { return state_manager_1.StateManager; } });
12
12
  //# sourceMappingURL=index.js.map