Plugin Development Guide
A devtool plugin is an object that contains various lifecycle hooks for injecting custom logic during code generation, simplifying the control of code generation logic.
Additionally, @alova/wormhole provides preset plugins that can be used directly.
📄️ Renaming
Introduction
📄️ Tag Modifier
Introduction
📄️ Payload Modifier
Introduction
📄️ API Filter
Introduction
📄️ Apifox Fetcher
Introduction
📄️ Type Replacer
Introduction
Next, we will detail how to create and use plugins.
Plugin Definition
interface ApiPlugin {
name?: string;
/**
* Replace or manipulate the configuration object passed to wormhole.
* Returning undefined or null will not replace anything.
*/
config?: (config: GeneratorConfig) => MaybePromise<GeneratorConfig | undefined | null | void>;
/**
* Called before parsing the OpenAPI file.
*/
beforeOpenapiParse?: (config: GeneratorConfig) => void;
/**
* Manipulate the document after parsing the OpenAPI file.
* Returning undefined or null will not replace anything.
*/
afterOpenapiParse?: (
document: OpenAPIDocument
) => MaybePromise<OpenAPIDocument | undefined | null | void>;
/**
* Manipulate template data before generating code.
* Returning undefined or null will not replace anything.
*/
beforeCodeGenerate?: (
data: any,
outputFile: string,
ctx: {
renderTemplate: () => Promise<string>;
fileName: string;
}
) => MaybePromise<string | undefined | null | void>;
/**
* Called after code generation is complete.
*/
afterCodeGenerate?: (error?: Error) => void;
}
Lifecycle Hooks Explained
-
config- Purpose: Replace or manipulate the configuration object passed to
wormhole. - Use Case: Dynamically modify the generator's global configuration.
- Purpose: Replace or manipulate the configuration object passed to
-
beforeOpenapiParse- Purpose: Called before parsing the OpenAPI file.
- Use Case: Access the complete config for pre-processing.
-
afterOpenapiParse- Purpose: Manipulate the document after parsing the OpenAPI file.
- Use Case: Modify the parsed OpenAPI document, such as adding or removing fields.
-
beforeCodeGenerate- Purpose: Manipulate template data before generating code.
- Use Case: Dynamically modify template data or filenames.
-
afterCodeGenerate- Purpose: Called after code generation is complete.
- Use Case: Handle errors during generation or perform follow-up actions.
Example Code
Here is a simple plugin example for modifying tags.
import { createPlugin } from '@alova/wormhole';
interface Config {
match: (tag: any) => boolean;
handler: (tag: any) => any;
}
const createTagModifierPlugin = createPlugin((config: Config) => ({
afterOpenapiParse: apiDescription => {
if (apiDescription.tags) {
apiDescription.tags = apiDescription.tags.map(tag => {
if (config.match(tag)) {
return config.handler(tag);
}
return tag;
});
}
return apiDescription;
},
afterCodeGenerate: error => {
if (error) {
console.error('[tag-modifier] Error during code generation:', error);
} else {
console.log('[tag-modifier] Code generation complete!');
}
}
}));
Using the Plugin
alova.config.js
export default defineConfig({
generator: [
{
// ...
createTagModifierPlugin({
match: tag => tag.includes('foo'),
handler: tag => tag.replace('foo', 'bar')
})
}
]
});
For more example code, visit the Official Preset Plugin Source.
Is using alova in your project? please tell me!