apprecio-mcp-base 1.1.6 → 1.1.8
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/cli/dist/generate-feature.d.ts +3 -0
- package/cli/dist/generate-feature.d.ts.map +1 -0
- package/cli/dist/generate-feature.js +0 -0
- package/cli/dist/generate-feature.js.map +1 -0
- package/cli/dist/generators/feature-generator.d.ts +3 -0
- package/cli/dist/generators/feature-generator.d.ts.map +1 -0
- package/cli/dist/generators/feature-generator.js +19 -0
- package/cli/dist/generators/feature-generator.js.map +1 -0
- package/cli/dist/generators/init-generator.d.ts +13 -0
- package/cli/dist/generators/init-generator.d.ts.map +1 -0
- package/cli/dist/generators/init-generator.js +799 -0
- package/cli/dist/generators/init-generator.js.map +1 -0
- package/cli/dist/generators/main-updater.d.ts +2 -0
- package/cli/dist/generators/main-updater.d.ts.map +1 -0
- package/cli/dist/generators/main-updater.js +64 -0
- package/cli/dist/generators/main-updater.js.map +1 -0
- package/cli/dist/generators/router-generator.d.ts +3 -0
- package/cli/dist/generators/router-generator.d.ts.map +1 -0
- package/cli/dist/generators/router-generator.js +150 -0
- package/cli/dist/generators/router-generator.js.map +1 -0
- package/cli/dist/generators/service-generator.d.ts +3 -0
- package/cli/dist/generators/service-generator.d.ts.map +1 -0
- package/cli/dist/generators/service-generator.js +151 -0
- package/cli/dist/generators/service-generator.js.map +1 -0
- package/cli/dist/generators/validation-generator.d.ts +3 -0
- package/cli/dist/generators/validation-generator.d.ts.map +1 -0
- package/cli/dist/generators/validation-generator.js +62 -0
- package/cli/dist/generators/validation-generator.js.map +1 -0
- package/cli/dist/types.d.ts +27 -0
- package/cli/dist/types.d.ts.map +1 -0
- package/cli/dist/types.js +2 -0
- package/cli/dist/types.js.map +1 -0
- package/cli/dist/utils/naming.d.ts +31 -0
- package/cli/dist/utils/naming.d.ts.map +1 -0
- package/cli/dist/utils/naming.js +65 -0
- package/cli/dist/utils/naming.js.map +1 -0
- package/cli/package.json +13 -3
- package/package.json +5 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-generator.js","sourceRoot":"","sources":["../../generators/init-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-updater.d.ts","sourceRoot":"","sources":["../../generators/main-updater.ts"],"names":[],"mappings":"AAIA,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyE3F"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { toCamelCase } from '../utils/naming.js';
|
|
4
|
+
export async function updateMainFile(featureName, entityName) {
|
|
5
|
+
const mainPath = path.join(process.cwd(), 'src', 'main.ts');
|
|
6
|
+
// Leer archivo actual
|
|
7
|
+
let mainContent = await fs.readFile(mainPath, 'utf-8');
|
|
8
|
+
const featureVarName = `${toCamelCase(featureName)}Feature`;
|
|
9
|
+
// 1. Agregar import del feature
|
|
10
|
+
const featureImport = `import { ${featureVarName} } from './features/${featureName}/${featureName}.feature.js';\n`;
|
|
11
|
+
// Verificar si ya existe el import
|
|
12
|
+
if (mainContent.includes(featureImport)) {
|
|
13
|
+
console.log(`Import de ${featureVarName} ya existe, saltando...`);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
// Buscar el último import existente y agregar después
|
|
17
|
+
const importRegex = /^import\s+.*from\s+['"].*['"];?\s*$/gm;
|
|
18
|
+
const imports = mainContent.match(importRegex);
|
|
19
|
+
if (imports && imports.length > 0) {
|
|
20
|
+
// Encontrar la posición del último import
|
|
21
|
+
const lastImport = imports[imports.length - 1];
|
|
22
|
+
const lastImportIndex = mainContent.lastIndexOf(lastImport);
|
|
23
|
+
const insertPosition = lastImportIndex + lastImport.length;
|
|
24
|
+
// Insertar después del último import
|
|
25
|
+
mainContent =
|
|
26
|
+
mainContent.slice(0, insertPosition) +
|
|
27
|
+
'\n' + featureImport +
|
|
28
|
+
mainContent.slice(insertPosition);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Si no hay imports, agregar al inicio del archivo
|
|
32
|
+
mainContent = featureImport + '\n' + mainContent;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 2. Agregar this.registerFeature() dentro de registerFeatures()
|
|
36
|
+
const featureRegistration = ` this.registerFeature('${featureName}', ${featureVarName});\n`;
|
|
37
|
+
if (!mainContent.includes(`registerFeature('${featureName}'`)) {
|
|
38
|
+
// Buscar el método registerFeatures() y agregar ANTES del logger.info
|
|
39
|
+
const registerFeaturesRegex = /(protected async registerFeatures\(\): Promise<void> {[\s\S]*?)( logger\.info\(['"]All.*features registered)/;
|
|
40
|
+
if (registerFeaturesRegex.test(mainContent)) {
|
|
41
|
+
mainContent = mainContent.replace(registerFeaturesRegex, `$1${featureRegistration}\n$2`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Si no existe el logger.info, agregar al final del método antes del cierre
|
|
45
|
+
const altRegex = /(protected async registerFeatures\(\): Promise<void> {[\s\S]*?this\.registerFeature\([^)]+\);[\s\S]*?)( })/;
|
|
46
|
+
if (altRegex.test(mainContent)) {
|
|
47
|
+
mainContent = mainContent.replace(altRegex, `$1${featureRegistration}$2`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Si es el primer feature, crear estructura completa
|
|
51
|
+
const emptyMethodRegex = /(protected async registerFeatures\(\): Promise<void> {\s*)( })/;
|
|
52
|
+
if (emptyMethodRegex.test(mainContent)) {
|
|
53
|
+
mainContent = mainContent.replace(emptyMethodRegex, `$1${featureRegistration}\n logger.info('All Apprecio features registered successfully');\n$2`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(`Feature ${featureName} ya está registrado, saltando...`);
|
|
60
|
+
}
|
|
61
|
+
// Escribir archivo actualizado
|
|
62
|
+
await fs.writeFile(mainPath, mainContent);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=main-updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-updater.js","sourceRoot":"","sources":["../../generators/main-updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-generator.d.ts","sourceRoot":"","sources":["../../generators/router-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD,wBAAsB,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4DrF"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { toCamelCase, toPascalCase, toSnakeCase } from '../utils/naming.js';
|
|
4
|
+
export async function generateRouter(options) {
|
|
5
|
+
const { featureName, featureDescription, entityName, tools, featurePath, serviceType } = options;
|
|
6
|
+
const className = toPascalCase(featureName);
|
|
7
|
+
const entityPascal = toPascalCase(entityName);
|
|
8
|
+
const instanceName = `${toCamelCase(featureName)}Instance`;
|
|
9
|
+
let routerContent = '';
|
|
10
|
+
// Imports
|
|
11
|
+
routerContent += `import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n`;
|
|
12
|
+
routerContent += `import { z } from 'zod';\n`;
|
|
13
|
+
routerContent += `import type { FeatureModule } from 'apprecio-mcp-base';\n`;
|
|
14
|
+
routerContent += `import { logger } from 'apprecio-mcp-base';\n`;
|
|
15
|
+
if (serviceType !== 'none') {
|
|
16
|
+
routerContent += `import ${className} from './${featureName}.service.js';\n`;
|
|
17
|
+
}
|
|
18
|
+
routerContent += `\n\n`;
|
|
19
|
+
// Crear instancia del service (si existe)
|
|
20
|
+
if (serviceType !== 'none') {
|
|
21
|
+
routerContent += `const ${instanceName} = new ${className}();\n\n`;
|
|
22
|
+
}
|
|
23
|
+
// Exportar FeatureModule
|
|
24
|
+
routerContent += `export const ${toCamelCase(featureName)}Feature: FeatureModule = {\n`;
|
|
25
|
+
routerContent += ` name: '${featureName}',\n`;
|
|
26
|
+
routerContent += ` register(mcpServer: McpServer): void {\n`;
|
|
27
|
+
// Generar cada tool
|
|
28
|
+
tools.forEach((tool) => {
|
|
29
|
+
const toolContent = generateToolDefinition(tool, featureName, entityName, entityPascal, serviceType, instanceName);
|
|
30
|
+
routerContent += toolContent + '\n';
|
|
31
|
+
});
|
|
32
|
+
// Cerrar register function
|
|
33
|
+
routerContent += ` logger.info('${featureName} feature tools registered successfully');\n`;
|
|
34
|
+
routerContent += ` },\n\n`;
|
|
35
|
+
// Initialize function
|
|
36
|
+
routerContent += ` async initialize(): Promise<void> {\n`;
|
|
37
|
+
routerContent += ` logger.info('Initializing ${featureName} feature...');\n`;
|
|
38
|
+
routerContent += ` // TODO: Add initialization logic here\n`;
|
|
39
|
+
routerContent += ` },\n\n`;
|
|
40
|
+
// Cleanup function
|
|
41
|
+
routerContent += ` async cleanup(): Promise<void> {\n`;
|
|
42
|
+
routerContent += ` logger.info('Cleaning up ${featureName} feature...');\n`;
|
|
43
|
+
routerContent += ` // TODO: Add cleanup logic here\n`;
|
|
44
|
+
routerContent += ` },\n`;
|
|
45
|
+
routerContent += `};\n`;
|
|
46
|
+
// Escribir archivo
|
|
47
|
+
const filePath = path.join(featurePath, `${featureName}.feature.ts`);
|
|
48
|
+
await fs.writeFile(filePath, routerContent);
|
|
49
|
+
return filePath;
|
|
50
|
+
}
|
|
51
|
+
function generateToolDefinition(tool, featureName, entityName, entityPascal, serviceType, instanceName) {
|
|
52
|
+
const toolName = toSnakeCase(tool === 'list' ? `list_${featureName}` :
|
|
53
|
+
tool === 'get' ? `get_${entityName}` :
|
|
54
|
+
tool === 'create' ? `create_${entityName}` :
|
|
55
|
+
tool === 'update' ? `update_${entityName}` :
|
|
56
|
+
tool === 'delete' ? `delete_${entityName}` :
|
|
57
|
+
`search_${featureName}`);
|
|
58
|
+
const description = getToolDescription(tool, entityName);
|
|
59
|
+
const inputSchema = generateInputSchema(tool, entityName);
|
|
60
|
+
const handler = generateToolHandler(tool, featureName, entityName, serviceType, instanceName);
|
|
61
|
+
let content = ` // Tool: ${description}\n`;
|
|
62
|
+
content += ` mcpServer.registerTool(\n`;
|
|
63
|
+
content += ` '${toolName}',\n`;
|
|
64
|
+
content += ` {\n`;
|
|
65
|
+
content += ` description: '${description}',\n`;
|
|
66
|
+
content += ` inputSchema: ${inputSchema}\n`;
|
|
67
|
+
content += ` },\n`;
|
|
68
|
+
content += ` ${handler}\n`;
|
|
69
|
+
content += ` );\n`;
|
|
70
|
+
return content;
|
|
71
|
+
}
|
|
72
|
+
function getToolDescription(tool, entityName) {
|
|
73
|
+
const descriptions = {
|
|
74
|
+
'list': `List all ${entityName}s`,
|
|
75
|
+
'get': `Get a specific ${entityName} by ID`,
|
|
76
|
+
'create': `Create a new ${entityName}`,
|
|
77
|
+
'update': `Update an existing ${entityName}`,
|
|
78
|
+
'delete': `Delete a ${entityName}`,
|
|
79
|
+
'search': `Search for ${entityName}s`
|
|
80
|
+
};
|
|
81
|
+
return descriptions[tool] || `Perform ${tool} operation on ${entityName}`;
|
|
82
|
+
}
|
|
83
|
+
function generateInputSchema(tool, entityName) {
|
|
84
|
+
let schema = '{\n';
|
|
85
|
+
if (tool === 'list') {
|
|
86
|
+
schema += ` page: z.number().optional().describe('Page number (number, optional)'),\n`;
|
|
87
|
+
schema += ` per_page: z.number().optional().describe('Results per page (number, optional)'),\n`;
|
|
88
|
+
schema += ` filters: z.any().optional().describe('Additional filters (object, optional)'),\n`;
|
|
89
|
+
}
|
|
90
|
+
else if (tool === 'get') {
|
|
91
|
+
schema += ` id: z.string().describe('${entityName} ID (string, required)'),\n`;
|
|
92
|
+
}
|
|
93
|
+
else if (tool === 'create') {
|
|
94
|
+
schema += ` // TODO: Agregar campos específicos del ${entityName}\n`;
|
|
95
|
+
schema += ` name: z.string().optional().describe('Name (string, optional)'),\n`;
|
|
96
|
+
schema += ` description: z.string().optional().describe('Description (string, optional)'),\n`;
|
|
97
|
+
}
|
|
98
|
+
else if (tool === 'update') {
|
|
99
|
+
schema += ` id: z.string().describe('${entityName} ID (string, required)'),\n`;
|
|
100
|
+
schema += ` // TODO: Agregar campos actualizables\n`;
|
|
101
|
+
schema += ` name: z.string().optional().describe('New name (string, optional)'),\n`;
|
|
102
|
+
}
|
|
103
|
+
else if (tool === 'delete') {
|
|
104
|
+
schema += ` id: z.string().describe('${entityName} ID (string, required)'),\n`;
|
|
105
|
+
}
|
|
106
|
+
else if (tool === 'search') {
|
|
107
|
+
schema += ` query: z.string().describe('Search query (string, required)'),\n`;
|
|
108
|
+
schema += ` filters: z.any().optional().describe('Search filters (object, optional)'),\n`;
|
|
109
|
+
}
|
|
110
|
+
schema += ` }`;
|
|
111
|
+
return schema;
|
|
112
|
+
}
|
|
113
|
+
function generateToolHandler(tool, featureName, entityName, serviceType, instanceName) {
|
|
114
|
+
const methodName = tool === 'list' ? `list${toPascalCase(featureName)}` :
|
|
115
|
+
tool === 'get' ? `get${toPascalCase(entityName)}` :
|
|
116
|
+
tool === 'create' ? `create${toPascalCase(entityName)}` :
|
|
117
|
+
tool === 'update' ? `update${toPascalCase(entityName)}` :
|
|
118
|
+
tool === 'delete' ? `delete${toPascalCase(entityName)}` :
|
|
119
|
+
`search${toPascalCase(featureName)}`;
|
|
120
|
+
let handler = `async (args, extra) => {\n`;
|
|
121
|
+
handler += ` try {\n`;
|
|
122
|
+
handler += ` // Extract token from extra context if available\n`;
|
|
123
|
+
handler += ` const req = extra as any;\n`;
|
|
124
|
+
handler += ` const token = req?.requestInfo?.headers?.authorization;\n\n`;
|
|
125
|
+
if (serviceType !== 'none') {
|
|
126
|
+
handler += ` const result = await ${instanceName}.${methodName}(args, token);\n`;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
handler += ` // TODO: Implementar lógica del ${tool}\n`;
|
|
130
|
+
handler += ` const result = { message: 'Not implemented yet', args };\n`;
|
|
131
|
+
}
|
|
132
|
+
handler += ` return { \n`;
|
|
133
|
+
handler += ` content: [{ \n`;
|
|
134
|
+
handler += ` type: 'text', \n`;
|
|
135
|
+
handler += ` text: JSON.stringify(result, null, 2) \n`;
|
|
136
|
+
handler += ` }] \n`;
|
|
137
|
+
handler += ` };\n`;
|
|
138
|
+
handler += ` } catch (error: any) {\n`;
|
|
139
|
+
handler += ` return { \n`;
|
|
140
|
+
handler += ` content: [{ \n`;
|
|
141
|
+
handler += ` type: 'text', \n`;
|
|
142
|
+
handler += ` text: \`Error: \${error.message}\` \n`;
|
|
143
|
+
handler += ` }], \n`;
|
|
144
|
+
handler += ` isError: true \n`;
|
|
145
|
+
handler += ` };\n`;
|
|
146
|
+
handler += ` }\n`;
|
|
147
|
+
handler += ` }`;
|
|
148
|
+
return handler;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=router-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-generator.js","sourceRoot":"","sources":["../../generators/router-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-generator.d.ts","sourceRoot":"","sources":["../../generators/service-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DtF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { toPascalCase } from '../utils/naming.js';
|
|
4
|
+
export async function generateService(options) {
|
|
5
|
+
const { featureName, entityName, tools, serviceType, featurePath } = options;
|
|
6
|
+
const className = toPascalCase(featureName);
|
|
7
|
+
const entityPascal = toPascalCase(entityName);
|
|
8
|
+
let serviceContent = '';
|
|
9
|
+
// Header
|
|
10
|
+
serviceContent += `// Generated service for ${featureName}\n\n`;
|
|
11
|
+
// Imports basados en tipo de service
|
|
12
|
+
if (serviceType === 'api') {
|
|
13
|
+
serviceContent += `import ApiClient from '#services/api';\n`;
|
|
14
|
+
}
|
|
15
|
+
else if (serviceType === 'database') {
|
|
16
|
+
serviceContent += `import { MongoDBConnector } from '@apprecio/mcp-base';\n`;
|
|
17
|
+
}
|
|
18
|
+
else if (serviceType === 'mixed') {
|
|
19
|
+
serviceContent += `import ApiClient from '#services/api';\n`;
|
|
20
|
+
serviceContent += `import { MongoDBConnector } from '@apprecio/mcp-base';\n`;
|
|
21
|
+
}
|
|
22
|
+
serviceContent += `import { sanitize } from '../../utils/sanitize.js';\n\n`;
|
|
23
|
+
// Interfaces de opciones para cada método
|
|
24
|
+
serviceContent += `// --- Interfaces para Opciones de Métodos ---\n\n`;
|
|
25
|
+
tools.forEach(tool => {
|
|
26
|
+
const interfaceName = generateInterfaceName(tool, entityPascal);
|
|
27
|
+
const fields = generateInterfaceFields(tool, entityName);
|
|
28
|
+
serviceContent += `export interface ${interfaceName} ${fields}\n`;
|
|
29
|
+
});
|
|
30
|
+
serviceContent += `\n`;
|
|
31
|
+
// Clase del service
|
|
32
|
+
if (serviceType === 'api') {
|
|
33
|
+
serviceContent += `class ${className} extends ApiClient {\n\n`;
|
|
34
|
+
}
|
|
35
|
+
else if (serviceType === 'database') {
|
|
36
|
+
serviceContent += `class ${className} {\n`;
|
|
37
|
+
serviceContent += ` private db: MongoDBConnector;\n\n`;
|
|
38
|
+
serviceContent += ` constructor(db: MongoDBConnector) {\n`;
|
|
39
|
+
serviceContent += ` this.db = db;\n`;
|
|
40
|
+
serviceContent += ` }\n\n`;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
serviceContent += `class ${className} {\n\n`;
|
|
44
|
+
}
|
|
45
|
+
// Generar métodos para cada tool
|
|
46
|
+
tools.forEach(tool => {
|
|
47
|
+
const method = generateServiceMethod(tool, entityName, entityPascal, serviceType);
|
|
48
|
+
serviceContent += method + '\n';
|
|
49
|
+
});
|
|
50
|
+
serviceContent += `}\n\n`;
|
|
51
|
+
serviceContent += `export default ${className};\n`;
|
|
52
|
+
// Escribir archivo
|
|
53
|
+
const filePath = path.join(featurePath, `${featureName}.service.ts`);
|
|
54
|
+
await fs.writeFile(filePath, serviceContent);
|
|
55
|
+
return filePath;
|
|
56
|
+
}
|
|
57
|
+
function generateInterfaceName(tool, entityPascal) {
|
|
58
|
+
const toolMap = {
|
|
59
|
+
'list': `List${entityPascal}Options`,
|
|
60
|
+
'get': `Get${entityPascal}Options`,
|
|
61
|
+
'create': `Create${entityPascal}Options`,
|
|
62
|
+
'update': `Update${entityPascal}Options`,
|
|
63
|
+
'delete': `Delete${entityPascal}Options`,
|
|
64
|
+
'search': `Search${entityPascal}Options`
|
|
65
|
+
};
|
|
66
|
+
return toolMap[tool] || `${toPascalCase(tool)}${entityPascal}Options`;
|
|
67
|
+
}
|
|
68
|
+
function generateInterfaceFields(tool, entityName) {
|
|
69
|
+
// Campos comunes
|
|
70
|
+
const commonFields = `{ id?: string; `;
|
|
71
|
+
const fieldMap = {
|
|
72
|
+
'list': `{ page?: number; per_page?: number; filters?: any; }`,
|
|
73
|
+
'get': `{ id: string; }`,
|
|
74
|
+
'create': `{ data: any; }`,
|
|
75
|
+
'update': `{ id: string; data: any; }`,
|
|
76
|
+
'delete': `{ id: string; }`,
|
|
77
|
+
'search': `{ query: string; filters?: any; }`
|
|
78
|
+
};
|
|
79
|
+
return fieldMap[tool] || `{ data: any; }`;
|
|
80
|
+
}
|
|
81
|
+
function generateServiceMethod(tool, entityName, entityPascal, serviceType) {
|
|
82
|
+
const methodName = tool === 'list' ? `list${entityPascal}` :
|
|
83
|
+
tool === 'get' ? `get${entityPascal}` :
|
|
84
|
+
tool === 'create' ? `create${entityPascal}` :
|
|
85
|
+
tool === 'update' ? `update${entityPascal}` :
|
|
86
|
+
tool === 'delete' ? `delete${entityPascal}` :
|
|
87
|
+
`search${entityPascal}`;
|
|
88
|
+
const optionsInterface = generateInterfaceName(tool, entityPascal);
|
|
89
|
+
let methodContent = ` async ${methodName}(options: ${optionsInterface}, token?: string) {\n`;
|
|
90
|
+
if (serviceType === 'api') {
|
|
91
|
+
if (tool === 'list') {
|
|
92
|
+
methodContent += ` const { page = 1, per_page = 10, ...params } = options;\n`;
|
|
93
|
+
methodContent += ` return this.get('${entityName}s', { page, per_page, ...params }, token || '');\n`;
|
|
94
|
+
}
|
|
95
|
+
else if (tool === 'get') {
|
|
96
|
+
methodContent += ` const { id } = options;\n`;
|
|
97
|
+
methodContent += ` return this.get(\`${entityName}s/\${id}\`, {}, token || '');\n`;
|
|
98
|
+
}
|
|
99
|
+
else if (tool === 'create') {
|
|
100
|
+
methodContent += ` const { data } = options;\n`;
|
|
101
|
+
methodContent += ` // Sanitize data aquí si es necesario\n`;
|
|
102
|
+
methodContent += ` return this.post('${entityName}s', data, token || '');\n`;
|
|
103
|
+
}
|
|
104
|
+
else if (tool === 'update') {
|
|
105
|
+
methodContent += ` const { id, data } = options;\n`;
|
|
106
|
+
methodContent += ` return this.patch(\`${entityName}s/\${id}\`, data, token || '');\n`;
|
|
107
|
+
}
|
|
108
|
+
else if (tool === 'delete') {
|
|
109
|
+
methodContent += ` const { id } = options;\n`;
|
|
110
|
+
methodContent += ` return this.delete(\`${entityName}s/\${id}\`, {}, token || '');\n`;
|
|
111
|
+
}
|
|
112
|
+
else if (tool === 'search') {
|
|
113
|
+
methodContent += ` const { query, filters } = options;\n`;
|
|
114
|
+
methodContent += ` return this.get('search/${entityName}s', { q: sanitize(query), ...filters }, token || '');\n`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (serviceType === 'database') {
|
|
118
|
+
if (tool === 'list') {
|
|
119
|
+
methodContent += ` const collection = this.db.getCollection('${entityName}s');\n`;
|
|
120
|
+
methodContent += ` const { page = 1, per_page = 10 } = options;\n`;
|
|
121
|
+
methodContent += ` return collection.find({}).skip((page - 1) * per_page).limit(per_page).toArray();\n`;
|
|
122
|
+
}
|
|
123
|
+
else if (tool === 'get') {
|
|
124
|
+
methodContent += ` const collection = this.db.getCollection('${entityName}s');\n`;
|
|
125
|
+
methodContent += ` const { id } = options;\n`;
|
|
126
|
+
methodContent += ` return collection.findOne({ _id: id });\n`;
|
|
127
|
+
}
|
|
128
|
+
else if (tool === 'create') {
|
|
129
|
+
methodContent += ` const collection = this.db.getCollection('${entityName}s');\n`;
|
|
130
|
+
methodContent += ` const { data } = options;\n`;
|
|
131
|
+
methodContent += ` return collection.insertOne(data);\n`;
|
|
132
|
+
}
|
|
133
|
+
else if (tool === 'update') {
|
|
134
|
+
methodContent += ` const collection = this.db.getCollection('${entityName}s');\n`;
|
|
135
|
+
methodContent += ` const { id, data } = options;\n`;
|
|
136
|
+
methodContent += ` return collection.updateOne({ _id: id }, { $set: data });\n`;
|
|
137
|
+
}
|
|
138
|
+
else if (tool === 'delete') {
|
|
139
|
+
methodContent += ` const collection = this.db.getCollection('${entityName}s');\n`;
|
|
140
|
+
methodContent += ` const { id } = options;\n`;
|
|
141
|
+
methodContent += ` return collection.deleteOne({ _id: id });\n`;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
methodContent += ` // TODO: Implementar lógica para ${tool}\n`;
|
|
146
|
+
methodContent += ` throw new Error('Not implemented');\n`;
|
|
147
|
+
}
|
|
148
|
+
methodContent += ` }\n`;
|
|
149
|
+
return methodContent;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=service-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-generator.js","sourceRoot":"","sources":["../../generators/service-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAe,YAAY,EAAe,MAAM,oBAAoB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA+B;IACjE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE7E,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,SAAS;IACT,cAAc,IAAI,4BAA4B,WAAW,MAAM,CAAC;IAEhE,qCAAqC;IACrC,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QACxB,cAAc,IAAI,0CAA0C,CAAC;IACjE,CAAC;SAAM,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;QACpC,cAAc,IAAI,0DAA0D,CAAC;IACjF,CAAC;SAAM,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QACjC,cAAc,IAAI,0CAA0C,CAAC;QAC7D,cAAc,IAAI,0DAA0D,CAAC;IACjF,CAAC;IAED,cAAc,IAAI,yDAAyD,CAAC;IAE5E,0CAA0C;IAC1C,cAAc,IAAI,oDAAoD,CAAC;IAEvE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACjB,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACzD,cAAc,IAAI,oBAAoB,aAAa,IAAI,MAAM,IAAI,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,cAAc,IAAI,IAAI,CAAC;IAEvB,oBAAoB;IACpB,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QACxB,cAAc,IAAI,SAAS,SAAS,0BAA0B,CAAC;IACnE,CAAC;SAAM,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;QACpC,cAAc,IAAI,SAAS,SAAS,MAAM,CAAC;QAC3C,cAAc,IAAI,uCAAuC,CAAC;QAC1D,cAAc,IAAI,2CAA2C,CAAC;QAC9D,cAAc,IAAI,yBAAyB,CAAC;QAC5C,cAAc,IAAI,WAAW,CAAC;IAClC,CAAC;SAAM,CAAC;QACJ,cAAc,IAAI,SAAS,SAAS,QAAQ,CAAC;IACjD,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACjB,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAClF,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,cAAc,IAAI,OAAO,CAAC;IAC1B,cAAc,IAAI,kBAAkB,SAAS,KAAK,CAAC;IAEnD,mBAAmB;IACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,WAAW,aAAa,CAAC,CAAC;IACrE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAE7C,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,YAAoB;IAC7D,MAAM,OAAO,GAA2B;QACpC,MAAM,EAAE,OAAO,YAAY,SAAS;QACpC,KAAK,EAAE,MAAM,YAAY,SAAS;QAClC,QAAQ,EAAE,SAAS,YAAY,SAAS;QACxC,QAAQ,EAAE,SAAS,YAAY,SAAS;QACxC,QAAQ,EAAE,SAAS,YAAY,SAAS;QACxC,QAAQ,EAAE,SAAS,YAAY,SAAS;KAC3C,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,SAAS,CAAC;AAC1E,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY,EAAE,UAAkB;IAC7D,iBAAiB;IACjB,MAAM,YAAY,GAAG,iBAAiB,CAAC;IAEvC,MAAM,QAAQ,GAA2B;QACrC,MAAM,EAAE,sDAAsD;QAC9D,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,4BAA4B;QACtC,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,mCAAmC;KAChD,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC;AAC9C,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,UAAkB,EAAE,YAAoB,EAAE,WAAmB;IACtG,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,YAAY,EAAE,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC;YACvC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;gBAC7C,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;oBAC7C,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;wBAC7C,SAAS,YAAY,EAAE,CAAC;IAE3C,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEnE,IAAI,aAAa,GAAG,aAAa,UAAU,aAAa,gBAAgB,uBAAuB,CAAC;IAEhG,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QACxB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAClB,aAAa,IAAI,mEAAmE,CAAC;YACrF,aAAa,IAAI,4BAA4B,UAAU,oDAAoD,CAAC;QAChH,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACxB,aAAa,IAAI,mCAAmC,CAAC;YACrD,aAAa,IAAI,6BAA6B,UAAU,iCAAiC,CAAC;QAC9F,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,aAAa,IAAI,qCAAqC,CAAC;YACvD,aAAa,IAAI,iDAAiD,CAAC;YACnE,aAAa,IAAI,6BAA6B,UAAU,2BAA2B,CAAC;QACxF,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,aAAa,IAAI,yCAAyC,CAAC;YAC3D,aAAa,IAAI,+BAA+B,UAAU,mCAAmC,CAAC;QAClG,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,aAAa,IAAI,mCAAmC,CAAC;YACrD,aAAa,IAAI,gCAAgC,UAAU,iCAAiC,CAAC;QACjG,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,aAAa,IAAI,+CAA+C,CAAC;YACjE,aAAa,IAAI,mCAAmC,UAAU,yDAAyD,CAAC;QAC5H,CAAC;IACL,CAAC;SAAM,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;QACpC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAClB,aAAa,IAAI,qDAAqD,UAAU,QAAQ,CAAC;YACzF,aAAa,IAAI,wDAAwD,CAAC;YAC1E,aAAa,IAAI,6FAA6F,CAAC;QACnH,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACxB,aAAa,IAAI,qDAAqD,UAAU,QAAQ,CAAC;YACzF,aAAa,IAAI,mCAAmC,CAAC;YACrD,aAAa,IAAI,mDAAmD,CAAC;QACzE,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,aAAa,IAAI,qDAAqD,UAAU,QAAQ,CAAC;YACzF,aAAa,IAAI,qCAAqC,CAAC;YACvD,aAAa,IAAI,8CAA8C,CAAC;QACpE,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,aAAa,IAAI,qDAAqD,UAAU,QAAQ,CAAC;YACzF,aAAa,IAAI,yCAAyC,CAAC;YAC3D,aAAa,IAAI,qEAAqE,CAAC;QAC3F,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,aAAa,IAAI,qDAAqD,UAAU,QAAQ,CAAC;YACzF,aAAa,IAAI,mCAAmC,CAAC;YACrD,aAAa,IAAI,qDAAqD,CAAC;QAC3E,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,aAAa,IAAI,4CAA4C,IAAI,IAAI,CAAC;QACtE,aAAa,IAAI,+CAA+C,CAAC;IACrE,CAAC;IAED,aAAa,IAAI,SAAS,CAAC;IAE3B,OAAO,aAAa,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-generator.d.ts","sourceRoot":"","sources":["../../generators/validation-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCzF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { toPascalCase } from '../utils/naming.js';
|
|
4
|
+
export async function generateValidation(options) {
|
|
5
|
+
const { featureName, entityName, tools, featurePath } = options;
|
|
6
|
+
const entityPascal = toPascalCase(entityName);
|
|
7
|
+
let validationContent = '';
|
|
8
|
+
// Import Zod
|
|
9
|
+
validationContent += `import { z } from 'zod';\n\n`;
|
|
10
|
+
// Campos comunes reutilizables
|
|
11
|
+
validationContent += `// --- Campos Comunes Reutilizables ---\n\n`;
|
|
12
|
+
validationContent += `const id = z.string().min(1, "ID is required.");\n`;
|
|
13
|
+
validationContent += `const name = z.string().min(1, "Name is required.");\n`;
|
|
14
|
+
validationContent += `const description = z.string().optional();\n`;
|
|
15
|
+
validationContent += `const page = z.number().int().positive().optional();\n`;
|
|
16
|
+
validationContent += `const perPage = z.number().int().positive().optional();\n`;
|
|
17
|
+
validationContent += `const query = z.string().min(1, "Query is required.");\n\n`;
|
|
18
|
+
// Generar schemas para cada tool
|
|
19
|
+
validationContent += `// --- Schemas de Validación por Tool ---\n\n`;
|
|
20
|
+
tools.forEach(tool => {
|
|
21
|
+
const schema = generateToolSchema(tool, entityName, entityPascal);
|
|
22
|
+
validationContent += schema + '\n';
|
|
23
|
+
});
|
|
24
|
+
// Escribir archivo
|
|
25
|
+
const filePath = path.join(featurePath, `${featureName}.validation.ts`);
|
|
26
|
+
await fs.writeFile(filePath, validationContent);
|
|
27
|
+
return filePath;
|
|
28
|
+
}
|
|
29
|
+
function generateToolSchema(tool, entityName, entityPascal) {
|
|
30
|
+
const schemaName = `${tool}${entityPascal}Schema`;
|
|
31
|
+
let schema = `export const ${schemaName} = z.object({\n`;
|
|
32
|
+
if (tool === 'list') {
|
|
33
|
+
schema += ` page,\n`;
|
|
34
|
+
schema += ` perPage,\n`;
|
|
35
|
+
schema += ` // TODO: Agregar filtros específicos\n`;
|
|
36
|
+
}
|
|
37
|
+
else if (tool === 'get') {
|
|
38
|
+
schema += ` id,\n`;
|
|
39
|
+
}
|
|
40
|
+
else if (tool === 'create') {
|
|
41
|
+
schema += ` name,\n`;
|
|
42
|
+
schema += ` description,\n`;
|
|
43
|
+
schema += ` // TODO: Agregar campos específicos del ${entityName}\n`;
|
|
44
|
+
}
|
|
45
|
+
else if (tool === 'update') {
|
|
46
|
+
schema += ` id,\n`;
|
|
47
|
+
schema += ` name: z.string().optional(),\n`;
|
|
48
|
+
schema += ` description,\n`;
|
|
49
|
+
schema += ` // TODO: Agregar campos actualizables\n`;
|
|
50
|
+
}
|
|
51
|
+
else if (tool === 'delete') {
|
|
52
|
+
schema += ` id,\n`;
|
|
53
|
+
}
|
|
54
|
+
else if (tool === 'search') {
|
|
55
|
+
schema += ` query,\n`;
|
|
56
|
+
schema += ` page,\n`;
|
|
57
|
+
schema += ` perPage,\n`;
|
|
58
|
+
}
|
|
59
|
+
schema += `});\n`;
|
|
60
|
+
return schema;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=validation-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-generator.js","sourceRoot":"","sources":["../../generators/validation-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAe,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA+B;IACpE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEhE,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAE3B,aAAa;IACb,iBAAiB,IAAI,8BAA8B,CAAC;IAEpD,+BAA+B;IAC/B,iBAAiB,IAAI,6CAA6C,CAAC;IACnE,iBAAiB,IAAI,oDAAoD,CAAC;IAC1E,iBAAiB,IAAI,wDAAwD,CAAC;IAC9E,iBAAiB,IAAI,8CAA8C,CAAC;IACpE,iBAAiB,IAAI,wDAAwD,CAAC;IAC9E,iBAAiB,IAAI,2DAA2D,CAAC;IACjF,iBAAiB,IAAI,4DAA4D,CAAC;IAElF,iCAAiC;IACjC,iBAAiB,IAAI,+CAA+C,CAAC;IAErE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACjB,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QAClE,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,mBAAmB;IACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,WAAW,gBAAgB,CAAC,CAAC;IACxE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEhD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,UAAkB,EAAE,YAAoB;IAC9E,MAAM,UAAU,GAAG,GAAG,IAAI,GAAG,YAAY,QAAQ,CAAC;IAElD,IAAI,MAAM,GAAG,gBAAgB,UAAU,iBAAiB,CAAC;IAEzD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,aAAa,CAAC;QACxB,MAAM,IAAI,gBAAgB,CAAC;QAC3B,MAAM,IAAI,4CAA4C,CAAC;IAC3D,CAAC;SAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,WAAW,CAAC;IAC1B,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,aAAa,CAAC;QACxB,MAAM,IAAI,oBAAoB,CAAC;QAC/B,MAAM,IAAI,+CAA+C,UAAU,IAAI,CAAC;IAC5E,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,WAAW,CAAC;QACtB,MAAM,IAAI,oCAAoC,CAAC;QAC/C,MAAM,IAAI,oBAAoB,CAAC;QAC/B,MAAM,IAAI,6CAA6C,CAAC;IAC5D,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,WAAW,CAAC;IAC1B,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,cAAc,CAAC;QACzB,MAAM,IAAI,aAAa,CAAC;QACxB,MAAM,IAAI,gBAAgB,CAAC;IAC/B,CAAC;IAED,MAAM,IAAI,OAAO,CAAC;IAElB,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface GenerateFeatureOptions {
|
|
2
|
+
featureName: string;
|
|
3
|
+
featureDescription: string;
|
|
4
|
+
entityName: string;
|
|
5
|
+
tools: string[];
|
|
6
|
+
serviceType: 'api' | 'database' | 'mixed' | 'custom' | 'none';
|
|
7
|
+
featurePath: string;
|
|
8
|
+
}
|
|
9
|
+
export interface GenerateToolOptions {
|
|
10
|
+
featureName: string;
|
|
11
|
+
toolName: string;
|
|
12
|
+
toolDescription: string;
|
|
13
|
+
addToService: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ToolDefinition {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
inputSchema: Record<string, any>;
|
|
19
|
+
methodName: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ServiceMethodDefinition {
|
|
22
|
+
name: string;
|
|
23
|
+
params: string[];
|
|
24
|
+
returnType: string;
|
|
25
|
+
implementation: string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,KAAK,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9D,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convierte string a camelCase
|
|
3
|
+
* Ejemplo: gift_cards -> giftCards
|
|
4
|
+
*/
|
|
5
|
+
export declare function toCamelCase(str: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Convierte string a PascalCase
|
|
8
|
+
* Ejemplo: gift_cards -> GiftCards
|
|
9
|
+
*/
|
|
10
|
+
export declare function toPascalCase(str: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Convierte string a snake_case
|
|
13
|
+
* Ejemplo: giftCards -> gift_cards
|
|
14
|
+
*/
|
|
15
|
+
export declare function toSnakeCase(str: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Convierte string a kebab-case
|
|
18
|
+
* Ejemplo: giftCards -> gift-cards
|
|
19
|
+
*/
|
|
20
|
+
export declare function toKebabCase(str: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Pluraliza un nombre simple
|
|
23
|
+
* Ejemplo: card -> cards, category -> categories
|
|
24
|
+
*/
|
|
25
|
+
export declare function pluralize(str: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Singulariza un nombre simple
|
|
28
|
+
* Ejemplo: cards -> card, categories -> category
|
|
29
|
+
*/
|
|
30
|
+
export declare function singularize(str: string): string;
|
|
31
|
+
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../utils/naming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ/C"}
|