QUESTPIE
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

  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 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",
    },
  },
}

On this page