Files
2026-07-31 13:12:54 -04:00

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