Extend the Platform
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";
export function myPlugin(): CodegenPlugin {
return {
name: "my-plugin",
// File categories to discover
categories: {
widgets: {
pattern: "widgets/**/*.ts",
cardinality: "map",
recursive: true,
featureLayout: true,
mergeStrategy: "record",
moduleContributionKey: "widgets",
registryKey: "widgets",
},
},
// Builder extensions
extensions: {
collection: {
methods: {
widget: { type: "WidgetConfig" },
},
},
},
// Single-file factories
singletons: {
widgetConfig: {
pattern: "widget-config.ts",
factory: "widgetConfig",
},
},
};
}Usage
Register in runtime config:
questpie.config.ts
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 adminPlugin() from @questpie/admin/plugin is a production example:
// What adminPlugin() declares:
categories: {
blocks: { pattern: "blocks/**/*.ts", cardinality: "map" },
}
discover: {
adminConfig: {
pattern: "config/admin.ts",
destructure: {
sidebar: "sidebar",
dashboard: "dashboard",
branding: "branding",
locale: "adminLocale",
},
},
}Related Pages
- Plugins — Plugin architecture
- Building a Module — Modules (values)
- Codegen — Generated output