82 lines
3.6 KiB
JavaScript
82 lines
3.6 KiB
JavaScript
import { z } from 'zod';
|
|
import { config } from '../../config.js';
|
|
import { hasComposerDependency, readComposerJson } from '../../lib/frameworks/composer.js';
|
|
import { runCommand } from '../../lib/runCommand.js';
|
|
import { pascalCase } from '../../lib/strings.js';
|
|
import { errorResult, jsonResult, toErrorMessage } from '../shared.js';
|
|
import { requireLaravel } from './requireLaravel.js';
|
|
export function registerGenerateFilamentResourceTool(server) {
|
|
server.registerTool('generate_filament_resource', {
|
|
title: 'Generate Filament Resource',
|
|
description: 'Generate a Filament admin resource via `php artisan make:filament-resource`. Requires filament/filament to be installed.',
|
|
inputSchema: {
|
|
name: z.string().min(1).describe('Resource/model name, e.g. "Post".'),
|
|
generate: z
|
|
.boolean()
|
|
.optional()
|
|
.default(true)
|
|
.describe('Pass --generate to Filament when true (default).'),
|
|
},
|
|
}, async ({ name, generate }) => {
|
|
try {
|
|
const laravel = requireLaravel();
|
|
const composer = readComposerJson(laravel.root);
|
|
if (!hasComposerDependency(composer, 'filament/filament')) {
|
|
return errorResult('filament/filament is not installed. Run composer_require with package "filament/filament" first ' +
|
|
'(or `composer require filament/filament`).');
|
|
}
|
|
const resource = pascalCase(name);
|
|
const args = ['artisan', 'make:filament-resource', resource, '--no-interaction'];
|
|
if (generate !== false)
|
|
args.push('--generate');
|
|
const result = await runCommand('php', args, {
|
|
cwd: laravel.root,
|
|
timeoutMs: config.scaffoldCommandTimeoutMs,
|
|
});
|
|
return jsonResult({
|
|
package: 'filament/filament',
|
|
resource,
|
|
exitCode: result.exitCode,
|
|
failed: result.failed,
|
|
output: result.output,
|
|
});
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
}
|
|
export function registerGenerateNovaResourceTool(server) {
|
|
server.registerTool('generate_nova_resource', {
|
|
title: 'Generate Nova Resource',
|
|
description: 'Generate a Laravel Nova resource via `php artisan nova:resource`. Requires laravel/nova to be installed.',
|
|
inputSchema: {
|
|
name: z.string().min(1).describe('Resource name, e.g. "Post".'),
|
|
},
|
|
}, async ({ name }) => {
|
|
try {
|
|
const laravel = requireLaravel();
|
|
const composer = readComposerJson(laravel.root);
|
|
if (!hasComposerDependency(composer, 'laravel/nova')) {
|
|
return errorResult('laravel/nova is not installed. Install Nova (license required) then re-run this tool. ' +
|
|
'See https://nova.laravel.com/docs for installation.');
|
|
}
|
|
const resource = pascalCase(name);
|
|
const result = await runCommand('php', ['artisan', 'nova:resource', resource, '--no-interaction'], {
|
|
cwd: laravel.root,
|
|
timeoutMs: config.scaffoldCommandTimeoutMs,
|
|
});
|
|
return jsonResult({
|
|
package: 'laravel/nova',
|
|
resource,
|
|
exitCode: result.exitCode,
|
|
failed: result.failed,
|
|
output: result.output,
|
|
});
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=generateAdminResources.js.map
|