@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.
- package/dist/__tests__/migrate.test.d.ts +2 -0
- package/dist/__tests__/migrate.test.d.ts.map +1 -0
- package/dist/__tests__/migrate.test.js +116 -0
- package/dist/__tests__/migrate.test.js.map +1 -0
- package/dist/migrate.d.ts +40 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +335 -0
- package/dist/migrate.js.map +1 -0
- package/package.json +9 -5
|
@@ -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"}
|
package/dist/migrate.js
ADDED
|
@@ -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.
|
|
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.
|
|
23
|
+
"@package-broker/main": "^0.19.5"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@types/node": "^20.
|
|
26
|
-
"typescript": "^
|
|
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
|
}
|