5.3.0 • Published 4 years ago

sandboxjs v5.3.0

Weekly downloads
217
License
MIT
Repository
github
Last release
4 years ago

sandboxjs

Sandbox node.js code like a boss.

Key Features

  • Runs code on the public webtask.io cluster.
  • Your code is totally sandboxed from everyone else's.
  • Integrated with your wt-cli profiles.
  • Supports returning Promises and/or invoking node-style callbacks.

Installing it

npm install sandboxjs

# Optionally configure a default wt-cli profile

Using it

First, get a webtask token using wt-cli:

# Create a new wt-cli profile
npm install -g wt-cli
wt init

# Or, if you already use wt-cli:
wt profile ls
var Assert = require('assert');
var Sandbox = require('sandboxjs');

// You can get your webtask token using the steps above
var code = 'module.exports = function (ctx, cb) { cb(null, "hello world"); }';
var profile = Sandbox.fromToken(process.env.WEBTASK_TOKEN);

// This library lets you create a webtask and run it in one step as a shortcut:
profile.run(code, function (err, res, body) {
    Assert.ifError(err);
    Assert.equal(res.statusCode, 200, 'The webtask executed as expected');
    Assert.equal(body, 'hello world', 'The webtask returned the expected string');
});

// Alternatively, your application might want to to create a webtask url
// with your (or your users') custom code and secrets.
profile.create(code, { secrets: { auth0: 'rocks' } }, function (err, webtask) {
    Assert.ifError(err);
    
    // Making requests to this url will run the specified custom code in a
    // node.js sandbox and will give it access to your secrets in the first
    // argument (`ctx`) of your exported webtask function.
    // For more information on the different styles of webtask functions that
    // are supported, see: https://webtask.io/docs/model
    console.log(webtask.url);
});

Examples

Update the code of an existing named webtask

var Sandbox = require('sandboxjs');

var sandbox = Sandbox.init({ /* ... */ });
var webtaskName = 'my_webtask';
var webtaskCode = 'module.exports = ...';

sandbox.inspectWebtask({
    name: webtaskName,
    // We need to decrypt embedded secrets so that we can set them on the
    // replacement named webtask
    decrypt: true,
    // No need to fetch code since we will be updating it anyway
    fetch_code: false,
}).then(handleClaims);

function handleClaims(claims) {
    // We will pull any claims from the existing webtask that are user-defined
    // and set them on a new claims object. Note that some claims are *NOT*
    // copied over because they are read-only claims generated by the platform.
    // Common examples include: `ca`, `jti` and `iat`.
    var newClaims = {
        jtn: webtaskName,
        dd: claims.dd,
        mb: claims.mb,
        pb: claims.pb,
        // Instead of being an opaque, encrypted blob, this will be a javascript
        // Object mapping secret key to value because we set the `decrypt`
        // option on the call to `inspectWebtask`.
        ectx: claims.ectx,
        pctx: claims.pctx,
        code: webtaskCode,
    };
    
    // Create a replacement webtask from raw claims. We use `createRaw` instead
    // of `create` so that we can deal directly with the platform's claims
    // instead of the more human-friendly aliases in `create`.
    // This method will make a token issue request with the updated claims
    // and resolve the Promise with a new `Webtask` instance based on that
    // token.
    return sandbox.createRaw(newClaims);
}

API

Modules

Classes

sandboxjs

Sandbox node.js code.

Sandbox.fromToken(token, options) ⇒ Sandbox

Create a Sandbox instance from a webtask token

Kind: static method of sandboxjs
Returns: Sandbox - A {@see Sandbox} instance whose url, token and container were derived from the given webtask token.

ParamTypeDescription
tokenStringThe webtask token from which the Sandbox profile will be derived.
optionsObjectThe options for creating the Sandbox instance that override the derived values from the token.
options.urlStringThe url of the webtask cluster. Defaults to the public 'sandbox.auth0-extend.com' cluster.
options.containerStringThe container with which this Sandbox instance should be associated. Note that your Webtask token must give you access to that container or all operations will fail.
options.tokenStringThe Webtask Token. See: https://webtask.io/docs/api_issue.

Sandbox.init(options) ⇒ Sandbox

Create a Sandbox instance

