inup 1.6.6 → 1.6.7

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 (109) hide show
  1. package/README.md +16 -0
  2. package/dist/{interactive-ui.js → app/interactive-ui.js} +32 -21
  3. package/dist/{core → app}/upgrade-runner.js +12 -11
  4. package/dist/cli.js +12 -10
  5. package/dist/{services → features/audit}/background-audit.js +2 -2
  6. package/dist/features/{headless/vulnerability-audit.js → audit/headless-audit.js} +9 -5
  7. package/dist/features/audit/index.js +36 -0
  8. package/dist/{ui/presenters/vulnerability.js → features/audit/presenter.js} +1 -1
  9. package/dist/{ui/controllers → features/audit}/vulnerability-audit-controller.js +12 -6
  10. package/dist/{services → features/audit}/vulnerability-checker.js +11 -8
  11. package/dist/features/changelog/clients/github-client.js +35 -17
  12. package/dist/features/changelog/clients/npm-registry-client.js +16 -2
  13. package/dist/features/changelog/index.js +1 -1
  14. package/dist/features/changelog/services/package-metadata-service.js +6 -2
  15. package/dist/features/changelog/services/release-notes-service.js +6 -10
  16. package/dist/features/changelog/types.js +3 -0
  17. package/dist/features/debug/index.js +3 -4
  18. package/dist/features/debug/{services/perf-logger.js → perf-logger.js} +1 -1
  19. package/dist/features/debug/types.js +3 -0
  20. package/dist/features/headless/headless-runner.js +11 -11
  21. package/dist/features/headless/index.js +1 -4
  22. package/dist/features/headless/report.js +2 -0
  23. package/dist/features/interactive/controllers/index.js +6 -0
  24. package/dist/{ui → features/interactive}/controllers/package-info-modal-controller.js +3 -3
  25. package/dist/features/interactive/index.js +21 -0
  26. package/dist/{ui → features/interactive}/input-handler.js +3 -3
  27. package/dist/{ui → features/interactive}/modal/layout.js +2 -2
  28. package/dist/{ui/renderer/package-list.js → features/interactive/modal/package-info-sections/index.js} +3 -3
  29. package/dist/{ui → features/interactive}/modal/package-info-sections/sections.js +53 -22
  30. package/dist/{ui → features/interactive}/modal/package-info-sections/text.js +5 -5
  31. package/dist/{ui → features/interactive}/modal/package-info.js +31 -13
  32. package/dist/features/interactive/modal/types.js +3 -0
  33. package/dist/{ui → features/interactive}/presenters/health.js +2 -2
  34. package/dist/{ui → features/interactive}/renderer/index.js +0 -1
  35. package/dist/{types.js → features/interactive/renderer/package-list/index.js} +3 -4
  36. package/dist/{ui → features/interactive}/renderer/package-list/interface.js +9 -10
  37. package/dist/{ui → features/interactive}/renderer/package-list/rows.js +24 -17
  38. package/dist/features/{debug → interactive}/renderer/performance-modal.js +1 -1
  39. package/dist/{ui/utils/version.js → features/interactive/renderer/version-format.js} +6 -10
  40. package/dist/{ui → features/interactive}/session/index.js +2 -1
  41. package/dist/{ui → features/interactive}/session/interactive-session.js +39 -19
  42. package/dist/{ui → features/interactive}/session/selection-state-builder.js +20 -5
  43. package/dist/{ui → features/interactive}/state/filter-manager.js +2 -2
  44. package/dist/{ui → features/interactive}/state/state-manager.js +6 -4
  45. package/dist/{ui → features/interactive}/state/theme-manager.js +8 -4
  46. package/dist/{ui → features/interactive}/themes-colors.js +5 -2
  47. package/dist/features/upgrade/index.js +8 -0
  48. package/dist/{core → features/upgrade}/package-detector.js +74 -33
  49. package/dist/{core → features/upgrade}/upgrader.js +72 -14
  50. package/dist/index.js +2 -2
  51. package/dist/{config → shared/config}/package-meta.js +1 -1
  52. package/dist/{config → shared/config}/project-config.js +4 -1
  53. package/dist/{utils/config.js → shared/config/user-config.js} +3 -3
  54. package/dist/{ui/modal/package-info-sections.js → shared/fs/index.js} +4 -3
  55. package/dist/{utils/filesystem → shared/fs}/paths.js +3 -3
  56. package/dist/{utils/filesystem → shared/fs}/scan.js +5 -2
  57. package/dist/{services → shared}/http/etag-store.js +56 -4
  58. package/dist/{utils → shared}/local-env.js +1 -1
  59. package/dist/{services/package-manager-detector.js → shared/package-manager.js} +1 -1
  60. package/dist/shared/pnpm-catalogs.js +138 -0
  61. package/dist/{services → shared/registry}/npm-registry.js +48 -29
  62. package/dist/shared/registry/registry-config.js +76 -0
  63. package/dist/{services → shared/registry}/version-checker.js +24 -25
  64. package/dist/{ui/utils → shared/terminal}/index.js +4 -6
  65. package/dist/{ui/utils → shared/terminal}/terminal-input.js +2 -1
  66. package/dist/shared/terminal/text.js +48 -0
  67. package/dist/shared/types/index.js +20 -0
  68. package/dist/{utils/version.js → shared/versions.js} +12 -1
  69. package/package.json +15 -6
  70. package/dist/core/index.js +0 -23
  71. package/dist/features/changelog/types/changelog.types.js +0 -3
  72. package/dist/features/debug/types/debug.types.js +0 -3
  73. package/dist/services/index.js +0 -25
  74. package/dist/ui/controllers/index.js +0 -8
  75. package/dist/ui/index.js +0 -27
  76. package/dist/ui/presenters/index.js +0 -11
  77. package/dist/ui/utils/text.js +0 -76
  78. package/dist/utils/filesystem.js +0 -20
  79. package/dist/utils/index.js +0 -34
  80. /package/dist/{ui/modal → features/audit}/types.js +0 -0
  81. /package/dist/features/debug/{services/performance-tracker.js → performance-tracker.js} +0 -0
  82. /package/dist/{ui → features/interactive}/keymap.js +0 -0
  83. /package/dist/{ui → features/interactive}/modal/index.js +0 -0
  84. /package/dist/{ui → features/interactive}/modal/package-info-sections/release-notes.js +0 -0
  85. /package/dist/{ui → features/interactive}/modal/theme-selector.js +0 -0
  86. /package/dist/{ui → features/interactive}/renderer/confirmation.js +0 -0
  87. /package/dist/{ui → features/interactive}/renderer/help-modal.js +0 -0
  88. /package/dist/{ui → features/interactive}/session/action-dispatcher.js +0 -0
  89. /package/dist/{ui → features/interactive}/state/index.js +0 -0
  90. /package/dist/{ui → features/interactive}/state/modal-manager.js +0 -0
  91. /package/dist/{ui → features/interactive}/state/navigation-manager.js +0 -0
  92. /package/dist/{ui → features/interactive}/themes.js +0 -0
  93. /package/dist/{config → shared/config}/constants.js +0 -0
  94. /package/dist/{config → shared/config}/index.js +0 -0
  95. /package/dist/{utils → shared}/debug-logger.js +0 -0
  96. /package/dist/{utils → shared}/engines.js +0 -0
  97. /package/dist/{utils → shared}/exec.js +0 -0
  98. /package/dist/{utils/filesystem → shared/fs}/io.js +0 -0
  99. /package/dist/{utils → shared}/git.js +0 -0
  100. /package/dist/{services → shared}/http/adaptive-controller.js +0 -0
  101. /package/dist/{services → shared}/http/inflight.js +0 -0
  102. /package/dist/{services → shared}/http/resizable-semaphore.js +0 -0
  103. /package/dist/{services → shared}/http/retry.js +0 -0
  104. /package/dist/{utils → shared}/manifest.js +0 -0
  105. /package/dist/{utils → shared/terminal}/color.js +0 -0
  106. /package/dist/{ui/utils → shared/terminal}/cursor.js +0 -0
  107. /package/dist/{types → shared/types}/domain.js +0 -0
  108. /package/dist/{types → shared/types}/streaming.js +0 -0
  109. /package/dist/{types → shared/types}/ui.js +0 -0
