inup 1.4.7 → 1.4.9

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.
@@ -58,7 +58,7 @@ class UpgradeRunner {
58
58
  // Group by package name and version specifier
59
59
  const choiceMap = new Map();
60
60
  selectedChoices.forEach((choice) => {
61
- const key = `${choice.name}@${choice.currentVersionSpecifier}`;
61
+ const key = `${choice.name}@${choice.currentVersionSpecifier}@${choice.dependencyType}`;
62
62
  choiceMap.set(key, choice.upgradeType);
63
63
  });
64
64
  // Convert to the format expected by selectPackagesToUpgrade
@@ -98,7 +98,9 @@ class UpgradeRunner {
98
98
  validateSelectedChoices(selectedChoices, allPackages) {
99
99
  // Validate that all selected packages have valid target versions
100
100
  const invalidChoices = selectedChoices.filter((choice) => {
101
- const packageInfo = allPackages.find((pkg) => pkg.name === choice.name && pkg.packageJsonPath === choice.packageJsonPath);
101
+ const packageInfo = allPackages.find((pkg) => pkg.name === choice.name &&
102
+ pkg.packageJsonPath === choice.packageJsonPath &&
103
+ pkg.type === choice.dependencyType);
102
104
  return !packageInfo || !choice.targetVersion;
103
105
  });
104
106
  if (invalidChoices.length > 0) {
@@ -8,6 +8,7 @@ const chalk_1 = __importDefault(require("chalk"));
8
8
  const nanospinner_1 = require("nanospinner");
9
9
  const fs_1 = require("fs");
10
10
  const path_1 = require("path");
11
+ const child_process_1 = require("child_process");
11
12
  const utils_1 = require("../utils");
12
13
  class PackageUpgrader {
13
14
  constructor(packageManager) {
@@ -54,28 +55,30 @@ class PackageUpgrader {
54
55
  ` ${this.packageManager.installCommand}\n`));
55
56
  return; // Skip install, let user do it manually
56
57
  }
57
- const spinner = (0, nanospinner_1.createSpinner)(`Running ${this.packageManager.displayName} install...`).start();
58
- try {
59
- (0, utils_1.executeCommand)(this.packageManager.installCommand, installDir);
60
- spinner.success();
58
+ console.log(chalk_1.default.cyan(`\nšŸ“¦ Running ${this.packageManager.installCommand}...\n`));
59
+ const result = (0, child_process_1.spawnSync)(this.packageManager.installCommand, {
60
+ cwd: installDir,
61
+ stdio: 'inherit',
62
+ shell: true,
63
+ });
64
+ if (result.error) {
65
+ throw result.error;
61
66
  }
62
- catch (error) {
63
- spinner.error();
64
- console.error(chalk_1.default.red(`Error: ${error}`));
65
- throw error;
67
+ if (result.status !== 0) {
68
+ if (result.signal) {
69
+ throw new Error(`${this.packageManager.installCommand} terminated by signal ${result.signal}`);
70
+ }
71
+ throw new Error(`${this.packageManager.installCommand} exited with code ${result.status}`);
66
72
  }
67
73
  }
68
- groupChoicesByFileAndType(choices, packageInfos) {
74
+ groupChoicesByFileAndType(choices, _packageInfos) {
69
75
  const groups = {};
70
76
  choices.forEach((choice) => {
71
- const info = packageInfos.find((p) => p.name === choice.name && p.packageJsonPath === choice.packageJsonPath);
72
- if (info) {
73
- const key = `${choice.packageJsonPath}|${info.type}`;
74
- if (!groups[key]) {
75
- groups[key] = [];
76
- }
77
- groups[key].push(choice);
77
+ const key = `${choice.packageJsonPath}|${choice.dependencyType}`;
78
+ if (!groups[key]) {
79
+ groups[key] = [];
78
80
  }
81
+ groups[key].push(choice);
79
82
  });
80
83
  return groups;
81
84
  }
@@ -61,7 +61,7 @@ class InteractiveUI {
61
61
  // Deduplicate packages by name and version specifier, but track all package.json paths
62
62
  const uniquePackages = new Map();
63
63
  for (const pkg of outdatedPackages) {
64
- const key = `${pkg.name}@${pkg.currentVersion}`;
64
+ const key = `${pkg.name}@${pkg.currentVersion}@${pkg.type}`;
65
65
  if (!uniquePackages.has(key)) {
66
66
  uniquePackages.set(key, {
67
67
  pkg,
@@ -96,7 +96,7 @@ class InteractiveUI {
96
96
  const rangeClean = semver.coerce(pkg.rangeVersion)?.version || pkg.rangeVersion;
97
97
  const latestClean = semver.coerce(pkg.latestVersion)?.version || pkg.latestVersion;
98
98
  // Use previous selection if available, otherwise default to 'none'
99
- const key = `${pkg.name}@${pkg.currentVersion}`;
99
+ const key = `${pkg.name}@${pkg.currentVersion}@${pkg.type}`;
100
100
  const previousSelection = previousSelections?.get(key) || 'none';
101
101
  return {
102
102
  name: pkg.name,
@@ -127,6 +127,7 @@ class InteractiveUI {
127
127
  choices.push({
128
128
  name: state.name,
129
129
  packageJsonPath,
130
+ dependencyType: state.type,
130
131
  upgradeType: state.selectedOption,
131
132
  targetVersion: targetVersionWithPrefix,
132
133
  currentVersionSpecifier: state.currentVersionSpecifier,
@@ -237,7 +238,7 @@ class InteractiveUI {
237
238
  case 'resize':
238
239
  const heightChanged = stateManager.updateTerminalHeight(action.height);
239
240
  if (heightChanged) {
240
- stateManager.resetForResize();
241
+ stateManager.resetForResize(filteredStates.length);
241
242
  }
242
243
  else {
243
244
  // Even if height didn't change, width might have changed
@@ -400,7 +401,8 @@ class InteractiveUI {
400
401
  // This handles cases where process.stdout.rows might not be accurate at startup
401
402
  const currentHeight = this.getTerminalHeight();
402
403
  if (stateManager.updateTerminalHeight(currentHeight)) {
403
- stateManager.resetForResize();
404
+ const initialFiltered = stateManager.getFilteredStates(states);
405
+ stateManager.resetForResize(initialFiltered.length);
404
406
  }
405
407
  // Initial render
406
408
  renderInterface();
@@ -129,9 +129,9 @@ class NavigationManager {
129
129
  if (targetVisualIndex < this.state.scrollOffset) {
130
130
  this.state.scrollOffset = targetVisualIndex;
131
131
  }
132
- // Scrolling down: scroll down by 1 item (smooth scrolling)
132
+ // Scrolling down: adjust scroll to keep item visible
133
133
  else if (visualIndex >= this.state.scrollOffset + this.maxVisibleItems) {
134
- this.state.scrollOffset += 1;
134
+ this.state.scrollOffset = visualIndex - this.maxVisibleItems + 1;
135
135
  }
136
136
  // Ensure scrollOffset doesn't go negative or beyond bounds
137
137
  const maxScroll = Math.max(0, totalVisualItems - this.maxVisibleItems);
@@ -167,8 +167,10 @@ class StateManager {
167
167
  }
168
168
  exitFilterMode(clearQuery = false) {
169
169
  this.filterManager.exitFilterMode(clearQuery);
170
- this.navigationManager.setCurrentRow(0);
171
- this.navigationManager.setScrollOffset(0);
170
+ if (clearQuery) {
171
+ this.navigationManager.setCurrentRow(0);
172
+ this.navigationManager.setScrollOffset(0);
173
+ }
172
174
  // Use incremental render for search mode toggle (no blink)
173
175
  }
174
176
  updateFilterQuery(query) {
@@ -218,8 +220,8 @@ class StateManager {
218
220
  setInitialRender(isInitial) {
219
221
  this.renderState.forceFullRender = isInitial;
220
222
  }
221
- resetForResize() {
222
- const totalItems = this.renderState.renderableItems.length || this.displayState.maxVisibleItems;
223
+ resetForResize(totalFilteredItems) {
224
+ const totalItems = totalFilteredItems || this.renderState.renderableItems.length || this.displayState.maxVisibleItems;
223
225
  this.navigationManager.resetForResize(totalItems);
224
226
  this.renderState.forceFullRender = true;
225
227
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inup",
3
- "version": "1.4.7",
3
+ "version": "1.4.9",
4
4
  "description": "Interactive CLI tool for upgrading dependencies with ease. Auto-detects and works with npm, yarn, pnpm, and bun. Inspired by yarn upgrade-interactive. Supports monorepos, workspaces, and batch upgrades.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -40,20 +40,20 @@
40
40
  "@types/keypress.js": "^2.1.3",
41
41
  "@types/node": "^24.10.1",
42
42
  "@types/semver": "^7.7.1",
43
- "@vitest/coverage-v8": "^3.0.0",
44
- "prettier": "^3.8.0",
43
+ "@vitest/coverage-v8": "^3.2.4",
44
+ "prettier": "^3.8.1",
45
45
  "typescript": "^5.9.3",
46
- "vitest": "^3.0.0"
46
+ "vitest": "^3.2.4"
47
47
  },
48
48
  "dependencies": {
49
49
  "chalk": "^5.6.2",
50
- "commander": "^14.0.2",
50
+ "commander": "^14.0.3",
51
51
  "env-paths": "^4.0.0",
52
- "inquirer": "^13.2.1",
52
+ "inquirer": "^13.3.2",
53
53
  "keypress": "^0.2.1",
54
54
  "nanospinner": "^1.2.2",
55
- "semver": "^7.7.3",
56
- "undici": "^7.19.1"
55
+ "semver": "^7.7.4",
56
+ "undici": "^7.24.4"
57
57
  },
58
58
  "engines": {
59
59
  "node": ">=20.0.0"