@jezweb/jezpress-cli 1.6.1 → 1.8.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.
- package/dist/cli.js +15 -1003
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +135 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +107 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/auth.d.ts +7 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +56 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/docs.d.ts +7 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +41 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/plugins.d.ts +7 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +468 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/sites/bulk.d.ts +7 -0
- package/dist/commands/sites/bulk.d.ts.map +1 -0
- package/dist/commands/sites/bulk.js +80 -0
- package/dist/commands/sites/bulk.js.map +1 -0
- package/dist/commands/sites/export.d.ts +7 -0
- package/dist/commands/sites/export.d.ts.map +1 -0
- package/dist/commands/sites/export.js +85 -0
- package/dist/commands/sites/export.js.map +1 -0
- package/dist/commands/sites/index.d.ts +7 -0
- package/dist/commands/sites/index.d.ts.map +1 -0
- package/dist/commands/sites/index.js +406 -0
- package/dist/commands/sites/index.js.map +1 -0
- package/dist/flare/detect.d.ts +18 -0
- package/dist/flare/detect.d.ts.map +1 -0
- package/dist/flare/detect.js +130 -0
- package/dist/flare/detect.js.map +1 -0
- package/dist/flare/html-to-content.d.ts +21 -0
- package/dist/flare/html-to-content.d.ts.map +1 -0
- package/dist/flare/html-to-content.js +233 -0
- package/dist/flare/html-to-content.js.map +1 -0
- package/dist/flare/index.d.ts +62 -0
- package/dist/flare/index.d.ts.map +1 -0
- package/dist/flare/index.js +566 -0
- package/dist/flare/index.js.map +1 -0
- package/dist/flare/types.d.ts +171 -0
- package/dist/flare/types.d.ts.map +1 -0
- package/dist/flare/types.js +6 -0
- package/dist/flare/types.js.map +1 -0
- package/dist/utils/plugin-headers.d.ts +14 -0
- package/dist/utils/plugin-headers.d.ts.map +1 -0
- package/dist/utils/plugin-headers.js +52 -0
- package/dist/utils/plugin-headers.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { existsSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import AdmZip from 'adm-zip';
|
|
3
|
+
import * as api from '../client.js';
|
|
4
|
+
import { extractPluginHeaders } from '../utils/plugin-headers.js';
|
|
5
|
+
export function registerPluginCommands(program) {
|
|
6
|
+
const plugins = program
|
|
7
|
+
.command('plugins')
|
|
8
|
+
.description('Manage plugins');
|
|
9
|
+
plugins
|
|
10
|
+
.command('list')
|
|
11
|
+
.description('List all plugins')
|
|
12
|
+
.option('--mine', 'Only show plugins you own')
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
try {
|
|
15
|
+
const pluginsList = await api.listPlugins();
|
|
16
|
+
let filtered = pluginsList;
|
|
17
|
+
if (options.mine) {
|
|
18
|
+
filtered = pluginsList.filter((p) => p.is_owner);
|
|
19
|
+
}
|
|
20
|
+
console.log(`\nPlugins (${filtered.length}):\n`);
|
|
21
|
+
if (filtered.length === 0) {
|
|
22
|
+
console.log(' (none)');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
filtered.forEach((p) => {
|
|
26
|
+
const ownerMark = p.is_owner ? ' (yours)' : '';
|
|
27
|
+
console.log(` ${p.slug} v${p.current_version}${ownerMark}`);
|
|
28
|
+
console.log(` Name: ${p.name}`);
|
|
29
|
+
console.log(` Updated: ${p.last_updated}`);
|
|
30
|
+
console.log('');
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error('Error:', error.message);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
plugins
|
|
39
|
+
.command('get <slug>')
|
|
40
|
+
.description('Get plugin details')
|
|
41
|
+
.action(async (slug) => {
|
|
42
|
+
try {
|
|
43
|
+
const data = await api.getPlugin(slug);
|
|
44
|
+
const p = data.plugin;
|
|
45
|
+
console.log(`\n${p.name} (${p.slug})\n`);
|
|
46
|
+
console.log(`Version: ${p.current_version}`);
|
|
47
|
+
console.log(`Type: ${p.type}`);
|
|
48
|
+
console.log(`Author: ${p.author}`);
|
|
49
|
+
console.log(`Requires PHP: ${p.requires_php}`);
|
|
50
|
+
console.log(`Requires WP: ${p.requires_wp}`);
|
|
51
|
+
console.log(`Tested WP: ${p.tested_wp}`);
|
|
52
|
+
console.log(`License required: ${p.requires_license ? 'Yes' : 'No'}`);
|
|
53
|
+
console.log(`Last updated: ${p.last_updated}`);
|
|
54
|
+
console.log(`Owner: ${p.owner_email || 'unassigned'}`);
|
|
55
|
+
console.log(`You own this: ${p.is_owner ? 'Yes' : 'No'}`);
|
|
56
|
+
console.log(`\nAvailable versions: ${data.available_versions.join(', ') || 'none'}`);
|
|
57
|
+
console.log(`Total downloads: ${data.download_stats?.total || 0}`);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error('Error:', error.message);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
plugins
|
|
65
|
+
.command('create <slug>')
|
|
66
|
+
.description('Create a new plugin (you become the owner)')
|
|
67
|
+
.requiredOption('--name <name>', 'Plugin display name')
|
|
68
|
+
.option('-v, --ver <version>', 'Initial version', '1.0.0')
|
|
69
|
+
.option('--type <type>', 'Type: plugin or theme', 'plugin')
|
|
70
|
+
.option('--no-license', 'Plugin does not require license')
|
|
71
|
+
.option('--author <author>', 'Author name', 'Jezweb')
|
|
72
|
+
.action(async (slug, options) => {
|
|
73
|
+
try {
|
|
74
|
+
const plugin = await api.createPlugin({
|
|
75
|
+
slug,
|
|
76
|
+
name: options.name,
|
|
77
|
+
version: options.ver,
|
|
78
|
+
type: options.type,
|
|
79
|
+
requiresLicense: options.license !== false,
|
|
80
|
+
author: options.author,
|
|
81
|
+
});
|
|
82
|
+
console.log(`\nPlugin created: ${plugin.slug}`);
|
|
83
|
+
console.log(`Name: ${plugin.name}`);
|
|
84
|
+
console.log(`Version: ${plugin.current_version}`);
|
|
85
|
+
console.log(`Owner: ${plugin.owner_email}`);
|
|
86
|
+
console.log('\nNext: Upload a version with `jezpress plugins upload`');
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.error('Error:', error.message);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
plugins
|
|
94
|
+
.command('update <slug>')
|
|
95
|
+
.description('Update plugin metadata (owner only)')
|
|
96
|
+
.option('--name <name>', 'Update display name')
|
|
97
|
+
.option('--tested-wp <version>', 'Update tested WP version')
|
|
98
|
+
.option('--requires-wp <version>', 'Update minimum WP version')
|
|
99
|
+
.option('--requires-php <version>', 'Update minimum PHP version')
|
|
100
|
+
.action(async (slug, options) => {
|
|
101
|
+
try {
|
|
102
|
+
const updates = {};
|
|
103
|
+
if (options.name)
|
|
104
|
+
updates.name = options.name;
|
|
105
|
+
if (options.testedWp)
|
|
106
|
+
updates.tested_wp = options.testedWp;
|
|
107
|
+
if (options.requiresWp)
|
|
108
|
+
updates.requires_wp = options.requiresWp;
|
|
109
|
+
if (options.requiresPhp)
|
|
110
|
+
updates.requires_php = options.requiresPhp;
|
|
111
|
+
if (Object.keys(updates).length === 0) {
|
|
112
|
+
console.error('No updates provided. Use --name, --tested-wp, etc.');
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
const plugin = await api.updatePlugin(slug, updates);
|
|
116
|
+
console.log(`\nPlugin updated: ${plugin.slug}`);
|
|
117
|
+
console.log(`Name: ${plugin.name}`);
|
|
118
|
+
console.log(`Tested WP: ${plugin.tested_wp}`);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('Error:', error.message);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
plugins
|
|
126
|
+
.command('upload <slug> <zipFile>')
|
|
127
|
+
.description('Upload a new plugin version (owner only)')
|
|
128
|
+
.option('-v, --ver <version>', 'Version number (auto-detected from ZIP if omitted)')
|
|
129
|
+
.option('--sync-metadata', 'Update plugin metadata (requires_php, requires_wp, tested_wp) from ZIP headers')
|
|
130
|
+
.action(async (slug, zipFile, options) => {
|
|
131
|
+
if (!existsSync(zipFile)) {
|
|
132
|
+
console.error(`File not found: ${zipFile}`);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const headers = extractPluginHeaders(zipFile, slug);
|
|
137
|
+
if (!headers) {
|
|
138
|
+
console.error(`Could not find main plugin file in ZIP. Expected ${slug}/${slug}.php`);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
let version = options.ver;
|
|
142
|
+
if (!version) {
|
|
143
|
+
if (!headers.version) {
|
|
144
|
+
console.error('Could not extract version from plugin header. Use -v to specify manually.');
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
version = headers.version;
|
|
148
|
+
console.log(`Auto-detected version: ${version}`);
|
|
149
|
+
}
|
|
150
|
+
console.log(`Uploading ${zipFile} as version ${version}...`);
|
|
151
|
+
const result = await api.uploadVersion(slug, version, zipFile);
|
|
152
|
+
console.log(`\n${result.message}`);
|
|
153
|
+
console.log(`Size: ${(result.size_bytes / 1024).toFixed(1)} KB`);
|
|
154
|
+
if (options.syncMetadata) {
|
|
155
|
+
const updates = {};
|
|
156
|
+
let hasUpdates = false;
|
|
157
|
+
if (headers.requires_php) {
|
|
158
|
+
updates.requires_php = headers.requires_php;
|
|
159
|
+
hasUpdates = true;
|
|
160
|
+
}
|
|
161
|
+
if (headers.requires_wp) {
|
|
162
|
+
updates.requires_wp = headers.requires_wp;
|
|
163
|
+
hasUpdates = true;
|
|
164
|
+
}
|
|
165
|
+
if (headers.tested_wp) {
|
|
166
|
+
updates.tested_wp = headers.tested_wp;
|
|
167
|
+
hasUpdates = true;
|
|
168
|
+
}
|
|
169
|
+
if (hasUpdates) {
|
|
170
|
+
console.log('\nSyncing metadata from plugin headers...');
|
|
171
|
+
const plugin = await api.updatePlugin(slug, updates);
|
|
172
|
+
console.log(` Requires PHP: ${plugin.requires_php}`);
|
|
173
|
+
console.log(` Requires WP: ${plugin.requires_wp}`);
|
|
174
|
+
console.log(` Tested WP: ${plugin.tested_wp}`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.log('\nNo metadata headers found in plugin file to sync.');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.error('Error:', error.message);
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
plugins
|
|
187
|
+
.command('preflight <slug> <zipFile>')
|
|
188
|
+
.description('Validate plugin ZIP before uploading')
|
|
189
|
+
.action(async (slug, zipFile) => {
|
|
190
|
+
if (!existsSync(zipFile)) {
|
|
191
|
+
console.error(`File not found: ${zipFile}`);
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
console.log(`\nValidating ${zipFile} for plugin "${slug}"...\n`);
|
|
195
|
+
const issues = [];
|
|
196
|
+
const warnings = [];
|
|
197
|
+
const info = [];
|
|
198
|
+
let zip;
|
|
199
|
+
try {
|
|
200
|
+
zip = new AdmZip(zipFile);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
console.error('FAILED: Not a valid ZIP file');
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
const entries = zip.getEntries();
|
|
207
|
+
const entryNames = entries.map((e) => e.entryName);
|
|
208
|
+
const zipStats = statSync(zipFile);
|
|
209
|
+
info.push(`ZIP file size: ${(zipStats.size / 1024).toFixed(1)} KB`);
|
|
210
|
+
info.push(`Files in ZIP: ${entries.length}`);
|
|
211
|
+
const mainFilePath1 = `${slug}/${slug}.php`;
|
|
212
|
+
const mainFilePath2 = `${slug}.php`;
|
|
213
|
+
const mainFileEntry = entries.find((e) => e.entryName.toLowerCase() === mainFilePath1.toLowerCase() ||
|
|
214
|
+
e.entryName.toLowerCase() === mainFilePath2.toLowerCase());
|
|
215
|
+
if (!mainFileEntry) {
|
|
216
|
+
issues.push(`Missing main plugin file: expected ${mainFilePath1} or ${mainFilePath2}`);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
info.push(`Main plugin file: ${mainFileEntry.entryName}`);
|
|
220
|
+
const mainFileContent = mainFileEntry.getData().toString('utf-8');
|
|
221
|
+
const pluginNameMatch = mainFileContent.match(/Plugin Name:\s*(.+)/i);
|
|
222
|
+
const versionMatch = mainFileContent.match(/Version:\s*(\d+\.\d+(\.\d+)?)/i);
|
|
223
|
+
const authorMatch = mainFileContent.match(/Author:\s*(.+)/i);
|
|
224
|
+
const requiresWPMatch = mainFileContent.match(/Requires at least:\s*(\d+\.\d+)/i);
|
|
225
|
+
const requiresPHPMatch = mainFileContent.match(/Requires PHP:\s*(\d+\.\d+)/i);
|
|
226
|
+
const testedWPMatch = mainFileContent.match(/Tested up to:\s*(\d+\.\d+)/i);
|
|
227
|
+
if (!pluginNameMatch) {
|
|
228
|
+
issues.push("Missing 'Plugin Name' header in main plugin file");
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
info.push(`Plugin Name: ${pluginNameMatch[1].trim()}`);
|
|
232
|
+
}
|
|
233
|
+
if (!versionMatch) {
|
|
234
|
+
issues.push("Missing 'Version' header in main plugin file");
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
info.push(`Version: ${versionMatch[1]}`);
|
|
238
|
+
}
|
|
239
|
+
if (!authorMatch)
|
|
240
|
+
warnings.push("Missing 'Author' header (recommended)");
|
|
241
|
+
if (!requiresWPMatch)
|
|
242
|
+
warnings.push("Missing 'Requires at least' header (recommended)");
|
|
243
|
+
if (!requiresPHPMatch)
|
|
244
|
+
warnings.push("Missing 'Requires PHP' header (recommended)");
|
|
245
|
+
if (!testedWPMatch)
|
|
246
|
+
warnings.push("Missing 'Tested up to' header (recommended)");
|
|
247
|
+
// Security checks on PHP files
|
|
248
|
+
const phpEntries = entries.filter((e) => e.entryName.toLowerCase().endsWith('.php'));
|
|
249
|
+
let hasDynamicCode = false;
|
|
250
|
+
let hasBase64 = false;
|
|
251
|
+
let hasShellExec = false;
|
|
252
|
+
for (const entry of phpEntries) {
|
|
253
|
+
const content = entry.getData().toString('utf-8');
|
|
254
|
+
// Check for dynamic code execution (e-v-a-l pattern)
|
|
255
|
+
if (/\b[e]val\s*\(/i.test(content))
|
|
256
|
+
hasDynamicCode = true;
|
|
257
|
+
if (/\bbase64_decode\s*\(/i.test(content))
|
|
258
|
+
hasBase64 = true;
|
|
259
|
+
if (/\b(shell_exec|exec)\s*\(/i.test(content))
|
|
260
|
+
hasShellExec = true;
|
|
261
|
+
}
|
|
262
|
+
if (hasDynamicCode)
|
|
263
|
+
warnings.push('Uses dynamic code execution - ensure this is intentional and safe');
|
|
264
|
+
if (hasBase64)
|
|
265
|
+
warnings.push('Uses base64_decode() - ensure this is intentional and safe');
|
|
266
|
+
if (hasShellExec)
|
|
267
|
+
warnings.push('Uses shell_exec/exec - ensure this is intentional and safe');
|
|
268
|
+
}
|
|
269
|
+
const readmePath = `${slug}/readme.txt`;
|
|
270
|
+
const hasReadme = entryNames.some((name) => name.toLowerCase() === readmePath.toLowerCase());
|
|
271
|
+
if (!hasReadme) {
|
|
272
|
+
warnings.push('Missing readme.txt (recommended for update server)');
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
info.push('readme.txt found');
|
|
276
|
+
}
|
|
277
|
+
const hasCorrectFolder = entryNames.some((name) => name.toLowerCase().startsWith(`${slug.toLowerCase()}/`));
|
|
278
|
+
if (!hasCorrectFolder) {
|
|
279
|
+
issues.push(`ZIP should contain a "${slug}/" folder with all plugin files`);
|
|
280
|
+
}
|
|
281
|
+
console.log('INFO:');
|
|
282
|
+
info.forEach((i) => console.log(` + ${i}`));
|
|
283
|
+
console.log('');
|
|
284
|
+
if (warnings.length > 0) {
|
|
285
|
+
console.log('WARNINGS:');
|
|
286
|
+
warnings.forEach((w) => console.log(` ! ${w}`));
|
|
287
|
+
console.log('');
|
|
288
|
+
}
|
|
289
|
+
if (issues.length > 0) {
|
|
290
|
+
console.log('ISSUES:');
|
|
291
|
+
issues.forEach((i) => console.log(` x ${i}`));
|
|
292
|
+
console.log('');
|
|
293
|
+
console.log(`FAILED: ${issues.length} issue(s) found`);
|
|
294
|
+
process.exit(1);
|
|
295
|
+
}
|
|
296
|
+
console.log(`PASSED: Plugin "${slug}" is ready for upload${warnings.length > 0 ? ` (with ${warnings.length} warning(s))` : ''}`);
|
|
297
|
+
});
|
|
298
|
+
plugins
|
|
299
|
+
.command('versions <slug>')
|
|
300
|
+
.description('List all versions of a plugin')
|
|
301
|
+
.action(async (slug) => {
|
|
302
|
+
try {
|
|
303
|
+
const data = await api.listVersions(slug);
|
|
304
|
+
console.log(`\nVersions for ${data.name} (${data.slug}):`);
|
|
305
|
+
console.log(`Current version: ${data.current_version}`);
|
|
306
|
+
console.log(`Total downloads: ${data.total_downloads}`);
|
|
307
|
+
console.log(`You own this: ${data.is_owner ? 'Yes' : 'No'}\n`);
|
|
308
|
+
if (data.versions.length === 0) {
|
|
309
|
+
console.log(' (no versions)');
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
data.versions.forEach((v) => {
|
|
313
|
+
const isCurrent = v.version === data.current_version ? ' (current)' : '';
|
|
314
|
+
console.log(` v${v.version}${isCurrent}`);
|
|
315
|
+
console.log(` Released: ${v.release_date}`);
|
|
316
|
+
console.log(` Downloads: ${v.downloads}`);
|
|
317
|
+
if (v.changelog) {
|
|
318
|
+
console.log(` Changelog: ${v.changelog.slice(0, 60)}${v.changelog.length > 60 ? '...' : ''}`);
|
|
319
|
+
}
|
|
320
|
+
console.log('');
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
console.error('Error:', error.message);
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
plugins
|
|
329
|
+
.command('stats <slug>')
|
|
330
|
+
.description('View download statistics for a plugin')
|
|
331
|
+
.action(async (slug) => {
|
|
332
|
+
try {
|
|
333
|
+
const data = await api.getStats(slug);
|
|
334
|
+
console.log(`\nStatistics for ${data.name} (${data.slug}):\n`);
|
|
335
|
+
console.log(` Total downloads: ${data.total_downloads}`);
|
|
336
|
+
console.log(` Version count: ${data.version_count}`);
|
|
337
|
+
console.log(` Current version: ${data.current_version}`);
|
|
338
|
+
console.log(` Last updated: ${data.last_updated}`);
|
|
339
|
+
const byVersion = Object.entries(data.by_version);
|
|
340
|
+
if (byVersion.length > 0) {
|
|
341
|
+
console.log(`\n Downloads by version:`);
|
|
342
|
+
byVersion.sort((a, b) => {
|
|
343
|
+
const aParts = a[0].split('.').map(Number);
|
|
344
|
+
const bParts = b[0].split('.').map(Number);
|
|
345
|
+
for (let i = 0; i < 3; i++) {
|
|
346
|
+
if ((bParts[i] || 0) !== (aParts[i] || 0)) {
|
|
347
|
+
return (bParts[i] || 0) - (aParts[i] || 0);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return 0;
|
|
351
|
+
});
|
|
352
|
+
byVersion.forEach(([version, count]) => {
|
|
353
|
+
console.log(` v${version}: ${count}`);
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
console.error('Error:', error.message);
|
|
359
|
+
process.exit(1);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
plugins
|
|
363
|
+
.command('download <slug> <version>')
|
|
364
|
+
.description('Download a plugin version ZIP (owner only)')
|
|
365
|
+
.option('-o, --output <path>', 'Output file path')
|
|
366
|
+
.action(async (slug, version, options) => {
|
|
367
|
+
try {
|
|
368
|
+
console.log(`Downloading ${slug} v${version}...`);
|
|
369
|
+
const result = await api.downloadVersion(slug, version);
|
|
370
|
+
const outputPath = options.output || result.filename;
|
|
371
|
+
writeFileSync(outputPath, Buffer.from(result.data));
|
|
372
|
+
console.log(`\nDownloaded to: ${outputPath}`);
|
|
373
|
+
console.log(`Size: ${(result.data.byteLength / 1024).toFixed(1)} KB`);
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
console.error('Error:', error.message);
|
|
377
|
+
process.exit(1);
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
plugins
|
|
381
|
+
.command('delete-version <slug> <version>')
|
|
382
|
+
.description('Delete a plugin version (owner only)')
|
|
383
|
+
.option('-y, --yes', 'Skip confirmation')
|
|
384
|
+
.action(async (slug, version, options) => {
|
|
385
|
+
try {
|
|
386
|
+
if (!options.yes) {
|
|
387
|
+
console.log(`\nYou are about to delete version ${version} of ${slug}`);
|
|
388
|
+
console.log('This action cannot be undone.');
|
|
389
|
+
console.log('\nRun with --yes to confirm.');
|
|
390
|
+
process.exit(1);
|
|
391
|
+
}
|
|
392
|
+
console.log(`Deleting ${slug} v${version}...`);
|
|
393
|
+
const result = await api.deleteVersion(slug, version);
|
|
394
|
+
console.log(`\n${result.message}`);
|
|
395
|
+
console.log(`Current version is now: ${result.current_version}`);
|
|
396
|
+
}
|
|
397
|
+
catch (error) {
|
|
398
|
+
console.error('Error:', error.message);
|
|
399
|
+
process.exit(1);
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
plugins
|
|
403
|
+
.command('changelog <slug> [version] [text]')
|
|
404
|
+
.description('View or update changelog for a plugin version')
|
|
405
|
+
.option('-s, --set <text>', 'Set changelog text (alternative to positional argument)')
|
|
406
|
+
.action(async (slug, version, text, options) => {
|
|
407
|
+
try {
|
|
408
|
+
const changelogText = text || options.set;
|
|
409
|
+
if (changelogText) {
|
|
410
|
+
if (!version) {
|
|
411
|
+
console.error('Version is required when setting changelog');
|
|
412
|
+
process.exit(1);
|
|
413
|
+
}
|
|
414
|
+
console.log(`Updating changelog for ${slug} v${version}...`);
|
|
415
|
+
const result = await api.updateVersion(slug, version, { changelog: changelogText });
|
|
416
|
+
console.log(`\n${result.message}`);
|
|
417
|
+
console.log(`Changelog: ${result.version.changelog || '(empty)'}`);
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
const data = await api.listVersions(slug);
|
|
421
|
+
if (version) {
|
|
422
|
+
const v = data.versions.find((ver) => ver.version === version);
|
|
423
|
+
if (!v) {
|
|
424
|
+
console.error(`Version ${version} not found`);
|
|
425
|
+
process.exit(1);
|
|
426
|
+
}
|
|
427
|
+
console.log(`\nChangelog for ${data.name} v${version}:\n`);
|
|
428
|
+
console.log(v.changelog || '(no changelog)');
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
console.log(`\nChangelogs for ${data.name}:\n`);
|
|
432
|
+
data.versions.forEach((v) => {
|
|
433
|
+
console.log(`v${v.version} (${v.release_date}):`);
|
|
434
|
+
console.log(` ${v.changelog || '(no changelog)'}\n`);
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
console.error('Error:', error.message);
|
|
441
|
+
process.exit(1);
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
plugins
|
|
445
|
+
.command('transfer <slug> <email>')
|
|
446
|
+
.description('Transfer plugin ownership to another @jezweb user (owner only)')
|
|
447
|
+
.option('-y, --yes', 'Skip confirmation')
|
|
448
|
+
.action(async (slug, email, options) => {
|
|
449
|
+
try {
|
|
450
|
+
if (!options.yes) {
|
|
451
|
+
console.log(`\nYou are about to transfer ownership of ${slug} to ${email}`);
|
|
452
|
+
console.log('You will lose all access to this plugin.');
|
|
453
|
+
console.log('\nRun with --yes to confirm.');
|
|
454
|
+
process.exit(1);
|
|
455
|
+
}
|
|
456
|
+
console.log(`Transferring ${slug} to ${email}...`);
|
|
457
|
+
const result = await api.transferOwnership(slug, email);
|
|
458
|
+
console.log(`\n${result.message}`);
|
|
459
|
+
console.log(`Previous owner: ${result.previous_owner}`);
|
|
460
|
+
console.log(`New owner: ${result.new_owner}`);
|
|
461
|
+
}
|
|
462
|
+
catch (error) {
|
|
463
|
+
console.error('Error:', error.message);
|
|
464
|
+
process.exit(1);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/commands/plugins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../../../src/commands/sites/bulk.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,QA0FlD"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as api from '../../client.js';
|
|
2
|
+
export function registerBulkCommands(sites) {
|
|
3
|
+
sites
|
|
4
|
+
.command('scan-all')
|
|
5
|
+
.description('Scan all sites and update cached data')
|
|
6
|
+
.action(async () => {
|
|
7
|
+
try {
|
|
8
|
+
console.log('Queuing scan for all sites...\n');
|
|
9
|
+
const { jobId, total } = await api.bulkScan();
|
|
10
|
+
console.log(`Queued ${total} sites (job: ${jobId})\n`);
|
|
11
|
+
// Poll for progress
|
|
12
|
+
let lastProgress = -1;
|
|
13
|
+
// eslint-disable-next-line no-constant-condition
|
|
14
|
+
while (true) {
|
|
15
|
+
const status = await api.getScanStatus(jobId);
|
|
16
|
+
const progress = status.progress;
|
|
17
|
+
if (progress !== lastProgress) {
|
|
18
|
+
process.stdout.write(`\rProgress: ${status.completed}/${status.total} complete, ${status.failed} failed (${progress}%)`);
|
|
19
|
+
lastProgress = progress;
|
|
20
|
+
}
|
|
21
|
+
if (status.status === 'completed') {
|
|
22
|
+
console.log('\n\n✓ Scan complete!');
|
|
23
|
+
console.log(` Succeeded: ${status.completed}`);
|
|
24
|
+
console.log(` Failed: ${status.failed}`);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
if (status.status === 'failed') {
|
|
28
|
+
console.log('\n\n✗ Scan failed');
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
// Wait 2 seconds before polling again
|
|
32
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error('Error:', error.message);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
sites
|
|
41
|
+
.command('update-all')
|
|
42
|
+
.description('Update JezPress on all sites')
|
|
43
|
+
.option('--force', 'Clear WordPress update cache before checking (use when updates are stuck)')
|
|
44
|
+
.action(async (options) => {
|
|
45
|
+
try {
|
|
46
|
+
const force = options.force === true;
|
|
47
|
+
console.log(`Queuing JezPress updates for all sites${force ? ' (force mode)' : ''}...\n`);
|
|
48
|
+
const { jobId, total } = await api.bulkUpdate({ force });
|
|
49
|
+
console.log(`Queued ${total} sites (job: ${jobId})\n`);
|
|
50
|
+
// Poll for progress
|
|
51
|
+
let lastProgress = -1;
|
|
52
|
+
// eslint-disable-next-line no-constant-condition
|
|
53
|
+
while (true) {
|
|
54
|
+
const status = await api.getScanStatus(jobId);
|
|
55
|
+
const progress = status.progress;
|
|
56
|
+
if (progress !== lastProgress) {
|
|
57
|
+
process.stdout.write(`\rProgress: ${status.completed}/${status.total} complete, ${status.failed} failed (${progress}%)`);
|
|
58
|
+
lastProgress = progress;
|
|
59
|
+
}
|
|
60
|
+
if (status.status === 'completed') {
|
|
61
|
+
console.log('\n\n✓ Update complete!');
|
|
62
|
+
console.log(` Succeeded: ${status.completed}`);
|
|
63
|
+
console.log(` Failed: ${status.failed}`);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
if (status.status === 'failed') {
|
|
67
|
+
console.log('\n\n✗ Update failed');
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
// Wait 2 seconds before polling again
|
|
71
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error('Error:', error.message);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=bulk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../../src/commands/sites/bulk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/commands/sites/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,QA8EpD"}
|