@@ -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("./types/changelog.types"), exports);
17
+ __exportStar(require("./types"), exports);
18
18
  __exportStar(require("./services/changelog-service"), exports);
19
19
  //# sourceMappingURL=index.js.map
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PackageMetadataService = void 0;
4
4
  const npm_registry_client_1 = require("../clients/npm-registry-client");
5
5
  const package_metadata_1 = require("../parsers/package-metadata");
6
- const inflight_1 = require("../../../services/http/inflight");
6
+ const inflight_1 = require("../../../shared/http/inflight");
7
7
  class PackageMetadataService {
8
8
  npmRegistryClient;
9
9
  cache = new Map();
@@ -16,7 +16,11 @@ class PackageMetadataService {
16
16
  this.inFlight.clear();
17
17
  }
18
18
  getCached(packageName, version) {
19
- for (const key of [this.getCacheKey(packageName, version), this.getCacheKey(packageName), packageName]) {
19
+ for (const key of [
20
+ this.getCacheKey(packageName, version),
21
+ this.getCacheKey(packageName),
22
+ packageName,
23
+ ]) {
20
24
  if (this.cache.has(key)) {
21
25
  return this.cache.get(key) ?? null;
22
26
  }
@@ -39,7 +39,6 @@ const github_client_1 = require("../clients/github-client");
39
39
  const changelog_parser_1 = require("../parsers/changelog-parser");
40
40
  const github_release_html_parser_1 = require("../parsers/github-release-html-parser");
41
41
  const RELEASE_NOTES_FETCH_TIMEOUT_MS = 5000;
42
- const PREFER_GITHUB_RELEASE_PAGE = true;
43
42
  class ReleaseNotesService {
44
43
  metadataService;
45
44
  githubClient;
@@ -91,15 +90,12 @@ class ReleaseNotesService {
91
90
  return null;
92
91
  }
93
92
  getGitHubSources(repoUrl, version, signal) {
94
- const directReleaseSources = PREFER_GITHUB_RELEASE_PAGE
95
- ? [
96
- () => this.fetchGitHubReleasePageNotes(repoUrl, version, signal),
97
- () => this.fetchGitHubReleaseNotes(repoUrl, version, signal),
98
- ]
99
- : [
100
- () => this.fetchGitHubReleaseNotes(repoUrl, version, signal),
101
- () => this.fetchGitHubReleasePageNotes(repoUrl, version, signal),
102
- ];
93
+ // Scraped release page first (richer content than the API body), then the
94
+ // release API by tag.
95
+ const directReleaseSources = [
96
+ () => this.fetchGitHubReleasePageNotes(repoUrl, version, signal),
97
+ () => this.fetchGitHubReleaseNotes(repoUrl, version, signal),
98
+ ];
103
99
  return [
104
100
  ...directReleaseSources,
105
101
  () => this.fetchGitHubReleaseListNotes(repoUrl, version, signal),
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -14,8 +14,7 @@ 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/debug.types"), exports);
18
- __exportStar(require("./services/performance-tracker"), exports);
19
- __exportStar(require("./services/perf-logger"), exports);
20
- __exportStar(require("./renderer/performance-modal"), exports);
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./performance-tracker"), exports);
19
+ __exportStar(require("./perf-logger"), exports);
21
20
  //# sourceMappingURL=index.js.map
@@ -6,7 +6,7 @@ exports.getPerfDir = getPerfDir;
6
6
  exports.writePerfLog = writePerfLog;
7
7
  const fs_1 = require("fs");
8
8
  const path_1 = require("path");
9
- const adaptive_controller_1 = require("../../../services/http/adaptive-controller");
9
+ const adaptive_controller_1 = require("../../shared/http/adaptive-controller");
10
10
  /**
11
11
  * Performance debug logger.
12
12
  *
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -5,11 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.HeadlessRunner = void 0;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
- const package_detector_1 = require("../../core/package-detector");
9
- const upgrader_1 = require("../../core/upgrader");
10
- const package_manager_detector_1 = require("../../services/package-manager-detector");
11
- const version_1 = require("../../ui/utils/version");
12
- const vulnerability_audit_1 = require("./vulnerability-audit");
8
+ const upgrade_1 = require("../upgrade");
9
+ const package_manager_1 = require("../../shared/package-manager");
10
+ const versions_1 = require("../../shared/versions");
11
+ const audit_1 = require("../audit");
13
12
  const report_1 = require("./report");
14
13
  const debug_1 = require("../../features/debug");
15
14
  /**
@@ -26,7 +25,7 @@ class HeadlessRunner {
26
25
  options;
27
26
  constructor(options) {
28
27
  this.options = options;
29
- this.detector = new package_detector_1.PackageDetector(options);
28
+ this.detector = new upgrade_1.PackageDetector(options);
30
29
  }
31
30
  async run(options) {
32
31
  try {
@@ -52,7 +51,7 @@ class HeadlessRunner {
52
51
  }
53
52
  // Audit the current versions (one bulk request, best-effort) and cross-reference each
54
53
  // advisory against the upgrade targets, so the report says whether upgrading *fixes* it.
55
- const vulnerabilities = await (0, vulnerability_audit_1.auditVulnerabilities)(outdated);
54
+ const vulnerabilities = await (0, audit_1.auditVulnerabilities)(outdated);
56
55
  // Build the report from the *pre-apply* outdated set: it describes what this run addressed.
57
56
  const report = (0, report_1.buildHeadlessReport)(packages, outdated, vulnerabilities);
58
57
  // --apply writes the bumps + lockfile. The scan above already honored .inuprc
@@ -89,7 +88,7 @@ class HeadlessRunner {
89
88
  const packageManager = this.resolvePackageManager();
90
89
  // With --json, run the upgrader quietly: its own progress + the install child's stdout go to
91
90
  // stderr, leaving stdout for the JSON document only.
92
- const upgrader = new upgrader_1.PackageUpgrader(packageManager, { quiet: json });
91
+ const upgrader = new upgrade_1.PackageUpgrader(packageManager, { quiet: json });
93
92
  await upgrader.upgradePackages(choices, outdated);
94
93
  }
95
94
  /**
@@ -113,7 +112,7 @@ class HeadlessRunner {
113
112
  continue;
114
113
  const targetVersionWithPrefix = saveExact
115
114
  ? targetVersion
116
- : (0, version_1.applyVersionPrefix)(pkg.currentVersion, targetVersion);
115
+ : (0, versions_1.applyVersionPrefix)(pkg.currentVersion, targetVersion);
117
116
  choices.push({
118
117
  name: pkg.name,
119
118
  packageJsonPath: pkg.packageJsonPath,
@@ -121,6 +120,7 @@ class HeadlessRunner {
121
120
  upgradeType: useLatest ? 'latest' : 'range',
122
121
  targetVersion: targetVersionWithPrefix,
123
122
  currentVersionSpecifier: pkg.currentVersion,
123
+ catalog: pkg.catalog,
124
124
  });
125
125
  }
126
126
  return choices;
@@ -129,8 +129,8 @@ class HeadlessRunner {
129
129
  resolvePackageManager() {
130
130
  const cwd = this.options?.cwd || process.cwd();
131
131
  return this.options?.packageManager
132
- ? package_manager_detector_1.PackageManagerDetector.getInfo(this.options.packageManager)
133
- : package_manager_detector_1.PackageManagerDetector.detect(cwd);
132
+ ? package_manager_1.PackageManagerDetector.getInfo(this.options.packageManager)
133
+ : package_manager_1.PackageManagerDetector.detect(cwd);
134
134
  }
135
135
  }
136
136
  exports.HeadlessRunner = HeadlessRunner;
@@ -14,13 +14,10 @@ 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
- exports.renderPlainReport = exports.buildHeadlessReport = exports.upgradeClears = exports.auditVulnerabilities = exports.HeadlessRunner = void 0;
17
+ exports.renderPlainReport = exports.buildHeadlessReport = exports.HeadlessRunner = void 0;
18
18
  __exportStar(require("./types"), exports);
19
19
  var headless_runner_1 = require("./headless-runner");
20
20
  Object.defineProperty(exports, "HeadlessRunner", { enumerable: true, get: function () { return headless_runner_1.HeadlessRunner; } });
21
- var vulnerability_audit_1 = require("./vulnerability-audit");
22
- Object.defineProperty(exports, "auditVulnerabilities", { enumerable: true, get: function () { return vulnerability_audit_1.auditVulnerabilities; } });
23
- Object.defineProperty(exports, "upgradeClears", { enumerable: true, get: function () { return vulnerability_audit_1.upgradeClears; } });
24
21
  var report_1 = require("./report");
25
22
  Object.defineProperty(exports, "buildHeadlessReport", { enumerable: true, get: function () { return report_1.buildHeadlessReport; } });
26
23
  Object.defineProperty(exports, "renderPlainReport", { enumerable: true, get: function () { return report_1.renderPlainReport; } });
@@ -23,6 +23,8 @@ function buildHeadlessReport(all, outdated, vulnerabilities) {
23
23
  packageJsonPath: pkg.packageJsonPath,
24
24
  hasMajorUpdate: pkg.hasMajorUpdate,
25
25
  };
26
+ if (pkg.catalog)
27
+ entry.catalog = pkg.catalog;
26
28
  if (pkg.deprecated)
27
29
  entry.deprecated = pkg.deprecated;
28
30
  if (pkg.enginesNode)
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PackageInfoModalController = void 0;
4
+ var package_info_modal_controller_1 = require("./package-info-modal-controller");
5
+ Object.defineProperty(exports, "PackageInfoModalController", { enumerable: true, get: function () { return package_info_modal_controller_1.PackageInfoModalController; } });
6
+ //# sourceMappingURL=index.js.map
@@ -35,7 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.PackageInfoModalController = void 0;
37
37
  const semver = __importStar(require("semver"));
38
- const services_1 = require("../../services");
38
+ const changelog_1 = require("../../changelog");
39
39
  const RELEASE_NOTES_LOAD_DEBOUNCE_MS = 120;
40
40
  class PackageInfoModalController {
41
41
  abortController = null;
@@ -62,7 +62,7 @@ class PackageInfoModalController {
62
62
  this.cancel();
63
63
  const controller = new AbortController();
64
64
  this.abortController = controller;
65
- const metadata = await services_1.changelogFetcher.fetchPackageMetadata(state.name, state.latestVersion, controller.signal);
65
+ const metadata = await changelog_1.changelogFetcher.fetchPackageMetadata(state.name, state.latestVersion, controller.signal);
66
66
  if (!metadata) {
67
67
  return null;
68
68
  }
@@ -142,7 +142,7 @@ class PackageInfoModalController {
142
142
  state.releaseNotesLoadingVersion = version;
143
143
  onLoaded(); // Re-render to show loading indicator
144
144
  try {
145
- const notes = await services_1.changelogFetcher.fetchReleaseNotesForVersion(state.name, version, this.abortController?.signal);
145
+ const notes = await changelog_1.changelogFetcher.fetchReleaseNotesForVersion(state.name, version, this.abortController?.signal);
146
146
  loadedNotes.set(version, notes);
147
147
  return true;
148
148
  }
@@ -0,0 +1,21 @@
1
+ "use strict";
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;
4
+ var input_handler_1 = require("./input-handler");
5
+ Object.defineProperty(exports, "InputHandler", { enumerable: true, get: function () { return input_handler_1.InputHandler; } });
6
+ Object.defineProperty(exports, "ConfirmationInputHandler", { enumerable: true, get: function () { return input_handler_1.ConfirmationInputHandler; } });
7
+ var renderer_1 = require("./renderer");
8
+ 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
+ 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
+ Object.defineProperty(exports, "createPendingSelectionStates", { enumerable: true, get: function () { return session_1.createPendingSelectionStates; } });
15
+ Object.defineProperty(exports, "createUpgradeChoices", { enumerable: true, get: function () { return session_1.createUpgradeChoices; } });
16
+ 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; } });
21
+ //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ConfirmationInputHandler = exports.InputHandler = void 0;
4
- const utils_1 = require("./utils");
4
+ const terminal_1 = require("../../shared/terminal");
5
5
  const keymap_1 = require("./keymap");
6
6
  class InputHandler {
7
7
  stateManager;
@@ -235,7 +235,7 @@ class InputHandler {
235
235
  this.onAction({ type: 'resize', height });
236
236
  }
237
237
  cleanup() {
238
- utils_1.CursorUtils.cleanup();
238
+ terminal_1.CursorUtils.cleanup();
239
239
  }
240
240
  }
241
241
  exports.InputHandler = InputHandler;
@@ -275,7 +275,7 @@ class ConfirmationInputHandler {
275
275
  }
276
276
  }
277
277
  cleanup() {
278
- utils_1.CursorUtils.cleanup();
278
+ terminal_1.CursorUtils.cleanup();
279
279
  }
280
280
  }
281
281
  exports.ConfirmationInputHandler = ConfirmationInputHandler;
@@ -11,12 +11,12 @@ exports.getModalSectionRowCount = getModalSectionRowCount;
11
11
  exports.getModalFrameHeight = getModalFrameHeight;
12
12
  exports.renderModalFrame = renderModalFrame;
13
13
  const chalk_1 = __importDefault(require("chalk"));
14
- const utils_1 = require("../utils");
14
+ const terminal_1 = require("../../../shared/terminal");
15
15
  function getModalWidth(terminalWidth, minWidth, maxWidth) {
16
16
  return Math.min(Math.max(minWidth, terminalWidth - 6), maxWidth);
17
17
  }
18
18
  function renderModalRow(padding, modalWidth, text) {
19
- const rowLength = (0, utils_1.getVisualLength)(text);
19
+ const rowLength = (0, terminal_1.getVisualLength)(text);
20
20
  const rowPadding = Math.max(0, modalWidth - 4 - rowLength);
21
21
  return (' '.repeat(padding) +
22
22
  chalk_1.default.gray('│') +
@@ -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("./package-list/rows"), exports);
18
- __exportStar(require("./package-list/interface"), exports);
19
- //# sourceMappingURL=package-list.js.map
17
+ __exportStar(require("./sections"), exports);
18
+ __exportStar(require("./release-notes"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -8,9 +8,9 @@ exports.buildPackageInfoSections = buildPackageInfoSections;
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const chalk_1 = __importDefault(require("chalk"));
10
10
  const themes_colors_1 = require("../../themes-colors");
11
- const vulnerability_1 = require("../../presenters/vulnerability");
12
- const utils_1 = require("../../utils");
13
- const utils_2 = require("../../../utils");
11
+ const audit_1 = require("../../../audit");
12
+ const terminal_1 = require("../../../../shared/terminal");
13
+ const engines_1 = require("../../../../shared/engines");
14
14
  const release_notes_1 = require("./release-notes");
15
15
  function formatNumber(num) {
16
16
  if (!num)
@@ -22,10 +22,15 @@ function formatNumber(num) {
22
22
  return num.toString();
23
23
  }
24
24
  function getUsedByPaths(state) {
25
+ // Catalog entries live in pnpm-workspace.yaml; the interesting "used by"
26
+ // answer is the member packages that reference the catalog entry.
27
+ if (state.catalog && state.catalogReferencedBy?.length) {
28
+ return state.catalogReferencedBy;
29
+ }
25
30
  return state.packageJsonPaths ?? [state.packageJsonPath];
26
31
  }
27
32
  function buildTabBarSuffix(activeTab, usedByCount) {
28
- const styleFor = (tab) => tab === activeTab ? chalk_1.default.bold.underline : chalk_1.default.gray;
33
+ const styleFor = (tab) => (tab === activeTab ? chalk_1.default.bold.underline : chalk_1.default.gray);
29
34
  const usedByLabel = `Used by${usedByCount > 0 ? ` (${usedByCount})` : ''}`;
30
35
  return (' ' +
31
36
  chalk_1.default.gray('[ ') +
@@ -40,14 +45,16 @@ function buildUsedBySections(state, modalWidth) {
40
45
  const contentWidth = Math.max(10, modalWidth - 4);
41
46
  const formatRelative = (absolutePath) => {
42
47
  const display = node_path_1.default.relative(cwd, absolutePath) || absolutePath;
43
- return (0, utils_1.truncatePlainText)(display, contentWidth);
48
+ return (0, terminal_1.truncatePlainText)(display, contentWidth);
44
49
  };
45
- return [
50
+ const sections = [
46
51
  {
47
52
  key: 'used-by-summary',
48
53
  rows: [
49
54
  chalk_1.default.bold(`${paths.length} package.json file${paths.length === 1 ? '' : 's'} depend on ${state.name}`),
50
- chalk_1.default.gray(`Type: ${state.type}`),
55
+ chalk_1.default.gray(state.catalog
56
+ ? `Type: ${state.type} • via catalog:${state.catalog}`
57
+ : `Type: ${state.type}`),
51
58
  ],
52
59
  required: true,
53
60
  behavior: 'pinned',
@@ -58,6 +65,25 @@ function buildUsedBySections(state, modalWidth) {
58
65
  behavior: 'body',
59
66
  },
60
67
  ];
68
+ // For catalog entries, also show what else the catalog pins — the whole
69
+ // point of a catalog is that these versions move together.
70
+ if (state.catalog && state.catalogEntries?.length) {
71
+ sections.push({
72
+ key: 'catalog-contents',
73
+ rows: [
74
+ chalk_1.default.bold(`Catalog "${state.catalog}"`) + chalk_1.default.gray(' — pnpm-workspace.yaml'),
75
+ ...state.catalogEntries.map((entry) => {
76
+ const isCurrent = entry.name === state.name;
77
+ const label = (0, terminal_1.truncatePlainText)(`${entry.name}: ${entry.range}`, contentWidth - 2);
78
+ return isCurrent
79
+ ? `${(0, themes_colors_1.getThemeColor)('packageName')('▸')} ${chalk_1.default.bold(label)}`
80
+ : `${chalk_1.default.gray('•')} ${label}`;
81
+ }),
82
+ ],
83
+ behavior: 'body',
84
+ });
85
+ }
86
+ return sections;
61
87
  }
62
88
  function buildPackageInfoSections(state, modalWidth, activeTab) {
63
89
  const title = chalk_1.default.bold('Package: ') +
@@ -82,6 +108,11 @@ function buildPackageInfoSections(state, modalWidth, activeTab) {
82
108
  key: 'meta',
83
109
  rows: [
84
110
  `Current: ${currentVersion} Target: ${targetVersion}`,
111
+ ...(state.catalog
112
+ ? [
113
+ (0, themes_colors_1.getThemeColor)('textSecondary')(`Catalog: ${state.catalog} — range lives in pnpm-workspace.yaml`),
114
+ ]
115
+ : []),
85
116
  ...(state.weeklyDownloads !== undefined
86
117
  ? [(0, themes_colors_1.getThemeColor)('primary')(`Downloads/week: ${formatNumber(state.weeklyDownloads)}`)]
87
118
  : []),
@@ -95,13 +126,13 @@ function buildPackageInfoSections(state, modalWidth, activeTab) {
95
126
  // Wrap (don't truncate) so a deprecation URL stays whole and clickable —
96
127
  // truncation with "..." produces a dead link. `wrapPlainText` breaks on
97
128
  // spaces only, so the URL keeps its own intact line. No emoji marker:
98
- // `getVisualLength` scores glyphs like as width 2 while many terminals
99
- // render them as width 1, which throws off the modal's border alignment.
100
- for (const line of (0, utils_1.wrapPlainText)(`Deprecated: ${state.deprecated}`, warningContentWidth)) {
129
+ // terminal fonts disagree on whether such glyphs render one or two columns
130
+ // wide, which throws off the modal's border alignment.
131
+ for (const line of (0, terminal_1.wrapPlainText)(`Deprecated: ${state.deprecated}`, warningContentWidth)) {
101
132
  warningRows.push((0, themes_colors_1.getThemeColor)('warning')(line));
102
133
  }
103
134
  }
104
- const engineWarning = (0, utils_2.checkNodeEngineCompatibility)(state.enginesNode);
135
+ const engineWarning = (0, engines_1.checkNodeEngineCompatibility)(state.enginesNode);
105
136
  if (engineWarning) {
106
137
  warningRows.push((0, themes_colors_1.getThemeColor)('warning')(`Hold: ${engineWarning}`));
107
138
  }
@@ -116,7 +147,7 @@ function buildPackageInfoSections(state, modalWidth, activeTab) {
116
147
  sections.push({
117
148
  key: 'homepage',
118
149
  rows: [
119
- `Homepage: ${chalk_1.default.underline((0, themes_colors_1.getThemeColor)('primary')((0, utils_1.truncatePlainText)(state.homepage, modalWidth - 14)))}`,
150
+ `Homepage: ${chalk_1.default.underline((0, themes_colors_1.getThemeColor)('primary')((0, terminal_1.truncatePlainText)(state.homepage, modalWidth - 14)))}`,
120
151
  ],
121
152
  behavior: 'pinned',
122
153
  });
@@ -124,30 +155,30 @@ function buildPackageInfoSections(state, modalWidth, activeTab) {
124
155
  if (state.description) {
125
156
  sections.push({
126
157
  key: 'description',
127
- rows: (0, utils_1.wrapPlainText)(state.description, modalWidth - 4)
158
+ rows: (0, terminal_1.wrapPlainText)(state.description, modalWidth - 4)
128
159
  .slice(0, 4)
129
160
  .map((line, index, rows) => index === rows.length - 1 && rows.length === 4
130
- ? (0, utils_1.truncatePlainText)(line, modalWidth - 4)
161
+ ? (0, terminal_1.truncatePlainText)(line, modalWidth - 4)
131
162
  : line),
132
163
  behavior: 'pinned',
133
164
  });
134
165
  }
135
166
  if (state.vulnerability && state.vulnerability.count > 0) {
136
- const representative = (0, vulnerability_1.selectRepresentativeAdvisory)(state.vulnerability);
137
- const severityColor = (0, vulnerability_1.getVulnerabilitySeverityColor)(state.vulnerability.highestSeverity);
167
+ const representative = (0, audit_1.selectRepresentativeAdvisory)(state.vulnerability);
168
+ const severityColor = (0, audit_1.getVulnerabilitySeverityColor)(state.vulnerability.highestSeverity);
138
169
  const vulnerabilityRows = [
139
170
  chalk_1.default.red.bold(`${state.vulnerability.count} known vulnerabilit${state.vulnerability.count === 1 ? 'y' : 'ies'} (${severityColor(state.vulnerability.highestSeverity.toUpperCase())})`),
140
171
  ];
141
172
  if (representative) {
142
173
  const severityLabel = ` ${severityColor(`[${representative.severity.toUpperCase()}]`)} `;
143
- const availableTitleWidth = Math.max(0, modalWidth - 4 - (0, utils_1.getVisualLength)(severityLabel));
144
- vulnerabilityRows.push(`${severityLabel}${(0, utils_1.truncatePlainText)(representative.title, availableTitleWidth)}`);
174
+ const availableTitleWidth = Math.max(0, modalWidth - 4 - (0, terminal_1.getVisualLength)(severityLabel));
175
+ vulnerabilityRows.push(`${severityLabel}${(0, terminal_1.truncatePlainText)(representative.title, availableTitleWidth)}`);
145
176
  }
146
177
  const detailsUrl = state.vulnerability.detailsUrl || representative?.url;
147
178
  if (detailsUrl) {
148
- const linkPrefix = ` ${(0, vulnerability_1.getVulnerabilityLinkLabel)(detailsUrl)} `;
149
- const availableLinkWidth = Math.max(0, modalWidth - 4 - (0, utils_1.getVisualLength)(linkPrefix));
150
- vulnerabilityRows.push(`${linkPrefix}${chalk_1.default.underline((0, themes_colors_1.getThemeColor)('primary')((0, utils_1.truncatePlainText)(detailsUrl, availableLinkWidth)))}`);
179
+ const linkPrefix = ` ${(0, audit_1.getVulnerabilityLinkLabel)(detailsUrl)} `;
180
+ const availableLinkWidth = Math.max(0, modalWidth - 4 - (0, terminal_1.getVisualLength)(linkPrefix));
181
+ vulnerabilityRows.push(`${linkPrefix}${chalk_1.default.underline((0, themes_colors_1.getThemeColor)('primary')((0, terminal_1.truncatePlainText)(detailsUrl, availableLinkWidth)))}`);
151
182
  }
152
183
  if (state.vulnerability.count > 1) {
153
184
  vulnerabilityRows.push(chalk_1.default.gray(` ... and ${state.vulnerability.count - 1} more`));
@@ -163,7 +194,7 @@ function buildPackageInfoSections(state, modalWidth, activeTab) {
163
194
  sections.push({
164
195
  key: 'changelog',
165
196
  rows: [
166
- `Changelog: ${chalk_1.default.underline((0, themes_colors_1.getThemeColor)('primary')((0, utils_1.truncatePlainText)(state.repository, modalWidth - 15)))}`,
197
+ `Changelog: ${chalk_1.default.underline((0, themes_colors_1.getThemeColor)('primary')((0, terminal_1.truncatePlainText)(state.repository, modalWidth - 15)))}`,
167
198
  ],
168
199
  behavior: 'pinned',
169
200
  });
@@ -8,7 +8,7 @@ exports.linkifyRepositoryReferences = linkifyRepositoryReferences;
8
8
  exports.linkifyMarkdownText = linkifyMarkdownText;
9
9
  exports.pushWrappedLines = pushWrappedLines;
10
10
  exports.isLowSignalTrailerLine = isLowSignalTrailerLine;
11
- const utils_1 = require("../../utils");
11
+ const terminal_1 = require("../../../../shared/terminal");
12
12
  function formatTerminalLink(label, url) {
13
13
  return `]8;;${url}${label}]8;;`;
14
14
  }
@@ -48,16 +48,16 @@ function linkifyMarkdownText(text, repositoryUrl) {
48
48
  return linkifyRepositoryReferences(linkifyContributorMentions(text), repositoryUrl);
49
49
  }
50
50
  function pushWrappedLines(lines, text, width, firstPrefix, restPrefix = firstPrefix, style) {
51
- const firstWidth = Math.max(1, width - (0, utils_1.getVisualLength)(firstPrefix));
52
- const restWidth = Math.max(1, width - (0, utils_1.getVisualLength)(restPrefix));
53
- const segments = (0, utils_1.wrapPlainText)(text, firstWidth);
51
+ const firstWidth = Math.max(1, width - (0, terminal_1.getVisualLength)(firstPrefix));
52
+ const restWidth = Math.max(1, width - (0, terminal_1.getVisualLength)(restPrefix));
53
+ const segments = (0, terminal_1.wrapPlainText)(text, firstWidth);
54
54
  if (segments.length === 0) {
55
55
  lines.push(firstPrefix.trimEnd());
56
56
  return;
57
57
  }
58
58
  lines.push(firstPrefix + (style ? style(segments[0]) : segments[0]));
59
59
  for (let i = 1; i < segments.length; i++) {
60
- const wrappedSegments = (0, utils_1.wrapPlainText)(segments[i], restWidth);
60
+ const wrappedSegments = (0, terminal_1.wrapPlainText)(segments[i], restWidth);
61
61
  for (const segment of wrappedSegments) {
62
62
  lines.push(restPrefix + (style ? style(segment) : segment));
63
63
  }
@@ -51,14 +51,22 @@ function renderPackageInfoModal(state, terminalWidth = 80, terminalHeight = 24,
51
51
  }
52
52
  const fixedModalHeight = maxHeight;
53
53
  const padding = Math.floor((terminalWidth - modalWidth) / 2);
54
- const pinnedSections = allSections.filter((section) => (section.behavior ?? 'pinned') === 'pinned');
55
- const bodySections = allSections.filter((section) => (section.behavior ?? 'pinned') !== 'pinned');
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');
56
62
  const minBodyRows = 3;
57
- const reservedBodyRows = minBodyRows + (bodySections.length > 0 ? 1 : 0);
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);
58
66
  const maxPinnedHeight = Math.max(6, fixedModalHeight - reservedBodyRows);
59
67
  const fittedPinned = (0, layout_1.fitModalSections)(pinnedSections, maxPinnedHeight, trimOrder);
60
68
  const pinnedRowCount = (0, layout_1.getModalSectionRowCount)(fittedPinned);
61
- const availableForBody = Math.max(minBodyRows, fixedModalHeight - 2 - pinnedRowCount - (bodySections.length > 0 ? 1 : 0));
69
+ const availableForBody = Math.max(minBodyRows, fixedModalHeight - 2 - pinnedRowCount - (bodySections.length > 0 ? 1 : /* v8 ignore next */ 0));
62
70
  const bodyRows = [];
63
71
  bodySections.forEach((section, index) => {
64
72
  if (index > 0) {
@@ -91,11 +99,17 @@ function renderPackageInfoModal(state, terminalWidth = 80, terminalHeight = 24,
91
99
  ? clampedOffset < maxScroll
92
100
  ? chalk_1.default.gray(`Lines ${clampedOffset + 1}-${Math.min(clampedOffset + visibleBodyRows, totalScrollableRows)} of ${totalScrollableRows}`)
93
101
  : chalk_1.default.gray('End of release notes')
94
- : canGoNewer || canGoOlder
95
- ? chalk_1.default.gray([canGoNewer ? '← newer version' : null, canGoOlder ? '→ older version' : null]
96
- .filter((hint) => Boolean(hint))
97
- .join(' · '))
98
- : null;
102
+ : // A truthy hint footer shrinks visibleBodyRows, which forces
103
+ // maxScroll 1 whenever the scroll path is entered so this arm can
104
+ // only resolve to the hints when maxScroll is 0, which cannot happen.
105
+ // Kept as a safety net for future layout changes.
106
+ /* v8 ignore start */
107
+ canGoNewer || canGoOlder
108
+ ? chalk_1.default.gray([canGoNewer ? '← newer version' : null, canGoOlder ? '→ older version' : null]
109
+ .filter((hint) => Boolean(hint))
110
+ .join(' · '))
111
+ : null;
112
+ /* v8 ignore stop */
99
113
  const visibleSlice = bodyRows.slice(clampedOffset, clampedOffset + visibleBodyRows);
100
114
  const lines = [];
101
115
  const topPadding = Math.max(0, Math.floor((terminalHeight - fixedModalHeight) / 2));
@@ -111,9 +125,9 @@ function renderPackageInfoModal(state, terminalWidth = 80, terminalHeight = 24,
111
125
  lines.push((0, layout_1.renderModalRow)(padding, modalWidth, row));
112
126
  }
113
127
  });
114
- if (bodySections.length > 0) {
115
- lines.push((0, layout_1.renderModalSeparator)(padding, modalWidth));
116
- }
128
+ // bodySections is never empty on the scroll path (see above), so a
129
+ // separator between the pinned rows and the body is always drawn.
130
+ lines.push((0, layout_1.renderModalSeparator)(padding, modalWidth));
117
131
  let renderedScrollRows = 0;
118
132
  for (const entry of visibleSlice) {
119
133
  if (entry.row === '__SEPARATOR__') {
@@ -125,14 +139,18 @@ function renderPackageInfoModal(state, terminalWidth = 80, terminalHeight = 24,
125
139
  renderedScrollRows++;
126
140
  }
127
141
  const usedContentRows = pinnedRowCount +
128
- (bodySections.length > 0 ? 1 : 0) +
142
+ (bodySections.length > 0 ? 1 : /* v8 ignore next */ 0) +
129
143
  renderedScrollRows +
130
144
  (resolvedFooterStatus ? 1 : 0);
131
145
  const totalContentSlots = fixedModalHeight - 2;
146
+ // The scroll path is only entered when content overflows the frame, so the
147
+ // window is always full and there are never filler rows to add.
148
+ /* v8 ignore start */
132
149
  const emptyRows = Math.max(0, totalContentSlots - usedContentRows);
133
150
  for (let i = 0; i < emptyRows; i++) {
134
151
  lines.push((0, layout_1.renderModalRow)(padding, modalWidth, ''));
135
152
  }
153
+ /* v8 ignore stop */
136
154
  if (resolvedFooterStatus) {
137
155
  lines.push((0, layout_1.renderModalRow)(padding, modalWidth, resolvedFooterStatus));
138
156
  }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getHealthBadge = getHealthBadge;
4
- const utils_1 = require("../../utils");
4
+ const engines_1 = require("../../../shared/engines");
5
5
  const themes_colors_1 = require("../themes-colors");
6
6
  /**
7
7
  * A compact badge flagging a package's health in the list:
@@ -16,7 +16,7 @@ function getHealthBadge(state) {
16
16
  if (state.deprecated) {
17
17
  return (0, themes_colors_1.getThemeColor)('warning')('[DEPR]');
18
18
  }
19
- if ((0, utils_1.checkNodeEngineCompatibility)(state.enginesNode)) {
19
+ if ((0, engines_1.checkNodeEngineCompatibility)(state.enginesNode)) {
20
20
  return (0, themes_colors_1.getThemeColor)('warning')('[ENG]');
21
21
  }
22
22
  return '';
@@ -73,5 +73,4 @@ exports.UIRenderer = UIRenderer;
73
73
  // Re-export all functions for direct use if needed
74
74
  __exportStar(require("./package-list"), exports);
75
75
  __exportStar(require("./confirmation"), exports);
76
- __exportStar(require("../modal"), exports);
77
76
  //# sourceMappingURL=index.js.map
@@ -14,7 +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("./types/domain"), exports);
18
- __exportStar(require("./types/ui"), exports);
19
- __exportStar(require("./types/streaming"), exports);
20
- //# sourceMappingURL=types.js.map
17
+ __exportStar(require("./rows"), exports);
18
+ __exportStar(require("./interface"), exports);
19
+ //# sourceMappingURL=index.js.map