feat(plugin-tools): add convenience functions getOrLoadPlugin and getOrLoadPlugins
This commit is contained in:
parent
81fde2ebd3
commit
23a323c675
2 changed files with 53 additions and 1 deletions
5
.changeset/eight-baboons-press.md
Normal file
5
.changeset/eight-baboons-press.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@emigrate/plugin-tools': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Add the convenience functions `getOrLoadPlugin` and `getOrLoadPlugins`
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
import process from 'node:process';
|
import process from 'node:process';
|
||||||
import { type PluginFromType, type PluginType, type GeneratorPlugin, type StoragePlugin } from './types.js';
|
import {
|
||||||
|
type PluginFromType,
|
||||||
|
type PluginType,
|
||||||
|
type GeneratorPlugin,
|
||||||
|
type StoragePlugin,
|
||||||
|
type Plugin,
|
||||||
|
} from './types.js';
|
||||||
|
|
||||||
export const isGeneratorPlugin = (plugin: any): plugin is GeneratorPlugin => {
|
export const isGeneratorPlugin = (plugin: any): plugin is GeneratorPlugin => {
|
||||||
if (!plugin || typeof plugin !== 'object') {
|
if (!plugin || typeof plugin !== 'object') {
|
||||||
|
|
@ -29,6 +35,47 @@ export const isPluginOfType = <T extends PluginType>(type: T, plugin: any): plug
|
||||||
throw new Error(`Unknown plugin type: ${type}`);
|
throw new Error(`Unknown plugin type: ${type}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getOrLoadPlugin = async <T extends PluginType>(
|
||||||
|
type: T,
|
||||||
|
plugins: Array<Plugin | string>,
|
||||||
|
): Promise<PluginFromType<T> | undefined> => {
|
||||||
|
for await (const plugin of plugins) {
|
||||||
|
if (isPluginOfType(type, plugin)) {
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadedPlugin = typeof plugin === 'string' ? await loadPlugin(type, plugin) : undefined;
|
||||||
|
|
||||||
|
if (loadedPlugin) {
|
||||||
|
return loadedPlugin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getOrLoadPlugins = async <T extends PluginType>(
|
||||||
|
type: T,
|
||||||
|
plugins: Array<Plugin | string>,
|
||||||
|
): Promise<Array<PluginFromType<T>>> => {
|
||||||
|
const result: Array<PluginFromType<T>> = [];
|
||||||
|
|
||||||
|
for await (const plugin of plugins) {
|
||||||
|
if (isPluginOfType(type, plugin)) {
|
||||||
|
result.push(plugin);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadedPlugin = typeof plugin === 'string' ? await loadPlugin(type, plugin) : undefined;
|
||||||
|
|
||||||
|
if (loadedPlugin) {
|
||||||
|
result.push(loadedPlugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
export const loadPlugin = async <T extends PluginType>(
|
export const loadPlugin = async <T extends PluginType>(
|
||||||
type: T,
|
type: T,
|
||||||
plugin: string,
|
plugin: string,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue