Skip to content

weedz/plugin-loader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

plugin-loader

npm

Usage

Define a base class and api for plugins:

// Plugin.ts
import { PluginBase } from "@weedzcokie/plugin-loader";

// this could be anything.
export type PluginApi = {
    x: number
    y: number
}

export default abstract class Plugin extends PluginBase<PluginApi> {
    x: number;
    y: number;
    
    init?(): void;

    constructor(api: PluginApi) {
        super(api);
        // `api` is also available from `this.api`.
        this.x = api.x;
        this.y = api.y;
    }
}

Plugin manifest (plugin.json)

{
    "name": "test-plugin",
    "version": "1.0.0"
}

version must be a semver compatible version string.

And with dependencies, similar to how package.json defines dependencies:

{
    "name": "plugin-2",
    "version": "1.0.0",
    "dependencies": {
        "test-plugin": "^1.0.0"
    }
}

Load plugins:

Assuming the following directory tree:

├─ plugins
│  ├─ test-plugin
│  │  ├── index.ts
│  │  └── plugin.json
│  └─ plugin-2
│     ├── index.ts
│     └── plugin.json
├─ index.ts
└─ Plugin.ts
// index.ts
import Loader, { NodeHandler } from "@weedzcokie/plugin-loader";
import Plugin, { PluginApi } from "./Plugin.ts":

const plugins = await Loader<Plugin, PluginApi>(["test-plugin"], {
    api: {
        x: 1,
        y: 2,
    },

    // Path to where plugins are located
    path: path.resolve('./plugins'),
    log: (msg: string) => console.log('[PluginLoader]', msg),
    handlers: {
        default: NodeHandler
    }
});

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks