Building a Plugin
Create a QUESTPIE codegen plugin — categories, extensions, module registries.
A plugin tells codegen what to discover and what types to generate. It's the highest level of extension.
Plugin Structure
import type { CodegenPlugin } from "questpie/codegen";
export function myPlugin(): CodegenPlugin {
return {
name: "my-plugin",
targets: {
server: {
root: ".",
outputFile: "index.ts",
// File categories to discover
categories: {
widgets: {
dirs: ["widgets"],
prefix: "widg",
recursive: true,
emit: "record",
registryKey: "widgets",
moduleContributionKey: "widgets",
},
},
// Single-file or directory patterns
discover: {
widgetConfig: {
pattern: "config/widgets.ts",
configKey: "widgets",
},
},
// Builder and singleton factories
registries: {
collectionExtensions: {
widget: { stateKey: "widget" },
},
singletonFactories: {
widgetConfig: { configType: "WidgetConfig" },
},
},
},
},
};
}Usage
Register in runtime config:
import { myPlugin } from "my-plugin-package";
export default runtimeConfig({
plugins: [myPlugin()],
// ...
});Plugin Lifecycle
- Discovery — Codegen scans for files matching your category patterns
- Import — Files are imported and exports are read
- Type Generation — Types are generated for the discovered entities
- Module Augmentation — Registry types are augmented
Real-World Example: Admin Plugin
The admin module contributes an admin codegen plugin automatically:
// A simplified view of what the admin plugin declares:
categories: {
blocks: { dirs: ["blocks"], prefix: "bloc", registryKey: "blocks" },
}
discover: {
adminConfig: {
pattern: "config/admin.ts",
configKey: "admin",
},
}Related Pages
- Plugins — Plugin architecture
- Building a Module — Modules (values)
- Codegen — Generated output