Kind: static method of sandboxjs
Returns: Sandbox - A {@see Sandbox} instance.

ParamTypeDescription
optionsObjectThe options for creating the Sandbox instance.
options.urlStringThe url of the webtask cluster. Defaults to the public 'sandbox.auth0-extend.com' cluster.
options.containerStringThe container with which this Sandbox instance should be associated. Note that your Webtask token must give you access to that container or all operations will fail.
options.tokenStringThe Webtask Token. See: https://webtask.io/docs/api_issue.

Sandbox~Sandbox

Kind: inner class of sandboxjs

new Sandbox(options)

Creates an object representing a user's webtask.io credentials

ParamTypeDescription
optionsObjectOptions used to configure the profile
options.urlStringThe url of the webtask cluster where code will run
options.containerStringThe name of the container in which code will run
options.tokenStringThe JWT (see: http://jwt.io) issued by webtask.io that grants rights to run code in the indicated container
options.onBeforeRequestStringAn array of hook functions to be invoked with a prepared request

sandbox.clone(options)

Create a clone of this sandbox instances with one or more different parameters

Kind: instance method of Sandbox

ParamTypeDescription
optionsObjectOptions used to configure the profile
options.urlStringThe url of the webtask cluster where code will run
options.containerStringThe name of the container in which code will run
options.tokenStringThe JWT (see: http://jwt.io) issued by webtask.io that grants rights to run code in the indicated container
options.onBeforeRequestStringAn array of hook functions to be invoked with a prepared request

sandbox.create(codeOrUrl, options, cb) ⇒ Promise

Create a Webtask from the given options

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the token

ParamTypeDescription
codeOrUrlStringThe code for the webtask or a url starting with http:// or https://
optionsObjectOptions for creating the webtask
cbfunctionOptional callback function for node-style callbacks

sandbox.createRaw(claims, cb) ⇒ Promise

Create a Webtask from the given claims

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the token

ParamTypeDescription
claimsObjectOptions for creating the webtask
cbfunctionOptional callback function for node-style callbacks

sandbox.createUrl(options, cb) ⇒ Promise

Shortcut to create a Webtask and get its url from the given options

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the token

ParamTypeDescription
optionsObjectOptions for creating the webtask
cbfunctionOptional callback function for node-style callbacks

sandbox.run(codeOrUrl, options, cb) ⇒ Promise

Shortcut to create and run a Webtask from the given options

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the token

ParamTypeDescription
codeOrUrlStringThe code for the webtask or a url starting with http:// or https://
optionsObjectOptions for creating the webtask
cbfunctionOptional callback function for node-style callbacks

sandbox.createToken(options, cb) ⇒ Promise

Create a webtask token - A JWT (see: http://jwt.io) with the supplied options

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the token

ParamTypeDescription
optionsObjectClaims to make for this token (see: https://webtask.io/docs/api_issue)
cbfunctionOptional callback function for node-style callbacks

sandbox.issueRequest(request, cb) ⇒ Promise

Run a prepared Superagent request through any configured onBeforeRequest hooks.

This can be useful for enablying proxies for server-side consumers of sandboxjs.

Kind: instance method of Sandbox
Returns: Promise - - A promise representing the fulfillment of the request

ParamTypeDescription
requestSuperagent.RequestInstance of a superagent request
cbfunctionNode-style callback function

sandbox.createTokenRaw(claims, options, cb) ⇒ Promise

Create a webtask token - A JWT (see: http://jwt.io) with the supplied claims

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the token

ParamTypeDescription
claimsObjectClaims to make for this token (see: https://webtask.io/docs/api_issue)
optionsObjectOptional options. Currently only options.include_webtask_url is supported.
cbfunctionOptional callback function for node-style callbacks

sandbox.createLogStream(options) ⇒ Stream

Create a stream of logs from the webtask container

Note that the logs will include messages from our infrastructure.

Kind: instance method of Sandbox
Returns: Stream - A stream that will emit 'data' events with container logs

ParamTypeDescription
optionsObjectStreaming options overrides
options.containerStringThe container for which you would like to stream logs. Defaults to the current profile's container.

sandbox.getWebtask(options, cb) ⇒ Promise

Read a named webtask

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an array of Webtasks

ParamTypeDescription
optionsObjectOptions
options.containerStringSet the webtask container. Defaults to the profile's container.
options.nameStringThe name of the webtask.
options.decryptBooleanDecrypt the webtask's secrets.
options.fetch_codeBooleanFetch the code associated with the webtask.
cbfunctionOptional callback function for node-style callbacks.

sandbox.createWebtask(options, cb) ⇒ Promise

Create a named webtask

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an array of Webtasks

ParamTypeDescription
optionsObjectOptions
options.containerStringSet the webtask container. Defaults to the profile's container.
options.nameStringThe name of the webtask.
options.secretsStringSet the webtask secrets.
options.metaStringSet the webtask metadata.
options.hostStringSet the webtask hostname.
cbfunctionOptional callback function for node-style callbacks.

sandbox.removeWebtask(options, cb) ⇒ Promise

Remove a named webtask from the webtask container

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an array of Webtasks

ParamTypeDescription
optionsObjectOptions
options.containerStringSet the webtask container. Defaults to the profile's container.
options.nameStringThe name of the cron job.
cbfunctionOptional callback function for node-style callbacks.

sandbox.updateWebtask(options, cb) ⇒ Promise

Update an existing webtask's code, secrets or other claims

Note that this method should be used with caution as there is the potential for a race condition where another agent updates the webtask between the time that the webtask details and claims are resolved and when the webtask update is issued.

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an instance of Webtask representing the updated webtask

ParamTypeDescription
optionsObjectOptions
options.nameStringName of the webtask to update
options.codeStringUpdated code for the webtask
options.urlStringUpdated code URL for the webtask
options.secretsStringIf false, remove existing secrets, if an object update secrets, otherwise preserve
options.paramsStringIf false, remove existing params, if an object update params, otherwise preserve
options.hostStringIf false, remove existing host, if a string update host, otherwise preserve
cbfunctionOptional callback function for node-style callbacks.

sandbox.listWebtasks(options, cb) ⇒ Promise

List named webtasks from the webtask container

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an array of Webtasks

ParamTypeDescription
optionsObjectOptions
options.containerStringSet the webtask container. Defaults to the profile's container.
options.fetch_codeBooleanInclude the webtask's code in the listing response.
cbfunctionOptional callback function for node-style callbacks.

sandbox.createCronJob(options, cb) ⇒ Promise

Create a cron job from an already-existing webtask

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with a {@see CronJob} instance.

ParamTypeDescription
optionsObjectOptions for creating a cron job
options.containerStringThe container in which the job will run. Defaults to the current profile's container.
options.nameStringThe name of the cron job.
options.tokenStringThe webtask token that will be used to run the job.
options.scheduleStringThe cron schedule that will be used to determine when the job will be run.
options.tzStringThe cron timezone (IANA timezone).
options.metaStringThe cron metadata (set of string key value pairs).
cbfunctionOptional callback function for node-style callbacks.

sandbox.removeCronJob(options, cb) ⇒ Promise

Remove an existing cron job

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the response from removing the job.

ParamTypeDescription
optionsObjectOptions for removing the cron job
options.containerStringThe container in which the job will run. Defaults to the current profile's container.
options.nameStringThe name of the cron job.
cbfunctionOptional callback function for node-style callbacks.

sandbox.setCronJobState(options, cb) ⇒ Promise

Set an existing cron job's state

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the response from removing the job.

ParamTypeDescription
optionsObjectOptions for updating the cron job's state
options.containerStringThe container in which the job will run. Defaults to the current profile's container.
options.nameStringThe name of the cron job.
options.stateStringThe new state of the cron job.
cbfunctionOptional callback function for node-style callbacks.

sandbox.listCronJobs(options, cb) ⇒ Promise

List cron jobs associated with this profile

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an Array of {@see CronJob} instances.

ParamTypeDescription
optionsObjectOptions for listing cron jobs.
options.containerStringThe container in which the job will run. Defaults to the current profile's container.
cbfunctionOptional callback function for node-style callbacks.

sandbox.getCronJob(options, cb) ⇒ Promise

Get a CronJob instance associated with an existing cron job

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with a {@see CronJob} instance.

ParamTypeDescription
optionsObjectOptions for retrieving the cron job.
options.containerStringThe container in which the job will run. Defaults to the current profile's container.
options.nameStringThe name of the cron job.
cbfunctionOptional callback function for node-style callbacks.

sandbox.getCronJobHistory(options, cb) ⇒ Promise

Get the historical results of executions of an existing cron job.

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an Array of cron job results.

ParamTypeDescription
optionsObjectOptions for retrieving the cron job.
options.containerStringThe container in which the job will run. Defaults to the current profile's container.
options.nameStringThe name of the cron job.
options.offsetStringThe offset to use when paging through results.
options.limitStringThe limit to use when paging through results.
cbfunctionOptional callback function for node-style callbacks.

sandbox.inspectToken(options, cb) ⇒ Promise

Inspect an existing webtask token to resolve code and/or secrets

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the resolved webtask data.

ParamTypeDescription
optionsObjectOptions for inspecting the webtask.
options.tokenBooleanThe token that you would like to inspect.
options.decryptBooleanDecrypt the webtask's secrets.
options.fetch_codeBooleanFetch the code associated with the webtask.
cbfunctionOptional callback function for node-style callbacks.

sandbox.inspectWebtask(options, cb) ⇒ Promise

Inspect an existing named webtask to resolve code and/or secrets

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the resolved webtask data.

ParamTypeDescription
optionsObjectOptions for inspecting the webtask.
options.nameBooleanThe named webtask that you would like to inspect.
options.decryptBooleanDecrypt the webtask's secrets.
options.fetch_codeBooleanFetch the code associated with the webtask.
cbfunctionOptional callback function for node-style callbacks.

sandbox.revokeToken(token, cb) ⇒ Promise

Revoke a webtask token

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the token
See: https://webtask.io/docs/api_revoke

ParamTypeDescription
tokenStringThe token that should be revoked
cbfunctionOptional callback function for node-style callbacks

sandbox.listNodeModuleVersions(options, cb) ⇒ Promise

List versions of a given node module that are available on the platform

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with the token

ParamTypeDescription
optionsObjectOptions
options.nameStringName of the node module
cbfunctionOptional callback function for node-style callbacks

sandbox.ensureNodeModules(options, cb) ⇒ Promise

Ensure that a set of modules are available on the platform

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an array of { name, version, state } objects

ParamTypeDescription
optionsObjectOptions
options.modulesArrayArray of { name, version } pairs
options.resetBooleanTrigger a rebuild of the modules (Requires administrative token)
cbfunctionOptional callback function for node-style callbacks

sandbox.updateStorage(options, storage, cb) ⇒ Promise

Update the storage associated to the a webtask

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an array of Webtasks

ParamTypeDescription
optionsObjectOptions
options.containerStringSet the webtask container. Defaults to the profile's container.
options.nameStringThe name of the webtask.
storageObjectstorage
storage.dataObjectThe data to be stored
storage.etagStringPass in an optional string to be used for optimistic concurrency control to prevent simultaneous updates of the same data.
cbfunctionOptional callback function for node-style callbacks.

sandbox.getStorage(options, cb) ⇒ Promise

Read the storage associated to the a webtask

Kind: instance method of Sandbox
Returns: Promise - A Promise that will be fulfilled with an array of Webtasks

ParamTypeDescription
optionsObjectOptions
options.containerStringSet the webtask container. Defaults to the profile's container.
options.nameStringThe name of the webtask.
cbfunctionOptional callback function for node-style callbacks.

CronJob

Kind: global class

new CronJob()

Creates an object representing a CronJob

cronJob.sandbox

Kind: instance property of CronJob
Properties

NameDescription
sandboxThe {@see Sandbox} instance used to create this Webtask instance

cronJob.refresh(cb) ⇒ Promise

Refresh this job's metadata

Kind: instance method of CronJob
Returns: Promise - A Promise that will be fulfilled with the this cron job instance

ParamTypeDescription
cbfunctionOptional callback function for node-style callbacks

cronJob.remove(cb) ⇒ Promise

Remove this cron job from the webtask cluster

Note that this will not revoke the underlying webtask token, so the underlying webtask will remain functional.

Kind: instance method of CronJob
Returns: Promise - A Promise that will be fulfilled with the token

ParamTypeDescription
cbfunctionOptional callback function for node-style callbacks

cronJob.getHistory(options, cb) ⇒ Promise

Get the history of this cron job

Kind: instance method of CronJob
Returns: Promise - A Promise that will be fulfilled with an Array of cron job results.

ParamTypeDescription
optionsObjectOptions for retrieving the cron job.
options.offsetStringThe offset to use when paging through results.
options.limitStringThe limit to use when paging through results.
cbfunctionOptional callback function for node-style callbacks.

cronJob.inspect(options, cb) ⇒ Promise

Inspect an existing webtask to optionally get code and/or secrets

Kind: instance method of CronJob
Returns: Promise - A Promise that will be fulfilled with an Array of cron job results.

ParamTypeDescription
optionsObjectOptions for inspecting the webtask.
options.fetch_codeBooleanFetch the code associated with the webtask.
options.decryptBooleanDecrypt the webtask's secrets.
cbfunctionOptional callback function for node-style callbacks.

cronJob.setJobState(options, cb) ⇒ Promise

Set the cron job's state

Kind: instance method of CronJob
Returns: Promise - A Promise that will be fulfilled with an Array of cron job results.

ParamTypeDescription
optionsObjectOptions for updating the webtask.
options.stateBooleanSet the cron job's state to this.
cbfunctionOptional callback function for node-style callbacks.

Webtask

Kind: global class

new Webtask()

Creates an object representing a Webtask

webtask.claims

Kind: instance property of Webtask
Properties

NameDescription
claimsThe claims embedded in the Webtask's token

webtask.token

Kind: instance property of Webtask
Properties

NameDescription
tokenThe token associated with this webtask

webtask.sandbox

Kind: instance property of Webtask
Properties

NameDescription
sandboxThe {@see Sandbox} instance used to create this Webtask instance

webtask.meta

Kind: instance property of Webtask
Properties

NameDescription
metaThe metadata associated with this webtask

webtask.secrets

Kind: instance property of Webtask
Properties

NameDescription
secretsThe secrets associated with this webtask if decrypt=true

webtask.code

Kind: instance property of Webtask
Properties

NameDescription
codeThe code associated with this webtask if fetch_code=true

webtask.createLogStream(options) ⇒ Stream

Create a stream of logs from the webtask container

Note that the logs will include messages from our infrastructure.

Kind: instance method of Webtask
Returns: Stream - A stream that will emit 'data' events with container logs

ParamTypeDescription
optionsObjectStreaming options overrides
options.containerStringThe container for which you would like to stream logs. Defaults to the current profile's container.

webtask.run(options, cb) ⇒ Promise

Run the webtask and return the result of execution

Kind: instance method of Webtask
Returns: Promise - - A Promise that will be resolved with the response from the server.

ParamTypeDescription
optionsObjectOptions used to tweak how the webtask will be invoked
cbfunctionOptional node-style callback that will be invoked upon completion

webtask.createCronJob(options, cb) ⇒ Promise

Schedule the webtask to run periodically

Kind: instance method of Webtask
Returns: Promise - - A Promise that will be resolved with a {@see CronJob} instance.

ParamTypeDescription
optionsObjectOptions for creating the webtask
options.scheduleObjectCron-string-formatted schedule
options.nameObjectThe name for the cron job
options.tzObjectThe timezone for the cron job (IANA timezone)
cbfunctionOptional node-style callback that will be invoked upon completion

webtask.inspect(options, cb) ⇒ Promise

Inspect an existing webtask to optionally get code and/or secrets

Kind: instance method of Webtask
Returns: Promise - A Promise that will be fulfilled with the result of inspecting the token.

ParamTypeDescription
optionsObjectOptions for inspecting the webtask.
options.decryptBooleanDecrypt the webtask's secrets.
options.fetch_codeBooleanFetch the code associated with the webtask.
cbfunctionOptional callback function for node-style callbacks.

webtask.remove(cb) ⇒ Promise

Remove the named webtask

Kind: instance method of Webtask
Returns: Promise - A Promise that will be fulfilled with the result of inspecting the token.

ParamTypeDescription
cbfunctionOptional callback function for node-style callbacks.

webtask.revoke(cb) ⇒ Promise

Revoke the webtask's token

Kind: instance method of Webtask
Returns: Promise - A Promise that will be fulfilled with the result of revoking the token.

ParamTypeDescription
cbfunctionOptional callback function for node-style callbacks.

webtask.update(options, cb) ⇒ Promise

Update a webtask

Kind: instance method of Webtask
Returns: Promise - A Promise that will be fulfilled with the result of revoking the token.

ParamTypeDescription
optionsObjectOptions for updating a webtask (@see: Sandbox.updateWebtask)
cbfunctionOptional callback function for node-style callbacks.

webtask.updateStorage(options, storage, cb) ⇒ Promise

Update the storage associated to the a webtask

Kind: instance method of Webtask
Returns: Promise - A Promise that will be fulfilled with an array of Webtasks

ParamTypeDescription
optionsObjectOptions
options.containerStringSet the webtask container. Defaults to the profile's container.
options.nameStringThe name of the webtask.
storageObjectstorage
storage.dataObjectThe data to be stored
storage.etagStringPass in an optional string to be used for optimistic concurrency control to prevent simultaneous updates of the same data.
cbfunctionOptional callback function for node-style callbacks.

webtask.getStorage(options, cb) ⇒ Promise

Read the storage associated to the a webtask

Kind: instance method of Webtask
Returns: Promise - A Promise that will be fulfilled with an array of Webtasks

ParamTypeDescription
optionsObjectOptions
options.containerStringSet the webtask container. Defaults to the profile's container.
options.nameStringThe name of the webtask.
cbfunctionOptional callback function for node-style callbacks.

Usages

This library will be used in wt-cli.

Contributing

Just clone the repo, run npm install and then hack away.

Issue reporting

If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker. The Responsible Disclosure Program details the procedure for disclosing security issues.

License

MIT

What is Auth0?

Auth0 helps you to:

  • Add authentication with multiple authentication sources, either social like Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, amont others, or enterprise identity systems like Windows Azure AD, Google Apps, Active Directory, ADFS or any SAML Identity Provider.
  • Add authentication through more traditional username/password databases.
  • Add support for linking different user accounts with the same user.
  • Support for generating signed Json Web Tokens to call your APIs and flow the user identity securely.
  • Analytics of how, when and where users are logging in.
  • Pull data from other sources and add it to the user profile, through JavaScript rules.

Create a free account in Auth0

  1. Go to Auth0 and click Sign Up.
  2. Use Google, GitHub or Microsoft Account to login.
5.3.0

4 years ago

5.2.1

4 years ago

5.2.0

4 years ago

5.1.0

4 years ago

5.0.0

6 years ago

4.2.2

6 years ago

4.2.1

6 years ago

4.2.0

6 years ago

4.1.0

6 years ago

4.0.2

6 years ago

4.0.1

6 years ago

4.0.0

7 years ago

3.8.0

7 years ago

3.7.0

7 years ago

3.6.1

7 years ago

3.5.0

7 years ago

3.4.2

7 years ago

3.4.1

7 years ago

3.4.0

7 years ago

3.3.0

7 years ago

3.2.0

7 years ago

3.1.0

8 years ago

3.0.2

8 years ago

3.0.1

8 years ago

3.0.0

8 years ago

2.6.1

8 years ago

2.6.0

8 years ago

2.5.0

8 years ago

2.4.1

8 years ago

2.4.0

8 years ago

2.3.1

8 years ago

2.3.0

8 years ago

2.2.2

8 years ago

2.2.1

8 years ago

2.2.0

8 years ago

2.1.2

8 years ago

2.1.1

8 years ago

2.1.0

8 years ago

2.0.1

8 years ago

2.0.0

8 years ago

2.0.0-pre.3

8 years ago

2.0.0-pre.1

9 years ago

1.2.2

9 years ago

1.2.1

9 years ago

1.2.0

9 years ago

1.1.6

9 years ago

1.1.5

9 years ago

1.1.4

9 years ago

1.1.3

9 years ago

1.1.2

9 years ago

1.1.1

9 years ago

1.1.0

9 years ago

1.0.1

9 years ago

1.0.0

9 years ago