2.1.20 • Published 2 years ago

plugin-anything v2.1.20

Weekly downloads
38
License
ISC
Repository
github
Last release
2 years ago

Inroduction

Make pluginable applications.

How does it work ?

Demo

// Custom Plugins
class CustomPluginA {
    constructor(options) {
        console.log('CustomPluginA options', options);
    }

    apply(customApp) {
        customApp.hooks.hookA.tap('my plugin A', async (data) => {
            console.log('CustomPluginA runs', data);
            return 'a';
        });
    }
}

class CustomPluginB {
    constructor(options) {
        console.log('CustomPluginB options', options);
    }

    apply(customApp) {
        customApp.hooks.hookB.tap('my plugin B', async (data) => {
            console.log('CustomPluginB runs', data);
        });
    }
}

// Custom App
const { PluginAnything } = require('plugin-anything');
class CustomApp extends PluginAnything {
    constructor() {
        super();

        // define hooks for plugin using
        this.hooks = {
            hookA: this.createHook(), // 'createHook' inherits from PluginAnything
            hookB: this.createHook(), // 'createHook' inherits from PluginAnything
        }

        this.install({
            plugins: [ CustomPluginA, CustomPluginB ],
        })

        (async () => {
            // mock wait 2s
            await new Promise(resolve => setTimeout(resolve, 2000))
            await this.hooks.hookA.flush();

            // mock wait 2s
            await new Promise(resolve => setTimeout(resolve, 2000))
            await this.hooks.hookB.flush();
        })()
    }

    hooks = null;
}

new CustomApp();
CustomPluginA options {}
CustomPluginB options {}

# wait 2s
CustomPluginA runs
# wait 2s
CustomPluginB runs

APIs

const pluginAnything = new PluginAnything(options: { [name: string]: any });

Hook Handler: pluginAnything.createHook()

const hook = createHook();

create a hook.

  • hook.tap(name: string, callback: Function | Promise<any>)

    Add callback at current hook event.

    name could be any string for event description.

  • hook.untap(name?: string)

    Remove callback list whose name equals name.

    When name is blank, clear callback list.

  • hook.flush(type?: sync | waterfall | paralle, initData?: skip = false, paralleLimit = 3)

    Run all callbacks.

    • sync (default)

      run callbacks one next one.

    • waterfall

      run callbacks one next none.

      and previous returned value will be parameter of next callback.

    • paralle

      run all callbacks at the same time.

    • paralle-sync

      run callbacks by sync sequences:

      [ callback1, callback2, cakkback3 ]
      
      [ callback4, ... ]
      
      ...
  • hook.beforeFlush(callback) and hook.afterFlush(callback)

    regist callback before and after flush.

    callback should be a Function with return type any | Promise<any>.

    example:

    (async () => {
        hook.beforeFlush(async () => {
            console.log('before flush');
        });
    
        hook.afterFlush(async () => {
            console.log('after flush');
        });
    
        await hook.flush();
    })();
    
    // result
    log: before flush
    
    flushing...
    
    log: after flush

Plugins Handler: pluginAnything.install(initOptions: typeInitOptions): Array<{ [name: string]: any }>

interface typeInitOptions {
    searchList?: Array<string>;
    plugins?: Array<string | Function | object | Array<any>>;
    presets?: Array<string | Array<any>>;
}

Install plugins and return plugin list.

  • initOptions.searchList: Array< string >

    Absolute folder path list that will be used in searching plugins.

    examples:

    [
        '/path_a/node_modules',
        '/path_b/node_modules'
    ]
  • initOptions.plugins: Array< string | FunctionContructor | { apply(data?: any): any; [ name: string ]: any } | Array<string | FunctionContructor, object> >

    class MyPlugin {
        constructor(options) {
            this.options = options;
        };
    
        options: {};
    
        apply(pa) {
    
        }
    }
// config demo
plugins: {
    'my-plugin-0',

    [ 'my-plugin-1', { params: 1 } ],

    [ MyPlugin, { params: 2 } ],

    new MyPlugin({ params: 2 })
}
```

LICENSE

MIT

2.1.19

2 years ago

2.1.20

2 years ago

2.1.18

3 years ago

2.1.16

3 years ago

2.1.14

3 years ago

2.1.15

3 years ago

2.1.12

3 years ago

2.1.13

3 years ago

2.1.11

3 years ago

2.1.9

3 years ago

2.1.10

3 years ago

2.1.8

3 years ago

2.1.6

3 years ago

2.1.5

3 years ago

2.1.7

3 years ago

2.1.4

3 years ago

2.1.3

3 years ago

2.1.2

3 years ago

2.1.1

3 years ago

2.1.0

3 years ago

2.0.21

3 years ago

2.0.20

3 years ago

2.0.19

3 years ago

2.0.17

4 years ago

2.0.18

4 years ago

2.0.16

4 years ago

2.0.15

4 years ago

2.0.14

4 years ago

2.0.13

4 years ago

2.0.12

4 years ago

2.0.11

4 years ago

2.0.10

4 years ago

2.0.9

4 years ago

2.0.8

4 years ago

2.0.7

4 years ago

2.0.5

4 years ago

2.0.4

4 years ago

2.0.3

4 years ago

2.0.2

4 years ago

2.0.1

4 years ago

2.0.0

4 years ago

1.3.2

4 years ago

1.3.1

4 years ago

1.3.0

4 years ago

1.2.0

4 years ago

1.1.0

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago