Skip to content

createPluginFactory

Create a plugin factory function that converts a plugin class to a Vite plugin instance.

typescript
import { createPluginFactory } from '@meng-xi/vite-plugin/factory'

Function Signature

typescript
function createPluginFactory<T extends BasePluginOptions, P extends BasePlugin<T>, R = T>(
  PluginClass: new (options: T, loggerConfig?: LoggerOptions) => P,
  normalizer?: OptionsNormalizer<T, R>
): PluginFactory<T, R>

Generic Parameters

ParameterConstraintDescription
TBasePluginOptionsPlugin options type
PBasePlugin<T>Plugin instance type
RT (default)Raw options type

Parameters

ParameterTypeDescription
PluginClassPlugin class constructorPlugin class
normalizerOptionsNormalizer<T, R>Options normalizer (optional)

Returns

PluginFactory<T, R> - Plugin factory function


Basic Usage

typescript
import { BasePlugin, createPluginFactory } from '@meng-xi/vite-plugin/factory'
import type { BasePluginOptions } from '@meng-xi/vite-plugin/factory'

interface MyPluginOptions extends BasePluginOptions {
	outputPath: string
}

class MyPlugin extends BasePlugin<MyPluginOptions> {
	// ... implementation
}

// Create factory function
export const myPlugin = createPluginFactory(MyPlugin)

Usage

typescript
import { defineConfig } from 'vite'
import { myPlugin } from './my-plugin'

export default defineConfig({
	plugins: [
		myPlugin({ outputPath: 'dist/output.json' })
	]
})

With Options Normalizer

Supports simplified configuration (e.g. string parameter).

typescript
interface MyPluginOptions extends BasePluginOptions {
	path: string
}

class MyPlugin extends BasePlugin<MyPluginOptions> {
	// ... implementation
}

// Support string or object config
export const myPlugin = createPluginFactory(
	MyPlugin,
	(opt?: string | MyPluginOptions) =>
		typeof opt === 'string' ? { path: opt } : (opt ?? { path: '' })
)

Usage

typescript
// Both are equivalent
myPlugin('/path/to/file')
myPlugin({ path: '/path/to/file' })

Full Example

typescript
import type { Plugin } from 'vite'
import { BasePlugin, createPluginFactory } from '@meng-xi/vite-plugin/factory'
import type { BasePluginOptions } from '@meng-xi/vite-plugin/factory'
import { writeFileContent } from '@meng-xi/vite-plugin/common'

// Define options type
interface BuildInfoOptions extends BasePluginOptions {
	outputPath?: string
}

// Implement plugin class
class BuildInfoPlugin extends BasePlugin<BuildInfoOptions> {
	protected getPluginName() {
		return 'build-info'
	}

	protected getDefaultOptions() {
		return { outputPath: 'dist/build-info.json' }
	}

	protected getEnforce(): Plugin['enforce'] {
		return 'post'
	}

	protected addPluginHooks(plugin: Plugin) {
		plugin.closeBundle = async () => {
			if (!this.options.enabled) return

			await this.safeExecute(async () => {
				const info = {
					buildTime: new Date().toISOString(),
					mode: this.viteConfig?.mode
				}
				await writeFileContent(this.options.outputPath, JSON.stringify(info, null, 2))
				this.logger.success('Build info generated')
			}, 'Generate build info')
		}
	}
}

// Export factory function
export const buildInfo = createPluginFactory(BuildInfoPlugin)

Released under the MIT License.