Build Status Coverage Status


Check out the presentation/demo.

Convenient extension methods for building Bespoke.js plugins. This plugin is targeted towards plugin developers, not everyday bespoke users looking to make a nice presentation.

⚠️ This project has been archived

No future updates are planned. Feel free to continue using it, but expect no support.


Download the production version or the development version, or use a package manager.


This plugin is shipped in a UMD format, meaning that it is available as a CommonJS/AMD module or browser global.

For example, when using CommonJS modules:

var bespoke = require('bespoke'),
  convenient = require('bespoke-convenient');

var cv = convenient.builder("myplugin");

When using browser globals:

var cv = bespoke.plugins.convenient.builder("myplugin");

Since this is a plugin written for other bespoke plugin developers, have a look at the source files to learn more.

// convenient.builder(pluginName)
// bespoke.plugins.convenient.builder(pluginName)
// Convenient plugin level functions - create the variable cv in your plugin.
var cv = convenient.builder("myplugin");

// cv.activateDeck(deck)
// Activate convenient features and return an object with functions bound to the deck.
var cvBoundToDeck = cv.activateDeck(deck);

// cv.getStorage(deck)
// cvBoundToDeck.getStorage()
// Get a plugin storage object for the deck. Prior deck activation is required.
// Useful if you store state per deck, not for the entire plugin.
var storage = cvBoundToDeck.getStorage();
storage.anything = "Here you can save any options and state for this particular deck.";
storage.whatever = { happens: "happens" };

// cv.generateErrorObject(message)
// An error object with a prefixed error message.
throw cv.generateErrorObject("Look, sometimes bad things happen, and there is nothing you can do about it, so why worry? -- Simba, The Lion King");

//, eventName, innerEvent, slide, customData)
//, innerEvent, slide, customData)
// Fire an event on the deck, with plugin name etcetera filled in.
// innerEvent: either a DOM/browser event or a bespoke event
// slide: either the index of the affected slide, or the slide object itself
var success ="myevent", e, 123, { someExtraPluginData: "data value", somePluginStatus: 999 });

// cv.createEventData(deck, eventNamespace, eventName, innerEvent, slide, eventData)
// cvBoundToDeck.createEventData(eventNamespace, eventName, innerEvent, slide, eventData)
// Creates the event same object used by
var eventData = cvBoundToDeck.createEventData();

// convenient.copyArray(array)
// Mostly useful for function arguments
var args = convenient.copyArray(arguments);

// cv.log([object], ...)
// Log a prefixed log message, by default to the developer console
cv.log("Something", "happened", 1974);

Package managers


$ npm install bespoke-convenient


$ bower install bespoke-convenient


  • Move more shared functionality into this plugin.


Mark Dalgleish for bespoke.js and related tools. This plugin was built with generator-bespokeplugin.

AJ Batac, ajbatac on flickr, for his photo E-Mart Convenience Store (CC BY 2.0).


Copyright (c) 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, Joel Purra All rights reserved.

When using bespoke-convenient, comply to the MIT license. Please see the LICENSE file for details, and the MIT License on Wikipedia.