microplugin
Advanced tools
Comparing version 0.0.1 to 0.0.2
@@ -5,3 +5,3 @@ { | ||
"description": "A lightweight plugin / dependency system for javascript libraries.", | ||
"version": "0.0.1", | ||
"version": "0.0.2", | ||
"license": "Apache License, Version 2.0", | ||
@@ -8,0 +8,0 @@ "readmeFilename": "README.md", |
@@ -5,3 +5,3 @@ { | ||
"description": "A lightweight plugin / dependency system for javascript libraries.", | ||
"version": "0.0.1", | ||
"version": "0.0.2", | ||
"author": "Brian Reavis <brian@thirdroute.com>", | ||
@@ -16,2 +16,2 @@ "main": "src/microplugin.js", | ||
"engines": {"node": "*"} | ||
} | ||
} |
103
README.md
# microplugin.js | ||
[![NPM version](https://badge.fury.io/js/microplugin.png)](http://badge.fury.io/js/microplugin) | ||
[![Build Status](https://travis-ci.org/brianreavis/microplugin.js.png?branch=master)](https://travis-ci.org/brianreavis/microplugin.js) | ||
(in development) | ||
*Keep code modularized & extensible.* MicroPlugin is a lightweight drop-in plugin architecture for your JavaScript library. Plugins can [declare dependencies](#dependencies) to other plugins and can be [initialized with options](#loading-plugins) (in a variety of formats). It's [CommonJS](http://commonjs.org), so it works identically in Node.js and in a browser. | ||
### Usage | ||
```sh | ||
$ npm install microplugin | ||
$ bower install | ||
``` | ||
## Integration | ||
Using the provided mixin, extend your function with the [API](#mixin-methods) for declaring and loading plugins: | ||
```js | ||
MicroPlugin.mixin(YourLibrary); | ||
var TextEditor = function(options) { | ||
this.initializePlugins(options.plugins); | ||
}; | ||
MicroPlugin.mixin(TextEditor); | ||
``` | ||
That's it for integration! Now you can selectively load the plugins on an instance-by-instance basis. | ||
```js | ||
var editor = new TextEditor({ | ||
plugins: ['links','images'] | ||
}); | ||
``` | ||
### Loading Plugins | ||
The [`initializePlugins()`](#prototypeinitializepluginsplugins) method sets up the plugin system and loads a list of plugins (with options). It accepts the list in three styles, depending on your preference. | ||
#### List (no options) | ||
```js | ||
["plugin_a","plugin_b","plugin_c"] | ||
``` | ||
#### List (with options) | ||
```js | ||
[ | ||
{name: "plugin_a", options: { /* ... */ }}, | ||
{name: "plugin_b", options: { /* ... */ }}, | ||
{name: "plugin_c", options: { /* ... */ }} | ||
] | ||
``` | ||
#### Hash (with options) | ||
```js | ||
{ | ||
"plugin_a": { /* ... */ }, | ||
"plugin_b": { /* ... */ }, | ||
"plugin_c": { /* ... */ } | ||
} | ||
``` | ||
## Plugin Design | ||
Plugins aren't extravagant—they are barebones by design. A plugin is simply a function that gets called when an instance of your object is being constructed. Within that function, you can manually override methods, set up event listeners, etc. The `this` context will be the instance of your object. | ||
### Defining Plugins | ||
```js | ||
MyLibrary.define("math", function(options) { | ||
// You can return values which will be available to other plugins | ||
// when they load the plugin via "require()". Explained more in | ||
// the next section. | ||
return { | ||
random : Math.random, | ||
sqrt : Math.sqrt, | ||
sin2 : function(t) { return Math.pow(Math.sin(t), 2); }, | ||
cos2 : function(t) { return Math.pow(Math.sin(t), 2); } | ||
}; | ||
}); | ||
``` | ||
#### Dependencies | ||
Plugins can declare dependencies to other plugins (and use any exports they provide) through the [`require`](#prototyperequirename) function. | ||
```js | ||
MyLibrary.define("calculations", function(options) { | ||
var math = this.require("math"); | ||
var theta = math.random(); | ||
var success = math.sqrt(math.sin2(theta) + math.cos2(theta)) === 1; | ||
alert("Does the law of sines work? " + success); | ||
}); | ||
``` | ||
## API Reference | ||
#### MicroPlugin.mixin(fn) | ||
Sets up all methods on the function and its prototype for defining and loading plugins. | ||
### Mixin Methods | ||
#### define(name, fn) | ||
Declares a new plugin with the specified name. | ||
#### [prototype].require(name) | ||
Loads a plugin as a dependency and returns whatever it exports (if anything). | ||
#### [prototype].initializePlugins(plugins) | ||
Initializes the plugin system and loads a list of plugins with the provided options. The "plugins" argument can be in a [variety of formats](#loading-plugins). | ||
## License | ||
@@ -13,0 +110,0 @@ |
@@ -77,3 +77,3 @@ /** | ||
while (queue.length) { | ||
self.loadPlugin(queue.shift()); | ||
self.require(queue.shift()); | ||
} | ||
@@ -83,5 +83,2 @@ }; | ||
Interface.prototype.loadPlugin = function(name) { | ||
if (!Interface.plugins.hasOwnProperty(name)) { | ||
throw new Error('Unable to find "' + name + '" plugin'); | ||
} | ||
var self = this; | ||
@@ -91,2 +88,6 @@ var plugins = self.plugins; | ||
if (!Interface.plugins.hasOwnProperty(name)) { | ||
throw new Error('Unable to find "' + name + '" plugin'); | ||
} | ||
plugins.requested[name] = true; | ||
@@ -93,0 +94,0 @@ plugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
9076
115