@package-broker/cli 0.17.3 → 0.19.5

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=migrate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/migrate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { rewriteComposerJson, estimateSavings, discoverFromSatis, discoverFromPrivatePackagist, } from '../migrate';
3
+ const mockFetch = vi.fn();
4
+ vi.stubGlobal('fetch', mockFetch);
5
+ describe('rewriteComposerJson', () => {
6
+ it('should replace matching repository URL', () => {
7
+ const input = {
8
+ name: 'acme/app',
9
+ repositories: [
10
+ { type: 'composer', url: 'https://satis.example.com' },
11
+ { type: 'vcs', url: 'https://github.com/acme/lib' },
12
+ ],
13
+ };
14
+ const result = rewriteComposerJson(input, 'https://satis.example.com', 'https://broker.example.com');
15
+ expect(result.repositories).toEqual([
16
+ { type: 'composer', url: 'https://broker.example.com' },
17
+ { type: 'vcs', url: 'https://github.com/acme/lib' },
18
+ ]);
19
+ });
20
+ it('should handle trailing slashes', () => {
21
+ const input = {
22
+ repositories: [
23
+ { type: 'composer', url: 'https://satis.example.com/' },
24
+ ],
25
+ };
26
+ const result = rewriteComposerJson(input, 'https://satis.example.com', 'https://broker.example.com/');
27
+ expect(result.repositories[0].url).toBe('https://broker.example.com');
28
+ });
29
+ it('should be case insensitive for URL matching', () => {
30
+ const input = {
31
+ repositories: [
32
+ { type: 'composer', url: 'https://Satis.Example.COM' },
33
+ ],
34
+ };
35
+ const result = rewriteComposerJson(input, 'https://satis.example.com', 'https://broker.example.com');
36
+ expect(result.repositories[0].url).toBe('https://broker.example.com');
37
+ });
38
+ it('should not modify non-matching repositories', () => {
39
+ const input = {
40
+ repositories: [
41
+ { type: 'composer', url: 'https://other-registry.com' },
42
+ ],
43
+ };
44
+ const result = rewriteComposerJson(input, 'https://satis.example.com', 'https://broker.example.com');
45
+ expect(result.repositories[0].url).toBe('https://other-registry.com');
46
+ });
47
+ it('should handle missing repositories array', () => {
48
+ const input = { name: 'acme/app' };
49
+ const result = rewriteComposerJson(input, 'https://satis.example.com', 'https://broker.example.com');
50
+ expect(result.repositories).toBeUndefined();
51
+ });
52
+ });
53
+ describe('estimateSavings', () => {
54
+ it('should estimate Private Packagist costs by tier', () => {
55
+ expect(estimateSavings('packagist', 3).monthly_cost).toBe(0);
56
+ expect(estimateSavings('packagist', 8).monthly_cost).toBe(7);
57
+ expect(estimateSavings('packagist', 30).monthly_cost).toBe(35);
58
+ expect(estimateSavings('packagist', 100).monthly_cost).toBe(119);
59
+ expect(estimateSavings('packagist', 200).monthly_cost).toBe(299);
60
+ });
61
+ it('should estimate Satis hosting costs', () => {
62
+ const small = estimateSavings('satis', 20);
63
+ expect(small.monthly_cost).toBe(10);
64
+ const large = estimateSavings('satis', 100);
65
+ expect(large.monthly_cost).toBe(20);
66
+ });
67
+ it('should calculate annual savings', () => {
68
+ const result = estimateSavings('packagist', 100);
69
+ expect(result.annual_cost).toBe(result.monthly_cost * 12);
70
+ expect(result.annual_savings).toBe(result.annual_cost);
71
+ });
72
+ });
73
+ describe('discoverFromSatis', () => {
74
+ beforeEach(() => {
75
+ mockFetch.mockReset();
76
+ });
77
+ it('should discover packages from Satis packages.json', async () => {
78
+ mockFetch.mockResolvedValueOnce(new Response(JSON.stringify({
79
+ packages: {
80
+ 'acme/foo': { '1.0.0': {}, '2.0.0': {} },
81
+ 'acme/bar': { '1.0.0': {} },
82
+ },
83
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } }));
84
+ const packages = await discoverFromSatis('https://satis.example.com');
85
+ expect(packages).toHaveLength(2);
86
+ expect(packages[0]).toEqual({ name: 'acme/foo', versions: ['1.0.0', '2.0.0'] });
87
+ expect(packages[1]).toEqual({ name: 'acme/bar', versions: ['1.0.0'] });
88
+ });
89
+ it('should throw on HTTP error', async () => {
90
+ mockFetch.mockResolvedValueOnce(new Response('Not Found', { status: 404 }));
91
+ await expect(discoverFromSatis('https://satis.example.com')).rejects.toThrow('HTTP 404');
92
+ });
93
+ });
94
+ describe('discoverFromPrivatePackagist', () => {
95
+ beforeEach(() => {
96
+ mockFetch.mockReset();
97
+ });
98
+ it('should discover packages with authentication', async () => {
99
+ mockFetch.mockResolvedValueOnce(new Response(JSON.stringify({
100
+ packages: {
101
+ 'acme/premium': { '3.0.0': {} },
102
+ },
103
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } }));
104
+ const packages = await discoverFromPrivatePackagist('https://repo.packagist.com/acme', 'pp_token123');
105
+ expect(packages).toHaveLength(1);
106
+ expect(packages[0].name).toBe('acme/premium');
107
+ // Verify auth header was sent
108
+ const callHeaders = mockFetch.mock.calls[0][1]?.headers;
109
+ expect(callHeaders?.Authorization).toBe('Bearer pp_token123');
110
+ });
111
+ it('should throw on auth failure', async () => {
112
+ mockFetch.mockResolvedValueOnce(new Response('Unauthorized', { status: 401 }));
113
+ await expect(discoverFromPrivatePackagist('https://repo.packagist.com/acme', 'bad-token')).rejects.toThrow('Authentication failed');
114
+ });
115
+ });
116
+ //# sourceMappingURL=migrate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.test.js","sourceRoot":"","sources":["../../src/__tests__/migrate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ interface ComposerJson {
3
+ name?: string;
4
+ repositories?: ComposerRepository[];
5
+ require?: Record<string, string>;
6
+ 'require-dev'?: Record<string, string>;
7
+ [key: string]: unknown;
8
+ }
9
+ interface ComposerRepository {
10
+ type: string;
11
+ url: string;
12
+ options?: Record<string, unknown>;
13
+ [key: string]: unknown;
14
+ }
15
+ interface MigrateOptions {
16
+ from: 'satis' | 'packagist';
17
+ instance: string;
18
+ target: string;
19
+ token?: string;
20
+ dryRun: boolean;
21
+ composerJsonPath: string;
22
+ }
23
+ interface DiscoveredPackage {
24
+ name: string;
25
+ versions: string[];
26
+ }
27
+ declare function discoverFromSatis(url: string): Promise<DiscoveredPackage[]>;
28
+ declare function discoverFromPrivatePackagist(url: string, token?: string): Promise<DiscoveredPackage[]>;
29
+ declare function rewriteComposerJson(composerJson: ComposerJson, sourceUrl: string, targetUrl: string): ComposerJson;
30
+ interface SavingsEstimate {
31
+ source: string;
32
+ monthly_cost: number;
33
+ annual_cost: number;
34
+ annual_savings: number;
35
+ package_count: number;
36
+ }
37
+ declare function estimateSavings(source: 'satis' | 'packagist', packageCount: number): SavingsEstimate;
38
+ declare function parseArgs(args: string[]): MigrateOptions;
39
+ export { discoverFromSatis, discoverFromPrivatePackagist, rewriteComposerJson, estimateSavings, parseArgs, type MigrateOptions, type DiscoveredPackage, type SavingsEstimate, type ComposerJson, };
40
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":";AAkCA,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AASD,UAAU,cAAc;IACtB,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID,iBAAe,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwC1E;AAED,iBAAe,4BAA4B,CACzC,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAgC9B;AAID,iBAAS,mBAAmB,CAC1B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,YAAY,CAqBd;AAID,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,iBAAS,eAAe,CACtB,MAAM,EAAE,OAAO,GAAG,WAAW,EAC7B,YAAY,EAAE,MAAM,GACnB,eAAe,CA8BjB;AAID,iBAAS,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CA2DjD;AAsJD,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,CAAC"}
@@ -0,0 +1,335 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * PACKAGE.broker - Migration CLI
4
+ * Copyright (C) 2025 Łukasz Bajsarowicz
5
+ * Licensed under AGPL-3.0
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
8
+ import { join } from 'path';
9
+ // ─── CLI colors ──────────────────────────────────────────────────
10
+ const C = {
11
+ reset: '\x1b[0m',
12
+ bold: '\x1b[1m',
13
+ dim: '\x1b[2m',
14
+ green: '\x1b[32m',
15
+ blue: '\x1b[34m',
16
+ yellow: '\x1b[33m',
17
+ red: '\x1b[31m',
18
+ cyan: '\x1b[36m',
19
+ };
20
+ function log(msg, color = '') {
21
+ console.log(`${color}${msg}${C.reset}`);
22
+ }
23
+ function error(msg) {
24
+ log(`Error: ${msg}`, C.red);
25
+ }
26
+ // ─── Source discovery ────────────────────────────────────────────
27
+ async function discoverFromSatis(url) {
28
+ const packagesUrl = `${url.replace(/\/$/, '')}/packages.json`;
29
+ const response = await fetch(packagesUrl, {
30
+ headers: { Accept: 'application/json', 'User-Agent': 'PackageBroker-Migrate/1.0' },
31
+ });
32
+ if (!response.ok) {
33
+ throw new Error(`Failed to fetch ${packagesUrl}: HTTP ${response.status}`);
34
+ }
35
+ const data = (await response.json());
36
+ const packages = [];
37
+ // Handle direct packages format
38
+ for (const [name, versions] of Object.entries(data.packages || {})) {
39
+ packages.push({ name, versions: Object.keys(versions) });
40
+ }
41
+ // Handle provider-includes format (large Satis instances)
42
+ if (data.includes) {
43
+ for (const [includeUrl] of Object.entries(data.includes)) {
44
+ const resolvedUrl = `${url.replace(/\/$/, '')}/${includeUrl}`;
45
+ try {
46
+ const includeResponse = await fetch(resolvedUrl, {
47
+ headers: { Accept: 'application/json', 'User-Agent': 'PackageBroker-Migrate/1.0' },
48
+ });
49
+ if (includeResponse.ok) {
50
+ const includeData = (await includeResponse.json());
51
+ for (const [name, versions] of Object.entries(includeData.packages || {})) {
52
+ packages.push({ name, versions: Object.keys(versions) });
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // Skip failed include files
58
+ }
59
+ }
60
+ }
61
+ return packages;
62
+ }
63
+ async function discoverFromPrivatePackagist(url, token) {
64
+ const packagesUrl = `${url.replace(/\/$/, '')}/packages.json`;
65
+ const headers = {
66
+ Accept: 'application/json',
67
+ 'User-Agent': 'PackageBroker-Migrate/1.0',
68
+ };
69
+ if (token) {
70
+ headers['Authorization'] = `Bearer ${token}`;
71
+ }
72
+ const response = await fetch(packagesUrl, { headers });
73
+ if (response.status === 401 || response.status === 403) {
74
+ throw new Error('Authentication failed. Use --token to provide your Private Packagist token.');
75
+ }
76
+ if (!response.ok) {
77
+ throw new Error(`Failed to fetch ${packagesUrl}: HTTP ${response.status}`);
78
+ }
79
+ const data = (await response.json());
80
+ const packages = [];
81
+ for (const [name, versions] of Object.entries(data.packages || {})) {
82
+ packages.push({ name, versions: Object.keys(versions) });
83
+ }
84
+ return packages;
85
+ }
86
+ // ─── composer.json rewriter ──────────────────────────────────────
87
+ function rewriteComposerJson(composerJson, sourceUrl, targetUrl) {
88
+ const updated = { ...composerJson };
89
+ if (!updated.repositories)
90
+ return updated;
91
+ const normalizedSource = sourceUrl.replace(/\/$/, '').toLowerCase();
92
+ updated.repositories = updated.repositories.map((repo) => {
93
+ const normalizedRepoUrl = (repo.url || '').replace(/\/$/, '').toLowerCase();
94
+ if (normalizedRepoUrl === normalizedSource) {
95
+ return {
96
+ type: 'composer',
97
+ url: targetUrl.replace(/\/$/, ''),
98
+ };
99
+ }
100
+ return repo;
101
+ });
102
+ return updated;
103
+ }
104
+ function estimateSavings(source, packageCount) {
105
+ // Private Packagist pricing (as of 2025):
106
+ // - Free: 5 packages, 1 user
107
+ // - Personal: $7/mo — 10 packages
108
+ // - Small: $35/mo — 50 packages
109
+ // - Medium: $119/mo — 150 packages
110
+ // - Large: $299/mo — unlimited
111
+ // - Organization: $399/mo+ — team features
112
+ let monthlyEstimate = 0;
113
+ if (source === 'packagist') {
114
+ if (packageCount <= 5)
115
+ monthlyEstimate = 0;
116
+ else if (packageCount <= 10)
117
+ monthlyEstimate = 7;
118
+ else if (packageCount <= 50)
119
+ monthlyEstimate = 35;
120
+ else if (packageCount <= 150)
121
+ monthlyEstimate = 119;
122
+ else
123
+ monthlyEstimate = 299;
124
+ }
125
+ else {
126
+ // Satis is free but requires hosting
127
+ // Estimate server costs
128
+ monthlyEstimate = packageCount > 50 ? 20 : 10;
129
+ }
130
+ return {
131
+ source: source === 'packagist' ? 'Private Packagist' : 'Satis (hosting costs)',
132
+ monthly_cost: monthlyEstimate,
133
+ annual_cost: monthlyEstimate * 12,
134
+ annual_savings: monthlyEstimate * 12,
135
+ package_count: packageCount,
136
+ };
137
+ }
138
+ // ─── CLI argument parsing ────────────────────────────────────────
139
+ function parseArgs(args) {
140
+ let from = 'satis';
141
+ let instance = '';
142
+ let target = '';
143
+ let token;
144
+ let dryRun = false;
145
+ let composerJsonPath = join(process.cwd(), 'composer.json');
146
+ for (let i = 0; i < args.length; i++) {
147
+ switch (args[i]) {
148
+ case '--from':
149
+ from = args[++i];
150
+ if (from !== 'satis' && from !== 'packagist') {
151
+ error(`Invalid source: ${from}. Use "satis" or "packagist".`);
152
+ process.exit(1);
153
+ }
154
+ break;
155
+ case '--instance':
156
+ instance = args[++i];
157
+ break;
158
+ case '--target':
159
+ target = args[++i];
160
+ break;
161
+ case '--token':
162
+ token = args[++i];
163
+ break;
164
+ case '--dry-run':
165
+ dryRun = true;
166
+ break;
167
+ case '--composer-json':
168
+ composerJsonPath = args[++i];
169
+ break;
170
+ case '--help':
171
+ case '-h':
172
+ printHelp();
173
+ process.exit(0);
174
+ break;
175
+ default:
176
+ if (args[i].startsWith('--')) {
177
+ error(`Unknown option: ${args[i]}`);
178
+ printHelp();
179
+ process.exit(1);
180
+ }
181
+ }
182
+ }
183
+ if (!instance) {
184
+ error('Missing required --instance flag.');
185
+ printHelp();
186
+ process.exit(1);
187
+ }
188
+ if (!target) {
189
+ error('Missing required --target flag.');
190
+ printHelp();
191
+ process.exit(1);
192
+ }
193
+ return { from, instance, target, token, dryRun, composerJsonPath };
194
+ }
195
+ function printHelp() {
196
+ log('');
197
+ log('PACKAGE.broker Migration CLI', C.bold);
198
+ log('');
199
+ log('Migrate from Satis or Private Packagist to PACKAGE.broker', C.dim);
200
+ log('');
201
+ log('Usage:', C.bold);
202
+ log(' npx @package-broker/cli migrate --from <source> --instance <url> --target <url>');
203
+ log('');
204
+ log('Options:', C.bold);
205
+ log(' --from <source> Source type: "satis" or "packagist" (default: satis)');
206
+ log(' --instance <url> URL of the source registry to migrate from');
207
+ log(' --target <url> URL of your PACKAGE.broker instance');
208
+ log(' --token <token> Authentication token (required for Private Packagist)');
209
+ log(' --dry-run Show what would be done without making changes');
210
+ log(' --composer-json <path> Path to composer.json (default: ./composer.json)');
211
+ log(' --help, -h Show this help message');
212
+ log('');
213
+ log('Examples:', C.bold);
214
+ log(' npx @package-broker/cli migrate \\');
215
+ log(' --from satis \\');
216
+ log(' --instance https://packages.example.com \\');
217
+ log(' --target https://broker.example.com');
218
+ log('');
219
+ log(' npx @package-broker/cli migrate \\');
220
+ log(' --from packagist \\');
221
+ log(' --instance https://repo.packagist.com/acme \\');
222
+ log(' --target https://broker.example.com \\');
223
+ log(' --token pp_xxxxxxxxxxxx \\');
224
+ log(' --dry-run');
225
+ log('');
226
+ }
227
+ // ─── Main ────────────────────────────────────────────────────────
228
+ async function main() {
229
+ const args = process.argv.slice(2);
230
+ // Remove the "migrate" subcommand if present
231
+ const filteredArgs = args[0] === 'migrate' ? args.slice(1) : args;
232
+ if (filteredArgs.length === 0 || filteredArgs.includes('--help') || filteredArgs.includes('-h')) {
233
+ printHelp();
234
+ process.exit(0);
235
+ }
236
+ const options = parseArgs(filteredArgs);
237
+ log('');
238
+ log(' PACKAGE.broker Migration', C.bold);
239
+ log(` ${C.dim}Migrating from ${options.from} to PACKAGE.broker${C.reset}`);
240
+ log('');
241
+ // Step 1: Read composer.json
242
+ if (!existsSync(options.composerJsonPath)) {
243
+ error(`composer.json not found at: ${options.composerJsonPath}`);
244
+ process.exit(1);
245
+ }
246
+ const composerJsonRaw = readFileSync(options.composerJsonPath, 'utf-8');
247
+ let composerJson;
248
+ try {
249
+ composerJson = JSON.parse(composerJsonRaw);
250
+ }
251
+ catch {
252
+ error('Invalid JSON in composer.json');
253
+ process.exit(1);
254
+ }
255
+ log(` ${C.green}✓${C.reset} Read composer.json (${composerJson.name || 'unnamed project'})`);
256
+ // Step 2: Discover packages from source
257
+ log(` ${C.cyan}→${C.reset} Discovering packages from ${options.instance}...`);
258
+ let packages;
259
+ try {
260
+ if (options.from === 'packagist') {
261
+ packages = await discoverFromPrivatePackagist(options.instance, options.token);
262
+ }
263
+ else {
264
+ packages = await discoverFromSatis(options.instance);
265
+ }
266
+ }
267
+ catch (err) {
268
+ error(err instanceof Error ? err.message : String(err));
269
+ process.exit(1);
270
+ }
271
+ if (packages.length === 0) {
272
+ log(` ${C.yellow}⚠${C.reset} No packages found at ${options.instance}`);
273
+ process.exit(0);
274
+ }
275
+ const totalVersions = packages.reduce((sum, p) => sum + p.versions.length, 0);
276
+ log(` ${C.green}✓${C.reset} Found ${C.bold}${packages.length}${C.reset} packages (${totalVersions} versions)`);
277
+ // Step 3: Show what will be migrated
278
+ log('');
279
+ log(' Packages to migrate:', C.bold);
280
+ for (const pkg of packages.slice(0, 20)) {
281
+ log(` ${C.dim}•${C.reset} ${pkg.name} (${pkg.versions.length} versions)`);
282
+ }
283
+ if (packages.length > 20) {
284
+ log(` ${C.dim}... and ${packages.length - 20} more${C.reset}`);
285
+ }
286
+ log('');
287
+ // Step 4: Rewrite composer.json
288
+ const updatedComposerJson = rewriteComposerJson(composerJson, options.instance, options.target);
289
+ if (options.dryRun) {
290
+ log(' [DRY RUN] Would rewrite composer.json repositories:', C.yellow);
291
+ const repos = updatedComposerJson.repositories || [];
292
+ for (const repo of repos) {
293
+ log(` ${C.dim}•${C.reset} ${repo.type}: ${repo.url}`);
294
+ }
295
+ log('');
296
+ }
297
+ else {
298
+ // Write updated composer.json with proper formatting
299
+ const updatedJson = JSON.stringify(updatedComposerJson, null, 4) + '\n';
300
+ writeFileSync(options.composerJsonPath, updatedJson, 'utf-8');
301
+ log(` ${C.green}✓${C.reset} Updated composer.json — repository URL changed to ${options.target}`);
302
+ }
303
+ // Step 5: Savings estimate
304
+ const savings = estimateSavings(options.from, packages.length);
305
+ log('');
306
+ log(' ─────────────────────────────────────', C.dim);
307
+ log('');
308
+ log(` ${C.bold}💰 Estimated savings${C.reset}`);
309
+ log(` Source: ${savings.source}`);
310
+ log(` Previous cost: ${C.yellow}$${savings.monthly_cost}/month${C.reset} ($${savings.annual_cost}/year)`);
311
+ log(` PACKAGE.broker: ${C.green}$0/month${C.reset} (self-hosted)`);
312
+ log(` ${C.bold}${C.green}You save $${savings.annual_savings}/year${C.reset}`);
313
+ log('');
314
+ if (options.dryRun) {
315
+ log(` ${C.yellow}[DRY RUN]${C.reset} No changes were made. Remove --dry-run to apply.`);
316
+ }
317
+ else {
318
+ log(` ${C.bold}Next steps:${C.reset}`);
319
+ log(` 1. Run ${C.cyan}composer update${C.reset} to verify the migration`);
320
+ log(` 2. Commit the updated composer.json and composer.lock`);
321
+ }
322
+ log('');
323
+ }
324
+ export { discoverFromSatis, discoverFromPrivatePackagist, rewriteComposerJson, estimateSavings, parseArgs, };
325
+ // Only run main() when executed directly (not when imported by tests)
326
+ const isDirectExecution = typeof process !== 'undefined' &&
327
+ process.argv[1] &&
328
+ (process.argv[1].endsWith('migrate.js') || process.argv[1].endsWith('migrate.ts'));
329
+ if (isDirectExecution) {
330
+ main().catch((err) => {
331
+ error(err instanceof Error ? err.message : String(err));
332
+ process.exit(1);
333
+ });
334
+ }
335
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@package-broker/cli",
3
- "version": "0.17.3",
3
+ "version": "0.19.5",
4
4
  "description": "CLI tool to initialize PACKAGE.broker configuration",
5
5
  "type": "module",
6
6
  "bin": {
7
- "package-broker": "./dist/index.js"
7
+ "package-broker": "./dist/index.js",
8
+ "package-broker-migrate": "./dist/migrate.js"
8
9
  },
9
10
  "files": [
10
11
  "dist",
@@ -19,11 +20,11 @@
19
20
  "prepublishOnly": "npm run clean && npm run build"
20
21
  },
21
22
  "dependencies": {
22
- "@package-broker/main": "^0.13.0"
23
+ "@package-broker/main": "^0.19.5"
23
24
  },
24
25
  "devDependencies": {
25
- "@types/node": "^20.19.27",
26
- "typescript": "^5.9.3"
26
+ "@types/node": "^22.20.0",
27
+ "typescript": "^6.0.3"
27
28
  },
28
29
  "repository": {
29
30
  "type": "git",
@@ -32,5 +33,8 @@
32
33
  },
33
34
  "publishConfig": {
34
35
  "access": "public"
36
+ },
37
+ "engines": {
38
+ "node": ">=22.0.0"
35
39
  }
36
40
  }