[Pkg-javascript-devel] Bug#927202: unblock: node-url-parse/1.2.0-2
Xavier Guimard
yadd at debian.org
Tue Apr 16 09:36:24 BST 2019
Package: release.debian.org
Severity: normal
User: release.debian.org at packages.debian.org
Usertags: unblock
Please unblock package node-url-parse
Hi all,
node-parse-url is vulnerable to CVE-2018-3737 (#906058). I imported
upstream patch and enable upstream tests. The debdiff is quite big due
to test modules import, however the change on installed files is only
(see CVE-2018-3737.diff patch):
--- a/index.js
+++ b/index.js
@@ -20,6 +20,9 @@
var rules = [
['#', 'hash'], // Extract from the back.
['?', 'query'], // Extract from the back.
+ function sanitize(address) { // Sanitize what is left of the address
+ return address.replace('\\', '/');
+ },
['/', 'pathname'], // Extract from the back.
['@', 'auth', 1], // Extract from the front.
[NaN, 'host', undefined, 1, 1], // Set left over value.
@@ -189,10 +192,14 @@
// When the authority component is absent the URL starts with a path
// component.
//
- if (!extracted.slashes) instructions[2] = [/(.*)/, 'pathname'];
+ if (!extracted.slashes) instructions[3] = [/(.*)/, 'pathname'];
for (; i < instructions.length; i++) {
instruction = instructions[i];
+ if (typeof instruction === 'function') {
+ address = instruction(address);
+ continue;
+ }
parse = instruction[0];
key = instruction[1];
Full changes:
* Declare compliance with policy 4.3.0
* Add patch to fix bad URL parsing (Closes: #906058, CVE-2018-3774)
* Enable upstream tests using pkg-js-tools. This adds node-deep-eql,
node-object-inspect and node-pathval in build dependencies
* Fix VCS fields
* Fix debian/copyright format URL
* Fix description (trailing whitespaces)
* Add upstream/metadata
Reverse dependencies:
node-url-parse
+-> node-original
+-> node-eventsource
No end-user package depends on node-url-parse, so I think it is low
risky to upgrade node-url-parse.
Cheers,
Xavier
unblock node-url-parse/1.2.0-2
-------------- next part --------------
diff --git a/debian/changelog b/debian/changelog
index 5531fe2..04127dd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,18 @@
+node-url-parse (1.2.0-2) unstable; urgency=medium
+
+ * Team upload
+ * Bump debhelper compatibility level to 11
+ * Declare compliance with policy 4.3.0
+ * Add patch to fix bad URL parsing (Closes: #906058, CVE-2018-3774)
+ * Enable upstream tests using pkg-js-tools. This adds node-deep-eql,
+ node-object-inspect and node-pathval in build dependencies
+ * Fix VCS fields
+ * Fix debian/copyright format URL
+ * Fix description (trailing whitespaces)
+ * Add upstream/metadata
+
+ -- Xavier Guimard <yadd at debian.org> Tue, 16 Apr 2019 10:18:36 +0200
+
node-url-parse (1.2.0-1) unstable; urgency=medium
* Team upload
@@ -27,4 +42,3 @@ node-url-parse (1.0.2-1) unstable; urgency=low
* Initial release
-- Thorsten Alteholz <debian at alteholz.de> Wed, 02 Sep 2015 18:07:46 +0200
-
diff --git a/debian/control b/debian/control
index f46f9e2..2c683c6 100644
--- a/debian/control
+++ b/debian/control
@@ -3,17 +3,22 @@ Section: javascript
Priority: optional
Maintainer: Debian Javascript Maintainers <pkg-javascript-devel at lists.alioth.debian.org>
Uploaders: Thorsten Alteholz <debian at alteholz.de>
+Testsuite: autopkgtest-pkg-nodejs
Build-Depends:
debhelper (>= 9)
, dh-buildinfo
, nodejs
, webpack
+ , node-deep-eql <!nocheck>
, node-requires-port (>= 0.0.1)
+ , node-object-inspect <!nocheck>
, node-querystringify (>= 0.0.3)
-Standards-Version: 4.1.3
+ , node-pathval <!nocheck>
+ , pkg-js-tools
+Standards-Version: 4.3.0
Homepage: https://github.com/unshiftio/url-parse#readme
-Vcs-Git: https://anonscm.debian.org/git/pkg-javascript/node-url-parse.git
-Vcs-Browser: https://anonscm.debian.org/gitweb/?p=pkg-javascript/node-url-parse.git
+Vcs-Browser: https://salsa.debian.org/js-team/node-url-parse
+Vcs-Git: https://salsa.debian.org/js-team/node-url-parse.git
Package: node-url-parse
Architecture: all
@@ -23,19 +28,19 @@ Depends:
, node-requires-port (>= 0.0.1)
, node-querystringify (>= 0.0.3)
Description: Parse URL in node using the URL module and in the browser using the DOM
- The url-parse method exposes two different API interfaces. The url interface
- that you know from Node.js and the new URL interface that is available in
+ The url-parse method exposes two different API interfaces. The url interface
+ that you know from Node.js and the new URL interface that is available in
the latest browsers.
.
- Since 0.1 we've moved away from using the DOM's <a> element for URL parsing
- and moving to a full Regular Expression solution. The main reason for this
- change is to make the URL parser available in different JavaScript
- environments as you don't always have access to the DOM like Worker
- environments. This module still have a really small foot print as this
- module's main intention is to be bundled with client-side code. The only
- problem however with a RegExp based solution is that it required a lot of
- lookups causing major problems in FireFox. So the last and the current
- solution was a pure string parsing solution which chops up the URL in
+ Since 0.1 we've moved away from using the DOM's <a> element for URL parsing
+ and moving to a full Regular Expression solution. The main reason for this
+ change is to make the URL parser available in different JavaScript
+ environments as you don't always have access to the DOM like Worker
+ environments. This module still have a really small foot print as this
+ module's main intention is to be bundled with client-side code. The only
+ problem however with a RegExp based solution is that it required a lot of
+ lookups causing major problems in FireFox. So the last and the current
+ solution was a pure string parsing solution which chops up the URL in
smaller pieces.
.
Node.js is an event-based server-side JavaScript engine.
diff --git a/debian/copyright b/debian/copyright
index 490b21b..94bfaf0 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,16 +1,58 @@
-Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: url-parse
Upstream-Contact: https://github.com/unshiftio/url-parse/issues
Source: https://github.com/unshiftio/url-parse#readme
Files: *
-Copyright: 2015 Arnout Kazemier
+Copyright: 2015 Arnout Kazemier <https://github.com/3rd-Eden>
License: Expat
Files: debian/*
Copyright: 2015 Thorsten Alteholz <debian at alteholz.de>
License: Expat
+Files: debian/tests/test-modules/assume/*
+Copyright: 2015 Arnout Kazemier <https://github.com/3rd-Eden>
+ 2015 Martijn Swaagman
+License: Expat
+
+Files: debian/tests/test-modules/fn.name/*
+Copyright: Arnout Kazemier <https://github.com/3rd-Eden>
+License: Expat
+Comment: The upstream distribution does not contain an explicit statement of
+ copyright ownership. Pursuant to the Berne Convention for the Protection of
+ Literary and Artistic Works, it is assumed that all content is copyright by
+ its respective authors unless otherwise stated.
+
+Files: debian/tests/test-modules/pruddy-error/*
+Copyright: 1998 Regents of the University of California
+License: BSD-3-Clause
+
+License: BSD-3-Clause
+ All rights reserved.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ .
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the University of California, Berkeley nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
License: Expat
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
@@ -31,4 +73,3 @@ License: Expat
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-
diff --git a/debian/patches/CVE-2018-3774.diff b/debian/patches/CVE-2018-3774.diff
new file mode 100644
index 0000000..bfc6e6a
--- /dev/null
+++ b/debian/patches/CVE-2018-3774.diff
@@ -0,0 +1,67 @@
+Description: Fix for CVE-2018-3774
+Author: Xavier Guimard <yadd at debian.org>
+Origin: https://github.com/unshiftio/url-parse/commit/53b1794e54d0711ceb52505e0f74145270570d5a
+Bug: https://security-tracker.debian.org/tracker/CVE-2018-3774
+Bug-Debian: https://bugs.debian.org/906058
+Forwarded: //github.com/unshiftio/url-parse/commit/53b1794e54d0711ceb52505e0f74145270570d5a
+Last-Update: 2019-04-16
+
+--- a/index.js
++++ b/index.js
+@@ -20,6 +20,9 @@
+ var rules = [
+ ['#', 'hash'], // Extract from the back.
+ ['?', 'query'], // Extract from the back.
++ function sanitize(address) { // Sanitize what is left of the address
++ return address.replace('\\', '/');
++ },
+ ['/', 'pathname'], // Extract from the back.
+ ['@', 'auth', 1], // Extract from the front.
+ [NaN, 'host', undefined, 1, 1], // Set left over value.
+@@ -189,10 +192,14 @@
+ // When the authority component is absent the URL starts with a path
+ // component.
+ //
+- if (!extracted.slashes) instructions[2] = [/(.*)/, 'pathname'];
++ if (!extracted.slashes) instructions[3] = [/(.*)/, 'pathname'];
+
+ for (; i < instructions.length; i++) {
+ instruction = instructions[i];
++ if (typeof instruction === 'function') {
++ address = instruction(address);
++ continue;
++ }
+ parse = instruction[0];
+ key = instruction[1];
+
+--- a/test/test.js
++++ b/test/test.js
+@@ -179,6 +179,28 @@
+ assume(parsed.pathname).equals('/b/c');
+ });
+
++ it('ignores \\ in pathnames', function () {
++ var url = 'http://google.com:80\\@yahoo.com/#what\\is going on'
++ , parsed = parse(url);
++
++ assume(parsed.port).equals('');
++ assume(parsed.username).equals('');
++ assume(parsed.password).equals('');
++ assume(parsed.hostname).equals('google.com');
++ assume(parsed.hash).equals('#what\\is going on');
++
++ parsed = parse('//\\what-is-up.com');
++ assume(parsed.pathname).equals('/what-is-up.com');
++ });
++
++ it('correctly ignores multiple slashes //', function () {
++ var url = '////what-is-up.com'
++ , parsed = parse(url);
++
++ assume(parsed.host).equals('');
++ assume(parsed.hostname).equals('');
++ });
++
+ describe('origin', function () {
+ it('generates an origin property', function () {
+ var url = 'http://google.com:80/pathname'
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..1ae99bc
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+CVE-2018-3774.diff
diff --git a/debian/rules b/debian/rules
index e969a15..63df0cc 100755
--- a/debian/rules
+++ b/debian/rules
@@ -5,14 +5,11 @@
#export DH_VERBOSE=1
%:
- dh $@
+ dh $@ --with nodejs
override_dh_auto_build:
webpack --config debian/webpack.config.js --output-library=URLParse index.js dist/url-parse.js
uglifyjs dist/url-parse.js > dist/url-parse.min.js
-#override_dh_auto_test:
-
override_dh_auto_clean:
rm -rf dist
-
diff --git a/debian/tests/control b/debian/tests/control
deleted file mode 100644
index b96f048..0000000
--- a/debian/tests/control
+++ /dev/null
@@ -1,2 +0,0 @@
-Tests: require
-Depends: node-url-parse
diff --git a/debian/tests/pkg-js/files b/debian/tests/pkg-js/files
new file mode 100644
index 0000000..e15fb91
--- /dev/null
+++ b/debian/tests/pkg-js/files
@@ -0,0 +1,2 @@
+debian/tests/test-modules
+test
diff --git a/debian/tests/pkg-js/test b/debian/tests/pkg-js/test
new file mode 100644
index 0000000..7fc49b4
--- /dev/null
+++ b/debian/tests/pkg-js/test
@@ -0,0 +1 @@
+NODE_PATH=debian/tests/test-modules mocha -R spec --timeout 10000 test/test.js
diff --git a/debian/tests/require b/debian/tests/require
deleted file mode 100644
index 2b5f6c0..0000000
--- a/debian/tests/require
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-set -e
-nodejs -e "require('url-parse');"
diff --git a/debian/tests/test-modules/assume/.npmignore b/debian/tests/test-modules/assume/.npmignore
new file mode 100644
index 0000000..9b845b1
--- /dev/null
+++ b/debian/tests/test-modules/assume/.npmignore
@@ -0,0 +1,5 @@
+node_modules
+coverage
+test
+.tern-port
+npm-debug.log
diff --git a/debian/tests/test-modules/assume/.travis.yml b/debian/tests/test-modules/assume/.travis.yml
new file mode 100644
index 0000000..1330e28
--- /dev/null
+++ b/debian/tests/test-modules/assume/.travis.yml
@@ -0,0 +1,25 @@
+sudo: false
+language: node_js
+node_js:
+ - "iojs-v3"
+ - "iojs-v2"
+ - "iojs-v1"
+ - "0.12"
+ - "0.10"
+ - "0.8"
+before_install:
+ - "npm install -g npm at 2.1.18"
+script:
+ - "npm run test-travis"
+after_script:
+ - "npm install coveralls at 2.11.x && cat coverage/lcov.info | coveralls"
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "0.8"
+notifications:
+ irc:
+ channels:
+ - "irc.freenode.org#bigpipe"
+ on_success: change
+ on_failure: change
diff --git a/debian/tests/test-modules/assume/LICENSE b/debian/tests/test-modules/assume/LICENSE
new file mode 100644
index 0000000..b68d272
--- /dev/null
+++ b/debian/tests/test-modules/assume/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/debian/tests/test-modules/assume/README.md b/debian/tests/test-modules/assume/README.md
new file mode 100644
index 0000000..86f6233
--- /dev/null
+++ b/debian/tests/test-modules/assume/README.md
@@ -0,0 +1,842 @@
+# assume
+
+[![From bigpipe.io][from]](http://bigpipe.io)[![Version npm][version]](http://browsenpm.org/package/assume)[![Build Status][build]](https://travis-ci.org/bigpipe/assume)[![Dependencies][david]](https://david-dm.org/bigpipe/assume)[![Coverage Status][cover]](https://coveralls.io/r/bigpipe/assume?branch=master)
+
+[from]: https://img.shields.io/badge/from-bigpipe.io-9d8dff.svg?style=flat-square
+[version]: http://img.shields.io/npm/v/assume.svg?style=flat-square
+[build]: http://img.shields.io/travis/bigpipe/assume/master.svg?style=flat-square
+[david]: https://img.shields.io/david/bigpipe/assume.svg?style=flat-square
+[cover]: http://img.shields.io/coveralls/bigpipe/assume/master.svg?style=flat-square
+
+Assume is an `expect` inspired assertion library who's sole purpose is to create
+a working and human readable assert library for browsers and node. The library
+is designed to work with different assertion styles.
+
+I've been trying out a lot of libraries over the last couple of years and none
+of the assertion libraries that I found "tickled my fancy". They either only
+worked in node or had really bad browser support. I wanted something that I can
+use starting from Internet Explorer 5 to the latest version while maintaining
+the `expect` like API that we all know and love. Writing tests should be dead
+simple and not cause any annoyances. This library attempts to achieve all of
+this.
+
+## Installation
+
+Assume is written with client and server-side JavaScript in mind and uses the
+commonjs module system to export it self. The library is released in the public
+npm registry and can be installed using:
+
+```
+npm install --save-dev assume
+```
+
+The `--save-dev` flag tells `npm` to automatically add this `package.json` and it's
+installed version to the `devDependencies` of your module.
+
+As code is written against the commonjs module system we also ship a standalone
+version in the module which introduces an `assume` global. The standalone
+version can be found in the `dist` folder after installation. The dist file is
+not commited to GitHub.
+
+## Table of Contents
+
+- [Installation](#installation)
+- [Syntax](#syntax)
+- [Configuration](#configuration)
+- [Feature Detection](#feature-detection)
+- [Performance Testing](#performance-testing)
+- [Assertion](#assertion)
+ - [Keywords](#keywords)
+- [API](#api)
+ - [a, an](#a-an)
+ - [eitherOfType, oneOfType](#eitheroftype-oneoftype)
+ - [instanceOf, instanceof, inherits, inherit](#instanceof-instanceof-inherits-inherit)
+ - [include, includes, contain, contains](#include-includes-contain-contains)
+ - [ok, okay, truthy, truely](#ok-okay-truthy-truely)
+ - [falsely, falsey](#falsely-falsey)
+ - [true](#true)
+ - [false](#false)
+ - [exists, exist](#exists-exist)
+ - [length, lengthOf, size](#length-lengthof-size)
+ - [empty](#empty)
+ - [above, gt, greater, greaterThan](#above-gt-greater-greaterthan)
+ - [least, gte, atleast](#least-gte-atleast)
+ - [below, lt, less, lessThan](#below-lt-less-lessthan)
+ - [most, lte, atmost](#most-lte-atmost)
+ - [within, between](#within-between)
+ - [hasOwn, own, ownProperty, haveOwnProperty, property, owns, hasown](#hasown-own-ownproperty-haveownproperty-property-owns-hasown)
+ - [match, matches](#match-matches)
+ - [equal, equals, eq, eqs, exactly](#equal-equals-eq-eqs-exactly)
+ - [eql, eqls](#eql-eqls)
+ - [either](#either)
+ - [throw, throws, fail, fails](#throw-throws-fail-fails)
+ - [finite, isFinite, finiteness](#finite-isfinite-finiteness)
+ - [generator](#generator)
+ - [optimisation, optimization](#optimisation-optimization)
+ - [optimised, optimized](#optimised-optimized)
+ - [start, starts, startsWith, startWith](#start-stats-startswith-startwith)
+ - [end, ends, endsWith, endWith](#end-ends-endswith-endwith)
+ - [closeTo, close, approximately, near](#closeto-close-approximately-near)
+- [i.hope](#ihope)
+- [Planning](#planning)
+- [Waiting](#waiting)
+- [Plugins](#plugins)
+ - [Publishing](#publishing)
+ - [use](#use)
+ - [add](#add)
+ - [test](#test)
+ - [assign](#assign)
+ - [clone](#clone)
+
+## Syntax
+
+We support a lot of different syntaxes and assertion styles. The only thing we
+will no (read never) support is the `should` syntax as we will never extend
+build-in objects/primitives of JavaScript.
+
+The default syntax that we support is modeled after `expect` so you can replace
+any assertion library which implements this API by simply changing the require
+to:
+
+```js
+var expect = require('assume');
+
+expect('foo').equals('foo');
+expect('foo').is.a('string');
+```
+
+As you can see in the example above the `is` property is used to make the
+assertion more readable. We support the following aliases which allow these kind
+of chains:
+
+- `to`
+- `be`
+- `been`
+- `is`
+- `and`
+- `has`
+- `with`
+- `that`
+- `at`
+- `of`
+- `some`
+- `does`
+- `itself`
+- `which`
+
+So you can just write:
+
+```js
+assume(100).is.at.most(100);
+```
+
+But do note that these aliases are **optionally** so the above example can also
+be written as:
+
+```js
+assume(100).most(1000);
+```
+
+### Configuration
+
+The module can be configured globally be changing the properties on the `config`
+object:
+
+```js
+var assume = require('assume');
+assume.config.includeStack = false;
+```
+
+Or locally for each assertions by supplying the `assume` function with an
+optional configuration object:
+
+```js
+assume('foo', { includeStack: false }).is.a('buffer');
+```
+
+The following options can be configured:
+
+- **`includeStack`** Should we output a stack trace. Defaults to `true`.
+- **`showDIff`** Show difference between the given and expected values. Defaults
+ to `true`.
+
+### Feature Detection
+
+Certain assertions only work in certain JavaScript/EcmaScript environments.
+Things like the `generator` assertions only work in ES6 as the `function *` is
+invalid syntax. The results of the feature detection is publicly stored in the
+`assume.supports` object. You can use this object to add some conditional tests
+to your test suite. The following features are currently detected:
+
+- **generators** Are generators supported in the host environment.
+- **native** Is V8 native syntax supported.
+
+```js
+if (assume.supports.native) {
+ it('does things', function () {
+ ..
+ });
+}
+```
+
+If you are a plugin author, feel free to add your own feature detections to this
+object (as long as you do not override any pre-existing values).
+
+### Performance Testing
+
+The performance testing is only available for environments that use V8 and more
+specifically the `--allow-natives-syntax` flags. These flags can be supplied in
+[chrome before you start browser][flags]. These flags are necessary to get
+access to the V8 internals which expose optimization and de-optimization
+information.
+
+If you are running `iojs` or `node` on the server, you can pass in these flags
+directly:
+
+```
+iojs --allow-natives-syntax
+```
+
+#### Mocha
+
+If you are using `mocha` as test runner you usually add `mocha` as executable.
+But unfortunately, the `mocha` binary doesn't allow you to pass V8 flags. So
+instead of using the `mocha` binary directly you can use the `node` and call the
+`_mocha` binary instead:
+
+```
+node --allow-natives-syntax --harmony ./node_modules/mocha/bin/_mocha test/test.js
+```
+
+You can check if your host environment supports these performance tests by
+checking the `assume.supports.native` variable.
+
+### Assertion
+
+There are various of assertions available in assume. If you want the failed
+assertion to include a custom message or reason you can **always** add this as last
+argument of the assertion function.
+
+```js
+assume(true).is.false('how odd, true is not a false');
+```
+
+The behaviours of the assertions can be chained using special "flags" or
+"prefixes". We currently support the following prefixes.
+
+- `.not`, `.doesnt`, `.dont` Instead of assuming that your assertions assert to
+ `true` they will now assert for `false`.
+- `.deep`, `.deeply`, `.strict` `.strictly` Instructs the assertions to do a
+ **deep** equal, so it checks if the contents match instead of an `object` it
+ self matches.
+
+For example:
+
+```js
+assume(false).is.not.true();
+assume({foo:'bar'}).deep.equals({foo:'bar'});
+```
+
+#### Keywords
+
+Now, a special word of caution for those of you who are using this library to
+write cross browser tests. Internet Explorer has issues when you use
+**keywords** as functions. Using the `true()`, `instanceof()` etc. functions to
+assert you will run in to issues. So the rule of thumb here is that if you need
+to do cross browser support do not assert with the keyword based names.
+
+## API
+
+Let's take a closer look to all assertions that we're supporting:
+
+#### a, an
+
+Asserts if the given value is the correct type. We need to use Object.toString
+here because there are some implementation bugs the `typeof` operator:
+
+- Chrome <= 9: /Regular Expressions/ are evaluated to `function`
+
+As well as all common flaws like Arrays being seen as Objects etc. This
+eliminates all these edge cases.
+
+```js
+assume([]).is.a('array');
+```
+
+[`instanceof` is a keyword and might cause cross browser issues](#keywords)
+
+#### eitherOfType, oneOfType
+
+Asserts if the given value is one of the acceptable types.
+
+The same caveats regarding `typeof` apply as described in [a, an](#a-an).
+
+```js
+assume([]).is.oneOfType(['array', 'string']);
+```
+
+#### instanceOf, instanceof, inherits, inherit
+
+Asserts that the value is instanceof the given constructor.
+
+```js
+function Classy() {}
+
+var classes = new Classy();
+
+assume(classes).is.an.instanceOf(Classy);
+```
+
+#### include, includes, contain, contains
+
+Assert that value includes a given value. I know this sounds vague but an
+example might be more useful here. It can check this for strings, objects and
+arrays.
+
+```js
+assume({foo: 'bar'}).contains('foo');
+assume('hello world').includes('world');
+assume([1,3,4]).contains(1);
+```
+
+#### ok, okay, truthy, truely
+
+Assert that the value is truthy.
+
+```js
+assume(1).is.ok();
+assume(0).is.not.ok();
+assume(true).is.ok();
+```
+
+#### falsely, falsey
+
+Assert that the value is falsey.
+
+```js
+assume(0).is.falsely();
+assume(true).is.not.falsey();
+assume(null).is.falsely;
+```
+
+#### true
+
+Explicitly check that the value is the boolean `true`.
+
+```js
+assume(true).true();
+```
+
+[`true` is a keyword and might cause cross browser issues](#keywords)
+
+#### false
+
+Explicitly check that the value is the boolean `false`.
+
+```js
+assume(false).false();
+```
+
+[`false` is a keyword and might cause cross browser issues](#keywords)
+
+#### exists, exist
+
+Check if the value not not `null`.
+
+```js
+assume('hello').exists();
+assume(undefined).exists(); // throws
+```
+
+#### length, lengthOf, size
+
+Assert if the given value has the given length. It accepts arrays, strings,
+functions, object and anything else that has a `.length` property.
+
+```js
+assume({ foo: 'bar' }).has.length(1);
+assume([1,2,3,4,5,6]).is.size(6)
+```
+
+#### empty
+
+Short hand function for `assume(val).length(0)` so it can check if objects,
+arrays, strings are empty.
+
+```js
+assume([]).empty();
+assume('').empty();
+assume({}).empty();
+
+//
+// Also works against everything that has a `.length` property
+//
+localStorage.clear();
+assume(localStorage).is.empty();
+```
+
+#### above, gt, greater, greaterThan
+
+Assert if the value is above the given value. If you need greater or equal check
+out the `least` method. If value to assert is not a number we automatically
+extract the length out of it so you can use it check the length of arrays etc.
+
+```js
+assume(100).is.above(10);
+```
+
+#### least, gte, atleast
+
+Assert if the value is above or equal to the given value. If you just need
+greater check out the `above` method. If value to assert is not a number we
+automatically extract the length out of it so you can use it check the length of
+arrays etc.
+
+```js
+assume(100).is.least(10);
+assume(100).is.least(100);
+```
+
+#### below, lt, less, lessThan
+
+Assert if the value is less than the given value. If you need less or equal
+check out the `most` method. If value to assert is not a number we automatically
+extract the length out of it so you can use it check the length of arrays etc.
+
+```js
+assume(10).is.below(100);
+```
+
+#### most, lte, atmost
+
+Assert if the value is less or equal to the given value. If you just need less,
+check out the `less` method. If value to assert is not a number we automatically
+extract the length out of it so you can use it check the length of arrays etc.
+
+```js
+assume(10).is.most(100);
+assume(100).is.most(100);
+```
+
+#### within, between
+
+Check if the value is between or equal to a given range. If value to assert is
+not a number we automatically extract the length out of it so you can use it
+check the length of arrays etc.
+
+```js
+assume(100).is.between(90, 100);
+assume([1, 213, 13, 94, 5, 6, 7]).is.between(2, 10);
+```
+
+#### hasOwn, own, ownProperty, haveOwnProperty, property, owns, hasown
+
+Assert that the value has the specified property and optionally
+deeply check its value.
+
+```js
+assume({foo: 'bar'}).owns('foo');
+assume({foo: 'bar'}).owns('foo', 'bar');
+```
+
+#### match, matches
+
+Matches the value against a given Regular Expression. If a string is given
+instead of an actual Regular Expression we automatically transform it to an `new
+RegExp`.
+
+```js
+assume('hello world').matches(/world$/);
+```
+
+#### equal, equals, eq, eqs, exactly
+
+Assert that given value is strictly (===) equal to the supplied value.
+
+```js
+assume('foo').equals('foo');
+assume(13424).equals(13424);
+```
+
+#### eql, eqls
+
+Assert that the given value deeply equals the supplied value.
+
+```js
+assume([1,2]).eql([1,2]);
+```
+
+#### either
+
+Assert that the value is either one of the values of the given array. It can be
+prefixed with `.deep` for deep assertions.
+
+```js
+assume('foo').is.either(['bar', 'banana', 'foo']);
+assume({ foo: 'bar' }).is.either(['bar', 'banana', { foo: 'bar' }]);
+```
+
+#### throw, throws, fail, fails
+
+Assert that the given function throws an error. The error can match a string,
+regexp or function instance.
+
+```js
+function arrow() { throw new Error('you have failed this city'); }
+
+assume(arrow).throws(/failed this city/);
+assume(arrow).throws('failed this city');
+assume(arrow).does.not.throw('your mom');
+assume(function(){}).does.not.throw();
+```
+
+[`throw` is a keyword and might cause cross browser issues](#keywords)
+
+#### finite, isFinite, finiteness
+
+Assert that the given value is finite.
+
+```js
+assume(Infinity).is.finite();
+```
+
+If `deep` assertion style is used it will use the much stricter
+`Number.isFinite` instead of the regular `isFinite` functionality.
+
+#### generator
+
+Assert that the given value is an EcmaScript 6 based generator.
+
+```js
+assume(function *() {}).is.generator();
+```
+
+**Please note that this will only work if Generators are enabled in the host
+environment or you might end up with false positives**
+
+#### optimisation, optimization
+
+**Please see the [Performance Testing](#performance-testing) section information
+to enable these assertions as they require specific V8 flags to be enabled.**
+
+#### optimised, optimized
+
+**Please see the [Performance Testing](#performance-testing) section information
+to enable these assertions as they require specific V8 flags to be enabled.**
+
+#### start, starts, startsWith, startWith
+
+Assert that the value starts with the given string.
+
+```js
+assume('foobar').startWith('foo');
+```
+
+#### end, ends, endsWith, endWith
+
+Assert that the value ends with the given string.
+
+```js
+assume('foor bar, banana').endsWith('ana');
+```
+
+#### closeTo, close, approximately, near
+
+Assert a float point number is near a given value within a delta margin.
+
+```js
+assume(1.5).is.approximately(1.4, 0.2);
+```
+
+### i.hope
+
+The asserts we write are assumptions that we receive a given value. While you're
+writing tests you hope that they all pass. We could write these tests using an
+`i.hope.that(value)` syntax:
+
+```js
+var i = require('assume');
+
+i.hope.that('foo').is.a('string');
+i.expect.that('foo').is.a('string');
+i.assume.that('foo').equals('bar');
+i.sincerely.hope.that('foo').is.a('string');
+```
+
+## Planning
+
+The `assume.plan` method allows you to plan the amount of assertions that should
+be executed by your test suite. This method accepts 2 arguments:
+
+1. The amount of assertions you expect to run. This should always be an exact
+ number.
+2. An optional async callback that should be called with error as first argument
+ on failure instead of throwing an error. This makes it ideal for async
+ testing as you can just pass your continuation function.
+
+The method will return a function that should be called at the end of your
+tests. This method will still allow you to pass in an error as first argument so
+the supplied callback in second argument will be called directly with it.
+
+When the method is called we will count the amount of assertions that we're
+executed. If it's less or more than the supplied amount we will throw an error.
+
+```js
+var end = assume.plan(10);
+
+assume(10).equals(10);
+end(); // This throws an error as we only executed 1 out of the 10 asserts.
+```
+
+And with optional async callback:
+
+```js
+next = assume.plan(7, next);
+
+for (var i = 0; i < 10; i++) {
+ assume(i).equqls(i);
+}
+
+next(); // Also throws an error as we've executed 10 assertions instead of 7.
+```
+
+## Waiting
+
+Writing async tests can be hard, especially if you have to juggle with callbacks
+and wait untill 2 callbacks are completed before you can continue with the test
+suite. The `assume.wait` function helps you with orchestration of tests and
+callbacks. The method accepts 3 arguments:
+
+1. The amount of times the returned callback should be called before calling the
+ supplied callback.
+2. Optionally, the amount of assertions you expect to run. We will wrap the
+ returned callback with `assume.plan` this way.
+3. Completion callback which is called after the callbacks have been called.
+
+The method will return a function that should be used as callback for your async
+tests. It follows an error first callback pattern and instantly calls the
+supplied callback once an error has be passed in as error argument.
+
+```js
+ it('does async things', function (next) {
+ next = assume.wait(2, 4, next);
+
+ asynctask(function (err, data) {
+ assume(err).is.a('undefined');
+ assume(data).equals('testing');
+
+ next();
+ });
+
+ asynctaskfail(function (err, data) {
+ assume(err).is.a('undefined');
+ assume(data).equals('testing');
+
+ next();
+ });
+ });
+ ```
+
+## Plugins
+
+We've done our best to include a bunch of assertions that should make it easier
+to test your code but it's always possible that we're missing assertions or you
+just want to eliminate repetition in your code. So we've got a plugin interface
+which allows you to extend the `assume` instance with even more assertions.
+
+### Publishing
+
+For the sake of discoverablity ability of your plugins on npm we suggest to either
+suffix or prefix your module with `assume` and adding the `assume` keyword in to
+your keywords list.
+
+### use
+
+Let's assume that we've want to extend the library with a method for checking
+the headers of a passed in HTTP request object. If it was released in npm we
+could add it as following:
+
+```js
+assume.use(require('assume-headers'));
+```
+
+The `use` method returns `assume` so it can be used to chain multiple plugin
+calls together:
+
+```js
+assume
+.use(require('assume-headers'))
+.use(require('assume-method'));
+```
+
+The `assume-headers` plugin/module should export a function which receives the
+assume instance to extend as illustrated by the example below:
+
+```js
+module.exports = function plugin(assume, util) {
+ /**
+ * Assert that the received HTTP request contains a given header.
+ *
+ * @param {String} name Name of the header that we should have received.
+ * @param {String} ms Reason of failure.
+ * @returns {Assume}
+ * @api public
+ */
+ assume.add('header', function header(name, msg) {
+ var expect = '`'+ util.string(this.value.header)'` to @ have header '+ util.string(name);
+
+ return this.test(name in this.value.headers, msg, expect);
+ });
+}
+```
+
+The plugin receives 2 arguments:
+
+1. A reference to the `assume` instance so it can be extended.
+2. Small assertion helper library which contains all the internals we're using.
+
+The helper library contains the following methods:
+
+- **name**, Reference to the `fn.name` module so you extract names from
+ functions.
+- **get**, Reference to the `get` method of the `pathval` module.
+- **string**, Inspection function which safely transforms objects, numbers,
+ dates etc. to a string.
+- **deep**, A deep assertion if the two argument deeply equal to each other.
+- **type**, Extract the type of an object to an lowercase string. Useful for
+ detecting the difference between `object`, `array`, `arguments`, `date`,
+ `buffer` etc.
+- **size**, A function which returns the size of given object or array.
+- **each**, Simple iterator which accepts an array/object and calls the supplied
+ callback with the value and key/index.
+- **nodejs**, Boolean indicating if we are running on `nodejs`.
+
+New flags can be introduced by adding properties to the `flags` object. The
+`flags` object has the following structure:
+
+- `key` This is the name of the property which will be added to the `assume`
+ instance. The property is set to `false` by default and will be to `true` once
+ once of the `flags` is accessed.
+- `value` These are the aliases that can be used to the set the property to
+ `true`.
+
+For our `.not` flags we've set the following key/value's:
+
+```js
+Assert.flags.untrue = 'doesnt, not, dont';
+```
+
+Please do note that you should try to limit the amount of flags that you add as
+they are quite expensive to process every single time.
+
+Adding new assertions to assume can be done using the following methods:
+
+#### add
+
+The `assume.add` method is a convince method for adding new methods to the
+assume prototype. It was created using the [`assign`](#assign) method so it can
+automatically add aliases/shorthand's of the method to the prototype in one go.
+The method requires 2 arguments:
+
+1. A string which is comma or space separated or an array which contains the
+ names of the methods that should be added to the prototype.
+2. The function or value that is assigned for all these properties.
+
+```js
+module.exports = function (assume, util) {
+ util.each(['GET', 'POST', 'PUT', 'DELETE'], function each(method) {
+ assume.add(method, function () {
+ var expect = '`'+ util.string(this.value.method)+'` to @ be '+ method;
+
+ return this.test(this.value.method === method, msg, expect);
+ });
+ });
+}
+```
+
+If you want to add more aliases for the `.function()` method you can simply do
+a:
+
+```js
+assume.add('execute, executes, exec', function () {
+ return this.clone().is.a('function');
+});
+```
+
+The value to assert is stored in the `value` property of the instance. If the
+`deep` flag is set, the `deeply` property is set to `true`.
+
+#### test
+
+This is the method that handles all the assertion passing and failing. It's
+_the_ most important method of all. It accepts the following arguments:
+
+- `passed`, a boolean which indicates if the assertion failed or passed.
+- `msg`, a string which is the reason or message provided by the users.
+- `expectation`, a compiled template which explains what the assertion expected.
+- `slice`, a number which slices of stacks from the stack trace. This is keeps
+ the stack trace clear of all references to our own assertion library and only
+ contains the part of the test/suite where the assertion was initiated. This
+ value is optional and defaults to `2` so it removes the `test` and the
+ `assertion` from the stack.
+
+If the `assertion` passes the method will return it self, or it will throw.
+
+```js
+assume.add('true', function (msg) {
+ var expectation = format('value to @ be true');
+ return this.test(this.value === true, msg, expectation);
+});
+```
+
+In example above you might have noticed the odd `@` in the `expection` value.
+This is a special character and will be replaced with `not` if the `.not` flag
+was used or completely removed (including an extra whitespace at the end).
+
+#### assign
+
+Assign multiple values to a given thing. This method accepts one argument which
+is an object or prototype on where we should assign things. It will return a
+function that is responsible for the assignment on that given thing. The return
+function will require 2 arguments:
+
+1. A string which is comma or space separated or an array which contains the
+ names of the methods that should be added to the prototype.
+2. The function or value that is assigned for all these properties.
+
+To create your own custom `add` method you could simply do:
+
+```js
+var add = assume.assign(assign.prototype);
+```
+
+And the `add` function would now do exactly the same as the [`assume.add`](#add)
+method.
+
+#### clone
+
+Create an exact clone of the assume instance so it all flags and options are
+identical to the current assume instance. The method accepts one optional
+argument which is the value it should assert. If nothing is given it uses the
+current value.
+
+This can be helpful if you want to run assertions in your assertions so you can
+assert while you assert.
+
+```js
+// Yo dawg, I herd you like assertions so I put assertions in the assertions so
+// you can assert while you assert.
+
+assume.add('something', function somethign(value, msg) {
+ this.clone().is.a('string');
+ this.clone().is.endsWith('thing');
+
+ return this.test(this.value ==== 'something', msg, 'the value should be something');
+});
+```
+
+## License
+
+MIT
+
+[flags]: http://www.chromium.org/developers/how-tos/run-chromium-with-flags
diff --git a/debian/tests/test-modules/assume/index.js b/debian/tests/test-modules/assume/index.js
new file mode 100644
index 0000000..4ad3ea7
--- /dev/null
+++ b/debian/tests/test-modules/assume/index.js
@@ -0,0 +1,1068 @@
+'use strict';
+
+var stringify = require('object-inspect')
+ , pruddy = require('pruddy-error')
+ , displayName = require('fn.name')
+ , pathval = require('pathval')
+ , deep = require('deep-eql');
+
+var undefined
+ , called = 0
+ , toString = Object.prototype.toString
+ , hasOwn = Object.prototype.hasOwnProperty
+ , nodejs = !!(typeof process != 'undefined' && process.versions && process.versions.node);
+
+/**
+ * Get class information for a given type.
+ *
+ * @param {Mixed} of Type to check.
+ * @returns {String} The name of the type.
+ * @api private
+ */
+function type(of) {
+ if (Buffer.isBuffer(of)) return 'buffer';
+ if (of === undefined) return 'undefined';
+ if (of === null) return 'null';
+ if (of !== of) return 'nan';
+
+ return toString.call(of).slice(8, -1).toLowerCase();
+}
+
+/**
+ * Determine the size of a collection.
+ *
+ * @param {Mixed} collection The object we want to know the size of.
+ * @returns {Number} The size of the collection.
+ * @api private
+ */
+function size(collection) {
+ var x, i = 0;
+
+ if ('object' === type(collection)) {
+ if ('number' === type(collection.length)) return collection.length;
+
+ for (x in collection) {
+ if (hasOwn.call(collection, x)) i++;
+ }
+
+ return i;
+ }
+
+ try { return +collection.length || 0; }
+ catch (e) { return 0; }
+}
+
+/**
+ * Iterate over each item in an array.
+ *
+ * @param {Array} arr Array to iterate over.
+ * @param {Function} fn Callback for each item.
+ * @api private
+ */
+function each(what, fn) {
+ if ('array' === type(what)) {
+ for (var i = 0, length = what.length; i < length; i++) {
+ if (false === fn(what[i], i, what)) break;
+ }
+ } else {
+ for (var key in what) {
+ if (false === fn(what[key], key, what)) break;
+ }
+ }
+}
+
+/**
+ * Return a formatter function which compiles the expectation message. The
+ * message can contain various of patterns which will be replaced with
+ * a stringified/parsed version of the supplied argument for that given
+ * placeholder pattern. The following patterns are supported:
+ *
+ * - %% : Escape the % so you can write %d in your messages as %%d
+ * - %d : Cast argument in to a number.
+ * - %s : Cast argument in to a string.
+ * - %f : Transform function in to the name of the function.
+ * - %j : Transform object to a string.
+ *
+ * @param {String} expectation The expectation message.
+ * @returns {Function}
+ * @api private
+ */
+function format() {
+ var args = Array.prototype.slice.call(arguments, 0)
+ , expectation = args.shift()
+ , length = args.length
+ , i = 0;
+
+ return function compile(not) {
+ if (not) expectation = expectation.replace(/@/g, 'not');
+ else expectation = expectation.replace(/@\s/g, '');
+
+ return expectation.replace(/%[sdjf%]/g, function replace(char) {
+ if (i >= length) return char;
+
+ switch (char) {
+ case '%%':
+ return '%';
+
+ case '%s':
+ return String(args[i++]);
+
+ case '%d':
+ return Number(args[i++]);
+
+ case '%f':
+ return displayName(args[i++]);
+
+ case '%j':
+ try { return stringify(args[i++]); }
+ catch (e) { return '<error was thrown: '+ e.message +'>'; }
+
+ default: return char;
+ }
+ });
+ };
+}
+
+/**
+ * Assert values.
+ *
+ * Flags:
+ *
+ * - **stacktrace**: Include stacktrace in the assertion.
+ * - **diff**: Attempt to show the difference in object/values so we know why
+ * the assertion failed.
+ * - **sliceStack**: The amount of stacks we should slice off errors messages.
+ *
+ * @constructor
+ * @param {Mixed} value Value we need to assert.
+ * @param {Object} flags Assertion flags.
+ * @api public
+ */
+function Assert(value, flags) {
+ if (!(this instanceof Assert)) return new Assert(value, flags);
+ flags = flags || {};
+
+ this.stacktrace = 'stacktrace' in flags ? flags.stacktrace : Assert.config.includeStack;
+ this.sliceStack = 'slice' in flags ? flags.slice : Assert.config.sliceStack;
+ this.diff = 'diff' in flags ? flags.diff : Assert.config.showDiff;
+
+ //
+ // These flags are by the alias function so we can generate .not and .deep
+ // properties which are basically new Assert instances with these flags set.
+ //
+ for (var alias in Assert.flags) {
+ this[alias] = alias in flags ? flags[alias] : false;
+ }
+
+ this.value = value;
+
+ Assert.assign(this)('to, be, been, is, and, has, have, with, that, at, of, same, does, itself, which');
+ Assert.alias(value, this);
+}
+
+/**
+ * Attempt to mimic the configuration API of chai.js so it's dead simple to
+ * migrate from chai.js to assume.
+ *
+ * @type {Object}
+ * @public
+ */
+Assert.config = {
+ includeStack: true, // mapped to `stacktrace` as default value.
+ showDiff: true, // mapped to `diff` as default value.
+ sliceStack: 2 // Number of stacks that we should slice of the err stack..
+};
+
+/**
+ * List of flags and properties that need to be created for chaining purposes.
+ * Plugins could add extra properties that needed to be chained as well.
+ *
+ * @type {Object}
+ * @public
+ */
+Assert.flags = {
+ _not: 'doesnt, not, dont',
+ _deep: 'deep, deeply, strict, strictly'
+};
+
+/**
+ * Certain assertions can be disabled based on their environment that they are
+ * executing in. This object allows you in spect which of these conditional
+ * assertions are supported.
+ *
+ * @type {Object}
+ * @public
+ */
+Assert.supports = (function detect() {
+ var supports = {};
+
+ try {
+ eval('(function*(){})()');
+ supports.generators = true;
+ } catch (e) {
+ supports.generators = false;
+ }
+
+ try {
+ eval('%GetV8Version()');
+ supports.native = true;
+ } catch (e) {
+ supports.native = false;
+ }
+
+ return supports;
+}(/* Douglas Crockford wants the dog balls inside youtu.be/taaEzHI9xyY#t=2020s */));
+
+/**
+ * Assign values to a given thing.
+ *
+ * @param {Mixed} where Where do the new properties need to be assigned on.
+ * @returns {Function}
+ * @api public
+ */
+Assert.assign = function assign(where) {
+ return function assigns(aliases, value) {
+ if ('string' === typeof aliases) {
+ if (~aliases.indexOf(',')) aliases = aliases.split(/[\s|\,]+/);
+ else aliases = [aliases];
+ }
+
+ for (var i = 0, length = aliases.length; i < length; i++) {
+ where[aliases[i]] = value || where;
+ }
+
+ return where;
+ };
+};
+
+/**
+ * Add aliases to the given constructed asserts. This allows us to chain
+ * assertion calls together.
+ *
+ * @param {Mixed} value Value that we need to assert.
+ * @param {Assert} assert The constructed assert instance.
+ * @returns {Assert} The given assert instance.
+ * @api private
+ */
+Assert.alias = function alias(value, assert) {
+ var assign = Assert.assign(assert)
+ , flags, flag, prop;
+
+ for (prop in Assert.flags) {
+ if (!hasOwn.call(Assert.flags, prop)) continue;
+
+ if (!assert[prop]) {
+ flags = {};
+
+ for (flag in Assert.flags) {
+ if (!hasOwn.call(Assert.flags, flag)) continue;
+ flags[flag] = assert[flag];
+ }
+
+ //
+ // Add some default values to the flags.
+ //
+ flags.stacktrace = assert.stacktrace;
+ flags.diff = assert.diff;
+ flags[prop] = true;
+
+ assign(Assert.flags[prop], new Assert(value, flags));
+ } else assign(Assert.flags);
+ }
+
+ return assert;
+};
+
+/**
+ * API sugar of adding aliased prototypes to the Assert. This makes the code
+ * a bit more workable and human readable.
+ *
+ * @param {String|Array} aliases List of methods.
+ * @param {Function} fn Actual assertion function.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add = Assert.assign(Assert.prototype);
+
+/**
+ * Asserts if the given value is the correct type. We need to use
+ * Object.toString here because there are some implementation bugs the `typeof`
+ * operator:
+ *
+ * - Chrome <= 9: /Regular Expressions/ are evaluated to `function`
+ *
+ * As well as all common flaws like Arrays being seen as Objects etc. This
+ * eliminates all these edge cases.
+ *
+ * @param {String} of Type of class it should equal
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('a, an', function typecheck(of, msg) {
+ of = of.toString().toLowerCase();
+
+ var value = type(this.value)
+ , expect = format('`%j` (%s) to @ be a %s', this.value, value, of);
+
+ return this.test(value === of, msg, expect);
+});
+
+/**
+ * Asserts if the given value is the correct type from a list of types.
+ * The same caveats regarding `typeof` apply as described in `a`, `an`.
+ *
+ * @param {String[]} ofs Acceptable types to check against
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('eitherOfType, oneOfType', function multitypecheck(ofs, msg) {
+ var value = type(this.value)
+ , expect = format('`%j` (%s) to @ be a %s', this.value, value, ofs.join(' or a '));
+
+ var test = false;
+ for (var i = 0; i < ofs.length; i++) {
+ if (ofs[i].toString().toLowerCase() === value) {
+ test = true;
+ break;
+ }
+ }
+
+ return this.test(test, msg, expect);
+});
+
+/**
+ * Asserts that the value is instanceof the given constructor.
+ *
+ * @param {Function} constructor Constructur the value should inherit from.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('instanceOf, instanceof, inherits, inherit', function of(constructor, msg) {
+ var expect = format('%f to @ be an instanceof %f', this.value, constructor);
+
+ return this.test(this.value instanceof constructor, msg, expect);
+});
+
+/**
+ * Assert that the value includes the given value.
+ *
+ * @param {Mixed} val Value to match.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('include, includes, contain, contains', function contain(val, msg) {
+ var includes = false
+ , of = type(this.value)
+ , expect = format('`%j` to @ include %j', this.value, val);
+
+ switch (of) {
+ case 'array':
+ for (var i = 0, length = this.value.length; i < length; i++) {
+ if (this._deep ? deep(this.value[i], val) : this.value[i] === val) {
+ includes = true;
+ break;
+ }
+ }
+ break;
+
+ case 'object':
+ if (val in this.value) {
+ includes = true;
+ }
+ break;
+
+ case 'string':
+ if (~this.value.indexOf(val)) {
+ includes = true;
+ }
+ break;
+ }
+
+ return this.test(includes === true, msg, expect);
+});
+
+/**
+ * Assert that the value is truthy.
+ *
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('ok, okay, truthy, truly', function ok(msg) {
+ var expect = format('`%j` to @ be truthy', this.value);
+
+ return this.test(Boolean(this.value), msg, expect);
+});
+
+/**
+ * Assert that the value is falsey.
+ *
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('falsely, falsey, falsy', function nope(msg) {
+ var expect = format('`%j` to @ be falsely', this.value);
+
+ return this.test(Boolean(this.value) === false, msg, expect);
+});
+
+/**
+ * Assert that the value is `true`.
+ *
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('true', function ok(msg) {
+ var expect = format('`%j` to @ equal (===) true', this.value);
+
+ return this.test(this.value === true, msg, expect);
+});
+
+/**
+ * Assert that the value is `true`.
+ *
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('false', function nope(msg) {
+ var expect = format('`%j` to @ equal (===) false', this.value);
+
+ return this.test(this.value === false, msg, expect);
+});
+
+/**
+ * Assert that the value exists.
+ *
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('exists, exist', function exists(msg) {
+ var expect = format('`%j` to @ exist', this.value);
+
+ return this.test(this.value != null, msg, expect);
+});
+
+/**
+ * Asserts that the value's length is the given value.
+ *
+ * @param {Number} value Size of the value.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('length, lengthOf, size', function length(value, msg) {
+ var actualValue = size(this.value);
+ var expect = format('`%j` to @ have a length of %d, found %d', this.value, value, actualValue);
+
+ return this.test(actualValue === +value, msg, expect);
+});
+
+/**
+ * Asserts that the value's length is 0 or doesn't contain any enumerable keys.
+ *
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('empty', function empty(msg) {
+ var expect = format('`%j` to @ be empty', this.value);
+
+ return this.test(size(this.value) === 0, msg, expect);
+});
+
+/**
+ * Assert that the value is greater than the specified value.
+ *
+ * @param {Number} value The greater than value.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('above, gt, greater, greaterThan', function above(value, msg) {
+ var amount = type(this.value) !== 'number' ? size(this.value) : this.value
+ , expect = format('%d to @ be greater than %d', amount, value);
+
+ return this.test(amount > value, msg, expect);
+});
+
+/**
+ * Assert that the value is equal or greater than the specified value.
+ *
+ * @param {Number} value The specified value.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('least, gte, atleast', function least(value, msg) {
+ var amount = type(this.value) !== 'number' ? size(this.value) : this.value
+ , expect = format('%d to @ be greater or equal to %d', amount, value);
+
+ return this.test(amount >= value, msg, expect);
+});
+
+/**
+ * Assert that the value starts with the given value.
+ *
+ * @param {String|Array} value String it should start with.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('start, starts, startsWith, startWith', function start(value, msg) {
+ var expect = format('`%j` to @ start with %j', this.value, value);
+
+ return this.test(0 === this.value.indexOf(value), msg, expect);
+});
+
+/**
+ * Assert that the value ends with the given value.
+ *
+ * @param {String} value String it should start with.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('end, ends, endsWith, endWith', function end(value, msg) {
+ var index = this.value.indexOf(value, this.value.length - value.length)
+ , expect = format('`%j` to @ end with %j', this.value, value);
+
+ return this.test(index >= 0, msg, expect);
+});
+
+/**
+ * Assert a floating point number is near the give value within the delta
+ * margin.
+ *
+ * @param {Number} value The specified value.
+ * @param {Number} delta Radius.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('closeTo, close, approximately, near', function close(value, delta, msg) {
+ var expect = format('`%j` to @ be close to %d ± %d', this.value, value, delta);
+
+ return this.test(Math.abs(this.value - value) <= delta, msg, expect);
+});
+
+/**
+ * Assert that the value is below the specified value.
+ *
+ * @param {Number} value The specified value.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('below, lt, less, lessThan', function below(value, msg) {
+ var amount = type(this.value) !== 'number' ? size(this.value) : this.value
+ , expect = format('%d to @ be less than %d', amount, value);
+
+ return this.test(amount < value, msg, expect);
+});
+
+/**
+ * Assert that the value is below or equal to the specified value.
+ *
+ * @param {Number} value The specified value.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('most, lte, atmost', function most(value, msg) {
+ var amount = type(this.value) !== 'number' ? size(this.value) : this.value
+ , expect = format('%d to @ be less or equal to %d', amount, value);
+
+ return this.test(amount <= value, msg, expect);
+});
+
+/**
+ * Assert that that value is within the given range.
+ *
+ * @param {Number} start Lower bound.
+ * @param {Number} finish Upper bound.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('within, between', function within(start, finish, msg) {
+ var amount = type(this.value) !== 'number' ? size(this.value) : this.value
+ , expect = format('%d to @ be greater or equal to %d and @ be less or equal to %d', amount, start, finish);
+
+ return this.test(amount >= start && amount <= finish, msg, expect);
+});
+
+/**
+ * Assert that the value has an own property with the given prop.
+ *
+ * @param {String} prop Property name.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('hasOwn, own, ownProperty, haveOwnProperty, property, owns, hasown', function has(prop, value, msg) {
+ var expect = format('`%j` @ to have own property %s', this.value, prop)
+ , tested = this.test(hasOwn.call(this.value, prop), msg, expect);
+
+ return arguments.length > 1
+ ? this.clone(this.value[prop]).equals(value)
+ : tested;
+});
+
+/**
+ * Asserts that the value matches a regular expression.
+ *
+ * @param {RegExp} regex Regular expression to match against.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('match, matches', function test(regex, msg) {
+ if ('string' === typeof regex) regex = new RegExp(regex);
+
+ var expect = format('`%j` to @ match %j', this.value, regex);
+
+ return this.test(!!regex.test(this.value), msg, expect);
+});
+
+/**
+ * Assert that the value equals a given thing.
+ *
+ * @param {Mixed} thing Thing it should equal.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('equal, equals, eq, eqs, exactly', function equal(thing, msg) {
+ var expect = format('`%j` to @ equal (===) `%j`', this.value, thing);
+
+ if (!this._deep) return this.test(this.value === thing, msg, expect);
+
+ this.sliceStack++;
+ return this.eql(thing, msg);
+});
+
+/**
+ * Assert that the value **deeply** equals a given thing.
+ *
+ * @param {Mixed} thing Thing it should equal.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('eql, eqls', function eqls(thing, msg) {
+ var expect = format('`%j` to deeply equal `%j`', this.value, thing);
+
+ return this.test(deep(this.value, thing), msg, expect);
+});
+
+/**
+ * Assert that the value is either one of the given values.
+ *
+ * @param {Array} arrgs All the values it can match.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('either', function either(args, msg) {
+ var expect = '`%j` to equal either `%j` '
+ , i = args.length
+ , result = false
+ , values = [];
+
+ while (i-- || result) {
+ if (!this._deep) result = this.value === args[i];
+ else result = deep(this.value, args[i]);
+ if (result) break;
+
+ values.push(args[i]);
+ }
+
+ expect = format.apply(null, [expect + (new Array(values)).join('or `%j` ')].concat(values));
+ return this.test(result, msg, expect);
+});
+
+/**
+ * Assert if the given function throws.
+ *
+ * @param {Mixed} thing Thing it should equal.
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('throw, throws, fails, fail', function throws(thing, msg) {
+ try { this.value(); }
+ catch (e) {
+ var message = 'object' === typeof e ? e.message : e;
+
+ switch (type(thing)) {
+ case 'string': return this.clone(message).includes(thing, msg);
+ case 'regexp': return this.clone(message).matches(thing, msg);
+ case 'function': return this.clone(e).instanceOf(thing, msg);
+ case 'undefined': return this.test(true, msg, format('%f to @ throw', this.value));
+ default: return this.clone(e).equals(thing);
+ }
+ }
+
+ return this.test(false, msg, format('%f to @ throw', this.value));
+});
+
+/**
+ * Assert if the given value is finite.
+ *
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('isFinite, finite, finiteness', function finite(msg) {
+ var expect = format('`%j`s @ a is a finite number', this.value)
+ , result;
+
+ if (this._deep) {
+ result = Number.isFinite
+ ? Number.isFinite(this.value)
+ : 'number' === type(this.value) && isFinite(this.value);
+ } else {
+ result = isFinite(this.value);
+ }
+
+ return this.test(result, msg, expect);
+});
+
+/**
+ * Assert if the given function is an ES6 generator.
+ *
+ * @param {String} msg Reason of failure.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('generator', function generators(msg) {
+ var expect = format('%f to @ be a generator', this.value)
+ , result;
+
+ //
+ // Non standard function from Mozilla allows us to check if a function is
+ // a generator.
+ //
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/isGenerator
+ //
+ if ('function' === typeof this.value.isGenerator) {
+ result = this.value.isGenerator();
+ } else if ('generatorfunction' === type(this.value)) {
+ result = true;
+ } else {
+ result = 'function' === type(this.value) && this.value.toString().indexOf('function*') === 0;
+ }
+
+ return this.test(result, msg, expect);
+});
+
+//
+// The following assertions require's v8's allow-natives-syntax flag to be
+// enabled as this allows us to hook in to the more internal parts of the
+// engine. The native syntax is wrapped in a try catch with a new Function
+// construction so the rest of the code will execute when JavaScript engines do
+// not understand the instructions.
+//
+(function v8() {
+ var states = 'void,yes,no,always,never,void,maybe'.split(',')
+ , detect;
+
+ if (!Assert.supports.native) detect = function optimized() { return 0; };
+ else detect = new Function('fn', 'args', 'selfie', [
+ 'fn.apply(selfie, args);',
+ '%OptimizeFunctionOnNextCall(fn);',
+ 'fn.apply(selfie, args);',
+ 'return %GetOptimizationStatus(fn);'
+ ].join('\n'));
+
+ /**
+ * Assert that a given function has reached a certain optimization level.
+ *
+ * @param {String} level Optimization level
+ * @param {Array} args Arguments for the function
+ * @param {Mixed} selfie This context for the function
+ * @param {String} msg Reason of failure
+ * @returns {Assert}
+ * @api public
+ */
+ Assert.add('optimisation, optimization', function optimization(level, args, selfie, msg) {
+ var expect = format('%f to be optimized as %s', this.value, level)
+ , status = states[detect(this.value, args, selfie)];
+
+ return this.test(status === level, msg, expect);
+ });
+
+ /**
+ * Assert that the function is optimized.
+ *
+ * @param {String} msg Reason of failure
+ * @returns {Assert}
+ * @api public
+ */
+ Assert.add('optimized, optimised', function optimized(msg) {
+ var expect = format('%f to be optimized', this.value)
+ , status = states[detect(this.value, [])];
+
+ return this.test(status === 'yes', msg, expect);
+ });
+}());
+
+/**
+ * Create a clone of the current assertion instance which has the same
+ * configuration but a different value.
+ *
+ * @param {Mixed} value The new value
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('clone', function clone(value) {
+ var configuration = {
+ stacktrace: this.stacktrace,
+ slice: this.sliceStack + 1,
+ diff: this.diff
+ };
+
+ for (var alias in Assert.flags) {
+ if (!hasOwn.call(Assert.flags, alias)) continue;
+ configuration[alias] = this[alias];
+ }
+
+ return new Assert(arguments.length ? value : this.value, configuration);
+});
+
+/**
+ * Validate the assertion.
+ *
+ * @param {Boolean} passed Didn't the test pass or fail.
+ * @param {String} msg Custom message provided by users.
+ * @param {Function} expectation Compiled expectation template
+ * @param {Number} slice The amount of stack traces we need to remove.
+ * @returns {Assert}
+ * @api public
+ */
+Assert.add('test', function test(passed, msg, expectation, slice) {
+ called++; // Needed for tracking the amount of executed assertions.
+
+ if (this._not) passed = !passed;
+ if (passed) return this;
+
+ msg = msg || 'Unknown assertation failure occured';
+ slice = slice || this.sliceStack;
+
+ if (expectation) msg += ', assumed ' + expectation(this._not);
+
+ var failure = new Error(msg)
+ , err = { message: failure.message, stack: '' };
+
+ if (this.stacktrace) {
+ err.stack = failure.stack || err.stack;
+ }
+
+ //
+ // Pre-scrub, it's possible that the error message is a multi line error
+ // message and that really messes up the slicing of the call stack, to prevent
+ // this from happening, we're just going to replace the error message that is
+ // on the stack with a single line as we use the `err.message` instead of the
+ // message that is in the stack anyways.
+ //
+ err.stack = err.stack.replace(err.message, 'assume-replaced-the-err-message');
+
+ //
+ // Clean up the stack by slicing off the parts that are pointless to most
+ // people. (Like where it enters this assertion library).
+ //
+ err.stack = err.stack.split('\n').slice(slice).join('\n') || err.stack;
+ err.stack = pruddy(err);
+
+ if ('function' !== typeof Object.create) {
+ if ('object' === typeof console && 'function' === typeof console.error) {
+ console.error(err.stack);
+ }
+
+ throw failure;
+ }
+
+ failure = Object.create(Error.prototype);
+ failure.message = err.message;
+ failure.stack = err.stack;
+
+ throw failure;
+});
+
+/**
+ * Plan for the amount of assertions that needed to run. This is great way to
+ * figure out if you have edge cases in your code which prevented an assertion or
+ * callback from running.
+ *
+ * ```js
+ * it('run a lot of assertions', function (next) {
+ * next = assume.plan(10, next);
+ * });
+ * ```
+ *
+ * @param {Number} tests The amount of assertions you expect to run.
+ * @param {Function} fn Optional completion callback which receives the error.
+ * @returns {Function} Completion callback.
+ * @api public
+ */
+Assert.plan = function plan(tests, fn) {
+ fn = fn || function next(err) {
+ if (err) throw err;
+ };
+
+ var atm = called;
+
+ return function validate(err) {
+ var ran = called - atm
+ , msg;
+
+ if (err) return fn(err);
+ if (tests === ran) return fn();
+
+ msg = [
+ 'We ran',
+ ran - tests,
+ ran > tests ? 'more' : 'less',
+ 'assertations than the expected',
+ tests
+ ];
+
+ fn(new Error(msg.join(' ')));
+ };
+};
+
+/**
+ * Wait until the returned callback is called x times before advancing. This
+ * makes it a bit easier to write async tests that require multiple callbacks.
+ *
+ * ```js
+ * it('does async things', function (next) {
+ * next = assume.wait(2, 4, next);
+ *
+ * asynctask(function (err, data) {
+ * assume(err).is.a('undefined');
+ * assume(data).equals('testing');
+ *
+ * next();
+ * });
+ *
+ * asynctaskfail(function (err, data) {
+ * assume(err).is.a('undefined');
+ * assume(data).equals('testing');
+ *
+ * next();
+ * });
+ * });
+ * ```
+ *
+ * @param {Number} calls The amount of calls the returned callback should called.
+ * @param {Number} tests The amount of tests that should be completed before cb.
+ * @param {Function} fn Completion callback.
+ * @returns {Function} New function that does the counting.
+ * @api public
+ */
+Assert.wait = function wait(calls, tests, fn) {
+ //
+ // Make the `tests` argument optional by allowing callback to be used there.
+ //
+ if ('function' === typeof tests) {
+ fn = tests;
+ tests = 0;
+ }
+
+ //
+ // If `tests` are specified, pass it directly in to the Assert.plan function
+ // so we can use that as given callback.
+ //
+ if (tests) fn = Assert.plan(tests, fn);
+
+ var ignore = false;
+
+ return function counter(err) {
+ if (ignore) return;
+ if (err || !--calls) return ignore = true, fn(err);
+ };
+};
+
+/**
+ * Load/execute a new plugin.
+ *
+ * @param {Function} plugin Plugin to be executed.
+ * @returns {Function} Assert, for chaining purposes.
+ * @api public
+ */
+Assert.use = function use(plugin) {
+ plugin(this, {
+ name: displayName, // Extract the name of a function.
+ string: stringify, // Transform thing to a string.
+ get: pathval.get, // Get a value from an object.
+ format: format, // Format an expectation message.
+ nodejs: nodejs, // Are we running on Node.js.
+ deep: deep, // Deep assertion.
+ type: type, // Get class information.
+ size: size, // Get the size of an object.
+ each: each // Iterate over arrays.
+ });
+
+ return Assert;
+};
+
+//
+// Create type checks for all build-in JavaScript classes.
+//
+each(('new String§new Number§new Array§new Date§new Error§new RegExp§new Boolean§'
+ + 'new Float32Array§new Float64Array§new Int16Array§new Int32Array§new Int8Array§'
+ + 'new Uint16Array§new Uint32Array§new Uint8Array§new Uint8ClampedArray§'
+ + 'new ParallelArray§new Map§new Set§new WeakMap§new WeakSet§new TypedArray(1)§'
+ + 'new DataView(new ArrayBuffer(1))§new ArrayBuffer(1)§new Promise(function(){})§'
+ + 'new Blob§arguments§null§undefined§new Buffer(1)§NaN§navigator§location§'
+ + 'new Function§new Proxy({}, function(){})§Symbol("assume")§Math'
+).split('§'), function iterate(code) {
+ var name, arg;
+
+ //
+ // Not all of these constructors are supported in the browser, we're going to
+ // compile dedicated functions that returns a new instance of the given
+ // constructor. If it's not supported the code will throw and we will simply
+ // return.
+ //
+ try { arg = (new Function('return '+ code))(); }
+ catch (e) { return; }
+
+ name = type(arg);
+
+ Assert.add(name, function typecheck(msg) {
+ var expect = format('`%j` to @ be an %s', this.value, name)
+ , of = type(this.value);
+
+ return this.test(of === name, msg, expect, 3);
+ });
+});
+
+//
+// Introduce an alternate API:
+//
+// ```js
+// var i = require('assume');
+//
+// i.assume.that('foo').equals('bar');
+// i.sincerely.hope.that('foo').equals('bar');
+// i.expect.that('foo').equals('bar');
+// ```
+//
+Assert.hope = { that: Assert };
+Assert.assign(Assert)('sincerely, expect');
+Assert.assign(Assert)('assume, expect', Assert.hope);
+
+//
+// Expose the module.
+//
+module.exports = Assert;
diff --git a/debian/tests/test-modules/assume/package.json b/debian/tests/test-modules/assume/package.json
new file mode 100644
index 0000000..67d6048
--- /dev/null
+++ b/debian/tests/test-modules/assume/package.json
@@ -0,0 +1,96 @@
+{
+ "_from": "assume@~1.5.0",
+ "_id": "assume at 1.5.2",
+ "_inBundle": false,
+ "_integrity": "sha512-/IDWcpPTGjUsf4lcMi837n3xFxkEBVEfVxOvYUgdU3y6FjWSWzXiUzFAYlulr94kr79mNbiOFC5isJmaQn2C2w==",
+ "_location": "/assume",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "assume@~1.5.0",
+ "name": "assume",
+ "escapedName": "assume",
+ "rawSpec": "~1.5.0",
+ "saveSpec": null,
+ "fetchSpec": "~1.5.0"
+ },
+ "_requiredBy": [
+ "#DEV:/"
+ ],
+ "_resolved": "https://registry.npmjs.org/assume/-/assume-1.5.2.tgz",
+ "_shasum": "057c5a2f33ce7d1ccd8d783db2d5d098cacdd111",
+ "_spec": "assume@~1.5.0",
+ "_where": "/home/xavier/dev/debian/packages/node-url-parse",
+ "author": {
+ "name": "Arnout Kazemier"
+ },
+ "bugs": {
+ "url": "https://github.com/bigpipe/assume/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "deep-eql": "0.1.x",
+ "fn.name": "1.0.x",
+ "object-inspect": "1.0.x",
+ "pathval": "0.1.x",
+ "pruddy-error": "1.0.x"
+ },
+ "deprecated": false,
+ "description": "Expect-like assertions that works seamlessly in node and browsers",
+ "devDependencies": {
+ "browserify": "9.0.x",
+ "istanbul": "0.3.x",
+ "mocha": "2.2.x",
+ "mocha-phantomjs": "3.5.x",
+ "phantomjs": "1.9.x",
+ "pre-commit": "1.0.x"
+ },
+ "homepage": "https://github.com/bigpipe/assume#readme",
+ "keywords": [
+ "assert",
+ "assertion",
+ "asserts",
+ "assume",
+ "bdd",
+ "expect",
+ "expect.js",
+ "should",
+ "shouldjs",
+ "spec",
+ "tdd",
+ "test",
+ "testing",
+ "tests",
+ "unit testing",
+ "unit"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "assume",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/bigpipe/assume.git"
+ },
+ "scripts": {
+ "browserify-tests": "browserify test/test.js -o test/phantom.js --debug",
+ "coverage": "istanbul cover ./node_modules/.bin/_mocha -- --reporter spec --ui bdd test/test.js",
+ "iojs": "iojs --allow-natives-syntax --harmony ./node_modules/mocha/bin/_mocha test/test.js",
+ "node": "node --allow-natives-syntax --harmony ./node_modules/mocha/bin/_mocha test/test.js",
+ "phantom": "mocha-phantomjs test/phantom.html",
+ "prepublish": "mkdir -p dist && browserify index.js -o dist/assume.js --standalone assume",
+ "test": "npm run-script browserify-tests && npm run-script phantom",
+ "test-travis": "npm run node && istanbul cover node_modules/.bin/_mocha --report lcovonly -- --reporter spec --ui bdd test/test.js",
+ "watch": "mocha --watch --reporter spec --ui bdd test/test.js"
+ },
+ "testling": {
+ "harness": "mocha-bdd",
+ "files": "test/test.js",
+ "browsers": [
+ "ie/6..latest",
+ "chrome/latest",
+ "firefox/latest"
+ ]
+ },
+ "version": "1.5.2"
+}
diff --git a/debian/tests/test-modules/fn.name/.npmignore b/debian/tests/test-modules/fn.name/.npmignore
new file mode 100644
index 0000000..3d25d4e
--- /dev/null
+++ b/debian/tests/test-modules/fn.name/.npmignore
@@ -0,0 +1,3 @@
+.tern-port
+coverage
+node_modules
diff --git a/debian/tests/test-modules/fn.name/.travis.yml b/debian/tests/test-modules/fn.name/.travis.yml
new file mode 100644
index 0000000..b532c0c
--- /dev/null
+++ b/debian/tests/test-modules/fn.name/.travis.yml
@@ -0,0 +1,11 @@
+language: node_js
+node_js:
+ - "0.8"
+ - "0.10"
+ - "0.11"
+before_install:
+ - "npm install -g npm at 1.4.x"
+script:
+ - "npm run test-travis"
+after_script:
+ - "npm install coveralls at 2.11.x && cat coverage/lcov.info | coveralls"
diff --git a/debian/tests/test-modules/fn.name/README.md b/debian/tests/test-modules/fn.name/README.md
new file mode 100644
index 0000000..6ad12e5
--- /dev/null
+++ b/debian/tests/test-modules/fn.name/README.md
@@ -0,0 +1,43 @@
+# fn.name
+
+[![From bigpipe.io][from]](http://bigpipe.io)[![Version npm][version]](http://browsenpm.org/package/fn.name)[![Build Status][build]](https://travis-ci.org/bigpipe/fn.name)[![Dependencies][david]](https://david-dm.org/bigpipe/fn.name)[![Coverage Status][cover]](https://coveralls.io/r/bigpipe/fn.name?branch=master)
+
+[from]: https://img.shields.io/badge/from-bigpipe.io-9d8dff.svg?style=flat-square
+[version]: http://img.shields.io/npm/v/fn.name.svg?style=flat-square
+[build]: http://img.shields.io/travis/bigpipe/fn.name/master.svg?style=flat-square
+[david]: https://img.shields.io/david/bigpipe/fn.name.svg?style=flat-square
+[cover]: http://img.shields.io/coveralls/bigpipe/fn.name/master.svg?style=flat-square
+
+Extract the name of a given function. Nothing more than that.
+
+## Installation
+
+This module is compatible with Browserify and Node.js and can be installed
+using:
+
+```
+npm install --save fn.name
+```
+
+## Usage
+
+Using this module is super simple, it exposes the function directly on the
+exports so it can be required as followed:
+
+```js
+'use strict';
+
+var name = require('fn.name');
+```
+
+Now that we have the `name` function we can pass it functions:
+
+```js
+console.log(name(function foo() {})) // foo
+```
+
+And that's it folks!
+
+## License
+
+MIT
diff --git a/debian/tests/test-modules/fn.name/index.js b/debian/tests/test-modules/fn.name/index.js
new file mode 100644
index 0000000..4078bb0
--- /dev/null
+++ b/debian/tests/test-modules/fn.name/index.js
@@ -0,0 +1,42 @@
+'use strict';
+
+var toString = Object.prototype.toString;
+
+/**
+ * Extract names from functions.
+ *
+ * @param {Function} fn The function who's name we need to extract.
+ * @returns {String}
+ * @api public
+ */
+module.exports = function name(fn) {
+ if ('string' === typeof fn.displayName && fn.constructor.name) {
+ return fn.displayName;
+ } else if ('string' === typeof fn.name && fn.name) {
+ return fn.name;
+ }
+
+ //
+ // Check to see if the constructor has a name.
+ //
+ if (
+ 'object' === typeof fn
+ && fn.constructor
+ && 'string' === typeof fn.constructor.name
+ ) return fn.constructor.name;
+
+ //
+ // toString the given function and attempt to parse it out of it, or determine
+ // the class.
+ //
+ var named = fn.toString()
+ , type = toString.call(fn).slice(8, -1);
+
+ if ('Function' === type) {
+ named = named.substring(named.indexOf('(') + 1, named.indexOf(')'));
+ } else {
+ named = type;
+ }
+
+ return named || 'anonymous';
+};
diff --git a/debian/tests/test-modules/fn.name/package.json b/debian/tests/test-modules/fn.name/package.json
new file mode 100644
index 0000000..a0c5a5e
--- /dev/null
+++ b/debian/tests/test-modules/fn.name/package.json
@@ -0,0 +1,64 @@
+{
+ "_from": "fn.name at 1.0.x",
+ "_id": "fn.name at 1.0.1",
+ "_inBundle": false,
+ "_integrity": "sha1-gBWtFJwQEaEWzbieukzBHZA5rdg=",
+ "_location": "/fn.name",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "fn.name at 1.0.x",
+ "name": "fn.name",
+ "escapedName": "fn.name",
+ "rawSpec": "1.0.x",
+ "saveSpec": null,
+ "fetchSpec": "1.0.x"
+ },
+ "_requiredBy": [
+ "/assume"
+ ],
+ "_resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.0.1.tgz",
+ "_shasum": "8015ad149c1011a116cdb89eba4cc11d9039add8",
+ "_spec": "fn.name at 1.0.x",
+ "_where": "/home/xavier/dev/debian/packages/node-url-parse/node_modules/assume",
+ "author": {
+ "name": "Arnout Kazemier"
+ },
+ "bugs": {
+ "url": "https://github.com/bigpipe/fn.name/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "Extract names from functions",
+ "devDependencies": {
+ "assume": "0.0.x",
+ "istanbul": "0.3.x",
+ "mocha": "2.1.x",
+ "pre-commit": "0.0.x"
+ },
+ "homepage": "https://github.com/bigpipe/fn.name",
+ "keywords": [
+ "fn.name",
+ "function.name",
+ "name",
+ "function",
+ "extract",
+ "parse",
+ "names"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "fn.name",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/bigpipe/fn.name.git"
+ },
+ "scripts": {
+ "coverage": "istanbul cover ./node_modules/.bin/_mocha -- --reporter spec --ui bdd test.js",
+ "test": "mocha --reporter spec --ui bdd test.js",
+ "test-travis": "istanbul cover node_modules/.bin/_mocha --report lcovonly -- --reporter spec --ui bdd test.js",
+ "watch": "mocha --watch --reporter spec --ui bdd test.js"
+ },
+ "version": "1.0.1"
+}
diff --git a/debian/tests/test-modules/pruddy-error/LICENSE b/debian/tests/test-modules/pruddy-error/LICENSE
new file mode 100644
index 0000000..cb86233
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 1998, Regents of the University of California
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the University of California, Berkeley nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/debian/tests/test-modules/pruddy-error/README.md b/debian/tests/test-modules/pruddy-error/README.md
new file mode 100644
index 0000000..5273505
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/README.md
@@ -0,0 +1,31 @@
+```
+This is a clone of the `prettify-error` module which was unpublished by the
+author. All dependencies have been inlined to prevent future conflicts.
+```
+
+## pruddy-error
+
+Prettify given error objects for console outputs
+
+![](https://i.cloudup.com/Vt6PAM3yDA.png)
+
+## Install
+
+``bash
+$ npm install pruddy-error
+``
+
+## Usage
+
+```js
+var pruddy = require('pruddy-error');
+var error = new Error('lorem ipsum');
+
+console.error(pruddy(error) || error);
+```
+
+If you'd like to skip some lines from the stack:
+
+```js
+pruddy(error, 2) // Will start reading the stack from the third line.
+```
diff --git a/debian/tests/test-modules/pruddy-error/ansi-codes.json b/debian/tests/test-modules/pruddy-error/ansi-codes.json
new file mode 100644
index 0000000..9ba5377
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/ansi-codes.json
@@ -0,0 +1,47 @@
+{
+ "reset": "\u001b[0m",
+ "bold": "\u001b[1m",
+ "italic": "\u001b[3m",
+ "blink": "\u001b[5m",
+ "underline": "\u001b[4m",
+ "underlineOff": "\u001b[24m",
+ "inverse": "\u001b[7m",
+ "inverseOff": "\u001b[27m",
+ "strikethrough": "\u001b[9m",
+ "strikethroughOff": "\u001b[29m",
+ "def": "\u001b[39m",
+ "white": "\u001b[37m",
+ "black": "\u001b[30m",
+ "grey": "\u001b[90m",
+ "red": "\u001b[31m",
+ "green": "\u001b[32m",
+ "blue": "\u001b[34m",
+ "yellow": "\u001b[33m",
+ "magenta": "\u001b[35m",
+ "cyan": "\u001b[36m",
+ "defBg": "\u001b[49m",
+ "whiteBg": "\u001b[47m",
+ "blackBg": "\u001b[40m",
+ "redBg": "\u001b[41m",
+ "greenBg": "\u001b[42m",
+ "blueBg": "\u001b[44m",
+ "yellowBg": "\u001b[43m",
+ "magentaBg": "\u001b[45m",
+ "cyanBg": "\u001b[46m",
+ "brightBlack": "\u001b[90m",
+ "brightRed": "\u001b[91m",
+ "brightGreen": "\u001b[92m",
+ "brightYellow": "\u001b[93m",
+ "brightBlue": "\u001b[94m",
+ "brightMagenta": "\u001b[95m",
+ "brightCyan": "\u001b[96m",
+ "brightWhite": "\u001b[97m",
+ "brightBlackBg": "\u001b[100m",
+ "brightRedBg": "\u001b[101m",
+ "brightGreenBg": "\u001b[102m",
+ "brightYellowBg": "\u001b[103m",
+ "brightBlueBg": "\u001b[104m",
+ "brightMagentaBg": "\u001b[105m",
+ "brightCyanBg": "\u001b[106m",
+ "brightWhiteBg": "\u001b[107m"
+}
diff --git a/debian/tests/test-modules/pruddy-error/example.js b/debian/tests/test-modules/pruddy-error/example.js
new file mode 100644
index 0000000..5371c53
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/example.js
@@ -0,0 +1,4 @@
+var pruddy = require('./');
+var err = new Error('lorem ipsum');
+
+console.error(pruddy(err) || err);
diff --git a/debian/tests/test-modules/pruddy-error/failing-code.js b/debian/tests/test-modules/pruddy-error/failing-code.js
new file mode 100644
index 0000000..3d6da4e
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/failing-code.js
@@ -0,0 +1,52 @@
+var isNode = !!(typeof process != 'undefined' && process.versions && process.versions.node);
+var failingLine = require('./failing-line');
+
+var fs;
+var nodeRequire;
+
+if (isNode) {
+ nodeRequire = require;
+ fs = nodeRequire('fs');
+ nodeRequire = null;
+}
+
+module.exports = function failingCode (error, doc, shift) {
+ var ln = failingLine(error, shift);
+
+ if (!ln) return;
+
+ if (!doc && fs) {
+ try {
+ doc = fs.readFileSync(ln.filename).toString();
+ } catch (readError) {
+ return undefined;
+ }
+ }
+
+ if (!doc) return undefined;
+
+ var result = [];
+ var lines = doc.split('\n');
+
+ var i = ln.line - 3;
+ while (++i < ln.line + 1) {
+ if (i + 1 != ln.line) {
+ result.push({
+ line: ln.line - (ln.line - i -1),
+ code: lines[i]
+ });
+ continue;
+ }
+
+ result.push({
+ line: ln.line,
+ col: ln.col,
+ fn: ln.fn,
+ filename: ln.filename,
+ code: lines[i],
+ failed: true
+ });
+ }
+
+ return result;
+};
diff --git a/debian/tests/test-modules/pruddy-error/failing-line.js b/debian/tests/test-modules/pruddy-error/failing-line.js
new file mode 100644
index 0000000..56a1707
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/failing-line.js
@@ -0,0 +1,91 @@
+module.exports = detect;
+
+function detect (error, shift) {
+ if (!error || !error.stack) return;
+
+ if (/ at /.test(error.stack)) return v8(error, shift);
+
+ if (/:\d+:\d+$/.test(error.stack)) return safari(error, shift);
+
+ return firefox(error, shift);
+}
+
+function safari (error, shift) {
+ var index = 0;
+ if (shift) index += shift;
+
+ var fn, filename, line, col;
+ var lines = error.stack.split('\n');
+ var stack = lines[index] || lines[0];
+
+ var fields = stack.split(/\:(\d+)\:(\d+)$/);
+ var numbers = fields.slice(1, 3);
+ fields = fields[0].split('@');
+
+ return {
+ fn: fields[0],
+ filename: fields[1],
+ line: Number(numbers[0]),
+ col: Number(numbers[1])
+ };
+}
+
+function v8 (error, shift) {
+ if (!error || !error.stack) return;
+
+ var index = 1;
+ if (shift) index += shift;
+
+ var fn, filename, line, col;
+ var lines = error.stack.split('\n');
+ var stack = lines[index] || lines[1];
+
+ if (!stack) return;
+
+ var match = stack.match(/at ([\(\)\w\.<>\[\]\s]+) \((.+):(\d+):(\d+)/);
+
+ if (!match) {
+ match = stack.match(/at (.+):(\d+):(\d+)/);
+ if (!match) return undefined;
+
+ filename = match[1];
+ line = Number(match[2]);
+ col = Number(match[3]);
+ } else {
+ fn = match[1];
+ filename = match[2];
+ line = Number(match[3]);
+ col = Number(match[4]);
+ }
+
+ return {
+ fn: fn,
+ filename: filename,
+ line: line,
+ col: col
+ };
+}
+
+function firefox (error, shift) {
+ var index = 0;
+ if (shift) index += shift;
+
+ var fn, filename, line, col;
+ var lines = error.stack.split('\n');
+ var stack = lines[index] || lines[0];
+
+ var fields = stack.split(/\:(\d+)$/);
+ var numbers = fields.slice(1, 2);
+ fields = fields[0].split('@');
+
+ if (index == 0) {
+ col = error.columnNumber;
+ }
+
+ return {
+ fn: fields[0],
+ filename: fields[1],
+ line: Number(numbers[0]),
+ col: col
+ };
+}
diff --git a/debian/tests/test-modules/pruddy-error/format-text.js b/debian/tests/test-modules/pruddy-error/format-text.js
new file mode 100644
index 0000000..2116910
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/format-text.js
@@ -0,0 +1,31 @@
+module.exports = format;
+
+function format(text) {
+ var context;
+
+ if (typeof arguments[1] == 'object' && arguments[1]) {
+ context = arguments[1];
+ } else {
+ context = Array.prototype.slice.call(arguments, 1);
+ }
+
+ return String(text).replace(/\{?\{([^{}]+)}}?/g, replace(context));
+};
+
+function replace (context, nil){
+ return function (tag, name) {
+ if (tag.substring(0, 2) == '{{' && tag.substring(tag.length - 2) == '}}') {
+ return '{' + name + '}';
+ }
+
+ if (!context.hasOwnProperty(name)) {
+ return tag;
+ }
+
+ if (typeof context[name] == 'function') {
+ return context[name]();
+ }
+
+ return context[name];
+ }
+}
diff --git a/debian/tests/test-modules/pruddy-error/index.js b/debian/tests/test-modules/pruddy-error/index.js
new file mode 100644
index 0000000..5a13d18
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/index.js
@@ -0,0 +1,61 @@
+var failingCode = require('./failing-code');
+var format = require('./format-text');
+var leftpad = require('./left-pad');
+var style = require('./style-format');
+
+var template = style('{bold}{red}{title} {grey}{filename}{reset}\n'
+ + ' {red}{v}\n'
+ + ' {grey}{previousLineNo}. {previousLine}\n'
+ + ' {reset}{failingLineNo}. {failingLine}\n'
+ + ' {grey}{nextLineNo}. {nextLine}\n'
+ + ' {red}{^}{reset}\n'
+ + ' {stack}\n'
+ + '{reset}');
+
+
+module.exports = function prettifyError (error, shift, code) {
+ if (!error || !error.stack) return;
+
+ code || (code = failingCode(error, undefined, shift));
+
+ if (!code) return;
+
+ var previousLineNo = String(code[0].line);
+ var failingLineNo = String(code[1].line);
+ var nextLineNo = String(code[2].line);
+ var linumlen = Math.max(previousLineNo.length,
+ failingLineNo.length,
+ nextLineNo.length);
+
+ return format(template, {
+ title: error.message,
+ filename: code[1].filename,
+ previousLine: code[0].code,
+ previousLineNo: leftpad(previousLineNo, linumlen),
+ previousColNo: code[0].col,
+ failingLine: code[1].code,
+ failingLineNo: leftpad(failingLineNo, linumlen),
+ failingColNo: code[1].col,
+ nextLine: code[2].code,
+ nextLineNo: leftpad(nextLineNo, linumlen),
+ nextColNo: code[2].col,
+ stack: tabStack(error.stack),
+ '^': showColumn(code, linumlen - failingLineNo.length, '^'),
+ 'v': showColumn(code, linumlen - failingLineNo.length, 'v')
+ });
+}
+
+function showColumn (code, tabn, ch) {
+ var result = '';
+ var i = String(code[1].line).length + code[1].col + 1 + tabn;
+
+ while (i--) {
+ result += ' ';
+ }
+
+ return result + ch;
+}
+
+function tabStack (stack) {
+ return stack.replace(/\n/g, '\n ');
+}
diff --git a/debian/tests/test-modules/pruddy-error/left-pad.js b/debian/tests/test-modules/pruddy-error/left-pad.js
new file mode 100644
index 0000000..3905bc5
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/left-pad.js
@@ -0,0 +1,17 @@
+module.exports = leftpad;
+
+function leftpad (str, len, ch) {
+ str = String(str);
+
+ var i = -1;
+
+ if (!ch && ch !== 0) ch = ' ';
+
+ len = len - str.length;
+
+ while (++i < len) {
+ str = ch + str;
+ }
+
+ return str;
+}
diff --git a/debian/tests/test-modules/pruddy-error/package.json b/debian/tests/test-modules/pruddy-error/package.json
new file mode 100644
index 0000000..4a85113
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/package.json
@@ -0,0 +1,51 @@
+{
+ "_from": "pruddy-error at 1.0.x",
+ "_id": "pruddy-error at 1.0.2",
+ "_inBundle": false,
+ "_integrity": "sha1-s37Bo4v5EHwM3FvGY9PU6ANUroA=",
+ "_location": "/pruddy-error",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "pruddy-error at 1.0.x",
+ "name": "pruddy-error",
+ "escapedName": "pruddy-error",
+ "rawSpec": "1.0.x",
+ "saveSpec": null,
+ "fetchSpec": "1.0.x"
+ },
+ "_requiredBy": [
+ "/assume"
+ ],
+ "_resolved": "https://registry.npmjs.org/pruddy-error/-/pruddy-error-1.0.2.tgz",
+ "_shasum": "b37ec1a38bf9107c0cdc5bc663d3d4e80354ae80",
+ "_spec": "pruddy-error at 1.0.x",
+ "_where": "/home/xavier/dev/debian/packages/node-url-parse/node_modules/assume",
+ "author": {
+ "name": "azer"
+ },
+ "bugs": {
+ "url": "https://github.com/bigpipe/pruddy-error/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "Prettify given error object",
+ "homepage": "https://github.com/bigpipe/pruddy-error#readme",
+ "keywords": [
+ "error",
+ "pretty",
+ "prettify"
+ ],
+ "license": "BSD",
+ "main": "index.js",
+ "name": "pruddy-error",
+ "repository": {
+ "url": "git+ssh://git@github.com/bigpipe/pruddy-error.git",
+ "type": "git"
+ },
+ "scripts": {
+ "test": "node --use_strict test.js"
+ },
+ "version": "1.0.2"
+}
diff --git a/debian/tests/test-modules/pruddy-error/style-format.js b/debian/tests/test-modules/pruddy-error/style-format.js
new file mode 100644
index 0000000..acd810e
--- /dev/null
+++ b/debian/tests/test-modules/pruddy-error/style-format.js
@@ -0,0 +1,8 @@
+var ansi = require('./ansi-codes.json');
+var format = require('./format-text');
+
+module.exports = styleFormat;
+
+function styleFormat (text) {
+ return format(text, ansi);
+}
diff --git a/debian/upstream/metadata b/debian/upstream/metadata
new file mode 100644
index 0000000..b2469bc
--- /dev/null
+++ b/debian/upstream/metadata
@@ -0,0 +1,7 @@
+---
+Archive: GitHub
+Bug-Database: https://github.com/unshiftio/url-parse/issues
+Contact: https://github.com/unshiftio/url-parse/issues
+Name: url-parse
+Repository: https://github.com/unshiftio/url-parse.git
+Repository-Browse: https://github.com/unshiftio/url-parse
More information about the Pkg-javascript-devel
mailing list