@exilonstudios/cli 1.0.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/LICENSE +21 -0
- package/README.md +342 -0
- package/dist/cli.js +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1275 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/new.ts","../src/commands/install.ts","../src/commands/update.ts","../src/commands/list.ts","../src/commands/build.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { intro, outro, note } from '@clack/prompts';\nimport chalk from 'chalk';\nimport gradient from 'gradient-string';\nimport { newCommand } from './commands/new.js';\nimport { installCommand } from './commands/install.js';\nimport { updateCommand } from './commands/update.js';\nimport { listCommand } from './commands/list.js';\nimport { buildCommand } from './commands/build.js';\n\nconst VERSION = '1.0.0';\n\n// Show banner\nfunction showBanner() {\n const banner = gradient('cyan', 'magenta')(`\n ╔═══════════════════════════════════════════════════╗\n ║ ║\n ║ ███╗ ██╗███████╗██╗ ██╗██╗ ██╗███╗ ██╗ ║\n ║ ████╗ ██║██╔════╝╚██╗██╔╝██║ ██║████╗ ██║ ║\n ║ ██╔██╗ ██║█████╗ ╚███╔╝ ██║ ██║██╔██╗ ██║ ║\n ║ ██║╚██╗██║██╔══╝ ██╔██╗ ██║ ██║██║╚██╗██║ ║\n ║ ██║ ╚████║███████╗██╔╝ ██╗╚██████╔╝██║ ╚████║ ║\n ║ ╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ║\n ║ ║\n ║ Developer CLI v${VERSION} ║\n ║ ║\n ╚═══════════════════════════════════════════════════╝\n`);\n\n console.log(banner);\n}\n\nconst program = new Command();\n\nprogram\n .name('exiloncms')\n .description(chalk.cyan('ExilonCMS Developer CLI - Create plugins and themes with ease'))\n .version(VERSION);\n\n// New command\nprogram\n .command('new')\n .description('Create a new plugin or theme')\n .argument('[type]', 'Type of project (plugin or theme)')\n .action(async (type) => {\n intro(chalk.cyan('🚀 ExilonCMS CLI'));\n showBanner();\n await newCommand(type);\n outro(chalk.green('✓ Done!'));\n });\n\n// Install command\nprogram\n .command('install')\n .description('Install a plugin or theme from marketplace')\n .argument('[name]', 'Package name')\n .action(async (name) => {\n intro(chalk.cyan('📦 ExilonCMS Package Manager'));\n showBanner();\n await installCommand(name);\n outro(chalk.green('✓ Package installed!'));\n });\n\n// Update command\nprogram\n .command('update')\n .description('Update ExilonCMS core or packages')\n .option('--core', 'Update CMS core only')\n .option('--packages', 'Update installed packages only')\n .action(async (options) => {\n intro(chalk.cyan('🔄 ExilonCMS Updater'));\n showBanner();\n await updateCommand(options);\n outro(chalk.green('✓ Update complete!'));\n });\n\n// List command\nprogram\n .command('list')\n .description('List installed plugins and themes')\n .action(async () => {\n intro(chalk.cyan('📋 ExilonCMS Packages'));\n showBanner();\n await listCommand();\n });\n\n// Build command\nprogram\n .command('build')\n .description('Build a plugin or theme for distribution')\n .option('--format <format>', 'Output format (zip|tar)', 'zip')\n .action(async (options) => {\n intro(chalk.cyan('🔨 ExilonCMS Builder'));\n showBanner();\n await buildCommand(options);\n outro(chalk.green('✓ Build complete!'));\n });\n\n// Parse arguments\nprogram.parse();\n\n// Show help if no command provided\nif (!process.argv.slice(2).length) {\n intro(chalk.cyan('🚀 ExilonCMS CLI'));\n showBanner();\n program.outputHelp();\n outro(chalk.gray('Tip: Run \"exiloncms new\" to create a new plugin or theme'));\n}\n","import { select, text, confirm, multiselect, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { execa } from 'execa';\nimport { Listr } from 'listr2';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\ninterface ProjectOptions {\n type: 'plugin' | 'theme';\n name: string;\n description: string;\n author: string;\n version: string;\n license: string;\n useStarter: boolean;\n starter?: string;\n features: string[];\n namespace: string;\n}\n\nconst PLUGIN_STARTERS = [\n { value: 'basic', label: '📦 Basic Plugin', hint: 'Minimal plugin structure' },\n { value: 'blog', label: '📝 Blog Extension', hint: 'Extend blog functionality' },\n { value: 'shop', label: '🛒 Shop Integration', hint: 'E-commerce integration' },\n { value: 'analytics', label: '📊 Analytics Provider', hint: 'Custom analytics tracking' },\n { value: 'notification', label: '🔔 Notification Channel', hint: 'Custom notification channel' },\n];\n\nconst THEME_STARTERS = [\n { value: 'minimal', label: '🎨 Minimal Theme', hint: 'Clean, minimal design' },\n { value: 'blog', label: '📰 Blog Theme', hint: 'Content-focused blog theme' },\n { value: 'gaming', label: '🎮 Gaming Theme', hint: 'Gaming server theme' },\n { value: 'portfolio', label: '💼 Portfolio Theme', hint: 'Personal portfolio theme' },\n];\n\nconst PLUGIN_FEATURES = [\n { value: 'admin', label: '🔧 Admin Panel', hint: 'Backend admin interface' },\n { value: 'public', label: '🌐 Public Pages', hint: 'Frontend user-facing pages' },\n { value: 'api', label: '🔌 API Routes', hint: 'REST API endpoints' },\n { value: 'models', label: '📊 Database Models', hint: 'Eloquent models' },\n { value: 'middleware', label: '🛡️ Middleware', hint: 'Custom middleware' },\n { value: 'commands', label: '⌨️ Artisan Commands', hint: 'Console commands' },\n { value: 'react', label: '⚛️ React Components', hint: 'React + Inertia pages' },\n { value: 'settings', label: '⚙️ Settings Page', hint: 'Configurable settings' },\n];\n\nconst THEME_FEATURES = [\n { value: 'templates', label: '📄 Blade Templates', hint: 'Blade view templates' },\n { value: 'assets', label: '🎨 CSS/JS Assets', hint: 'Frontend assets' },\n { value: 'config', label: '⚙️ Theme Config', hint: 'Customizable theme options' },\n { value: 'widgets', label: '🧩 Widget Areas', hint: 'Dynamic widget areas' },\n { value: 'colors', label: '🎨 Color Schemes', hint: 'Multiple color schemes' },\n];\n\nexport async function newCommand(typeArg?: string) {\n try {\n // Step 1: Select type\n let type: 'plugin' | 'theme';\n if (typeArg && ['plugin', 'theme'].includes(typeArg)) {\n type = typeArg as 'plugin' | 'theme';\n } else {\n const typeSelect = await select({\n message: 'What do you want to create?',\n options: [\n { value: 'plugin', label: '🔌 Plugin', hint: 'Extend CMS functionality' },\n { value: 'theme', label: '🎨 Theme', hint: 'Customize the appearance' },\n ],\n });\n\n if (typeof typeSelect !== 'string') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n type = typeSelect as 'plugin' | 'theme';\n }\n\n // Step 2: Project name\n const name = await text({\n message: `Project name (e.g., ${type === 'plugin' ? 'my-awesome-plugin' : 'my-awesome-theme'}):`,\n placeholder: type === 'plugin' ? 'my-awesome-plugin' : 'my-awesome-theme',\n validate: (value) => {\n if (!value) return 'Name is required';\n if (!/^[a-z0-9-]+$/.test(value)) return 'Use only lowercase letters, numbers, and hyphens';\n if (value.length < 3) return 'Name must be at least 3 characters';\n },\n });\n\n if (typeof name !== 'string') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n // Step 3: Description\n const description = await text({\n message: 'Description:',\n placeholder: `An amazing ${type} for ExilonCMS`,\n });\n\n if (typeof description !== 'string') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n // Step 4: Author\n const author = await text({\n message: 'Author name:',\n placeholder: 'Your Name',\n });\n\n if (typeof author !== 'string') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n // Step 5: Namespace (plugins only)\n let namespace = 'ExilonCMS\\\\Plugins\\\\' + toPascalCase(name);\n if (type === 'plugin') {\n const namespaceInput = await text({\n message: 'PHP Namespace:',\n placeholder: namespace,\n initialValue: namespace,\n });\n\n if (typeof namespaceInput !== 'string') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n namespace = namespaceInput;\n }\n\n // Step 6: Use starter template\n const useStarter = await confirm({\n message: `Use a starter ${type}?`,\n initialValue: true,\n });\n\n if (typeof useStarter !== 'boolean') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n let starter: string | undefined;\n if (useStarter) {\n const starters = type === 'plugin' ? PLUGIN_STARTERS : THEME_STARTERS;\n const starterSelect = await select({\n message: `Choose a ${type} starter:`,\n options: starters,\n });\n\n if (typeof starterSelect !== 'string') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n starter = starterSelect;\n }\n\n // Step 7: Features\n const features = type === 'plugin' ? PLUGIN_FEATURES : THEME_FEATURES;\n const selectedFeatures = await multiselect({\n message: `Select features (press space to select, enter to continue):`,\n options: features,\n required: false,\n });\n\n if (!Array.isArray(selectedFeatures)) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n const options: ProjectOptions = {\n type,\n name,\n description: description || `An amazing ${type} for ExilonCMS`,\n author: author || 'Unknown',\n version: '1.0.0',\n license: 'MIT',\n useStarter,\n starter,\n features: selectedFeatures as string[],\n namespace,\n };\n\n // Step 8: Confirm\n const shouldContinue = await confirm({\n message: 'Ready to create?',\n initialValue: true,\n });\n\n if (typeof shouldContinue !== 'boolean' || !shouldContinue) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n // Create the project\n await createProject(options);\n\n } catch (error) {\n if (error instanceof Error && error.message !== 'Operation cancelled') {\n console.error(chalk.red('Error:'), error.message);\n }\n }\n}\n\nasync function createProject(options: ProjectOptions) {\n const tasks = new Listr([\n {\n title: 'Creating project structure',\n task: async () => {\n const projectPath = path.join(process.cwd(), options.name);\n await fs.ensureDir(projectPath);\n\n // Create directory structure\n if (options.type === 'plugin') {\n await createPluginStructure(projectPath, options);\n } else {\n await createThemeStructure(projectPath, options);\n }\n },\n },\n {\n title: 'Generating configuration files',\n task: async () => {\n const projectPath = path.join(process.cwd(), options.name);\n await generateConfigFiles(projectPath, options);\n },\n },\n {\n title: 'Creating source files',\n task: async () => {\n const projectPath = path.join(process.cwd(), options.name);\n await generateSourceFiles(projectPath, options);\n },\n },\n {\n title: 'Installing dependencies',\n task: async () => {\n const projectPath = path.join(process.cwd(), options.name);\n // Skip if it's a theme without React\n if (options.type === 'theme' && !options.features.includes('react')) {\n return 'Skipped (no npm dependencies)';\n }\n await execa('npm', ['install'], { cwd: projectPath });\n },\n },\n {\n title: 'Initializing git repository',\n task: async () => {\n const projectPath = path.join(process.cwd(), options.name);\n await execa('git', ['init'], { cwd: projectPath });\n },\n },\n ]);\n\n await tasks.run();\n}\n\nasync function createPluginStructure(projectPath: string, options: ProjectOptions) {\n const dirs = [\n 'src',\n 'src/Models',\n 'src/Http/Controllers',\n 'src/Http/Middleware',\n 'src/Http/Requests',\n 'database/migrations',\n 'routes',\n 'resources/views',\n 'resources/js',\n 'resources/css',\n 'config',\n 'tests',\n ];\n\n for (const dir of dirs) {\n await fs.ensureDir(path.join(projectPath, dir));\n }\n}\n\nasync function createThemeStructure(projectPath: string, options: ProjectOptions) {\n const dirs = [\n 'resources/views',\n 'resources/views/layouts',\n 'resources/views/components',\n 'resources/css',\n 'resources/js',\n 'config',\n ];\n\n for (const dir of dirs) {\n await fs.ensureDir(path.join(projectPath, dir));\n }\n}\n\nasync function generateConfigFiles(projectPath: string, options: ProjectOptions) {\n // Generate plugin.json for plugins\n if (options.type === 'plugin') {\n const pluginJson = {\n name: options.name,\n version: options.version,\n description: options.description,\n author: options.author,\n license: options.license,\n type: 'plugin',\n namespace: options.namespace,\n service_provider: `${options.namespace}\\\\${toPascalCase(options.name)}ServiceProvider`,\n autoload: {\n 'psr-4': {\n [options.namespace + '\\\\']: 'src/'\n }\n },\n extras: {\n 'laravel': {\n 'providers': [\n `${options.namespace}\\\\${toPascalCase(options.name)}ServiceProvider`\n ]\n }\n }\n };\n await fs.writeJson(path.join(projectPath, 'plugin.json'), pluginJson, { spaces: 2 });\n }\n\n // Generate theme.json for themes\n if (options.type === 'theme') {\n const themeJson = {\n name: options.name,\n version: options.version,\n description: options.description,\n author: options.author,\n license: options.license,\n type: 'theme',\n screenshot: 'screenshot.png',\n supports: {\n 'exiloncms': '^1.0.0'\n }\n };\n await fs.writeJson(path.join(projectPath, 'theme.json'), themeJson, { spaces: 2 });\n }\n\n // Generate package.json\n const packageJson = {\n name: `exiloncms-${options.type}-${options.name}`,\n version: options.version,\n description: options.description,\n author: options.author,\n license: options.license,\n private: true,\n scripts: {\n dev: 'vite',\n build: 'vite build',\n preview: 'vite preview',\n },\n dependencies: {},\n devDependencies: {\n vite: '^5.0.0',\n '@vitejs/plugin-react': '^4.2.0',\n }\n };\n\n if (options.features.includes('react')) {\n packageJson.dependencies = {\n 'react': '^18.2.0',\n 'react-dom': '^18.2.0',\n '@inertiajs/react': '^1.0.0',\n };\n packageJson.devDependencies = {\n ...packageJson.devDependencies,\n '@types/react': '^18.2.0',\n '@types/react-dom': '^18.2.0',\n 'typescript': '^5.0.0',\n };\n }\n\n await fs.writeJson(path.join(projectPath, 'package.json'), packageJson, { spaces: 2 });\n\n // Generate composer.json for plugins\n if (options.type === 'plugin') {\n const composerJson = {\n name: `exiloncms/${options.name}`,\n description: options.description,\n type: 'exiloncms-plugin',\n version: options.version,\n license: options.license,\n authors: [\n { name: options.author }\n ],\n require: {\n 'php': '^8.2',\n 'laravel/framework': '^11.0'\n },\n autoload: {\n 'psr-4': {\n [options.namespace + '\\\\']: 'src/'\n }\n },\n 'extra': {\n 'exiloncms': {\n 'name': options.name,\n 'namespace': options.namespace\n }\n },\n minimumStability: 'dev',\n preferStable: true\n };\n await fs.writeJson(path.join(projectPath, 'composer.json'), composerJson, { spaces: 2 });\n }\n}\n\nasync function generateSourceFiles(projectPath: string, options: ProjectOptions) {\n if (options.type === 'plugin') {\n await generatePluginServiceProvider(projectPath, options);\n await generatePluginRoutes(projectPath, options);\n } else {\n await generateThemeFiles(projectPath, options);\n }\n\n // Generate README\n await generateReadme(projectPath, options);\n\n // Generate LICENSE\n await generateLicense(projectPath, options);\n\n // Generate .gitignore\n await generateGitignore(projectPath, options);\n}\n\nasync function generatePluginServiceProvider(projectPath: string, options: ProjectOptions) {\n const className = toPascalCase(options.name) + 'ServiceProvider';\n const content = `<?php\n\nnamespace ${options.namespace};\n\nuse Illuminate\\\\Support\\\\ServiceProvider;\nuse Illuminate\\\\Support\\\\Facades\\\\Route;\n\nclass ${className} extends ServiceProvider\n{\n /**\n * Bootstrap any package services.\n */\n public function boot(): void\n {\n // Load routes\n $this->loadRoutesFrom(__DIR__ . '/../routes/web.php');\n $this->loadRoutesFrom(__DIR__ . '/../routes/admin.php');\n\n // Load views\n $this->loadViewsFrom(__DIR__ . '/../resources/views', '${options.name}');\n\n // Load migrations\n $this->loadMigrationsFrom(__DIR__ . '/../database/migrations');\n\n // Publish assets\n $this->publishes([\n __DIR__ . '/../resources/js' => public_path('vendor/${options.name}'),\n ], ['${options.name}', '${options.name}-assets']);\n\n // Publish config\n if ($this->app->runningInConsole()) {\n $this->publishes([\n __DIR__ . '/../config/${options.name}.php' => config_path('${options.name}.php'),\n ], '${options.name}-config');\n }\n }\n\n /**\n * Register any package services.\n */\n public function register(): void\n {\n // Merge config\n $this->mergeConfigFrom(\n __DIR__ . '/../config/${options.name}.php',\n '${options.name}'\n );\n }\n}\n`;\n await fs.writeFile(path.join(projectPath, 'src', className + '.php'), content);\n}\n\nasync function generatePluginRoutes(projectPath: string, options: ProjectOptions) {\n // Web routes\n const webRoutes = `<?php\n\nuse Illuminate\\\\Support\\\\Facades\\\\Route;\nuse ${options.namespace}\\\\Http\\\\Controllers\\\\ExampleController;\n\n// Public routes\nRoute::prefix('${options.name}')->group(function () {\n Route::get('/', [ExampleController::class, 'index'])->name('${options.name}.index');\n});\n`;\n await fs.writeFile(path.join(projectPath, 'routes', 'web.php'), webRoutes);\n\n // Admin routes\n const adminRoutes = `<?php\n\nuse Illuminate\\\\Support\\\\Facades\\\\Route;\nuse ${options.namespace}\\\\Http\\\\Controllers\\\\Admin\\\\ExampleController;\n\n// Admin routes\nRoute::prefix('admin/${options.name}')\n ->middleware(['web', 'auth', 'admin'])\n ->group(function () {\n Route::get('/', [ExampleController::class, 'index'])->name('admin.${options.name}.index');\n });\n`;\n await fs.writeFile(path.join(projectPath, 'routes', 'admin.php'), adminRoutes);\n}\n\nasync function generateThemeFiles(projectPath: string, options: ProjectOptions) {\n // Main layout\n const layout = `<!DOCTYPE html>\n<html lang=\"{{ app()->getLocale() }}\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>@yield('title') - {{ setting('name') }}</title>\n @vite(['resources/css/app.css', 'resources/js/app.js'])\n</head>\n<body class=\"antialiased\">\n @yield('content')\n\n @stack('scripts')\n</body>\n</html>\n`;\n await fs.writeFile(path.join(projectPath, 'resources/views/layouts/app.blade.php'), layout);\n\n // Home page\n const home = `@extends('layouts.app')\n\n@section('title', 'Home')\n\n@section('content')\n<div class=\"container mx-auto px-4 py-8\">\n <h1 class=\"text-4xl font-bold\">Welcome to {{ $page->title ?? theme('name') }}</h1>\n <p class=\"mt-4 text-gray-600\">\n {{ $page->content ?? 'This is the ' . theme('name') . ' theme.' }}\n </p>\n</div>\n@endsection\n`;\n await fs.writeFile(path.join(projectPath, 'resources/views/home.blade.php'), home);\n}\n\nasync function generateReadme(projectPath: string, options: ProjectOptions) {\n const content = `# ${toPascalCase(options.name)}\n\n${options.description}\n\n## Author\n${options.author}\n\n## Version\n${options.version}\n\n## License\n${options.license}\n\n## Installation\n\n### For Plugins\n\\`\\`\\`bash\ncomposer require exiloncms/${options.name}\nphp artisan vendor:publish --tag=\"${options.name}\"\nphp artisan migrate\n\\`\\`\\`\n\n### For Themes\n\\`\\`\\`bash\n# Copy to themes directory\ncp -r ${options.name} /path/to/cms/themes/${options.name}\n\n# Or use the CLI\nexiloncms install ${options.name}\n\\`\\`\\`\n\n## Usage\n\n${options.type === 'plugin' ? '### Configuration\\n\\nPublish the config file:\\n```bash\\nphp artisan vendor:publish --tag=\"${options.name}-config\"\\n```' : '### Screenshot\\n\\n'}\n\n## Features\n\n${options.features.map(f => `- ${f}`).join('\\n')}\n\n## Development\n\n\\`\\`\\`bash\n# Install dependencies\nnpm install\n\n# Build assets\nnpm run build\n\n# Watch for changes\nnpm run dev\n\\`\\`\\`\n\n## Support\n\nFor issues and feature requests, please create an issue on the repository.\n`;\n\n await fs.writeFile(path.join(projectPath, 'README.md'), content);\n}\n\nasync function generateLicense(projectPath: string, options: ProjectOptions) {\n const year = new Date().getFullYear();\n const content = `MIT License\n\nCopyright (c) ${year} ${options.author}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n`;\n\n await fs.writeFile(path.join(projectPath, 'LICENSE'), content);\n}\n\nasync function generateGitignore(projectPath: string, options: ProjectOptions) {\n const content = `node_modules/\ndist/\nbuild/\nvendor/\n.env\n.env.local\n.DS_Store\n*.log\ncoverage/\n.nyc_output/\n.cache/\n`;\n await fs.writeFile(path.join(projectPath, '.gitignore'), content);\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n","import { select, text, confirm, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { execa } from 'execa';\nimport axios from 'axios';\nimport { Listr } from 'listr2';\n\nconst MARKETPLACE_API = 'https://marketplace.exiloncms.fr/api/v1';\n\ninterface PackageInfo {\n name: string;\n version: string;\n description: string;\n author: string;\n type: 'plugin' | 'theme';\n download_url: string;\n requires: string;\n}\n\nexport async function installCommand(nameArg?: string) {\n try {\n let packageName: string;\n\n if (nameArg) {\n packageName = nameArg;\n } else {\n // Search for package\n const searchTerm = await text({\n message: 'Enter package name or search term:',\n placeholder: 'e.g., blog',\n });\n\n if (typeof searchTerm !== 'string') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n // Search marketplace\n const packages = await searchPackages(searchTerm);\n\n if (packages.length === 0) {\n console.log(chalk.yellow('No packages found'));\n return;\n }\n\n // Select package\n const selected = await select({\n message: 'Select a package:',\n options: packages.map(pkg => ({\n value: pkg.name,\n label: pkg.name,\n hint: pkg.description,\n })),\n });\n\n if (typeof selected !== 'string') {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n packageName = selected;\n }\n\n // Get package info\n const packageInfo = await getPackageInfo(packageName);\n\n // Show package details\n console.log(chalk.cyan('\\n📦 Package Details:'));\n console.log(chalk.gray('─'.repeat(50)));\n console.log(`${chalk.bold('Name:')} ${packageInfo.name}`);\n console.log(`${chalk.bold('Version:')} ${packageInfo.version}`);\n console.log(`${chalk.bold('Description:')} ${packageInfo.description}`);\n console.log(`${chalk.bold('Author:')} ${packageInfo.author}`);\n console.log(`${chalk.bold('Type:')} ${packageInfo.type}`);\n console.log(`${chalk.bold('Requires:')} ${packageInfo.requires}`);\n console.log(chalk.gray('─'.repeat(50)));\n\n // Confirm installation\n const shouldInstall = await confirm({\n message: 'Install this package?',\n initialValue: true,\n });\n\n if (typeof shouldInstall !== 'boolean' || !shouldInstall) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n // Install package\n await installPackage(packageInfo);\n\n } catch (error) {\n if (error instanceof Error && error.message !== 'Operation cancelled') {\n console.error(chalk.red('Error:'), error.message);\n }\n }\n}\n\nasync function searchPackages(query: string): Promise<PackageInfo[]> {\n try {\n const response = await axios.get(`${MARKETPLACE_API}/search`, {\n params: { q: query },\n });\n return response.data.data || [];\n } catch (error) {\n console.log(chalk.yellow('Note: Marketplace not available, searching local templates...'));\n // Return local templates as fallback\n return getLocalTemplates();\n }\n}\n\nasync function getPackageInfo(name: string): Promise<PackageInfo> {\n try {\n const response = await axios.get(`${MARKETPLACE_API}/packages/${name}`);\n return response.data.data;\n } catch (error) {\n // Fallback to local\n const local = getLocalTemplates().find(p => p.name === name);\n if (!local) {\n throw new Error(`Package \"${name}\" not found`);\n }\n return local;\n }\n}\n\nasync function installPackage(packageInfo: PackageInfo) {\n const tasks = new Listr([\n {\n title: 'Downloading package',\n task: async () => {\n const downloadDir = path.join(process.cwd(), '.exiloncms-temp');\n await fs.ensureDir(downloadDir);\n\n const zipPath = path.join(downloadDir, `${packageInfo.name}.zip`);\n\n if (packageInfo.download_url) {\n // Download from marketplace\n const response = await axios({\n method: 'GET',\n url: packageInfo.download_url,\n responseType: 'stream',\n });\n\n const writer = fs.createWriteStream(zipPath);\n response.data.pipe(writer);\n\n return new Promise((resolve, reject) => {\n writer.on('finish', resolve);\n writer.on('error', reject);\n });\n } else {\n throw new Error('This package must be installed manually');\n }\n },\n },\n {\n title: 'Extracting package',\n task: async () => {\n const targetDir = packageInfo.type === 'plugin'\n ? path.join(process.cwd(), 'plugins', packageInfo.name)\n : path.join(process.cwd(), 'themes', packageInfo.name);\n\n await fs.ensureDir(targetDir);\n\n // Extract using unzip (or similar)\n await execa('unzip', ['-o', path.join(process.cwd(), '.exiloncms-temp', `${packageInfo.name}.zip`), '-d', targetDir]);\n },\n },\n {\n title: 'Installing dependencies',\n task: async () => {\n const packageDir = packageInfo.type === 'plugin'\n ? path.join(process.cwd(), 'plugins', packageInfo.name)\n : path.join(process.cwd(), 'themes', packageInfo.name);\n\n const composerJson = path.join(packageDir, 'composer.json');\n const packageJson = path.join(packageDir, 'package.json');\n\n if (await fs.pathExists(composerJson)) {\n await execa('composer', ['install'], { cwd: packageDir });\n }\n\n if (await fs.pathExists(packageJson)) {\n await execa('npm', ['install'], { cwd: packageDir });\n }\n },\n },\n {\n title: 'Running migrations',\n task: async () => {\n if (packageInfo.type === 'plugin') {\n await execa('php', ['artisan', 'migrate'], { cwd: process.cwd() });\n }\n },\n },\n {\n title: 'Cleaning up',\n task: async () => {\n await fs.remove(path.join(process.cwd(), '.exiloncms-temp'));\n },\n },\n ]);\n\n await tasks.run();\n}\n\nfunction getLocalTemplates(): PackageInfo[] {\n // This would scan local templates directory\n return [\n {\n name: 'blog',\n version: '1.0.0',\n description: 'Full-featured blog plugin',\n author: 'ExilonCMS',\n type: 'plugin',\n download_url: '',\n requires: '>=1.0.0',\n },\n {\n name: 'gaming-theme',\n version: '1.0.0',\n description: 'Gaming server theme',\n author: 'ExilonCMS',\n type: 'theme',\n download_url: '',\n requires: '>=1.0.0',\n },\n ];\n}\n","import { confirm, cancel, multiselect } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport axios from 'axios';\nimport { Listr } from 'listr2';\n\nconst MARKETPLACE_API = 'https://marketplace.exiloncms.fr/api/v1';\n\ninterface UpdateOptions {\n core?: boolean;\n packages?: boolean;\n}\n\ninterface UpdateInfo {\n name: string;\n currentVersion: string;\n latestVersion: string;\n type: 'core' | 'plugin' | 'theme';\n}\n\nexport async function updateCommand(options: UpdateOptions) {\n try {\n let updatesAvailable: UpdateInfo[] = [];\n\n // Check for updates\n const tasks = new Listr([\n {\n title: 'Checking for updates',\n task: async () => {\n updatesAvailable = await checkForUpdates();\n },\n },\n ]);\n\n await tasks.run();\n\n if (updatesAvailable.length === 0) {\n console.log(chalk.green('✓ Everything is up to date!'));\n return;\n }\n\n // Show available updates\n console.log(chalk.cyan('\\n📦 Available Updates:'));\n console.log(chalk.gray('─'.repeat(60)));\n\n updatesAvailable.forEach(update => {\n const icon = update.type === 'core' ? '⚙️' : update.type === 'plugin' ? '🔌' : '🎨';\n console.log(`${icon} ${chalk.bold(update.name)}`);\n console.log(` ${chalk.gray(update.currentVersion)} → ${chalk.green(update.latestVersion)}`);\n console.log();\n });\n\n // Select updates to install\n const selectedUpdates = await multiselect({\n message: 'Select updates to install (space to select, enter to continue):',\n options: updatesAvailable.map(update => ({\n value: update.name,\n label: update.name,\n hint: `${update.currentVersion} → ${update.latestVersion}`,\n })),\n required: false,\n });\n\n if (!Array.isArray(selectedUpdates)) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n if (selectedUpdates.length === 0) {\n console.log(chalk.yellow('No updates selected'));\n return;\n }\n\n // Confirm\n const shouldProceed = await confirm({\n message: `Install ${selectedUpdates.length} update(s)?`,\n initialValue: true,\n });\n\n if (typeof shouldProceed !== 'boolean' || !shouldProceed) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n // Install updates\n await installUpdates(updatesAvailable.filter(u => selectedUpdates.includes(u.name)));\n\n } catch (error) {\n if (error instanceof Error && error.message !== 'Operation cancelled') {\n console.error(chalk.red('Error:'), error.message);\n }\n }\n}\n\nasync function checkForUpdates(): Promise<UpdateInfo[]> {\n const updates: UpdateInfo[] = [];\n\n // Check core version\n try {\n const coreUpdate = await checkCoreUpdate();\n if (coreUpdate) {\n updates.push(coreUpdate);\n }\n } catch (error) {\n // Ignore errors\n }\n\n // Check installed plugins\n try {\n const pluginsDir = path.join(process.cwd(), 'plugins');\n if (await fs.pathExists(pluginsDir)) {\n const plugins = await fs.readdir(pluginsDir);\n for (const plugin of plugins) {\n const pluginJson = path.join(pluginsDir, plugin, 'plugin.json');\n if (await fs.pathExists(pluginJson)) {\n const info = await fs.readJson(pluginJson);\n const update = await checkPackageUpdate(plugin, info.version, 'plugin');\n if (update) {\n updates.push(update);\n }\n }\n }\n }\n } catch (error) {\n // Ignore errors\n }\n\n // Check installed themes\n try {\n const themesDir = path.join(process.cwd(), 'themes');\n if (await fs.pathExists(themesDir)) {\n const themes = await fs.readdir(themesDir);\n for (const theme of themes) {\n const themeJson = path.join(themesDir, theme, 'theme.json');\n if (await fs.pathExists(themeJson)) {\n const info = await fs.readJson(themeJson);\n const update = await checkPackageUpdate(theme, info.version, 'theme');\n if (update) {\n updates.push(update);\n }\n }\n }\n }\n } catch (error) {\n // Ignore errors\n }\n\n return updates;\n}\n\nasync function checkCoreUpdate(): Promise<UpdateInfo | null> {\n try {\n const response = await axios.get(`${MARKETPLACE_API}/core/latest`);\n const latest = response.data.data;\n\n const currentVersion = await getCurrentCoreVersion();\n\n if (currentVersion !== latest.version) {\n return {\n name: 'ExilonCMS Core',\n currentVersion: currentVersion,\n latestVersion: latest.version,\n type: 'core',\n };\n }\n } catch (error) {\n // Ignore\n }\n\n return null;\n}\n\nasync function checkPackageUpdate(\n name: string,\n currentVersion: string,\n type: 'plugin' | 'theme'\n): Promise<UpdateInfo | null> {\n try {\n const response = await axios.get(`${MARKETPLACE_API}/packages/${name}`);\n const latest = response.data.data;\n\n if (currentVersion !== latest.version) {\n return {\n name,\n currentVersion,\n latestVersion: latest.version,\n type,\n };\n }\n } catch (error) {\n // Ignore\n }\n\n return null;\n}\n\nasync function getCurrentCoreVersion(): Promise<string> {\n try {\n const composerJson = await fs.readJson(path.join(process.cwd(), 'composer.json'));\n // Try to get version from composer.lock or package.json\n const packageJson = await fs.readJson(path.join(process.cwd(), 'package.json'));\n return packageJson.version || '0.0.0';\n } catch (error) {\n return '0.0.0';\n }\n}\n\nasync function installUpdates(updates: UpdateInfo[]) {\n for (const update of updates) {\n const tasks = new Listr([\n {\n title: `Updating ${update.name}`,\n task: async () => {\n if (update.type === 'core') {\n await updateCore(update);\n } else {\n await updatePackage(update);\n }\n },\n },\n ]);\n\n await tasks.run();\n }\n}\n\nasync function updateCore(update: UpdateInfo) {\n // Update core using git or composer\n try {\n await execa('git', ['pull', 'origin', 'main'], { cwd: process.cwd() });\n await execa('composer', ['install'], { cwd: process.cwd() });\n await execa('npm', ['install'], { cwd: process.cwd() });\n await execa('php', ['artisan', 'migrate', '--force'], { cwd: process.cwd() });\n } catch (error) {\n throw new Error('Failed to update core. Make sure you have git installed.');\n }\n}\n\nasync function updatePackage(update: UpdateInfo) {\n const packageDir = update.type === 'plugin'\n ? path.join(process.cwd(), 'plugins', update.name)\n : path.join(process.cwd(), 'themes', update.name);\n\n if (!await fs.pathExists(packageDir)) {\n throw new Error(`${update.name} is not installed`);\n }\n\n // Download and extract update\n // This would be similar to the install command\n console.log(chalk.yellow(`Please update ${update.name} manually or reinstall from marketplace`));\n}\n","import { select } from '@clack/prompts';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport path from 'path';\n\ninterface PackageInfo {\n name: string;\n version: string;\n description: string;\n author: string;\n type: 'plugin' | 'theme';\n enabled: boolean;\n}\n\nexport async function listCommand() {\n try {\n const packages = await getInstalledPackages();\n\n if (packages.length === 0) {\n console.log(chalk.yellow('No plugins or themes installed'));\n return;\n }\n\n // Show by type\n const filter = await select({\n message: 'Show:',\n options: [\n { value: 'all', label: '📦 All Packages' },\n { value: 'plugins', label: '🔌 Plugins Only' },\n { value: 'themes', label: '🎨 Themes Only' },\n ],\n initialValue: 'all',\n });\n\n if (typeof filter !== 'string') {\n return;\n }\n\n const filtered = filter === 'all'\n ? packages\n : packages.filter(p => p.type === (filter === 'plugins' ? 'plugin' : 'theme'));\n\n // Display packages\n console.log(chalk.cyan('\\n📦 Installed Packages:'));\n console.log(chalk.gray('─'.repeat(70)));\n\n const plugins = filtered.filter(p => p.type === 'plugin');\n const themes = filtered.filter(p => p.type === 'theme');\n\n if (plugins.length > 0 && (filter === 'all' || filter === 'plugins')) {\n console.log(chalk.bold('\\n🔌 Plugins:'));\n plugins.forEach(pkg => {\n const status = pkg.enabled ? chalk.green('✓ Enabled') : chalk.gray('✗ Disabled');\n console.log(`\\n ${chalk.bold(pkg.name)} ${status}`);\n console.log(` ${chalk.gray('Version:')} ${pkg.version}`);\n console.log(` ${chalk.gray('Description:')} ${pkg.description}`);\n console.log(` ${chalk.gray('Author:')} ${pkg.author}`);\n });\n }\n\n if (themes.length > 0 && (filter === 'all' || filter === 'themes')) {\n console.log(chalk.bold('\\n🎨 Themes:'));\n themes.forEach(pkg => {\n const active = pkg.enabled ? chalk.green('✓ Active') : chalk.gray('✗ Inactive');\n console.log(`\\n ${chalk.bold(pkg.name)} ${active}`);\n console.log(` ${chalk.gray('Version:')} ${pkg.version}`);\n console.log(` ${chalk.gray('Description:')} ${pkg.description}`);\n console.log(` ${chalk.gray('Author:')} ${pkg.author}`);\n });\n }\n\n console.log(chalk.gray('\\n' + '─'.repeat(70)));\n console.log(chalk.gray(`Total: ${filtered.length} package(s)`));\n\n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red('Error:'), error.message);\n }\n }\n}\n\nasync function getInstalledPackages(): Promise<PackageInfo[]> {\n const packages: PackageInfo[] = [];\n\n // Get plugins\n const pluginsDir = path.join(process.cwd(), 'plugins');\n if (await fs.pathExists(pluginsDir)) {\n const plugins = await fs.readdir(pluginsDir);\n for (const plugin of plugins) {\n const pluginJson = path.join(pluginsDir, plugin, 'plugin.json');\n if (await fs.pathExists(pluginJson)) {\n try {\n const info = await fs.readJson(pluginJson);\n packages.push({\n name: info.name || plugin,\n version: info.version || 'unknown',\n description: info.description || '',\n author: info.author || 'Unknown',\n type: 'plugin',\n enabled: true, // Would check from database\n });\n } catch (error) {\n // Skip invalid plugins\n }\n }\n }\n }\n\n // Get themes\n const themesDir = path.join(process.cwd(), 'themes');\n if (await fs.pathExists(themesDir)) {\n const themes = await fs.readdir(themesDir);\n for (const theme of themes) {\n const themeJson = path.join(themesDir, theme, 'theme.json');\n if (await fs.pathExists(themeJson)) {\n try {\n const info = await fs.readJson(themeJson);\n packages.push({\n name: info.name || theme,\n version: info.version || 'unknown',\n description: info.description || '',\n author: info.author || 'Unknown',\n type: 'theme',\n enabled: false, // Would check from database\n });\n } catch (error) {\n // Skip invalid themes\n }\n }\n }\n }\n\n return packages;\n}\n","import { select, cancel } from '@clack/prompts';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { execa } from 'execa';\nimport archiver from 'archiver';\nimport { Listr } from 'listr2';\n\ninterface BuildOptions {\n format: 'zip' | 'tar';\n}\n\nexport async function buildCommand(options: BuildOptions) {\n try {\n // Detect current directory type\n const packageType = await detectPackageType();\n\n if (!packageType) {\n console.log(chalk.yellow('Not a valid plugin or theme directory'));\n console.log(chalk.gray('Run this command from within a plugin/theme directory'));\n return;\n }\n\n // Get package info\n const packageInfo = await getPackageInfo();\n\n if (!packageInfo) {\n console.log(chalk.yellow('Could not find package.json or plugin.json/theme.json'));\n return;\n }\n\n console.log(chalk.cyan(`\\n🔨 Building ${packageType}: ${packageInfo.name}`));\n console.log(chalk.gray(`Version: ${packageInfo.version}`));\n console.log();\n\n // Build the package\n const tasks = new Listr([\n {\n title: 'Installing dependencies',\n task: async () => {\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n if (await fs.pathExists(packageJsonPath)) {\n await execa('npm', ['install'], { cwd: process.cwd() });\n } else {\n return 'Skipped (no package.json)';\n }\n },\n },\n {\n title: 'Building assets',\n task: async () => {\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n if (await fs.pathExists(packageJsonPath)) {\n const packageJson = await fs.readJson(packageJsonPath);\n if (packageJson.scripts?.build) {\n await execa('npm', ['run', 'build'], { cwd: process.cwd() });\n } else {\n return 'Skipped (no build script)';\n }\n } else {\n return 'Skipped (no package.json)';\n }\n },\n },\n {\n title: 'Creating distribution package',\n task: async () => {\n await createDistPackage(packageInfo!, packageType!, options.format);\n },\n },\n ]);\n\n await tasks.run();\n\n console.log(chalk.green('\\n✓ Build complete!'));\n console.log(chalk.gray(`Package created: dist/${packageInfo.name}-${packageInfo.version}.${options.format}`));\n\n } catch (error) {\n if (error instanceof Error && error.message !== 'Operation cancelled') {\n console.error(chalk.red('Error:'), error.message);\n }\n }\n}\n\nasync function detectPackageType(): Promise<'plugin' | 'theme' | null> {\n const pluginJson = path.join(process.cwd(), 'plugin.json');\n const themeJson = path.join(process.cwd(), 'theme.json');\n\n if (await fs.pathExists(pluginJson)) {\n return 'plugin';\n }\n if (await fs.pathExists(themeJson)) {\n return 'theme';\n }\n return null;\n}\n\nasync function getPackageInfo(): Promise<any | null> {\n const pluginJson = path.join(process.cwd(), 'plugin.json');\n const themeJson = path.join(process.cwd(), 'theme.json');\n const packageJson = path.join(process.cwd(), 'package.json');\n\n let info: any = {};\n\n if (await fs.pathExists(pluginJson)) {\n info = { ...info, ...(await fs.readJson(pluginJson)) };\n }\n if (await fs.pathExists(themeJson)) {\n info = { ...info, ...(await fs.readJson(themeJson)) };\n }\n if (await fs.pathExists(packageJson)) {\n const pkg = await fs.readJson(packageJson);\n info = {\n ...info,\n name: info.name || pkg.name,\n version: info.version || pkg.version,\n description: info.description || pkg.description,\n author: info.author || pkg.author,\n };\n }\n\n if (!info.name || !info.version) {\n return null;\n }\n\n return info;\n}\n\nasync function createDistPackage(\n packageInfo: any,\n packageType: 'plugin' | 'theme',\n format: 'zip' | 'tar'\n) {\n await fs.ensureDir(path.join(process.cwd(), 'dist'));\n\n const outputFileName = `${packageInfo.name}-${packageInfo.version}.${format}`;\n const outputPath = path.join(process.cwd(), 'dist', outputFileName);\n\n // Files to exclude\n const exclude = [\n 'node_modules',\n 'dist',\n '.git',\n '.gitignore',\n 'coverage',\n '.env',\n '.env.local',\n '*.log',\n '.DS_Store',\n 'Thumbs.db',\n ];\n\n if (format === 'zip') {\n await createZip(outputPath, exclude);\n } else {\n await createTar(outputPath, exclude);\n }\n}\n\nasync function createZip(outputPath: string, exclude: string[]) {\n return new Promise((resolve, reject) => {\n const output = fs.createWriteStream(outputPath);\n const archive = archiver('zip', { zlib: { level: 9 } });\n\n output.on('close', () => resolve(null));\n archive.on('error', (err) => reject(err));\n\n archive.pipe(output);\n\n // Add all files except excluded\n const rootPath = process.cwd();\n\n archive.directory(rootPath, false, {\n filter: (entry) => {\n const relativePath = path.relative(rootPath, entry.path);\n const parts = relativePath.split(path.sep);\n\n // Check if any excluded folder is in path\n for (const excluded of exclude) {\n if (parts.some(p => p === excluded.replace('*', ''))) {\n return false;\n }\n if (relativePath.startsWith(excluded)) {\n return false;\n }\n }\n\n return true;\n },\n });\n\n archive.finalize();\n });\n}\n\nasync function createTar(outputPath: string, exclude: string[]) {\n // Use tar command if available (Unix-like systems)\n try {\n const excludeArgs = exclude.flatMap(e => ['--exclude', e]);\n await execa('tar', [\n '-czf',\n outputPath,\n ...excludeArgs,\n '.'\n ], { cwd: process.cwd() });\n } catch (error) {\n throw new Error('tar command not available. Please use --format zip instead.');\n }\n}\n"],"mappings":"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","names":["chalk","select","text","confirm","cancel","chalk","fs","path","execa","Listr","confirm","cancel","multiselect","chalk","execa","fs","path","axios","Listr","MARKETPLACE_API","select","chalk","fs","path","chalk","fs","path","execa","Listr","getPackageInfo","chalk"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@exilonstudios/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI tool for ExilonCMS plugin and theme development",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"exiloncms": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"dev": "tsx src/index.ts",
|
|
12
|
+
"build": "tsup src/index.ts --format esm --clean --sourcemap",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"lint": "oxlint",
|
|
15
|
+
"typecheck": "tsc --noEmit"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"exiloncms",
|
|
19
|
+
"cli",
|
|
20
|
+
"cms",
|
|
21
|
+
"plugin",
|
|
22
|
+
"theme"
|
|
23
|
+
],
|
|
24
|
+
"author": "ExilonStudios",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@clack/prompts": "^0.8.2",
|
|
28
|
+
"commander": "^12.1.0",
|
|
29
|
+
"chalk": "^5.4.1",
|
|
30
|
+
"ora": "^8.1.1",
|
|
31
|
+
"fs-extra": "^11.2.0",
|
|
32
|
+
"axios": "^1.7.9",
|
|
33
|
+
"execa": "^9.5.2",
|
|
34
|
+
"listr2": "^8.2.4",
|
|
35
|
+
"gradient-string": "^3.0.0",
|
|
36
|
+
"archiver": "^7.0.1"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/fs-extra": "^11.0.4",
|
|
40
|
+
"@types/node": "^22.10.5",
|
|
41
|
+
"@types/gradient-string": "^1.1.5",
|
|
42
|
+
"tsup": "^8.3.5",
|
|
43
|
+
"tsx": "^4.19.2",
|
|
44
|
+
"typescript": "^5.7.2",
|
|
45
|
+
"oxlint": "^0.17.0"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=18.0.0"
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"dist",
|
|
52
|
+
"templates"
|
|
53
|
+
],
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "https://github.com/ExilonStudios/ExilonCLI"
|
|
57
|
+
}
|
|
58
|
+
}
|