ruckup 0.1.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.
Files changed (65) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +323 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/dep-diff.d.ts +9 -0
  6. package/dist/dep-diff.d.ts.map +1 -0
  7. package/dist/dep-diff.js +50 -0
  8. package/dist/dep-diff.js.map +1 -0
  9. package/dist/doctor.d.ts +12 -0
  10. package/dist/doctor.d.ts.map +1 -0
  11. package/dist/doctor.js +102 -0
  12. package/dist/doctor.js.map +1 -0
  13. package/dist/engine.d.ts +14 -0
  14. package/dist/engine.d.ts.map +1 -0
  15. package/dist/engine.js +128 -0
  16. package/dist/engine.js.map +1 -0
  17. package/dist/filter.d.ts +13 -0
  18. package/dist/filter.d.ts.map +1 -0
  19. package/dist/filter.js +68 -0
  20. package/dist/filter.js.map +1 -0
  21. package/dist/format.d.ts +11 -0
  22. package/dist/format.d.ts.map +1 -0
  23. package/dist/format.js +255 -0
  24. package/dist/format.js.map +1 -0
  25. package/dist/index.d.ts +17 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +16 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/inline-diff.d.ts +9 -0
  30. package/dist/inline-diff.d.ts.map +1 -0
  31. package/dist/inline-diff.js +88 -0
  32. package/dist/inline-diff.js.map +1 -0
  33. package/dist/interactive.d.ts +13 -0
  34. package/dist/interactive.d.ts.map +1 -0
  35. package/dist/interactive.js +231 -0
  36. package/dist/interactive.js.map +1 -0
  37. package/dist/open.d.ts +15 -0
  38. package/dist/open.d.ts.map +1 -0
  39. package/dist/open.js +52 -0
  40. package/dist/open.js.map +1 -0
  41. package/dist/package.d.ts +32 -0
  42. package/dist/package.d.ts.map +1 -0
  43. package/dist/package.js +143 -0
  44. package/dist/package.js.map +1 -0
  45. package/dist/registry.d.ts +26 -0
  46. package/dist/registry.d.ts.map +1 -0
  47. package/dist/registry.js +164 -0
  48. package/dist/registry.js.map +1 -0
  49. package/dist/release-info.d.ts +40 -0
  50. package/dist/release-info.d.ts.map +1 -0
  51. package/dist/release-info.js +165 -0
  52. package/dist/release-info.js.map +1 -0
  53. package/dist/security.d.ts +10 -0
  54. package/dist/security.d.ts.map +1 -0
  55. package/dist/security.js +72 -0
  56. package/dist/security.js.map +1 -0
  57. package/dist/types.d.ts +168 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +50 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/version.d.ts +23 -0
  62. package/dist/version.d.ts.map +1 -0
  63. package/dist/version.js +229 -0
  64. package/dist/version.js.map +1 -0
  65. package/package.json +66 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Inline diff/changelog view — renders release notes or dep changes in the terminal.
