Skip to content

Commit 9116ee3

Browse files
committed
working basic cli tool which can publish to a verdaccio powered fleetbase repository
0 parents  commit 9116ee3

4,076 files changed

Lines changed: 207747 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

index.js

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
#!/usr/bin/env node
2+
3+
const { program } = require('commander');
4+
const { exec } = require('child_process');
5+
const fs = require('fs-extra');
6+
const path = require('path');
7+
const packageJson = require('./package.json');
8+
9+
function publishPackage(packagePath, registry, options = {}) {
10+
if (typeof options.onBefore === 'function') {
11+
options.onBefore();
12+
}
13+
14+
const publishCommand = `npm publish ${packagePath} --registry ${registry}`;
15+
16+
exec(publishCommand, async (error, stdout, stderr) => {
17+
if (error) {
18+
console.error(`Error: ${error.message}`);
19+
return;
20+
}
21+
if (stderr) {
22+
console.error(`stderr: ${stderr}`);
23+
return;
24+
}
25+
console.log(`stdout: ${stdout}`);
26+
27+
if (typeof options.onAfter === 'function') {
28+
options.onAfter();
29+
}
30+
});
31+
}
32+
33+
function unpublishPackage(packageName, registry, options = {}) {
34+
if (typeof options.onBefore === 'function') {
35+
options.onBefore();
36+
}
37+
38+
const unpublishCommand = `npm unpublish ${packageName} --registry ${registry}`;
39+
40+
exec(unpublishCommand, (error, stdout, stderr) => {
41+
if (error) {
42+
console.error(`Error: ${error.message}`);
43+
return;
44+
}
45+
if (stderr) {
46+
console.error(`stderr: ${stderr}`);
47+
return;
48+
}
49+
console.log(`stdout: ${stdout}`);
50+
51+
if (typeof options.onAfter === 'function') {
52+
options.onAfter();
53+
}
54+
});
55+
}
56+
57+
async function getPackageNameFromCurrentDirectory() {
58+
const hasPackageJson = await fs.pathExists('package.json');
59+
const hasComposerJson = await fs.pathExists('composer.json');
60+
61+
if (hasPackageJson) {
62+
const packageJson = await fs.readJson('package.json');
63+
return packageJson.name;
64+
} else if (hasComposerJson) {
65+
const composerJson = await fs.readJson('composer.json');
66+
return composerJson.name;
67+
}
68+
69+
return null;
70+
}
71+
72+
async function createComposerJsonFromPackage(packagePath) {
73+
const composerJson = await fs.readJson(path.join(packagePath, 'composer.json'));
74+
const packageJson = convertComposerToPackage(composerJson);
75+
76+
await fs.writeJson(path.join(packagePath, 'package.json'), packageJson, { spaces: 4 });
77+
}
78+
79+
function convertComposerToPackage(composerJson) {
80+
let packageName = composerJson.name;
81+
82+
// Convert to scoped package name if it contains a slash
83+
if (packageName.includes('/')) {
84+
const parts = packageName.split('/');
85+
packageName = `@${parts[0]}/${parts[1]}`;
86+
}
87+
88+
const packageJson = {
89+
name: packageName,
90+
version: composerJson.version,
91+
description: composerJson.description,
92+
fleetbase: {
93+
'from-composer': true,
94+
},
95+
};
96+
97+
return packageJson;
98+
}
99+
100+
async function onBeforePublishComposer(packagePath) {
101+
console.log('Converting composer.json to package.json...');
102+
await createComposerJsonFromPackage(packagePath);
103+
}
104+
105+
function onAfterPublishComposer(packagePath) {
106+
console.log('Cleaning up generated package.json...');
107+
fs.removeSync(path.join(packagePath, 'package.json'));
108+
}
109+
110+
const defaultRegistry = 'http://localhost:4873';
111+
112+
program.name('flb').description('CLI tool for managing Fleetbase Extensions').version(`${packageJson.name} ${packageJson.version}`, '-v, --version', 'Output the current version');
113+
program.option('-r, --registry [url]', 'Specify a fleetbase extension repository', defaultRegistry);
114+
115+
program
116+
.command('publish [path]')
117+
.description('Publish a Fleetbase Extension')
118+
.action(async (packagePath = '.') => {
119+
const registry = program.opts().registry;
120+
console.log(`Using registry: ${registry}`);
121+
122+
const hasPackageJson = await fs.pathExists(path.join(packagePath, 'package.json'));
123+
const hasComposerJson = await fs.pathExists(path.join(packagePath, 'composer.json'));
124+
125+
if (hasPackageJson) {
126+
console.log('Publishing as an npm package...');
127+
publishPackage(packagePath, registry);
128+
} else if (hasComposerJson) {
129+
console.log('Publishing as a Composer package...');
130+
await createComposerJsonFromPackage(packagePath);
131+
publishPackage(packagePath, registry, {
132+
onBefore: () => onBeforePublishComposer(packagePath),
133+
onAfter: () => onAfterPublishComposer(packagePath),
134+
});
135+
} else {
136+
console.error('No package.json or composer.json found.');
137+
}
138+
});
139+
140+
program
141+
.command('unpublish [packageName]')
142+
.description('Unpublish a Fleetbase Extension')
143+
.action(async (packageName) => {
144+
const registry = program.opts().registry;
145+
console.log(`Using registry: ${registry}`);
146+
147+
if (!packageName) {
148+
packageName = await getPackageNameFromCurrentDirectory();
149+
if (!packageName) {
150+
console.error('Package name could not be determined.');
151+
return;
152+
}
153+
}
154+
155+
console.log(`Unpublishing package ${packageName}`);
156+
unpublishPackage(packageName, registry);
157+
});
158+
159+
program
160+
.command('version')
161+
.description('Output the version number')
162+
.action(() => {
163+
console.log(`${packageJson.name} ${packageJson.version}`);
164+
});
165+
166+
program.parse(process.argv);

0 commit comments

Comments
 (0)