mirror of
https://github.com/zhigang1992/react-native-code-push.git
synced 2026-06-10 07:10:36 +08:00
remove checked in node_modules code whoops
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -151,6 +151,6 @@ captures/
|
||||
|
||||
# DELETE THIS AFTER PLUGIN TESTING FRAMEWORK IS ON NPM
|
||||
# ALSO SEE THE node_modules/* above
|
||||
node_modules/code-push-plugin-testing-framework/node_modules/
|
||||
!node_modules/
|
||||
!node_modules/code-push-plugin-testing-framework/
|
||||
!node_modules/code-push-plugin-testing-framework/*
|
||||
BIN
node_modules/.DS_Store
generated
vendored
Normal file
BIN
node_modules/.DS_Store
generated
vendored
Normal file
Binary file not shown.
BIN
node_modules/code-push-plugin-testing-framework/.DS_Store
generated
vendored
Normal file
BIN
node_modules/code-push-plugin-testing-framework/.DS_Store
generated
vendored
Normal file
Binary file not shown.
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/_mocha
generated
vendored
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/_mocha
generated
vendored
@@ -1 +0,0 @@
|
||||
../mocha/bin/_mocha
|
||||
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/mocha
generated
vendored
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/mocha
generated
vendored
@@ -1 +0,0 @@
|
||||
../mocha/bin/mocha
|
||||
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/replace
generated
vendored
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/replace
generated
vendored
@@ -1 +0,0 @@
|
||||
../replace/bin/replace.js
|
||||
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/search
generated
vendored
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/search
generated
vendored
@@ -1 +0,0 @@
|
||||
../replace/bin/search.js
|
||||
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/uuid
generated
vendored
1
node_modules/code-push-plugin-testing-framework/node_modules/.bin/uuid
generated
vendored
@@ -1 +0,0 @@
|
||||
../node-uuid/bin/uuid
|
||||
20
node_modules/code-push-plugin-testing-framework/node_modules/base-64/LICENSE-MIT.txt
generated
vendored
20
node_modules/code-push-plugin-testing-framework/node_modules/base-64/LICENSE-MIT.txt
generated
vendored
@@ -1,20 +0,0 @@
|
||||
Copyright Mathias Bynens <http://mathiasbynens.be/>
|
||||
|
||||
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.
|
||||
124
node_modules/code-push-plugin-testing-framework/node_modules/base-64/README.md
generated
vendored
124
node_modules/code-push-plugin-testing-framework/node_modules/base-64/README.md
generated
vendored
@@ -1,124 +0,0 @@
|
||||
# base64 [](https://travis-ci.org/mathiasbynens/base64) [](https://gemnasium.com/mathiasbynens/base64)
|
||||
|
||||
_base64_ is a robust base64 encoder/decoder that is fully compatible with [`atob()` and `btoa()`](http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#atob), written in JavaScript. The base64-encoding and -decoding algorithms it uses are fully [RFC 4648](http://tools.ietf.org/html/rfc4648#section-4) compliant.
|
||||
|
||||
## Installation
|
||||
|
||||
Via [npm](http://npmjs.org/):
|
||||
|
||||
```bash
|
||||
npm install base-64
|
||||
```
|
||||
|
||||
Via [Bower](http://bower.io/):
|
||||
|
||||
```bash
|
||||
bower install base-64
|
||||
```
|
||||
|
||||
Via [Component](https://github.com/component/component):
|
||||
|
||||
```bash
|
||||
component install mathiasbynens/base64
|
||||
```
|
||||
|
||||
In a browser:
|
||||
|
||||
```html
|
||||
<script src="base64.js"></script>
|
||||
```
|
||||
|
||||
In [Narwhal](http://narwhaljs.org/), [Node.js](http://nodejs.org/), and [RingoJS](http://ringojs.org/):
|
||||
|
||||
```js
|
||||
var base64 = require('base-64');
|
||||
```
|
||||
|
||||
In [Rhino](http://www.mozilla.org/rhino/):
|
||||
|
||||
```js
|
||||
load('base64.js');
|
||||
```
|
||||
|
||||
Using an AMD loader like [RequireJS](http://requirejs.org/):
|
||||
|
||||
```js
|
||||
require(
|
||||
{
|
||||
'paths': {
|
||||
'base64': 'path/to/base64'
|
||||
}
|
||||
},
|
||||
['base64'],
|
||||
function(base64) {
|
||||
console.log(base64);
|
||||
}
|
||||
);
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### `base64.version`
|
||||
|
||||
A string representing the semantic version number.
|
||||
|
||||
### `base64.encode(input)`
|
||||
|
||||
This function takes a byte string (the `input` parameter) and encodes it according to base64. The input data must be in the form of a string containing only characters in the range from U+0000 to U+00FF, each representing a binary byte with values `0x00` to `0xFF`. The `base64.encode()` function is designed to be fully compatible with [`btoa()` as described in the HTML Standard](http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#dom-windowbase64-btoa).
|
||||
|
||||
```js
|
||||
var encodedData = base64.encode(input);
|
||||
```
|
||||
|
||||
To base64-encode any Unicode string, [encode it as UTF-8 first](https://github.com/mathiasbynens/utf8.js#utf8encodestring):
|
||||
|
||||
```js
|
||||
var base64 = require('base-64');
|
||||
var utf8 = require('utf8');
|
||||
|
||||
var text = 'foo © bar 𝌆 baz';
|
||||
var bytes = utf8.encode(text);
|
||||
var encoded = base64.encode(bytes);
|
||||
console.log(encoded);
|
||||
// → 'Zm9vIMKpIGJhciDwnYyGIGJheg=='
|
||||
```
|
||||
|
||||
### `base64.decode(input)`
|
||||
|
||||
This function takes a base64-encoded string (the `input` parameter) and decodes it. The return value is in the form of a string containing only characters in the range from U+0000 to U+00FF, each representing a binary byte with values `0x00` to `0xFF`. The `base64.decode()` function is designed to be fully compatible with [`atob()` as described in the HTML Standard](http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#dom-windowbase64-atob).
|
||||
|
||||
```js
|
||||
var decodedData = base64.decode(encodedData);
|
||||
```
|
||||
|
||||
To base64-decode UTF-8-encoded data back into a Unicode string, [UTF-8-decode it](https://github.com/mathiasbynens/utf8.js#utf8decodebytestring) after base64-decoding it:
|
||||
|
||||
```js
|
||||
var encoded = 'Zm9vIMKpIGJhciDwnYyGIGJheg==';
|
||||
var bytes = base64.decode(encoded);
|
||||
var text = utf8.decode(bytes);
|
||||
console.log(text);
|
||||
// → 'foo © bar 𝌆 baz'
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
_base64_ is designed to work in at least Node.js v0.10.0, Narwhal 0.3.2, RingoJS 0.8-0.9, PhantomJS 1.9.0, Rhino 1.7RC4, as well as old and modern versions of Chrome, Firefox, Safari, Opera, and Internet Explorer.
|
||||
|
||||
## Unit tests & code coverage
|
||||
|
||||
After cloning this repository, run `npm install` to install the dependencies needed for development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`.
|
||||
|
||||
Once that’s done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, and web browsers as well, use `grunt test`.
|
||||
|
||||
To generate the code coverage report, use `grunt cover`.
|
||||
|
||||
## Author
|
||||
|
||||
| [](https://twitter.com/mathias "Follow @mathias on Twitter") |
|
||||
|---|
|
||||
| [Mathias Bynens](http://mathiasbynens.be/) |
|
||||
|
||||
## License
|
||||
|
||||
_base64_ is available under the [MIT](http://mths.be/mit) license.
|
||||
165
node_modules/code-push-plugin-testing-framework/node_modules/base-64/base64.js
generated
vendored
165
node_modules/code-push-plugin-testing-framework/node_modules/base-64/base64.js
generated
vendored
@@ -1,165 +0,0 @@
|
||||
/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */
|
||||
;(function(root) {
|
||||
|
||||
// Detect free variables `exports`.
|
||||
var freeExports = typeof exports == 'object' && exports;
|
||||
|
||||
// Detect free variable `module`.
|
||||
var freeModule = typeof module == 'object' && module &&
|
||||
module.exports == freeExports && module;
|
||||
|
||||
// Detect free variable `global`, from Node.js or Browserified code, and use
|
||||
// it as `root`.
|
||||
var freeGlobal = typeof global == 'object' && global;
|
||||
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
|
||||
root = freeGlobal;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
var InvalidCharacterError = function(message) {
|
||||
this.message = message;
|
||||
};
|
||||
InvalidCharacterError.prototype = new Error;
|
||||
InvalidCharacterError.prototype.name = 'InvalidCharacterError';
|
||||
|
||||
var error = function(message) {
|
||||
// Note: the error messages used throughout this file match those used by
|
||||
// the native `atob`/`btoa` implementation in Chromium.
|
||||
throw new InvalidCharacterError(message);
|
||||
};
|
||||
|
||||
var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||
// http://whatwg.org/html/common-microsyntaxes.html#space-character
|
||||
var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g;
|
||||
|
||||
// `decode` is designed to be fully compatible with `atob` as described in the
|
||||
// HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob
|
||||
// The optimized base64-decoding algorithm used is based on @atk’s excellent
|
||||
// implementation. https://gist.github.com/atk/1020396
|
||||
var decode = function(input) {
|
||||
input = String(input)
|
||||
.replace(REGEX_SPACE_CHARACTERS, '');
|
||||
var length = input.length;
|
||||
if (length % 4 == 0) {
|
||||
input = input.replace(/==?$/, '');
|
||||
length = input.length;
|
||||
}
|
||||
if (
|
||||
length % 4 == 1 ||
|
||||
// http://whatwg.org/C#alphanumeric-ascii-characters
|
||||
/[^+a-zA-Z0-9/]/.test(input)
|
||||
) {
|
||||
error(
|
||||
'Invalid character: the string to be decoded is not correctly encoded.'
|
||||
);
|
||||
}
|
||||
var bitCounter = 0;
|
||||
var bitStorage;
|
||||
var buffer;
|
||||
var output = '';
|
||||
var position = -1;
|
||||
while (++position < length) {
|
||||
buffer = TABLE.indexOf(input.charAt(position));
|
||||
bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;
|
||||
// Unless this is the first of a group of 4 characters…
|
||||
if (bitCounter++ % 4) {
|
||||
// …convert the first 8 bits to a single ASCII character.
|
||||
output += String.fromCharCode(
|
||||
0xFF & bitStorage >> (-2 * bitCounter & 6)
|
||||
);
|
||||
}
|
||||
}
|
||||
return output;
|
||||
};
|
||||
|
||||
// `encode` is designed to be fully compatible with `btoa` as described in the
|
||||
// HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa
|
||||
var encode = function(input) {
|
||||
input = String(input);
|
||||
if (/[^\0-\xFF]/.test(input)) {
|
||||
// Note: no need to special-case astral symbols here, as surrogates are
|
||||
// matched, and the input is supposed to only contain ASCII anyway.
|
||||
error(
|
||||
'The string to be encoded contains characters outside of the ' +
|
||||
'Latin1 range.'
|
||||
);
|
||||
}
|
||||
var padding = input.length % 3;
|
||||
var output = '';
|
||||
var position = -1;
|
||||
var a;
|
||||
var b;
|
||||
var c;
|
||||
var d;
|
||||
var buffer;
|
||||
// Make sure any padding is handled outside of the loop.
|
||||
var length = input.length - padding;
|
||||
|
||||
while (++position < length) {
|
||||
// Read three bytes, i.e. 24 bits.
|
||||
a = input.charCodeAt(position) << 16;
|
||||
b = input.charCodeAt(++position) << 8;
|
||||
c = input.charCodeAt(++position);
|
||||
buffer = a + b + c;
|
||||
// Turn the 24 bits into four chunks of 6 bits each, and append the
|
||||
// matching character for each of them to the output.
|
||||
output += (
|
||||
TABLE.charAt(buffer >> 18 & 0x3F) +
|
||||
TABLE.charAt(buffer >> 12 & 0x3F) +
|
||||
TABLE.charAt(buffer >> 6 & 0x3F) +
|
||||
TABLE.charAt(buffer & 0x3F)
|
||||
);
|
||||
}
|
||||
|
||||
if (padding == 2) {
|
||||
a = input.charCodeAt(position) << 8;
|
||||
b = input.charCodeAt(++position);
|
||||
buffer = a + b;
|
||||
output += (
|
||||
TABLE.charAt(buffer >> 10) +
|
||||
TABLE.charAt((buffer >> 4) & 0x3F) +
|
||||
TABLE.charAt((buffer << 2) & 0x3F) +
|
||||
'='
|
||||
);
|
||||
} else if (padding == 1) {
|
||||
buffer = input.charCodeAt(position);
|
||||
output += (
|
||||
TABLE.charAt(buffer >> 2) +
|
||||
TABLE.charAt((buffer << 4) & 0x3F) +
|
||||
'=='
|
||||
);
|
||||
}
|
||||
|
||||
return output;
|
||||
};
|
||||
|
||||
var base64 = {
|
||||
'encode': encode,
|
||||
'decode': decode,
|
||||
'version': '0.1.0'
|
||||
};
|
||||
|
||||
// Some AMD build optimizers, like r.js, check for specific condition patterns
|
||||
// like the following:
|
||||
if (
|
||||
typeof define == 'function' &&
|
||||
typeof define.amd == 'object' &&
|
||||
define.amd
|
||||
) {
|
||||
define(function() {
|
||||
return base64;
|
||||
});
|
||||
} else if (freeExports && !freeExports.nodeType) {
|
||||
if (freeModule) { // in Node.js or RingoJS v0.8.0+
|
||||
freeModule.exports = base64;
|
||||
} else { // in Narwhal or RingoJS v0.7.0-
|
||||
for (var key in base64) {
|
||||
base64.hasOwnProperty(key) && (freeExports[key] = base64[key]);
|
||||
}
|
||||
}
|
||||
} else { // in Rhino or a web browser
|
||||
root.base64 = base64;
|
||||
}
|
||||
|
||||
}(this));
|
||||
71
node_modules/code-push-plugin-testing-framework/node_modules/base-64/package.json
generated
vendored
71
node_modules/code-push-plugin-testing-framework/node_modules/base-64/package.json
generated
vendored
@@ -1,71 +0,0 @@
|
||||
{
|
||||
"name": "base-64",
|
||||
"version": "0.1.0",
|
||||
"description": "A robust base64 encoder/decoder that is fully compatible with `atob()` and `btoa()`, written in JavaScript.",
|
||||
"homepage": "http://mths.be/base64",
|
||||
"main": "base64.js",
|
||||
"keywords": [
|
||||
"codec",
|
||||
"decoder",
|
||||
"encoder",
|
||||
"base64",
|
||||
"atob",
|
||||
"btoa"
|
||||
],
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "http://mths.be/mit"
|
||||
}
|
||||
],
|
||||
"author": {
|
||||
"name": "Mathias Bynens",
|
||||
"url": "http://mathiasbynens.be/"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/mathiasbynens/base64.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/mathiasbynens/base64/issues"
|
||||
},
|
||||
"files": [
|
||||
"LICENSE-MIT.txt",
|
||||
"base64.js"
|
||||
],
|
||||
"directories": {
|
||||
"test": "tests"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "node tests/tests.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"grunt": "~0.4.4",
|
||||
"grunt-shell": "~0.7.0",
|
||||
"grunt-template": "~0.2.3",
|
||||
"istanbul": "~0.2.7",
|
||||
"qunit-extras": "~1.1.0",
|
||||
"qunitjs": "~1.11.0",
|
||||
"requirejs": "~2.1.11"
|
||||
},
|
||||
"_id": "base-64@0.1.0",
|
||||
"_shasum": "780a99c84e7d600260361511c4877613bf24f6bb",
|
||||
"_from": "base-64@>=0.1.0 <0.2.0",
|
||||
"_npmVersion": "1.4.10",
|
||||
"_npmUser": {
|
||||
"name": "mathias",
|
||||
"email": "mathias@qiwi.be"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "mathias",
|
||||
"email": "mathias@qiwi.be"
|
||||
}
|
||||
],
|
||||
"dist": {
|
||||
"shasum": "780a99c84e7d600260361511c4877613bf24f6bb",
|
||||
"tarball": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz"
|
||||
},
|
||||
"_resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
node_modules
|
||||
test/mocha.xml
|
||||
test/subdir/
|
||||
node-debug*
|
||||
.c9/
|
||||
@@ -1,13 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- '0.12'
|
||||
- '0.10'
|
||||
deploy:
|
||||
provider: npm
|
||||
email: michael.lee.allen@gmail.com
|
||||
api_key:
|
||||
secure: YWl4mwTdJp7KI+SsFKR1JD2mBfwzVyCixuB3yOMgc8ELKF9yY766kFU5RaQzQlC4tETuLraNSNRhLMWBfAVERklA5taUgF7swioISO9YjdNumfAlwtbeKKMljV+vWPJ94r5We15Y6WysBaE0YuqG08Hy4KZ58FS+40eKsAaCnQw=
|
||||
on:
|
||||
branch: master
|
||||
tags: true
|
||||
repo: michaelleeallen/mocha-junit-reporter
|
||||
@@ -1,14 +0,0 @@
|
||||
MIT License
|
||||
Copyright (c) 2015 Michael Allen
|
||||
|
||||
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.
|
||||
@@ -1,91 +0,0 @@
|
||||
#JUnit Reporter for Mocha
|
||||
[](https://travis-ci.org/michaelleeallen/mocha-junit-reporter)
|
||||
[](https://www.npmjs.com/package/mocha-junit-reporter)
|
||||
|
||||
Produces JUnit-style XML test results.
|
||||
|
||||
## Installation
|
||||
|
||||
```shell
|
||||
$ npm install mocha-junit-reporter --save-dev
|
||||
```
|
||||
|
||||
or as a global module
|
||||
```shell
|
||||
$ npm install -g mocha-junit-reporter
|
||||
```
|
||||
|
||||
## Usage
|
||||
Run mocha with `mocha-junit-reporter`:
|
||||
|
||||
```shell
|
||||
$ mocha test --reporter mocha-junit-reporter
|
||||
```
|
||||
This will output a results file at `./test-results.xml`.
|
||||
You may optionally declare an alternate location for results XML file by setting
|
||||
the environment variable `MOCHA_FILE` or specifying `mochaFile` in `reporterOptions`:
|
||||
|
||||
```shell
|
||||
$ MOCHA_FILE=./path_to_your/file.xml mocha test --reporter mocha-junit-reporter
|
||||
```
|
||||
or
|
||||
```shell
|
||||
$ mocha test --reporter mocha-junit-reporter --reporter-options mochaFile=./path_to_your/file.xml
|
||||
```
|
||||
or
|
||||
```javascript
|
||||
var mocha = new Mocha({
|
||||
reporter: 'mocha-junit-reporter',
|
||||
reporterOptions: {
|
||||
mochaFile: './path_to_your/file.xml'
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### Append properties to testsuite
|
||||
|
||||
You can also properties to the report under `testsuite`. This is useful if you want your CI environment to add extra build props to the report for analytics purposes
|
||||
|
||||
```
|
||||
<testsuites>
|
||||
<testsuite>
|
||||
<properties>
|
||||
<property name="BUILD_ID" value="4291"/>
|
||||
</properties>
|
||||
<testcase/>
|
||||
<testcase/>
|
||||
<testcase/>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
```
|
||||
|
||||
To do so pass them in via env variable:
|
||||
```shell
|
||||
PROPERTIES=BUILD_ID:4291 mocha test --reporter mocha-junit-reporter
|
||||
```
|
||||
or
|
||||
```javascript
|
||||
var mocha = new Mocha({
|
||||
reporter: 'mocha-junit-reporter',
|
||||
reporterOptions: {
|
||||
properties: {
|
||||
BUILD_ID: 4291
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### Results Report
|
||||
|
||||
Results XML filename can contain `[hash]`, e.g. `./path_to_your/test-results.[hash].xml`. `[hash]` is replaced by MD5 hash of test results XML. This enables support of parallel execution of multiple `mocha-junit-reporter`'s writing test results in separate files.
|
||||
|
||||
In order to display full suite title (including parents) just specify `useFullSuiteTitle` option
|
||||
```javascript
|
||||
var mocha = new Mocha({
|
||||
reporter: 'mocha-junit-reporter',
|
||||
reporterOptions: {
|
||||
useFullSuiteTitle: true,
|
||||
suiteTitleSeparedBy: '.' // suites separator, default is space (' ')
|
||||
}
|
||||
});
|
||||
```
|
||||
292
node_modules/code-push-plugin-testing-framework/node_modules/mocha-junit-reporter/index.js
generated
vendored
292
node_modules/code-push-plugin-testing-framework/node_modules/mocha-junit-reporter/index.js
generated
vendored
@@ -1,292 +0,0 @@
|
||||
'use-strict';
|
||||
|
||||
var xml = require('xml');
|
||||
var Base = require('mocha').reporters.Base;
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var debug = require('debug')('mocha-junit-reporter');
|
||||
var mkdirp = require('mkdirp');
|
||||
var md5 = require('md5');
|
||||
|
||||
module.exports = MochaJUnitReporter;
|
||||
|
||||
// A subset of invalid characters as defined in http://www.w3.org/TR/xml/#charsets that can occur in e.g. stacktraces
|
||||
var INVALID_CHARACTERS = ['\u001b'];
|
||||
|
||||
function configureDefaults(options) {
|
||||
debug(options);
|
||||
options = options || {};
|
||||
options = options.reporterOptions || {};
|
||||
options.mochaFile = options.mochaFile || process.env.MOCHA_FILE || 'test-results.xml';
|
||||
options.properties = options.properties || parsePropertiesFromEnv(process.env.PROPERTIES) || null;
|
||||
options.toConsole = !!options.toConsole;
|
||||
options.suiteTitleSeparedBy = options.suiteTitleSeparedBy || ' ';
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
function defaultSuiteTitle(suite) {
|
||||
return suite.title;
|
||||
}
|
||||
|
||||
function fullSuiteTitle(suite, options) {
|
||||
var parent = suite.parent;
|
||||
var title = [ suite.title ];
|
||||
|
||||
while (parent) {
|
||||
title.unshift(parent.title);
|
||||
parent = parent.parent;
|
||||
}
|
||||
|
||||
return title.join(options.suiteTitleSeparedBy);
|
||||
}
|
||||
|
||||
function isInvalidSuite(suite) {
|
||||
return suite.title === '' || suite.tests.length === 0 && suite.suites.length === 0;
|
||||
}
|
||||
|
||||
function parsePropertiesFromEnv(envValue) {
|
||||
var properties = null;
|
||||
|
||||
if (process.env.PROPERTIES) {
|
||||
properties = {}
|
||||
var propertiesArray = process.env.PROPERTIES.split(',');
|
||||
for (var i = 0; i < propertiesArray.length; i++) {
|
||||
var propertyArgs = propertiesArray[i].split(':');
|
||||
properties[propertyArgs[0]] = propertyArgs[1];
|
||||
}
|
||||
}
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
function generateProperties(options) {
|
||||
var properties = [];
|
||||
for (var propertyName in options.properties) {
|
||||
if (options.properties.hasOwnProperty(propertyName)) {
|
||||
properties.push({
|
||||
property: {
|
||||
_attr: {
|
||||
name: propertyName,
|
||||
value: options.properties[propertyName]
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
/**
|
||||
* JUnit reporter for mocha.js.
|
||||
* @module mocha-junit-reporter
|
||||
* @param {EventEmitter} runner - the test runner
|
||||
* @param {Object} options - mocha options
|
||||
*/
|
||||
function MochaJUnitReporter(runner, options) {
|
||||
this._options = configureDefaults(options);
|
||||
this._runner = runner;
|
||||
this._generateSuiteTitle = this._options.useFullSuiteTitle ? fullSuiteTitle : defaultSuiteTitle;
|
||||
|
||||
var testsuites = [];
|
||||
|
||||
function lastSuite() {
|
||||
return testsuites[testsuites.length - 1].testsuite;
|
||||
}
|
||||
|
||||
// get functionality from the Base reporter
|
||||
Base.call(this, runner);
|
||||
|
||||
// remove old results
|
||||
this._runner.on('start', function() {
|
||||
if (fs.existsSync(this._options.mochaFile)) {
|
||||
debug('removing report file', this._options.mochaFile);
|
||||
fs.unlinkSync(this._options.mochaFile);
|
||||
}
|
||||
}.bind(this));
|
||||
|
||||
this._runner.on('suite', function(suite) {
|
||||
if (suite.root) {
|
||||
suite.title = 'Root Suite';
|
||||
}
|
||||
|
||||
if (!isInvalidSuite(suite)) {
|
||||
testsuites.push(this.getTestsuiteData(suite));
|
||||
}
|
||||
}.bind(this));
|
||||
|
||||
this._runner.on('pass', function(test) {
|
||||
lastSuite().push(this.getTestcaseData(test));
|
||||
}.bind(this));
|
||||
|
||||
this._runner.on('fail', function(test, err) {
|
||||
lastSuite().push(this.getTestcaseData(test, err));
|
||||
}.bind(this));
|
||||
|
||||
if (this._options.includePending) {
|
||||
this._runner.on('pending', function(test) {
|
||||
var testcase = this.getTestcaseData(test);
|
||||
|
||||
testcase.testcase.push({ skipped: null });
|
||||
lastSuite().push(testcase);
|
||||
}.bind(this));
|
||||
}
|
||||
|
||||
this._runner.on('end', function(){
|
||||
this.flush(testsuites);
|
||||
}.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces an xml node for a test suite
|
||||
* @param {Object} suite - a test suite
|
||||
* @return {Object} - an object representing the xml node
|
||||
*/
|
||||
MochaJUnitReporter.prototype.getTestsuiteData = function(suite) {
|
||||
var testSuite = {
|
||||
testsuite: [
|
||||
{
|
||||
_attr: {
|
||||
name: this._generateSuiteTitle(suite, this._options),
|
||||
timestamp: new Date().toISOString().slice(0,-5),
|
||||
tests: suite.tests.length
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
var properties = generateProperties(this._options);
|
||||
if (properties.length) {
|
||||
testSuite.testsuite.push({
|
||||
properties: properties
|
||||
});
|
||||
}
|
||||
|
||||
return testSuite;
|
||||
};
|
||||
|
||||
/**
|
||||
* Produces an xml config for a given test case.
|
||||
* @param {object} test - test case
|
||||
* @param {object} err - if test failed, the failure object
|
||||
* @returns {object}
|
||||
*/
|
||||
MochaJUnitReporter.prototype.getTestcaseData = function(test, err) {
|
||||
var config = {
|
||||
testcase: [{
|
||||
_attr: {
|
||||
name: test.fullTitle(),
|
||||
time: (typeof test.duration === 'undefined') ? 0 : test.duration / 1000,
|
||||
classname: test.title
|
||||
}
|
||||
}]
|
||||
};
|
||||
if (err) {
|
||||
var failureElement = {
|
||||
_cdata: this.removeInvalidCharacters(err.stack)
|
||||
};
|
||||
|
||||
config.testcase.push({failure: failureElement});
|
||||
}
|
||||
return config;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} input
|
||||
* @returns {string} without invalid characters
|
||||
*/
|
||||
MochaJUnitReporter.prototype.removeInvalidCharacters = function(input){
|
||||
return INVALID_CHARACTERS.reduce(function (text, invalidCharacter) {
|
||||
return text.replace(new RegExp(invalidCharacter, 'g'), '');
|
||||
}, input);
|
||||
};
|
||||
|
||||
/**
|
||||
* Writes xml to disk and ouputs content if "toConsole" is set to true.
|
||||
* @param {Array.<Object>} testsuites - a list of xml configs
|
||||
*/
|
||||
MochaJUnitReporter.prototype.flush = function(testsuites){
|
||||
var xml = this.getXml(testsuites);
|
||||
|
||||
this.writeXmlToDisk(xml, this._options.mochaFile);
|
||||
|
||||
if (this._options.toConsole === true) {
|
||||
console.log(xml);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Produces an XML string from the given test data.
|
||||
* @param {Array.<Object>} testsuites - a list of xml configs
|
||||
* @returns {string}
|
||||
*/
|
||||
MochaJUnitReporter.prototype.getXml = function(testsuites) {
|
||||
var totalSuitesTime = 0;
|
||||
var totalTests = 0;
|
||||
var stats = this._runner.stats;
|
||||
var hasProperties = !!this._options.properties;
|
||||
|
||||
testsuites.forEach(function(suite) {
|
||||
var _suiteAttr = suite.testsuite[0]._attr;
|
||||
// properties are added before test cases so we want to make sure that we are grabbing test cases
|
||||
// at the correct index
|
||||
var _casesIndex = hasProperties ? 2 : 1;
|
||||
var _cases = suite.testsuite.slice(_casesIndex);
|
||||
|
||||
_suiteAttr.failures = 0;
|
||||
_suiteAttr.time = 0;
|
||||
_suiteAttr.skipped = 0;
|
||||
|
||||
_cases.forEach(function(testcase) {
|
||||
var lastNode = testcase.testcase[testcase.testcase.length - 1];
|
||||
|
||||
_suiteAttr.skipped += Number('skipped' in lastNode);
|
||||
_suiteAttr.failures += Number('failure' in lastNode);
|
||||
_suiteAttr.time += testcase.testcase[0]._attr.time;
|
||||
});
|
||||
|
||||
if (!_suiteAttr.skipped) {
|
||||
delete _suiteAttr.skipped;
|
||||
}
|
||||
|
||||
totalSuitesTime += _suiteAttr.time;
|
||||
totalTests += _suiteAttr.tests;
|
||||
});
|
||||
|
||||
var rootSuite = {
|
||||
_attr: {
|
||||
name: 'Mocha Tests',
|
||||
time: totalSuitesTime,
|
||||
tests: totalTests,
|
||||
failures: stats.failures
|
||||
}
|
||||
};
|
||||
|
||||
if (stats.pending) {
|
||||
rootSuite._attr.skipped = stats.pending;
|
||||
}
|
||||
|
||||
return xml({
|
||||
testsuites: [ rootSuite ].concat(testsuites)
|
||||
}, { declaration: true, indent: ' ' });
|
||||
};
|
||||
|
||||
/**
|
||||
* Writes a JUnit test report XML document.
|
||||
* @param {string} xml - xml string
|
||||
* @param {string} filePath - path to output file
|
||||
*/
|
||||
MochaJUnitReporter.prototype.writeXmlToDisk = function(xml, filePath){
|
||||
if (filePath) {
|
||||
if (filePath.indexOf('[hash]') !== -1) {
|
||||
filePath = filePath.replace('[hash]', md5(xml));
|
||||
}
|
||||
|
||||
debug('writing file to', filePath);
|
||||
mkdirp.sync(path.dirname(filePath));
|
||||
|
||||
fs.writeFileSync(filePath, xml, 'utf-8');
|
||||
debug('results written successfully');
|
||||
}
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"laxbreak": true
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
support
|
||||
test
|
||||
examples
|
||||
example
|
||||
*.sock
|
||||
dist
|
||||
@@ -1,195 +0,0 @@
|
||||
|
||||
2.2.0 / 2015-05-09
|
||||
==================
|
||||
|
||||
* package: update "ms" to v0.7.1 (#202, @dougwilson)
|
||||
* README: add logging to file example (#193, @DanielOchoa)
|
||||
* README: fixed a typo (#191, @amir-s)
|
||||
* browser: expose `storage` (#190, @stephenmathieson)
|
||||
* Makefile: add a `distclean` target (#189, @stephenmathieson)
|
||||
|
||||
2.1.3 / 2015-03-13
|
||||
==================
|
||||
|
||||
* Updated stdout/stderr example (#186)
|
||||
* Updated example/stdout.js to match debug current behaviour
|
||||
* Renamed example/stderr.js to stdout.js
|
||||
* Update Readme.md (#184)
|
||||
* replace high intensity foreground color for bold (#182, #183)
|
||||
|
||||
2.1.2 / 2015-03-01
|
||||
==================
|
||||
|
||||
* dist: recompile
|
||||
* update "ms" to v0.7.0
|
||||
* package: update "browserify" to v9.0.3
|
||||
* component: fix "ms.js" repo location
|
||||
* changed bower package name
|
||||
* updated documentation about using debug in a browser
|
||||
* fix: security error on safari (#167, #168, @yields)
|
||||
|
||||
2.1.1 / 2014-12-29
|
||||
==================
|
||||
|
||||
* browser: use `typeof` to check for `console` existence
|
||||
* browser: check for `console.log` truthiness (fix IE 8/9)
|
||||
* browser: add support for Chrome apps
|
||||
* Readme: added Windows usage remarks
|
||||
* Add `bower.json` to properly support bower install
|
||||
|
||||
2.1.0 / 2014-10-15
|
||||
==================
|
||||
|
||||
* node: implement `DEBUG_FD` env variable support
|
||||
* package: update "browserify" to v6.1.0
|
||||
* package: add "license" field to package.json (#135, @panuhorsmalahti)
|
||||
|
||||
2.0.0 / 2014-09-01
|
||||
==================
|
||||
|
||||
* package: update "browserify" to v5.11.0
|
||||
* node: use stderr rather than stdout for logging (#29, @stephenmathieson)
|
||||
|
||||
1.0.4 / 2014-07-15
|
||||
==================
|
||||
|
||||
* dist: recompile
|
||||
* example: remove `console.info()` log usage
|
||||
* example: add "Content-Type" UTF-8 header to browser example
|
||||
* browser: place %c marker after the space character
|
||||
* browser: reset the "content" color via `color: inherit`
|
||||
* browser: add colors support for Firefox >= v31
|
||||
* debug: prefer an instance `log()` function over the global one (#119)
|
||||
* Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
|
||||
|
||||
1.0.3 / 2014-07-09
|
||||
==================
|
||||
|
||||
* Add support for multiple wildcards in namespaces (#122, @seegno)
|
||||
* browser: fix lint
|
||||
|
||||
1.0.2 / 2014-06-10
|
||||
==================
|
||||
|
||||
* browser: update color palette (#113, @gscottolson)
|
||||
* common: make console logging function configurable (#108, @timoxley)
|
||||
* node: fix %o colors on old node <= 0.8.x
|
||||
* Makefile: find node path using shell/which (#109, @timoxley)
|
||||
|
||||
1.0.1 / 2014-06-06
|
||||
==================
|
||||
|
||||
* browser: use `removeItem()` to clear localStorage
|
||||
* browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
|
||||
* package: add "contributors" section
|
||||
* node: fix comment typo
|
||||
* README: list authors
|
||||
|
||||
1.0.0 / 2014-06-04
|
||||
==================
|
||||
|
||||
* make ms diff be global, not be scope
|
||||
* debug: ignore empty strings in enable()
|
||||
* node: make DEBUG_COLORS able to disable coloring
|
||||
* *: export the `colors` array
|
||||
* npmignore: don't publish the `dist` dir
|
||||
* Makefile: refactor to use browserify
|
||||
* package: add "browserify" as a dev dependency
|
||||
* Readme: add Web Inspector Colors section
|
||||
* node: reset terminal color for the debug content
|
||||
* node: map "%o" to `util.inspect()`
|
||||
* browser: map "%j" to `JSON.stringify()`
|
||||
* debug: add custom "formatters"
|
||||
* debug: use "ms" module for humanizing the diff
|
||||
* Readme: add "bash" syntax highlighting
|
||||
* browser: add Firebug color support
|
||||
* browser: add colors for WebKit browsers
|
||||
* node: apply log to `console`
|
||||
* rewrite: abstract common logic for Node & browsers
|
||||
* add .jshintrc file
|
||||
|
||||
0.8.1 / 2014-04-14
|
||||
==================
|
||||
|
||||
* package: re-add the "component" section
|
||||
|
||||
0.8.0 / 2014-03-30
|
||||
==================
|
||||
|
||||
* add `enable()` method for nodejs. Closes #27
|
||||
* change from stderr to stdout
|
||||
* remove unnecessary index.js file
|
||||
|
||||
0.7.4 / 2013-11-13
|
||||
==================
|
||||
|
||||
* remove "browserify" key from package.json (fixes something in browserify)
|
||||
|
||||
0.7.3 / 2013-10-30
|
||||
==================
|
||||
|
||||
* fix: catch localStorage security error when cookies are blocked (Chrome)
|
||||
* add debug(err) support. Closes #46
|
||||
* add .browser prop to package.json. Closes #42
|
||||
|
||||
0.7.2 / 2013-02-06
|
||||
==================
|
||||
|
||||
* fix package.json
|
||||
* fix: Mobile Safari (private mode) is broken with debug
|
||||
* fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
|
||||
|
||||
0.7.1 / 2013-02-05
|
||||
==================
|
||||
|
||||
* add repository URL to package.json
|
||||
* add DEBUG_COLORED to force colored output
|
||||
* add browserify support
|
||||
* fix component. Closes #24
|
||||
|
||||
0.7.0 / 2012-05-04
|
||||
==================
|
||||
|
||||
* Added .component to package.json
|
||||
* Added debug.component.js build
|
||||
|
||||
0.6.0 / 2012-03-16
|
||||
==================
|
||||
|
||||
* Added support for "-" prefix in DEBUG [Vinay Pulim]
|
||||
* Added `.enabled` flag to the node version [TooTallNate]
|
||||
|
||||
0.5.0 / 2012-02-02
|
||||
==================
|
||||
|
||||
* Added: humanize diffs. Closes #8
|
||||
* Added `debug.disable()` to the CS variant
|
||||
* Removed padding. Closes #10
|
||||
* Fixed: persist client-side variant again. Closes #9
|
||||
|
||||
0.4.0 / 2012-02-01
|
||||
==================
|
||||
|
||||
* Added browser variant support for older browsers [TooTallNate]
|
||||
* Added `debug.enable('project:*')` to browser variant [TooTallNate]
|
||||
* Added padding to diff (moved it to the right)
|
||||
|
||||
0.3.0 / 2012-01-26
|
||||
==================
|
||||
|
||||
* Added millisecond diff when isatty, otherwise UTC string
|
||||
|
||||
0.2.0 / 2012-01-22
|
||||
==================
|
||||
|
||||
* Added wildcard support
|
||||
|
||||
0.1.0 / 2011-12-02
|
||||
==================
|
||||
|
||||
* Added: remove colors unless stderr isatty [TooTallNate]
|
||||
|
||||
0.0.1 / 2010-01-03
|
||||
==================
|
||||
|
||||
* Initial release
|
||||
@@ -1,36 +0,0 @@
|
||||
|
||||
# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
|
||||
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
|
||||
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
|
||||
|
||||
# BIN directory
|
||||
BIN := $(THIS_DIR)/node_modules/.bin
|
||||
|
||||
# applications
|
||||
NODE ?= $(shell which node)
|
||||
NPM ?= $(NODE) $(shell which npm)
|
||||
BROWSERIFY ?= $(NODE) $(BIN)/browserify
|
||||
|
||||
all: dist/debug.js
|
||||
|
||||
install: node_modules
|
||||
|
||||
clean:
|
||||
@rm -rf dist
|
||||
|
||||
dist:
|
||||
@mkdir -p $@
|
||||
|
||||
dist/debug.js: node_modules browser.js debug.js dist
|
||||
@$(BROWSERIFY) \
|
||||
--standalone debug \
|
||||
. > $@
|
||||
|
||||
distclean: clean
|
||||
@rm -rf node_modules
|
||||
|
||||
node_modules: package.json
|
||||
@NODE_ENV= $(NPM) install
|
||||
@touch node_modules
|
||||
|
||||
.PHONY: all install clean distclean
|
||||
@@ -1,188 +0,0 @@
|
||||
# debug
|
||||
|
||||
tiny node.js debugging utility modelled after node core's debugging technique.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
$ npm install debug
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.
|
||||
|
||||
Example _app.js_:
|
||||
|
||||
```js
|
||||
var debug = require('debug')('http')
|
||||
, http = require('http')
|
||||
, name = 'My App';
|
||||
|
||||
// fake app
|
||||
|
||||
debug('booting %s', name);
|
||||
|
||||
http.createServer(function(req, res){
|
||||
debug(req.method + ' ' + req.url);
|
||||
res.end('hello\n');
|
||||
}).listen(3000, function(){
|
||||
debug('listening');
|
||||
});
|
||||
|
||||
// fake worker of some kind
|
||||
|
||||
require('./worker');
|
||||
```
|
||||
|
||||
Example _worker.js_:
|
||||
|
||||
```js
|
||||
var debug = require('debug')('worker');
|
||||
|
||||
setInterval(function(){
|
||||
debug('doing some work');
|
||||
}, 1000);
|
||||
```
|
||||
|
||||
The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
#### Windows note
|
||||
|
||||
On Windows the environment variable is set using the `set` command.
|
||||
|
||||
```cmd
|
||||
set DEBUG=*,-not_this
|
||||
```
|
||||
|
||||
Then, run the program to be debugged as usual.
|
||||
|
||||
## Millisecond diff
|
||||
|
||||
When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
|
||||
|
||||

|
||||
|
||||
When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
|
||||
|
||||

|
||||
|
||||
## Conventions
|
||||
|
||||
If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
|
||||
|
||||
## Wildcards
|
||||
|
||||
The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
|
||||
|
||||
You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
|
||||
|
||||
## Browser support
|
||||
|
||||
Debug works in the browser as well, currently persisted by `localStorage`. Consider the situation shown below where you have `worker:a` and `worker:b`, and wish to debug both. Somewhere in the code on your page, include:
|
||||
|
||||
```js
|
||||
window.myDebug = require("debug");
|
||||
```
|
||||
|
||||
("debug" is a global object in the browser so we give this object a different name.) When your page is open in the browser, type the following in the console:
|
||||
|
||||
```js
|
||||
myDebug.enable("worker:*")
|
||||
```
|
||||
|
||||
Refresh the page. Debug output will continue to be sent to the console until it is disabled by typing `myDebug.disable()` in the console.
|
||||
|
||||
```js
|
||||
a = debug('worker:a');
|
||||
b = debug('worker:b');
|
||||
|
||||
setInterval(function(){
|
||||
a('doing some work');
|
||||
}, 1000);
|
||||
|
||||
setInterval(function(){
|
||||
b('doing some work');
|
||||
}, 1200);
|
||||
```
|
||||
|
||||
#### Web Inspector Colors
|
||||
|
||||
Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
|
||||
option. These are WebKit web inspectors, Firefox ([since version
|
||||
31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
|
||||
and the Firebug plugin for Firefox (any version).
|
||||
|
||||
Colored output looks something like:
|
||||
|
||||

|
||||
|
||||
### stderr vs stdout
|
||||
|
||||
You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally:
|
||||
|
||||
Example _stdout.js_:
|
||||
|
||||
```js
|
||||
var debug = require('debug');
|
||||
var error = debug('app:error');
|
||||
|
||||
// by default stderr is used
|
||||
error('goes to stderr!');
|
||||
|
||||
var log = debug('app:log');
|
||||
// set this namespace to log via console.log
|
||||
log.log = console.log.bind(console); // don't forget to bind to console!
|
||||
log('goes to stdout');
|
||||
error('still goes to stderr!');
|
||||
|
||||
// set all output to go via console.info
|
||||
// overrides all per-namespace log settings
|
||||
debug.log = console.info.bind(console);
|
||||
error('now goes to stdout via console.info');
|
||||
log('still goes to stdout, but via console.info now');
|
||||
```
|
||||
|
||||
### Save debug output to a file
|
||||
|
||||
You can save all debug statements to a file by piping them.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
$ DEBUG_FD=3 node your-app.js 3> whatever.log
|
||||
```
|
||||
|
||||
## Authors
|
||||
|
||||
- TJ Holowaychuk
|
||||
- Nathan Rajlich
|
||||
|
||||
## License
|
||||
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
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.
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"name": "visionmedia-debug",
|
||||
"main": "dist/debug.js",
|
||||
"version": "2.2.0",
|
||||
"homepage": "https://github.com/visionmedia/debug",
|
||||
"authors": [
|
||||
"TJ Holowaychuk <tj@vision-media.ca>"
|
||||
],
|
||||
"description": "visionmedia-debug",
|
||||
"moduleType": [
|
||||
"amd",
|
||||
"es6",
|
||||
"globals",
|
||||
"node"
|
||||
],
|
||||
"keywords": [
|
||||
"visionmedia",
|
||||
"debug"
|
||||
],
|
||||
"license": "MIT",
|
||||
"ignore": [
|
||||
"**/.*",
|
||||
"node_modules",
|
||||
"bower_components",
|
||||
"test",
|
||||
"tests"
|
||||
]
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
|
||||
/**
|
||||
* This is the web browser implementation of `debug()`.
|
||||
*
|
||||
* Expose `debug()` as the module.
|
||||
*/
|
||||
|
||||
exports = module.exports = require('./debug');
|
||||
exports.log = log;
|
||||
exports.formatArgs = formatArgs;
|
||||
exports.save = save;
|
||||
exports.load = load;
|
||||
exports.useColors = useColors;
|
||||
exports.storage = 'undefined' != typeof chrome
|
||||
&& 'undefined' != typeof chrome.storage
|
||||
? chrome.storage.local
|
||||
: localstorage();
|
||||
|
||||
/**
|
||||
* Colors.
|
||||
*/
|
||||
|
||||
exports.colors = [
|
||||
'lightseagreen',
|
||||
'forestgreen',
|
||||
'goldenrod',
|
||||
'dodgerblue',
|
||||
'darkorchid',
|
||||
'crimson'
|
||||
];
|
||||
|
||||
/**
|
||||
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
|
||||
* and the Firebug extension (any Firefox version) are known
|
||||
* to support "%c" CSS customizations.
|
||||
*
|
||||
* TODO: add a `localStorage` variable to explicitly enable/disable colors
|
||||
*/
|
||||
|
||||
function useColors() {
|
||||
// is webkit? http://stackoverflow.com/a/16459606/376773
|
||||
return ('WebkitAppearance' in document.documentElement.style) ||
|
||||
// is firebug? http://stackoverflow.com/a/398120/376773
|
||||
(window.console && (console.firebug || (console.exception && console.table))) ||
|
||||
// is firefox >= v31?
|
||||
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
||||
(navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31);
|
||||
}
|
||||
|
||||
/**
|
||||
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
|
||||
*/
|
||||
|
||||
exports.formatters.j = function(v) {
|
||||
return JSON.stringify(v);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Colorize log arguments if enabled.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function formatArgs() {
|
||||
var args = arguments;
|
||||
var useColors = this.useColors;
|
||||
|
||||
args[0] = (useColors ? '%c' : '')
|
||||
+ this.namespace
|
||||
+ (useColors ? ' %c' : ' ')
|
||||
+ args[0]
|
||||
+ (useColors ? '%c ' : ' ')
|
||||
+ '+' + exports.humanize(this.diff);
|
||||
|
||||
if (!useColors) return args;
|
||||
|
||||
var c = 'color: ' + this.color;
|
||||
args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));
|
||||
|
||||
// the final "%c" is somewhat tricky, because there could be other
|
||||
// arguments passed either before or after the %c, so we need to
|
||||
// figure out the correct index to insert the CSS into
|
||||
var index = 0;
|
||||
var lastC = 0;
|
||||
args[0].replace(/%[a-z%]/g, function(match) {
|
||||
if ('%%' === match) return;
|
||||
index++;
|
||||
if ('%c' === match) {
|
||||
// we only are interested in the *last* %c
|
||||
// (the user may have provided their own)
|
||||
lastC = index;
|
||||
}
|
||||
});
|
||||
|
||||
args.splice(lastC, 0, c);
|
||||
return args;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes `console.log()` when available.
|
||||
* No-op when `console.log` is not a "function".
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function log() {
|
||||
// this hackery is required for IE8/9, where
|
||||
// the `console.log` function doesn't have 'apply'
|
||||
return 'object' === typeof console
|
||||
&& console.log
|
||||
&& Function.prototype.apply.call(console.log, console, arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save `namespaces`.
|
||||
*
|
||||
* @param {String} namespaces
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function save(namespaces) {
|
||||
try {
|
||||
if (null == namespaces) {
|
||||
exports.storage.removeItem('debug');
|
||||
} else {
|
||||
exports.storage.debug = namespaces;
|
||||
}
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load `namespaces`.
|
||||
*
|
||||
* @return {String} returns the previously persisted debug modes
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function load() {
|
||||
var r;
|
||||
try {
|
||||
r = exports.storage.debug;
|
||||
} catch(e) {}
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable namespaces listed in `localStorage.debug` initially.
|
||||
*/
|
||||
|
||||
exports.enable(load());
|
||||
|
||||
/**
|
||||
* Localstorage attempts to return the localstorage.
|
||||
*
|
||||
* This is necessary because safari throws
|
||||
* when a user disables cookies/localstorage
|
||||
* and you attempt to access it.
|
||||
*
|
||||
* @return {LocalStorage}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function localstorage(){
|
||||
try {
|
||||
return window.localStorage;
|
||||
} catch (e) {}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "debug",
|
||||
"repo": "visionmedia/debug",
|
||||
"description": "small debugging utility",
|
||||
"version": "2.2.0",
|
||||
"keywords": [
|
||||
"debug",
|
||||
"log",
|
||||
"debugger"
|
||||
],
|
||||
"main": "browser.js",
|
||||
"scripts": [
|
||||
"browser.js",
|
||||
"debug.js"
|
||||
],
|
||||
"dependencies": {
|
||||
"rauchg/ms.js": "0.7.1"
|
||||
}
|
||||
}
|
||||
@@ -1,197 +0,0 @@
|
||||
|
||||
/**
|
||||
* This is the common logic for both the Node.js and web browser
|
||||
* implementations of `debug()`.
|
||||
*
|
||||
* Expose `debug()` as the module.
|
||||
*/
|
||||
|
||||
exports = module.exports = debug;
|
||||
exports.coerce = coerce;
|
||||
exports.disable = disable;
|
||||
exports.enable = enable;
|
||||
exports.enabled = enabled;
|
||||
exports.humanize = require('ms');
|
||||
|
||||
/**
|
||||
* The currently active debug mode names, and names to skip.
|
||||
*/
|
||||
|
||||
exports.names = [];
|
||||
exports.skips = [];
|
||||
|
||||
/**
|
||||
* Map of special "%n" handling functions, for the debug "format" argument.
|
||||
*
|
||||
* Valid key names are a single, lowercased letter, i.e. "n".
|
||||
*/
|
||||
|
||||
exports.formatters = {};
|
||||
|
||||
/**
|
||||
* Previously assigned color.
|
||||
*/
|
||||
|
||||
var prevColor = 0;
|
||||
|
||||
/**
|
||||
* Previous log timestamp.
|
||||
*/
|
||||
|
||||
var prevTime;
|
||||
|
||||
/**
|
||||
* Select a color.
|
||||
*
|
||||
* @return {Number}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function selectColor() {
|
||||
return exports.colors[prevColor++ % exports.colors.length];
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a debugger with the given `namespace`.
|
||||
*
|
||||
* @param {String} namespace
|
||||
* @return {Function}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function debug(namespace) {
|
||||
|
||||
// define the `disabled` version
|
||||
function disabled() {
|
||||
}
|
||||
disabled.enabled = false;
|
||||
|
||||
// define the `enabled` version
|
||||
function enabled() {
|
||||
|
||||
var self = enabled;
|
||||
|
||||
// set `diff` timestamp
|
||||
var curr = +new Date();
|
||||
var ms = curr - (prevTime || curr);
|
||||
self.diff = ms;
|
||||
self.prev = prevTime;
|
||||
self.curr = curr;
|
||||
prevTime = curr;
|
||||
|
||||
// add the `color` if not set
|
||||
if (null == self.useColors) self.useColors = exports.useColors();
|
||||
if (null == self.color && self.useColors) self.color = selectColor();
|
||||
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
|
||||
args[0] = exports.coerce(args[0]);
|
||||
|
||||
if ('string' !== typeof args[0]) {
|
||||
// anything else let's inspect with %o
|
||||
args = ['%o'].concat(args);
|
||||
}
|
||||
|
||||
// apply any `formatters` transformations
|
||||
var index = 0;
|
||||
args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {
|
||||
// if we encounter an escaped % then don't increase the array index
|
||||
if (match === '%%') return match;
|
||||
index++;
|
||||
var formatter = exports.formatters[format];
|
||||
if ('function' === typeof formatter) {
|
||||
var val = args[index];
|
||||
match = formatter.call(self, val);
|
||||
|
||||
// now we need to remove `args[index]` since it's inlined in the `format`
|
||||
args.splice(index, 1);
|
||||
index--;
|
||||
}
|
||||
return match;
|
||||
});
|
||||
|
||||
if ('function' === typeof exports.formatArgs) {
|
||||
args = exports.formatArgs.apply(self, args);
|
||||
}
|
||||
var logFn = enabled.log || exports.log || console.log.bind(console);
|
||||
logFn.apply(self, args);
|
||||
}
|
||||
enabled.enabled = true;
|
||||
|
||||
var fn = exports.enabled(namespace) ? enabled : disabled;
|
||||
|
||||
fn.namespace = namespace;
|
||||
|
||||
return fn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables a debug mode by namespaces. This can include modes
|
||||
* separated by a colon and wildcards.
|
||||
*
|
||||
* @param {String} namespaces
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function enable(namespaces) {
|
||||
exports.save(namespaces);
|
||||
|
||||
var split = (namespaces || '').split(/[\s,]+/);
|
||||
var len = split.length;
|
||||
|
||||
for (var i = 0; i < len; i++) {
|
||||
if (!split[i]) continue; // ignore empty strings
|
||||
namespaces = split[i].replace(/\*/g, '.*?');
|
||||
if (namespaces[0] === '-') {
|
||||
exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
|
||||
} else {
|
||||
exports.names.push(new RegExp('^' + namespaces + '$'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable debug output.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function disable() {
|
||||
exports.enable('');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given mode name is enabled, false otherwise.
|
||||
*
|
||||
* @param {String} name
|
||||
* @return {Boolean}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function enabled(name) {
|
||||
var i, len;
|
||||
for (i = 0, len = exports.skips.length; i < len; i++) {
|
||||
if (exports.skips[i].test(name)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (i = 0, len = exports.names.length; i < len; i++) {
|
||||
if (exports.names[i].test(name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Coerce `val`.
|
||||
*
|
||||
* @param {Mixed} val
|
||||
* @return {Mixed}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function coerce(val) {
|
||||
if (val instanceof Error) return val.stack || val.message;
|
||||
return val;
|
||||
}
|
||||
@@ -1,209 +0,0 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var tty = require('tty');
|
||||
var util = require('util');
|
||||
|
||||
/**
|
||||
* This is the Node.js implementation of `debug()`.
|
||||
*
|
||||
* Expose `debug()` as the module.
|
||||
*/
|
||||
|
||||
exports = module.exports = require('./debug');
|
||||
exports.log = log;
|
||||
exports.formatArgs = formatArgs;
|
||||
exports.save = save;
|
||||
exports.load = load;
|
||||
exports.useColors = useColors;
|
||||
|
||||
/**
|
||||
* Colors.
|
||||
*/
|
||||
|
||||
exports.colors = [6, 2, 3, 4, 5, 1];
|
||||
|
||||
/**
|
||||
* The file descriptor to write the `debug()` calls to.
|
||||
* Set the `DEBUG_FD` env variable to override with another value. i.e.:
|
||||
*
|
||||
* $ DEBUG_FD=3 node script.js 3>debug.log
|
||||
*/
|
||||
|
||||
var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
|
||||
var stream = 1 === fd ? process.stdout :
|
||||
2 === fd ? process.stderr :
|
||||
createWritableStdioStream(fd);
|
||||
|
||||
/**
|
||||
* Is stdout a TTY? Colored output is enabled when `true`.
|
||||
*/
|
||||
|
||||
function useColors() {
|
||||
var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase();
|
||||
if (0 === debugColors.length) {
|
||||
return tty.isatty(fd);
|
||||
} else {
|
||||
return '0' !== debugColors
|
||||
&& 'no' !== debugColors
|
||||
&& 'false' !== debugColors
|
||||
&& 'disabled' !== debugColors;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Map %o to `util.inspect()`, since Node doesn't do that out of the box.
|
||||
*/
|
||||
|
||||
var inspect = (4 === util.inspect.length ?
|
||||
// node <= 0.8.x
|
||||
function (v, colors) {
|
||||
return util.inspect(v, void 0, void 0, colors);
|
||||
} :
|
||||
// node > 0.8.x
|
||||
function (v, colors) {
|
||||
return util.inspect(v, { colors: colors });
|
||||
}
|
||||
);
|
||||
|
||||
exports.formatters.o = function(v) {
|
||||
return inspect(v, this.useColors)
|
||||
.replace(/\s*\n\s*/g, ' ');
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds ANSI color escape codes if enabled.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function formatArgs() {
|
||||
var args = arguments;
|
||||
var useColors = this.useColors;
|
||||
var name = this.namespace;
|
||||
|
||||
if (useColors) {
|
||||
var c = this.color;
|
||||
|
||||
args[0] = ' \u001b[3' + c + ';1m' + name + ' '
|
||||
+ '\u001b[0m'
|
||||
+ args[0] + '\u001b[3' + c + 'm'
|
||||
+ ' +' + exports.humanize(this.diff) + '\u001b[0m';
|
||||
} else {
|
||||
args[0] = new Date().toUTCString()
|
||||
+ ' ' + name + ' ' + args[0];
|
||||
}
|
||||
return args;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes `console.error()` with the specified arguments.
|
||||
*/
|
||||
|
||||
function log() {
|
||||
return stream.write(util.format.apply(this, arguments) + '\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Save `namespaces`.
|
||||
*
|
||||
* @param {String} namespaces
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function save(namespaces) {
|
||||
if (null == namespaces) {
|
||||
// If you set a process.env field to null or undefined, it gets cast to the
|
||||
// string 'null' or 'undefined'. Just delete instead.
|
||||
delete process.env.DEBUG;
|
||||
} else {
|
||||
process.env.DEBUG = namespaces;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load `namespaces`.
|
||||
*
|
||||
* @return {String} returns the previously persisted debug modes
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function load() {
|
||||
return process.env.DEBUG;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from `node/src/node.js`.
|
||||
*
|
||||
* XXX: It's lame that node doesn't expose this API out-of-the-box. It also
|
||||
* relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
|
||||
*/
|
||||
|
||||
function createWritableStdioStream (fd) {
|
||||
var stream;
|
||||
var tty_wrap = process.binding('tty_wrap');
|
||||
|
||||
// Note stream._type is used for test-module-load-list.js
|
||||
|
||||
switch (tty_wrap.guessHandleType(fd)) {
|
||||
case 'TTY':
|
||||
stream = new tty.WriteStream(fd);
|
||||
stream._type = 'tty';
|
||||
|
||||
// Hack to have stream not keep the event loop alive.
|
||||
// See https://github.com/joyent/node/issues/1726
|
||||
if (stream._handle && stream._handle.unref) {
|
||||
stream._handle.unref();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'FILE':
|
||||
var fs = require('fs');
|
||||
stream = new fs.SyncWriteStream(fd, { autoClose: false });
|
||||
stream._type = 'fs';
|
||||
break;
|
||||
|
||||
case 'PIPE':
|
||||
case 'TCP':
|
||||
var net = require('net');
|
||||
stream = new net.Socket({
|
||||
fd: fd,
|
||||
readable: false,
|
||||
writable: true
|
||||
});
|
||||
|
||||
// FIXME Should probably have an option in net.Socket to create a
|
||||
// stream from an existing fd which is writable only. But for now
|
||||
// we'll just add this hack and set the `readable` member to false.
|
||||
// Test: ./node test/fixtures/echo.js < /etc/passwd
|
||||
stream.readable = false;
|
||||
stream.read = null;
|
||||
stream._type = 'pipe';
|
||||
|
||||
// FIXME Hack to have stream not keep the event loop alive.
|
||||
// See https://github.com/joyent/node/issues/1726
|
||||
if (stream._handle && stream._handle.unref) {
|
||||
stream._handle.unref();
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
// Probably an error on in uv_guess_handle()
|
||||
throw new Error('Implement me. Unknown stream file type!');
|
||||
}
|
||||
|
||||
// For supporting legacy API we put the FD here.
|
||||
stream.fd = fd;
|
||||
|
||||
stream._isStdio = true;
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable namespaces listed in `process.env.DEBUG` initially.
|
||||
*/
|
||||
|
||||
exports.enable(load());
|
||||
@@ -1,5 +0,0 @@
|
||||
node_modules
|
||||
test
|
||||
History.md
|
||||
Makefile
|
||||
component.json
|
||||
@@ -1,66 +0,0 @@
|
||||
|
||||
0.7.1 / 2015-04-20
|
||||
==================
|
||||
|
||||
* prevent extraordinary long inputs (@evilpacket)
|
||||
* Fixed broken readme link
|
||||
|
||||
0.7.0 / 2014-11-24
|
||||
==================
|
||||
|
||||
* add time abbreviations, updated tests and readme for the new units
|
||||
* fix example in the readme.
|
||||
* add LICENSE file
|
||||
|
||||
0.6.2 / 2013-12-05
|
||||
==================
|
||||
|
||||
* Adding repository section to package.json to suppress warning from NPM.
|
||||
|
||||
0.6.1 / 2013-05-10
|
||||
==================
|
||||
|
||||
* fix singularization [visionmedia]
|
||||
|
||||
0.6.0 / 2013-03-15
|
||||
==================
|
||||
|
||||
* fix minutes
|
||||
|
||||
0.5.1 / 2013-02-24
|
||||
==================
|
||||
|
||||
* add component namespace
|
||||
|
||||
0.5.0 / 2012-11-09
|
||||
==================
|
||||
|
||||
* add short formatting as default and .long option
|
||||
* add .license property to component.json
|
||||
* add version to component.json
|
||||
|
||||
0.4.0 / 2012-10-22
|
||||
==================
|
||||
|
||||
* add rounding to fix crazy decimals
|
||||
|
||||
0.3.0 / 2012-09-07
|
||||
==================
|
||||
|
||||
* fix `ms(<String>)` [visionmedia]
|
||||
|
||||
0.2.0 / 2012-09-03
|
||||
==================
|
||||
|
||||
* add component.json [visionmedia]
|
||||
* add days support [visionmedia]
|
||||
* add hours support [visionmedia]
|
||||
* add minutes support [visionmedia]
|
||||
* add seconds support [visionmedia]
|
||||
* add ms string support [visionmedia]
|
||||
* refactor tests to facilitate ms(number) [visionmedia]
|
||||
|
||||
0.1.0 / 2012-03-07
|
||||
==================
|
||||
|
||||
* Initial release
|
||||
@@ -1,20 +0,0 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2014 Guillermo Rauch <rauchg@gmail.com>
|
||||
|
||||
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.
|
||||
@@ -1,35 +0,0 @@
|
||||
# ms.js: miliseconds conversion utility
|
||||
|
||||
```js
|
||||
ms('2 days') // 172800000
|
||||
ms('1d') // 86400000
|
||||
ms('10h') // 36000000
|
||||
ms('2.5 hrs') // 9000000
|
||||
ms('2h') // 7200000
|
||||
ms('1m') // 60000
|
||||
ms('5s') // 5000
|
||||
ms('100') // 100
|
||||
```
|
||||
|
||||
```js
|
||||
ms(60000) // "1m"
|
||||
ms(2 * 60000) // "2m"
|
||||
ms(ms('10 hours')) // "10h"
|
||||
```
|
||||
|
||||
```js
|
||||
ms(60000, { long: true }) // "1 minute"
|
||||
ms(2 * 60000, { long: true }) // "2 minutes"
|
||||
ms(ms('10 hours'), { long: true }) // "10 hours"
|
||||
```
|
||||
|
||||
- Node/Browser compatible. Published as [`ms`](https://www.npmjs.org/package/ms) in [NPM](http://nodejs.org/download).
|
||||
- If a number is supplied to `ms`, a string with a unit is returned.
|
||||
- If a string that contains the number is supplied, it returns it as
|
||||
a number (e.g: it returns `100` for `'100'`).
|
||||
- If you pass a string with a number and a valid unit, the number of
|
||||
equivalent ms is returned.
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
@@ -1,125 +0,0 @@
|
||||
/**
|
||||
* Helpers.
|
||||
*/
|
||||
|
||||
var s = 1000;
|
||||
var m = s * 60;
|
||||
var h = m * 60;
|
||||
var d = h * 24;
|
||||
var y = d * 365.25;
|
||||
|
||||
/**
|
||||
* Parse or format the given `val`.
|
||||
*
|
||||
* Options:
|
||||
*
|
||||
* - `long` verbose formatting [false]
|
||||
*
|
||||
* @param {String|Number} val
|
||||
* @param {Object} options
|
||||
* @return {String|Number}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
module.exports = function(val, options){
|
||||
options = options || {};
|
||||
if ('string' == typeof val) return parse(val);
|
||||
return options.long
|
||||
? long(val)
|
||||
: short(val);
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse the given `str` and return milliseconds.
|
||||
*
|
||||
* @param {String} str
|
||||
* @return {Number}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function parse(str) {
|
||||
str = '' + str;
|
||||
if (str.length > 10000) return;
|
||||
var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);
|
||||
if (!match) return;
|
||||
var n = parseFloat(match[1]);
|
||||
var type = (match[2] || 'ms').toLowerCase();
|
||||
switch (type) {
|
||||
case 'years':
|
||||
case 'year':
|
||||
case 'yrs':
|
||||
case 'yr':
|
||||
case 'y':
|
||||
return n * y;
|
||||
case 'days':
|
||||
case 'day':
|
||||
case 'd':
|
||||
return n * d;
|
||||
case 'hours':
|
||||
case 'hour':
|
||||
case 'hrs':
|
||||
case 'hr':
|
||||
case 'h':
|
||||
return n * h;
|
||||
case 'minutes':
|
||||
case 'minute':
|
||||
case 'mins':
|
||||
case 'min':
|
||||
case 'm':
|
||||
return n * m;
|
||||
case 'seconds':
|
||||
case 'second':
|
||||
case 'secs':
|
||||
case 'sec':
|
||||
case 's':
|
||||
return n * s;
|
||||
case 'milliseconds':
|
||||
case 'millisecond':
|
||||
case 'msecs':
|
||||
case 'msec':
|
||||
case 'ms':
|
||||
return n;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Short format for `ms`.
|
||||
*
|
||||
* @param {Number} ms
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function short(ms) {
|
||||
if (ms >= d) return Math.round(ms / d) + 'd';
|
||||
if (ms >= h) return Math.round(ms / h) + 'h';
|
||||
if (ms >= m) return Math.round(ms / m) + 'm';
|
||||
if (ms >= s) return Math.round(ms / s) + 's';
|
||||
return ms + 'ms';
|
||||
}
|
||||
|
||||
/**
|
||||
* Long format for `ms`.
|
||||
*
|
||||
* @param {Number} ms
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function long(ms) {
|
||||
return plural(ms, d, 'day')
|
||||
|| plural(ms, h, 'hour')
|
||||
|| plural(ms, m, 'minute')
|
||||
|| plural(ms, s, 'second')
|
||||
|| ms + ' ms';
|
||||
}
|
||||
|
||||
/**
|
||||
* Pluralization helper.
|
||||
*/
|
||||
|
||||
function plural(ms, n, name) {
|
||||
if (ms < n) return;
|
||||
if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
|
||||
return Math.ceil(ms / n) + ' ' + name + 's';
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
{
|
||||
"name": "ms",
|
||||
"version": "0.7.1",
|
||||
"description": "Tiny ms conversion utility",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/guille/ms.js.git"
|
||||
},
|
||||
"main": "./index",
|
||||
"devDependencies": {
|
||||
"mocha": "*",
|
||||
"expect.js": "*",
|
||||
"serve": "*"
|
||||
},
|
||||
"component": {
|
||||
"scripts": {
|
||||
"ms/index.js": "index.js"
|
||||
}
|
||||
},
|
||||
"gitHead": "713dcf26d9e6fd9dbc95affe7eff9783b7f1b909",
|
||||
"bugs": {
|
||||
"url": "https://github.com/guille/ms.js/issues"
|
||||
},
|
||||
"homepage": "https://github.com/guille/ms.js",
|
||||
"_id": "ms@0.7.1",
|
||||
"scripts": {},
|
||||
"_shasum": "9cd13c03adbff25b65effde7ce864ee952017098",
|
||||
"_from": "ms@0.7.1",
|
||||
"_npmVersion": "2.7.5",
|
||||
"_nodeVersion": "0.12.2",
|
||||
"_npmUser": {
|
||||
"name": "rauchg",
|
||||
"email": "rauchg@gmail.com"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "rauchg",
|
||||
"email": "rauchg@gmail.com"
|
||||
}
|
||||
],
|
||||
"dist": {
|
||||
"shasum": "9cd13c03adbff25b65effde7ce864ee952017098",
|
||||
"tarball": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
|
||||
},
|
||||
"directories": {},
|
||||
"_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
{
|
||||
"name": "debug",
|
||||
"version": "2.2.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/visionmedia/debug.git"
|
||||
},
|
||||
"description": "small debugging utility",
|
||||
"keywords": [
|
||||
"debug",
|
||||
"log",
|
||||
"debugger"
|
||||
],
|
||||
"author": {
|
||||
"name": "TJ Holowaychuk",
|
||||
"email": "tj@vision-media.ca"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Nathan Rajlich",
|
||||
"email": "nathan@tootallnate.net",
|
||||
"url": "http://n8.io"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "0.7.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"browserify": "9.0.3",
|
||||
"mocha": "*"
|
||||
},
|
||||
"main": "./node.js",
|
||||
"browser": "./browser.js",
|
||||
"component": {
|
||||
"scripts": {
|
||||
"debug/index.js": "browser.js",
|
||||
"debug/debug.js": "debug.js"
|
||||
}
|
||||
},
|
||||
"gitHead": "b38458422b5aa8aa6d286b10dfe427e8a67e2b35",
|
||||
"bugs": {
|
||||
"url": "https://github.com/visionmedia/debug/issues"
|
||||
},
|
||||
"homepage": "https://github.com/visionmedia/debug",
|
||||
"_id": "debug@2.2.0",
|
||||
"scripts": {},
|
||||
"_shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
|
||||
"_from": "debug@>=2.2.0 <3.0.0",
|
||||
"_npmVersion": "2.7.4",
|
||||
"_nodeVersion": "0.12.2",
|
||||
"_npmUser": {
|
||||
"name": "tootallnate",
|
||||
"email": "nathan@tootallnate.net"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "tjholowaychuk",
|
||||
"email": "tj@vision-media.ca"
|
||||
},
|
||||
{
|
||||
"name": "tootallnate",
|
||||
"email": "nathan@tootallnate.net"
|
||||
}
|
||||
],
|
||||
"dist": {
|
||||
"shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
|
||||
"tarball": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
|
||||
},
|
||||
"directories": {},
|
||||
"_resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
node_modules/mocha
|
||||
@@ -1,4 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 0.6
|
||||
- 0.8
|
||||
@@ -1,27 +0,0 @@
|
||||
Copyright © 2011-2012, Paul Vorbach.
|
||||
Copyright © 2009, Jeff Mott.
|
||||
|
||||
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 Crypto-JS 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER OR 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.
|
||||
@@ -1,108 +0,0 @@
|
||||
# MD5
|
||||
|
||||
[](http://travis-ci.org/pvorb/node-md5)
|
||||
|
||||
a JavaScript function for hashing messages with MD5.
|
||||
|
||||
## Installation
|
||||
|
||||
You can use this package on the server side as well as the client side.
|
||||
|
||||
### [Node.js](http://nodejs.org/):
|
||||
|
||||
~~~
|
||||
npm install md5
|
||||
~~~
|
||||
|
||||
|
||||
## API
|
||||
|
||||
~~~ javascript
|
||||
md5(message)
|
||||
~~~
|
||||
|
||||
* `message` -- `String` or `Buffer`
|
||||
* returns `String`
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
~~~ javascript
|
||||
var md5 = require('md5');
|
||||
|
||||
console.log(md5('message'));
|
||||
~~~
|
||||
|
||||
This will print the following
|
||||
|
||||
~~~
|
||||
78e731027d8fd50ed642340b7c9a63b3
|
||||
~~~
|
||||
|
||||
It supports buffers, too
|
||||
|
||||
~~~ javascript
|
||||
var fs = require('fs');
|
||||
var md5 = require('md5');
|
||||
|
||||
fs.readFile('example.txt', function(err, buf) {
|
||||
console.log(md5(buf));
|
||||
});
|
||||
~~~
|
||||
|
||||
## Versions
|
||||
|
||||
Before version 2.0.0 there were two packages called md5 on npm, one lowercase,
|
||||
one uppercase (the one you're looking at). As of version 2.0.0, all new versions
|
||||
of this module will go to lowercase [md5](https://www.npmjs.com/package/md5) on
|
||||
npm. To use the correct version, users of this module will have to change their
|
||||
code from `require('MD5')` to `require('md5')` if they want to use versions >=
|
||||
2.0.0.
|
||||
|
||||
|
||||
## Bugs and Issues
|
||||
|
||||
If you encounter any bugs or issues, feel free to open an issue at
|
||||
[github](https://github.com/pvorb/node-md5/issues).
|
||||
|
||||
|
||||
## Credits
|
||||
|
||||
This package is based on the work of Jeff Mott, who did a pure JS implementation
|
||||
of the MD5 algorithm that was published by Ronald L. Rivest in 1991. I needed a
|
||||
npm package of the algorithm, so I used Jeff’s implementation for this package.
|
||||
The original implementation can be found in the
|
||||
[CryptoJS](http://code.google.com/p/crypto-js/) project.
|
||||
|
||||
|
||||
## License
|
||||
|
||||
~~~
|
||||
Copyright © 2011-2015, Paul Vorbach.
|
||||
Copyright © 2009, Jeff Mott.
|
||||
|
||||
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 Crypto-JS 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER OR 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.
|
||||
~~~
|
||||
@@ -1,160 +0,0 @@
|
||||
(function(){
|
||||
var crypt = require('crypt'),
|
||||
utf8 = require('charenc').utf8,
|
||||
isBuffer = require('is-buffer'),
|
||||
bin = require('charenc').bin,
|
||||
|
||||
// The core
|
||||
md5 = function (message, options) {
|
||||
// Convert to byte array
|
||||
if (message.constructor == String)
|
||||
if (options && options.encoding === 'binary')
|
||||
message = bin.stringToBytes(message);
|
||||
else
|
||||
message = utf8.stringToBytes(message);
|
||||
else if (isBuffer(message))
|
||||
message = Array.prototype.slice.call(message, 0);
|
||||
else if (!Array.isArray(message))
|
||||
message = message.toString();
|
||||
// else, assume byte array already
|
||||
|
||||
var m = crypt.bytesToWords(message),
|
||||
l = message.length * 8,
|
||||
a = 1732584193,
|
||||
b = -271733879,
|
||||
c = -1732584194,
|
||||
d = 271733878;
|
||||
|
||||
// Swap endian
|
||||
for (var i = 0; i < m.length; i++) {
|
||||
m[i] = ((m[i] << 8) | (m[i] >>> 24)) & 0x00FF00FF |
|
||||
((m[i] << 24) | (m[i] >>> 8)) & 0xFF00FF00;
|
||||
}
|
||||
|
||||
// Padding
|
||||
m[l >>> 5] |= 0x80 << (l % 32);
|
||||
m[(((l + 64) >>> 9) << 4) + 14] = l;
|
||||
|
||||
// Method shortcuts
|
||||
var FF = md5._ff,
|
||||
GG = md5._gg,
|
||||
HH = md5._hh,
|
||||
II = md5._ii;
|
||||
|
||||
for (var i = 0; i < m.length; i += 16) {
|
||||
|
||||
var aa = a,
|
||||
bb = b,
|
||||
cc = c,
|
||||
dd = d;
|
||||
|
||||
a = FF(a, b, c, d, m[i+ 0], 7, -680876936);
|
||||
d = FF(d, a, b, c, m[i+ 1], 12, -389564586);
|
||||
c = FF(c, d, a, b, m[i+ 2], 17, 606105819);
|
||||
b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);
|
||||
a = FF(a, b, c, d, m[i+ 4], 7, -176418897);
|
||||
d = FF(d, a, b, c, m[i+ 5], 12, 1200080426);
|
||||
c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);
|
||||
b = FF(b, c, d, a, m[i+ 7], 22, -45705983);
|
||||
a = FF(a, b, c, d, m[i+ 8], 7, 1770035416);
|
||||
d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);
|
||||
c = FF(c, d, a, b, m[i+10], 17, -42063);
|
||||
b = FF(b, c, d, a, m[i+11], 22, -1990404162);
|
||||
a = FF(a, b, c, d, m[i+12], 7, 1804603682);
|
||||
d = FF(d, a, b, c, m[i+13], 12, -40341101);
|
||||
c = FF(c, d, a, b, m[i+14], 17, -1502002290);
|
||||
b = FF(b, c, d, a, m[i+15], 22, 1236535329);
|
||||
|
||||
a = GG(a, b, c, d, m[i+ 1], 5, -165796510);
|
||||
d = GG(d, a, b, c, m[i+ 6], 9, -1069501632);
|
||||
c = GG(c, d, a, b, m[i+11], 14, 643717713);
|
||||
b = GG(b, c, d, a, m[i+ 0], 20, -373897302);
|
||||
a = GG(a, b, c, d, m[i+ 5], 5, -701558691);
|
||||
d = GG(d, a, b, c, m[i+10], 9, 38016083);
|
||||
c = GG(c, d, a, b, m[i+15], 14, -660478335);
|
||||
b = GG(b, c, d, a, m[i+ 4], 20, -405537848);
|
||||
a = GG(a, b, c, d, m[i+ 9], 5, 568446438);
|
||||
d = GG(d, a, b, c, m[i+14], 9, -1019803690);
|
||||
c = GG(c, d, a, b, m[i+ 3], 14, -187363961);
|
||||
b = GG(b, c, d, a, m[i+ 8], 20, 1163531501);
|
||||
a = GG(a, b, c, d, m[i+13], 5, -1444681467);
|
||||
d = GG(d, a, b, c, m[i+ 2], 9, -51403784);
|
||||
c = GG(c, d, a, b, m[i+ 7], 14, 1735328473);
|
||||
b = GG(b, c, d, a, m[i+12], 20, -1926607734);
|
||||
|
||||
a = HH(a, b, c, d, m[i+ 5], 4, -378558);
|
||||
d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);
|
||||
c = HH(c, d, a, b, m[i+11], 16, 1839030562);
|
||||
b = HH(b, c, d, a, m[i+14], 23, -35309556);
|
||||
a = HH(a, b, c, d, m[i+ 1], 4, -1530992060);
|
||||
d = HH(d, a, b, c, m[i+ 4], 11, 1272893353);
|
||||
c = HH(c, d, a, b, m[i+ 7], 16, -155497632);
|
||||
b = HH(b, c, d, a, m[i+10], 23, -1094730640);
|
||||
a = HH(a, b, c, d, m[i+13], 4, 681279174);
|
||||
d = HH(d, a, b, c, m[i+ 0], 11, -358537222);
|
||||
c = HH(c, d, a, b, m[i+ 3], 16, -722521979);
|
||||
b = HH(b, c, d, a, m[i+ 6], 23, 76029189);
|
||||
a = HH(a, b, c, d, m[i+ 9], 4, -640364487);
|
||||
d = HH(d, a, b, c, m[i+12], 11, -421815835);
|
||||
c = HH(c, d, a, b, m[i+15], 16, 530742520);
|
||||
b = HH(b, c, d, a, m[i+ 2], 23, -995338651);
|
||||
|
||||
a = II(a, b, c, d, m[i+ 0], 6, -198630844);
|
||||
d = II(d, a, b, c, m[i+ 7], 10, 1126891415);
|
||||
c = II(c, d, a, b, m[i+14], 15, -1416354905);
|
||||
b = II(b, c, d, a, m[i+ 5], 21, -57434055);
|
||||
a = II(a, b, c, d, m[i+12], 6, 1700485571);
|
||||
d = II(d, a, b, c, m[i+ 3], 10, -1894986606);
|
||||
c = II(c, d, a, b, m[i+10], 15, -1051523);
|
||||
b = II(b, c, d, a, m[i+ 1], 21, -2054922799);
|
||||
a = II(a, b, c, d, m[i+ 8], 6, 1873313359);
|
||||
d = II(d, a, b, c, m[i+15], 10, -30611744);
|
||||
c = II(c, d, a, b, m[i+ 6], 15, -1560198380);
|
||||
b = II(b, c, d, a, m[i+13], 21, 1309151649);
|
||||
a = II(a, b, c, d, m[i+ 4], 6, -145523070);
|
||||
d = II(d, a, b, c, m[i+11], 10, -1120210379);
|
||||
c = II(c, d, a, b, m[i+ 2], 15, 718787259);
|
||||
b = II(b, c, d, a, m[i+ 9], 21, -343485551);
|
||||
|
||||
a = (a + aa) >>> 0;
|
||||
b = (b + bb) >>> 0;
|
||||
c = (c + cc) >>> 0;
|
||||
d = (d + dd) >>> 0;
|
||||
}
|
||||
|
||||
return crypt.endian([a, b, c, d]);
|
||||
};
|
||||
|
||||
// Auxiliary functions
|
||||
md5._ff = function (a, b, c, d, x, s, t) {
|
||||
var n = a + (b & c | ~b & d) + (x >>> 0) + t;
|
||||
return ((n << s) | (n >>> (32 - s))) + b;
|
||||
};
|
||||
md5._gg = function (a, b, c, d, x, s, t) {
|
||||
var n = a + (b & d | c & ~d) + (x >>> 0) + t;
|
||||
return ((n << s) | (n >>> (32 - s))) + b;
|
||||
};
|
||||
md5._hh = function (a, b, c, d, x, s, t) {
|
||||
var n = a + (b ^ c ^ d) + (x >>> 0) + t;
|
||||
return ((n << s) | (n >>> (32 - s))) + b;
|
||||
};
|
||||
md5._ii = function (a, b, c, d, x, s, t) {
|
||||
var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
|
||||
return ((n << s) | (n >>> (32 - s))) + b;
|
||||
};
|
||||
|
||||
// Package private blocksize
|
||||
md5._blocksize = 16;
|
||||
md5._digestsize = 16;
|
||||
|
||||
module.exports = function (message, options) {
|
||||
if(typeof message == 'undefined')
|
||||
return;
|
||||
|
||||
var digestbytes = crypt.wordsToBytes(md5(message, options));
|
||||
return options && options.asBytes ? digestbytes :
|
||||
options && options.asString ? bin.bytesToString(digestbytes) :
|
||||
crypt.bytesToHex(digestbytes);
|
||||
};
|
||||
|
||||
})();
|
||||
@@ -1,27 +0,0 @@
|
||||
Copyright © 2011, Paul Vorbach. All rights reserved.
|
||||
Copyright © 2009, Jeff Mott. All rights reserved.
|
||||
|
||||
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 Crypto-JS 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER OR 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.
|
||||
@@ -1 +0,0 @@
|
||||
**enc** provides crypto character encoding utilities.
|
||||
@@ -1,33 +0,0 @@
|
||||
var charenc = {
|
||||
// UTF-8 encoding
|
||||
utf8: {
|
||||
// Convert a string to a byte array
|
||||
stringToBytes: function(str) {
|
||||
return charenc.bin.stringToBytes(unescape(encodeURIComponent(str)));
|
||||
},
|
||||
|
||||
// Convert a byte array to a string
|
||||
bytesToString: function(bytes) {
|
||||
return decodeURIComponent(escape(charenc.bin.bytesToString(bytes)));
|
||||
}
|
||||
},
|
||||
|
||||
// Binary encoding
|
||||
bin: {
|
||||
// Convert a string to a byte array
|
||||
stringToBytes: function(str) {
|
||||
for (var bytes = [], i = 0; i < str.length; i++)
|
||||
bytes.push(str.charCodeAt(i) & 0xFF);
|
||||
return bytes;
|
||||
},
|
||||
|
||||
// Convert a byte array to a string
|
||||
bytesToString: function(bytes) {
|
||||
for (var str = [], i = 0; i < bytes.length; i++)
|
||||
str.push(String.fromCharCode(bytes[i]));
|
||||
return str.join('');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = charenc;
|
||||
@@ -1,54 +0,0 @@
|
||||
{
|
||||
"author": {
|
||||
"name": "Paul Vorbach",
|
||||
"email": "paul@vorb.de",
|
||||
"url": "http://vorb.de"
|
||||
},
|
||||
"name": "charenc",
|
||||
"description": "character encoding utilities",
|
||||
"tags": [
|
||||
"utf8",
|
||||
"binary",
|
||||
"byte",
|
||||
"string"
|
||||
],
|
||||
"version": "0.0.1",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/pvorb/node-charenc.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/pvorb/node-charenc/issues"
|
||||
},
|
||||
"main": "charenc.js",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
"_npmUser": {
|
||||
"name": "pvorb",
|
||||
"email": "paul@vorb.de"
|
||||
},
|
||||
"_id": "charenc@0.0.1",
|
||||
"dependencies": {},
|
||||
"devDependencies": {},
|
||||
"_engineSupported": true,
|
||||
"_npmVersion": "1.0.103",
|
||||
"_nodeVersion": "v0.4.12",
|
||||
"_defaultsLoaded": true,
|
||||
"dist": {
|
||||
"shasum": "004cff9feaf102382ed12db58dd6f962796d6e88",
|
||||
"tarball": "https://registry.npmjs.org/charenc/-/charenc-0.0.1.tgz"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "pvorb",
|
||||
"email": "paul@vorb.de"
|
||||
}
|
||||
],
|
||||
"directories": {},
|
||||
"_shasum": "004cff9feaf102382ed12db58dd6f962796d6e88",
|
||||
"_resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.1.tgz",
|
||||
"_from": "charenc@>=0.0.1 <0.1.0",
|
||||
"readme": "ERROR: No README data found!",
|
||||
"homepage": "https://github.com/pvorb/node-charenc#readme"
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
Copyright © 2011, Paul Vorbach. All rights reserved.
|
||||
Copyright © 2009, Jeff Mott. All rights reserved.
|
||||
|
||||
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 Crypto-JS 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER OR 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.
|
||||
@@ -1 +0,0 @@
|
||||
**crypt** provides utilities for encryption and hashing
|
||||
@@ -1,96 +0,0 @@
|
||||
(function() {
|
||||
var base64map
|
||||
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
|
||||
|
||||
crypt = {
|
||||
// Bit-wise rotation left
|
||||
rotl: function(n, b) {
|
||||
return (n << b) | (n >>> (32 - b));
|
||||
},
|
||||
|
||||
// Bit-wise rotation right
|
||||
rotr: function(n, b) {
|
||||
return (n << (32 - b)) | (n >>> b);
|
||||
},
|
||||
|
||||
// Swap big-endian to little-endian and vice versa
|
||||
endian: function(n) {
|
||||
// If number given, swap endian
|
||||
if (n.constructor == Number) {
|
||||
return crypt.rotl(n, 8) & 0x00FF00FF | crypt.rotl(n, 24) & 0xFF00FF00;
|
||||
}
|
||||
|
||||
// Else, assume array and swap all items
|
||||
for (var i = 0; i < n.length; i++)
|
||||
n[i] = crypt.endian(n[i]);
|
||||
return n;
|
||||
},
|
||||
|
||||
// Generate an array of any length of random bytes
|
||||
randomBytes: function(n) {
|
||||
for (var bytes = []; n > 0; n--)
|
||||
bytes.push(Math.floor(Math.random() * 256));
|
||||
return bytes;
|
||||
},
|
||||
|
||||
// Convert a byte array to big-endian 32-bit words
|
||||
bytesToWords: function(bytes) {
|
||||
for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
|
||||
words[b >>> 5] |= bytes[i] << (24 - b % 32);
|
||||
return words;
|
||||
},
|
||||
|
||||
// Convert big-endian 32-bit words to a byte array
|
||||
wordsToBytes: function(words) {
|
||||
for (var bytes = [], b = 0; b < words.length * 32; b += 8)
|
||||
bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
|
||||
return bytes;
|
||||
},
|
||||
|
||||
// Convert a byte array to a hex string
|
||||
bytesToHex: function(bytes) {
|
||||
for (var hex = [], i = 0; i < bytes.length; i++) {
|
||||
hex.push((bytes[i] >>> 4).toString(16));
|
||||
hex.push((bytes[i] & 0xF).toString(16));
|
||||
}
|
||||
return hex.join('');
|
||||
},
|
||||
|
||||
// Convert a hex string to a byte array
|
||||
hexToBytes: function(hex) {
|
||||
for (var bytes = [], c = 0; c < hex.length; c += 2)
|
||||
bytes.push(parseInt(hex.substr(c, 2), 16));
|
||||
return bytes;
|
||||
},
|
||||
|
||||
// Convert a byte array to a base-64 string
|
||||
bytesToBase64: function(bytes) {
|
||||
for (var base64 = [], i = 0; i < bytes.length; i += 3) {
|
||||
var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
|
||||
for (var j = 0; j < 4; j++)
|
||||
if (i * 8 + j * 6 <= bytes.length * 8)
|
||||
base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));
|
||||
else
|
||||
base64.push('=');
|
||||
}
|
||||
return base64.join('');
|
||||
},
|
||||
|
||||
// Convert a base-64 string to a byte array
|
||||
base64ToBytes: function(base64) {
|
||||
// Remove non-base-64 characters
|
||||
base64 = base64.replace(/[^A-Z0-9+\/]/ig, '');
|
||||
|
||||
for (var bytes = [], i = 0, imod4 = 0; i < base64.length;
|
||||
imod4 = ++i % 4) {
|
||||
if (imod4 == 0) continue;
|
||||
bytes.push(((base64map.indexOf(base64.charAt(i - 1))
|
||||
& (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2))
|
||||
| (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = crypt;
|
||||
})();
|
||||
@@ -1,52 +0,0 @@
|
||||
{
|
||||
"author": {
|
||||
"name": "Paul Vorbach",
|
||||
"email": "paul@vorb.de",
|
||||
"url": "http://vorb.de"
|
||||
},
|
||||
"name": "crypt",
|
||||
"description": "utilities for encryption and hashing",
|
||||
"tags": [
|
||||
"hash",
|
||||
"security"
|
||||
],
|
||||
"version": "0.0.1",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/pvorb/node-crypt.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/pvorb/node-crypt/issues"
|
||||
},
|
||||
"main": "crypt.js",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
"_npmUser": {
|
||||
"name": "pvorb",
|
||||
"email": "paul@vorb.de"
|
||||
},
|
||||
"_id": "crypt@0.0.1",
|
||||
"dependencies": {},
|
||||
"devDependencies": {},
|
||||
"_engineSupported": true,
|
||||
"_npmVersion": "1.0.103",
|
||||
"_nodeVersion": "v0.4.12",
|
||||
"_defaultsLoaded": true,
|
||||
"dist": {
|
||||
"shasum": "5f11b21a6c05ef1b5e79708366da6374ece1e6a2",
|
||||
"tarball": "https://registry.npmjs.org/crypt/-/crypt-0.0.1.tgz"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "pvorb",
|
||||
"email": "paul@vorb.de"
|
||||
}
|
||||
],
|
||||
"directories": {},
|
||||
"_shasum": "5f11b21a6c05ef1b5e79708366da6374ece1e6a2",
|
||||
"_resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.1.tgz",
|
||||
"_from": "crypt@>=0.0.1 <0.1.0",
|
||||
"readme": "ERROR: No README data found!",
|
||||
"homepage": "https://github.com/pvorb/node-crypt#readme"
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 'iojs'
|
||||
env:
|
||||
global:
|
||||
- secure: du27W3wTgZ3G183axW7w0I01lOIurx8kilMH9p45VMfNXCu8lo6FLtLIQZxJ1FYMoJLQ1yfJTu2G0rq39SotDfJumsk6tF7BjTY/HKCocZaHqCMgw0W2bcylb5kMAdLhBNPlzejpPoWa1x1axbAHNFOLQNVosG/Bavu3/kuIIps=
|
||||
- secure: Ax/5aekM40o67NuTkvQqx1DhfP86ZlHTtKbv5yI+WFmbjD3FQM8b8G1J/o7doaBDev7Mp+1zDJOK2pFGtt+JGRl0lM2JUmLh6yh/b28obXyei5iuUkqzKJLfKZHMbY5QW/1i4DUM+zSXe6Kava0qnqYg5wBBnrF6gLdsVsCGNQk=
|
||||
@@ -1,16 +0,0 @@
|
||||
ui: tape
|
||||
browsers:
|
||||
- name: chrome
|
||||
version: 39..latest
|
||||
- name: firefox
|
||||
version: 34..latest
|
||||
- name: safari
|
||||
version: 5..latest
|
||||
- name: microsoftedge
|
||||
version: latest
|
||||
- name: ie
|
||||
version: 8..latest
|
||||
- name: opera
|
||||
version: 11..latest
|
||||
- name: android
|
||||
version: 5.0..latest
|
||||
@@ -1,21 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Feross Aboukhadijeh
|
||||
|
||||
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.
|
||||
@@ -1,49 +0,0 @@
|
||||
# is-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][npm-url]
|
||||
|
||||
#### Determine if an object is a [`Buffer`](http://nodejs.org/api/buffer.html) (incl. [browser Buffers](https://github.com/feross/buffer))
|
||||
|
||||
[![saucelabs][saucelabs-image]][saucelabs-url]
|
||||
|
||||
[travis-image]: https://img.shields.io/travis/feross/is-buffer/master.svg
|
||||
[travis-url]: https://travis-ci.org/feross/is-buffer
|
||||
[npm-image]: https://img.shields.io/npm/v/is-buffer.svg
|
||||
[npm-url]: https://npmjs.org/package/is-buffer
|
||||
[downloads-image]: https://img.shields.io/npm/dm/is-buffer.svg
|
||||
[saucelabs-image]: https://saucelabs.com/browser-matrix/is-buffer.svg
|
||||
[saucelabs-url]: https://saucelabs.com/u/is-buffer
|
||||
|
||||
## Why not use `Buffer.isBuffer`?
|
||||
|
||||
This module lets you check if an object is a `Buffer` without using `Buffer.isBuffer` (which includes the whole [buffer](https://github.com/feross/buffer) module in [browserify](http://browserify.org/)).
|
||||
|
||||
It's future-proof and works in node too!
|
||||
|
||||
## install
|
||||
|
||||
```bash
|
||||
npm install is-buffer
|
||||
```
|
||||
|
||||
## usage
|
||||
|
||||
```js
|
||||
var isBuffer = require('is-buffer')
|
||||
|
||||
isBuffer(new Buffer(4)) // true
|
||||
|
||||
isBuffer(undefined) // false
|
||||
isBuffer(null) // false
|
||||
isBuffer('') // false
|
||||
isBuffer(true) // false
|
||||
isBuffer(false) // false
|
||||
isBuffer(0) // false
|
||||
isBuffer(1) // false
|
||||
isBuffer(1.0) // false
|
||||
isBuffer('string') // false
|
||||
isBuffer({}) // false
|
||||
isBuffer(function foo () {}) // false
|
||||
```
|
||||
|
||||
## license
|
||||
|
||||
MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org).
|
||||
@@ -1,17 +0,0 @@
|
||||
/**
|
||||
* Determine if an object is Buffer
|
||||
*
|
||||
* Author: Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
|
||||
* License: MIT
|
||||
*
|
||||
* `npm install is-buffer`
|
||||
*/
|
||||
|
||||
module.exports = function (obj) {
|
||||
return !!(obj != null &&
|
||||
(obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor)
|
||||
(obj.constructor &&
|
||||
typeof obj.constructor.isBuffer === 'function' &&
|
||||
obj.constructor.isBuffer(obj))
|
||||
))
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
{
|
||||
"name": "is-buffer",
|
||||
"description": "Determine if an object is Buffer",
|
||||
"version": "1.1.3",
|
||||
"author": {
|
||||
"name": "Feross Aboukhadijeh",
|
||||
"email": "feross@feross.org",
|
||||
"url": "http://feross.org/"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/feross/is-buffer/issues"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"standard": "^6.0.5",
|
||||
"tape": "^4.0.0",
|
||||
"zuul": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.12"
|
||||
},
|
||||
"keywords": [
|
||||
"buffer",
|
||||
"buffers",
|
||||
"type",
|
||||
"core buffer",
|
||||
"browser buffer",
|
||||
"browserify",
|
||||
"typed array",
|
||||
"uint32array",
|
||||
"int16array",
|
||||
"int32array",
|
||||
"float32array",
|
||||
"float64array",
|
||||
"browser",
|
||||
"arraybuffer",
|
||||
"dataview"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/feross/is-buffer.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "standard && npm run test-node && npm run test-browser",
|
||||
"test-browser": "zuul -- test/*.js",
|
||||
"test-browser-local": "zuul --local -- test/*.js",
|
||||
"test-node": "tape test/*.js"
|
||||
},
|
||||
"testling": {
|
||||
"files": "test/*.js"
|
||||
},
|
||||
"gitHead": "dfd658d887e6b63254b89d22af1a755a39313455",
|
||||
"homepage": "https://github.com/feross/is-buffer",
|
||||
"_id": "is-buffer@1.1.3",
|
||||
"_shasum": "db897fc3f7aca2d50de94b6c8c2896a4771627af",
|
||||
"_from": "is-buffer@>=1.1.1 <1.2.0",
|
||||
"_npmVersion": "2.14.12",
|
||||
"_nodeVersion": "4.3.2",
|
||||
"_npmUser": {
|
||||
"name": "feross",
|
||||
"email": "feross@feross.org"
|
||||
},
|
||||
"dist": {
|
||||
"shasum": "db897fc3f7aca2d50de94b6c8c2896a4771627af",
|
||||
"tarball": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "feross",
|
||||
"email": "feross@feross.org"
|
||||
}
|
||||
],
|
||||
"_npmOperationalInternal": {
|
||||
"host": "packages-12-west.internal.npmjs.com",
|
||||
"tmp": "tmp/is-buffer-1.1.3.tgz_1457390977775_0.6384289276320487"
|
||||
},
|
||||
"directories": {},
|
||||
"_resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
var isBuffer = require('../')
|
||||
var test = require('tape')
|
||||
|
||||
test('is-buffer', function (t) {
|
||||
t.ok(isBuffer(new Buffer(4)), 'new Buffer(4)')
|
||||
|
||||
t.notOk(isBuffer(undefined), 'undefined')
|
||||
t.notOk(isBuffer(null), 'null')
|
||||
t.notOk(isBuffer(''), 'empty string')
|
||||
t.notOk(isBuffer(true), 'true')
|
||||
t.notOk(isBuffer(false), 'false')
|
||||
t.notOk(isBuffer(0), '0')
|
||||
t.notOk(isBuffer(1), '1')
|
||||
t.notOk(isBuffer(1.0), '1.0')
|
||||
t.notOk(isBuffer('string'), 'string')
|
||||
t.notOk(isBuffer({}), '{}')
|
||||
t.notOk(isBuffer(function foo () {}), 'function foo () {}')
|
||||
|
||||
t.end()
|
||||
})
|
||||
@@ -1,74 +0,0 @@
|
||||
{
|
||||
"name": "md5",
|
||||
"description": "js function for hashing messages with MD5",
|
||||
"version": "2.1.0",
|
||||
"author": {
|
||||
"name": "Paul Vorbach",
|
||||
"email": "paul@vorba.ch",
|
||||
"url": "http://paul.vorba.ch"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "salba"
|
||||
}
|
||||
],
|
||||
"tags": [
|
||||
"md5",
|
||||
"hash",
|
||||
"encryption",
|
||||
"message digest"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/pvorb/node-md5.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/pvorb/node-md5/issues"
|
||||
},
|
||||
"main": "md5.js",
|
||||
"scripts": {
|
||||
"test": "mocha"
|
||||
},
|
||||
"dependencies": {
|
||||
"charenc": "~0.0.1",
|
||||
"crypt": "~0.0.1",
|
||||
"is-buffer": "~1.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "~2.3.4"
|
||||
},
|
||||
"optionalDependencies": {},
|
||||
"license": "BSD-3-Clause",
|
||||
"gitHead": "017c1c64a1c538688500e114b91758fe8829cbe0",
|
||||
"homepage": "https://github.com/pvorb/node-md5#readme",
|
||||
"_id": "md5@2.1.0",
|
||||
"_shasum": "22ec92f33ac97a6ef4dc16c0f57fa46c01ed13bb",
|
||||
"_from": "md5@>=2.1.0 <3.0.0",
|
||||
"_npmVersion": "2.14.12",
|
||||
"_nodeVersion": "4.2.6",
|
||||
"_npmUser": {
|
||||
"name": "pvorb",
|
||||
"email": "paul@vorba.ch"
|
||||
},
|
||||
"dist": {
|
||||
"shasum": "22ec92f33ac97a6ef4dc16c0f57fa46c01ed13bb",
|
||||
"tarball": "https://registry.npmjs.org/md5/-/md5-2.1.0.tgz"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "coolaj86",
|
||||
"email": "coolaj86@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "pvorb",
|
||||
"email": "paul@vorba.ch"
|
||||
}
|
||||
],
|
||||
"_npmOperationalInternal": {
|
||||
"host": "packages-12-west.internal.npmjs.com",
|
||||
"tmp": "tmp/md5-2.1.0.tgz_1457478108340_0.010296016465872526"
|
||||
},
|
||||
"directories": {},
|
||||
"_resolved": "https://registry.npmjs.org/md5/-/md5-2.1.0.tgz",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
var md5 = require('./md5.js');
|
||||
var assert = require('assert');
|
||||
|
||||
describe('MD5', function () {
|
||||
it('should return the expected MD5 hash for "message"', function () {
|
||||
assert.equal('78e731027d8fd50ed642340b7c9a63b3', md5('message'));
|
||||
});
|
||||
|
||||
it('should not return the same hash for random numbers twice', function () {
|
||||
var msg1 = Math.floor((Math.random() * 100000) + 1) + (new Date).getTime();
|
||||
var msg2 = Math.floor((Math.random() * 100000) + 1) + (new Date).getTime();
|
||||
|
||||
if (msg1 !== msg2)
|
||||
assert.notEqual(md5(msg1), md5(msg2));
|
||||
else
|
||||
assert.equal(md5(msg1), md5(msg1));
|
||||
});
|
||||
|
||||
it('should support Node.js Buffers', function() {
|
||||
var buffer = new Buffer('message áßäöü', 'utf8');
|
||||
|
||||
assert.equal(md5(buffer), md5('message áßäöü'));
|
||||
})
|
||||
|
||||
it('should be able to use a binary encoded string', function () {
|
||||
var hash1 = md5('abc', { asString: true });
|
||||
var hash2 = md5(hash1 + 'a', { asString: true, encoding : 'binary' });
|
||||
var hash3 = md5(hash1 + 'a', { encoding : 'binary' });
|
||||
// console.log('hash1', hash1);
|
||||
// console.log('hash2', hash2);
|
||||
// console.log('hash3', hash3);
|
||||
assert.equal(hash3, '131f0ac52813044f5110e4aec638c169');
|
||||
});
|
||||
});
|
||||
@@ -1,2 +0,0 @@
|
||||
node_modules
|
||||
.idea
|
||||
@@ -1,8 +0,0 @@
|
||||
sudo: false
|
||||
language: node_js
|
||||
node_js:
|
||||
- node
|
||||
- "5"
|
||||
- "4"
|
||||
- "0.10"
|
||||
- "0.12"
|
||||
@@ -1,22 +0,0 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2011-2016 Dylan Greene <dylang@gmail.com>
|
||||
|
||||
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.
|
||||
@@ -1,81 +0,0 @@
|
||||
var xml = require('../lib/xml');
|
||||
|
||||
console.log('===== Example 1 ====');
|
||||
var example1 = { url: 'http://www.google.com/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower' };
|
||||
console.log(xml(example1));
|
||||
//<url>http://www.google.com/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower</url>
|
||||
|
||||
console.log('\n===== Example 2 ====');
|
||||
var example2 = [ { url: { _attr: { hostname: 'www.google.com', path: '/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower' } } } ];
|
||||
console.log(xml(example2));
|
||||
//<url hostname="www.google.com" path="/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower"/>
|
||||
|
||||
console.log('\n===== Example 3 ====');
|
||||
var example3 = [ { toys: [ { toy: 'Transformers' } , { toy: 'GI Joe' }, { toy: 'He-man' } ] } ];
|
||||
console.log(xml(example3));
|
||||
//<toys><toy>Transformers</toy><toy>GI Joe</toy><toy>He-man</toy></toys>
|
||||
console.log(xml(example3, { indent: true }));
|
||||
/*
|
||||
<toys>
|
||||
<toy>Transformers</toy>
|
||||
<toy>GI Joe</toy>
|
||||
<toy>He-man</toy>
|
||||
</toys>
|
||||
*/
|
||||
|
||||
console.log('\n===== Example 4 ====');
|
||||
var example4 = [ { toys: [ { _attr: { decade: '80s', locale: 'US'} }, { toy: 'Transformers' } , { toy: 'GI Joe' }, { toy: 'He-man' } ] } ];
|
||||
console.log(xml(example4, { indent: true }));
|
||||
/*
|
||||
<toys decade="80s" locale="US">
|
||||
<toy>Transformers</toy>
|
||||
<toy>GI Joe</toy>
|
||||
<toy>He-man</toy>
|
||||
</toys>
|
||||
*/
|
||||
|
||||
console.log('\n===== Example 5 ====');
|
||||
var example5 = [ { toys: [ { _attr: { decade: '80s', locale: 'US'} }, { toy: 'Transformers' } , { toy: [ { _attr: { knowing: 'half the battle' } }, 'GI Joe'] }, { toy: [ { name: 'He-man' }, { description: { _cdata: '<strong>Master of the Universe!</strong>'} } ] } ] } ];
|
||||
console.log(xml(example5, { indent: true, declaration: true }));
|
||||
/*
|
||||
<toys><toy>Transformers</toy><toy>GI Joe</toy><toy>He-man</toy></toys>
|
||||
<toys>
|
||||
<toy>Transformers</toy>
|
||||
<toy>GI Joe</toy>
|
||||
<toy>He-man</toy>
|
||||
</toys>
|
||||
<toys decade="80s" locale="US">
|
||||
<toy>Transformers</toy>
|
||||
<toy>GI Joe</toy>
|
||||
<toy>He-man</toy>
|
||||
</toys>
|
||||
<toys decade="80s" locale="US">
|
||||
<toy>Transformers</toy>
|
||||
<toy knowing="half the battle">
|
||||
GI Joe
|
||||
</toy>
|
||||
<toy>
|
||||
<name>He-man</name>
|
||||
<description><![CDATA[<strong>Master of the Universe!</strong>]]></description>
|
||||
</toy>
|
||||
</toys>
|
||||
*/
|
||||
|
||||
console.log('\n===== Example 6 ====');
|
||||
var elem = xml.Element({ _attr: { decade: '80s', locale: 'US'} });
|
||||
var xmlStream = xml({ toys: elem }, { indent: true } );
|
||||
xmlStream.on('data', function (chunk) {console.log("data:", chunk)});
|
||||
elem.push({ toy: 'Transformers' });
|
||||
elem.push({ toy: 'GI Joe' });
|
||||
elem.push({ toy: [{name:'He-man'}] });
|
||||
elem.close();
|
||||
|
||||
/*
|
||||
data: <toys decade="80s" locale="US">
|
||||
data: <toy>Transformers</toy>
|
||||
data: <toy>GI Joe</toy>
|
||||
data: <toy>
|
||||
<name>He-man</name>
|
||||
</toy>
|
||||
data: </toys>
|
||||
*/
|
||||
@@ -1,24 +0,0 @@
|
||||
var http = require('http'),
|
||||
XML = require('../lib/xml');
|
||||
|
||||
var server = http.createServer(function(req, res) {
|
||||
res.writeHead(200, {"Content-Type": "text/xml"});
|
||||
|
||||
var elem = XML.Element({ _attr: { decade: '80s', locale: 'US'} });
|
||||
var xml = XML({ toys: elem }, {indent:true, stream:true});
|
||||
|
||||
res.write('<?xml version="1.0" encoding="utf-8"?>\n');
|
||||
|
||||
xml.pipe(res);
|
||||
|
||||
process.nextTick(function () {
|
||||
elem.push({ toy: 'Transformers' });
|
||||
elem.push({ toy: 'GI Joe' });
|
||||
elem.push({ toy: [{name:'He-man'}] });
|
||||
elem.close();
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
server.listen(parseInt(process.env.PORT) || 3000);
|
||||
console.log("server listening on port %d …", server.address().port);
|
||||
@@ -1,18 +0,0 @@
|
||||
|
||||
var XML_CHARACTER_MAP = {
|
||||
'&': '&',
|
||||
'"': '"',
|
||||
"'": ''',
|
||||
'<': '<',
|
||||
'>': '>'
|
||||
};
|
||||
|
||||
function escapeForXML(string) {
|
||||
return string && string.replace
|
||||
? string.replace(/([&"<>'])/g, function(str, item) {
|
||||
return XML_CHARACTER_MAP[item];
|
||||
})
|
||||
: string;
|
||||
}
|
||||
|
||||
module.exports = escapeForXML;
|
||||
@@ -1,282 +0,0 @@
|
||||
var escapeForXML = require('./escapeForXML');
|
||||
var Stream = require('stream').Stream;
|
||||
|
||||
var DEFAULT_INDENT = ' ';
|
||||
|
||||
function xml(input, options) {
|
||||
|
||||
if (typeof options !== 'object') {
|
||||
options = {
|
||||
indent: options
|
||||
};
|
||||
}
|
||||
|
||||
var stream = options.stream ? new Stream() : null,
|
||||
output = "",
|
||||
interrupted = false,
|
||||
indent = !options.indent ? ''
|
||||
: options.indent === true ? DEFAULT_INDENT
|
||||
: options.indent,
|
||||
instant = true;
|
||||
|
||||
|
||||
function delay (func) {
|
||||
if (!instant) {
|
||||
func();
|
||||
} else {
|
||||
process.nextTick(func);
|
||||
}
|
||||
}
|
||||
|
||||
function append (interrupt, out) {
|
||||
if (out !== undefined) {
|
||||
output += out;
|
||||
}
|
||||
if (interrupt && !interrupted) {
|
||||
stream = stream || new Stream();
|
||||
interrupted = true;
|
||||
}
|
||||
if (interrupt && interrupted) {
|
||||
var data = output;
|
||||
delay(function () { stream.emit('data', data) });
|
||||
output = "";
|
||||
}
|
||||
}
|
||||
|
||||
function add (value, last) {
|
||||
format(append, resolve(value, indent, indent ? 1 : 0), last);
|
||||
}
|
||||
|
||||
function end() {
|
||||
if (stream) {
|
||||
var data = output;
|
||||
delay(function () {
|
||||
stream.emit('data', data);
|
||||
stream.emit('end');
|
||||
stream.readable = false;
|
||||
stream.emit('close');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function addXmlDeclaration(declaration) {
|
||||
var encoding = declaration.encoding || 'UTF-8',
|
||||
attr = { version: '1.0', encoding: encoding };
|
||||
|
||||
if (declaration.standalone) {
|
||||
attr.standalone = declaration.standalone
|
||||
}
|
||||
|
||||
add({'?xml': { _attr: attr } });
|
||||
output = output.replace('/>', '?>');
|
||||
}
|
||||
|
||||
// disable delay delayed
|
||||
delay(function () { instant = false });
|
||||
|
||||
if (options.declaration) {
|
||||
addXmlDeclaration(options.declaration);
|
||||
}
|
||||
|
||||
if (input && input.forEach) {
|
||||
input.forEach(function (value, i) {
|
||||
var last;
|
||||
if (i + 1 === input.length)
|
||||
last = end;
|
||||
add(value, last);
|
||||
});
|
||||
} else {
|
||||
add(input, end);
|
||||
}
|
||||
|
||||
if (stream) {
|
||||
stream.readable = true;
|
||||
return stream;
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
function element (/*input, …*/) {
|
||||
var input = Array.prototype.slice.call(arguments),
|
||||
self = {
|
||||
_elem: resolve(input)
|
||||
};
|
||||
|
||||
self.push = function (input) {
|
||||
if (!this.append) {
|
||||
throw new Error("not assigned to a parent!");
|
||||
}
|
||||
var that = this;
|
||||
var indent = this._elem.indent;
|
||||
format(this.append, resolve(
|
||||
input, indent, this._elem.icount + (indent ? 1 : 0)),
|
||||
function () { that.append(true) });
|
||||
};
|
||||
|
||||
self.close = function (input) {
|
||||
if (input !== undefined) {
|
||||
this.push(input);
|
||||
}
|
||||
if (this.end) {
|
||||
this.end();
|
||||
}
|
||||
};
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
function create_indent(character, count) {
|
||||
return (new Array(count || 0).join(character || ''))
|
||||
}
|
||||
|
||||
function resolve(data, indent, indent_count) {
|
||||
indent_count = indent_count || 0;
|
||||
var indent_spaces = create_indent(indent, indent_count);
|
||||
var name;
|
||||
var values = data;
|
||||
var interrupt = false;
|
||||
|
||||
if (typeof data === 'object') {
|
||||
var keys = Object.keys(data);
|
||||
name = keys[0];
|
||||
values = data[name];
|
||||
|
||||
if (values && values._elem) {
|
||||
values._elem.name = name;
|
||||
values._elem.icount = indent_count;
|
||||
values._elem.indent = indent;
|
||||
values._elem.indents = indent_spaces;
|
||||
values._elem.interrupt = values;
|
||||
return values._elem;
|
||||
}
|
||||
}
|
||||
|
||||
var attributes = [],
|
||||
content = [];
|
||||
|
||||
var isStringContent;
|
||||
|
||||
function get_attributes(obj){
|
||||
var keys = Object.keys(obj);
|
||||
keys.forEach(function(key){
|
||||
attributes.push(attribute(key, obj[key]));
|
||||
});
|
||||
}
|
||||
|
||||
switch(typeof values) {
|
||||
case 'object':
|
||||
if (values === null) break;
|
||||
|
||||
if (values._attr) {
|
||||
get_attributes(values._attr);
|
||||
}
|
||||
|
||||
if (values._cdata) {
|
||||
content.push(
|
||||
('<![CDATA[' + values._cdata).replace(/\]\]>/g, ']]]]><![CDATA[>') + ']]>'
|
||||
);
|
||||
}
|
||||
|
||||
if (values.forEach) {
|
||||
isStringContent = false;
|
||||
content.push('');
|
||||
values.forEach(function(value) {
|
||||
if (typeof value == 'object') {
|
||||
var _name = Object.keys(value)[0];
|
||||
|
||||
if (_name == '_attr') {
|
||||
get_attributes(value._attr);
|
||||
} else {
|
||||
content.push(resolve(
|
||||
value, indent, indent_count + 1));
|
||||
}
|
||||
} else {
|
||||
//string
|
||||
content.pop();
|
||||
isStringContent=true;
|
||||
content.push(escapeForXML(value));
|
||||
}
|
||||
|
||||
});
|
||||
if (!isStringContent) {
|
||||
content.push('');
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
//string
|
||||
content.push(escapeForXML(values));
|
||||
|
||||
}
|
||||
|
||||
return {
|
||||
name: name,
|
||||
interrupt: interrupt,
|
||||
attributes: attributes,
|
||||
content: content,
|
||||
icount: indent_count,
|
||||
indents: indent_spaces,
|
||||
indent: indent
|
||||
};
|
||||
}
|
||||
|
||||
function format(append, elem, end) {
|
||||
|
||||
if (typeof elem != 'object') {
|
||||
return append(false, elem);
|
||||
}
|
||||
|
||||
var len = elem.interrupt ? 1 : elem.content.length;
|
||||
|
||||
function proceed () {
|
||||
while (elem.content.length) {
|
||||
var value = elem.content.shift();
|
||||
|
||||
if (value === undefined) continue;
|
||||
if (interrupt(value)) return;
|
||||
|
||||
format(append, value);
|
||||
}
|
||||
|
||||
append(false, (len > 1 ? elem.indents : '')
|
||||
+ (elem.name ? '</' + elem.name + '>' : '')
|
||||
+ (elem.indent && !end ? '\n' : ''));
|
||||
|
||||
if (end) {
|
||||
end();
|
||||
}
|
||||
}
|
||||
|
||||
function interrupt(value) {
|
||||
if (value.interrupt) {
|
||||
value.interrupt.append = append;
|
||||
value.interrupt.end = proceed;
|
||||
value.interrupt = false;
|
||||
append(true);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
append(false, elem.indents
|
||||
+ (elem.name ? '<' + elem.name : '')
|
||||
+ (elem.attributes.length ? ' ' + elem.attributes.join(' ') : '')
|
||||
+ (len ? (elem.name ? '>' : '') : (elem.name ? '/>' : ''))
|
||||
+ (elem.indent && len > 1 ? '\n' : ''));
|
||||
|
||||
if (!len) {
|
||||
return append(false, elem.indent ? '\n' : '');
|
||||
}
|
||||
|
||||
if (!interrupt(elem)) {
|
||||
proceed();
|
||||
}
|
||||
}
|
||||
|
||||
function attribute(key, value) {
|
||||
return key + '=' + '"' + escapeForXML(value) + '"';
|
||||
}
|
||||
|
||||
module.exports = xml;
|
||||
module.exports.element = module.exports.Element = element;
|
||||
@@ -1,86 +0,0 @@
|
||||
{
|
||||
"name": "xml",
|
||||
"version": "1.0.1",
|
||||
"description": "Fast and simple xml generator. Supports attributes, CDATA, etc. Includes tests and examples.",
|
||||
"homepage": "http://github.com/dylang/node-xml",
|
||||
"keywords": [
|
||||
"xml",
|
||||
"create",
|
||||
"builder",
|
||||
"json",
|
||||
"simple"
|
||||
],
|
||||
"author": {
|
||||
"name": "Dylan Greene",
|
||||
"url": "https://github.com/dylang"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Dylan Greene",
|
||||
"url": "https://github.com/dylang"
|
||||
},
|
||||
{
|
||||
"name": "Dodo",
|
||||
"url": "https://github.com/dodo"
|
||||
},
|
||||
{
|
||||
"name": "Felix Geisendrfer",
|
||||
"url": "felix@debuggable.com"
|
||||
},
|
||||
{
|
||||
"name": "Mithgol"
|
||||
},
|
||||
{
|
||||
"name": "carolineBda",
|
||||
"url": "https://github.com/carolineBda"
|
||||
},
|
||||
{
|
||||
"name": "Eric Vantillard https://github.com/evantill"
|
||||
},
|
||||
{
|
||||
"name": "Sean Dwyer https://github.com/reywood"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@github.com/dylang/node-xml.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "http://github.com/dylang/node-xml/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ava": "^0.11.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "ava"
|
||||
},
|
||||
"main": "lib/xml.js",
|
||||
"license": "MIT",
|
||||
"gitHead": "c03b84bc1da9251f04db65428c8c341e51d0ff72",
|
||||
"_id": "xml@1.0.1",
|
||||
"_shasum": "78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5",
|
||||
"_from": "xml@>=1.0.0 <2.0.0",
|
||||
"_npmVersion": "2.14.16",
|
||||
"_nodeVersion": "4.2.1",
|
||||
"_npmUser": {
|
||||
"name": "dylang",
|
||||
"email": "dylang@gmail.com"
|
||||
},
|
||||
"dist": {
|
||||
"shasum": "78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5",
|
||||
"tarball": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "dylang",
|
||||
"email": "dylang@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "erisds",
|
||||
"email": "erisds@gmail.com"
|
||||
}
|
||||
],
|
||||
"directories": {},
|
||||
"_resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
@@ -1,184 +0,0 @@
|
||||
# xml [](http://travis-ci.org/dylang/node-xml)
|
||||
|
||||
[](https://nodei.co/npm/xml/)
|
||||
|
||||
> Fast and simple Javascript-based XML generator/builder for Node projects.
|
||||
|
||||
## Install
|
||||
|
||||
$ npm install xml
|
||||
|
||||
## API
|
||||
|
||||
### `xml(xmlObject, options)`
|
||||
|
||||
Returns a `XML` string.
|
||||
|
||||
```js
|
||||
var xml = require('xml');
|
||||
var xmlString = xml(xmlObject, options);
|
||||
```
|
||||
|
||||
#### `xmlObject`
|
||||
|
||||
`xmlObject` is a normal JavaScript Object/JSON object that defines the data for the XML string.
|
||||
|
||||
Keys will become tag names.
|
||||
Values can be an `array of xmlObjects` or a value such as a `string` or `number`.
|
||||
|
||||
```js
|
||||
xml({a: 1}) === '<a>1</a>'
|
||||
xml({nested: [{ keys: [{ fun: 'hi' }]}]}) === '<nested><keys><fun>hi</fun></keys></nested>'
|
||||
```
|
||||
|
||||
There are two special keys:
|
||||
|
||||
`_attr`
|
||||
|
||||
Set attributes using a hash of key/value pairs.
|
||||
|
||||
```js
|
||||
xml({a: [{ _attr: { attributes: 'are fun', too: '!' }}, 1]}) === '<a attributes="are fun" too="!">1</a>'
|
||||
````
|
||||
`_cdata`
|
||||
|
||||
Value of `_cdata` is wrapped in xml `![CDATA[]]` so the data does not need to be escaped.
|
||||
|
||||
```js
|
||||
xml({a: { _cdata: "i'm not escaped: <xml>!"}}) === '<a><![CDATA[i\'m not escaped: <xml>!]]></a>'
|
||||
```
|
||||
|
||||
Mixed together:
|
||||
```js
|
||||
xml({a: { _attr: { attr:'hi'}, _cdata: "I'm not escaped" }}) === '<a attr="hi"><![CDATA[I\'m not escaped]]></a>'
|
||||
```
|
||||
|
||||
#### `options`
|
||||
|
||||
`indent` _optional_ **string** What to use as a tab. Defaults to no tabs (compressed).
|
||||
For example you can use `'\t'` for tab character, or `' '` for two-space tabs.
|
||||
|
||||
`stream` Return the result as a `stream`.
|
||||
|
||||
**Stream Example**
|
||||
|
||||
```js
|
||||
var elem = xml.element({ _attr: { decade: '80s', locale: 'US'} });
|
||||
var stream = xml({ toys: elem }, { stream: true });
|
||||
stream.on('data', function (chunk) {console.log("data:", chunk)});
|
||||
elem.push({ toy: 'Transformers' });
|
||||
elem.push({ toy: 'GI Joe' });
|
||||
elem.push({ toy: [{name:'He-man'}] });
|
||||
elem.close();
|
||||
|
||||
/*
|
||||
result:
|
||||
data: <toys decade="80s" locale="US">
|
||||
data: <toy>Transformers</toy>
|
||||
data: <toy>GI Joe</toy>
|
||||
data: <toy>
|
||||
<name>He-man</name>
|
||||
</toy>
|
||||
data: </toys>
|
||||
*/
|
||||
```
|
||||
|
||||
`Declaration` _optional_ Add default xml declaration as first node.
|
||||
|
||||
_options_ are:
|
||||
* encoding: 'value'
|
||||
* standalone: 'value'
|
||||
|
||||
**Declaration Example**
|
||||
|
||||
```js
|
||||
xml([ { a: 'test' }], { declaration: true })
|
||||
//result: '<?xml version="1.0" encoding="UTF-8"?><a>test</a>'
|
||||
|
||||
xml([ { a: 'test' }], { declaration: { standalone: 'yes', encoding: 'UTF-16' }})
|
||||
//result: '<?xml version="1.0" encoding="UTF-16" standalone="yes"?><a>test</a>'
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
**Simple Example**
|
||||
|
||||
```js
|
||||
var example1 = [ { url: 'http://www.google.com/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower' } ];
|
||||
console.log(XML(example1));
|
||||
//<url>http://www.google.com/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower</url>
|
||||
```
|
||||
|
||||
**Example with attributes**
|
||||
|
||||
```js
|
||||
var example2 = [ { url: { _attr: { hostname: 'www.google.com', path: '/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower' } } } ];
|
||||
console.log(XML(example2));
|
||||
//result: <url hostname="www.google.com" path="/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower"/>
|
||||
```
|
||||
|
||||
**Example with array of same-named elements and nice formatting**
|
||||
|
||||
```js
|
||||
var example3 = [ { toys: [ { toy: 'Transformers' } , { toy: 'GI Joe' }, { toy: 'He-man' } ] } ];
|
||||
console.log(XML(example3));
|
||||
//result: <toys><toy>Transformers</toy><toy>GI Joe</toy><toy>He-man</toy></toys>
|
||||
console.log(XML(example3, true));
|
||||
/*
|
||||
result:
|
||||
<toys>
|
||||
<toy>Transformers</toy>
|
||||
<toy>GI Joe</toy>
|
||||
<toy>He-man</toy>
|
||||
</toys>
|
||||
*/
|
||||
```
|
||||
|
||||
**More complex example**
|
||||
|
||||
```js
|
||||
var example4 = [ { toys: [ { _attr: { decade: '80s', locale: 'US'} }, { toy: 'Transformers' } , { toy: 'GI Joe' }, { toy: 'He-man' } ] } ];
|
||||
console.log(XML(example4, true));
|
||||
/*
|
||||
result:
|
||||
<toys decade="80s" locale="US">
|
||||
<toy>Transformers</toy>
|
||||
<toy>GI Joe</toy>
|
||||
<toy>He-man</toy>
|
||||
</toys>
|
||||
*/
|
||||
```
|
||||
|
||||
**Even more complex example**
|
||||
|
||||
```js
|
||||
var example5 = [ { toys: [ { _attr: { decade: '80s', locale: 'US'} }, { toy: 'Transformers' } , { toy: [ { _attr: { knowing: 'half the battle' } }, 'GI Joe'] }, { toy: [ { name: 'He-man' }, { description: { _cdata: '<strong>Master of the Universe!</strong>'} } ] } ] } ];
|
||||
console.log(XML(example5, true));
|
||||
/*
|
||||
result:
|
||||
<toys decade="80s" locale="US">
|
||||
<toy>Transformers</toy>
|
||||
<toy knowing="half the battle">
|
||||
GI Joe
|
||||
</toy>
|
||||
<toy>
|
||||
<name>He-man</name>
|
||||
<description><![CDATA[<strong>Master of the Universe!</strong>]]></description>
|
||||
</toy>
|
||||
</toys>
|
||||
*/
|
||||
```
|
||||
|
||||
## Tests
|
||||
|
||||
Tests included use [AVA](https://ava.li). Use `npm test` to run the tests.
|
||||
|
||||
$ npm test
|
||||
|
||||
## Examples
|
||||
|
||||
There are examples in the examples directory.
|
||||
|
||||
# Contributing
|
||||
|
||||
Contributions to the project are welcome. Feel free to fork and improve. I accept pull requests when tests are included.
|
||||
@@ -1,150 +0,0 @@
|
||||
import test from 'ava';
|
||||
import xml from '../lib/xml';
|
||||
|
||||
test('no elements', t => {
|
||||
t.is(xml(), '');
|
||||
t.is(xml([]), '');
|
||||
t.is(xml('test'), 'test');
|
||||
t.is(xml('scotch & whisky'), 'scotch & whisky');
|
||||
t.is(xml('bob\'s escape character'), 'bob's escape character');
|
||||
});
|
||||
|
||||
test('simple options', t => {
|
||||
t.is(xml([{a: {}}]), '<a/>');
|
||||
t.is(xml([{a: null}]), '<a/>');
|
||||
t.is(xml([{a: []}]), '<a></a>');
|
||||
t.is(xml([{a: -1}]), '<a>-1</a>');
|
||||
t.is(xml([{a: false}]), '<a>false</a>');
|
||||
t.is(xml([{a: 'test'}]), '<a>test</a>');
|
||||
t.is(xml({a: {}}), '<a/>');
|
||||
t.is(xml({a: null}), '<a/>');
|
||||
t.is(xml({a: []}), '<a></a>');
|
||||
t.is(xml({a: -1}), '<a>-1</a>');
|
||||
t.is(xml({a: false}), '<a>false</a>');
|
||||
t.is(xml({a: 'test'}), '<a>test</a>');
|
||||
t.is(xml([{a: 'test'}, {b: 123}, {c: -0.5}]), '<a>test</a><b>123</b><c>-0.5</c>');
|
||||
});
|
||||
|
||||
test('deeply nested objects', t => {
|
||||
t.is(xml([{a: [{b: [{c: 1}, {c: 2}, {c: 3}]}]}]), '<a><b><c>1</c><c>2</c><c>3</c></b></a>');
|
||||
});
|
||||
|
||||
test('indents property', t => {
|
||||
t.is(xml([{a: [{b: [{c: 1}, {c: 2}, {c: 3}]}]}], true), '<a>\n <b>\n <c>1</c>\n <c>2</c>\n <c>3</c>\n </b>\n</a>');
|
||||
t.is(xml([{a: [{b: [{c: 1}, {c: 2}, {c: 3}]}]}], ' '), '<a>\n <b>\n <c>1</c>\n <c>2</c>\n <c>3</c>\n </b>\n</a>');
|
||||
t.is(xml([{a: [{b: [{c: 1}, {c: 2}, {c: 3}]}]}], '\t'), '<a>\n\t<b>\n\t\t<c>1</c>\n\t\t<c>2</c>\n\t\t<c>3</c>\n\t</b>\n</a>');
|
||||
t.is(xml({guid: [{_attr: {premalink: true}}, 'content']}, true), '<guid premalink="true">content</guid>');
|
||||
});
|
||||
|
||||
test('supports xml attributes', t => {
|
||||
t.is(xml([{b: {_attr: {}}}]), '<b/>');
|
||||
t.is(xml([{
|
||||
a: {
|
||||
_attr: {
|
||||
attribute1: 'some value',
|
||||
attribute2: 12345
|
||||
}
|
||||
}
|
||||
}]), '<a attribute1="some value" attribute2="12345"/>');
|
||||
t.is(xml([{
|
||||
a: [{
|
||||
_attr: {
|
||||
attribute1: 'some value',
|
||||
attribute2: 12345
|
||||
}
|
||||
}]
|
||||
}]), '<a attribute1="some value" attribute2="12345"></a>');
|
||||
t.is(xml([{
|
||||
a: [{
|
||||
_attr: {
|
||||
attribute1: 'some value',
|
||||
attribute2: 12345
|
||||
}
|
||||
}, 'content']
|
||||
}]), '<a attribute1="some value" attribute2="12345">content</a>');
|
||||
});
|
||||
|
||||
test('supports cdata', t => {
|
||||
t.is(xml([{a: {_cdata: 'This is some <strong>CDATA</strong>'}}]), '<a><![CDATA[This is some <strong>CDATA</strong>]]></a>');
|
||||
t.is(xml([{
|
||||
a: {
|
||||
_attr: {attribute1: 'some value', attribute2: 12345},
|
||||
_cdata: 'This is some <strong>CDATA</strong>'
|
||||
}
|
||||
}]), '<a attribute1="some value" attribute2="12345"><![CDATA[This is some <strong>CDATA</strong>]]></a>');
|
||||
t.is(xml([{a: {_cdata: 'This is some <strong>CDATA</strong> with ]]> and then again ]]>'}}]), '<a><![CDATA[This is some <strong>CDATA</strong> with ]]]]><![CDATA[> and then again ]]]]><![CDATA[>]]></a>');
|
||||
});
|
||||
|
||||
test('supports encoding', t => {
|
||||
t.is(xml([{
|
||||
a: [{
|
||||
_attr: {
|
||||
anglebrackets: 'this is <strong>strong</strong>',
|
||||
url: 'http://google.com?s=opower&y=fun'
|
||||
}
|
||||
}, 'text']
|
||||
}]), '<a anglebrackets="this is <strong>strong</strong>" url="http://google.com?s=opower&y=fun">text</a>');
|
||||
});
|
||||
|
||||
test('supports stream interface', t => {
|
||||
const elem = xml.element({_attr: {decade: '80s', locale: 'US'}});
|
||||
const xmlStream = xml({toys: elem}, {stream: true});
|
||||
const results = ['<toys decade="80s" locale="US">', '<toy>Transformers</toy>', '<toy><name>He-man</name></toy>', '<toy>GI Joe</toy>', '</toys>'];
|
||||
|
||||
elem.push({toy: 'Transformers'});
|
||||
elem.push({toy: [{name: 'He-man'}]});
|
||||
elem.push({toy: 'GI Joe'});
|
||||
elem.close();
|
||||
|
||||
xmlStream.on('data', stanza => {
|
||||
t.is(stanza, results.shift());
|
||||
});
|
||||
|
||||
return new Promise( (resolve, reject) => {
|
||||
xmlStream.on('close', () => {
|
||||
t.same(results, []);
|
||||
resolve();
|
||||
});
|
||||
xmlStream.on('error', reject);
|
||||
});
|
||||
});
|
||||
|
||||
test('streams end properly', t => {
|
||||
const elem = xml.element({ _attr: { decade: '80s', locale: 'US'} });
|
||||
const xmlStream = xml({ toys: elem }, { stream: true });
|
||||
|
||||
let gotData;
|
||||
|
||||
t.plan(7);
|
||||
|
||||
elem.push({ toy: 'Transformers' });
|
||||
elem.push({ toy: 'GI Joe' });
|
||||
elem.push({ toy: [{name:'He-man'}] });
|
||||
elem.close();
|
||||
|
||||
xmlStream.on('data', data => {
|
||||
t.ok(data);
|
||||
gotData = true;
|
||||
});
|
||||
|
||||
xmlStream.on('end', () => {
|
||||
t.ok(gotData);
|
||||
});
|
||||
|
||||
return new Promise( (resolve, reject) => {
|
||||
xmlStream.on('close', () => {
|
||||
t.ok(gotData);
|
||||
resolve();
|
||||
});
|
||||
xmlStream.on('error', reject);
|
||||
});
|
||||
});
|
||||
|
||||
test('xml declaration options', t => {
|
||||
t.is(xml([{a: 'test'}], {declaration: true}), '<?xml version="1.0" encoding="UTF-8"?><a>test</a>');
|
||||
t.is(xml([{a: 'test'}], {declaration: {encoding: 'foo'}}), '<?xml version="1.0" encoding="foo"?><a>test</a>');
|
||||
t.is(xml([{a: 'test'}], {declaration: {standalone: 'yes'}}), '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><a>test</a>');
|
||||
t.is(xml([{a: 'test'}], {declaration: false}), '<a>test</a>');
|
||||
t.is(xml([{a: 'test'}], {declaration: true, indent: '\n'}), '<?xml version="1.0" encoding="UTF-8"?>\n<a>test</a>');
|
||||
t.is(xml([{a: 'test'}], {}), '<a>test</a>');
|
||||
});
|
||||
@@ -1,74 +0,0 @@
|
||||
{
|
||||
"name": "mocha-junit-reporter",
|
||||
"version": "1.11.1",
|
||||
"description": "A JUnit reporter for mocha.",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "MOCHA_FILE=test/mocha.xml node_modules/.bin/mocha test --reporter=spec",
|
||||
"tdd": "MOCHA_FILE=test/mocha.xml node_modules/.bin/mocha test --reporter=min --watch"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/michaelleeallen/mocha-junit-reporter.git"
|
||||
},
|
||||
"keywords": [
|
||||
"mocha",
|
||||
"junit",
|
||||
"reporter"
|
||||
],
|
||||
"author": {
|
||||
"name": "Michael Allen",
|
||||
"email": "michael.lee.allen@gmail.com"
|
||||
},
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"chai": "^3.0.0",
|
||||
"chai-xml": "^0.3.0",
|
||||
"test-console": "^1.0.0",
|
||||
"mocha": "^2.2.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": "^2.2.0",
|
||||
"md5": "^2.1.0",
|
||||
"mkdirp": "~0.5.1",
|
||||
"xml": "^1.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"mocha": "^2.2.5"
|
||||
},
|
||||
"gitHead": "f603dbab66b3119fb8230017818b4efc713324a7",
|
||||
"bugs": {
|
||||
"url": "https://github.com/michaelleeallen/mocha-junit-reporter/issues"
|
||||
},
|
||||
"homepage": "https://github.com/michaelleeallen/mocha-junit-reporter#readme",
|
||||
"_id": "mocha-junit-reporter@1.11.1",
|
||||
"_shasum": "8c00dfa871cee9075d04256add20150aecf9e19d",
|
||||
"_from": "mocha-junit-reporter@latest",
|
||||
"_npmVersion": "2.15.0",
|
||||
"_nodeVersion": "0.12.13",
|
||||
"_npmUser": {
|
||||
"name": "mrmichael",
|
||||
"email": "michael.lee.allen@gmail.com"
|
||||
},
|
||||
"dist": {
|
||||
"shasum": "8c00dfa871cee9075d04256add20150aecf9e19d",
|
||||
"tarball": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.11.1.tgz"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "clayreimann",
|
||||
"email": "clayreimann@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "mrmichael",
|
||||
"email": "michael.lee.allen@gmail.com"
|
||||
}
|
||||
],
|
||||
"_npmOperationalInternal": {
|
||||
"host": "packages-16-east.internal.npmjs.com",
|
||||
"tmp": "tmp/mocha-junit-reporter-1.11.1.tgz_1460758240184_0.6418572135735303"
|
||||
},
|
||||
"directories": {},
|
||||
"_resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.11.1.tgz",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
var util = require('util');
|
||||
|
||||
// mock test runner
|
||||
function Runner() {
|
||||
Runner.super_.call(this);
|
||||
}
|
||||
|
||||
util.inherits(Runner, EventEmitter);
|
||||
|
||||
Runner.prototype.start = function() {
|
||||
this.emit('start');
|
||||
};
|
||||
|
||||
Runner.prototype.end = function() {
|
||||
this.emit('end');
|
||||
};
|
||||
|
||||
Runner.prototype.startSuite = function(suite) {
|
||||
suite.suites = suite.suites || [];
|
||||
suite.tests = suite.tests || [];
|
||||
|
||||
if (this._currentSuite) {
|
||||
suite.parent = this._currentSuite;
|
||||
}
|
||||
|
||||
this._currentSuite = suite;
|
||||
this.emit('suite', suite);
|
||||
};
|
||||
|
||||
Runner.prototype.pass = function(test) {
|
||||
this.emit('pass', test);
|
||||
this.endTest();
|
||||
};
|
||||
|
||||
Runner.prototype.fail = function(test, reason) {
|
||||
this.emit('fail', test, reason);
|
||||
this.endTest();
|
||||
};
|
||||
|
||||
Runner.prototype.pending = function(test) {
|
||||
this.emit('pending', test);
|
||||
this.endTest();
|
||||
};
|
||||
|
||||
Runner.prototype.endTest = function() {
|
||||
this.emit('end test');
|
||||
};
|
||||
|
||||
module.exports = Runner;
|
||||
@@ -1,12 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
function Test(fullTitle, title, duration) {
|
||||
return {
|
||||
title: title,
|
||||
duration: duration,
|
||||
fullTitle: function() { return fullTitle; },
|
||||
slow: function() {}
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = Test
|
||||
@@ -1,303 +0,0 @@
|
||||
'use-strict';
|
||||
|
||||
var Reporter = require('../index');
|
||||
var Runner = require('./helpers/mock-runner');
|
||||
var Test = require('./helpers/mock-test');
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
var chai = require('chai');
|
||||
var expect = chai.expect;
|
||||
var chaiXML = require('chai-xml');
|
||||
var mockXml = require('./mock-results');
|
||||
var testConsole = require('test-console');
|
||||
|
||||
var debug = require('debug')('mocha-junit-reporter:tests');
|
||||
|
||||
chai.use(chaiXML);
|
||||
|
||||
describe('mocha-junit-reporter', function() {
|
||||
var runner;
|
||||
var filePath;
|
||||
var MOCHA_FILE;
|
||||
|
||||
function executeTestRunner(options) {
|
||||
options = options || {};
|
||||
options.invalidChar = options.invalidChar || '';
|
||||
options.title = options.title || 'Foo Bar module';
|
||||
options.root = (typeof options.root !== 'undefined') ? options.root : false;
|
||||
runner.start();
|
||||
|
||||
runner.startSuite({
|
||||
title: options.title,
|
||||
root: options.root,
|
||||
tests: [1, 2]
|
||||
});
|
||||
|
||||
if (!options.skipPassedTests) {
|
||||
runner.pass(new Test('Foo can weez the juice', 'can weez the juice', 1));
|
||||
}
|
||||
|
||||
runner.fail(new Test('Bar can narfle the garthog', 'can narfle the garthog', 1), {
|
||||
stack: options.invalidChar + 'expected garthog to be dead' + options.invalidChar
|
||||
});
|
||||
|
||||
runner.startSuite({
|
||||
title: 'Another suite!',
|
||||
tests: [1]
|
||||
});
|
||||
runner.pass(new Test('Another suite', 'works', 4));
|
||||
|
||||
if (options && options.includePending) {
|
||||
runner.startSuite({
|
||||
title: 'Pending suite!',
|
||||
tests: [1]
|
||||
});
|
||||
runner.pending(new Test('Pending suite', 'pending'));
|
||||
}
|
||||
|
||||
runner.end();
|
||||
}
|
||||
|
||||
function verifyMochaFile(path, options) {
|
||||
var now = (new Date()).toISOString();
|
||||
debug('verify', now);
|
||||
var output = fs.readFileSync(path, 'utf-8');
|
||||
expect(output).xml.to.be.valid();
|
||||
expect(output).xml.to.equal(mockXml(runner.stats, options));
|
||||
fs.unlinkSync(path);
|
||||
debug('done', now);
|
||||
}
|
||||
|
||||
function removeTestPath() {
|
||||
var testPath = '/subdir/foo/mocha.xml';
|
||||
var parts = testPath.slice(1).split('/');
|
||||
|
||||
parts.reduce(function(testPath) {
|
||||
if (fs.existsSync(__dirname + testPath)) {
|
||||
var removeFile = testPath.indexOf('.') === -1 ? 'rmdirSync' : 'unlinkSync';
|
||||
fs[removeFile](__dirname + testPath);
|
||||
}
|
||||
|
||||
return path.dirname(testPath);
|
||||
}, testPath);
|
||||
}
|
||||
|
||||
function createReporter(options) {
|
||||
options = options || {};
|
||||
filePath = path.join(path.dirname(__dirname), options.mochaFile || '');
|
||||
|
||||
return new Reporter(runner, { reporterOptions: options });
|
||||
}
|
||||
|
||||
function getFileNameWithHash(path) {
|
||||
var filenames = fs.readdirSync(path);
|
||||
var expected = /(^results\.)([a-f0-9]{32})(\.xml)$/i;
|
||||
|
||||
for (var i = 0; i < filenames.length; i++) {
|
||||
if (expected.test(filenames[i])) {
|
||||
return filenames[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
before(function() {
|
||||
// cache this
|
||||
MOCHA_FILE = process.env.MOCHA_FILE;
|
||||
});
|
||||
|
||||
after(function() {
|
||||
// reset this
|
||||
process.env.MOCHA_FILE = MOCHA_FILE;
|
||||
});
|
||||
|
||||
beforeEach(function() {
|
||||
runner = new Runner();
|
||||
filePath = undefined;
|
||||
delete process.env.MOCHA_FILE;
|
||||
delete process.env.PROPERTIES;
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
debug('after');
|
||||
});
|
||||
|
||||
it('can produce a JUnit XML report', function() {
|
||||
createReporter({mochaFile: 'test/mocha.xml'});
|
||||
executeTestRunner();
|
||||
|
||||
verifyMochaFile(filePath);
|
||||
});
|
||||
|
||||
it('respects `process.env.MOCHA_FILE`', function() {
|
||||
process.env.MOCHA_FILE = 'test/results.xml';
|
||||
createReporter();
|
||||
executeTestRunner();
|
||||
|
||||
verifyMochaFile(process.env.MOCHA_FILE);
|
||||
});
|
||||
|
||||
it('respects `process.env.PROPERTIES`', function() {
|
||||
process.env.PROPERTIES = 'CUSTOM_PROPERTY:ABC~123';
|
||||
createReporter({mochaFile: 'test/properties.xml'});
|
||||
executeTestRunner();
|
||||
verifyMochaFile(filePath, {
|
||||
properties: [
|
||||
{
|
||||
name: 'CUSTOM_PROPERTY',
|
||||
value: 'ABC~123'
|
||||
}
|
||||
]
|
||||
});
|
||||
});
|
||||
|
||||
it('respects `--reporter-options mochaFile=`', function() {
|
||||
createReporter({mochaFile: 'test/results.xml'});
|
||||
executeTestRunner();
|
||||
|
||||
verifyMochaFile(filePath);
|
||||
});
|
||||
|
||||
it('respects `[hash]` pattern in test results report filename', function() {
|
||||
var dir = 'test/';
|
||||
var path = dir + 'results.[hash].xml';
|
||||
createReporter({mochaFile: path});
|
||||
executeTestRunner();
|
||||
verifyMochaFile(dir + getFileNameWithHash(dir));
|
||||
});
|
||||
|
||||
it('will create intermediate directories', function() {
|
||||
createReporter({mochaFile: 'test/subdir/foo/mocha.xml'});
|
||||
removeTestPath();
|
||||
executeTestRunner();
|
||||
|
||||
verifyMochaFile(filePath);
|
||||
removeTestPath();
|
||||
});
|
||||
|
||||
it('creates valid XML report for invalid message', function() {
|
||||
createReporter({mochaFile: 'test/mocha.xml'});
|
||||
executeTestRunner({invalidChar: '\u001b'});
|
||||
|
||||
verifyMochaFile(filePath);
|
||||
});
|
||||
|
||||
it('outputs pending tests if "includePending" is specified', function() {
|
||||
createReporter({mochaFile: 'test/mocha.xml', includePending: true});
|
||||
executeTestRunner({includePending: true});
|
||||
|
||||
verifyMochaFile(filePath);
|
||||
});
|
||||
|
||||
it('can output to the console', function() {
|
||||
createReporter({mochaFile: 'test/console.xml', toConsole: true});
|
||||
|
||||
var stdout = testConsole.stdout.inspect();
|
||||
try {
|
||||
executeTestRunner();
|
||||
verifyMochaFile(filePath);
|
||||
} catch (e) {
|
||||
stdout.restore();
|
||||
throw e;
|
||||
}
|
||||
|
||||
stdout.restore();
|
||||
|
||||
var xml = stdout.output[0];
|
||||
expect(xml).xml.to.be.valid();
|
||||
expect(xml).xml.to.equal(mockXml(runner.stats));
|
||||
});
|
||||
|
||||
it('properly outputs tests when amount of tests is wrong', function() {
|
||||
createReporter({mochaFile: 'test/mocha.xml'});
|
||||
// emulates exception in before each hook
|
||||
executeTestRunner({skipPassedTests: true});
|
||||
|
||||
verifyMochaFile(filePath, {skipPassedTests: true});
|
||||
});
|
||||
|
||||
describe('when "useFullSuiteTitle" option is specified', function() {
|
||||
var suiteTitles = ['test suite', 'when has parent'];
|
||||
|
||||
it('generates full suite title', function() {
|
||||
var reporter = configureReporter({useFullSuiteTitle: true });
|
||||
|
||||
expect(suiteName(reporter.suites[0])).to.equal(suiteTitles[0]);
|
||||
expect(suiteName(reporter.suites[1])).to.equal(suiteTitles.join(' '));
|
||||
});
|
||||
|
||||
it('generates full suite title separated by "suiteTitleSeparedBy" option', function() {
|
||||
var reporter = configureReporter({useFullSuiteTitle: true, suiteTitleSeparedBy: '.'});
|
||||
|
||||
expect(suiteName(reporter.suites[1])).to.equal(suiteTitles.join('.'));
|
||||
});
|
||||
|
||||
function suiteName(suite) {
|
||||
return suite.testsuite[0]._attr.name;
|
||||
}
|
||||
|
||||
function configureReporter(options) {
|
||||
var reporter = createReporter(options);
|
||||
|
||||
reporter.flush = function(suites) {
|
||||
reporter.suites = suites;
|
||||
};
|
||||
|
||||
suiteTitles.forEach(function(title) {
|
||||
runner.startSuite({title: title, suites: [1], tests: [1]});
|
||||
});
|
||||
runner.end();
|
||||
|
||||
return reporter;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
describe('Output', function() {
|
||||
var reporter, testsuites;
|
||||
|
||||
beforeEach(function() {
|
||||
reporter = createReporter({mochaFile: 'test/mocha.xml'});
|
||||
|
||||
reporter.flush = function(suites) {
|
||||
testsuites = suites;
|
||||
};
|
||||
});
|
||||
|
||||
it('skips suites with empty title', function() {
|
||||
runner.startSuite({title: '', tests: [1]});
|
||||
runner.end();
|
||||
|
||||
expect(testsuites).to.be.empty;
|
||||
});
|
||||
|
||||
it('skips suites without testcases and suites', function() {
|
||||
runner.startSuite({title: 'test me'});
|
||||
runner.end();
|
||||
|
||||
expect(testsuites).to.be.empty;
|
||||
});
|
||||
|
||||
it('does not skip suites with nested suites', function() {
|
||||
runner.startSuite({title: 'test me', suites: [1]});
|
||||
runner.end();
|
||||
|
||||
expect(testsuites).to.have.length(1);
|
||||
});
|
||||
|
||||
it('does not skip suites with nested tests', function() {
|
||||
runner.startSuite({title: 'test me', tests: [1]});
|
||||
runner.end();
|
||||
|
||||
expect(testsuites).to.have.length(1);
|
||||
});
|
||||
|
||||
it('does not skip root suite', function() {
|
||||
runner.startSuite({title: '', root: true, suites: [1]});
|
||||
runner.end();
|
||||
|
||||
expect(testsuites).to.have.length(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,136 +0,0 @@
|
||||
var xml = require('xml');
|
||||
|
||||
module.exports = function(stats, options) {
|
||||
var data = {
|
||||
testsuites: [
|
||||
{
|
||||
_attr: {
|
||||
name: "Mocha Tests",
|
||||
tests: 3,
|
||||
failures: "1",
|
||||
time: "0.006"
|
||||
}
|
||||
},
|
||||
{
|
||||
testsuite: [
|
||||
{
|
||||
_attr: {
|
||||
name: "Foo Bar module",
|
||||
timestamp: stats.start.toISOString().substr(0,stats.start.toISOString().indexOf('.')),
|
||||
tests: "2",
|
||||
failures: "1",
|
||||
time: "0.002"
|
||||
}
|
||||
},
|
||||
{
|
||||
testcase: {
|
||||
_attr: {
|
||||
name: "Foo can weez the juice",
|
||||
classname: "can weez the juice",
|
||||
time: "0.001"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
testcase: [
|
||||
{
|
||||
_attr: {
|
||||
name: "Bar can narfle the garthog",
|
||||
classname: "can narfle the garthog",
|
||||
time: "0.001"
|
||||
}
|
||||
},
|
||||
{
|
||||
failure: "expected garthog to be dead"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
testsuite: [
|
||||
{
|
||||
_attr: {
|
||||
name: "Another suite!",
|
||||
timestamp: stats.start.toISOString().substr(0,stats.start.toISOString().indexOf('.')),
|
||||
tests: "1",
|
||||
failures: "0",
|
||||
time: "0.004"
|
||||
}
|
||||
},
|
||||
{
|
||||
testcase: {
|
||||
_attr: {
|
||||
name: "Another suite",
|
||||
classname: "works",
|
||||
time: "0.004"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
if (options && options.skipPassedTests) {
|
||||
data.testsuites[0]._attr.time = "0.005";
|
||||
data.testsuites[1].testsuite[0]._attr.time = "0.001";
|
||||
data.testsuites[1].testsuite.splice(1, 1);
|
||||
}
|
||||
|
||||
if (options && options.properties) {
|
||||
var properties = {
|
||||
properties: []
|
||||
}
|
||||
for (var i = 0; i < options.properties.length; i++) {
|
||||
var property = options.properties[i];
|
||||
properties.properties.push({
|
||||
property: [
|
||||
{
|
||||
_attr: {
|
||||
name: property.name,
|
||||
value: property.value
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
}
|
||||
data.testsuites[1].testsuite.push(properties)
|
||||
data.testsuites[2].testsuite.push(properties)
|
||||
}
|
||||
|
||||
if (stats.pending) {
|
||||
data.testsuites[0]._attr.tests += stats.pending;
|
||||
data.testsuites[0]._attr.skipped = stats.pending;
|
||||
data.testsuites.push({
|
||||
testsuite: [
|
||||
{
|
||||
_attr: {
|
||||
name: "Pending suite!",
|
||||
timestamp: stats.start.toISOString().substr(0,stats.start.toISOString().indexOf('.')),
|
||||
tests: "1",
|
||||
failures: "0",
|
||||
skipped: "1",
|
||||
time: "0"
|
||||
}
|
||||
},
|
||||
{
|
||||
testcase: [
|
||||
{
|
||||
_attr: {
|
||||
name: "Pending suite",
|
||||
classname: "pending",
|
||||
time: "0"
|
||||
}
|
||||
},
|
||||
{
|
||||
skipped: null
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
return xml(data, {declaration: true});
|
||||
};
|
||||
1262
node_modules/code-push-plugin-testing-framework/node_modules/mocha/CHANGELOG.md
generated
vendored
1262
node_modules/code-push-plugin-testing-framework/node_modules/mocha/CHANGELOG.md
generated
vendored
File diff suppressed because it is too large
Load Diff
22
node_modules/code-push-plugin-testing-framework/node_modules/mocha/LICENSE
generated
vendored
22
node_modules/code-push-plugin-testing-framework/node_modules/mocha/LICENSE
generated
vendored
@@ -1,22 +0,0 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2011-2016 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
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.
|
||||
3
node_modules/code-push-plugin-testing-framework/node_modules/mocha/bin/.eslintrc
generated
vendored
3
node_modules/code-push-plugin-testing-framework/node_modules/mocha/bin/.eslintrc
generated
vendored
@@ -1,3 +0,0 @@
|
||||
---
|
||||
rules:
|
||||
no-process-exit: 0
|
||||
480
node_modules/code-push-plugin-testing-framework/node_modules/mocha/bin/_mocha
generated
vendored
480
node_modules/code-push-plugin-testing-framework/node_modules/mocha/bin/_mocha
generated
vendored
@@ -1,480 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('commander'),
|
||||
path = require('path'),
|
||||
fs = require('fs'),
|
||||
resolve = path.resolve,
|
||||
exists = fs.existsSync || path.existsSync,
|
||||
Mocha = require('../'),
|
||||
utils = Mocha.utils,
|
||||
join = path.join,
|
||||
cwd = process.cwd(),
|
||||
getOptions = require('./options'),
|
||||
mocha = new Mocha;
|
||||
|
||||
/**
|
||||
* Save timer references to avoid Sinon interfering (see GH-237).
|
||||
*/
|
||||
|
||||
var Date = global.Date
|
||||
, setTimeout = global.setTimeout
|
||||
, setInterval = global.setInterval
|
||||
, clearTimeout = global.clearTimeout
|
||||
, clearInterval = global.clearInterval;
|
||||
|
||||
/**
|
||||
* Files.
|
||||
*/
|
||||
|
||||
var files = [];
|
||||
|
||||
/**
|
||||
* Globals.
|
||||
*/
|
||||
|
||||
var globals = [];
|
||||
|
||||
/**
|
||||
* Requires.
|
||||
*/
|
||||
|
||||
var requires = [];
|
||||
|
||||
/**
|
||||
* Images.
|
||||
*/
|
||||
|
||||
var images = {
|
||||
fail: __dirname + '/../images/error.png'
|
||||
, pass: __dirname + '/../images/ok.png'
|
||||
};
|
||||
|
||||
// options
|
||||
|
||||
program
|
||||
.version(JSON.parse(fs.readFileSync(__dirname + '/../package.json', 'utf8')).version)
|
||||
.usage('[debug] [options] [files]')
|
||||
.option('-A, --async-only', "force all tests to take a callback (async) or return a promise")
|
||||
.option('-c, --colors', 'force enabling of colors')
|
||||
.option('-C, --no-colors', 'force disabling of colors')
|
||||
.option('-G, --growl', 'enable growl notification support')
|
||||
.option('-O, --reporter-options <k=v,k2=v2,...>', 'reporter-specific options')
|
||||
.option('-R, --reporter <name>', 'specify the reporter to use', 'spec')
|
||||
.option('-S, --sort', "sort test files")
|
||||
.option('-b, --bail', "bail after first test failure")
|
||||
.option('-d, --debug', "enable node's debugger, synonym for node --debug")
|
||||
.option('-g, --grep <pattern>', 'only run tests matching <pattern>')
|
||||
.option('-f, --fgrep <string>', 'only run tests containing <string>')
|
||||
.option('-gc, --expose-gc', 'expose gc extension')
|
||||
.option('-i, --invert', 'inverts --grep and --fgrep matches')
|
||||
.option('-r, --require <name>', 'require the given module')
|
||||
.option('-s, --slow <ms>', '"slow" test threshold in milliseconds [75]')
|
||||
.option('-t, --timeout <ms>', 'set test-case timeout in milliseconds [2000]')
|
||||
.option('-u, --ui <name>', 'specify user-interface (bdd|tdd|exports)', 'bdd')
|
||||
.option('-w, --watch', 'watch files for changes')
|
||||
.option('--check-leaks', 'check for global variable leaks')
|
||||
.option('--full-trace', 'display the full stack trace')
|
||||
.option('--compilers <ext>:<module>,...', 'use the given module(s) to compile files', list, [])
|
||||
.option('--debug-brk', "enable node's debugger breaking on the first line")
|
||||
.option('--globals <names>', 'allow the given comma-delimited global [names]', list, [])
|
||||
.option('--es_staging', 'enable all staged features')
|
||||
.option('--harmony<_classes,_generators,...>', 'all node --harmony* flags are available')
|
||||
.option('--icu-data-dir', 'include ICU data')
|
||||
.option('--inline-diffs', 'display actual/expected differences inline within each string')
|
||||
.option('--interfaces', 'display available interfaces')
|
||||
.option('--no-deprecation', 'silence deprecation warnings')
|
||||
.option('--no-exit', 'require a clean shutdown of the event loop: mocha will not call process.exit')
|
||||
.option('--no-timeouts', 'disables timeouts, given implicitly with --debug')
|
||||
.option('--opts <path>', 'specify opts path', 'test/mocha.opts')
|
||||
.option('--perf-basic-prof', 'enable perf linux profiler (basic support)')
|
||||
.option('--prof', 'log statistical profiling information')
|
||||
.option('--log-timer-events', 'Time events including external callbacks')
|
||||
.option('--recursive', 'include sub directories')
|
||||
.option('--reporters', 'display available reporters')
|
||||
.option('--retries <times>', 'set numbers of time to retry a failed test case')
|
||||
.option('--throw-deprecation', 'throw an exception anytime a deprecated function is used')
|
||||
.option('--trace', 'trace function calls')
|
||||
.option('--trace-deprecation', 'show stack traces on deprecations')
|
||||
.option('--use_strict', 'enforce strict mode')
|
||||
.option('--watch-extensions <ext>,...', 'additional extensions to monitor with --watch', list, [])
|
||||
.option('--delay', 'wait for async suite definition')
|
||||
|
||||
program.name = 'mocha';
|
||||
|
||||
// init command
|
||||
|
||||
program
|
||||
.command('init <path>')
|
||||
.description('initialize a client-side mocha setup at <path>')
|
||||
.action(function(path){
|
||||
var mkdir = require('mkdirp');
|
||||
mkdir.sync(path);
|
||||
var css = fs.readFileSync(join(__dirname, '..', 'mocha.css'));
|
||||
var js = fs.readFileSync(join(__dirname, '..', 'mocha.js'));
|
||||
var tmpl = fs.readFileSync(join(__dirname, '..', 'lib/template.html'));
|
||||
fs.writeFileSync(join(path, 'mocha.css'), css);
|
||||
fs.writeFileSync(join(path, 'mocha.js'), js);
|
||||
fs.writeFileSync(join(path, 'tests.js'), '');
|
||||
fs.writeFileSync(join(path, 'index.html'), tmpl);
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
// --globals
|
||||
|
||||
program.on('globals', function(val){
|
||||
globals = globals.concat(list(val));
|
||||
});
|
||||
|
||||
// --reporters
|
||||
|
||||
program.on('reporters', function(){
|
||||
console.log();
|
||||
console.log(' dot - dot matrix');
|
||||
console.log(' doc - html documentation');
|
||||
console.log(' spec - hierarchical spec list');
|
||||
console.log(' json - single json object');
|
||||
console.log(' progress - progress bar');
|
||||
console.log(' list - spec-style listing');
|
||||
console.log(' tap - test-anything-protocol');
|
||||
console.log(' landing - unicode landing strip');
|
||||
console.log(' xunit - xunit reporter');
|
||||
console.log(' html-cov - HTML test coverage');
|
||||
console.log(' json-cov - JSON test coverage');
|
||||
console.log(' min - minimal reporter (great with --watch)');
|
||||
console.log(' json-stream - newline delimited json events');
|
||||
console.log(' markdown - markdown documentation (github flavour)');
|
||||
console.log(' nyan - nyan cat!');
|
||||
console.log();
|
||||
process.exit();
|
||||
});
|
||||
|
||||
// --interfaces
|
||||
|
||||
program.on('interfaces', function(){
|
||||
console.log('');
|
||||
console.log(' bdd');
|
||||
console.log(' tdd');
|
||||
console.log(' qunit');
|
||||
console.log(' exports');
|
||||
console.log('');
|
||||
process.exit();
|
||||
});
|
||||
|
||||
// -r, --require
|
||||
|
||||
module.paths.push(cwd, join(cwd, 'node_modules'));
|
||||
|
||||
program.on('require', function(mod){
|
||||
var abs = exists(mod) || exists(mod + '.js');
|
||||
if (abs) mod = resolve(mod);
|
||||
requires.push(mod);
|
||||
});
|
||||
|
||||
// If not already done, load mocha.opts
|
||||
if (!process.env.LOADED_MOCHA_OPTS) {
|
||||
getOptions();
|
||||
}
|
||||
|
||||
// parse args
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
// infinite stack traces
|
||||
|
||||
Error.stackTraceLimit = Infinity; // TODO: config
|
||||
|
||||
// reporter options
|
||||
|
||||
var reporterOptions = {};
|
||||
if (program.reporterOptions !== undefined) {
|
||||
program.reporterOptions.split(",").forEach(function(opt) {
|
||||
var L = opt.split("=");
|
||||
if (L.length > 2 || L.length === 0) {
|
||||
throw new Error("invalid reporter option '" + opt + "'");
|
||||
} else if (L.length === 2) {
|
||||
reporterOptions[L[0]] = L[1];
|
||||
} else {
|
||||
reporterOptions[L[0]] = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// reporter
|
||||
|
||||
mocha.reporter(program.reporter, reporterOptions);
|
||||
|
||||
// load reporter
|
||||
|
||||
var Reporter = null;
|
||||
try {
|
||||
Reporter = require('../lib/reporters/' + program.reporter);
|
||||
} catch (err) {
|
||||
try {
|
||||
Reporter = require(program.reporter);
|
||||
} catch (err) {
|
||||
throw new Error('reporter "' + program.reporter + '" does not exist');
|
||||
}
|
||||
}
|
||||
|
||||
// --no-colors
|
||||
|
||||
if (!program.colors) mocha.useColors(false);
|
||||
|
||||
// --colors
|
||||
|
||||
if (~process.argv.indexOf('--colors') ||
|
||||
~process.argv.indexOf('-c')) {
|
||||
mocha.useColors(true);
|
||||
}
|
||||
|
||||
// --inline-diffs
|
||||
|
||||
if (program.inlineDiffs) mocha.useInlineDiffs(true);
|
||||
|
||||
// --slow <ms>
|
||||
|
||||
if (program.slow) mocha.suite.slow(program.slow);
|
||||
|
||||
// --no-timeouts
|
||||
|
||||
if (!program.timeouts) mocha.enableTimeouts(false);
|
||||
|
||||
// --timeout
|
||||
|
||||
if (program.timeout) mocha.suite.timeout(program.timeout);
|
||||
|
||||
// --bail
|
||||
|
||||
mocha.suite.bail(program.bail);
|
||||
|
||||
// --grep
|
||||
|
||||
if (program.grep) mocha.grep(new RegExp(program.grep));
|
||||
|
||||
// --fgrep
|
||||
|
||||
if (program.fgrep) mocha.grep(program.fgrep);
|
||||
|
||||
// --invert
|
||||
|
||||
if (program.invert) mocha.invert();
|
||||
|
||||
// --check-leaks
|
||||
|
||||
if (program.checkLeaks) mocha.checkLeaks();
|
||||
|
||||
// --stack-trace
|
||||
|
||||
if(program.fullTrace) mocha.fullTrace();
|
||||
|
||||
// --growl
|
||||
|
||||
if (program.growl) mocha.growl();
|
||||
|
||||
// --async-only
|
||||
|
||||
if (program.asyncOnly) mocha.asyncOnly();
|
||||
|
||||
// --delay
|
||||
|
||||
if (program.delay) mocha.delay();
|
||||
|
||||
// --globals
|
||||
|
||||
mocha.globals(globals);
|
||||
|
||||
// --retries
|
||||
|
||||
if (program.retries) mocha.suite.retries(program.retries);
|
||||
|
||||
// custom compiler support
|
||||
|
||||
var extensions = ['js'];
|
||||
program.compilers.forEach(function(c) {
|
||||
var compiler = c.split(':')
|
||||
, ext = compiler[0]
|
||||
, mod = compiler[1];
|
||||
|
||||
if (mod[0] == '.') mod = join(process.cwd(), mod);
|
||||
require(mod);
|
||||
extensions.push(ext);
|
||||
program.watchExtensions.push(ext);
|
||||
});
|
||||
|
||||
// requires
|
||||
|
||||
requires.forEach(function(mod) {
|
||||
require(mod);
|
||||
});
|
||||
|
||||
// interface
|
||||
|
||||
mocha.ui(program.ui);
|
||||
|
||||
//args
|
||||
|
||||
var args = program.args;
|
||||
|
||||
// default files to test/*.{js,coffee}
|
||||
|
||||
if (!args.length) args.push('test');
|
||||
|
||||
args.forEach(function(arg){
|
||||
files = files.concat(utils.lookupFiles(arg, extensions, program.recursive));
|
||||
});
|
||||
|
||||
// resolve
|
||||
|
||||
files = files.map(function(path){
|
||||
return resolve(path);
|
||||
});
|
||||
|
||||
if (program.sort) {
|
||||
files.sort();
|
||||
}
|
||||
|
||||
// --watch
|
||||
|
||||
var runner;
|
||||
if (program.watch) {
|
||||
console.log();
|
||||
hideCursor();
|
||||
process.on('SIGINT', function(){
|
||||
showCursor();
|
||||
console.log('\n');
|
||||
process.exit();
|
||||
});
|
||||
|
||||
|
||||
var watchFiles = utils.files(cwd, [ 'js' ].concat(program.watchExtensions));
|
||||
var runAgain = false;
|
||||
|
||||
function loadAndRun() {
|
||||
try {
|
||||
mocha.files = files;
|
||||
runAgain = false;
|
||||
runner = mocha.run(function(){
|
||||
runner = null;
|
||||
if (runAgain) {
|
||||
rerun();
|
||||
}
|
||||
});
|
||||
} catch(e) {
|
||||
console.log(e.stack);
|
||||
}
|
||||
}
|
||||
|
||||
function purge() {
|
||||
watchFiles.forEach(function(file){
|
||||
delete require.cache[file];
|
||||
});
|
||||
}
|
||||
|
||||
loadAndRun();
|
||||
|
||||
function rerun() {
|
||||
purge();
|
||||
stop()
|
||||
if (!program.grep)
|
||||
mocha.grep(null);
|
||||
mocha.suite = mocha.suite.clone();
|
||||
mocha.suite.ctx = new Mocha.Context;
|
||||
mocha.ui(program.ui);
|
||||
loadAndRun();
|
||||
}
|
||||
|
||||
utils.watch(watchFiles, function(){
|
||||
runAgain = true;
|
||||
if (runner) {
|
||||
runner.abort();
|
||||
} else {
|
||||
rerun();
|
||||
}
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
// load
|
||||
|
||||
mocha.files = files;
|
||||
runner = mocha.run(program.exit ? exit : exitLater);
|
||||
|
||||
}
|
||||
|
||||
function exitLater(code) {
|
||||
process.on('exit', function() { process.exit(code) })
|
||||
}
|
||||
|
||||
function exit(code) {
|
||||
// flush output for Node.js Windows pipe bug
|
||||
// https://github.com/joyent/node/issues/6247 is just one bug example
|
||||
// https://github.com/visionmedia/mocha/issues/333 has a good discussion
|
||||
function done() {
|
||||
if (!(draining--)) process.exit(code);
|
||||
}
|
||||
|
||||
var draining = 0;
|
||||
var streams = [process.stdout, process.stderr];
|
||||
|
||||
streams.forEach(function(stream){
|
||||
// submit empty write request and wait for completion
|
||||
draining += 1;
|
||||
stream.write('', done);
|
||||
});
|
||||
|
||||
done();
|
||||
}
|
||||
|
||||
process.on('SIGINT', function() { runner.abort(); })
|
||||
|
||||
/**
|
||||
* Parse list.
|
||||
*/
|
||||
|
||||
function list(str) {
|
||||
return str.split(/ *, */);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide the cursor.
|
||||
*/
|
||||
|
||||
function hideCursor(){
|
||||
process.stdout.write('\u001b[?25l');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the cursor.
|
||||
*/
|
||||
|
||||
function showCursor(){
|
||||
process.stdout.write('\u001b[?25h');
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop play()ing.
|
||||
*/
|
||||
|
||||
function stop() {
|
||||
process.stdout.write('\u001b[2K');
|
||||
clearInterval(play.timer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Play the given array of strings.
|
||||
*/
|
||||
|
||||
function play(arr, interval) {
|
||||
var len = arr.length
|
||||
, interval = interval || 100
|
||||
, i = 0;
|
||||
|
||||
play.timer = setInterval(function(){
|
||||
var str = arr[i++ % len];
|
||||
process.stdout.write('\u001b[0G' + str);
|
||||
}, interval);
|
||||
}
|
||||
73
node_modules/code-push-plugin-testing-framework/node_modules/mocha/bin/mocha
generated
vendored
73
node_modules/code-push-plugin-testing-framework/node_modules/mocha/bin/mocha
generated
vendored
@@ -1,73 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* This tiny wrapper file checks for known node flags and appends them
|
||||
* when found, before invoking the "real" _mocha(1) executable.
|
||||
*/
|
||||
|
||||
var spawn = require('child_process').spawn,
|
||||
path = require('path'),
|
||||
fs = require('fs'),
|
||||
getOptions = require('./options'),
|
||||
args = [path.join(__dirname, '_mocha')];
|
||||
|
||||
// Load mocha.opts into process.argv
|
||||
// Must be loaded here to handle node-specific options
|
||||
getOptions();
|
||||
|
||||
process.argv.slice(2).forEach(function(arg){
|
||||
var flag = arg.split('=')[0];
|
||||
|
||||
switch (flag) {
|
||||
case '-d':
|
||||
args.unshift('--debug');
|
||||
args.push('--no-timeouts');
|
||||
break;
|
||||
case 'debug':
|
||||
case '--debug':
|
||||
case '--debug-brk':
|
||||
args.unshift(arg);
|
||||
args.push('--no-timeouts');
|
||||
break;
|
||||
case '-gc':
|
||||
case '--expose-gc':
|
||||
args.unshift('--expose-gc');
|
||||
break;
|
||||
case '--gc-global':
|
||||
case '--es_staging':
|
||||
case '--no-deprecation':
|
||||
case '--prof':
|
||||
case '--log-timer-events':
|
||||
case '--throw-deprecation':
|
||||
case '--trace-deprecation':
|
||||
case '--use_strict':
|
||||
case '--allow-natives-syntax':
|
||||
case '--perf-basic-prof':
|
||||
args.unshift(arg);
|
||||
break;
|
||||
default:
|
||||
if (0 == arg.indexOf('--harmony')) args.unshift(arg);
|
||||
else if (0 == arg.indexOf('--trace')) args.unshift(arg);
|
||||
else if (0 == arg.indexOf('--icu-data-dir')) args.unshift(arg);
|
||||
else if (0 == arg.indexOf('--max-old-space-size')) args.unshift(arg);
|
||||
else args.push(arg);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
var proc = spawn(process.execPath, args, { stdio: 'inherit' });
|
||||
proc.on('exit', function (code, signal) {
|
||||
process.on('exit', function(){
|
||||
if (signal) {
|
||||
process.kill(process.pid, signal);
|
||||
} else {
|
||||
process.exit(code);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// terminate children.
|
||||
process.on('SIGINT', function () {
|
||||
proc.kill('SIGINT'); // calls runner.abort()
|
||||
proc.kill('SIGTERM'); // if that didn't work, we're probably in an infinite loop, so make it die.
|
||||
});
|
||||
39
node_modules/code-push-plugin-testing-framework/node_modules/mocha/bin/options.js
generated
vendored
39
node_modules/code-push-plugin-testing-framework/node_modules/mocha/bin/options.js
generated
vendored
@@ -1,39 +0,0 @@
|
||||
/**
|
||||
* Dependencies.
|
||||
*/
|
||||
|
||||
var fs = require('fs');
|
||||
|
||||
/**
|
||||
* Export `getOptions`.
|
||||
*/
|
||||
|
||||
module.exports = getOptions;
|
||||
|
||||
/**
|
||||
* Get options.
|
||||
*/
|
||||
|
||||
function getOptions() {
|
||||
var optsPath = process.argv.indexOf('--opts') !== -1
|
||||
? process.argv[process.argv.indexOf('--opts') + 1]
|
||||
: 'test/mocha.opts';
|
||||
|
||||
try {
|
||||
var opts = fs.readFileSync(optsPath, 'utf8')
|
||||
.replace(/\\\s/g, '%20')
|
||||
.split(/\s/)
|
||||
.filter(Boolean)
|
||||
.map(function(value) {
|
||||
return value.replace(/%20/g, ' ');
|
||||
});
|
||||
|
||||
process.argv = process.argv
|
||||
.slice(0, 2)
|
||||
.concat(opts.concat(process.argv.slice(2)));
|
||||
} catch (err) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
process.env.LOADED_MOCHA_OPTS = true;
|
||||
}
|
||||
BIN
node_modules/code-push-plugin-testing-framework/node_modules/mocha/images/error.png
generated
vendored
BIN
node_modules/code-push-plugin-testing-framework/node_modules/mocha/images/error.png
generated
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 412 B |
BIN
node_modules/code-push-plugin-testing-framework/node_modules/mocha/images/ok.png
generated
vendored
BIN
node_modules/code-push-plugin-testing-framework/node_modules/mocha/images/ok.png
generated
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 388 B |
3
node_modules/code-push-plugin-testing-framework/node_modules/mocha/index.js
generated
vendored
3
node_modules/code-push-plugin-testing-framework/node_modules/mocha/index.js
generated
vendored
@@ -1,3 +0,0 @@
|
||||
module.exports = process.env.COV
|
||||
? require('./lib-cov/mocha')
|
||||
: require('./lib/mocha');
|
||||
@@ -1,4 +0,0 @@
|
||||
/* eslint-disable no-unused-vars */
|
||||
module.exports = function(type) {
|
||||
return function() {};
|
||||
};
|
||||
193
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/browser/events.js
generated
vendored
193
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/browser/events.js
generated
vendored
@@ -1,193 +0,0 @@
|
||||
/**
|
||||
* Module exports.
|
||||
*/
|
||||
|
||||
exports.EventEmitter = EventEmitter;
|
||||
|
||||
/**
|
||||
* Object#toString reference.
|
||||
*/
|
||||
var objToString = Object.prototype.toString;
|
||||
|
||||
/**
|
||||
* Check if a value is an array.
|
||||
*
|
||||
* @api private
|
||||
* @param {*} val The value to test.
|
||||
* @return {boolean} true if the value is an array, otherwise false.
|
||||
*/
|
||||
function isArray(val) {
|
||||
return objToString.call(val) === '[object Array]';
|
||||
}
|
||||
|
||||
/**
|
||||
* Event emitter constructor.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
function EventEmitter() {}
|
||||
|
||||
/**
|
||||
* Add a listener.
|
||||
*
|
||||
* @api public
|
||||
* @param {string} name Event name.
|
||||
* @param {Function} fn Event handler.
|
||||
* @return {EventEmitter} Emitter instance.
|
||||
*/
|
||||
EventEmitter.prototype.on = function(name, fn) {
|
||||
if (!this.$events) {
|
||||
this.$events = {};
|
||||
}
|
||||
|
||||
if (!this.$events[name]) {
|
||||
this.$events[name] = fn;
|
||||
} else if (isArray(this.$events[name])) {
|
||||
this.$events[name].push(fn);
|
||||
} else {
|
||||
this.$events[name] = [this.$events[name], fn];
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
||||
|
||||
/**
|
||||
* Adds a volatile listener.
|
||||
*
|
||||
* @api public
|
||||
* @param {string} name Event name.
|
||||
* @param {Function} fn Event handler.
|
||||
* @return {EventEmitter} Emitter instance.
|
||||
*/
|
||||
EventEmitter.prototype.once = function(name, fn) {
|
||||
var self = this;
|
||||
|
||||
function on() {
|
||||
self.removeListener(name, on);
|
||||
fn.apply(this, arguments);
|
||||
}
|
||||
|
||||
on.listener = fn;
|
||||
this.on(name, on);
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove a listener.
|
||||
*
|
||||
* @api public
|
||||
* @param {string} name Event name.
|
||||
* @param {Function} fn Event handler.
|
||||
* @return {EventEmitter} Emitter instance.
|
||||
*/
|
||||
EventEmitter.prototype.removeListener = function(name, fn) {
|
||||
if (this.$events && this.$events[name]) {
|
||||
var list = this.$events[name];
|
||||
|
||||
if (isArray(list)) {
|
||||
var pos = -1;
|
||||
|
||||
for (var i = 0, l = list.length; i < l; i++) {
|
||||
if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {
|
||||
pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos < 0) {
|
||||
return this;
|
||||
}
|
||||
|
||||
list.splice(pos, 1);
|
||||
|
||||
if (!list.length) {
|
||||
delete this.$events[name];
|
||||
}
|
||||
} else if (list === fn || (list.listener && list.listener === fn)) {
|
||||
delete this.$events[name];
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove all listeners for an event.
|
||||
*
|
||||
* @api public
|
||||
* @param {string} name Event name.
|
||||
* @return {EventEmitter} Emitter instance.
|
||||
*/
|
||||
EventEmitter.prototype.removeAllListeners = function(name) {
|
||||
if (name === undefined) {
|
||||
this.$events = {};
|
||||
return this;
|
||||
}
|
||||
|
||||
if (this.$events && this.$events[name]) {
|
||||
this.$events[name] = null;
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get all listeners for a given event.
|
||||
*
|
||||
* @api public
|
||||
* @param {string} name Event name.
|
||||
* @return {EventEmitter} Emitter instance.
|
||||
*/
|
||||
EventEmitter.prototype.listeners = function(name) {
|
||||
if (!this.$events) {
|
||||
this.$events = {};
|
||||
}
|
||||
|
||||
if (!this.$events[name]) {
|
||||
this.$events[name] = [];
|
||||
}
|
||||
|
||||
if (!isArray(this.$events[name])) {
|
||||
this.$events[name] = [this.$events[name]];
|
||||
}
|
||||
|
||||
return this.$events[name];
|
||||
};
|
||||
|
||||
/**
|
||||
* Emit an event.
|
||||
*
|
||||
* @api public
|
||||
* @param {string} name Event name.
|
||||
* @return {boolean} true if at least one handler was invoked, else false.
|
||||
*/
|
||||
EventEmitter.prototype.emit = function(name) {
|
||||
if (!this.$events) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var handler = this.$events[name];
|
||||
|
||||
if (!handler) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var args = Array.prototype.slice.call(arguments, 1);
|
||||
|
||||
if (typeof handler === 'function') {
|
||||
handler.apply(this, args);
|
||||
} else if (isArray(handler)) {
|
||||
var listeners = handler.slice();
|
||||
|
||||
for (var i = 0, l = listeners.length; i < l; i++) {
|
||||
listeners[i].apply(this, args);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
117
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/browser/progress.js
generated
vendored
117
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/browser/progress.js
generated
vendored
@@ -1,117 +0,0 @@
|
||||
/**
|
||||
* Expose `Progress`.
|
||||
*/
|
||||
|
||||
module.exports = Progress;
|
||||
|
||||
/**
|
||||
* Initialize a new `Progress` indicator.
|
||||
*/
|
||||
function Progress() {
|
||||
this.percent = 0;
|
||||
this.size(0);
|
||||
this.fontSize(11);
|
||||
this.font('helvetica, arial, sans-serif');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set progress size to `size`.
|
||||
*
|
||||
* @api public
|
||||
* @param {number} size
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.size = function(size) {
|
||||
this._size = size;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set text to `text`.
|
||||
*
|
||||
* @api public
|
||||
* @param {string} text
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.text = function(text) {
|
||||
this._text = text;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set font size to `size`.
|
||||
*
|
||||
* @api public
|
||||
* @param {number} size
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.fontSize = function(size) {
|
||||
this._fontSize = size;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set font to `family`.
|
||||
*
|
||||
* @param {string} family
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.font = function(family) {
|
||||
this._font = family;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Update percentage to `n`.
|
||||
*
|
||||
* @param {number} n
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.update = function(n) {
|
||||
this.percent = n;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Draw on `ctx`.
|
||||
*
|
||||
* @param {CanvasRenderingContext2d} ctx
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.draw = function(ctx) {
|
||||
try {
|
||||
var percent = Math.min(this.percent, 100);
|
||||
var size = this._size;
|
||||
var half = size / 2;
|
||||
var x = half;
|
||||
var y = half;
|
||||
var rad = half - 1;
|
||||
var fontSize = this._fontSize;
|
||||
|
||||
ctx.font = fontSize + 'px ' + this._font;
|
||||
|
||||
var angle = Math.PI * 2 * (percent / 100);
|
||||
ctx.clearRect(0, 0, size, size);
|
||||
|
||||
// outer circle
|
||||
ctx.strokeStyle = '#9f9f9f';
|
||||
ctx.beginPath();
|
||||
ctx.arc(x, y, rad, 0, angle, false);
|
||||
ctx.stroke();
|
||||
|
||||
// inner circle
|
||||
ctx.strokeStyle = '#eee';
|
||||
ctx.beginPath();
|
||||
ctx.arc(x, y, rad - 1, 0, angle, true);
|
||||
ctx.stroke();
|
||||
|
||||
// text
|
||||
var text = this._text || (percent | 0) + '%';
|
||||
var w = ctx.measureText(text).width;
|
||||
|
||||
ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1);
|
||||
} catch (err) {
|
||||
// don't fail if we can't render progress
|
||||
}
|
||||
return this;
|
||||
};
|
||||
11
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/browser/tty.js
generated
vendored
11
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/browser/tty.js
generated
vendored
@@ -1,11 +0,0 @@
|
||||
exports.isatty = function isatty() {
|
||||
return true;
|
||||
};
|
||||
|
||||
exports.getWindowSize = function getWindowSize() {
|
||||
if ('innerHeight' in global) {
|
||||
return [global.innerHeight, global.innerWidth];
|
||||
}
|
||||
// In a Web Worker, the DOM Window is not available.
|
||||
return [640, 480];
|
||||
};
|
||||
104
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/context.js
generated
vendored
104
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/context.js
generated
vendored
@@ -1,104 +0,0 @@
|
||||
/**
|
||||
* Expose `Context`.
|
||||
*/
|
||||
|
||||
module.exports = Context;
|
||||
|
||||
/**
|
||||
* Initialize a new `Context`.
|
||||
*
|
||||
* @api private
|
||||
*/
|
||||
function Context() {}
|
||||
|
||||
/**
|
||||
* Set or get the context `Runnable` to `runnable`.
|
||||
*
|
||||
* @api private
|
||||
* @param {Runnable} runnable
|
||||
* @return {Context}
|
||||
*/
|
||||
Context.prototype.runnable = function(runnable) {
|
||||
if (!arguments.length) {
|
||||
return this._runnable;
|
||||
}
|
||||
this.test = this._runnable = runnable;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set test timeout `ms`.
|
||||
*
|
||||
* @api private
|
||||
* @param {number} ms
|
||||
* @return {Context} self
|
||||
*/
|
||||
Context.prototype.timeout = function(ms) {
|
||||
if (!arguments.length) {
|
||||
return this.runnable().timeout();
|
||||
}
|
||||
this.runnable().timeout(ms);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set test timeout `enabled`.
|
||||
*
|
||||
* @api private
|
||||
* @param {boolean} enabled
|
||||
* @return {Context} self
|
||||
*/
|
||||
Context.prototype.enableTimeouts = function(enabled) {
|
||||
this.runnable().enableTimeouts(enabled);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set test slowness threshold `ms`.
|
||||
*
|
||||
* @api private
|
||||
* @param {number} ms
|
||||
* @return {Context} self
|
||||
*/
|
||||
Context.prototype.slow = function(ms) {
|
||||
this.runnable().slow(ms);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Mark a test as skipped.
|
||||
*
|
||||
* @api private
|
||||
* @return {Context} self
|
||||
*/
|
||||
Context.prototype.skip = function() {
|
||||
this.runnable().skip();
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Allow a number of retries on failed tests
|
||||
*
|
||||
* @api private
|
||||
* @param {number} n
|
||||
* @return {Context} self
|
||||
*/
|
||||
Context.prototype.retries = function(n) {
|
||||
if (!arguments.length) {
|
||||
return this.runnable().retries();
|
||||
}
|
||||
this.runnable().retries(n);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Inspect the context void of `._runnable`.
|
||||
*
|
||||
* @api private
|
||||
* @return {string}
|
||||
*/
|
||||
Context.prototype.inspect = function() {
|
||||
return JSON.stringify(this, function(key, val) {
|
||||
return key === 'runnable' || key === 'test' ? undefined : val;
|
||||
}, 2);
|
||||
};
|
||||
46
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/hook.js
generated
vendored
46
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/hook.js
generated
vendored
@@ -1,46 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var Runnable = require('./runnable');
|
||||
var inherits = require('./utils').inherits;
|
||||
|
||||
/**
|
||||
* Expose `Hook`.
|
||||
*/
|
||||
|
||||
module.exports = Hook;
|
||||
|
||||
/**
|
||||
* Initialize a new `Hook` with the given `title` and callback `fn`.
|
||||
*
|
||||
* @param {String} title
|
||||
* @param {Function} fn
|
||||
* @api private
|
||||
*/
|
||||
function Hook(title, fn) {
|
||||
Runnable.call(this, title, fn);
|
||||
this.type = 'hook';
|
||||
}
|
||||
|
||||
/**
|
||||
* Inherit from `Runnable.prototype`.
|
||||
*/
|
||||
inherits(Hook, Runnable);
|
||||
|
||||
/**
|
||||
* Get or set the test `err`.
|
||||
*
|
||||
* @param {Error} err
|
||||
* @return {Error}
|
||||
* @api public
|
||||
*/
|
||||
Hook.prototype.error = function(err) {
|
||||
if (!arguments.length) {
|
||||
err = this._error;
|
||||
this._error = null;
|
||||
return err;
|
||||
}
|
||||
|
||||
this._error = err;
|
||||
};
|
||||
117
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/interfaces/bdd.js
generated
vendored
117
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/interfaces/bdd.js
generated
vendored
@@ -1,117 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var Suite = require('../suite');
|
||||
var Test = require('../test');
|
||||
var escapeRe = require('escape-string-regexp');
|
||||
|
||||
/**
|
||||
* BDD-style interface:
|
||||
*
|
||||
* describe('Array', function() {
|
||||
* describe('#indexOf()', function() {
|
||||
* it('should return -1 when not present', function() {
|
||||
* // ...
|
||||
* });
|
||||
*
|
||||
* it('should return the index when present', function() {
|
||||
* // ...
|
||||
* });
|
||||
* });
|
||||
* });
|
||||
*
|
||||
* @param {Suite} suite Root suite.
|
||||
*/
|
||||
module.exports = function(suite) {
|
||||
var suites = [suite];
|
||||
|
||||
suite.on('pre-require', function(context, file, mocha) {
|
||||
var common = require('./common')(suites, context);
|
||||
|
||||
context.before = common.before;
|
||||
context.after = common.after;
|
||||
context.beforeEach = common.beforeEach;
|
||||
context.afterEach = common.afterEach;
|
||||
context.run = mocha.options.delay && common.runWithSuite(suite);
|
||||
/**
|
||||
* Describe a "suite" with the given `title`
|
||||
* and callback `fn` containing nested suites
|
||||
* and/or tests.
|
||||
*/
|
||||
|
||||
context.describe = context.context = function(title, fn) {
|
||||
var suite = Suite.create(suites[0], title);
|
||||
suite.file = file;
|
||||
suites.unshift(suite);
|
||||
fn.call(suite);
|
||||
suites.shift();
|
||||
return suite;
|
||||
};
|
||||
|
||||
/**
|
||||
* Pending describe.
|
||||
*/
|
||||
|
||||
context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) {
|
||||
var suite = Suite.create(suites[0], title);
|
||||
suite.pending = true;
|
||||
suites.unshift(suite);
|
||||
fn.call(suite);
|
||||
suites.shift();
|
||||
};
|
||||
|
||||
/**
|
||||
* Exclusive suite.
|
||||
*/
|
||||
|
||||
context.describe.only = function(title, fn) {
|
||||
var suite = context.describe(title, fn);
|
||||
mocha.grep(suite.fullTitle());
|
||||
return suite;
|
||||
};
|
||||
|
||||
/**
|
||||
* Describe a specification or test-case
|
||||
* with the given `title` and callback `fn`
|
||||
* acting as a thunk.
|
||||
*/
|
||||
|
||||
var it = context.it = context.specify = function(title, fn) {
|
||||
var suite = suites[0];
|
||||
if (suite.isPending()) {
|
||||
fn = null;
|
||||
}
|
||||
var test = new Test(title, fn);
|
||||
test.file = file;
|
||||
suite.addTest(test);
|
||||
return test;
|
||||
};
|
||||
|
||||
/**
|
||||
* Exclusive test-case.
|
||||
*/
|
||||
|
||||
context.it.only = function(title, fn) {
|
||||
var test = it(title, fn);
|
||||
var reString = '^' + escapeRe(test.fullTitle()) + '$';
|
||||
mocha.grep(new RegExp(reString));
|
||||
return test;
|
||||
};
|
||||
|
||||
/**
|
||||
* Pending test case.
|
||||
*/
|
||||
|
||||
context.xit = context.xspecify = context.it.skip = function(title) {
|
||||
context.it(title);
|
||||
};
|
||||
|
||||
/**
|
||||
* Number of attempts to retry.
|
||||
*/
|
||||
context.it.retries = function(n) {
|
||||
context.retries(n);
|
||||
};
|
||||
});
|
||||
};
|
||||
@@ -1,85 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Functions common to more than one interface.
|
||||
*
|
||||
* @param {Suite[]} suites
|
||||
* @param {Context} context
|
||||
* @return {Object} An object containing common functions.
|
||||
*/
|
||||
module.exports = function(suites, context) {
|
||||
return {
|
||||
/**
|
||||
* This is only present if flag --delay is passed into Mocha. It triggers
|
||||
* root suite execution.
|
||||
*
|
||||
* @param {Suite} suite The root wuite.
|
||||
* @return {Function} A function which runs the root suite
|
||||
*/
|
||||
runWithSuite: function runWithSuite(suite) {
|
||||
return function run() {
|
||||
suite.run();
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Execute before running tests.
|
||||
*
|
||||
* @param {string} name
|
||||
* @param {Function} fn
|
||||
*/
|
||||
before: function(name, fn) {
|
||||
suites[0].beforeAll(name, fn);
|
||||
},
|
||||
|
||||
/**
|
||||
* Execute after running tests.
|
||||
*
|
||||
* @param {string} name
|
||||
* @param {Function} fn
|
||||
*/
|
||||
after: function(name, fn) {
|
||||
suites[0].afterAll(name, fn);
|
||||
},
|
||||
|
||||
/**
|
||||
* Execute before each test case.
|
||||
*
|
||||
* @param {string} name
|
||||
* @param {Function} fn
|
||||
*/
|
||||
beforeEach: function(name, fn) {
|
||||
suites[0].beforeEach(name, fn);
|
||||
},
|
||||
|
||||
/**
|
||||
* Execute after each test case.
|
||||
*
|
||||
* @param {string} name
|
||||
* @param {Function} fn
|
||||
*/
|
||||
afterEach: function(name, fn) {
|
||||
suites[0].afterEach(name, fn);
|
||||
},
|
||||
|
||||
test: {
|
||||
/**
|
||||
* Pending test case.
|
||||
*
|
||||
* @param {string} title
|
||||
*/
|
||||
skip: function(title) {
|
||||
context.test(title);
|
||||
},
|
||||
|
||||
/**
|
||||
* Number of retry attempts
|
||||
*
|
||||
* @param {number} n
|
||||
*/
|
||||
retries: function(n) {
|
||||
context.retries(n);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
@@ -1,61 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var Suite = require('../suite');
|
||||
var Test = require('../test');
|
||||
|
||||
/**
|
||||
* Exports-style (as Node.js module) interface:
|
||||
*
|
||||
* exports.Array = {
|
||||
* '#indexOf()': {
|
||||
* 'should return -1 when the value is not present': function() {
|
||||
*
|
||||
* },
|
||||
*
|
||||
* 'should return the correct index when the value is present': function() {
|
||||
*
|
||||
* }
|
||||
* }
|
||||
* };
|
||||
*
|
||||
* @param {Suite} suite Root suite.
|
||||
*/
|
||||
module.exports = function(suite) {
|
||||
var suites = [suite];
|
||||
|
||||
suite.on('require', visit);
|
||||
|
||||
function visit(obj, file) {
|
||||
var suite;
|
||||
for (var key in obj) {
|
||||
if (typeof obj[key] === 'function') {
|
||||
var fn = obj[key];
|
||||
switch (key) {
|
||||
case 'before':
|
||||
suites[0].beforeAll(fn);
|
||||
break;
|
||||
case 'after':
|
||||
suites[0].afterAll(fn);
|
||||
break;
|
||||
case 'beforeEach':
|
||||
suites[0].beforeEach(fn);
|
||||
break;
|
||||
case 'afterEach':
|
||||
suites[0].afterEach(fn);
|
||||
break;
|
||||
default:
|
||||
var test = new Test(key, fn);
|
||||
test.file = file;
|
||||
suites[0].addTest(test);
|
||||
}
|
||||
} else {
|
||||
suite = Suite.create(suites[0], key);
|
||||
suites.unshift(suite);
|
||||
visit(obj[key], file);
|
||||
suites.shift();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1,4 +0,0 @@
|
||||
exports.bdd = require('./bdd');
|
||||
exports.tdd = require('./tdd');
|
||||
exports.qunit = require('./qunit');
|
||||
exports.exports = require('./exports');
|
||||
@@ -1,94 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var Suite = require('../suite');
|
||||
var Test = require('../test');
|
||||
var escapeRe = require('escape-string-regexp');
|
||||
|
||||
/**
|
||||
* QUnit-style interface:
|
||||
*
|
||||
* suite('Array');
|
||||
*
|
||||
* test('#length', function() {
|
||||
* var arr = [1,2,3];
|
||||
* ok(arr.length == 3);
|
||||
* });
|
||||
*
|
||||
* test('#indexOf()', function() {
|
||||
* var arr = [1,2,3];
|
||||
* ok(arr.indexOf(1) == 0);
|
||||
* ok(arr.indexOf(2) == 1);
|
||||
* ok(arr.indexOf(3) == 2);
|
||||
* });
|
||||
*
|
||||
* suite('String');
|
||||
*
|
||||
* test('#length', function() {
|
||||
* ok('foo'.length == 3);
|
||||
* });
|
||||
*
|
||||
* @param {Suite} suite Root suite.
|
||||
*/
|
||||
module.exports = function(suite) {
|
||||
var suites = [suite];
|
||||
|
||||
suite.on('pre-require', function(context, file, mocha) {
|
||||
var common = require('./common')(suites, context);
|
||||
|
||||
context.before = common.before;
|
||||
context.after = common.after;
|
||||
context.beforeEach = common.beforeEach;
|
||||
context.afterEach = common.afterEach;
|
||||
context.run = mocha.options.delay && common.runWithSuite(suite);
|
||||
/**
|
||||
* Describe a "suite" with the given `title`.
|
||||
*/
|
||||
|
||||
context.suite = function(title) {
|
||||
if (suites.length > 1) {
|
||||
suites.shift();
|
||||
}
|
||||
var suite = Suite.create(suites[0], title);
|
||||
suite.file = file;
|
||||
suites.unshift(suite);
|
||||
return suite;
|
||||
};
|
||||
|
||||
/**
|
||||
* Exclusive test-case.
|
||||
*/
|
||||
|
||||
context.suite.only = function(title, fn) {
|
||||
var suite = context.suite(title, fn);
|
||||
mocha.grep(suite.fullTitle());
|
||||
};
|
||||
|
||||
/**
|
||||
* Describe a specification or test-case
|
||||
* with the given `title` and callback `fn`
|
||||
* acting as a thunk.
|
||||
*/
|
||||
|
||||
context.test = function(title, fn) {
|
||||
var test = new Test(title, fn);
|
||||
test.file = file;
|
||||
suites[0].addTest(test);
|
||||
return test;
|
||||
};
|
||||
|
||||
/**
|
||||
* Exclusive test-case.
|
||||
*/
|
||||
|
||||
context.test.only = function(title, fn) {
|
||||
var test = context.test(title, fn);
|
||||
var reString = '^' + escapeRe(test.fullTitle()) + '$';
|
||||
mocha.grep(new RegExp(reString));
|
||||
};
|
||||
|
||||
context.test.skip = common.test.skip;
|
||||
context.test.retries = common.test.retries;
|
||||
});
|
||||
};
|
||||
106
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/interfaces/tdd.js
generated
vendored
106
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/interfaces/tdd.js
generated
vendored
@@ -1,106 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var Suite = require('../suite');
|
||||
var Test = require('../test');
|
||||
var escapeRe = require('escape-string-regexp');
|
||||
|
||||
/**
|
||||
* TDD-style interface:
|
||||
*
|
||||
* suite('Array', function() {
|
||||
* suite('#indexOf()', function() {
|
||||
* suiteSetup(function() {
|
||||
*
|
||||
* });
|
||||
*
|
||||
* test('should return -1 when not present', function() {
|
||||
*
|
||||
* });
|
||||
*
|
||||
* test('should return the index when present', function() {
|
||||
*
|
||||
* });
|
||||
*
|
||||
* suiteTeardown(function() {
|
||||
*
|
||||
* });
|
||||
* });
|
||||
* });
|
||||
*
|
||||
* @param {Suite} suite Root suite.
|
||||
*/
|
||||
module.exports = function(suite) {
|
||||
var suites = [suite];
|
||||
|
||||
suite.on('pre-require', function(context, file, mocha) {
|
||||
var common = require('./common')(suites, context);
|
||||
|
||||
context.setup = common.beforeEach;
|
||||
context.teardown = common.afterEach;
|
||||
context.suiteSetup = common.before;
|
||||
context.suiteTeardown = common.after;
|
||||
context.run = mocha.options.delay && common.runWithSuite(suite);
|
||||
|
||||
/**
|
||||
* Describe a "suite" with the given `title` and callback `fn` containing
|
||||
* nested suites and/or tests.
|
||||
*/
|
||||
context.suite = function(title, fn) {
|
||||
var suite = Suite.create(suites[0], title);
|
||||
suite.file = file;
|
||||
suites.unshift(suite);
|
||||
fn.call(suite);
|
||||
suites.shift();
|
||||
return suite;
|
||||
};
|
||||
|
||||
/**
|
||||
* Pending suite.
|
||||
*/
|
||||
context.suite.skip = function(title, fn) {
|
||||
var suite = Suite.create(suites[0], title);
|
||||
suite.pending = true;
|
||||
suites.unshift(suite);
|
||||
fn.call(suite);
|
||||
suites.shift();
|
||||
};
|
||||
|
||||
/**
|
||||
* Exclusive test-case.
|
||||
*/
|
||||
context.suite.only = function(title, fn) {
|
||||
var suite = context.suite(title, fn);
|
||||
mocha.grep(suite.fullTitle());
|
||||
};
|
||||
|
||||
/**
|
||||
* Describe a specification or test-case with the given `title` and
|
||||
* callback `fn` acting as a thunk.
|
||||
*/
|
||||
context.test = function(title, fn) {
|
||||
var suite = suites[0];
|
||||
if (suite.isPending()) {
|
||||
fn = null;
|
||||
}
|
||||
var test = new Test(title, fn);
|
||||
test.file = file;
|
||||
suite.addTest(test);
|
||||
return test;
|
||||
};
|
||||
|
||||
/**
|
||||
* Exclusive test-case.
|
||||
*/
|
||||
|
||||
context.test.only = function(title, fn) {
|
||||
var test = context.test(title, fn);
|
||||
var reString = '^' + escapeRe(test.fullTitle()) + '$';
|
||||
mocha.grep(new RegExp(reString));
|
||||
};
|
||||
|
||||
context.test.skip = common.test.skip;
|
||||
context.test.retries = common.test.retries;
|
||||
});
|
||||
};
|
||||
503
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/mocha.js
generated
vendored
503
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/mocha.js
generated
vendored
@@ -1,503 +0,0 @@
|
||||
/*!
|
||||
* mocha
|
||||
* Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>
|
||||
* MIT Licensed
|
||||
*/
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var escapeRe = require('escape-string-regexp');
|
||||
var path = require('path');
|
||||
var reporters = require('./reporters');
|
||||
var utils = require('./utils');
|
||||
|
||||
/**
|
||||
* Expose `Mocha`.
|
||||
*/
|
||||
|
||||
exports = module.exports = Mocha;
|
||||
|
||||
/**
|
||||
* To require local UIs and reporters when running in node.
|
||||
*/
|
||||
|
||||
if (!process.browser) {
|
||||
var cwd = process.cwd();
|
||||
module.paths.push(cwd, path.join(cwd, 'node_modules'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose internals.
|
||||
*/
|
||||
|
||||
exports.utils = utils;
|
||||
exports.interfaces = require('./interfaces');
|
||||
exports.reporters = reporters;
|
||||
exports.Runnable = require('./runnable');
|
||||
exports.Context = require('./context');
|
||||
exports.Runner = require('./runner');
|
||||
exports.Suite = require('./suite');
|
||||
exports.Hook = require('./hook');
|
||||
exports.Test = require('./test');
|
||||
|
||||
/**
|
||||
* Return image `name` path.
|
||||
*
|
||||
* @api private
|
||||
* @param {string} name
|
||||
* @return {string}
|
||||
*/
|
||||
function image(name) {
|
||||
return path.join(__dirname, '../images', name + '.png');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up mocha with `options`.
|
||||
*
|
||||
* Options:
|
||||
*
|
||||
* - `ui` name "bdd", "tdd", "exports" etc
|
||||
* - `reporter` reporter instance, defaults to `mocha.reporters.spec`
|
||||
* - `globals` array of accepted globals
|
||||
* - `timeout` timeout in milliseconds
|
||||
* - `retries` number of times to retry failed tests
|
||||
* - `bail` bail on the first test failure
|
||||
* - `slow` milliseconds to wait before considering a test slow
|
||||
* - `ignoreLeaks` ignore global leaks
|
||||
* - `fullTrace` display the full stack-trace on failing
|
||||
* - `grep` string or regexp to filter tests with
|
||||
*
|
||||
* @param {Object} options
|
||||
* @api public
|
||||
*/
|
||||
function Mocha(options) {
|
||||
options = options || {};
|
||||
this.files = [];
|
||||
this.options = options;
|
||||
if (options.grep) {
|
||||
this.grep(new RegExp(options.grep));
|
||||
}
|
||||
if (options.fgrep) {
|
||||
this.grep(options.fgrep);
|
||||
}
|
||||
this.suite = new exports.Suite('', new exports.Context());
|
||||
this.ui(options.ui);
|
||||
this.bail(options.bail);
|
||||
this.reporter(options.reporter, options.reporterOptions);
|
||||
if (typeof options.timeout !== 'undefined' && options.timeout !== null) {
|
||||
this.timeout(options.timeout);
|
||||
}
|
||||
if (typeof options.retries !== 'undefined' && options.retries !== null) {
|
||||
this.retries(options.retries);
|
||||
}
|
||||
this.useColors(options.useColors);
|
||||
if (options.enableTimeouts !== null) {
|
||||
this.enableTimeouts(options.enableTimeouts);
|
||||
}
|
||||
if (options.slow) {
|
||||
this.slow(options.slow);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable or disable bailing on the first failure.
|
||||
*
|
||||
* @api public
|
||||
* @param {boolean} [bail]
|
||||
*/
|
||||
Mocha.prototype.bail = function(bail) {
|
||||
if (!arguments.length) {
|
||||
bail = true;
|
||||
}
|
||||
this.suite.bail(bail);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Add test `file`.
|
||||
*
|
||||
* @api public
|
||||
* @param {string} file
|
||||
*/
|
||||
Mocha.prototype.addFile = function(file) {
|
||||
this.files.push(file);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set reporter to `reporter`, defaults to "spec".
|
||||
*
|
||||
* @param {String|Function} reporter name or constructor
|
||||
* @param {Object} reporterOptions optional options
|
||||
* @api public
|
||||
* @param {string|Function} reporter name or constructor
|
||||
* @param {Object} reporterOptions optional options
|
||||
*/
|
||||
Mocha.prototype.reporter = function(reporter, reporterOptions) {
|
||||
if (typeof reporter === 'function') {
|
||||
this._reporter = reporter;
|
||||
} else {
|
||||
reporter = reporter || 'spec';
|
||||
var _reporter;
|
||||
// Try to load a built-in reporter.
|
||||
if (reporters[reporter]) {
|
||||
_reporter = reporters[reporter];
|
||||
}
|
||||
// Try to load reporters from process.cwd() and node_modules
|
||||
if (!_reporter) {
|
||||
try {
|
||||
_reporter = require(reporter);
|
||||
} catch (err) {
|
||||
err.message.indexOf('Cannot find module') !== -1
|
||||
? console.warn('"' + reporter + '" reporter not found')
|
||||
: console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack);
|
||||
}
|
||||
}
|
||||
if (!_reporter && reporter === 'teamcity') {
|
||||
console.warn('The Teamcity reporter was moved to a package named '
|
||||
+ 'mocha-teamcity-reporter '
|
||||
+ '(https://npmjs.org/package/mocha-teamcity-reporter).');
|
||||
}
|
||||
if (!_reporter) {
|
||||
throw new Error('invalid reporter "' + reporter + '"');
|
||||
}
|
||||
this._reporter = _reporter;
|
||||
}
|
||||
this.options.reporterOptions = reporterOptions;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set test UI `name`, defaults to "bdd".
|
||||
*
|
||||
* @api public
|
||||
* @param {string} bdd
|
||||
*/
|
||||
Mocha.prototype.ui = function(name) {
|
||||
name = name || 'bdd';
|
||||
this._ui = exports.interfaces[name];
|
||||
if (!this._ui) {
|
||||
try {
|
||||
this._ui = require(name);
|
||||
} catch (err) {
|
||||
throw new Error('invalid interface "' + name + '"');
|
||||
}
|
||||
}
|
||||
this._ui = this._ui(this.suite);
|
||||
|
||||
this.suite.on('pre-require', function(context) {
|
||||
exports.afterEach = context.afterEach || context.teardown;
|
||||
exports.after = context.after || context.suiteTeardown;
|
||||
exports.beforeEach = context.beforeEach || context.setup;
|
||||
exports.before = context.before || context.suiteSetup;
|
||||
exports.describe = context.describe || context.suite;
|
||||
exports.it = context.it || context.test;
|
||||
exports.setup = context.setup || context.beforeEach;
|
||||
exports.suiteSetup = context.suiteSetup || context.before;
|
||||
exports.suiteTeardown = context.suiteTeardown || context.after;
|
||||
exports.suite = context.suite || context.describe;
|
||||
exports.teardown = context.teardown || context.afterEach;
|
||||
exports.test = context.test || context.it;
|
||||
exports.run = context.run;
|
||||
});
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Load registered files.
|
||||
*
|
||||
* @api private
|
||||
*/
|
||||
Mocha.prototype.loadFiles = function(fn) {
|
||||
var self = this;
|
||||
var suite = this.suite;
|
||||
this.files.forEach(function(file) {
|
||||
file = path.resolve(file);
|
||||
suite.emit('pre-require', global, file, self);
|
||||
suite.emit('require', require(file), file, self);
|
||||
suite.emit('post-require', global, file, self);
|
||||
});
|
||||
fn && fn();
|
||||
};
|
||||
|
||||
/**
|
||||
* Enable growl support.
|
||||
*
|
||||
* @api private
|
||||
*/
|
||||
Mocha.prototype._growl = function(runner, reporter) {
|
||||
var notify = require('growl');
|
||||
|
||||
runner.on('end', function() {
|
||||
var stats = reporter.stats;
|
||||
if (stats.failures) {
|
||||
var msg = stats.failures + ' of ' + runner.total + ' tests failed';
|
||||
notify(msg, { name: 'mocha', title: 'Failed', image: image('error') });
|
||||
} else {
|
||||
notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
|
||||
name: 'mocha',
|
||||
title: 'Passed',
|
||||
image: image('ok')
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Add regexp to grep, if `re` is a string it is escaped.
|
||||
*
|
||||
* @param {RegExp|String} re
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
* @param {RegExp|string} re
|
||||
* @return {Mocha}
|
||||
*/
|
||||
Mocha.prototype.grep = function(re) {
|
||||
this.options.grep = typeof re === 'string' ? new RegExp(escapeRe(re)) : re;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Invert `.grep()` matches.
|
||||
*
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
*/
|
||||
Mocha.prototype.invert = function() {
|
||||
this.options.invert = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Ignore global leaks.
|
||||
*
|
||||
* @param {Boolean} ignore
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
* @param {boolean} ignore
|
||||
* @return {Mocha}
|
||||
*/
|
||||
Mocha.prototype.ignoreLeaks = function(ignore) {
|
||||
this.options.ignoreLeaks = Boolean(ignore);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Enable global leak checking.
|
||||
*
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
*/
|
||||
Mocha.prototype.checkLeaks = function() {
|
||||
this.options.ignoreLeaks = false;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Display long stack-trace on failing
|
||||
*
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
*/
|
||||
Mocha.prototype.fullTrace = function() {
|
||||
this.options.fullStackTrace = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Enable growl support.
|
||||
*
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
*/
|
||||
Mocha.prototype.growl = function() {
|
||||
this.options.growl = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Ignore `globals` array or string.
|
||||
*
|
||||
* @param {Array|String} globals
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
* @param {Array|string} globals
|
||||
* @return {Mocha}
|
||||
*/
|
||||
Mocha.prototype.globals = function(globals) {
|
||||
this.options.globals = (this.options.globals || []).concat(globals);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Emit color output.
|
||||
*
|
||||
* @param {Boolean} colors
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
* @param {boolean} colors
|
||||
* @return {Mocha}
|
||||
*/
|
||||
Mocha.prototype.useColors = function(colors) {
|
||||
if (colors !== undefined) {
|
||||
this.options.useColors = colors;
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Use inline diffs rather than +/-.
|
||||
*
|
||||
* @param {Boolean} inlineDiffs
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
* @param {boolean} inlineDiffs
|
||||
* @return {Mocha}
|
||||
*/
|
||||
Mocha.prototype.useInlineDiffs = function(inlineDiffs) {
|
||||
this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the timeout in milliseconds.
|
||||
*
|
||||
* @param {Number} timeout
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
* @param {number} timeout
|
||||
* @return {Mocha}
|
||||
*/
|
||||
Mocha.prototype.timeout = function(timeout) {
|
||||
this.suite.timeout(timeout);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the number of times to retry failed tests.
|
||||
*
|
||||
* @param {Number} retry times
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
*/
|
||||
Mocha.prototype.retries = function(n) {
|
||||
this.suite.retries(n);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set slowness threshold in milliseconds.
|
||||
*
|
||||
* @param {Number} slow
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
* @param {number} slow
|
||||
* @return {Mocha}
|
||||
*/
|
||||
Mocha.prototype.slow = function(slow) {
|
||||
this.suite.slow(slow);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Enable timeouts.
|
||||
*
|
||||
* @param {Boolean} enabled
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
* @param {boolean} enabled
|
||||
* @return {Mocha}
|
||||
*/
|
||||
Mocha.prototype.enableTimeouts = function(enabled) {
|
||||
this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Makes all tests async (accepting a callback)
|
||||
*
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
*/
|
||||
Mocha.prototype.asyncOnly = function() {
|
||||
this.options.asyncOnly = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Disable syntax highlighting (in browser).
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
Mocha.prototype.noHighlighting = function() {
|
||||
this.options.noHighlighting = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Enable uncaught errors to propagate (in browser).
|
||||
*
|
||||
* @return {Mocha}
|
||||
* @api public
|
||||
*/
|
||||
Mocha.prototype.allowUncaught = function() {
|
||||
this.options.allowUncaught = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Delay root suite execution.
|
||||
* @returns {Mocha}
|
||||
*/
|
||||
Mocha.prototype.delay = function delay() {
|
||||
this.options.delay = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Run tests and invoke `fn()` when complete.
|
||||
*
|
||||
* @api public
|
||||
* @param {Function} fn
|
||||
* @return {Runner}
|
||||
*/
|
||||
Mocha.prototype.run = function(fn) {
|
||||
if (this.files.length) {
|
||||
this.loadFiles();
|
||||
}
|
||||
var suite = this.suite;
|
||||
var options = this.options;
|
||||
options.files = this.files;
|
||||
var runner = new exports.Runner(suite, options.delay);
|
||||
var reporter = new this._reporter(runner, options);
|
||||
runner.ignoreLeaks = options.ignoreLeaks !== false;
|
||||
runner.fullStackTrace = options.fullStackTrace;
|
||||
runner.asyncOnly = options.asyncOnly;
|
||||
runner.allowUncaught = options.allowUncaught;
|
||||
if (options.grep) {
|
||||
runner.grep(options.grep, options.invert);
|
||||
}
|
||||
if (options.globals) {
|
||||
runner.globals(options.globals);
|
||||
}
|
||||
if (options.growl) {
|
||||
this._growl(runner, reporter);
|
||||
}
|
||||
if (options.useColors !== undefined) {
|
||||
exports.reporters.Base.useColors = options.useColors;
|
||||
}
|
||||
exports.reporters.Base.inlineDiffs = options.useInlineDiffs;
|
||||
|
||||
function done(failures) {
|
||||
if (reporter.done) {
|
||||
reporter.done(failures, fn);
|
||||
} else {
|
||||
fn && fn(failures);
|
||||
}
|
||||
}
|
||||
|
||||
return runner.run(done);
|
||||
};
|
||||
128
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/ms.js
generated
vendored
128
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/ms.js
generated
vendored
@@ -1,128 +0,0 @@
|
||||
/**
|
||||
* Helpers.
|
||||
*/
|
||||
|
||||
var s = 1000;
|
||||
var m = s * 60;
|
||||
var h = m * 60;
|
||||
var d = h * 24;
|
||||
var y = d * 365.25;
|
||||
|
||||
/**
|
||||
* Parse or format the given `val`.
|
||||
*
|
||||
* Options:
|
||||
*
|
||||
* - `long` verbose formatting [false]
|
||||
*
|
||||
* @api public
|
||||
* @param {string|number} val
|
||||
* @param {Object} options
|
||||
* @return {string|number}
|
||||
*/
|
||||
module.exports = function(val, options) {
|
||||
options = options || {};
|
||||
if (typeof val === 'string') {
|
||||
return parse(val);
|
||||
}
|
||||
// https://github.com/mochajs/mocha/pull/1035
|
||||
return options['long'] ? longFormat(val) : shortFormat(val);
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse the given `str` and return milliseconds.
|
||||
*
|
||||
* @api private
|
||||
* @param {string} str
|
||||
* @return {number}
|
||||
*/
|
||||
function parse(str) {
|
||||
var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str);
|
||||
if (!match) {
|
||||
return;
|
||||
}
|
||||
var n = parseFloat(match[1]);
|
||||
var type = (match[2] || 'ms').toLowerCase();
|
||||
switch (type) {
|
||||
case 'years':
|
||||
case 'year':
|
||||
case 'y':
|
||||
return n * y;
|
||||
case 'days':
|
||||
case 'day':
|
||||
case 'd':
|
||||
return n * d;
|
||||
case 'hours':
|
||||
case 'hour':
|
||||
case 'h':
|
||||
return n * h;
|
||||
case 'minutes':
|
||||
case 'minute':
|
||||
case 'm':
|
||||
return n * m;
|
||||
case 'seconds':
|
||||
case 'second':
|
||||
case 's':
|
||||
return n * s;
|
||||
case 'ms':
|
||||
return n;
|
||||
default:
|
||||
// No default case
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Short format for `ms`.
|
||||
*
|
||||
* @api private
|
||||
* @param {number} ms
|
||||
* @return {string}
|
||||
*/
|
||||
function shortFormat(ms) {
|
||||
if (ms >= d) {
|
||||
return Math.round(ms / d) + 'd';
|
||||
}
|
||||
if (ms >= h) {
|
||||
return Math.round(ms / h) + 'h';
|
||||
}
|
||||
if (ms >= m) {
|
||||
return Math.round(ms / m) + 'm';
|
||||
}
|
||||
if (ms >= s) {
|
||||
return Math.round(ms / s) + 's';
|
||||
}
|
||||
return ms + 'ms';
|
||||
}
|
||||
|
||||
/**
|
||||
* Long format for `ms`.
|
||||
*
|
||||
* @api private
|
||||
* @param {number} ms
|
||||
* @return {string}
|
||||
*/
|
||||
function longFormat(ms) {
|
||||
return plural(ms, d, 'day')
|
||||
|| plural(ms, h, 'hour')
|
||||
|| plural(ms, m, 'minute')
|
||||
|| plural(ms, s, 'second')
|
||||
|| ms + ' ms';
|
||||
}
|
||||
|
||||
/**
|
||||
* Pluralization helper.
|
||||
*
|
||||
* @api private
|
||||
* @param {number} ms
|
||||
* @param {number} n
|
||||
* @param {string} name
|
||||
*/
|
||||
function plural(ms, n, name) {
|
||||
if (ms < n) {
|
||||
return;
|
||||
}
|
||||
if (ms < n * 1.5) {
|
||||
return Math.floor(ms / n) + ' ' + name;
|
||||
}
|
||||
return Math.ceil(ms / n) + ' ' + name + 's';
|
||||
}
|
||||
15
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/pending.js
generated
vendored
15
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/pending.js
generated
vendored
@@ -1,15 +0,0 @@
|
||||
|
||||
/**
|
||||
* Expose `Pending`.
|
||||
*/
|
||||
|
||||
module.exports = Pending;
|
||||
|
||||
/**
|
||||
* Initialize a new `Pending` error with the given message.
|
||||
*
|
||||
* @param {string} message
|
||||
*/
|
||||
function Pending(message) {
|
||||
this.message = message;
|
||||
}
|
||||
487
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/reporters/base.js
generated
vendored
487
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/reporters/base.js
generated
vendored
@@ -1,487 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var tty = require('tty');
|
||||
var diff = require('diff');
|
||||
var ms = require('../ms');
|
||||
var utils = require('../utils');
|
||||
var supportsColor = process.browser ? null : require('supports-color');
|
||||
|
||||
/**
|
||||
* Expose `Base`.
|
||||
*/
|
||||
|
||||
exports = module.exports = Base;
|
||||
|
||||
/**
|
||||
* Save timer references to avoid Sinon interfering.
|
||||
* See: https://github.com/mochajs/mocha/issues/237
|
||||
*/
|
||||
|
||||
/* eslint-disable no-unused-vars, no-native-reassign */
|
||||
var Date = global.Date;
|
||||
var setTimeout = global.setTimeout;
|
||||
var setInterval = global.setInterval;
|
||||
var clearTimeout = global.clearTimeout;
|
||||
var clearInterval = global.clearInterval;
|
||||
/* eslint-enable no-unused-vars, no-native-reassign */
|
||||
|
||||
/**
|
||||
* Check if both stdio streams are associated with a tty.
|
||||
*/
|
||||
|
||||
var isatty = tty.isatty(1) && tty.isatty(2);
|
||||
|
||||
/**
|
||||
* Enable coloring by default, except in the browser interface.
|
||||
*/
|
||||
|
||||
exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined));
|
||||
|
||||
/**
|
||||
* Inline diffs instead of +/-
|
||||
*/
|
||||
|
||||
exports.inlineDiffs = false;
|
||||
|
||||
/**
|
||||
* Default color map.
|
||||
*/
|
||||
|
||||
exports.colors = {
|
||||
pass: 90,
|
||||
fail: 31,
|
||||
'bright pass': 92,
|
||||
'bright fail': 91,
|
||||
'bright yellow': 93,
|
||||
pending: 36,
|
||||
suite: 0,
|
||||
'error title': 0,
|
||||
'error message': 31,
|
||||
'error stack': 90,
|
||||
checkmark: 32,
|
||||
fast: 90,
|
||||
medium: 33,
|
||||
slow: 31,
|
||||
green: 32,
|
||||
light: 90,
|
||||
'diff gutter': 90,
|
||||
'diff added': 32,
|
||||
'diff removed': 31
|
||||
};
|
||||
|
||||
/**
|
||||
* Default symbol map.
|
||||
*/
|
||||
|
||||
exports.symbols = {
|
||||
ok: '✓',
|
||||
err: '✖',
|
||||
dot: '․'
|
||||
};
|
||||
|
||||
// With node.js on Windows: use symbols available in terminal default fonts
|
||||
if (process.platform === 'win32') {
|
||||
exports.symbols.ok = '\u221A';
|
||||
exports.symbols.err = '\u00D7';
|
||||
exports.symbols.dot = '.';
|
||||
}
|
||||
|
||||
/**
|
||||
* Color `str` with the given `type`,
|
||||
* allowing colors to be disabled,
|
||||
* as well as user-defined color
|
||||
* schemes.
|
||||
*
|
||||
* @param {string} type
|
||||
* @param {string} str
|
||||
* @return {string}
|
||||
* @api private
|
||||
*/
|
||||
var color = exports.color = function(type, str) {
|
||||
if (!exports.useColors) {
|
||||
return String(str);
|
||||
}
|
||||
return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m';
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose term window size, with some defaults for when stderr is not a tty.
|
||||
*/
|
||||
|
||||
exports.window = {
|
||||
width: 75
|
||||
};
|
||||
|
||||
if (isatty) {
|
||||
exports.window.width = process.stdout.getWindowSize
|
||||
? process.stdout.getWindowSize(1)[0]
|
||||
: tty.getWindowSize()[1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose some basic cursor interactions that are common among reporters.
|
||||
*/
|
||||
|
||||
exports.cursor = {
|
||||
hide: function() {
|
||||
isatty && process.stdout.write('\u001b[?25l');
|
||||
},
|
||||
|
||||
show: function() {
|
||||
isatty && process.stdout.write('\u001b[?25h');
|
||||
},
|
||||
|
||||
deleteLine: function() {
|
||||
isatty && process.stdout.write('\u001b[2K');
|
||||
},
|
||||
|
||||
beginningOfLine: function() {
|
||||
isatty && process.stdout.write('\u001b[0G');
|
||||
},
|
||||
|
||||
CR: function() {
|
||||
if (isatty) {
|
||||
exports.cursor.deleteLine();
|
||||
exports.cursor.beginningOfLine();
|
||||
} else {
|
||||
process.stdout.write('\r');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Outut the given `failures` as a list.
|
||||
*
|
||||
* @param {Array} failures
|
||||
* @api public
|
||||
*/
|
||||
|
||||
exports.list = function(failures) {
|
||||
console.log();
|
||||
failures.forEach(function(test, i) {
|
||||
// format
|
||||
var fmt = color('error title', ' %s) %s:\n')
|
||||
+ color('error message', ' %s')
|
||||
+ color('error stack', '\n%s\n');
|
||||
|
||||
// msg
|
||||
var msg;
|
||||
var err = test.err;
|
||||
var message;
|
||||
if (err.message && typeof err.message.toString === 'function') {
|
||||
message = err.message + '';
|
||||
} else if (typeof err.inspect === 'function') {
|
||||
message = err.inspect() + '';
|
||||
} else {
|
||||
message = '';
|
||||
}
|
||||
var stack = err.stack || message;
|
||||
var index = stack.indexOf(message);
|
||||
var actual = err.actual;
|
||||
var expected = err.expected;
|
||||
var escape = true;
|
||||
|
||||
if (index === -1) {
|
||||
msg = message;
|
||||
} else {
|
||||
index += message.length;
|
||||
msg = stack.slice(0, index);
|
||||
// remove msg from stack
|
||||
stack = stack.slice(index + 1);
|
||||
}
|
||||
|
||||
// uncaught
|
||||
if (err.uncaught) {
|
||||
msg = 'Uncaught ' + msg;
|
||||
}
|
||||
// explicitly show diff
|
||||
if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) {
|
||||
escape = false;
|
||||
if (!(utils.isString(actual) && utils.isString(expected))) {
|
||||
err.actual = actual = utils.stringify(actual);
|
||||
err.expected = expected = utils.stringify(expected);
|
||||
}
|
||||
|
||||
fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n');
|
||||
var match = message.match(/^([^:]+): expected/);
|
||||
msg = '\n ' + color('error message', match ? match[1] : msg);
|
||||
|
||||
if (exports.inlineDiffs) {
|
||||
msg += inlineDiff(err, escape);
|
||||
} else {
|
||||
msg += unifiedDiff(err, escape);
|
||||
}
|
||||
}
|
||||
|
||||
// indent stack trace
|
||||
stack = stack.replace(/^/gm, ' ');
|
||||
|
||||
console.log(fmt, (i + 1), test.fullTitle(), msg, stack);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize a new `Base` reporter.
|
||||
*
|
||||
* All other reporters generally
|
||||
* inherit from this reporter, providing
|
||||
* stats such as test duration, number
|
||||
* of tests passed / failed etc.
|
||||
*
|
||||
* @param {Runner} runner
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function Base(runner) {
|
||||
var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 };
|
||||
var failures = this.failures = [];
|
||||
|
||||
if (!runner) {
|
||||
return;
|
||||
}
|
||||
this.runner = runner;
|
||||
|
||||
runner.stats = stats;
|
||||
|
||||
runner.on('start', function() {
|
||||
stats.start = new Date();
|
||||
});
|
||||
|
||||
runner.on('suite', function(suite) {
|
||||
stats.suites = stats.suites || 0;
|
||||
suite.root || stats.suites++;
|
||||
});
|
||||
|
||||
runner.on('test end', function() {
|
||||
stats.tests = stats.tests || 0;
|
||||
stats.tests++;
|
||||
});
|
||||
|
||||
runner.on('pass', function(test) {
|
||||
stats.passes = stats.passes || 0;
|
||||
|
||||
if (test.duration > test.slow()) {
|
||||
test.speed = 'slow';
|
||||
} else if (test.duration > test.slow() / 2) {
|
||||
test.speed = 'medium';
|
||||
} else {
|
||||
test.speed = 'fast';
|
||||
}
|
||||
|
||||
stats.passes++;
|
||||
});
|
||||
|
||||
runner.on('fail', function(test, err) {
|
||||
stats.failures = stats.failures || 0;
|
||||
stats.failures++;
|
||||
test.err = err;
|
||||
failures.push(test);
|
||||
});
|
||||
|
||||
runner.on('end', function() {
|
||||
stats.end = new Date();
|
||||
stats.duration = new Date() - stats.start;
|
||||
});
|
||||
|
||||
runner.on('pending', function() {
|
||||
stats.pending++;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Output common epilogue used by many of
|
||||
* the bundled reporters.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
Base.prototype.epilogue = function() {
|
||||
var stats = this.stats;
|
||||
var fmt;
|
||||
|
||||
console.log();
|
||||
|
||||
// passes
|
||||
fmt = color('bright pass', ' ')
|
||||
+ color('green', ' %d passing')
|
||||
+ color('light', ' (%s)');
|
||||
|
||||
console.log(fmt,
|
||||
stats.passes || 0,
|
||||
ms(stats.duration));
|
||||
|
||||
// pending
|
||||
if (stats.pending) {
|
||||
fmt = color('pending', ' ')
|
||||
+ color('pending', ' %d pending');
|
||||
|
||||
console.log(fmt, stats.pending);
|
||||
}
|
||||
|
||||
// failures
|
||||
if (stats.failures) {
|
||||
fmt = color('fail', ' %d failing');
|
||||
|
||||
console.log(fmt, stats.failures);
|
||||
|
||||
Base.list(this.failures);
|
||||
console.log();
|
||||
}
|
||||
|
||||
console.log();
|
||||
};
|
||||
|
||||
/**
|
||||
* Pad the given `str` to `len`.
|
||||
*
|
||||
* @api private
|
||||
* @param {string} str
|
||||
* @param {string} len
|
||||
* @return {string}
|
||||
*/
|
||||
function pad(str, len) {
|
||||
str = String(str);
|
||||
return Array(len - str.length + 1).join(' ') + str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an inline diff between 2 strings with coloured ANSI output
|
||||
*
|
||||
* @api private
|
||||
* @param {Error} err with actual/expected
|
||||
* @param {boolean} escape
|
||||
* @return {string} Diff
|
||||
*/
|
||||
function inlineDiff(err, escape) {
|
||||
var msg = errorDiff(err, 'WordsWithSpace', escape);
|
||||
|
||||
// linenos
|
||||
var lines = msg.split('\n');
|
||||
if (lines.length > 4) {
|
||||
var width = String(lines.length).length;
|
||||
msg = lines.map(function(str, i) {
|
||||
return pad(++i, width) + ' |' + ' ' + str;
|
||||
}).join('\n');
|
||||
}
|
||||
|
||||
// legend
|
||||
msg = '\n'
|
||||
+ color('diff removed', 'actual')
|
||||
+ ' '
|
||||
+ color('diff added', 'expected')
|
||||
+ '\n\n'
|
||||
+ msg
|
||||
+ '\n';
|
||||
|
||||
// indent
|
||||
msg = msg.replace(/^/gm, ' ');
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a unified diff between two strings.
|
||||
*
|
||||
* @api private
|
||||
* @param {Error} err with actual/expected
|
||||
* @param {boolean} escape
|
||||
* @return {string} The diff.
|
||||
*/
|
||||
function unifiedDiff(err, escape) {
|
||||
var indent = ' ';
|
||||
function cleanUp(line) {
|
||||
if (escape) {
|
||||
line = escapeInvisibles(line);
|
||||
}
|
||||
if (line[0] === '+') {
|
||||
return indent + colorLines('diff added', line);
|
||||
}
|
||||
if (line[0] === '-') {
|
||||
return indent + colorLines('diff removed', line);
|
||||
}
|
||||
if (line.match(/\@\@/)) {
|
||||
return null;
|
||||
}
|
||||
if (line.match(/\\ No newline/)) {
|
||||
return null;
|
||||
}
|
||||
return indent + line;
|
||||
}
|
||||
function notBlank(line) {
|
||||
return typeof line !== 'undefined' && line !== null;
|
||||
}
|
||||
var msg = diff.createPatch('string', err.actual, err.expected);
|
||||
var lines = msg.split('\n').splice(4);
|
||||
return '\n '
|
||||
+ colorLines('diff added', '+ expected') + ' '
|
||||
+ colorLines('diff removed', '- actual')
|
||||
+ '\n\n'
|
||||
+ lines.map(cleanUp).filter(notBlank).join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a character diff for `err`.
|
||||
*
|
||||
* @api private
|
||||
* @param {Error} err
|
||||
* @param {string} type
|
||||
* @param {boolean} escape
|
||||
* @return {string}
|
||||
*/
|
||||
function errorDiff(err, type, escape) {
|
||||
var actual = escape ? escapeInvisibles(err.actual) : err.actual;
|
||||
var expected = escape ? escapeInvisibles(err.expected) : err.expected;
|
||||
return diff['diff' + type](actual, expected).map(function(str) {
|
||||
if (str.added) {
|
||||
return colorLines('diff added', str.value);
|
||||
}
|
||||
if (str.removed) {
|
||||
return colorLines('diff removed', str.value);
|
||||
}
|
||||
return str.value;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string with all invisible characters in plain text
|
||||
*
|
||||
* @api private
|
||||
* @param {string} line
|
||||
* @return {string}
|
||||
*/
|
||||
function escapeInvisibles(line) {
|
||||
return line.replace(/\t/g, '<tab>')
|
||||
.replace(/\r/g, '<CR>')
|
||||
.replace(/\n/g, '<LF>\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Color lines for `str`, using the color `name`.
|
||||
*
|
||||
* @api private
|
||||
* @param {string} name
|
||||
* @param {string} str
|
||||
* @return {string}
|
||||
*/
|
||||
function colorLines(name, str) {
|
||||
return str.split('\n').map(function(str) {
|
||||
return color(name, str);
|
||||
}).join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Object#toString reference.
|
||||
*/
|
||||
var objToString = Object.prototype.toString;
|
||||
|
||||
/**
|
||||
* Check that a / b have the same type.
|
||||
*
|
||||
* @api private
|
||||
* @param {Object} a
|
||||
* @param {Object} b
|
||||
* @return {boolean}
|
||||
*/
|
||||
function sameType(a, b) {
|
||||
return objToString.call(a) === objToString.call(b);
|
||||
}
|
||||
62
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/reporters/doc.js
generated
vendored
62
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/reporters/doc.js
generated
vendored
@@ -1,62 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var Base = require('./base');
|
||||
var utils = require('../utils');
|
||||
|
||||
/**
|
||||
* Expose `Doc`.
|
||||
*/
|
||||
|
||||
exports = module.exports = Doc;
|
||||
|
||||
/**
|
||||
* Initialize a new `Doc` reporter.
|
||||
*
|
||||
* @param {Runner} runner
|
||||
* @api public
|
||||
*/
|
||||
function Doc(runner) {
|
||||
Base.call(this, runner);
|
||||
|
||||
var indents = 2;
|
||||
|
||||
function indent() {
|
||||
return Array(indents).join(' ');
|
||||
}
|
||||
|
||||
runner.on('suite', function(suite) {
|
||||
if (suite.root) {
|
||||
return;
|
||||
}
|
||||
++indents;
|
||||
console.log('%s<section class="suite">', indent());
|
||||
++indents;
|
||||
console.log('%s<h1>%s</h1>', indent(), utils.escape(suite.title));
|
||||
console.log('%s<dl>', indent());
|
||||
});
|
||||
|
||||
runner.on('suite end', function(suite) {
|
||||
if (suite.root) {
|
||||
return;
|
||||
}
|
||||
console.log('%s</dl>', indent());
|
||||
--indents;
|
||||
console.log('%s</section>', indent());
|
||||
--indents;
|
||||
});
|
||||
|
||||
runner.on('pass', function(test) {
|
||||
console.log('%s <dt>%s</dt>', indent(), utils.escape(test.title));
|
||||
var code = utils.escape(utils.clean(test.body));
|
||||
console.log('%s <dd><pre><code>%s</code></pre></dd>', indent(), code);
|
||||
});
|
||||
|
||||
runner.on('fail', function(test, err) {
|
||||
console.log('%s <dt class="error">%s</dt>', indent(), utils.escape(test.title));
|
||||
var code = utils.escape(utils.clean(test.fn.body));
|
||||
console.log('%s <dd class="error"><pre><code>%s</code></pre></dd>', indent(), code);
|
||||
console.log('%s <dd class="error">%s</dd>', indent(), utils.escape(err));
|
||||
});
|
||||
}
|
||||
66
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/reporters/dot.js
generated
vendored
66
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/reporters/dot.js
generated
vendored
@@ -1,66 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var Base = require('./base');
|
||||
var inherits = require('../utils').inherits;
|
||||
var color = Base.color;
|
||||
|
||||
/**
|
||||
* Expose `Dot`.
|
||||
*/
|
||||
|
||||
exports = module.exports = Dot;
|
||||
|
||||
/**
|
||||
* Initialize a new `Dot` matrix test reporter.
|
||||
*
|
||||
* @api public
|
||||
* @param {Runner} runner
|
||||
*/
|
||||
function Dot(runner) {
|
||||
Base.call(this, runner);
|
||||
|
||||
var self = this;
|
||||
var width = Base.window.width * .75 | 0;
|
||||
var n = -1;
|
||||
|
||||
runner.on('start', function() {
|
||||
process.stdout.write('\n');
|
||||
});
|
||||
|
||||
runner.on('pending', function() {
|
||||
if (++n % width === 0) {
|
||||
process.stdout.write('\n ');
|
||||
}
|
||||
process.stdout.write(color('pending', Base.symbols.dot));
|
||||
});
|
||||
|
||||
runner.on('pass', function(test) {
|
||||
if (++n % width === 0) {
|
||||
process.stdout.write('\n ');
|
||||
}
|
||||
if (test.speed === 'slow') {
|
||||
process.stdout.write(color('bright yellow', Base.symbols.dot));
|
||||
} else {
|
||||
process.stdout.write(color(test.speed, Base.symbols.dot));
|
||||
}
|
||||
});
|
||||
|
||||
runner.on('fail', function() {
|
||||
if (++n % width === 0) {
|
||||
process.stdout.write('\n ');
|
||||
}
|
||||
process.stdout.write(color('fail', Base.symbols.dot));
|
||||
});
|
||||
|
||||
runner.on('end', function() {
|
||||
console.log();
|
||||
self.epilogue();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Inherit from `Base.prototype`.
|
||||
*/
|
||||
inherits(Dot, Base);
|
||||
@@ -1,56 +0,0 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var JSONCov = require('./json-cov');
|
||||
var readFileSync = require('fs').readFileSync;
|
||||
var join = require('path').join;
|
||||
|
||||
/**
|
||||
* Expose `HTMLCov`.
|
||||
*/
|
||||
|
||||
exports = module.exports = HTMLCov;
|
||||
|
||||
/**
|
||||
* Initialize a new `JsCoverage` reporter.
|
||||
*
|
||||
* @api public
|
||||
* @param {Runner} runner
|
||||
*/
|
||||
function HTMLCov(runner) {
|
||||
var jade = require('jade');
|
||||
var file = join(__dirname, '/templates/coverage.jade');
|
||||
var str = readFileSync(file, 'utf8');
|
||||
var fn = jade.compile(str, { filename: file });
|
||||
var self = this;
|
||||
|
||||
JSONCov.call(this, runner, false);
|
||||
|
||||
runner.on('end', function() {
|
||||
process.stdout.write(fn({
|
||||
cov: self.cov,
|
||||
coverageClass: coverageClass
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Return coverage class for a given coverage percentage.
|
||||
*
|
||||
* @api private
|
||||
* @param {number} coveragePctg
|
||||
* @return {string}
|
||||
*/
|
||||
function coverageClass(coveragePctg) {
|
||||
if (coveragePctg >= 75) {
|
||||
return 'high';
|
||||
}
|
||||
if (coveragePctg >= 50) {
|
||||
return 'medium';
|
||||
}
|
||||
if (coveragePctg >= 25) {
|
||||
return 'low';
|
||||
}
|
||||
return 'terrible';
|
||||
}
|
||||
343
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/reporters/html.js
generated
vendored
343
node_modules/code-push-plugin-testing-framework/node_modules/mocha/lib/reporters/html.js
generated
vendored
@@ -1,343 +0,0 @@
|
||||
/* eslint-env browser */
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var Base = require('./base');
|
||||
var utils = require('../utils');
|
||||
var Progress = require('../browser/progress');
|
||||
var escapeRe = require('escape-string-regexp');
|
||||
var escape = utils.escape;
|
||||
|
||||
/**
|
||||
* Save timer references to avoid Sinon interfering (see GH-237).
|
||||
*/
|
||||
|
||||
/* eslint-disable no-unused-vars, no-native-reassign */
|
||||
var Date = global.Date;
|
||||
var setTimeout = global.setTimeout;
|
||||
var setInterval = global.setInterval;
|
||||
var clearTimeout = global.clearTimeout;
|
||||
var clearInterval = global.clearInterval;
|
||||
/* eslint-enable no-unused-vars, no-native-reassign */
|
||||
|
||||
/**
|
||||
* Expose `HTML`.
|
||||
*/
|
||||
|
||||
exports = module.exports = HTML;
|
||||
|
||||
/**
|
||||
* Stats template.
|
||||
*/
|
||||
|
||||
var statsTemplate = '<ul id="mocha-stats">'
|
||||
+ '<li class="progress"><canvas width="40" height="40"></canvas></li>'
|
||||
+ '<li class="passes"><a href="javascript:void(0);">passes:</a> <em>0</em></li>'
|
||||
+ '<li class="failures"><a href="javascript:void(0);">failures:</a> <em>0</em></li>'
|
||||
+ '<li class="duration">duration: <em>0</em>s</li>'
|
||||
+ '</ul>';
|
||||
|
||||
/**
|
||||
* Initialize a new `HTML` reporter.
|
||||
*
|
||||
* @api public
|
||||
* @param {Runner} runner
|
||||
*/
|
||||
function HTML(runner) {
|
||||
Base.call(this, runner);
|
||||
|
||||
var self = this;
|
||||
var stats = this.stats;
|
||||
var stat = fragment(statsTemplate);
|
||||
var items = stat.getElementsByTagName('li');
|
||||
var passes = items[1].getElementsByTagName('em')[0];
|
||||
var passesLink = items[1].getElementsByTagName('a')[0];
|
||||
var failures = items[2].getElementsByTagName('em')[0];
|
||||
var failuresLink = items[2].getElementsByTagName('a')[0];
|
||||
var duration = items[3].getElementsByTagName('em')[0];
|
||||
var canvas = stat.getElementsByTagName('canvas')[0];
|
||||
var report = fragment('<ul id="mocha-report"></ul>');
|
||||
var stack = [report];
|
||||
var progress;
|
||||
var ctx;
|
||||
var root = document.getElementById('mocha');
|
||||
|
||||
if (canvas.getContext) {
|
||||
var ratio = window.devicePixelRatio || 1;
|
||||
canvas.style.width = canvas.width;
|
||||
canvas.style.height = canvas.height;
|
||||
canvas.width *= ratio;
|
||||
canvas.height *= ratio;
|
||||
ctx = canvas.getContext('2d');
|
||||
ctx.scale(ratio, ratio);
|
||||
progress = new Progress();
|
||||
}
|
||||
|
||||
if (!root) {
|
||||
return error('#mocha div missing, add it to your document');
|
||||
}
|
||||
|
||||
// pass toggle
|
||||
on(passesLink, 'click', function(evt) {
|
||||
evt.preventDefault();
|
||||
unhide();
|
||||
var name = (/pass/).test(report.className) ? '' : ' pass';
|
||||
report.className = report.className.replace(/fail|pass/g, '') + name;
|
||||
if (report.className.trim()) {
|
||||
hideSuitesWithout('test pass');
|
||||
}
|
||||
});
|
||||
|
||||
// failure toggle
|
||||
on(failuresLink, 'click', function(evt) {
|
||||
evt.preventDefault();
|
||||
unhide();
|
||||
var name = (/fail/).test(report.className) ? '' : ' fail';
|
||||
report.className = report.className.replace(/fail|pass/g, '') + name;
|
||||
if (report.className.trim()) {
|
||||
hideSuitesWithout('test fail');
|
||||
}
|
||||
});
|
||||
|
||||
root.appendChild(stat);
|
||||
root.appendChild(report);
|
||||
|
||||
if (progress) {
|
||||
progress.size(40);
|
||||
}
|
||||
|
||||
runner.on('suite', function(suite) {
|
||||
if (suite.root) {
|
||||
return;
|
||||
}
|
||||
|
||||
// suite
|
||||
var url = self.suiteURL(suite);
|
||||
var el = fragment('<li class="suite"><h1><a href="%s">%s</a></h1></li>', url, escape(suite.title));
|
||||
|
||||
// container
|
||||
stack[0].appendChild(el);
|
||||
stack.unshift(document.createElement('ul'));
|
||||
el.appendChild(stack[0]);
|
||||
});
|
||||
|
||||
runner.on('suite end', function(suite) {
|
||||
if (suite.root) {
|
||||
return;
|
||||
}
|
||||
stack.shift();
|
||||
});
|
||||
|
||||
runner.on('pass', function(test) {
|
||||
var url = self.testURL(test);
|
||||
var markup = '<li class="test pass %e"><h2>%e<span class="duration">%ems</span> '
|
||||
+ '<a href="%s" class="replay">‣</a></h2></li>';
|
||||
var el = fragment(markup, test.speed, test.title, test.duration, url);
|
||||
self.addCodeToggle(el, test.body);
|
||||
appendToStack(el);
|
||||
updateStats();
|
||||
});
|
||||
|
||||
runner.on('fail', function(test) {
|
||||
var el = fragment('<li class="test fail"><h2>%e <a href="%e" class="replay">‣</a></h2></li>',
|
||||
test.title, self.testURL(test));
|
||||
var stackString; // Note: Includes leading newline
|
||||
var message = test.err.toString();
|
||||
|
||||
// <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
|
||||
// check for the result of the stringifying.
|
||||
if (message === '[object Error]') {
|
||||
message = test.err.message;
|
||||
}
|
||||
|
||||
if (test.err.stack) {
|
||||
var indexOfMessage = test.err.stack.indexOf(test.err.message);
|
||||
if (indexOfMessage === -1) {
|
||||
stackString = test.err.stack;
|
||||
} else {
|
||||
stackString = test.err.stack.substr(test.err.message.length + indexOfMessage);
|
||||
}
|
||||
} else if (test.err.sourceURL && test.err.line !== undefined) {
|
||||
// Safari doesn't give you a stack. Let's at least provide a source line.
|
||||
stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')';
|
||||
}
|
||||
|
||||
stackString = stackString || '';
|
||||
|
||||
if (test.err.htmlMessage && stackString) {
|
||||
el.appendChild(fragment('<div class="html-error">%s\n<pre class="error">%e</pre></div>',
|
||||
test.err.htmlMessage, stackString));
|
||||
} else if (test.err.htmlMessage) {
|
||||
el.appendChild(fragment('<div class="html-error">%s</div>', test.err.htmlMessage));
|
||||
} else {
|
||||
el.appendChild(fragment('<pre class="error">%e%e</pre>', message, stackString));
|
||||
}
|
||||
|
||||
self.addCodeToggle(el, test.body);
|
||||
appendToStack(el);
|
||||
updateStats();
|
||||
});
|
||||
|
||||
runner.on('pending', function(test) {
|
||||
var el = fragment('<li class="test pass pending"><h2>%e</h2></li>', test.title);
|
||||
appendToStack(el);
|
||||
updateStats();
|
||||
});
|
||||
|
||||
function appendToStack(el) {
|
||||
// Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.
|
||||
if (stack[0]) {
|
||||
stack[0].appendChild(el);
|
||||
}
|
||||
}
|
||||
|
||||
function updateStats() {
|
||||
// TODO: add to stats
|
||||
var percent = stats.tests / this.total * 100 | 0;
|
||||
if (progress) {
|
||||
progress.update(percent).draw(ctx);
|
||||
}
|
||||
|
||||
// update stats
|
||||
var ms = new Date() - stats.start;
|
||||
text(passes, stats.passes);
|
||||
text(failures, stats.failures);
|
||||
text(duration, (ms / 1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes a URL, preserving querystring ("search") parameters.
|
||||
*
|
||||
* @param {string} s
|
||||
* @return {string} A new URL.
|
||||
*/
|
||||
function makeUrl(s) {
|
||||
var search = window.location.search;
|
||||
|
||||
// Remove previous grep query parameter if present
|
||||
if (search) {
|
||||
search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?');
|
||||
}
|
||||
|
||||
return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide suite URL.
|
||||
*
|
||||
* @param {Object} [suite]
|
||||
*/
|
||||
HTML.prototype.suiteURL = function(suite) {
|
||||
return makeUrl(suite.fullTitle());
|
||||
};
|
||||
|
||||
/**
|
||||
* Provide test URL.
|
||||
*
|
||||
* @param {Object} [test]
|
||||
*/
|
||||
HTML.prototype.testURL = function(test) {
|
||||
return makeUrl(test.fullTitle());
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds code toggle functionality for the provided test's list element.
|
||||
*
|
||||
* @param {HTMLLIElement} el
|
||||
* @param {string} contents
|
||||
*/
|
||||
HTML.prototype.addCodeToggle = function(el, contents) {
|
||||
var h2 = el.getElementsByTagName('h2')[0];
|
||||
|
||||
on(h2, 'click', function() {
|
||||
pre.style.display = pre.style.display === 'none' ? 'block' : 'none';
|
||||
});
|
||||
|
||||
var pre = fragment('<pre><code>%e</code></pre>', utils.clean(contents));
|
||||
el.appendChild(pre);
|
||||
pre.style.display = 'none';
|
||||
};
|
||||
|
||||
/**
|
||||
* Display error `msg`.
|
||||
*
|
||||
* @param {string} msg
|
||||
*/
|
||||
function error(msg) {
|
||||
document.body.appendChild(fragment('<div id="mocha-error">%s</div>', msg));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a DOM fragment from `html`.
|
||||
*
|
||||
* @param {string} html
|
||||
*/
|
||||
function fragment(html) {
|
||||
var args = arguments;
|
||||
var div = document.createElement('div');
|
||||
var i = 1;
|
||||
|
||||
div.innerHTML = html.replace(/%([se])/g, function(_, type) {
|
||||
switch (type) {
|
||||
case 's': return String(args[i++]);
|
||||
case 'e': return escape(args[i++]);
|
||||
// no default
|
||||
}
|
||||
});
|
||||
|
||||
return div.firstChild;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for suites that do not have elements
|
||||
* with `classname`, and hide them.
|
||||
*
|
||||
* @param {text} classname
|
||||
*/
|
||||
function hideSuitesWithout(classname) {
|
||||
var suites = document.getElementsByClassName('suite');
|
||||
for (var i = 0; i < suites.length; i++) {
|
||||
var els = suites[i].getElementsByClassName(classname);
|
||||
if (!els.length) {
|
||||
suites[i].className += ' hidden';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unhide .hidden suites.
|
||||
*/
|
||||
function unhide() {
|
||||
var els = document.getElementsByClassName('suite hidden');
|
||||
for (var i = 0; i < els.length; ++i) {
|
||||
els[i].className = els[i].className.replace('suite hidden', 'suite');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an element's text contents.
|
||||
*
|
||||
* @param {HTMLElement} el
|
||||
* @param {string} contents
|
||||
*/
|
||||
function text(el, contents) {
|
||||
if (el.textContent) {
|
||||
el.textContent = contents;
|
||||
} else {
|
||||
el.innerText = contents;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Listen on `event` with callback `fn`.
|
||||
*/
|
||||
function on(el, event, fn) {
|
||||
if (el.addEventListener) {
|
||||
el.addEventListener(event, fn, false);
|
||||
} else {
|
||||
el.attachEvent('on' + event, fn);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user