3
+ */
4
+ import chalk from 'chalk';
5
+ import { formatDepDiffDetail, formatAdvisoryDetail } from './format.js';
6
+ /** Render a simple markdown-like text to terminal with basic formatting */
7
+ function renderMarkdownToTerminal(body) {
8
+ return body
9
+ // Headers
10
+ .replace(/^### (.+)$/gm, (_, h) => chalk.bold.underline(h))
11
+ .replace(/^## (.+)$/gm, (_, h) => chalk.bold.underline(h))
12
+ .replace(/^# (.+)$/gm, (_, h) => chalk.bold.underline(h))
13
+ // Bold
14
+ .replace(/\*\*(.+?)\*\*/g, (_, t) => chalk.bold(t))
15
+ // Italic
16
+ .replace(/\*(.+?)\*/g, (_, t) => chalk.italic(t))
17
+ // Code
18
+ .replace(/`(.+?)`/g, (_, t) => chalk.cyan(t))
19
+ // Bullet points
20
+ .replace(/^[-*] /gm, ' • ')
21
+ // Links [text](url) -> text (url)
22
+ .replace(/\[(.+?)\]\((.+?)\)/g, (_, text, url) => `${text} ${chalk.dim(`(${url})`)}`)
23
+ // Trim excessive blank lines
24
+ .replace(/\n{3,}/g, '\n\n');
25
+ }
26
+ /** Render inline diff for a single upgrade */
27
+ export function renderInlineDiff(upgrade) {
28
+ const lines = [];
29
+ // Header
30
+ lines.push(chalk.bold.blue(`\n${'─'.repeat(60)}`));
31
+ lines.push(chalk.bold(`${upgrade.name} ${upgrade.current} → ${upgrade.target}`));
32
+ lines.push(chalk.bold.blue('─'.repeat(60)));
33
+ // Security advisories
34
+ if (upgrade.advisories && upgrade.advisories.length > 0) {
35
+ lines.push('');
36
+ lines.push(formatAdvisoryDetail(upgrade.name, upgrade.advisories));
37
+ }
38
+ // Dependency diff
39
+ if (upgrade.depDiff) {
40
+ const { totalAdded, totalRemoved, totalChanged } = upgrade.depDiff;
41
+ if (totalAdded > 0 || totalRemoved > 0 || totalChanged > 0) {
42
+ lines.push('');
43
+ lines.push(formatDepDiffDetail(upgrade.name, upgrade.depDiff));
44
+ }
45
+ }
46
+ // Release notes body
47
+ if (upgrade.releaseInfo?.body) {
48
+ lines.push('');
49
+ lines.push(chalk.bold('Release Notes:'));
50
+ const rendered = renderMarkdownToTerminal(upgrade.releaseInfo.body);
51
+ // Truncate very long release notes
52
+ const maxLines = 50;
53
+ const noteLines = rendered.split('\n');
54
+ if (noteLines.length > maxLines) {
55
+ lines.push(noteLines.slice(0, maxLines).join('\n'));
56
+ lines.push(chalk.dim(` ... (${noteLines.length - maxLines} more lines)`));
57
+ if (upgrade.releaseInfo.releaseUrl) {
58
+ lines.push(chalk.dim(` Full notes: ${upgrade.releaseInfo.releaseUrl}`));
59
+ }
60
+ }
61
+ else {
62
+ lines.push(rendered);
63
+ }
64
+ }
65
+ else if (upgrade.releaseInfo?.releaseUrl) {
66
+ lines.push('');
67
+ lines.push(chalk.dim(`Release notes: ${upgrade.releaseInfo.releaseUrl}`));
68
+ }
69
+ // Compare URL
70
+ if (upgrade.releaseInfo?.compareUrl) {
71
+ lines.push(chalk.dim(`Compare: ${upgrade.releaseInfo.compareUrl}`));
72
+ }
73
+ // Owner changed warning
74
+ if (upgrade.ownerChanged) {
75
+ lines.push('');
76
+ lines.push(chalk.red.bold('⚠ PACKAGE OWNER HAS CHANGED'));
77
+ lines.push(chalk.red(' This may indicate a hijacked or transferred package.'));
78
+ }
79
+ return lines.join('\n');
80
+ }
81
+ /** Render inline diffs for all upgrades */
82
+ export function renderAllInlineDiffs(upgrades) {
83
+ if (upgrades.length === 0) {
84
+ return chalk.green('All dependencies match the latest package versions :)');
85
+ }
86
+ return upgrades.map(renderInlineDiff).join('\n');
87
+ }
88
+ //# sourceMappingURL=inline-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-diff.js","sourceRoot":"","sources":["../src/inline-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Enhanced interactive mode — package selector with security badges,
3
+ * dependency diff indicators, and keybindings for inspection.
4
+ */
5
+ import type { UpgradeResult } from './types.js';
6
+ interface InteractiveResult {
7
+ selected: UpgradeResult[];
8
+ cancelled: boolean;
9
+ }
10
+ /** Run the interactive selection UI */
11
+ export declare function runInteractiveSelect(upgrades: UpgradeResult[]): Promise<InteractiveResult>;
12
+ export {};
13
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AAKnE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AA4ED,uCAAuC;AACvC,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,iBAAiB,CAAC,CA6L5B"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Enhanced interactive mode — package selector with security badges,
3
+ * dependency diff indicators, and keybindings for inspection.
4
+ */
5
+ import { stdin, stdout } from 'node:process';
6
+ import chalk from 'chalk';
7
+ import { openReleaseNotes, openDiffView, openRepository } from './open.js';
8
+ import { renderInlineDiff } from './inline-diff.js';
9
+ import { formatDepDiffDetail, formatAdvisoryDetail } from './format.js';
10
+ /** Format a single line for the interactive selector */
11
+ function formatInteractiveLine(upgrade, selected, focused, maxNameLen, maxCurrentLen) {
12
+ const checkbox = selected ? chalk.green('◉') : chalk.dim('○');
13
+ const focusIndicator = focused ? chalk.cyan('❯ ') : ' ';
14
+ const name = upgrade.name.padEnd(maxNameLen);
15
+ const current = upgrade.current.padStart(maxCurrentLen);
16
+ const arrow = chalk.dim(' → ');
17
+ const changeColor = upgrade.semverChange === 'major' ? chalk.red :
18
+ upgrade.semverChange === 'minor' ? chalk.cyan :
19
+ upgrade.semverChange === 'patch' ? chalk.green :
20
+ chalk.white;
21
+ const target = changeColor(upgrade.target);
22
+ let line = `${focusIndicator}${checkbox} ${name} ${current}${arrow}${target}`;
23
+ // Security badge
24
+ if (upgrade.advisories && upgrade.advisories.length > 0) {
25
+ const maxSev = getMaxSeverity(upgrade.advisories);
26
+ line += ' ' + severityBadge(maxSev);
27
+ }
28
+ // Dep diff badge
29
+ if (upgrade.depDiff) {
30
+ const badge = depDiffBadge(upgrade.depDiff);
31
+ if (badge)
32
+ line += ' ' + badge;
33
+ }
34
+ // Release link indicator
35
+ if (upgrade.releaseInfo?.releaseUrl) {
36
+ line += chalk.blue(' 🔗');
37
+ }
38
+ // Owner change warning
39
+ if (upgrade.ownerChanged) {
40
+ line += chalk.red.bold(' ⚠ OWNER');
41
+ }
42
+ return line;
43
+ }
44
+ function getMaxSeverity(advisories) {
45
+ const order = ['critical', 'high', 'moderate', 'low', 'info'];
46
+ for (const level of order) {
47
+ if (advisories.some((a) => a.severity === level))
48
+ return level;
49
+ }
50
+ return 'info';
51
+ }
52
+ function severityBadge(severity) {
53
+ switch (severity) {
54
+ case 'critical': return chalk.bgRed.white.bold(' ⚠ CRITICAL ');
55
+ case 'high': return chalk.red.bold('⚠ HIGH');
56
+ case 'moderate': return chalk.yellow('⚠ moderate');
57
+ case 'low': return chalk.dim('⚠ low');
58
+ default: return chalk.dim('ⓘ');
59
+ }
60
+ }
61
+ function depDiffBadge(diff) {
62
+ const parts = [];
63
+ if (diff.totalAdded > 0)
64
+ parts.push(chalk.red(`+${diff.totalAdded}`));
65
+ if (diff.totalRemoved > 0)
66
+ parts.push(chalk.green(`-${diff.totalRemoved}`));
67
+ if (diff.totalChanged > 0)
68
+ parts.push(chalk.yellow(`~${diff.totalChanged}`));
69
+ return parts.length > 0 ? `[${parts.join('/')}deps]` : null;
70
+ }
71
+ /** Run the interactive selection UI */
72
+ export async function runInteractiveSelect(upgrades) {
73
+ if (upgrades.length === 0) {
74
+ return { selected: [], cancelled: false };
75
+ }
76
+ return new Promise((resolve) => {
77
+ const selectedSet = new Set(upgrades.map((_, i) => i)); // All selected by default
78
+ let cursorPos = 0;
79
+ let detailView = null;
80
+ const maxNameLen = Math.max(...upgrades.map((u) => u.name.length));
81
+ const maxCurrentLen = Math.max(...upgrades.map((u) => u.current.length));
82
+ function render() {
83
+ // Clear screen from cursor
84
+ stdout.write('\x1B[2J\x1B[H');
85
+ // Header
86
+ stdout.write(chalk.bold('ruckup — Interactive Upgrade Selector\n'));
87
+ stdout.write(chalk.dim('Space: toggle a: all n: none r: release notes d: diff o: repo i: dep diff c: changelog Enter: confirm q: quit\n\n'));
88
+ // Package list
89
+ for (let i = 0; i < upgrades.length; i++) {
90
+ const line = formatInteractiveLine(upgrades[i], selectedSet.has(i), i === cursorPos, maxNameLen, maxCurrentLen);
91
+ stdout.write(line + '\n');
92
+ }
93
+ // Summary
94
+ stdout.write(chalk.dim(`\n${selectedSet.size}/${upgrades.length} packages selected\n`));
95
+ // Detail view (if any)
96
+ if (detailView) {
97
+ stdout.write('\n' + detailView + '\n');
98
+ stdout.write(chalk.dim('\nPress any key to close detail view...'));
99
+ }
100
+ }
101
+ // Set raw mode for keypress handling
102
+ if (stdin.isTTY) {
103
+ stdin.setRawMode(true);
104
+ }
105
+ stdin.resume();
106
+ stdin.setEncoding('utf-8');
107
+ render();
108
+ function cleanup() {
109
+ if (stdin.isTTY) {
110
+ stdin.setRawMode(false);
111
+ }
112
+ stdin.removeAllListeners('data');
113
+ stdin.pause();
114
+ // Clear and move to bottom
115
+ stdout.write('\x1B[2J\x1B[H');
116
+ }
117
+ stdin.on('data', async (key) => {
118
+ // If in detail view, any key closes it
119
+ if (detailView) {
120
+ detailView = null;
121
+ render();
122
+ return;
123
+ }
124
+ const current = upgrades[cursorPos];
125
+ switch (key) {
126
+ // Ctrl+C or q: quit
127
+ case '\x03':
128
+ case 'q':
129
+ cleanup();
130
+ resolve({ selected: [], cancelled: true });
131
+ return;
132
+ // Enter: confirm
133
+ case '\r':
134
+ case '\n':
135
+ cleanup();
136
+ resolve({
137
+ selected: upgrades.filter((_, i) => selectedSet.has(i)),
138
+ cancelled: false,
139
+ });
140
+ return;
141
+ // Up arrow or k
142
+ case '\x1B[A':
143
+ case 'k':
144
+ cursorPos = Math.max(0, cursorPos - 1);
145
+ break;
146
+ // Down arrow or j
147
+ case '\x1B[B':
148
+ case 'j':
149
+ cursorPos = Math.min(upgrades.length - 1, cursorPos + 1);
150
+ break;
151
+ // Space: toggle selection
152
+ case ' ':
153
+ if (selectedSet.has(cursorPos)) {
154
+ selectedSet.delete(cursorPos);
155
+ }
156
+ else {
157
+ selectedSet.add(cursorPos);
158
+ }
159
+ break;
160
+ // a: select all
161
+ case 'a':
162
+ for (let i = 0; i < upgrades.length; i++)
163
+ selectedSet.add(i);
164
+ break;
165
+ // n: select none
166
+ case 'n':
167
+ selectedSet.clear();
168
+ break;
169
+ // r: open release notes
170
+ case 'r':
171
+ if (current) {
172
+ const opened = await openReleaseNotes(current);
173
+ if (!opened) {
174
+ detailView = chalk.dim('No release notes URL available for ' + current.name);
175
+ }
176
+ }
177
+ break;
178
+ // d: open diff/compare
179
+ case 'd':
180
+ if (current) {
181
+ const opened = await openDiffView(current);
182
+ if (!opened) {
183
+ detailView = chalk.dim('No compare URL available for ' + current.name);
184
+ }
185
+ }
186
+ break;
187
+ // o: open repository
188
+ case 'o':
189
+ if (current) {
190
+ const opened = await openRepository(current);
191
+ if (!opened) {
192
+ detailView = chalk.dim('No repository URL available for ' + current.name);
193
+ }
194
+ }
195
+ break;
196
+ // i: show dependency diff detail
197
+ case 'i':
198
+ if (current?.depDiff) {
199
+ detailView = formatDepDiffDetail(current.name, current.depDiff);
200
+ }
201
+ else {
202
+ detailView = chalk.dim('No dependency diff data for ' + (current?.name ?? 'unknown'));
203
+ }
204
+ break;
205
+ // c: show inline changelog
206
+ case 'c':
207
+ if (current) {
208
+ detailView = renderInlineDiff(current);
209
+ }
210
+ break;
211
+ // s: show security detail
212
+ case 's':
213
+ if (current?.advisories && current.advisories.length > 0) {
214
+ detailView = formatAdvisoryDetail(current.name, current.advisories);
215
+ }
216
+ else {
217
+ detailView = chalk.dim('No security advisories for ' + (current?.name ?? 'unknown'));
218
+ }
219
+ break;
220
+ default:
221
+ // Handle escape sequences for arrow keys
222
+ if (key.startsWith('\x1B')) {
223
+ // Already handled above for basic arrows
224
+ }
225
+ break;
226
+ }
227
+ render();
228
+ });
229
+ });
230
+ }
231
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}
package/dist/open.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Browser open helpers — open release notes, diffs, and repos.
3
+ */
4
+ import type { UpgradeResult } from './types.js';
5
+ /** Open a URL in the default browser */
6
+ export declare function openUrl(url: string): Promise<void>;
7
+ /** Open release notes for a package upgrade */
8
+ export declare function openReleaseNotes(upgrade: UpgradeResult): Promise<boolean>;
9
+ /** Open the diff/compare view between two versions */
10
+ export declare function openDiffView(upgrade: UpgradeResult): Promise<boolean>;
11
+ /** Open the repository homepage */
12
+ export declare function openRepository(upgrade: UpgradeResult): Promise<boolean>;
13
+ /** Open URLs for multiple packages (based on options) */
14
+ export declare function openUrlsForUpgrades(upgrades: UpgradeResult[], mode: 'release' | 'diff' | 'repo'): Promise<void>;
15
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../src/open.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wCAAwC;AACxC,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD;AAED,+CAA+C;AAC/C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/E;AAED,sDAAsD;AACtD,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3E;AAED,mCAAmC;AACnC,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E;AAED,yDAAyD;AACzD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,aAAa,EAAE,EACzB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAChC,OAAO,CAAC,IAAI,CAAC,CAcf"}
package/dist/open.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Browser open helpers — open release notes, diffs, and repos.
3
+ */
4
+ import open from 'open';
5
+ /** Open a URL in the default browser */
6
+ export async function openUrl(url) {
7
+ await open(url);
8
+ }
9
+ /** Open release notes for a package upgrade */
10
+ export async function openReleaseNotes(upgrade) {
11
+ const url = upgrade.releaseInfo?.releaseUrl;
12
+ if (url) {
13
+ await openUrl(url);
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+ /** Open the diff/compare view between two versions */
19
+ export async function openDiffView(upgrade) {
20
+ const url = upgrade.releaseInfo?.compareUrl;
21
+ if (url) {
22
+ await openUrl(url);
23
+ return true;
24
+ }
25
+ return false;
26
+ }
27
+ /** Open the repository homepage */
28
+ export async function openRepository(upgrade) {
29
+ const url = upgrade.releaseInfo?.repoUrl ?? upgrade.repositoryUrl;
30
+ if (url) {
31
+ await openUrl(url);
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ /** Open URLs for multiple packages (based on options) */
37
+ export async function openUrlsForUpgrades(upgrades, mode) {
38
+ for (const upgrade of upgrades) {
39
+ switch (mode) {
40
+ case 'release':
41
+ await openReleaseNotes(upgrade);
42
+ break;
43
+ case 'diff':
44
+ await openDiffView(upgrade);
45
+ break;
46
+ case 'repo':
47
+ await openRepository(upgrade);
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../src/open.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACvC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAsB;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;IAC5C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAsB;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;IAC5C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAsB;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAClE,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yDAAyD;AACzD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAyB,EACzB,IAAiC;IAEjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Package.json reader/writer with formatting preservation.
3
+ */
4
+ import type { DepType, UpgradeResult, RuckupOptions } from './types.js';
5
+ /** Parsed package.json with original formatting info */
6
+ export interface PackageFile {
7
+ filePath: string;
8
+ data: Record<string, unknown>;
9
+ indent: string;
10
+ newline: string;
11
+ raw: string;
12
+ }
13
+ /** All dependencies extracted from a package file */
14
+ export interface ExtractedDeps {
15
+ [name: string]: {
16
+ versionRange: string;
17
+ depType: DepType;
18
+ };
19
+ }
20
+ /** Read a package.json file and preserve formatting */
21
+ export declare function readPackageFile(filePath: string): Promise<PackageFile>;
22
+ /** Read package.json from stdin or raw data */
23
+ export declare function parsePackageData(raw: string, filePath?: string): PackageFile;
24
+ /** Extract all dependencies from a package file based on --dep option */
25
+ export declare function extractDependencies(pkg: PackageFile, depOption: string): ExtractedDeps;
26
+ /** Write upgraded versions back to package.json, preserving formatting */
27
+ export declare function writeUpgrades(pkg: PackageFile, upgrades: UpgradeResult[]): Promise<string>;
28
+ /** Find all package.json files matching glob patterns */
29
+ export declare function findPackageFiles(pattern: string, cwd: string): Promise<string[]>;
30
+ /** Find workspace package.json files */
31
+ export declare function findWorkspacePackageFiles(options: RuckupOptions): Promise<string[]>;
32
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../src/package.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExE,wDAAwD;AACxD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,CAAC,IAAI,EAAE,MAAM,GAAG;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAUD,uDAAuD;AACvD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQ5E;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,WAAW,CAM/E;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,GAChB,aAAa,CA8Bf;AAED,0EAA0E;AAC1E,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED,yDAAyD;AACzD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB;AAED,wCAAwC;AACxC,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC,CAwCnB"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Package.json reader/writer with formatting preservation.
3
+ */
4
+ import { readFile, writeFile } from 'node:fs/promises';
5
+ import { resolve, dirname } from 'node:path';
6
+ import { glob } from 'node:fs';
7
+ import detectIndent from 'detect-indent';
8
+ import { detectNewline } from 'detect-newline';
9
+ const DEP_SECTIONS = {
10
+ prod: 'dependencies',
11
+ dev: 'devDependencies',
12
+ optional: 'optionalDependencies',
13
+ peer: 'peerDependencies',
14
+ packageManager: 'packageManager',
15
+ };
16
+ /** Read a package.json file and preserve formatting */
17
+ export async function readPackageFile(filePath) {
18
+ const absPath = resolve(filePath);
19
+ const raw = await readFile(absPath, 'utf-8');
20
+ const indent = detectIndent(raw).indent || ' ';
21
+ const newline = detectNewline(raw) || '\n';
22
+ const data = JSON.parse(raw);
23
+ return { filePath: absPath, data, indent, newline, raw };
24
+ }
25
+ /** Read package.json from stdin or raw data */
26
+ export function parsePackageData(raw, filePath = '<stdin>') {
27
+ const indent = detectIndent(raw).indent || ' ';
28
+ const newline = detectNewline(raw) || '\n';
29
+ const data = JSON.parse(raw);
30
+ return { filePath, data, indent, newline, raw };
31
+ }
32
+ /** Extract all dependencies from a package file based on --dep option */
33
+ export function extractDependencies(pkg, depOption) {
34
+ const deps = {};
35
+ const requestedTypes = depOption.split(',').map((s) => s.trim());
36
+ for (const requested of requestedTypes) {
37
+ const section = DEP_SECTIONS[requested];
38
+ if (!section)
39
+ continue;
40
+ if (section === 'packageManager') {
41
+ // packageManager is a single string like "npm@10.5.0"
42
+ const pmValue = pkg.data.packageManager;
43
+ if (typeof pmValue === 'string' && pmValue.includes('@')) {
44
+ const atIdx = pmValue.lastIndexOf('@');
45
+ const name = pmValue.slice(0, atIdx);
46
+ const version = pmValue.slice(atIdx + 1);
47
+ deps[name] = { versionRange: version, depType: 'packageManager' };
48
+ }
49
+ }
50
+ else {
51
+ const sectionData = pkg.data[section];
52
+ if (sectionData && typeof sectionData === 'object') {
53
+ for (const [name, version] of Object.entries(sectionData)) {
54
+ deps[name] = { versionRange: version, depType: section };
55
+ }
56
+ }
57
+ }
58
+ }
59
+ return deps;
60
+ }
61
+ /** Write upgraded versions back to package.json, preserving formatting */
62
+ export async function writeUpgrades(pkg, upgrades) {
63
+ const data = JSON.parse(pkg.raw);
64
+ for (const upgrade of upgrades) {
65
+ if (upgrade.depType === 'packageManager') {
66
+ data.packageManager = `${upgrade.name}@${upgrade.target}`;
67
+ }
68
+ else {
69
+ const section = data[upgrade.depType];
70
+ if (section && upgrade.name in section) {
71
+ section[upgrade.name] = upgrade.target;
72
+ }
73
+ }
74
+ }
75
+ let output = JSON.stringify(data, null, pkg.indent);
76
+ // Restore original newline style
77
+ if (pkg.newline !== '\n') {
78
+ output = output.replace(/\n/g, pkg.newline);
79
+ }
80
+ // Preserve trailing newline if original had one
81
+ if (pkg.raw.endsWith('\n') || pkg.raw.endsWith('\r\n')) {
82
+ if (!output.endsWith('\n')) {
83
+ output += pkg.newline;
84
+ }
85
+ }
86
+ await writeFile(pkg.filePath, output, 'utf-8');
87
+ return output;
88
+ }
89
+ /** Find all package.json files matching glob patterns */
90
+ export async function findPackageFiles(pattern, cwd) {
91
+ if (pattern === './package.json' || !pattern.includes('*')) {
92
+ return [resolve(cwd, pattern)];
93
+ }
94
+ return new Promise((resolveP, reject) => {
95
+ const results = [];
96
+ glob(pattern, { cwd }, (err, matches) => {
97
+ if (err)
98
+ return reject(err);
99
+ for (const match of matches) {
100
+ results.push(resolve(cwd, match));
101
+ }
102
+ resolveP(results);
103
+ });
104
+ });
105
+ }
106
+ /** Find workspace package.json files */
107
+ export async function findWorkspacePackageFiles(options) {
108
+ const rootPkgPath = resolve(options.cwd, options.packageFile);
109
+ const rootPkg = await readPackageFile(rootPkgPath);
110
+ const files = [];
111
+ if (options.root) {
112
+ files.push(rootPkgPath);
113
+ }
114
+ const workspaces = rootPkg.data.workspaces;
115
+ if (Array.isArray(workspaces)) {
116
+ for (const pattern of workspaces) {
117
+ const pkgPattern = pattern.endsWith('/package.json')
118
+ ? pattern
119
+ : `${pattern}/package.json`;
120
+ const found = await findPackageFiles(pkgPattern, dirname(rootPkgPath));
121
+ files.push(...found);
122
+ }
123
+ }
124
+ // Filter to specific workspace names if --workspace is set
125
+ if (options.workspace && options.workspace.length > 0) {
126
+ const filtered = [];
127
+ for (const f of files) {
128
+ try {
129
+ const pkg = await readPackageFile(f);
130
+ if (options.workspace.includes(pkg.data.name) ||
131
+ options.workspace.some((w) => f.includes(w))) {
132
+ filtered.push(f);
133
+ }
134
+ }
135
+ catch {
136
+ // Skip unreadable package files
137
+ }
138
+ }
139
+ return filtered;
140
+ }
141
+ return files;
142
+ }
143
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../src/package.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAoB/C,MAAM,YAAY,GAA4B;IAC5C,IAAI,EAAE,cAAc;IACpB,GAAG,EAAE,iBAAiB;IACtB,QAAQ,EAAE,sBAAsB;IAChC,IAAI,EAAE,kBAAkB;IACxB,cAAc,EAAE,gBAAgB;CACjC,CAAC;AAEF,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;IAChD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IAExD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC3D,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAQ,GAAG,SAAS;IAChE,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;IAChD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IAExD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAClD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CACjC,GAAgB,EAChB,SAAiB;IAEjB,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEjE,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,IAAI,OAAO,KAAK,gBAAgB,EAAE,CAAC;YACjC,sDAAsD;YACtD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC;YACxC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACvC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACrC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACzC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;YACpE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACnD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAC1C,WAAqC,CACtC,EAAE,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAgB,EAChB,QAAyB;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAA4B,CAAC;IAE5D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;YACzC,IAAI,CAAC,cAAc,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAuC,CAAC;YAC5E,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;gBACvC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpD,iCAAiC;IACjC,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,gDAAgD;IAChD,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yDAAyD;AACzD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,GAAW;IAEX,IAAI,OAAO,KAAK,gBAAgB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YACtC,IAAI,GAAG;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACpC,CAAC;YACD,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAsB;IAEtB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,KAAK,MAAM,OAAO,IAAI,UAAsB,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAClD,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,GAAG,OAAO,eAAe,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,CAAC;gBACrC,IACE,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAc,CAAC;oBACnD,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC5C,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}