104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
// Parse plugin subcommand arguments into structured commands
|
|
export type ParsedCommand =
|
|
| { type: 'menu' }
|
|
| { type: 'help' }
|
|
| { type: 'install'; marketplace?: string; plugin?: string }
|
|
| { type: 'manage' }
|
|
| { type: 'uninstall'; plugin?: string }
|
|
| { type: 'enable'; plugin?: string }
|
|
| { type: 'disable'; plugin?: string }
|
|
| { type: 'validate'; path?: string }
|
|
| {
|
|
type: 'marketplace'
|
|
action?: 'add' | 'remove' | 'update' | 'list'
|
|
target?: string
|
|
}
|
|
|
|
export function parsePluginArgs(args?: string): ParsedCommand {
|
|
if (!args) {
|
|
return { type: 'menu' }
|
|
}
|
|
|
|
const parts = args.trim().split(/\s+/)
|
|
const command = parts[0]?.toLowerCase()
|
|
|
|
switch (command) {
|
|
case 'help':
|
|
case '--help':
|
|
case '-h':
|
|
return { type: 'help' }
|
|
|
|
case 'install':
|
|
case 'i': {
|
|
const target = parts[1]
|
|
if (!target) {
|
|
return { type: 'install' }
|
|
}
|
|
|
|
// Check if it's in format plugin@marketplace
|
|
if (target.includes('@')) {
|
|
const [plugin, marketplace] = target.split('@')
|
|
return { type: 'install', plugin, marketplace }
|
|
}
|
|
|
|
// Check if the target looks like a marketplace (URL or path)
|
|
const isMarketplace =
|
|
target.startsWith('http://') ||
|
|
target.startsWith('https://') ||
|
|
target.startsWith('file://') ||
|
|
target.includes('/') ||
|
|
target.includes('\\')
|
|
|
|
if (isMarketplace) {
|
|
// This is a marketplace URL/path, no plugin specified
|
|
return { type: 'install', marketplace: target }
|
|
}
|
|
|
|
// Otherwise treat it as a plugin name
|
|
return { type: 'install', plugin: target }
|
|
}
|
|
|
|
case 'manage':
|
|
return { type: 'manage' }
|
|
|
|
case 'uninstall':
|
|
return { type: 'uninstall', plugin: parts[1] }
|
|
|
|
case 'enable':
|
|
return { type: 'enable', plugin: parts[1] }
|
|
|
|
case 'disable':
|
|
return { type: 'disable', plugin: parts[1] }
|
|
|
|
case 'validate': {
|
|
const target = parts.slice(1).join(' ').trim()
|
|
return { type: 'validate', path: target || undefined }
|
|
}
|
|
|
|
case 'marketplace':
|
|
case 'market': {
|
|
const action = parts[1]?.toLowerCase()
|
|
const target = parts.slice(2).join(' ')
|
|
|
|
switch (action) {
|
|
case 'add':
|
|
return { type: 'marketplace', action: 'add', target }
|
|
case 'remove':
|
|
case 'rm':
|
|
return { type: 'marketplace', action: 'remove', target }
|
|
case 'update':
|
|
return { type: 'marketplace', action: 'update', target }
|
|
case 'list':
|
|
return { type: 'marketplace', action: 'list' }
|
|
default:
|
|
// No action specified, show marketplace menu
|
|
return { type: 'marketplace' }
|
|
}
|
|
}
|
|
|
|
default:
|
|
// Unknown command, show menu
|
|
return { type: 'menu' }
|
|
}
|
|
}
|