@kubb/core
Version:
Core functionality for Kubb's plugin-based code generation system, providing the foundation for transforming OpenAPI specifications.
76 lines (64 loc) • 2.29 kB
text/typescript
import path from 'node:path'
import type { FileManager } from './FileManager.ts'
import type { PluginManager } from './PluginManager.ts'
import type { Plugin, PluginContext, PluginFactoryOptions, UserPluginWithLifeCycle } from './types.ts'
type PluginFactory<T extends PluginFactoryOptions = PluginFactoryOptions> = (options: T['options']) => UserPluginWithLifeCycle<T>
type OptionalPluginFactory<T extends PluginFactoryOptions = PluginFactoryOptions> = (options?: T['options']) => UserPluginWithLifeCycle<T>
export function createPlugin<T extends PluginFactoryOptions = PluginFactoryOptions>(factory: PluginFactory<T>): OptionalPluginFactory<T> {
return (options = {}) => {
return factory(options)
}
}
type Options = {
config: PluginContext['config']
fileManager: FileManager
pluginManager: PluginManager
resolvePath: PluginContext['resolvePath']
resolveName: PluginContext['resolveName']
logger: PluginContext['logger']
getPlugins: () => Array<Plugin>
plugin?: PluginContext['plugin']
}
// not publicly exported
export type PluginCore = PluginFactoryOptions<'core', Options, Options, PluginContext, never>
export const pluginCore = createPlugin<PluginCore>((options) => {
const { fileManager, pluginManager, resolvePath, resolveName, logger } = options
return {
name: 'core',
options,
key: ['core'],
context() {
return {
get config() {
return options.config
},
get plugins() {
return options.getPlugins()
},
get plugin() {
// see pluginManger.#execute where we override with `.call` the context with the correct plugin
return options.plugin as NonNullable<Options['plugin']>
},
logger,
fileManager,
pluginManager,
async addFile(...files) {
const resolvedFiles = await fileManager.add(...files)
if (!Array.isArray(resolvedFiles)) {
return [resolvedFiles]
}
return resolvedFiles
},
resolvePath,
resolveName,
}
},
resolvePath(baseName) {
const root = path.resolve(options.config.root, options.config.output.path)
return path.resolve(root, baseName)
},
resolveName(name) {
return name
},
}
})