QUESTPIE

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:

questpie.config.ts
import { myPlugin } from "my-plugin-package";

export default runtimeConfig({
	plugins: [myPlugin()],
	// ...
});

Plugin Lifecycle

  1. Discovery — Codegen scans for files matching your category patterns
  2. Import — Files are imported and exports are read
  3. Type Generation — Types are generated for the discovered entities
  4. 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",
  },
}

On this page