import fs from 'node:fs'; import path from 'node:path'; import { hasComposerDependency, readComposerJson } from './composer.js'; import { PhpFrameworkAdapter } from './phpBase.js'; const DEV_HOST = '127.0.0.1'; const DEV_PORT = '8000'; function composeFileExists(root) { return ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'].some((name) => fs.existsSync(path.join(root, name))); } function sailScriptPath(root) { const candidates = [ path.join(root, 'vendor', 'bin', 'sail'), path.join(root, 'vendor', 'bin', 'sail.bat'), ]; return candidates.find((file) => fs.existsSync(file)) ?? null; } /** True when laravel/sail is required and a compose file is present. */ export function laravelUsesSail(root) { return Boolean(hasComposerDependency(readComposerJson(root), 'laravel/sail') && composeFileExists(root)); } export class LaravelAdapter extends PhpFrameworkAdapter { kind = 'laravel'; label = 'Laravel'; get usesSail() { return hasComposerDependency(this.composerJson, 'laravel/sail') && composeFileExists(this.root); } devCommand() { if (this.usesSail) { const sail = sailScriptPath(this.root); if (sail) { // Sail is a bash script; invoke via bash so Windows+Git Bash/WSL and Unix share one path. return { command: 'bash', args: [sail.replace(/\\/g, '/'), 'up'], cwd: this.root, }; } return { command: 'docker', args: ['compose', 'up'], cwd: this.root, }; } return { command: 'php', args: ['artisan', 'serve', `--host=${DEV_HOST}`, `--port=${DEV_PORT}`], cwd: this.root, }; } readyPattern() { if (this.usesSail) { return /(?:Container|Service).+(?:Started|Healthy|Running)|Listening on (https?:\/\/\S+)|APP_URL[=:].*(https?:\/\/\S+)|Local:\s+(https?:\/\/\S+)|Server running on \[?(https?:\/\/[^\s\]]+)/i; } // `php artisan serve` prints: "INFO Server running on [http://127.0.0.1:8000]." return /Server running on \[?(https?:\/\/[^\s\]]+)/i; } describe() { const sail = this.usesSail; return { kind: this.kind, label: this.label, root: this.root, packageManager: this.packageManager, laravelVersion: this.composerJson?.require?.['laravel/framework'] ?? null, usesPest: Boolean(this.composerJson?.['require-dev']?.['pestphp/pest']), usesSail: sail, sailScript: sail ? sailScriptPath(this.root) : null, devUrl: sail ? 'http://localhost' : `http://${DEV_HOST}:${DEV_PORT}`, notes: sail ? 'Sail detected: start_dev_server uses `vendor/bin/sail up` (or docker compose up).' : undefined, }; } } //# sourceMappingURL=laravel.js.map