UNPKG

@api-buddy/plugin-utils

Version:

Shared utilities for API Buddy plugins

1 lines 31.1 kB
{"version":3,"sources":["../src/index.ts","../src/plugin-manager.ts","../src/cli/index.ts","../src/cli/utils/index.ts","../src/cli/utils/fs.ts","../src/cli/utils/package.ts","../src/cli/utils/ui.ts","../src/cli/commands/base-command.ts"],"sourcesContent":["// Core plugin utilities\nexport * from './plugin-manager.js';\n\n// CLI utilities\nexport * from './cli/index.js';\n\n// Export local types\nexport type { Logger, Plugin, PluginContext } from './types.js';\n\n// Augment the @api-buddy/types module with our local types\ndeclare module '@api-buddy/types' {\n export * from './types.js';\n}\n\n// Default export for backward compatibility\nimport { SimplePluginManager } from './plugin-manager.js';\nimport * as cli from './cli/index.js';\n\nconst defaultExport = {\n SimplePluginManager,\n ...(cli.default || {})\n};\n\nexport default defaultExport;\n","import type { \n Plugin, \n PluginContext, \n PluginHook, \n Logger \n} from '@api-buddy/types';\n\nexport interface PluginManagerOptions {\n cwd?: string;\n logger?: Partial<Logger>;\n pluginsDir?: string | string[];\n nodeModulesDirs?: string[];\n}\n\n/**\n * A simple plugin manager that handles loading and managing plugins.\n * Can be extended to add custom plugin functionality.\n */\nexport class SimplePluginManager {\n protected plugins: Map<string, Plugin> = new Map();\n protected context: PluginContext;\n protected options: {\n pluginsDir: string[];\n nodeModulesDirs: string[];\n };\n\n private defaultLogger: Logger = {\n info: console.log,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n };\n\n constructor(options: PluginManagerOptions = {}) {\n this.options = {\n pluginsDir: Array.isArray(options.pluginsDir) \n ? options.pluginsDir \n : options.pluginsDir \n ? [options.pluginsDir] \n : [],\n nodeModulesDirs: options.nodeModulesDirs || [],\n };\n\n this.context = {\n cwd: options.cwd || process.cwd(),\n logger: { ...this.defaultLogger, ...(options.logger || {}) },\n config: {},\n data: new Map(),\n utils: {\n registerHook: () => {},\n unregisterHook: () => {},\n callHook: async () => undefined,\n },\n };\n }\n\n /**\n * Register a plugin\n */\n async registerPlugin(plugin: Plugin): Promise<void> {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin with name '${plugin.name}' is already registered`);\n }\n\n try {\n // Initialize the plugin if it has an initialize method\n if (typeof plugin.initialize === 'function') {\n await plugin.initialize(this.context);\n }\n \n this.plugins.set(plugin.name, plugin);\n this.context.logger.info(`Registered plugin: ${plugin.name}@${plugin.version}`);\n } catch (error) {\n this.context.logger.error(`Failed to initialize plugin ${plugin.name}:`, error);\n throw error;\n }\n }\n\n /**\n * Get a registered plugin by name\n */\n getPlugin<T extends Plugin = Plugin>(name: string): T | undefined {\n return this.plugins.get(name) as T | undefined;\n }\n\n /**\n * Get all registered plugins\n */\n getPlugins(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * Unregister a plugin\n */\n async unregisterPlugin(name: string): Promise<boolean> {\n const plugin = this.plugins.get(name);\n if (!plugin) return false;\n\n try {\n // Clean up the plugin if it has a cleanup method\n if (typeof plugin.cleanup === 'function') {\n await plugin.cleanup(this.context);\n }\n \n this.plugins.delete(name);\n this.context.logger.info(`Unregistered plugin: ${name}`);\n return true;\n } catch (error) {\n this.context.logger.error(`Failed to cleanup plugin ${name}:`, error);\n return false;\n }\n }\n\n /**\n * Load plugins from the specified directories\n */\n async loadPlugins(): Promise<void> {\n // Implementation for loading plugins from directories\n // This is a simplified version - in a real implementation, you would:\n // 1. Scan the plugin directories for plugin modules\n // 2. Import and initialize each plugin\n // 3. Register them with the plugin manager\n \n this.context.logger.info('Loading plugins...');\n // Actual implementation would go here\n }\n}\n","import { Command } from 'commander';\n\n// Define a basic Logger interface if @api-buddy/types is not available\ninterface Logger {\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n debug: (message: string) => void;\n}\n\nimport { BaseCommand, CommandContext } from './commands/base-command.js';\nimport * as utils from './utils/index.js';\n\nexport interface PluginCLIOptions {\n name: string;\n version: string;\n description?: string;\n logger?: Logger;\n cwd?: string;\n}\n\nexport class PluginCLI {\n private program: Command;\n private commandClasses: Map<string, new (context: CommandContext) => BaseCommand> = new Map();\n private context: CommandContext;\n\n constructor(options: PluginCLIOptions) {\n this.program = new Command();\n \n this.program\n .name(options.name)\n .version(options.version)\n .description(options.description || '');\n\n // Add common options\n this.program\n .option('--verbose', 'Enable verbose logging', false)\n .option('--dry-run', 'Perform a dry run without making changes', false);\n\n this.context = {\n cwd: options.cwd || process.cwd(),\n logger: {\n info: console.log,\n warn: console.warn,\n error: console.error,\n debug: options.logger?.debug || (() => {}),\n },\n config: {},\n data: new Map(),\n utils: {\n registerHook: () => {},\n unregisterHook: () => {},\n callHook: async () => undefined,\n },\n };\n }\n\n /**\n * Register a command\n */\n registerCommand(commandClass: typeof BaseCommand): this {\n const command = new commandClass(this.context);\n const meta = command.getMetadata();\n \n const cmd = this.program\n .command(meta.name)\n .description(meta.description || '');\n\n // Register command-specific arguments\n meta.arguments?.forEach((arg) => {\n cmd.argument(\n arg.required ? `<${arg.name}>` : `[${arg.name}]`,\n arg.description || ''\n );\n });\n\n // Register command-specific options\n meta.options?.forEach((opt: { flags: string; description?: string; defaultValue?: string | boolean }) => {\n cmd.option(\n opt.flags,\n opt.description || '',\n opt.defaultValue\n );\n });\n\n // Add action to execute the command\n cmd.action(async (...args: any[]) => {\n try {\n const commandInstance = new commandClass(this.context);\n await commandInstance.run(process.argv);\n } catch (error) {\n console.error('Error executing command:', error);\n process.exit(1);\n }\n });\n\n return this;\n }\n\n /**\n * Parse and execute the CLI\n */\n async run(argv: string[] = process.argv): Promise<void> {\n await this.program.parseAsync(argv);\n }\n}\n\n// Export everything\nexport * from './commands/base-command';\nexport * from './utils';\n// Export a default instance for convenience\nexport default {\n PluginCLI,\n ...utils,\n};\n","export * from './fs.js';\nexport * from './package.js';\nexport * from './ui.js';\n\nexport { default as fsUtils } from './fs.js';\nexport { default as packageUtils } from './package.js';\nexport { default as ui } from './ui.js';\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { promisify } from 'util';\nimport { exec as execCb } from 'child_process';\n\nconst exec = promisify(execCb);\n\n/**\n * Get the directory name of the current module (ESM compatible)\n */\nexport function getDirname(importMetaUrl: string): string {\n return path.dirname(fileURLToPath(importMetaUrl));\n}\n\n/**\n * Check if a file or directory exists\n */\nexport async function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a directory if it doesn't exist\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error: any) {\n if (error.code !== 'EEXIST') {\n throw error;\n }\n }\n}\n\n/**\n * Read a file as a string\n */\nexport async function readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Write content to a file, creating parent directories if needed\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Copy a file from source to destination\n */\nexport async function copyFile(src: string, dest: string): Promise<void> {\n await ensureDir(path.dirname(dest));\n await fs.copyFile(src, dest);\n}\n\n/**\n * Copy a directory recursively\n */\nexport async function copyDir(src: string, dest: string): Promise<void> {\n await ensureDir(dest);\n \n const entries = await fs.readdir(src, { withFileTypes: true });\n \n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n \n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Execute a shell command\n */\nexport async function runCommand(\n command: string,\n options: { cwd?: string; stdio?: 'inherit' | 'pipe' } = {}\n): Promise<{ stdout: string; stderr: string }> {\n return exec(command, {\n cwd: options.cwd || process.cwd(),\n ...(options.stdio === 'inherit' ? { stdio: 'inherit' } : {}),\n });\n}\n\nexport const fsUtils = {\n getDirname,\n exists,\n ensureDir,\n readFile,\n writeFile,\n copyFile,\n copyDir,\n runCommand,\n};\n\nexport default fsUtils;\n","import { PackageJson } from 'type-fest';\nimport { fsUtils } from './fs.js';\nimport path from 'path';\n\n/**\n * Get the package.json content as an object\n */\nexport async function readPackageJson(dir: string): Promise<PackageJson> {\n const packageJsonPath = path.join(dir, 'package.json');\n const content = await fsUtils.readFile(packageJsonPath);\n return JSON.parse(content) as PackageJson;\n}\n\n/**\n * Update package.json with new content\n */\nexport async function updatePackageJson(\n dir: string,\n updater: (pkg: PackageJson) => PackageJson | Promise<PackageJson>\n): Promise<void> {\n const pkg = await readPackageJson(dir);\n const updatedPkg = await updater(pkg);\n const packageJsonPath = path.join(dir, 'package.json');\n await fsUtils.writeFile(\n packageJsonPath,\n JSON.stringify(updatedPkg, null, 2) + '\\n'\n );\n}\n\n/**\n * Install dependencies using the package manager used in the project\n */\nexport async function installDependencies(\n dir: string,\n deps: string[],\n { isDev = false, cwd = process.cwd() }: { isDev?: boolean; cwd?: string } = {}\n): Promise<void> {\n if (deps.length === 0) return;\n\n const pkgManager = await detectPackageManager(cwd);\n const args = [\n pkgManager === 'yarn' ? 'add' : 'install',\n ...(pkgManager === 'npm' ? ['install'] : []),\n ...(isDev ? [pkgManager === 'npm' ? '--save-dev' : '-D'] : []),\n ...deps,\n ].filter(Boolean);\n\n await fsUtils.runCommand(`${pkgManager} ${args.join(' ')}`, { cwd });\n}\n\n/**\n * Detect the package manager used in the project\n */\nexport async function detectPackageManager(cwd: string): Promise<'npm' | 'yarn' | 'pnpm'> {\n if (await fsUtils.exists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n if (await fsUtils.exists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn';\n }\n return 'npm';\n}\n\nexport const packageUtils = {\n readPackageJson,\n updatePackageJson,\n installDependencies,\n detectPackageManager,\n};\n\nexport default packageUtils;\n","import type { Color, Ora, SpinnerName } from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\n\n// Import ora dynamically to handle ESM\nlet ora: typeof import('ora').default;\n\n// Lazy load ora to avoid loading it when not needed\nasync function getOra() {\n if (!ora) {\n ora = (await import('ora')).default;\n }\n return ora;\n}\n\ntype SpinnerOptions = {\n text: string;\n color?: Color;\n spinner?: SpinnerName;\n};\n\nexport class Spinner {\n private spinner: Ora | null = null;\n private isActive = false;\n\n async start({ text, color = 'blue', spinner = 'dots' }: SpinnerOptions): Promise<void> {\n const oraInstance = await getOra();\n if (this.isActive) {\n this.stop();\n }\n this.spinner = oraInstance({\n text,\n spinner,\n color,\n } as any).start();\n this.isActive = true;\n }\n\n updateText(text: string): void {\n if (this.spinner && this.isActive) {\n this.spinner.text = text;\n }\n }\n\n succeed(text?: string): void {\n if (this.spinner && this.isActive) {\n this.spinner.succeed(text);\n this.isActive = false;\n }\n }\n\n fail(text?: string): void {\n if (this.spinner && this.isActive) {\n this.spinner.fail(text);\n this.isActive = false;\n }\n }\n\n warn(text: string): void {\n if (this.spinner && this.isActive) {\n this.spinner.warn(text);\n this.isActive = false;\n }\n }\n\n stop(): void {\n if (this.spinner && this.isActive) {\n this.spinner.stop();\n this.isActive = false;\n }\n }\n}\n\nexport async function confirm(\n message: string,\n defaultValue = false\n): Promise<boolean> {\n const { confirmed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmed',\n message,\n default: defaultValue,\n },\n ]);\n return confirmed;\n}\n\nexport async function select<T = string>(\n message: string,\n choices: Array<{ name: string; value: T; description?: string }>,\n pageSize = 10\n): Promise<T> {\n const { result } = await inquirer.prompt([\n {\n type: 'list',\n name: 'result',\n message,\n choices: choices.map((choice) => ({\n name: choice.name,\n value: choice.value,\n short: choice.name,\n })),\n pageSize,\n },\n ]);\n return result;\n}\n\nexport async function input(\n message: string,\n defaultValue?: string,\n validate?: (input: string) => boolean | string\n): Promise<string> {\n const { result } = await inquirer.prompt([\n {\n type: 'input',\n name: 'result',\n message,\n default: defaultValue,\n validate: validate ? (input) => {\n const result = validate(input);\n if (typeof result === 'string') {\n return result;\n }\n return result || 'Invalid input';\n } : undefined,\n },\n ]);\n return result;\n}\n\nexport const ui = {\n Spinner,\n confirm,\n select,\n input,\n colors: {\n success: chalk.green,\n error: chalk.red,\n warning: chalk.yellow,\n info: chalk.blue,\n highlight: chalk.cyan,\n },\n};\n\nexport default ui;\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\n\n// Define a basic Logger interface if @api-buddy/types is not available\ninterface Logger {\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n debug: (message: string) => void;\n level?: 'info' | 'warn' | 'error' | 'debug';\n}\n\nexport interface CommandContext {\n logger: Logger;\n cwd: string;\n}\n\nexport interface CommandArgument {\n name: string;\n description?: string;\n required?: boolean;\n defaultValue?: unknown;\n}\n\nexport interface CommandOption {\n flags: string;\n description?: string;\n required?: boolean;\n defaultValue?: unknown;\n}\n\nexport interface CommandMeta {\n name: string;\n description?: string;\n arguments?: CommandArgument[];\n options?: CommandOption[];\n}\n\nexport abstract class BaseCommand<T = Record<string, unknown>> {\n protected options: T;\n protected context: CommandContext;\n protected meta: CommandMeta;\n protected program: Command;\n\n constructor(context: CommandContext) {\n this.context = context;\n this.meta = this.getMeta();\n this.options = {} as T;\n this.program = new Command();\n \n this.program\n .name(this.meta.name)\n .description(this.meta.description || '');\n\n // Add common options\n this.program\n .option('-v, --verbose', 'Enable verbose logging', false)\n .option('--dry-run', 'Perform a dry run without making changes', false);\n\n // Add command-specific arguments\n this.meta.arguments?.forEach((arg: CommandArgument) => {\n this.program.argument(\n arg.required ? `<${arg.name}>` : `[${arg.name}]`,\n arg.description || ''\n );\n });\n\n // Add command-specific options with proper type handling\n this.meta.options?.forEach((opt: CommandOption) => {\n // For commander v9+, we'll use the option's default value in the flags\n const flags = opt.defaultValue !== undefined\n ? `${opt.flags} [${typeof opt.defaultValue}]`\n : opt.flags;\n \n // Add the option with description\n this.program.option(\n flags,\n opt.description || ''\n );\n \n // Store the default value in the options object\n if (opt.defaultValue !== undefined) {\n const optionName = this.getOptionName(opt.flags);\n if (optionName) {\n (this.options as Record<string, unknown>)[optionName] = opt.defaultValue;\n }\n }\n });\n }\n\n abstract getMeta(): CommandMeta;\n abstract run(options: T): Promise<void> | void;\n\n async execute(args: string[] = process.argv): Promise<void> {\n this.program.parse(args);\n const options = this.program.opts();\n \n // Set options from command line\n this.setOptions(options as Partial<T>);\n \n // Enable verbose logging if requested\n if (options.verbose && this.context.logger) {\n this.context.logger.level = 'debug';\n }\n\n try {\n await this.run(this.options);\n } catch (error) {\n const err = error as Error;\n this.context.logger.error(`Error: ${err.message}`);\n if (options.verbose && err.stack) {\n this.context.logger.debug(err.stack);\n }\n process.exit(1);\n }\n }\n\n /**\n * Extracts the option name from command line flags\n * @param flags - The command line flags (e.g., '-n, --name')\n * @returns The option name or null if not found\n */\n private getOptionName(flags: string): string | null {\n const match = flags.match(/--([a-zA-Z0-9-]+)/);\n return match ? match[1] : null;\n }\n\n protected setOptions(options: Partial<T>): void {\n this.options = { ...this.options, ...options } as T;\n }\n\n protected setOptionsFromEnv(prefix = 'API_BUDDY_'): void {\n const env = process.env;\n const envOptions: Record<string, unknown> = {};\n\n Object.entries(env).forEach(([key, value]) => {\n if (key.startsWith(prefix) && value !== undefined) {\n const optionKey = key\n .substring(prefix.length)\n .toLowerCase()\n .replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n \n try {\n // Try to parse JSON values\n envOptions[optionKey] = value ? JSON.parse(value) : null;\n } catch {\n // Fall back to string value if not valid JSON\n envOptions[optionKey] = value;\n }\n }\n });\n\n this.setOptions(envOptions as Partial<T>);\n }\n\n protected success(message: string): void {\n this.context.logger.info(chalk.green(`✓ ${message}`));\n }\n\n protected log(message: string): void {\n this.context.logger.info(message);\n }\n\n protected warn(message: string): void {\n this.context.logger.warn(chalk.yellow(`⚠ ${message}`));\n }\n\n protected async confirm(message: string, defaultValue = false): Promise<boolean> {\n if (process.env.CI) {\n return defaultValue;\n }\n\n const { confirmed } = await inquirer.prompt([{\n type: 'confirm',\n name: 'confirmed',\n message,\n default: defaultValue,\n }]);\n return confirmed;\n }\n}\n"],"mappings":"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","names":["import_commander","execCb","path","fs","import_path","path","inquirer","input","result","chalk","import_chalk","import_inquirer","chalk","inquirer"]}