Define a plugin interface where each plugin returns a DynamicModule from a static register() method. A core module accepts an array of DynamicModule objects at import time, imports and re-exports all of them, allowing the application to be extended by assembling plugin modules in AppModule.
Open/closed principle — add plugins without modifying the core module.
Each plugin is independently configurable via its register() options.
Plugins are standard NestJS modules — they can declare controllers, guards, and interceptors.
Plugin providers are available to the rest of the app through CoreModule re-exports.