import path from 'node:path'; import { readComposerJson, vendorBinExists } from './composer.js'; /** * Shared behaviour for Composer-based PHP frameworks (Laravel, CodeIgniter). * Subclasses only need to override the bits that actually differ: the CLI * used for scaffolding/migrations (artisan vs spark), the dev-server "ready" * line, and which test runner is used. */ export class PhpFrameworkAdapter { root; packageManager = 'composer'; composerJson; constructor(root) { this.root = root; this.composerJson = readComposerJson(root); } installCommand() { return { command: 'composer', args: ['install'], cwd: this.root }; } buildCommand() { return { command: 'composer', args: ['install', '--no-dev', '--optimize-autoloader'], cwd: this.root }; } testCommand(extraArgs = []) { if (vendorBinExists(this.root, 'pest')) { return { command: this.vendorBin('pest'), args: extraArgs, cwd: this.root }; } if (vendorBinExists(this.root, 'phpunit')) { return { command: this.vendorBin('phpunit'), args: extraArgs, cwd: this.root }; } return null; } lintCommand(fix = false) { if (vendorBinExists(this.root, 'pint')) { return { command: this.vendorBin('pint'), args: fix ? [] : ['--test'], cwd: this.root }; } if (vendorBinExists(this.root, 'phpcs')) { return { command: this.vendorBin(fix ? 'phpcbf' : 'phpcs'), args: [], cwd: this.root }; } return null; } vendorBin(bin) { const suffix = process.platform === 'win32' ? '.bat' : ''; return path.join(this.root, 'vendor', 'bin', `${bin}${suffix}`); } } //# sourceMappingURL=phpBase.js.map